@mcy2015/pi-web 0.13.0 → 0.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +1 -1
  3. package/.next/build-manifest.json +2 -2
  4. package/.next/required-server-files.js +1 -1
  5. package/.next/required-server-files.json +1 -1
  6. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  7. package/.next/server/app/_global-error.html +1 -1
  8. package/.next/server/app/_global-error.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  13. package/.next/server/app/_not-found.html +1 -1
  14. package/.next/server/app/_not-found.rsc +2 -2
  15. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  16. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  17. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  18. package/.next/server/app/api/app-update/route.js +1 -1
  19. package/.next/server/app/api/mcp/route.js +1 -1
  20. package/.next/server/app/api/mcp/sign-in/route.js +1 -1
  21. package/.next/server/app/api/mcp/test/route.js +1 -1
  22. package/.next/server/app/index.html +1 -1
  23. package/.next/server/app/index.rsc +4 -4
  24. package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
  25. package/.next/server/app/index.segments/_full.segment.rsc +4 -4
  26. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  27. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  28. package/.next/server/app/login.html +1 -1
  29. package/.next/server/app/login.rsc +2 -2
  30. package/.next/server/app/login.segments/_full.segment.rsc +2 -2
  31. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  32. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  33. package/.next/server/app/page.js +22 -22
  34. package/.next/server/app/page.js.nft.json +1 -1
  35. package/.next/server/app/page_client-reference-manifest.js +1 -1
  36. package/.next/server/app/share/[code]/page.js +1 -1
  37. package/.next/server/app/share/[code]/page.js.nft.json +1 -1
  38. package/.next/server/app/share/[code]/page_client-reference-manifest.js +1 -1
  39. package/.next/server/app-paths-manifest.json +1 -1
  40. package/.next/server/chunks/{6367.js → 2728.js} +2 -2
  41. package/.next/server/chunks/3010.js +1 -1
  42. package/.next/server/chunks/5545.js +1 -1
  43. package/.next/server/chunks/6487.js +3 -3
  44. package/.next/server/chunks/8383.js +1 -1
  45. package/.next/server/middleware-build-manifest.js +1 -1
  46. package/.next/server/pages/404.html +1 -1
  47. package/.next/server/pages/500.html +1 -1
  48. package/.next/server/route-cache/APP_PAGE/c6377dd9ce6a1c2cd100eb4344e843eb4639b9ed26f84643f77680e9eb454c4b/$/index.html +1 -0
  49. package/.next/server/route-cache/APP_PAGE/c6377dd9ce6a1c2cd100eb4344e843eb4639b9ed26f84643f77680e9eb454c4b/$/index.meta +1 -0
  50. package/.next/server/route-cache/APP_PAGE/c6377dd9ce6a1c2cd100eb4344e843eb4639b9ed26f84643f77680e9eb454c4b/$/index.rsc +23 -0
  51. package/.next/server/route-cache/APP_PAGE/c6377dd9ce6a1c2cd100eb4344e843eb4639b9ed26f84643f77680e9eb454c4b/$/index.segments/__PAGE__.segment.rsc +27 -0
  52. package/.next/server/route-cache/APP_PAGE/c6377dd9ce6a1c2cd100eb4344e843eb4639b9ed26f84643f77680e9eb454c4b/$/index.segments/_full.segment.rsc +23 -0
  53. package/.next/server/route-cache/APP_PAGE/c6377dd9ce6a1c2cd100eb4344e843eb4639b9ed26f84643f77680e9eb454c4b/$/index.segments/_tree.segment.rsc +8 -0
  54. package/.next/static/chunks/8909-c18f5a2f20e8f798.js +2 -0
  55. package/.next/static/chunks/app/{layout-09edb2b4f71317e3.js → layout-19228ee6a08d83ea.js} +1 -1
  56. package/.next/static/chunks/app/page-18dd62d21c3bda10.js +285 -0
  57. package/.next/static/chunks/app/share/[code]/page-ee5b90b5f0930a77.js +1 -0
  58. package/.next/trace +9 -8
  59. package/.next/trace-build +1 -1
  60. package/package.json +1 -1
  61. package/.next/static/chunks/1798-64b3fd24c6ac6063.js +0 -2
  62. package/.next/static/chunks/app/page-d922df5980ec931c.js +0 -285
  63. package/.next/static/chunks/app/share/[code]/page-ff418745312c304f.js +0 -1
  64. /package/.next/static/{YXWav-5PFkxPJMeIuTSGb → sN1YhVy-LPqPUdH9cLpTi}/_buildManifest.js +0 -0
  65. /package/.next/static/{YXWav-5PFkxPJMeIuTSGb → sN1YhVy-LPqPUdH9cLpTi}/_ssgManifest.js +0 -0
@@ -8,13 +8,13 @@ Base directory for relative references: ${b.baseDir}
8
8
 
9
9
  ${c.trim()}`}catch(c){return`Skill ${JSON.stringify(a)} unreadable at ${b.filePath}: ${c instanceof Error?c.message:String(c)}`}}).join("\n\n")})();if(!j&&void 0===a.exactSystemPrompt)return;let k=a.exactSystemPrompt??h.systemPrompt,l=j?`${k}
10
10
 
11
- ${j}`:k;return void 0!==a.exactSystemPrompt&&(i=l),{systemPrompt:l}})}}]}:{}},setActiveToolsGetter(a){d=a},getExactSystemPrompt:void 0===a.exactSystemPrompt?void 0:()=>i}}[f,h]=i.then?(await i)():i,d()}catch(a){d(a)}})},10998:(a,b,c)=>{"use strict";function d(a){return("tool_execution_start"===a.type||"tool_execution_update"===a.type||"tool_execution_end"===a.type)&&"string"==typeof a.parentToolCallId&&""!==a.parentToolCallId}c.d(b,{uz:()=>d})},11124:(a,b,c)=>{"use strict";c.d(b,{DA:()=>L,Iq:()=>F,Q6:()=>d,Wy:()=>G,Yh:()=>B,oF:()=>K,yP:()=>A,yQ:()=>t});let d="•••",e=new Set(["key","apikey","token","secret","password","passwd","passphrase","pwd","pass","credential","credentials","authorization","bearer","jwt","cookie","signature","pat"]),f=new Set([...e,"auth","sig","code","pw"]),g=["token","secret","password","passwd","apikey"],h=new Set(["file","path","dir","url","uri","endpoint","id","name","type","header","env","var","length","ttl","expiry","expires","timeout","mode","format"]),i=new Set(["-k"]);function j(a){return a.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").toLowerCase().split(/[^a-z0-9]+/).filter(Boolean)}function k(a,b){let c=j(a);return!(c.length>1&&h.has(c[c.length-1]))&&c.some(a=>b.has(a)||g.some(b=>a.length>b.length&&a.endsWith(b)))}let l=RegExp("^(?:sk-[A-Za-z0-9_-]{16,}|(?:sk|pk|rk)_(?:live|test)_[A-Za-z0-9]{16,}|gh[pousr]_[A-Za-z0-9]{20,}|github_pat_[A-Za-z0-9_]{20,}|glpat-[A-Za-z0-9_-]{16,}|xox[abposr]-[A-Za-z0-9-]{10,}|(?:AKIA|ASIA)[0-9A-Z]{16}|AIza[0-9A-Za-z_-]{30,}|ya29\\.[0-9A-Za-z_-]{20,}|npm_[A-Za-z0-9]{30,}|hf_[A-Za-z0-9]{30,}|shp(?:at|ss|ca|pa)_[A-Fa-f0-9]{20,}|dop_v1_[a-f0-9]{40,}|lin_api_[A-Za-z0-9]{20,})"),m=/^eyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]*$/,n=/^[A-Za-z0-9_\-+/=.~]+$/;function o(a){return!(/\s/.test(a)||t(a))&&(!!(l.test(a)||m.test(a))||!(a.length<24||!n.test(a)||/^[./~]/.test(a)||/\.[A-Za-z][A-Za-z0-9]{0,4}$/.test(a)||a.split("/").length>2)&&!!/\d/.test(a)&&!!/[A-Za-z]/.test(a)&&(/[a-z]/.test(a)&&/[A-Z]/.test(a)||/^[0-9a-f]+$/i.test(a)||!/[-_.]/.test(a))&&function(a){let b=new Map;for(let c of a)b.set(c,(b.get(c)??0)+1);let c=0;for(let d of b.values()){let b=d/a.length;c-=b*Math.log2(b)}return c}(a)>=3.5)}let p=/\$\{[A-Za-z_][A-Za-z0-9_]*\}|\$[A-Za-z_][A-Za-z0-9_]*/,q=RegExp(p.source,"g"),r=/^(?:bearer|basic|token)\s+/i;function s(a,b,c){let d=a.replace(r,"");return b.test(d)&&/^[^A-Za-z0-9]*$/.test(d.replace(c,""))}function t(a){return s(a.replace(/\$[$!]/g,"_x"),p,q)}let u=/\$\{[A-Za-z_][A-Za-z0-9_]*\}|\$[A-Z_][A-Z0-9_]*(?![A-Za-z0-9_])/,v=RegExp(u.source,"g");function w(a){return s(a,u,v)}function x(a,b){if(!a||""===b)return;a.push(b);let c=C(b);c!==b&&a.push(c)}let y=/^([A-Za-z][A-Za-z0-9+.-]*:\/\/)([^/?#]*)/;function z(a,b,c){let e=!1,g=a,h="",i=y.exec(a);if(i){let[f,j,k]=i,l=k.lastIndexOf("@");if(l>=0&&!b(C(k.slice(0,l)))){h=`${j}${d}${k.slice(l)}`,e=!0;let a=k.slice(0,l);x(c,a);let b=a.indexOf(":");b>=0&&x(c,a.slice(b+1))}else h=f;g=a.slice(f.length)}let j=g.search(/[?#]/),l=j<0?g:g.slice(0,j),m=j<0?"":g.slice(j),n=l.split("/").map(a=>o(C(a))?(e=!0,x(c,a),d):a).join("/");return m=m.replace(/([?&#;])([^&#;]*)/g,(a,g,h)=>{let i=h.indexOf("=");if(i<0){let f=C(h);return!o(f)||b(f)?a:(e=!0,x(c,h),`${g}${d}`)}let j=h.slice(0,i),l=C(h.slice(i+1));return""===l||b(l)||!function(a){let b=a;try{b=decodeURIComponent(a)}catch{}return k(b,f)}(j)&&!o(l)?a:(e=!0,x(c,h.slice(i+1)),`${g}${j}=${d}`)}),{value:`${h}${n}${m}`,masked:e}}function A(a){return z(a,w)}function B(a){let b=[];return z(a,w,b),[...new Set(b)]}function C(a){try{return decodeURIComponent(a)}catch{return a}}let D=/^(\s*[A-Za-z][A-Za-z0-9 _.-]*=)([\s\S]*)$/;function E(a,b,c){let f=/^([A-Za-z0-9_-]+):(\s*)([\s\S]*)$/.exec(a);if(f&&""!==f[3]&&!f[3].startsWith("//")&&k(f[1],e)){let[,e,g,h]=f;return b(h)?{value:a,masked:!1}:(x(c,h.trim()),{value:`${e}:${g}${d}`,masked:!0})}let g=a.includes(";")?function(a,b,c){let f=a.split(";");if(f.length<2||!f.every(a=>""===a.trim()||D.test(a)))return;let g=!1;return{value:f.map(a=>{let f=D.exec(a);if(!f)return a;let[,h,i]=f;if(""===i.trim()||b(i))return a;if(k(h.slice(0,-1).trim(),e))return g=!0,x(c,i.trim()),`${h}${d}`;let j=E(i,b,c);return g||=j.masked,`${h}${j.value}`}).join(";"),masked:g}}(a,b,c):void 0;if(g)return g;let h=/^([A-Za-z_][A-Za-z0-9_]*)=([\s\S]*)$/.exec(a);if(h&&""!==h[2]&&k(h[1],e))return b(h[2])?{value:a,masked:!1}:(x(c,h[2]),{value:`${h[1]}=${d}`,masked:!0});if(/\s/.test(a)){var i,j,l;let d,e;return i=a,j=b,l=c,e=J((d=i.split(/(\s+)/)).filter((a,b)=>b%2==0),j,!0,l),{value:d.map((a,b)=>b%2==0?e.values[b/2]:a).join(""),masked:e.masked}}if(/^[A-Za-z][A-Za-z0-9+.-]*:\/\//.test(a))return z(a,b,c);if(h&&""!==h[2]){let a=E(h[2],b,c);return{value:`${h[1]}=${a.value}`,masked:a.masked}}return o(a)&&!b(a)?(x(c,a),{value:d,masked:!0}):{value:a,masked:!1}}function F(a){return E(a,w)}function G(a){let b=[];return E(a,w,b),[...new Set(b)]}function H(a){if(i.has(a))return!0;if(!/^--?[A-Za-z]/.test(a))return!1;let b=a.replace(/^-+/,"");return k(b,e)||"auth"===j(b).at(-1)}let I=/^(?:bearer|basic|token)$/i;function J(a,b,c,f){let g=!1,h=!1;return{values:a.map(a=>{if(""===a)return a;if(h){if(c&&I.test(a))return a;if(h=!1,!/^-[A-Za-z-]/.test(a))return b(a)?a:(g=!0,x(f,a),d)}let i=/^(--?[A-Za-z][A-Za-z0-9_.-]*)=([\s\S]*)$/.exec(a);if(i){let[,a,c]=i;if(""!==c&&H(a)&&!b(c))return g=!0,x(f,c),`${a}=${d}`;let e=E(c,b,f);return g||=e.masked,`${a}=${e.value}`}if(/^--?[A-Za-z][A-Za-z0-9_.-]*$/.test(a))return h=H(a),a;if(c){let b=/^([A-Za-z0-9_-]+):$/.exec(a);if(I.test(a)||b&&k(b[1],e))return h=!0,a}let j=E(a,b,f);return g||=j.masked,j.value}),masked:g}}function K(a){let{values:b,masked:c}=J(a,w,!1);return{args:b,masked:c}}function L(a){let b=[];return J(a,w,!1,b),[...new Set(b)]}},13856:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{IR:()=>k,py:()=>j});var e=c(75430),f=a([e]);e=(f.then?(await f)():f)[0];let l=new Set(["off","minimal","low","medium","high","xhigh","max"]);function g(a,b){return a.provider===b.provider&&a.id===b.modelId}function h(a){return a.includes("*")||a.includes("?")||a.includes("[")}function i(a,b){let c=a.toLowerCase(),d=b.filter(a=>`${a.provider}/${a.id}`.toLowerCase()===c);return d.length>0?d:b.filter(a=>a.id.toLowerCase()===c)}async function j(a,b){let c=(b??[]).map(a=>a.trim()).filter(Boolean);if(0===c.length)return{visible:await a.getAvailable(),scopedModels:[],thinkingLevelPins:{},warnings:[]};let d=await a.getAvailable();for(let a of c){if(h(a))continue;let b=i(a,d);if(0===b.length){let c=a.lastIndexOf(":"),e=c>=0?a.slice(c+1):"";l.has(e)&&(b=i(a.slice(0,c),d))}if(b.length>1){let c=b.map(a=>`${a.provider}/${a.id}`).sort().join(", ");throw Error(`Ambiguous enabledModels entry "${a}" matches multiple models: ${c}. Use provider/modelId.`)}}let{scopedModels:f,diagnostics:g}=await (0,e.resolveModelScopeWithDiagnostics)(c,{getAvailable:async()=>d}),j=g.filter(a=>"no-match"!==a.code||0===f.length||!function(a){if(!h(a))return!1;let b=a.lastIndexOf(":");return b<0||l.has(a.slice(b+1))}(a.pattern)).map(a=>a.message);if(0===f.length)return{visible:d,scopedModels:[],thinkingLevelPins:{},warnings:j};let k={};for(let a of f)a.thinkingLevel&&(k[`${a.model.provider}/${a.model.id}`]=a.thinkingLevel);return{visible:f.map(a=>a.model),scopedModels:f,thinkingLevelPins:k,warnings:j}}function k(a,b={}){let c=b.requestedModel,d=b.defaultModel,e=c?a.visible.find(a=>g(a,c)):void 0;if(c&&!e)throw Error(`Model is not available in the enabled scope: ${c.provider}/${c.modelId}`);let f=e?a.scopedModels.find(a=>a.model===e||g(a.model,{provider:e.provider,modelId:e.id})):void 0,h=!e&&d?a.scopedModels.find(a=>g(a.model,d)):void 0,i=e?void 0:h??a.scopedModels[0],j=e||i||!d?void 0:a.visible.find(a=>g(a,d)),l=e??i?.model??j,m=f??i,n=b.thinkingLevel??m?.thinkingLevel;return{...l?{model:l}:{},...n?{thinkingLevel:n}:{},scopedModels:[...a.scopedModels]}}d()}catch(a){d(a)}})},13956:(a,b,c)=>{"use strict";c.d(b,{Ai:()=>g,Ll:()=>e,pM:()=>d,zT:()=>f});let d="builtin:mcp";function e(a){return"mcp"===a.name&&a.sourceInfo?.path===d}function f(a){return"prompt"!==a.source&&("mcp"===a.name||/^mcp:\d+$/.test(a.name))}function g(a,b){if(!a.startsWith("/"))return"wait";let c=a.indexOf(" "),d=-1===c?a.slice(1):a.slice(1,c),f=b.find(a=>a.name===d);return f?e(f)?"register":"none":"wait"}},14968:(a,b,c)=>{"use strict";c.d(b,{FV:()=>m,GE:()=>l,M3:()=>j,PE:()=>o,RC:()=>k,XQ:()=>i,_z:()=>h,ak:()=>d,jp:()=>f,t3:()=>g,xX:()=>n});class d extends Error{constructor(a,b,c){super(a),this.description=b,this.statusCode=c,this.name="TelegramApiError"}}async function e(a,b,c,f=2e4){let g;try{g=await fetch(`https://api.telegram.org/bot${a}/${b}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c??{}),signal:AbortSignal.timeout(f),cache:"no-store"})}catch(a){throw new d(`Telegram ${b} failed: ${a instanceof Error?a.message:String(a)}`,null,null)}let h={};try{h=await g.json()}catch{}if(!g.ok||!1===h.ok)throw new d(`Telegram ${b} failed: ${h.description??`HTTP ${g.status}`}`,h.description??null,g.status);return h.result}async function f(a){return e(a,"getMe")}async function g(a,b,c){return e(a,"getUpdates",{offset:b,timeout:c,allowed_updates:["message","edited_message","callback_query"]},1e3*c+15e3)}async function h(a,b,c,d={}){return e(a,"sendMessage",{chat_id:b,text:c,...d.parseMode?{parse_mode:d.parseMode}:{},...void 0!==d.replyToMessageId?{reply_to_message_id:d.replyToMessageId}:{},...void 0!==d.replyMarkup?{reply_markup:d.replyMarkup}:{},link_preview_options:{is_disabled:!0}})}async function i(a,b,c,d,f={}){await e(a,"editMessageText",{chat_id:b,message_id:c,...void 0!==f.richMarkdown?{rich_message:{markdown:f.richMarkdown}}:{text:d,...f.parseMode?{parse_mode:f.parseMode}:{},link_preview_options:{is_disabled:!0}}})}async function j(a,b,c){return e(a,"sendRichMessage",{chat_id:b,rich_message:{markdown:c}})}async function k(a,b,c){await e(a,"deleteMessage",{chat_id:b,message_id:c})}async function l(a,b,c){await e(a,"answerCallbackQuery",{callback_query_id:b,...c?{text:c}:{}})}async function m(a,b,c="typing"){await e(a,"sendChatAction",{chat_id:b,action:c})}async function n(a,b){await e(a,"setMyCommands",{commands:b})}async function o(a,b){let c=await e(a,"getFile",{file_id:b});if(!c.file_path)throw new d("Telegram returned no file_path",null,null);if((c.file_size??0)>0x1400000)throw new d("The file is over 20 MB","too large",null);let f=await fetch(`https://api.telegram.org/file/bot${a}/${c.file_path}`,{signal:AbortSignal.timeout(6e4),cache:"no-store"});if(!f.ok)throw new d(`Downloading the file failed: HTTP ${f.status}`,null,f.status);let g=f.headers.get("content-type");return{bytes:Buffer.from(await f.arrayBuffer()),mimeType:g}}},16794:(a,b,c)=>{a.exports=c(35859)},19050:(a,b,c)=>{"use strict";c.d(b,{d:()=>e});let d=/^<skill name="([^"\n]+)" location="([^"\n]+)">\nReferences are relative to [^\n]+\.\n\n([\s\S]*)\n<\/skill>(?:\n\n([\s\S]+))?$/;function e(a){let b=a.match(d);if(!b)return null;let[,c,,,e]=b;return e?`/skill:${c} ${e}`:`/skill:${c}`}},19298:(a,b,c)=>{"use strict";c.d(b,{y:()=>f});let d=/^Unexpected token '([\s\S])', ([\s\S]*) is not valid JSON$/,e=/is not valid JSON$/;function f(a,b){let c=b.map(a=>`${a}: `).find(b=>a.startsWith(b))??"",f=a.slice(c.length);return e.test(f)?`${c}${function(a){let b,c,e,f=a instanceof Error?a.message:String(a);if(!f.includes('"'))return f;let g=d.exec(f);if(!g)return"Not valid JSON";let[,h,i]=g,j=h.charCodeAt(0),k=/[\p{L}\p{N}]/u.test(h)?"":/[\p{P}\p{S}]/u.test(h)?` '${h}'`:` U+${j.toString(16).toUpperCase().padStart(4,"0")}`,l=function(a,b){let c,d=b.startsWith('..."'),e=b.endsWith('"...'),f=b.slice(3*!!d,e?-3:void 0);if(f.length<2||!f.startsWith('"')||!f.endsWith('"')||!d&&!e)return;let g=f.slice(1,-1);if(d)if(e){for(c="".indexOf(g);c>=0&&""[c+10]!==a;)c="".indexOf(g,c+1);if(c<0)return;c+=10}else{if(!"".endsWith(g))return;c=0-g.length+10}else{if(!"".startsWith(g))return;c=g.length-10}return""[c]===a?c:void 0}(h,i);return`Unexpected token${k} in JSON${void 0===l?"":` ${c=(b="".slice(0,l)).split("\n").length,e=l-b.lastIndexOf("\n"),`at position ${l} (line ${c} column ${e})`}`}`}(f)}`:a}},19371:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{A4:()=>Q,OF:()=>R});var e=c(75430),f=c(29862),g=c(55511),h=c(29021),i=c(33873),j=c(28354),k=c(2021),l=c(58655),m=c(52552),n=c(13856),o=c(96452),p=c(29188),q=c(36561),r=c(57432),s=c(58415),t=c(35234),u=c(42267),v=c(38598),w=c(36205),x=c(63709),y=c(66192),z=c(3814),A=c(3961),B=c(93391),C=c(2249),D=c(85844),E=c(57616),F=c(13956),G=c(30507),H=c(7976),I=c(10998),J=c(4302),K=c(38222),L=a([e,f,m,n,o,q,r,t,u,x,y,z,A,B,E,G,H,J]);function M(a,b){return Error(`${a}/${b} is provided by an extension, and Chat only loads no extensions. Choose another model or tool preset.`)}[e,f,m,n,o,q,r,t,u,x,y,z,A,B,E,G,H,J]=L.then?(await L)():L;let S=new Set(["agent_end","agent_settled","auto_compaction_end","compaction_end"]),T=function(a=process.env.PI_WEB_IDLE_TIMEOUT_MS){if(void 0!==a&&""!==a.trim()){let b=Number(a);if(Number.isFinite(b)&&b>=0&&b<=0x7fffffff)return b;console.warn(`[pi-web] invalid PI_WEB_IDLE_TIMEOUT_MS "${a}", falling back to 10 minutes`)}return 6e5}(),U=function(a=process.env.PI_WEB_SHUTDOWN_DEADLINE_MS){if(void 0!==a&&""!==a.trim()){let b=Number(a);if(Number.isFinite(b)&&b>0&&b<=0x7fffffff)return b;console.warn(`[pi-web] invalid PI_WEB_SHUTDOWN_DEADLINE_MS "${a}", falling back to 5 seconds`)}return 5e3}(),V=new Set(["fork","clone"]),W="This session has not been saved yet. Send a message before forking it.",X=new Set(["get_state","get_session_stats","get_last_assistant_text","get_tools","get_commands","extension_ui_response","extension_ui_input"]),Y=["read","bash","powershell","edit","write","grep","find","ls"],Z="medium";class $ extends e.Theme{constructor(){super({muted:"",text:"",thinkingXhigh:"",searchMatchText:""},{selectedBg:""},"truecolor")}fg(...[,a]){return a}bg(...[,a]){return a}bold(a){return a}italic(a){return a}underline(a){return a}inverse(a){return a}strikethrough(a){return a}getFgAnsi(){return""}getBgAnsi(){return""}getThinkingBorderColor(){return a=>a}getBashModeBorderColor(){return a=>a}}let _=new $,aa=new f.KeybindingsManager(f.TUI_KEYBINDINGS),ab=new Set(["codemode","tool_search",...y.st]);function N(a,b,c){if(0===b.length)return[];let d=new Set(Y),e=new Map(a.getAllTools().map(a=>[a.name,a])),f=(0,B.wQ)(b.filter(a=>d.has(a)),a.settingsManager.getDefaultTools()),g=c.filter(a=>{let b=e.get(a);return void 0!==b&&!d.has(a)&&"hidden"!==b.exposure});return[...new Set([...f,...g])]}class ac{constructor(a,b={}){this.inner=a,this.listeners=new Set,this.activeToolEvents=new Map,this.pendingUiResponses=new Map,this.pendingUiRequests=new Map,this.activeCustomUis=new Map,this.extensionUiAbortController=new AbortController,this.extensionStatuses=new Map,this.extensionWidgets=new Map,this.activeExtensionWidgets=new Map,this.extensionWidgetGenerations=new Map,this.extensionWidgetsResetting=!1,this.pendingPromptCount=0,this.activeMutatingCommands=0,this.sessionReplacement=null,this.agentRunNeedsCompletion=!1,this.lastRunAborted=!1,this.promptAdmissionTail=Promise.resolve(),this.extensionsBound=!1,this.extensionBindingPromise=null,this.extensionBindingError=null,this.mcpHostDisposed=!1,this.mcpPromptWait=null,this.unsubscribe=null,this.idleTimer=null,this.onDestroyCallback=null,this.shutdownPromise=null,this.sessionShutdownEmitted=!1,this.forceShutdownOnIdle=!1,this.forcedIdleTimerArmed=!1,this._alive=!0,this.resolveDisposed=()=>{},this.disposed=new Promise(a=>{this.resolveDisposed=a}),this.closing=!1,this.exactSystemPrompt=b.exactSystemPrompt,this.chatOnly=b.chatOnly??!1,this.onAgentRunComplete=b.onAgentRunComplete,this.suppressCompletionNotifications=b.suppressCompletionNotifications??!1,this.mcpHost=b.mcpHost,this.chatOnlyExtensionModel=b.chatOnlyExtensionModel}get sessionId(){return this.inner.sessionId}get sessionFile(){return this.inner.sessionFile??""}get cwd(){return this.inner.sessionManager.getCwd()}get streamingMessage(){return this.inner.agent.state?.streamingMessage}get isStreaming(){return this.inner.isStreaming}isAlive(){return this._alive&&!this.closing}isRunning(){return this._alive&&(this.pendingPromptCount>0||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning)}isAwaitingInput(){if(!this.isRunning())return!1;for(let a of this.pendingUiRequests.values())if((0,p.YI)(a))return!0;return!1}evictIfDiskAhead(){if(!this.isAlive()||this.isRunning())return!1;let a=(0,r.H6)(this.sessionFile);return!(!a||this.inner.sessionManager.getEntry(a)||this.isRunning())&&(this.destroy(),(0,r.mD)(),!0)}isChatOnly(){return this.chatOnly}hasSuppressedCompletionNotifications(){return this.suppressCompletionNotifications}start(){this.unsubscribe=this.inner.subscribe(a=>{"agent_start"===a.type&&(this.agentRunNeedsCompletion=!0,this.lastRunAborted=!1),"agent_settled"===a.type&&(this.lastRunAborted=!0===a.aborted),"agent_end"===a.type&&((0,r.mD)(),this.activeToolEvents.clear()),"session_info_changed"===a.type&&(0,r.mD)(),this.trackActiveToolEvent(a),S.has(a.type)&&this.resetIdleTimer(),this.emit("message_end"===a.type?this.withTranscriptNotices(a):a),"agent_settled"===a.type&&this.notifyAgentRunCompleteIfIdle()}),this.resetIdleTimer()}withTranscriptNotices(a){let b=a.message;if(0===this.listeners.size||b?.role!=="assistant")return a;try{let c=this.inner.sessionManager;if(!(0,J.Vv)(c.getCwd()))return a;let d=c.getEntries(),e=(0,J.Aw)(d,c.getBranch(),b,(0,J.xu)(d,this.inner.modelRuntime));return e.length>0?{...a,transcriptNotices:e}:a}catch(b){return console.warn("[pi-web] transcript notices failed:",b instanceof Error?b.message:b),a}}trackActiveToolEvent(a){let b=a.toolCallId;if(!("string"!=typeof b||(0,I.uz)(a))){if("tool_execution_start"===a.type||"tool_execution_update"===a.type)this.activeToolEvents.set(b,a);else if("tool_execution_end"===a.type){this.activeToolEvents.delete(b);let a=`${b}/`;for(let b of this.activeToolEvents.keys())b.startsWith(a)&&this.activeToolEvents.delete(b)}}}notifyAgentRunCompleteIfIdle(){if(!(!this.agentRunNeedsCompletion||this.isRunning())&&(this.agentRunNeedsCompletion=!1,!this.suppressCompletionNotifications&&!this.lastRunAborted))try{this.onAgentRunComplete?.(this.sessionId,this.inner.sessionManager.getSessionName())}catch(a){console.error("[pi-web] completion listener failed:",a instanceof Error?a.message:a)}}promptDoneEvent(){return{type:"prompt_done",...this.lastRunAborted?{aborted:!0}:{}}}beginExtensionBinding(){this.ensureExtensionsBound().catch(a=>{console.error("[pi-web] failed to dispatch session_start to extensions:",a instanceof Error?a.message:a)})}async waitUntilReady(){await this.waitForExtensionsBound()}async prepareMcpForRun(a){let b=this.mcpHost;if(!b||this.inner.isStreaming)return!a.aborted;let c=new AbortController,d=()=>c.abort();a.aborted&&d(),a.addEventListener("abort",d,{once:!0});let e=(async()=>{await this.waitForExtensionsBound(),c.signal.aborted||await b.prepareForPrompt(c.signal)})().catch(a=>{console.error("[pi-web] MCP servers could not be prepared:",a instanceof Error?a.message:a)}),f={controller:c,done:e};this.mcpPromptWait=f;try{await e}finally{a.removeEventListener("abort",d),this.mcpPromptWait===f&&(this.mcpPromptWait=null)}return!c.signal.aborted}ensureExtensionsBound(){return this.extensionsBound?Promise.resolve():(this.extensionBindingPromise||(this.extensionBindingError=null,this.extensionBindingPromise=(async()=>{if(!this._alive)return;let a=this.createExtensionUiContext();if("function"==typeof this.inner.bindExtensions){let b=this.inner.bindExtensions;await b.call(this.inner,{uiContext:a,mode:"rpc",commandContextActions:this.createExtensionCommandContextActions(),shutdownHandler:()=>this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"notify",notifyType:"warning",message:"Extension requested shutdown, but shutdown is not supported in Pi Web."}),onError:a=>this.emit({type:"extension_error",extensionPath:a.extensionPath,event:a.event,error:a.error})})}else this.inner.extensionRunner.setUIContext?.(a,"rpc");this.extensionsBound=!0,console.log(`[pi-web] session_start dispatched to extensions for session ${this.inner.sessionId}`)})().catch(a=>{throw this.extensionBindingError=a,a})),this.extensionBindingPromise)}async waitForExtensionsBound(){try{this.extensionBindingPromise&&await this.extensionBindingPromise}catch(a){throw a instanceof Error?a:Error(String(a))}if(this.extensionBindingError)throw this.extensionBindingError instanceof Error?this.extensionBindingError:Error(String(this.extensionBindingError))}extensionCommandCandidates(){try{return this.inner.extensionRunner.getRegisteredCommands().map(a=>({name:a.invocationName,sourceInfo:a.sourceInfo}))}catch{return[]}}shouldWaitForExtensions(a){return"prompt"===a||"steer"===a||"follow_up"===a||"get_commands"===a||"get_state"===a}async withFinalIdleReset(a){try{return await a()}finally{this.resetIdleTimer()}}setActiveToolSelection(a,b=this.inner.getActiveToolNames()){this.inner.setActiveToolsByName(N(this.inner,a,b))}async navigateTreeKeepingToolSelection(a,b){let c=this.inner.getActiveToolNames(),d=await this.inner.navigateTree(a,b);if(d.cancelled||this.chatOnly)return{cancelled:d.cancelled};let e=this.inner.sessionManager.getEntries();if(!(0,y.ph)(e)){let a=this.inner.getActiveToolNames();this.setActiveToolSelection((0,K.dS)(e)??a,[...a,...c.filter(a=>ab.has(a))])}return{cancelled:!1}}emit(a){for(let b of this.listeners)try{b(a)}catch(b){console.error(`[pi-web] failed to deliver ${a.type} event:`,b instanceof Error?b.message:b)}}async acquirePromptAdmission(){let a,b=this.promptAdmissionTail;return this.promptAdmissionTail=new Promise(b=>{a=b}),await b,a}resetIdleTimer(){if(!this._alive){this.idleTimer&&clearTimeout(this.idleTimer);return}if(this.isRunning()||(this.forceShutdownOnIdle=!1),this.forceShutdownOnIdle&&this.forcedIdleTimerArmed)return;this.idleTimer&&clearTimeout(this.idleTimer);let a=T||6e5*!!this.forceShutdownOnIdle;this.forcedIdleTimerArmed=0!==a&&this.forceShutdownOnIdle,0!==a&&(this.idleTimer=setTimeout(()=>{!this.forceShutdownOnIdle&&(this.isRunning()||(0,v.Vj)({sessionId:this.sessionId,sessionFile:this.sessionFile||void 0}))?this.resetIdleTimer():this.shutdown().catch(a=>{console.error("[pi-web] failed to shut down idle session:",a instanceof Error?a.message:a)})},a))}persistBashOnlySession(){let a=this.inner.sessionManager,b=a.getSessionFile();if(!b||(0,h.existsSync)(b))return;let c=a.getHeader();if(!c)return;let d=[c,...a.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";(0,h.writeFileSync)(b,d,{encoding:"utf8",flag:"wx"}),a.flushed=!0,(0,r.O8)(this.inner.sessionId,b)}onEvent(a){for(let b of(this.listeners.add(a),this.pendingUiRequests.values()))a(b);for(let b of this.activeToolEvents.values())a(b);return()=>{this.listeners.delete(a)}}onDestroy(a){this.onDestroyCallback=a}waitUntilDisposed(a){let b,c=new Promise(c=>{b=setTimeout(()=>c(!1),a),b.unref?.()});return Promise.race([this.disposed.then(()=>!0),c]).finally(()=>clearTimeout(b))}async withSessionReplacement(a,b){if(this.sessionReplacement)throw Error("Session is already being copied");this.sessionReplacement=a;try{return await b()}finally{this._alive&&(this.sessionReplacement=null)}}isSessionRunningForReplacement(){return this.inner.isBashRunning||this.inner.isStreaming||this.inner.isCompacting||this.pendingPromptCount>0}async shutdownAfterSessionReplacement(a){try{await this.shutdown()}catch(b){console.error(`[pi-web] ${a} succeeded, but source session shutdown failed:`,b instanceof Error?b.message:b)}}async send(a){let b=a.type,c=X.has(b);if(this.sessionReplacement&&!c)throw Error("Session is being copied to a new session");if(V.has(b)&&this.activeMutatingCommands>0)throw Error(`Cannot ${b} while another session command is running`);let d=!c;d&&(this.activeMutatingCommands+=1);try{if("get_state"!==b&&this.resetIdleTimer(),this.shouldWaitForExtensions(b)&&await this.waitForExtensionsBound(),this.sessionReplacement&&!c)throw Error("Session is being copied to a new session");if("prompt"===b||"steer"===b||"follow_up"===b){let b=(0,k.kc)(a.images);if(b)throw Error(b)}if("prompt"===b&&!(0,h.existsSync)(this.cwd))throw Error(`Directory does not exist: ${this.cwd}`);switch(b){case"prompt":{let b=await this.acquirePromptAdmission();try{let b,c,d;if(this.inner.isBashRunning)throw Error("Cannot send a prompt while a shell command is running");let e=this.inner.model;if(this.chatOnlyExtensionModel&&!(e&&this.inner.modelRuntime.getModel(e.provider,e.id)))throw M(this.chatOnlyExtensionModel.provider,this.chatOnlyExtensionModel.id);this.extensionUiAbortController.signal.aborted&&(this.extensionUiAbortController=new AbortController);let f=a.images,g=a.streamingBehavior,h=!1,i=!1,j=!1,k=new Promise((a,d)=>{b=()=>{h=!0,this.agentRunNeedsCompletion=!0,i||(i=!0,g||(this.lastRunAborted=!1),a())},c=a=>{i||(i=!0,d(a))}}),l=()=>{j||(j=!0,this.pendingPromptCount=Math.max(0,this.pendingPromptCount-1),this.resetIdleTimer(),this.notifyAgentRunCompleteIfIdle())};this.pendingPromptCount+=1;let m=this.mcpHost&&!this.inner.isStreaming?(0,F.Ai)("string"==typeof a.message?a.message:"",this.extensionCommandCandidates()):"none";if(this.mcpHost&&"none"!==m){let a=new AbortController,b=this.mcpHost.prepareForPrompt(a.signal,{wait:"wait"===m}).catch(a=>{console.error("[pi-web] MCP servers could not be prepared:",a instanceof Error?a.message:a)}).then(()=>{if(a.signal.aborted)throw l(),Error("Stopped while MCP servers were connecting; the message was not sent.")}),c={controller:a,done:b.then(()=>void 0,()=>void 0)};this.mcpPromptWait=c;try{await b}finally{this.mcpPromptWait===c&&(this.mcpPromptWait=null)}}try{d=this.inner.prompt(a.message,{...f?.length?{images:f}:{},...g?{streamingBehavior:g}:{},source:"rpc",preflightResult:()=>b()})}catch(a){throw l(),a}return d.then(()=>{b(),l(),g||this.emit(this.promptDoneEvent())},a=>{c(a),l(),(0,r.mD)(),h&&(this.emit({type:"prompt_error",errorMessage:a instanceof Error?a.message:String(a)}),g||this.emit(this.promptDoneEvent()))}).catch(a=>{console.error("[pi-web] prompt completion handler failed:",a instanceof Error?a.message:a)}),await k,null}finally{b()}}case"abort":if(this.forceShutdownOnIdle=!0,this.resetIdleTimer(),this.extensionUiAbortController.abort(new DOMException("Extension UI cancelled by Stop","AbortError")),this.mcpPromptWait){let a=this.mcpPromptWait;a.controller.abort(),await a.done}try{return await this.withFinalIdleReset(()=>this.inner.abort()),null}finally{this.isRunning()||(this.forceShutdownOnIdle=!1)}case"get_state":{let a=this.inner.model,b=this.inner.getContextUsage();return{sessionId:this.inner.sessionId,sessionFile:this.inner.sessionFile??"",isStreaming:this.inner.isStreaming,isPromptRunning:this.pendingPromptCount>0,isBashRunning:this.inner.isBashRunning,isCompacting:this.inner.isCompacting,autoCompactionEnabled:this.inner.autoCompactionEnabled,autoRetryEnabled:this.inner.autoRetryEnabled,model:a?{id:a.id,provider:a.provider}:void 0,messageCount:0,pendingMessageCount:this.inner.pendingMessageCount,queuedMessages:{steering:[...this.inner.getSteeringMessages()],followUp:[...this.inner.getFollowUpMessages()]},contextUsage:b?{percent:b.percent,contextWindow:b.contextWindow,tokens:b.tokens}:null,totalActiveMs:(0,s.Q)(this.inner.sessionManager),systemPrompt:this.exactSystemPrompt?.()??(this.inner.agent.state?.systemPrompt||this.inner.systemPrompt||""),thinkingLevel:this.inner.agent.state?.thinkingLevel??"off",extensionStatuses:this.getExtensionStatuses(),extensionWidgets:this.getExtensionWidgets()}}case"set_model":{let{provider:b,modelId:c}=a;await this.inner.modelRuntime.refresh({allowNetwork:!1,providers:[b],signal:AbortSignal.timeout(15e3)}).catch(()=>void 0);let d=this.inner.modelRuntime.getModel(b,c);if(!d)throw this.chatOnly&&(0,o.S9)(this.inner.modelRuntime,b,c)?M(b,c):Error(`Model not found: ${b}/${c}`);let e=this.inner.model;if((0,j.isDeepStrictEqual)(e,d))return{id:d.id,provider:d.provider};let f=e?.provider===d.provider&&e.id===d.id,g=this.inner.agent.state?.thinkingLevel;return await this.inner.setModel(d),f&&g&&this.inner.setThinkingLevel(g),(0,l.kn)(),(0,r.mD)(),{id:d.id,provider:d.provider}}case"fork":{if(this.inner.isBashRunning)throw Error("Cannot fork while a shell command is running");let b=this.isSessionRunningForReplacement();return this.withSessionReplacement("fork",async()=>{let c,d,f=a.entryId,g=this.inner.sessionManager,i=this.inner.sessionFile;if(!g.isPersisted())return{cancelled:!0};if(!i)throw Error("Persisted session is missing a session file");let j=g.getEntry(f);if(!j)throw Error("Invalid entry ID for forking");let k=g.getSessionDir();if(j.parentId){if(!(0,h.existsSync)(i))throw Error(W);let a=(d=e.SessionManager.open(i,k)).createBranchedSession(j.parentId);if(!a)throw Error("Failed to create forked session");c=a}else c=(d=e.SessionManager.create(g.getCwd(),k,{parentSession:i})).getSessionFile();if(!(0,h.existsSync)(c)){let a=d.getHeader();if(!a)throw Error("Forked session is missing a session header");let b=[a,...d.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";(0,h.writeFileSync)(c,b,{encoding:"utf8",flag:"wx"})}let l=d.getSessionId();return(0,r.O8)(l,c),(0,r.mD)(),b||await this.shutdownAfterSessionReplacement("fork"),{cancelled:!1,newSessionId:l}})}case"fork_branch":{if(this.inner.isBashRunning)throw Error("Cannot fork while a shell command is running");let b=a.entryId,c=this.inner.sessionManager,d=this.inner.sessionFile;if(!c.isPersisted())return{cancelled:!0};if(!d)throw Error("Persisted session is missing a session file");if(!c.getEntry(b))throw Error("Invalid entry ID for forking");if(!(0,h.existsSync)(d))throw Error(W);let f=c.getSessionDir(),g=e.SessionManager.open(d,f).createBranchedSession(b);if(!g)throw Error("Failed to create forked session");let i=e.SessionManager.open(g,f).getSessionId();return(0,r.O8)(i,g),(0,r.mD)(),{cancelled:!1,newSessionId:i}}case"clone":{if(this.isSessionRunningForReplacement())throw Error("Cannot clone while the session is running");let b=this.inner.sessionManager,c=this.inner.sessionFile,d="string"==typeof a.leafId?a.leafId:b.getLeafId(),f=d&&b.getBranch(d).some(a=>"message"===a.type&&"assistant"===a.message.role);if(!b.isPersisted()||!d||!f||!c||!(0,h.existsSync)(c))return{cancelled:!0};return this.withSessionReplacement("clone",async()=>{let a=b.getSessionDir(),f=e.SessionManager.open(c,a).createBranchedSession(d);if(!f||!(0,h.existsSync)(f))throw Error("Failed to clone current session branch");let g=e.SessionManager.open(f,a).getSessionId();return(0,r.O8)(g,f),(0,r.mD)(),await this.shutdownAfterSessionReplacement("clone"),{cancelled:!1,newSessionId:g}})}case"navigate_tree":if(this.inner.isBashRunning)throw Error("Cannot navigate while a shell command is running");return this.navigateTreeKeepingToolSelection(a.targetId,{});case"set_thinking_level":{let b=a.level;return this.inner.setThinkingLevel(b),"xhigh"===b&&this.inner.model?.compat?.thinkingFormat==="deepseek"&&this.inner.agent?.state&&(this.inner.agent.state.thinkingLevel="xhigh"),(0,r.mD)(),null}case"compact":try{return await this.withFinalIdleReset(()=>this.inner.compact(a.customInstructions))}finally{(0,r.mD)()}case"set_session_name":{let b=a.name?.trim();if(!b)throw Error("Session name cannot be empty");return this.inner.setSessionName(b),(0,r.mD)(),null}case"get_session_stats":return{...this.inner.getSessionStats(),sessionName:this.inner.sessionManager.getSessionName()};case"get_last_assistant_text":return{text:this.inner.getLastAssistantText()??""};case"set_auto_compaction":return this.inner.setAutoCompactionEnabled(a.enabled),null;case"clear_queue":return this.inner.clearQueue();case"steer":{let b=a.images;return await this.inner.steer(a.message,b?.length?b:void 0),null}case"follow_up":{let b=a.images;return await this.inner.followUp(a.message,b?.length?b:void 0),null}case"get_tools":{let a=this.inner.getAllTools().filter(a=>"hidden"!==a.exposure),b=new Set(this.inner.getActiveToolNames()),c=new Map((this.inner.agent.state?.tools??[]).map(a=>[a.name,a.description])),d=Reflect.get(this.inner,"_hiddenDeclarations"),e=d instanceof Set?d:new Set;return a.map(a=>({...a,description:c.get(a.name)??a.description,active:b.has(a.name),declarationHidden:e.has(a.name)}))}case"get_commands":{let a=[];for(let b of this.inner.extensionRunner.getRegisteredCommands())a.push({name:b.invocationName,description:b.description,source:"extension",sourceInfo:b.sourceInfo});for(let b of this.inner.promptTemplates)a.push({name:b.name,description:b.description,source:"prompt",sourceInfo:b.sourceInfo});for(let b of this.inner.resourceLoader.getSkills().skills)a.push({name:`skill:${b.name}`,description:b.description,source:"skill",sourceInfo:b.sourceInfo});return{commands:a}}case"set_tools":{let b=a.toolNames;return this.setActiveToolSelection(b),null}case"reload":{if(this.isSessionRunningForReplacement())throw Error("Wait for the current response to finish before reloading.");this.extensionUiAbortController.signal.aborted&&(this.extensionUiAbortController=new AbortController);let a=this.inner.getActiveToolNames();return await this.waitForExtensionsBound(),this.extensionStatuses.clear(),this.resetExtensionWidgetsForReload(),this.syncProjectTrust(),await this.inner.reload(),this.setActiveToolSelection(a),"function"!=typeof this.inner.bindExtensions&&this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc"),(0,l.kn)(),(0,m.nx)(),{success:!0}}case"abort_compaction":return this.inner.abortCompaction(),null;case"extension_ui_response":return this.resolveExtensionUiResponse(a),null;case"extension_ui_input":return this.handleExtensionUiInput(a.id,a.data),null;case"set_auto_retry":return this.inner.setAutoRetryEnabled(a.enabled),null;case"bash":{if(this.pendingPromptCount>0||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning)throw Error("Cannot run a shell command while the session is busy");let b=this.inner.executeBash(a.command,void 0,{excludeFromContext:a.excludeFromContext,operations:(0,q.J1)({shellPath:this.inner.settingsManager.getShellPath()})});try{let a=await b;return this.persistBashOnlySession(),a}finally{this.resetIdleTimer(),(0,r.mD)()}}case"abort_bash":return this.forceShutdownOnIdle=!0,this.resetIdleTimer(),this.inner.abortBash(),null;default:throw Error(`Unsupported command: ${b}`)}}finally{d&&(this.activeMutatingCommands=Math.max(0,this.activeMutatingCommands-1))}}disposeMcpHost(){if(!this.mcpHostDisposed){this.mcpHostDisposed=!0;try{this.mcpHost?.dispose()}catch(a){console.error("[pi-web] MCP host dispose failed:",a instanceof Error?a.message:a)}}}destroy(){if(!this._alive)return;for(let a of(this._alive=!1,this.disposeMcpHost(),this.emit({type:"session_shutdown"}),this.idleTimer&&clearTimeout(this.idleTimer),this.inner.isBashRunning&&this.inner.abortBash(),this.unsubscribe?.(),this.pendingUiResponses.values()))a.cancel();for(let a of Array.from(this.activeCustomUis.keys()))this.closeCustomUi(a,void 0);this.pendingUiResponses.clear(),this.pendingUiRequests.clear(),this.activeToolEvents.clear(),this.clearExtensionWidgets(!1);let a=()=>{try{this.inner.dispose()}finally{this.onDestroyCallback?.(),this.resolveDisposed()}};if(this.sessionShutdownEmitted)return void a();this.sessionShutdownEmitted=!0;let b=this.inner.extensionRunner?.emit;"function"!=typeof b?a():this.emitSessionShutdown(b).catch(a=>{console.error("[pi-web] session_shutdown before dispose failed:",a instanceof Error?a.message:a)}).finally(a)}async shutdown(){return this.shutdownPromise?this.shutdownPromise:this._alive?(this.closing=!0,this.shutdownPromise=(async()=>{try{try{await this.waitForExtensionsBound()}catch(a){console.error("[pi-web] extension binding failed before session shutdown:",a instanceof Error?a.message:a)}if(this.disposeMcpHost(),!this.sessionShutdownEmitted){this.sessionShutdownEmitted=!0;let a=this.inner.extensionRunner?.emit;"function"==typeof a&&await this.emitSessionShutdown(a)}}finally{this.destroy()}})(),this.shutdownPromise):void 0}async emitSessionShutdown(a){let b,c=new Promise(a=>{b=setTimeout(()=>a("timeout"),U),b.unref?.()}),d=(async()=>(await a.call(this.inner.extensionRunner,{type:"session_shutdown",reason:"quit"}),"handled"))();try{await Promise.race([d,c])==="timeout"&&console.warn(`[pi-web] extensions did not finish session_shutdown for session ${this.sessionId} within ${U} ms; disposing it anyway`)}finally{clearTimeout(b)}}resolveExtensionUiResponse(a){let b=this.pendingUiResponses.get(a.id);b&&b.resolve(a)}getExtensionStatuses(){return Array.from(this.extensionStatuses,([a,b])=>({key:a,text:b}))}getExtensionWidgets(){return Array.from(this.extensionWidgets.values())}nextExtensionWidgetGeneration(a){let b=(this.extensionWidgetGenerations.get(a)??0)+1;return this.extensionWidgetGenerations.set(a,b),b}disposeExtensionWidgetComponent(a){if(!a||"object"!=typeof a&&"function"!=typeof a)return;let b=a.dispose;if("function"==typeof b)try{b.call(a)}catch{}}emitExtensionWidgetClear(a){this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setWidget",widgetKey:a,widgetLines:void 0,widgetPlacement:void 0})}clearExtensionWidget(a,b=!0){let c=this.nextExtensionWidgetGeneration(a),d=this.activeExtensionWidgets.get(a);return this.activeExtensionWidgets.delete(a),this.extensionWidgets.delete(a),d&&this.disposeExtensionWidgetComponent(d.component),this.extensionWidgetGenerations.get(a)!==c||b&&this.emitExtensionWidgetClear(a),c}clearExtensionWidgets(a){for(let b of new Set([...this.extensionWidgets.keys(),...this.activeExtensionWidgets.keys()]))this.clearExtensionWidget(b,a)}resetExtensionWidgetsForReload(){this.extensionWidgetsResetting=!0;try{for(let a of[...this.activeExtensionWidgets.keys()])this.clearExtensionWidget(a);this.extensionWidgets.clear()}finally{this.extensionWidgetsResetting=!1}}emitExtensionWidgetError(a,b){this.emit({type:"extension_error",extensionPath:`extension-widget:${a}`,event:"setWidget",error:b instanceof Error?b.message:String(b)})}failExtensionWidget(a,b,c,d,e){if(this.extensionWidgetGenerations.get(a)!==b)return void this.disposeExtensionWidgetComponent(e);let f=this.activeExtensionWidgets.get(a),g=!d;f?.generation===b?(g=f.rendered||!f.clearEmitted,this.activeExtensionWidgets.delete(a),this.disposeExtensionWidgetComponent(f.component)):this.disposeExtensionWidgetComponent(e),this.extensionWidgetGenerations.get(a)!==b||(this.extensionWidgets.delete(a),g&&this.emitExtensionWidgetClear(a)),this.emitExtensionWidgetError(a,c)}renderExtensionWidget(a){let b;if(this.activeExtensionWidgets.get(a.key)!==a||this.extensionWidgetGenerations.get(a.key)!==a.generation)return;try{b=a.component.render(w.p1)}catch(b){this.failExtensionWidget(a.key,a.generation,b,a.clearEmitted);return}if(!Array.isArray(b)||!b.every(a=>"string"==typeof a))return void this.failExtensionWidget(a.key,a.generation,Error("Extension widget render must return string[]"),a.clearEmitted);if(this.activeExtensionWidgets.get(a.key)!==a||this.extensionWidgetGenerations.get(a.key)!==a.generation)return;let c=b;this.extensionWidgets.set(a.key,{key:a.key,lines:c,placement:a.placement}),a.rendered=!0,this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setWidget",widgetKey:a.key,widgetLines:c,widgetPlacement:a.placement})}setExtensionWidgetFactory(a,b,c){let d,e=this.extensionWidgets.has(a)||this.activeExtensionWidgets.has(a),f=this.clearExtensionWidget(a,e);if(this.extensionWidgetGenerations.get(a)!==f)return;let g=(0,w.TQ)(()=>{let b=this.activeExtensionWidgets.get(a);b?.generation===f&&this.renderExtensionWidget(b)},w.p1);try{d=b(g,_)}catch(b){this.failExtensionWidget(a,f,b,e);return}if(this.extensionWidgetGenerations.get(a)!==f)return void this.disposeExtensionWidgetComponent(d);if(!d||"object"!=typeof d&&"function"!=typeof d||"function"!=typeof d.render)return void this.failExtensionWidget(a,f,Error("Extension widget factory must return a component with render(width)"),e,d);let h={key:a,component:d,placement:c?.placement??"aboveEditor",generation:f,clearEmitted:e,rendered:!1};this.activeExtensionWidgets.set(a,h),this.renderExtensionWidget(h)}getCustomUiWidth(a){if(!a||"object"!=typeof a)return w.p1;let b=a.overlayOptions,c="function"==typeof b?b():b;if(!c||"object"!=typeof c)return w.p1;let d=c.width;return"number"==typeof d&&Number.isFinite(d)?Math.max(40,Math.min(140,Math.round(d))):92}emitCustomUiRender(a,b){let c;try{c=b.component.render(b.width)}catch(a){c=[`Extension custom UI render failed: ${a instanceof Error?a.message:String(a)}`]}let d={type:"extension_ui_request",id:a,method:"custom",lines:c};this.pendingUiRequests.set(a,d),this.emit(d)}closeCustomUi(a,b){let c=this.activeCustomUis.get(a);if(c&&!c.settled){c.settled=!0,this.activeCustomUis.delete(a),this.pendingUiRequests.delete(a);try{c.component.dispose?.()}catch{}this.emit({type:"extension_ui_request",id:a,method:"custom",lines:[],closed:!0}),c.resolve(b)}}handleExtensionUiInput(a,b){let c=this.activeCustomUis.get(a);if(c&&"string"==typeof b)try{c.component.handleInput?.(b),this.activeCustomUis.has(a)&&this.emitCustomUiRender(a,c)}catch(b){this.closeCustomUi(a,void 0),this.emit({type:"extension_error",extensionPath:`custom-ui:${a}`,event:"custom_ui_input",error:b instanceof Error?b.message:String(b)})}}requestExtensionCustomUi(a,b){if("function"!=typeof a)return Promise.resolve(void 0);let c=this.extensionUiAbortController.signal;if(c.aborted)return Promise.reject(c.reason);let d=(0,g.randomUUID)(),e=this.getCustomUiWidth(b);return new Promise((b,f)=>{let g=!1,h=(0,w.TQ)(()=>{let a=this.activeCustomUis.get(d);a&&this.emitCustomUiRender(d,a)},e),i=a=>{g||(g=!0,c.removeEventListener("abort",k),c.aborted?f(c.reason):b(a))},j=a=>{this.activeCustomUis.has(d)?this.closeCustomUi(d,a):i(a)},k=()=>j(void 0);c.addEventListener("abort",k,{once:!0}),Promise.resolve().then(()=>g?void 0:a(h,_,aa,j)).then(a=>{if(g){try{a?.dispose?.()}catch{}return}if(!a||"object"!=typeof a||"function"!=typeof a.render)return void i(void 0);let b={component:a,width:e,resolve:a=>i(a),settled:!1};this.activeCustomUis.set(d,b),this.emitCustomUiRender(d,b)}).catch(a=>{g||(this.emit({type:"extension_error",extensionPath:`custom-ui:${d}`,event:"custom_ui",error:a instanceof Error?a.message:String(a)}),i(void 0))})})}requestExtensionUi(a,b,c,d,e){if(e?.aborted)return Promise.resolve(b);let f=this.extensionUiAbortController.signal;if(f.aborted)return Promise.reject(f.reason);let h=e?AbortSignal.any([e,f]):f,i=(0,g.randomUUID)(),j={type:"extension_ui_request",id:i,...a,...d?{timeout:d,expiresAt:Date.now()+d}:{}};return new Promise((a,e)=>{let g,k=!1,l=()=>{g&&clearTimeout(g),h.removeEventListener("abort",n),this.pendingUiRequests.delete(i),this.pendingUiResponses.delete(i),this.emit({type:"extension_ui_closed",id:i})},m=b=>{k||(k=!0,l(),f.aborted?e(f.reason):a(b))},n=()=>m(b);d&&(g=setTimeout(()=>m(b),d)),h.addEventListener("abort",n,{once:!0}),this.pendingUiRequests.set(i,j),this.pendingUiResponses.set(i,{resolve:a=>m(c(a)),cancel:()=>m(b)}),this.emit(j)})}createExtensionUiContext(){return{select:(a,b,c)=>this.requestExtensionUi({method:"select",title:a,options:b,...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),confirm:(a,b,c)=>this.requestExtensionUi({method:"confirm",title:a,message:b,...c?.timeout?{timeout:c.timeout}:{}},!1,a=>"confirmed"in a&&a.confirmed,c?.timeout,c?.signal),input:(a,b,c)=>this.requestExtensionUi({method:"input",title:a,...void 0!==b?{placeholder:b}:{},...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),editor:(a,b,c)=>this.requestExtensionUi({method:"editor",title:a,...void 0!==b?{prefill:b}:{},...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),notify:(a,b)=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"notify",message:a,notifyType:b})},onTerminalInput:()=>()=>{},setStatus:(a,b)=>{void 0===b?this.extensionStatuses.delete(a):this.extensionStatuses.set(a,b),this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setStatus",statusKey:a,statusText:b})},setWorkingMessage:()=>{},setWorkingVisible:()=>{},setWorkingIndicator:()=>{},setHiddenThinkingLabel:()=>{},setWidget:(a,b,c)=>{if(!this._alive||this.extensionWidgetsResetting)return;if("function"==typeof b)return void this.setExtensionWidgetFactory(a,b,c);if(void 0!==b&&!Array.isArray(b))return;if(void 0===b)return void this.clearExtensionWidget(a);let d=this.activeExtensionWidgets.has(a)?this.clearExtensionWidget(a):this.nextExtensionWidgetGeneration(a);this.extensionWidgetGenerations.get(a)===d&&(this.extensionWidgets.set(a,{key:a,lines:b,placement:c?.placement??"aboveEditor"}),this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setWidget",widgetKey:a,widgetLines:b,widgetPlacement:c?.placement}))},setFooter:()=>{},setHeader:()=>{},setTitle:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setTitle",title:a})},custom:(a,b)=>this.requestExtensionCustomUi(a,b),pasteToEditor:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"set_editor_text",text:a})},setEditorText:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"set_editor_text",text:a})},getEditorText:()=>"",addAutocompleteProvider:()=>{},setEditorComponent:()=>{},getEditorComponent:()=>void 0,get theme(){return _},getAllThemes:()=>[],getTheme:()=>void 0,setTheme:()=>({success:!1,error:"Theme switching is not supported in Pi Web extension UI yet"}),getToolsExpanded:()=>!1,setToolsExpanded:()=>{}}}createExtensionCommandContextActions(){return{waitForIdle:async()=>{let a=this.inner.agent;await a.waitForIdle?.()},newSession:async()=>({cancelled:!0}),fork:async()=>({cancelled:!0}),navigateTree:(a,b)=>this.navigateTreeKeepingToolSelection(a,{summarize:b?.summarize}),switchSession:async()=>({cancelled:!0}),reload:async()=>{let a=this.inner.isStreaming?"Wait for the current response to finish before reloading.":this.inner.isCompacting?"Wait for compaction to finish before reloading.":null;a?this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"notify",notifyType:"warning",message:a}):(this.extensionStatuses.clear(),this.resetExtensionWidgetsForReload(),this.syncProjectTrust(),await this.inner.reload({beforeSessionStart:()=>{this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc")}}),(0,m.nx)())}}}syncProjectTrust(){let a=(0,t.Y1)(this.cwd,(0,e.getAgentDir)());this.inner.settingsManager.setProjectTrusted(a.trusted)}}function O(){if(!globalThis.__piSessions){globalThis.__piSessions=new Map;let a=()=>{let a=Array.from(globalThis.__piSessions?.values()??[]);Promise.allSettled(a.map(a=>a.shutdown()))};process.once("exit",()=>globalThis.__piSessions?.forEach(a=>a.destroy())),process.once("SIGINT",a),process.once("SIGTERM",a)}return globalThis.__piSessions}function P(a){let b=O(),c=a.sessionId;a.sessionFile&&(0,r.O8)(c,a.sessionFile),a.onDestroy(()=>{b.get(c)===a&&b.delete(c)});let d=b.get(c);d&&d!==a&&"function"==typeof d.onDestroy&&d.onDestroy(()=>{}),b.set(c,a),a.start(),a.isChatOnly()||a.beginExtensionBinding()}let ad=(0,z.s)({getSession:a=>O().get(a),registerSession:(a,b)=>{let c=new ac(a,{...b?.exactSystemPrompt!==void 0?{exactSystemPrompt:b.exactSystemPrompt}:{},chatOnly:b?.chatOnly,suppressCompletionNotifications:!0,...b?.mcpHost?{mcpHost:b.mcpHost}:{}});return P(c),c},reopenSession:async(a,b)=>(await R(a,b,void 0)).session,resolveSessionPath:r.os,invalidateSessionList:r.mD,isBuiltInSubagentsEnabled:A.N}),ae=new WeakMap;function Q(a){return O().get(a)}async function R(a,b,c,d={}){let f,g,j,{initialModel:k,allowInitialModelFallback:l,thinkingLevel:m}=d,p=void 0===d.toolNames?void 0:(0,K.vw)(d.toolNames),s=O(),v=(globalThis.__piStartLocks||(globalThis.__piStartLocks=new Map),globalThis.__piStartLocks),w=s.get(a);if(w?.isAlive())return{session:w,realSessionId:a};let z=v.get(a);if(z)return z;let B=function(a){let b=O().get(a);if(!b||b.isAlive()||"function"!=typeof b.waitUntilDisposed)return null;let c=ae.get(b);if(!c){let d={done:!1,promise:Promise.resolve()};d.promise=b.waitUntilDisposed(U+1e3).then(b=>{b||console.warn(`[pi-web] session ${a} is still shutting down; starting it again anyway`)}).finally(()=>{d.done=!0}),ae.set(b,d),c=d}return c.done?null:c.promise}(a);if(B){let e=B.then(()=>(v.get(a)===e&&v.delete(a),R(a,b,c,d)));return v.set(a,e),e}if(b)f=e.SessionManager.open(b,void 0);else{if(!c)throw Error("cwd is required for a new session");f=e.SessionManager.create(c,void 0)}let F=f.getCwd(),I=f.getEntries(),J=b&&(0,y.e0)(I),L=b?(0,y.ph)(I):null;if(J&&!L)throw Error("Invalid subagent resource snapshot");let Q=L?void 0:(0,K.dS)(I),S=L?.tools??Q??p;L||void 0!==Q||void 0===p||(0,K.b5)(f,p);let T=!!(L?.loadExtensions||L?.loadSkills||L?.codemode||L?.mcp),V=S?.length===0&&!T,W=(globalThis.__piStartingSessionCwds||(globalThis.__piStartingSessionCwds=new Map),g=globalThis.__piStartingSessionCwds,j=function(a){let b=(0,i.resolve)(a);try{return(0,h.realpathSync)(b)}catch{return b}}(F),g.set(j,(g.get(j)??0)+1),()=>{let a=(g.get(j)??1)-1;a>0?g.set(j,a):g.delete(j)}),X=(async()=>{let a;V||(0,e.initTheme)();let b=(0,e.getAgentDir)();L||void 0===S||(a=0===S.length?[]:void 0);let c=L?T?(0,t.Fk)(F,b):void 0:V?void 0:(0,t.Fk)(F,b),d=e.SettingsManager.create(F,b),g={},h=(0,D.Q)(()=>g.current?.()),i=L||V?void 0:await (0,E.n7)({agentDir:b}),j=L?.codemode?await (0,E.Db)({agentDir:b,cwd:F,projectTrusted:()=>d.isProjectTrusted()}):void 0,p=L?.mcp?await (0,E.M7)({agentDir:b,cwd:F,projectTrusted:()=>d.isProjectTrusted(),codemode:!0===L.codemode}):void 0,s=L?(0,H.X)({loadSkills:L.loadSkills,skills:L.skills,exactSystemPrompt:L.exactSystemPrompt??(V?L.appendSystemPrompt[0]??"":void 0)}):void 0,v=[...j?[j]:[],...p&&L?[...p.extensions,(0,G.PV)(()=>L)]:[],...s?.loaderOptions.extensionFactories??[]],w=await (0,e.createAgentSessionServices)({cwd:F,agentDir:b,settingsManager:d,resourceLoaderOptions:L?{...(0,y._R)(L),...s.loaderOptions,...v.length>0?{extensionFactories:v}:{},noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,...V?{systemPrompt:" ",systemPromptOverride:()=>void 0}:{},appendSystemPrompt:L.appendSystemPrompt}:V?{...C.M,extensionFactories:[h]}:{extensionFactories:[...i?.extensions??[],(0,G._Q)(),(0,q.eD)({cwd:F,settings:d}),(0,x.Vj)(ad.extensionRuntime,()=>(0,y.IR)(F),A.N)],extensionsOverride:a=>(0,q.Ds)((0,x.U6)(a))},...c?{resourceLoaderReloadOptions:c}:{}});if(L?.codemode&&!w.resourceLoader.getExtensions().extensions.some(a=>a.tools.has("codemode")))throw Error("Code mode is unavailable: builtin:codemode was not registered");let z=w.settingsManager.getEnabledModels(),B=await (0,n.py)(w.modelRuntime,z),I=k&&!w.modelRuntime.getModel(k.provider,k.modelId)?(0,o.S9)(w.modelRuntime,k.provider,k.modelId):void 0;if(V&&I&&!l)throw M(I.provider,I.id);let J=k&&!I&&(!l||B.visible.some(a=>a.provider===k.provider&&a.id===k.modelId))?k:void 0,K=w.settingsManager.getDefaultProvider(),O=w.settingsManager.getDefaultModel(),Q=K&&O?{provider:K,modelId:O}:void 0,R=f.getBranch(),U=R.some(a=>"message"===a.type&&"system"!==a.message.role),W=U?(0,r.Vg)(R):null,X=W?w.modelRuntime.getModel(W.provider,W.modelId):void 0,Y=U?null:(0,n.IR)(B,{...J?{requestedModel:J}:{},...Q?{defaultModel:Q}:{},...m?{thinkingLevel:m}:{}}),$=X&&w.modelRuntime.hasConfiguredAuth(X.provider)?X:Y?.model,_=!!(Y?.model&&Q&&Y.model.provider===Q.provider&&Y.model.id===Q.modelId&&(B.scopedModels.length>0||!z?.some(a=>a.trim()))),aa=U||V||!I&&(J||_)?void 0:await (0,o.je)(w.modelRuntime,z,I?{requestedModel:{provider:I.provider,modelId:I.id}}:Q?{defaultModel:Q}:{}),ab=U?W&&!X?(0,o.S9)(w.modelRuntime,W.provider,W.modelId):void 0:I??aa?.model,ae=ab?U?R.findLast(a=>"thinking_level_change"===a.type)?.thinkingLevel??w.settingsManager.getDefaultThinkingLevel()??Z:m??aa?.thinkingLevelPin??w.settingsManager.getModelThinkingLevel(ab.provider,ab.id)??w.settingsManager.getDefaultThinkingLevel()??Z:void 0,af=V?ab??(!U&&K&&O?(0,o.S9)(w.modelRuntime,K,O):void 0):void 0,{session:ag}=await (0,e.createAgentSessionFromServices)({services:w,sessionManager:f,...$?{model:$}:{},...Y?.thinkingLevel?{thinkingLevel:Y.thinkingLevel}:{},...B.scopedModels.length>0?{scopedModels:[...B.scopedModels]}:{},...L?(0,y.AO)(L):void 0!==a?{tools:a}:{}});if(!L&&!V){let a=ag.getActiveToolNames();ag.setActiveToolsByName(N(ag,S??a,a))}s?.setActiveToolsGetter(()=>ag.getActiveToolNames());let ah=L?s.getExactSystemPrompt:V?()=>(0,C.c)(ag.resourceLoader.getAgentsFiles().agentsFiles):void 0;g.current=ah;let ai=i?.mcpHost??p?.mcpHost,aj=new ac(ag,{exactSystemPrompt:ah,chatOnly:V,onAgentRunComplete:(a,b)=>{(0,u.lB)(a,b).catch(a=>{console.error("[pi-web] failed to send completion push:",a instanceof Error?a.message:a)})},suppressCompletionNotifications:!!L,...ai?{mcpHost:ai}:{},...af?{chatOnlyExtensionModel:af}:{}}),ak=ag.sessionId;if(P(aj),!V){if(ab)try{await aj.waitUntilReady(),await aj.send({type:"set_model",provider:ab.provider,modelId:ab.id}),ae&&await aj.send({type:"set_thinking_level",level:ae})}catch(a){console.error(`[pi-web] could not switch to ${ab.provider}/${ab.id}:`,a instanceof Error?a.message:a)}aj.waitUntilReady().then(()=>(0,o.vd)(ag.modelRuntime)).catch(()=>void 0)}return{session:aj,realSessionId:ak}})().finally(()=>{v.delete(a),W()});return v.set(a,X),X}d()}catch(a){d(a)}})},20946:(a,b,c)=>{"use strict";c.d(b,{aS:()=>d,tF:()=>h,xW:()=>g});let d="PI_WEB_PASSWORD";function e(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)}function f(a){return e(a)?Object.entries(a).filter(a=>"string"==typeof a[1]):[]}function g(a){if(!e(a))return[];if(!("url"in a))return f(a.env).map(([a,b])=>({kind:"env",name:a,value:b}));let b=f(a.headers).map(([a,b])=>({kind:"header",name:a,value:b})),c=e(a.oauth)?a.oauth.clientSecret:void 0;return"string"==typeof c&&b.push({kind:"oauth-client-secret",value:c}),b}function h(a,b){for(let{value:c,...e}of g(a))if(b.isCommandConfigValue(c)?c.toUpperCase().includes(d):b.getConfigValueEnvVarNames(c).some(a=>a.toUpperCase()===d))return e}},21513:(a,b,c)=>{"use strict";c.d(b,{U2:()=>i,dj:()=>f,qu:()=>h});var d=c(77598);function e(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)}function f(a,b=0){return Array.isArray(a)||e(a)?b>=64?"<too deep>":Array.isArray(a)?`[${a.map(a=>f(a,b+1)).join(",")}]`:`{${Object.keys(a).sort().map(c=>`${JSON.stringify(c)}:${f(a[c],b+1)}`).join(",")}}`:JSON.stringify(a)??"null"}let g=Symbol.for("pi-web:mcp-config-key-secret");function h(a){let b=globalThis,c=b[g]??=(0,d.randomBytes)(32);return(0,d.createHmac)("sha256",c).update(f(a)).digest("base64url")}function i(a,b){return h(e(b)?b:a)}},24989:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{Ei:()=>q});var e=c(77598),f=c(73024),g=c(19371),h=c(42267),i=c(89717),j=c(57432),k=c(70090),l=c(38015),m=c(73764),n=c(90379),o=a([g,h,i,j,k,m]);[g,h,i,j,k,m]=o.then?(await o)():o;let x=Symbol.for("pi-web:automations-runtime");function p(){let a=globalThis;return a[x]??={ticker:null}}function q(){null===p().ticker&&(p().ticker=setInterval(()=>{r().catch(a=>{console.warn(`[pi-web] automations tick failed: ${a instanceof Error?a.message:String(a)}`)})},3e4),console.log("[pi-web] automations ticker started"))}async function r(){let a=(0,k.$k)();for(let b of a.automations){if(!b.enabled||null!==(0,l.Lk)(b.schedule))continue;let c=b.nextDueAt;if((null!==c||(c=(0,l.ns)(b.schedule,Date.now()),await s(b.id,{nextDueAt:c}),null!==c))&&!(c>Date.now())){if(a.runs.some(a=>a.automationId===b.id&&"running"===a.status)){await t({id:(0,e.randomUUID)(),automationId:b.id,trigger:"schedule",startedAt:Date.now(),finishedAt:Date.now(),status:"skipped",sessionId:null,sessionFile:null,error:"The previous run was still going"}),await s(b.id,{nextDueAt:(0,l.ns)(b.schedule,Date.now())});continue}w(b,"schedule").catch(a=>{console.warn(`[pi-web] automation "${b.name}" failed: ${a instanceof Error?a.message:String(a)}`)}),await s(b.id,{nextDueAt:(0,l.ns)(b.schedule,Date.now())})}}}async function s(a,b){await (0,k.Vr)(c=>{let d=!1,e=c.automations.map(c=>c.id!==a?c:(d=!0,{...c,...b}));return{file:{...c,automations:e},changed:d}}).catch(a=>{console.warn(`[pi-web] automations: persisting a patch failed: ${a instanceof Error?a.message:String(a)}`)})}async function t(a){await (0,k.Vr)(b=>({file:{...b,runs:[...b.runs.filter(b=>b.id!==a.id),a]},changed:!0})).catch(a=>{console.warn(`[pi-web] automations: recording a run failed: ${a instanceof Error?a.message:String(a)}`)})}async function u(a,b){await (0,k.Vr)(c=>({file:{...c,runs:c.runs.map(c=>c.id===a?{...c,...b}:c)},changed:!0})).catch(()=>{})}function v(a=new Date){let b=a=>String(a).padStart(2,"0");return`${b(a.getMonth()+1)}-${b(a.getDate())} ${b(a.getHours())}:${b(a.getMinutes())}`}async function w(a,b){let c,d,l,o,p=(0,e.randomUUID)(),q=Date.now();await t({id:p,automationId:a.id,trigger:b,startedAt:q,finishedAt:null,status:"running",sessionId:null,sessionFile:null,error:null}),await s(a.id,{lastRunAt:q});let r=async c=>(await u(p,{finishedAt:Date.now(),status:"failed",error:c}),a.notify&&"schedule"===b&&await (0,h.lB)(a.id,`${a.name} \xb7 failed`).catch(()=>{}),await (0,m.U)(a,{status:"failed",name:`${a.name} \xb7 ${v()}`,reply:"",error:c,startedAt:q,durationMs:Date.now()-q}).catch(()=>{}),{runId:p,sessionId:null,error:c});try{(0,f.mkdirSync)(a.cwd,{recursive:!0})}catch(a){return r(`The working directory could not be created: ${a instanceof Error?a.message:String(a)}`)}(0,i.wz)(a.cwd);try{let b=`__automation__${(0,e.randomUUID)()}`,f=await (0,g.OF)(b,"",a.cwd,{...a.model?{initialModel:a.model}:{},...a.thinkingLevel?{thinkingLevel:a.thinkingLevel}:{}});c=f.session,d=f.realSessionId}catch(a){return r(`Starting the session failed: ${a instanceof Error?a.message:String(a)}`)}let w=`${a.name} \xb7 ${v()}`;try{await c.send({type:"set_session_name",name:w})}catch{}let x=!1,y="",z=new Promise((a,b)=>{l=a,o=b}),A=c.onEvent(a=>{if("message_end"===a.type){let b=a.message;if(b&&"assistant"===b.role){let a=(0,n.qh)(b);""!==a.trim()&&(y=a)}}else"prompt_done"===a.type?(a.aborted&&(x=!0),l()):"prompt_error"===a.type&&o(Error(a.errorMessage??"The turn failed"))});try{await c.send({type:"prompt",message:a.prompt}),await z,await u(p,{finishedAt:Date.now(),status:x?"skipped":"done",sessionId:d,sessionFile:c.sessionFile,error:x?"The turn was stopped":null}),(0,j.mD)();let b=!x&&(0,k._Y)(a.silentWhen,y);return a.notify&&!b&&await (0,h.lB)(d,w).catch(()=>{}),b||await (0,m.U)(a,{status:x?"skipped":"done",name:w,reply:y,error:x?"The turn was stopped":null,startedAt:q,durationMs:Date.now()-q}).catch(()=>{}),{runId:p,sessionId:d,error:null}}catch(e){let b=e instanceof Error?e.message:String(e);return await u(p,{finishedAt:Date.now(),status:"failed",sessionId:d,sessionFile:c.sessionFile,error:b}),(0,j.mD)(),a.notify&&await (0,h.lB)(d,`${w} \xb7 failed`).catch(()=>{}),await (0,m.U)(a,{status:"failed",name:w,reply:y,error:b,startedAt:q,durationMs:Date.now()-q}).catch(()=>{}),{runId:p,sessionId:d,error:b}}finally{A()}}d()}catch(a){d(a)}})},25653:a=>{function b(a,b){"boolean"==typeof b&&(b={forever:b}),this._originalTimeouts=JSON.parse(JSON.stringify(a)),this._timeouts=a,this._options=b||{},this._maxRetryTime=b&&b.maxRetryTime||1/0,this._fn=null,this._errors=[],this._attempts=1,this._operationTimeout=null,this._operationTimeoutCb=null,this._timeout=null,this._operationStart=null,this._options.forever&&(this._cachedTimeouts=this._timeouts.slice(0))}a.exports=b,b.prototype.reset=function(){this._attempts=1,this._timeouts=this._originalTimeouts},b.prototype.stop=function(){this._timeout&&clearTimeout(this._timeout),this._timeouts=[],this._cachedTimeouts=null},b.prototype.retry=function(a){if(this._timeout&&clearTimeout(this._timeout),!a)return!1;var b=new Date().getTime();if(a&&b-this._operationStart>=this._maxRetryTime)return this._errors.unshift(Error("RetryOperation timeout occurred")),!1;this._errors.push(a);var c=this._timeouts.shift();if(void 0===c)if(!this._cachedTimeouts)return!1;else this._errors.splice(this._errors.length-1,this._errors.length),this._timeouts=this._cachedTimeouts.slice(0),c=this._timeouts.shift();var d=this,e=setTimeout(function(){d._attempts++,d._operationTimeoutCb&&(d._timeout=setTimeout(function(){d._operationTimeoutCb(d._attempts)},d._operationTimeout),d._options.unref&&d._timeout.unref()),d._fn(d._attempts)},c);return this._options.unref&&e.unref(),!0},b.prototype.attempt=function(a,b){this._fn=a,b&&(b.timeout&&(this._operationTimeout=b.timeout),b.cb&&(this._operationTimeoutCb=b.cb));var c=this;this._operationTimeoutCb&&(this._timeout=setTimeout(function(){c._operationTimeoutCb()},c._operationTimeout)),this._operationStart=new Date().getTime(),this._fn(this._attempts)},b.prototype.try=function(a){console.log("Using RetryOperation.try() is deprecated"),this.attempt(a)},b.prototype.start=function(a){console.log("Using RetryOperation.start() is deprecated"),this.attempt(a)},b.prototype.start=b.prototype.try,b.prototype.errors=function(){return this._errors},b.prototype.attempts=function(){return this._attempts},b.prototype.mainError=function(){if(0===this._errors.length)return null;for(var a={},b=null,c=0,d=0;d<this._errors.length;d++){var e=this._errors[d],f=e.message,g=(a[f]||0)+1;a[f]=g,g>=c&&(b=e,c=g)}return b}},28718:(a,b,c)=>{var d=global.process;let e=function(a){return a&&"object"==typeof a&&"function"==typeof a.removeListener&&"function"==typeof a.emit&&"function"==typeof a.reallyExit&&"function"==typeof a.listeners&&"function"==typeof a.kill&&"number"==typeof a.pid&&"function"==typeof a.on};if(e(d)){var f,g=c(12412),h=c(53481),i=/^win/i.test(d.platform),j=c(94735);"function"!=typeof j&&(j=j.EventEmitter),d.__signal_exit_emitter__?f=d.__signal_exit_emitter__:((f=d.__signal_exit_emitter__=new j).count=0,f.emitted={}),f.infinite||(f.setMaxListeners(1/0),f.infinite=!0),a.exports=function(a,b){if(!e(global.process))return function(){};g.equal(typeof a,"function","a callback must be provided for exit handler"),!1===n&&o();var c="exit";return b&&b.alwaysLast&&(c="afterexit"),f.on(c,a),function(){f.removeListener(c,a),0===f.listeners("exit").length&&0===f.listeners("afterexit").length&&k()}};var k=function(){n&&e(global.process)&&(n=!1,h.forEach(function(a){try{d.removeListener(a,m[a])}catch(a){}}),d.emit=r,d.reallyExit=p,f.count-=1)};a.exports.unload=k;var l=function(a,b,c){f.emitted[a]||(f.emitted[a]=!0,f.emit(a,b,c))},m={};h.forEach(function(a){m[a]=function(){e(global.process)&&d.listeners(a).length===f.count&&(k(),l("exit",null,a),l("afterexit",null,a),i&&"SIGHUP"===a&&(a="SIGINT"),d.kill(d.pid,a))}}),a.exports.signals=function(){return h};var n=!1,o=function(){!n&&e(global.process)&&(n=!0,f.count+=1,h=h.filter(function(a){try{return d.on(a,m[a]),!0}catch(a){return!1}}),d.emit=s,d.reallyExit=q)};a.exports.load=o;var p=d.reallyExit,q=function(a){e(global.process)&&(d.exitCode=a||0,l("exit",d.exitCode,null),l("afterexit",d.exitCode,null),p.call(d,d.exitCode))},r=d.emit,s=function(a,b){if(!("exit"===a&&e(global.process)))return r.apply(this,arguments);void 0!==b&&(d.exitCode=b);var c=r.apply(this,arguments);return l("exit",d.exitCode,null),l("afterexit",d.exitCode,null),c}}else a.exports=function(){return function(){}}},29188:(a,b,c)=>{"use strict";function d(a){switch(a.method){case"select":case"confirm":case"input":case"editor":return!0;case"custom":return!0!==a.closed;default:return!1}}c.d(b,{YI:()=>d})},29299:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{U:()=>p});var e=c(75430),f=c(73024),g=c(98995),h=c(76760),i=c(73136),j=a([e]);e=(j.then?(await j)():j)[0];let q="@earendil-works/pi-coding-agent",r="@earendil-works/pi-mcp",s={mcpExtension:"dist/extensions/mcp/index.js",mcpRuntime:"dist/extensions/mcp/runtime.js",mcpConfig:"dist/extensions/mcp/config.js",mcpOAuth:"dist/extensions/mcp/oauth.js",mcpServers:"dist/core/mcp-servers.js",configValues:"dist/core/resolve-config-value.js"},t={McpServerConnection:{module:"mcpRuntime",kind:"class"},createDefaultTransport:{module:"mcpRuntime",kind:"function"},StdioTransport:{module:"mcpClient",kind:"class"},loadMcpConfig:{module:"mcpConfig",kind:"function"},addMcpServerConfig:{module:"mcpConfig",kind:"function"},updateMcpServerConfig:{module:"mcpConfig",kind:"function"},removeMcpServerConfig:{module:"mcpConfig",kind:"function"},validateMcpServerConfig:{module:"mcpServers",kind:"function"},getMcpToolExposure:{module:"mcpServers",kind:"function"},signInMcpServer:{module:"mcpOAuth",kind:"function"},McpOAuthCredentialStore:{module:"mcpOAuth",kind:"class"},McpSignInCancelledError:{module:"mcpOAuth",kind:"class"},resolveConfigValueOrThrow:{module:"configValues",kind:"function"},resolveHeadersOrThrow:{module:"configValues",kind:"function"},getConfigValueEnvVarNames:{module:"configValues",kind:"function"},isCommandConfigValue:{module:"configValues",kind:"function"}};function k(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)}function l(a){return a instanceof Error?a.message:String(a)}async function m(a){return await import((0,i.pathToFileURL)(a).href)}let u=new Set(["node","import","module-sync","node-addons","default"]);async function n(a){let b=Object.fromEntries(Object.entries(s).map(([b,c])=>[b,(0,h.join)(a,c)]));try{b.mcpClient=function(a){let b=(0,i.pathToFileURL)((0,h.join)(a,s.mcpRuntime)).href,c=(0,g.findPackageJSON)(r,b);if(!c)throw Error(`cannot resolve ${r}`);let d=function(a){if(!k(a))return;let{exports:b}=a;return void 0===b?"string"==typeof a.main?a.main:"index.js":function a(b){if("string"==typeof b||null===b)return b;for(let c of Array.isArray(b)?b:k(b)?Object.entries(b).filter(([a])=>u.has(a)).map(([,a])=>a):[]){let b=a(c);if(void 0!==b)return b}}(k(b)&&"."in b?b["."]:b)??void 0}(JSON.parse((0,f.readFileSync)(c,"utf8")));if(!d)throw Error(`${c} declares no import entry`);return(0,h.join)(c,"..",d)}(a)}catch(a){return`${r}: ${l(a)}`}let c={};for(let[a,d]of Object.entries(b))try{c[a]=await m(d)}catch(a){return`cannot load ${d}: ${l(a)}`}return c}async function o(a={}){var b;let c,{environment:d=process.env,cwd:j=process.cwd()}=a;if(d.PI_PACKAGE_DIR)return{ok:!1,reason:`PI_PACKAGE_DIR is set; MCP support loads only from the ${q} that Pi Web runs`};try{c=(0,f.realpathSync)((0,e.getPackageDir)());let a=function(a){let b=(0,g.findPackageJSON)(q,(0,i.pathToFileURL)((0,h.join)(a,"package.json")).href);if(!b)throw Error(`cannot resolve ${q} from ${a}`);return(0,f.realpathSync)((0,h.join)(b,".."))}(j);if(b=c,"win32"===process.platform?b.toLowerCase()!==a.toLowerCase():b!==a)return{ok:!1,reason:`${q} at ${c} is not the package Pi Web resolves (${a})`}}catch(a){return{ok:!1,reason:`cannot locate ${q}: ${l(a)}`}}let k=await n(c);if("string"==typeof k)return{ok:!1,reason:k};if(k.mcpExtension.createMcpExtension!==e.createMcpExtension)return{ok:!1,reason:`${s.mcpExtension} loaded as a second copy of ${q}`};let m=function(a){let b={};for(let[c,{module:d,kind:e}]of Object.entries(t)){let f=a[d][c];if("class"===e?!("function"==typeof f&&/^class[\s{]/.test(Function.prototype.toString.call(f))):"function"!=typeof f){let a="mcpClient"===d?r:s[d];return`${a} does not export ${c} as a ${e}`}b[c]=f}return b}(k);if("string"==typeof m)return{ok:!1,reason:m};let p={packageDir:c,...m};try{if(!(p.createDefaultTransport({name:"pi-web-probe",config:{command:"pi-web-probe"},source:"pi-web"},p.packageDir,void 0)instanceof p.StdioTransport))return{ok:!1,reason:`${r} resolved to another copy than ${s.mcpRuntime} uses`}}catch(a){return{ok:!1,reason:`${s.mcpRuntime}: ${l(a)}`}}return{ok:!0,...p}}let v=Symbol.for("pi-web.piSdkInternals");function p(){let a=globalThis;return a[v]??=o().catch(a=>({ok:!1,reason:l(a)}))}d()}catch(a){d(a)}})},30507:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{PV:()=>k,_Q:()=>l});var e=c(13956),f=c(38222),g=c(66192),h=a([g]);g=(h.then?(await h)():h)[0];let m=new Set(["bash","powershell","edit","write"]);function i(a){return void 0!==a&&a.length>0&&!a.some(a=>m.has(a))}function j(a){return a.sourceInfo?.path===e.pM||a.name.startsWith("mcp__")}function k(a){return{name:"pi-web-subagent-mcp-policy",hidden:!0,factory:b=>{b.on("tool_call",c=>{var d,f;let h=b.getAllTools().find(a=>a.name===c.toolName);if(!h||!j(h))return;let{tools:k,allExtensionTools:l}=a();if(!l&&h.sourceInfo?.path!==e.pM&&!k.includes(h.name))return{block:!0,reason:(d=c.toolName,`"${d}" comes from an extension this subagent's profile did not select, so the call was blocked.`)};if(h.annotations?.readOnlyHint!==!0&&i(k.filter(a=>g.xL.includes(a))))return{block:!0,reason:(f=c.toolName,`This subagent's profile gives it read-only tools, and the MCP server does not mark "${f}" as read-only (readOnlyHint), so the call was blocked.`)}})}}}function l(){return{name:"pi-web-read-only-mcp",hidden:!0,factory:a=>{a.on("tool_call",(b,c)=>{let d=a.getAllTools().find(a=>a.name===b.toolName);if(!d||!j(d)||d.annotations?.readOnlyHint===!0)return;let e=(0,f.dS)(c.sessionManager.getEntries());if(i(e)){var g;return{block:!0,reason:(g=b.toolName,`This session uses a read-only tool selection, and the MCP server does not mark "${g}" as read-only (readOnlyHint), so the call was blocked. Switch the session to a preset that allows changes to use it.`)}}})}}}d()}catch(a){d(a)}})},35234:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{Fk:()=>m,Y1:()=>k,n:()=>l});var e=c(73024);c(48161);var f=c(76760),g=c(75430);c(89420);var h=c(97136),i=a([g]);function j(a,b){return b?{decision:b.decision,decisionPath:b.path,inherited:!(0,h.Eb)(b.path,function(a){let b=(0,f.resolve)(a);try{return(0,e.realpathSync)(b)}catch{return b}}(a))}:{decision:null,inherited:!1}}function k(a,b){let c=!!a&&(0,g.hasTrustRequiringProjectResources)(a),d=new g.ProjectTrustStore(b);if(!c){if(!a)return{requiresTrust:!1,trusted:!0,decision:null,inherited:!1};try{return{requiresTrust:!1,trusted:!0,...j(a,d.getEntry(a))}}catch(a){return{requiresTrust:!1,trusted:!0,decision:null,inherited:!1,decisionError:a instanceof Error?a.message:String(a)}}}let e=d.getEntry(a);return{requiresTrust:!0,trusted:e?.decision===!0,...j(a,e)}}g=(i.then?(await i)():i)[0];let n=Symbol.for("pi-web:project-trust-read-warnings");function l(a,b){try{if(!a||!(0,g.hasTrustRequiringProjectResources)(a))return!1;return!0===new g.ProjectTrustStore(b).get(a)}catch(h){let a=(0,f.join)(b,"trust.json"),c=h instanceof Error?h.message:String(h),d=globalThis,e=d[n]??=new Set,g=`${a}\0${c}`;return e.has(g)||(e.size>=200&&e.delete(e.values().next().value),e.add(g),console.warn(`[pi-web] cannot read project trust from ${a}; projects that need it count as untrusted meanwhile: ${c}`)),!1}}function m(a,b){if(!a||!(0,g.hasTrustRequiringProjectResources)(a))return;let c=new g.ProjectTrustStore(b);return{resolveProjectTrust:async()=>!0===c.get(a)}}Symbol.for("pi-web:fresh-folder-trust-locks"),d()}catch(a){d(a)}})},35618:(a,b,c)=>{"use strict";c.d(b,{z:()=>f});var d=c(76760),e=c.n(d);function f(a,b=process.platform){if(!a)return a;let c="win32"===b?e().win32:e().posix,d=c.normalize(a),g=c.parse(d).root.length,h=d.length;for(;h>g&&d[h-1]===c.sep;)h--;let i=d.slice(0,h);return"win32"===b?i.toLowerCase():i}},35859:(a,b,c)=>{var d=c(25653);b.operation=function(a){return new d(b.timeouts(a),{forever:a&&a.forever,unref:a&&a.unref,maxRetryTime:a&&a.maxRetryTime})},b.timeouts=function(a){if(a instanceof Array)return[].concat(a);var b={retries:10,factor:2,minTimeout:1e3,maxTimeout:1/0,randomize:!1};for(var c in a)b[c]=a[c];if(b.minTimeout>b.maxTimeout)throw Error("minTimeout is greater than maxTimeout");for(var d=[],e=0;e<b.retries;e++)d.push(this.createTimeout(e,b));return a&&a.forever&&!d.length&&d.push(this.createTimeout(e,b)),d.sort(function(a,b){return a-b}),d},b.createTimeout=function(a,b){var c=Math.round((b.randomize?Math.random()+1:1)*b.minTimeout*Math.pow(b.factor,a));return Math.min(c,b.maxTimeout)},b.wrap=function(a,c,d){if(c instanceof Array&&(d=c,c=null),!d)for(var e in d=[],a)"function"==typeof a[e]&&d.push(e);for(var f=0;f<d.length;f++){var g=d[f],h=a[g];a[g]=(function(d){var e=b.operation(c),f=Array.prototype.slice.call(arguments,1),g=f.pop();f.push(function(a){e.retry(a)||(a&&(arguments[0]=e.mainError()),g.apply(this,arguments))}),e.attempt(function(){d.apply(a,f)})}).bind(a,h),a[g].options=c}}},36205:(a,b,c)=>{"use strict";c.d(b,{TQ:()=>e,p1:()=>d});let d=92;function e(a,b=d,c=40){return Object.freeze({terminal:Object.freeze({columns:b,rows:c,kittyProtocolActive:!1}),requestRender:a})}},36561:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{$9:()=>h,Ds:()=>k,J1:()=>i,eD:()=>j});var e=c(75430),f=c(76760),g=a([e]);e=(g.then?(await g)():g)[0];let l="pi-web-project-command-environment",m=`<inline:${l}>`;function h(a,b=process.platform){let c={...a};for(let a of Object.keys(c))(function(a,b){let c="win32"===b?a.toUpperCase():a;return"PORT"===c||"NODE_ENV"===c||c.startsWith("NEXT_")||"PI_WEB_PASSWORD"===c})(a,b)&&delete c[a];return c}function i(a={}){let{abortSettleGraceMs:b=1e3,agentBinDir:c=(0,f.join)((0,e.getAgentDir)(),"bin"),baseEnvironment:d=process.env,localOperations:g=(0,e.createLocalBashOperations)({shellPath:a.shellPath}),platform:j=process.platform}=a;return{exec(a,e,f){var i;let k,l,m,n=(i=h(f.env??d,j),k="win32"===j?Object.keys(i).find(a=>"PATH"===a.toUpperCase())??"PATH":"PATH",l="win32"===j?";":":",(m=i[k]??"").split(l).filter(Boolean).includes(c)||(i[k]=[c,m].filter(Boolean).join(l)),i),{onData:o,signal:p,timeout:q}=f,r=!1,s=g.exec(a,e,{...f,env:n,onData:a=>{r||o(a)}}),t="number"==typeof q&&Number.isFinite(q)&&q>0?1e3*q:void 0;return p||void 0!==t?new Promise((a,c)=>{let d=[],e=()=>{for(let a of(r=!0,d))clearTimeout(a);p?.removeEventListener("abort",g)},f=(a,b)=>{d.push(setTimeout(()=>{e(),c(b)},Math.min(a,0x7fffffff)))},g=()=>f(b,Error("aborted"));void 0!==t&&f(t+b,Error(`timeout:${q}`)),s.then(b=>{e(),a(b)},a=>{e(),c(a)}),p?.aborted?g():p?.addEventListener("abort",g,{once:!0})}):s}}}function j(a){return{name:l,hidden:!0,factory:b=>{let c=(0,e.createBashToolDefinition)(a.cwd);b.registerTool({...c,defaultActive:!1,execute:(b,c,d,f,g)=>(0,e.createBashToolDefinition)(a.cwd,{commandPrefix:a.settings.getShellCommandPrefix(),operations:i({shellPath:a.settings.getShellPath()})}).execute(b,c,d,f,g)})}}}function k(a){let b=a.extensions.findIndex(a=>a.path===m);if(b<0)return a;let c=a.extensions.slice(0,b).find(a=>a.tools.has("bash"));return c?{...a,extensions:a.extensions.filter((a,c)=>c!==b),errors:a.errors.filter(a=>a.path!==m||a.error!==`Tool "bash" conflicts with ${c.path}`)}:a}d()}catch(a){d(a)}})},38015:(a,b,c)=>{"use strict";function d(a,b,c){let d=new Set,e=!1;for(let f of a.split(",")){let a,g;if(""===f)return null;let h=f.match(/^(.+?)(?:\/(\d+))?$/);if(!h)return null;let i=h[1],j=void 0!==h[2]?Number(h[2]):1;if(!Number.isInteger(j)||j<1)return null;if("*"===i)a=b,g=c,1===j&&(e=!0);else{let d=i.match(/^(\d+)(?:-(\d+))?$/);if(!d||(a=Number(d[1]),g=void 0!==d[2]?Number(d[2]):a,a<b||g>c||a>g))return null}for(let b=a;b<=g;b+=j)d.add(b)}return 0===d.size?null:{values:d,unrestricted:e}}function e(a){let b=a.trim().split(/\s+/);if(5!==b.length)return null;let c=d(b[0],0,59),e=d(b[1],0,23),f=d(b[2],1,31),g=d(b[3],1,12),h=d(b[4],0,6);return c&&e&&f&&g&&h?{minutes:c,hours:e,doms:f,months:g,dows:h}:null}c.d(b,{Lk:()=>n,ns:()=>m});let f=new Map,g=new Map,h={Sun:0,Mon:1,Tue:2,Wed:3,Thu:4,Fri:5,Sat:6};function i(a,b){let c,d=(!(c=f.get(a))&&(c=new Intl.DateTimeFormat("en-US",{timeZone:a,year:"numeric",month:"2-digit",day:"2-digit",weekday:"short"}),f.set(a,c)),c).formatToParts(new Date(b)),e=g.get(a);e||(e=new Intl.DateTimeFormat("en-US",{timeZone:a,hour:"2-digit",minute:"2-digit",hour12:!1}),g.set(a,e));let i=e.formatToParts(new Date(b)),j=(a,b)=>Number(a.find(a=>a.type===b)?.value??"0"),k=j(i,"hour");24===k&&(k=0);let l=h[d.find(a=>"weekday"===a.type)?.value??""];return void 0===l?null:{year:j(d,"year"),month:j(d,"month"),day:j(d,"day"),hour:k,minute:j(i,"minute"),dow:l}}function j(a){let b=a.month<=2?a.year-1:a.year,c=Math.floor(b/400),d=b-400*c,e=a.month;return(24*(146097*c+(365*d+Math.floor(d/4)-Math.floor(d/100)+(Math.floor((153*(e+(e>2?-3:9))+2)/5)+a.day-1))-719468)+a.hour)*60+a.minute}function k(a){let b=Math.floor(a/1440),c=a-1440*b,d=b+719468,e=Math.floor(d/146097),f=d-146097*e,g=Math.floor((f-Math.floor(f/1460)+Math.floor(f/36524)-Math.floor(f/146096))/365),h=g+400*e,i=f-(365*g+Math.floor(g/4)-Math.floor(g/100)),j=Math.floor((5*i+2)/153),k=i-Math.floor((153*j+2)/5)+1,l=j+(j<10?3:-9);return{year:l<=2?h+1:h,month:l,day:k,hour:Math.floor(c/60),minute:c%60,dow:(b%7+7+4)%7}}function l(a){try{return new Intl.DateTimeFormat("en-US",{timeZone:a}),!0}catch{return!1}}function m(a,b){if("at"===a.kind)return a.atMs>b?a.atMs:null;if("every"===a.kind)return!Number.isFinite(a.everyMs)||a.everyMs<=0?null:b-b%a.everyMs+a.everyMs;let c=e(a.expr);if(!c)return null;let d=a.tz&&""!==a.tz.trim()?a.tz:"UTC";if(!l(d))return null;let f=i(d,b);if(!f)return null;let g=j(f)+1,h=g+2108160;for(;g<=h;g++)if(function(a,b){if(!a.months.values.has(b.month))return!1;let c=!a.doms.unrestricted,d=!a.dows.unrestricted,e=a.doms.values.has(b.day),f=a.dows.values.has(b.dow);if(c&&d){if(!e&&!f)return!1}else if(c){if(!e)return!1}else if(d&&!f)return!1;return a.hours.values.has(b.hour)&&a.minutes.values.has(b.minute)}(c,k(g)))return function(a,b){let c=Date.UTC(b.year,b.month-1,b.day,b.hour,b.minute);for(let d=0;d<2;d++){let d=i(a,c);if(!d)break;let e=j(b)-j(d);if(0===e)break;c+=6e4*e}return c}(d,k(g));return null}function n(a){return"at"===a.kind?Number.isFinite(a.atMs)?null:"atMs must be a number":"every"===a.kind?!Number.isFinite(a.everyMs)||a.everyMs<6e4?"everyMs must be at least one minute":null:e(a.expr)?l(a.tz&&""!==a.tz.trim()?a.tz:"UTC")?null:"unknown timezone":"not a five-field cron expression"}},38222:(a,b,c)=>{"use strict";c.d(b,{b5:()=>k,dS:()=>i,vw:()=>j});var d=c(51149);let e="pi-web:tool-selection",f=new Set(d.C1),g=Symbol("cleared-tool-selection");function h(a){return"object"!=typeof a||null===a||Array.isArray(a)||1!==a.version?void 0:!0===a.cleared?g:!Array.isArray(a.tools)||a.tools.some(a=>"string"!=typeof a||!f.has(a))?void 0:[...new Set(a.tools)]}function i(a){for(let b=a.length-1;b>=0;b-=1){let c=a[b];if("custom"!==c.type||c.customType!==e)continue;let d=h(c.data);if(void 0!==d)return d===g?void 0:d}}function j(a){let b=h({version:1,tools:a});if(void 0===b||b===g)throw Error("toolNames must contain only built-in tool names");return b}function k(a,b){a.appendCustomEntry(e,{version:1,tools:[...b]})}},38598:(a,b,c)=>{"use strict";function d(a,b){if("string"!=typeof a||0===a.trim().length)throw Error(`Session liveness provider ${b} must be a non-empty string`)}c.d(b,{Vj:()=>f});let e=function(){let a,b=globalThis,c=Symbol.for("@agegr/pi-web/session-liveness/v1"),e=b[c];if(e&&"object"==typeof e&&1===e.version&&"function"==typeof e.register&&"function"==typeof e.hasActiveProvider)return e;let f=(a=new Map,{version:1,register(b){if(!b||"object"!=typeof b)throw Error("Session liveness provider must be an object");if(d(b.name,"name"),d(b.sessionId,"sessionId"),void 0!==b.sessionFile&&d(b.sessionFile,"sessionFile"),"function"!=typeof b.isActive)throw Error("Session liveness provider isActive must be a function");let c=Symbol(b.name);a.set(c,b);let e=!1;return()=>{e||(e=!0,a.delete(c))}},hasActiveProvider(b){let c=new Set([b.sessionId,b.sessionFile].filter(a=>!!a));for(let b of a.values())if(c.has(b.sessionId)||b.sessionFile&&c.has(b.sessionFile))try{let a=b.isActive();if("boolean"!=typeof a)throw Error("isActive() must return a boolean");if(a)return!0}catch(a){return console.error(`[pi-web] Session liveness provider '${b.name}' failed; preserving the session:`,a),!0}return!1}});return b[c]=f,f}();function f(a){return e.hasActiveProvider(a)}},40762:(a,b,c)=>{"use strict";c.d(b,{Ox:()=>i,QG:()=>j,Wv:()=>h,jN:()=>l,vH:()=>k});var d=c(29021),e=c(33873),f=c(89420),g=c(97136);let h=8,i=524288;function j(a){let b=a?.contextWindow;if(!a||!b||b<0)return{};let c=Math.floor(4*b/10);return c<i?{maxBytes:c,model:`${a.provider}/${a.id}`}:{}}function k(a,b,c={}){let j=c.maxBytes??i;if(b.length>h)throw Error(`Agent input_files accepts at most ${h} files`);let l=(0,d.realpathSync)(a),m=new Set([l]),n=new TextDecoder("utf-8",{fatal:!0}),o=new Set,p=[],q=0;for(let h of b){let b,i;if(!h.trim())throw Error("Agent input_files paths must not be empty");try{b=(0,d.realpathSync)((0,e.resolve)(a,h))}catch{throw Error(`Agent input file does not exist: ${h}`)}if(!(0,f.o4)(b,m))throw Error(`Agent input file is outside the session cwd: ${h}`);if(!(0,d.statSync)(b).isFile())throw Error(`Agent input path is not a file: ${h}`);if(o.has(b))continue;o.add(b);let k=(0,d.readFileSync)(b);if((q+=k.byteLength)>j){let a=c.model?` for ${c.model}, about a tenth of its context window`:"";throw Error(`Agent input_files exceeds the ${j<1024?`${j}-byte`:`${Math.floor(j/1024)} KB`} total limit${a}. Pass fewer or smaller files, or name the paths in prompt if the subagent can read them.`)}try{i=n.decode(k)}catch{throw Error(`Agent input file is not valid UTF-8 text: ${h}`)}p.push({path:(0,g.W3)((0,e.relative)(l,b)),content:i})}return p}function l(a,b){if(0===b.length)return a;let c=b.map(a=>`<document path=${JSON.stringify(a.path)}>
11
+ ${j}`:k;return void 0!==a.exactSystemPrompt&&(i=l),{systemPrompt:l}})}}]}:{}},setActiveToolsGetter(a){d=a},getExactSystemPrompt:void 0===a.exactSystemPrompt?void 0:()=>i}}[f,h]=i.then?(await i)():i,d()}catch(a){d(a)}})},10998:(a,b,c)=>{"use strict";function d(a){return("tool_execution_start"===a.type||"tool_execution_update"===a.type||"tool_execution_end"===a.type)&&"string"==typeof a.parentToolCallId&&""!==a.parentToolCallId}c.d(b,{uz:()=>d})},11124:(a,b,c)=>{"use strict";c.d(b,{DA:()=>L,Iq:()=>F,Q6:()=>d,Wy:()=>G,Yh:()=>B,oF:()=>K,yP:()=>A,yQ:()=>t});let d="•••",e=new Set(["key","apikey","token","secret","password","passwd","passphrase","pwd","pass","credential","credentials","authorization","bearer","jwt","cookie","signature","pat"]),f=new Set([...e,"auth","sig","code","pw"]),g=["token","secret","password","passwd","apikey"],h=new Set(["file","path","dir","url","uri","endpoint","id","name","type","header","env","var","length","ttl","expiry","expires","timeout","mode","format"]),i=new Set(["-k"]);function j(a){return a.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").toLowerCase().split(/[^a-z0-9]+/).filter(Boolean)}function k(a,b){let c=j(a);return!(c.length>1&&h.has(c[c.length-1]))&&c.some(a=>b.has(a)||g.some(b=>a.length>b.length&&a.endsWith(b)))}let l=RegExp("^(?:sk-[A-Za-z0-9_-]{16,}|(?:sk|pk|rk)_(?:live|test)_[A-Za-z0-9]{16,}|gh[pousr]_[A-Za-z0-9]{20,}|github_pat_[A-Za-z0-9_]{20,}|glpat-[A-Za-z0-9_-]{16,}|xox[abposr]-[A-Za-z0-9-]{10,}|(?:AKIA|ASIA)[0-9A-Z]{16}|AIza[0-9A-Za-z_-]{30,}|ya29\\.[0-9A-Za-z_-]{20,}|npm_[A-Za-z0-9]{30,}|hf_[A-Za-z0-9]{30,}|shp(?:at|ss|ca|pa)_[A-Fa-f0-9]{20,}|dop_v1_[a-f0-9]{40,}|lin_api_[A-Za-z0-9]{20,})"),m=/^eyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]*$/,n=/^[A-Za-z0-9_\-+/=.~]+$/;function o(a){return!(/\s/.test(a)||t(a))&&(!!(l.test(a)||m.test(a))||!(a.length<24||!n.test(a)||/^[./~]/.test(a)||/\.[A-Za-z][A-Za-z0-9]{0,4}$/.test(a)||a.split("/").length>2)&&!!/\d/.test(a)&&!!/[A-Za-z]/.test(a)&&(/[a-z]/.test(a)&&/[A-Z]/.test(a)||/^[0-9a-f]+$/i.test(a)||!/[-_.]/.test(a))&&function(a){let b=new Map;for(let c of a)b.set(c,(b.get(c)??0)+1);let c=0;for(let d of b.values()){let b=d/a.length;c-=b*Math.log2(b)}return c}(a)>=3.5)}let p=/\$\{[A-Za-z_][A-Za-z0-9_]*\}|\$[A-Za-z_][A-Za-z0-9_]*/,q=RegExp(p.source,"g"),r=/^(?:bearer|basic|token)\s+/i;function s(a,b,c){let d=a.replace(r,"");return b.test(d)&&/^[^A-Za-z0-9]*$/.test(d.replace(c,""))}function t(a){return s(a.replace(/\$[$!]/g,"_x"),p,q)}let u=/\$\{[A-Za-z_][A-Za-z0-9_]*\}|\$[A-Z_][A-Z0-9_]*(?![A-Za-z0-9_])/,v=RegExp(u.source,"g");function w(a){return s(a,u,v)}function x(a,b){if(!a||""===b)return;a.push(b);let c=C(b);c!==b&&a.push(c)}let y=/^([A-Za-z][A-Za-z0-9+.-]*:\/\/)([^/?#]*)/;function z(a,b,c){let e=!1,g=a,h="",i=y.exec(a);if(i){let[f,j,k]=i,l=k.lastIndexOf("@");if(l>=0&&!b(C(k.slice(0,l)))){h=`${j}${d}${k.slice(l)}`,e=!0;let a=k.slice(0,l);x(c,a);let b=a.indexOf(":");b>=0&&x(c,a.slice(b+1))}else h=f;g=a.slice(f.length)}let j=g.search(/[?#]/),l=j<0?g:g.slice(0,j),m=j<0?"":g.slice(j),n=l.split("/").map(a=>o(C(a))?(e=!0,x(c,a),d):a).join("/");return m=m.replace(/([?&#;])([^&#;]*)/g,(a,g,h)=>{let i=h.indexOf("=");if(i<0){let f=C(h);return!o(f)||b(f)?a:(e=!0,x(c,h),`${g}${d}`)}let j=h.slice(0,i),l=C(h.slice(i+1));return""===l||b(l)||!function(a){let b=a;try{b=decodeURIComponent(a)}catch{}return k(b,f)}(j)&&!o(l)?a:(e=!0,x(c,h.slice(i+1)),`${g}${j}=${d}`)}),{value:`${h}${n}${m}`,masked:e}}function A(a){return z(a,w)}function B(a){let b=[];return z(a,w,b),[...new Set(b)]}function C(a){try{return decodeURIComponent(a)}catch{return a}}let D=/^(\s*[A-Za-z][A-Za-z0-9 _.-]*=)([\s\S]*)$/;function E(a,b,c){let f=/^([A-Za-z0-9_-]+):(\s*)([\s\S]*)$/.exec(a);if(f&&""!==f[3]&&!f[3].startsWith("//")&&k(f[1],e)){let[,e,g,h]=f;return b(h)?{value:a,masked:!1}:(x(c,h.trim()),{value:`${e}:${g}${d}`,masked:!0})}let g=a.includes(";")?function(a,b,c){let f=a.split(";");if(f.length<2||!f.every(a=>""===a.trim()||D.test(a)))return;let g=!1;return{value:f.map(a=>{let f=D.exec(a);if(!f)return a;let[,h,i]=f;if(""===i.trim()||b(i))return a;if(k(h.slice(0,-1).trim(),e))return g=!0,x(c,i.trim()),`${h}${d}`;let j=E(i,b,c);return g||=j.masked,`${h}${j.value}`}).join(";"),masked:g}}(a,b,c):void 0;if(g)return g;let h=/^([A-Za-z_][A-Za-z0-9_]*)=([\s\S]*)$/.exec(a);if(h&&""!==h[2]&&k(h[1],e))return b(h[2])?{value:a,masked:!1}:(x(c,h[2]),{value:`${h[1]}=${d}`,masked:!0});if(/\s/.test(a)){var i,j,l;let d,e;return i=a,j=b,l=c,e=J((d=i.split(/(\s+)/)).filter((a,b)=>b%2==0),j,!0,l),{value:d.map((a,b)=>b%2==0?e.values[b/2]:a).join(""),masked:e.masked}}if(/^[A-Za-z][A-Za-z0-9+.-]*:\/\//.test(a))return z(a,b,c);if(h&&""!==h[2]){let a=E(h[2],b,c);return{value:`${h[1]}=${a.value}`,masked:a.masked}}return o(a)&&!b(a)?(x(c,a),{value:d,masked:!0}):{value:a,masked:!1}}function F(a){return E(a,w)}function G(a){let b=[];return E(a,w,b),[...new Set(b)]}function H(a){if(i.has(a))return!0;if(!/^--?[A-Za-z]/.test(a))return!1;let b=a.replace(/^-+/,"");return k(b,e)||"auth"===j(b).at(-1)}let I=/^(?:bearer|basic|token)$/i;function J(a,b,c,f){let g=!1,h=!1;return{values:a.map(a=>{if(""===a)return a;if(h){if(c&&I.test(a))return a;if(h=!1,!/^-[A-Za-z-]/.test(a))return b(a)?a:(g=!0,x(f,a),d)}let i=/^(--?[A-Za-z][A-Za-z0-9_.-]*)=([\s\S]*)$/.exec(a);if(i){let[,a,c]=i;if(""!==c&&H(a)&&!b(c))return g=!0,x(f,c),`${a}=${d}`;let e=E(c,b,f);return g||=e.masked,`${a}=${e.value}`}if(/^--?[A-Za-z][A-Za-z0-9_.-]*$/.test(a))return h=H(a),a;if(c){let b=/^([A-Za-z0-9_-]+):$/.exec(a);if(I.test(a)||b&&k(b[1],e))return h=!0,a}let j=E(a,b,f);return g||=j.masked,j.value}),masked:g}}function K(a){let{values:b,masked:c}=J(a,w,!1);return{args:b,masked:c}}function L(a){let b=[];return J(a,w,!1,b),[...new Set(b)]}},13856:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{IR:()=>k,py:()=>j});var e=c(75430),f=a([e]);e=(f.then?(await f)():f)[0];let l=new Set(["off","minimal","low","medium","high","xhigh","max"]);function g(a,b){return a.provider===b.provider&&a.id===b.modelId}function h(a){return a.includes("*")||a.includes("?")||a.includes("[")}function i(a,b){let c=a.toLowerCase(),d=b.filter(a=>`${a.provider}/${a.id}`.toLowerCase()===c);return d.length>0?d:b.filter(a=>a.id.toLowerCase()===c)}async function j(a,b){let c=(b??[]).map(a=>a.trim()).filter(Boolean);if(0===c.length)return{visible:await a.getAvailable(),scopedModels:[],thinkingLevelPins:{},warnings:[]};let d=await a.getAvailable();for(let a of c){if(h(a))continue;let b=i(a,d);if(0===b.length){let c=a.lastIndexOf(":"),e=c>=0?a.slice(c+1):"";l.has(e)&&(b=i(a.slice(0,c),d))}if(b.length>1){let c=b.map(a=>`${a.provider}/${a.id}`).sort().join(", ");throw Error(`Ambiguous enabledModels entry "${a}" matches multiple models: ${c}. Use provider/modelId.`)}}let{scopedModels:f,diagnostics:g}=await (0,e.resolveModelScopeWithDiagnostics)(c,{getAvailable:async()=>d}),j=g.filter(a=>"no-match"!==a.code||0===f.length||!function(a){if(!h(a))return!1;let b=a.lastIndexOf(":");return b<0||l.has(a.slice(b+1))}(a.pattern)).map(a=>a.message);if(0===f.length)return{visible:d,scopedModels:[],thinkingLevelPins:{},warnings:j};let k={};for(let a of f)a.thinkingLevel&&(k[`${a.model.provider}/${a.model.id}`]=a.thinkingLevel);return{visible:f.map(a=>a.model),scopedModels:f,thinkingLevelPins:k,warnings:j}}function k(a,b={}){let c=b.requestedModel,d=b.defaultModel,e=c?a.visible.find(a=>g(a,c)):void 0;if(c&&!e)throw Error(`Model is not available in the enabled scope: ${c.provider}/${c.modelId}`);let f=e?a.scopedModels.find(a=>a.model===e||g(a.model,{provider:e.provider,modelId:e.id})):void 0,h=!e&&d?a.scopedModels.find(a=>g(a.model,d)):void 0,i=e?void 0:h??a.scopedModels[0],j=e||i||!d?void 0:a.visible.find(a=>g(a,d)),l=e??i?.model??j,m=f??i,n=b.thinkingLevel??m?.thinkingLevel;return{...l?{model:l}:{},...n?{thinkingLevel:n}:{},scopedModels:[...a.scopedModels]}}d()}catch(a){d(a)}})},13956:(a,b,c)=>{"use strict";c.d(b,{Ai:()=>g,Ll:()=>e,pM:()=>d,zT:()=>f});let d="builtin:mcp";function e(a){return"mcp"===a.name&&a.sourceInfo?.path===d}function f(a){return"prompt"!==a.source&&("mcp"===a.name||/^mcp:\d+$/.test(a.name))}function g(a,b){if(!a.startsWith("/"))return"wait";let c=a.indexOf(" "),d=-1===c?a.slice(1):a.slice(1,c),f=b.find(a=>a.name===d);return f?e(f)?"register":"none":"wait"}},14968:(a,b,c)=>{"use strict";c.d(b,{FV:()=>m,GE:()=>l,M3:()=>j,PE:()=>o,RC:()=>k,XQ:()=>i,_z:()=>h,ak:()=>d,jp:()=>f,t3:()=>g,xX:()=>n});class d extends Error{constructor(a,b,c){super(a),this.description=b,this.statusCode=c,this.name="TelegramApiError"}}async function e(a,b,c,f=2e4){let g;try{g=await fetch(`https://api.telegram.org/bot${a}/${b}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c??{}),signal:AbortSignal.timeout(f),cache:"no-store"})}catch(a){throw new d(`Telegram ${b} failed: ${a instanceof Error?a.message:String(a)}`,null,null)}let h={};try{h=await g.json()}catch{}if(!g.ok||!1===h.ok)throw new d(`Telegram ${b} failed: ${h.description??`HTTP ${g.status}`}`,h.description??null,g.status);return h.result}async function f(a){return e(a,"getMe")}async function g(a,b,c){return e(a,"getUpdates",{offset:b,timeout:c,allowed_updates:["message","edited_message","callback_query"]},1e3*c+15e3)}async function h(a,b,c,d={}){return e(a,"sendMessage",{chat_id:b,text:c,...d.parseMode?{parse_mode:d.parseMode}:{},...void 0!==d.replyToMessageId?{reply_to_message_id:d.replyToMessageId}:{},...void 0!==d.replyMarkup?{reply_markup:d.replyMarkup}:{},link_preview_options:{is_disabled:!0}})}async function i(a,b,c,d,f={}){await e(a,"editMessageText",{chat_id:b,message_id:c,...void 0!==f.richMarkdown?{rich_message:{markdown:f.richMarkdown}}:{text:d,...f.parseMode?{parse_mode:f.parseMode}:{},link_preview_options:{is_disabled:!0}}})}async function j(a,b,c){return e(a,"sendRichMessage",{chat_id:b,rich_message:{markdown:c}})}async function k(a,b,c){await e(a,"deleteMessage",{chat_id:b,message_id:c})}async function l(a,b,c){await e(a,"answerCallbackQuery",{callback_query_id:b,...c?{text:c}:{}})}async function m(a,b,c="typing"){await e(a,"sendChatAction",{chat_id:b,action:c})}async function n(a,b){await e(a,"setMyCommands",{commands:b})}async function o(a,b){let c=await e(a,"getFile",{file_id:b});if(!c.file_path)throw new d("Telegram returned no file_path",null,null);if((c.file_size??0)>0x1400000)throw new d("The file is over 20 MB","too large",null);let f=await fetch(`https://api.telegram.org/file/bot${a}/${c.file_path}`,{signal:AbortSignal.timeout(6e4),cache:"no-store"});if(!f.ok)throw new d(`Downloading the file failed: HTTP ${f.status}`,null,f.status);let g=f.headers.get("content-type");return{bytes:Buffer.from(await f.arrayBuffer()),mimeType:g}}},16794:(a,b,c)=>{a.exports=c(35859)},19050:(a,b,c)=>{"use strict";c.d(b,{d:()=>e});let d=/^<skill name="([^"\n]+)" location="([^"\n]+)">\nReferences are relative to [^\n]+\.\n\n([\s\S]*)\n<\/skill>(?:\n\n([\s\S]+))?$/;function e(a){let b=a.match(d);if(!b)return null;let[,c,,,e]=b;return e?`/skill:${c} ${e}`:`/skill:${c}`}},19298:(a,b,c)=>{"use strict";c.d(b,{y:()=>f});let d=/^Unexpected token '([\s\S])', ([\s\S]*) is not valid JSON$/,e=/is not valid JSON$/;function f(a,b){let c=b.map(a=>`${a}: `).find(b=>a.startsWith(b))??"",f=a.slice(c.length);return e.test(f)?`${c}${function(a){let b,c,e,f=a instanceof Error?a.message:String(a);if(!f.includes('"'))return f;let g=d.exec(f);if(!g)return"Not valid JSON";let[,h,i]=g,j=h.charCodeAt(0),k=/[\p{L}\p{N}]/u.test(h)?"":/[\p{P}\p{S}]/u.test(h)?` '${h}'`:` U+${j.toString(16).toUpperCase().padStart(4,"0")}`,l=function(a,b){let c,d=b.startsWith('..."'),e=b.endsWith('"...'),f=b.slice(3*!!d,e?-3:void 0);if(f.length<2||!f.startsWith('"')||!f.endsWith('"')||!d&&!e)return;let g=f.slice(1,-1);if(d)if(e){for(c="".indexOf(g);c>=0&&""[c+10]!==a;)c="".indexOf(g,c+1);if(c<0)return;c+=10}else{if(!"".endsWith(g))return;c=0-g.length+10}else{if(!"".startsWith(g))return;c=g.length-10}return""[c]===a?c:void 0}(h,i);return`Unexpected token${k} in JSON${void 0===l?"":` ${c=(b="".slice(0,l)).split("\n").length,e=l-b.lastIndexOf("\n"),`at position ${l} (line ${c} column ${e})`}`}`}(f)}`:a}},19371:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{A4:()=>R,OF:()=>S});var e=c(75430),f=c(29862),g=c(55511),h=c(29021),i=c(33873),j=c(28354),k=c(2021),l=c(58655),m=c(52552),n=c(13856),o=c(96452),p=c(29188),q=c(36561),r=c(57432),s=c(58415),t=c(35234),u=c(42267),v=c(38598),w=c(36205),x=c(63709),y=c(98012),z=c(66192),A=c(3814),B=c(3961),C=c(93391),D=c(2249),E=c(85844),F=c(57616),G=c(13956),H=c(30507),I=c(7976),J=c(10998),K=c(4302),L=c(38222),M=a([e,f,m,n,o,q,r,t,u,x,y,z,A,B,C,F,H,I,K]);function N(a,b){return Error(`${a}/${b} is provided by an extension, and Chat only loads no extensions. Choose another model or tool preset.`)}[e,f,m,n,o,q,r,t,u,x,y,z,A,B,C,F,H,I,K]=M.then?(await M)():M;let T=new Set(["agent_end","agent_settled","auto_compaction_end","compaction_end"]),U=function(a=process.env.PI_WEB_IDLE_TIMEOUT_MS){if(void 0!==a&&""!==a.trim()){let b=Number(a);if(Number.isFinite(b)&&b>=0&&b<=0x7fffffff)return b;console.warn(`[pi-web] invalid PI_WEB_IDLE_TIMEOUT_MS "${a}", falling back to 10 minutes`)}return 6e5}(),V=function(a=process.env.PI_WEB_SHUTDOWN_DEADLINE_MS){if(void 0!==a&&""!==a.trim()){let b=Number(a);if(Number.isFinite(b)&&b>0&&b<=0x7fffffff)return b;console.warn(`[pi-web] invalid PI_WEB_SHUTDOWN_DEADLINE_MS "${a}", falling back to 5 seconds`)}return 5e3}(),W=new Set(["fork","clone"]),X="This session has not been saved yet. Send a message before forking it.",Y=new Set(["get_state","get_session_stats","get_last_assistant_text","get_tools","get_commands","extension_ui_response","extension_ui_input"]),Z=["read","bash","powershell","edit","write","grep","find","ls"],$="medium";class _ extends e.Theme{constructor(){super({muted:"",text:"",thinkingXhigh:"",searchMatchText:""},{selectedBg:""},"truecolor")}fg(...[,a]){return a}bg(...[,a]){return a}bold(a){return a}italic(a){return a}underline(a){return a}inverse(a){return a}strikethrough(a){return a}getFgAnsi(){return""}getBgAnsi(){return""}getThinkingBorderColor(){return a=>a}getBashModeBorderColor(){return a=>a}}let aa=new _,ab=new f.KeybindingsManager(f.TUI_KEYBINDINGS),ac=new Set(["codemode","tool_search",...z.st]);function O(a,b,c){if(0===b.length)return[];let d=new Set(Z),e=new Map(a.getAllTools().map(a=>[a.name,a])),f=(0,C.wQ)(b.filter(a=>d.has(a)),a.settingsManager.getDefaultTools()),g=c.filter(a=>{let b=e.get(a);return void 0!==b&&!d.has(a)&&"hidden"!==b.exposure});return[...new Set([...f,...g])]}class ad{constructor(a,b={}){this.inner=a,this.listeners=new Set,this.activeToolEvents=new Map,this.pendingUiResponses=new Map,this.pendingUiRequests=new Map,this.activeCustomUis=new Map,this.extensionUiAbortController=new AbortController,this.extensionStatuses=new Map,this.extensionWidgets=new Map,this.activeExtensionWidgets=new Map,this.extensionWidgetGenerations=new Map,this.extensionWidgetsResetting=!1,this.pendingPromptCount=0,this.activeMutatingCommands=0,this.sessionReplacement=null,this.agentRunNeedsCompletion=!1,this.lastRunAborted=!1,this.promptAdmissionTail=Promise.resolve(),this.extensionsBound=!1,this.extensionBindingPromise=null,this.extensionBindingError=null,this.mcpHostDisposed=!1,this.mcpPromptWait=null,this.unsubscribe=null,this.idleTimer=null,this.onDestroyCallback=null,this.shutdownPromise=null,this.sessionShutdownEmitted=!1,this.forceShutdownOnIdle=!1,this.forcedIdleTimerArmed=!1,this._alive=!0,this.resolveDisposed=()=>{},this.disposed=new Promise(a=>{this.resolveDisposed=a}),this.closing=!1,this.exactSystemPrompt=b.exactSystemPrompt,this.chatOnly=b.chatOnly??!1,this.onAgentRunComplete=b.onAgentRunComplete,this.suppressCompletionNotifications=b.suppressCompletionNotifications??!1,this.mcpHost=b.mcpHost,this.chatOnlyExtensionModel=b.chatOnlyExtensionModel}get sessionId(){return this.inner.sessionId}get sessionFile(){return this.inner.sessionFile??""}get cwd(){return this.inner.sessionManager.getCwd()}get streamingMessage(){return this.inner.agent.state?.streamingMessage}get isStreaming(){return this.inner.isStreaming}isAlive(){return this._alive&&!this.closing}isRunning(){return this._alive&&(this.pendingPromptCount>0||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning)}isAwaitingInput(){if(!this.isRunning())return!1;for(let a of this.pendingUiRequests.values())if((0,p.YI)(a))return!0;return!1}evictIfDiskAhead(){if(!this.isAlive()||this.isRunning())return!1;let a=(0,r.H6)(this.sessionFile);return!(!a||this.inner.sessionManager.getEntry(a)||this.isRunning())&&(this.destroy(),(0,r.mD)(),!0)}isChatOnly(){return this.chatOnly}hasSuppressedCompletionNotifications(){return this.suppressCompletionNotifications}start(){this.unsubscribe=this.inner.subscribe(a=>{"agent_start"===a.type&&(this.agentRunNeedsCompletion=!0,this.lastRunAborted=!1),"agent_settled"===a.type&&(this.lastRunAborted=!0===a.aborted),"agent_end"===a.type&&((0,r.mD)(),this.activeToolEvents.clear()),"session_info_changed"===a.type&&(0,r.mD)(),this.trackActiveToolEvent(a),T.has(a.type)&&this.resetIdleTimer(),this.emit("message_end"===a.type?this.withTranscriptNotices(a):a),"agent_settled"===a.type&&this.notifyAgentRunCompleteIfIdle()}),this.resetIdleTimer()}withTranscriptNotices(a){let b=a.message;if(0===this.listeners.size||b?.role!=="assistant")return a;try{let c=this.inner.sessionManager;if(!(0,K.Vv)(c.getCwd()))return a;let d=c.getEntries(),e=(0,K.Aw)(d,c.getBranch(),b,(0,K.xu)(d,this.inner.modelRuntime));return e.length>0?{...a,transcriptNotices:e}:a}catch(b){return console.warn("[pi-web] transcript notices failed:",b instanceof Error?b.message:b),a}}trackActiveToolEvent(a){let b=a.toolCallId;if(!("string"!=typeof b||(0,J.uz)(a))){if("tool_execution_start"===a.type||"tool_execution_update"===a.type)this.activeToolEvents.set(b,a);else if("tool_execution_end"===a.type){this.activeToolEvents.delete(b);let a=`${b}/`;for(let b of this.activeToolEvents.keys())b.startsWith(a)&&this.activeToolEvents.delete(b)}}}notifyAgentRunCompleteIfIdle(){if(!(!this.agentRunNeedsCompletion||this.isRunning())&&(this.agentRunNeedsCompletion=!1,!this.suppressCompletionNotifications&&!this.lastRunAborted))try{this.onAgentRunComplete?.(this.sessionId,this.inner.sessionManager.getSessionName())}catch(a){console.error("[pi-web] completion listener failed:",a instanceof Error?a.message:a)}}promptDoneEvent(){return{type:"prompt_done",...this.lastRunAborted?{aborted:!0}:{}}}beginExtensionBinding(){this.ensureExtensionsBound().catch(a=>{console.error("[pi-web] failed to dispatch session_start to extensions:",a instanceof Error?a.message:a)})}async waitUntilReady(){await this.waitForExtensionsBound()}async prepareMcpForRun(a){let b=this.mcpHost;if(!b||this.inner.isStreaming)return!a.aborted;let c=new AbortController,d=()=>c.abort();a.aborted&&d(),a.addEventListener("abort",d,{once:!0});let e=(async()=>{await this.waitForExtensionsBound(),c.signal.aborted||await b.prepareForPrompt(c.signal)})().catch(a=>{console.error("[pi-web] MCP servers could not be prepared:",a instanceof Error?a.message:a)}),f={controller:c,done:e};this.mcpPromptWait=f;try{await e}finally{a.removeEventListener("abort",d),this.mcpPromptWait===f&&(this.mcpPromptWait=null)}return!c.signal.aborted}ensureExtensionsBound(){return this.extensionsBound?Promise.resolve():(this.extensionBindingPromise||(this.extensionBindingError=null,this.extensionBindingPromise=(async()=>{if(!this._alive)return;let a=this.createExtensionUiContext();if("function"==typeof this.inner.bindExtensions){let b=this.inner.bindExtensions;await b.call(this.inner,{uiContext:a,mode:"rpc",commandContextActions:this.createExtensionCommandContextActions(),shutdownHandler:()=>this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"notify",notifyType:"warning",message:"Extension requested shutdown, but shutdown is not supported in Pi Web."}),onError:a=>this.emit({type:"extension_error",extensionPath:a.extensionPath,event:a.event,error:a.error})})}else this.inner.extensionRunner.setUIContext?.(a,"rpc");this.extensionsBound=!0,console.log(`[pi-web] session_start dispatched to extensions for session ${this.inner.sessionId}`)})().catch(a=>{throw this.extensionBindingError=a,a})),this.extensionBindingPromise)}async waitForExtensionsBound(){try{this.extensionBindingPromise&&await this.extensionBindingPromise}catch(a){throw a instanceof Error?a:Error(String(a))}if(this.extensionBindingError)throw this.extensionBindingError instanceof Error?this.extensionBindingError:Error(String(this.extensionBindingError))}extensionCommandCandidates(){try{return this.inner.extensionRunner.getRegisteredCommands().map(a=>({name:a.invocationName,sourceInfo:a.sourceInfo}))}catch{return[]}}shouldWaitForExtensions(a){return"prompt"===a||"steer"===a||"follow_up"===a||"get_commands"===a||"get_state"===a}async withFinalIdleReset(a){try{return await a()}finally{this.resetIdleTimer()}}setActiveToolSelection(a,b=this.inner.getActiveToolNames()){this.inner.setActiveToolsByName(O(this.inner,a,b))}async navigateTreeKeepingToolSelection(a,b){let c=this.inner.getActiveToolNames(),d=await this.inner.navigateTree(a,b);if(d.cancelled||this.chatOnly)return{cancelled:d.cancelled};let e=this.inner.sessionManager.getEntries();if(!(0,z.ph)(e)){let a=this.inner.getActiveToolNames();this.setActiveToolSelection((0,L.dS)(e)??a,[...a,...c.filter(a=>ac.has(a))])}return{cancelled:!1}}emit(a){for(let b of this.listeners)try{b(a)}catch(b){console.error(`[pi-web] failed to deliver ${a.type} event:`,b instanceof Error?b.message:b)}}async acquirePromptAdmission(){let a,b=this.promptAdmissionTail;return this.promptAdmissionTail=new Promise(b=>{a=b}),await b,a}resetIdleTimer(){if(!this._alive){this.idleTimer&&clearTimeout(this.idleTimer);return}if(this.isRunning()||(this.forceShutdownOnIdle=!1),this.forceShutdownOnIdle&&this.forcedIdleTimerArmed)return;this.idleTimer&&clearTimeout(this.idleTimer);let a=U||6e5*!!this.forceShutdownOnIdle;this.forcedIdleTimerArmed=0!==a&&this.forceShutdownOnIdle,0!==a&&(this.idleTimer=setTimeout(()=>{!this.forceShutdownOnIdle&&(this.isRunning()||(0,v.Vj)({sessionId:this.sessionId,sessionFile:this.sessionFile||void 0}))?this.resetIdleTimer():this.shutdown().catch(a=>{console.error("[pi-web] failed to shut down idle session:",a instanceof Error?a.message:a)})},a))}persistBashOnlySession(){let a=this.inner.sessionManager,b=a.getSessionFile();if(!b||(0,h.existsSync)(b))return;let c=a.getHeader();if(!c)return;let d=[c,...a.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";(0,h.writeFileSync)(b,d,{encoding:"utf8",flag:"wx"}),a.flushed=!0,(0,r.O8)(this.inner.sessionId,b)}onEvent(a){for(let b of(this.listeners.add(a),this.pendingUiRequests.values()))a(b);for(let b of this.activeToolEvents.values())a(b);return()=>{this.listeners.delete(a)}}onDestroy(a){this.onDestroyCallback=a}waitUntilDisposed(a){let b,c=new Promise(c=>{b=setTimeout(()=>c(!1),a),b.unref?.()});return Promise.race([this.disposed.then(()=>!0),c]).finally(()=>clearTimeout(b))}async withSessionReplacement(a,b){if(this.sessionReplacement)throw Error("Session is already being copied");this.sessionReplacement=a;try{return await b()}finally{this._alive&&(this.sessionReplacement=null)}}isSessionRunningForReplacement(){return this.inner.isBashRunning||this.inner.isStreaming||this.inner.isCompacting||this.pendingPromptCount>0}async shutdownAfterSessionReplacement(a){try{await this.shutdown()}catch(b){console.error(`[pi-web] ${a} succeeded, but source session shutdown failed:`,b instanceof Error?b.message:b)}}async send(a){let b=a.type,c=Y.has(b);if(this.sessionReplacement&&!c)throw Error("Session is being copied to a new session");if(W.has(b)&&this.activeMutatingCommands>0)throw Error(`Cannot ${b} while another session command is running`);let d=!c;d&&(this.activeMutatingCommands+=1);try{if("get_state"!==b&&this.resetIdleTimer(),this.shouldWaitForExtensions(b)&&await this.waitForExtensionsBound(),this.sessionReplacement&&!c)throw Error("Session is being copied to a new session");if("prompt"===b||"steer"===b||"follow_up"===b){let b=(0,k.kc)(a.images);if(b)throw Error(b)}if("prompt"===b&&!(0,h.existsSync)(this.cwd))throw Error(`Directory does not exist: ${this.cwd}`);switch(b){case"prompt":{let b=await this.acquirePromptAdmission();try{let b,c,d;if(this.inner.isBashRunning)throw Error("Cannot send a prompt while a shell command is running");let e=this.inner.model;if(this.chatOnlyExtensionModel&&!(e&&this.inner.modelRuntime.getModel(e.provider,e.id)))throw N(this.chatOnlyExtensionModel.provider,this.chatOnlyExtensionModel.id);this.extensionUiAbortController.signal.aborted&&(this.extensionUiAbortController=new AbortController);let f=a.images,g=a.streamingBehavior,h=!1,i=!1,j=!1,k=new Promise((a,d)=>{b=()=>{h=!0,this.agentRunNeedsCompletion=!0,i||(i=!0,g||(this.lastRunAborted=!1),a())},c=a=>{i||(i=!0,d(a))}}),l=()=>{j||(j=!0,this.pendingPromptCount=Math.max(0,this.pendingPromptCount-1),this.resetIdleTimer(),this.notifyAgentRunCompleteIfIdle())};this.pendingPromptCount+=1;let m=this.mcpHost&&!this.inner.isStreaming?(0,G.Ai)("string"==typeof a.message?a.message:"",this.extensionCommandCandidates()):"none";if(this.mcpHost&&"none"!==m){let a=new AbortController,b=this.mcpHost.prepareForPrompt(a.signal,{wait:"wait"===m}).catch(a=>{console.error("[pi-web] MCP servers could not be prepared:",a instanceof Error?a.message:a)}).then(()=>{if(a.signal.aborted)throw l(),Error("Stopped while MCP servers were connecting; the message was not sent.")}),c={controller:a,done:b.then(()=>void 0,()=>void 0)};this.mcpPromptWait=c;try{await b}finally{this.mcpPromptWait===c&&(this.mcpPromptWait=null)}}try{d=this.inner.prompt(a.message,{...f?.length?{images:f}:{},...g?{streamingBehavior:g}:{},source:"rpc",preflightResult:()=>b()})}catch(a){throw l(),a}return d.then(()=>{b(),l(),g||this.emit(this.promptDoneEvent())},a=>{c(a),l(),(0,r.mD)(),h&&(this.emit({type:"prompt_error",errorMessage:a instanceof Error?a.message:String(a)}),g||this.emit(this.promptDoneEvent()))}).catch(a=>{console.error("[pi-web] prompt completion handler failed:",a instanceof Error?a.message:a)}),await k,null}finally{b()}}case"abort":if(this.forceShutdownOnIdle=!0,this.resetIdleTimer(),this.extensionUiAbortController.abort(new DOMException("Extension UI cancelled by Stop","AbortError")),this.mcpPromptWait){let a=this.mcpPromptWait;a.controller.abort(),await a.done}try{return await this.withFinalIdleReset(()=>this.inner.abort()),null}finally{this.isRunning()||(this.forceShutdownOnIdle=!1)}case"get_state":{let a=this.inner.model,b=this.inner.getContextUsage();return{sessionId:this.inner.sessionId,sessionFile:this.inner.sessionFile??"",isStreaming:this.inner.isStreaming,isPromptRunning:this.pendingPromptCount>0,isBashRunning:this.inner.isBashRunning,isCompacting:this.inner.isCompacting,autoCompactionEnabled:this.inner.autoCompactionEnabled,autoRetryEnabled:this.inner.autoRetryEnabled,model:a?{id:a.id,provider:a.provider}:void 0,messageCount:0,pendingMessageCount:this.inner.pendingMessageCount,queuedMessages:{steering:[...this.inner.getSteeringMessages()],followUp:[...this.inner.getFollowUpMessages()]},contextUsage:b?{percent:b.percent,contextWindow:b.contextWindow,tokens:b.tokens}:null,totalActiveMs:(0,s.Q)(this.inner.sessionManager),systemPrompt:this.exactSystemPrompt?.()??(this.inner.agent.state?.systemPrompt||this.inner.systemPrompt||""),thinkingLevel:this.inner.agent.state?.thinkingLevel??"off",extensionStatuses:this.getExtensionStatuses(),extensionWidgets:this.getExtensionWidgets()}}case"set_model":{let{provider:b,modelId:c}=a;await this.inner.modelRuntime.refresh({allowNetwork:!1,providers:[b],signal:AbortSignal.timeout(15e3)}).catch(()=>void 0);let d=this.inner.modelRuntime.getModel(b,c);if(!d)throw this.chatOnly&&(0,o.S9)(this.inner.modelRuntime,b,c)?N(b,c):Error(`Model not found: ${b}/${c}`);let e=this.inner.model;if((0,j.isDeepStrictEqual)(e,d))return{id:d.id,provider:d.provider};let f=e?.provider===d.provider&&e.id===d.id,g=this.inner.agent.state?.thinkingLevel;return await this.inner.setModel(d),f&&g&&this.inner.setThinkingLevel(g),(0,l.kn)(),(0,r.mD)(),{id:d.id,provider:d.provider}}case"fork":{if(this.inner.isBashRunning)throw Error("Cannot fork while a shell command is running");let b=this.isSessionRunningForReplacement();return this.withSessionReplacement("fork",async()=>{let c,d,f=a.entryId,g=this.inner.sessionManager,i=this.inner.sessionFile;if(!g.isPersisted())return{cancelled:!0};if(!i)throw Error("Persisted session is missing a session file");let j=g.getEntry(f);if(!j)throw Error("Invalid entry ID for forking");let k=g.getSessionDir();if(j.parentId){if(!(0,h.existsSync)(i))throw Error(X);let a=(d=e.SessionManager.open(i,k)).createBranchedSession(j.parentId);if(!a)throw Error("Failed to create forked session");c=a}else c=(d=e.SessionManager.create(g.getCwd(),k,{parentSession:i})).getSessionFile();if(!(0,h.existsSync)(c)){let a=d.getHeader();if(!a)throw Error("Forked session is missing a session header");let b=[a,...d.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";(0,h.writeFileSync)(c,b,{encoding:"utf8",flag:"wx"})}let l=d.getSessionId();return(0,r.O8)(l,c),(0,r.mD)(),b||await this.shutdownAfterSessionReplacement("fork"),{cancelled:!1,newSessionId:l}})}case"fork_branch":{if(this.inner.isBashRunning)throw Error("Cannot fork while a shell command is running");let b=a.entryId,c=this.inner.sessionManager,d=this.inner.sessionFile;if(!c.isPersisted())return{cancelled:!0};if(!d)throw Error("Persisted session is missing a session file");if(!c.getEntry(b))throw Error("Invalid entry ID for forking");if(!(0,h.existsSync)(d))throw Error(X);let f=c.getSessionDir(),g=e.SessionManager.open(d,f).createBranchedSession(b);if(!g)throw Error("Failed to create forked session");let i=e.SessionManager.open(g,f).getSessionId();return(0,r.O8)(i,g),(0,r.mD)(),{cancelled:!1,newSessionId:i}}case"clone":{if(this.isSessionRunningForReplacement())throw Error("Cannot clone while the session is running");let b=this.inner.sessionManager,c=this.inner.sessionFile,d="string"==typeof a.leafId?a.leafId:b.getLeafId(),f=d&&b.getBranch(d).some(a=>"message"===a.type&&"assistant"===a.message.role);if(!b.isPersisted()||!d||!f||!c||!(0,h.existsSync)(c))return{cancelled:!0};return this.withSessionReplacement("clone",async()=>{let a=b.getSessionDir(),f=e.SessionManager.open(c,a).createBranchedSession(d);if(!f||!(0,h.existsSync)(f))throw Error("Failed to clone current session branch");let g=e.SessionManager.open(f,a).getSessionId();return(0,r.O8)(g,f),(0,r.mD)(),await this.shutdownAfterSessionReplacement("clone"),{cancelled:!1,newSessionId:g}})}case"navigate_tree":if(this.inner.isBashRunning)throw Error("Cannot navigate while a shell command is running");return this.navigateTreeKeepingToolSelection(a.targetId,{});case"set_thinking_level":{let b=a.level;return this.inner.setThinkingLevel(b),"xhigh"===b&&this.inner.model?.compat?.thinkingFormat==="deepseek"&&this.inner.agent?.state&&(this.inner.agent.state.thinkingLevel="xhigh"),(0,r.mD)(),null}case"compact":try{return await this.withFinalIdleReset(()=>this.inner.compact(a.customInstructions))}finally{(0,r.mD)()}case"set_session_name":{let b=a.name?.trim();if(!b)throw Error("Session name cannot be empty");return this.inner.setSessionName(b),(0,r.mD)(),null}case"get_session_stats":return{...this.inner.getSessionStats(),sessionName:this.inner.sessionManager.getSessionName()};case"get_last_assistant_text":return{text:this.inner.getLastAssistantText()??""};case"set_auto_compaction":return this.inner.setAutoCompactionEnabled(a.enabled),null;case"clear_queue":return this.inner.clearQueue();case"steer":{let b=a.images;return await this.inner.steer(a.message,b?.length?b:void 0),null}case"follow_up":{let b=a.images;return await this.inner.followUp(a.message,b?.length?b:void 0),null}case"get_tools":{let a=this.inner.getAllTools().filter(a=>"hidden"!==a.exposure),b=new Set(this.inner.getActiveToolNames()),c=new Map((this.inner.agent.state?.tools??[]).map(a=>[a.name,a.description])),d=Reflect.get(this.inner,"_hiddenDeclarations"),e=d instanceof Set?d:new Set;return a.map(a=>({...a,description:c.get(a.name)??a.description,active:b.has(a.name),declarationHidden:e.has(a.name)}))}case"get_commands":{let a=[];for(let b of this.inner.extensionRunner.getRegisteredCommands())a.push({name:b.invocationName,description:b.description,source:"extension",sourceInfo:b.sourceInfo});for(let b of this.inner.promptTemplates)a.push({name:b.name,description:b.description,source:"prompt",sourceInfo:b.sourceInfo});for(let b of this.inner.resourceLoader.getSkills().skills)a.push({name:`skill:${b.name}`,description:b.description,source:"skill",sourceInfo:b.sourceInfo});return{commands:a}}case"set_tools":{let b=a.toolNames;return this.setActiveToolSelection(b),null}case"reload":{if(this.isSessionRunningForReplacement())throw Error("Wait for the current response to finish before reloading.");this.extensionUiAbortController.signal.aborted&&(this.extensionUiAbortController=new AbortController);let a=this.inner.getActiveToolNames();return await this.waitForExtensionsBound(),this.extensionStatuses.clear(),this.resetExtensionWidgetsForReload(),this.syncProjectTrust(),await this.inner.reload(),this.setActiveToolSelection(a),"function"!=typeof this.inner.bindExtensions&&this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc"),(0,l.kn)(),(0,m.nx)(),{success:!0}}case"abort_compaction":return this.inner.abortCompaction(),null;case"extension_ui_response":return this.resolveExtensionUiResponse(a),null;case"extension_ui_input":return this.handleExtensionUiInput(a.id,a.data),null;case"set_auto_retry":return this.inner.setAutoRetryEnabled(a.enabled),null;case"bash":{if(this.pendingPromptCount>0||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning)throw Error("Cannot run a shell command while the session is busy");let b=this.inner.executeBash(a.command,void 0,{excludeFromContext:a.excludeFromContext,operations:(0,q.J1)({shellPath:this.inner.settingsManager.getShellPath()})});try{let a=await b;return this.persistBashOnlySession(),a}finally{this.resetIdleTimer(),(0,r.mD)()}}case"abort_bash":return this.forceShutdownOnIdle=!0,this.resetIdleTimer(),this.inner.abortBash(),null;default:throw Error(`Unsupported command: ${b}`)}}finally{d&&(this.activeMutatingCommands=Math.max(0,this.activeMutatingCommands-1))}}disposeMcpHost(){if(!this.mcpHostDisposed){this.mcpHostDisposed=!0;try{this.mcpHost?.dispose()}catch(a){console.error("[pi-web] MCP host dispose failed:",a instanceof Error?a.message:a)}}}destroy(){if(!this._alive)return;for(let a of(this._alive=!1,this.disposeMcpHost(),this.emit({type:"session_shutdown"}),this.idleTimer&&clearTimeout(this.idleTimer),this.inner.isBashRunning&&this.inner.abortBash(),this.unsubscribe?.(),this.pendingUiResponses.values()))a.cancel();for(let a of Array.from(this.activeCustomUis.keys()))this.closeCustomUi(a,void 0);this.pendingUiResponses.clear(),this.pendingUiRequests.clear(),this.activeToolEvents.clear(),this.clearExtensionWidgets(!1);let a=()=>{try{this.inner.dispose()}finally{this.onDestroyCallback?.(),this.resolveDisposed()}};if(this.sessionShutdownEmitted)return void a();this.sessionShutdownEmitted=!0;let b=this.inner.extensionRunner?.emit;"function"!=typeof b?a():this.emitSessionShutdown(b).catch(a=>{console.error("[pi-web] session_shutdown before dispose failed:",a instanceof Error?a.message:a)}).finally(a)}async shutdown(){return this.shutdownPromise?this.shutdownPromise:this._alive?(this.closing=!0,this.shutdownPromise=(async()=>{try{try{await this.waitForExtensionsBound()}catch(a){console.error("[pi-web] extension binding failed before session shutdown:",a instanceof Error?a.message:a)}if(this.disposeMcpHost(),!this.sessionShutdownEmitted){this.sessionShutdownEmitted=!0;let a=this.inner.extensionRunner?.emit;"function"==typeof a&&await this.emitSessionShutdown(a)}}finally{this.destroy()}})(),this.shutdownPromise):void 0}async emitSessionShutdown(a){let b,c=new Promise(a=>{b=setTimeout(()=>a("timeout"),V),b.unref?.()}),d=(async()=>(await a.call(this.inner.extensionRunner,{type:"session_shutdown",reason:"quit"}),"handled"))();try{await Promise.race([d,c])==="timeout"&&console.warn(`[pi-web] extensions did not finish session_shutdown for session ${this.sessionId} within ${V} ms; disposing it anyway`)}finally{clearTimeout(b)}}resolveExtensionUiResponse(a){let b=this.pendingUiResponses.get(a.id);b&&b.resolve(a)}getExtensionStatuses(){return Array.from(this.extensionStatuses,([a,b])=>({key:a,text:b}))}getExtensionWidgets(){return Array.from(this.extensionWidgets.values())}nextExtensionWidgetGeneration(a){let b=(this.extensionWidgetGenerations.get(a)??0)+1;return this.extensionWidgetGenerations.set(a,b),b}disposeExtensionWidgetComponent(a){if(!a||"object"!=typeof a&&"function"!=typeof a)return;let b=a.dispose;if("function"==typeof b)try{b.call(a)}catch{}}emitExtensionWidgetClear(a){this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setWidget",widgetKey:a,widgetLines:void 0,widgetPlacement:void 0})}clearExtensionWidget(a,b=!0){let c=this.nextExtensionWidgetGeneration(a),d=this.activeExtensionWidgets.get(a);return this.activeExtensionWidgets.delete(a),this.extensionWidgets.delete(a),d&&this.disposeExtensionWidgetComponent(d.component),this.extensionWidgetGenerations.get(a)!==c||b&&this.emitExtensionWidgetClear(a),c}clearExtensionWidgets(a){for(let b of new Set([...this.extensionWidgets.keys(),...this.activeExtensionWidgets.keys()]))this.clearExtensionWidget(b,a)}resetExtensionWidgetsForReload(){this.extensionWidgetsResetting=!0;try{for(let a of[...this.activeExtensionWidgets.keys()])this.clearExtensionWidget(a);this.extensionWidgets.clear()}finally{this.extensionWidgetsResetting=!1}}emitExtensionWidgetError(a,b){this.emit({type:"extension_error",extensionPath:`extension-widget:${a}`,event:"setWidget",error:b instanceof Error?b.message:String(b)})}failExtensionWidget(a,b,c,d,e){if(this.extensionWidgetGenerations.get(a)!==b)return void this.disposeExtensionWidgetComponent(e);let f=this.activeExtensionWidgets.get(a),g=!d;f?.generation===b?(g=f.rendered||!f.clearEmitted,this.activeExtensionWidgets.delete(a),this.disposeExtensionWidgetComponent(f.component)):this.disposeExtensionWidgetComponent(e),this.extensionWidgetGenerations.get(a)!==b||(this.extensionWidgets.delete(a),g&&this.emitExtensionWidgetClear(a)),this.emitExtensionWidgetError(a,c)}renderExtensionWidget(a){let b;if(this.activeExtensionWidgets.get(a.key)!==a||this.extensionWidgetGenerations.get(a.key)!==a.generation)return;try{b=a.component.render(w.p1)}catch(b){this.failExtensionWidget(a.key,a.generation,b,a.clearEmitted);return}if(!Array.isArray(b)||!b.every(a=>"string"==typeof a))return void this.failExtensionWidget(a.key,a.generation,Error("Extension widget render must return string[]"),a.clearEmitted);if(this.activeExtensionWidgets.get(a.key)!==a||this.extensionWidgetGenerations.get(a.key)!==a.generation)return;let c=b;this.extensionWidgets.set(a.key,{key:a.key,lines:c,placement:a.placement}),a.rendered=!0,this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setWidget",widgetKey:a.key,widgetLines:c,widgetPlacement:a.placement})}setExtensionWidgetFactory(a,b,c){let d,e=this.extensionWidgets.has(a)||this.activeExtensionWidgets.has(a),f=this.clearExtensionWidget(a,e);if(this.extensionWidgetGenerations.get(a)!==f)return;let g=(0,w.TQ)(()=>{let b=this.activeExtensionWidgets.get(a);b?.generation===f&&this.renderExtensionWidget(b)},w.p1);try{d=b(g,aa)}catch(b){this.failExtensionWidget(a,f,b,e);return}if(this.extensionWidgetGenerations.get(a)!==f)return void this.disposeExtensionWidgetComponent(d);if(!d||"object"!=typeof d&&"function"!=typeof d||"function"!=typeof d.render)return void this.failExtensionWidget(a,f,Error("Extension widget factory must return a component with render(width)"),e,d);let h={key:a,component:d,placement:c?.placement??"aboveEditor",generation:f,clearEmitted:e,rendered:!1};this.activeExtensionWidgets.set(a,h),this.renderExtensionWidget(h)}getCustomUiWidth(a){if(!a||"object"!=typeof a)return w.p1;let b=a.overlayOptions,c="function"==typeof b?b():b;if(!c||"object"!=typeof c)return w.p1;let d=c.width;return"number"==typeof d&&Number.isFinite(d)?Math.max(40,Math.min(140,Math.round(d))):92}emitCustomUiRender(a,b){let c;try{c=b.component.render(b.width)}catch(a){c=[`Extension custom UI render failed: ${a instanceof Error?a.message:String(a)}`]}let d={type:"extension_ui_request",id:a,method:"custom",lines:c};this.pendingUiRequests.set(a,d),this.emit(d)}closeCustomUi(a,b){let c=this.activeCustomUis.get(a);if(c&&!c.settled){c.settled=!0,this.activeCustomUis.delete(a),this.pendingUiRequests.delete(a);try{c.component.dispose?.()}catch{}this.emit({type:"extension_ui_request",id:a,method:"custom",lines:[],closed:!0}),c.resolve(b)}}handleExtensionUiInput(a,b){let c=this.activeCustomUis.get(a);if(c&&"string"==typeof b)try{c.component.handleInput?.(b),this.activeCustomUis.has(a)&&this.emitCustomUiRender(a,c)}catch(b){this.closeCustomUi(a,void 0),this.emit({type:"extension_error",extensionPath:`custom-ui:${a}`,event:"custom_ui_input",error:b instanceof Error?b.message:String(b)})}}requestExtensionCustomUi(a,b){if("function"!=typeof a)return Promise.resolve(void 0);let c=this.extensionUiAbortController.signal;if(c.aborted)return Promise.reject(c.reason);let d=(0,g.randomUUID)(),e=this.getCustomUiWidth(b);return new Promise((b,f)=>{let g=!1,h=(0,w.TQ)(()=>{let a=this.activeCustomUis.get(d);a&&this.emitCustomUiRender(d,a)},e),i=a=>{g||(g=!0,c.removeEventListener("abort",k),c.aborted?f(c.reason):b(a))},j=a=>{this.activeCustomUis.has(d)?this.closeCustomUi(d,a):i(a)},k=()=>j(void 0);c.addEventListener("abort",k,{once:!0}),Promise.resolve().then(()=>g?void 0:a(h,aa,ab,j)).then(a=>{if(g){try{a?.dispose?.()}catch{}return}if(!a||"object"!=typeof a||"function"!=typeof a.render)return void i(void 0);let b={component:a,width:e,resolve:a=>i(a),settled:!1};this.activeCustomUis.set(d,b),this.emitCustomUiRender(d,b)}).catch(a=>{g||(this.emit({type:"extension_error",extensionPath:`custom-ui:${d}`,event:"custom_ui",error:a instanceof Error?a.message:String(a)}),i(void 0))})})}requestExtensionUi(a,b,c,d,e){if(e?.aborted)return Promise.resolve(b);let f=this.extensionUiAbortController.signal;if(f.aborted)return Promise.reject(f.reason);let h=e?AbortSignal.any([e,f]):f,i=(0,g.randomUUID)(),j={type:"extension_ui_request",id:i,...a,...d?{timeout:d,expiresAt:Date.now()+d}:{}};return new Promise((a,e)=>{let g,k=!1,l=()=>{g&&clearTimeout(g),h.removeEventListener("abort",n),this.pendingUiRequests.delete(i),this.pendingUiResponses.delete(i),this.emit({type:"extension_ui_closed",id:i})},m=b=>{k||(k=!0,l(),f.aborted?e(f.reason):a(b))},n=()=>m(b);d&&(g=setTimeout(()=>m(b),d)),h.addEventListener("abort",n,{once:!0}),this.pendingUiRequests.set(i,j),this.pendingUiResponses.set(i,{resolve:a=>m(c(a)),cancel:()=>m(b)}),this.emit(j)})}createExtensionUiContext(){return{select:(a,b,c)=>this.requestExtensionUi({method:"select",title:a,options:b,...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),confirm:(a,b,c)=>this.requestExtensionUi({method:"confirm",title:a,message:b,...c?.timeout?{timeout:c.timeout}:{}},!1,a=>"confirmed"in a&&a.confirmed,c?.timeout,c?.signal),input:(a,b,c)=>this.requestExtensionUi({method:"input",title:a,...void 0!==b?{placeholder:b}:{},...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),editor:(a,b,c)=>this.requestExtensionUi({method:"editor",title:a,...void 0!==b?{prefill:b}:{},...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),notify:(a,b)=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"notify",message:a,notifyType:b})},onTerminalInput:()=>()=>{},setStatus:(a,b)=>{void 0===b?this.extensionStatuses.delete(a):this.extensionStatuses.set(a,b),this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setStatus",statusKey:a,statusText:b})},setWorkingMessage:()=>{},setWorkingVisible:()=>{},setWorkingIndicator:()=>{},setHiddenThinkingLabel:()=>{},setWidget:(a,b,c)=>{if(!this._alive||this.extensionWidgetsResetting)return;if("function"==typeof b)return void this.setExtensionWidgetFactory(a,b,c);if(void 0!==b&&!Array.isArray(b))return;if(void 0===b)return void this.clearExtensionWidget(a);let d=this.activeExtensionWidgets.has(a)?this.clearExtensionWidget(a):this.nextExtensionWidgetGeneration(a);this.extensionWidgetGenerations.get(a)===d&&(this.extensionWidgets.set(a,{key:a,lines:b,placement:c?.placement??"aboveEditor"}),this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setWidget",widgetKey:a,widgetLines:b,widgetPlacement:c?.placement}))},setFooter:()=>{},setHeader:()=>{},setTitle:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setTitle",title:a})},custom:(a,b)=>this.requestExtensionCustomUi(a,b),pasteToEditor:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"set_editor_text",text:a})},setEditorText:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"set_editor_text",text:a})},getEditorText:()=>"",addAutocompleteProvider:()=>{},setEditorComponent:()=>{},getEditorComponent:()=>void 0,get theme(){return aa},getAllThemes:()=>[],getTheme:()=>void 0,setTheme:()=>({success:!1,error:"Theme switching is not supported in Pi Web extension UI yet"}),getToolsExpanded:()=>!1,setToolsExpanded:()=>{}}}createExtensionCommandContextActions(){return{waitForIdle:async()=>{let a=this.inner.agent;await a.waitForIdle?.()},newSession:async()=>({cancelled:!0}),fork:async()=>({cancelled:!0}),navigateTree:(a,b)=>this.navigateTreeKeepingToolSelection(a,{summarize:b?.summarize}),switchSession:async()=>({cancelled:!0}),reload:async()=>{let a=this.inner.isStreaming?"Wait for the current response to finish before reloading.":this.inner.isCompacting?"Wait for compaction to finish before reloading.":null;a?this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"notify",notifyType:"warning",message:a}):(this.extensionStatuses.clear(),this.resetExtensionWidgetsForReload(),this.syncProjectTrust(),await this.inner.reload({beforeSessionStart:()=>{this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc")}}),(0,m.nx)())}}}syncProjectTrust(){let a=(0,t.Y1)(this.cwd,(0,e.getAgentDir)());this.inner.settingsManager.setProjectTrusted(a.trusted)}}function P(){if(!globalThis.__piSessions){globalThis.__piSessions=new Map;let a=()=>{let a=Array.from(globalThis.__piSessions?.values()??[]);Promise.allSettled(a.map(a=>a.shutdown()))};process.once("exit",()=>globalThis.__piSessions?.forEach(a=>a.destroy())),process.once("SIGINT",a),process.once("SIGTERM",a)}return globalThis.__piSessions}function Q(a){let b=P(),c=a.sessionId;a.sessionFile&&(0,r.O8)(c,a.sessionFile),a.onDestroy(()=>{b.get(c)===a&&b.delete(c)});let d=b.get(c);d&&d!==a&&"function"==typeof d.onDestroy&&d.onDestroy(()=>{}),b.set(c,a),a.start(),a.isChatOnly()||a.beginExtensionBinding()}let ae=(0,A.s)({getSession:a=>P().get(a),registerSession:(a,b)=>{let c=new ad(a,{...b?.exactSystemPrompt!==void 0?{exactSystemPrompt:b.exactSystemPrompt}:{},chatOnly:b?.chatOnly,suppressCompletionNotifications:!0,...b?.mcpHost?{mcpHost:b.mcpHost}:{}});return Q(c),c},reopenSession:async(a,b)=>(await S(a,b,void 0)).session,resolveSessionPath:r.os,invalidateSessionList:r.mD,isBuiltInSubagentsEnabled:B.N}),af=new WeakMap;function R(a){return P().get(a)}async function S(a,b,c,d={}){let f,g,j,{initialModel:k,allowInitialModelFallback:l,thinkingLevel:m}=d,p=void 0===d.toolNames?void 0:(0,L.vw)(d.toolNames),s=P(),v=(globalThis.__piStartLocks||(globalThis.__piStartLocks=new Map),globalThis.__piStartLocks),w=s.get(a);if(w?.isAlive())return{session:w,realSessionId:a};let A=v.get(a);if(A)return A;let C=function(a){let b=P().get(a);if(!b||b.isAlive()||"function"!=typeof b.waitUntilDisposed)return null;let c=af.get(b);if(!c){let d={done:!1,promise:Promise.resolve()};d.promise=b.waitUntilDisposed(V+1e3).then(b=>{b||console.warn(`[pi-web] session ${a} is still shutting down; starting it again anyway`)}).finally(()=>{d.done=!0}),af.set(b,d),c=d}return c.done?null:c.promise}(a);if(C){let e=C.then(()=>(v.get(a)===e&&v.delete(a),S(a,b,c,d)));return v.set(a,e),e}if(b)f=e.SessionManager.open(b,void 0);else{if(!c)throw Error("cwd is required for a new session");f=e.SessionManager.create(c,void 0)}let G=f.getCwd(),J=f.getEntries(),K=b&&(0,z.e0)(J),M=b?(0,z.ph)(J):null;if(K&&!M)throw Error("Invalid subagent resource snapshot");let R=M?void 0:(0,L.dS)(J),T=M?.tools??R??p;M||void 0!==R||void 0===p||(0,L.b5)(f,p);let U=!!(M?.loadExtensions||M?.loadSkills||M?.codemode||M?.mcp),W=T?.length===0&&!U,X=(globalThis.__piStartingSessionCwds||(globalThis.__piStartingSessionCwds=new Map),g=globalThis.__piStartingSessionCwds,j=function(a){let b=(0,i.resolve)(a);try{return(0,h.realpathSync)(b)}catch{return b}}(G),g.set(j,(g.get(j)??0)+1),()=>{let a=(g.get(j)??1)-1;a>0?g.set(j,a):g.delete(j)}),Y=(async()=>{let a;W||(0,e.initTheme)();let b=(0,e.getAgentDir)();M||void 0===T||(a=0===T.length?[]:void 0);let c=M?U?(0,t.Fk)(G,b):void 0:W?void 0:(0,t.Fk)(G,b),d=e.SettingsManager.create(G,b),g={},h=(0,E.Q)(()=>g.current?.()),i=M||W?void 0:await (0,F.n7)({agentDir:b}),j=M?.codemode?await (0,F.Db)({agentDir:b,cwd:G,projectTrusted:()=>d.isProjectTrusted()}):void 0,p=M?.mcp?await (0,F.M7)({agentDir:b,cwd:G,projectTrusted:()=>d.isProjectTrusted(),codemode:!0===M.codemode}):void 0,s=M?(0,I.X)({loadSkills:M.loadSkills,skills:M.skills,exactSystemPrompt:M.exactSystemPrompt??(W?M.appendSystemPrompt[0]??"":void 0)}):void 0,v=[...j?[j]:[],...p&&M?[...p.extensions,(0,H.PV)(()=>M)]:[],...s?.loaderOptions.extensionFactories??[]],w=await (0,e.createAgentSessionServices)({cwd:G,agentDir:b,settingsManager:d,resourceLoaderOptions:M?{...(0,z._R)(M),...s.loaderOptions,...v.length>0?{extensionFactories:v}:{},noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,...W?{systemPrompt:" ",systemPromptOverride:()=>void 0}:{},appendSystemPrompt:M.appendSystemPrompt}:W?{...D.M,extensionFactories:[h]}:{extensionFactories:[...i?.extensions??[],(0,H._Q)(),(0,q.eD)({cwd:G,settings:d}),(0,x.Vj)(ae.extensionRuntime,()=>(0,z.IR)(G),B.N)],extensionsOverride:a=>(0,y.r8)((0,q.Ds)((0,x.U6)(a)))},...c?{resourceLoaderReloadOptions:c}:{}});if(M?.codemode&&!w.resourceLoader.getExtensions().extensions.some(a=>a.tools.has("codemode")))throw Error("Code mode is unavailable: builtin:codemode was not registered");let A=w.settingsManager.getEnabledModels(),C=await (0,n.py)(w.modelRuntime,A),J=k&&!w.modelRuntime.getModel(k.provider,k.modelId)?(0,o.S9)(w.modelRuntime,k.provider,k.modelId):void 0;if(W&&J&&!l)throw N(J.provider,J.id);let K=k&&!J&&(!l||C.visible.some(a=>a.provider===k.provider&&a.id===k.modelId))?k:void 0,L=w.settingsManager.getDefaultProvider(),P=w.settingsManager.getDefaultModel(),R=L&&P?{provider:L,modelId:P}:void 0,S=f.getBranch(),V=S.some(a=>"message"===a.type&&"system"!==a.message.role),X=V?(0,r.Vg)(S):null,Y=X?w.modelRuntime.getModel(X.provider,X.modelId):void 0,Z=V?null:(0,n.IR)(C,{...K?{requestedModel:K}:{},...R?{defaultModel:R}:{},...m?{thinkingLevel:m}:{}}),_=Y&&w.modelRuntime.hasConfiguredAuth(Y.provider)?Y:Z?.model,aa=!!(Z?.model&&R&&Z.model.provider===R.provider&&Z.model.id===R.modelId&&(C.scopedModels.length>0||!A?.some(a=>a.trim()))),ab=V||W||!J&&(K||aa)?void 0:await (0,o.je)(w.modelRuntime,A,J?{requestedModel:{provider:J.provider,modelId:J.id}}:R?{defaultModel:R}:{}),ac=V?X&&!Y?(0,o.S9)(w.modelRuntime,X.provider,X.modelId):void 0:J??ab?.model,af=ac?V?S.findLast(a=>"thinking_level_change"===a.type)?.thinkingLevel??w.settingsManager.getDefaultThinkingLevel()??$:m??ab?.thinkingLevelPin??w.settingsManager.getModelThinkingLevel(ac.provider,ac.id)??w.settingsManager.getDefaultThinkingLevel()??$:void 0,ag=W?ac??(!V&&L&&P?(0,o.S9)(w.modelRuntime,L,P):void 0):void 0,{session:ah}=await (0,e.createAgentSessionFromServices)({services:w,sessionManager:f,..._?{model:_}:{},...Z?.thinkingLevel?{thinkingLevel:Z.thinkingLevel}:{},...C.scopedModels.length>0?{scopedModels:[...C.scopedModels]}:{},...M?(0,z.AO)(M):void 0!==a?{tools:a}:{}});if(!M&&!W){let a=ah.getActiveToolNames();ah.setActiveToolsByName(O(ah,T??a,a))}s?.setActiveToolsGetter(()=>ah.getActiveToolNames());let ai=M?s.getExactSystemPrompt:W?()=>(0,D.c)(ah.resourceLoader.getAgentsFiles().agentsFiles):void 0;g.current=ai;let aj=i?.mcpHost??p?.mcpHost,ak=new ad(ah,{exactSystemPrompt:ai,chatOnly:W,onAgentRunComplete:(a,b)=>{(0,u.lB)(a,b).catch(a=>{console.error("[pi-web] failed to send completion push:",a instanceof Error?a.message:a)})},suppressCompletionNotifications:!!M,...aj?{mcpHost:aj}:{},...ag?{chatOnlyExtensionModel:ag}:{}}),al=ah.sessionId;if(Q(ak),!W){if(ac)try{await ak.waitUntilReady(),await ak.send({type:"set_model",provider:ac.provider,modelId:ac.id}),af&&await ak.send({type:"set_thinking_level",level:af})}catch(a){console.error(`[pi-web] could not switch to ${ac.provider}/${ac.id}:`,a instanceof Error?a.message:a)}ak.waitUntilReady().then(()=>(0,o.vd)(ah.modelRuntime)).catch(()=>void 0)}return{session:ak,realSessionId:al}})().finally(()=>{v.delete(a),X()});return v.set(a,Y),Y}d()}catch(a){d(a)}})},20946:(a,b,c)=>{"use strict";c.d(b,{aS:()=>d,tF:()=>h,xW:()=>g});let d="PI_WEB_PASSWORD";function e(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)}function f(a){return e(a)?Object.entries(a).filter(a=>"string"==typeof a[1]):[]}function g(a){if(!e(a))return[];if(!("url"in a))return f(a.env).map(([a,b])=>({kind:"env",name:a,value:b}));let b=f(a.headers).map(([a,b])=>({kind:"header",name:a,value:b})),c=e(a.oauth)?a.oauth.clientSecret:void 0;return"string"==typeof c&&b.push({kind:"oauth-client-secret",value:c}),b}function h(a,b){for(let{value:c,...e}of g(a))if(b.isCommandConfigValue(c)?c.toUpperCase().includes(d):b.getConfigValueEnvVarNames(c).some(a=>a.toUpperCase()===d))return e}},21513:(a,b,c)=>{"use strict";c.d(b,{U2:()=>i,dj:()=>f,qu:()=>h});var d=c(77598);function e(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)}function f(a,b=0){return Array.isArray(a)||e(a)?b>=64?"<too deep>":Array.isArray(a)?`[${a.map(a=>f(a,b+1)).join(",")}]`:`{${Object.keys(a).sort().map(c=>`${JSON.stringify(c)}:${f(a[c],b+1)}`).join(",")}}`:JSON.stringify(a)??"null"}let g=Symbol.for("pi-web:mcp-config-key-secret");function h(a){let b=globalThis,c=b[g]??=(0,d.randomBytes)(32);return(0,d.createHmac)("sha256",c).update(f(a)).digest("base64url")}function i(a,b){return h(e(b)?b:a)}},24989:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{Ei:()=>q});var e=c(77598),f=c(73024),g=c(19371),h=c(42267),i=c(89717),j=c(57432),k=c(70090),l=c(38015),m=c(73764),n=c(90379),o=a([g,h,i,j,k,m]);[g,h,i,j,k,m]=o.then?(await o)():o;let x=Symbol.for("pi-web:automations-runtime");function p(){let a=globalThis;return a[x]??={ticker:null}}function q(){null===p().ticker&&(p().ticker=setInterval(()=>{r().catch(a=>{console.warn(`[pi-web] automations tick failed: ${a instanceof Error?a.message:String(a)}`)})},3e4),console.log("[pi-web] automations ticker started"))}async function r(){let a=(0,k.$k)();for(let b of a.automations){if(!b.enabled||null!==(0,l.Lk)(b.schedule))continue;let c=b.nextDueAt;if((null!==c||(c=(0,l.ns)(b.schedule,Date.now()),await s(b.id,{nextDueAt:c}),null!==c))&&!(c>Date.now())){if(a.runs.some(a=>a.automationId===b.id&&"running"===a.status)){await t({id:(0,e.randomUUID)(),automationId:b.id,trigger:"schedule",startedAt:Date.now(),finishedAt:Date.now(),status:"skipped",sessionId:null,sessionFile:null,error:"The previous run was still going"}),await s(b.id,{nextDueAt:(0,l.ns)(b.schedule,Date.now())});continue}w(b,"schedule").catch(a=>{console.warn(`[pi-web] automation "${b.name}" failed: ${a instanceof Error?a.message:String(a)}`)}),await s(b.id,{nextDueAt:(0,l.ns)(b.schedule,Date.now())})}}}async function s(a,b){await (0,k.Vr)(c=>{let d=!1,e=c.automations.map(c=>c.id!==a?c:(d=!0,{...c,...b}));return{file:{...c,automations:e},changed:d}}).catch(a=>{console.warn(`[pi-web] automations: persisting a patch failed: ${a instanceof Error?a.message:String(a)}`)})}async function t(a){await (0,k.Vr)(b=>({file:{...b,runs:[...b.runs.filter(b=>b.id!==a.id),a]},changed:!0})).catch(a=>{console.warn(`[pi-web] automations: recording a run failed: ${a instanceof Error?a.message:String(a)}`)})}async function u(a,b){await (0,k.Vr)(c=>({file:{...c,runs:c.runs.map(c=>c.id===a?{...c,...b}:c)},changed:!0})).catch(()=>{})}function v(a=new Date){let b=a=>String(a).padStart(2,"0");return`${b(a.getMonth()+1)}-${b(a.getDate())} ${b(a.getHours())}:${b(a.getMinutes())}`}async function w(a,b){let c,d,l,o,p=(0,e.randomUUID)(),q=Date.now();await t({id:p,automationId:a.id,trigger:b,startedAt:q,finishedAt:null,status:"running",sessionId:null,sessionFile:null,error:null}),await s(a.id,{lastRunAt:q});let r=async c=>(await u(p,{finishedAt:Date.now(),status:"failed",error:c}),a.notify&&"schedule"===b&&await (0,h.lB)(a.id,`${a.name} \xb7 failed`).catch(()=>{}),await (0,m.U)(a,{status:"failed",name:`${a.name} \xb7 ${v()}`,reply:"",error:c,startedAt:q,durationMs:Date.now()-q}).catch(()=>{}),{runId:p,sessionId:null,error:c});try{(0,f.mkdirSync)(a.cwd,{recursive:!0})}catch(a){return r(`The working directory could not be created: ${a instanceof Error?a.message:String(a)}`)}(0,i.wz)(a.cwd);try{let b=`__automation__${(0,e.randomUUID)()}`,f=await (0,g.OF)(b,"",a.cwd,{...a.model?{initialModel:a.model}:{},...a.thinkingLevel?{thinkingLevel:a.thinkingLevel}:{}});c=f.session,d=f.realSessionId}catch(a){return r(`Starting the session failed: ${a instanceof Error?a.message:String(a)}`)}let w=`${a.name} \xb7 ${v()}`;try{await c.send({type:"set_session_name",name:w})}catch{}let x=!1,y="",z=new Promise((a,b)=>{l=a,o=b}),A=c.onEvent(a=>{if("message_end"===a.type){let b=a.message;if(b&&"assistant"===b.role){let a=(0,n.qh)(b);""!==a.trim()&&(y=a)}}else"prompt_done"===a.type?(a.aborted&&(x=!0),l()):"prompt_error"===a.type&&o(Error(a.errorMessage??"The turn failed"))});try{await c.send({type:"prompt",message:a.prompt}),await z,await u(p,{finishedAt:Date.now(),status:x?"skipped":"done",sessionId:d,sessionFile:c.sessionFile,error:x?"The turn was stopped":null}),(0,j.mD)();let b=!x&&(0,k._Y)(a.silentWhen,y);return a.notify&&!b&&await (0,h.lB)(d,w).catch(()=>{}),b||await (0,m.U)(a,{status:x?"skipped":"done",name:w,reply:y,error:x?"The turn was stopped":null,startedAt:q,durationMs:Date.now()-q}).catch(()=>{}),{runId:p,sessionId:d,error:null}}catch(e){let b=e instanceof Error?e.message:String(e);return await u(p,{finishedAt:Date.now(),status:"failed",sessionId:d,sessionFile:c.sessionFile,error:b}),(0,j.mD)(),a.notify&&await (0,h.lB)(d,`${w} \xb7 failed`).catch(()=>{}),await (0,m.U)(a,{status:"failed",name:w,reply:y,error:b,startedAt:q,durationMs:Date.now()-q}).catch(()=>{}),{runId:p,sessionId:d,error:b}}finally{A()}}d()}catch(a){d(a)}})},25653:a=>{function b(a,b){"boolean"==typeof b&&(b={forever:b}),this._originalTimeouts=JSON.parse(JSON.stringify(a)),this._timeouts=a,this._options=b||{},this._maxRetryTime=b&&b.maxRetryTime||1/0,this._fn=null,this._errors=[],this._attempts=1,this._operationTimeout=null,this._operationTimeoutCb=null,this._timeout=null,this._operationStart=null,this._options.forever&&(this._cachedTimeouts=this._timeouts.slice(0))}a.exports=b,b.prototype.reset=function(){this._attempts=1,this._timeouts=this._originalTimeouts},b.prototype.stop=function(){this._timeout&&clearTimeout(this._timeout),this._timeouts=[],this._cachedTimeouts=null},b.prototype.retry=function(a){if(this._timeout&&clearTimeout(this._timeout),!a)return!1;var b=new Date().getTime();if(a&&b-this._operationStart>=this._maxRetryTime)return this._errors.unshift(Error("RetryOperation timeout occurred")),!1;this._errors.push(a);var c=this._timeouts.shift();if(void 0===c)if(!this._cachedTimeouts)return!1;else this._errors.splice(this._errors.length-1,this._errors.length),this._timeouts=this._cachedTimeouts.slice(0),c=this._timeouts.shift();var d=this,e=setTimeout(function(){d._attempts++,d._operationTimeoutCb&&(d._timeout=setTimeout(function(){d._operationTimeoutCb(d._attempts)},d._operationTimeout),d._options.unref&&d._timeout.unref()),d._fn(d._attempts)},c);return this._options.unref&&e.unref(),!0},b.prototype.attempt=function(a,b){this._fn=a,b&&(b.timeout&&(this._operationTimeout=b.timeout),b.cb&&(this._operationTimeoutCb=b.cb));var c=this;this._operationTimeoutCb&&(this._timeout=setTimeout(function(){c._operationTimeoutCb()},c._operationTimeout)),this._operationStart=new Date().getTime(),this._fn(this._attempts)},b.prototype.try=function(a){console.log("Using RetryOperation.try() is deprecated"),this.attempt(a)},b.prototype.start=function(a){console.log("Using RetryOperation.start() is deprecated"),this.attempt(a)},b.prototype.start=b.prototype.try,b.prototype.errors=function(){return this._errors},b.prototype.attempts=function(){return this._attempts},b.prototype.mainError=function(){if(0===this._errors.length)return null;for(var a={},b=null,c=0,d=0;d<this._errors.length;d++){var e=this._errors[d],f=e.message,g=(a[f]||0)+1;a[f]=g,g>=c&&(b=e,c=g)}return b}},28718:(a,b,c)=>{var d=global.process;let e=function(a){return a&&"object"==typeof a&&"function"==typeof a.removeListener&&"function"==typeof a.emit&&"function"==typeof a.reallyExit&&"function"==typeof a.listeners&&"function"==typeof a.kill&&"number"==typeof a.pid&&"function"==typeof a.on};if(e(d)){var f,g=c(12412),h=c(53481),i=/^win/i.test(d.platform),j=c(94735);"function"!=typeof j&&(j=j.EventEmitter),d.__signal_exit_emitter__?f=d.__signal_exit_emitter__:((f=d.__signal_exit_emitter__=new j).count=0,f.emitted={}),f.infinite||(f.setMaxListeners(1/0),f.infinite=!0),a.exports=function(a,b){if(!e(global.process))return function(){};g.equal(typeof a,"function","a callback must be provided for exit handler"),!1===n&&o();var c="exit";return b&&b.alwaysLast&&(c="afterexit"),f.on(c,a),function(){f.removeListener(c,a),0===f.listeners("exit").length&&0===f.listeners("afterexit").length&&k()}};var k=function(){n&&e(global.process)&&(n=!1,h.forEach(function(a){try{d.removeListener(a,m[a])}catch(a){}}),d.emit=r,d.reallyExit=p,f.count-=1)};a.exports.unload=k;var l=function(a,b,c){f.emitted[a]||(f.emitted[a]=!0,f.emit(a,b,c))},m={};h.forEach(function(a){m[a]=function(){e(global.process)&&d.listeners(a).length===f.count&&(k(),l("exit",null,a),l("afterexit",null,a),i&&"SIGHUP"===a&&(a="SIGINT"),d.kill(d.pid,a))}}),a.exports.signals=function(){return h};var n=!1,o=function(){!n&&e(global.process)&&(n=!0,f.count+=1,h=h.filter(function(a){try{return d.on(a,m[a]),!0}catch(a){return!1}}),d.emit=s,d.reallyExit=q)};a.exports.load=o;var p=d.reallyExit,q=function(a){e(global.process)&&(d.exitCode=a||0,l("exit",d.exitCode,null),l("afterexit",d.exitCode,null),p.call(d,d.exitCode))},r=d.emit,s=function(a,b){if(!("exit"===a&&e(global.process)))return r.apply(this,arguments);void 0!==b&&(d.exitCode=b);var c=r.apply(this,arguments);return l("exit",d.exitCode,null),l("afterexit",d.exitCode,null),c}}else a.exports=function(){return function(){}}},29188:(a,b,c)=>{"use strict";function d(a){switch(a.method){case"select":case"confirm":case"input":case"editor":return!0;case"custom":return!0!==a.closed;default:return!1}}c.d(b,{YI:()=>d})},29299:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{U:()=>p});var e=c(75430),f=c(73024),g=c(98995),h=c(76760),i=c(73136),j=a([e]);e=(j.then?(await j)():j)[0];let q="@earendil-works/pi-coding-agent",r="@earendil-works/pi-mcp",s={mcpExtension:"dist/extensions/mcp/index.js",mcpRuntime:"dist/extensions/mcp/runtime.js",mcpConfig:"dist/extensions/mcp/config.js",mcpOAuth:"dist/extensions/mcp/oauth.js",mcpServers:"dist/core/mcp-servers.js",configValues:"dist/core/resolve-config-value.js"},t={McpServerConnection:{module:"mcpRuntime",kind:"class"},createDefaultTransport:{module:"mcpRuntime",kind:"function"},StdioTransport:{module:"mcpClient",kind:"class"},loadMcpConfig:{module:"mcpConfig",kind:"function"},addMcpServerConfig:{module:"mcpConfig",kind:"function"},updateMcpServerConfig:{module:"mcpConfig",kind:"function"},removeMcpServerConfig:{module:"mcpConfig",kind:"function"},validateMcpServerConfig:{module:"mcpServers",kind:"function"},getMcpToolExposure:{module:"mcpServers",kind:"function"},signInMcpServer:{module:"mcpOAuth",kind:"function"},McpOAuthCredentialStore:{module:"mcpOAuth",kind:"class"},McpSignInCancelledError:{module:"mcpOAuth",kind:"class"},resolveConfigValueOrThrow:{module:"configValues",kind:"function"},resolveHeadersOrThrow:{module:"configValues",kind:"function"},getConfigValueEnvVarNames:{module:"configValues",kind:"function"},isCommandConfigValue:{module:"configValues",kind:"function"}};function k(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)}function l(a){return a instanceof Error?a.message:String(a)}async function m(a){return await import((0,i.pathToFileURL)(a).href)}let u=new Set(["node","import","module-sync","node-addons","default"]);async function n(a){let b=Object.fromEntries(Object.entries(s).map(([b,c])=>[b,(0,h.join)(a,c)]));try{b.mcpClient=function(a){let b=(0,i.pathToFileURL)((0,h.join)(a,s.mcpRuntime)).href,c=(0,g.findPackageJSON)(r,b);if(!c)throw Error(`cannot resolve ${r}`);let d=function(a){if(!k(a))return;let{exports:b}=a;return void 0===b?"string"==typeof a.main?a.main:"index.js":function a(b){if("string"==typeof b||null===b)return b;for(let c of Array.isArray(b)?b:k(b)?Object.entries(b).filter(([a])=>u.has(a)).map(([,a])=>a):[]){let b=a(c);if(void 0!==b)return b}}(k(b)&&"."in b?b["."]:b)??void 0}(JSON.parse((0,f.readFileSync)(c,"utf8")));if(!d)throw Error(`${c} declares no import entry`);return(0,h.join)(c,"..",d)}(a)}catch(a){return`${r}: ${l(a)}`}let c={};for(let[a,d]of Object.entries(b))try{c[a]=await m(d)}catch(a){return`cannot load ${d}: ${l(a)}`}return c}async function o(a={}){var b;let c,{environment:d=process.env,cwd:j=process.cwd()}=a;if(d.PI_PACKAGE_DIR)return{ok:!1,reason:`PI_PACKAGE_DIR is set; MCP support loads only from the ${q} that Pi Web runs`};try{c=(0,f.realpathSync)((0,e.getPackageDir)());let a=function(a){let b=(0,g.findPackageJSON)(q,(0,i.pathToFileURL)((0,h.join)(a,"package.json")).href);if(!b)throw Error(`cannot resolve ${q} from ${a}`);return(0,f.realpathSync)((0,h.join)(b,".."))}(j);if(b=c,"win32"===process.platform?b.toLowerCase()!==a.toLowerCase():b!==a)return{ok:!1,reason:`${q} at ${c} is not the package Pi Web resolves (${a})`}}catch(a){return{ok:!1,reason:`cannot locate ${q}: ${l(a)}`}}let k=await n(c);if("string"==typeof k)return{ok:!1,reason:k};if(k.mcpExtension.createMcpExtension!==e.createMcpExtension)return{ok:!1,reason:`${s.mcpExtension} loaded as a second copy of ${q}`};let m=function(a){let b={};for(let[c,{module:d,kind:e}]of Object.entries(t)){let f=a[d][c];if("class"===e?!("function"==typeof f&&/^class[\s{]/.test(Function.prototype.toString.call(f))):"function"!=typeof f){let a="mcpClient"===d?r:s[d];return`${a} does not export ${c} as a ${e}`}b[c]=f}return b}(k);if("string"==typeof m)return{ok:!1,reason:m};let p={packageDir:c,...m};try{if(!(p.createDefaultTransport({name:"pi-web-probe",config:{command:"pi-web-probe"},source:"pi-web"},p.packageDir,void 0)instanceof p.StdioTransport))return{ok:!1,reason:`${r} resolved to another copy than ${s.mcpRuntime} uses`}}catch(a){return{ok:!1,reason:`${s.mcpRuntime}: ${l(a)}`}}return{ok:!0,...p}}let v=Symbol.for("pi-web.piSdkInternals");function p(){let a=globalThis;return a[v]??=o().catch(a=>({ok:!1,reason:l(a)}))}d()}catch(a){d(a)}})},30507:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{PV:()=>k,_Q:()=>l});var e=c(13956),f=c(38222),g=c(66192),h=a([g]);g=(h.then?(await h)():h)[0];let m=new Set(["bash","powershell","edit","write"]);function i(a){return void 0!==a&&a.length>0&&!a.some(a=>m.has(a))}function j(a){return a.sourceInfo?.path===e.pM||a.name.startsWith("mcp__")}function k(a){return{name:"pi-web-subagent-mcp-policy",hidden:!0,factory:b=>{b.on("tool_call",c=>{var d,f;let h=b.getAllTools().find(a=>a.name===c.toolName);if(!h||!j(h))return;let{tools:k,allExtensionTools:l}=a();if(!l&&h.sourceInfo?.path!==e.pM&&!k.includes(h.name))return{block:!0,reason:(d=c.toolName,`"${d}" comes from an extension this subagent's profile did not select, so the call was blocked.`)};if(h.annotations?.readOnlyHint!==!0&&i(k.filter(a=>g.xL.includes(a))))return{block:!0,reason:(f=c.toolName,`This subagent's profile gives it read-only tools, and the MCP server does not mark "${f}" as read-only (readOnlyHint), so the call was blocked.`)}})}}}function l(){return{name:"pi-web-read-only-mcp",hidden:!0,factory:a=>{a.on("tool_call",(b,c)=>{let d=a.getAllTools().find(a=>a.name===b.toolName);if(!d||!j(d)||d.annotations?.readOnlyHint===!0)return;let e=(0,f.dS)(c.sessionManager.getEntries());if(i(e)){var g;return{block:!0,reason:(g=b.toolName,`This session uses a read-only tool selection, and the MCP server does not mark "${g}" as read-only (readOnlyHint), so the call was blocked. Switch the session to a preset that allows changes to use it.`)}}})}}}d()}catch(a){d(a)}})},35234:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{Fk:()=>m,Y1:()=>k,n:()=>l});var e=c(73024);c(48161);var f=c(76760),g=c(75430);c(89420);var h=c(97136),i=a([g]);function j(a,b){return b?{decision:b.decision,decisionPath:b.path,inherited:!(0,h.Eb)(b.path,function(a){let b=(0,f.resolve)(a);try{return(0,e.realpathSync)(b)}catch{return b}}(a))}:{decision:null,inherited:!1}}function k(a,b){let c=!!a&&(0,g.hasTrustRequiringProjectResources)(a),d=new g.ProjectTrustStore(b);if(!c){if(!a)return{requiresTrust:!1,trusted:!0,decision:null,inherited:!1};try{return{requiresTrust:!1,trusted:!0,...j(a,d.getEntry(a))}}catch(a){return{requiresTrust:!1,trusted:!0,decision:null,inherited:!1,decisionError:a instanceof Error?a.message:String(a)}}}let e=d.getEntry(a);return{requiresTrust:!0,trusted:e?.decision===!0,...j(a,e)}}g=(i.then?(await i)():i)[0];let n=Symbol.for("pi-web:project-trust-read-warnings");function l(a,b){try{if(!a||!(0,g.hasTrustRequiringProjectResources)(a))return!1;return!0===new g.ProjectTrustStore(b).get(a)}catch(h){let a=(0,f.join)(b,"trust.json"),c=h instanceof Error?h.message:String(h),d=globalThis,e=d[n]??=new Set,g=`${a}\0${c}`;return e.has(g)||(e.size>=200&&e.delete(e.values().next().value),e.add(g),console.warn(`[pi-web] cannot read project trust from ${a}; projects that need it count as untrusted meanwhile: ${c}`)),!1}}function m(a,b){if(!a||!(0,g.hasTrustRequiringProjectResources)(a))return;let c=new g.ProjectTrustStore(b);return{resolveProjectTrust:async()=>!0===c.get(a)}}Symbol.for("pi-web:fresh-folder-trust-locks"),d()}catch(a){d(a)}})},35618:(a,b,c)=>{"use strict";c.d(b,{z:()=>f});var d=c(76760),e=c.n(d);function f(a,b=process.platform){if(!a)return a;let c="win32"===b?e().win32:e().posix,d=c.normalize(a),g=c.parse(d).root.length,h=d.length;for(;h>g&&d[h-1]===c.sep;)h--;let i=d.slice(0,h);return"win32"===b?i.toLowerCase():i}},35859:(a,b,c)=>{var d=c(25653);b.operation=function(a){return new d(b.timeouts(a),{forever:a&&a.forever,unref:a&&a.unref,maxRetryTime:a&&a.maxRetryTime})},b.timeouts=function(a){if(a instanceof Array)return[].concat(a);var b={retries:10,factor:2,minTimeout:1e3,maxTimeout:1/0,randomize:!1};for(var c in a)b[c]=a[c];if(b.minTimeout>b.maxTimeout)throw Error("minTimeout is greater than maxTimeout");for(var d=[],e=0;e<b.retries;e++)d.push(this.createTimeout(e,b));return a&&a.forever&&!d.length&&d.push(this.createTimeout(e,b)),d.sort(function(a,b){return a-b}),d},b.createTimeout=function(a,b){var c=Math.round((b.randomize?Math.random()+1:1)*b.minTimeout*Math.pow(b.factor,a));return Math.min(c,b.maxTimeout)},b.wrap=function(a,c,d){if(c instanceof Array&&(d=c,c=null),!d)for(var e in d=[],a)"function"==typeof a[e]&&d.push(e);for(var f=0;f<d.length;f++){var g=d[f],h=a[g];a[g]=(function(d){var e=b.operation(c),f=Array.prototype.slice.call(arguments,1),g=f.pop();f.push(function(a){e.retry(a)||(a&&(arguments[0]=e.mainError()),g.apply(this,arguments))}),e.attempt(function(){d.apply(a,f)})}).bind(a,h),a[g].options=c}}},36205:(a,b,c)=>{"use strict";c.d(b,{TQ:()=>e,p1:()=>d});let d=92;function e(a,b=d,c=40){return Object.freeze({terminal:Object.freeze({columns:b,rows:c,kittyProtocolActive:!1}),requestRender:a})}},36561:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{$9:()=>h,Ds:()=>k,J1:()=>i,eD:()=>j});var e=c(75430),f=c(76760),g=a([e]);e=(g.then?(await g)():g)[0];let l="pi-web-project-command-environment",m=`<inline:${l}>`;function h(a,b=process.platform){let c={...a};for(let a of Object.keys(c))(function(a,b){let c="win32"===b?a.toUpperCase():a;return"PORT"===c||"NODE_ENV"===c||c.startsWith("NEXT_")||"PI_WEB_PASSWORD"===c})(a,b)&&delete c[a];return c}function i(a={}){let{abortSettleGraceMs:b=1e3,agentBinDir:c=(0,f.join)((0,e.getAgentDir)(),"bin"),baseEnvironment:d=process.env,localOperations:g=(0,e.createLocalBashOperations)({shellPath:a.shellPath}),platform:j=process.platform}=a;return{exec(a,e,f){var i;let k,l,m,n=(i=h(f.env??d,j),k="win32"===j?Object.keys(i).find(a=>"PATH"===a.toUpperCase())??"PATH":"PATH",l="win32"===j?";":":",(m=i[k]??"").split(l).filter(Boolean).includes(c)||(i[k]=[c,m].filter(Boolean).join(l)),i),{onData:o,signal:p,timeout:q}=f,r=!1,s=g.exec(a,e,{...f,env:n,onData:a=>{r||o(a)}}),t="number"==typeof q&&Number.isFinite(q)&&q>0?1e3*q:void 0;return p||void 0!==t?new Promise((a,c)=>{let d=[],e=()=>{for(let a of(r=!0,d))clearTimeout(a);p?.removeEventListener("abort",g)},f=(a,b)=>{d.push(setTimeout(()=>{e(),c(b)},Math.min(a,0x7fffffff)))},g=()=>f(b,Error("aborted"));void 0!==t&&f(t+b,Error(`timeout:${q}`)),s.then(b=>{e(),a(b)},a=>{e(),c(a)}),p?.aborted?g():p?.addEventListener("abort",g,{once:!0})}):s}}}function j(a){return{name:l,hidden:!0,factory:b=>{let c=(0,e.createBashToolDefinition)(a.cwd);b.registerTool({...c,defaultActive:!1,execute:(b,c,d,f,g)=>(0,e.createBashToolDefinition)(a.cwd,{commandPrefix:a.settings.getShellCommandPrefix(),operations:i({shellPath:a.settings.getShellPath()})}).execute(b,c,d,f,g)})}}}function k(a){let b=a.extensions.findIndex(a=>a.path===m);if(b<0)return a;let c=a.extensions.slice(0,b).find(a=>a.tools.has("bash"));return c?{...a,extensions:a.extensions.filter((a,c)=>c!==b),errors:a.errors.filter(a=>a.path!==m||a.error!==`Tool "bash" conflicts with ${c.path}`)}:a}d()}catch(a){d(a)}})},38015:(a,b,c)=>{"use strict";function d(a,b,c){let d=new Set,e=!1;for(let f of a.split(",")){let a,g;if(""===f)return null;let h=f.match(/^(.+?)(?:\/(\d+))?$/);if(!h)return null;let i=h[1],j=void 0!==h[2]?Number(h[2]):1;if(!Number.isInteger(j)||j<1)return null;if("*"===i)a=b,g=c,1===j&&(e=!0);else{let d=i.match(/^(\d+)(?:-(\d+))?$/);if(!d||(a=Number(d[1]),g=void 0!==d[2]?Number(d[2]):a,a<b||g>c||a>g))return null}for(let b=a;b<=g;b+=j)d.add(b)}return 0===d.size?null:{values:d,unrestricted:e}}function e(a){let b=a.trim().split(/\s+/);if(5!==b.length)return null;let c=d(b[0],0,59),e=d(b[1],0,23),f=d(b[2],1,31),g=d(b[3],1,12),h=d(b[4],0,6);return c&&e&&f&&g&&h?{minutes:c,hours:e,doms:f,months:g,dows:h}:null}c.d(b,{Lk:()=>n,ns:()=>m});let f=new Map,g=new Map,h={Sun:0,Mon:1,Tue:2,Wed:3,Thu:4,Fri:5,Sat:6};function i(a,b){let c,d=(!(c=f.get(a))&&(c=new Intl.DateTimeFormat("en-US",{timeZone:a,year:"numeric",month:"2-digit",day:"2-digit",weekday:"short"}),f.set(a,c)),c).formatToParts(new Date(b)),e=g.get(a);e||(e=new Intl.DateTimeFormat("en-US",{timeZone:a,hour:"2-digit",minute:"2-digit",hour12:!1}),g.set(a,e));let i=e.formatToParts(new Date(b)),j=(a,b)=>Number(a.find(a=>a.type===b)?.value??"0"),k=j(i,"hour");24===k&&(k=0);let l=h[d.find(a=>"weekday"===a.type)?.value??""];return void 0===l?null:{year:j(d,"year"),month:j(d,"month"),day:j(d,"day"),hour:k,minute:j(i,"minute"),dow:l}}function j(a){let b=a.month<=2?a.year-1:a.year,c=Math.floor(b/400),d=b-400*c,e=a.month;return(24*(146097*c+(365*d+Math.floor(d/4)-Math.floor(d/100)+(Math.floor((153*(e+(e>2?-3:9))+2)/5)+a.day-1))-719468)+a.hour)*60+a.minute}function k(a){let b=Math.floor(a/1440),c=a-1440*b,d=b+719468,e=Math.floor(d/146097),f=d-146097*e,g=Math.floor((f-Math.floor(f/1460)+Math.floor(f/36524)-Math.floor(f/146096))/365),h=g+400*e,i=f-(365*g+Math.floor(g/4)-Math.floor(g/100)),j=Math.floor((5*i+2)/153),k=i-Math.floor((153*j+2)/5)+1,l=j+(j<10?3:-9);return{year:l<=2?h+1:h,month:l,day:k,hour:Math.floor(c/60),minute:c%60,dow:(b%7+7+4)%7}}function l(a){try{return new Intl.DateTimeFormat("en-US",{timeZone:a}),!0}catch{return!1}}function m(a,b){if("at"===a.kind)return a.atMs>b?a.atMs:null;if("every"===a.kind)return!Number.isFinite(a.everyMs)||a.everyMs<=0?null:b-b%a.everyMs+a.everyMs;let c=e(a.expr);if(!c)return null;let d=a.tz&&""!==a.tz.trim()?a.tz:"UTC";if(!l(d))return null;let f=i(d,b);if(!f)return null;let g=j(f)+1,h=g+2108160;for(;g<=h;g++)if(function(a,b){if(!a.months.values.has(b.month))return!1;let c=!a.doms.unrestricted,d=!a.dows.unrestricted,e=a.doms.values.has(b.day),f=a.dows.values.has(b.dow);if(c&&d){if(!e&&!f)return!1}else if(c){if(!e)return!1}else if(d&&!f)return!1;return a.hours.values.has(b.hour)&&a.minutes.values.has(b.minute)}(c,k(g)))return function(a,b){let c=Date.UTC(b.year,b.month-1,b.day,b.hour,b.minute);for(let d=0;d<2;d++){let d=i(a,c);if(!d)break;let e=j(b)-j(d);if(0===e)break;c+=6e4*e}return c}(d,k(g));return null}function n(a){return"at"===a.kind?Number.isFinite(a.atMs)?null:"atMs must be a number":"every"===a.kind?!Number.isFinite(a.everyMs)||a.everyMs<6e4?"everyMs must be at least one minute":null:e(a.expr)?l(a.tz&&""!==a.tz.trim()?a.tz:"UTC")?null:"unknown timezone":"not a five-field cron expression"}},38222:(a,b,c)=>{"use strict";c.d(b,{b5:()=>k,dS:()=>i,vw:()=>j});var d=c(51149);let e="pi-web:tool-selection",f=new Set(d.C1),g=Symbol("cleared-tool-selection");function h(a){return"object"!=typeof a||null===a||Array.isArray(a)||1!==a.version?void 0:!0===a.cleared?g:!Array.isArray(a.tools)||a.tools.some(a=>"string"!=typeof a||!f.has(a))?void 0:[...new Set(a.tools)]}function i(a){for(let b=a.length-1;b>=0;b-=1){let c=a[b];if("custom"!==c.type||c.customType!==e)continue;let d=h(c.data);if(void 0!==d)return d===g?void 0:d}}function j(a){let b=h({version:1,tools:a});if(void 0===b||b===g)throw Error("toolNames must contain only built-in tool names");return b}function k(a,b){a.appendCustomEntry(e,{version:1,tools:[...b]})}},38598:(a,b,c)=>{"use strict";function d(a,b){if("string"!=typeof a||0===a.trim().length)throw Error(`Session liveness provider ${b} must be a non-empty string`)}c.d(b,{Vj:()=>f});let e=function(){let a,b=globalThis,c=Symbol.for("@agegr/pi-web/session-liveness/v1"),e=b[c];if(e&&"object"==typeof e&&1===e.version&&"function"==typeof e.register&&"function"==typeof e.hasActiveProvider)return e;let f=(a=new Map,{version:1,register(b){if(!b||"object"!=typeof b)throw Error("Session liveness provider must be an object");if(d(b.name,"name"),d(b.sessionId,"sessionId"),void 0!==b.sessionFile&&d(b.sessionFile,"sessionFile"),"function"!=typeof b.isActive)throw Error("Session liveness provider isActive must be a function");let c=Symbol(b.name);a.set(c,b);let e=!1;return()=>{e||(e=!0,a.delete(c))}},hasActiveProvider(b){let c=new Set([b.sessionId,b.sessionFile].filter(a=>!!a));for(let b of a.values())if(c.has(b.sessionId)||b.sessionFile&&c.has(b.sessionFile))try{let a=b.isActive();if("boolean"!=typeof a)throw Error("isActive() must return a boolean");if(a)return!0}catch(a){return console.error(`[pi-web] Session liveness provider '${b.name}' failed; preserving the session:`,a),!0}return!1}});return b[c]=f,f}();function f(a){return e.hasActiveProvider(a)}},40762:(a,b,c)=>{"use strict";c.d(b,{Ox:()=>i,QG:()=>j,Wv:()=>h,jN:()=>l,vH:()=>k});var d=c(29021),e=c(33873),f=c(89420),g=c(97136);let h=8,i=524288;function j(a){let b=a?.contextWindow;if(!a||!b||b<0)return{};let c=Math.floor(4*b/10);return c<i?{maxBytes:c,model:`${a.provider}/${a.id}`}:{}}function k(a,b,c={}){let j=c.maxBytes??i;if(b.length>h)throw Error(`Agent input_files accepts at most ${h} files`);let l=(0,d.realpathSync)(a),m=new Set([l]),n=new TextDecoder("utf-8",{fatal:!0}),o=new Set,p=[],q=0;for(let h of b){let b,i;if(!h.trim())throw Error("Agent input_files paths must not be empty");try{b=(0,d.realpathSync)((0,e.resolve)(a,h))}catch{throw Error(`Agent input file does not exist: ${h}`)}if(!(0,f.o4)(b,m))throw Error(`Agent input file is outside the session cwd: ${h}`);if(!(0,d.statSync)(b).isFile())throw Error(`Agent input path is not a file: ${h}`);if(o.has(b))continue;o.add(b);let k=(0,d.readFileSync)(b);if((q+=k.byteLength)>j){let a=c.model?` for ${c.model}, about a tenth of its context window`:"";throw Error(`Agent input_files exceeds the ${j<1024?`${j}-byte`:`${Math.floor(j/1024)} KB`} total limit${a}. Pass fewer or smaller files, or name the paths in prompt if the subagent can read them.`)}try{i=n.decode(k)}catch{throw Error(`Agent input file is not valid UTF-8 text: ${h}`)}p.push({path:(0,g.W3)((0,e.relative)(l,b)),content:i})}return p}function l(a,b){if(0===b.length)return a;let c=b.map(a=>`<document path=${JSON.stringify(a.path)}>
12
12
  ${a.content}
13
13
  </document>`).join("\n\n");return`${a}
14
14
 
15
15
  <documents>
16
16
  ${c}
17
- </documents>`}},42267:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{lB:()=>q});var e=c(29021),f=c(33873),g=c(51181),h=c.n(g),i=c(90053),j=c(73706),k=c(94523),l=c(3622),m=c(57432),n=a([m]);function o(){return(0,f.join)((0,m.$M)(),"web-push.json")}m=(n.then?(await n)():n)[0];function p(a,b){if("zh-CN"===a){let a=l.O.messages["sessionComplete"===b?"i18n.sessionComplete":"i18n.taskFinished"];if(a)return a}return k.Q.messages["sessionComplete"===b?"i18n.sessionComplete":"i18n.taskFinished"]??("sessionComplete"===b?"Session complete":"Task finished.")}async function q(a,b){let c=await (!globalThis.__piWebPushNotifier&&(globalThis.__piWebPushNotifier=Promise.resolve().then(()=>{var a;let b,c,d;return b=(a={async send(a,b,c){let d;await h().sendNotification({endpoint:a.endpoint,keys:a.keys},b,{vapidDetails:{subject:(d=process.env.PI_WEB_PUSH_SUBJECT?.trim())||i.TB,publicKey:c.publicKey,privateKey:c.privateKey},TTL:2419200,urgency:"high"})},loadState(){let a=o();if(!(0,e.existsSync)(a))return null;try{return JSON.parse((0,e.readFileSync)(a,"utf8"))}catch{return null}},saveState(a){let b=o();(0,e.mkdirSync)((0,f.dirname)(b),{recursive:!0}),(0,j.$)(b,JSON.stringify(a))},generateVapidKeys:()=>h().generateVAPIDKeys()}).loadState(),c=b?.vapidKeys?.publicKey&&b.vapidKeys.privateKey?b:{vapidKeys:a.generateVapidKeys(),subscriptions:[]},d=()=>{a.saveState(c)},{getVapidPublicKey:()=>(d(),c.vapidKeys.publicKey),addSubscription(a){c.subscriptions=[...c.subscriptions.filter(b=>b.endpoint!==a.endpoint),a],d()},async notifySessionComplete(b,e){if(0===c.subscriptions.length)return;let f=a=>({title:e??p(a,"sessionComplete"),body:p(a,"taskFinished"),url:`/?session=${encodeURIComponent(b)}`,tag:`pi-session-complete:${b}`}),g=!1;for(let b of[...c.subscriptions])try{await a.send(b,JSON.stringify(f(b.locale)),c.vapidKeys)}catch(d){let a=function(a){if("object"!=typeof a||null===a||!("statusCode"in a))return;let b=a.statusCode;return"number"==typeof b?b:void 0}(d);(404===a||410===a)&&(c.subscriptions=c.subscriptions.filter(a=>a.endpoint!==b.endpoint),g=!0)}g&&d()}}})),globalThis.__piWebPushNotifier);await c.notifySessionComplete(a,b)}d()}catch(a){d(a)}})},43888:(a,b,c)=>{"use strict";c.d(b,{$:()=>f});var d=c(76760),e=c.n(d);function f(a,b=process.platform){let c="win32"===b?e().win32.normalize(a):e().posix.normalize(a);return"win32"===b?c.toLowerCase():c}},43946:(a,b,c)=>{"use strict";let d=c(95415);a.exports={toPromise:function(a){return(...b)=>new Promise((c,d)=>{b.push((a,b)=>{a?d(a):c(b)}),a(...b)})},toSync:function(a){return(...b)=>{let c,d;if(b.push((a,b)=>{c=a,d=b}),a(...b),c)throw c;return d}},toSyncOptions:function(a){var b;let c;if((a={...a}).fs=(c={...b=a.fs||d},["mkdir","realpath","stat","rmdir","utimes"].forEach(a=>{c[a]=(...c)=>{let d,e=c.pop();try{d=b[`${a}Sync`](...c)}catch(a){return e(a)}e(null,d)}}),c),"number"==typeof a.retries&&a.retries>0||a.retries&&"number"==typeof a.retries.retries&&a.retries.retries>0)throw Object.assign(Error("Cannot use retries with the sync api"),{code:"ESYNC"});return a}}},44449:(a,b,c)=>{var d=c(27910).Stream;a.exports=function(a){return{ReadStream:function b(c,e){if(!(this instanceof b))return new b(c,e);d.call(this);var f=this;this.path=c,this.fd=null,this.readable=!0,this.paused=!1,this.flags="r",this.mode=438,this.bufferSize=65536;for(var g=Object.keys(e=e||{}),h=0,i=g.length;h<i;h++){var j=g[h];this[j]=e[j]}if(this.encoding&&this.setEncoding(this.encoding),void 0!==this.start){if("number"!=typeof this.start)throw TypeError("start must be a Number");if(void 0===this.end)this.end=1/0;else if("number"!=typeof this.end)throw TypeError("end must be a Number");if(this.start>this.end)throw Error("start must be <= end");this.pos=this.start}null!==this.fd?process.nextTick(function(){f._read()}):a.open(this.path,this.flags,this.mode,function(a,b){if(a){f.emit("error",a),f.readable=!1;return}f.fd=b,f.emit("open",b),f._read()})},WriteStream:function b(c,e){if(!(this instanceof b))return new b(c,e);d.call(this),this.path=c,this.fd=null,this.writable=!0,this.flags="w",this.encoding="binary",this.mode=438,this.bytesWritten=0;for(var f=Object.keys(e=e||{}),g=0,h=f.length;g<h;g++){var i=f[g];this[i]=e[i]}if(void 0!==this.start){if("number"!=typeof this.start)throw TypeError("start must be a Number");if(this.start<0)throw Error("start must be >= zero");this.pos=this.start}this.busy=!1,this._queue=[],null===this.fd&&(this._open=a.open,this._queue.push([this._open,this.path,this.flags,this.mode,void 0]),this.flush())}}}},45211:a=>{"use strict";a.exports=function(a){if(null===a||"object"!=typeof a)return a;if(a instanceof Object)var c={__proto__:b(a)};else var c=Object.create(null);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c};var b=Object.getPrototypeOf||function(a){return a.__proto__}},46487:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{registerNodeInstrumentation:()=>j});var e=c(2702),f=c(77417),g=c(79604),h=c(24989),i=a([g,h]);function j(){(0,e.kU)((0,e.AG)());let a=()=>(0,f.qF)();process.on("SIGINT",a),process.on("SIGTERM",a),Promise.resolve().then(c.bind(c,75430)).catch(()=>{}),(0,g.j)().catch(a=>{console.warn(`[pi-web] starting the telegram runtime failed: ${a instanceof Error?a.message:String(a)}`)}),(0,h.Ei)()}[g,h]=i.then?(await i)():i,d()}catch(a){d(a)}})},49325:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{fR:()=>m,lL:()=>j,zE:()=>k});var e=c(75430),f=c(11124);c(68377),c(95655);var g=c(89076),h=c(52552),i=a([e,g,h]);[e,g,h]=i.then?(await i)():i;let n="from shell command: ";function j(a,b){var c;return c=b(a.slice(0,65536)),c.length>2e3?`${c.slice(0,1999)}…`:c}function k(a,b){return b(a.slice(-65536)).slice(-2e3)}let o=/^(?:bearer|basic|token)$/i;function l(a){return a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function m(a,b,c,d=[]){let e=new Map,h=(a,b,c)=>{let d=e.get(a);d&&(!d.word||c)||e.set(a,{raw:a,shown:b,word:c})},i=a=>{if(void 0===a)return;let b=a.trim();for(let a of(b.length>=6&&h(b,f.Q6,!1),b.split(/\s+/)))a!==b&&a.length>=6&&!o.test(a)&&h(a,f.Q6,!0)},j=(a,b)=>{b.masked&&a.length>=6&&h(a,b.value,!1)};for(let{value:b}of(0,g.xW)(a))if(c.isCommandConfigValue(b)){let a=b.slice(1);a.trim()&&h(`${n}${a}`,`${n}${f.Q6}`,!1),a.trim().length>=6&&h(a.trim(),f.Q6,!0)}else(0,f.yQ)(b)||i(b);let k=b.map(a=>a.options??{});if("url"in a){for(let a of k)for(let b of Object.values(a.headers??{}))i(b);j(a.url,(0,f.yP)(a.url));try{let b=new URL(a.url).href;b!==a.url&&j(b,(0,f.yP)(b))}catch{}for(let b of(0,f.Yh)(a.url))i(b)}else{for(let b of k)for(let c of Object.keys(a.env??{}))i(b.env?.[c]);for(let b of(j(a.command,(0,f.Iq)(a.command)),(0,f.Wy)(a.command)))i(b);let b=a.args??[],c=(0,f.oF)(b).args;for(let a of(b.forEach((a,b)=>j(a,{value:c[b]??f.Q6,masked:c[b]!==a})),(0,f.DA)(b)))i(a)}for(let a of d)i(a);let p=[...e.values()].sort((a,b)=>b.raw.length-a.raw.length).map(({raw:a,shown:b,word:c})=>({shown:b,pattern:RegExp(c?`(?<![A-Za-z0-9_])${l(a)}(?![A-Za-z0-9_])`:l(a),"g")}));return a=>p.reduce((a,{pattern:b,shown:c})=>a.replace(b,()=>c),a)}Symbol.for("pi-web:mcp-test-flights"),Symbol.for("pi-web:mcp-test-command-queue"),d()}catch(a){d(a)}})},51149:(a,b,c)=>{"use strict";c.d(b,{C1:()=>e,kU:()=>d});let d=["read","grep","find","ls"],e=["bash","read","edit","write","grep","find","ls"];[...e]},52552:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{nx:()=>h});var e=c(75430);c(77598);var f=c(96452),g=a([e,f]);function h(){globalThis.__piWebSharedModelRuntime=void 0}[e,f]=g.then?(await g)():g,Symbol.for("pi-web:shared-model-runtime-refresh"),d()}catch(a){d(a)}})},52633:(a,b,c)=>{"use strict";c.d(b,{vN:()=>e,vR:()=>f});let d=["enabled","exposure","toolExposure"];function e(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)&&void 0===a.command&&void 0===a.url&&void 0===a.type}function f(a,b,c){return c?Object.keys(b).some(a=>!d.includes(a))?`server "${a}": an override can only set ${d.join(", ")}`:void 0:`server "${a}" needs "command" or "url", or a global server to override`}},53481:a=>{a.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"],"win32"!==process.platform&&a.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT"),"linux"===process.platform&&a.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")},56479:(a,b,c)=>{"use strict";c.d(b,{T:()=>f,y:()=>g});var d=c(73024);let e=d.constants.O_RDONLY|(d.constants.O_NONBLOCK||0),f=1048576;function g(a,b){let c;try{c=(0,d.openSync)(a,e)}catch(b){let a;if("ENOENT"===(a=b?.code)||"ENOTDIR"===a)return;throw b}try{let e=(0,d.fstatSync)(c);if(!e.isFile())throw Error(`${a} is not a regular file`);if(void 0===b)return(0,d.readFileSync)(c,"utf8");if(e.size>b)throw Error(`${a} is larger than ${b} bytes`);let f=b+1,g=[],h=0;for(;h<f;){let a=Buffer.alloc(Math.min(f-h,65536)),b=(0,d.readSync)(c,a,0,a.length,null);if(0===b)break;g.push(a.subarray(0,b)),h+=b}if(h>b)throw Error(`${a} is larger than ${b} bytes`);return Buffer.concat(g,h).toString("utf8")}finally{(0,d.closeSync)(c)}}},57290:(a,b,c)=>{"use strict";c.d(b,{H:()=>g});var d=c(21820),e=c(33873),f=c.n(e);function g(a=new Date,b=(0,d.homedir)()){return f().join(b,"pi-cwd",function(a=new Date){let b=a.getFullYear(),c=String(a.getMonth()+1).padStart(2,"0"),d=String(a.getDate()).padStart(2,"0");return`${b}${c}${d}`}(a))}},57432:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{$M:()=>e.getAgentDir,H6:()=>s,O8:()=>D,Vg:()=>E,mD:()=>A,os:()=>C});var e=c(75430),f=c(29021),g=c(79748),h=c(33873),i=c(35618),j=c(43888),k=c(19050);c(76155);var l=c(61175),m=c(66192),n=c(94343),o=a([e,m,n]);function p(a,b,c){let d=(0,f.openSync)(a,"r");try{let a=[],e=0,g=0,h=!1;for(;e<b&&g<c;){let i=Buffer.allocUnsafe(Math.min(4096,b-e)),j=(0,f.readSync)(d,i,0,i.length,e);if(0===j){h=!0;break}e+=j;let k=i.subarray(0,j),l=k.length;for(let a=0;a<k.length;a+=1)if(10===k[a]&&(g+=1)===c){l=a+1;break}a.push(k.subarray(0,l))}let i=Buffer.concat(a).toString("utf8"),j=i.split("\n");return h||i.endsWith("\n")||j.pop(),""===j.at(-1)&&j.pop(),j.map(a=>a.endsWith("\r")?a.slice(0,-1):a)}finally{(0,f.closeSync)(d)}}function q(a,b){let c=(0,f.openSync)(a,"r");try{let a=(0,f.fstatSync)(c).size,d=Math.max(0,a-b),e=Buffer.allocUnsafe(a-d),g=(0,f.readSync)(c,e,0,e.length,d);if(0===g)return[];let h=e.subarray(0,g).toString("utf8").split("\n");if(d>0){let a=Buffer.allocUnsafe(1);(0,f.readSync)(c,a,0,1,d-1),10!==a[0]&&h.shift()}return""===h.at(-1)&&h.pop(),h.map(a=>a.endsWith("\r")?a.slice(0,-1):a)}finally{(0,f.closeSync)(c)}}function r(a){return a.flatMap(a=>{try{return[JSON.parse(a)]}catch{return[]}})}function s(a){let b;if(a){try{b=q(a,65536)}catch{return}for(let a=b.length-1;a>=0;a-=1){let c=function(a){try{let b=JSON.parse(a);if("session"===b.type)return;return"string"==typeof b.id&&b.id?b.id:void 0}catch{return}}(b[a]);if(c)return c}}}async function t(a){let b=[...new Set(a.map(a=>a.cwd).filter(Boolean))],c=new Map;return await Promise.all(b.map(async a=>{c.set(a,await (0,l.KI)(a))})),a.map(a=>{let b=a.cwd?c.get(a.cwd):void 0,d=b?.projectRoot??a.cwd;return{...a,projectRoot:d,projectKey:(0,i.z)(d),...b?.branch?{branch:b.branch}:{},...b?.isWorktree?{isWorktree:!0}:{}}})}[e,m,n]=o.then?(await o)():o;let F=new WeakMap;async function u(a){let b=new Map;for(let c of a)b.set((0,j.$)(c.path),c.id);return t(a.map(a=>(function(a,b){D(a.id,a.path);let{originSessionId:c,subagent:d}=function(a,b){let c=a.parentSessionPath?b.get((0,j.$)(a.parentSessionPath)):void 0;if(!a.parentSessionPath)return{originSessionId:c,subagent:null};let d=F.get(a);if(void 0!==d)return{originSessionId:c,subagent:d};try{var e;let b,d=(0,m.$u)((e=a.path,(b=r(p(e,262144,2).slice(1))).some(a=>"custom"===a.type&&a.customType===m.tP)?[...b,...r(q(e,262144))]:b),a.id,a.path);return F.set(a,d),{originSessionId:c,subagent:d}}catch{return{originSessionId:c,subagent:null}}}(a,b),e=!0===a.detailsPending;return{path:a.path,id:a.id,cwd:a.cwd,name:a.name,created:a.created.toISOString(),modified:a.modified.toISOString(),messageCount:a.messageCount,firstMessage:e&&!a.firstMessage?"":function(a){let b=(0,k.d)(a)??a;if(b.length<=500)return b;let c=b.charCodeAt(499);return b.slice(0,c>=55296&&c<=56319?499:500)}(a.firstMessage||"(no messages)"),parentSessionId:c,...d?{relation:{kind:"subagent",parentSessionId:d.parentSessionId,profile:d.profile,description:d.description,status:d.status}}:a.parentSessionPath?{relation:{kind:"fork",...c?{originSessionId:c}:{}}}:{},transient:!1,...e?{detailsPending:!0}:{}}})(a,b)))}async function v(){return u(await (0,n.q8)())}async function w(a={}){a.force&&A();let b=globalThis.__piSessionListGeneration??0,c=globalThis.__piSessionListCache;if(c&&c.generation===b&&Date.now()-c.ts<G)return c.data;if(a.allowStale&&c)return w().catch(()=>void 0),c.data;if(globalThis.__piSessionListPromise&&globalThis.__piSessionListPromiseGeneration===b)return globalThis.__piSessionListPromise;let d=v().then(a=>(globalThis.__piSessionListGeneration??0)!==b?w():(globalThis.__piSessionListCache={data:a,ts:Date.now(),generation:b},a)).finally(()=>{globalThis.__piSessionListPromise===d&&(globalThis.__piSessionListPromise=void 0,globalThis.__piSessionListPromiseGeneration=void 0)});return globalThis.__piSessionListPromise=d,globalThis.__piSessionListPromiseGeneration=b,d}let G=3e4,H=/^[A-Za-z0-9](?:[A-Za-z0-9._-]*[A-Za-z0-9])?$/;function x(){return(0,h.join)((0,e.getAgentDir)(),"sessions")}function y(a,b=(0,h.resolve)(x())){let c=(0,h.resolve)(a),d=(0,h.relative)(b,c);return""===d||".."===d||d.startsWith(`..${h.sep}`)||(0,h.isAbsolute)(d)?null:c}async function z(a){let b,c;if(!H.test(a))return null;let d=(0,h.resolve)(x());try{b=await (0,g.readdir)(d,{withFileTypes:!0})}catch{return null}let e=`_${a}.jsonl`;for(let f of b){let b;if(!f.isDirectory()&&!f.isSymbolicLink())continue;let i=y((0,h.join)(d,f.name),d);if(i){try{b=await (0,g.readdir)(i)}catch{continue}for(let f of b){if(!f.endsWith(e))continue;let b=y((0,h.join)(i,f),d);if(b){try{if(function(a){let b=p(a,65536,1)[0]?.trimEnd();if(!b)return null;try{let a=JSON.parse(b);return"session"===a.type?a:null}catch{return null}}(b)?.id!==a)continue}catch{continue}if(c&&c!==b)return null;c=b}}}}return c??null}function A(){globalThis.__piSessionListGeneration=(globalThis.__piSessionListGeneration??0)+1}function B(){return globalThis.__piSessionPathCache||(globalThis.__piSessionPathCache=new Map),globalThis.__piSessionPathCache}async function C(a){let b=B().get(a);if(b)return b;let c=await z(a);return c?D(a,c):await w(),B().get(a)??null}function D(a,b){let c=(0,h.normalize)(b),d=(0,j.$)(c),e=B(),f=(globalThis.__piPathToSessionIdCache||(globalThis.__piPathToSessionIdCache=new Map),globalThis.__piPathToSessionIdCache),g=e.get(a),i=g?(0,j.$)(g):void 0,k=f.get(d),l=k?e.get(k):void 0;i&&i!==d&&f.get(i)===a&&f.delete(i),k&&k!==a&&l&&(0,j.$)(l)===d&&e.delete(k),e.set(a,c),f.set(d,a)}function E(a){for(let b=a.length-1;b>=0;b--){let c=a[b];if("model_change"===c.type)return{provider:c.provider,modelId:c.modelId}}return null}d()}catch(a){d(a)}})},57616:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{Db:()=>w,M7:()=>x,n7:()=>y});var e=c(76760),f=c(75430),g=c(4775),h=c(89076),i=c(29299),j=c(35234),k=c(56479),l=a([f,g,h,i,j]);[f,g,h,i,j]=l.then?(await l)():l;let z="PI_WEB_DISABLE_MCP";function m(a=process.env){let b=a[z]?.trim().toLowerCase();return void 0!==b&&""!==b&&"0"!==b&&"false"!==b}async function n(){let a;if(await (0,f.createCodemodeExtension)({models:!1})({registerTool:b=>{a=b},getSettings:()=>({}),getAllTools:()=>[],appendEntry:()=>{}}),!a)throw Error("the codemode extension registered no tool");return a}async function o(a={}){let b,c=a.timeoutMs??1e4,d=new AbortController,e=new Promise((a,e)=>{b=setTimeout(()=>{d.abort(),e(Error(`the sandbox did not answer within ${c} ms`))},c),b.unref?.()});try{let b=(async()=>{let b=await (a.createDefinition??n)();return await b.execute("pi-web-self-test",{code:"return 6 * 7"},d.signal,void 0,void 0)})();b.catch(()=>{});let c=await Promise.race([b,e]),f=(c.content??[]).flatMap(a=>"text"===a.type&&void 0!==a.text?[a.text]:[]);if(c.isError)return{available:!1,reason:`the self-test script failed: ${f.join(" ").trim()||"no output"}`};if(!f.some(a=>"42"===a.trim()))return{available:!1,reason:`the self-test script returned ${JSON.stringify(f.join(" ").trim())}`};return{available:!0}}catch(a){return{available:!1,reason:a instanceof Error?a.message:String(a)}}finally{clearTimeout(b)}}let A=Symbol.for("pi-web.codemodeSandbox");function p(){let a=globalThis;return a[A]??=o().then(a=>(a.available||console.warn(`[pi-web] Code mode is off: ${a.reason}`),a))}Symbol("not settled");let B=Symbol.for("pi-web.mcpOffWarned");async function q(){let a=function(a,b=process.env){return m(b)?{available:!1,reason:`${z} is set`}:a.ok?{available:!0,internals:a}:{available:!1,reason:a.reason}}(await (0,i.U)()),b=globalThis;return a.available||m()||b[B]===a.reason||(b[B]=a.reason,console.warn(`[pi-web] MCP is off: ${a.reason}`)),a}let C=["codemode","tool-search","mcp"];function r(a,b){let c,d=(0,k.y)(a,b);if(void 0===d)return;try{c=JSON.parse(65279===d.charCodeAt(0)?d.slice(1):d)}catch{return}let e="object"==typeof c&&null!==c?c.extensions:void 0;return Array.isArray(e)?e.filter(a=>"string"==typeof a):void 0}async function s(a,b,c){let{agentDir:d,cwd:e,projectTrusted:g}=a,h=new f.DefaultPackageManager({cwd:e,agentDir:d,settingsManager:f.SettingsManager.fromStorage({withLock:(a,c)=>{let d=b[a];c(d?JSON.stringify({extensions:d}):void 0)}},{projectTrusted:g}),builtinExtensions:[...C]}),i=await h.resolve(async()=>"skip"),j={};for(let a of C){let b=i.extensions.find(b=>b.path===`builtin:${a}`),d=b?.enabled??!0;j[a]=d?{enabled:d}:{enabled:d,settingsPath:b?.metadata.scope==="project"?c.project:c.global}}return j}async function t(a){let{agentDir:b}=a,c=void 0!==a.cwd&&a.projectTrusted,d=a.cwd??b,g={global:(0,e.join)(b,"settings.json"),project:(0,e.join)(d,f.CONFIG_DIR_NAME,"settings.json")},h=r(g.global),i=c?r(g.project,k.T):void 0,j=await s({agentDir:b,cwd:d,projectTrusted:c},{global:h,project:i},g);if(void 0===i)return j;let l=await s({agentDir:b,cwd:d,projectTrusted:!1},{global:h},g);for(let a of C)j[a].global=l[a];return j}let D=()=>{};function u(a,b){return{name:a,factory:b,replaceable:!0,builtin:!0}}function v(a,b){let c=b.gate??((a,b)=>b),d=a.available?new g.nx({...b.mcpHost,agentDir:b.agentDir,internals:a.internals,codemodeAvailable:b.codemodeAvailable}):void 0,e=[u("tool-search",c("tool-search",(0,f.createToolSearchExtension)())),u("mcp",c("mcp",a.available&&d?(0,f.createMcpExtension)({loadConfig:function(a,b,c=a=>(0,j.n)(a,b)){return d=>{let e;try{e=a.loadMcpConfig({agentDir:b,cwd:d.cwd,projectTrusted:c(d.cwd)}).autoEnableCodemode}catch{}return{servers:[],errors:[],...void 0===e?{}:{autoEnableCodemode:e}}}}(a.internals,b.agentDir),createTransport:d.wrapTransportFactory((0,h.Pn)(a.internals)),startupWaitMs:0,openUrl:()=>{}}):D))];return d&&e.push(d.extension()),{extensions:e,mcpHost:d}}async function w(a){let b=await p();if(!b.available)throw Error(`Code mode is unavailable: ${b.reason}`);let c=(0,f.createCodemodeExtension)();return{name:"codemode",replaceable:!0,factory:async b=>{(await t({agentDir:a.agentDir,cwd:a.cwd,projectTrusted:a.projectTrusted()})).codemode.enabled&&await c(b)}}}async function x(a){return v(await q(),{agentDir:a.agentDir,codemodeAvailable:()=>a.codemode,...a.mcpHost?{mcpHost:a.mcpHost}:{},gate:(b,c)=>async d=>{(await t({agentDir:a.agentDir,cwd:a.cwd,projectTrusted:a.projectTrusted()}))[b].enabled&&await c(d)}})}async function y(a){let[b,c]=await Promise.all([p(),q()]),{extensions:d,mcpHost:e}=v(c,{agentDir:a.agentDir,codemodeAvailable:()=>b.available,...a.mcpHost?{mcpHost:a.mcpHost}:{}});return{extensions:[u("codemode",b.available?(0,f.createCodemodeExtension)():D),...d],mcpHost:e}}d()}catch(a){d(a)}})},57719:(a,b,c)=>{"use strict";c.d(b,{Hh:()=>ba});var d=Symbol("NOT_RESOLVED");function e(a,b){return{tagName:a,nodeKind:"scalar",implicit:b.implicit??!1,matchByTagPrefix:b.matchByTagPrefix??!1,implicitFirstChars:b.implicitFirstChars??null,resolve:b.resolve,identify:b.identify,represent:b.represent??(a=>String(a)),representTagName:b.representTagName??(()=>a)}}function f(a,b){let c=void 0===b.finalize;return{tagName:a,nodeKind:"sequence",implicit:!1,matchByTagPrefix:b.matchByTagPrefix??!1,create:b.create,addItem:b.addItem,finalize:b.finalize??(a=>a),carrierIsResult:c,identify:b.identify,represent:b.represent??(a=>a),representTagName:b.representTagName??(()=>a)}}function g(a,b){let c=void 0===b.finalize;return{tagName:a,nodeKind:"mapping",implicit:!1,matchByTagPrefix:b.matchByTagPrefix??!1,create:b.create,addPair:b.addPair,has:b.has,keys:b.keys,get:b.get,finalize:b.finalize??(a=>a),carrierIsResult:c,identify:b.identify,represent:b.represent??(a=>a),representTagName:b.representTagName??(()=>a)}}var h=e("tag:yaml.org,2002:str",{resolve:a=>a,identify:a=>"string"==typeof a}),i=["","~","null","Null","NULL"],j=e("tag:yaml.org,2002:null",{implicit:!0,implicitFirstChars:["","~","n","N"],resolve:a=>-1!==i.indexOf(a)?null:d,identify:a=>null===a,represent:()=>"null"}),k=e("tag:yaml.org,2002:null",{implicit:!0,implicitFirstChars:["n"],resolve:(a,b)=>"null"===a||b&&""===a?null:d,identify:a=>null===a,represent:()=>"null"}),l=["","~","null","Null","NULL"],m=e("tag:yaml.org,2002:null",{implicit:!0,implicitFirstChars:["","~","n","N"],resolve:a=>-1!==l.indexOf(a)?null:d,identify:a=>null===a,represent:()=>"null"}),n=["true","True","TRUE"],o=["false","False","FALSE"],p=e("tag:yaml.org,2002:bool",{implicit:!0,implicitFirstChars:["t","T","f","F"],resolve:a=>-1!==n.indexOf(a)||-1===o.indexOf(a)&&d,identify:a=>"[object Boolean]"===Object.prototype.toString.call(a),represent:a=>a?"true":"false"}),q=["true"],r=["false"],s=e("tag:yaml.org,2002:bool",{implicit:!0,implicitFirstChars:["t","f"],resolve:a=>-1!==q.indexOf(a)||-1===r.indexOf(a)&&d,identify:a=>"[object Boolean]"===Object.prototype.toString.call(a),represent:a=>a?"true":"false"}),t=["true","True","TRUE","y","Y","yes","Yes","YES","on","On","ON"],u=["false","False","FALSE","n","N","no","No","NO","off","Off","OFF"],v=e("tag:yaml.org,2002:bool",{implicit:!0,implicitFirstChars:["y","Y","n","N","t","T","f","F","o","O"],resolve:a=>-1!==t.indexOf(a)||-1===u.indexOf(a)&&d,identify:a=>"[object Boolean]"===Object.prototype.toString.call(a),represent:a=>a?"true":"false"}),w=RegExp("^(?:0o[0-7]+|0x[0-9a-fA-F]+|[-+]?[0-9]+)$"),x=RegExp("^(?:[-+]?0b[0-1]+|[-+]?0o[0-7]+|[-+]?0x[0-9a-fA-F]+|[-+]?[0-9]+)$"),y=e("tag:yaml.org,2002:int",{implicit:!0,implicitFirstChars:["-","+",..."0123456789"],resolve:function(a,b){let c,e;if(b){if(!x.test(a))return d}else if(!w.test(a))return d;let f=(e=1,(("-"===(c=a)[0]||"+"===c[0])&&("-"===c[0]&&(e=-1),c=c.slice(1)),c.startsWith("0b"))?e*parseInt(c.slice(2),2):c.startsWith("0o")?e*parseInt(c.slice(2),8):c.startsWith("0x")?e*parseInt(c.slice(2),16):e*parseInt(c,10));return Number.isFinite(f)?f:d},identify:a=>Number.isInteger(a)&&!Object.is(a,-0)&&0>a.toString(10).indexOf("e"),represent:a=>a.toString(10)}),z=RegExp("^-?(?:0|[1-9][0-9]*)$"),A=RegExp("^(?:[-+]?0b[0-1]+|[-+]?0o[0-7]+|[-+]?0x[0-9a-fA-F]+|[-+]?[0-9]+)$"),B=e("tag:yaml.org,2002:int",{implicit:!0,implicitFirstChars:["-",..."0123456789"],resolve:function(a,b){let c,e;if(b){if(!A.test(a))return d}else if(!z.test(a))return d;let f=(e=1,(("-"===(c=a)[0]||"+"===c[0])&&("-"===c[0]&&(e=-1),c=c.slice(1)),c.startsWith("0b"))?e*parseInt(c.slice(2),2):c.startsWith("0o")?e*parseInt(c.slice(2),8):c.startsWith("0x")?e*parseInt(c.slice(2),16):e*parseInt(c,10));return Number.isFinite(f)?f:d},identify:a=>Number.isInteger(a)&&!Object.is(a,-0)&&0>a.toString(10).indexOf("e"),represent:a=>a.toString(10)}),C=RegExp("^(?:[-+]?0b[0-1_]+|[-+]?0[0-7_]+|[-+]?0x[0-9a-fA-F_]+|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+|[-+]?(?:0|[1-9][0-9_]*))$"),D=e("tag:yaml.org,2002:int",{implicit:!0,implicitFirstChars:["-","+",..."0123456789"],resolve:function(a){if(!C.test(a))return d;let b=function(a){let b=a.replace(/_/g,""),c=1;if(("-"===b[0]||"+"===b[0])&&("-"===b[0]&&(c=-1),b=b.slice(1)),b.startsWith("0b"))return c*parseInt(b.slice(2),2);if(b.startsWith("0x"))return c*parseInt(b.slice(2),16);if(b.includes(":")){let a=0;for(let c of b.split(":"))a=60*a+Number(c);return c*a}return"0"!==b&&"0"===b[0]?c*parseInt(b,8):c*parseInt(b,10)}(a);return Number.isFinite(b)?b:d},identify:a=>Number.isInteger(a)&&!Object.is(a,-0)&&0>a.toString(10).indexOf("e"),represent:a=>a.toString(10)}),E=RegExp("^(?:[-+]?[0-9]+(?:\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?|[-+]?\\.[0-9]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"),F=RegExp("^(?:[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"),G=e("tag:yaml.org,2002:float",{implicit:!0,implicitFirstChars:["-","+",".",..."0123456789"],resolve:function(a){if(!E.test(a))return d;let b=a.toLowerCase(),c="-"===b[0]?-1:1;if("+-".includes(b[0])&&(b=b.slice(1)),".inf"===b)return 1===c?1/0:-1/0;if(".nan"===b)return NaN;let e=c*parseFloat(b);return Number.isFinite(e)||F.test(a)?e:d},identify:a=>"number"==typeof a&&(!Number.isInteger(a)||Object.is(a,-0)||a.toString(10).indexOf("e")>=0),represent:function(a){if(isNaN(a))return".nan";if(a===1/0)return".inf";if(a===-1/0)return"-.inf";if(Object.is(a,-0))return"-0.0";let b=a.toString(10);return/^[-+]?[0-9]+e/.test(b)?b.replace("e",".e"):b}}),H=RegExp("^-?(?:0|[1-9][0-9]*)(?:\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$"),I=RegExp("^(?:[-+]?[0-9]+(?:\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?|[-+]?\\.[0-9]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"),J=e("tag:yaml.org,2002:float",{implicit:!0,implicitFirstChars:["-",..."0123456789"],resolve:function(a,b){if(b){if(!I.test(a))return d;let b=a.toLowerCase(),c="-"===b[0]?-1:1;if("+-".includes(b[0])&&(b=b.slice(1)),".inf"===b)return 1===c?1/0:-1/0;if(".nan"===b)return NaN;let e=c*parseFloat(b);return Number.isFinite(e)?e:d}if(!H.test(a))return d;let c=Number(a);return Number.isFinite(c)?c:d},identify:a=>"number"==typeof a&&(!Number.isInteger(a)||Object.is(a,-0)||a.toString(10).indexOf("e")>=0),represent:function(a){if(isNaN(a))return".nan";if(a===1/0)return".inf";if(a===-1/0)return"-.inf";if(Object.is(a,-0))return"-0.0";let b=a.toString(10);return/^[-+]?[0-9]+e/.test(b)?b.replace("e",".e"):b}}),K=RegExp("^(?:[-+]?(?:(?:[0-9][0-9_]*)?\\.[0-9_]*)(?:[eE][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"),L=RegExp("^(?:[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"),M=e("tag:yaml.org,2002:float",{implicit:!0,implicitFirstChars:["-","+",".",..."0123456789"],resolve:function(a){if(!K.test(a))return d;let b=a.toLowerCase().replace(/_/g,""),c="-"===b[0]?-1:1;if("+-".includes(b[0])&&(b=b.slice(1)),".inf"===b)return 1===c?1/0:-1/0;if(".nan"===b)return NaN;let e=0;if(b.includes(":")){for(let a of b.split(":"))e=60*e+Number(a);e*=c}else e=c*parseFloat(b);return Number.isFinite(e)||L.test(a)?e:d},identify:a=>"number"==typeof a&&(!Number.isInteger(a)||Object.is(a,-0)||a.toString(10).indexOf("e")>=0),represent:function(a){if(isNaN(a))return".nan";if(a===1/0)return".inf";if(a===-1/0)return"-.inf";if(Object.is(a,-0))return"-0.0";let b=a.toString(10);return/^[-+]?[0-9]+e/.test(b)?b.replace("e",".e"):b}}),N=e("tag:yaml.org,2002:merge",{implicit:!0,implicitFirstChars:["<"],resolve:(a,b)=>"<<"===a||b&&""===a?"<<":d,identify:()=>!1}),O=/^[A-Za-z0-9+/]*={0,2}$/,P=e("tag:yaml.org,2002:binary",{resolve:function(a){let b=a.replace(/\s/g,"");if(b.length%4!=0||!O.test(b))return d;let c=atob(b),e=new Uint8Array(c.length);for(let a=0;a<c.length;a++)e[a]=c.charCodeAt(a);return e},identify:a=>"[object Uint8Array]"===Object.prototype.toString.call(a),represent:function(a){let b="";for(let c=0;c<a.length;c++)b+=String.fromCharCode(a[c]);return btoa(b)}}),Q=RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),R=RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function S(a,b,c,d=0,e=0,f=0,g=0){let h=new Date(Date.UTC(a,b,c,d,e,f,g));return h.setUTCFullYear(a,b,c),h}var T=e("tag:yaml.org,2002:timestamp",{implicit:!0,implicitFirstChars:[..."0123456789"],resolve:function(a){let b=Q.exec(a);if(null===b&&(b=R.exec(a)),null===b)return d;let c=+b[1],e=b[2]-1,f=+b[3];if(!b[4]){let a=S(c,e,f);return a.getUTCFullYear()!==c||a.getUTCMonth()!==e||a.getUTCDate()!==f?d:a}let g=+b[4],h=+b[5],i=+b[6],j=0;if(g>23||h>59||i>59)return d;if(b[7]){let a=b[7].slice(0,3);for(;a.length<3;)a+="0";j=+a}let k=S(c,e,f,g,h,i,j);if(k.getUTCFullYear()!==c||k.getUTCMonth()!==e||k.getUTCDate()!==f)return d;if(b[9]){let a=+b[10],c=+(b[11]||0);if(a>23||c>59)return d;let e=(60*a+c)*6e4;k.setTime(k.getTime()-("-"===b[9]?-e:e))}return k},identify:a=>a instanceof Date,represent:a=>a.toISOString()}),U=f("tag:yaml.org,2002:seq",{create:()=>[],addItem:(a,b)=>{a.push(b)},identify:Array.isArray});function V(a){if(null===a||"object"!=typeof a||Array.isArray(a))return!1;let b=Object.getPrototypeOf(a);return null===b||b===Object.prototype}function W(a,b){let c={};for(let d of b)void 0!==a[d]&&(c[d]=a[d]);return c}var X=f("tag:yaml.org,2002:omap",{create:()=>({list:[],seen:new Set}),addItem:(a,b)=>{let c;if(b instanceof Map){if(1!==b.size)return"cannot resolve an ordered map item";c=b.keys().next().value}else{if(!V(b))return"cannot resolve an ordered map item";let a=Object.keys(b);if(1!==a.length)return"cannot resolve an ordered map item";c=a[0]}return a.seen.has(c)?"duplicate key in ordered map":(a.seen.add(c),a.list.push(b),"")},finalize:a=>a.list,identify:()=>!1}),Y=f("tag:yaml.org,2002:pairs",{create:()=>[],addItem:(a,b)=>{if(b instanceof Map)return 1!==b.size?"cannot resolve a pairs item":(a.push(b.entries().next().value),"");if("[object Object]"!==Object.prototype.toString.call(b))return"cannot resolve a pairs item";let c=Object.keys(b);return 1!==c.length?"cannot resolve a pairs item":(a.push([c[0],b[c[0]]]),"")},identify:()=>!1}),Z=g("tag:yaml.org,2002:map",{create:()=>({}),identify:V,represent:a=>{let b=new Map;for(let c of Object.keys(a))b.set(c,a[c]);return b},addPair:(a,b,c)=>{if(null!==b&&"object"==typeof b)return"object-based map does not support complex keys";let d=String(b);return"__proto__"===d?Object.defineProperty(a,d,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[d]=c,""},has:(a,b)=>(null===b||"object"!=typeof b)&&Object.prototype.hasOwnProperty.call(a,String(b)),keys:a=>Object.keys(a),get:(a,b)=>{let c=String(b);return Object.prototype.hasOwnProperty.call(a,c)?a[c]:null}}),$=g("tag:yaml.org,2002:set",{create:()=>new Set,identify:a=>a instanceof Set,represent:a=>{let b=new Map;for(let c of a)b.set(c,null);return b},addPair:(a,b,c)=>null!==c?"cannot resolve a set item":(a.add(b),""),has:(a,b)=>a.has(b),keys:a=>a.keys(),get:()=>null}),_=class a{tags;implicitScalarTags;implicitScalarByFirstChar;implicitScalarAnyFirstChar;defaultScalarTag;defaultSequenceTag;defaultMappingTag;exact;prefix;constructor(a){const b=function(a){let b=[];for(let c of a){let a=b.length;for(let d=0;d<b.length;d++){let e=b[d];if(e.nodeKind===c.nodeKind&&e.tagName===c.tagName&&e.matchByTagPrefix===c.matchByTagPrefix){a=d;break}}b[a]=c}return b}(a),c=[],d={scalar:Object.create(null),sequence:Object.create(null),mapping:Object.create(null)},e={scalar:[],sequence:[],mapping:[]};for(const a of b){if("scalar"===a.nodeKind&&a.implicit){if(a.matchByTagPrefix)throw Error("Implicit scalar tags cannot match by tag prefix");c.push(a)}switch(a.nodeKind){case"scalar":a.matchByTagPrefix?e.scalar.push(a):d.scalar[a.tagName]=a;break;case"sequence":a.matchByTagPrefix?e.sequence.push(a):d.sequence[a.tagName]=a;break;case"mapping":a.matchByTagPrefix?e.mapping.push(a):d.mapping[a.tagName]=a}}const f=c.filter(a=>null===a.implicitFirstChars),g=new Set;for(const a of c)if(null!==a.implicitFirstChars)for(const b of a.implicitFirstChars)g.add(b);const h=new Map;for(const a of g)h.set(a,c.filter(b=>null===b.implicitFirstChars||-1!==b.implicitFirstChars.indexOf(a)));const i=d.scalar["tag:yaml.org,2002:str"];if(!i)throw Error("schema does not define the default scalar tag (tag:yaml.org,2002:str)");this.tags=b,this.implicitScalarTags=c,this.implicitScalarByFirstChar=h,this.implicitScalarAnyFirstChar=f,this.defaultScalarTag=i,this.defaultSequenceTag=d.sequence["tag:yaml.org,2002:seq"],this.defaultMappingTag=d.mapping["tag:yaml.org,2002:map"],this.exact=d,this.prefix=e}lookupScalarTag(a){let b=this.exact.scalar[a];if(b)return b;for(let b of this.prefix.scalar)if(a.startsWith(b.tagName))return b}lookupSequenceTag(a){let b=this.exact.sequence[a];if(b)return b;for(let b of this.prefix.sequence)if(a.startsWith(b.tagName))return b}lookupMappingTag(a){let b=this.exact.mapping[a];if(b)return b;for(let b of this.prefix.mapping)if(a.startsWith(b.tagName))return b}resolveImplicitScalarTag(a){for(let b of this.implicitScalarByFirstChar.get(a.charAt(0))??this.implicitScalarAnyFirstChar){let c=b.resolve(a,!1,b.tagName);if(c!==d)return{value:c,tag:b}}let b=this.defaultScalarTag;return{value:b.resolve(a,!1,b.tagName),tag:b}}withTags(...b){let c=[];for(let a of b)c=c.concat(a);return new a([...this.tags,...c])}},aa=new _([h,U,Z]);new _([...aa.tags,k,s,B,J]);var ab=new _([...aa.tags,j,p,y,G]),ac=new _([...aa.tags,m,v,D,M,T,N,P,X,Y,$]).withTags({...D,resolve:(a,b,c)=>{let e=D.resolve(a,b,c);return e===d?y.resolve(a,b,c):e}},{...M,resolve:(a,b,c)=>{let e=M.resolve(a,b,c);return e===d?G.resolve(a,b,c):e}});function ad(a){if(Array.isArray(a)){let b=Array.prototype.slice.call(a);for(let a=0;a<b.length;a++){if(Array.isArray(b[a]))return null;"object"==typeof b[a]&&"[object Object]"===Object.prototype.toString.call(b[a])&&(b[a]="[object Object]")}return String(b)}return"object"==typeof a&&"[object Object]"===Object.prototype.toString.call(a)?"[object Object]":String(a)}g("tag:yaml.org,2002:map",{create:()=>new Map,addPair:(a,b,c)=>(a.set(b,c),""),has:(a,b)=>a.has(b),keys:a=>a.keys(),get:(a,b)=>a.get(b),identify:a=>a instanceof Map||V(a),represent:a=>{if(a instanceof Map)return a;let b=new Map;for(let c of Object.keys(a))b.set(c,a[c]);return b}}),g("tag:yaml.org,2002:map",{create:()=>({}),identify:V,represent:a=>{let b=new Map;for(let c of Object.keys(a))b.set(c,a[c]);return b},addPair:(a,b,c)=>{let d=ad(b);return null===d?"nested arrays are not supported inside keys":("__proto__"===d?Object.defineProperty(a,d,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[d]=c,"")},has:(a,b)=>{let c=ad(b);return null!==c&&Object.prototype.hasOwnProperty.call(a,c)},keys:a=>Object.keys(a),get:(a,b)=>{let c=String(b);return Object.prototype.hasOwnProperty.call(a,c)?a[c]:null}});var ae={maxLength:79,indent:1,linesBefore:3,linesAfter:2};function af(a,b,c,d,e){let f="",g="",h=Math.floor(e/2)-1;return d-b>h&&(b=d-h+(f=" ... ").length),c-d>h&&(c=d+h-(g=" ...").length),{str:f+a.slice(b,c).replace(/\t/g,"→")+g,pos:d-b+f.length}}function ag(a,b){return" ".repeat(Math.max(b-a.length,0))+a}function ah(a,b){let c="";return a.mark?(a.mark.name&&(c+=`in "${a.mark.name}" `),c+=`(${a.mark.line+1}:${a.mark.column+1})`,!b&&a.mark.snippet&&(c+=`
17
+ </documents>`}},42267:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{lB:()=>q});var e=c(29021),f=c(33873),g=c(51181),h=c.n(g),i=c(90053),j=c(73706),k=c(94523),l=c(3622),m=c(57432),n=a([m]);function o(){return(0,f.join)((0,m.$M)(),"web-push.json")}m=(n.then?(await n)():n)[0];function p(a,b){if("zh-CN"===a){let a=l.O.messages["sessionComplete"===b?"i18n.sessionComplete":"i18n.taskFinished"];if(a)return a}return k.Q.messages["sessionComplete"===b?"i18n.sessionComplete":"i18n.taskFinished"]??("sessionComplete"===b?"Session complete":"Task finished.")}async function q(a,b){let c=await (!globalThis.__piWebPushNotifier&&(globalThis.__piWebPushNotifier=Promise.resolve().then(()=>{var a;let b,c,d;return b=(a={async send(a,b,c){let d;await h().sendNotification({endpoint:a.endpoint,keys:a.keys},b,{vapidDetails:{subject:(d=process.env.PI_WEB_PUSH_SUBJECT?.trim())||i.TB,publicKey:c.publicKey,privateKey:c.privateKey},TTL:2419200,urgency:"high"})},loadState(){let a=o();if(!(0,e.existsSync)(a))return null;try{return JSON.parse((0,e.readFileSync)(a,"utf8"))}catch{return null}},saveState(a){let b=o();(0,e.mkdirSync)((0,f.dirname)(b),{recursive:!0}),(0,j.$)(b,JSON.stringify(a))},generateVapidKeys:()=>h().generateVAPIDKeys()}).loadState(),c=b?.vapidKeys?.publicKey&&b.vapidKeys.privateKey?b:{vapidKeys:a.generateVapidKeys(),subscriptions:[]},d=()=>{a.saveState(c)},{getVapidPublicKey:()=>(d(),c.vapidKeys.publicKey),addSubscription(a){c.subscriptions=[...c.subscriptions.filter(b=>b.endpoint!==a.endpoint),a],d()},async notifySessionComplete(b,e){if(0===c.subscriptions.length)return;let f=a=>({title:e??p(a,"sessionComplete"),body:p(a,"taskFinished"),url:`/?session=${encodeURIComponent(b)}`,tag:`pi-session-complete:${b}`}),g=!1;for(let b of[...c.subscriptions])try{await a.send(b,JSON.stringify(f(b.locale)),c.vapidKeys)}catch(d){let a=function(a){if("object"!=typeof a||null===a||!("statusCode"in a))return;let b=a.statusCode;return"number"==typeof b?b:void 0}(d);(404===a||410===a)&&(c.subscriptions=c.subscriptions.filter(a=>a.endpoint!==b.endpoint),g=!0)}g&&d()}}})),globalThis.__piWebPushNotifier);await c.notifySessionComplete(a,b)}d()}catch(a){d(a)}})},43888:(a,b,c)=>{"use strict";c.d(b,{$:()=>f});var d=c(76760),e=c.n(d);function f(a,b=process.platform){let c="win32"===b?e().win32.normalize(a):e().posix.normalize(a);return"win32"===b?c.toLowerCase():c}},43946:(a,b,c)=>{"use strict";let d=c(95415);a.exports={toPromise:function(a){return(...b)=>new Promise((c,d)=>{b.push((a,b)=>{a?d(a):c(b)}),a(...b)})},toSync:function(a){return(...b)=>{let c,d;if(b.push((a,b)=>{c=a,d=b}),a(...b),c)throw c;return d}},toSyncOptions:function(a){var b;let c;if((a={...a}).fs=(c={...b=a.fs||d},["mkdir","realpath","stat","rmdir","utimes"].forEach(a=>{c[a]=(...c)=>{let d,e=c.pop();try{d=b[`${a}Sync`](...c)}catch(a){return e(a)}e(null,d)}}),c),"number"==typeof a.retries&&a.retries>0||a.retries&&"number"==typeof a.retries.retries&&a.retries.retries>0)throw Object.assign(Error("Cannot use retries with the sync api"),{code:"ESYNC"});return a}}},44449:(a,b,c)=>{var d=c(27910).Stream;a.exports=function(a){return{ReadStream:function b(c,e){if(!(this instanceof b))return new b(c,e);d.call(this);var f=this;this.path=c,this.fd=null,this.readable=!0,this.paused=!1,this.flags="r",this.mode=438,this.bufferSize=65536;for(var g=Object.keys(e=e||{}),h=0,i=g.length;h<i;h++){var j=g[h];this[j]=e[j]}if(this.encoding&&this.setEncoding(this.encoding),void 0!==this.start){if("number"!=typeof this.start)throw TypeError("start must be a Number");if(void 0===this.end)this.end=1/0;else if("number"!=typeof this.end)throw TypeError("end must be a Number");if(this.start>this.end)throw Error("start must be <= end");this.pos=this.start}null!==this.fd?process.nextTick(function(){f._read()}):a.open(this.path,this.flags,this.mode,function(a,b){if(a){f.emit("error",a),f.readable=!1;return}f.fd=b,f.emit("open",b),f._read()})},WriteStream:function b(c,e){if(!(this instanceof b))return new b(c,e);d.call(this),this.path=c,this.fd=null,this.writable=!0,this.flags="w",this.encoding="binary",this.mode=438,this.bytesWritten=0;for(var f=Object.keys(e=e||{}),g=0,h=f.length;g<h;g++){var i=f[g];this[i]=e[i]}if(void 0!==this.start){if("number"!=typeof this.start)throw TypeError("start must be a Number");if(this.start<0)throw Error("start must be >= zero");this.pos=this.start}this.busy=!1,this._queue=[],null===this.fd&&(this._open=a.open,this._queue.push([this._open,this.path,this.flags,this.mode,void 0]),this.flush())}}}},45211:a=>{"use strict";a.exports=function(a){if(null===a||"object"!=typeof a)return a;if(a instanceof Object)var c={__proto__:b(a)};else var c=Object.create(null);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c};var b=Object.getPrototypeOf||function(a){return a.__proto__}},46487:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{registerNodeInstrumentation:()=>j});var e=c(2702),f=c(77417),g=c(79604),h=c(24989),i=a([g,h]);function j(){(0,e.kU)((0,e.AG)());let a=()=>(0,f.qF)();process.on("SIGINT",a),process.on("SIGTERM",a),Promise.resolve().then(c.bind(c,75430)).catch(()=>{}),(0,g.j)().catch(a=>{console.warn(`[pi-web] starting the telegram runtime failed: ${a instanceof Error?a.message:String(a)}`)}),(0,h.Ei)()}[g,h]=i.then?(await i)():i,d()}catch(a){d(a)}})},49325:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{fR:()=>m,lL:()=>j,zE:()=>k});var e=c(75430),f=c(11124);c(68377),c(95655);var g=c(89076),h=c(52552),i=a([e,g,h]);[e,g,h]=i.then?(await i)():i;let n="from shell command: ";function j(a,b){var c;return c=b(a.slice(0,65536)),c.length>2e3?`${c.slice(0,1999)}…`:c}function k(a,b){return b(a.slice(-65536)).slice(-2e3)}let o=/^(?:bearer|basic|token)$/i;function l(a){return a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function m(a,b,c,d=[]){let e=new Map,h=(a,b,c)=>{let d=e.get(a);d&&(!d.word||c)||e.set(a,{raw:a,shown:b,word:c})},i=a=>{if(void 0===a)return;let b=a.trim();for(let a of(b.length>=6&&h(b,f.Q6,!1),b.split(/\s+/)))a!==b&&a.length>=6&&!o.test(a)&&h(a,f.Q6,!0)},j=(a,b)=>{b.masked&&a.length>=6&&h(a,b.value,!1)};for(let{value:b}of(0,g.xW)(a))if(c.isCommandConfigValue(b)){let a=b.slice(1);a.trim()&&h(`${n}${a}`,`${n}${f.Q6}`,!1),a.trim().length>=6&&h(a.trim(),f.Q6,!0)}else(0,f.yQ)(b)||i(b);let k=b.map(a=>a.options??{});if("url"in a){for(let a of k)for(let b of Object.values(a.headers??{}))i(b);j(a.url,(0,f.yP)(a.url));try{let b=new URL(a.url).href;b!==a.url&&j(b,(0,f.yP)(b))}catch{}for(let b of(0,f.Yh)(a.url))i(b)}else{for(let b of k)for(let c of Object.keys(a.env??{}))i(b.env?.[c]);for(let b of(j(a.command,(0,f.Iq)(a.command)),(0,f.Wy)(a.command)))i(b);let b=a.args??[],c=(0,f.oF)(b).args;for(let a of(b.forEach((a,b)=>j(a,{value:c[b]??f.Q6,masked:c[b]!==a})),(0,f.DA)(b)))i(a)}for(let a of d)i(a);let p=[...e.values()].sort((a,b)=>b.raw.length-a.raw.length).map(({raw:a,shown:b,word:c})=>({shown:b,pattern:RegExp(c?`(?<![A-Za-z0-9_])${l(a)}(?![A-Za-z0-9_])`:l(a),"g")}));return a=>p.reduce((a,{pattern:b,shown:c})=>a.replace(b,()=>c),a)}Symbol.for("pi-web:mcp-test-flights"),Symbol.for("pi-web:mcp-test-command-queue"),d()}catch(a){d(a)}})},51149:(a,b,c)=>{"use strict";c.d(b,{C1:()=>e,kU:()=>d});let d=["read","grep","find","ls"],e=["bash","read","edit","write","grep","find","ls"];[...e]},52552:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{nx:()=>h});var e=c(75430);c(77598);var f=c(96452),g=a([e,f]);function h(){globalThis.__piWebSharedModelRuntime=void 0}[e,f]=g.then?(await g)():g,Symbol.for("pi-web:shared-model-runtime-refresh"),d()}catch(a){d(a)}})},52633:(a,b,c)=>{"use strict";c.d(b,{vN:()=>e,vR:()=>f});let d=["enabled","exposure","toolExposure"];function e(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)&&void 0===a.command&&void 0===a.url&&void 0===a.type}function f(a,b,c){return c?Object.keys(b).some(a=>!d.includes(a))?`server "${a}": an override can only set ${d.join(", ")}`:void 0:`server "${a}" needs "command" or "url", or a global server to override`}},53481:a=>{a.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"],"win32"!==process.platform&&a.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT"),"linux"===process.platform&&a.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")},56479:(a,b,c)=>{"use strict";c.d(b,{T:()=>f,y:()=>g});var d=c(73024);let e=d.constants.O_RDONLY|(d.constants.O_NONBLOCK||0),f=1048576;function g(a,b){let c;try{c=(0,d.openSync)(a,e)}catch(b){let a;if("ENOENT"===(a=b?.code)||"ENOTDIR"===a)return;throw b}try{let e=(0,d.fstatSync)(c);if(!e.isFile())throw Error(`${a} is not a regular file`);if(void 0===b)return(0,d.readFileSync)(c,"utf8");if(e.size>b)throw Error(`${a} is larger than ${b} bytes`);let f=b+1,g=[],h=0;for(;h<f;){let a=Buffer.alloc(Math.min(f-h,65536)),b=(0,d.readSync)(c,a,0,a.length,null);if(0===b)break;g.push(a.subarray(0,b)),h+=b}if(h>b)throw Error(`${a} is larger than ${b} bytes`);return Buffer.concat(g,h).toString("utf8")}finally{(0,d.closeSync)(c)}}},57290:(a,b,c)=>{"use strict";c.d(b,{H:()=>g});var d=c(21820),e=c(33873),f=c.n(e);function g(a=new Date,b=(0,d.homedir)()){return f().join(b,"pi-cwd",function(a=new Date){let b=a.getFullYear(),c=String(a.getMonth()+1).padStart(2,"0"),d=String(a.getDate()).padStart(2,"0");return`${b}${c}${d}`}(a))}},57432:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{$M:()=>e.getAgentDir,H6:()=>s,O8:()=>D,Vg:()=>E,mD:()=>A,os:()=>C});var e=c(75430),f=c(29021),g=c(79748),h=c(33873),i=c(35618),j=c(43888),k=c(19050);c(76155);var l=c(61175),m=c(66192),n=c(94343),o=a([e,m,n]);function p(a,b,c){let d=(0,f.openSync)(a,"r");try{let a=[],e=0,g=0,h=!1;for(;e<b&&g<c;){let i=Buffer.allocUnsafe(Math.min(4096,b-e)),j=(0,f.readSync)(d,i,0,i.length,e);if(0===j){h=!0;break}e+=j;let k=i.subarray(0,j),l=k.length;for(let a=0;a<k.length;a+=1)if(10===k[a]&&(g+=1)===c){l=a+1;break}a.push(k.subarray(0,l))}let i=Buffer.concat(a).toString("utf8"),j=i.split("\n");return h||i.endsWith("\n")||j.pop(),""===j.at(-1)&&j.pop(),j.map(a=>a.endsWith("\r")?a.slice(0,-1):a)}finally{(0,f.closeSync)(d)}}function q(a,b){let c=(0,f.openSync)(a,"r");try{let a=(0,f.fstatSync)(c).size,d=Math.max(0,a-b),e=Buffer.allocUnsafe(a-d),g=(0,f.readSync)(c,e,0,e.length,d);if(0===g)return[];let h=e.subarray(0,g).toString("utf8").split("\n");if(d>0){let a=Buffer.allocUnsafe(1);(0,f.readSync)(c,a,0,1,d-1),10!==a[0]&&h.shift()}return""===h.at(-1)&&h.pop(),h.map(a=>a.endsWith("\r")?a.slice(0,-1):a)}finally{(0,f.closeSync)(c)}}function r(a){return a.flatMap(a=>{try{return[JSON.parse(a)]}catch{return[]}})}function s(a){let b;if(a){try{b=q(a,65536)}catch{return}for(let a=b.length-1;a>=0;a-=1){let c=function(a){try{let b=JSON.parse(a);if("session"===b.type)return;return"string"==typeof b.id&&b.id?b.id:void 0}catch{return}}(b[a]);if(c)return c}}}async function t(a){let b=[...new Set(a.map(a=>a.cwd).filter(Boolean))],c=new Map;return await Promise.all(b.map(async a=>{c.set(a,await (0,l.KI)(a))})),a.map(a=>{let b=a.cwd?c.get(a.cwd):void 0,d=b?.projectRoot??a.cwd;return{...a,projectRoot:d,projectKey:(0,i.z)(d),...b?.branch?{branch:b.branch}:{},...b?.isWorktree?{isWorktree:!0}:{}}})}[e,m,n]=o.then?(await o)():o;let F=new WeakMap;async function u(a){let b=new Map;for(let c of a)b.set((0,j.$)(c.path),c.id);return t(a.map(a=>(function(a,b){D(a.id,a.path);let{originSessionId:c,subagent:d}=function(a,b){let c=a.parentSessionPath?b.get((0,j.$)(a.parentSessionPath)):void 0;if(!a.parentSessionPath)return{originSessionId:c,subagent:null};let d=F.get(a);if(void 0!==d)return{originSessionId:c,subagent:d};try{var e;let b,d=(0,m.$u)((e=a.path,(b=r(p(e,262144,2).slice(1))).some(a=>"custom"===a.type&&a.customType===m.tP)?[...b,...r(q(e,262144))]:b),a.id,a.path);return F.set(a,d),{originSessionId:c,subagent:d}}catch{return{originSessionId:c,subagent:null}}}(a,b),e=!0===a.detailsPending;return{path:a.path,id:a.id,cwd:a.cwd,name:a.name,created:a.created.toISOString(),modified:a.modified.toISOString(),messageCount:a.messageCount,firstMessage:e&&!a.firstMessage?"":function(a){let b=(0,k.d)(a)??a;if(b.length<=500)return b;let c=b.charCodeAt(499);return b.slice(0,c>=55296&&c<=56319?499:500)}(a.firstMessage||"(no messages)"),parentSessionId:c,...d?{relation:{kind:"subagent",parentSessionId:d.parentSessionId,profile:d.profile,description:d.description,status:d.status}}:a.parentSessionPath?{relation:{kind:"fork",...c?{originSessionId:c}:{}}}:{},transient:!1,...e?{detailsPending:!0}:{}}})(a,b)))}async function v(){return u(await (0,n.q8)())}async function w(a={}){a.force&&A();let b=globalThis.__piSessionListGeneration??0,c=globalThis.__piSessionListCache;if(c&&c.generation===b&&Date.now()-c.ts<G)return c.data;if(a.allowStale&&c)return w().catch(()=>void 0),c.data;if(globalThis.__piSessionListPromise&&globalThis.__piSessionListPromiseGeneration===b)return globalThis.__piSessionListPromise;let d=v().then(a=>(globalThis.__piSessionListGeneration??0)!==b?w():(globalThis.__piSessionListCache={data:a,ts:Date.now(),generation:b},a)).finally(()=>{globalThis.__piSessionListPromise===d&&(globalThis.__piSessionListPromise=void 0,globalThis.__piSessionListPromiseGeneration=void 0)});return globalThis.__piSessionListPromise=d,globalThis.__piSessionListPromiseGeneration=b,d}let G=3e4,H=/^[A-Za-z0-9](?:[A-Za-z0-9._-]*[A-Za-z0-9])?$/;function x(){return(0,h.join)((0,e.getAgentDir)(),"sessions")}function y(a,b=(0,h.resolve)(x())){let c=(0,h.resolve)(a),d=(0,h.relative)(b,c);return""===d||".."===d||d.startsWith(`..${h.sep}`)||(0,h.isAbsolute)(d)?null:c}async function z(a){let b,c;if(!H.test(a))return null;let d=(0,h.resolve)(x());try{b=await (0,g.readdir)(d,{withFileTypes:!0})}catch{return null}let e=`_${a}.jsonl`;for(let f of b){let b;if(!f.isDirectory()&&!f.isSymbolicLink())continue;let i=y((0,h.join)(d,f.name),d);if(i){try{b=await (0,g.readdir)(i)}catch{continue}for(let f of b){if(!f.endsWith(e))continue;let b=y((0,h.join)(i,f),d);if(b){try{if(function(a){let b=p(a,65536,1)[0]?.trimEnd();if(!b)return null;try{let a=JSON.parse(b);return"session"===a.type?a:null}catch{return null}}(b)?.id!==a)continue}catch{continue}if(c&&c!==b)return null;c=b}}}}return c??null}function A(){globalThis.__piSessionListGeneration=(globalThis.__piSessionListGeneration??0)+1}function B(){return globalThis.__piSessionPathCache||(globalThis.__piSessionPathCache=new Map),globalThis.__piSessionPathCache}async function C(a){let b=B().get(a);if(b)return b;let c=await z(a);return c?D(a,c):await w(),B().get(a)??null}function D(a,b){let c=(0,h.normalize)(b),d=(0,j.$)(c),e=B(),f=(globalThis.__piPathToSessionIdCache||(globalThis.__piPathToSessionIdCache=new Map),globalThis.__piPathToSessionIdCache),g=e.get(a),i=g?(0,j.$)(g):void 0,k=f.get(d),l=k?e.get(k):void 0;i&&i!==d&&f.get(i)===a&&f.delete(i),k&&k!==a&&l&&(0,j.$)(l)===d&&e.delete(k),e.set(a,c),f.set(d,a)}function E(a){for(let b=a.length-1;b>=0;b--){let c=a[b];if("model_change"===c.type)return{provider:c.provider,modelId:c.modelId}}return null}d()}catch(a){d(a)}})},57616:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{Db:()=>x,M7:()=>y,n7:()=>z});var e=c(76760),f=c(75430),g=c(4775),h=c(89076),i=c(29299),j=c(35234),k=c(56479),l=c(98012),m=a([f,g,h,i,j,l]);[f,g,h,i,j,l]=m.then?(await m)():m;let A="PI_WEB_DISABLE_MCP";function n(a=process.env){let b=a[A]?.trim().toLowerCase();return void 0!==b&&""!==b&&"0"!==b&&"false"!==b}async function o(){let a;if(await (0,f.createCodemodeExtension)({models:!1})({registerTool:b=>{a=b},getSettings:()=>({}),getAllTools:()=>[],appendEntry:()=>{}}),!a)throw Error("the codemode extension registered no tool");return a}async function p(a={}){let b,c=a.timeoutMs??1e4,d=new AbortController,e=new Promise((a,e)=>{b=setTimeout(()=>{d.abort(),e(Error(`the sandbox did not answer within ${c} ms`))},c),b.unref?.()});try{let b=(async()=>{let b=await (a.createDefinition??o)();return await b.execute("pi-web-self-test",{code:"return 6 * 7"},d.signal,void 0,void 0)})();b.catch(()=>{});let c=await Promise.race([b,e]),f=(c.content??[]).flatMap(a=>"text"===a.type&&void 0!==a.text?[a.text]:[]);if(c.isError)return{available:!1,reason:`the self-test script failed: ${f.join(" ").trim()||"no output"}`};if(!f.some(a=>"42"===a.trim()))return{available:!1,reason:`the self-test script returned ${JSON.stringify(f.join(" ").trim())}`};return{available:!0}}catch(a){return{available:!1,reason:a instanceof Error?a.message:String(a)}}finally{clearTimeout(b)}}let B=Symbol.for("pi-web.codemodeSandbox");function q(){let a=globalThis;return a[B]??=p().then(a=>(a.available||console.warn(`[pi-web] Code mode is off: ${a.reason}`),a))}Symbol("not settled");let C=Symbol.for("pi-web.mcpOffWarned");async function r(){let a=function(a,b=process.env){return n(b)?{available:!1,reason:`${A} is set`}:a.ok?{available:!0,internals:a}:{available:!1,reason:a.reason}}(await (0,i.U)()),b=globalThis;return a.available||n()||b[C]===a.reason||(b[C]=a.reason,console.warn(`[pi-web] MCP is off: ${a.reason}`)),a}let D=["codemode","tool-search","mcp","todo"];function s(a,b){let c,d=(0,k.y)(a,b);if(void 0===d)return;try{c=JSON.parse(65279===d.charCodeAt(0)?d.slice(1):d)}catch{return}let e="object"==typeof c&&null!==c?c.extensions:void 0;return Array.isArray(e)?e.filter(a=>"string"==typeof a):void 0}async function t(a,b,c){let{agentDir:d,cwd:e,projectTrusted:g}=a,h=new f.DefaultPackageManager({cwd:e,agentDir:d,settingsManager:f.SettingsManager.fromStorage({withLock:(a,c)=>{let d=b[a];c(d?JSON.stringify({extensions:d}):void 0)}},{projectTrusted:g}),builtinExtensions:[...D]}),i=await h.resolve(async()=>"skip"),j={};for(let a of D){let b=i.extensions.find(b=>b.path===`builtin:${a}`),d=b?.enabled??!0;j[a]=d?{enabled:d}:{enabled:d,settingsPath:b?.metadata.scope==="project"?c.project:c.global}}return j}async function u(a){let{agentDir:b}=a,c=void 0!==a.cwd&&a.projectTrusted,d=a.cwd??b,g={global:(0,e.join)(b,"settings.json"),project:(0,e.join)(d,f.CONFIG_DIR_NAME,"settings.json")},h=s(g.global),i=c?s(g.project,k.T):void 0,j=await t({agentDir:b,cwd:d,projectTrusted:c},{global:h,project:i},g);if(void 0===i)return j;let l=await t({agentDir:b,cwd:d,projectTrusted:!1},{global:h},g);for(let a of D)j[a].global=l[a];return j}let E=()=>{};function v(a,b){return{name:a,factory:b,replaceable:!0,builtin:!0}}function w(a,b){let c=b.gate??((a,b)=>b),d=a.available?new g.nx({...b.mcpHost,agentDir:b.agentDir,internals:a.internals,codemodeAvailable:b.codemodeAvailable}):void 0,e=[v("tool-search",c("tool-search",(0,f.createToolSearchExtension)())),v("mcp",c("mcp",a.available&&d?(0,f.createMcpExtension)({loadConfig:function(a,b,c=a=>(0,j.n)(a,b)){return d=>{let e;try{e=a.loadMcpConfig({agentDir:b,cwd:d.cwd,projectTrusted:c(d.cwd)}).autoEnableCodemode}catch{}return{servers:[],errors:[],...void 0===e?{}:{autoEnableCodemode:e}}}}(a.internals,b.agentDir),createTransport:d.wrapTransportFactory((0,h.Pn)(a.internals)),startupWaitMs:0,openUrl:()=>{}}):E))];return d&&e.push(d.extension()),{extensions:e,mcpHost:d}}async function x(a){let b=await q();if(!b.available)throw Error(`Code mode is unavailable: ${b.reason}`);let c=(0,f.createCodemodeExtension)();return{name:"codemode",replaceable:!0,factory:async b=>{(await u({agentDir:a.agentDir,cwd:a.cwd,projectTrusted:a.projectTrusted()})).codemode.enabled&&await c(b)}}}async function y(a){return w(await r(),{agentDir:a.agentDir,codemodeAvailable:()=>a.codemode,...a.mcpHost?{mcpHost:a.mcpHost}:{},gate:(b,c)=>async d=>{(await u({agentDir:a.agentDir,cwd:a.cwd,projectTrusted:a.projectTrusted()}))[b].enabled&&await c(d)}})}async function z(a){let[b,c]=await Promise.all([q(),r()]),{extensions:d,mcpHost:e}=w(c,{agentDir:a.agentDir,codemodeAvailable:()=>b.available,...a.mcpHost?{mcpHost:a.mcpHost}:{}});return{extensions:[v("codemode",b.available?(0,f.createCodemodeExtension)():E),v("todo",(0,l.U)()),...d],mcpHost:e}}d()}catch(a){d(a)}})},57719:(a,b,c)=>{"use strict";c.d(b,{Hh:()=>ba});var d=Symbol("NOT_RESOLVED");function e(a,b){return{tagName:a,nodeKind:"scalar",implicit:b.implicit??!1,matchByTagPrefix:b.matchByTagPrefix??!1,implicitFirstChars:b.implicitFirstChars??null,resolve:b.resolve,identify:b.identify,represent:b.represent??(a=>String(a)),representTagName:b.representTagName??(()=>a)}}function f(a,b){let c=void 0===b.finalize;return{tagName:a,nodeKind:"sequence",implicit:!1,matchByTagPrefix:b.matchByTagPrefix??!1,create:b.create,addItem:b.addItem,finalize:b.finalize??(a=>a),carrierIsResult:c,identify:b.identify,represent:b.represent??(a=>a),representTagName:b.representTagName??(()=>a)}}function g(a,b){let c=void 0===b.finalize;return{tagName:a,nodeKind:"mapping",implicit:!1,matchByTagPrefix:b.matchByTagPrefix??!1,create:b.create,addPair:b.addPair,has:b.has,keys:b.keys,get:b.get,finalize:b.finalize??(a=>a),carrierIsResult:c,identify:b.identify,represent:b.represent??(a=>a),representTagName:b.representTagName??(()=>a)}}var h=e("tag:yaml.org,2002:str",{resolve:a=>a,identify:a=>"string"==typeof a}),i=["","~","null","Null","NULL"],j=e("tag:yaml.org,2002:null",{implicit:!0,implicitFirstChars:["","~","n","N"],resolve:a=>-1!==i.indexOf(a)?null:d,identify:a=>null===a,represent:()=>"null"}),k=e("tag:yaml.org,2002:null",{implicit:!0,implicitFirstChars:["n"],resolve:(a,b)=>"null"===a||b&&""===a?null:d,identify:a=>null===a,represent:()=>"null"}),l=["","~","null","Null","NULL"],m=e("tag:yaml.org,2002:null",{implicit:!0,implicitFirstChars:["","~","n","N"],resolve:a=>-1!==l.indexOf(a)?null:d,identify:a=>null===a,represent:()=>"null"}),n=["true","True","TRUE"],o=["false","False","FALSE"],p=e("tag:yaml.org,2002:bool",{implicit:!0,implicitFirstChars:["t","T","f","F"],resolve:a=>-1!==n.indexOf(a)||-1===o.indexOf(a)&&d,identify:a=>"[object Boolean]"===Object.prototype.toString.call(a),represent:a=>a?"true":"false"}),q=["true"],r=["false"],s=e("tag:yaml.org,2002:bool",{implicit:!0,implicitFirstChars:["t","f"],resolve:a=>-1!==q.indexOf(a)||-1===r.indexOf(a)&&d,identify:a=>"[object Boolean]"===Object.prototype.toString.call(a),represent:a=>a?"true":"false"}),t=["true","True","TRUE","y","Y","yes","Yes","YES","on","On","ON"],u=["false","False","FALSE","n","N","no","No","NO","off","Off","OFF"],v=e("tag:yaml.org,2002:bool",{implicit:!0,implicitFirstChars:["y","Y","n","N","t","T","f","F","o","O"],resolve:a=>-1!==t.indexOf(a)||-1===u.indexOf(a)&&d,identify:a=>"[object Boolean]"===Object.prototype.toString.call(a),represent:a=>a?"true":"false"}),w=RegExp("^(?:0o[0-7]+|0x[0-9a-fA-F]+|[-+]?[0-9]+)$"),x=RegExp("^(?:[-+]?0b[0-1]+|[-+]?0o[0-7]+|[-+]?0x[0-9a-fA-F]+|[-+]?[0-9]+)$"),y=e("tag:yaml.org,2002:int",{implicit:!0,implicitFirstChars:["-","+",..."0123456789"],resolve:function(a,b){let c,e;if(b){if(!x.test(a))return d}else if(!w.test(a))return d;let f=(e=1,(("-"===(c=a)[0]||"+"===c[0])&&("-"===c[0]&&(e=-1),c=c.slice(1)),c.startsWith("0b"))?e*parseInt(c.slice(2),2):c.startsWith("0o")?e*parseInt(c.slice(2),8):c.startsWith("0x")?e*parseInt(c.slice(2),16):e*parseInt(c,10));return Number.isFinite(f)?f:d},identify:a=>Number.isInteger(a)&&!Object.is(a,-0)&&0>a.toString(10).indexOf("e"),represent:a=>a.toString(10)}),z=RegExp("^-?(?:0|[1-9][0-9]*)$"),A=RegExp("^(?:[-+]?0b[0-1]+|[-+]?0o[0-7]+|[-+]?0x[0-9a-fA-F]+|[-+]?[0-9]+)$"),B=e("tag:yaml.org,2002:int",{implicit:!0,implicitFirstChars:["-",..."0123456789"],resolve:function(a,b){let c,e;if(b){if(!A.test(a))return d}else if(!z.test(a))return d;let f=(e=1,(("-"===(c=a)[0]||"+"===c[0])&&("-"===c[0]&&(e=-1),c=c.slice(1)),c.startsWith("0b"))?e*parseInt(c.slice(2),2):c.startsWith("0o")?e*parseInt(c.slice(2),8):c.startsWith("0x")?e*parseInt(c.slice(2),16):e*parseInt(c,10));return Number.isFinite(f)?f:d},identify:a=>Number.isInteger(a)&&!Object.is(a,-0)&&0>a.toString(10).indexOf("e"),represent:a=>a.toString(10)}),C=RegExp("^(?:[-+]?0b[0-1_]+|[-+]?0[0-7_]+|[-+]?0x[0-9a-fA-F_]+|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+|[-+]?(?:0|[1-9][0-9_]*))$"),D=e("tag:yaml.org,2002:int",{implicit:!0,implicitFirstChars:["-","+",..."0123456789"],resolve:function(a){if(!C.test(a))return d;let b=function(a){let b=a.replace(/_/g,""),c=1;if(("-"===b[0]||"+"===b[0])&&("-"===b[0]&&(c=-1),b=b.slice(1)),b.startsWith("0b"))return c*parseInt(b.slice(2),2);if(b.startsWith("0x"))return c*parseInt(b.slice(2),16);if(b.includes(":")){let a=0;for(let c of b.split(":"))a=60*a+Number(c);return c*a}return"0"!==b&&"0"===b[0]?c*parseInt(b,8):c*parseInt(b,10)}(a);return Number.isFinite(b)?b:d},identify:a=>Number.isInteger(a)&&!Object.is(a,-0)&&0>a.toString(10).indexOf("e"),represent:a=>a.toString(10)}),E=RegExp("^(?:[-+]?[0-9]+(?:\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?|[-+]?\\.[0-9]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"),F=RegExp("^(?:[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"),G=e("tag:yaml.org,2002:float",{implicit:!0,implicitFirstChars:["-","+",".",..."0123456789"],resolve:function(a){if(!E.test(a))return d;let b=a.toLowerCase(),c="-"===b[0]?-1:1;if("+-".includes(b[0])&&(b=b.slice(1)),".inf"===b)return 1===c?1/0:-1/0;if(".nan"===b)return NaN;let e=c*parseFloat(b);return Number.isFinite(e)||F.test(a)?e:d},identify:a=>"number"==typeof a&&(!Number.isInteger(a)||Object.is(a,-0)||a.toString(10).indexOf("e")>=0),represent:function(a){if(isNaN(a))return".nan";if(a===1/0)return".inf";if(a===-1/0)return"-.inf";if(Object.is(a,-0))return"-0.0";let b=a.toString(10);return/^[-+]?[0-9]+e/.test(b)?b.replace("e",".e"):b}}),H=RegExp("^-?(?:0|[1-9][0-9]*)(?:\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$"),I=RegExp("^(?:[-+]?[0-9]+(?:\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?|[-+]?\\.[0-9]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"),J=e("tag:yaml.org,2002:float",{implicit:!0,implicitFirstChars:["-",..."0123456789"],resolve:function(a,b){if(b){if(!I.test(a))return d;let b=a.toLowerCase(),c="-"===b[0]?-1:1;if("+-".includes(b[0])&&(b=b.slice(1)),".inf"===b)return 1===c?1/0:-1/0;if(".nan"===b)return NaN;let e=c*parseFloat(b);return Number.isFinite(e)?e:d}if(!H.test(a))return d;let c=Number(a);return Number.isFinite(c)?c:d},identify:a=>"number"==typeof a&&(!Number.isInteger(a)||Object.is(a,-0)||a.toString(10).indexOf("e")>=0),represent:function(a){if(isNaN(a))return".nan";if(a===1/0)return".inf";if(a===-1/0)return"-.inf";if(Object.is(a,-0))return"-0.0";let b=a.toString(10);return/^[-+]?[0-9]+e/.test(b)?b.replace("e",".e"):b}}),K=RegExp("^(?:[-+]?(?:(?:[0-9][0-9_]*)?\\.[0-9_]*)(?:[eE][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"),L=RegExp("^(?:[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"),M=e("tag:yaml.org,2002:float",{implicit:!0,implicitFirstChars:["-","+",".",..."0123456789"],resolve:function(a){if(!K.test(a))return d;let b=a.toLowerCase().replace(/_/g,""),c="-"===b[0]?-1:1;if("+-".includes(b[0])&&(b=b.slice(1)),".inf"===b)return 1===c?1/0:-1/0;if(".nan"===b)return NaN;let e=0;if(b.includes(":")){for(let a of b.split(":"))e=60*e+Number(a);e*=c}else e=c*parseFloat(b);return Number.isFinite(e)||L.test(a)?e:d},identify:a=>"number"==typeof a&&(!Number.isInteger(a)||Object.is(a,-0)||a.toString(10).indexOf("e")>=0),represent:function(a){if(isNaN(a))return".nan";if(a===1/0)return".inf";if(a===-1/0)return"-.inf";if(Object.is(a,-0))return"-0.0";let b=a.toString(10);return/^[-+]?[0-9]+e/.test(b)?b.replace("e",".e"):b}}),N=e("tag:yaml.org,2002:merge",{implicit:!0,implicitFirstChars:["<"],resolve:(a,b)=>"<<"===a||b&&""===a?"<<":d,identify:()=>!1}),O=/^[A-Za-z0-9+/]*={0,2}$/,P=e("tag:yaml.org,2002:binary",{resolve:function(a){let b=a.replace(/\s/g,"");if(b.length%4!=0||!O.test(b))return d;let c=atob(b),e=new Uint8Array(c.length);for(let a=0;a<c.length;a++)e[a]=c.charCodeAt(a);return e},identify:a=>"[object Uint8Array]"===Object.prototype.toString.call(a),represent:function(a){let b="";for(let c=0;c<a.length;c++)b+=String.fromCharCode(a[c]);return btoa(b)}}),Q=RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),R=RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function S(a,b,c,d=0,e=0,f=0,g=0){let h=new Date(Date.UTC(a,b,c,d,e,f,g));return h.setUTCFullYear(a,b,c),h}var T=e("tag:yaml.org,2002:timestamp",{implicit:!0,implicitFirstChars:[..."0123456789"],resolve:function(a){let b=Q.exec(a);if(null===b&&(b=R.exec(a)),null===b)return d;let c=+b[1],e=b[2]-1,f=+b[3];if(!b[4]){let a=S(c,e,f);return a.getUTCFullYear()!==c||a.getUTCMonth()!==e||a.getUTCDate()!==f?d:a}let g=+b[4],h=+b[5],i=+b[6],j=0;if(g>23||h>59||i>59)return d;if(b[7]){let a=b[7].slice(0,3);for(;a.length<3;)a+="0";j=+a}let k=S(c,e,f,g,h,i,j);if(k.getUTCFullYear()!==c||k.getUTCMonth()!==e||k.getUTCDate()!==f)return d;if(b[9]){let a=+b[10],c=+(b[11]||0);if(a>23||c>59)return d;let e=(60*a+c)*6e4;k.setTime(k.getTime()-("-"===b[9]?-e:e))}return k},identify:a=>a instanceof Date,represent:a=>a.toISOString()}),U=f("tag:yaml.org,2002:seq",{create:()=>[],addItem:(a,b)=>{a.push(b)},identify:Array.isArray});function V(a){if(null===a||"object"!=typeof a||Array.isArray(a))return!1;let b=Object.getPrototypeOf(a);return null===b||b===Object.prototype}function W(a,b){let c={};for(let d of b)void 0!==a[d]&&(c[d]=a[d]);return c}var X=f("tag:yaml.org,2002:omap",{create:()=>({list:[],seen:new Set}),addItem:(a,b)=>{let c;if(b instanceof Map){if(1!==b.size)return"cannot resolve an ordered map item";c=b.keys().next().value}else{if(!V(b))return"cannot resolve an ordered map item";let a=Object.keys(b);if(1!==a.length)return"cannot resolve an ordered map item";c=a[0]}return a.seen.has(c)?"duplicate key in ordered map":(a.seen.add(c),a.list.push(b),"")},finalize:a=>a.list,identify:()=>!1}),Y=f("tag:yaml.org,2002:pairs",{create:()=>[],addItem:(a,b)=>{if(b instanceof Map)return 1!==b.size?"cannot resolve a pairs item":(a.push(b.entries().next().value),"");if("[object Object]"!==Object.prototype.toString.call(b))return"cannot resolve a pairs item";let c=Object.keys(b);return 1!==c.length?"cannot resolve a pairs item":(a.push([c[0],b[c[0]]]),"")},identify:()=>!1}),Z=g("tag:yaml.org,2002:map",{create:()=>({}),identify:V,represent:a=>{let b=new Map;for(let c of Object.keys(a))b.set(c,a[c]);return b},addPair:(a,b,c)=>{if(null!==b&&"object"==typeof b)return"object-based map does not support complex keys";let d=String(b);return"__proto__"===d?Object.defineProperty(a,d,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[d]=c,""},has:(a,b)=>(null===b||"object"!=typeof b)&&Object.prototype.hasOwnProperty.call(a,String(b)),keys:a=>Object.keys(a),get:(a,b)=>{let c=String(b);return Object.prototype.hasOwnProperty.call(a,c)?a[c]:null}}),$=g("tag:yaml.org,2002:set",{create:()=>new Set,identify:a=>a instanceof Set,represent:a=>{let b=new Map;for(let c of a)b.set(c,null);return b},addPair:(a,b,c)=>null!==c?"cannot resolve a set item":(a.add(b),""),has:(a,b)=>a.has(b),keys:a=>a.keys(),get:()=>null}),_=class a{tags;implicitScalarTags;implicitScalarByFirstChar;implicitScalarAnyFirstChar;defaultScalarTag;defaultSequenceTag;defaultMappingTag;exact;prefix;constructor(a){const b=function(a){let b=[];for(let c of a){let a=b.length;for(let d=0;d<b.length;d++){let e=b[d];if(e.nodeKind===c.nodeKind&&e.tagName===c.tagName&&e.matchByTagPrefix===c.matchByTagPrefix){a=d;break}}b[a]=c}return b}(a),c=[],d={scalar:Object.create(null),sequence:Object.create(null),mapping:Object.create(null)},e={scalar:[],sequence:[],mapping:[]};for(const a of b){if("scalar"===a.nodeKind&&a.implicit){if(a.matchByTagPrefix)throw Error("Implicit scalar tags cannot match by tag prefix");c.push(a)}switch(a.nodeKind){case"scalar":a.matchByTagPrefix?e.scalar.push(a):d.scalar[a.tagName]=a;break;case"sequence":a.matchByTagPrefix?e.sequence.push(a):d.sequence[a.tagName]=a;break;case"mapping":a.matchByTagPrefix?e.mapping.push(a):d.mapping[a.tagName]=a}}const f=c.filter(a=>null===a.implicitFirstChars),g=new Set;for(const a of c)if(null!==a.implicitFirstChars)for(const b of a.implicitFirstChars)g.add(b);const h=new Map;for(const a of g)h.set(a,c.filter(b=>null===b.implicitFirstChars||-1!==b.implicitFirstChars.indexOf(a)));const i=d.scalar["tag:yaml.org,2002:str"];if(!i)throw Error("schema does not define the default scalar tag (tag:yaml.org,2002:str)");this.tags=b,this.implicitScalarTags=c,this.implicitScalarByFirstChar=h,this.implicitScalarAnyFirstChar=f,this.defaultScalarTag=i,this.defaultSequenceTag=d.sequence["tag:yaml.org,2002:seq"],this.defaultMappingTag=d.mapping["tag:yaml.org,2002:map"],this.exact=d,this.prefix=e}lookupScalarTag(a){let b=this.exact.scalar[a];if(b)return b;for(let b of this.prefix.scalar)if(a.startsWith(b.tagName))return b}lookupSequenceTag(a){let b=this.exact.sequence[a];if(b)return b;for(let b of this.prefix.sequence)if(a.startsWith(b.tagName))return b}lookupMappingTag(a){let b=this.exact.mapping[a];if(b)return b;for(let b of this.prefix.mapping)if(a.startsWith(b.tagName))return b}resolveImplicitScalarTag(a){for(let b of this.implicitScalarByFirstChar.get(a.charAt(0))??this.implicitScalarAnyFirstChar){let c=b.resolve(a,!1,b.tagName);if(c!==d)return{value:c,tag:b}}let b=this.defaultScalarTag;return{value:b.resolve(a,!1,b.tagName),tag:b}}withTags(...b){let c=[];for(let a of b)c=c.concat(a);return new a([...this.tags,...c])}},aa=new _([h,U,Z]);new _([...aa.tags,k,s,B,J]);var ab=new _([...aa.tags,j,p,y,G]),ac=new _([...aa.tags,m,v,D,M,T,N,P,X,Y,$]).withTags({...D,resolve:(a,b,c)=>{let e=D.resolve(a,b,c);return e===d?y.resolve(a,b,c):e}},{...M,resolve:(a,b,c)=>{let e=M.resolve(a,b,c);return e===d?G.resolve(a,b,c):e}});function ad(a){if(Array.isArray(a)){let b=Array.prototype.slice.call(a);for(let a=0;a<b.length;a++){if(Array.isArray(b[a]))return null;"object"==typeof b[a]&&"[object Object]"===Object.prototype.toString.call(b[a])&&(b[a]="[object Object]")}return String(b)}return"object"==typeof a&&"[object Object]"===Object.prototype.toString.call(a)?"[object Object]":String(a)}g("tag:yaml.org,2002:map",{create:()=>new Map,addPair:(a,b,c)=>(a.set(b,c),""),has:(a,b)=>a.has(b),keys:a=>a.keys(),get:(a,b)=>a.get(b),identify:a=>a instanceof Map||V(a),represent:a=>{if(a instanceof Map)return a;let b=new Map;for(let c of Object.keys(a))b.set(c,a[c]);return b}}),g("tag:yaml.org,2002:map",{create:()=>({}),identify:V,represent:a=>{let b=new Map;for(let c of Object.keys(a))b.set(c,a[c]);return b},addPair:(a,b,c)=>{let d=ad(b);return null===d?"nested arrays are not supported inside keys":("__proto__"===d?Object.defineProperty(a,d,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[d]=c,"")},has:(a,b)=>{let c=ad(b);return null!==c&&Object.prototype.hasOwnProperty.call(a,c)},keys:a=>Object.keys(a),get:(a,b)=>{let c=String(b);return Object.prototype.hasOwnProperty.call(a,c)?a[c]:null}});var ae={maxLength:79,indent:1,linesBefore:3,linesAfter:2};function af(a,b,c,d,e){let f="",g="",h=Math.floor(e/2)-1;return d-b>h&&(b=d-h+(f=" ... ").length),c-d>h&&(c=d+h-(g=" ...").length),{str:f+a.slice(b,c).replace(/\t/g,"→")+g,pos:d-b+f.length}}function ag(a,b){return" ".repeat(Math.max(b-a.length,0))+a}function ah(a,b){let c="";return a.mark?(a.mark.name&&(c+=`in "${a.mark.name}" `),c+=`(${a.mark.line+1}:${a.mark.column+1})`,!b&&a.mark.snippet&&(c+=`
18
18
 
19
19
  ${a.mark.snippet}`),`${a.reason} ${c}`):a.reason}var ai=class a extends Error{reason;mark;constructor(a,b){super(),this.name="YAMLException",this.reason=a,this.mark=b,this.message=ah(this,!1),Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}toString(a){return`${this.name}: ${ah(this,a)}`}static throwAt(b,c,d,e=""){let f=0,g=0;for(let a=0;a<c;a++){let c=b.charCodeAt(a);10===c?(f++,g=a+1):13===c&&(f++,10===b.charCodeAt(a+1)&&a++,g=a+1)}let h={name:e,buffer:b,position:c,line:f,column:c-g};throw h.snippet=function(a){let b;if(!a.buffer)return null;let c={...ae,...void 0},d=/\r?\n|\r|\0/g,e=[0],f=[],g=-1;for(;b=d.exec(a.buffer);)f.push(b.index),e.push(b.index+b[0].length),a.position<=b.index&&g<0&&(g=e.length-2);g<0&&(g=e.length-1);let h="",i=Math.min(a.line+c.linesAfter,f.length).toString().length,j=c.maxLength-(c.indent+i+3);for(let b=1;b<=c.linesBefore&&!(g-b<0);b++){let d=af(a.buffer,e[g-b],f[g-b],a.position-(e[g]-e[g-b]),j);h=`${" ".repeat(c.indent)}${ag((a.line-b+1).toString(),i)} | ${d.str}
20
20
  ${h}`}let k=af(a.buffer,e[g],f[g],a.position,j);h+=`${" ".repeat(c.indent)}${ag((a.line+1).toString(),i)} | ${k.str}
@@ -46,4 +46,4 @@ The turn is waiting for typed input — answer it in the Pi Web session (it is i
46
46
  ${c.message}`:""}`:`❓ ${c.title}`;try{let f=await (0,e._z)(a,b,d,{replyMarkup:{inline_keyboard:"confirm"===c.method?[[{text:"✅ Confirm",callback_data:`ui:${c.id}:y`},{text:"❌ Cancel",callback_data:`ui:${c.id}:n`}]]:(c.options??[]).slice(0,8).map((a,b)=>[{text:a.length>60?`${a.slice(0,57)}…`:a,callback_data:`ui:${c.id}:${b}`}])}});G.set(c.id,{chatId:b,kind:c.method,options:c.options,messageId:f.message_id})}catch(a){console.warn(`[pi-web] telegram chat ${b}: offering an approval failed: ${a instanceof Error?a.message:String(a)}`)}}async function w(a,b){let c=b.data??"";if(!c.startsWith("ui:"))return void await (0,e.GE)(a,b.id).catch(()=>{});let[,d,g]=c.split(":"),h=G.get(d),i=h?.chatId??b.message?.chat.id;if(!h||void 0===i)return void await (0,e.GE)(a,b.id,"Expired").catch(()=>{});let k=(0,f.ju)().chats[String(h.chatId)],l=k?(0,j.A4)(k.sessionId):void 0;if(!l||!l.isAlive())return void await (0,e.GE)(a,b.id,"Session gone").catch(()=>{});let m="";try{if("confirm"===h.kind){let a="y"===g;m=a?"✅ Confirmed":"❌ Cancelled",await l.send({type:"extension_ui_response",id:d,confirmed:a})}else{let a=h.options?.[Number(g)];if(void 0===a)throw Error("No such option");m=a,await l.send({type:"extension_ui_response",id:d,value:a})}}catch(c){console.warn(`[pi-web] telegram chat ${h.chatId}: answering an approval failed: ${c instanceof Error?c.message:String(c)}`),await (0,e.GE)(a,b.id,"Failed").catch(()=>{});return}G.delete(d),await (0,e.GE)(a,b.id,"✓").catch(()=>{}),await (0,e.XQ)(a,h.chatId,h.messageId,`✓ Chosen: ${m}`).catch(()=>{})}function x(a,b,c){let d=(async()=>{let d=(0,f.Yf)(),j=await (0,g.Bz)(b,c,d,()=>(0,e.FV)(a,b)),k=s(b);if(j.error){let c=`❌ ${j.error}`;null!==k.messageId&&c.length<=h.mN?(await u(a,b,c),k.messageId=null):(null!==k.messageId&&await (0,e.RC)(a,b,k.messageId).catch(()=>{}),k.messageId=null,await r(a,b,c));return}if(j.aborted){let c=""!==j.reply.trim()?j.reply:"⏹ Stopped.";null!==k.messageId&&c.length<=h.mN?(await u(a,b,c),k.messageId=null):(null!==k.messageId&&await (0,e.RC)(a,b,k.messageId).catch(()=>{}),k.messageId=null,await r(a,b,c));return}if(""===j.reply.trim()){let c="✅ The turn finished without a text reply.";null!==k.messageId?(await u(a,b,c),k.messageId=null):await r(a,b,c);return}if(null!==k.messageId){if(await (0,i.p7)(a,b,k.messageId,j.reply)){k.messageId=null;return}if(j.reply.length<=h.mN){await u(a,b,j.reply),k.messageId=null;return}await (0,e.RC)(a,b,k.messageId).catch(()=>{})}k.messageId=null,await r(a,b,j.reply)})().finally(()=>{E.get(b)===d&&E.delete(b)});E.set(b,d)}async function y(a,b,c){let d,f,g=c.photo?.[c.photo.length-1];if(!g)return;await (0,e.FV)(a,b).catch(()=>{});try{({bytes:d,mimeType:f}=await (0,e.PE)(a,g.file_id))}catch(c){await r(a,b,`❌ Downloading the photo failed: ${c instanceof Error?c.message:String(c)}`);return}let h=[{type:"image",data:d.toString("base64"),mimeType:f&&f.startsWith("image/")?f:"image/jpeg"}];x(a,b,{text:c.caption?.trim()||"Look at this image.",images:h})}async function z(a,b,c){let d,f=c.voice;if(f){try{({bytes:d}=await (0,e.PE)(a,f.file_id))}catch(c){await r(a,b,`❌ Downloading the voice message failed: ${c instanceof Error?c.message:String(c)}`);return}try{let c=new FormData;c.append("file",new Blob([d],{type:"audio/ogg"}),"voice.ogg"),c.append("model","whisper-1");let e=await fetch("http://127.0.0.1:1234/v1/audio/transcriptions",{method:"POST",body:c,signal:AbortSignal.timeout(6e4)});if(!e.ok)throw Error(`HTTP ${e.status}`);let f=await e.json(),g=f.text?.trim();if(!g)throw Error("empty transcript");x(a,b,{text:`${g}
47
47
  (a voice message, transcribed)`})}catch(c){await r(a,b,`🎤 Voice transcription is unavailable (${c instanceof Error?c.message:String(c)}). Please type, or send a photo.`)}}}async function A(a,b){if(b.callback_query)return void await w(a,b.callback_query);let c=b.message??b.edited_message;if(!c)return;let d=c.chat.id,i=c.chat.title??(c.chat.username?`@${c.chat.username}`:null)??([c.chat.first_name,c.chat.last_name].filter(Boolean).join(" ")||null),k=(0,f.Yf)();if(!k.allowedChats.some(a=>a.id===d))return void await (0,f.zk)(a=>({state:{...a,lastUnknownChat:{id:d,title:i,at:Date.now()}},changed:!0})).catch(()=>{});let m=(c.text??"").trim(),n=l().info.botUsername;if("group"===c.chat.type||"supergroup"===c.chat.type){let a=null!==n&&m.includes(`@${n}`),b=c.reply_to_message?.from?.username!==void 0&&c.reply_to_message.from.username===n,d=m.startsWith("/")&&(a||b);if(!a&&!b&&!d)return;null!==n&&(m=m.split(`@${n}`).join("").trim())}if(c.voice)return void await z(a,d,c);if(c.photo?.length)return void await y(a,d,c);if(""!==m){if("/start"===m||"/help"===m)return void await r(a,d,D);if("/new"===m){let b=await (0,g.oG)(d,k);await r(a,d,b.error?`❌ ${b.error}`:"\uD83C\uDD95 New session started. The old one stays in the sidebar.");return}if("/stop"===m){let b=(0,f.ju)().chats[String(d)],c=b?(0,j.A4)(b.sessionId):void 0;if(!c||!c.isAlive()||!c.isRunning())return void await r(a,d,"\uD83D\uDCA4 No turn is running.");try{await c.send({type:"abort"}),await r(a,d,"⏹ Stopping…")}catch(b){await r(a,d,`❌ Stop failed: ${b instanceof Error?b.message:String(b)}`)}return}if("/name"===m||m.startsWith("/name ")){let b=m.slice(5).trim();if(""===b){let b=(0,f.ju)().chats[String(d)],c=b?(0,j.A4)(b.sessionId):void 0,e=c&&c.isAlive()?await c.send({type:"get_state"}):null;await r(a,d,e?.sessionName?`📌 Current name: ${e.sessionName}`:"\uD83D\uDCCC No name yet. Use /name <title>.");return}let c=await (0,g.Kb)(d,k,async a=>(await a.send({type:"set_session_name",name:b}),{outcome:"named"}));await r(a,d,"error"in c?`❌ ${c.error}`:`✏️ Session named “${b}”.`);return}if("/compact"===m){let b=await (0,g.Kb)(d,k,async b=>(await r(a,d,"\uD83E\uDDF9 Compacting…"),await b.send({type:"compact"}),{outcome:"compacted"}));await r(a,d,"error"in b?`❌ ${b.error}`:"✅ Session compacted.");return}if("/status"===m){let b=(0,f.ju)().chats[String(d)],c=E.has(d)||!!b&&(0,j.A4)(b.sessionId)?.isRunning()===!0,e=b?`Session ${b.sessionId.slice(0,8)} in ${c?"a running turn":"idle"}.`:"No session yet; send a message to start one.";await r(a,d,c?`⏳ ${e} Later messages queue as follow-ups.`:`💤 ${e}`);return}if(m.startsWith("/"))return void await r(a,d,"Unknown command.\n\n"+D);E.has(d)&&await (0,e.FV)(a,d).catch(()=>{}),t(a,d,"…"),x(a,d,{text:m,onProgress:b=>{let c=s(d),e=b.length>h.mN-10?`${b.slice(0,h.mN-12)}…
48
48
  ▍`:`${b}
49
- ▍`;(null===c.messageId||function(a,b,c=Date.now()){return!(c-a.lastEditAt<1500)&&(b.length-a.lastLen>=40||b.length<200&&""!==b&&0===a.lastLen)}(c,e))&&u(a,d,e)},onUiRequest:b=>{v(a,d,b)}})}}d()}catch(a){d(a)}})},83267:(a,b,c)=>{"use strict";function d(a){if(!a.startsWith("npm:"))return;let b=a.slice(4).trim(),c=b.match(/^(@?[^@]+(?:\/[^@]+)?)(?:@(.+))?$/);return{name:c?.[1]??b,spec:b,version:c?.[2]}}c.d(b,{e:()=>d})},84762:(a,b,c)=>{"use strict";let d=c(33873),e=c(95415),f=c(16794),g=c(28718),h=c(678),i={};function j(a,b){return b.lockfilePath||`${a}.lock`}function k(a,b,c){if(!b.realpath)return c(null,d.resolve(a));b.fs.realpath(a,c)}function l(a,b){return a.mtime.getTime()<Date.now()-b.stale}function m(a,b,c){b.fs.rmdir(j(a,b),a=>{if(a&&"ENOENT"!==a.code)return c(a);c()})}function n(a,b,c){b.released=!0,b.updateTimeout&&clearTimeout(b.updateTimeout),i[a]===b&&delete i[a],b.options.onCompromised(c)}function o(a,b,c){k(a,b={fs:e,realpath:!0,...b},(a,d)=>{if(a)return c(a);let e=i[d];if(!e)return c(Object.assign(Error("Lock is not acquired/owned by you"),{code:"ENOTACQUIRED"}));e.updateTimeout&&clearTimeout(e.updateTimeout),e.released=!0,delete i[d],m(d,b,c)})}g(()=>{for(let a in i){let b=i[a].options;try{b.fs.rmdirSync(j(a,b))}catch(a){}}}),a.exports.lock=function(a,b,c){(b={stale:1e4,update:null,realpath:!0,retries:0,fs:e,onCompromised:a=>{throw a},...b}).retries=b.retries||0,b.retries="number"==typeof b.retries?{retries:b.retries}:b.retries,b.stale=Math.max(b.stale||0,2e3),b.update=null==b.update?b.stale/2:b.update||0,b.update=Math.max(Math.min(b.update,b.stale/2),1e3),k(a,b,(a,d)=>{if(a)return c(a);let e=f.operation(b.retries);e.attempt(()=>{!function a(b,c,d){let e=j(b,c);c.fs.mkdir(e,f=>f?"EEXIST"!==f.code?d(f):c.stale<=0?d(Object.assign(Error("Lock file is already being held"),{code:"ELOCKED",file:b})):void c.fs.stat(e,(e,f)=>e?"ENOENT"===e.code?a(b,{...c,stale:0},d):d(e):l(f,c)?void m(b,c,e=>{if(e)return d(e);a(b,{...c,stale:0},d)}):d(Object.assign(Error("Lock file is already being held"),{code:"ELOCKED",file:b}))):h.probe(e,c.fs,(a,b,f)=>{if(a)return c.fs.rmdir(e,()=>{}),d(a);d(null,b,f)}))}(d,b,(a,f,g)=>{if(e.retry(a))return;if(a)return c(e.mainError());let k=i[d]={lockfilePath:j(d,b),mtime:f,mtimePrecision:g,options:b,lastUpdate:Date.now()};!function a(b,c){let d=i[b];!d.updateTimeout&&(d.updateDelay=d.updateDelay||c.update,d.updateTimeout=setTimeout(()=>{d.updateTimeout=null,c.fs.stat(d.lockfilePath,(e,f)=>{let g=d.lastUpdate+c.stale<Date.now();if(e)return"ENOENT"===e.code||g?n(b,d,Object.assign(e,{code:"ECOMPROMISED"})):(d.updateDelay=1e3,a(b,c));if(d.mtime.getTime()!==f.mtime.getTime())return n(b,d,Object.assign(Error("Unable to update lock within the stale threshold"),{code:"ECOMPROMISED"}));let i=h.getMtime(d.mtimePrecision);c.fs.utimes(d.lockfilePath,i,i,e=>{let f=d.lastUpdate+c.stale<Date.now();if(!d.released){if(e)return"ENOENT"===e.code||f?n(b,d,Object.assign(e,{code:"ECOMPROMISED"})):(d.updateDelay=1e3,a(b,c));d.mtime=i,d.lastUpdate=Date.now(),d.updateDelay=null,a(b,c)}})})},d.updateDelay),d.updateTimeout.unref&&d.updateTimeout.unref())}(d,b),c(null,a=>{if(k.released)return a&&a(Object.assign(Error("Lock is already released"),{code:"ERELEASED"}));o(d,{...b,realpath:!1},a)})})})})},a.exports.unlock=o,a.exports.check=function(a,b,c){(b={stale:1e4,realpath:!0,fs:e,...b}).stale=Math.max(b.stale||0,2e3),k(a,b,(a,d)=>{if(a)return c(a);b.fs.stat(j(d,b),(a,d)=>a?"ENOENT"===a.code?c(null,!1):c(a):c(null,!l(d,b)))})},a.exports.getLocks=function(){return i}},85844:(a,b,c)=>{"use strict";function d(a){return{name:"pi-web-exact-system-prompt",hidden:!0,factory:b=>{b.on("before_agent_start",()=>{let b=a();return void 0===b?void 0:{systemPrompt:b}})}}}c.d(b,{Q:()=>d})},86588:(a,b,c)=>{"use strict";c.d(b,{wz:()=>e});var d=c(97136);function e(a){if(!a)return;let b=(0,d.W3)(a);(!globalThis.__piAdditionalAllowedRoots&&(globalThis.__piAdditionalAllowedRoots=new Set),globalThis.__piAdditionalAllowedRoots).add(b),globalThis.__piAllowedRootsCache?.roots.add(b)}},88264:(a,b,c)=>{"use strict";c.a(a,async(a,b)=>{try{c(73024),c(76760);var d=c(75430);c(94807);var e=a([d]);d=(e.then?(await e)():e)[0],b()}catch(a){b(a)}})},88461:(a,b,c)=>{"use strict";c.d(b,{Rq:()=>g,p7:()=>h});var d=c(14968),e=c(90379);async function f(a,b,c){if((0,e.As)(c))try{await (0,d.M3)(a,b,(0,e.TS)(c));return}catch(a){if(!(a instanceof d.ak))throw a}try{await (0,d._z)(a,b,(0,e.LQ)(c),{parseMode:"HTML"})}catch(e){if(e instanceof d.ak&&400===e.statusCode)return void await (0,d._z)(a,b,c);throw e}}async function g(a,b,c){let g=c.trim();if(""!==g){if((0,e.As)(g)&&g.length<=32e3)try{await (0,d.M3)(a,b,(0,e.TS)(g));return}catch(a){if(!(a instanceof d.ak))throw a}for(let c of(0,e.TT)(g))await f(a,b,c)}}async function h(a,b,c,f){if(!(0,e.As)(f)||f.trim().length>32e3)return!1;try{return await (0,d.XQ)(a,b,c,"",{richMarkdown:(0,e.TS)(f.trim())}),!0}catch(a){if(!(a instanceof d.ak))throw a;return!1}}},89076:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{Pn:()=>h,xW:()=>e.xW});var e=c(20946),f=c(36561),g=a([f]);function h(a,b={}){let c=b.platform??process.platform;return(d,g,h)=>{var i;let j,k=(i=d.config,(j=(0,e.tF)(i,a))&&("oauth-client-secret"===j.kind?"oauth.clientSecret":`${j.kind} "${j.name}"`));if(k)throw Error(`MCP server "${d.name}" ${k} references ${e.aS}, which Pi Web does not pass to MCP servers`);let l=a.createDefaultTransport(d,g,h);if("url"in d.config)return l;if(!(l instanceof a.StdioTransport))throw Error(`MCP server "${d.name}": the SDK did not create a stdio transport`);let{env:m={},...n}=l.options,o=new Set(Object.keys(d.config.env??{})),p=Object.keys(m).find(a=>!o.has(a));if(void 0!==p)throw Error(`MCP server "${d.name}": the SDK set environment variable ${p}, which its config does not declare`);return new a.StdioTransport({...n,env:function(a,b,c){let d={};for(let[b,e]of Object.entries((0,f.$9)(a,c)))void 0!==e&&(d[b]=e);for(let[a,e]of Object.entries(b)){if("win32"===c)for(let b of Object.keys(d))b.toUpperCase()===a.toUpperCase()&&delete d[b];d[a]=e}return d}(b.baseEnvironment??process.env,m,c),inheritEnv:!1})}}f=(g.then?(await g)():g)[0],d()}catch(a){d(a)}})},89420:(a,b,c)=>{"use strict";c.d(b,{TU:()=>j,o4:()=>h,qy:()=>i,xk:()=>k});var d=c(29021),e=c(33873),f=c.n(e),g=c(97136);function h(a,b){for(let c of b){let b=(0,g.uK)(a)||(0,g.uK)(c),d=b?f().win32:f(),e=b?"\\":f().sep,h=d.resolve(a),i=d.resolve(c),j=b?h.toLowerCase():h,k=b?i.toLowerCase():i,l=k.endsWith(e)?k:k+e;if(j===k||j.startsWith(l))return!0}return!1}function i(a){let b=new Set;for(let c of a)try{b.add((0,d.realpathSync)(c))}catch{}return b}function j(a){let b="win32"===process.platform||(0,g.uK)(a)?/[\\/]/:"/";return a.split(b).includes("..")}function k(a,b){let c;if(j(a))return!1;try{c=(0,d.realpathSync)(a)}catch{return!1}return h(c,i(b))}},89717:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{wz:()=>e.wz});var e=c(86588);c(89420);var f=c(57432);c(97136);var g=a([f]);f=(g.then?(await g)():g)[0],d()}catch(a){d(a)}})},90053:a=>{"use strict";a.exports=JSON.parse('{"TB":"https://github.com/mcy2015/pi-web#readme"}')},90379:(a,b,c)=>{"use strict";c.d(b,{As:()=>l,LQ:()=>n,TS:()=>m,TT:()=>f,mN:()=>d,qh:()=>e});let d=4096;function e(a){let b=a.content;if("string"==typeof b)return b;if(Array.isArray(b)){let a=[];for(let c of b)c&&"object"==typeof c&&!Array.isArray(c)&&"text"===c.type&&"string"==typeof c.text&&a.push(c.text);return a.join("\n\n")}return""}function f(a,b=d){let c=a.trim();if(""===c)return[];if(c.length<=b)return[c];let e=[],g=c;for(;g.length>b;){let a=g.slice(0,b),c=Math.max(a.lastIndexOf("\n\n"),a.lastIndexOf("\n"),a.lastIndexOf(" ")),d=c>0?c:b;e.push(g.slice(0,d)),g=g.slice(d).replace(/^\s+/,"")}return""!==g&&e.push(g),e}function g(a){return a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}let h=/```[\s\S]*?```/g;function i(a){let b=a.trim();return b.startsWith("|")&&-1!==b.indexOf("|",1)}function j(a){return/^[\s|:-]*-[\s|:-]*$/.test(a.trim())&&a.includes("-")}function k(a){let b=a.trim();return b.startsWith("|")&&(b=b.slice(1)),b.endsWith("|")&&(b=b.slice(0,-1)),b.replace(/\\\|/g,"\x03").split("|").map(a=>a.trim().replace(/\u0003/g,"|"))}function l(a){let b=a.replace(h,"").split("\n");for(let a=0;a+1<b.length;a++)if(i(b[a])&&j(b[a+1]))return!0;return!1}function m(a){let b=[],c=a.replace(h,a=>(b.push(a),`\u0000${b.length-1}\u0000`)),d=[];c=c.replace(/`[^`\n]+`/g,a=>(d.push(a),`\u0001${d.length-1}\u0001`));let e=[];return(c=(c=(c=(c=c.replace(/\[[^\]\n]*\]\([^)\n]*\)/g,a=>(e.push(a),`\u0002${e.length-1}\u0002`))).split(/(\s+)/).map(a=>a.replace(/[A-Za-z0-9._~/@-]+/g,a=>!a.includes("_")||a.startsWith("_")||a.endsWith("_")?a:`\`${a}\``)).join("")).replace(/\u0002(\d+)\u0002/g,(a,b)=>e[Number(b)]??"")).replace(/\u0001(\d+)\u0001/g,(a,b)=>d[Number(b)]??"")).replace(/\u0000(\d+)\u0000/g,(a,c)=>b[Number(c)]??"")}function n(a){let b=[],c=a.replace(/```[a-zA-Z0-9+#-]*\n?([\s\S]*?)```/g,(a,c)=>(b.push(`<pre>${g(c.replace(/\n$/,""))}</pre>`),`\u0000${b.length-1}\u0000`));return(c=(c=(c=(c=(c=(c=(c=g(c=function(a){let b=a.split("\n"),c=[],d=0;for(;d<b.length;){if(i(b[d])&&d+1<b.length&&j(b[d+1])){let a=k(b[d]);d+=2;let e=[];for(;d<b.length&&i(b[d]);){let c=function(a,b){let c=[],d=b[0]??"";""!==d&&c.push(`**${d}**`);for(let d=1;d<b.length;d++){let e=b[d];(""!==e||(a[d]??"")!=="")&&c.push(a[d]?`${a[d]}: ${e}`:e)}return c.join("\n")}(a,k(b[d]));""!==c&&e.push(c),d++}e.length>0&&c.push(e.join("\n\n"),"");continue}c.push(b[d]),d++}return c.join("\n")}(c))).replace(/`([^`\n]+)`/g,"<code>$1</code>")).replace(/\[([^\]\n]+)\]\((https?:\/\/[^\s)]+)\)/g,'<a href="$2">$1</a>')).replace(/\*\*([^*\n]+)\*\*/g,"<b>$1</b>")).replace(/(?<!\*)\*([^*\n]+)\*(?!\*)/g,"<i>$1</i>")).replace(/^#{1,6}[ \t]+(.+)$/gm,"<b>$1</b>")).replace(/^([ \t]*)[-*+][ \t]+/gm,"$1• ")).replace(/\u0000(\d+)\u0000/g,(a,c)=>b[Number(c)]??"")}},90714:(a,b,c)=>{"use strict";function d(a,b,c){let d=globalThis,e=d[a]??=new Map,f=(e.get(b)??Promise.resolve()).then(c),g=f.then(()=>void 0,()=>void 0);return e.set(b,g),g.then(()=>{e.get(b)===g&&e.delete(b)}),f}c.d(b,{T:()=>d})},93391:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{wQ:()=>g});var e=c(88264),f=a([e]);e=(f.then?(await f)():f)[0];let h=new Set(["bash","powershell"]);function g(a,b,c=process.platform){return function(a,b){let c=b?"powershell":"bash",d=[];for(let b of a){let a=h.has(b)?c:b;d.includes(a)||d.push(a)}return d}(a,function(a,b=process.platform){return"win32"===b&&a?.includes("powershell")===!0&&!a.includes("bash")}(b,c))}d()}catch(a){d(a)}})},94343:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{q8:()=>y});var e=c(77598),f=c(73024),g=c(51455),h=c(76760),i=c(75430),j=c(73706),k=a([i]);function l(a){return null!==a&&"object"==typeof a&&!Array.isArray(a)}i=(k.then?(await k)():k)[0];let z=Buffer.from("\n");function m(a){if(!a.trim())return null;try{let b=JSON.parse(a);return b&&"object"==typeof b?b:null}catch{return null}}async function n(a){let b;try{b=await (0,g.open)(a,"r");let c=Buffer.allocUnsafe(65536),{bytesRead:d}=await b.read(c,0,c.length,0);if(d<=0)return null;for(let a of c.subarray(0,d).toString("utf8").split("\n")){let b=m(a.replace(/\r$/,""));if(b)return"session"===b.type?b:null}return null}catch{return null}finally{await b?.close().catch(()=>void 0)}}async function o(a,b){let c=await n(a);if(!c||"string"!=typeof c.id||"string"!=typeof c.cwd||"string"!=typeof c.timestamp)return null;let d=new Date(c.timestamp);return Number.isFinite(d.getTime())?{path:a,id:c.id,cwd:c.cwd,created:d,modified:new Date(b.mtimeMs),messageCount:0,firstMessage:"",..."string"==typeof c.parentSession?{parentSessionPath:c.parentSession}:{},detailsPending:!0}:null}function p(a,b){return(0,e.createHash)("sha1").update(a).update(b).digest("base64")}async function q(a,b,c,d){let e=b,g=[],h=[c];for await(let c of(0,f.createReadStream)(a,{start:b})){let a=c.indexOf(10);if(-1===a){g.push(c);continue}let b=g,f=0;for(;-1!==a;){let b=c.subarray(f,a),h=g.length>0?Buffer.concat([...g,b]):b;if(g=[],e+=h.length+1,!d(h,e))return null;f=a+1,a=c.indexOf(10,f)}h=function(a){let b=0;for(let c of a)b+=c.length;let c=0;for(;c<a.length-1&&b-a[c].length>=512;)b-=a[c].length,c++;return c>0?a.slice(c):a}([...h,...b,c.subarray(0,f)]),f<c.length&&g.push(c.subarray(f))}let i=Buffer.concat(h);return{offset:e,sample:i.subarray(Math.max(0,i.length-512)),rest:Buffer.concat(g)}}async function r(a,b){let c=await (0,g.open)(a,"r");try{let a=Math.max(0,b.offset-512),d=Buffer.alloc(b.headerEnd),e=Buffer.alloc(b.offset-a),f=await c.read(d,0,d.length,0),g=await c.read(e,0,e.length,a);if(f.bytesRead!==d.length||g.bytesRead!==e.length)return null;return p(d,e)===b.check?{head:d,tail:e}:null}finally{await c.close()}}async function s(a,b){try{let c=await (0,g.stat)(a),d=b?.resume&&b.resume.ino===c.ino?await r(a,b.resume):null,e=null,f=0,h=0,i=Buffer.alloc(0),j={messageCount:0,firstMessage:""};if(b?.resume&&d){let{info:a,resume:c}=b;h=c.offset,i=d.tail,e={id:a.id,cwd:a.cwd,created:new Date(a.created.getTime()),parentSessionPath:a.parentSessionPath,time:a.created.getTime(),head:d.head},f=c.headerEnd,j.name=a.name,j.messageCount=a.messageCount,j.firstMessage=c.hasFirstMessage?a.firstMessage:"",j.lastActivityTime=c.lastActivityTime}let k=!1,l=(a,b)=>{let c;for(let g of(c=a.toString("utf8")).includes("\r")?c.split("\r"):[c]){let c=m(g);if(c){if(null===b&&(k=!0),!e){var d;if("session"!==c.type)return!1;let g=null!==b&&b===a.length+1;d=g?Buffer.concat([a,z]):void 0,e={id:c.id,cwd:"string"==typeof c.cwd?c.cwd:"",created:new Date(c.timestamp),parentSessionPath:"string"==typeof c.parentSession?c.parentSession:void 0,time:"string"==typeof c.timestamp?new Date(c.timestamp).getTime():NaN,head:"string"==typeof c.id&&"string"==typeof c.timestamp?d:void 0},f=g?b:0;continue}!function(a,b){if("session_info"===b.type&&(a.name="string"==typeof b.name&&b.name.trim()?b.name.trim():void 0),"message"!==b.type)return;a.messageCount++;let c=function(a){let b=a.message;if(!b||"string"!=typeof b.role||!("content"in b)||"user"!==b.role&&"assistant"!==b.role)return;if("number"==typeof b.timestamp)return b.timestamp;let c=new Date(a.timestamp).getTime();return Number.isNaN(c)?void 0:c}(b);if("number"==typeof c&&(a.lastActivityTime=Math.max(a.lastActivityTime??0,c)),a.firstMessage)return;let d=b.message;if(d&&"string"==typeof d.role&&"content"in d&&"user"===d.role){let b;b=d.content,a.firstMessage="string"==typeof b?b:Array.isArray(b)?b.filter(a=>!!a&&"object"==typeof a&&"text"===a.type&&"string"==typeof a.text).map(a=>a.text).join(" "):""}}(j,c)}}return!0},n=await q(a,h,i,l);if(!n||n.rest.length>0&&!l(n.rest,null)||!e)return null;let{id:o,cwd:s,created:t,parentSessionPath:u,time:v,head:w}=e,x="number"==typeof j.lastActivityTime&&j.lastActivityTime>0?new Date(j.lastActivityTime):Number.isNaN(v)?c.mtime:new Date(v);return{info:{path:a,id:o,cwd:s,name:j.name,parentSessionPath:u,created:t,modified:x,messageCount:j.messageCount,firstMessage:j.firstMessage||"(no messages)"},resume:w&&f>0&&!k&&c.ino>0?{ino:c.ino,offset:n.offset,headerEnd:f,check:p(w,n.sample),hasFirstMessage:""!==j.firstMessage,...void 0!==j.lastActivityTime?{lastActivityTime:j.lastActivityTime}:{}}:void 0}}catch{return null}}async function t(a){let b;try{b=(await (0,g.readdir)(a,{withFileTypes:!0})).filter(a=>a.isDirectory()||a.isSymbolicLink())}catch{return[]}let c=[];for(let d of b){let b=(0,h.join)(a,d.name);try{for(let a of(await (0,g.readdir)(b)))a.endsWith(".jsonl")&&c.push((0,h.join)(b,a))}catch{}}return c}async function u(a,b){let c=0,d=new Set;for(;c<a.length||d.size>0;){for(;c<a.length&&d.size<10;){let e=a[c++],f=b(e).finally(()=>d.delete(f));d.add(f)}d.size>0&&await Promise.race(d)}}function v(){return globalThis.__piWebScanIndex||(globalThis.__piWebScanIndex=new Map),globalThis.__piWebScanIndex}function w(a=(0,i.getAgentDir)()){return(0,h.join)(a,"pi-web-session-index.json")}function x(){let a=globalThis.__piWebScanIndexSave;if(a){clearTimeout(a.timer),globalThis.__piWebScanIndexSave=void 0;try{(0,j.$)(a.path,JSON.stringify({version:1,entries:Object.fromEntries(a.entries)}))}catch{}}}async function y(a={}){!function(){if(globalThis.__piWebScanIndexLoaded)return;globalThis.__piWebScanIndexLoaded=!0;let a=w();if((0,f.existsSync)(a))try{let b=JSON.parse((0,f.readFileSync)(a,"utf8"));if(!l(b)||1!==b.version||!l(b.entries))return;let c=v();for(let[a,d]of Object.entries(b.entries)){if(!l(d)||!l(d.fp)||!l(d.info))continue;let{fp:b,info:e}=d;if("number"!=typeof b.size||!Number.isSafeInteger(b.size)||b.size<0||"number"!=typeof b.mtimeMs||!Number.isFinite(b.mtimeMs)||e.path!==a||"string"!=typeof e.id||"string"!=typeof e.cwd||"string"!=typeof e.firstMessage||void 0!==e.name&&"string"!=typeof e.name||void 0!==e.parentSessionPath&&"string"!=typeof e.parentSessionPath||"number"!=typeof e.messageCount||!Number.isSafeInteger(e.messageCount)||e.messageCount<0||"string"!=typeof e.created||"string"!=typeof e.modified)continue;let f=new Date(e.created),g=new Date(e.modified);Number.isFinite(f.getTime())&&Number.isFinite(g.getTime())&&c.set(a,{fp:{size:b.size,mtimeMs:b.mtimeMs},info:{path:a,id:e.id,cwd:e.cwd,name:e.name,parentSessionPath:e.parentSessionPath,firstMessage:e.firstMessage,messageCount:e.messageCount,created:f,modified:g},resume:function(a){if(!l(a))return;let{ino:b,offset:c,headerEnd:d,check:e,hasFirstMessage:f,lastActivityTime:g}=a;if("number"==typeof b&&Number.isFinite(b)&&!(b<=0)&&"number"==typeof d&&Number.isSafeInteger(d)&&!(d<=0)&&"number"==typeof c&&Number.isSafeInteger(c)&&!(c<d)&&"string"==typeof e&&"boolean"==typeof f&&(void 0===g||"number"==typeof g&&Number.isFinite(g)))return{ino:b,offset:c,headerEnd:d,check:e,hasFirstMessage:f,...void 0!==g?{lastActivityTime:g}:{}}}(d.resume)})}}catch{}}();let b=a.deferDetails??!1,c=(0,i.getAgentDir)(),d=(0,h.join)(c,"sessions"),e=await t(d);globalThis.__piSessionMembership={files:new Set(e)};let j=v(),k=new Set(e),m=[];for(let a of j.keys())k.has(a)||m.push(a);for(let a of m)j.delete(a);let n=await Promise.all(e.map(async a=>{try{let b=await (0,g.stat)(a);return{filePath:a,fp:{size:b.size,mtimeMs:b.mtimeMs}}}catch{return{filePath:a,fp:null}}})),p=[],q=[],r=Array(e.length).fill(null),z=Array(e.length).fill(-1/0);for(let[a,{filePath:c,fp:d}]of n.entries()){if(!d){j.delete(c);continue}z[a]=d.mtimeMs;let e=j.get(c);if(e&&e.fp.size===d.size&&e.fp.mtimeMs===d.mtimeMs){r[a]=e.info;continue}if(b){p.push({filePath:c,fp:d,resultIndex:a});continue}q.push({filePath:c,fp:d,resultIndex:a,previous:e?.resume&&d.size>e.fp.size&&d.size>=e.resume.offset?e:void 0})}return await u(p,async({filePath:a,fp:b,resultIndex:c})=>{let d=await o(a,b);d?r[c]=d:j.delete(a)}),await u(q,async({filePath:a,fp:b,resultIndex:c,previous:d})=>{let e=await s(a,d);e?(j.set(a,{fp:b,...e}),r[c]=e.info):j.delete(a)}),(q.length>0||m.length>0)&&function(a){let b=[...v()],c=globalThis.__piWebScanIndexSave;if(c?.path===a){c.entries=b;return}x();let d=setTimeout(x,5e3);d.unref?.(),globalThis.__piWebScanIndexSave={path:a,entries:b,timer:d}}(w(c)),r.flatMap((a,b)=>a?[{info:a,mtimeMs:z[b]}]:[]).sort((a,b)=>b.info.modified.getTime()-a.info.modified.getTime()||b.mtimeMs-a.mtimeMs||(0,h.basename)(b.info.path).localeCompare((0,h.basename)(a.info.path))).map(({info:a})=>a)}d()}catch(a){d(a)}})},94523:(a,b,c)=>{"use strict";c.d(b,{Q:()=>d});let d={id:"en",label:"English",messages:{"common.ok":"OK","common.language":"Language","common.models":"Models","common.automations":"Tasks","common.skills":"Skills","common.agents":"Sub-agents","common.plugins":"Plugins","common.settings":"Settings","settings.title":"Settings","settings.general":"General","settings.generalDescription":"Choose how Pi Web looks and which language it uses.","settings.appearance":"Appearance","settings.appearanceDescription":"Select a theme or follow your system preference.","settings.chatContentWidth":"Chat content width","settings.chatContentFontSize":"Chat & terminal font size","settings.typography":"Fonts & layout","settings.uiFontFamily":"Interface font","settings.monoFontFamily":"Monospace font","settings.uiFontPlaceholder":"System default","settings.monoFontPlaceholder":"Default: Noto Sans Mono","settings.resetUiFont":"Reset interface font","settings.resetMonoFont":"Reset monospace font","settings.fontDescription":"Names of fonts installed on this device, comma-separated; leave blank for the default. The monospace font is used for code and the terminal. Saved in this browser only.","settings.uiFontWeight":"Interface font weight","settings.monoFontWeight":"Monospace font weight","settings.fontWeightThin":"Thin","settings.fontWeightExtraLight":"Extra Light","settings.fontWeightLight":"Light","settings.fontWeightRegular":"Regular","settings.fontWeightMedium":"Medium","settings.fontWeightSemiBold":"Semi Bold","settings.resetChatContentWidth":"Reset chat content width","settings.resetChatContentFontSize":"Reset chat & terminal font size","settings.chatContentWidthDescription":"Set the maximum width of messages and the composer.","settings.themeLight":"Light","settings.themeDark":"Dark","settings.themeMist":"Mist","settings.themeRose":"Rose","settings.themePine":"Pine","settings.themeSand":"Sand","settings.themeLilac":"Lilac","settings.themeSlate":"Slate","settings.themeDusk":"Dusk","settings.themeEmber":"Ember","settings.themeContrastLight":"High contrast light","settings.themeContrastDark":"High contrast dark","settings.themeZenburn":"Zenburn","settings.themeSystem":"System","settings.thinkingDisplay":"Thinking display","settings.thinkingDisplayDescription":"Choose whether model reasoning blocks are expanded when messages load.","settings.thinkingExpandedDefault":"Expand thinking blocks by default","settings.chat":"Chat","settings.enterSendMode":"Send key","settings.enterSendModeEnter":"Enter","settings.enterSendModeCtrlEnter":"Ctrl/Cmd+Enter","settings.quoteSelection":"Show actions for selected text","settings.sidebar":"Sidebar","settings.filesPlacement":"File browser","settings.filesPlacementBelow":"Below sessions","settings.filesPlacementTab":"Separate tab","settings.filesPlacementDescription":"Phones always use tabs.","settings.languageDescription":"Choose the language used throughout the interface.","settings.shellTool":"Shell tool","settings.shellToolDescription":"Choose which shell the model uses for commands. Direct ! and !! commands still use Bash.","settings.pushPermission":"Background push (iOS home-screen app)","settings.pushPermissionDescription":"After adding this site to your home screen (iOS 16.4+), a system notification is shown on the lock screen when a session finishes while no window is visible. If notifications stop arriving, re-register here. Registration needs a user gesture, so it is never triggered automatically.","settings.pushRegister":"Register push","settings.pushRegisterLoading":"Registering…","settings.pushRegistered":"✅ Push registered — background notifications are ready.","settings.pushRegisterFailed":"❌ Registration failed:","settings.usePowerShell":"Use PowerShell instead of Bash","settings.projectRequired":"Open a project to configure this section","settings.mcp":"MCP","settings.channels":"Channels","settings.automations":"Automations","automations.group":"Scheduled tasks","automations.noneYet":"No automations yet.","automations.newAction":"New automation","automations.nameLabel":"Name","automations.scheduleLabel":"Schedule","automations.kind.cron":"Cron","automations.kind.every":"Every","automations.kind.at":"Once","automations.cronExpr":"Cron expression (minute hour day month weekday)","automations.cronTz":"Timezone","automations.everyValue":"Interval","automations.everyUnit":"Unit","automations.atTime":"Run once at","automations.nextRun":"Next run","automations.neverAgain":"never again","automations.cwdLabel":"Working directory","automations.promptLabel":"Prompt","automations.notifyLabel":"Notify when a run finishes","automations.notifyBrowser":"Browser push","automations.notifyTelegramHint":"To push run results to Telegram, allowlist a chat in Settings › Channels.","automations.notifySilentLabel":"Silence when","automations.notifySilentHint":"Successful runs whose reply contains any of these keywords (comma separated) send no notification; failures still notify. Empty always notifies.","automations.enabledLabel":"Automation enabled","automations.disclosure":"Each run starts an agent session with full tool access in the working directory above and runs the prompt as written — exactly as if you had sent it yourself.","automations.create":"Create automation","automations.created":"Automation created.","automations.save":"Save","automations.saved":"Saved.","automations.delete":"Delete","automations.deleted":"Automation deleted.","automations.runNow":"Run now","automations.runStarted":"Run started — see the history below.","automations.historyTitle":"Recent runs","automations.noRuns":"No runs yet.","automations.run.running":"running","automations.run.done":"done","automations.run.failed":"failed","automations.run.skipped":"skipped","automations.openSession":"Session","automations.deletedAutomation":"(deleted)","automations.footerCount":"{count} automations","automations.actionFailed":"The action failed.","channels.group":"Chat channels","channels.badge.unconfigured":"Not set up","channels.badge.off":"Off","channels.badge.error":"Error","channels.badge.on":"Connected","channels.loadFailed":"Couldn’t load the channels settings: {error}","telegram.setupHint":"Create a bot with @BotFather (/newbot), then paste its token below. Its chats run as pi sessions; the token stays on this machine.","telegram.actionFailed":"The action failed.","telegram.botStatus":"Bot status","telegram.connected":"Connected as @{bot}","telegram.loopError":"Error: {error}","telegram.notConnected":"Not connected","telegram.tokenLabel":"Bot token","telegram.tokenPlaceholder":"Saved (…{hint}) — paste a new token to replace","telegram.tokenSave":"Save token","telegram.tokenRemove":"Remove","telegram.tokenSaved":"Token saved and verified.","telegram.tokenRemoved":"Token removed; the bot is disconnected.","telegram.enabledLabel":"Telegram channel enabled","telegram.chatsHeading":"Chats","telegram.chatsDescription":"Only allowlisted chats are answered. Message the bot once, then allow it below. In a chat: /new starts a fresh session, /status asks whether a turn is still running.","telegram.defaultCwdLabel":"Default working directory","telegram.defaultCwdPlaceholder":"Empty: the dated default (~/pi-cwd/…)","telegram.defaultCwdSave":"Save","telegram.defaultCwdSaved":"Default directory saved.","telegram.noChats":"No chats allowlisted yet.","telegram.chatCwdLabel":"Working directory","telegram.chatCwdSaved":"Working directory saved. /new starts a session there.","telegram.unnamedChat":"Unnamed chat","telegram.testSend":"Test","telegram.testSent":"Test message sent.","telegram.chatRemove":"Remove","telegram.chatRemoved":"Chat removed.","telegram.unknownChatPrompt":"A new chat messaged the bot: {title} ({id}). Allow it to answer?","telegram.allowChat":"Allow chat","telegram.chatAllowed":"Chat allowlisted.","auth.prompt":"Sign in to continue","auth.password":"Password","auth.logIn":"Log in","auth.loggingIn":"Logging in...","auth.invalidPassword":"Incorrect password","auth.loginFailed":"Could not log in. Try again.","auth.tooManyAttempts":"Too many failed attempts. Try again in {seconds}s.","auth.logOut":"Log out","auth.loggingOut":"Logging out...","auth.logoutFailed":"Could not log out. Try again.","skills.scope.global":"global","skills.scope.project":"project","skills.scope.path":"path","skills.groupSwitchOff":"Show every skill in {group} in the model prompt","skills.groupSwitchOn":"Hide every skill in {group} from the model prompt. They stay manually invocable.","skills.bulkFailed":"Could not change {count} of {total} skills:","skills.instructions":"Instructions","skills.noInstructions":"This skill has no instructions.","skills.documentBack":"Back","plugins.groupSwitchOff":"Enable every {group} package","plugins.groupSwitchOn":"Disable every {group} package. A package with resource filters stays on, since disabling it removes them; use its own switch.","plugins.bulkKeptFiltered":"{count} filtered package(s) stayed on: disabling one removes its resource filters, so use its own switch.","plugins.bulkEnabled":"Packages enabled.","plugins.bulkDisabled":"Packages disabled.","plugins.bulkFailed":"Could not change {count} of {total} packages:","plugins.status.loaded":"loaded","plugins.status.installed":"installed","plugins.status.missing":"missing","plugins.status.disabled":"disabled","plugins.diagnostic":"1 diagnostic","plugins.diagnostics":"{count} diagnostics","config.source":"Source","config.examples":"Examples","config.name":"Name","config.saveTo":"Save to","agents.close":"Close","agents.builtInTitle":"Enable Pi Web built-in sub-agents","agents.builtInDescription":"Provides Pi Web's integrated Agent tools and disables a conflicting pi-subagents extension.","agents.reloadRequired":"Reload the current session to apply this change.","agents.reloadSession":"Reload session","agents.maxConcurrent":"Concurrent sub-agents","agents.maxConcurrentDescription":"Maximum prompts running at once per parent session.","agents.reloading":"Reloading...","agents.loading":"Loading sub-agents...","agents.new":"New sub-agent","agents.empty":"Select or create a sub-agent profile","agents.name":"Sub-agent ID","agents.displayName":"Display name","agents.description":"Description","agents.prompt":"System instructions","agents.tools":"Tools","agents.resources":"Resources","agents.loadSkills":"Load skills","agents.loadExtensions":"Load extensions","agents.mcp":"Connect MCP servers","agents.codemode":"Code mode","agents.codemode.inherit":"Follow parent session","agents.codemode.on":"Enabled","agents.codemode.off":"Disabled","agents.codemodeHint":'"Follow parent session" matches the code mode the parent session is currently using. Tool permissions inside code mode still come from this profile\'s tool list. Changes apply to subagents started afterwards.',"agents.skillsOnly":"Loads only these skills: {skills}","agents.skillsNone":"Loads no skills: the skills list in the profile file is empty","agents.extensionsOnly":"Loads only these extensions: {extensions}","agents.extensionsNone":"Loads no extensions: the extensions list in the profile file is empty","agents.mcpHint":"Subagents connect the MCP servers in mcp.json. With read-only tools, only MCP tools their server marks read-only run. Changes apply to subagents started afterwards.","agents.mcpChatOnly":"MCP needs at least one tool, skills, or extensions: a chat-only subagent cannot use it.","agents.model":"Model override","agents.modelsLoading":"Loading models...","agents.modelUnavailable":"{model} (unavailable)","agents.thinking":"Thinking","agents.maxTurns":"Max turns","agents.inherit":"Parent default","agents.enable":"Enable sub-agent","agents.disable":"Disable sub-agent","agents.builtinPath":"Built-in profile","agents.inheritContext":"Inherit parent context","agents.background":"Run in background by default","agents.duplicate":"Duplicate","agents.copyName":"{name} copy","agents.delete":"Delete","agents.deleteConfirm":"Delete {name}?","agents.save":"Save","agents.saving":"Saving...","agents.scope.builtin":"built-in","agents.scope.global":"global","agents.scope.workspace":"workspace","agents.scope.project":"project","agents.overridden":"Overridden","subagent.openTab":"View sub-agent work in side panel","subagent.closeTab":"Close sub-agent side panel","subagent.enter":"Enter","subagent.enterTitle":"Open this sub-agent's conversation as the main chat","subagent.tabLabel":"Sub-agent {name}","subagent.refresh":"Refresh","subagent.viewer.starting":"Sub-agent session is starting…","subagent.viewer.empty":"No messages yet","subagent.viewer.error":"Failed to load sub-agent session","codemode.calls":"Tool calls","codemode.callCount":"{count} calls","codemode.callCountOne":"1 call","codemode.showEarlierCalls":"Show {count} earlier calls","codemode.omittedCalls":"{count} earlier calls not shown","codemode.modelCost":"Model calls: {cost}","codemode.status.running":"Running","codemode.status.ok":"Succeeded","codemode.status.error":"Failed","codemode.status.cancelled":"Cancelled","agentSwitcher.title":"Agents","agentSwitcher.titleRunning":"Agents: {count} running","agentSwitcher.main":"Main agent","agentSwitcher.subagent":"Sub-agent","agentSwitcher.current":"Current","agentSwitcher.count":"{count} sub-agents","agentSwitcher.runningCount":"{count} running","agentSwitcher.tokens":"{count} tokens","agentSwitcher.totalUsage":"Total","agentSwitcher.totalUsageHint":"Main agent and all sub-agents","agentSwitcher.search":"Search agents","agentSwitcher.noMatches":"No matching agents","agentSwitcher.status.starting":"Starting","agentSwitcher.status.running":"Running","agentSwitcher.status.completed":"Completed","agentSwitcher.status.failed":"Failed","agentSwitcher.status.aborted":"Aborted","agentSwitcher.status.interrupted":"Interrupted","appUpdate.releaseNotes":"Pi Web v{version} is available. View release notes","sidebar.hide":"Hide sidebar","sidebar.show":"Show sidebar","theme.light":"Theme: Light","theme.dark":"Theme: Dark","theme.mist":"Theme: Mist","theme.rose":"Theme: Rose","theme.pine":"Theme: Pine","theme.auto":"Theme: System","history.full":"Full history","history.unsaved":"Full history is available after the session is saved","history.label":"Full history","title.generating":"Generating...","title.updated":"Title updated","title.failed":"Generation failed","title.generate":"Generate title","title.unsaved":"Title generation is available after the session is saved","title.noMessages":"Send a message before naming this session","title.generateSession":"Generate a session title","system.prompt":"System prompt","system.empty":"System prompt is empty (tools are disabled)","system.load":"System prompt has not loaded yet","system.loading":"Loading system prompt…","system.label":"System","tools.label":"Tools","tools.title":"Tool definitions","tools.details":"Tool definition details","tools.load":"Tool definitions have not loaded yet","tools.loading":"Loading tool definitions…","tools.noTools":"No active tools","tools.description":"Description","tools.parameters":"Parameters","tools.parameterCount":"{count} parameters","tools.noParameters":"No parameters","tools.required":"Required","tools.optional":"Optional","tools.allowedValues":"Allowed","tools.defaultValue":"Default","tools.guidelines":"Prompt guidelines","session.info":"Session info","session.name":"Name","session.file":"Session File","session.inMemory":"In-memory","session.id":"ID","session.user":"User","session.assistant":"Assistant","session.toolCalls":"Tool Calls","session.toolResults":"Tool Results","session.total":"Total","session.input":"Input","session.output":"Output","session.cacheRead":"Cache Read","session.cacheWrite":"Cache Write","session.cost":"Cost","session.context":"Context","session.cacheHitRate":"Avg cache hit rate","session.copy":"Copy {value}","session.copied":"Copied","session.title":"Session info","session.load":"Send a message or run /session to load session info","session.infoSection":"Session Info","session.projectSection":"Project Info","session.messages":"Messages","session.tokens":"Tokens","session.totalActive":"Active Time","session.copyFile":"Copy file path","session.copyId":"Copy session ID","session.projectDir":"Project Dir","session.gitBranch":"Git Branch","session.gitWorktree":"Worktree","session.copyProjectDir":"Copy project directory","session.copyGitBranch":"Copy git branch","session.copyGitWorktree":"Copy worktree path","workspace.opening":"Opening workspace...","workspace.unable":"Unable to open workspace","workspace.selectSession":"Select a session from the sidebar","workspace.getStarted":"Get Started","workspace.selectProject":"Select a project directory from the sidebar","workspace.addModels":"Open Settings at the bottom, then choose Models","workspace.stepProject":"Select a project directory from the sidebar","workspace.stepModels":"Open Settings at the bottom, then choose Models","workspace.newSessionContext":"New session location","workspace.project":"Project","files.hidePanel":"Hide file panel","files.expandPanel":"Expand file panel","files.restorePanelWidth":"Restore file panel width","files.showPanel":"Show file panel","files.noneOpen":"No file open","layout.resizeSidebar":"Resize sidebar","layout.resizeFilePanel":"Resize file panel","layout.resizeHint":"Drag to resize. Double-click or press Enter to reset.","sidebar.new":"New","sidebar.newSessionTitle":"New session in {path}","sidebar.refresh":"Refresh","sidebar.selectProject":"Select project…","sidebar.filterProjects":"Filter projects…","sidebar.noMatchingProjects":"No matching projects","sidebar.useDefaultDirectory":"Use default directory","sidebar.customPath":"Custom path…","directoryPicker.selectDirectory":"Select directory","directoryPicker.goToParent":"Go to parent directory","directoryPicker.directoryPath":"Directory path","directoryPicker.goToDirectory":"Go to directory","directoryPicker.go":"Go","directoryPicker.loadingDirectories":"Loading directories…","directoryPicker.noSubdirectories":"No subdirectories","directoryPicker.openBeforeSelecting":"Open this path before selecting it","directoryPicker.selectCurrentDirectory":"Select current directory","directoryPicker.selectThisFolder":"Select this folder","directoryPicker.noDrives":"No drives found","directoryPicker.newDirectory":"New directory","directoryPicker.createDirectory":"Create directory","directoryPicker.directoryName":"Directory name","directoryPicker.directoryNamePlaceholder":"Enter a directory name","directoryPicker.create":"Create","directoryPicker.creating":"Creating…","sidebar.checking":"Checking…","sidebar.open":"Open","sidebar.cancel":"Cancel","sidebar.openRepoRoot":"Open repo root","sidebar.openRepoRootTitle":"Open the repository root to manage worktrees.","sidebar.worktrees":"Worktrees...","sidebar.checkingWorktrees":"Checking worktrees for this directory.","sidebar.filterWorktrees":"Filter worktrees…","sidebar.noMatchingWorktrees":"No matching worktrees","sidebar.switchWorktree":"Switch worktree","sidebar.main":"main","sidebar.forceRemoveCheckout":"Has changes or submodules. Force remove checkout?","sidebar.force":"Force","sidebar.createWorktreeTitle":"Create a worktree checkout for a branch","sidebar.newWorktree":"New worktree…","sidebar.branchName":"branch name","sidebar.creating":"Creating…","sidebar.create":"Create","sidebar.uploadFilesTitle":"Upload files to project root","sidebar.uploadFiles":"Upload files","sidebar.refreshExplorer":"Refresh file list","sidebar.showIgnoredFiles":"Show ignored files","sidebar.openInExplorer":"Open in Explorer","sidebar.openInFinder":"Open in Finder","sidebar.openInFileManager":"Open in file manager","sidebar.openInExplorerRemoteOnly":"Only available when Pi Web runs on this computer","sidebar.openInExplorerUnsupported":"Not supported on this platform","sidebar.searchFiles":"Search files","sidebar.searchFilesPlaceholder":"Search files…","sidebar.searchingFiles":"Searching…","sidebar.noMatchingFiles":"No matching files","sidebar.clearSearch":"Clear search","sidebar.searchSessions":"Search all conversations...","sidebar.toggleSessionSearch":"Search conversations","sidebar.sessionSearching":"Searching...","sidebar.sessionSearchEmpty":"No matching conversations","sidebar.sessionSearchCount":"{count} matching conversations","sidebar.sessionSearchPartial":"Search limit reached. Results may be incomplete.","sidebar.sessionSearchFailed":"Could not search conversations","sidebar.changedFiles":"{count} changed files","sidebar.loading":"Loading...","sidebar.noSessions":"No sessions found","sidebar.agentRunning":"Agent running…","sidebar.agentAwaitingInput":"Agent waiting for your input","sidebar.newActivity":"New activity","sidebar.newSessionActivity":"New session activity","sidebar.deleteSession":"Delete {title}?","sidebar.rename":"Rename","sidebar.delete":"Delete","sidebar.messagesCount":"{count} msgs","sidebar.worktreePath":"Worktree: {path}","sidebar.removeWorktreeTitle":"Remove worktree checkout {path}; the branch is kept","sidebar.removeWorktreeHeading":"Remove {name}","sidebar.brandLabel":"Pi Web, versions: web {app}, pi {pi}","sidebar.tabsLabel":"Sidebar view","sidebar.tabSessions":"Sessions","sidebar.tabFiles":"Files","sidebar.resizeFiles":"Resize file browser","sidebar.resizeFilesHint":"Drag to resize. Double-click or press Enter to reset.","sidebar.fileActions":"File actions","sidebar.collapseOtherGroups":"Collapse other projects","sidebar.expandAllGroups":"Expand all projects","sidebar.collapseAllGroups":"Collapse all projects","sidebar.pinned":"Pinned","sidebar.pinnedProject":"Pinned","sidebar.pin":"Pin","sidebar.unpin":"Unpin","sidebar.pinProject":"Pin project","sidebar.unpinProject":"Unpin project","sidebar.renameProject":"Rename…","sidebar.resetProjectName":"Reset name","sidebar.projectName":"Project name","sidebar.moveProjectUp":"Move up","sidebar.moveProjectDown":"Move down","sidebar.archive":"Archive","sidebar.unarchive":"Unarchive","sidebar.restore":"Restore","sidebar.archived":"Archived","sidebar.archivedCount":"Archived \xb7 {count}","sidebar.archivedToast":"Archived “{title}”","sidebar.archivedManyToast":"Archived {count} sessions","sidebar.restoredToast":"Restored “{title}”","sidebar.restoredManyToast":"Restored {count} sessions","sidebar.undo":"Undo","sidebar.viewArchive":"View","sidebar.dismiss":"Dismiss","sidebar.markRead":"Mark as read","sidebar.markUnread":"Mark as unread","sidebar.moreActions":"More actions","sidebar.sessionActions":"Session actions","sidebar.showMore":"Show more \xb7 {count}","sidebar.showLess":"Show less","sidebar.openOtherProject":"Open another project…","sidebar.newSessionInProject":"New session in {name}","sidebar.projectActions":"{name} actions","sidebar.archiveOlderThanWeek":"Archive sessions older than 7 days \xb7 {count}","sidebar.openInFilesTab":"Open in Files","sidebar.viewArchived":"View archived \xb7 {count}","sidebar.archiveActions":"Archive actions","sidebar.archivedProjectActions":"Archived sessions of {name}","sidebar.restoreAllArchived":"Restore all \xb7 {count}","sidebar.deleteAllArchived":"Delete all… \xb7 {count}","sidebar.deleteOldArchived":"Delete archived over 30 days ago… \xb7 {count}","sidebar.noLiveSessions":"No sessions yet","sidebar.noArchived":"No archived sessions","sidebar.backToSessions":"Back","sidebar.cannotArchiveRunning":"Running","sidebar.newWorktreeForSession":"New worktree for a new session","sidebar.projectAndWorktree":"Project and worktree","sidebar.uiStateFailed":"Couldn’t save: {error}","sidebar.sessionNotFound":"This session no longer exists","sidebar.fork":"Fork","sidebar.openInNewTab":"Open in new tab","sidebar.forkedToast":"Forked “{title}”","sidebar.forkNotFound":"This session no longer exists","sidebar.forkUnsaved":"This session hasn’t been saved yet. Send a message first.","sidebar.forkEmpty":"Nothing to fork: this branch has no messages yet","sidebar.forkUnavailable":"This session can’t be forked","sidebar.sessionShare":"Share…","sidebar.copySessionId":"Copy session ID","sidebar.sessionIdCopied":"Session ID copied","share.title":"Share this session","share.description":"Creates a public, read-only link of this session’s current branch: every message, reply and tool call input and output, including file paths, commands and terminal output. Images are embedded.","share.summary":"{count} messages","share.create":"Create share link","share.creating":"Creating…","share.linkLabel":"Share link","share.copy":"Copy","share.refresh":"Refresh content","share.stop":"Stop sharing","share.confirmStop":"Confirm: stop sharing","share.loadError":"Couldn’t load the share state: {error}","share.createError":"Couldn’t create the share: {error}","share.stopError":"Couldn’t stop sharing: {error}","share.tooLarge":"This session is too large to share (over 25 MB)","share.copiedToast":"Link copied","share.stoppedToast":"Sharing stopped","sharePage.created":"Shared {time}","sharePage.messageCount":"{count} messages","sharePage.footer":"Shared read-only from Pi Web \xb7 a snapshot as of share time","sidebar.forkFailed":"Couldn’t fork: {error}","sidebar.deleteProjectSessions":"Delete all sessions… \xb7 {count}","sidebar.deleteProjectSessionsHeading":"Delete all sessions in {name}","sidebar.deleteProjectSessionsMessage":"Pinned and archived sessions go too. This can’t be undone.","sidebar.deleteProjectSessionsRunning":"Sessions running now are kept ({count}).","sidebar.deleteArchivedInProjectHeading":"Delete archived sessions in {name}","sidebar.deleteAllArchivedHeading":"Delete all archived sessions","sidebar.deleteOldArchivedHeading":"Delete sessions archived over 30 days ago","sidebar.deleteArchivedMessage":"Their subagent sessions go too. This can’t be undone.","sidebar.deleteCount":"Delete {count}","sidebar.deletingSessions":"Deleting sessions…","sidebar.deletedOneToast":"Deleted 1 session","sidebar.deletedManyToast":"Deleted {count} sessions","sidebar.keptRunningToast":"kept {count} running","sidebar.deleteFailed":"Couldn’t delete: {error}","files.modified":"Modified","files.added":"Added","files.deleted":"Deleted","files.renamed":"Renamed","files.untracked":"Untracked","files.conflict":"Conflict","files.newlyUploaded":"Newly uploaded","files.containsChangedFiles":"Contains changed files","files.hiddenIgnored":"Ignored by Git","files.hiddenExcluded":"Hidden by default (generated or dependency folder)","files.insertPath":"Insert path into chat","files.mention":"mention","files.download":"Download file","files.outsideLink":"Links to {target}, outside this project","files.outsideLinkEncloses":"That folder contains this project or your home folder.","files.allowOutsideLink":"Allow browsing","files.allowOutsideLinkTitle":"Browse {target} until Pi Web restarts, the same as selecting it as a project directory","files.allowEnclosingLinkConfirm":"{target} contains this project or your home folder. Allowing it lets Pi Web browse everything below it until it restarts. Continue?","files.dismissError":"Dismiss error","files.addUploadedFile":"Add uploaded file to chat","files.addAllUploadedFiles":"Add all uploaded files to chat","files.dismissUploadResults":"Dismiss upload results","files.loading":"Loading files...","files.noFiles":"No files found","files.changedCount":"{count} files","files.changeStats":"{count} changed files, {additions} lines added, {deletions} lines deleted","files.conflictSummary":"{count} file{countSuffix} already exist: {files}","files.cannotReplace":"Cannot replace: {files}","files.replace":"Replace","files.skipExisting":"Skip existing","files.cancel":"Cancel","files.checking":"Checking files","files.uploading":"Uploading, {progress}%","files.dropToUpload":"Release to upload to {directory}","files.commit":"Commit","files.commitSelectedCount":"{count} selected","files.commitMessagePlaceholder":"Commit message…","files.commitPush":"Push after committing","files.committing":"Committing…","files.commitCancel":"Cancel","files.commitDone":"Committed {sha}","files.commitPushed":"pushed","files.commitPushNoUpstream":"push failed: this branch has no upstream","files.commitPushFailed":"push failed: {error}","files.commitNoFilesSelected":"No files selected","files.commitErrorEmptyMessage":"The commit message is empty","files.commitErrorNoRepository":"Not inside a Git repository","files.commitErrorOutside":"A selected path is outside the repository","files.commitErrorNothing":"Nothing to commit","files.commitErrorGeneric":"Commit failed","files.commitToggleFile":"Include in commit","files.commitDismiss":"Dismiss","chat.loadingSession":"Loading session...","chat.runningTool":"Running tool...","chat.generatingToolInput":"Generating parameters...","chat.truncatedByOutputLimit":"This response was cut off after reaching the model’s output limit. Send a follow-up to continue.","chat.truncatedWithoutAnswer":"The output limit was reached before an answer was produced: thinking or a nearly full context used it up. Sending another message will likely be cut off again. Compact the context first, or lower the thinking level.","chat.runningNamedTool":"Running {name}...","chat.runningTools":"Running {names}...","chat.runningToolsMore":"Running {names} (+{count})...","chat.waitingModel":"Waiting for model...","chat.runningCommand":"Running command...","chat.thinking":"Thinking...","chat.processDetails":"Process details","chat.message":"message","chat.messages":"messages","chat.toolCall":"tool call","chat.toolCalls":"tool calls","chat.turnDuration":"took {time}","chat.collapseProcess":"Collapse process details","chat.expandProcess":"Expand process details","transcriptNotice.costSuffix":" (~{cost})","transcriptNotice.cacheMiss":"Cache miss: {tokens} tokens re-billed{cost}","transcriptNotice.cacheMissIdle":"Cache miss after {minutes}m idle: {tokens} tokens re-billed{cost}","transcriptNotice.cacheMissModelSwitch":"Cache miss after model switch: {tokens} tokens re-billed{cost}","transcriptNotice.cacheWarmed":"Cache warmed{note}: {cost}","transcriptNotice.cacheWarmedNote":" ({note})","transcriptNotice.compactionCost":"Compaction: {tokens} tokens billed{cost}","transcriptNotice.branchSummaryCost":"Branch summary: {tokens} tokens billed{cost}","transcriptNotice.thinkingDroppedOne":"Anthropic dropped 1 thinking block (details in session)","transcriptNotice.thinkingDropped":"Anthropic dropped {count} thinking blocks (details in session)","transcriptNotice.foldCacheMiss":"cache miss {tokens} tokens{cost}","transcriptNotice.foldCacheMisses":"{count} cache misses {tokens} tokens{cost}","settings.cacheMissNotices":"Show cache and cost notices","settings.cacheMissNoticesDescription":"pi's showCacheMissNotices: cache misses, cache warming, compaction cost and Anthropic dropping thinking blocks, in the chat. Saved to the global settings.json; a project's .pi/settings.json can override it.","chat.filesWritten":"Files changed","chat.openWrittenFile":"Open {name}","chat.loadEarlier":"Scroll up to load earlier messages","chat.scrollToLatest":"Scroll to latest","chat.extensionRequest":"extension request","chat.extensionExpiresIn":"expires in {seconds}s","chat.extensionPending":"Awaiting response","chat.extensionCollapse":"Collapse","chat.extensionExpand":"Expand","chat.extensionMaximize":"Maximize","chat.extensionRestoreSize":"Restore size","chat.extensionMoreWaiting":"+{count} more","chat.cancel":"Cancel","chat.confirm":"Confirm","chat.submit":"Submit","chat.extensionInput":"Extension terminal input","chat.extensionPanel":"Extension panel","chat.extensionWidgets":"Extension widgets","chat.extensionWidgetAbove":"Above editor widget","chat.extensionWidgetBelow":"Below editor widget","chat.extensionWidgetLine":"{count} line","chat.extensionWidgetLines":"{count} lines","chat.close":"Close","chat.queued":"Queued \xb7 {count}","chat.recall":"Recall to input","chat.recallTitle":"Remove all queued messages and put them back into the input box for editing","chat.retrying":"Retrying ({attempt}/{max})…","chat.loadingCommands":"Loading commands...","chat.slashCommands":"Slash commands \xb7 {label}","chat.tabEnter":"Tab / Enter","chat.noCommands":"No extension, prompt, or skill commands found","chat.match":"1 match","chat.matches":"{count} matches","chat.command":"1 command","chat.commands":"{count} commands","chat.loadingFiles":"Loading files...","chat.files":"Files \xb7 {label}{hint}","chat.searching":"Searching…","chat.noMatchingFiles":"No matching files","chat.searchingAll":" \xb7 searching all files…","chat.indexTruncated":" \xb7 index truncated","chat.steerPlaceholder":"Steer now / queue follow-up...","chat.agentPlaceholder":"Agent is running…","chat.messagePlaceholder":"Message… Type / for commands, @ for files","chat.steer":"Steer","chat.followUp":"Follow-up","chat.steerHint":"Deliver after the current response and its tool calls finish (Stop interrupts them)","chat.followUpHint":"Queue this message after the agent finishes","chat.inputHistory":"Input history","chat.modelError":"Model error","chat.modelScopeWarning":"Model scope warning","chat.modelScopeWarnings":"Model scope warnings","chat.send":"Send","chat.askSelection":"Ask about selected text","chat.askInCurrent":"Ask here","chat.askInNewChat":"Ask in new chat","chat.newQuoteChat":"New chat about selected text","chat.quoteIntro":"About this passage:","chat.quoteQuestion":"My question:","chat.quoteForkFailed":"Unable to create a branch from this message.","chat.attachFiles":"Attach files","chat.previewImage":"Preview image","chat.filterModels":"Filter models…","chat.noMatchingModels":"No matching models","chat.saveDefaultModel":"Use and save as default for new chats","chat.defaultModel":"Default model for new chats","chat.saveDefaultThinking":"Use and save as default reasoning level","chat.defaultThinking":"Default reasoning level for new chats","chat.moreControls":"More controls","chat.collapseControls":"Collapse controls","chat.shell":"Shell","terminal.title":"Terminal","gitGraph.title":"Git graph","gitGraph.subtitle":"{count} commits \xb7 {lanes} lanes","gitGraph.subtitlePartial":"Latest {count} commits \xb7 {lanes} lanes","gitGraph.loading":"Loading…","gitGraph.loadingMore":"Loading more…","gitGraph.loadMore":"Load more commits","gitGraph.refresh":"Refresh git graph","gitGraph.columnDescription":"Description","gitGraph.columnDate":"Date","gitGraph.columnAuthor":"Author","gitGraph.columnCommit":"Commit","gitGraph.graphAriaLabel":"Git commit graph","gitGraph.emptyTitle":"No commits","gitGraph.emptyDescription":"This folder has no commit history yet.","gitGraph.errorLoad":"Git graph failed to load: {error}","gitGraph.detailSubject":"Subject","gitGraph.detailCommit":"Commit","gitGraph.detailAuthor":"Author","gitGraph.detailDate":"Date","gitGraph.detailParents":"Parents","gitGraph.tabLabel":"Git graph: {name}","sidebar.openGitGraph":"Open git graph","terminal.tabLabel":"Terminal: {name}","terminal.open":"Open workspace terminal","terminal.close":"Terminate terminal","terminal.restart":"Restart terminal","terminal.reconnect":"Reconnect terminal","terminal.lightTheme":"Switch terminal to light theme","terminal.darkTheme":"Switch terminal to dark theme","terminal.extraKeys":"Terminal keys","terminal.connecting":"Connecting","terminal.ready":"Connected","terminal.exited":"Terminal closed","terminal.error":"Connection error","terminal.exitCode":"Process exited with code {code}","chat.outputLocal":"output stays local","chat.outputModel":"output sent to model","chat.configuredTools":"From settings.json defaultTools","chat.chatOnly":"Chat only","chat.readOnlyTools":"{count} read-only built-in tools","chat.builtInTools":"{count} built-in tools","chat.allBuiltInTools":"All built-in tools","chat.changeReasoning":"Change reasoning level: {level}","chat.changeReasoningLabel":"Change reasoning level","chat.currentReasoning":"Reasoning level for this turn: {level}","chat.changeToolPreset":"Change tool preset","chat.stopCompaction":"Stop compaction","chat.compactContext":"Compact context","chat.compacting":"Compacting…","chat.compact":"Compact","chat.dismissCompactError":"Dismiss compaction error","chat.stopAgent":"Stop agent","chat.stop":"Stop","chat.disableSound":"Disable completion sound","chat.enableSound":"Enable completion sound","chat.thinkingUseDefault":"Use pi default","chat.thinkingOff":"Reasoning off","chat.thinkingMinimal":"Minimal reasoning","chat.thinkingLow":"Low reasoning","chat.thinkingMedium":"Medium reasoning","chat.thinkingHigh":"High reasoning","chat.thinkingXhigh":"Extra-high reasoning","chat.thinkingMax":"Max reasoning","chat.builtIn":"Built-in","chat.extensions":"Extensions","chat.prompts":"Prompts","chat.skills":"Skills","chat.dormant":"dormant","chat.commandCompact":"Compress context, optionally with instructions","chat.commandAutoCompact":"Toggle automatic context compaction in settings","chat.commandReload":"Reload extensions, skills, prompts, and tools","chat.commandName":"Set the session display name","chat.commandSession":"Show session message, token, and cost stats","chat.commandCopy":"Copy the last assistant message","chat.commandClone":"Clone the current branch into a new session","chat.compacted":"Compacted","chat.imageNotSupportedTitle":"Images may not be sent","chat.imageNotSupportedBody":"The selected model ({model}) does not support image input. The attached images will likely be ignored.","chat.dropNeedsCwd":"Choose a working directory before adding files.","chat.dropUploaded":"Copied {count} file(s) into the working directory","chat.dropAlreadyExists":"Already in the working directory and not replaced; the mention points to the existing file: {names}","chat.dropFoldersUnsupported":"Folders cannot be dropped here; drop the files inside instead: {names}","chat.dropFailed":"Upload failed: {message}","chat.tokensSaved":"{saved} saved","chatMinimap.earlierTurns":"Earlier turns not loaded: {count}. Click to load","chatMinimap.locateAssistant":"Locate assistant message","chatMinimap.toolCalls":"Tool calls this turn: {count}","chatMinimap.lockPreview":"Lock: don't open the preview on hover","chatMinimap.unlockPreview":"Unlock the hover preview","i18n.close":"Close","i18n.copy":"Copy","i18n.copied":"Copied","i18n.cancel":"Cancel","i18n.save":"Save","i18n.saving":"Saving…","i18n.saved":"Saved","i18n.remove":"Remove","i18n.removing":"Removing…","i18n.delete":"Delete","i18n.loading":"Loading...","i18n.loadMore":"Load more","i18n.search":"Search","i18n.refresh":"Refresh","providerUsage.usage":"Usage","providerUsage.notQueried":"Not queried","providerUsage.refresh":"Refresh usage","providerUsage.refreshing":"Refreshing usage","providerUsage.updated":"Updated {time}","providerUsage.queryFailed":"Usage query failed.","providerUsage.available":"Available","i18n.update":"Update","i18n.updating":"Updating...","i18n.check":"Check","i18n.checking":"Checking...","i18n.install":"Install","i18n.installing":"Installing...","i18n.noResults":"No results","i18n.searchProviders":"Search providers…","i18n.noProviders":"No providers match","i18n.newModel":"new model","i18n.addProvider":"Add provider","i18n.selectProviderModel":"Select a provider or model","i18n.visibleInPrompt":"Visible in model prompt — click to disable","i18n.hiddenFromPrompt":"Hidden from model prompt — click to enable","i18n.dormant":"Dormant","i18n.hiddenButInvocable":"Hidden from model, still manually invocable","i18n.skillSearchPlaceholder":"e.g. react, testing, deploy","i18n.searching":"Searching…","i18n.noSkills":"No skills found","i18n.checkUpdates":"Check updates","i18n.updates":"updates","i18n.noResolvedResources":"No resolved resources","i18n.enablePackage":"Enable package","i18n.disablePackage":"Disable package","i18n.filtered":"filtered","i18n.openSessionToReload":"Open a session to reload","i18n.notFound":"Not found","i18n.noPlugins":"No plugins configured","trust.resourcesNotLoaded":"Restricted mode","trust.trustProject":"Trust project","trust.trusting":"Trusting...","trust.cancel":"Cancel","trust.dialogTitle":"Trust this project?","trust.dialogBody":"Project resources can run local code. Trust only projects whose contents you know.","trust.skillsNotLoaded":"Project skills are not loaded because this project is not trusted.","trust.pluginsNotLoaded":"Project plugins are not loaded because this project is not trusted.","trust.projectScopeUnavailable":"Project installs are unavailable while project resources are not loaded.","trust.mcp.title":"MCP servers in .pi/mcp.json","trust.mcp.intro":"Trusting this project lets these servers connect, in Pi Web and in the pi CLI, which share this decision. A stdio server runs its command on the computer running Pi Web.","trust.mcp.loading":"Reading .pi/mcp.json…","trust.mcp.loadFailed":"Could not list this project's MCP servers.","trust.mcp.timedOut":"Listing this project's MCP servers took too long.","trust.mcp.none":"The file declares no servers.","trust.mcp.unchecked":"Pi Web cannot load the SDK's MCP checks, so these entries are listed unchecked.","trust.mcp.cwd":"Working directory: {path}","trust.close":"Close","trust.alreadyTrusted":"This project is already trusted.","trust.trustFailed":"Could not trust this project.","mcp.transport.stdio":"stdio","mcp.transport.http":"HTTP","mcp.field.env":"env {name}","mcp.field.header":"header {name}","mcp.field.oauthClientSecret":"oauth.clientSecret","mcp.server.invalid":"Pi refuses this entry, so it never connects:","mcp.server.webPassword":"References PI_WEB_PASSWORD. Pi Web refuses to connect it, but the pi CLI reads this file too and would send the password on if that variable is set where the CLI runs:","mcp.server.disabled":"Turned off in the file, so it does not connect.","mcp.server.commandFields":"Runs a shell command on every connection:","mcp.server.replacesGlobal":"Replaces your global server of the same name while this project is trusted.","mcp.server.overridesGlobal":"Changes only {keys} of your global server of the same name while this project is trusted.","mcp.server.overridesGlobalNothing":"Names your global server of the same name, but changes none of enabled, exposure and toolExposure.","mcp.server.masked":"Parts that look like secrets are hidden.","mcp.server.hiddenCharacters":"Holds invisible or control characters, shown here as \\u{…} codes.","mcp.server.sendsVariables":"Sends environment variables of the computer running Pi Web to this server on every connection:","mcp.server.passesVariables":"Passes environment variables of the computer running Pi Web to the command it starts:","mcp.server.variableIn":"{variable} in {field}","mcp.fileProblem.unparsable":"The file is not valid JSON, so none of its servers load.","mcp.fileProblem.invalid-shape":'The file is not an object with an "mcpServers" object, so none of its servers load.',"mcp.fileProblem.auto-enable-codemode-invalid":'"autoEnableCodemode" must be true or false; the servers still load.',"mcp.fileProblem.link-dangling":"The file is a symbolic link to nothing, so no servers load from it.","mcp.fileProblem.link-outside":"The file is a symbolic link outside the folders Pi Web may read, so its servers are not listed here. Pi still loads them once the project is trusted.","mcp.fileProblem.not-a-file":"The path is not a regular file, so Pi Web does not read it.","mcp.fileProblem.too-large":"The file is larger than 1 MiB, so its servers are not listed here. Pi still loads them once the project is trusted.","mcp.fileProblem.too-many-servers":"The file declares more than 200 servers, so they are not listed here. Pi still loads them once the project is trusted.","mcp.fileProblem.unreadable":"Pi Web cannot read the file.","mcp.reason.cwd-invalid":"The project folder is missing or not an absolute path.","mcp.reason.cwd-denied":"Pi Web may not read this folder.","mcp.reason.cwd-not-directory":"The project folder no longer exists or is not a folder.","mcp.reason.request-denied":"Pi Web refused the request because it did not come from this page.","mcp.reason.content-type":"Pi Web refused the request because it was not sent as JSON.","mcp.reason.trust-unreadable":"Pi Web cannot read the trust store (trust.json), or another program has it locked.","mcp.reason.trust-not-required":"This project has no resources that need trust anymore.","mcp.reason.session-busy":"Wait for the running session in this folder to finish, then trust the project.","mcp.reason.invalid-request":"Pi Web refused the request because it does not ask for a change Pi Web can make.","mcp.reason.mcp-off":"MCP is off on this Pi Web server, so it changes no server.","mcp.reason.project-untrusted":"This project is not trusted, so Pi Web does not change its .pi/mcp.json.","mcp.reason.unparsable":"The file is not valid JSON, so Pi Web left it unchanged.","mcp.reason.invalid-shape":'The file is not an object with an "mcpServers" object, so Pi Web left it unchanged.',"mcp.reason.server-missing":"The file no longer defines this server.","mcp.reason.entry-not-object":"This entry is not an object, so it cannot be turned on or off. Remove it, or fix it in the file.","mcp.reason.web-password":"It references PI_WEB_PASSWORD, so Pi Web does not turn it on.","mcp.reason.undo-unavailable":"The removal can no longer be undone.","mcp.reason.undo-name-taken":"The file defines a server of the same name again, so the removal was not undone.","mcp.reason.name-taken":"The file already defines a server of that name.","mcp.reason.link-dangling":"The file is a symbolic link to nothing, so Pi Web does not write it.","mcp.reason.link-outside":"The file is a symbolic link outside the folders Pi Web may read, so Pi Web does not write it.","mcp.reason.not-a-file":"The path is not a regular file, so Pi Web does not write it.","mcp.reason.too-large":"The file is larger than 1 MiB, so Pi Web does not write it.","mcp.reason.too-many-servers":"The file declares more than 200 servers, so Pi Web does not act on its entries.","mcp.reason.locked":"Another program is writing the file. Try again in a moment.","mcp.reason.server-invalid":"Pi refuses this entry, so Pi Web does not connect it.","mcp.reason.sign-in-not-oauth":"This server does not sign in with OAuth: only an HTTP server without an Authorization header does.","mcp.reason.sign-in-unknown":"Pi Web no longer knows this sign-in: it ended a while ago, or Pi Web restarted.","mcp.reason.sign-in-not-waiting":"The sign-in is not waiting for an address right now.","mcp.reason.redirect-invalid":"That is not a web address. Copy the whole address from the browser's address bar.","mcp.reason.redirect-state-mismatch":"That address belongs to another sign-in. Paste the address the browser landed on after this one.","mcp.reason.redirect-no-code":"That address holds no authorization code. Paste the address the browser landed on after you approved access.","mcp.reason.redirect-denied":"The authorization server did not grant access. Open the sign-in page again, or cancel.","mcp.reason.import-failed":"No server could be read from the paste.","mcp.reason.fields-incomplete":"Some values to fill in are missing or not valid.","mcp.reason.name-invalid":"A server name uses letters, digits, _ and - only.","mcp.reason.secret-global-only":"The server holds a secret as plain text, so it is saved only in the global mcp.json.","mcp.reason.host-env-confirm":"The server would be sent variables of the computer running Pi Web; confirm that first.","mcp.reason.folder-not-fresh":"The folder changed since: it has a trust decision now, or resources that need one, so Pi Web did not trust it and added nothing.","mcp.reason.trust-too-broad":"Trusting this folder would trust the folders inside it too, so Pi Web does not do it by itself.","mcp.loadFailed":"Could not read the MCP settings.","mcp.loadTimedOut":"Pi Web did not answer in time. Press Refresh to try again.","mcp.projectNotListed":"This project's servers are not listed: {reason}","mcp.serverCount":"{enabled} of {total} servers turned on","mcp.group.empty":"No servers","mcp.group.fileProblem":"Not listed: see the file problem below","mcp.group.notListed":"Not listed","mcp.rowLabel":"{name}: {state}","mcp.state.on":"On","mcp.state.disabled":"Turned off in the file","mcp.state.invalid":"Refused by Pi","mcp.state.web-password":"Refused: references PI_WEB_PASSWORD","mcp.state.not-trusted":"Project not trusted","mcp.state.replaced":"Replaced by the project's server","mcp.state.overridden":"Changed by the project's override","mcp.state.mcp-off":"MCP is off","mcp.stateShort.invalid":"refused","mcp.stateShort.web-password":"refused","mcp.stateShort.disabled":"off","mcp.stateShort.not-trusted":"untrusted","mcp.stateShort.replaced":"replaced","mcp.stateShort.overridden":"overridden","mcp.server.shadowedByProject":"The project's server of the same name replaces this one while the project is trusted.","mcp.server.overriddenByProject":"The project's .pi/mcp.json changes this server while the project is trusted.","mcp.server.unchecked":"Listed unchecked: Pi Web cannot load the SDK's MCP checks.","mcp.detail.description":"Description","mcp.detail.transport":"Transport","mcp.detail.command":"Command","mcp.detail.url":"URL","mcp.detail.cwd":"Working directory","mcp.detail.env":"Environment","mcp.detail.headers":"Headers","mcp.detail.valuesHidden":"Values are not shown here.","mcp.detail.shellCommands":"Shell commands","mcp.detail.variables":"Host variables","mcp.detail.signIn":"Sign-in","mcp.detail.exposure":"Tools","mcp.detail.file":"File","mcp.detail.inProject":"This project","mcp.inProject.saved":"Only for this project; saved in its .pi/mcp.json.","mcp.inProject.overridden":"This project's .pi/mcp.json changes its {keys}.","mcp.inProject.refused":"This project's .pi/mcp.json overrides it, but pi refuses the override.","mcp.inProject.turnOff":"Turn off in this project","mcp.inProject.turnOn":"Turn on in this project","mcp.inProject.show":"Show","mcp.signIn.signedIn":"Signed in.","mcp.signIn.notSignedIn":"Not signed in.","mcp.signIn.registrationOnly":"Not signed in, but a client registration or an unfinished sign-in is stored for this server.","mcp.signIn.unknown":"Unknown: mcp-auth.json cannot be read.","mcp.signIn.header":"Authorization header","mcp.signIn.provider":"Sends the token of the pi provider {provider}: sign in to it under Settings › Models.","mcp.exposure.codemode":"Only the server's name and summary are listed; Code mode scripts search for its tools.","mcp.exposure.deferred":"Declared once tool search loads them; needs no Code mode.","mcp.exposure.direct":"Every tool's full declaration goes with every request: the most tokens.","mcp.exposure.hidden":"Registered but unreachable.","mcp.exposure.sandboxUnavailable":"Code mode cannot run on this Pi Web server, so these tools are reached through tool search instead.","mcp.exposure.builtinDisabled":"-builtin:codemode turns Code mode off, so these tools can be called only while tool search is active.","mcp.exposure.autoEnableOff":"autoEnableCodemode is false in {path}, so sessions do not turn Code mode on for these tools: they can be called only while Code mode is Always on or tool search is active.","mcp.exposure.label":"How {name}'s tools reach the model","mcp.exposure.optionDefault":"{label} (default)","mcp.exposure.toolOverrides":"Rules in toolExposure ({count}) keep their own exposure.","mcp.exposure.toolSearchDisabled":"-builtin:tool-search in {path} turns tool search off, so these tools can be called only from Code mode scripts while Code mode is on.","mcp.exposure.toolSearchDisabledUnknown":"-builtin:tool-search turns tool search off, so these tools can be called only from Code mode scripts while Code mode is on.","mcp.empty":"No MCP servers yet. Servers in {globalPath} and in a project's .pi/mcp.json appear here.","mcp.emptyFileProblem":"No servers could be listed: see the file problems below.","mcp.selectItem":"Select a server or Code mode.","mcp.unavailable.operator-disabled":"MCP is off: PI_WEB_DISABLE_MCP is set where Pi Web runs. The servers are listed, but no session connects them.","mcp.unavailable.internals-unavailable":"MCP is off: Pi Web cannot load the SDK's MCP modules. The servers are listed unchecked, and no session connects them.","mcp.unavailable.builtin-disabled":"MCP is off: the extensions setting in {path} turns off builtin:mcp, so no session connects these servers.","mcp.unavailable.builtin-disabled-unknown":"MCP is off: an extensions setting turns off builtin:mcp, so no session connects these servers.","mcp.trust.untrusted":"This project is not trusted, so the servers in its .pi/mcp.json do not connect.","mcp.trust.untrustedThrough":"This project is not trusted ({path} is marked untrusted), so the servers in its .pi/mcp.json do not connect.","mcp.trust.trustedThrough":"Trusted through {path}: the servers in this project's .pi/mcp.json connect, as in every folder under it.","mcp.trust.unreadable":"Pi Web cannot read the trust store (trust.json), so this project's servers count as untrusted for now.","mcp.trust.trustButton":"Trust project…","mcp.footer.fileProblem":"1 file problem","mcp.footer.fileProblems":"{count} file problems","mcp.codemode.title":"Code mode","mcp.codemode.rowLabel":"Code mode: {state}","mcp.codemode.intro":"The model calls tools from a short script; MCP tools use it by default. Changes apply to sessions started afterwards.","mcp.codemode.automatic":"Automatic","mcp.codemode.always":"Always on","mcp.codemode.unavailable":"Unavailable","mcp.codemode.mode":"Mode","mcp.codemode.automaticDescription":"Turns on when an MCP server that uses code mode connects.","mcp.codemode.alwaysDescription":"Sessions start with Code mode on.","mcp.codemode.preferenceError":"Cannot read the global settings file:","mcp.codemode.sandbox":"Sandbox","mcp.codemode.sandbox.available":"Available.","mcp.codemode.sandbox.unavailable":"Cannot run on this Pi Web server, so no session offers Code mode:","mcp.codemode.sandbox.not-checked":"Not checked yet: the self-test runs when the first session starts after Pi Web does.","mcp.codemode.builtin":"Extension","mcp.codemode.builtinDisabled":"Turned off by -builtin:codemode in {path}.","mcp.codemode.builtinDisabledUnknown":"Turned off by -builtin:codemode in an extensions setting.","mcp.codemode.builtinDisabledProject":"Turned off for this project's sessions by -builtin:codemode in {path}. Always on still applies to sessions in other folders.","mcp.codemode.autoEnableOff":"autoEnableCodemode is false in {path}, so Automatic never turns Code mode on, and the tools of servers with code mode exposure can be called only while tool search is active.","mcp.codemode.saveFailed":"Could not save the choice:","mcp.codemode.saveTimedOut":"Pi Web did not answer in time, so the choice may not have been saved.","mcp.codemode.alwaysUnavailable.sandbox":"Always on is unavailable: Code mode's sandbox cannot run on this Pi Web server.","mcp.codemode.alwaysUnavailable.builtin":"Always on is unavailable: -builtin:codemode in {path} turns Code mode off.","mcp.codemode.projectOverride.always":"This project decides for itself: defaultTools in {path} starts its sessions with Code mode on, whichever you choose here.","mcp.codemode.projectOverride.automatic":"This project decides for itself: defaultTools in {path} starts its sessions without Code mode, as Automatic does, whichever you choose here.","mcp.codemode.toolMode":"Built-in tools","mcp.codemode.toolMode.on":"Direct","mcp.codemode.toolMode.only":"In scripts","mcp.codemode.toolMode.onDescription":"The model calls read, bash and the other tools directly.","mcp.codemode.toolMode.onlyDescription":"While Code mode is on, the model calls read, bash and the other tools only from scripts.","mcp.codemode.toolMode.automaticNote":"Under Automatic, this waits until Code mode turns on.","mcp.codemode.toolMode.invalid":'codemode.mode in {path} is {value}, which pi reads as "on". Choosing either option replaces it.',"mcp.codemode.toolMode.projectOverride.on":"This project decides for itself: codemode in {path} keeps these tools declared in its sessions, whatever you choose here.","mcp.codemode.toolMode.projectOverride.only":"This project decides for itself: codemode.mode in {path} has its sessions call these tools from scripts only, whatever you choose here.","mcp.codemode.toolMode.saveFailed":"Could not save the setting:","mcp.codemode.inlineBudget":"Tool list budget","mcp.codemode.inlineBudget.unit":"tokens","mcp.codemode.inlineBudget.save":"Save","mcp.codemode.inlineBudget.description":"Tokens the code mode description may spend listing tools; scripts find the rest with searchTools(). Leave empty for pi's default, {default}.","mcp.codemode.inlineBudget.invalidDraft":"Enter a whole number from 0 to {max}, or leave it empty.","mcp.codemode.inlineBudget.invalid":"codemode.inlineBudget in {path} is {value}, which pi ignores, so sessions use {default}. Saving replaces it.","mcp.codemode.inlineBudget.projectOverride":"This project decides for itself: codemode.inlineBudget in {path} gives its sessions {value}, whatever you save here.","mcp.codemode.inlineBudget.projectOverrideDefault":"This project decides for itself: codemode in {path} leaves its sessions pi's default, {default}, whatever you save here.","mcp.codemode.inlineBudget.saveFailed":"Could not save the budget:","mcp.readOnly.mcp-off":"Servers cannot be changed here while MCP is off.","mcp.readOnly.project-untrusted":"Pi Web does not change them until the project is trusted.","mcp.readOnly.trust-unreadable":"Pi Web does not change them until it can read the trust store.","mcp.write.savedWhileOff":"Changes are saved to the file, but no session connects these servers while builtin:mcp is off.","mcp.server.switchOn":"Turn {name} on","mcp.server.switchOff":"Turn {name} off","mcp.groupSwitchOn":"Turn off every {group} server","mcp.groupSwitchOff":"Turn on every {group} server","mcp.groupKeptOff":"{count} server(s) that reference PI_WEB_PASSWORD stayed off.","mcp.bulkFailed":"Could not change {count} of {total} servers:","mcp.actionFailed":"Could not change the server:","mcp.actionTimedOut":"Pi Web did not answer in time, so the change may not have been made.","mcp.removed":"Removed {name} from {path}.","mcp.undo":"Undo","mcp.undoing":"Undoing…","mcp.undoFailed":"Could not undo:","mcp.state.connected":"Connected when tested","mcp.state.needs-auth":"Needs sign-in","mcp.state.failed":"Did not connect when tested","mcp.stateShort.needs-auth":"sign-in","mcp.stateShort.failed":"failed","mcp.exposureShort.codemode":"Code mode","mcp.exposureShort.deferred":"tool search","mcp.exposureShort.direct":"direct","mcp.exposureShort.hidden":"hidden","mcp.test.button":"Test connection","mcp.test.testing":"Testing…","mcp.test.never":"Not tested yet.","mcp.test.serial":"It runs a shell command, so its test waits for other such tests.","mcp.test.blocked.mcp-off":"MCP is off on this Pi Web server, so it tests no server.","mcp.test.blocked.project-untrusted":"This project is not trusted, so Pi Web does not start its servers.","mcp.test.blocked.trust-unreadable":"Pi Web cannot read the trust store (trust.json), so it does not start this project's servers.","mcp.test.blocked.invalid":"Pi refuses this entry, so there is nothing to test.","mcp.test.blocked.web-password":"It references PI_WEB_PASSWORD, so Pi Web does not connect it.","mcp.test.refused.entry-not-object":"This entry is not an object, so there is nothing to test. Fix it in the file.","mcp.test.refused.invalid-request":"Pi Web refused the request because it does not name a server it can test.","mcp.test.refused.unparsable":"The file is not valid JSON, so Pi Web cannot read this entry to test it.","mcp.test.refused.invalid-shape":'The file is not an object with an "mcpServers" object, so Pi Web cannot read this entry to test it.',"mcp.test.refused.link-dangling":"The file is a symbolic link to nothing, so Pi Web cannot read this entry to test it.","mcp.test.refused.link-outside":"The file is a symbolic link outside the folders Pi Web may read, so Pi Web does not test its servers.","mcp.test.refused.not-a-file":"The path is not a regular file, so Pi Web does not read it to test this entry.","mcp.test.refused.too-large":"The file is larger than 1 MiB, so Pi Web does not read it to test this entry.","mcp.test.refused.too-many-servers":"The file declares more than 200 servers, so Pi Web does not read it to test this entry.","mcp.test.state.connected":"Connected","mcp.test.state.needs-auth":"Needs sign-in","mcp.test.state.failed":"Did not connect","mcp.test.state.timedOut":"No answer","mcp.test.summary.connected":"{count} tool(s) listed in {seconds} s, tested at {time}.","mcp.test.summary.needs-auth":"The server asked for an OAuth sign-in. Tested at {time}.","mcp.test.summary.failed":"Gave up after {seconds} s, tested at {time}.","mcp.test.summary.timedOut":"It did not answer within {seconds} s, so Pi Web stopped the test. Tested at {time}.","mcp.test.error":"Error:","mcp.test.stderr":"The last lines it wrote to stderr:","mcp.test.serverInfo":"Server: {name} {version}","mcp.test.resources":"Offers resources.","mcp.test.ranIn":"Ran in {path}.","mcp.test.queued":"Waited {seconds} s for another test of a server that runs a shell command.","mcp.test.readOnly":"read-only","mcp.test.moreTools":"{count} more not shown.","mcp.test.queueTimedOut":"Another test of a server that runs a shell command did not finish in time, so this one did not start. Try again.","mcp.test.requestFailed":"Could not test the server:","mcp.test.requestTimedOut":"Pi Web did not answer in time. The test may still finish; press Refresh to see its result.","mcp.state.connecting":"Connecting in a session","mcp.state.disconnected":"Connection dropped in a session","mcp.state.conflict":"Name taken by another extension","mcp.state.session.connected":"Connected in a session","mcp.state.session.failed":"Did not connect in a session","mcp.stateShort.connecting":"connecting","mcp.stateShort.disconnected":"dropped","mcp.stateShort.conflict":"conflict","mcp.stateDetail.disconnected":"That session connects it again at the next call to one of its tools.","mcp.stateDetail.conflict":"Rename the entry in its file, or turn the other extension off.","mcp.session.state.connecting":"Connecting","mcp.session.state.connected":"Connected","mcp.session.state.needs-auth":"Needs sign-in","mcp.session.state.failed":"Did not connect","mcp.session.state.disconnected":"Dropped","mcp.session.state.conflict":"Name taken","mcp.session.state.not-trusted":"Not read","mcp.session.state.closed":"Closed","mcp.session.summary.connecting":"A session in {path} started connecting it at {time}.","mcp.session.summary.connected":"A session in {path} connected it at {time}.","mcp.session.summary.needs-auth":"The server asked a session in {path} for an OAuth sign-in at {time}.","mcp.session.summary.failed":"A session in {path} could not connect it at {time}.","mcp.session.summary.disconnected":"The connection of a session in {path} dropped at {time}.","mcp.session.summary.conflict":"A session in {path} found the name taken at {time}, so it did not connect this entry.","mcp.session.summary.not-trusted":"A session in {path} did not read it at {time}, because no decision trusted the project then.","mcp.session.summary.closed":"A session in {path} connected it at {time} and closed it at {closedTime}.","mcp.session.conflictOwner":"Registered first by:","mcp.hostInactive":"A session in {path} connects none of these servers through Pi Web: its /mcp command comes from {owner}, not from Pi's built-in MCP extension. That extension may read mcp.json and connect them its own way.","mcp.signIn.button":"Sign in","mcp.signIn.starting":"Starting…","mcp.signIn.cancel":"Cancel sign-in","mcp.signIn.cancelling":"Cancelling…","mcp.signIn.cancelFailed":"Could not cancel the sign-in:","mcp.signIn.cancelTimedOut":"Pi Web did not answer in time. The sign-in may still be under way; this line shows it once it moves on.","mcp.signIn.signOut":"Sign out","mcp.signIn.signingOut":"Signing out…","mcp.signIn.replaces":"Signing in may replace what is stored for this server.","mcp.signIn.signOutExplain":"Sign out deletes what is stored for this server; open sessions lose access at their next request.","mcp.signIn.shared":"The other {name} entry, with the same URL, started this sign-in: the tokens serve both.","mcp.signIn.shared.done":"Signed in through the other {name} entry, which has the same URL, so the tokens serve this entry too. Press Test connection to see what this entry's server offers.","mcp.signIn.shared.already":"The other {name} entry, which has the same URL, was already signed in, so the tokens serve this entry too. Press Test connection to see what this entry's server offers.","mcp.signIn.shared.connect-failed":"The sign-in through the other {name} entry, which has the same URL, found nothing to sign in to: that entry's server did not connect, and did not ask for a sign-in. Its Status row says why.","mcp.signIn.phase.connecting":"Checking whether the server asks for a sign-in…","mcp.signIn.phase.starting":"Preparing the sign-in with the server's authorization server…","mcp.signIn.phase.finishing":"Finishing the sign-in…","mcp.signIn.phase.noCancel":"The authorization server has answered, so this step can no longer be cancelled.","mcp.signIn.authorize.message":"Open the sign-in page and approve access. When the browser comes back to the computer running Pi Web, the sign-in finishes by itself. If the browser runs on another device, or the page it lands on does not load, copy that page's address and paste it here.","mcp.signIn.authorize.link":"Sign-in page:","mcp.signIn.authorize.notALink":"The server's sign-in page is not a web address, so it is shown as text only:","mcp.signIn.authorize.redirect":"After you approve, the browser is sent to {url}, which only the computer running Pi Web can open.","mcp.signIn.authorize.wait":"Pi Web waits up to 5 minutes from the start of the sign-in.","mcp.signIn.paste.label":"Address the browser landed on","mcp.signIn.paste.placeholder":"http://127.0.0.1:…/callback?code=…","mcp.signIn.paste.submit":"Continue","mcp.signIn.paste.checking":"Checking…","mcp.signIn.paste.refused":"That address does not finish this sign-in:","mcp.signIn.paste.timedOut":"Pi Web did not answer in time. If it took the address, this line shows the sign-in moving on.","mcp.signIn.done.already":"Already signed in: the server connected without a new sign-in.","mcp.signIn.done.signedIn":"Signed in. Status above shows what the server offers.","mcp.signIn.done.refreshed":"Signed in again with the stored refresh token, without the browser. Status above shows what the server offers.","mcp.signIn.done.failedAfter":"Signed in, but the server did not connect afterwards. Status above says why.","mcp.signIn.done.needsAuthAfter":"Signed in, but the server still asked for a sign-in when Pi Web connected again.","mcp.signIn.done.notConnected":"Signed in. Press Test connection to see what the server offers.","mcp.signIn.cancelled":"Sign-in cancelled.","mcp.signIn.expired":"The sign-in was not finished within 5 minutes, so Pi Web stopped waiting.","mcp.signIn.failed.connect-failed":"The server did not connect, and did not ask for a sign-in, so there was nothing to sign in to. Status above says why.","mcp.signIn.failed.queue-timed-out":"Another test of a server that runs a shell command did not finish in time, so the sign-in did not start. Try again.","mcp.signIn.failed.sign-in-failed":"The sign-in failed.","mcp.signIn.failed.internal":"The sign-in failed unexpectedly.","mcp.signIn.gone":"Pi Web no longer knows this sign-in: it ended a while ago, or Pi Web restarted. Press Sign in to start again.","mcp.signIn.requestFailed":"Could not sign in:","mcp.signIn.requestTimedOut":"Pi Web did not answer in time. Press Sign in again to see the sign-in under way.","mcp.signIn.signOutFailed":"Could not sign out:","mcp.signIn.signedOutDone":"Signed out: the tokens stored for this server were deleted.","mcp.signIn.signedOutNothing":"Nothing was stored for this server, so there was nothing to sign out of.","mcp.signIn.blocked.mcp-off":"MCP is off on this Pi Web server, so it signs in to no server.","mcp.signIn.blocked.project-untrusted":"This project is not trusted, so Pi Web does not sign in to or out of its servers.","mcp.signIn.blocked.trust-unreadable":"Pi Web cannot read the trust store (trust.json), so it does not sign in to or out of this project's servers.","mcp.signIn.blocked.invalid":"Pi refuses this entry, so there is nothing to sign in to.","mcp.signIn.refused.file":"Pi Web cannot read this entry from its file anymore. Press Refresh.","mcp.signIn.refused.invalid-request":"Pi Web refused the request because it does not name a server it can sign in to.","mcp.signIn.summary.connected":"Signed in, then {count} tool(s) listed in {seconds} s, at {time}.","mcp.signIn.summary.needs-auth":"Signed in, but the server still asked for a sign-in at {time}.","mcp.signIn.summary.failed":"Signed in, but connecting gave up after {seconds} s, at {time}.","mcp.signIn.summary.timedOut":"Signed in, but the server did not answer within {seconds} s, at {time}.","mcp.add.action":"Add MCP","mcp.add.title":"Add MCP","mcp.add.inputLabel":"Server to add","mcp.add.placeholder":'https://mcp.example.com/mcp\nnpx -y @scope/server\nclaude mcp add …\n{ "mcpServers": { … } }',"mcp.add.examples":"Supported formats (click one to fill in an example)","mcp.add.rawPi":"Enable pi mcp syntax ($NAME, !command)","mcp.add.rawPiOn":"In env and header values, $NAME reads a variable on the computer running Pi Web, and a value starting with ! runs as a command at every connection.","mcp.add.serverLabel":"Server","mcp.add.serverCount":"This paste holds {count} servers; add them one at a time.","mcp.add.preview":"Preview","mcp.add.readAs":"Read as","mcp.add.previewUnfilled":"Values still to fill in show what the paste holds there.","mcp.add.fields":"Values to fill in","mcp.add.field.optional":"Optional: left blank, the value it belongs to is left out.","mcp.add.field.optionalHeader":"Optional: left blank, the {name} header is not sent.","mcp.add.field.slot":"your value","mcp.add.field.storedAs":"Stored as {value}.","mcp.add.field.storedAsVariable":"Stored as {value}: pi reads the variable each time it connects, and the value stays out of mcp.json.","mcp.add.field.useVariable":"Read it from a variable of the computer running Pi Web","mcp.add.field.variableName":"Variable for {field}","mcp.add.field.variableHint":"Stored as ${…}: pi reads the variable each time it connects, and the value stays out of mcp.json.","mcp.add.field.choose":"Choose…","mcp.add.secrets":"Secrets in the paste","mcp.add.secret.holds":"holds a secret as plain text.","mcp.add.secret.storedAs":"Stored as {value}: pi reads the variable each time it connects, and the secret stays out of mcp.json.","mcp.add.secret.asPasted":"Saved in mcp.json as pasted, so the server can be saved only in the global file.","mcp.add.nameInvalid":"A server name uses letters, digits, _ and - only.","mcp.add.nameTaken":"{path} already has a server named {name}.","mcp.add.useName":"Use {name}","mcp.add.button":"Add","mcp.add.buttonTrust":"Add and trust this folder","mcp.add.adding":"Adding…","mcp.add.trustExplain":"This folder has no trust decision yet, and writing .pi/mcp.json makes it need one, so Add trusts {path} in the same step. The pi CLI shares this decision, and every folder inside it is trusted too.","mcp.add.afterAdd":"Adding tests the connection once.","mcp.add.failed":"Not added:","mcp.add.trustKept":"Pi Web trusted {folder} for this step and could not take that back, so the folder stays trusted.","mcp.add.hostEnv.body":"Its headers or OAuth client secret read {names}, which are set on the computer running Pi Web, and pi sends their values to the server at every connection. Add it only if this server should have them.","mcp.add.hostEnv.confirm":"Add and send these values","mcp.add.blocked.nothing":"Nothing to add yet: the paste holds no server pi can use.","mcp.add.blocked.fields":"Fill in {fields} first.","mcp.add.blocked.fieldsInvalid":"Correct {fields} first.","mcp.add.blocked.web-password":"It references PI_WEB_PASSWORD, so Pi Web does not add it.","mcp.add.refused.server-invalid":"pi refuses it as filled in: {error}","mcp.add.projectBlocked.no-project":"Open a project to add a server to its .pi/mcp.json.","mcp.add.projectBlocked.project-not-listed":"The project folder is not listed, so its .pi/mcp.json is not written.","mcp.add.projectBlocked.trust-unreadable":"Pi Web cannot read the trust store (trust.json), so it does not write this project's .pi/mcp.json.","mcp.add.projectBlocked.project-untrusted":"This project is not trusted, so Pi Web does not write its .pi/mcp.json. Trust it first.","mcp.add.projectBlocked.untrusted-decision":"This folder is marked as not trusted, so a server in its .pi/mcp.json would never connect.","mcp.add.projectBlocked.secret":"{fields} holds a secret as plain text, so this server can be saved only globally. To save it in the project, choose “Read it from a variable of the computer running Pi Web” for it.","mcp.add.projectBlocked.secretFixed":"{fields} holds a secret as plain text where pi reads no variable (the URL, the command or its arguments), so this server can be saved only globally.","mcp.add.projectBlocked.folder-not-fresh":"Something under this folder's .pi, or an .agents/skills folder above it, is a link to nothing. It would need trust once its target appears, so Pi Web does not trust the folder by itself. Remove or fix the link, then press Refresh.","mcp.add.projectBlocked.file-problem":"{path} cannot be written: {reason}","mcp.add.projectBlocked.trust-too-broad.home":"This is your home folder. Pi Web does not trust it by itself, since every folder in it would be trusted too; add the server globally.","mcp.add.projectBlocked.trust-too-broad.root":"This is a filesystem root. Pi Web does not trust it by itself, since every folder on it would be trusted too; add the server globally.","mcp.add.projectBlocked.trust-too-broad.contains-home":"This folder holds your home folder ({path}). Pi Web does not trust it by itself, since every folder in it would be trusted too; add the server globally.","mcp.add.projectBlocked.trust-too-broad.contains-agent-dir":"This folder holds Pi's agent folder ({path}). Pi Web does not trust it by itself, since every folder in it would be trusted too; add the server globally.","mcp.add.projectBlocked.trust-too-broad.contains-folder":"This folder holds {path}, another folder Pi Web knows, which trusting it would trust too. Pi Web does not do that by itself; add the server globally.","mcp.add.projectBlocked.trust-too-broad.contains-project":"This folder holds {path}, a project with resources that need trust and no decision of its own, which trusting this folder would trust too. Pi Web does not do that by itself; add the server globally, or open that project and trust it on its own.","mcp.add.projectBlocked.trust-too-broad.too-many-folders":"This folder holds too many folders for Pi Web to check that trusting it would trust no project inside them. Pi Web does not trust it by itself; add the server globally.","mcp.add.added":"Added {name} to {path}.","mcp.add.addedTrusted":"Added {name} to {path}, and trusted {folder}.","mcp.add.addedTrustedHere":"Added {name} to {path}, and trusted this folder.","mcp.add.testing":"Testing its connection…","mcp.add.needsSignIn":"It asks for a sign-in.","mcp.add.source.url":"a URL","mcp.add.source.command-line":"a command line","mcp.add.source.pi-mcp-add":"pi mcp add","mcp.add.source.claude-mcp-add":"claude mcp add","mcp.add.source.claude-mcp-add-json":"claude mcp add-json","mcp.add.source.codex-mcp-add":"codex mcp add","mcp.add.source.gemini-mcp-add":"gemini mcp add","mcp.add.source.vscode-add-mcp":"code --add-mcp","mcp.add.source.mcp-servers-json":"an mcpServers config (Claude, Cursor, Gemini…)","mcp.add.source.vscode-json":"a VS Code mcp.json","mcp.add.source.zed-json":"Zed settings","mcp.add.source.opencode-json":"an opencode config","mcp.add.source.server-object":"one server's JSON","mcp.add.source.server-map":"servers by name (JSON)","mcp.add.source.registry-server-json":"an MCP registry server.json","mcp.add.source.cursor-install-link":"a Cursor install link","mcp.add.source.vscode-install-link":"a VS Code install link","mcp.add.source.visual-studio-install-link":"a Visual Studio install link","mcp.add.source.copilot-app-install-link":"a GitHub Copilot app link","mcp.importNote.forServer":"{server}: {note}","mcp.importNote.empty-input":"Nothing to read yet: paste a URL, a command line or a config.","mcp.importNote.unrecognized-input":"Pi Web does not recognize this. Paste a server's URL, the command that starts it, an mcp add command, a JSON config or an install link.","mcp.importNote.invalid-json":"This looks like JSON but does not parse: {detail}","mcp.importNote.no-servers-found":"No MCP server was found in this config.","mcp.importNote.shell-operator":"The command line uses the shell operator {operator}. Paste only the command that starts the server.","mcp.importNote.shell-command-substitution":"The command line uses {syntax}, which only a shell runs. Write the value out instead.","mcp.importNote.shell-multiple-commands":"This holds more than one command. Paste only the one that starts the server.","mcp.importNote.shell-unterminated-quote":"A {quote} quote is never closed.","mcp.importNote.shell-parameter":"The command line uses the shell parameter {parameter}, which Pi Web cannot fill in.","mcp.importNote.shell-expansion":"The command line uses {expansion}, which only a shell expands. Write the value out instead.","mcp.importNote.unsupported-url-scheme":"A {scheme}: address is not a server: pi connects to http and https URLs.","mcp.importNote.github-repo-link":"This is the GitHub repository {repository}, not a server. Copy the install command, URL or config from its README.","mcp.importNote.github-mcp-page":"This is the github.com/mcp page of {name}. Its Install buttons open other apps and cannot be pasted here; copy the Cursor or VS Code install badge from the server's README instead.","mcp.importNote.github-page":"This GitHub page is not a server. Copy the install command, URL or config from the server's README.","mcp.importNote.by-name-link":"This link only names {name} in a registry and holds no settings, so Pi Web cannot add it yet. Copy the Cursor or VS Code install badge from the server's README instead.","mcp.importNote.badge-image":"This is a badge's image. Copy the link the badge opens instead.","mcp.importNote.install-link-invalid":"This install link cannot be read ({detail}).","mcp.importNote.claude-desktop-import":"claude mcp add-from-claude-desktop copies Claude Desktop's own servers. Paste the mcpServers part of claude_desktop_config.json instead.","mcp.importNote.cli-unsupported":"Pi Web does not read {cli}'s mcp add. Paste the server's own command line, URL or JSON config instead.","mcp.importNote.cli-usage":"This {cli} mcp add command is incomplete: it needs a name, and a URL or a command.","mcp.importNote.cli-unknown-option":"{cli} has no option {option}.","mcp.importNote.cli-option-needs-value":"The {cli} option {option} needs a value.","mcp.importNote.cli-option-wrong-transport":"The {cli} option {option} does not apply to {transport} servers.","mcp.importNote.cli-invalid-pair":"The {cli} option {option} cannot read {value}.","mcp.importNote.cli-not-a-server":"{cli} {command} manages {cli} itself; it is not a server. Paste the command that starts the server, or {cli} mcp add …","mcp.importNote.pi-help":"pi mcp add --help prints help and adds nothing.","mcp.importNote.field-required":"Fill in {field}.","mcp.importNote.field-invalid-option":"Pick one of the offered values for {field}.","mcp.importNote.field-reference-invalid.name":"{field}: a variable name has letters, digits and _, and does not start with a digit.","mcp.importNote.field-reference-invalid.target":"{field} cannot come from a variable: pi reads variables only in env values, headers and the OAuth client secret.","mcp.importNote.field-reference-invalid.missing":"{field}: enter the name of the variable to read it from.","mcp.importNote.sse-transport":"It uses the legacy SSE transport, which pi does not support.","mcp.importNote.sse-transport.suggested":"It uses the legacy SSE transport, which pi does not support. Try its streamable HTTP address instead: {suggestedUrl}","mcp.importNote.websocket-transport":"It connects over a WebSocket, which pi does not support.","mcp.importNote.unsupported-transport":"Its transport {type} is not one pi supports (stdio or streamable HTTP).","mcp.importNote.ambiguous-command-and-url":"It has both a command and a URL, so which to use is unclear.","mcp.importNote.no-command-or-url":"It has neither a command to start nor a URL to connect to.","mcp.importNote.zed-extension-server":"It comes from a Zed extension, which only Zed can start.","mcp.importNote.registry-packages-unsupported":"It is published only as packages to install, while pi needs a command or a URL. Paste its install command instead.","mcp.importNote.invalid-config":"pi would refuse it: {problem}","mcp.importNote.dropped-key":"{key} has no pi equivalent and was left out.","mcp.importNote.variable-unsupported-here":"{field} reads the variable {name}, which pi does not fill in there, so its value is asked for below.","mcp.importNote.variable-fallback-dropped":"{field}: pi has no default for a variable, so the fallback {fallback} of {name} was left out.","mcp.importNote.bare-dollar-literal":"{field} holds ${name} as text: this client does not read it as a variable, and pi will not either.","mcp.importNote.header-env-reference":"The header {header} sends the value of {names} from the computer running Pi Web to this server.","mcp.importNote.client-secret-env-reference":"The OAuth client secret is read from {names} on the computer running Pi Web and sent to the authorization server.","mcp.importNote.shell-command-value":"{field} runs a shell command on the computer running Pi Web at every connection.","mcp.importNote.shell-variable":"{field}: ${name} would be filled in by your shell. pi reads it from the environment of the computer running Pi Web, or its value is asked for below.","mcp.importNote.unsupported-variable":"{field} uses {variable}, which pi cannot fill in, so its value is asked for below.","mcp.importNote.input-undefined":"The config asks for the input {id} but does not define it, so its value is asked for below.","mcp.importNote.input-command-unsupported":"The input {id} runs a VS Code command, which Pi Web cannot, so its value is asked for below.","mcp.importNote.timeout-clamped":"The timeout of {from} seconds was cut to {to} seconds.","mcp.importNote.timeout-dropped":"The timeout {value} is not a number of seconds and was left out.","mcp.importNote.timeout-unit-guessed.milliseconds":"The timeout {value} was read as milliseconds; check it.","mcp.importNote.timeout-unit-guessed.seconds":"The timeout {value} was read as seconds; check it.","mcp.importNote.env-null-dropped":"{name} is set to null to unset it, which pi cannot do, so it was left out.","mcp.importNote.oauth-option-dropped":"The OAuth option {key} has no pi equivalent and was left out.","mcp.importNote.oauth-disable-unsupported":"The config turns OAuth off, which pi cannot: pi signs in with OAuth whenever the server asks.","mcp.importNote.callback-url-dropped":"The OAuth callback address {value} is not a loopback address pi can listen on, so it was left out.","mcp.importNote.callback-port-dropped":"The OAuth callback port {value} is not a port number, so it was left out.","mcp.importNote.invalid-exposure-dropped":"The exposure {value} is not one pi knows, so it was left out.","mcp.importNote.tool-filter-imported.include":"Only these tools are offered, the others hidden: {tools}.","mcp.importNote.tool-filter-imported.exclude":"These tools are hidden: {tools}.","mcp.importNote.transport-guessed":"The config names no transport, so Pi Web read it from the keys present.","mcp.importNote.insecure-http":"{host} is reached over plain http, so everything sent, tokens included, travels unencrypted.","mcp.importNote.literal-secret":"{field} holds a secret as plain text, so the server can be saved only in the global mcp.json.","mcp.importNote.cli-option-ignored":"The {cli} option {option} has no pi equivalent and was ignored.","mcp.importNote.cli-option-as-arg":"{option} comes after the server's command, so it is passed to the server as an argument, as {cli} does.","mcp.importNote.cli-extra-arguments":"{cli} adds an HTTP server by its URL alone, so the extra arguments {arguments} were left out.","mcp.importNote.mcp-remote-bridge":"This runs mcp-remote to reach {url}. pi can connect to that URL itself: paste the URL to add it without the bridge.","mcp.importNote.looks-like-pi-config":"This looks like pi's own mcp.json. If you copied it from there, turn on “Enable pi mcp syntax ($NAME, !command)”.","mcp.importNote.workspace-folder-relative":"{field}: {from} became the session's folder (.), where pi starts the server.","mcp.importNote.home-variable-translated":"{field}: {from} became {to}, which pi reads from the environment.","mcp.importNote.name-taken":"The file already has a server named {name}. Pick another name, such as {suggestedName}.","mcp.importNote.escaped-value":"{field}: $ and a leading ! were escaped, so pi reads the value as written and runs nothing.","mcp.importNote.variable-translated":"{field}: {from} became {to}, the way pi reads that variable.","mcp.importNote.home-translated":"{field}: {from} became ~, the home folder.","mcp.importNote.timeout-converted":"The timeout of {from} ms became {to} seconds.","mcp.importNote.env-value-stringified":"{name} was not text, so it was turned into text.","mcp.importNote.empty-authorization-dropped":"An empty Authorization header was left out, so pi signs in with OAuth if the server asks.","mcp.importNote.imported-disabled":"The config has it turned off, so it is added switched off.","mcp.importNote.name-derived":"Named {name} after its address or command.","mcp.importNote.name-sanitized":"{original} became {name}: pi server names use letters, digits, _ and -.","mcp.importNote.name-deduplicated":"{original} is already in use, so it is named {name}.","mcp.importNote.command-split":"{command} was split into a command and its arguments.","mcp.importNote.transport-assumed-http":"No transport is given, so it is read as a streamable HTTP server.","mcp.importNote.scheme-assumed":"Read as {url}.","mcp.importNote.client-secret-prompt":"The OAuth client secret is asked for below.","mcp.importNote.userinfo-moved-to-header":"The user name and password in the URL moved into an Authorization header: pi does not send them in the URL.","mcp.importProblem.name":"{name} is not a server name pi accepts (letters, digits, _ and -).","mcp.importProblem.not-an-object":"it is not an object.","mcp.importProblem.exposure":"the exposure {value} is not one pi knows.","mcp.importProblem.tool-exposure":"toolExposure must map tool names to exposures.","mcp.importProblem.tool-exposure.tool":"the toolExposure of {tool} is not an exposure pi knows.","mcp.importProblem.enabled":"enabled must be true or false.","mcp.importProblem.description":"description must be text.","mcp.importProblem.timeout":"the timeout {value} is not a positive number of seconds.","mcp.importProblem.sse":"the legacy SSE transport is not supported.","mcp.importProblem.url":"{url} is not an http or https URL.","mcp.importProblem.headers":"headers must map names to text.","mcp.importProblem.auth":"auth.provider must name a pi provider.","mcp.importProblem.auth-url":"auth sends a provider's token, so the URL must be https (or http on localhost).","mcp.importProblem.oauth":"oauth must be an object.","mcp.importProblem.oauth-client-id":"oauth.clientId must be text.","mcp.importProblem.oauth-client-secret":"oauth.clientSecret must be text.","mcp.importProblem.callback-port":"the OAuth callback port {value} is not a port number.","mcp.importProblem.callback-url":"the OAuth callback address {value} is not a loopback http address.","mcp.importProblem.callback-port-mismatch":"the OAuth callback address uses port {value}, not the callback port.","mcp.importProblem.oauth-scope":"oauth.scope must be text.","mcp.importProblem.oauth-client-name":"oauth.clientName must be non-empty text.","mcp.importProblem.oauth-client-registration":'oauth.clientRegistration {value} must be "dcr" or "cimd".',"mcp.importProblem.oauth-client-registration-client":'oauth.clientRegistration "cimd" cannot go with oauth.clientId or oauth.clientName.',"mcp.importProblem.oauth-client-registration-callback":'oauth.clientRegistration "cimd" needs oauth.callbackUrl on localhost or 127.0.0.1 with the path /callback.',"mcp.importProblem.auth-server-metadata-url":"oauth.authServerMetadataUrl {value} must be an https address (or http on localhost).","mcp.importProblem.args":"args must be a list of text.","mcp.importProblem.args.index":"args[{index}] is not text.","mcp.importProblem.env":"env must map names to text.","mcp.importProblem.cwd":"cwd must be text.","mcp.importProblem.no-command-or-url":"it needs a command (stdio) or a URL (streamable HTTP).","mcp.importField.reason.empty":"The paste leaves this empty.","mcp.importField.reason.input":"The config asks for this when it is installed.","mcp.importField.reason.variable":"The paste reads a variable here that pi does not fill in.","mcp.importField.reason.home":"The paste reads the home folder here in a way pi does not fill in.","mcp.importField.reason.workspace-basename":"The paste uses the workspace folder's name here, which pi does not know.","mcp.importField.reason.unsupported-variable":"The paste uses a variable here that pi cannot fill in.","mcp.importField.reason.client-secret":"The command asks for the OAuth client secret.","mcp.importField.reason.registry-header":"The registry entry asks for this header.","mcp.importField.reason.registry-variable":"The registry entry asks for this part of the address.","i18n.creatingSession":"Creating new session…","i18n.creating":"Creating…","i18n.subscription":"Subscription","i18n.subscriptions":"Subscriptions","i18n.customEndpoint":"Custom endpoint format","i18n.noChanges":"No changes","i18n.branches":"Branches","i18n.noActiveSession":"No active session","i18n.noBranches":"This session has no branches","i18n.branchesLockedWhileRunning":"Branches can't be switched while the session is running","i18n.source":"Source","i18n.preview":"Preview","i18n.diff":"Diff","i18n.downloadFile":"Download file","i18n.liveSync":"Live sync active","i18n.notWatching":"Not watching","i18n.fileViewMode":"File view mode","i18n.compareHead":"Compare working tree with HEAD","i18n.mentionSelectedLines":"Mention selected lines","i18n.disableWrap":"Disable word wrap","i18n.enableWrap":"Enable word wrap","i18n.htmlPreview":"HTML preview","i18n.previewFile":"Preview {file}","i18n.invalidMermaid":"Invalid Mermaid diagram","i18n.renderingMermaid":"Rendering Mermaid diagram","i18n.previewAfterStreaming":"Preview available after streaming","i18n.showMermaidSource":"Show Mermaid source","i18n.previewMermaid":"Preview Mermaid diagram","i18n.openMermaidViewer":"Open diagram viewer","i18n.mermaidViewer":"Mermaid diagram viewer","i18n.mermaidDiagram":"Mermaid diagram","i18n.zoomOut":"Zoom out","i18n.zoomIn":"Zoom in","i18n.fitToWidth":"Fit to width","models.discoveryFetching":"Importing models…","models.discoveryFetch":"Import models…","models.discoveryFilterPlaceholder":"Filter {count} models…","models.discoveryFilter":"Filter upstream models","models.discoverySelectShown":"Select shown","models.discoveryNoMatches":"No matching models.","models.configUnreadable":"Could not read models.json, so saving is disabled to avoid overwriting it. Fix the file, then reopen this panel. {error}","models.providerNameTaken":'Another provider is already named "{name}". Choose a different name.',"models.apiKeyPlaceholder":"ENV_VAR_NAME, !shell-command, or literal key","models.discoveryAdded":"added","models.discoveryShowing":"Showing first {shown} of {total}","models.discoveryFetched":"{count} models fetched","models.discoveryAddSelected":"Add selected","models.discoveryAddSelectedCount":"Add selected ({count})","models.catalogSource":"source: models.dev ↗","models.catalogFilling":"Filling details…","models.catalogFill":"Fill model details","models.catalogFilled":"{count} fields filled","models.catalogNoEmptyFields":"No empty fields to fill","models.catalogNoExactMatch":"No exact models.dev match","models.catalogPriceProvider":"Price matched Provider {provider}","models.catalogPriceBaseUrl":"Price matched Base URL to {provider}","models.catalogPriceConsensus":"Price agreed by {support}/{total} records","models.catalogPriceUnreliable":"No reliable price found","models.catalogUndo":"Undo","models.capabilities":"Capabilities","models.reasoning":"Reasoning / thinking","models.imageInput":"Image input","models.modelSpecs":"Model specifications","models.contextWindow":"Context window (tokens)","models.contextForModel":"Context window for {model}","models.contextInvalid":"Context window of {model}: enter a positive whole number of tokens.","models.contextOverrideHelp":"Context window in tokens; blank uses the default.","models.applyHelp":"Open sessions: select the model again to apply.","models.maxOutputTokens":"Max output tokens","models.costPerMillion":"Cost per million tokens","models.costInput":"Input","models.costOutput":"Output","models.costCacheRead":"Cache read","models.costCacheWrite":"Cache write","models.notProvided":"Not provided","models.editCosts":"Edit prices","models.finishEditingCosts":"Done","models.costAllRequired":"Enter a valid non-negative price; blank fields are saved as 0.","models.advancedSettings":"Advanced settings","models.providerDefaults":"Using provider defaults","models.headersSummary":"Headers: {count}","models.compatSummary":"Compatibility: {count}","models.thinkingSummary":"Thinking levels: {count}","models.apiOverride":"API override","models.baseUrlOverride":"Base URL override","models.headers":"Headers","models.headersHelp":"Overrides provider headers of the same name.","models.compatibility":"Compatibility","models.deepSeekThinkingCompat":"DeepSeek thinking compatibility","models.developerRole":"Use the developer role for the system prompt","models.adaptiveThinking":"Claude adaptive thinking (effort levels)","models.thinkingLevelMap":"Thinking level map","models.clearAll":"Clear all","models.enabledSection":"Available models","models.enabledCount":"{enabled}/{total} enabled","models.enableAll":"Enable all","models.disableAll":"Disable all","models.enableShown":"Enable shown","models.disableShown":"Disable shown","models.enabledFilter":"Filter available models","models.enabledFilterPlaceholder":"Filter {count} models…","models.enabledNoMatches":"No matching models.","models.enabledToggle":"Show {model} in the model selector","models.enabledProviderToggle":"Enable all {provider} models","models.enabledPinHint":"Thinking level pinned by enabledModels. Edit settings.json to change it.","models.enabledLastModel":"At least one model has to stay enabled.","models.enabledProjectScope":"This project's .pi/settings.json sets enabledModels and overrides the global value, so these switches are read-only. Edit that file to change the list.","models.enabledUnavailable":"Sign in to this provider to choose its models.","models.refreshCatalog":"Refresh catalog","models.refreshingCatalog":"Refreshing…","models.refreshCatalogHint":"Fetch the model list this provider publishes now. pi's built-in list is fixed at the pi version pi-web ships with, so a newly released model only shows up after a refresh.","models.catalogUpdated":"Model list updated from the provider.","models.catalogUnchanged":"Already up to date.","models.catalogUnreachable":"Could not reach the catalog. Check the connection and the provider credential, then try again.","models.catalogOffline":"PI_OFFLINE is set, so pi-web does not fetch catalogs.","models.enabledCustomEmpty":"No models available from this provider yet. Save your changes, and check that the API key works.","models.enabledStale":"{count} unmatched","models.enabledStaleHint":"A model is available when its provider has a usable credential. An entry matches nothing when that credential is missing, when the model was renamed or deleted, or when the entry was written for another machine.","models.enabledPrune":"Remove unmatched entries","models.enabledPruneHint":"Delete the configured entries that match no available model. Everything else stays as it is.","models.enabledClear":"Enable all models","models.enabledClearHint":"Remove the model filter for every provider.","i18n.testingModel":"Testing model connection...","i18n.connected":"Connected","i18n.failed":"Failed","i18n.test":"Test","i18n.testConnection":"Test model connection","i18n.provider":"Provider","i18n.model":"Model","i18n.providerName":"Provider name","i18n.rename":"Rename","i18n.default":"Default","i18n.disabled":"Disabled","i18n.noResources":"No resources","i18n.unknown":"Unknown","i18n.installedVersion":"installed {version}","i18n.configuredVersion":"configured {version}","i18n.extensions":"Extensions","i18n.prompts":"Prompts","i18n.themes":"Themes","i18n.resourceCount":"{count} {label}","i18n.extensionShort":"ext","i18n.skillShort":"skills","i18n.promptShort":"prompts","i18n.themeShort":"themes","i18n.custom":"Custom","i18n.clearAll":"clear all","i18n.connectedSuccessfully":"Connected successfully.","i18n.notConnected":"not connected","i18n.configured":"configured","i18n.notConfigured":"not configured","i18n.openingBrowser":"Opening browser…","i18n.submit":"Submit","i18n.login":"Login","i18n.relogin":"Re-login","i18n.disconnect":"Disconnect","i18n.networkError":"Network error","i18n.continuing":"Continuing…","i18n.skills":"Skills","i18n.plugins":"Plugins","i18n.addSkill":"Add skill","i18n.addPlugin":"Add plugin","i18n.selectSkill":"Select a skill","i18n.selectPackage":"Select a package","i18n.updateAvailable":"Update available","i18n.upToDate":"Up to date","i18n.automaticChecksUnavailable":"Automatic checks unavailable","i18n.checkFailed":"Check failed","i18n.installed":"Installed","i18n.status":"Status","i18n.version":"Version","i18n.description":"Description","i18n.package":"Package","i18n.resources":"Resources","i18n.installedPath":"Installed path","i18n.cwd":"CWD","i18n.resolvedResources":"Resolved Resources","i18n.reloadSession":"Reload session","i18n.reloading":"Reloading...","i18n.packageRemoved":"Package removed.","i18n.packageInstalled":"Package installed.","i18n.packageUpdated":"Package updated.","i18n.packagesUpdated":"Packages updated.","i18n.updateAllPlugins":"Update all","i18n.updateAllPluginsHint":"Updates all configured plugins","i18n.packageDisabled":"Package disabled.","i18n.packageEnabled":"Package enabled.","i18n.sessionReloaded":"Session reloaded.","i18n.thinking":"Thinking","i18n.largeMessageReveal":"Message content is very large ({size}). Click to view as plain text — markdown rendering is disabled to keep the page responsive.","i18n.loadingThinking":"Loading thinking...","i18n.copyMessage":"Copy message","i18n.editFromHere":"Edit from here","i18n.editFromHereTitle":"Edit from here — branches within this session","i18n.newSession":"New session","i18n.newSessionTitle":"New session — creates an independent copy from here","i18n.estimatedTokens":"Estimated token count while streaming","i18n.noOutput":"(no output)","i18n.noSummary":"(no summary)","i18n.conversationCompacted":"Conversation compacted","i18n.compactedFromTokens":"Compacted from {tokens} tokens","i18n.compactionDescription":"The conversation history before this point was compacted into the following summary:","i18n.fileContext":"File context: {details}","i18n.readFiles":"Read files","i18n.modifiedFiles":"Modified files","i18n.noMessage":"(no message)","i18n.collapse":"Collapse","i18n.expand":"Expand","i18n.hideDetails":"Hide details","i18n.showDetails":"Show details","i18n.thinkingUnavailable":"Thinking content unavailable","i18n.before":"Before","i18n.after":"After","diff.unchangedLine":"1 unchanged line","diff.unchangedLines":"{count} unchanged lines","i18n.sessionComplete":"Session complete","i18n.taskFinished":"Task finished.","i18n.attentionNeeded":"Pi needs your attention","i18n.extensionInputNeeded":"An extension is waiting for your input."}}},94807:(a,b,c)=>{"use strict";let d=c(84762),{toPromise:e,toSync:f,toSyncOptions:g}=c(43946);async function h(a,b){let c=await e(d.lock)(a,b);return e(c)}a.exports=h,a.exports.lock=h,a.exports.unlock=function(a,b){return e(d.unlock)(a,b)},a.exports.lockSync=function(a,b){let c=f(d.lock)(a,g(b));return f(c)},a.exports.unlockSync=function(a,b){return f(d.unlock)(a,g(b))},a.exports.check=function(a,b){return e(d.check)(a,b)},a.exports.checkSync=function(a,b){return f(d.check)(a,g(b))}},95415:(a,b,c)=>{var d,e,f,g=c(29021),h=c(68500),i=c(44449),j=c(45211),k=c(28354);function l(a,b){Object.defineProperty(a,d,{get:function(){return b}})}"function"==typeof Symbol&&"function"==typeof Symbol.for?(d=Symbol.for("graceful-fs.queue"),e=Symbol.for("graceful-fs.previous")):(d="___graceful-fs.queue",e="___graceful-fs.previous");var m=function(){};function n(a){h(a),a.gracefulify=n,a.createReadStream=function(b,c){return new a.ReadStream(b,c)},a.createWriteStream=function(b,c){return new a.WriteStream(b,c)};var b=a.readFile;a.readFile=function(a,c,d){return"function"==typeof c&&(d=c,c=null),function a(c,d,e,f){return b(c,d,function(b){b&&("EMFILE"===b.code||"ENFILE"===b.code)?o([a,[c,d,e],b,f||Date.now(),Date.now()]):"function"==typeof e&&e.apply(this,arguments)})}(a,c,d)};var c=a.writeFile;a.writeFile=function(a,b,d,e){return"function"==typeof d&&(e=d,d=null),function a(b,d,e,f,g){return c(b,d,e,function(c){c&&("EMFILE"===c.code||"ENFILE"===c.code)?o([a,[b,d,e,f],c,g||Date.now(),Date.now()]):"function"==typeof f&&f.apply(this,arguments)})}(a,b,d,e)};var d=a.appendFile;d&&(a.appendFile=function(a,b,c,e){return"function"==typeof c&&(e=c,c=null),function a(b,c,e,f,g){return d(b,c,e,function(d){d&&("EMFILE"===d.code||"ENFILE"===d.code)?o([a,[b,c,e,f],d,g||Date.now(),Date.now()]):"function"==typeof f&&f.apply(this,arguments)})}(a,b,c,e)});var e=a.copyFile;e&&(a.copyFile=function(a,b,c,d){return"function"==typeof c&&(d=c,c=0),function a(b,c,d,f,g){return e(b,c,d,function(e){e&&("EMFILE"===e.code||"ENFILE"===e.code)?o([a,[b,c,d,f],e,g||Date.now(),Date.now()]):"function"==typeof f&&f.apply(this,arguments)})}(a,b,c,d)});var f=a.readdir;a.readdir=function(a,b,c){"function"==typeof b&&(c=b,b=null);var d=g.test(process.version)?function(a,b,c,d){return f(a,e(a,b,c,d))}:function(a,b,c,d){return f(a,b,e(a,b,c,d))};return d(a,b,c);function e(a,b,c,e){return function(f,g){f&&("EMFILE"===f.code||"ENFILE"===f.code)?o([d,[a,b,c],f,e||Date.now(),Date.now()]):(g&&g.sort&&g.sort(),"function"==typeof c&&c.call(this,f,g))}}};var g=/^v[0-5]\./;if("v0.8"===process.version.substr(0,4)){var j=i(a);q=j.ReadStream,r=j.WriteStream}var k=a.ReadStream;k&&(q.prototype=Object.create(k.prototype),q.prototype.open=function(){var a=this;t(a.path,a.flags,a.mode,function(b,c){b?(a.autoClose&&a.destroy(),a.emit("error",b)):(a.fd=c,a.emit("open",c),a.read())})});var l=a.WriteStream;l&&(r.prototype=Object.create(l.prototype),r.prototype.open=function(){var a=this;t(a.path,a.flags,a.mode,function(b,c){b?(a.destroy(),a.emit("error",b)):(a.fd=c,a.emit("open",c))})}),Object.defineProperty(a,"ReadStream",{get:function(){return q},set:function(a){q=a},enumerable:!0,configurable:!0}),Object.defineProperty(a,"WriteStream",{get:function(){return r},set:function(a){r=a},enumerable:!0,configurable:!0});var m=q;Object.defineProperty(a,"FileReadStream",{get:function(){return m},set:function(a){m=a},enumerable:!0,configurable:!0});var p=r;function q(a,b){return this instanceof q?(k.apply(this,arguments),this):q.apply(Object.create(q.prototype),arguments)}function r(a,b){return this instanceof r?(l.apply(this,arguments),this):r.apply(Object.create(r.prototype),arguments)}Object.defineProperty(a,"FileWriteStream",{get:function(){return p},set:function(a){p=a},enumerable:!0,configurable:!0});var s=a.open;function t(a,b,c,d){return"function"==typeof c&&(d=c,c=null),function a(b,c,d,e,f){return s(b,c,d,function(g,h){g&&("EMFILE"===g.code||"ENFILE"===g.code)?o([a,[b,c,d,e],g,f||Date.now(),Date.now()]):"function"==typeof e&&e.apply(this,arguments)})}(a,b,c,d)}return a.open=t,a}function o(a){m("ENQUEUE",a[0].name,a[1]),g[d].push(a),q()}function p(){for(var a=Date.now(),b=0;b<g[d].length;++b)g[d][b].length>2&&(g[d][b][3]=a,g[d][b][4]=a);q()}function q(){if(clearTimeout(f),f=void 0,0!==g[d].length){var a=g[d].shift(),b=a[0],c=a[1],e=a[2],h=a[3],i=a[4];if(void 0===h)m("RETRY",b.name,c),b.apply(null,c);else if(Date.now()-h>=6e4){m("TIMEOUT",b.name,c);var j=c.pop();"function"==typeof j&&j.call(null,e)}else Date.now()-i>=Math.min(1.2*Math.max(i-h,1),100)?(m("RETRY",b.name,c),b.apply(null,c.concat([h]))):g[d].push(a);void 0===f&&(f=setTimeout(q,0))}}k.debuglog?m=k.debuglog("gfs4"):/\bgfs4\b/i.test(process.env.NODE_DEBUG||"")&&(m=function(){var a=k.format.apply(k,arguments);console.error(a="GFS4: "+a.split(/\n/).join("\nGFS4: "))}),!g[d]&&(l(g,global[d]||[]),g.close=function(a){function b(b,c){return a.call(g,b,function(a){a||p(),"function"==typeof c&&c.apply(this,arguments)})}return Object.defineProperty(b,e,{value:a}),b}(g.close),g.closeSync=function(a){function b(b){a.apply(g,arguments),p()}return Object.defineProperty(b,e,{value:a}),b}(g.closeSync),/\bgfs4\b/i.test(process.env.NODE_DEBUG||"")&&process.on("exit",function(){m(g[d]),c(12412).equal(g[d].length,0)})),global[d]||l(global,g[d]),a.exports=n(j(g)),process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH&&!g.__patched&&(a.exports=n(g),g.__patched=!0)},95655:(a,b,c)=>{"use strict";c.d(b,{My:()=>i,Te:()=>m,Wu:()=>h,jQ:()=>n,kY:()=>g,vU:()=>j,wf:()=>f}),c(97136);let d=Symbol.for("pi-web:mcp-status:by-config");function e(){let a=globalThis;return a[d]??=new Map}function f(a){return`${a.scope}\0${a.sourcePath}\0${a.name}`}function g(a,b,c){let d=e(),g=f(a),h=d.get(g)??new Map;d.delete(g),h.delete(b),h.set(b,c),d.set(g,h);for(let a=function(a){let b=0;for(let c of a.values())b+=c.size;return b}(d);a>500;a--){let[a,b]=d.entries().next().value;b.delete(b.keys().next().value),0===b.size&&d.delete(a)}}function h(a,b,c){return e().get(f(a))?.get(b)===c}function i(a,b,c){if(!h(a,b,c))return!1;let d=e(),g=f(a),i=d.get(g);return i?.delete(b),i?.size===0&&d.delete(g),!0}function j(a,b,c,d){return!!h(a,b,c)&&(g(a,b,d),!0)}let k=Symbol.for("pi-web:mcp-inactive-hosts");function l(){let a=globalThis;return a[k]??=new Map}function m(a,b){let c=l();for(c.delete(a),c.set(a,b);c.size>100;)c.delete(c.keys().next().value)}function n(a,b){let c=l();(void 0===b||c.get(a)===b)&&c.delete(a)}},96452:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{S9:()=>k,je:()=>l,vd:()=>i});var e=c(58655),f=c(13856),g=a([f]);function h(){return globalThis.__piWebProviderModelCatalog??=new Map,globalThis.__piWebProviderModelCatalog}async function i(a){let b=new Map;for(let c of(await a.getAvailable()))b.set(c.provider,[...b.get(c.provider)??[],c]);let c=[...b.keys()].some(a=>!h().has(a));for(let[a,c]of b)h().set(a,c);c&&(0,e.kn)()}function j(a){let b=new Set(a.getModels().map(a=>a.provider));return[...h()].flatMap(([a,c])=>b.has(a)?[]:c)}function k(a,b,c){return j(a).find(a=>a.provider===b&&a.id===c)}async function l(a,b,c){let d;if(0===j(a).length)return;try{d=(0,f.IR)(await (0,f.py)(new Proxy(a,{get(a,b,c){if("getAvailable"===b)return async(...b)=>{let[c]=b,d=j(a).filter(a=>!c||a.provider===c);return[...await a.getAvailable(...b),...d]};let d=Reflect.get(a,b,c);return"function"==typeof d?d.bind(a):d}}),b),c)}catch{return}let e=d.model&&k(a,d.model.provider,d.model.id);return e?{model:e,...d.thinkingLevel?{thinkingLevelPin:d.thinkingLevel}:{}}:void 0}f=(g.then?(await g)():g)[0],d()}catch(a){d(a)}})},97136:(a,b,c)=>{"use strict";c.d(b,{Eb:()=>j,W3:()=>h,gB:()=>g,uK:()=>f});var d=c(33873);let e=/^[a-zA-Z]:[\\/]/;function f(a){return e.test(a)||a.startsWith("\\\\")||a.startsWith("//")}function g(a){return a&&"win32"===process.platform?(0,d.normalize)(a):a}function h(a){return a.replace(/\\/g,"/")}function i(a){let b=(0,d.normalize)(g(a)),c=(0,d.parse)(b).root.length,e=b.length;for(;e>c&&b[e-1]===d.sep;)e--;return b.slice(0,e)}function j(a,b){if(a===b)return!0;if(!a||!b)return!1;let c=i(a),d=i(b);return"win32"===process.platform?c.toLowerCase()===d.toLowerCase():c===d}}};
49
+ ▍`;(null===c.messageId||function(a,b,c=Date.now()){return!(c-a.lastEditAt<1500)&&(b.length-a.lastLen>=40||b.length<200&&""!==b&&0===a.lastLen)}(c,e))&&u(a,d,e)},onUiRequest:b=>{v(a,d,b)}})}}d()}catch(a){d(a)}})},83267:(a,b,c)=>{"use strict";function d(a){if(!a.startsWith("npm:"))return;let b=a.slice(4).trim(),c=b.match(/^(@?[^@]+(?:\/[^@]+)?)(?:@(.+))?$/);return{name:c?.[1]??b,spec:b,version:c?.[2]}}c.d(b,{e:()=>d})},84762:(a,b,c)=>{"use strict";let d=c(33873),e=c(95415),f=c(16794),g=c(28718),h=c(678),i={};function j(a,b){return b.lockfilePath||`${a}.lock`}function k(a,b,c){if(!b.realpath)return c(null,d.resolve(a));b.fs.realpath(a,c)}function l(a,b){return a.mtime.getTime()<Date.now()-b.stale}function m(a,b,c){b.fs.rmdir(j(a,b),a=>{if(a&&"ENOENT"!==a.code)return c(a);c()})}function n(a,b,c){b.released=!0,b.updateTimeout&&clearTimeout(b.updateTimeout),i[a]===b&&delete i[a],b.options.onCompromised(c)}function o(a,b,c){k(a,b={fs:e,realpath:!0,...b},(a,d)=>{if(a)return c(a);let e=i[d];if(!e)return c(Object.assign(Error("Lock is not acquired/owned by you"),{code:"ENOTACQUIRED"}));e.updateTimeout&&clearTimeout(e.updateTimeout),e.released=!0,delete i[d],m(d,b,c)})}g(()=>{for(let a in i){let b=i[a].options;try{b.fs.rmdirSync(j(a,b))}catch(a){}}}),a.exports.lock=function(a,b,c){(b={stale:1e4,update:null,realpath:!0,retries:0,fs:e,onCompromised:a=>{throw a},...b}).retries=b.retries||0,b.retries="number"==typeof b.retries?{retries:b.retries}:b.retries,b.stale=Math.max(b.stale||0,2e3),b.update=null==b.update?b.stale/2:b.update||0,b.update=Math.max(Math.min(b.update,b.stale/2),1e3),k(a,b,(a,d)=>{if(a)return c(a);let e=f.operation(b.retries);e.attempt(()=>{!function a(b,c,d){let e=j(b,c);c.fs.mkdir(e,f=>f?"EEXIST"!==f.code?d(f):c.stale<=0?d(Object.assign(Error("Lock file is already being held"),{code:"ELOCKED",file:b})):void c.fs.stat(e,(e,f)=>e?"ENOENT"===e.code?a(b,{...c,stale:0},d):d(e):l(f,c)?void m(b,c,e=>{if(e)return d(e);a(b,{...c,stale:0},d)}):d(Object.assign(Error("Lock file is already being held"),{code:"ELOCKED",file:b}))):h.probe(e,c.fs,(a,b,f)=>{if(a)return c.fs.rmdir(e,()=>{}),d(a);d(null,b,f)}))}(d,b,(a,f,g)=>{if(e.retry(a))return;if(a)return c(e.mainError());let k=i[d]={lockfilePath:j(d,b),mtime:f,mtimePrecision:g,options:b,lastUpdate:Date.now()};!function a(b,c){let d=i[b];!d.updateTimeout&&(d.updateDelay=d.updateDelay||c.update,d.updateTimeout=setTimeout(()=>{d.updateTimeout=null,c.fs.stat(d.lockfilePath,(e,f)=>{let g=d.lastUpdate+c.stale<Date.now();if(e)return"ENOENT"===e.code||g?n(b,d,Object.assign(e,{code:"ECOMPROMISED"})):(d.updateDelay=1e3,a(b,c));if(d.mtime.getTime()!==f.mtime.getTime())return n(b,d,Object.assign(Error("Unable to update lock within the stale threshold"),{code:"ECOMPROMISED"}));let i=h.getMtime(d.mtimePrecision);c.fs.utimes(d.lockfilePath,i,i,e=>{let f=d.lastUpdate+c.stale<Date.now();if(!d.released){if(e)return"ENOENT"===e.code||f?n(b,d,Object.assign(e,{code:"ECOMPROMISED"})):(d.updateDelay=1e3,a(b,c));d.mtime=i,d.lastUpdate=Date.now(),d.updateDelay=null,a(b,c)}})})},d.updateDelay),d.updateTimeout.unref&&d.updateTimeout.unref())}(d,b),c(null,a=>{if(k.released)return a&&a(Object.assign(Error("Lock is already released"),{code:"ERELEASED"}));o(d,{...b,realpath:!1},a)})})})})},a.exports.unlock=o,a.exports.check=function(a,b,c){(b={stale:1e4,realpath:!0,fs:e,...b}).stale=Math.max(b.stale||0,2e3),k(a,b,(a,d)=>{if(a)return c(a);b.fs.stat(j(d,b),(a,d)=>a?"ENOENT"===a.code?c(null,!1):c(a):c(null,!l(d,b)))})},a.exports.getLocks=function(){return i}},85844:(a,b,c)=>{"use strict";function d(a){return{name:"pi-web-exact-system-prompt",hidden:!0,factory:b=>{b.on("before_agent_start",()=>{let b=a();return void 0===b?void 0:{systemPrompt:b}})}}}c.d(b,{Q:()=>d})},86588:(a,b,c)=>{"use strict";c.d(b,{wz:()=>e});var d=c(97136);function e(a){if(!a)return;let b=(0,d.W3)(a);(!globalThis.__piAdditionalAllowedRoots&&(globalThis.__piAdditionalAllowedRoots=new Set),globalThis.__piAdditionalAllowedRoots).add(b),globalThis.__piAllowedRootsCache?.roots.add(b)}},88264:(a,b,c)=>{"use strict";c.a(a,async(a,b)=>{try{c(73024),c(76760);var d=c(75430);c(94807);var e=a([d]);d=(e.then?(await e)():e)[0],b()}catch(a){b(a)}})},88461:(a,b,c)=>{"use strict";c.d(b,{Rq:()=>g,p7:()=>h});var d=c(14968),e=c(90379);async function f(a,b,c){if((0,e.As)(c))try{await (0,d.M3)(a,b,(0,e.TS)(c));return}catch(a){if(!(a instanceof d.ak))throw a}try{await (0,d._z)(a,b,(0,e.LQ)(c),{parseMode:"HTML"})}catch(e){if(e instanceof d.ak&&400===e.statusCode)return void await (0,d._z)(a,b,c);throw e}}async function g(a,b,c){let g=c.trim();if(""!==g){if((0,e.As)(g)&&g.length<=32e3)try{await (0,d.M3)(a,b,(0,e.TS)(g));return}catch(a){if(!(a instanceof d.ak))throw a}for(let c of(0,e.TT)(g))await f(a,b,c)}}async function h(a,b,c,f){if(!(0,e.As)(f)||f.trim().length>32e3)return!1;try{return await (0,d.XQ)(a,b,c,"",{richMarkdown:(0,e.TS)(f.trim())}),!0}catch(a){if(!(a instanceof d.ak))throw a;return!1}}},89076:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{Pn:()=>h,xW:()=>e.xW});var e=c(20946),f=c(36561),g=a([f]);function h(a,b={}){let c=b.platform??process.platform;return(d,g,h)=>{var i;let j,k=(i=d.config,(j=(0,e.tF)(i,a))&&("oauth-client-secret"===j.kind?"oauth.clientSecret":`${j.kind} "${j.name}"`));if(k)throw Error(`MCP server "${d.name}" ${k} references ${e.aS}, which Pi Web does not pass to MCP servers`);let l=a.createDefaultTransport(d,g,h);if("url"in d.config)return l;if(!(l instanceof a.StdioTransport))throw Error(`MCP server "${d.name}": the SDK did not create a stdio transport`);let{env:m={},...n}=l.options,o=new Set(Object.keys(d.config.env??{})),p=Object.keys(m).find(a=>!o.has(a));if(void 0!==p)throw Error(`MCP server "${d.name}": the SDK set environment variable ${p}, which its config does not declare`);return new a.StdioTransport({...n,env:function(a,b,c){let d={};for(let[b,e]of Object.entries((0,f.$9)(a,c)))void 0!==e&&(d[b]=e);for(let[a,e]of Object.entries(b)){if("win32"===c)for(let b of Object.keys(d))b.toUpperCase()===a.toUpperCase()&&delete d[b];d[a]=e}return d}(b.baseEnvironment??process.env,m,c),inheritEnv:!1})}}f=(g.then?(await g)():g)[0],d()}catch(a){d(a)}})},89420:(a,b,c)=>{"use strict";c.d(b,{TU:()=>j,o4:()=>h,qy:()=>i,xk:()=>k});var d=c(29021),e=c(33873),f=c.n(e),g=c(97136);function h(a,b){for(let c of b){let b=(0,g.uK)(a)||(0,g.uK)(c),d=b?f().win32:f(),e=b?"\\":f().sep,h=d.resolve(a),i=d.resolve(c),j=b?h.toLowerCase():h,k=b?i.toLowerCase():i,l=k.endsWith(e)?k:k+e;if(j===k||j.startsWith(l))return!0}return!1}function i(a){let b=new Set;for(let c of a)try{b.add((0,d.realpathSync)(c))}catch{}return b}function j(a){let b="win32"===process.platform||(0,g.uK)(a)?/[\\/]/:"/";return a.split(b).includes("..")}function k(a,b){let c;if(j(a))return!1;try{c=(0,d.realpathSync)(a)}catch{return!1}return h(c,i(b))}},89717:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{wz:()=>e.wz});var e=c(86588);c(89420);var f=c(57432);c(97136);var g=a([f]);f=(g.then?(await g)():g)[0],d()}catch(a){d(a)}})},90053:a=>{"use strict";a.exports=JSON.parse('{"TB":"https://github.com/mcy2015/pi-web#readme"}')},90379:(a,b,c)=>{"use strict";c.d(b,{As:()=>l,LQ:()=>n,TS:()=>m,TT:()=>f,mN:()=>d,qh:()=>e});let d=4096;function e(a){let b=a.content;if("string"==typeof b)return b;if(Array.isArray(b)){let a=[];for(let c of b)c&&"object"==typeof c&&!Array.isArray(c)&&"text"===c.type&&"string"==typeof c.text&&a.push(c.text);return a.join("\n\n")}return""}function f(a,b=d){let c=a.trim();if(""===c)return[];if(c.length<=b)return[c];let e=[],g=c;for(;g.length>b;){let a=g.slice(0,b),c=Math.max(a.lastIndexOf("\n\n"),a.lastIndexOf("\n"),a.lastIndexOf(" ")),d=c>0?c:b;e.push(g.slice(0,d)),g=g.slice(d).replace(/^\s+/,"")}return""!==g&&e.push(g),e}function g(a){return a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}let h=/```[\s\S]*?```/g;function i(a){let b=a.trim();return b.startsWith("|")&&-1!==b.indexOf("|",1)}function j(a){return/^[\s|:-]*-[\s|:-]*$/.test(a.trim())&&a.includes("-")}function k(a){let b=a.trim();return b.startsWith("|")&&(b=b.slice(1)),b.endsWith("|")&&(b=b.slice(0,-1)),b.replace(/\\\|/g,"\x03").split("|").map(a=>a.trim().replace(/\u0003/g,"|"))}function l(a){let b=a.replace(h,"").split("\n");for(let a=0;a+1<b.length;a++)if(i(b[a])&&j(b[a+1]))return!0;return!1}function m(a){let b=[],c=a.replace(h,a=>(b.push(a),`\u0000${b.length-1}\u0000`)),d=[];c=c.replace(/`[^`\n]+`/g,a=>(d.push(a),`\u0001${d.length-1}\u0001`));let e=[];return(c=(c=(c=(c=c.replace(/\[[^\]\n]*\]\([^)\n]*\)/g,a=>(e.push(a),`\u0002${e.length-1}\u0002`))).split(/(\s+)/).map(a=>a.replace(/[A-Za-z0-9._~/@-]+/g,a=>!a.includes("_")||a.startsWith("_")||a.endsWith("_")?a:`\`${a}\``)).join("")).replace(/\u0002(\d+)\u0002/g,(a,b)=>e[Number(b)]??"")).replace(/\u0001(\d+)\u0001/g,(a,b)=>d[Number(b)]??"")).replace(/\u0000(\d+)\u0000/g,(a,c)=>b[Number(c)]??"")}function n(a){let b=[],c=a.replace(/```[a-zA-Z0-9+#-]*\n?([\s\S]*?)```/g,(a,c)=>(b.push(`<pre>${g(c.replace(/\n$/,""))}</pre>`),`\u0000${b.length-1}\u0000`));return(c=(c=(c=(c=(c=(c=(c=g(c=function(a){let b=a.split("\n"),c=[],d=0;for(;d<b.length;){if(i(b[d])&&d+1<b.length&&j(b[d+1])){let a=k(b[d]);d+=2;let e=[];for(;d<b.length&&i(b[d]);){let c=function(a,b){let c=[],d=b[0]??"";""!==d&&c.push(`**${d}**`);for(let d=1;d<b.length;d++){let e=b[d];(""!==e||(a[d]??"")!=="")&&c.push(a[d]?`${a[d]}: ${e}`:e)}return c.join("\n")}(a,k(b[d]));""!==c&&e.push(c),d++}e.length>0&&c.push(e.join("\n\n"),"");continue}c.push(b[d]),d++}return c.join("\n")}(c))).replace(/`([^`\n]+)`/g,"<code>$1</code>")).replace(/\[([^\]\n]+)\]\((https?:\/\/[^\s)]+)\)/g,'<a href="$2">$1</a>')).replace(/\*\*([^*\n]+)\*\*/g,"<b>$1</b>")).replace(/(?<!\*)\*([^*\n]+)\*(?!\*)/g,"<i>$1</i>")).replace(/^#{1,6}[ \t]+(.+)$/gm,"<b>$1</b>")).replace(/^([ \t]*)[-*+][ \t]+/gm,"$1• ")).replace(/\u0000(\d+)\u0000/g,(a,c)=>b[Number(c)]??"")}},90714:(a,b,c)=>{"use strict";function d(a,b,c){let d=globalThis,e=d[a]??=new Map,f=(e.get(b)??Promise.resolve()).then(c),g=f.then(()=>void 0,()=>void 0);return e.set(b,g),g.then(()=>{e.get(b)===g&&e.delete(b)}),f}c.d(b,{T:()=>d})},93391:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{wQ:()=>g});var e=c(88264),f=a([e]);e=(f.then?(await f)():f)[0];let h=new Set(["bash","powershell"]);function g(a,b,c=process.platform){return function(a,b){let c=b?"powershell":"bash",d=[];for(let b of a){let a=h.has(b)?c:b;d.includes(a)||d.push(a)}return d}(a,function(a,b=process.platform){return"win32"===b&&a?.includes("powershell")===!0&&!a.includes("bash")}(b,c))}d()}catch(a){d(a)}})},94343:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{q8:()=>y});var e=c(77598),f=c(73024),g=c(51455),h=c(76760),i=c(75430),j=c(73706),k=a([i]);function l(a){return null!==a&&"object"==typeof a&&!Array.isArray(a)}i=(k.then?(await k)():k)[0];let z=Buffer.from("\n");function m(a){if(!a.trim())return null;try{let b=JSON.parse(a);return b&&"object"==typeof b?b:null}catch{return null}}async function n(a){let b;try{b=await (0,g.open)(a,"r");let c=Buffer.allocUnsafe(65536),{bytesRead:d}=await b.read(c,0,c.length,0);if(d<=0)return null;for(let a of c.subarray(0,d).toString("utf8").split("\n")){let b=m(a.replace(/\r$/,""));if(b)return"session"===b.type?b:null}return null}catch{return null}finally{await b?.close().catch(()=>void 0)}}async function o(a,b){let c=await n(a);if(!c||"string"!=typeof c.id||"string"!=typeof c.cwd||"string"!=typeof c.timestamp)return null;let d=new Date(c.timestamp);return Number.isFinite(d.getTime())?{path:a,id:c.id,cwd:c.cwd,created:d,modified:new Date(b.mtimeMs),messageCount:0,firstMessage:"",..."string"==typeof c.parentSession?{parentSessionPath:c.parentSession}:{},detailsPending:!0}:null}function p(a,b){return(0,e.createHash)("sha1").update(a).update(b).digest("base64")}async function q(a,b,c,d){let e=b,g=[],h=[c];for await(let c of(0,f.createReadStream)(a,{start:b})){let a=c.indexOf(10);if(-1===a){g.push(c);continue}let b=g,f=0;for(;-1!==a;){let b=c.subarray(f,a),h=g.length>0?Buffer.concat([...g,b]):b;if(g=[],e+=h.length+1,!d(h,e))return null;f=a+1,a=c.indexOf(10,f)}h=function(a){let b=0;for(let c of a)b+=c.length;let c=0;for(;c<a.length-1&&b-a[c].length>=512;)b-=a[c].length,c++;return c>0?a.slice(c):a}([...h,...b,c.subarray(0,f)]),f<c.length&&g.push(c.subarray(f))}let i=Buffer.concat(h);return{offset:e,sample:i.subarray(Math.max(0,i.length-512)),rest:Buffer.concat(g)}}async function r(a,b){let c=await (0,g.open)(a,"r");try{let a=Math.max(0,b.offset-512),d=Buffer.alloc(b.headerEnd),e=Buffer.alloc(b.offset-a),f=await c.read(d,0,d.length,0),g=await c.read(e,0,e.length,a);if(f.bytesRead!==d.length||g.bytesRead!==e.length)return null;return p(d,e)===b.check?{head:d,tail:e}:null}finally{await c.close()}}async function s(a,b){try{let c=await (0,g.stat)(a),d=b?.resume&&b.resume.ino===c.ino?await r(a,b.resume):null,e=null,f=0,h=0,i=Buffer.alloc(0),j={messageCount:0,firstMessage:""};if(b?.resume&&d){let{info:a,resume:c}=b;h=c.offset,i=d.tail,e={id:a.id,cwd:a.cwd,created:new Date(a.created.getTime()),parentSessionPath:a.parentSessionPath,time:a.created.getTime(),head:d.head},f=c.headerEnd,j.name=a.name,j.messageCount=a.messageCount,j.firstMessage=c.hasFirstMessage?a.firstMessage:"",j.lastActivityTime=c.lastActivityTime}let k=!1,l=(a,b)=>{let c;for(let g of(c=a.toString("utf8")).includes("\r")?c.split("\r"):[c]){let c=m(g);if(c){if(null===b&&(k=!0),!e){var d;if("session"!==c.type)return!1;let g=null!==b&&b===a.length+1;d=g?Buffer.concat([a,z]):void 0,e={id:c.id,cwd:"string"==typeof c.cwd?c.cwd:"",created:new Date(c.timestamp),parentSessionPath:"string"==typeof c.parentSession?c.parentSession:void 0,time:"string"==typeof c.timestamp?new Date(c.timestamp).getTime():NaN,head:"string"==typeof c.id&&"string"==typeof c.timestamp?d:void 0},f=g?b:0;continue}!function(a,b){if("session_info"===b.type&&(a.name="string"==typeof b.name&&b.name.trim()?b.name.trim():void 0),"message"!==b.type)return;a.messageCount++;let c=function(a){let b=a.message;if(!b||"string"!=typeof b.role||!("content"in b)||"user"!==b.role&&"assistant"!==b.role)return;if("number"==typeof b.timestamp)return b.timestamp;let c=new Date(a.timestamp).getTime();return Number.isNaN(c)?void 0:c}(b);if("number"==typeof c&&(a.lastActivityTime=Math.max(a.lastActivityTime??0,c)),a.firstMessage)return;let d=b.message;if(d&&"string"==typeof d.role&&"content"in d&&"user"===d.role){let b;b=d.content,a.firstMessage="string"==typeof b?b:Array.isArray(b)?b.filter(a=>!!a&&"object"==typeof a&&"text"===a.type&&"string"==typeof a.text).map(a=>a.text).join(" "):""}}(j,c)}}return!0},n=await q(a,h,i,l);if(!n||n.rest.length>0&&!l(n.rest,null)||!e)return null;let{id:o,cwd:s,created:t,parentSessionPath:u,time:v,head:w}=e,x="number"==typeof j.lastActivityTime&&j.lastActivityTime>0?new Date(j.lastActivityTime):Number.isNaN(v)?c.mtime:new Date(v);return{info:{path:a,id:o,cwd:s,name:j.name,parentSessionPath:u,created:t,modified:x,messageCount:j.messageCount,firstMessage:j.firstMessage||"(no messages)"},resume:w&&f>0&&!k&&c.ino>0?{ino:c.ino,offset:n.offset,headerEnd:f,check:p(w,n.sample),hasFirstMessage:""!==j.firstMessage,...void 0!==j.lastActivityTime?{lastActivityTime:j.lastActivityTime}:{}}:void 0}}catch{return null}}async function t(a){let b;try{b=(await (0,g.readdir)(a,{withFileTypes:!0})).filter(a=>a.isDirectory()||a.isSymbolicLink())}catch{return[]}let c=[];for(let d of b){let b=(0,h.join)(a,d.name);try{for(let a of(await (0,g.readdir)(b)))a.endsWith(".jsonl")&&c.push((0,h.join)(b,a))}catch{}}return c}async function u(a,b){let c=0,d=new Set;for(;c<a.length||d.size>0;){for(;c<a.length&&d.size<10;){let e=a[c++],f=b(e).finally(()=>d.delete(f));d.add(f)}d.size>0&&await Promise.race(d)}}function v(){return globalThis.__piWebScanIndex||(globalThis.__piWebScanIndex=new Map),globalThis.__piWebScanIndex}function w(a=(0,i.getAgentDir)()){return(0,h.join)(a,"pi-web-session-index.json")}function x(){let a=globalThis.__piWebScanIndexSave;if(a){clearTimeout(a.timer),globalThis.__piWebScanIndexSave=void 0;try{(0,j.$)(a.path,JSON.stringify({version:1,entries:Object.fromEntries(a.entries)}))}catch{}}}async function y(a={}){!function(){if(globalThis.__piWebScanIndexLoaded)return;globalThis.__piWebScanIndexLoaded=!0;let a=w();if((0,f.existsSync)(a))try{let b=JSON.parse((0,f.readFileSync)(a,"utf8"));if(!l(b)||1!==b.version||!l(b.entries))return;let c=v();for(let[a,d]of Object.entries(b.entries)){if(!l(d)||!l(d.fp)||!l(d.info))continue;let{fp:b,info:e}=d;if("number"!=typeof b.size||!Number.isSafeInteger(b.size)||b.size<0||"number"!=typeof b.mtimeMs||!Number.isFinite(b.mtimeMs)||e.path!==a||"string"!=typeof e.id||"string"!=typeof e.cwd||"string"!=typeof e.firstMessage||void 0!==e.name&&"string"!=typeof e.name||void 0!==e.parentSessionPath&&"string"!=typeof e.parentSessionPath||"number"!=typeof e.messageCount||!Number.isSafeInteger(e.messageCount)||e.messageCount<0||"string"!=typeof e.created||"string"!=typeof e.modified)continue;let f=new Date(e.created),g=new Date(e.modified);Number.isFinite(f.getTime())&&Number.isFinite(g.getTime())&&c.set(a,{fp:{size:b.size,mtimeMs:b.mtimeMs},info:{path:a,id:e.id,cwd:e.cwd,name:e.name,parentSessionPath:e.parentSessionPath,firstMessage:e.firstMessage,messageCount:e.messageCount,created:f,modified:g},resume:function(a){if(!l(a))return;let{ino:b,offset:c,headerEnd:d,check:e,hasFirstMessage:f,lastActivityTime:g}=a;if("number"==typeof b&&Number.isFinite(b)&&!(b<=0)&&"number"==typeof d&&Number.isSafeInteger(d)&&!(d<=0)&&"number"==typeof c&&Number.isSafeInteger(c)&&!(c<d)&&"string"==typeof e&&"boolean"==typeof f&&(void 0===g||"number"==typeof g&&Number.isFinite(g)))return{ino:b,offset:c,headerEnd:d,check:e,hasFirstMessage:f,...void 0!==g?{lastActivityTime:g}:{}}}(d.resume)})}}catch{}}();let b=a.deferDetails??!1,c=(0,i.getAgentDir)(),d=(0,h.join)(c,"sessions"),e=await t(d);globalThis.__piSessionMembership={files:new Set(e)};let j=v(),k=new Set(e),m=[];for(let a of j.keys())k.has(a)||m.push(a);for(let a of m)j.delete(a);let n=await Promise.all(e.map(async a=>{try{let b=await (0,g.stat)(a);return{filePath:a,fp:{size:b.size,mtimeMs:b.mtimeMs}}}catch{return{filePath:a,fp:null}}})),p=[],q=[],r=Array(e.length).fill(null),z=Array(e.length).fill(-1/0);for(let[a,{filePath:c,fp:d}]of n.entries()){if(!d){j.delete(c);continue}z[a]=d.mtimeMs;let e=j.get(c);if(e&&e.fp.size===d.size&&e.fp.mtimeMs===d.mtimeMs){r[a]=e.info;continue}if(b){p.push({filePath:c,fp:d,resultIndex:a});continue}q.push({filePath:c,fp:d,resultIndex:a,previous:e?.resume&&d.size>e.fp.size&&d.size>=e.resume.offset?e:void 0})}return await u(p,async({filePath:a,fp:b,resultIndex:c})=>{let d=await o(a,b);d?r[c]=d:j.delete(a)}),await u(q,async({filePath:a,fp:b,resultIndex:c,previous:d})=>{let e=await s(a,d);e?(j.set(a,{fp:b,...e}),r[c]=e.info):j.delete(a)}),(q.length>0||m.length>0)&&function(a){let b=[...v()],c=globalThis.__piWebScanIndexSave;if(c?.path===a){c.entries=b;return}x();let d=setTimeout(x,5e3);d.unref?.(),globalThis.__piWebScanIndexSave={path:a,entries:b,timer:d}}(w(c)),r.flatMap((a,b)=>a?[{info:a,mtimeMs:z[b]}]:[]).sort((a,b)=>b.info.modified.getTime()-a.info.modified.getTime()||b.mtimeMs-a.mtimeMs||(0,h.basename)(b.info.path).localeCompare((0,h.basename)(a.info.path))).map(({info:a})=>a)}d()}catch(a){d(a)}})},94523:(a,b,c)=>{"use strict";c.d(b,{Q:()=>d});let d={id:"en",label:"English",messages:{"common.ok":"OK","common.language":"Language","common.models":"Models","common.automations":"Tasks","common.skills":"Skills","common.agents":"Sub-agents","common.plugins":"Plugins","common.settings":"Settings","settings.title":"Settings","settings.general":"General","settings.generalDescription":"Choose how Pi Web looks and which language it uses.","settings.appearance":"Appearance","settings.appearanceDescription":"Select a theme or follow your system preference.","settings.chatContentWidth":"Chat content width","settings.chatContentFontSize":"Chat & terminal font size","settings.typography":"Fonts & layout","settings.uiFontFamily":"Interface font","settings.monoFontFamily":"Monospace font","settings.uiFontPlaceholder":"System default","settings.monoFontPlaceholder":"Default: Noto Sans Mono","settings.resetUiFont":"Reset interface font","settings.resetMonoFont":"Reset monospace font","settings.fontDescription":"Names of fonts installed on this device, comma-separated; leave blank for the default. The monospace font is used for code and the terminal. Saved in this browser only.","settings.uiFontWeight":"Interface font weight","settings.monoFontWeight":"Monospace font weight","settings.fontWeightThin":"Thin","settings.fontWeightExtraLight":"Extra Light","settings.fontWeightLight":"Light","settings.fontWeightRegular":"Regular","settings.fontWeightMedium":"Medium","settings.fontWeightSemiBold":"Semi Bold","settings.resetChatContentWidth":"Reset chat content width","settings.resetChatContentFontSize":"Reset chat & terminal font size","settings.chatContentWidthDescription":"Set the maximum width of messages and the composer.","settings.themeLight":"Light","settings.themeDark":"Dark","settings.themeMist":"Mist","settings.themeRose":"Rose","settings.themePine":"Pine","settings.themeSand":"Sand","settings.themeLilac":"Lilac","settings.themeSlate":"Slate","settings.themeDusk":"Dusk","settings.themeEmber":"Ember","settings.themeContrastLight":"High contrast light","settings.themeContrastDark":"High contrast dark","settings.themeZenburn":"Zenburn","settings.themeSystem":"System","settings.thinkingDisplay":"Thinking display","settings.thinkingDisplayDescription":"Choose whether model reasoning blocks are expanded when messages load.","settings.thinkingExpandedDefault":"Expand thinking blocks by default","settings.chat":"Chat","settings.enterSendMode":"Send key","settings.enterSendModeEnter":"Enter","settings.enterSendModeCtrlEnter":"Ctrl/Cmd+Enter","settings.quoteSelection":"Show actions for selected text","settings.sidebar":"Sidebar","settings.filesPlacement":"File browser","settings.filesPlacementBelow":"Below sessions","settings.filesPlacementTab":"Separate tab","settings.filesPlacementDescription":"Phones always use tabs.","settings.languageDescription":"Choose the language used throughout the interface.","settings.shellTool":"Shell tool","settings.shellToolDescription":"Choose which shell the model uses for commands. Direct ! and !! commands still use Bash.","settings.pushPermission":"Background push (iOS home-screen app)","settings.pushPermissionDescription":"After adding this site to your home screen (iOS 16.4+), a system notification is shown on the lock screen when a session finishes while no window is visible. If notifications stop arriving, re-register here. Registration needs a user gesture, so it is never triggered automatically.","settings.pushRegister":"Register push","settings.pushRegisterLoading":"Registering…","settings.pushRegistered":"✅ Push registered — background notifications are ready.","settings.pushRegisterFailed":"❌ Registration failed:","settings.usePowerShell":"Use PowerShell instead of Bash","settings.projectRequired":"Open a project to configure this section","settings.mcp":"MCP","settings.channels":"Channels","settings.automations":"Automations","automations.group":"Scheduled tasks","automations.noneYet":"No automations yet.","automations.newAction":"New automation","automations.nameLabel":"Name","automations.scheduleLabel":"Schedule","automations.kind.cron":"Cron","automations.kind.every":"Every","automations.kind.at":"Once","automations.cronExpr":"Cron expression (minute hour day month weekday)","automations.cronTz":"Timezone","automations.everyValue":"Interval","automations.everyUnit":"Unit","automations.atTime":"Run once at","automations.nextRun":"Next run","automations.neverAgain":"never again","automations.cwdLabel":"Working directory","automations.promptLabel":"Prompt","automations.notifyLabel":"Notify when a run finishes","automations.notifyBrowser":"Browser push","automations.notifyTelegramHint":"To push run results to Telegram, allowlist a chat in Settings › Channels.","automations.notifySilentLabel":"Silence when","automations.notifySilentHint":"Successful runs whose reply contains any of these keywords (comma separated) send no notification; failures still notify. Empty always notifies.","automations.enabledLabel":"Automation enabled","automations.disclosure":"Each run starts an agent session with full tool access in the working directory above and runs the prompt as written — exactly as if you had sent it yourself.","automations.create":"Create automation","automations.created":"Automation created.","automations.save":"Save","automations.saved":"Saved.","automations.delete":"Delete","automations.deleted":"Automation deleted.","automations.runNow":"Run now","automations.runStarted":"Run started — see the history below.","automations.historyTitle":"Recent runs","automations.noRuns":"No runs yet.","automations.run.running":"running","automations.run.done":"done","automations.run.failed":"failed","automations.run.skipped":"skipped","automations.openSession":"Session","automations.deletedAutomation":"(deleted)","automations.footerCount":"{count} automations","automations.actionFailed":"The action failed.","channels.group":"Chat channels","channels.badge.unconfigured":"Not set up","channels.badge.off":"Off","channels.badge.error":"Error","channels.badge.on":"Connected","channels.loadFailed":"Couldn’t load the channels settings: {error}","telegram.setupHint":"Create a bot with @BotFather (/newbot), then paste its token below. Its chats run as pi sessions; the token stays on this machine.","telegram.actionFailed":"The action failed.","telegram.botStatus":"Bot status","telegram.connected":"Connected as @{bot}","telegram.loopError":"Error: {error}","telegram.notConnected":"Not connected","telegram.tokenLabel":"Bot token","telegram.tokenPlaceholder":"Saved (…{hint}) — paste a new token to replace","telegram.tokenSave":"Save token","telegram.tokenRemove":"Remove","telegram.tokenSaved":"Token saved and verified.","telegram.tokenRemoved":"Token removed; the bot is disconnected.","telegram.enabledLabel":"Telegram channel enabled","telegram.chatsHeading":"Chats","telegram.chatsDescription":"Only allowlisted chats are answered. Message the bot once, then allow it below. In a chat: /new starts a fresh session, /status asks whether a turn is still running.","telegram.defaultCwdLabel":"Default working directory","telegram.defaultCwdPlaceholder":"Empty: the dated default (~/pi-cwd/…)","telegram.defaultCwdSave":"Save","telegram.defaultCwdSaved":"Default directory saved.","telegram.noChats":"No chats allowlisted yet.","telegram.chatCwdLabel":"Working directory","telegram.chatCwdSaved":"Working directory saved. /new starts a session there.","telegram.unnamedChat":"Unnamed chat","telegram.testSend":"Test","telegram.testSent":"Test message sent.","telegram.chatRemove":"Remove","telegram.chatRemoved":"Chat removed.","telegram.unknownChatPrompt":"A new chat messaged the bot: {title} ({id}). Allow it to answer?","telegram.allowChat":"Allow chat","telegram.chatAllowed":"Chat allowlisted.","auth.prompt":"Sign in to continue","auth.password":"Password","auth.logIn":"Log in","auth.loggingIn":"Logging in...","auth.invalidPassword":"Incorrect password","auth.loginFailed":"Could not log in. Try again.","auth.tooManyAttempts":"Too many failed attempts. Try again in {seconds}s.","auth.logOut":"Log out","auth.loggingOut":"Logging out...","auth.logoutFailed":"Could not log out. Try again.","skills.scope.global":"global","skills.scope.project":"project","skills.scope.path":"path","skills.groupSwitchOff":"Show every skill in {group} in the model prompt","skills.groupSwitchOn":"Hide every skill in {group} from the model prompt. They stay manually invocable.","skills.bulkFailed":"Could not change {count} of {total} skills:","skills.instructions":"Instructions","skills.noInstructions":"This skill has no instructions.","skills.documentBack":"Back","plugins.groupSwitchOff":"Enable every {group} package","plugins.groupSwitchOn":"Disable every {group} package. A package with resource filters stays on, since disabling it removes them; use its own switch.","plugins.bulkKeptFiltered":"{count} filtered package(s) stayed on: disabling one removes its resource filters, so use its own switch.","plugins.bulkEnabled":"Packages enabled.","plugins.bulkDisabled":"Packages disabled.","plugins.bulkFailed":"Could not change {count} of {total} packages:","plugins.status.loaded":"loaded","plugins.status.installed":"installed","plugins.status.missing":"missing","plugins.status.disabled":"disabled","plugins.diagnostic":"1 diagnostic","plugins.diagnostics":"{count} diagnostics","config.source":"Source","config.examples":"Examples","config.name":"Name","config.saveTo":"Save to","agents.close":"Close","agents.builtInTitle":"Enable Pi Web built-in sub-agents","agents.builtInDescription":"Provides Pi Web's integrated Agent tools and disables a conflicting pi-subagents extension.","agents.reloadRequired":"Reload the current session to apply this change.","agents.reloadSession":"Reload session","agents.maxConcurrent":"Concurrent sub-agents","agents.maxConcurrentDescription":"Maximum prompts running at once per parent session.","agents.reloading":"Reloading...","agents.loading":"Loading sub-agents...","agents.new":"New sub-agent","agents.empty":"Select or create a sub-agent profile","agents.name":"Sub-agent ID","agents.displayName":"Display name","agents.description":"Description","agents.prompt":"System instructions","agents.tools":"Tools","agents.resources":"Resources","agents.loadSkills":"Load skills","agents.loadExtensions":"Load extensions","agents.mcp":"Connect MCP servers","agents.codemode":"Code mode","agents.codemode.inherit":"Follow parent session","agents.codemode.on":"Enabled","agents.codemode.off":"Disabled","agents.codemodeHint":'"Follow parent session" matches the code mode the parent session is currently using. Tool permissions inside code mode still come from this profile\'s tool list. Changes apply to subagents started afterwards.',"agents.skillsOnly":"Loads only these skills: {skills}","agents.skillsNone":"Loads no skills: the skills list in the profile file is empty","agents.extensionsOnly":"Loads only these extensions: {extensions}","agents.extensionsNone":"Loads no extensions: the extensions list in the profile file is empty","agents.mcpHint":"Subagents connect the MCP servers in mcp.json. With read-only tools, only MCP tools their server marks read-only run. Changes apply to subagents started afterwards.","agents.mcpChatOnly":"MCP needs at least one tool, skills, or extensions: a chat-only subagent cannot use it.","agents.model":"Model override","agents.modelsLoading":"Loading models...","agents.modelUnavailable":"{model} (unavailable)","agents.thinking":"Thinking","agents.maxTurns":"Max turns","agents.inherit":"Parent default","agents.enable":"Enable sub-agent","agents.disable":"Disable sub-agent","agents.builtinPath":"Built-in profile","agents.inheritContext":"Inherit parent context","agents.background":"Run in background by default","agents.duplicate":"Duplicate","agents.copyName":"{name} copy","agents.delete":"Delete","agents.deleteConfirm":"Delete {name}?","agents.save":"Save","agents.saving":"Saving...","agents.scope.builtin":"built-in","agents.scope.global":"global","agents.scope.workspace":"workspace","agents.scope.project":"project","agents.overridden":"Overridden","subagent.openTab":"View sub-agent work in side panel","subagent.closeTab":"Close sub-agent side panel","subagent.enter":"Enter","subagent.enterTitle":"Open this sub-agent's conversation as the main chat","subagent.tabLabel":"Sub-agent {name}","subagent.refresh":"Refresh","subagent.viewer.starting":"Sub-agent session is starting…","subagent.viewer.empty":"No messages yet","subagent.viewer.error":"Failed to load sub-agent session","codemode.calls":"Tool calls","codemode.callCount":"{count} calls","codemode.callCountOne":"1 call","codemode.showEarlierCalls":"Show {count} earlier calls","codemode.omittedCalls":"{count} earlier calls not shown","codemode.modelCost":"Model calls: {cost}","codemode.status.running":"Running","codemode.status.ok":"Succeeded","codemode.status.error":"Failed","codemode.status.cancelled":"Cancelled","agentSwitcher.title":"Agents","agentSwitcher.titleRunning":"Agents: {count} running","agentSwitcher.main":"Main agent","agentSwitcher.subagent":"Sub-agent","agentSwitcher.current":"Current","agentSwitcher.count":"{count} sub-agents","agentSwitcher.runningCount":"{count} running","agentSwitcher.tokens":"{count} tokens","agentSwitcher.totalUsage":"Total","agentSwitcher.totalUsageHint":"Main agent and all sub-agents","agentSwitcher.search":"Search agents","agentSwitcher.noMatches":"No matching agents","agentSwitcher.status.starting":"Starting","agentSwitcher.status.running":"Running","agentSwitcher.status.completed":"Completed","agentSwitcher.status.failed":"Failed","agentSwitcher.status.aborted":"Aborted","agentSwitcher.status.interrupted":"Interrupted","appUpdate.releaseNotes":"Pi Web v{version} is available. View release notes","sidebar.hide":"Hide sidebar","sidebar.show":"Show sidebar","theme.light":"Theme: Light","theme.dark":"Theme: Dark","theme.mist":"Theme: Mist","theme.rose":"Theme: Rose","theme.pine":"Theme: Pine","theme.auto":"Theme: System","history.full":"Full history","history.unsaved":"Full history is available after the session is saved","history.label":"Full history","title.generating":"Generating...","title.updated":"Title updated","title.failed":"Generation failed","title.generate":"Generate title","title.unsaved":"Title generation is available after the session is saved","title.noMessages":"Send a message before naming this session","title.generateSession":"Generate a session title","system.prompt":"System prompt","system.empty":"System prompt is empty (tools are disabled)","system.load":"System prompt has not loaded yet","system.loading":"Loading system prompt…","system.label":"System","tools.label":"Tools","tools.title":"Tool definitions","tools.details":"Tool definition details","tools.load":"Tool definitions have not loaded yet","tools.loading":"Loading tool definitions…","tools.noTools":"No active tools","tools.description":"Description","tools.parameters":"Parameters","tools.parameterCount":"{count} parameters","tools.noParameters":"No parameters","tools.required":"Required","tools.optional":"Optional","tools.allowedValues":"Allowed","tools.defaultValue":"Default","tools.guidelines":"Prompt guidelines","session.info":"Session info","session.name":"Name","session.file":"Session File","session.inMemory":"In-memory","session.id":"ID","session.user":"User","session.assistant":"Assistant","session.toolCalls":"Tool Calls","session.toolResults":"Tool Results","session.total":"Total","session.input":"Input","session.output":"Output","session.cacheRead":"Cache Read","session.cacheWrite":"Cache Write","session.cost":"Cost","session.context":"Context","session.cacheHitRate":"Avg cache hit rate","session.copy":"Copy {value}","session.copied":"Copied","session.title":"Session info","session.load":"Send a message or run /session to load session info","session.infoSection":"Session Info","session.projectSection":"Project Info","session.messages":"Messages","session.tokens":"Tokens","session.totalActive":"Active Time","session.copyFile":"Copy file path","session.copyId":"Copy session ID","session.projectDir":"Project Dir","session.gitBranch":"Git Branch","session.gitWorktree":"Worktree","session.copyProjectDir":"Copy project directory","session.copyGitBranch":"Copy git branch","session.copyGitWorktree":"Copy worktree path","workspace.opening":"Opening workspace...","workspace.unable":"Unable to open workspace","workspace.selectSession":"Select a session from the sidebar","workspace.getStarted":"Get Started","workspace.selectProject":"Select a project directory from the sidebar","workspace.addModels":"Open Settings at the bottom, then choose Models","workspace.stepProject":"Select a project directory from the sidebar","workspace.stepModels":"Open Settings at the bottom, then choose Models","workspace.newSessionContext":"New session location","workspace.project":"Project","files.hidePanel":"Hide file panel","files.expandPanel":"Expand file panel","files.restorePanelWidth":"Restore file panel width","files.showPanel":"Show file panel","files.noneOpen":"No file open","layout.resizeSidebar":"Resize sidebar","layout.resizeFilePanel":"Resize file panel","layout.resizeHint":"Drag to resize. Double-click or press Enter to reset.","sidebar.new":"New","sidebar.newSessionTitle":"New session in {path}","sidebar.refresh":"Refresh","sidebar.selectProject":"Select project…","sidebar.filterProjects":"Filter projects…","sidebar.noMatchingProjects":"No matching projects","sidebar.useDefaultDirectory":"Use default directory","sidebar.customPath":"Custom path…","directoryPicker.selectDirectory":"Select directory","directoryPicker.goToParent":"Go to parent directory","directoryPicker.directoryPath":"Directory path","directoryPicker.goToDirectory":"Go to directory","directoryPicker.go":"Go","directoryPicker.loadingDirectories":"Loading directories…","directoryPicker.noSubdirectories":"No subdirectories","directoryPicker.openBeforeSelecting":"Open this path before selecting it","directoryPicker.selectCurrentDirectory":"Select current directory","directoryPicker.selectThisFolder":"Select this folder","directoryPicker.noDrives":"No drives found","directoryPicker.newDirectory":"New directory","directoryPicker.createDirectory":"Create directory","directoryPicker.directoryName":"Directory name","directoryPicker.directoryNamePlaceholder":"Enter a directory name","directoryPicker.create":"Create","directoryPicker.creating":"Creating…","sidebar.checking":"Checking…","sidebar.open":"Open","sidebar.cancel":"Cancel","sidebar.openRepoRoot":"Open repo root","sidebar.openRepoRootTitle":"Open the repository root to manage worktrees.","sidebar.worktrees":"Worktrees...","sidebar.checkingWorktrees":"Checking worktrees for this directory.","sidebar.filterWorktrees":"Filter worktrees…","sidebar.noMatchingWorktrees":"No matching worktrees","sidebar.switchWorktree":"Switch worktree","sidebar.main":"main","sidebar.forceRemoveCheckout":"Has changes or submodules. Force remove checkout?","sidebar.force":"Force","sidebar.createWorktreeTitle":"Create a worktree checkout for a branch","sidebar.newWorktree":"New worktree…","sidebar.branchName":"branch name","sidebar.creating":"Creating…","sidebar.create":"Create","sidebar.uploadFilesTitle":"Upload files to project root","sidebar.uploadFiles":"Upload files","sidebar.refreshExplorer":"Refresh file list","sidebar.showIgnoredFiles":"Show ignored files","sidebar.openInExplorer":"Open in Explorer","sidebar.openInFinder":"Open in Finder","sidebar.openInFileManager":"Open in file manager","sidebar.openInExplorerRemoteOnly":"Only available when Pi Web runs on this computer","sidebar.openInExplorerUnsupported":"Not supported on this platform","sidebar.searchFiles":"Search files","sidebar.searchFilesPlaceholder":"Search files…","sidebar.searchingFiles":"Searching…","sidebar.noMatchingFiles":"No matching files","sidebar.clearSearch":"Clear search","sidebar.searchSessions":"Search all conversations...","sidebar.toggleSessionSearch":"Search conversations","sidebar.sessionSearching":"Searching...","sidebar.sessionSearchEmpty":"No matching conversations","sidebar.sessionSearchCount":"{count} matching conversations","sidebar.sessionSearchPartial":"Search limit reached. Results may be incomplete.","sidebar.sessionSearchFailed":"Could not search conversations","sidebar.changedFiles":"{count} changed files","sidebar.loading":"Loading...","sidebar.noSessions":"No sessions found","sidebar.agentRunning":"Agent running…","sidebar.agentAwaitingInput":"Agent waiting for your input","sidebar.newActivity":"New activity","sidebar.newSessionActivity":"New session activity","sidebar.deleteSession":"Delete {title}?","sidebar.rename":"Rename","sidebar.delete":"Delete","sidebar.messagesCount":"{count} msgs","sidebar.worktreePath":"Worktree: {path}","sidebar.removeWorktreeTitle":"Remove worktree checkout {path}; the branch is kept","sidebar.removeWorktreeHeading":"Remove {name}","sidebar.brandLabel":"Pi Web, versions: web {app}, pi {pi}","sidebar.tabsLabel":"Sidebar view","sidebar.tabSessions":"Sessions","sidebar.tabFiles":"Files","sidebar.resizeFiles":"Resize file browser","sidebar.resizeFilesHint":"Drag to resize. Double-click or press Enter to reset.","sidebar.fileActions":"File actions","sidebar.collapseOtherGroups":"Collapse other projects","sidebar.expandAllGroups":"Expand all projects","sidebar.collapseAllGroups":"Collapse all projects","sidebar.pinned":"Pinned","sidebar.pinnedProject":"Pinned","sidebar.pin":"Pin","sidebar.unpin":"Unpin","sidebar.pinProject":"Pin project","sidebar.unpinProject":"Unpin project","sidebar.renameProject":"Rename…","sidebar.resetProjectName":"Reset name","sidebar.projectName":"Project name","sidebar.moveProjectUp":"Move up","sidebar.moveProjectDown":"Move down","sidebar.archive":"Archive","sidebar.unarchive":"Unarchive","sidebar.restore":"Restore","sidebar.archived":"Archived","sidebar.archivedCount":"Archived \xb7 {count}","sidebar.archivedToast":"Archived “{title}”","sidebar.archivedManyToast":"Archived {count} sessions","sidebar.restoredToast":"Restored “{title}”","sidebar.restoredManyToast":"Restored {count} sessions","sidebar.undo":"Undo","sidebar.viewArchive":"View","sidebar.dismiss":"Dismiss","sidebar.markRead":"Mark as read","sidebar.markUnread":"Mark as unread","sidebar.moreActions":"More actions","sidebar.sessionActions":"Session actions","sidebar.showMore":"Show more \xb7 {count}","sidebar.showLess":"Show less","sidebar.openOtherProject":"Open another project…","sidebar.newSessionInProject":"New session in {name}","sidebar.projectActions":"{name} actions","sidebar.archiveOlderThanWeek":"Archive sessions older than 7 days \xb7 {count}","sidebar.openInFilesTab":"Open in Files","sidebar.viewArchived":"View archived \xb7 {count}","sidebar.archiveActions":"Archive actions","sidebar.archivedProjectActions":"Archived sessions of {name}","sidebar.restoreAllArchived":"Restore all \xb7 {count}","sidebar.deleteAllArchived":"Delete all… \xb7 {count}","sidebar.deleteOldArchived":"Delete archived over 30 days ago… \xb7 {count}","sidebar.noLiveSessions":"No sessions yet","sidebar.noArchived":"No archived sessions","sidebar.backToSessions":"Back","sidebar.cannotArchiveRunning":"Running","sidebar.newWorktreeForSession":"New worktree for a new session","sidebar.projectAndWorktree":"Project and worktree","sidebar.uiStateFailed":"Couldn’t save: {error}","sidebar.sessionNotFound":"This session no longer exists","sidebar.fork":"Fork","sidebar.openInNewTab":"Open in new tab","sidebar.forkedToast":"Forked “{title}”","sidebar.forkNotFound":"This session no longer exists","sidebar.forkUnsaved":"This session hasn’t been saved yet. Send a message first.","sidebar.forkEmpty":"Nothing to fork: this branch has no messages yet","sidebar.forkUnavailable":"This session can’t be forked","sidebar.sessionShare":"Share…","sidebar.copySessionId":"Copy session ID","sidebar.sessionIdCopied":"Session ID copied","share.title":"Share this session","share.description":"Creates a public, read-only link of this session’s current branch: every message, reply and tool call input and output, including file paths, commands and terminal output. Images are embedded.","share.summary":"{count} messages","share.create":"Create share link","share.creating":"Creating…","share.linkLabel":"Share link","share.copy":"Copy","share.refresh":"Refresh content","share.stop":"Stop sharing","share.confirmStop":"Confirm: stop sharing","share.loadError":"Couldn’t load the share state: {error}","share.createError":"Couldn’t create the share: {error}","share.stopError":"Couldn’t stop sharing: {error}","share.tooLarge":"This session is too large to share (over 25 MB)","share.copiedToast":"Link copied","share.stoppedToast":"Sharing stopped","sharePage.created":"Shared {time}","sharePage.messageCount":"{count} messages","sharePage.footer":"Shared read-only from Pi Web \xb7 a snapshot as of share time","sidebar.forkFailed":"Couldn’t fork: {error}","sidebar.deleteProjectSessions":"Delete all sessions… \xb7 {count}","sidebar.deleteProjectSessionsHeading":"Delete all sessions in {name}","sidebar.deleteProjectSessionsMessage":"Pinned and archived sessions go too. This can’t be undone.","sidebar.deleteProjectSessionsRunning":"Sessions running now are kept ({count}).","sidebar.deleteArchivedInProjectHeading":"Delete archived sessions in {name}","sidebar.deleteAllArchivedHeading":"Delete all archived sessions","sidebar.deleteOldArchivedHeading":"Delete sessions archived over 30 days ago","sidebar.deleteArchivedMessage":"Their subagent sessions go too. This can’t be undone.","sidebar.deleteCount":"Delete {count}","sidebar.deletingSessions":"Deleting sessions…","sidebar.deletedOneToast":"Deleted 1 session","sidebar.deletedManyToast":"Deleted {count} sessions","sidebar.keptRunningToast":"kept {count} running","sidebar.deleteFailed":"Couldn’t delete: {error}","files.modified":"Modified","files.added":"Added","files.deleted":"Deleted","files.renamed":"Renamed","files.untracked":"Untracked","files.conflict":"Conflict","files.newlyUploaded":"Newly uploaded","files.containsChangedFiles":"Contains changed files","files.hiddenIgnored":"Ignored by Git","files.hiddenExcluded":"Hidden by default (generated or dependency folder)","files.insertPath":"Insert path into chat","files.mention":"mention","files.download":"Download file","files.outsideLink":"Links to {target}, outside this project","files.outsideLinkEncloses":"That folder contains this project or your home folder.","files.allowOutsideLink":"Allow browsing","files.allowOutsideLinkTitle":"Browse {target} until Pi Web restarts, the same as selecting it as a project directory","files.allowEnclosingLinkConfirm":"{target} contains this project or your home folder. Allowing it lets Pi Web browse everything below it until it restarts. Continue?","files.dismissError":"Dismiss error","files.addUploadedFile":"Add uploaded file to chat","files.addAllUploadedFiles":"Add all uploaded files to chat","files.dismissUploadResults":"Dismiss upload results","files.loading":"Loading files...","files.noFiles":"No files found","files.changedCount":"{count} files","files.changeStats":"{count} changed files, {additions} lines added, {deletions} lines deleted","files.conflictSummary":"{count} file{countSuffix} already exist: {files}","files.cannotReplace":"Cannot replace: {files}","files.replace":"Replace","files.skipExisting":"Skip existing","files.cancel":"Cancel","files.checking":"Checking files","files.uploading":"Uploading, {progress}%","files.dropToUpload":"Release to upload to {directory}","files.commit":"Commit","files.commitSelectedCount":"{count} selected","files.commitMessagePlaceholder":"Commit message…","files.commitPush":"Push after committing","files.committing":"Committing…","files.commitCancel":"Cancel","files.commitDone":"Committed {sha}","files.commitPushed":"pushed","files.commitPushNoUpstream":"push failed: this branch has no upstream","files.commitPushFailed":"push failed: {error}","files.commitNoFilesSelected":"No files selected","files.commitErrorEmptyMessage":"The commit message is empty","files.commitErrorNoRepository":"Not inside a Git repository","files.commitErrorOutside":"A selected path is outside the repository","files.commitErrorNothing":"Nothing to commit","files.commitErrorGeneric":"Commit failed","files.commitToggleFile":"Include in commit","files.commitDismiss":"Dismiss","chat.loadingSession":"Loading session...","chat.runningTool":"Running tool...","chat.generatingToolInput":"Generating parameters...","chat.truncatedByOutputLimit":"This response was cut off after reaching the model’s output limit. Send a follow-up to continue.","chat.truncatedWithoutAnswer":"The output limit was reached before an answer was produced: thinking or a nearly full context used it up. Sending another message will likely be cut off again. Compact the context first, or lower the thinking level.","chat.runningNamedTool":"Running {name}...","chat.runningTools":"Running {names}...","chat.runningToolsMore":"Running {names} (+{count})...","chat.waitingModel":"Waiting for model...","chat.runningCommand":"Running command...","chat.thinking":"Thinking...","chat.processDetails":"Process details","chat.message":"message","chat.messages":"messages","chat.toolCall":"tool call","chat.toolCalls":"tool calls","chat.turnDuration":"took {time}","chat.collapseProcess":"Collapse process details","chat.expandProcess":"Expand process details","transcriptNotice.costSuffix":" (~{cost})","transcriptNotice.cacheMiss":"Cache miss: {tokens} tokens re-billed{cost}","transcriptNotice.cacheMissIdle":"Cache miss after {minutes}m idle: {tokens} tokens re-billed{cost}","transcriptNotice.cacheMissModelSwitch":"Cache miss after model switch: {tokens} tokens re-billed{cost}","transcriptNotice.cacheWarmed":"Cache warmed{note}: {cost}","transcriptNotice.cacheWarmedNote":" ({note})","transcriptNotice.compactionCost":"Compaction: {tokens} tokens billed{cost}","transcriptNotice.branchSummaryCost":"Branch summary: {tokens} tokens billed{cost}","transcriptNotice.thinkingDroppedOne":"Anthropic dropped 1 thinking block (details in session)","transcriptNotice.thinkingDropped":"Anthropic dropped {count} thinking blocks (details in session)","transcriptNotice.foldCacheMiss":"cache miss {tokens} tokens{cost}","transcriptNotice.foldCacheMisses":"{count} cache misses {tokens} tokens{cost}","settings.cacheMissNotices":"Show cache and cost notices","settings.cacheMissNoticesDescription":"pi's showCacheMissNotices: cache misses, cache warming, compaction cost and Anthropic dropping thinking blocks, in the chat. Saved to the global settings.json; a project's .pi/settings.json can override it.","chat.filesWritten":"Files changed","chat.openWrittenFile":"Open {name}","chat.loadEarlier":"Scroll up to load earlier messages","chat.scrollToLatest":"Scroll to latest","chat.extensionRequest":"extension request","chat.extensionExpiresIn":"expires in {seconds}s","chat.extensionPending":"Awaiting response","chat.extensionCollapse":"Collapse","chat.extensionExpand":"Expand","chat.extensionMaximize":"Maximize","chat.extensionRestoreSize":"Restore size","chat.extensionMoreWaiting":"+{count} more","chat.cancel":"Cancel","chat.confirm":"Confirm","chat.submit":"Submit","chat.extensionInput":"Extension terminal input","chat.extensionPanel":"Extension panel","chat.extensionWidgets":"Extension widgets","chat.extensionWidgetAbove":"Above editor widget","chat.extensionWidgetBelow":"Below editor widget","chat.extensionWidgetLine":"{count} line","chat.extensionWidgetLines":"{count} lines","chat.close":"Close","chat.queued":"Queued \xb7 {count}","chat.recall":"Recall to input","chat.recallTitle":"Remove all queued messages and put them back into the input box for editing","chat.retrying":"Retrying ({attempt}/{max})…","chat.loadingCommands":"Loading commands...","chat.slashCommands":"Slash commands \xb7 {label}","chat.tabEnter":"Tab / Enter","chat.noCommands":"No extension, prompt, or skill commands found","chat.match":"1 match","chat.matches":"{count} matches","chat.command":"1 command","chat.commands":"{count} commands","chat.loadingFiles":"Loading files...","chat.files":"Files \xb7 {label}{hint}","chat.searching":"Searching…","chat.noMatchingFiles":"No matching files","chat.searchingAll":" \xb7 searching all files…","chat.indexTruncated":" \xb7 index truncated","chat.steerPlaceholder":"Steer now / queue follow-up...","chat.agentPlaceholder":"Agent is running…","chat.messagePlaceholder":"Message… Type / for commands, @ for files","chat.steer":"Steer","chat.followUp":"Follow-up","chat.steerHint":"Deliver after the current response and its tool calls finish (Stop interrupts them)","chat.followUpHint":"Queue this message after the agent finishes","chat.inputHistory":"Input history","chat.modelError":"Model error","chat.modelScopeWarning":"Model scope warning","chat.modelScopeWarnings":"Model scope warnings","chat.send":"Send","chat.askSelection":"Ask about selected text","chat.askInCurrent":"Ask here","chat.askInNewChat":"Ask in new chat","chat.newQuoteChat":"New chat about selected text","chat.quoteIntro":"About this passage:","chat.quoteQuestion":"My question:","chat.quoteForkFailed":"Unable to create a branch from this message.","chat.attachFiles":"Attach files","chat.previewImage":"Preview image","chat.filterModels":"Filter models…","chat.noMatchingModels":"No matching models","chat.saveDefaultModel":"Use and save as default for new chats","chat.defaultModel":"Default model for new chats","chat.saveDefaultThinking":"Use and save as default reasoning level","chat.defaultThinking":"Default reasoning level for new chats","chat.moreControls":"More controls","chat.collapseControls":"Collapse controls","chat.shell":"Shell","terminal.title":"Terminal","gitGraph.title":"Git graph","gitGraph.subtitle":"{count} commits \xb7 {lanes} lanes","gitGraph.subtitlePartial":"Latest {count} commits \xb7 {lanes} lanes","gitGraph.loading":"Loading…","gitGraph.loadingMore":"Loading more…","gitGraph.loadMore":"Load more commits","gitGraph.refresh":"Refresh git graph","gitGraph.columnDescription":"Description","gitGraph.columnDate":"Date","gitGraph.columnAuthor":"Author","gitGraph.columnCommit":"Commit","gitGraph.graphAriaLabel":"Git commit graph","gitGraph.emptyTitle":"No commits","gitGraph.emptyDescription":"This folder has no commit history yet.","gitGraph.errorLoad":"Git graph failed to load: {error}","gitGraph.detailSubject":"Subject","gitGraph.detailCommit":"Commit","gitGraph.detailAuthor":"Author","gitGraph.detailDate":"Date","gitGraph.detailParents":"Parents","gitGraph.tabLabel":"Git graph: {name}","sidebar.openGitGraph":"Open git graph","terminal.tabLabel":"Terminal: {name}","terminal.open":"Open workspace terminal","terminal.close":"Terminate terminal","terminal.restart":"Restart terminal","terminal.reconnect":"Reconnect terminal","terminal.lightTheme":"Switch terminal to light theme","terminal.darkTheme":"Switch terminal to dark theme","terminal.extraKeys":"Terminal keys","terminal.connecting":"Connecting","terminal.ready":"Connected","terminal.exited":"Terminal closed","terminal.error":"Connection error","terminal.exitCode":"Process exited with code {code}","chat.outputLocal":"output stays local","chat.outputModel":"output sent to model","chat.configuredTools":"From settings.json defaultTools","chat.chatOnly":"Chat only","chat.readOnlyTools":"{count} read-only built-in tools","chat.builtInTools":"{count} built-in tools","chat.allBuiltInTools":"All built-in tools","chat.changeReasoning":"Change reasoning level: {level}","chat.changeReasoningLabel":"Change reasoning level","chat.currentReasoning":"Reasoning level for this turn: {level}","chat.changeToolPreset":"Change tool preset","chat.stopCompaction":"Stop compaction","chat.compactContext":"Compact context","chat.compacting":"Compacting…","chat.compact":"Compact","chat.dismissCompactError":"Dismiss compaction error","chat.stopAgent":"Stop agent","chat.stop":"Stop","chat.disableSound":"Disable completion sound","chat.enableSound":"Enable completion sound","chat.thinkingUseDefault":"Use pi default","chat.thinkingOff":"Reasoning off","chat.thinkingMinimal":"Minimal reasoning","chat.thinkingLow":"Low reasoning","chat.thinkingMedium":"Medium reasoning","chat.thinkingHigh":"High reasoning","chat.thinkingXhigh":"Extra-high reasoning","chat.thinkingMax":"Max reasoning","chat.builtIn":"Built-in","chat.extensions":"Extensions","chat.prompts":"Prompts","chat.skills":"Skills","chat.dormant":"dormant","chat.commandCompact":"Compress context, optionally with instructions","chat.commandAutoCompact":"Toggle automatic context compaction in settings","chat.commandReload":"Reload extensions, skills, prompts, and tools","chat.commandName":"Set the session display name","chat.commandSession":"Show session message, token, and cost stats","chat.commandCopy":"Copy the last assistant message","chat.commandClone":"Clone the current branch into a new session","chat.compacted":"Compacted","chat.imageNotSupportedTitle":"Images may not be sent","chat.imageNotSupportedBody":"The selected model ({model}) does not support image input. The attached images will likely be ignored.","chat.dropNeedsCwd":"Choose a working directory before adding files.","chat.dropUploaded":"Copied {count} file(s) into the working directory","chat.dropAlreadyExists":"Already in the working directory and not replaced; the mention points to the existing file: {names}","chat.dropFoldersUnsupported":"Folders cannot be dropped here; drop the files inside instead: {names}","chat.dropFailed":"Upload failed: {message}","chat.tokensSaved":"{saved} saved","chatMinimap.earlierTurns":"Earlier turns not loaded: {count}. Click to load","chatMinimap.locateAssistant":"Locate assistant message","chatMinimap.toolCalls":"Tool calls this turn: {count}","chatMinimap.lockPreview":"Lock: don't open the preview on hover","chatMinimap.unlockPreview":"Unlock the hover preview","i18n.close":"Close","i18n.copy":"Copy","i18n.copied":"Copied","i18n.cancel":"Cancel","i18n.save":"Save","i18n.saving":"Saving…","i18n.saved":"Saved","i18n.remove":"Remove","i18n.removing":"Removing…","i18n.delete":"Delete","i18n.loading":"Loading...","i18n.loadMore":"Load more","i18n.search":"Search","i18n.refresh":"Refresh","providerUsage.usage":"Usage","providerUsage.notQueried":"Not queried","providerUsage.refresh":"Refresh usage","providerUsage.refreshing":"Refreshing usage","providerUsage.updated":"Updated {time}","providerUsage.queryFailed":"Usage query failed.","providerUsage.available":"Available","i18n.update":"Update","i18n.updating":"Updating...","i18n.check":"Check","i18n.checking":"Checking...","i18n.install":"Install","i18n.installing":"Installing...","i18n.noResults":"No results","i18n.searchProviders":"Search providers…","i18n.noProviders":"No providers match","i18n.newModel":"new model","i18n.addProvider":"Add provider","i18n.selectProviderModel":"Select a provider or model","i18n.visibleInPrompt":"Visible in model prompt — click to disable","i18n.hiddenFromPrompt":"Hidden from model prompt — click to enable","i18n.dormant":"Dormant","i18n.hiddenButInvocable":"Hidden from model, still manually invocable","i18n.skillSearchPlaceholder":"e.g. react, testing, deploy","i18n.searching":"Searching…","i18n.noSkills":"No skills found","i18n.checkUpdates":"Check updates","i18n.updates":"updates","i18n.noResolvedResources":"No resolved resources","i18n.enablePackage":"Enable package","i18n.disablePackage":"Disable package","i18n.filtered":"filtered","i18n.openSessionToReload":"Open a session to reload","i18n.notFound":"Not found","i18n.noPlugins":"No plugins configured","trust.resourcesNotLoaded":"Restricted mode","trust.trustProject":"Trust project","trust.trusting":"Trusting...","trust.cancel":"Cancel","trust.dialogTitle":"Trust this project?","trust.dialogBody":"Project resources can run local code. Trust only projects whose contents you know.","trust.skillsNotLoaded":"Project skills are not loaded because this project is not trusted.","trust.pluginsNotLoaded":"Project plugins are not loaded because this project is not trusted.","trust.projectScopeUnavailable":"Project installs are unavailable while project resources are not loaded.","trust.mcp.title":"MCP servers in .pi/mcp.json","trust.mcp.intro":"Trusting this project lets these servers connect, in Pi Web and in the pi CLI, which share this decision. A stdio server runs its command on the computer running Pi Web.","trust.mcp.loading":"Reading .pi/mcp.json…","trust.mcp.loadFailed":"Could not list this project's MCP servers.","trust.mcp.timedOut":"Listing this project's MCP servers took too long.","trust.mcp.none":"The file declares no servers.","trust.mcp.unchecked":"Pi Web cannot load the SDK's MCP checks, so these entries are listed unchecked.","trust.mcp.cwd":"Working directory: {path}","trust.close":"Close","trust.alreadyTrusted":"This project is already trusted.","trust.trustFailed":"Could not trust this project.","mcp.transport.stdio":"stdio","mcp.transport.http":"HTTP","mcp.field.env":"env {name}","mcp.field.header":"header {name}","mcp.field.oauthClientSecret":"oauth.clientSecret","mcp.server.invalid":"Pi refuses this entry, so it never connects:","mcp.server.webPassword":"References PI_WEB_PASSWORD. Pi Web refuses to connect it, but the pi CLI reads this file too and would send the password on if that variable is set where the CLI runs:","mcp.server.disabled":"Turned off in the file, so it does not connect.","mcp.server.commandFields":"Runs a shell command on every connection:","mcp.server.replacesGlobal":"Replaces your global server of the same name while this project is trusted.","mcp.server.overridesGlobal":"Changes only {keys} of your global server of the same name while this project is trusted.","mcp.server.overridesGlobalNothing":"Names your global server of the same name, but changes none of enabled, exposure and toolExposure.","mcp.server.masked":"Parts that look like secrets are hidden.","mcp.server.hiddenCharacters":"Holds invisible or control characters, shown here as \\u{…} codes.","mcp.server.sendsVariables":"Sends environment variables of the computer running Pi Web to this server on every connection:","mcp.server.passesVariables":"Passes environment variables of the computer running Pi Web to the command it starts:","mcp.server.variableIn":"{variable} in {field}","mcp.fileProblem.unparsable":"The file is not valid JSON, so none of its servers load.","mcp.fileProblem.invalid-shape":'The file is not an object with an "mcpServers" object, so none of its servers load.',"mcp.fileProblem.auto-enable-codemode-invalid":'"autoEnableCodemode" must be true or false; the servers still load.',"mcp.fileProblem.link-dangling":"The file is a symbolic link to nothing, so no servers load from it.","mcp.fileProblem.link-outside":"The file is a symbolic link outside the folders Pi Web may read, so its servers are not listed here. Pi still loads them once the project is trusted.","mcp.fileProblem.not-a-file":"The path is not a regular file, so Pi Web does not read it.","mcp.fileProblem.too-large":"The file is larger than 1 MiB, so its servers are not listed here. Pi still loads them once the project is trusted.","mcp.fileProblem.too-many-servers":"The file declares more than 200 servers, so they are not listed here. Pi still loads them once the project is trusted.","mcp.fileProblem.unreadable":"Pi Web cannot read the file.","mcp.reason.cwd-invalid":"The project folder is missing or not an absolute path.","mcp.reason.cwd-denied":"Pi Web may not read this folder.","mcp.reason.cwd-not-directory":"The project folder no longer exists or is not a folder.","mcp.reason.request-denied":"Pi Web refused the request because it did not come from this page.","mcp.reason.content-type":"Pi Web refused the request because it was not sent as JSON.","mcp.reason.trust-unreadable":"Pi Web cannot read the trust store (trust.json), or another program has it locked.","mcp.reason.trust-not-required":"This project has no resources that need trust anymore.","mcp.reason.session-busy":"Wait for the running session in this folder to finish, then trust the project.","mcp.reason.invalid-request":"Pi Web refused the request because it does not ask for a change Pi Web can make.","mcp.reason.mcp-off":"MCP is off on this Pi Web server, so it changes no server.","mcp.reason.project-untrusted":"This project is not trusted, so Pi Web does not change its .pi/mcp.json.","mcp.reason.unparsable":"The file is not valid JSON, so Pi Web left it unchanged.","mcp.reason.invalid-shape":'The file is not an object with an "mcpServers" object, so Pi Web left it unchanged.',"mcp.reason.server-missing":"The file no longer defines this server.","mcp.reason.entry-not-object":"This entry is not an object, so it cannot be turned on or off. Remove it, or fix it in the file.","mcp.reason.web-password":"It references PI_WEB_PASSWORD, so Pi Web does not turn it on.","mcp.reason.undo-unavailable":"The removal can no longer be undone.","mcp.reason.undo-name-taken":"The file defines a server of the same name again, so the removal was not undone.","mcp.reason.name-taken":"The file already defines a server of that name.","mcp.reason.link-dangling":"The file is a symbolic link to nothing, so Pi Web does not write it.","mcp.reason.link-outside":"The file is a symbolic link outside the folders Pi Web may read, so Pi Web does not write it.","mcp.reason.not-a-file":"The path is not a regular file, so Pi Web does not write it.","mcp.reason.too-large":"The file is larger than 1 MiB, so Pi Web does not write it.","mcp.reason.too-many-servers":"The file declares more than 200 servers, so Pi Web does not act on its entries.","mcp.reason.locked":"Another program is writing the file. Try again in a moment.","mcp.reason.server-invalid":"Pi refuses this entry, so Pi Web does not connect it.","mcp.reason.sign-in-not-oauth":"This server does not sign in with OAuth: only an HTTP server without an Authorization header does.","mcp.reason.sign-in-unknown":"Pi Web no longer knows this sign-in: it ended a while ago, or Pi Web restarted.","mcp.reason.sign-in-not-waiting":"The sign-in is not waiting for an address right now.","mcp.reason.redirect-invalid":"That is not a web address. Copy the whole address from the browser's address bar.","mcp.reason.redirect-state-mismatch":"That address belongs to another sign-in. Paste the address the browser landed on after this one.","mcp.reason.redirect-no-code":"That address holds no authorization code. Paste the address the browser landed on after you approved access.","mcp.reason.redirect-denied":"The authorization server did not grant access. Open the sign-in page again, or cancel.","mcp.reason.import-failed":"No server could be read from the paste.","mcp.reason.fields-incomplete":"Some values to fill in are missing or not valid.","mcp.reason.name-invalid":"A server name uses letters, digits, _ and - only.","mcp.reason.secret-global-only":"The server holds a secret as plain text, so it is saved only in the global mcp.json.","mcp.reason.host-env-confirm":"The server would be sent variables of the computer running Pi Web; confirm that first.","mcp.reason.folder-not-fresh":"The folder changed since: it has a trust decision now, or resources that need one, so Pi Web did not trust it and added nothing.","mcp.reason.trust-too-broad":"Trusting this folder would trust the folders inside it too, so Pi Web does not do it by itself.","mcp.loadFailed":"Could not read the MCP settings.","mcp.loadTimedOut":"Pi Web did not answer in time. Press Refresh to try again.","mcp.projectNotListed":"This project's servers are not listed: {reason}","mcp.serverCount":"{enabled} of {total} servers turned on","mcp.group.empty":"No servers","mcp.group.fileProblem":"Not listed: see the file problem below","mcp.group.notListed":"Not listed","mcp.rowLabel":"{name}: {state}","mcp.state.on":"On","mcp.state.disabled":"Turned off in the file","mcp.state.invalid":"Refused by Pi","mcp.state.web-password":"Refused: references PI_WEB_PASSWORD","mcp.state.not-trusted":"Project not trusted","mcp.state.replaced":"Replaced by the project's server","mcp.state.overridden":"Changed by the project's override","mcp.state.mcp-off":"MCP is off","mcp.stateShort.invalid":"refused","mcp.stateShort.web-password":"refused","mcp.stateShort.disabled":"off","mcp.stateShort.not-trusted":"untrusted","mcp.stateShort.replaced":"replaced","mcp.stateShort.overridden":"overridden","mcp.server.shadowedByProject":"The project's server of the same name replaces this one while the project is trusted.","mcp.server.overriddenByProject":"The project's .pi/mcp.json changes this server while the project is trusted.","mcp.server.unchecked":"Listed unchecked: Pi Web cannot load the SDK's MCP checks.","mcp.detail.description":"Description","mcp.detail.transport":"Transport","mcp.detail.command":"Command","mcp.detail.url":"URL","mcp.detail.cwd":"Working directory","mcp.detail.env":"Environment","mcp.detail.headers":"Headers","mcp.detail.valuesHidden":"Values are not shown here.","mcp.detail.shellCommands":"Shell commands","mcp.detail.variables":"Host variables","mcp.detail.signIn":"Sign-in","mcp.detail.exposure":"Tools","mcp.detail.file":"File","mcp.detail.inProject":"This project","mcp.inProject.saved":"Only for this project; saved in its .pi/mcp.json.","mcp.inProject.overridden":"This project's .pi/mcp.json changes its {keys}.","mcp.inProject.refused":"This project's .pi/mcp.json overrides it, but pi refuses the override.","mcp.inProject.turnOff":"Turn off in this project","mcp.inProject.turnOn":"Turn on in this project","mcp.inProject.show":"Show","mcp.signIn.signedIn":"Signed in.","mcp.signIn.notSignedIn":"Not signed in.","mcp.signIn.registrationOnly":"Not signed in, but a client registration or an unfinished sign-in is stored for this server.","mcp.signIn.unknown":"Unknown: mcp-auth.json cannot be read.","mcp.signIn.header":"Authorization header","mcp.signIn.provider":"Sends the token of the pi provider {provider}: sign in to it under Settings › Models.","mcp.exposure.codemode":"Only the server's name and summary are listed; Code mode scripts search for its tools.","mcp.exposure.deferred":"Declared once tool search loads them; needs no Code mode.","mcp.exposure.direct":"Every tool's full declaration goes with every request: the most tokens.","mcp.exposure.hidden":"Registered but unreachable.","mcp.exposure.sandboxUnavailable":"Code mode cannot run on this Pi Web server, so these tools are reached through tool search instead.","mcp.exposure.builtinDisabled":"-builtin:codemode turns Code mode off, so these tools can be called only while tool search is active.","mcp.exposure.autoEnableOff":"autoEnableCodemode is false in {path}, so sessions do not turn Code mode on for these tools: they can be called only while Code mode is Always on or tool search is active.","mcp.exposure.label":"How {name}'s tools reach the model","mcp.exposure.optionDefault":"{label} (default)","mcp.exposure.toolOverrides":"Rules in toolExposure ({count}) keep their own exposure.","mcp.exposure.toolSearchDisabled":"-builtin:tool-search in {path} turns tool search off, so these tools can be called only from Code mode scripts while Code mode is on.","mcp.exposure.toolSearchDisabledUnknown":"-builtin:tool-search turns tool search off, so these tools can be called only from Code mode scripts while Code mode is on.","mcp.empty":"No MCP servers yet. Servers in {globalPath} and in a project's .pi/mcp.json appear here.","mcp.emptyFileProblem":"No servers could be listed: see the file problems below.","mcp.selectItem":"Select a server or Code mode.","mcp.unavailable.operator-disabled":"MCP is off: PI_WEB_DISABLE_MCP is set where Pi Web runs. The servers are listed, but no session connects them.","mcp.unavailable.internals-unavailable":"MCP is off: Pi Web cannot load the SDK's MCP modules. The servers are listed unchecked, and no session connects them.","mcp.unavailable.builtin-disabled":"MCP is off: the extensions setting in {path} turns off builtin:mcp, so no session connects these servers.","mcp.unavailable.builtin-disabled-unknown":"MCP is off: an extensions setting turns off builtin:mcp, so no session connects these servers.","mcp.trust.untrusted":"This project is not trusted, so the servers in its .pi/mcp.json do not connect.","mcp.trust.untrustedThrough":"This project is not trusted ({path} is marked untrusted), so the servers in its .pi/mcp.json do not connect.","mcp.trust.trustedThrough":"Trusted through {path}: the servers in this project's .pi/mcp.json connect, as in every folder under it.","mcp.trust.unreadable":"Pi Web cannot read the trust store (trust.json), so this project's servers count as untrusted for now.","mcp.trust.trustButton":"Trust project…","mcp.footer.fileProblem":"1 file problem","mcp.footer.fileProblems":"{count} file problems","mcp.codemode.title":"Code mode","mcp.codemode.rowLabel":"Code mode: {state}","mcp.codemode.intro":"The model calls tools from a short script; MCP tools use it by default. Changes apply to sessions started afterwards.","mcp.codemode.automatic":"Automatic","mcp.codemode.always":"Always on","mcp.codemode.unavailable":"Unavailable","mcp.codemode.mode":"Mode","mcp.codemode.automaticDescription":"Turns on when an MCP server that uses code mode connects.","mcp.codemode.alwaysDescription":"Sessions start with Code mode on.","mcp.codemode.preferenceError":"Cannot read the global settings file:","mcp.codemode.sandbox":"Sandbox","mcp.codemode.sandbox.available":"Available.","mcp.codemode.sandbox.unavailable":"Cannot run on this Pi Web server, so no session offers Code mode:","mcp.codemode.sandbox.not-checked":"Not checked yet: the self-test runs when the first session starts after Pi Web does.","mcp.codemode.builtin":"Extension","mcp.codemode.builtinDisabled":"Turned off by -builtin:codemode in {path}.","mcp.codemode.builtinDisabledUnknown":"Turned off by -builtin:codemode in an extensions setting.","mcp.codemode.builtinDisabledProject":"Turned off for this project's sessions by -builtin:codemode in {path}. Always on still applies to sessions in other folders.","mcp.codemode.autoEnableOff":"autoEnableCodemode is false in {path}, so Automatic never turns Code mode on, and the tools of servers with code mode exposure can be called only while tool search is active.","mcp.codemode.saveFailed":"Could not save the choice:","mcp.codemode.saveTimedOut":"Pi Web did not answer in time, so the choice may not have been saved.","mcp.codemode.alwaysUnavailable.sandbox":"Always on is unavailable: Code mode's sandbox cannot run on this Pi Web server.","mcp.codemode.alwaysUnavailable.builtin":"Always on is unavailable: -builtin:codemode in {path} turns Code mode off.","mcp.codemode.projectOverride.always":"This project decides for itself: defaultTools in {path} starts its sessions with Code mode on, whichever you choose here.","mcp.codemode.projectOverride.automatic":"This project decides for itself: defaultTools in {path} starts its sessions without Code mode, as Automatic does, whichever you choose here.","mcp.codemode.toolMode":"Built-in tools","mcp.codemode.toolMode.on":"Direct","mcp.codemode.toolMode.only":"In scripts","mcp.codemode.toolMode.onDescription":"The model calls read, bash and the other tools directly.","mcp.codemode.toolMode.onlyDescription":"While Code mode is on, the model calls read, bash and the other tools only from scripts.","mcp.codemode.toolMode.automaticNote":"Under Automatic, this waits until Code mode turns on.","mcp.codemode.toolMode.invalid":'codemode.mode in {path} is {value}, which pi reads as "on". Choosing either option replaces it.',"mcp.codemode.toolMode.projectOverride.on":"This project decides for itself: codemode in {path} keeps these tools declared in its sessions, whatever you choose here.","mcp.codemode.toolMode.projectOverride.only":"This project decides for itself: codemode.mode in {path} has its sessions call these tools from scripts only, whatever you choose here.","mcp.codemode.toolMode.saveFailed":"Could not save the setting:","mcp.codemode.inlineBudget":"Tool list budget","mcp.codemode.inlineBudget.unit":"tokens","mcp.codemode.inlineBudget.save":"Save","mcp.codemode.inlineBudget.description":"Tokens the code mode description may spend listing tools; scripts find the rest with searchTools(). Leave empty for pi's default, {default}.","mcp.codemode.inlineBudget.invalidDraft":"Enter a whole number from 0 to {max}, or leave it empty.","mcp.codemode.inlineBudget.invalid":"codemode.inlineBudget in {path} is {value}, which pi ignores, so sessions use {default}. Saving replaces it.","mcp.codemode.inlineBudget.projectOverride":"This project decides for itself: codemode.inlineBudget in {path} gives its sessions {value}, whatever you save here.","mcp.codemode.inlineBudget.projectOverrideDefault":"This project decides for itself: codemode in {path} leaves its sessions pi's default, {default}, whatever you save here.","mcp.codemode.inlineBudget.saveFailed":"Could not save the budget:","mcp.readOnly.mcp-off":"Servers cannot be changed here while MCP is off.","mcp.readOnly.project-untrusted":"Pi Web does not change them until the project is trusted.","mcp.readOnly.trust-unreadable":"Pi Web does not change them until it can read the trust store.","mcp.write.savedWhileOff":"Changes are saved to the file, but no session connects these servers while builtin:mcp is off.","mcp.server.switchOn":"Turn {name} on","mcp.server.switchOff":"Turn {name} off","mcp.groupSwitchOn":"Turn off every {group} server","mcp.groupSwitchOff":"Turn on every {group} server","mcp.groupKeptOff":"{count} server(s) that reference PI_WEB_PASSWORD stayed off.","mcp.bulkFailed":"Could not change {count} of {total} servers:","mcp.actionFailed":"Could not change the server:","mcp.actionTimedOut":"Pi Web did not answer in time, so the change may not have been made.","mcp.removed":"Removed {name} from {path}.","mcp.undo":"Undo","mcp.undoing":"Undoing…","mcp.undoFailed":"Could not undo:","mcp.state.connected":"Connected when tested","mcp.state.needs-auth":"Needs sign-in","mcp.state.failed":"Did not connect when tested","mcp.stateShort.needs-auth":"sign-in","mcp.stateShort.failed":"failed","mcp.exposureShort.codemode":"Code mode","mcp.exposureShort.deferred":"tool search","mcp.exposureShort.direct":"direct","mcp.exposureShort.hidden":"hidden","mcp.test.button":"Test connection","mcp.test.testing":"Testing…","mcp.test.never":"Not tested yet.","mcp.test.serial":"It runs a shell command, so its test waits for other such tests.","mcp.test.blocked.mcp-off":"MCP is off on this Pi Web server, so it tests no server.","mcp.test.blocked.project-untrusted":"This project is not trusted, so Pi Web does not start its servers.","mcp.test.blocked.trust-unreadable":"Pi Web cannot read the trust store (trust.json), so it does not start this project's servers.","mcp.test.blocked.invalid":"Pi refuses this entry, so there is nothing to test.","mcp.test.blocked.web-password":"It references PI_WEB_PASSWORD, so Pi Web does not connect it.","mcp.test.refused.entry-not-object":"This entry is not an object, so there is nothing to test. Fix it in the file.","mcp.test.refused.invalid-request":"Pi Web refused the request because it does not name a server it can test.","mcp.test.refused.unparsable":"The file is not valid JSON, so Pi Web cannot read this entry to test it.","mcp.test.refused.invalid-shape":'The file is not an object with an "mcpServers" object, so Pi Web cannot read this entry to test it.',"mcp.test.refused.link-dangling":"The file is a symbolic link to nothing, so Pi Web cannot read this entry to test it.","mcp.test.refused.link-outside":"The file is a symbolic link outside the folders Pi Web may read, so Pi Web does not test its servers.","mcp.test.refused.not-a-file":"The path is not a regular file, so Pi Web does not read it to test this entry.","mcp.test.refused.too-large":"The file is larger than 1 MiB, so Pi Web does not read it to test this entry.","mcp.test.refused.too-many-servers":"The file declares more than 200 servers, so Pi Web does not read it to test this entry.","mcp.test.state.connected":"Connected","mcp.test.state.needs-auth":"Needs sign-in","mcp.test.state.failed":"Did not connect","mcp.test.state.timedOut":"No answer","mcp.test.summary.connected":"{count} tool(s) listed in {seconds} s, tested at {time}.","mcp.test.summary.needs-auth":"The server asked for an OAuth sign-in. Tested at {time}.","mcp.test.summary.failed":"Gave up after {seconds} s, tested at {time}.","mcp.test.summary.timedOut":"It did not answer within {seconds} s, so Pi Web stopped the test. Tested at {time}.","mcp.test.error":"Error:","mcp.test.stderr":"The last lines it wrote to stderr:","mcp.test.serverInfo":"Server: {name} {version}","mcp.test.resources":"Offers resources.","mcp.test.ranIn":"Ran in {path}.","mcp.test.queued":"Waited {seconds} s for another test of a server that runs a shell command.","mcp.test.readOnly":"read-only","mcp.test.moreTools":"{count} more not shown.","mcp.test.queueTimedOut":"Another test of a server that runs a shell command did not finish in time, so this one did not start. Try again.","mcp.test.requestFailed":"Could not test the server:","mcp.test.requestTimedOut":"Pi Web did not answer in time. The test may still finish; press Refresh to see its result.","mcp.state.connecting":"Connecting in a session","mcp.state.disconnected":"Connection dropped in a session","mcp.state.conflict":"Name taken by another extension","mcp.state.session.connected":"Connected in a session","mcp.state.session.failed":"Did not connect in a session","mcp.stateShort.connecting":"connecting","mcp.stateShort.disconnected":"dropped","mcp.stateShort.conflict":"conflict","mcp.stateDetail.disconnected":"That session connects it again at the next call to one of its tools.","mcp.stateDetail.conflict":"Rename the entry in its file, or turn the other extension off.","mcp.session.state.connecting":"Connecting","mcp.session.state.connected":"Connected","mcp.session.state.needs-auth":"Needs sign-in","mcp.session.state.failed":"Did not connect","mcp.session.state.disconnected":"Dropped","mcp.session.state.conflict":"Name taken","mcp.session.state.not-trusted":"Not read","mcp.session.state.closed":"Closed","mcp.session.summary.connecting":"A session in {path} started connecting it at {time}.","mcp.session.summary.connected":"A session in {path} connected it at {time}.","mcp.session.summary.needs-auth":"The server asked a session in {path} for an OAuth sign-in at {time}.","mcp.session.summary.failed":"A session in {path} could not connect it at {time}.","mcp.session.summary.disconnected":"The connection of a session in {path} dropped at {time}.","mcp.session.summary.conflict":"A session in {path} found the name taken at {time}, so it did not connect this entry.","mcp.session.summary.not-trusted":"A session in {path} did not read it at {time}, because no decision trusted the project then.","mcp.session.summary.closed":"A session in {path} connected it at {time} and closed it at {closedTime}.","mcp.session.conflictOwner":"Registered first by:","mcp.hostInactive":"A session in {path} connects none of these servers through Pi Web: its /mcp command comes from {owner}, not from Pi's built-in MCP extension. That extension may read mcp.json and connect them its own way.","mcp.signIn.button":"Sign in","mcp.signIn.starting":"Starting…","mcp.signIn.cancel":"Cancel sign-in","mcp.signIn.cancelling":"Cancelling…","mcp.signIn.cancelFailed":"Could not cancel the sign-in:","mcp.signIn.cancelTimedOut":"Pi Web did not answer in time. The sign-in may still be under way; this line shows it once it moves on.","mcp.signIn.signOut":"Sign out","mcp.signIn.signingOut":"Signing out…","mcp.signIn.replaces":"Signing in may replace what is stored for this server.","mcp.signIn.signOutExplain":"Sign out deletes what is stored for this server; open sessions lose access at their next request.","mcp.signIn.shared":"The other {name} entry, with the same URL, started this sign-in: the tokens serve both.","mcp.signIn.shared.done":"Signed in through the other {name} entry, which has the same URL, so the tokens serve this entry too. Press Test connection to see what this entry's server offers.","mcp.signIn.shared.already":"The other {name} entry, which has the same URL, was already signed in, so the tokens serve this entry too. Press Test connection to see what this entry's server offers.","mcp.signIn.shared.connect-failed":"The sign-in through the other {name} entry, which has the same URL, found nothing to sign in to: that entry's server did not connect, and did not ask for a sign-in. Its Status row says why.","mcp.signIn.phase.connecting":"Checking whether the server asks for a sign-in…","mcp.signIn.phase.starting":"Preparing the sign-in with the server's authorization server…","mcp.signIn.phase.finishing":"Finishing the sign-in…","mcp.signIn.phase.noCancel":"The authorization server has answered, so this step can no longer be cancelled.","mcp.signIn.authorize.message":"Open the sign-in page and approve access. When the browser comes back to the computer running Pi Web, the sign-in finishes by itself. If the browser runs on another device, or the page it lands on does not load, copy that page's address and paste it here.","mcp.signIn.authorize.link":"Sign-in page:","mcp.signIn.authorize.notALink":"The server's sign-in page is not a web address, so it is shown as text only:","mcp.signIn.authorize.redirect":"After you approve, the browser is sent to {url}, which only the computer running Pi Web can open.","mcp.signIn.authorize.wait":"Pi Web waits up to 5 minutes from the start of the sign-in.","mcp.signIn.paste.label":"Address the browser landed on","mcp.signIn.paste.placeholder":"http://127.0.0.1:…/callback?code=…","mcp.signIn.paste.submit":"Continue","mcp.signIn.paste.checking":"Checking…","mcp.signIn.paste.refused":"That address does not finish this sign-in:","mcp.signIn.paste.timedOut":"Pi Web did not answer in time. If it took the address, this line shows the sign-in moving on.","mcp.signIn.done.already":"Already signed in: the server connected without a new sign-in.","mcp.signIn.done.signedIn":"Signed in. Status above shows what the server offers.","mcp.signIn.done.refreshed":"Signed in again with the stored refresh token, without the browser. Status above shows what the server offers.","mcp.signIn.done.failedAfter":"Signed in, but the server did not connect afterwards. Status above says why.","mcp.signIn.done.needsAuthAfter":"Signed in, but the server still asked for a sign-in when Pi Web connected again.","mcp.signIn.done.notConnected":"Signed in. Press Test connection to see what the server offers.","mcp.signIn.cancelled":"Sign-in cancelled.","mcp.signIn.expired":"The sign-in was not finished within 5 minutes, so Pi Web stopped waiting.","mcp.signIn.failed.connect-failed":"The server did not connect, and did not ask for a sign-in, so there was nothing to sign in to. Status above says why.","mcp.signIn.failed.queue-timed-out":"Another test of a server that runs a shell command did not finish in time, so the sign-in did not start. Try again.","mcp.signIn.failed.sign-in-failed":"The sign-in failed.","mcp.signIn.failed.internal":"The sign-in failed unexpectedly.","mcp.signIn.gone":"Pi Web no longer knows this sign-in: it ended a while ago, or Pi Web restarted. Press Sign in to start again.","mcp.signIn.requestFailed":"Could not sign in:","mcp.signIn.requestTimedOut":"Pi Web did not answer in time. Press Sign in again to see the sign-in under way.","mcp.signIn.signOutFailed":"Could not sign out:","mcp.signIn.signedOutDone":"Signed out: the tokens stored for this server were deleted.","mcp.signIn.signedOutNothing":"Nothing was stored for this server, so there was nothing to sign out of.","mcp.signIn.blocked.mcp-off":"MCP is off on this Pi Web server, so it signs in to no server.","mcp.signIn.blocked.project-untrusted":"This project is not trusted, so Pi Web does not sign in to or out of its servers.","mcp.signIn.blocked.trust-unreadable":"Pi Web cannot read the trust store (trust.json), so it does not sign in to or out of this project's servers.","mcp.signIn.blocked.invalid":"Pi refuses this entry, so there is nothing to sign in to.","mcp.signIn.refused.file":"Pi Web cannot read this entry from its file anymore. Press Refresh.","mcp.signIn.refused.invalid-request":"Pi Web refused the request because it does not name a server it can sign in to.","mcp.signIn.summary.connected":"Signed in, then {count} tool(s) listed in {seconds} s, at {time}.","mcp.signIn.summary.needs-auth":"Signed in, but the server still asked for a sign-in at {time}.","mcp.signIn.summary.failed":"Signed in, but connecting gave up after {seconds} s, at {time}.","mcp.signIn.summary.timedOut":"Signed in, but the server did not answer within {seconds} s, at {time}.","mcp.add.action":"Add MCP","mcp.add.title":"Add MCP","mcp.add.inputLabel":"Server to add","mcp.add.placeholder":'https://mcp.example.com/mcp\nnpx -y @scope/server\nclaude mcp add …\n{ "mcpServers": { … } }',"mcp.add.examples":"Supported formats (click one to fill in an example)","mcp.add.rawPi":"Enable pi mcp syntax ($NAME, !command)","mcp.add.rawPiOn":"In env and header values, $NAME reads a variable on the computer running Pi Web, and a value starting with ! runs as a command at every connection.","mcp.add.serverLabel":"Server","mcp.add.serverCount":"This paste holds {count} servers; add them one at a time.","mcp.add.preview":"Preview","mcp.add.readAs":"Read as","mcp.add.previewUnfilled":"Values still to fill in show what the paste holds there.","mcp.add.fields":"Values to fill in","mcp.add.field.optional":"Optional: left blank, the value it belongs to is left out.","mcp.add.field.optionalHeader":"Optional: left blank, the {name} header is not sent.","mcp.add.field.slot":"your value","mcp.add.field.storedAs":"Stored as {value}.","mcp.add.field.storedAsVariable":"Stored as {value}: pi reads the variable each time it connects, and the value stays out of mcp.json.","mcp.add.field.useVariable":"Read it from a variable of the computer running Pi Web","mcp.add.field.variableName":"Variable for {field}","mcp.add.field.variableHint":"Stored as ${…}: pi reads the variable each time it connects, and the value stays out of mcp.json.","mcp.add.field.choose":"Choose…","mcp.add.secrets":"Secrets in the paste","mcp.add.secret.holds":"holds a secret as plain text.","mcp.add.secret.storedAs":"Stored as {value}: pi reads the variable each time it connects, and the secret stays out of mcp.json.","mcp.add.secret.asPasted":"Saved in mcp.json as pasted, so the server can be saved only in the global file.","mcp.add.nameInvalid":"A server name uses letters, digits, _ and - only.","mcp.add.nameTaken":"{path} already has a server named {name}.","mcp.add.useName":"Use {name}","mcp.add.button":"Add","mcp.add.buttonTrust":"Add and trust this folder","mcp.add.adding":"Adding…","mcp.add.trustExplain":"This folder has no trust decision yet, and writing .pi/mcp.json makes it need one, so Add trusts {path} in the same step. The pi CLI shares this decision, and every folder inside it is trusted too.","mcp.add.afterAdd":"Adding tests the connection once.","mcp.add.failed":"Not added:","mcp.add.trustKept":"Pi Web trusted {folder} for this step and could not take that back, so the folder stays trusted.","mcp.add.hostEnv.body":"Its headers or OAuth client secret read {names}, which are set on the computer running Pi Web, and pi sends their values to the server at every connection. Add it only if this server should have them.","mcp.add.hostEnv.confirm":"Add and send these values","mcp.add.blocked.nothing":"Nothing to add yet: the paste holds no server pi can use.","mcp.add.blocked.fields":"Fill in {fields} first.","mcp.add.blocked.fieldsInvalid":"Correct {fields} first.","mcp.add.blocked.web-password":"It references PI_WEB_PASSWORD, so Pi Web does not add it.","mcp.add.refused.server-invalid":"pi refuses it as filled in: {error}","mcp.add.projectBlocked.no-project":"Open a project to add a server to its .pi/mcp.json.","mcp.add.projectBlocked.project-not-listed":"The project folder is not listed, so its .pi/mcp.json is not written.","mcp.add.projectBlocked.trust-unreadable":"Pi Web cannot read the trust store (trust.json), so it does not write this project's .pi/mcp.json.","mcp.add.projectBlocked.project-untrusted":"This project is not trusted, so Pi Web does not write its .pi/mcp.json. Trust it first.","mcp.add.projectBlocked.untrusted-decision":"This folder is marked as not trusted, so a server in its .pi/mcp.json would never connect.","mcp.add.projectBlocked.secret":"{fields} holds a secret as plain text, so this server can be saved only globally. To save it in the project, choose “Read it from a variable of the computer running Pi Web” for it.","mcp.add.projectBlocked.secretFixed":"{fields} holds a secret as plain text where pi reads no variable (the URL, the command or its arguments), so this server can be saved only globally.","mcp.add.projectBlocked.folder-not-fresh":"Something under this folder's .pi, or an .agents/skills folder above it, is a link to nothing. It would need trust once its target appears, so Pi Web does not trust the folder by itself. Remove or fix the link, then press Refresh.","mcp.add.projectBlocked.file-problem":"{path} cannot be written: {reason}","mcp.add.projectBlocked.trust-too-broad.home":"This is your home folder. Pi Web does not trust it by itself, since every folder in it would be trusted too; add the server globally.","mcp.add.projectBlocked.trust-too-broad.root":"This is a filesystem root. Pi Web does not trust it by itself, since every folder on it would be trusted too; add the server globally.","mcp.add.projectBlocked.trust-too-broad.contains-home":"This folder holds your home folder ({path}). Pi Web does not trust it by itself, since every folder in it would be trusted too; add the server globally.","mcp.add.projectBlocked.trust-too-broad.contains-agent-dir":"This folder holds Pi's agent folder ({path}). Pi Web does not trust it by itself, since every folder in it would be trusted too; add the server globally.","mcp.add.projectBlocked.trust-too-broad.contains-folder":"This folder holds {path}, another folder Pi Web knows, which trusting it would trust too. Pi Web does not do that by itself; add the server globally.","mcp.add.projectBlocked.trust-too-broad.contains-project":"This folder holds {path}, a project with resources that need trust and no decision of its own, which trusting this folder would trust too. Pi Web does not do that by itself; add the server globally, or open that project and trust it on its own.","mcp.add.projectBlocked.trust-too-broad.too-many-folders":"This folder holds too many folders for Pi Web to check that trusting it would trust no project inside them. Pi Web does not trust it by itself; add the server globally.","mcp.add.added":"Added {name} to {path}.","mcp.add.addedTrusted":"Added {name} to {path}, and trusted {folder}.","mcp.add.addedTrustedHere":"Added {name} to {path}, and trusted this folder.","mcp.add.testing":"Testing its connection…","mcp.add.needsSignIn":"It asks for a sign-in.","mcp.add.source.url":"a URL","mcp.add.source.command-line":"a command line","mcp.add.source.pi-mcp-add":"pi mcp add","mcp.add.source.claude-mcp-add":"claude mcp add","mcp.add.source.claude-mcp-add-json":"claude mcp add-json","mcp.add.source.codex-mcp-add":"codex mcp add","mcp.add.source.gemini-mcp-add":"gemini mcp add","mcp.add.source.vscode-add-mcp":"code --add-mcp","mcp.add.source.mcp-servers-json":"an mcpServers config (Claude, Cursor, Gemini…)","mcp.add.source.vscode-json":"a VS Code mcp.json","mcp.add.source.zed-json":"Zed settings","mcp.add.source.opencode-json":"an opencode config","mcp.add.source.server-object":"one server's JSON","mcp.add.source.server-map":"servers by name (JSON)","mcp.add.source.registry-server-json":"an MCP registry server.json","mcp.add.source.cursor-install-link":"a Cursor install link","mcp.add.source.vscode-install-link":"a VS Code install link","mcp.add.source.visual-studio-install-link":"a Visual Studio install link","mcp.add.source.copilot-app-install-link":"a GitHub Copilot app link","mcp.importNote.forServer":"{server}: {note}","mcp.importNote.empty-input":"Nothing to read yet: paste a URL, a command line or a config.","mcp.importNote.unrecognized-input":"Pi Web does not recognize this. Paste a server's URL, the command that starts it, an mcp add command, a JSON config or an install link.","mcp.importNote.invalid-json":"This looks like JSON but does not parse: {detail}","mcp.importNote.no-servers-found":"No MCP server was found in this config.","mcp.importNote.shell-operator":"The command line uses the shell operator {operator}. Paste only the command that starts the server.","mcp.importNote.shell-command-substitution":"The command line uses {syntax}, which only a shell runs. Write the value out instead.","mcp.importNote.shell-multiple-commands":"This holds more than one command. Paste only the one that starts the server.","mcp.importNote.shell-unterminated-quote":"A {quote} quote is never closed.","mcp.importNote.shell-parameter":"The command line uses the shell parameter {parameter}, which Pi Web cannot fill in.","mcp.importNote.shell-expansion":"The command line uses {expansion}, which only a shell expands. Write the value out instead.","mcp.importNote.unsupported-url-scheme":"A {scheme}: address is not a server: pi connects to http and https URLs.","mcp.importNote.github-repo-link":"This is the GitHub repository {repository}, not a server. Copy the install command, URL or config from its README.","mcp.importNote.github-mcp-page":"This is the github.com/mcp page of {name}. Its Install buttons open other apps and cannot be pasted here; copy the Cursor or VS Code install badge from the server's README instead.","mcp.importNote.github-page":"This GitHub page is not a server. Copy the install command, URL or config from the server's README.","mcp.importNote.by-name-link":"This link only names {name} in a registry and holds no settings, so Pi Web cannot add it yet. Copy the Cursor or VS Code install badge from the server's README instead.","mcp.importNote.badge-image":"This is a badge's image. Copy the link the badge opens instead.","mcp.importNote.install-link-invalid":"This install link cannot be read ({detail}).","mcp.importNote.claude-desktop-import":"claude mcp add-from-claude-desktop copies Claude Desktop's own servers. Paste the mcpServers part of claude_desktop_config.json instead.","mcp.importNote.cli-unsupported":"Pi Web does not read {cli}'s mcp add. Paste the server's own command line, URL or JSON config instead.","mcp.importNote.cli-usage":"This {cli} mcp add command is incomplete: it needs a name, and a URL or a command.","mcp.importNote.cli-unknown-option":"{cli} has no option {option}.","mcp.importNote.cli-option-needs-value":"The {cli} option {option} needs a value.","mcp.importNote.cli-option-wrong-transport":"The {cli} option {option} does not apply to {transport} servers.","mcp.importNote.cli-invalid-pair":"The {cli} option {option} cannot read {value}.","mcp.importNote.cli-not-a-server":"{cli} {command} manages {cli} itself; it is not a server. Paste the command that starts the server, or {cli} mcp add …","mcp.importNote.pi-help":"pi mcp add --help prints help and adds nothing.","mcp.importNote.field-required":"Fill in {field}.","mcp.importNote.field-invalid-option":"Pick one of the offered values for {field}.","mcp.importNote.field-reference-invalid.name":"{field}: a variable name has letters, digits and _, and does not start with a digit.","mcp.importNote.field-reference-invalid.target":"{field} cannot come from a variable: pi reads variables only in env values, headers and the OAuth client secret.","mcp.importNote.field-reference-invalid.missing":"{field}: enter the name of the variable to read it from.","mcp.importNote.sse-transport":"It uses the legacy SSE transport, which pi does not support.","mcp.importNote.sse-transport.suggested":"It uses the legacy SSE transport, which pi does not support. Try its streamable HTTP address instead: {suggestedUrl}","mcp.importNote.websocket-transport":"It connects over a WebSocket, which pi does not support.","mcp.importNote.unsupported-transport":"Its transport {type} is not one pi supports (stdio or streamable HTTP).","mcp.importNote.ambiguous-command-and-url":"It has both a command and a URL, so which to use is unclear.","mcp.importNote.no-command-or-url":"It has neither a command to start nor a URL to connect to.","mcp.importNote.zed-extension-server":"It comes from a Zed extension, which only Zed can start.","mcp.importNote.registry-packages-unsupported":"It is published only as packages to install, while pi needs a command or a URL. Paste its install command instead.","mcp.importNote.invalid-config":"pi would refuse it: {problem}","mcp.importNote.dropped-key":"{key} has no pi equivalent and was left out.","mcp.importNote.variable-unsupported-here":"{field} reads the variable {name}, which pi does not fill in there, so its value is asked for below.","mcp.importNote.variable-fallback-dropped":"{field}: pi has no default for a variable, so the fallback {fallback} of {name} was left out.","mcp.importNote.bare-dollar-literal":"{field} holds ${name} as text: this client does not read it as a variable, and pi will not either.","mcp.importNote.header-env-reference":"The header {header} sends the value of {names} from the computer running Pi Web to this server.","mcp.importNote.client-secret-env-reference":"The OAuth client secret is read from {names} on the computer running Pi Web and sent to the authorization server.","mcp.importNote.shell-command-value":"{field} runs a shell command on the computer running Pi Web at every connection.","mcp.importNote.shell-variable":"{field}: ${name} would be filled in by your shell. pi reads it from the environment of the computer running Pi Web, or its value is asked for below.","mcp.importNote.unsupported-variable":"{field} uses {variable}, which pi cannot fill in, so its value is asked for below.","mcp.importNote.input-undefined":"The config asks for the input {id} but does not define it, so its value is asked for below.","mcp.importNote.input-command-unsupported":"The input {id} runs a VS Code command, which Pi Web cannot, so its value is asked for below.","mcp.importNote.timeout-clamped":"The timeout of {from} seconds was cut to {to} seconds.","mcp.importNote.timeout-dropped":"The timeout {value} is not a number of seconds and was left out.","mcp.importNote.timeout-unit-guessed.milliseconds":"The timeout {value} was read as milliseconds; check it.","mcp.importNote.timeout-unit-guessed.seconds":"The timeout {value} was read as seconds; check it.","mcp.importNote.env-null-dropped":"{name} is set to null to unset it, which pi cannot do, so it was left out.","mcp.importNote.oauth-option-dropped":"The OAuth option {key} has no pi equivalent and was left out.","mcp.importNote.oauth-disable-unsupported":"The config turns OAuth off, which pi cannot: pi signs in with OAuth whenever the server asks.","mcp.importNote.callback-url-dropped":"The OAuth callback address {value} is not a loopback address pi can listen on, so it was left out.","mcp.importNote.callback-port-dropped":"The OAuth callback port {value} is not a port number, so it was left out.","mcp.importNote.invalid-exposure-dropped":"The exposure {value} is not one pi knows, so it was left out.","mcp.importNote.tool-filter-imported.include":"Only these tools are offered, the others hidden: {tools}.","mcp.importNote.tool-filter-imported.exclude":"These tools are hidden: {tools}.","mcp.importNote.transport-guessed":"The config names no transport, so Pi Web read it from the keys present.","mcp.importNote.insecure-http":"{host} is reached over plain http, so everything sent, tokens included, travels unencrypted.","mcp.importNote.literal-secret":"{field} holds a secret as plain text, so the server can be saved only in the global mcp.json.","mcp.importNote.cli-option-ignored":"The {cli} option {option} has no pi equivalent and was ignored.","mcp.importNote.cli-option-as-arg":"{option} comes after the server's command, so it is passed to the server as an argument, as {cli} does.","mcp.importNote.cli-extra-arguments":"{cli} adds an HTTP server by its URL alone, so the extra arguments {arguments} were left out.","mcp.importNote.mcp-remote-bridge":"This runs mcp-remote to reach {url}. pi can connect to that URL itself: paste the URL to add it without the bridge.","mcp.importNote.looks-like-pi-config":"This looks like pi's own mcp.json. If you copied it from there, turn on “Enable pi mcp syntax ($NAME, !command)”.","mcp.importNote.workspace-folder-relative":"{field}: {from} became the session's folder (.), where pi starts the server.","mcp.importNote.home-variable-translated":"{field}: {from} became {to}, which pi reads from the environment.","mcp.importNote.name-taken":"The file already has a server named {name}. Pick another name, such as {suggestedName}.","mcp.importNote.escaped-value":"{field}: $ and a leading ! were escaped, so pi reads the value as written and runs nothing.","mcp.importNote.variable-translated":"{field}: {from} became {to}, the way pi reads that variable.","mcp.importNote.home-translated":"{field}: {from} became ~, the home folder.","mcp.importNote.timeout-converted":"The timeout of {from} ms became {to} seconds.","mcp.importNote.env-value-stringified":"{name} was not text, so it was turned into text.","mcp.importNote.empty-authorization-dropped":"An empty Authorization header was left out, so pi signs in with OAuth if the server asks.","mcp.importNote.imported-disabled":"The config has it turned off, so it is added switched off.","mcp.importNote.name-derived":"Named {name} after its address or command.","mcp.importNote.name-sanitized":"{original} became {name}: pi server names use letters, digits, _ and -.","mcp.importNote.name-deduplicated":"{original} is already in use, so it is named {name}.","mcp.importNote.command-split":"{command} was split into a command and its arguments.","mcp.importNote.transport-assumed-http":"No transport is given, so it is read as a streamable HTTP server.","mcp.importNote.scheme-assumed":"Read as {url}.","mcp.importNote.client-secret-prompt":"The OAuth client secret is asked for below.","mcp.importNote.userinfo-moved-to-header":"The user name and password in the URL moved into an Authorization header: pi does not send them in the URL.","mcp.importProblem.name":"{name} is not a server name pi accepts (letters, digits, _ and -).","mcp.importProblem.not-an-object":"it is not an object.","mcp.importProblem.exposure":"the exposure {value} is not one pi knows.","mcp.importProblem.tool-exposure":"toolExposure must map tool names to exposures.","mcp.importProblem.tool-exposure.tool":"the toolExposure of {tool} is not an exposure pi knows.","mcp.importProblem.enabled":"enabled must be true or false.","mcp.importProblem.description":"description must be text.","mcp.importProblem.timeout":"the timeout {value} is not a positive number of seconds.","mcp.importProblem.sse":"the legacy SSE transport is not supported.","mcp.importProblem.url":"{url} is not an http or https URL.","mcp.importProblem.headers":"headers must map names to text.","mcp.importProblem.auth":"auth.provider must name a pi provider.","mcp.importProblem.auth-url":"auth sends a provider's token, so the URL must be https (or http on localhost).","mcp.importProblem.oauth":"oauth must be an object.","mcp.importProblem.oauth-client-id":"oauth.clientId must be text.","mcp.importProblem.oauth-client-secret":"oauth.clientSecret must be text.","mcp.importProblem.callback-port":"the OAuth callback port {value} is not a port number.","mcp.importProblem.callback-url":"the OAuth callback address {value} is not a loopback http address.","mcp.importProblem.callback-port-mismatch":"the OAuth callback address uses port {value}, not the callback port.","mcp.importProblem.oauth-scope":"oauth.scope must be text.","mcp.importProblem.oauth-client-name":"oauth.clientName must be non-empty text.","mcp.importProblem.oauth-client-registration":'oauth.clientRegistration {value} must be "dcr" or "cimd".',"mcp.importProblem.oauth-client-registration-client":'oauth.clientRegistration "cimd" cannot go with oauth.clientId or oauth.clientName.',"mcp.importProblem.oauth-client-registration-callback":'oauth.clientRegistration "cimd" needs oauth.callbackUrl on localhost or 127.0.0.1 with the path /callback.',"mcp.importProblem.auth-server-metadata-url":"oauth.authServerMetadataUrl {value} must be an https address (or http on localhost).","mcp.importProblem.args":"args must be a list of text.","mcp.importProblem.args.index":"args[{index}] is not text.","mcp.importProblem.env":"env must map names to text.","mcp.importProblem.cwd":"cwd must be text.","mcp.importProblem.no-command-or-url":"it needs a command (stdio) or a URL (streamable HTTP).","mcp.importField.reason.empty":"The paste leaves this empty.","mcp.importField.reason.input":"The config asks for this when it is installed.","mcp.importField.reason.variable":"The paste reads a variable here that pi does not fill in.","mcp.importField.reason.home":"The paste reads the home folder here in a way pi does not fill in.","mcp.importField.reason.workspace-basename":"The paste uses the workspace folder's name here, which pi does not know.","mcp.importField.reason.unsupported-variable":"The paste uses a variable here that pi cannot fill in.","mcp.importField.reason.client-secret":"The command asks for the OAuth client secret.","mcp.importField.reason.registry-header":"The registry entry asks for this header.","mcp.importField.reason.registry-variable":"The registry entry asks for this part of the address.","i18n.creatingSession":"Creating new session…","i18n.creating":"Creating…","i18n.subscription":"Subscription","i18n.subscriptions":"Subscriptions","i18n.customEndpoint":"Custom endpoint format","i18n.noChanges":"No changes","i18n.branches":"Branches","i18n.noActiveSession":"No active session","i18n.noBranches":"This session has no branches","i18n.branchesLockedWhileRunning":"Branches can't be switched while the session is running","i18n.source":"Source","i18n.preview":"Preview","i18n.diff":"Diff","i18n.downloadFile":"Download file","i18n.liveSync":"Live sync active","i18n.notWatching":"Not watching","i18n.fileViewMode":"File view mode","i18n.compareHead":"Compare working tree with HEAD","i18n.mentionSelectedLines":"Mention selected lines","i18n.disableWrap":"Disable word wrap","i18n.enableWrap":"Enable word wrap","i18n.htmlPreview":"HTML preview","i18n.previewFile":"Preview {file}","i18n.invalidMermaid":"Invalid Mermaid diagram","i18n.renderingMermaid":"Rendering Mermaid diagram","i18n.previewAfterStreaming":"Preview available after streaming","i18n.showMermaidSource":"Show Mermaid source","i18n.previewMermaid":"Preview Mermaid diagram","i18n.openMermaidViewer":"Open diagram viewer","i18n.mermaidViewer":"Mermaid diagram viewer","i18n.mermaidDiagram":"Mermaid diagram","i18n.zoomOut":"Zoom out","i18n.zoomIn":"Zoom in","i18n.fitToWidth":"Fit to width","models.discoveryFetching":"Importing models…","models.discoveryFetch":"Import models…","models.discoveryFilterPlaceholder":"Filter {count} models…","models.discoveryFilter":"Filter upstream models","models.discoverySelectShown":"Select shown","models.discoveryNoMatches":"No matching models.","models.configUnreadable":"Could not read models.json, so saving is disabled to avoid overwriting it. Fix the file, then reopen this panel. {error}","models.providerNameTaken":'Another provider is already named "{name}". Choose a different name.',"models.apiKeyPlaceholder":"ENV_VAR_NAME, !shell-command, or literal key","models.discoveryAdded":"added","models.discoveryShowing":"Showing first {shown} of {total}","models.discoveryFetched":"{count} models fetched","models.discoveryAddSelected":"Add selected","models.discoveryAddSelectedCount":"Add selected ({count})","models.catalogSource":"source: models.dev ↗","models.catalogFilling":"Filling details…","models.catalogFill":"Fill model details","models.catalogFilled":"{count} fields filled","models.catalogNoEmptyFields":"No empty fields to fill","models.catalogNoExactMatch":"No exact models.dev match","models.catalogPriceProvider":"Price matched Provider {provider}","models.catalogPriceBaseUrl":"Price matched Base URL to {provider}","models.catalogPriceConsensus":"Price agreed by {support}/{total} records","models.catalogPriceUnreliable":"No reliable price found","models.catalogUndo":"Undo","models.capabilities":"Capabilities","models.reasoning":"Reasoning / thinking","models.imageInput":"Image input","models.modelSpecs":"Model specifications","models.contextWindow":"Context window (tokens)","models.contextForModel":"Context window for {model}","models.contextInvalid":"Context window of {model}: enter a positive whole number of tokens.","models.contextOverrideHelp":"Context window in tokens; blank uses the default.","models.applyHelp":"Open sessions: select the model again to apply.","models.maxOutputTokens":"Max output tokens","models.costPerMillion":"Cost per million tokens","models.costInput":"Input","models.costOutput":"Output","models.costCacheRead":"Cache read","models.costCacheWrite":"Cache write","models.notProvided":"Not provided","models.editCosts":"Edit prices","models.finishEditingCosts":"Done","models.costAllRequired":"Enter a valid non-negative price; blank fields are saved as 0.","models.advancedSettings":"Advanced settings","models.providerDefaults":"Using provider defaults","models.headersSummary":"Headers: {count}","models.compatSummary":"Compatibility: {count}","models.thinkingSummary":"Thinking levels: {count}","models.apiOverride":"API override","models.baseUrlOverride":"Base URL override","models.headers":"Headers","models.headersHelp":"Overrides provider headers of the same name.","models.compatibility":"Compatibility","models.deepSeekThinkingCompat":"DeepSeek thinking compatibility","models.developerRole":"Use the developer role for the system prompt","models.adaptiveThinking":"Claude adaptive thinking (effort levels)","models.thinkingLevelMap":"Thinking level map","models.clearAll":"Clear all","models.enabledSection":"Available models","models.enabledCount":"{enabled}/{total} enabled","models.enableAll":"Enable all","models.disableAll":"Disable all","models.enableShown":"Enable shown","models.disableShown":"Disable shown","models.enabledFilter":"Filter available models","models.enabledFilterPlaceholder":"Filter {count} models…","models.enabledNoMatches":"No matching models.","models.enabledToggle":"Show {model} in the model selector","models.enabledProviderToggle":"Enable all {provider} models","models.enabledPinHint":"Thinking level pinned by enabledModels. Edit settings.json to change it.","models.enabledLastModel":"At least one model has to stay enabled.","models.enabledProjectScope":"This project's .pi/settings.json sets enabledModels and overrides the global value, so these switches are read-only. Edit that file to change the list.","models.enabledUnavailable":"Sign in to this provider to choose its models.","models.refreshCatalog":"Refresh catalog","models.refreshingCatalog":"Refreshing…","models.refreshCatalogHint":"Fetch the model list this provider publishes now. pi's built-in list is fixed at the pi version pi-web ships with, so a newly released model only shows up after a refresh.","models.catalogUpdated":"Model list updated from the provider.","models.catalogUnchanged":"Already up to date.","models.catalogUnreachable":"Could not reach the catalog. Check the connection and the provider credential, then try again.","models.catalogOffline":"PI_OFFLINE is set, so pi-web does not fetch catalogs.","models.enabledCustomEmpty":"No models available from this provider yet. Save your changes, and check that the API key works.","models.enabledStale":"{count} unmatched","models.enabledStaleHint":"A model is available when its provider has a usable credential. An entry matches nothing when that credential is missing, when the model was renamed or deleted, or when the entry was written for another machine.","models.enabledPrune":"Remove unmatched entries","models.enabledPruneHint":"Delete the configured entries that match no available model. Everything else stays as it is.","models.enabledClear":"Enable all models","models.enabledClearHint":"Remove the model filter for every provider.","i18n.testingModel":"Testing model connection...","i18n.connected":"Connected","i18n.failed":"Failed","i18n.test":"Test","i18n.testConnection":"Test model connection","i18n.provider":"Provider","i18n.model":"Model","i18n.providerName":"Provider name","i18n.rename":"Rename","i18n.default":"Default","i18n.disabled":"Disabled","i18n.noResources":"No resources","i18n.unknown":"Unknown","i18n.installedVersion":"installed {version}","i18n.configuredVersion":"configured {version}","i18n.extensions":"Extensions","i18n.prompts":"Prompts","i18n.themes":"Themes","i18n.resourceCount":"{count} {label}","i18n.extensionShort":"ext","i18n.skillShort":"skills","i18n.promptShort":"prompts","i18n.themeShort":"themes","i18n.custom":"Custom","i18n.clearAll":"clear all","i18n.connectedSuccessfully":"Connected successfully.","i18n.notConnected":"not connected","i18n.configured":"configured","i18n.notConfigured":"not configured","i18n.openingBrowser":"Opening browser…","i18n.submit":"Submit","i18n.login":"Login","i18n.relogin":"Re-login","i18n.disconnect":"Disconnect","i18n.networkError":"Network error","i18n.continuing":"Continuing…","i18n.skills":"Skills","i18n.plugins":"Plugins","i18n.addSkill":"Add skill","i18n.addPlugin":"Add plugin","i18n.selectSkill":"Select a skill","i18n.selectPackage":"Select a package","i18n.updateAvailable":"Update available","i18n.upToDate":"Up to date","i18n.automaticChecksUnavailable":"Automatic checks unavailable","i18n.checkFailed":"Check failed","i18n.installed":"Installed","i18n.status":"Status","i18n.version":"Version","i18n.description":"Description","i18n.package":"Package","i18n.resources":"Resources","i18n.installedPath":"Installed path","i18n.cwd":"CWD","i18n.resolvedResources":"Resolved Resources","i18n.reloadSession":"Reload session","i18n.reloading":"Reloading...","i18n.packageRemoved":"Package removed.","i18n.packageInstalled":"Package installed.","i18n.packageUpdated":"Package updated.","i18n.packagesUpdated":"Packages updated.","i18n.updateAllPlugins":"Update all","i18n.updateAllPluginsHint":"Updates all configured plugins","i18n.packageDisabled":"Package disabled.","i18n.packageEnabled":"Package enabled.","i18n.sessionReloaded":"Session reloaded.","i18n.thinking":"Thinking","i18n.largeMessageReveal":"Message content is very large ({size}). Click to view as plain text — markdown rendering is disabled to keep the page responsive.","i18n.loadingThinking":"Loading thinking...","i18n.copyMessage":"Copy message","i18n.editFromHere":"Edit from here","i18n.editFromHereTitle":"Edit from here — branches within this session","i18n.newSession":"New session","i18n.newSessionTitle":"New session — creates an independent copy from here","i18n.estimatedTokens":"Estimated token count while streaming","i18n.noOutput":"(no output)","i18n.noSummary":"(no summary)","i18n.conversationCompacted":"Conversation compacted","i18n.compactedFromTokens":"Compacted from {tokens} tokens","i18n.compactionDescription":"The conversation history before this point was compacted into the following summary:","i18n.fileContext":"File context: {details}","i18n.readFiles":"Read files","i18n.modifiedFiles":"Modified files","i18n.noMessage":"(no message)","i18n.collapse":"Collapse","i18n.expand":"Expand","i18n.hideDetails":"Hide details","i18n.showDetails":"Show details","i18n.thinkingUnavailable":"Thinking content unavailable","i18n.before":"Before","i18n.after":"After","diff.unchangedLine":"1 unchanged line","diff.unchangedLines":"{count} unchanged lines","i18n.sessionComplete":"Session complete","i18n.taskFinished":"Task finished.","i18n.attentionNeeded":"Pi needs your attention","i18n.extensionInputNeeded":"An extension is waiting for your input."}}},94807:(a,b,c)=>{"use strict";let d=c(84762),{toPromise:e,toSync:f,toSyncOptions:g}=c(43946);async function h(a,b){let c=await e(d.lock)(a,b);return e(c)}a.exports=h,a.exports.lock=h,a.exports.unlock=function(a,b){return e(d.unlock)(a,b)},a.exports.lockSync=function(a,b){let c=f(d.lock)(a,g(b));return f(c)},a.exports.unlockSync=function(a,b){return f(d.unlock)(a,g(b))},a.exports.check=function(a,b){return e(d.check)(a,b)},a.exports.checkSync=function(a,b){return f(d.check)(a,g(b))}},95415:(a,b,c)=>{var d,e,f,g=c(29021),h=c(68500),i=c(44449),j=c(45211),k=c(28354);function l(a,b){Object.defineProperty(a,d,{get:function(){return b}})}"function"==typeof Symbol&&"function"==typeof Symbol.for?(d=Symbol.for("graceful-fs.queue"),e=Symbol.for("graceful-fs.previous")):(d="___graceful-fs.queue",e="___graceful-fs.previous");var m=function(){};function n(a){h(a),a.gracefulify=n,a.createReadStream=function(b,c){return new a.ReadStream(b,c)},a.createWriteStream=function(b,c){return new a.WriteStream(b,c)};var b=a.readFile;a.readFile=function(a,c,d){return"function"==typeof c&&(d=c,c=null),function a(c,d,e,f){return b(c,d,function(b){b&&("EMFILE"===b.code||"ENFILE"===b.code)?o([a,[c,d,e],b,f||Date.now(),Date.now()]):"function"==typeof e&&e.apply(this,arguments)})}(a,c,d)};var c=a.writeFile;a.writeFile=function(a,b,d,e){return"function"==typeof d&&(e=d,d=null),function a(b,d,e,f,g){return c(b,d,e,function(c){c&&("EMFILE"===c.code||"ENFILE"===c.code)?o([a,[b,d,e,f],c,g||Date.now(),Date.now()]):"function"==typeof f&&f.apply(this,arguments)})}(a,b,d,e)};var d=a.appendFile;d&&(a.appendFile=function(a,b,c,e){return"function"==typeof c&&(e=c,c=null),function a(b,c,e,f,g){return d(b,c,e,function(d){d&&("EMFILE"===d.code||"ENFILE"===d.code)?o([a,[b,c,e,f],d,g||Date.now(),Date.now()]):"function"==typeof f&&f.apply(this,arguments)})}(a,b,c,e)});var e=a.copyFile;e&&(a.copyFile=function(a,b,c,d){return"function"==typeof c&&(d=c,c=0),function a(b,c,d,f,g){return e(b,c,d,function(e){e&&("EMFILE"===e.code||"ENFILE"===e.code)?o([a,[b,c,d,f],e,g||Date.now(),Date.now()]):"function"==typeof f&&f.apply(this,arguments)})}(a,b,c,d)});var f=a.readdir;a.readdir=function(a,b,c){"function"==typeof b&&(c=b,b=null);var d=g.test(process.version)?function(a,b,c,d){return f(a,e(a,b,c,d))}:function(a,b,c,d){return f(a,b,e(a,b,c,d))};return d(a,b,c);function e(a,b,c,e){return function(f,g){f&&("EMFILE"===f.code||"ENFILE"===f.code)?o([d,[a,b,c],f,e||Date.now(),Date.now()]):(g&&g.sort&&g.sort(),"function"==typeof c&&c.call(this,f,g))}}};var g=/^v[0-5]\./;if("v0.8"===process.version.substr(0,4)){var j=i(a);q=j.ReadStream,r=j.WriteStream}var k=a.ReadStream;k&&(q.prototype=Object.create(k.prototype),q.prototype.open=function(){var a=this;t(a.path,a.flags,a.mode,function(b,c){b?(a.autoClose&&a.destroy(),a.emit("error",b)):(a.fd=c,a.emit("open",c),a.read())})});var l=a.WriteStream;l&&(r.prototype=Object.create(l.prototype),r.prototype.open=function(){var a=this;t(a.path,a.flags,a.mode,function(b,c){b?(a.destroy(),a.emit("error",b)):(a.fd=c,a.emit("open",c))})}),Object.defineProperty(a,"ReadStream",{get:function(){return q},set:function(a){q=a},enumerable:!0,configurable:!0}),Object.defineProperty(a,"WriteStream",{get:function(){return r},set:function(a){r=a},enumerable:!0,configurable:!0});var m=q;Object.defineProperty(a,"FileReadStream",{get:function(){return m},set:function(a){m=a},enumerable:!0,configurable:!0});var p=r;function q(a,b){return this instanceof q?(k.apply(this,arguments),this):q.apply(Object.create(q.prototype),arguments)}function r(a,b){return this instanceof r?(l.apply(this,arguments),this):r.apply(Object.create(r.prototype),arguments)}Object.defineProperty(a,"FileWriteStream",{get:function(){return p},set:function(a){p=a},enumerable:!0,configurable:!0});var s=a.open;function t(a,b,c,d){return"function"==typeof c&&(d=c,c=null),function a(b,c,d,e,f){return s(b,c,d,function(g,h){g&&("EMFILE"===g.code||"ENFILE"===g.code)?o([a,[b,c,d,e],g,f||Date.now(),Date.now()]):"function"==typeof e&&e.apply(this,arguments)})}(a,b,c,d)}return a.open=t,a}function o(a){m("ENQUEUE",a[0].name,a[1]),g[d].push(a),q()}function p(){for(var a=Date.now(),b=0;b<g[d].length;++b)g[d][b].length>2&&(g[d][b][3]=a,g[d][b][4]=a);q()}function q(){if(clearTimeout(f),f=void 0,0!==g[d].length){var a=g[d].shift(),b=a[0],c=a[1],e=a[2],h=a[3],i=a[4];if(void 0===h)m("RETRY",b.name,c),b.apply(null,c);else if(Date.now()-h>=6e4){m("TIMEOUT",b.name,c);var j=c.pop();"function"==typeof j&&j.call(null,e)}else Date.now()-i>=Math.min(1.2*Math.max(i-h,1),100)?(m("RETRY",b.name,c),b.apply(null,c.concat([h]))):g[d].push(a);void 0===f&&(f=setTimeout(q,0))}}k.debuglog?m=k.debuglog("gfs4"):/\bgfs4\b/i.test(process.env.NODE_DEBUG||"")&&(m=function(){var a=k.format.apply(k,arguments);console.error(a="GFS4: "+a.split(/\n/).join("\nGFS4: "))}),!g[d]&&(l(g,global[d]||[]),g.close=function(a){function b(b,c){return a.call(g,b,function(a){a||p(),"function"==typeof c&&c.apply(this,arguments)})}return Object.defineProperty(b,e,{value:a}),b}(g.close),g.closeSync=function(a){function b(b){a.apply(g,arguments),p()}return Object.defineProperty(b,e,{value:a}),b}(g.closeSync),/\bgfs4\b/i.test(process.env.NODE_DEBUG||"")&&process.on("exit",function(){m(g[d]),c(12412).equal(g[d].length,0)})),global[d]||l(global,g[d]),a.exports=n(j(g)),process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH&&!g.__patched&&(a.exports=n(g),g.__patched=!0)},95655:(a,b,c)=>{"use strict";c.d(b,{My:()=>i,Te:()=>m,Wu:()=>h,jQ:()=>n,kY:()=>g,vU:()=>j,wf:()=>f}),c(97136);let d=Symbol.for("pi-web:mcp-status:by-config");function e(){let a=globalThis;return a[d]??=new Map}function f(a){return`${a.scope}\0${a.sourcePath}\0${a.name}`}function g(a,b,c){let d=e(),g=f(a),h=d.get(g)??new Map;d.delete(g),h.delete(b),h.set(b,c),d.set(g,h);for(let a=function(a){let b=0;for(let c of a.values())b+=c.size;return b}(d);a>500;a--){let[a,b]=d.entries().next().value;b.delete(b.keys().next().value),0===b.size&&d.delete(a)}}function h(a,b,c){return e().get(f(a))?.get(b)===c}function i(a,b,c){if(!h(a,b,c))return!1;let d=e(),g=f(a),i=d.get(g);return i?.delete(b),i?.size===0&&d.delete(g),!0}function j(a,b,c,d){return!!h(a,b,c)&&(g(a,b,d),!0)}let k=Symbol.for("pi-web:mcp-inactive-hosts");function l(){let a=globalThis;return a[k]??=new Map}function m(a,b){let c=l();for(c.delete(a),c.set(a,b);c.size>100;)c.delete(c.keys().next().value)}function n(a,b){let c=l();(void 0===b||c.get(a)===b)&&c.delete(a)}},96452:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{S9:()=>k,je:()=>l,vd:()=>i});var e=c(58655),f=c(13856),g=a([f]);function h(){return globalThis.__piWebProviderModelCatalog??=new Map,globalThis.__piWebProviderModelCatalog}async function i(a){let b=new Map;for(let c of(await a.getAvailable()))b.set(c.provider,[...b.get(c.provider)??[],c]);let c=[...b.keys()].some(a=>!h().has(a));for(let[a,c]of b)h().set(a,c);c&&(0,e.kn)()}function j(a){let b=new Set(a.getModels().map(a=>a.provider));return[...h()].flatMap(([a,c])=>b.has(a)?[]:c)}function k(a,b,c){return j(a).find(a=>a.provider===b&&a.id===c)}async function l(a,b,c){let d;if(0===j(a).length)return;try{d=(0,f.IR)(await (0,f.py)(new Proxy(a,{get(a,b,c){if("getAvailable"===b)return async(...b)=>{let[c]=b,d=j(a).filter(a=>!c||a.provider===c);return[...await a.getAvailable(...b),...d]};let d=Reflect.get(a,b,c);return"function"==typeof d?d.bind(a):d}}),b),c)}catch{return}let e=d.model&&k(a,d.model.provider,d.model.id);return e?{model:e,...d.thinkingLevel?{thinkingLevelPin:d.thinkingLevel}:{}}:void 0}f=(g.then?(await g)():g)[0],d()}catch(a){d(a)}})},97136:(a,b,c)=>{"use strict";c.d(b,{Eb:()=>j,W3:()=>h,gB:()=>g,uK:()=>f});var d=c(33873);let e=/^[a-zA-Z]:[\\/]/;function f(a){return e.test(a)||a.startsWith("\\\\")||a.startsWith("//")}function g(a){return a&&"win32"===process.platform?(0,d.normalize)(a):a}function h(a){return a.replace(/\\/g,"/")}function i(a){let b=(0,d.normalize)(g(a)),c=(0,d.parse)(b).root.length,e=b.length;for(;e>c&&b[e-1]===d.sep;)e--;return b.slice(0,e)}function j(a,b){if(a===b)return!0;if(!a||!b)return!1;let c=i(a),d=i(b);return"win32"===process.platform?c.toLowerCase()===d.toLowerCase():c===d}},98012:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{U:()=>l,r8:()=>m});var e=c(28802),f=c(75430),g=a([e,f]);[e,f]=g.then?(await g)():g;let n="TodoWrite",o="TodoRead",p=new Map;function h(a){return a.sessionManager.getSessionId()??""}function i(a){let b={total:a.length,pending:0,inProgress:0,completed:0};for(let c of a)"pending"===c.status?b.pending++:"in_progress"===c.status?b.inProgress++:b.completed++;return b}function j(a,b){let c=i(b);return[`${a} — ${c.completed}/${c.total} completed, ${c.inProgress} in progress:`,...b.map(a=>{var b;return`${b=a.status,"completed"===b?"✓":"in_progress"===b?"◐":"○"} ${a.content}`})].join("\n")}function k(a){return{kind:"pi-web-todo",todos:a.map(a=>({...a})),counts:i(a)}}let q=e.Type.Object({content:e.Type.String({minLength:1,maxLength:500,description:"Short imperative task line"}),status:(0,e.StringEnum)(["pending","in_progress","completed"]),priority:e.Type.Optional((0,e.StringEnum)(["high","medium","low"],{description:"Priority level; omit for medium"}))});function l(){return a=>{a.registerTool((0,f.defineTool)({name:n,label:"Todo write",description:"Write the complete session todo list. Each call replaces the entire list. At most one item may be in_progress. Use it to plan and track multi-step work.",promptSnippet:"Track multi-step work with a todo list",promptGuidelines:["Use TodoWrite for complex work with 3+ steps, when the user gives you a list of tasks, or immediately after receiving new instructions to capture requirements. Skip it for single trivial tasks and purely conversational requests.","TodoWrite replaces the whole list every time: send the complete updated list, not a delta. At most one item may be in_progress at a time.","When starting a task, mark it in_progress BEFORE beginning work. Mark it completed IMMEDIATELY when done — never batch completions.","Never mark a task completed if tests are failing, the implementation is partial, or you hit unresolved errors — keep it in_progress and add a new task for the blocker instead.","Set priority (high/medium/low) when items differ in urgency; omit it for medium.","TodoRead returns the current list without changes; use it after compaction or when unsure of the current state."],parameters:e.Type.Object({todos:e.Type.Array(q,{maxItems:50,description:"The complete updated todo list. At most one item may be in_progress at a time."})}),async execute(a,b,c,d,e){let f=b.todos.filter(a=>"in_progress"===a.status);if(f.length>1){let a=f.map(a=>`"${a.content}"`).join(", ");return{content:[{type:"text",text:`At most one todo may be in_progress at a time; got ${f.length}: ${a}. Send the complete list with at most one in_progress.`}],details:void 0,isError:!0}}let g=b.todos.map(a=>({content:a.content,status:a.status,priority:a.priority??"medium"}));return p.set(h(e),g),{content:[{type:"text",text:0===g.length?"Todos cleared.":j("Todos updated",g)}],details:k(g)}}})),a.registerTool((0,f.defineTool)({name:o,label:"Todo read",description:"Read the current session todo list without modifying it.",promptSnippet:"Track multi-step work with a todo list",parameters:e.Type.Object({}),async execute(a,b,c,d,e){let f,g,i=(f=h(e),g=p.get(f),void 0===g&&(g=function(a){let b=[];for(let c of a){if("message"!==c.type)continue;let a=c.message;a?.role==="toolResult"&&(a.toolName===n||a.toolName===o)&&function(a){if(!a||"object"!=typeof a||"pi-web-todo"!==a.kind||!Array.isArray(a.todos))return!1;let b=a.counts;return!!b&&[b.total,b.pending,b.inProgress,b.completed].every(a=>"number"==typeof a)}(a.details)&&(b=a.details.todos.map(a=>({...a})))}return b}(e.sessionManager.getBranch()),p.set(f,g)),g);return{content:[{type:"text",text:0===i.length?"No todos.":j("Current todos",i)}],details:k(i)}}}))}}function m(a){let b=new Set(a.extensions.filter(a=>{let b,c;return c=(b=(a.sourceInfo?.source??"").replace(/^npm:/,"")).indexOf("@",1),(-1===c?b:b.slice(0,c))==="@juicesharp/rpiv-todo"||a.path.replaceAll("\\","/").split("/").some(a=>"rpiv-todo"===a)}).map(a=>a.path));return 0===b.size?a:{...a,extensions:a.extensions.filter(a=>!b.has(a.path)),errors:a.errors.filter(a=>!b.has(a.path)&&("builtin:todo"!==a.path||![...b].some(b=>a.error===`Tool "${n}" conflicts with ${b}`||a.error===`Tool "${o}" conflicts with ${b}`)))}}d()}catch(a){d(a)}})}};