@chainingintention/pi-web-cn 1.202607.1 → 1.202607.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/CodeViewer-B8UDBbru.js","assets/vendor-editor-core-C7aWiQy0.js","assets/vendor-editor-languages-EW34FfVy.js","assets/vendor-editor-legacy-B4QLsWF8.js","assets/UnifiedDiffViewer-C9IllVsZ.js","assets/TerminalPanel-BG0-cSjI.js","assets/vendor-terminal-DjQ08hXu.js","assets/vendor-terminal-DDGTF8rc.css"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/CodeViewer-Cyy3_LEk.js","assets/vendor-editor-core-C7aWiQy0.js","assets/vendor-editor-languages-EW34FfVy.js","assets/vendor-editor-legacy-B4QLsWF8.js","assets/UnifiedDiffViewer-BprnYHmM.js","assets/TerminalPanel-CNsIQZbo.js","assets/vendor-terminal-DjQ08hXu.js","assets/vendor-terminal-DDGTF8rc.css"])))=>i.map(i=>d[i]);
2
2
  import{Q as eo,v as it,J as hs,R as ec,S as tc,G as ic,U as sc,V as rc,W as oc,A as nc,X as ac,Y as lc,Z as to,w as io,_ as cc}from"./vendor-editor-core-C7aWiQy0.js";import{m as dc,d as pc,i as hc}from"./vendor-editor-languages-EW34FfVy.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))s(r);new MutationObserver(r=>{for(const o of r)if(o.type==="childList")for(const n of o.addedNodes)n.tagName==="LINK"&&n.rel==="modulepreload"&&s(n)}).observe(document,{childList:!0,subtree:!0});function i(r){const o={};return r.integrity&&(o.integrity=r.integrity),r.referrerPolicy&&(o.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?o.credentials="include":r.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function s(r){if(r.ep)return;r.ep=!0;const o=i(r);fetch(r.href,o)}})();const fi=globalThis,cr=fi.ShadowRoot&&(fi.ShadyCSS===void 0||fi.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,dr=Symbol(),so=new WeakMap;let da=class{constructor(t,i,s){if(this._$cssResult$=!0,s!==dr)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=i}get styleSheet(){let t=this.o;const i=this.t;if(cr&&t===void 0){const s=i!==void 0&&i.length===1;s&&(t=so.get(i)),t===void 0&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),s&&so.set(i,t))}return t}toString(){return this.cssText}};const uc=e=>new da(typeof e=="string"?e:e+"",void 0,dr),E=(e,...t)=>{const i=e.length===1?e[0]:t.reduce((s,r,o)=>s+(n=>{if(n._$cssResult$===!0)return n.cssText;if(typeof n=="number")return n;throw Error("Value passed to 'css' function must be a 'css' function result: "+n+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(r)+e[o+1],e[0]);return new da(i,e,dr)},fc=(e,t)=>{if(cr)e.adoptedStyleSheets=t.map(i=>i instanceof CSSStyleSheet?i:i.styleSheet);else for(const i of t){const s=document.createElement("style"),r=fi.litNonce;r!==void 0&&s.setAttribute("nonce",r),s.textContent=i.cssText,e.appendChild(s)}},ro=cr?e=>e:e=>e instanceof CSSStyleSheet?(t=>{let i="";for(const s of t.cssRules)i+=s.cssText;return uc(i)})(e):e;const{is:gc,defineProperty:mc,getOwnPropertyDescriptor:vc,getOwnPropertyNames:bc,getOwnPropertySymbols:wc,getPrototypeOf:yc}=Object,Vi=globalThis,oo=Vi.trustedTypes,xc=oo?oo.emptyScript:"",Sc=Vi.reactiveElementPolyfillSupport,Bt=(e,t)=>e,$i={toAttribute(e,t){switch(t){case Boolean:e=e?xc:null;break;case Object:case Array:e=e==null?e:JSON.stringify(e)}return e},fromAttribute(e,t){let i=e;switch(t){case Boolean:i=e!==null;break;case Number:i=e===null?null:Number(e);break;case Object:case Array:try{i=JSON.parse(e)}catch{i=null}}return i}},pr=(e,t)=>!gc(e,t),no={attribute:!0,type:String,converter:$i,reflect:!1,useDefault:!1,hasChanged:pr};Symbol.metadata??=Symbol("metadata"),Vi.litPropertyMetadata??=new WeakMap;let bt=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,i=no){if(i.state&&(i.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((i=Object.create(i)).wrapped=!0),this.elementProperties.set(t,i),!i.noAccessor){const s=Symbol(),r=this.getPropertyDescriptor(t,s,i);r!==void 0&&mc(this.prototype,t,r)}}static getPropertyDescriptor(t,i,s){const{get:r,set:o}=vc(this.prototype,t)??{get(){return this[i]},set(n){this[i]=n}};return{get:r,set(n){const a=r?.call(this);o?.call(this,n),this.requestUpdate(t,a,s)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??no}static _$Ei(){if(this.hasOwnProperty(Bt("elementProperties")))return;const t=yc(this);t.finalize(),t.l!==void 0&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(Bt("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(Bt("properties"))){const i=this.properties,s=[...bc(i),...wc(i)];for(const r of s)this.createProperty(r,i[r])}const t=this[Symbol.metadata];if(t!==null){const i=litPropertyMetadata.get(t);if(i!==void 0)for(const[s,r]of i)this.elementProperties.set(s,r)}this._$Eh=new Map;for(const[i,s]of this.elementProperties){const r=this._$Eu(i,s);r!==void 0&&this._$Eh.set(r,i)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){const i=[];if(Array.isArray(t)){const s=new Set(t.flat(1/0).reverse());for(const r of s)i.unshift(ro(r))}else t!==void 0&&i.push(ro(t));return i}static _$Eu(t,i){const s=i.attribute;return s===!1?void 0:typeof s=="string"?s:typeof t=="string"?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),this.renderRoot!==void 0&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,i=this.constructor.elementProperties;for(const s of i.keys())this.hasOwnProperty(s)&&(t.set(s,this[s]),delete this[s]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return fc(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,i,s){this._$AK(t,s)}_$ET(t,i){const s=this.constructor.elementProperties.get(t),r=this.constructor._$Eu(t,s);if(r!==void 0&&s.reflect===!0){const o=(s.converter?.toAttribute!==void 0?s.converter:$i).toAttribute(i,s.type);this._$Em=t,o==null?this.removeAttribute(r):this.setAttribute(r,o),this._$Em=null}}_$AK(t,i){const s=this.constructor,r=s._$Eh.get(t);if(r!==void 0&&this._$Em!==r){const o=s.getPropertyOptions(r),n=typeof o.converter=="function"?{fromAttribute:o.converter}:o.converter?.fromAttribute!==void 0?o.converter:$i;this._$Em=r;const a=n.fromAttribute(i,o.type);this[r]=a??this._$Ej?.get(r)??a,this._$Em=null}}requestUpdate(t,i,s,r=!1,o){if(t!==void 0){const n=this.constructor;if(r===!1&&(o=this[t]),s??=n.getPropertyOptions(t),!((s.hasChanged??pr)(o,i)||s.useDefault&&s.reflect&&o===this._$Ej?.get(t)&&!this.hasAttribute(n._$Eu(t,s))))return;this.C(t,i,s)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(t,i,{useDefault:s,reflect:r,wrapped:o},n){s&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,n??i??this[t]),o!==!0||n!==void 0)||(this._$AL.has(t)||(this.hasUpdated||s||(i=void 0),this._$AL.set(t,i)),r===!0&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(i){Promise.reject(i)}const t=this.scheduleUpdate();return t!=null&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[r,o]of this._$Ep)this[r]=o;this._$Ep=void 0}const s=this.constructor.elementProperties;if(s.size>0)for(const[r,o]of s){const{wrapped:n}=o,a=this[r];n!==!0||this._$AL.has(r)||a===void 0||this.C(r,void 0,o,a)}}let t=!1;const i=this._$AL;try{t=this.shouldUpdate(i),t?(this.willUpdate(i),this._$EO?.forEach(s=>s.hostUpdate?.()),this.update(i)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(i)}willUpdate(t){}_$AE(t){this._$EO?.forEach(i=>i.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(i=>this._$ET(i,this[i])),this._$EM()}updated(t){}firstUpdated(t){}};bt.elementStyles=[],bt.shadowRootOptions={mode:"open"},bt[Bt("elementProperties")]=new Map,bt[Bt("finalized")]=new Map,Sc?.({ReactiveElement:bt}),(Vi.reactiveElementVersions??=[]).push("2.1.2");const hr=globalThis,ao=e=>e,Pi=hr.trustedTypes,lo=Pi?Pi.createPolicy("lit-html",{createHTML:e=>e}):void 0,pa="$lit$",Ze=`lit$${Math.random().toFixed(9).slice(2)}$`,ha="?"+Ze,kc=`<${ha}>`,ct=document,Ht=()=>ct.createComment(""),qt=e=>e===null||typeof e!="object"&&typeof e!="function",ur=Array.isArray,$c=e=>ur(e)||typeof e?.[Symbol.iterator]=="function",us=`[
3
3
  \f\r]`,Tt=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,co=/-->/g,po=/>/g,st=RegExp(`>|${us}(?:([^\\s"'>=/]+)(${us}*=${us}*(?:[^
4
- \f\r"'\`<>=]|("|')|))|$)`,"g"),ho=/'/g,uo=/"/g,ua=/^(?:script|style|textarea|title)$/i,fa=e=>(t,...i)=>({_$litType$:e,strings:t,values:i}),l=fa(1),be=fa(2),Xe=Symbol.for("lit-noChange"),z=Symbol.for("lit-nothing"),fo=new WeakMap,at=ct.createTreeWalker(ct,129);function ga(e,t){if(!ur(e)||!e.hasOwnProperty("raw"))throw Error("invalid template strings array");return lo!==void 0?lo.createHTML(t):t}const Pc=(e,t)=>{const i=e.length-1,s=[];let r,o=t===2?"<svg>":t===3?"<math>":"",n=Tt;for(let a=0;a<i;a++){const c=e[a];let p,u,h=-1,g=0;for(;g<c.length&&(n.lastIndex=g,u=n.exec(c),u!==null);)g=n.lastIndex,n===Tt?u[1]==="!--"?n=co:u[1]!==void 0?n=po:u[2]!==void 0?(ua.test(u[2])&&(r=RegExp("</"+u[2],"g")),n=st):u[3]!==void 0&&(n=st):n===st?u[0]===">"?(n=r??Tt,h=-1):u[1]===void 0?h=-2:(h=n.lastIndex-u[2].length,p=u[1],n=u[3]===void 0?st:u[3]==='"'?uo:ho):n===uo||n===ho?n=st:n===co||n===po?n=Tt:(n=st,r=void 0);const w=n===st&&e[a+1].startsWith("/>")?" ":"";o+=n===Tt?c+kc:h>=0?(s.push(p),c.slice(0,h)+pa+c.slice(h)+Ze+w):c+Ze+(h===-2?a:w)}return[ga(e,o+(e[i]||"<?>")+(t===2?"</svg>":t===3?"</math>":"")),s]};class Kt{constructor({strings:t,_$litType$:i},s){let r;this.parts=[];let o=0,n=0;const a=t.length-1,c=this.parts,[p,u]=Pc(t,i);if(this.el=Kt.createElement(p,s),at.currentNode=this.el.content,i===2||i===3){const h=this.el.content.firstChild;h.replaceWith(...h.childNodes)}for(;(r=at.nextNode())!==null&&c.length<a;){if(r.nodeType===1){if(r.hasAttributes())for(const h of r.getAttributeNames())if(h.endsWith(pa)){const g=u[n++],w=r.getAttribute(h).split(Ze),P=/([.?@])?(.*)/.exec(g);c.push({type:1,index:o,name:P[2],strings:w,ctor:P[1]==="."?Ic:P[1]==="?"?Rc:P[1]==="@"?Ac:Gi}),r.removeAttribute(h)}else h.startsWith(Ze)&&(c.push({type:6,index:o}),r.removeAttribute(h));if(ua.test(r.tagName)){const h=r.textContent.split(Ze),g=h.length-1;if(g>0){r.textContent=Pi?Pi.emptyScript:"";for(let w=0;w<g;w++)r.append(h[w],Ht()),at.nextNode(),c.push({type:2,index:++o});r.append(h[g],Ht())}}}else if(r.nodeType===8)if(r.data===ha)c.push({type:2,index:o});else{let h=-1;for(;(h=r.data.indexOf(Ze,h+1))!==-1;)c.push({type:7,index:o}),h+=Ze.length-1}o++}}static createElement(t,i){const s=ct.createElement("template");return s.innerHTML=t,s}}function St(e,t,i=e,s){if(t===Xe)return t;let r=s!==void 0?i._$Co?.[s]:i._$Cl;const o=qt(t)?void 0:t._$litDirective$;return r?.constructor!==o&&(r?._$AO?.(!1),o===void 0?r=void 0:(r=new o(e),r._$AT(e,i,s)),s!==void 0?(i._$Co??=[])[s]=r:i._$Cl=r),r!==void 0&&(t=St(e,r._$AS(e,t.values),r,s)),t}class Cc{constructor(t,i){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=i}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:i},parts:s}=this._$AD,r=(t?.creationScope??ct).importNode(i,!0);at.currentNode=r;let o=at.nextNode(),n=0,a=0,c=s[0];for(;c!==void 0;){if(n===c.index){let p;c.type===2?p=new Ct(o,o.nextSibling,this,t):c.type===1?p=new c.ctor(o,c.name,c.strings,this,t):c.type===6&&(p=new Tc(o,this,t)),this._$AV.push(p),c=s[++a]}n!==c?.index&&(o=at.nextNode(),n++)}return at.currentNode=ct,r}p(t){let i=0;for(const s of this._$AV)s!==void 0&&(s.strings!==void 0?(s._$AI(t,s,i),i+=s.strings.length-2):s._$AI(t[i])),i++}}class Ct{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,i,s,r){this.type=2,this._$AH=z,this._$AN=void 0,this._$AA=t,this._$AB=i,this._$AM=s,this.options=r,this._$Cv=r?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const i=this._$AM;return i!==void 0&&t?.nodeType===11&&(t=i.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,i=this){t=St(this,t,i),qt(t)?t===z||t==null||t===""?(this._$AH!==z&&this._$AR(),this._$AH=z):t!==this._$AH&&t!==Xe&&this._(t):t._$litType$!==void 0?this.$(t):t.nodeType!==void 0?this.T(t):$c(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==z&&qt(this._$AH)?this._$AA.nextSibling.data=t:this.T(ct.createTextNode(t)),this._$AH=t}$(t){const{values:i,_$litType$:s}=t,r=typeof s=="number"?this._$AC(t):(s.el===void 0&&(s.el=Kt.createElement(ga(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===r)this._$AH.p(i);else{const o=new Cc(r,this),n=o.u(this.options);o.p(i),this.T(n),this._$AH=o}}_$AC(t){let i=fo.get(t.strings);return i===void 0&&fo.set(t.strings,i=new Kt(t)),i}k(t){ur(this._$AH)||(this._$AH=[],this._$AR());const i=this._$AH;let s,r=0;for(const o of t)r===i.length?i.push(s=new Ct(this.O(Ht()),this.O(Ht()),this,this.options)):s=i[r],s._$AI(o),r++;r<i.length&&(this._$AR(s&&s._$AB.nextSibling,r),i.length=r)}_$AR(t=this._$AA.nextSibling,i){for(this._$AP?.(!1,!0,i);t!==this._$AB;){const s=ao(t).nextSibling;ao(t).remove(),t=s}}setConnected(t){this._$AM===void 0&&(this._$Cv=t,this._$AP?.(t))}}let Gi=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,i,s,r,o){this.type=1,this._$AH=z,this._$AN=void 0,this.element=t,this.name=i,this._$AM=r,this.options=o,s.length>2||s[0]!==""||s[1]!==""?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=z}_$AI(t,i=this,s,r){const o=this.strings;let n=!1;if(o===void 0)t=St(this,t,i,0),n=!qt(t)||t!==this._$AH&&t!==Xe,n&&(this._$AH=t);else{const a=t;let c,p;for(t=o[0],c=0;c<o.length-1;c++)p=St(this,a[s+c],i,c),p===Xe&&(p=this._$AH[c]),n||=!qt(p)||p!==this._$AH[c],p===z?t=z:t!==z&&(t+=(p??"")+o[c+1]),this._$AH[c]=p}n&&!r&&this.j(t)}j(t){t===z?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??"")}},Ic=class extends Gi{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===z?void 0:t}},Rc=class extends Gi{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==z)}},Ac=class extends Gi{constructor(t,i,s,r,o){super(t,i,s,r,o),this.type=5}_$AI(t,i=this){if((t=St(this,t,i,0)??z)===Xe)return;const s=this._$AH,r=t===z&&s!==z||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,o=t!==z&&(s===z||r);r&&this.element.removeEventListener(this.name,this,s),o&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){typeof this._$AH=="function"?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}},Tc=class{constructor(t,i,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=i,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){St(this,t)}};const Mc={I:Ct},Ec=hr.litHtmlPolyfillSupport;Ec?.(Kt,Ct),(hr.litHtmlVersions??=[]).push("3.3.3");const Dc=(e,t,i)=>{const s=i?.renderBefore??t;let r=s._$litPart$;if(r===void 0){const o=i?.renderBefore??null;s._$litPart$=r=new Ct(t.insertBefore(Ht(),o),o,void 0,i??{})}return r._$AI(e),r};const fr=globalThis;let A=class extends bt{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const i=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=Dc(i,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return Xe}};A._$litElement$=!0,A.finalized=!0,fr.litElementHydrateSupport?.({LitElement:A});const Wc=fr.litElementPolyfillSupport;Wc?.({LitElement:A});(fr.litElementVersions??=[]).push("4.2.2");const W=e=>(t,i)=>{i!==void 0?i.addInitializer(()=>{customElements.define(e,t)}):customElements.define(e,t)};const Oc={attribute:!0,type:String,converter:$i,reflect:!1,hasChanged:pr},_c=(e=Oc,t,i)=>{const{kind:s,metadata:r}=i;let o=globalThis.litPropertyMetadata.get(r);if(o===void 0&&globalThis.litPropertyMetadata.set(r,o=new Map),s==="setter"&&((e=Object.create(e)).wrapped=!0),o.set(i.name,e),s==="accessor"){const{name:n}=i;return{set(a){const c=t.get.call(this);t.set.call(this,a),this.requestUpdate(n,c,e,!0,a)},init(a){return a!==void 0&&this.C(n,void 0,e,a),a}}}if(s==="setter"){const{name:n}=i;return function(a){const c=this[n];t.call(this,a),this.requestUpdate(n,c,e,!0,a)}}throw Error("Unsupported decorator location: "+s)};function d(e){return(t,i)=>typeof i=="object"?_c(e,t,i):((s,r,o)=>{const n=r.hasOwnProperty(o);return r.constructor.createProperty(o,s),n?Object.getOwnPropertyDescriptor(r,o):void 0})(e,t,i)}function x(e){return d({...e,state:!0,attribute:!1})}const Lc=(e,t,i)=>(i.configurable=!0,i.enumerable=!0,Reflect.decorate&&typeof t!="object"&&Object.defineProperty(e,t,i),i);function B(e,t){return(i,s,r)=>{const o=n=>n.renderRoot?.querySelector(e)??null;return Lc(i,s,{get(){return o(this)}})}}function ma(e,t=Fc()){if(t===void 0)return e;const i=jc(t);if(i===void 0)return e;const s=new URL(e,t.origin);return s.searchParams.set("embed",i.embed),s.searchParams.set("token",i.token),`${s.pathname}${s.search}${s.hash}`}function jc(e){const t=e.searchParams.get("embed"),i=e.searchParams.get("token")?.trim();if(!(t!=="management"||i===void 0||i===""))return{embed:t,token:i}}function Fc(){if(typeof globalThis.location>"u")return;const e=globalThis.location;if(typeof e.href=="string"&&e.href!=="")return new URL(e.href);const t=typeof e.protocol=="string"&&e.protocol!==""?e.protocol:"http:",i=typeof e.host=="string"&&e.host!==""?e.host:"localhost",s=typeof e.search=="string"?e.search:"";return new URL(`${t}//${i}/${s}`)}async function v(e,t,i){const s=new Headers(i?.headers);i?.body!==void 0&&!s.has("content-type")&&s.set("content-type","application/json");const r=await fetch(ma(e),{...i,headers:s});if(!r.ok){const n=await r.json().catch(()=>({}));throw new Error(Uc(n)??r.statusText)}const o=await r.json();return t(o)}function Uc(e){if(zc(e))return typeof e.error=="string"?e.error:void 0}function zc(e){return typeof e=="object"&&e!==null}function Ne(e){return typeof e=="object"&&e!==null}function y(e){if(!Ne(e))throw new Error("Expected object response");return e}function m(e,t){const i=e[t];if(typeof i!="string")throw new Error(`Expected string field: ${t}`);return i}function $(e,t){const i=e[t];if(i!==void 0){if(typeof i!="string")throw new Error(`Expected optional string field: ${t}`);return i}}function q(e,t){const i=e[t];if(typeof i!="number")throw new Error(`Expected number field: ${t}`);return i}function ne(e,t){const i=e[t];if(i!==void 0){if(typeof i!="number")throw new Error(`Expected optional number field: ${t}`);return i}}function D(e,t){const i=e[t];if(typeof i!="boolean")throw new Error(`Expected boolean field: ${t}`);return i}function j(e){return t=>{if(!Array.isArray(t))throw new Error("Expected array response");return t.map(e)}}function et(e,t){if(y(e)[t]!==!0)throw new Error(`Expected ${t} response`);return!0}function b(e,t){return t===void 0?{}:{[e]:t}}const Oe={sessionsDeleteArchived:"sessions.deleteArchived",sessionsBulkMutations:"sessions.bulkMutations",sessionsCleanup:"sessions.cleanup",sessionsReload:"sessions.reload",promptAttachments:"prompt.attachments",workspaceFileSuggestions:"workspace.fileSuggestions"},Bc=Object.values(Oe),Nc=new Set(Bc);function Hc(e){return typeof e=="string"&&Nc.has(e)}function Be(e,t){return e?.capabilities?.includes(t)===!0}function go(e){const t=y(e);return{path:m(t,"path"),exists:D(t,"exists"),config:mo(t.config),effectiveConfig:mo(t.effectiveConfig),envOverrides:Zc(t.envOverrides)}}function mo(e){const t=y(e);return{...b("host",$(t,"host")),...b("port",ne(t,"port")),...b("allowedHosts",qc(t.allowedHosts)),...b("shortcuts",Jc(t.shortcuts)),...b("plugins",Qc(t.plugins)),...b("pathAccess",Kc(t.pathAccess)),...b("uploads",Gc(t.uploads)),...b("maxUploadBytes",ne(t,"maxUploadBytes")),...b("spawnSessions",bo(t,"spawnSessions")),...b("subsessions",bo(t,"subsessions"))}}function qc(e){if(e!==void 0){if(e===!0)return!0;if(Array.isArray(e)&&e.every(t=>typeof t=="string"))return e;throw new Error("Invalid PI WEB allowedHosts field")}}function Kc(e){if(e===void 0)return;if(!Ne(e)||Array.isArray(e))throw new Error("Invalid PI WEB pathAccess field");const t=e.allowedPaths;return{...b("allowedPaths",Vc(t,"pathAccess.allowedPaths"))}}function Vc(e,t){if(e!==void 0){if(Array.isArray(e)&&e.every(i=>typeof i=="string"&&i!==""))return e;throw new Error(`Invalid PI WEB ${t} field`)}}function Gc(e){if(e!==void 0){if(!Ne(e)||Array.isArray(e))throw new Error("Invalid PI WEB uploads field");return{...b("defaultFolder",$(e,"defaultFolder"))}}}function Jc(e){if(e!==void 0){if(!Ne(e)||Array.isArray(e))throw new Error("Invalid PI WEB shortcuts field");return Object.fromEntries(Object.entries(e).map(([t,i])=>{if(i!==null&&(typeof i!="string"||i===""))throw new Error("Invalid PI WEB shortcut field");return[t,i]}))}}function Qc(e){if(e!==void 0){if(!Ne(e)||Array.isArray(e))throw new Error("Invalid PI WEB plugins field");return Object.fromEntries(Object.entries(e).map(([t,i])=>{if(!Ne(i)||Array.isArray(i))throw new Error("Invalid PI WEB plugin config field");const s=i.enabled;if(s!==void 0&&typeof s!="boolean")throw new Error("Invalid PI WEB plugin enabled field");const r=i.settings;if(r!==void 0&&(!Ne(r)||Array.isArray(r)))throw new Error("Invalid PI WEB plugin settings field");return[t,i]}))}}function Zc(e){const t=y(e);return{host:D(t,"host"),port:D(t,"port"),allowedHosts:D(t,"allowedHosts"),spawnSessions:D(t,"spawnSessions"),subsessions:D(t,"subsessions")}}function Xc(e){const t=y(e);return{plugins:j(Yc)(t.plugins)}}function Yc(e){const t=y(e);return{id:m(t,"id"),module:m(t,"module"),source:m(t,"source"),scope:ed(t.scope),machineSpecific:cd(t.machineSpecific,"machineSpecific")??!1,enabled:D(t,"enabled")}}function ed(e){if(e!=="bundled"&&e!=="local"&&e!=="user"&&e!=="project")throw new Error("Invalid PI WEB plugin scope");return e}function td(e){const t=y(e);return{packageName:m(t,"packageName"),generatedAt:m(t,"generatedAt"),components:sd(t.components),release:od(t.release),commands:nd(t.commands),messages:j(ad)(t.messages)}}function id(e){const t=y(e);return{packageName:m(t,"packageName"),generatedAt:m(t,"generatedAt"),components:va(t.components),capabilities:gr(t.capabilities)}}function sd(e){const t=y(e);return{web:Ci(t.web),sessiond:Ci(t.sessiond)}}function va(e){const t=y(e);return{web:vo(t.web),sessiond:vo(t.sessiond)}}function vo(e){const t=y(e);return{component:ba(t.component),label:m(t,"label"),...b("runtimeVersion",$(t,"runtimeVersion")),available:D(t,"available"),capabilities:gr(t.capabilities),...b("error",$(t,"error"))}}function Ci(e){const t=y(e);return{component:ba(t.component),label:m(t,"label"),...b("runtimeVersion",$(t,"runtimeVersion")),...b("installedVersion",$(t,"installedVersion")),stale:D(t,"stale"),available:D(t,"available"),...b("installation",rd(t.installation)),...b("error",$(t,"error"))}}function rd(e){if(e===void 0)return;const t=y(e),i=m(t,"kind");if(i!=="pi-package"&&i!=="npm-global"&&i!=="local"&&i!=="unknown")throw new Error("Invalid PI WEB installation kind");const s=t.scope;if(s!==void 0&&s!=="user"&&s!=="project")throw new Error("Invalid PI WEB installation scope");return{kind:i,...b("path",$(t,"path")),...b("source",$(t,"source")),...s===void 0?{}:{scope:s},...b("npmRoot",$(t,"npmRoot"))}}function od(e){const t=y(e);return{packageName:m(t,"packageName"),...b("latestVersion",$(t,"latestVersion")),updateAvailable:D(t,"updateAvailable"),...b("checkedAt",$(t,"checkedAt")),...t.skipped===!0?{skipped:!0}:{},...b("error",$(t,"error"))}}function nd(e){const t=y(e);return{...b("update",$(t,"update")),...b("restart",$(t,"restart")),...b("restartWeb",$(t,"restartWeb")),...b("restartSessiond",$(t,"restartSessiond")),...b("status",$(t,"status"))}}function ad(e){const t=y(e);return{id:m(t,"id"),severity:ld(t.severity),title:m(t,"title"),body:m(t,"body"),...b("command",$(t,"command"))}}function ba(e){if(e!=="web"&&e!=="sessiond")throw new Error("Invalid PI WEB service component");return e}function gr(e){if(!Array.isArray(e)||!e.every(Hc))throw new Error("Invalid PI WEB capabilities");return e}function ld(e){if(e!=="info"&&e!=="warning"&&e!=="error")throw new Error("Invalid PI WEB status severity");return e}function cd(e,t){if(e!==void 0){if(typeof e!="boolean")throw new Error(`Expected optional boolean field: ${t}`);return e}}function bo(e,t){const i=e[t];if(i!==void 0){if(typeof i!="boolean")throw new Error(`Invalid PI WEB ${t} field`);return i}}function dd(e){const t=y(e);return j(wa)(t.machines)}function wa(e){const t=y(e),i=ud(t,"kind"),s=$(t,"baseUrl"),r=ya(t,"status"),o=$(t,"statusMessage");return{id:m(t,"id"),name:m(t,"name"),kind:i,...s===void 0?{}:{baseUrl:s},createdAt:m(t,"createdAt"),updatedAt:m(t,"updatedAt"),...r===void 0?{}:{status:r},...o===void 0?{}:{statusMessage:o}}}function pd(e){const t=y(e),i=ya(t,"status"),s=$(t,"error");return{machineId:m(t,"machineId"),ok:D(t,"ok"),checkedAt:m(t,"checkedAt"),...i===void 0?{}:{status:i},...t.web===void 0?{}:{web:Ci(t.web)},...t.sessiond===void 0?{}:{sessiond:Ci(t.sessiond)},...s===void 0?{}:{error:s}}}function hd(e){const t=y(e),i=$(t,"error");return{machineId:m(t,"machineId"),ok:D(t,"ok"),checkedAt:m(t,"checkedAt"),...b("packageName",$(t,"packageName")),...b("generatedAt",$(t,"generatedAt")),...t.components===void 0?{}:{components:va(t.components)},...t.capabilities===void 0?{}:{capabilities:gr(t.capabilities)},...i===void 0?{}:{error:i}}}function ud(e,t){const i=m(e,t);if(i!=="local"&&i!=="remote")throw new Error(`Expected machine kind field: ${t}`);return i}function ya(e,t){const i=$(e,t);if(i!==void 0){if(i!=="unknown"&&i!=="online"&&i!=="offline"&&i!=="error")throw new Error(`Expected machine status field: ${t}`);return i}}function fd(e){if(!Array.isArray(e))throw new Error("Expected array response");return e}function kt(e,t){if(!Array.isArray(e)||!e.every(i=>typeof i=="string"))throw new Error(`Expected string array field: ${t}`);return e}function gd(e){if(Array.isArray(e))return{messages:e,start:0,total:e.length};const t=y(e);return{messages:fd(t.messages),start:q(t,"start"),total:q(t,"total")}}function wo(e){const t=y(e);return{id:m(t,"id"),name:m(t,"name"),path:m(t,"path"),createdAt:m(t,"createdAt")}}function md(e){const t=y(e),i=$(t,"branch");return{id:m(t,"id"),projectId:m(t,"projectId"),path:m(t,"path"),label:m(t,"label"),...i===void 0?{}:{branch:i},isMain:D(t,"isMain"),isGitRepo:D(t,"isGitRepo"),isGitWorktree:D(t,"isGitWorktree"),...b("effectiveConfig",vd(t.effectiveConfig))}}function vd(e){if(e!==void 0){if(!Ne(e)||Array.isArray(e))throw new Error("Invalid workspace effectiveConfig field");return{...b("uploads",sp(e.uploads))}}}function zs(e){const t=y(e);return{path:m(t,"path"),size:q(t,"size"),modifiedAt:m(t,"modifiedAt")}}function yo(e){const t=y(e);return{path:m(t,"path")}}function bd(e){const t=y(e);if(t.deleted!==!0)throw new Error("Expected deleted response");return{deleted:!0,path:m(t,"path")}}function Bs(e){const t=y(e),i=$(t,"name"),s=$(t,"parentSessionPath"),r=$(t,"archivedAt");return{id:m(t,"id"),path:m(t,"path"),cwd:m(t,"cwd"),...i===void 0?{}:{name:i},created:m(t,"created"),modified:m(t,"modified"),messageCount:q(t,"messageCount"),firstMessage:m(t,"firstMessage"),...s===void 0?{}:{parentSessionPath:s},...t.archived===!0?{archived:!0}:{},...r===void 0?{}:{archivedAt:r}}}function Mt(e){const t=y(e);return{sessionId:m(t,"sessionId"),isStreaming:D(t,"isStreaming"),isCompacting:D(t,"isCompacting"),isBashRunning:D(t,"isBashRunning"),pendingMessageCount:q(t,"pendingMessageCount"),queuedMessages:t.queuedMessages===void 0?[]:j(Pd)(t.queuedMessages),...b("messageCount",ne(t,"messageCount")),tokens:Cd(t.tokens),cost:q(t,"cost"),...Ad(t.model),...Bd(t.contextUsage),...b("thinkingLevel",$(t,"thinkingLevel"))}}function xa(e){const t=y(e),i=t.skippedBusySessionIds===void 0?void 0:kt(t.skippedBusySessionIds,"skippedBusySessionIds");return{generatedAt:m(t,"generatedAt"),thresholds:Sd(t.thresholds),projects:j(kd)(t.projects),totals:$d(t.totals),...i===void 0?{}:{skippedBusySessionIds:i}}}function wd(e){const t=y(e);return{...xa(t),archivedSessionIds:kt(t.archivedSessionIds,"archivedSessionIds"),deletedSessionIds:kt(t.deletedSessionIds,"deletedSessionIds")}}function yd(e){const t=y(e);if(t.archived!==!0)throw new Error("Expected bulk archived response");return{archived:!0,archivedSessionIds:kt(t.archivedSessionIds,"archivedSessionIds"),failures:j(Sa)(t.failures),generatedAt:m(t,"generatedAt")}}function xd(e){const t=y(e);if(t.deleted!==!0)throw new Error("Expected bulk deleted response");return{deleted:!0,deletedSessionIds:kt(t.deletedSessionIds,"deletedSessionIds"),failures:j(Sa)(t.failures),generatedAt:m(t,"generatedAt")}}function Sa(e){const t=y(e);return{sessionId:m(t,"sessionId"),error:m(t,"error")}}function Sd(e){const t=y(e);return{...b("archiveIdleDays",ne(t,"archiveIdleDays")),...b("deleteArchivedDays",ne(t,"deleteArchivedDays"))}}function kd(e){const t=y(e);return{cwd:m(t,"cwd"),archiveCount:q(t,"archiveCount"),deleteCount:q(t,"deleteCount")}}function $d(e){const t=y(e);return{archiveCount:q(t,"archiveCount"),deleteCount:q(t,"deleteCount")}}function Pd(e){const t=y(e),i=m(t,"kind");if(i!=="steer"&&i!=="followUp")throw new Error("Invalid queued message kind");return{kind:i,text:m(t,"text"),...b("imageCount",ne(t,"imageCount"))}}function Cd(e){const t=y(e);return{input:q(t,"input"),output:q(t,"output"),cacheRead:q(t,"cacheRead"),cacheWrite:q(t,"cacheWrite"),total:q(t,"total")}}function ka(e){const t=y(e);return{...b("provider",$(t,"provider")),...b("id",$(t,"id")),...b("name",$(t,"name")),...b("contextWindow",ne(t,"contextWindow")),...b("reasoning",t.reasoning),...b("input",Id(t.input))}}function Id(e){if(e!==void 0){if(!Array.isArray(e))throw new Error("Invalid model input");return e.map(Rd)}}function Rd(e){if(e==="text"||e==="image")return e;throw new Error("Invalid model input")}function Ad(e){return e===void 0?{}:{model:ka(e)}}function Td(e){const t=y(e);return{models:j(ka)(t.models)}}function Md(e){if(typeof e!="string")throw new Error("Invalid thinking level");return e}function Ed(e){const t=y(e);return{levels:j(Md)(t.levels)}}function Dd(e){if(e!=="oauth"&&e!=="api_key")throw new Error("Invalid auth type");return e}function Wd(e){if(e!=="stored"&&e!=="runtime"&&e!=="environment"&&e!=="fallback"&&e!=="models_json_key"&&e!=="models_json_command")throw new Error("Invalid auth status source");return e}function Od(e){const t=y(e),i=t.source===void 0?void 0:Wd(t.source);return{configured:D(t,"configured"),...b("source",i),...b("label",$(t,"label"))}}function _d(e){const t=y(e);return{id:m(t,"id"),name:m(t,"name"),authType:Dd(t.authType),status:Od(t.status)}}function Ld(e){const t=y(e);return{providers:j(_d)(t.providers)}}function ii(e){const t=y(e);return{flowId:m(t,"flowId"),providerId:m(t,"providerId"),providerName:m(t,"providerName"),status:jd(t.status),progress:j(s=>{if(typeof s!="string")throw new Error("Expected progress item string");return s})(t.progress),...b("error",$(t,"error")),...b("auth",Fd(t.auth)),...b("prompt",Ud(t.prompt)),...b("select",zd(t.select))}}function jd(e){if(e!=="running"&&e!=="complete"&&e!=="error"&&e!=="cancelled")throw new Error("Invalid OAuth flow status");return e}function Fd(e){if(e===void 0)return;const t=y(e);return{url:m(t,"url"),...b("instructions",$(t,"instructions"))}}function Ud(e){if(e===void 0)return;const t=y(e),i=m(t,"kind");if(i!=="prompt"&&i!=="manual")throw new Error("Invalid OAuth prompt kind");return{requestId:m(t,"requestId"),message:m(t,"message"),kind:i,...b("placeholder",$(t,"placeholder")),...t.allowEmpty===!0?{allowEmpty:!0}:{}}}function zd(e){if(e===void 0)return;const t=y(e);return{requestId:m(t,"requestId"),message:m(t,"message"),options:j(Pa)(t.options)}}function Bd(e){if(e===void 0)return{};const t=y(e);return{contextUsage:{tokens:$o(t,"tokens"),contextWindow:q(t,"contextWindow"),percent:$o(t,"percent")}}}function Nd(e){const t=y(e),i=m(t,"source");if(i!=="extension"&&i!=="prompt"&&i!=="skill"&&i!=="builtin")throw new Error("Invalid command source");return{name:m(t,"name"),source:i,...b("description",$(t,"description"))}}function Ns(e){const t=y(e),i=m(t,"kind");if(i!=="tracked"&&i!=="untracked"&&i!=="other")throw new Error("Invalid file kind");return{path:m(t,"path"),kind:i}}function Hd(e){const t=y(e);return{path:m(t,"path"),entries:j(qd)(t.entries),scannedAt:m(t,"scannedAt"),truncated:D(t,"truncated")}}function qd(e){const t=y(e),i=m(t,"type");if(i!=="file"&&i!=="directory"&&i!=="symlink")throw new Error("Invalid file tree entry type");return{name:m(t,"name"),path:m(t,"path"),type:i,...b("size",ne(t,"size")),...b("modifiedAt",$(t,"modifiedAt"))}}function Kd(e){const t=y(e),i=m(t,"encoding");if(i!=="utf8")throw new Error("Invalid file encoding");return{path:m(t,"path"),...b("language",$(t,"language")),...b("mediaType",Jd(t.mediaType)),...b("mimeType",$(t,"mimeType")),encoding:i,size:q(t,"size"),modifiedAt:m(t,"modifiedAt"),content:m(t,"content"),truncated:D(t,"truncated"),binary:D(t,"binary")}}function $a(e){const t=y(e);return{path:m(t,"path"),size:q(t,"size"),modifiedAt:m(t,"modifiedAt"),created:D(t,"created")}}function Vd(e){const t=y(e);return{path:m(t,"path"),existed:D(t,"existed")}}function Gd(e){const t=y(e);return{fromPath:m(t,"fromPath"),toPath:m(t,"toPath"),size:q(t,"size"),modifiedAt:m(t,"modifiedAt")}}function Jd(e){if(e!==void 0){if(e!=="image")throw new Error("Invalid file media type");return e}}function Qd(e){const t=y(e);return{isGitRepo:D(t,"isGitRepo"),hash:m(t,"hash"),...b("branch",$(t,"branch")),...b("upstream",$(t,"upstream")),...b("ahead",ne(t,"ahead")),...b("behind",ne(t,"behind")),files:j(Zd)(t.files)}}function Zd(e){const t=y(e);return{path:m(t,"path"),...b("oldPath",$(t,"oldPath")),index:xo(t.index),workingTree:xo(t.workingTree)}}function xo(e){switch(e){case"unmodified":case"modified":case"added":case"deleted":case"renamed":case"copied":case"untracked":case"ignored":case"conflicted":return e;default:throw new Error("Invalid git file state")}}function Xd(e){const t=y(e);return{...b("path",$(t,"path")),staged:D(t,"staged"),hash:m(t,"hash"),diff:m(t,"diff"),truncated:D(t,"truncated")}}function fs(e){const t=y(e);return{id:m(t,"id"),cwd:m(t,"cwd"),name:m(t,"name"),createdAt:m(t,"createdAt"),exited:D(t,"exited"),...b("exitCode",ne(t,"exitCode")),...b("commandRunId",$(t,"commandRunId"))}}function Nt(e){const t=y(e);return{id:m(t,"id"),origin:m(t,"origin"),projectId:m(t,"projectId"),workspaceId:m(t,"workspaceId"),terminalId:m(t,"terminalId"),title:m(t,"title"),command:m(t,"command"),status:Yd(t.status),...b("exitCode",ne(t,"exitCode")),createdAt:m(t,"createdAt"),...b("startedAt",$(t,"startedAt")),...b("completedAt",$(t,"completedAt")),metadata:ep(t.metadata,"metadata")}}function Yd(e){if(e!=="queued"&&e!=="running"&&e!=="succeeded"&&e!=="failed")throw new Error("Invalid terminal command run status");return e}function ep(e,t){const i=y(e);return Object.fromEntries(Object.entries(i).map(([s,r])=>{if(typeof r!="string")throw new Error(`Expected string record field: ${t}.${s}`);return[s,r]}))}function tp(e){const t=y(e);return{cwd:m(t,"cwd"),hasSessionActivity:D(t,"hasSessionActivity"),hasTerminalActivity:D(t,"hasTerminalActivity"),updatedAt:m(t,"updatedAt")}}function ip(e){const t=y(e);return{workspaces:j(tp)(t.workspaces),generatedAt:m(t,"generatedAt")}}function sp(e){if(e!==void 0){if(!Ne(e)||Array.isArray(e))throw new Error("Invalid uploads field");return{...b("defaultFolder",$(e,"defaultFolder"))}}}function So(e){const t=y(e),i=m(t,"type");if(i==="unsupported")return{type:i,message:m(t,"message")};if(i==="select")return{type:i,requestId:m(t,"requestId"),title:m(t,"title"),options:j(Pa)(t.options)};if(i==="done")return{type:i,...b("message",$(t,"message")),...rp(t.session),...b("promptDraft",$(t,"promptDraft"))};throw new Error("Invalid command result type")}function Pa(e){const t=y(e);return{value:m(t,"value"),label:m(t,"label"),...b("description",$(t,"description"))}}function rp(e){return e===void 0?{}:{session:Bs(e)}}function si(e){return{accepted:et(e,"accepted")}}function op(e){const t=y(e);return j(np)(t.attachments)}function np(e){const t=y(e);return{path:m(t,"path"),mimeType:m(t,"mimeType"),size:q(t,"size")}}function Hs(e){return{closed:et(e,"closed")}}function ap(e){return{aborted:et(e,"aborted")}}function lp(e){return{stopped:et(e,"stopped")}}function ko(e){const t=y(e);if(t.archived!==!0)throw new Error("Expected archived response");const i=t.sessionIds===void 0?void 0:kt(t.sessionIds,"sessionIds"),s=ne(t,"archivedCount"),r=ne(t,"skippedAlreadyArchivedCount");return{archived:!0,...i===void 0?{}:{sessionIds:i},...s===void 0?{}:{archivedCount:s},...r===void 0?{}:{skippedAlreadyArchivedCount:r}}}function cp(e){return{restored:et(e,"restored")}}function dp(e){return{deleted:et(e,"deleted")}}function pp(e){return{detached:et(e,"detached")}}function hp(e){return{reloaded:et(e,"reloaded")}}function $o(e,t){const i=e[t];if(i===null)return null;if(typeof i!="number")throw new Error(`Expected number|null field: ${t}`);return i}function up(e){return typeof e=="string"?e:e.id}function fp(e){return typeof e=="string"?void 0:e.cwd}function gp(e,t,i,s){const r=new URLSearchParams;s?.path!==void 0&&r.set("path",s.path),s?.staged===!0&&r.set("staged","true");const o=r.toString();return`/api/machines/${encodeURIComponent(e)}/projects/${encodeURIComponent(t)}/workspaces/${encodeURIComponent(i)}/git/diff${o?`?${o}`:""}`}function mp(e,t,i="local"){const s=new URLSearchParams,r=fp(e);r!==void 0&&r!==""&&s.set("cwd",r),t?.limit!==void 0&&s.set("limit",String(t.limit)),t?.before!==void 0&&s.set("before",String(t.before));const o=s.toString();return`/api/machines/${encodeURIComponent(i)}/sessions/${encodeURIComponent(up(e))}/messages${o===""?"":`?${o}`}`}function vp(e,t,i,s){const r=new URLSearchParams({path:i});return s?.createDirs===!1&&r.set("createDirs","false"),s?.overwrite===!1&&r.set("overwrite","false"),`${`/api/machines/${encodeURIComponent(s?.machineId??"local")}`}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file?${r.toString()}`}function bp(e,t,i,s){const r=new URLSearchParams;return r.set("path",i),s?.modifiedAt!==void 0&&r.set("v",s.modifiedAt),`${`/api/machines/${encodeURIComponent(s?.machineId??"local")}`}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file/preview?${r.toString()}`}function Ca(e,t,i,s){const r=new URLSearchParams;r.set("path",i);const o=`/api/machines/${encodeURIComponent(s?.machineId??"local")}`;return ma(`${o}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file/download?${r.toString()}`)}const C=(e="local")=>`/api/machines/${encodeURIComponent(e)}`;function Ia(e){return typeof e=="string"?e:e.id}function mr(e){return typeof e=="string"?void 0:e.cwd}function Ra(e,t="local"){return`${C(t)}/sessions/${encodeURIComponent(Ia(e))}`}function G(e,t,i="local"){return`${Ra(e,i)}/${t}`}function ri(e,t,i="local"){return`${G(e,t,i)}${Aa(e)}`}function wp(e,t="local"){return`${Ra(e,t)}${Aa(e)}`}function Aa(e){const t=mr(e);return t===void 0||t===""?"":`?${new URLSearchParams({cwd:t}).toString()}`}function Q(e,t={}){const i=mr(e);return JSON.stringify(i===void 0||i===""?t:{cwd:i,...t})}function Po(e){return JSON.stringify({sessions:e.map(yp)})}function yp(e){const t=Ia(e),i=mr(e);return i===void 0||i===""?{id:t}:{id:t,cwd:i}}const Ta={piWebStatus:(e="local")=>v(e==="local"?"/api/pi-web/status":`${C(e)}/pi-web/status`,td),piWebRuntime:()=>v("/api/pi-web/runtime",id)},xp={machines:()=>v("/api/machines",dd),addMachine:e=>v("/api/machines",wa,{method:"POST",body:JSON.stringify(e)}),deleteMachine:e=>v(`/api/machines/${encodeURIComponent(e)}`,t=>t,{method:"DELETE"}),health:e=>v(`/api/machines/${encodeURIComponent(e)}/health`,pd),runtime:e=>v(`/api/machines/${encodeURIComponent(e)}/runtime`,hd)},Ii={config:()=>v("/api/config",go),saveConfig:e=>v("/api/config",go,{method:"PUT",body:JSON.stringify({config:e})})},qs={plugins:()=>v("/api/plugins",Xc)},Ma={workspaceActivity:(e="local")=>v(`${C(e)}/activity`,ip)},Sp={projects:(e="local")=>v(`${C(e)}/projects`,j(wo)),addProject:(e,t,i,s="local")=>v(`${C(s)}/projects`,wo,{method:"POST",body:JSON.stringify({path:e,name:t,create:i})}),closeProject:(e,t="local")=>v(`${C(t)}/projects/${encodeURIComponent(e)}`,Hs,{method:"DELETE"}),projectDirectories:(e,t="local")=>v(`${C(t)}/project-directories?q=${encodeURIComponent(e)}`,j(Ns))},wt={workspaces:(e,t="local")=>v(`${C(t)}/projects/${e}/workspaces`,j(md)),deleteWorkspace:(e,t,i="local")=>v(`${C(i)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}`,Nt,{method:"DELETE"}),workspaceTree:(e,t,i="",s="local")=>v(`${C(s)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/tree?path=${encodeURIComponent(i)}`,Hd),workspaceFile:(e,t,i,s="local")=>v(`${C(s)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file?path=${encodeURIComponent(i)}`,Kd),uploadWorkspaceFile:async(e,t,i,s,r="local")=>r==="local"?Ip(e,t,i,s):v(`${C(r)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file`,zs,{method:"POST",body:JSON.stringify({path:i,contentBase64:await Pp(s)})}),createWorkspaceFile:(e,t,i,s="local")=>v(`${C(s)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file`,zs,{method:"POST",body:JSON.stringify({path:i,contentBase64:""})}),writeWorkspaceFile:(e,t,i,s,r,o="local")=>{const n=new URLSearchParams({path:i});r?.createDirs===!1&&n.set("createDirs","false"),r?.overwrite===!1&&n.set("overwrite","false");const a=s instanceof Uint8Array,c=a?new Uint8Array(s):new TextEncoder().encode(s);return v(`${C(o)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file?${n.toString()}`,$a,{method:"PUT",body:c,headers:{"Content-Type":a?"application/octet-stream":"text/plain"}})},deleteWorkspaceFile:(e,t,i,s="local")=>{const r=new URLSearchParams({path:i});return v(`${C(s)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file?${r.toString()}`,Vd,{method:"DELETE"})},moveWorkspaceFile:(e,t,i,s,r,o="local")=>{const n=new URLSearchParams({fromPath:i,toPath:s});return r?.createDirs===!1&&n.set("createDirs","false"),r?.overwrite===!0&&n.set("overwrite","true"),v(`${C(o)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file/move?${n.toString()}`,Gd,{method:"POST"})},createWorkspaceDirectory:(e,t,i,s="local")=>v(`${C(s)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/directory`,yo,{method:"POST",body:JSON.stringify({path:i})}),moveWorkspaceDirectory:(e,t,i,s,r="local")=>v(`${C(r)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/directory`,yo,{method:"PATCH",body:JSON.stringify({fromPath:i,toPath:s})}),deleteWorkspaceDirectory:(e,t,i,s="local")=>v(`${C(s)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/directory?path=${encodeURIComponent(i)}`,bd,{method:"DELETE"}),workspaceDownloadUrl:(e,t,i,s="local")=>Ca(e,t,i,{machineId:s}),downloadWorkspaceFile:(e,t,i,s="local")=>Rp(e,t,i,s)},Ks={sessions:(e,t="local")=>v(`${C(t)}/sessions?cwd=${encodeURIComponent(e)}`,j(Bs)),startSession:(e,t="local")=>v(`${C(t)}/sessions`,Bs,{method:"POST",body:JSON.stringify({cwd:e})}),cleanupPreview:(e,t="local")=>v(`${C(t)}/sessions/cleanup/preview`,xa,{method:"POST",body:JSON.stringify(e)}),cleanup:(e,t="local")=>v(`${C(t)}/sessions/cleanup`,wd,{method:"POST",body:JSON.stringify(e)}),archiveMany:(e,t="local")=>v(`${C(t)}/sessions/bulk/archive`,yd,{method:"POST",body:Po(e)}),deleteArchivedMany:(e,t="local")=>v(`${C(t)}/sessions/bulk/delete-archived`,xd,{method:"POST",body:Po(e)}),messages:(e,t,i="local")=>v(mp(e,t,i),gd),status:(e,t="local")=>v(ri(e,"status",t),Mt),models:(e,t="local")=>v(ri(e,"models",t),Td),setModel:(e,t,i,s="local")=>v(G(e,"model",s),Mt,{method:"POST",body:Q(e,{provider:t,modelId:i})}),cycleModel:(e,t,i="local")=>v(G(e,"model/cycle",i),Mt,{method:"POST",body:Q(e,{direction:t})}),thinkingLevels:(e,t="local")=>v(ri(e,"thinking-levels",t),Ed),setThinkingLevel:(e,t,i="local")=>v(G(e,"thinking-level",i),Mt,{method:"POST",body:Q(e,{level:t})}),cycleThinkingLevel:(e,t="local")=>v(G(e,"thinking-level/cycle",t),Mt,{method:"POST",body:Q(e)}),commands:(e,t="local")=>v(ri(e,"commands",t),j(Nd)),prompt:(e,t,i,s="local",r)=>v(G(e,"prompt",s),si,{method:"POST",body:Q(e,{text:t,...i===void 0?{}:{streamingBehavior:i},...r!==void 0&&r.length>0?{attachments:r}:{}})}),saveAttachments:(e,t,i="local",s)=>v(G(e,"attachments",i),op,{method:"POST",body:Q(e,{attachments:t,...s===void 0?{}:{folder:s}})}),shell:(e,t,i="local")=>v(G(e,"shell",i),si,{method:"POST",body:Q(e,{text:t})}),runCommand:(e,t,i="local")=>v(G(e,"commands/run",i),So,{method:"POST",body:Q(e,{text:t})}),respondToCommand:(e,t,i,s="local")=>v(G(e,"commands/respond",s),So,{method:"POST",body:Q(e,{requestId:t,value:i})}),abort:(e,t="local")=>v(G(e,"abort",t),ap,{method:"POST",body:Q(e)}),stop:(e,t="local")=>v(G(e,"stop",t),lp,{method:"POST",body:Q(e)}),archive:(e,t="local")=>v(G(e,"archive",t),ko,{method:"POST",body:Q(e)}),archiveWithDescendants:(e,t="local")=>v(G(e,"archive-tree",t),ko,{method:"POST",body:Q(e)}),restore:(e,t="local")=>v(G(e,"restore",t),cp,{method:"POST",body:Q(e)}),deleteArchived:(e,t="local")=>v(wp(e,t),dp,{method:"DELETE"}),detachParent:(e,t="local")=>v(G(e,"detach-parent",t),pp,{method:"POST",body:Q(e)}),reloadSession:(e,t="local")=>v(G(e,"reload",t),hp,{method:"POST",body:Q(e)}),authProviders:e=>{const t=new URLSearchParams;e?.mode!==void 0&&t.set("mode",e.mode),e?.authType!==void 0&&t.set("authType",e.authType);const i=t.toString();return v(`${C(e?.machineId)}/auth/providers${i===""?"":`?${i}`}`,Ld)},saveApiKey:(e,t,i="local")=>v(`${C(i)}/auth/api-key`,si,{method:"POST",body:JSON.stringify({providerId:e,key:t})}),logoutProvider:(e,t="local")=>v(`${C(t)}/auth/logout`,si,{method:"POST",body:JSON.stringify({providerId:e})}),startOAuthLogin:(e,t="local")=>v(`${C(t)}/auth/oauth`,ii,{method:"POST",body:JSON.stringify({providerId:e})}),oauthFlow:(e,t="local")=>v(`${C(t)}/auth/oauth/${encodeURIComponent(e)}`,ii),respondOAuthFlow:(e,t,i,s="local")=>v(`${C(s)}/auth/oauth/${encodeURIComponent(e)}/respond`,ii,{method:"POST",body:JSON.stringify({requestId:t,value:i})}),cancelOAuthFlow:(e,t="local")=>v(`${C(t)}/auth/oauth/${encodeURIComponent(e)}/cancel`,ii,{method:"POST"})},yt={terminals:(e,t,i="local")=>v(`${C(i)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/terminals`,j(fs)),startTerminal:(e,t,i,s="local")=>v(`${C(s)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/terminals`,fs,{method:"POST",body:JSON.stringify(i??{})}),closeWorkspaceTerminals:(e,t,i="local")=>v(`${C(i)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/terminals`,Hs,{method:"DELETE"}),closeTerminal:(e,t,i,s="local")=>v(`${C(s)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/terminals/${encodeURIComponent(i)}`,Hs,{method:"DELETE"}),continueTerminal:(e,t,i,s="local")=>v(`${C(s)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/terminals/${encodeURIComponent(i)}/continue`,fs,{method:"POST"}),runTerminalCommand:(e,t,i="local")=>v(`${C(i)}/projects/${encodeURIComponent(t.workspace.projectId)}/workspaces/${encodeURIComponent(t.workspace.id)}/terminal-command-runs`,Nt,{method:"POST",body:JSON.stringify({origin:e,title:t.title,command:t.command,metadata:t.metadata??{}})}),listCommandRuns:(e,t="local")=>v(`${C(t)}/terminal-command-runs${$p(e)}`,j(Nt)),getCommandRun:(e,t="local")=>kp(e,t),cancelCommandRun:(e,t="local")=>v(`${C(t)}/terminal-command-runs/${encodeURIComponent(e)}/cancel`,Nt,{method:"POST"})};async function kp(e,t){const i=await fetch(`${C(t)}/terminal-command-runs/${encodeURIComponent(e)}`);if(i.status!==404){if(!i.ok){const s=await i.json().catch(()=>({}));throw new Error(vr(s)??i.statusText)}return Nt(await i.json())}}function $p(e){if(e===void 0)return"";const t=new URLSearchParams;e.projectId!==void 0&&t.set("projectId",e.projectId),e.workspaceId!==void 0&&t.set("workspaceId",e.workspaceId),e.terminalId!==void 0&&t.set("terminalId",e.terminalId),e.statuses!==void 0&&e.statuses.length>0&&t.set("statuses",e.statuses.join(",")),e.metadata!==void 0&&Object.keys(e.metadata).length>0&&t.set("metadata",JSON.stringify(e.metadata));const i=t.toString();return i===""?"":`?${i}`}function vr(e){if(!Ap(e))return;const t=e.error;return typeof t=="string"?t:void 0}async function Pp(e){return Cp(await e.arrayBuffer())}function Cp(e){const t=new Uint8Array(e);let i="";for(const s of t)i+=String.fromCharCode(s);return btoa(i)}async function Ip(e,t,i,s){const r=new FormData;r.set("path",i),r.set("file",s,s.name);const o=await fetch(`${C("local")}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file`,{method:"POST",body:r});if(!o.ok){const n=await o.json().catch(()=>({}));throw new Error(vr(n)??o.statusText)}return zs(await o.json())}async function Rp(e,t,i,s){const r=await fetch(Ca(e,t,i,{machineId:s}));if(!r.ok){const p=await r.json().catch(()=>({}));throw new Error(vr(p)??r.statusText)}const o=await r.blob(),n=URL.createObjectURL(o),a=document.createElement("a");a.href=n;const c=i.split("/").pop();a.download=c===void 0||c===""?"download":c,document.body.append(a),a.click(),a.remove(),URL.revokeObjectURL(n)}function Ap(e){return typeof e=="object"&&e!==null}const Tp={files:(e,t,i={})=>{const s=new URLSearchParams({q:t});return i.kind!==void 0&&s.set("kind",i.kind),i.mode!==void 0&&s.set("mode",i.mode),i.scope!==void 0&&s.set("scope",i.scope),i.workspaceScoped===!0&&i.projectId!==void 0&&i.workspaceId!==void 0?v(`${C(i.machineId)}/projects/${encodeURIComponent(i.projectId)}/workspaces/${encodeURIComponent(i.workspaceId)}/files?${s.toString()}`,j(Ns)):(s.set("cwd",e),v(`${C(i.machineId)}/files?${s.toString()}`,j(Ns)))}},Mp={gitStatus:(e,t,i="local")=>v(`${C(i)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/git/status`,Qd),gitDiff:(e,t,i,s="local")=>v(gp(s,e,t,i),Xd)},N={...Ta,...xp,...Ii,...qs,...Ma,...Sp,...wt,...Ks,...yt,...Tp,...Mp};function Ep(e,t="local"){const i=typeof e=="string"?void 0:e.cwd,s=i===void 0||i===""?"":`?${new URLSearchParams({cwd:i}).toString()}`,r=typeof e=="string"?e:e.id;return new WebSocket(`${wr()}${br(t)}/sessions/${encodeURIComponent(r)}/events${s}`)}function nx(e,t,i,s,r="local"){const o=s===void 0?"":`?cols=${encodeURIComponent(String(s.cols))}&rows=${encodeURIComponent(String(s.rows))}`;return new WebSocket(`${wr()}${br(r)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/terminals/${encodeURIComponent(i)}/socket${o}`)}function Dp(e="local"){return new WebSocket(`${wr()}${br(e)}/events`)}function br(e){return`/api/machines/${encodeURIComponent(e)}`}function wr(){return`${location.protocol==="https:"?"wss:":"ws:"}//${location.host}`}const Ea=".pi-web/uploads";class Ji extends Error{constructor(t="Workspace upload cancelled"){super(t),this.name="WorkspaceUploadCancelledError"}}class Da extends Error{constructor(t,i){super(zp(t)),this.name="WorkspaceUploadBatchError",this.failures=t.map(s=>({...s})),this.responses=i.map(s=>({...s}))}}function Co(e){return e?.uploads?.defaultFolder??Ea}function Wp(e,t){return e?.uploads?.defaultFolder??t}function yr(e,t){const i=Io(e,"upload destination",{allowEmpty:!0}),s=Io(t,"upload file name",{allowEmpty:!1});return i===""?s:`${i}/${s}`}function Op(e,t,i,s={}){const r=s.xhrFactory?.()??new XMLHttpRequest;let o=!1,n=!1;return{promise:new Promise((c,p)=>{const u=g=>{o||(o=!0,p(g))},h=g=>{o||(o=!0,c(g))};r.open("PUT",vp(e,t,i.path,jp(s)),!0),r.responseType="json",r.setRequestHeader("Content-Type",(i.contentType??i.file.type)||"application/octet-stream"),r.upload.onprogress=g=>{s.onProgress?.(Fp(g,i.file.size))},r.onload=()=>{if(r.status>=200&&r.status<300){try{s.onProgress?.({loaded:i.file.size,total:i.file.size,percent:1,lengthComputable:!0}),h($a(Wa(r)))}catch(g){u(g instanceof Error?g:new Error(String(g)))}return}u(new Error(qp(r)))},r.onerror=()=>{u(new Error("Workspace upload failed"))},r.onabort=()=>{u(new Ji(n?void 0:"Workspace upload aborted"))},r.send(i.file)}),cancel:()=>{o||(n=!0,r.abort())}}}function _p(e,t,i,s={}){const r=s.destinationFolder??Ea,o=i.map((h,g)=>({index:g,name:h.name,path:yr(r,h.name),loaded:0,total:h.size,percent:xr(0,h.size),lengthComputable:!0,done:!1}));let n,a=0;const c={requested:!1},p=()=>{s.onProgress?.(Up(o,a,o.every(h=>h.done)))};return{promise:(async()=>{const h=[],g=[];for(let w=0;w<i.length;w+=1){if(c.requested)throw new Ji;a=w;const P=i[w],I=o[w];if(!(P===void 0||I===void 0)){n=Op(e,t,{path:I.path,file:P},{...Lp(s),onProgress:V=>{I.total=V.total,I.loaded=Math.min(V.loaded,I.total),I.percent=V.percent,I.lengthComputable=V.lengthComputable,p()}});try{const V=await n.promise;I.loaded=I.total,I.percent=1,I.lengthComputable=!0,I.done=!0,h.push(V),p()}catch(V){if(Np(V,c))throw V;const Je=Bp(V);I.loaded=I.total,I.percent=1,I.lengthComputable=!0,I.done=!0,I.error=Je,g.push({index:w,name:P.name,path:I.path,error:Je}),p()}finally{n=void 0}}}if(g.length>0)throw new Da(g,h);return h})(),cancel:()=>{c.requested=!0,n?.cancel()}}}function Lp(e){return{...e.createDirs===void 0?{}:{createDirs:e.createDirs},...e.overwrite===void 0?{}:{overwrite:e.overwrite},...e.machineId===void 0?{}:{machineId:e.machineId},...e.xhrFactory===void 0?{}:{xhrFactory:e.xhrFactory}}}function jp(e){return{...e.createDirs===void 0?{}:{createDirs:e.createDirs},...e.overwrite===void 0?{}:{overwrite:e.overwrite},...e.machineId===void 0?{}:{machineId:e.machineId}}}function Fp(e,t){const i=e.lengthComputable?e.total:t;return{loaded:e.loaded,total:i,percent:xr(e.loaded,i),lengthComputable:e.lengthComputable}}function Up(e,t,i){const s=e.reduce((o,n)=>o+n.total,0),r=e.reduce((o,n)=>o+n.loaded,0);return{currentFileIndex:t,files:e.map(o=>({...o})),loaded:r,total:s,percent:xr(r,s),done:i}}function xr(e,t){return t<=0?e<=0?0:1:Math.max(0,Math.min(1,e/t))}function zp(e){return e.length===1?e[0]?.error??"Workspace upload failed":`${String(e.length)} files failed to upload`}function Bp(e){return e instanceof Error?e.message:String(e)}function Np(e,t){return t.requested||e instanceof Ji}function Io(e,t,i){const s=e.trim();if(s===""){if(i.allowEmpty)return"";throw new Error(`${t} must not be empty`)}if(Hp(s))throw new Error(`${t} must be workspace-relative`);const r=s.split(/[\\/]+/u).filter(o=>o!==""&&o!==".");if(r.length===0){if(i.allowEmpty)return"";throw new Error(`${t} must not be empty`)}if(r.some(o=>o===".."))throw new Error(`${t} must not contain path traversal`);return r.join("/")}function Hp(e){const t=e.replace(/\\/g,"/");return t.startsWith("/")||/^[A-Za-z]:\//u.test(t)}function Wa(e){return e.response!==void 0&&e.response!==null&&e.response!==""?e.response:e.responseText===""?{}:JSON.parse(e.responseText)}function qp(e){const t=Kp(e);return Vp(t)&&typeof t.error=="string"?t.error:e.statusText||`HTTP ${String(e.status)}`}function Kp(e){try{return Wa(e)}catch{return}}function Vp(e){return typeof e=="object"&&e!==null}function gi(){return{sessions:[],fileTree:[],expandedDirs:{},selectedFilePath:void 0,selectedFileContent:void 0,fileTreeStale:!1,gitStatus:void 0,selectedDiffPath:void 0,selectedDiff:void 0,selectedStagedDiff:void 0,gitStale:!1,selectedTerminalId:void 0,error:""}}function Gp(){return{machines:[],selectedMachine:void 0,isLoadingMachines:!1,machineStatuses:{},machineRuntimes:{},projects:[],workspaces:[],sessions:[],messages:[],messagePageStart:0,messagePageEnd:0,messagePageTotal:0,isLoadingEarlierMessages:!1,isReceivingPartialStream:!1,sendingPrompts:{},isLoadingProjects:!1,isLoadingWorkspaces:!1,selectedProject:void 0,selectedWorkspace:void 0,selectedSession:void 0,status:void 0,activity:void 0,availableThinkingLevels:[],sessionStatuses:{},sessionActivities:{},workspaceActivities:{},machineActivities:{},workspacesByProjectId:{},workspaceDeletionRuns:{},commandDialog:void 0,modelDialog:void 0,thinkingDialog:void 0,themeDialog:void 0,authDialog:void 0,actionPaletteOpen:!1,projectDialogOpen:!1,machineDialogOpen:!1,workspaceTool:"core:workspace.files",mainView:"chat",fileTree:[],expandedDirs:{},selectedFilePath:void 0,selectedFileContent:void 0,fileTreeStale:!1,workspaceUploadBatches:{},gitStatus:void 0,selectedDiffPath:void 0,selectedDiff:void 0,selectedStagedDiff:void 0,gitStale:!1,activeTerminalCount:0,selectedTerminalId:void 0,piWebStatus:void 0,error:""}}function Ye(e,t){return t?.phase==="active"||e?.isStreaming===!0||e?.isBashRunning===!0||e?.isCompacting===!0||(e?.pendingMessageCount??0)>0}function Oa(e){return e!==void 0&&(e.hasSessionActivity||e.hasTerminalActivity)}const _a="local";function gs(e,t){return`${e}:${t}`}function La(e,t){return`${e}:${t}`}function f(e){return e.selectedMachine?.id??_a}class Jp{constructor(t,i,s={}){this.getState=t,this.setState=i,this.api=s.api??Ma}async refresh(t=f(this.getState())){this.applyMachineActivitySnapshot(t,Qp(await this.api.workspaceActivity(t)))}applyWorkspaceActivity(t,i=f(this.getState())){const s=this.getState(),r=f(s)===i,o=s.machineActivities[i]??(r?s.workspaceActivities:{}),n=Zp(o,t);this.setState({machineActivities:{...s.machineActivities,[i]:n},...r?{workspaceActivities:n}:{}})}applyMachineActivitySnapshot(t,i){const s=this.getState();this.setState({machineActivities:{...s.machineActivities,[t]:i},...f(s)===t?{workspaceActivities:i}:{}})}}function Qp(e){const t={};for(const i of e.workspaces)Oa(i)&&(t[i.cwd]=i);return t}function Zp(e,t){const i={...e};return Oa(t)?(i[t.cwd]=t,i):Object.fromEntries(Object.entries(i).filter(([s])=>s!==t.cwd))}class Xp{constructor(t,i,s,r={}){this.getState=t,this.setState=i,this.applyStatus=s,this.api=r.api??N,this.pollIntervalMs=r.pollIntervalMs??1e3}dispose(){this.stopPolling()}handleSlashCommand(t){const i=Yp(t);return i===void 0?!1:(i.command==="login"?this.openLogin(i.providerId):this.openLogout(i.providerId),!0)}async openLogin(t){if(t!==void 0&&t!==""){await this.openLoginProvider(t);return}this.setState({authDialog:{step:"method"}})}async chooseLoginMethod(t){try{const{providers:i}=await this.api.authProviders({mode:"login",authType:t,machineId:f(this.getState())});this.setState({authDialog:{step:"providers",mode:"login",authType:t,providers:i}})}catch(i){this.setState({error:String(i)})}}async selectLoginProvider(t,i){const s=this.getState().authDialog;if(s?.step!=="providers")return;const r=s.providers.find(o=>o.id===t&&(i===void 0||o.authType===i));r!==void 0&&(r.authType==="oauth"?await this.startOAuth(r):this.setState({authDialog:{step:"apiKey",provider:r,value:""}}))}updateApiKey(t){const i=this.getState().authDialog;if(i?.step!=="apiKey")return;const s={...i};delete s.error,this.setState({authDialog:{...s,value:t}})}async saveApiKey(){const t=this.getState().authDialog;if(t?.step!=="apiKey")return;const i=t.value.trim();if(i===""){this.setState({authDialog:{...t,error:"API key is required"}});return}const s={...t};delete s.error,this.setState({authDialog:{...s,saving:!0}});try{await this.api.saveApiKey(t.provider.id,i,f(this.getState())),this.closeDialog(),this.refreshStatus()}catch(r){this.setState({authDialog:{...t,saving:!1,error:String(r)}})}}async openLogout(t){try{const{providers:i}=await this.api.authProviders({mode:"logout",machineId:f(this.getState())});if(t!==void 0&&t!==""){const s=i.find(r=>r.id===t);s!==void 0&&!this.rejectRemoteOAuth("logout",s)?await this.logoutProvider(s.id):s===void 0&&this.setState({error:`No stored credentials for ${t}`});return}this.setState({authDialog:{step:"logout",providers:i}})}catch(i){this.setState({error:String(i)})}}async logoutProvider(t){const i=this.getState().authDialog,s=i?.step==="logout"?i.providers.find(r=>r.id===t):void 0;if(!(s!==void 0&&this.rejectRemoteOAuth("logout",s)))try{await this.api.logoutProvider(t,f(this.getState())),this.closeDialog(),this.refreshStatus()}catch(r){this.setState({error:String(r)})}}updateOAuthInput(t){const i=this.getState().authDialog;if(i?.step!=="oauth")return;const s={...i};delete s.error,this.setState({authDialog:{...s,inputValue:t}})}async respondOAuth(t){const i=this.getState().authDialog;if(i?.step!=="oauth")return;const s=i.flow.prompt??i.flow.select;if(s===void 0)return;const r=t??i.inputValue??"",o={...i};delete o.error,this.setState({authDialog:{...o,responding:!0}});try{const n=await this.api.respondOAuthFlow(i.flow.flowId,s.requestId,r,f(this.getState()));this.updateOAuthFlow(n)}catch(n){this.setState({authDialog:{...i,responding:!1,error:String(n)}})}}async cancelOAuth(){const t=this.getState().authDialog;if(t?.step!=="oauth"){this.closeDialog();return}this.stopPolling();try{await this.api.cancelOAuthFlow(t.flow.flowId,f(this.getState()))}catch{}this.closeDialog()}closeDialog(){this.stopPolling(),this.setState({authDialog:void 0})}async openLoginProvider(t){try{const{providers:i}=await this.api.authProviders({mode:"login",machineId:f(this.getState())}),s=i.filter(o=>o.id===t);if(s.length===0){this.setState({error:`Auth provider not found: ${t}`});return}if(s.length>1){this.setState({authDialog:{step:"providers",mode:"login",providers:s}});return}const r=s[0];if(r===void 0)return;r.authType==="oauth"?await this.startOAuth(r):this.setState({authDialog:{step:"apiKey",provider:r,value:""}})}catch(i){this.setState({error:String(i)})}}async startOAuth(t){if(!this.rejectRemoteOAuth("login",t))try{const i=await this.api.startOAuthLogin(t.id,f(this.getState()));this.updateOAuthFlow(i),this.startPolling(i.flowId)}catch(i){this.setState({error:String(i)})}}rejectRemoteOAuth(t,i){const s=this.getState().selectedMachine;if(i.authType!=="oauth"||s?.kind!=="remote")return!1;const r=s.baseUrl??"that remote PI WEB instance";return this.setState({error:`OAuth ${t} for remote machines must be configured directly on ${r}.`}),!0}updateOAuthFlow(t){if(t.status==="complete"){this.stopPolling(),this.closeDialog(),this.refreshStatus();return}(t.status==="error"||t.status==="cancelled")&&this.stopPolling();const i=this.getState().authDialog,s=i?.step==="oauth"&&i.flow.flowId===t.flowId?i.inputValue??"":"",r=i?.step==="oauth"?i.flow.prompt?.requestId??i.flow.select?.requestId:void 0,o=t.prompt?.requestId??t.select?.requestId,n=r!==void 0&&r===o,a=n?s:"",c=n&&i?.step==="oauth"?i.responding===!0:!1;this.setState({authDialog:{step:"oauth",flow:t,inputValue:a,responding:c}})}startPolling(t){this.stopPolling(),this.pollTimer=window.setInterval(()=>{this.poll(t)},this.pollIntervalMs)}stopPolling(){this.pollTimer!==void 0&&(window.clearInterval(this.pollTimer),this.pollTimer=void 0)}async poll(t){const i=this.getState().authDialog;if(i?.step!=="oauth"||i.flow.flowId!==t){this.stopPolling();return}try{this.updateOAuthFlow(await this.api.oauthFlow(t,f(this.getState())))}catch(s){this.stopPolling(),this.setState({authDialog:{...i,error:String(s)}})}}async refreshStatus(){const t=this.session();if(t!==void 0)try{this.applyStatus(await this.api.status(t,f(this.getState())))}catch{}}session(){const t=this.getState().selectedSession;if(!(t===void 0||t.archived===!0))return t}}function Yp(e){const t=e.trim(),i=/^\/(login|logout)(?:\s+(\S+))?\s*$/u.exec(t);if(i===null)return;const s=i[1];if(s!=="login"&&s!=="logout")return;const r=i[2];return r===void 0||r===""?{command:s}:{command:s,providerId:r}}function Jt(e){return e.replaceAll(":",".")}function eh(e){const t=new URLSearchParams(window.location.search),i=`${e}--`,s={};for(const[r,o]of t.entries()){if(!r.startsWith(i))continue;const n=r.slice(i.length),a=s[n];a===void 0?s[n]=o:Array.isArray(a)?a.push(o):s[n]=[a,o]}return s}function ms(e,t){const i=eh(e)[t];return Array.isArray(i)?i[0]:i===""?void 0:i}function he(e,t,i,s){const r=new URL(window.location.href),o=`${e}--${t}`;if(r.searchParams.delete(o),i!=null&&i!=="")if(Array.isArray(i))for(const n of i)r.searchParams.append(o,String(n));else r.searchParams.set(o,String(i));th(r,s)}function th(e,t){const i=`${e.pathname}${e.search}${e.hash}`,s=`${window.location.pathname}${window.location.search}${window.location.hash}`;i!==s&&(t?.replace===!0?window.history.replaceState({},"",e):window.history.pushState({},"",e))}function ih(e){const t=e.files.map((s,r)=>{const o=s.size;return{index:r,name:s.name,path:yr(e.destinationFolder,s.name),size:s.size,loaded:0,total:o,percent:Ao(0,o),lengthComputable:!0,status:r===0?"uploading":"pending"}}),i=t.reduce((s,r)=>s+r.total,0);return{id:e.id,projectId:e.projectId,workspaceId:e.workspaceId,machineId:e.machineId,destinationFolder:e.destinationFolder,overwrite:e.overwrite,createDirs:e.createDirs,files:t,currentFileIndex:t.length===0?-1:0,loaded:0,total:i,percent:Ao(0,i),status:"uploading",startedAt:e.startedAt}}function sh(e,t){const i=new Map(t.files.map(r=>[r.index,r])),s=e.files.map(r=>{const o=i.get(r.index);if(o===void 0)return r;const n={...r,path:o.path,loaded:o.loaded,total:o.total,percent:o.percent,lengthComputable:o.lengthComputable,status:o.error!==void 0?"error":o.done?"completed":t.currentFileIndex===r.index?"uploading":r.status};return o.error===void 0?delete n.error:n.error=o.error,n});return{...e,files:s,currentFileIndex:t.currentFileIndex,loaded:t.loaded,total:t.total,percent:t.percent}}function rh(e,t,i){const s=e.files.map((o,n)=>{const a=t[n];return{...o,...a===void 0?{}:{path:a.path,response:a},loaded:o.total,percent:1,lengthComputable:!0,status:"completed"}}),r=Sr(s);return{...e,files:s,currentFileIndex:s.length===0?-1:s.length-1,...r,status:"completed",completedAt:i}}function oh(e,t,i){const s=e.files.map(r=>r.status==="completed"||r.status==="error"?r:r.status==="uploading"||r.index===e.currentFileIndex?{...r,status:"error",error:t}:{...r,status:"cancelled",error:"Not uploaded because an earlier file failed."});return{...e,files:s,...Sr(s),status:"error",error:t,completedAt:i}}function Ro(e,t){const i="Upload cancelled",s=e.files.map(r=>r.status==="completed"||r.status==="error"?r:{...r,status:"cancelled",error:i});return{...e,files:s,...Sr(s),status:"cancelled",error:i,completedAt:t}}function Sr(e){const t=e.reduce((i,s)=>i+s.total,0);return{loaded:t,total:t,percent:e.length===0?0:1}}function Ao(e,t){return t<=0?e<=0?0:1:Math.max(0,Math.min(1,e/t))}const oi=Jt("core:workspace.files");class nh{constructor(t,i,s,r={}){this.getState=t,this.setState=i,this.updateUrl=s,this.uploadTasks=new Map,this.uploadBatchSequence=0,this.api=r.api??N,this.uploadWorkspaceFiles=r.uploadWorkspaceFiles??_p,this.createUploadBatchId=r.createUploadBatchId??(()=>(this.uploadBatchSequence+=1,`workspace-upload-${String(this.uploadBatchSequence)}`)),this.now=r.now??(()=>new Date().toISOString())}async refreshFiles(){const t=this.getState().selectedProject,i=this.getState().selectedWorkspace;if(!(t===void 0||i===void 0))try{const s=f(this.getState()),r=await this.api.workspaceTree(t.id,i.id,"",s),o=await Promise.all(Object.keys(this.getState().expandedDirs).map(async a=>{try{const c=await this.api.workspaceTree(t.id,i.id,a,s);return[a,c.entries]}catch(c){if(To(c))return;throw c}})),n=Object.fromEntries(o.filter(a=>a!==void 0));this.setState({fileTree:r.entries,expandedDirs:n,fileTreeStale:!1,error:""})}catch(s){this.setState({error:String(s)})}}async expandDir(t){const i=this.getState().selectedProject,s=this.getState().selectedWorkspace;if(!(i===void 0||s===void 0)){if(this.getState().expandedDirs[t]!==void 0){this.setState({expandedDirs:Mo(this.getState().expandedDirs,t)});return}try{const r=await this.api.workspaceTree(i.id,s.id,t,f(this.getState()));this.setState({expandedDirs:{...this.getState().expandedDirs,[t]:r.entries},error:""})}catch(r){this.setState({error:String(r)})}}}async selectFile(t){this.setState({selectedFilePath:t,selectedFileContent:void 0,workspaceTool:"core:workspace.files",mainView:this.getState().mainView==="chat"?"chat":"core:workspace.files"}),he(oi,"file",t),this.updateUrl({replace:!0}),await this.restoreFile(t)}selectDirectory(t){this.setState({selectedFilePath:t,selectedFileContent:void 0,workspaceTool:"core:workspace.files",mainView:this.getState().mainView==="chat"?"chat":"core:workspace.files"}),he(oi,"file",void 0,{replace:!0}),this.updateUrl({replace:!0})}async restoreFile(t){const i=this.getState().selectedProject,s=this.getState().selectedWorkspace;if(!(i===void 0||s===void 0)){this.setState({selectedFilePath:t,selectedFileContent:void 0});try{const r=await this.api.workspaceFile(i.id,s.id,t,f(this.getState()));this.getState().selectedFilePath===t&&this.setState({selectedFileContent:r,error:""})}catch(r){if(this.getState().selectedFilePath!==t)return;if(To(r)){this.setState({selectedFilePath:void 0,selectedFileContent:void 0,error:""}),he(oi,"file",void 0,{replace:!0}),this.updateUrl({replace:!0});return}this.setState({error:String(r)})}}}async createFile(t){const i=this.getState().selectedProject,s=this.getState().selectedWorkspace;if(!(i===void 0||s===void 0||t===""))try{await this.api.createWorkspaceFile(i.id,s.id,t,f(this.getState())),await this.refreshFiles(),await this.selectFile(t),this.setState({error:""})}catch(r){this.setState({error:String(r)})}}async createDirectory(t){const i=this.getState().selectedProject,s=this.getState().selectedWorkspace;if(!(i===void 0||s===void 0||t===""))try{await this.api.createWorkspaceDirectory(i.id,s.id,t,f(this.getState())),await this.refreshFiles(),this.selectDirectory(t),this.setState({error:""})}catch(r){this.setState({error:String(r)})}}async moveSelectedPath(t){const i=this.getState().selectedProject,s=this.getState().selectedWorkspace,r=this.getState().selectedFilePath;if(!(i===void 0||s===void 0||r===void 0||r===""||t===""))try{const o=f(this.getState());vs(this.getState())==="directory"?(await this.api.moveWorkspaceDirectory(i.id,s.id,r,t,o),await this.refreshFiles(),this.selectDirectory(t)):(await this.api.moveWorkspaceFile(i.id,s.id,r,t,void 0,o),await this.refreshFiles(),await this.selectFile(t)),this.setState({error:""})}catch(o){this.setState({error:String(o)})}}async deleteSelectedPath(){const t=this.getState().selectedProject,i=this.getState().selectedWorkspace,s=this.getState().selectedFilePath;if(!(t===void 0||i===void 0||s===void 0||s===""))try{const r=f(this.getState());vs(this.getState())==="directory"?await this.api.deleteWorkspaceDirectory(t.id,i.id,s,r):await this.api.deleteWorkspaceFile(t.id,i.id,s,r),await this.refreshFiles(),this.clearSelection(),this.setState({error:""})}catch(r){this.setState({error:String(r)})}}async downloadSelectedFile(){const t=this.getState().selectedProject,i=this.getState().selectedWorkspace,s=this.getState().selectedFilePath;if(!(t===void 0||i===void 0||s===void 0||s===""||vs(this.getState())==="directory"))try{await this.api.downloadWorkspaceFile(t.id,i.id,s,f(this.getState())),this.setState({error:""})}catch(r){this.setState({error:String(r)})}}clearSelection(){this.setState({selectedFilePath:void 0,selectedFileContent:void 0}),he(oi,"file",void 0,{replace:!0}),this.updateUrl({replace:!0})}startWorkspaceUpload(t,i){const s=this.getState().selectedProject,r=this.getState().selectedWorkspace;if(s===void 0||r===void 0){this.setState({error:"Select a workspace before uploading files."});return}if(t.length===0)return;const o=f(this.getState()),n=i.overwrite??!1,a=i.createDirs??!0;let c;try{c=ih({id:this.createUploadBatchId(),projectId:s.id,workspaceId:r.id,machineId:o,destinationFolder:i.destinationFolder,overwrite:n,createDirs:a,files:t,startedAt:this.now()})}catch(h){this.setState({error:String(h)});return}this.setUploadBatch(c);let p;try{p=this.uploadWorkspaceFiles(s.id,r.id,t,{destinationFolder:i.destinationFolder,machineId:o,overwrite:n,createDirs:a,onProgress:h=>{this.updateUploadProgress(c.id,h)}})}catch(h){return this.failUploadBatch(c.id,h),{batchId:c.id,done:Promise.resolve()}}this.uploadTasks.set(c.id,p);const u=p.promise.then(async h=>{await this.completeUploadBatch(c.id,h,i)}).catch(async h=>{await this.handleUploadFailure(c.id,h,i)}).finally(()=>{this.uploadTasks.delete(c.id)});return{batchId:c.id,done:u}}cancelWorkspaceUpload(t){const i=this.getUploadBatch(t);i?.status==="uploading"&&(this.setUploadBatch(Ro(i,this.now())),this.uploadTasks.get(t)?.cancel())}clearWorkspaceUpload(t){this.uploadTasks.get(t)?.cancel(),this.uploadTasks.delete(t),this.setState({workspaceUploadBatches:Mo(this.getState().workspaceUploadBatches,t)})}updateUploadProgress(t,i){const s=this.getUploadBatch(t);s?.status==="uploading"&&this.setUploadBatch(sh(s,i))}async completeUploadBatch(t,i,s){const r=this.getUploadBatch(t);if(r?.status!=="uploading"||(this.setUploadBatch(rh(r,i,this.now()),{error:""}),!this.isCurrentWorkspaceBatch(r)))return;await this.refreshFiles();const o=i[0]?.path;s.selectUploadedFile!==!1&&o!==void 0&&this.isCurrentWorkspaceBatch(r)&&await this.selectFile(o)}async handleUploadFailure(t,i,s){const r=this.failUploadBatch(t,i);if(!(i instanceof Da)||i.responses.length===0||r===void 0||!this.isCurrentWorkspaceBatch(r))return;await this.refreshFiles();const o=i.responses[0]?.path;s.selectUploadedFile!==!1&&o!==void 0&&this.isCurrentWorkspaceBatch(r)&&await this.selectFile(o)}failUploadBatch(t,i){const s=this.getUploadBatch(t);if(s?.status!=="uploading")return;if(ah(i)){const n=Ro(s,this.now());return this.setUploadBatch(n),n}const r=lh(i),o=oh(s,r,this.now());return this.setUploadBatch(o,{error:r}),o}getUploadBatch(t){return this.getState().workspaceUploadBatches[t]}setUploadBatch(t,i={}){this.setState({workspaceUploadBatches:{...this.getState().workspaceUploadBatches,[t.id]:t},...i})}isCurrentWorkspaceBatch(t){const i=this.getState();return i.selectedProject?.id===t.projectId&&i.selectedWorkspace?.id===t.workspaceId&&f(i)===t.machineId}}function To(e){const t=String(e);return t.includes("Path does not exist")||t.includes("ENOENT")||t.includes("no such file or directory")}function ah(e){return e instanceof Ji}function lh(e){return e instanceof Error?e.message:String(e)}function Mo(e,t){return Object.fromEntries(Object.entries(e).filter(([i])=>i!==t))}function vs(e){const t=e.selectedFilePath;return t===void 0?"file":ch(e.fileTree,e.expandedDirs,t)?.type==="directory"?"directory":"file"}function ch(e,t,i){const s=e.find(r=>r.path===i);if(s!==void 0)return s;for(const r of Object.values(t)){const o=r.find(n=>n.path===i);if(o!==void 0)return o}}const Eo=Jt("core:workspace.git");class dh{constructor(t,i,s){this.getState=t,this.setState=i,this.updateUrl=s}dispose(){this.pollTimer!==void 0&&window.clearInterval(this.pollTimer),this.pollTimer=void 0}async refreshGit(){const t=this.getState().selectedProject,i=this.getState().selectedWorkspace;if(!(t===void 0||i===void 0))try{const s=await N.gitStatus(t.id,i.id,f(this.getState()));this.setState({gitStatus:s,gitStale:!1,error:""});const r=this.getState().selectedDiffPath;r!==void 0&&(s.files.some(o=>o.path===r)?await this.refreshDiff(r):(this.setState({selectedDiffPath:void 0,selectedDiff:void 0,selectedStagedDiff:void 0}),he(Eo,"diff",void 0,{replace:!0})))}catch(s){this.setState({error:String(s)})}}async selectDiff(t){this.setState({selectedDiffPath:t,selectedDiff:void 0,selectedStagedDiff:void 0,workspaceTool:"core:workspace.git",mainView:this.getState().mainView==="chat"?"chat":"core:workspace.git"}),he(Eo,"diff",t),this.updateUrl({replace:!0}),await this.refreshDiff(t)}async restoreDiff(t){this.setState({selectedDiffPath:t,selectedDiff:void 0,selectedStagedDiff:void 0}),await this.refreshDiff(t)}async refreshDiff(t){const i=this.getState().selectedProject,s=this.getState().selectedWorkspace;if(!(i===void 0||s===void 0))try{const[r,o]=await Promise.all([N.gitDiff(i.id,s.id,{path:t},f(this.getState())),N.gitDiff(i.id,s.id,{path:t,staged:!0},f(this.getState()))]);this.setState({selectedDiff:r,selectedStagedDiff:o,error:""})}catch(r){this.setState({error:String(r)})}}updatePolling(){this.dispose();const t=this.getState();(t.workspaceTool==="core:workspace.git"||t.mainView==="core:workspace.git")&&(this.pollTimer=window.setInterval(()=>{this.refreshGit()},8e3))}}class ph{constructor(t,i,s,r){this.getState=t,this.setState=i,this.updateUrl=s,this.projects=r}async loadMachines(t){this.setState({error:"",isLoadingMachines:!0});try{const i=await N.machines(),s=await this.selectInitialMachine(i,t),r=new Set(i.map(o=>o.id));this.setState({machines:i,selectedMachine:s,machineActivities:Do(this.getState().machineActivities,r),machineRuntimes:Do(this.getState().machineRuntimes,r)}),this.refreshMachineHealthFor(i),this.refreshMachineRuntimeFor(i)}catch(i){this.setState({error:String(i)})}finally{this.setState({isLoadingMachines:!1})}}async selectMachine(t,i={}){this.getState().selectedMachine?.id!==t.id&&(this.setState({selectedMachine:t,projects:[],workspaces:[],isLoadingWorkspaces:!1,selectedProject:void 0,selectedWorkspace:void 0,selectedSession:void 0,messages:[],messagePageStart:0,messagePageTotal:0,status:void 0,activity:void 0,sessionStatuses:{},sessionActivities:{},sendingPrompts:{},workspaceActivities:{},workspacesByProjectId:{},workspaceDeletionRuns:{},activeTerminalCount:0,...gi()}),i.updateUrl!==!1&&this.updateUrl(),await this.projects.loadProjects(),this.refreshMachineHealth(t.id),this.refreshMachineRuntime(t.id))}async addMachine(t){this.setState({error:""});try{const i=await N.addMachine(t);return this.setState({machines:[...this.getState().machines.filter(s=>s.id!==i.id),i]}),await this.selectMachine(i),i}catch(i){this.setState({error:String(i)});return}}async deleteMachine(t=this.getState().selectedMachine,i={}){if(t!==void 0){if(t.kind==="local"){this.setState({error:"The local machine cannot be removed."});return}try{const s=this.getState().selectedMachine?.id===t.id;await N.deleteMachine(t.id);const r=this.getState().machines.filter(n=>n.id!==t.id),o=r.find(n=>n.id==="local")??r[0];return this.setState({machines:r,machineStatuses:bs(this.getState().machineStatuses,t.id),machineRuntimes:bs(this.getState().machineRuntimes,t.id),machineActivities:bs(this.getState().machineActivities,t.id)}),s&&o!==void 0?(i.selectFallback===!1||await this.selectMachine(o),o):void 0}catch(s){this.setState({error:String(s)});return}}}async refreshMachineHealth(t=this.getState().selectedMachine?.id??"local"){try{const i=await N.health(t);return this.setState({machineStatuses:{...this.getState().machineStatuses,[i.machineId]:i}}),i}catch(i){this.setState({error:String(i)});return}}async refreshMachineRuntime(t=this.getState().selectedMachine?.id??"local"){try{const i=await N.runtime(t);this.setState({machineRuntimes:{...this.getState().machineRuntimes,[i.machineId]:i}})}catch(i){this.setState({error:String(i)})}}async selectInitialMachine(t,i){const s=t.find(o=>o.id===(i??"local"));if(s===void 0)return this.localMachine(t);if(s.kind!=="remote")return s;const r=await this.safeRemoteHealth(s);return this.setState({machineStatuses:{...this.getState().machineStatuses,[r.machineId]:r},...r.ok?{}:{error:`${s.name} is unavailable; reconnecting…`}}),s}async safeRemoteHealth(t){try{return await N.health(t.id)}catch(i){return{machineId:t.id,ok:!1,checkedAt:new Date().toISOString(),status:"offline",error:i instanceof Error?i.message:String(i)}}}localMachine(t){return t.find(i=>i.id==="local")??t[0]}async refreshMachineHealthFor(t){const i=await Promise.allSettled(t.map(r=>N.health(r.id))),s=Object.fromEntries(i.flatMap(r=>r.status==="fulfilled"?[[r.value.machineId,r.value]]:[]));Object.keys(s).length>0&&this.setState({machineStatuses:{...this.getState().machineStatuses,...s}})}async refreshMachineRuntimeFor(t){const i=await Promise.allSettled(t.map(r=>N.runtime(r.id))),s=Object.fromEntries(i.flatMap(r=>r.status==="fulfilled"?[[r.value.machineId,r.value]]:[]));Object.keys(s).length>0&&this.setState({machineRuntimes:{...this.getState().machineRuntimes,...s}})}}function bs(e,t){return Object.fromEntries(Object.entries(e).filter(([i])=>i!==t))}function Do(e,t){return Object.fromEntries(Object.entries(e).filter(([i])=>t.has(i)))}class hh{constructor(t,i,s){this.getState=t,this.setState=i,this.workspaces=s}async loadProjects(){const t=f(this.getState());this.setState({error:"",isLoadingProjects:!0});try{const i=await N.projects(t);if(f(this.getState())!==t)return;const s=new Set(i.map(o=>o.id)),r=Object.fromEntries(Object.entries(this.getState().workspacesByProjectId).filter(([o])=>s.has(o)));this.setState({projects:i,workspacesByProjectId:r})}catch(i){f(this.getState())===t&&this.setState({error:String(i)})}finally{f(this.getState())===t&&this.setState({isLoadingProjects:!1})}}async addProject(t,i){if(t.trim()!=="")try{const s=await N.addProject(t.trim(),void 0,i,f(this.getState())),r=this.getState().projects;this.setState({projects:[...r.filter(o=>o.id!==s.id),s],projectDialogOpen:!1}),await this.workspaces.selectProject(s)}catch(s){this.setState({error:String(s)})}}async closeProject(t){try{await N.closeProject(t,f(this.getState())),this.workspaces.forgetProject(t);const i=this.getState();this.setState({projects:i.projects.filter(s=>s.id!==t)}),i.selectedProject?.id===t&&this.workspaces.clearSelection()}catch(i){this.setState({error:String(i)})}}}const Vs="pi-web:cached-new-sessions:v1",uh="browserCachedNew",It="local";function Qt(){try{return typeof localStorage>"u"?void 0:localStorage}catch{return}}function Wo(e,t=It,i=Qt()){if(e.messageCount!==0||e.archived===!0)return;const s=kr(i).filter(r=>r.id!==e.id||r.machineId!==t);$r([Gs(e,t),...s],i)}function Gs(e,t=It){return{...e,browserCachedNew:!0,machineId:t}}function Oo(e,t=It,i=Qt()){const s=kr(i).filter(r=>r.id!==e||r.machineId!==t);$r(s,i)}function ja(e,t,i=It,s=Qt()){const r=new Set(t.map(c=>c.id)),o=kr(s),n=o.filter(c=>c.machineId!==i||!r.has(c.id));return n.length!==o.length&&$r(n,s),[...n.filter(c=>c.machineId===i&&c.cwd===e),...t]}function Z(e){return e===void 0?!1:mh(e)&&e.browserCachedNew===!0}function fh(e){return{id:e.id,path:e.path,cwd:e.cwd,...e.name===void 0?{}:{name:e.name},created:e.created,modified:e.modified,messageCount:e.messageCount,firstMessage:e.firstMessage,...e.parentSessionPath===void 0?{}:{parentSessionPath:e.parentSessionPath},..."machineId"in e&&typeof e.machineId=="string"?{machineId:e.machineId}:{machineId:It},...e.archived===!0?{archived:!0}:{},...e.archivedAt===void 0?{}:{archivedAt:e.archivedAt}}}function kr(e=Qt()){try{const t=e?.getItem(Vs);if(t==null||t==="")return[];const i=JSON.parse(t);return Array.isArray(i)?i.flatMap(s=>gh(s)):[]}catch{return[]}}function $r(e,t=Qt()){try{e.length===0?t?.removeItem(Vs):t?.setItem(Vs,JSON.stringify(e))}catch{}}function gh(e){if(!vh(e))return[];const t=gt(e,"id"),i=gt(e,"path"),s=gt(e,"cwd"),r=gt(e,"created"),o=gt(e,"modified"),n=gt(e,"firstMessage"),a=bh(e,"messageCount");if(t===void 0||i===void 0||s===void 0||r===void 0||o===void 0||n===void 0||a!==0)return[];const c=ws(e,"name"),p=ws(e,"parentSessionPath"),u=ws(e,"machineId")??It;return[{id:t,path:i,cwd:s,...c===void 0?{}:{name:c},created:r,modified:o,messageCount:a,firstMessage:n,...p===void 0?{}:{parentSessionPath:p},machineId:u,browserCachedNew:!0}]}function mh(e){return uh in e}function vh(e){return typeof e=="object"&&e!==null}function gt(e,t){const i=e[t];return typeof i=="string"?i:void 0}function ws(e,t){const i=e[t];return i===void 0||typeof i!="string"?void 0:i}function bh(e,t){const i=e[t];return typeof i=="number"?i:void 0}function wh(e){return Oh(e.flatMap(Pr)).filter(t=>t.parts.length>0)}function _e(e,t){return{role:e,parts:[{type:"text",text:t}]}}function Et(e,t){const i=Ih(t);return i===void 0?e:{...e,meta:i}}function yh(e,t,i){if(i==="")return e;const s=e.at(-1),r=s?.parts.at(-1);return s?.role===t&&r?.type==="text"?[...e.slice(0,-1),{...s,parts:[...s.parts.slice(0,-1),{...r,text:r.text+i}]}]:s?.role===t?[...e.slice(0,-1),{...s,parts:[...s.parts,{type:"text",text:i}]}]:[...e,_e(t,i)]}function xh(e,t){if(t==="")return e;const i=e.at(-1),s=i?.parts.at(-1);return i?.role==="assistant"&&s?.type==="thinking"?[...e.slice(0,-1),{...i,parts:[...i.parts.slice(0,-1),{...s,text:s.text+t}]}]:i?.role==="assistant"?[...e.slice(0,-1),{...i,parts:[...i.parts,{type:"thinking",text:t}]}]:[...e,{role:"assistant",parts:[{type:"thinking",text:t}]}]}function Pr(e){if(kh(e))return[e];if(_(e,"role")==="bashExecution")return[Et(Th(e),e)];const t=Mh(_(e,"role")),i=Eh(ye(e,"content"),e),s=t==="user"?$h(i):void 0;if(s!==void 0)return s.map(p=>Et(p,e));const r=Ch(e);if(t==="tool")return[Et({role:t,parts:i,...r===void 0?{}:{source:r}},e)];const o=i.filter(p=>p.type!=="empty"),n=t==="assistant"&&o.length>0&&o.every(p=>p.type==="skillRead")?"skill":t,a=o.length>0?[Et({role:n,parts:o,...r===void 0?{}:{source:r}},e)]:[],c=Sh(e);return c===void 0?a:[...a,Et(c,e)]}function Sh(e){if(_(e,"role")!=="assistant"||_(e,"stopReason")!=="error")return;const t=_(e,"errorMessage")?.trim();return _e("system",`Model response failed: ${t===void 0||t===""?"The model returned an error.":t}`)}function kh(e){const t=_(e,"role");return(t==="user"||t==="assistant"||t==="tool"||t==="system"||t==="bash"||t==="skill")&&Array.isArray(ye(e,"parts"))}function $h(e){if(e.length!==1||e[0]?.type!=="text")return;const t=Ph(e[0].text);if(t!==void 0)return[{role:"user",parts:[{type:"skillInvocation",name:t.name,location:t.location,content:t.content}]},...t.userMessage===void 0?[]:[{role:"user",parts:[{type:"text",text:t.userMessage}]}]]}function Ph(e){const t=/^<skill name="([^"]+)" location="([^"]+)">\n([\s\S]*?)\n<\/skill>(?:\n\n([\s\S]+))?$/.exec(e);if(t===null)return;const i=t[4]?.trim();return{name:t[1]??"skill",location:t[2]??"",content:t[3]??"",...i===void 0||i===""?{}:{userMessage:i}}}function Ch(e){const t=_(e,"source");if(t==="compaction"||t==="branch_summary")return t}function Ih(e){const t=Rh(ye(e,"timestamp")),i=Ah(e);if(!(t===void 0&&i===void 0))return{...t===void 0?{}:{timestamp:t},...i===void 0?{}:{model:i}}}function Rh(e){if(typeof e=="number"&&Number.isFinite(e))return new Date(e).toISOString();if(typeof e!="string"||e==="")return;const t=Date.parse(e);return Number.isFinite(t)?new Date(t).toISOString():void 0}function Ah(e){if(_(e,"role")!=="assistant")return;const t=_(e,"provider"),i=_(e,"model"),s=_(e,"responseModel");if(!((t===void 0||t==="")&&(i===void 0||i==="")&&(s===void 0||s==="")))return{...t===void 0||t===""?{}:{provider:t},...i===void 0||i===""?{}:{id:i},...s===void 0||s===""?{}:{responseId:s}}}function Th(e){const t=_(e,"command")??"",i=mi(e,"excludeFromContext")===!0?["excluded from context","",`$ ${t}`]:[`$ ${t}`],s=ye(e,"output");s!=null&&i.push("",Ai(s));const r=ye(e,"exitCode");r!=null&&i.push("",`exit ${Ai(r)}`),mi(e,"cancelled")===!0&&i.push("","cancelled"),mi(e,"truncated")===!0&&i.push("","output truncated");const o=_(e,"fullOutputPath");return o!==void 0&&o!==""&&i.push("",`full output: ${o}`),{role:"bash",parts:[{type:"text",text:i.join(`
4
+ \f\r"'\`<>=]|("|')|))|$)`,"g"),ho=/'/g,uo=/"/g,ua=/^(?:script|style|textarea|title)$/i,fa=e=>(t,...i)=>({_$litType$:e,strings:t,values:i}),l=fa(1),be=fa(2),Xe=Symbol.for("lit-noChange"),z=Symbol.for("lit-nothing"),fo=new WeakMap,at=ct.createTreeWalker(ct,129);function ga(e,t){if(!ur(e)||!e.hasOwnProperty("raw"))throw Error("invalid template strings array");return lo!==void 0?lo.createHTML(t):t}const Pc=(e,t)=>{const i=e.length-1,s=[];let r,o=t===2?"<svg>":t===3?"<math>":"",n=Tt;for(let a=0;a<i;a++){const c=e[a];let p,u,h=-1,g=0;for(;g<c.length&&(n.lastIndex=g,u=n.exec(c),u!==null);)g=n.lastIndex,n===Tt?u[1]==="!--"?n=co:u[1]!==void 0?n=po:u[2]!==void 0?(ua.test(u[2])&&(r=RegExp("</"+u[2],"g")),n=st):u[3]!==void 0&&(n=st):n===st?u[0]===">"?(n=r??Tt,h=-1):u[1]===void 0?h=-2:(h=n.lastIndex-u[2].length,p=u[1],n=u[3]===void 0?st:u[3]==='"'?uo:ho):n===uo||n===ho?n=st:n===co||n===po?n=Tt:(n=st,r=void 0);const w=n===st&&e[a+1].startsWith("/>")?" ":"";o+=n===Tt?c+kc:h>=0?(s.push(p),c.slice(0,h)+pa+c.slice(h)+Ze+w):c+Ze+(h===-2?a:w)}return[ga(e,o+(e[i]||"<?>")+(t===2?"</svg>":t===3?"</math>":"")),s]};class Kt{constructor({strings:t,_$litType$:i},s){let r;this.parts=[];let o=0,n=0;const a=t.length-1,c=this.parts,[p,u]=Pc(t,i);if(this.el=Kt.createElement(p,s),at.currentNode=this.el.content,i===2||i===3){const h=this.el.content.firstChild;h.replaceWith(...h.childNodes)}for(;(r=at.nextNode())!==null&&c.length<a;){if(r.nodeType===1){if(r.hasAttributes())for(const h of r.getAttributeNames())if(h.endsWith(pa)){const g=u[n++],w=r.getAttribute(h).split(Ze),P=/([.?@])?(.*)/.exec(g);c.push({type:1,index:o,name:P[2],strings:w,ctor:P[1]==="."?Ic:P[1]==="?"?Rc:P[1]==="@"?Ac:Gi}),r.removeAttribute(h)}else h.startsWith(Ze)&&(c.push({type:6,index:o}),r.removeAttribute(h));if(ua.test(r.tagName)){const h=r.textContent.split(Ze),g=h.length-1;if(g>0){r.textContent=Pi?Pi.emptyScript:"";for(let w=0;w<g;w++)r.append(h[w],Ht()),at.nextNode(),c.push({type:2,index:++o});r.append(h[g],Ht())}}}else if(r.nodeType===8)if(r.data===ha)c.push({type:2,index:o});else{let h=-1;for(;(h=r.data.indexOf(Ze,h+1))!==-1;)c.push({type:7,index:o}),h+=Ze.length-1}o++}}static createElement(t,i){const s=ct.createElement("template");return s.innerHTML=t,s}}function St(e,t,i=e,s){if(t===Xe)return t;let r=s!==void 0?i._$Co?.[s]:i._$Cl;const o=qt(t)?void 0:t._$litDirective$;return r?.constructor!==o&&(r?._$AO?.(!1),o===void 0?r=void 0:(r=new o(e),r._$AT(e,i,s)),s!==void 0?(i._$Co??=[])[s]=r:i._$Cl=r),r!==void 0&&(t=St(e,r._$AS(e,t.values),r,s)),t}class Cc{constructor(t,i){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=i}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:i},parts:s}=this._$AD,r=(t?.creationScope??ct).importNode(i,!0);at.currentNode=r;let o=at.nextNode(),n=0,a=0,c=s[0];for(;c!==void 0;){if(n===c.index){let p;c.type===2?p=new Ct(o,o.nextSibling,this,t):c.type===1?p=new c.ctor(o,c.name,c.strings,this,t):c.type===6&&(p=new Tc(o,this,t)),this._$AV.push(p),c=s[++a]}n!==c?.index&&(o=at.nextNode(),n++)}return at.currentNode=ct,r}p(t){let i=0;for(const s of this._$AV)s!==void 0&&(s.strings!==void 0?(s._$AI(t,s,i),i+=s.strings.length-2):s._$AI(t[i])),i++}}class Ct{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,i,s,r){this.type=2,this._$AH=z,this._$AN=void 0,this._$AA=t,this._$AB=i,this._$AM=s,this.options=r,this._$Cv=r?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const i=this._$AM;return i!==void 0&&t?.nodeType===11&&(t=i.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,i=this){t=St(this,t,i),qt(t)?t===z||t==null||t===""?(this._$AH!==z&&this._$AR(),this._$AH=z):t!==this._$AH&&t!==Xe&&this._(t):t._$litType$!==void 0?this.$(t):t.nodeType!==void 0?this.T(t):$c(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==z&&qt(this._$AH)?this._$AA.nextSibling.data=t:this.T(ct.createTextNode(t)),this._$AH=t}$(t){const{values:i,_$litType$:s}=t,r=typeof s=="number"?this._$AC(t):(s.el===void 0&&(s.el=Kt.createElement(ga(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===r)this._$AH.p(i);else{const o=new Cc(r,this),n=o.u(this.options);o.p(i),this.T(n),this._$AH=o}}_$AC(t){let i=fo.get(t.strings);return i===void 0&&fo.set(t.strings,i=new Kt(t)),i}k(t){ur(this._$AH)||(this._$AH=[],this._$AR());const i=this._$AH;let s,r=0;for(const o of t)r===i.length?i.push(s=new Ct(this.O(Ht()),this.O(Ht()),this,this.options)):s=i[r],s._$AI(o),r++;r<i.length&&(this._$AR(s&&s._$AB.nextSibling,r),i.length=r)}_$AR(t=this._$AA.nextSibling,i){for(this._$AP?.(!1,!0,i);t!==this._$AB;){const s=ao(t).nextSibling;ao(t).remove(),t=s}}setConnected(t){this._$AM===void 0&&(this._$Cv=t,this._$AP?.(t))}}let Gi=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,i,s,r,o){this.type=1,this._$AH=z,this._$AN=void 0,this.element=t,this.name=i,this._$AM=r,this.options=o,s.length>2||s[0]!==""||s[1]!==""?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=z}_$AI(t,i=this,s,r){const o=this.strings;let n=!1;if(o===void 0)t=St(this,t,i,0),n=!qt(t)||t!==this._$AH&&t!==Xe,n&&(this._$AH=t);else{const a=t;let c,p;for(t=o[0],c=0;c<o.length-1;c++)p=St(this,a[s+c],i,c),p===Xe&&(p=this._$AH[c]),n||=!qt(p)||p!==this._$AH[c],p===z?t=z:t!==z&&(t+=(p??"")+o[c+1]),this._$AH[c]=p}n&&!r&&this.j(t)}j(t){t===z?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??"")}},Ic=class extends Gi{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===z?void 0:t}},Rc=class extends Gi{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==z)}},Ac=class extends Gi{constructor(t,i,s,r,o){super(t,i,s,r,o),this.type=5}_$AI(t,i=this){if((t=St(this,t,i,0)??z)===Xe)return;const s=this._$AH,r=t===z&&s!==z||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,o=t!==z&&(s===z||r);r&&this.element.removeEventListener(this.name,this,s),o&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){typeof this._$AH=="function"?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}},Tc=class{constructor(t,i,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=i,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){St(this,t)}};const Mc={I:Ct},Ec=hr.litHtmlPolyfillSupport;Ec?.(Kt,Ct),(hr.litHtmlVersions??=[]).push("3.3.3");const Dc=(e,t,i)=>{const s=i?.renderBefore??t;let r=s._$litPart$;if(r===void 0){const o=i?.renderBefore??null;s._$litPart$=r=new Ct(t.insertBefore(Ht(),o),o,void 0,i??{})}return r._$AI(e),r};const fr=globalThis;let A=class extends bt{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const i=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=Dc(i,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return Xe}};A._$litElement$=!0,A.finalized=!0,fr.litElementHydrateSupport?.({LitElement:A});const Wc=fr.litElementPolyfillSupport;Wc?.({LitElement:A});(fr.litElementVersions??=[]).push("4.2.2");const W=e=>(t,i)=>{i!==void 0?i.addInitializer(()=>{customElements.define(e,t)}):customElements.define(e,t)};const Oc={attribute:!0,type:String,converter:$i,reflect:!1,hasChanged:pr},_c=(e=Oc,t,i)=>{const{kind:s,metadata:r}=i;let o=globalThis.litPropertyMetadata.get(r);if(o===void 0&&globalThis.litPropertyMetadata.set(r,o=new Map),s==="setter"&&((e=Object.create(e)).wrapped=!0),o.set(i.name,e),s==="accessor"){const{name:n}=i;return{set(a){const c=t.get.call(this);t.set.call(this,a),this.requestUpdate(n,c,e,!0,a)},init(a){return a!==void 0&&this.C(n,void 0,e,a),a}}}if(s==="setter"){const{name:n}=i;return function(a){const c=this[n];t.call(this,a),this.requestUpdate(n,c,e,!0,a)}}throw Error("Unsupported decorator location: "+s)};function d(e){return(t,i)=>typeof i=="object"?_c(e,t,i):((s,r,o)=>{const n=r.hasOwnProperty(o);return r.constructor.createProperty(o,s),n?Object.getOwnPropertyDescriptor(r,o):void 0})(e,t,i)}function x(e){return d({...e,state:!0,attribute:!1})}const Lc=(e,t,i)=>(i.configurable=!0,i.enumerable=!0,Reflect.decorate&&typeof t!="object"&&Object.defineProperty(e,t,i),i);function B(e,t){return(i,s,r)=>{const o=n=>n.renderRoot?.querySelector(e)??null;return Lc(i,s,{get(){return o(this)}})}}function ma(e,t=Fc()){if(t===void 0)return e;const i=jc(t);if(i===void 0)return e;const s=new URL(e,t.origin);return s.searchParams.set("embed",i.embed),s.searchParams.set("token",i.token),`${s.pathname}${s.search}${s.hash}`}function jc(e){const t=e.searchParams.get("embed"),i=e.searchParams.get("token")?.trim();if(!(t!=="management"||i===void 0||i===""))return{embed:t,token:i}}function Fc(){if(typeof globalThis.location>"u")return;const e=globalThis.location;if(typeof e.href=="string"&&e.href!=="")return new URL(e.href);const t=typeof e.protocol=="string"&&e.protocol!==""?e.protocol:"http:",i=typeof e.host=="string"&&e.host!==""?e.host:"localhost",s=typeof e.search=="string"?e.search:"";return new URL(`${t}//${i}/${s}`)}async function v(e,t,i){const s=new Headers(i?.headers);i?.body!==void 0&&!s.has("content-type")&&s.set("content-type","application/json");const r=await fetch(ma(e),{...i,headers:s});if(!r.ok){const n=await r.json().catch(()=>({}));throw new Error(Uc(n)??r.statusText)}const o=await r.json();return t(o)}function Uc(e){if(zc(e))return typeof e.error=="string"?e.error:void 0}function zc(e){return typeof e=="object"&&e!==null}function Ne(e){return typeof e=="object"&&e!==null}function y(e){if(!Ne(e))throw new Error("Expected object response");return e}function m(e,t){const i=e[t];if(typeof i!="string")throw new Error(`Expected string field: ${t}`);return i}function $(e,t){const i=e[t];if(i!==void 0){if(typeof i!="string")throw new Error(`Expected optional string field: ${t}`);return i}}function q(e,t){const i=e[t];if(typeof i!="number")throw new Error(`Expected number field: ${t}`);return i}function ne(e,t){const i=e[t];if(i!==void 0){if(typeof i!="number")throw new Error(`Expected optional number field: ${t}`);return i}}function D(e,t){const i=e[t];if(typeof i!="boolean")throw new Error(`Expected boolean field: ${t}`);return i}function j(e){return t=>{if(!Array.isArray(t))throw new Error("Expected array response");return t.map(e)}}function et(e,t){if(y(e)[t]!==!0)throw new Error(`Expected ${t} response`);return!0}function b(e,t){return t===void 0?{}:{[e]:t}}const Oe={sessionsDeleteArchived:"sessions.deleteArchived",sessionsBulkMutations:"sessions.bulkMutations",sessionsCleanup:"sessions.cleanup",sessionsReload:"sessions.reload",promptAttachments:"prompt.attachments",workspaceFileSuggestions:"workspace.fileSuggestions"},Bc=Object.values(Oe),Nc=new Set(Bc);function Hc(e){return typeof e=="string"&&Nc.has(e)}function Be(e,t){return e?.capabilities?.includes(t)===!0}function go(e){const t=y(e);return{path:m(t,"path"),exists:D(t,"exists"),config:mo(t.config),effectiveConfig:mo(t.effectiveConfig),envOverrides:Zc(t.envOverrides)}}function mo(e){const t=y(e);return{...b("host",$(t,"host")),...b("port",ne(t,"port")),...b("allowedHosts",qc(t.allowedHosts)),...b("shortcuts",Jc(t.shortcuts)),...b("plugins",Qc(t.plugins)),...b("pathAccess",Kc(t.pathAccess)),...b("uploads",Gc(t.uploads)),...b("maxUploadBytes",ne(t,"maxUploadBytes")),...b("spawnSessions",bo(t,"spawnSessions")),...b("subsessions",bo(t,"subsessions"))}}function qc(e){if(e!==void 0){if(e===!0)return!0;if(Array.isArray(e)&&e.every(t=>typeof t=="string"))return e;throw new Error("Invalid PI WEB allowedHosts field")}}function Kc(e){if(e===void 0)return;if(!Ne(e)||Array.isArray(e))throw new Error("Invalid PI WEB pathAccess field");const t=e.allowedPaths;return{...b("allowedPaths",Vc(t,"pathAccess.allowedPaths"))}}function Vc(e,t){if(e!==void 0){if(Array.isArray(e)&&e.every(i=>typeof i=="string"&&i!==""))return e;throw new Error(`Invalid PI WEB ${t} field`)}}function Gc(e){if(e!==void 0){if(!Ne(e)||Array.isArray(e))throw new Error("Invalid PI WEB uploads field");return{...b("defaultFolder",$(e,"defaultFolder"))}}}function Jc(e){if(e!==void 0){if(!Ne(e)||Array.isArray(e))throw new Error("Invalid PI WEB shortcuts field");return Object.fromEntries(Object.entries(e).map(([t,i])=>{if(i!==null&&(typeof i!="string"||i===""))throw new Error("Invalid PI WEB shortcut field");return[t,i]}))}}function Qc(e){if(e!==void 0){if(!Ne(e)||Array.isArray(e))throw new Error("Invalid PI WEB plugins field");return Object.fromEntries(Object.entries(e).map(([t,i])=>{if(!Ne(i)||Array.isArray(i))throw new Error("Invalid PI WEB plugin config field");const s=i.enabled;if(s!==void 0&&typeof s!="boolean")throw new Error("Invalid PI WEB plugin enabled field");const r=i.settings;if(r!==void 0&&(!Ne(r)||Array.isArray(r)))throw new Error("Invalid PI WEB plugin settings field");return[t,i]}))}}function Zc(e){const t=y(e);return{host:D(t,"host"),port:D(t,"port"),allowedHosts:D(t,"allowedHosts"),spawnSessions:D(t,"spawnSessions"),subsessions:D(t,"subsessions")}}function Xc(e){const t=y(e);return{plugins:j(Yc)(t.plugins)}}function Yc(e){const t=y(e);return{id:m(t,"id"),module:m(t,"module"),source:m(t,"source"),scope:ed(t.scope),machineSpecific:cd(t.machineSpecific,"machineSpecific")??!1,enabled:D(t,"enabled")}}function ed(e){if(e!=="bundled"&&e!=="local"&&e!=="user"&&e!=="project")throw new Error("Invalid PI WEB plugin scope");return e}function td(e){const t=y(e);return{packageName:m(t,"packageName"),generatedAt:m(t,"generatedAt"),components:sd(t.components),release:od(t.release),commands:nd(t.commands),messages:j(ad)(t.messages)}}function id(e){const t=y(e);return{packageName:m(t,"packageName"),generatedAt:m(t,"generatedAt"),components:va(t.components),capabilities:gr(t.capabilities)}}function sd(e){const t=y(e);return{web:Ci(t.web),sessiond:Ci(t.sessiond)}}function va(e){const t=y(e);return{web:vo(t.web),sessiond:vo(t.sessiond)}}function vo(e){const t=y(e);return{component:ba(t.component),label:m(t,"label"),...b("runtimeVersion",$(t,"runtimeVersion")),available:D(t,"available"),capabilities:gr(t.capabilities),...b("error",$(t,"error"))}}function Ci(e){const t=y(e);return{component:ba(t.component),label:m(t,"label"),...b("runtimeVersion",$(t,"runtimeVersion")),...b("installedVersion",$(t,"installedVersion")),stale:D(t,"stale"),available:D(t,"available"),...b("installation",rd(t.installation)),...b("error",$(t,"error"))}}function rd(e){if(e===void 0)return;const t=y(e),i=m(t,"kind");if(i!=="pi-package"&&i!=="npm-global"&&i!=="local"&&i!=="unknown")throw new Error("Invalid PI WEB installation kind");const s=t.scope;if(s!==void 0&&s!=="user"&&s!=="project")throw new Error("Invalid PI WEB installation scope");return{kind:i,...b("path",$(t,"path")),...b("source",$(t,"source")),...s===void 0?{}:{scope:s},...b("npmRoot",$(t,"npmRoot"))}}function od(e){const t=y(e);return{packageName:m(t,"packageName"),...b("latestVersion",$(t,"latestVersion")),updateAvailable:D(t,"updateAvailable"),...b("checkedAt",$(t,"checkedAt")),...t.skipped===!0?{skipped:!0}:{},...b("error",$(t,"error"))}}function nd(e){const t=y(e);return{...b("update",$(t,"update")),...b("restart",$(t,"restart")),...b("restartWeb",$(t,"restartWeb")),...b("restartSessiond",$(t,"restartSessiond")),...b("status",$(t,"status"))}}function ad(e){const t=y(e);return{id:m(t,"id"),severity:ld(t.severity),title:m(t,"title"),body:m(t,"body"),...b("command",$(t,"command"))}}function ba(e){if(e!=="web"&&e!=="sessiond")throw new Error("Invalid PI WEB service component");return e}function gr(e){if(!Array.isArray(e)||!e.every(Hc))throw new Error("Invalid PI WEB capabilities");return e}function ld(e){if(e!=="info"&&e!=="warning"&&e!=="error")throw new Error("Invalid PI WEB status severity");return e}function cd(e,t){if(e!==void 0){if(typeof e!="boolean")throw new Error(`Expected optional boolean field: ${t}`);return e}}function bo(e,t){const i=e[t];if(i!==void 0){if(typeof i!="boolean")throw new Error(`Invalid PI WEB ${t} field`);return i}}function dd(e){const t=y(e);return j(wa)(t.machines)}function wa(e){const t=y(e),i=ud(t,"kind"),s=$(t,"baseUrl"),r=ya(t,"status"),o=$(t,"statusMessage");return{id:m(t,"id"),name:m(t,"name"),kind:i,...s===void 0?{}:{baseUrl:s},createdAt:m(t,"createdAt"),updatedAt:m(t,"updatedAt"),...r===void 0?{}:{status:r},...o===void 0?{}:{statusMessage:o}}}function pd(e){const t=y(e),i=ya(t,"status"),s=$(t,"error");return{machineId:m(t,"machineId"),ok:D(t,"ok"),checkedAt:m(t,"checkedAt"),...i===void 0?{}:{status:i},...t.web===void 0?{}:{web:Ci(t.web)},...t.sessiond===void 0?{}:{sessiond:Ci(t.sessiond)},...s===void 0?{}:{error:s}}}function hd(e){const t=y(e),i=$(t,"error");return{machineId:m(t,"machineId"),ok:D(t,"ok"),checkedAt:m(t,"checkedAt"),...b("packageName",$(t,"packageName")),...b("generatedAt",$(t,"generatedAt")),...t.components===void 0?{}:{components:va(t.components)},...t.capabilities===void 0?{}:{capabilities:gr(t.capabilities)},...i===void 0?{}:{error:i}}}function ud(e,t){const i=m(e,t);if(i!=="local"&&i!=="remote")throw new Error(`Expected machine kind field: ${t}`);return i}function ya(e,t){const i=$(e,t);if(i!==void 0){if(i!=="unknown"&&i!=="online"&&i!=="offline"&&i!=="error")throw new Error(`Expected machine status field: ${t}`);return i}}function fd(e){if(!Array.isArray(e))throw new Error("Expected array response");return e}function kt(e,t){if(!Array.isArray(e)||!e.every(i=>typeof i=="string"))throw new Error(`Expected string array field: ${t}`);return e}function gd(e){if(Array.isArray(e))return{messages:e,start:0,total:e.length};const t=y(e);return{messages:fd(t.messages),start:q(t,"start"),total:q(t,"total")}}function wo(e){const t=y(e);return{id:m(t,"id"),name:m(t,"name"),path:m(t,"path"),createdAt:m(t,"createdAt")}}function md(e){const t=y(e),i=$(t,"branch");return{id:m(t,"id"),projectId:m(t,"projectId"),path:m(t,"path"),label:m(t,"label"),...i===void 0?{}:{branch:i},isMain:D(t,"isMain"),isGitRepo:D(t,"isGitRepo"),isGitWorktree:D(t,"isGitWorktree"),...b("effectiveConfig",vd(t.effectiveConfig))}}function vd(e){if(e!==void 0){if(!Ne(e)||Array.isArray(e))throw new Error("Invalid workspace effectiveConfig field");return{...b("uploads",sp(e.uploads))}}}function zs(e){const t=y(e);return{path:m(t,"path"),size:q(t,"size"),modifiedAt:m(t,"modifiedAt")}}function yo(e){const t=y(e);return{path:m(t,"path")}}function bd(e){const t=y(e);if(t.deleted!==!0)throw new Error("Expected deleted response");return{deleted:!0,path:m(t,"path")}}function Bs(e){const t=y(e),i=$(t,"name"),s=$(t,"parentSessionPath"),r=$(t,"archivedAt");return{id:m(t,"id"),path:m(t,"path"),cwd:m(t,"cwd"),...i===void 0?{}:{name:i},created:m(t,"created"),modified:m(t,"modified"),messageCount:q(t,"messageCount"),firstMessage:m(t,"firstMessage"),...s===void 0?{}:{parentSessionPath:s},...t.archived===!0?{archived:!0}:{},...r===void 0?{}:{archivedAt:r}}}function Mt(e){const t=y(e);return{sessionId:m(t,"sessionId"),isStreaming:D(t,"isStreaming"),isCompacting:D(t,"isCompacting"),isBashRunning:D(t,"isBashRunning"),pendingMessageCount:q(t,"pendingMessageCount"),queuedMessages:t.queuedMessages===void 0?[]:j(Pd)(t.queuedMessages),...b("messageCount",ne(t,"messageCount")),tokens:Cd(t.tokens),cost:q(t,"cost"),...Ad(t.model),...Bd(t.contextUsage),...b("thinkingLevel",$(t,"thinkingLevel"))}}function xa(e){const t=y(e),i=t.skippedBusySessionIds===void 0?void 0:kt(t.skippedBusySessionIds,"skippedBusySessionIds");return{generatedAt:m(t,"generatedAt"),thresholds:Sd(t.thresholds),projects:j(kd)(t.projects),totals:$d(t.totals),...i===void 0?{}:{skippedBusySessionIds:i}}}function wd(e){const t=y(e);return{...xa(t),archivedSessionIds:kt(t.archivedSessionIds,"archivedSessionIds"),deletedSessionIds:kt(t.deletedSessionIds,"deletedSessionIds")}}function yd(e){const t=y(e);if(t.archived!==!0)throw new Error("Expected bulk archived response");return{archived:!0,archivedSessionIds:kt(t.archivedSessionIds,"archivedSessionIds"),failures:j(Sa)(t.failures),generatedAt:m(t,"generatedAt")}}function xd(e){const t=y(e);if(t.deleted!==!0)throw new Error("Expected bulk deleted response");return{deleted:!0,deletedSessionIds:kt(t.deletedSessionIds,"deletedSessionIds"),failures:j(Sa)(t.failures),generatedAt:m(t,"generatedAt")}}function Sa(e){const t=y(e);return{sessionId:m(t,"sessionId"),error:m(t,"error")}}function Sd(e){const t=y(e);return{...b("archiveIdleDays",ne(t,"archiveIdleDays")),...b("deleteArchivedDays",ne(t,"deleteArchivedDays"))}}function kd(e){const t=y(e);return{cwd:m(t,"cwd"),archiveCount:q(t,"archiveCount"),deleteCount:q(t,"deleteCount")}}function $d(e){const t=y(e);return{archiveCount:q(t,"archiveCount"),deleteCount:q(t,"deleteCount")}}function Pd(e){const t=y(e),i=m(t,"kind");if(i!=="steer"&&i!=="followUp")throw new Error("Invalid queued message kind");return{kind:i,text:m(t,"text"),...b("imageCount",ne(t,"imageCount"))}}function Cd(e){const t=y(e);return{input:q(t,"input"),output:q(t,"output"),cacheRead:q(t,"cacheRead"),cacheWrite:q(t,"cacheWrite"),total:q(t,"total")}}function ka(e){const t=y(e);return{...b("provider",$(t,"provider")),...b("id",$(t,"id")),...b("name",$(t,"name")),...b("contextWindow",ne(t,"contextWindow")),...b("reasoning",t.reasoning),...b("input",Id(t.input))}}function Id(e){if(e!==void 0){if(!Array.isArray(e))throw new Error("Invalid model input");return e.map(Rd)}}function Rd(e){if(e==="text"||e==="image")return e;throw new Error("Invalid model input")}function Ad(e){return e===void 0?{}:{model:ka(e)}}function Td(e){const t=y(e);return{models:j(ka)(t.models)}}function Md(e){if(typeof e!="string")throw new Error("Invalid thinking level");return e}function Ed(e){const t=y(e);return{levels:j(Md)(t.levels)}}function Dd(e){if(e!=="oauth"&&e!=="api_key")throw new Error("Invalid auth type");return e}function Wd(e){if(e!=="stored"&&e!=="runtime"&&e!=="environment"&&e!=="fallback"&&e!=="models_json_key"&&e!=="models_json_command")throw new Error("Invalid auth status source");return e}function Od(e){const t=y(e),i=t.source===void 0?void 0:Wd(t.source);return{configured:D(t,"configured"),...b("source",i),...b("label",$(t,"label"))}}function _d(e){const t=y(e);return{id:m(t,"id"),name:m(t,"name"),authType:Dd(t.authType),status:Od(t.status)}}function Ld(e){const t=y(e);return{providers:j(_d)(t.providers)}}function ii(e){const t=y(e);return{flowId:m(t,"flowId"),providerId:m(t,"providerId"),providerName:m(t,"providerName"),status:jd(t.status),progress:j(s=>{if(typeof s!="string")throw new Error("Expected progress item string");return s})(t.progress),...b("error",$(t,"error")),...b("auth",Fd(t.auth)),...b("prompt",Ud(t.prompt)),...b("select",zd(t.select))}}function jd(e){if(e!=="running"&&e!=="complete"&&e!=="error"&&e!=="cancelled")throw new Error("Invalid OAuth flow status");return e}function Fd(e){if(e===void 0)return;const t=y(e);return{url:m(t,"url"),...b("instructions",$(t,"instructions"))}}function Ud(e){if(e===void 0)return;const t=y(e),i=m(t,"kind");if(i!=="prompt"&&i!=="manual")throw new Error("Invalid OAuth prompt kind");return{requestId:m(t,"requestId"),message:m(t,"message"),kind:i,...b("placeholder",$(t,"placeholder")),...t.allowEmpty===!0?{allowEmpty:!0}:{}}}function zd(e){if(e===void 0)return;const t=y(e);return{requestId:m(t,"requestId"),message:m(t,"message"),options:j(Pa)(t.options)}}function Bd(e){if(e===void 0)return{};const t=y(e);return{contextUsage:{tokens:$o(t,"tokens"),contextWindow:q(t,"contextWindow"),percent:$o(t,"percent")}}}function Nd(e){const t=y(e),i=m(t,"source");if(i!=="extension"&&i!=="prompt"&&i!=="skill"&&i!=="builtin")throw new Error("Invalid command source");return{name:m(t,"name"),source:i,...b("description",$(t,"description"))}}function Ns(e){const t=y(e),i=m(t,"kind");if(i!=="tracked"&&i!=="untracked"&&i!=="other")throw new Error("Invalid file kind");return{path:m(t,"path"),kind:i}}function Hd(e){const t=y(e);return{path:m(t,"path"),entries:j(qd)(t.entries),scannedAt:m(t,"scannedAt"),truncated:D(t,"truncated")}}function qd(e){const t=y(e),i=m(t,"type");if(i!=="file"&&i!=="directory"&&i!=="symlink")throw new Error("Invalid file tree entry type");return{name:m(t,"name"),path:m(t,"path"),type:i,...b("size",ne(t,"size")),...b("modifiedAt",$(t,"modifiedAt"))}}function Kd(e){const t=y(e),i=m(t,"encoding");if(i!=="utf8")throw new Error("Invalid file encoding");return{path:m(t,"path"),...b("language",$(t,"language")),...b("mediaType",Jd(t.mediaType)),...b("mimeType",$(t,"mimeType")),encoding:i,size:q(t,"size"),modifiedAt:m(t,"modifiedAt"),content:m(t,"content"),truncated:D(t,"truncated"),binary:D(t,"binary")}}function $a(e){const t=y(e);return{path:m(t,"path"),size:q(t,"size"),modifiedAt:m(t,"modifiedAt"),created:D(t,"created")}}function Vd(e){const t=y(e);return{path:m(t,"path"),existed:D(t,"existed")}}function Gd(e){const t=y(e);return{fromPath:m(t,"fromPath"),toPath:m(t,"toPath"),size:q(t,"size"),modifiedAt:m(t,"modifiedAt")}}function Jd(e){if(e!==void 0){if(e!=="image")throw new Error("Invalid file media type");return e}}function Qd(e){const t=y(e);return{isGitRepo:D(t,"isGitRepo"),hash:m(t,"hash"),...b("branch",$(t,"branch")),...b("upstream",$(t,"upstream")),...b("ahead",ne(t,"ahead")),...b("behind",ne(t,"behind")),files:j(Zd)(t.files)}}function Zd(e){const t=y(e);return{path:m(t,"path"),...b("oldPath",$(t,"oldPath")),index:xo(t.index),workingTree:xo(t.workingTree)}}function xo(e){switch(e){case"unmodified":case"modified":case"added":case"deleted":case"renamed":case"copied":case"untracked":case"ignored":case"conflicted":return e;default:throw new Error("Invalid git file state")}}function Xd(e){const t=y(e);return{...b("path",$(t,"path")),staged:D(t,"staged"),hash:m(t,"hash"),diff:m(t,"diff"),truncated:D(t,"truncated")}}function fs(e){const t=y(e);return{id:m(t,"id"),cwd:m(t,"cwd"),name:m(t,"name"),createdAt:m(t,"createdAt"),exited:D(t,"exited"),...b("exitCode",ne(t,"exitCode")),...b("commandRunId",$(t,"commandRunId"))}}function Nt(e){const t=y(e);return{id:m(t,"id"),origin:m(t,"origin"),projectId:m(t,"projectId"),workspaceId:m(t,"workspaceId"),terminalId:m(t,"terminalId"),title:m(t,"title"),command:m(t,"command"),status:Yd(t.status),...b("exitCode",ne(t,"exitCode")),createdAt:m(t,"createdAt"),...b("startedAt",$(t,"startedAt")),...b("completedAt",$(t,"completedAt")),metadata:ep(t.metadata,"metadata")}}function Yd(e){if(e!=="queued"&&e!=="running"&&e!=="succeeded"&&e!=="failed")throw new Error("Invalid terminal command run status");return e}function ep(e,t){const i=y(e);return Object.fromEntries(Object.entries(i).map(([s,r])=>{if(typeof r!="string")throw new Error(`Expected string record field: ${t}.${s}`);return[s,r]}))}function tp(e){const t=y(e);return{cwd:m(t,"cwd"),hasSessionActivity:D(t,"hasSessionActivity"),hasTerminalActivity:D(t,"hasTerminalActivity"),updatedAt:m(t,"updatedAt")}}function ip(e){const t=y(e);return{workspaces:j(tp)(t.workspaces),generatedAt:m(t,"generatedAt")}}function sp(e){if(e!==void 0){if(!Ne(e)||Array.isArray(e))throw new Error("Invalid uploads field");return{...b("defaultFolder",$(e,"defaultFolder"))}}}function So(e){const t=y(e),i=m(t,"type");if(i==="unsupported")return{type:i,message:m(t,"message")};if(i==="select")return{type:i,requestId:m(t,"requestId"),title:m(t,"title"),options:j(Pa)(t.options)};if(i==="done")return{type:i,...b("message",$(t,"message")),...rp(t.session),...b("promptDraft",$(t,"promptDraft"))};throw new Error("Invalid command result type")}function Pa(e){const t=y(e);return{value:m(t,"value"),label:m(t,"label"),...b("description",$(t,"description"))}}function rp(e){return e===void 0?{}:{session:Bs(e)}}function si(e){return{accepted:et(e,"accepted")}}function op(e){const t=y(e);return j(np)(t.attachments)}function np(e){const t=y(e);return{path:m(t,"path"),mimeType:m(t,"mimeType"),size:q(t,"size")}}function Hs(e){return{closed:et(e,"closed")}}function ap(e){return{aborted:et(e,"aborted")}}function lp(e){return{stopped:et(e,"stopped")}}function ko(e){const t=y(e);if(t.archived!==!0)throw new Error("Expected archived response");const i=t.sessionIds===void 0?void 0:kt(t.sessionIds,"sessionIds"),s=ne(t,"archivedCount"),r=ne(t,"skippedAlreadyArchivedCount");return{archived:!0,...i===void 0?{}:{sessionIds:i},...s===void 0?{}:{archivedCount:s},...r===void 0?{}:{skippedAlreadyArchivedCount:r}}}function cp(e){return{restored:et(e,"restored")}}function dp(e){return{deleted:et(e,"deleted")}}function pp(e){return{detached:et(e,"detached")}}function hp(e){return{reloaded:et(e,"reloaded")}}function $o(e,t){const i=e[t];if(i===null)return null;if(typeof i!="number")throw new Error(`Expected number|null field: ${t}`);return i}function up(e){return typeof e=="string"?e:e.id}function fp(e){return typeof e=="string"?void 0:e.cwd}function gp(e,t,i,s){const r=new URLSearchParams;s?.path!==void 0&&r.set("path",s.path),s?.staged===!0&&r.set("staged","true");const o=r.toString();return`/api/machines/${encodeURIComponent(e)}/projects/${encodeURIComponent(t)}/workspaces/${encodeURIComponent(i)}/git/diff${o?`?${o}`:""}`}function mp(e,t,i="local"){const s=new URLSearchParams,r=fp(e);r!==void 0&&r!==""&&s.set("cwd",r),t?.limit!==void 0&&s.set("limit",String(t.limit)),t?.before!==void 0&&s.set("before",String(t.before));const o=s.toString();return`/api/machines/${encodeURIComponent(i)}/sessions/${encodeURIComponent(up(e))}/messages${o===""?"":`?${o}`}`}function vp(e,t,i,s){const r=new URLSearchParams({path:i});return s?.createDirs===!1&&r.set("createDirs","false"),s?.overwrite===!1&&r.set("overwrite","false"),`${`/api/machines/${encodeURIComponent(s?.machineId??"local")}`}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file?${r.toString()}`}function bp(e,t,i,s){const r=new URLSearchParams;return r.set("path",i),s?.modifiedAt!==void 0&&r.set("v",s.modifiedAt),`${`/api/machines/${encodeURIComponent(s?.machineId??"local")}`}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file/preview?${r.toString()}`}function Ca(e,t,i,s){const r=new URLSearchParams;r.set("path",i);const o=`/api/machines/${encodeURIComponent(s?.machineId??"local")}`;return ma(`${o}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file/download?${r.toString()}`)}const C=(e="local")=>`/api/machines/${encodeURIComponent(e)}`;function Ia(e){return typeof e=="string"?e:e.id}function mr(e){return typeof e=="string"?void 0:e.cwd}function Ra(e,t="local"){return`${C(t)}/sessions/${encodeURIComponent(Ia(e))}`}function G(e,t,i="local"){return`${Ra(e,i)}/${t}`}function ri(e,t,i="local"){return`${G(e,t,i)}${Aa(e)}`}function wp(e,t="local"){return`${Ra(e,t)}${Aa(e)}`}function Aa(e){const t=mr(e);return t===void 0||t===""?"":`?${new URLSearchParams({cwd:t}).toString()}`}function Q(e,t={}){const i=mr(e);return JSON.stringify(i===void 0||i===""?t:{cwd:i,...t})}function Po(e){return JSON.stringify({sessions:e.map(yp)})}function yp(e){const t=Ia(e),i=mr(e);return i===void 0||i===""?{id:t}:{id:t,cwd:i}}const Ta={piWebStatus:(e="local")=>v(e==="local"?"/api/pi-web/status":`${C(e)}/pi-web/status`,td),piWebRuntime:()=>v("/api/pi-web/runtime",id)},xp={machines:()=>v("/api/machines",dd),addMachine:e=>v("/api/machines",wa,{method:"POST",body:JSON.stringify(e)}),deleteMachine:e=>v(`/api/machines/${encodeURIComponent(e)}`,t=>t,{method:"DELETE"}),health:e=>v(`/api/machines/${encodeURIComponent(e)}/health`,pd),runtime:e=>v(`/api/machines/${encodeURIComponent(e)}/runtime`,hd)},Ii={config:()=>v("/api/config",go),saveConfig:e=>v("/api/config",go,{method:"PUT",body:JSON.stringify({config:e})})},qs={plugins:()=>v("/api/plugins",Xc)},Ma={workspaceActivity:(e="local")=>v(`${C(e)}/activity`,ip)},Sp={projects:(e="local")=>v(`${C(e)}/projects`,j(wo)),addProject:(e,t,i,s="local")=>v(`${C(s)}/projects`,wo,{method:"POST",body:JSON.stringify({path:e,name:t,create:i})}),closeProject:(e,t="local")=>v(`${C(t)}/projects/${encodeURIComponent(e)}`,Hs,{method:"DELETE"}),projectDirectories:(e,t="local")=>v(`${C(t)}/project-directories?q=${encodeURIComponent(e)}`,j(Ns))},wt={workspaces:(e,t="local")=>v(`${C(t)}/projects/${e}/workspaces`,j(md)),deleteWorkspace:(e,t,i="local")=>v(`${C(i)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}`,Nt,{method:"DELETE"}),workspaceTree:(e,t,i="",s="local")=>v(`${C(s)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/tree?path=${encodeURIComponent(i)}`,Hd),workspaceFile:(e,t,i,s="local")=>v(`${C(s)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file?path=${encodeURIComponent(i)}`,Kd),uploadWorkspaceFile:async(e,t,i,s,r="local")=>r==="local"?Ip(e,t,i,s):v(`${C(r)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file`,zs,{method:"POST",body:JSON.stringify({path:i,contentBase64:await Pp(s)})}),createWorkspaceFile:(e,t,i,s="local")=>v(`${C(s)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file`,zs,{method:"POST",body:JSON.stringify({path:i,contentBase64:""})}),writeWorkspaceFile:(e,t,i,s,r,o="local")=>{const n=new URLSearchParams({path:i});r?.createDirs===!1&&n.set("createDirs","false"),r?.overwrite===!1&&n.set("overwrite","false");const a=s instanceof Uint8Array,c=a?new Uint8Array(s):new TextEncoder().encode(s);return v(`${C(o)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file?${n.toString()}`,$a,{method:"PUT",body:c,headers:{"Content-Type":a?"application/octet-stream":"text/plain"}})},deleteWorkspaceFile:(e,t,i,s="local")=>{const r=new URLSearchParams({path:i});return v(`${C(s)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file?${r.toString()}`,Vd,{method:"DELETE"})},moveWorkspaceFile:(e,t,i,s,r,o="local")=>{const n=new URLSearchParams({fromPath:i,toPath:s});return r?.createDirs===!1&&n.set("createDirs","false"),r?.overwrite===!0&&n.set("overwrite","true"),v(`${C(o)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file/move?${n.toString()}`,Gd,{method:"POST"})},createWorkspaceDirectory:(e,t,i,s="local")=>v(`${C(s)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/directory`,yo,{method:"POST",body:JSON.stringify({path:i})}),moveWorkspaceDirectory:(e,t,i,s,r="local")=>v(`${C(r)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/directory`,yo,{method:"PATCH",body:JSON.stringify({fromPath:i,toPath:s})}),deleteWorkspaceDirectory:(e,t,i,s="local")=>v(`${C(s)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/directory?path=${encodeURIComponent(i)}`,bd,{method:"DELETE"}),workspaceDownloadUrl:(e,t,i,s="local")=>Ca(e,t,i,{machineId:s}),downloadWorkspaceFile:(e,t,i,s="local")=>Rp(e,t,i,s)},Ks={sessions:(e,t="local")=>v(`${C(t)}/sessions?cwd=${encodeURIComponent(e)}`,j(Bs)),startSession:(e,t="local")=>v(`${C(t)}/sessions`,Bs,{method:"POST",body:JSON.stringify({cwd:e})}),cleanupPreview:(e,t="local")=>v(`${C(t)}/sessions/cleanup/preview`,xa,{method:"POST",body:JSON.stringify(e)}),cleanup:(e,t="local")=>v(`${C(t)}/sessions/cleanup`,wd,{method:"POST",body:JSON.stringify(e)}),archiveMany:(e,t="local")=>v(`${C(t)}/sessions/bulk/archive`,yd,{method:"POST",body:Po(e)}),deleteArchivedMany:(e,t="local")=>v(`${C(t)}/sessions/bulk/delete-archived`,xd,{method:"POST",body:Po(e)}),messages:(e,t,i="local")=>v(mp(e,t,i),gd),status:(e,t="local")=>v(ri(e,"status",t),Mt),models:(e,t="local")=>v(ri(e,"models",t),Td),setModel:(e,t,i,s="local")=>v(G(e,"model",s),Mt,{method:"POST",body:Q(e,{provider:t,modelId:i})}),cycleModel:(e,t,i="local")=>v(G(e,"model/cycle",i),Mt,{method:"POST",body:Q(e,{direction:t})}),thinkingLevels:(e,t="local")=>v(ri(e,"thinking-levels",t),Ed),setThinkingLevel:(e,t,i="local")=>v(G(e,"thinking-level",i),Mt,{method:"POST",body:Q(e,{level:t})}),cycleThinkingLevel:(e,t="local")=>v(G(e,"thinking-level/cycle",t),Mt,{method:"POST",body:Q(e)}),commands:(e,t="local")=>v(ri(e,"commands",t),j(Nd)),prompt:(e,t,i,s="local",r)=>v(G(e,"prompt",s),si,{method:"POST",body:Q(e,{text:t,...i===void 0?{}:{streamingBehavior:i},...r!==void 0&&r.length>0?{attachments:r}:{}})}),saveAttachments:(e,t,i="local",s)=>v(G(e,"attachments",i),op,{method:"POST",body:Q(e,{attachments:t,...s===void 0?{}:{folder:s}})}),shell:(e,t,i="local")=>v(G(e,"shell",i),si,{method:"POST",body:Q(e,{text:t})}),runCommand:(e,t,i="local")=>v(G(e,"commands/run",i),So,{method:"POST",body:Q(e,{text:t})}),respondToCommand:(e,t,i,s="local")=>v(G(e,"commands/respond",s),So,{method:"POST",body:Q(e,{requestId:t,value:i})}),abort:(e,t="local")=>v(G(e,"abort",t),ap,{method:"POST",body:Q(e)}),stop:(e,t="local")=>v(G(e,"stop",t),lp,{method:"POST",body:Q(e)}),archive:(e,t="local")=>v(G(e,"archive",t),ko,{method:"POST",body:Q(e)}),archiveWithDescendants:(e,t="local")=>v(G(e,"archive-tree",t),ko,{method:"POST",body:Q(e)}),restore:(e,t="local")=>v(G(e,"restore",t),cp,{method:"POST",body:Q(e)}),deleteArchived:(e,t="local")=>v(wp(e,t),dp,{method:"DELETE"}),detachParent:(e,t="local")=>v(G(e,"detach-parent",t),pp,{method:"POST",body:Q(e)}),reloadSession:(e,t="local")=>v(G(e,"reload",t),hp,{method:"POST",body:Q(e)}),authProviders:e=>{const t=new URLSearchParams;e?.mode!==void 0&&t.set("mode",e.mode),e?.authType!==void 0&&t.set("authType",e.authType);const i=t.toString();return v(`${C(e?.machineId)}/auth/providers${i===""?"":`?${i}`}`,Ld)},saveApiKey:(e,t,i="local")=>v(`${C(i)}/auth/api-key`,si,{method:"POST",body:JSON.stringify({providerId:e,key:t})}),logoutProvider:(e,t="local")=>v(`${C(t)}/auth/logout`,si,{method:"POST",body:JSON.stringify({providerId:e})}),startOAuthLogin:(e,t="local")=>v(`${C(t)}/auth/oauth`,ii,{method:"POST",body:JSON.stringify({providerId:e})}),oauthFlow:(e,t="local")=>v(`${C(t)}/auth/oauth/${encodeURIComponent(e)}`,ii),respondOAuthFlow:(e,t,i,s="local")=>v(`${C(s)}/auth/oauth/${encodeURIComponent(e)}/respond`,ii,{method:"POST",body:JSON.stringify({requestId:t,value:i})}),cancelOAuthFlow:(e,t="local")=>v(`${C(t)}/auth/oauth/${encodeURIComponent(e)}/cancel`,ii,{method:"POST"})},yt={terminals:(e,t,i="local")=>v(`${C(i)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/terminals`,j(fs)),startTerminal:(e,t,i,s="local")=>v(`${C(s)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/terminals`,fs,{method:"POST",body:JSON.stringify(i??{})}),closeWorkspaceTerminals:(e,t,i="local")=>v(`${C(i)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/terminals`,Hs,{method:"DELETE"}),closeTerminal:(e,t,i,s="local")=>v(`${C(s)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/terminals/${encodeURIComponent(i)}`,Hs,{method:"DELETE"}),continueTerminal:(e,t,i,s="local")=>v(`${C(s)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/terminals/${encodeURIComponent(i)}/continue`,fs,{method:"POST"}),runTerminalCommand:(e,t,i="local")=>v(`${C(i)}/projects/${encodeURIComponent(t.workspace.projectId)}/workspaces/${encodeURIComponent(t.workspace.id)}/terminal-command-runs`,Nt,{method:"POST",body:JSON.stringify({origin:e,title:t.title,command:t.command,metadata:t.metadata??{}})}),listCommandRuns:(e,t="local")=>v(`${C(t)}/terminal-command-runs${$p(e)}`,j(Nt)),getCommandRun:(e,t="local")=>kp(e,t),cancelCommandRun:(e,t="local")=>v(`${C(t)}/terminal-command-runs/${encodeURIComponent(e)}/cancel`,Nt,{method:"POST"})};async function kp(e,t){const i=await fetch(`${C(t)}/terminal-command-runs/${encodeURIComponent(e)}`);if(i.status!==404){if(!i.ok){const s=await i.json().catch(()=>({}));throw new Error(vr(s)??i.statusText)}return Nt(await i.json())}}function $p(e){if(e===void 0)return"";const t=new URLSearchParams;e.projectId!==void 0&&t.set("projectId",e.projectId),e.workspaceId!==void 0&&t.set("workspaceId",e.workspaceId),e.terminalId!==void 0&&t.set("terminalId",e.terminalId),e.statuses!==void 0&&e.statuses.length>0&&t.set("statuses",e.statuses.join(",")),e.metadata!==void 0&&Object.keys(e.metadata).length>0&&t.set("metadata",JSON.stringify(e.metadata));const i=t.toString();return i===""?"":`?${i}`}function vr(e){if(!Ap(e))return;const t=e.error;return typeof t=="string"?t:void 0}async function Pp(e){return Cp(await e.arrayBuffer())}function Cp(e){const t=new Uint8Array(e);let i="";for(const s of t)i+=String.fromCharCode(s);return btoa(i)}async function Ip(e,t,i,s){const r=new FormData;r.set("path",i),r.set("file",s,s.name);const o=await fetch(`${C("local")}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file`,{method:"POST",body:r});if(!o.ok){const n=await o.json().catch(()=>({}));throw new Error(vr(n)??o.statusText)}return zs(await o.json())}async function Rp(e,t,i,s){const r=await fetch(Ca(e,t,i,{machineId:s}));if(!r.ok){const p=await r.json().catch(()=>({}));throw new Error(vr(p)??r.statusText)}const o=await r.blob(),n=URL.createObjectURL(o),a=document.createElement("a");a.href=n;const c=i.split("/").pop();a.download=c===void 0||c===""?"download":c,document.body.append(a),a.click(),a.remove(),URL.revokeObjectURL(n)}function Ap(e){return typeof e=="object"&&e!==null}const Tp={files:(e,t,i={})=>{const s=new URLSearchParams({q:t});return i.kind!==void 0&&s.set("kind",i.kind),i.mode!==void 0&&s.set("mode",i.mode),i.scope!==void 0&&s.set("scope",i.scope),i.workspaceScoped===!0&&i.projectId!==void 0&&i.workspaceId!==void 0?v(`${C(i.machineId)}/projects/${encodeURIComponent(i.projectId)}/workspaces/${encodeURIComponent(i.workspaceId)}/files?${s.toString()}`,j(Ns)):(s.set("cwd",e),v(`${C(i.machineId)}/files?${s.toString()}`,j(Ns)))}},Mp={gitStatus:(e,t,i="local")=>v(`${C(i)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/git/status`,Qd),gitDiff:(e,t,i,s="local")=>v(gp(s,e,t,i),Xd)},N={...Ta,...xp,...Ii,...qs,...Ma,...Sp,...wt,...Ks,...yt,...Tp,...Mp};function Ep(e,t="local"){const i=typeof e=="string"?void 0:e.cwd,s=i===void 0||i===""?"":`?${new URLSearchParams({cwd:i}).toString()}`,r=typeof e=="string"?e:e.id;return new WebSocket(`${wr()}${br(t)}/sessions/${encodeURIComponent(r)}/events${s}`)}function ax(e,t,i,s,r="local"){const o=s===void 0?"":`?cols=${encodeURIComponent(String(s.cols))}&rows=${encodeURIComponent(String(s.rows))}`;return new WebSocket(`${wr()}${br(r)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/terminals/${encodeURIComponent(i)}/socket${o}`)}function Dp(e="local"){return new WebSocket(`${wr()}${br(e)}/events`)}function br(e){return`/api/machines/${encodeURIComponent(e)}`}function wr(){return`${location.protocol==="https:"?"wss:":"ws:"}//${location.host}`}const Ea=".pi-web/uploads";class Ji extends Error{constructor(t="Workspace upload cancelled"){super(t),this.name="WorkspaceUploadCancelledError"}}class Da extends Error{constructor(t,i){super(zp(t)),this.name="WorkspaceUploadBatchError",this.failures=t.map(s=>({...s})),this.responses=i.map(s=>({...s}))}}function Co(e){return e?.uploads?.defaultFolder??Ea}function Wp(e,t){return e?.uploads?.defaultFolder??t}function yr(e,t){const i=Io(e,"upload destination",{allowEmpty:!0}),s=Io(t,"upload file name",{allowEmpty:!1});return i===""?s:`${i}/${s}`}function Op(e,t,i,s={}){const r=s.xhrFactory?.()??new XMLHttpRequest;let o=!1,n=!1;return{promise:new Promise((c,p)=>{const u=g=>{o||(o=!0,p(g))},h=g=>{o||(o=!0,c(g))};r.open("PUT",vp(e,t,i.path,jp(s)),!0),r.responseType="json",r.setRequestHeader("Content-Type",(i.contentType??i.file.type)||"application/octet-stream"),r.upload.onprogress=g=>{s.onProgress?.(Fp(g,i.file.size))},r.onload=()=>{if(r.status>=200&&r.status<300){try{s.onProgress?.({loaded:i.file.size,total:i.file.size,percent:1,lengthComputable:!0}),h($a(Wa(r)))}catch(g){u(g instanceof Error?g:new Error(String(g)))}return}u(new Error(qp(r)))},r.onerror=()=>{u(new Error("Workspace upload failed"))},r.onabort=()=>{u(new Ji(n?void 0:"Workspace upload aborted"))},r.send(i.file)}),cancel:()=>{o||(n=!0,r.abort())}}}function _p(e,t,i,s={}){const r=s.destinationFolder??Ea,o=i.map((h,g)=>({index:g,name:h.name,path:yr(r,h.name),loaded:0,total:h.size,percent:xr(0,h.size),lengthComputable:!0,done:!1}));let n,a=0;const c={requested:!1},p=()=>{s.onProgress?.(Up(o,a,o.every(h=>h.done)))};return{promise:(async()=>{const h=[],g=[];for(let w=0;w<i.length;w+=1){if(c.requested)throw new Ji;a=w;const P=i[w],I=o[w];if(!(P===void 0||I===void 0)){n=Op(e,t,{path:I.path,file:P},{...Lp(s),onProgress:V=>{I.total=V.total,I.loaded=Math.min(V.loaded,I.total),I.percent=V.percent,I.lengthComputable=V.lengthComputable,p()}});try{const V=await n.promise;I.loaded=I.total,I.percent=1,I.lengthComputable=!0,I.done=!0,h.push(V),p()}catch(V){if(Np(V,c))throw V;const Je=Bp(V);I.loaded=I.total,I.percent=1,I.lengthComputable=!0,I.done=!0,I.error=Je,g.push({index:w,name:P.name,path:I.path,error:Je}),p()}finally{n=void 0}}}if(g.length>0)throw new Da(g,h);return h})(),cancel:()=>{c.requested=!0,n?.cancel()}}}function Lp(e){return{...e.createDirs===void 0?{}:{createDirs:e.createDirs},...e.overwrite===void 0?{}:{overwrite:e.overwrite},...e.machineId===void 0?{}:{machineId:e.machineId},...e.xhrFactory===void 0?{}:{xhrFactory:e.xhrFactory}}}function jp(e){return{...e.createDirs===void 0?{}:{createDirs:e.createDirs},...e.overwrite===void 0?{}:{overwrite:e.overwrite},...e.machineId===void 0?{}:{machineId:e.machineId}}}function Fp(e,t){const i=e.lengthComputable?e.total:t;return{loaded:e.loaded,total:i,percent:xr(e.loaded,i),lengthComputable:e.lengthComputable}}function Up(e,t,i){const s=e.reduce((o,n)=>o+n.total,0),r=e.reduce((o,n)=>o+n.loaded,0);return{currentFileIndex:t,files:e.map(o=>({...o})),loaded:r,total:s,percent:xr(r,s),done:i}}function xr(e,t){return t<=0?e<=0?0:1:Math.max(0,Math.min(1,e/t))}function zp(e){return e.length===1?e[0]?.error??"Workspace upload failed":`${String(e.length)} files failed to upload`}function Bp(e){return e instanceof Error?e.message:String(e)}function Np(e,t){return t.requested||e instanceof Ji}function Io(e,t,i){const s=e.trim();if(s===""){if(i.allowEmpty)return"";throw new Error(`${t} must not be empty`)}if(Hp(s))throw new Error(`${t} must be workspace-relative`);const r=s.split(/[\\/]+/u).filter(o=>o!==""&&o!==".");if(r.length===0){if(i.allowEmpty)return"";throw new Error(`${t} must not be empty`)}if(r.some(o=>o===".."))throw new Error(`${t} must not contain path traversal`);return r.join("/")}function Hp(e){const t=e.replace(/\\/g,"/");return t.startsWith("/")||/^[A-Za-z]:\//u.test(t)}function Wa(e){return e.response!==void 0&&e.response!==null&&e.response!==""?e.response:e.responseText===""?{}:JSON.parse(e.responseText)}function qp(e){const t=Kp(e);return Vp(t)&&typeof t.error=="string"?t.error:e.statusText||`HTTP ${String(e.status)}`}function Kp(e){try{return Wa(e)}catch{return}}function Vp(e){return typeof e=="object"&&e!==null}function gi(){return{sessions:[],fileTree:[],expandedDirs:{},selectedFilePath:void 0,selectedFileContent:void 0,fileTreeStale:!1,gitStatus:void 0,selectedDiffPath:void 0,selectedDiff:void 0,selectedStagedDiff:void 0,gitStale:!1,selectedTerminalId:void 0,error:""}}function Gp(){return{machines:[],selectedMachine:void 0,isLoadingMachines:!1,machineStatuses:{},machineRuntimes:{},projects:[],workspaces:[],sessions:[],messages:[],messagePageStart:0,messagePageEnd:0,messagePageTotal:0,isLoadingEarlierMessages:!1,isReceivingPartialStream:!1,sendingPrompts:{},isLoadingProjects:!1,isLoadingWorkspaces:!1,selectedProject:void 0,selectedWorkspace:void 0,selectedSession:void 0,status:void 0,activity:void 0,availableThinkingLevels:[],sessionStatuses:{},sessionActivities:{},workspaceActivities:{},machineActivities:{},workspacesByProjectId:{},workspaceDeletionRuns:{},commandDialog:void 0,modelDialog:void 0,thinkingDialog:void 0,themeDialog:void 0,authDialog:void 0,actionPaletteOpen:!1,projectDialogOpen:!1,machineDialogOpen:!1,workspaceTool:"core:workspace.files",mainView:"chat",fileTree:[],expandedDirs:{},selectedFilePath:void 0,selectedFileContent:void 0,fileTreeStale:!1,workspaceUploadBatches:{},gitStatus:void 0,selectedDiffPath:void 0,selectedDiff:void 0,selectedStagedDiff:void 0,gitStale:!1,activeTerminalCount:0,selectedTerminalId:void 0,piWebStatus:void 0,error:""}}function Ye(e,t){return t?.phase==="active"||e?.isStreaming===!0||e?.isBashRunning===!0||e?.isCompacting===!0||(e?.pendingMessageCount??0)>0}function Oa(e){return e!==void 0&&(e.hasSessionActivity||e.hasTerminalActivity)}const _a="local";function gs(e,t){return`${e}:${t}`}function La(e,t){return`${e}:${t}`}function f(e){return e.selectedMachine?.id??_a}class Jp{constructor(t,i,s={}){this.getState=t,this.setState=i,this.api=s.api??Ma}async refresh(t=f(this.getState())){this.applyMachineActivitySnapshot(t,Qp(await this.api.workspaceActivity(t)))}applyWorkspaceActivity(t,i=f(this.getState())){const s=this.getState(),r=f(s)===i,o=s.machineActivities[i]??(r?s.workspaceActivities:{}),n=Zp(o,t);this.setState({machineActivities:{...s.machineActivities,[i]:n},...r?{workspaceActivities:n}:{}})}applyMachineActivitySnapshot(t,i){const s=this.getState();this.setState({machineActivities:{...s.machineActivities,[t]:i},...f(s)===t?{workspaceActivities:i}:{}})}}function Qp(e){const t={};for(const i of e.workspaces)Oa(i)&&(t[i.cwd]=i);return t}function Zp(e,t){const i={...e};return Oa(t)?(i[t.cwd]=t,i):Object.fromEntries(Object.entries(i).filter(([s])=>s!==t.cwd))}class Xp{constructor(t,i,s,r={}){this.getState=t,this.setState=i,this.applyStatus=s,this.api=r.api??N,this.pollIntervalMs=r.pollIntervalMs??1e3}dispose(){this.stopPolling()}handleSlashCommand(t){const i=Yp(t);return i===void 0?!1:(i.command==="login"?this.openLogin(i.providerId):this.openLogout(i.providerId),!0)}async openLogin(t){if(t!==void 0&&t!==""){await this.openLoginProvider(t);return}this.setState({authDialog:{step:"method"}})}async chooseLoginMethod(t){try{const{providers:i}=await this.api.authProviders({mode:"login",authType:t,machineId:f(this.getState())});this.setState({authDialog:{step:"providers",mode:"login",authType:t,providers:i}})}catch(i){this.setState({error:String(i)})}}async selectLoginProvider(t,i){const s=this.getState().authDialog;if(s?.step!=="providers")return;const r=s.providers.find(o=>o.id===t&&(i===void 0||o.authType===i));r!==void 0&&(r.authType==="oauth"?await this.startOAuth(r):this.setState({authDialog:{step:"apiKey",provider:r,value:""}}))}updateApiKey(t){const i=this.getState().authDialog;if(i?.step!=="apiKey")return;const s={...i};delete s.error,this.setState({authDialog:{...s,value:t}})}async saveApiKey(){const t=this.getState().authDialog;if(t?.step!=="apiKey")return;const i=t.value.trim();if(i===""){this.setState({authDialog:{...t,error:"API key is required"}});return}const s={...t};delete s.error,this.setState({authDialog:{...s,saving:!0}});try{await this.api.saveApiKey(t.provider.id,i,f(this.getState())),this.closeDialog(),this.refreshStatus()}catch(r){this.setState({authDialog:{...t,saving:!1,error:String(r)}})}}async openLogout(t){try{const{providers:i}=await this.api.authProviders({mode:"logout",machineId:f(this.getState())});if(t!==void 0&&t!==""){const s=i.find(r=>r.id===t);s!==void 0&&!this.rejectRemoteOAuth("logout",s)?await this.logoutProvider(s.id):s===void 0&&this.setState({error:`No stored credentials for ${t}`});return}this.setState({authDialog:{step:"logout",providers:i}})}catch(i){this.setState({error:String(i)})}}async logoutProvider(t){const i=this.getState().authDialog,s=i?.step==="logout"?i.providers.find(r=>r.id===t):void 0;if(!(s!==void 0&&this.rejectRemoteOAuth("logout",s)))try{await this.api.logoutProvider(t,f(this.getState())),this.closeDialog(),this.refreshStatus()}catch(r){this.setState({error:String(r)})}}updateOAuthInput(t){const i=this.getState().authDialog;if(i?.step!=="oauth")return;const s={...i};delete s.error,this.setState({authDialog:{...s,inputValue:t}})}async respondOAuth(t){const i=this.getState().authDialog;if(i?.step!=="oauth")return;const s=i.flow.prompt??i.flow.select;if(s===void 0)return;const r=t??i.inputValue??"",o={...i};delete o.error,this.setState({authDialog:{...o,responding:!0}});try{const n=await this.api.respondOAuthFlow(i.flow.flowId,s.requestId,r,f(this.getState()));this.updateOAuthFlow(n)}catch(n){this.setState({authDialog:{...i,responding:!1,error:String(n)}})}}async cancelOAuth(){const t=this.getState().authDialog;if(t?.step!=="oauth"){this.closeDialog();return}this.stopPolling();try{await this.api.cancelOAuthFlow(t.flow.flowId,f(this.getState()))}catch{}this.closeDialog()}closeDialog(){this.stopPolling(),this.setState({authDialog:void 0})}async openLoginProvider(t){try{const{providers:i}=await this.api.authProviders({mode:"login",machineId:f(this.getState())}),s=i.filter(o=>o.id===t);if(s.length===0){this.setState({error:`Auth provider not found: ${t}`});return}if(s.length>1){this.setState({authDialog:{step:"providers",mode:"login",providers:s}});return}const r=s[0];if(r===void 0)return;r.authType==="oauth"?await this.startOAuth(r):this.setState({authDialog:{step:"apiKey",provider:r,value:""}})}catch(i){this.setState({error:String(i)})}}async startOAuth(t){if(!this.rejectRemoteOAuth("login",t))try{const i=await this.api.startOAuthLogin(t.id,f(this.getState()));this.updateOAuthFlow(i),this.startPolling(i.flowId)}catch(i){this.setState({error:String(i)})}}rejectRemoteOAuth(t,i){const s=this.getState().selectedMachine;if(i.authType!=="oauth"||s?.kind!=="remote")return!1;const r=s.baseUrl??"that remote PI WEB instance";return this.setState({error:`OAuth ${t} for remote machines must be configured directly on ${r}.`}),!0}updateOAuthFlow(t){if(t.status==="complete"){this.stopPolling(),this.closeDialog(),this.refreshStatus();return}(t.status==="error"||t.status==="cancelled")&&this.stopPolling();const i=this.getState().authDialog,s=i?.step==="oauth"&&i.flow.flowId===t.flowId?i.inputValue??"":"",r=i?.step==="oauth"?i.flow.prompt?.requestId??i.flow.select?.requestId:void 0,o=t.prompt?.requestId??t.select?.requestId,n=r!==void 0&&r===o,a=n?s:"",c=n&&i?.step==="oauth"?i.responding===!0:!1;this.setState({authDialog:{step:"oauth",flow:t,inputValue:a,responding:c}})}startPolling(t){this.stopPolling(),this.pollTimer=window.setInterval(()=>{this.poll(t)},this.pollIntervalMs)}stopPolling(){this.pollTimer!==void 0&&(window.clearInterval(this.pollTimer),this.pollTimer=void 0)}async poll(t){const i=this.getState().authDialog;if(i?.step!=="oauth"||i.flow.flowId!==t){this.stopPolling();return}try{this.updateOAuthFlow(await this.api.oauthFlow(t,f(this.getState())))}catch(s){this.stopPolling(),this.setState({authDialog:{...i,error:String(s)}})}}async refreshStatus(){const t=this.session();if(t!==void 0)try{this.applyStatus(await this.api.status(t,f(this.getState())))}catch{}}session(){const t=this.getState().selectedSession;if(!(t===void 0||t.archived===!0))return t}}function Yp(e){const t=e.trim(),i=/^\/(login|logout)(?:\s+(\S+))?\s*$/u.exec(t);if(i===null)return;const s=i[1];if(s!=="login"&&s!=="logout")return;const r=i[2];return r===void 0||r===""?{command:s}:{command:s,providerId:r}}function Jt(e){return e.replaceAll(":",".")}function eh(e){const t=new URLSearchParams(window.location.search),i=`${e}--`,s={};for(const[r,o]of t.entries()){if(!r.startsWith(i))continue;const n=r.slice(i.length),a=s[n];a===void 0?s[n]=o:Array.isArray(a)?a.push(o):s[n]=[a,o]}return s}function ms(e,t){const i=eh(e)[t];return Array.isArray(i)?i[0]:i===""?void 0:i}function he(e,t,i,s){const r=new URL(window.location.href),o=`${e}--${t}`;if(r.searchParams.delete(o),i!=null&&i!=="")if(Array.isArray(i))for(const n of i)r.searchParams.append(o,String(n));else r.searchParams.set(o,String(i));th(r,s)}function th(e,t){const i=`${e.pathname}${e.search}${e.hash}`,s=`${window.location.pathname}${window.location.search}${window.location.hash}`;i!==s&&(t?.replace===!0?window.history.replaceState({},"",e):window.history.pushState({},"",e))}function ih(e){const t=e.files.map((s,r)=>{const o=s.size;return{index:r,name:s.name,path:yr(e.destinationFolder,s.name),size:s.size,loaded:0,total:o,percent:Ao(0,o),lengthComputable:!0,status:r===0?"uploading":"pending"}}),i=t.reduce((s,r)=>s+r.total,0);return{id:e.id,projectId:e.projectId,workspaceId:e.workspaceId,machineId:e.machineId,destinationFolder:e.destinationFolder,overwrite:e.overwrite,createDirs:e.createDirs,files:t,currentFileIndex:t.length===0?-1:0,loaded:0,total:i,percent:Ao(0,i),status:"uploading",startedAt:e.startedAt}}function sh(e,t){const i=new Map(t.files.map(r=>[r.index,r])),s=e.files.map(r=>{const o=i.get(r.index);if(o===void 0)return r;const n={...r,path:o.path,loaded:o.loaded,total:o.total,percent:o.percent,lengthComputable:o.lengthComputable,status:o.error!==void 0?"error":o.done?"completed":t.currentFileIndex===r.index?"uploading":r.status};return o.error===void 0?delete n.error:n.error=o.error,n});return{...e,files:s,currentFileIndex:t.currentFileIndex,loaded:t.loaded,total:t.total,percent:t.percent}}function rh(e,t,i){const s=e.files.map((o,n)=>{const a=t[n];return{...o,...a===void 0?{}:{path:a.path,response:a},loaded:o.total,percent:1,lengthComputable:!0,status:"completed"}}),r=Sr(s);return{...e,files:s,currentFileIndex:s.length===0?-1:s.length-1,...r,status:"completed",completedAt:i}}function oh(e,t,i){const s=e.files.map(r=>r.status==="completed"||r.status==="error"?r:r.status==="uploading"||r.index===e.currentFileIndex?{...r,status:"error",error:t}:{...r,status:"cancelled",error:"Not uploaded because an earlier file failed."});return{...e,files:s,...Sr(s),status:"error",error:t,completedAt:i}}function Ro(e,t){const i="Upload cancelled",s=e.files.map(r=>r.status==="completed"||r.status==="error"?r:{...r,status:"cancelled",error:i});return{...e,files:s,...Sr(s),status:"cancelled",error:i,completedAt:t}}function Sr(e){const t=e.reduce((i,s)=>i+s.total,0);return{loaded:t,total:t,percent:e.length===0?0:1}}function Ao(e,t){return t<=0?e<=0?0:1:Math.max(0,Math.min(1,e/t))}const oi=Jt("core:workspace.files");class nh{constructor(t,i,s,r={}){this.getState=t,this.setState=i,this.updateUrl=s,this.uploadTasks=new Map,this.uploadBatchSequence=0,this.api=r.api??N,this.uploadWorkspaceFiles=r.uploadWorkspaceFiles??_p,this.createUploadBatchId=r.createUploadBatchId??(()=>(this.uploadBatchSequence+=1,`workspace-upload-${String(this.uploadBatchSequence)}`)),this.now=r.now??(()=>new Date().toISOString())}async refreshFiles(){const t=this.getState().selectedProject,i=this.getState().selectedWorkspace;if(!(t===void 0||i===void 0))try{const s=f(this.getState()),r=await this.api.workspaceTree(t.id,i.id,"",s),o=await Promise.all(Object.keys(this.getState().expandedDirs).map(async a=>{try{const c=await this.api.workspaceTree(t.id,i.id,a,s);return[a,c.entries]}catch(c){if(To(c))return;throw c}})),n=Object.fromEntries(o.filter(a=>a!==void 0));this.setState({fileTree:r.entries,expandedDirs:n,fileTreeStale:!1,error:""})}catch(s){this.setState({error:String(s)})}}async expandDir(t){const i=this.getState().selectedProject,s=this.getState().selectedWorkspace;if(!(i===void 0||s===void 0)){if(this.getState().expandedDirs[t]!==void 0){this.setState({expandedDirs:Mo(this.getState().expandedDirs,t)});return}try{const r=await this.api.workspaceTree(i.id,s.id,t,f(this.getState()));this.setState({expandedDirs:{...this.getState().expandedDirs,[t]:r.entries},error:""})}catch(r){this.setState({error:String(r)})}}}async selectFile(t){this.setState({selectedFilePath:t,selectedFileContent:void 0,workspaceTool:"core:workspace.files",mainView:this.getState().mainView==="chat"?"chat":"core:workspace.files"}),he(oi,"file",t),this.updateUrl({replace:!0}),await this.restoreFile(t)}selectDirectory(t){this.setState({selectedFilePath:t,selectedFileContent:void 0,workspaceTool:"core:workspace.files",mainView:this.getState().mainView==="chat"?"chat":"core:workspace.files"}),he(oi,"file",void 0,{replace:!0}),this.updateUrl({replace:!0})}async restoreFile(t){const i=this.getState().selectedProject,s=this.getState().selectedWorkspace;if(!(i===void 0||s===void 0)){this.setState({selectedFilePath:t,selectedFileContent:void 0});try{const r=await this.api.workspaceFile(i.id,s.id,t,f(this.getState()));this.getState().selectedFilePath===t&&this.setState({selectedFileContent:r,error:""})}catch(r){if(this.getState().selectedFilePath!==t)return;if(To(r)){this.setState({selectedFilePath:void 0,selectedFileContent:void 0,error:""}),he(oi,"file",void 0,{replace:!0}),this.updateUrl({replace:!0});return}this.setState({error:String(r)})}}}async createFile(t){const i=this.getState().selectedProject,s=this.getState().selectedWorkspace;if(!(i===void 0||s===void 0||t===""))try{await this.api.createWorkspaceFile(i.id,s.id,t,f(this.getState())),await this.refreshFiles(),await this.selectFile(t),this.setState({error:""})}catch(r){this.setState({error:String(r)})}}async createDirectory(t){const i=this.getState().selectedProject,s=this.getState().selectedWorkspace;if(!(i===void 0||s===void 0||t===""))try{await this.api.createWorkspaceDirectory(i.id,s.id,t,f(this.getState())),await this.refreshFiles(),this.selectDirectory(t),this.setState({error:""})}catch(r){this.setState({error:String(r)})}}async moveSelectedPath(t){const i=this.getState().selectedProject,s=this.getState().selectedWorkspace,r=this.getState().selectedFilePath;if(!(i===void 0||s===void 0||r===void 0||r===""||t===""))try{const o=f(this.getState());vs(this.getState())==="directory"?(await this.api.moveWorkspaceDirectory(i.id,s.id,r,t,o),await this.refreshFiles(),this.selectDirectory(t)):(await this.api.moveWorkspaceFile(i.id,s.id,r,t,void 0,o),await this.refreshFiles(),await this.selectFile(t)),this.setState({error:""})}catch(o){this.setState({error:String(o)})}}async deleteSelectedPath(){const t=this.getState().selectedProject,i=this.getState().selectedWorkspace,s=this.getState().selectedFilePath;if(!(t===void 0||i===void 0||s===void 0||s===""))try{const r=f(this.getState());vs(this.getState())==="directory"?await this.api.deleteWorkspaceDirectory(t.id,i.id,s,r):await this.api.deleteWorkspaceFile(t.id,i.id,s,r),await this.refreshFiles(),this.clearSelection(),this.setState({error:""})}catch(r){this.setState({error:String(r)})}}async downloadSelectedFile(){const t=this.getState().selectedProject,i=this.getState().selectedWorkspace,s=this.getState().selectedFilePath;if(!(t===void 0||i===void 0||s===void 0||s===""||vs(this.getState())==="directory"))try{await this.api.downloadWorkspaceFile(t.id,i.id,s,f(this.getState())),this.setState({error:""})}catch(r){this.setState({error:String(r)})}}clearSelection(){this.setState({selectedFilePath:void 0,selectedFileContent:void 0}),he(oi,"file",void 0,{replace:!0}),this.updateUrl({replace:!0})}startWorkspaceUpload(t,i){const s=this.getState().selectedProject,r=this.getState().selectedWorkspace;if(s===void 0||r===void 0){this.setState({error:"Select a workspace before uploading files."});return}if(t.length===0)return;const o=f(this.getState()),n=i.overwrite??!1,a=i.createDirs??!0;let c;try{c=ih({id:this.createUploadBatchId(),projectId:s.id,workspaceId:r.id,machineId:o,destinationFolder:i.destinationFolder,overwrite:n,createDirs:a,files:t,startedAt:this.now()})}catch(h){this.setState({error:String(h)});return}this.setUploadBatch(c);let p;try{p=this.uploadWorkspaceFiles(s.id,r.id,t,{destinationFolder:i.destinationFolder,machineId:o,overwrite:n,createDirs:a,onProgress:h=>{this.updateUploadProgress(c.id,h)}})}catch(h){return this.failUploadBatch(c.id,h),{batchId:c.id,done:Promise.resolve()}}this.uploadTasks.set(c.id,p);const u=p.promise.then(async h=>{await this.completeUploadBatch(c.id,h,i)}).catch(async h=>{await this.handleUploadFailure(c.id,h,i)}).finally(()=>{this.uploadTasks.delete(c.id)});return{batchId:c.id,done:u}}cancelWorkspaceUpload(t){const i=this.getUploadBatch(t);i?.status==="uploading"&&(this.setUploadBatch(Ro(i,this.now())),this.uploadTasks.get(t)?.cancel())}clearWorkspaceUpload(t){this.uploadTasks.get(t)?.cancel(),this.uploadTasks.delete(t),this.setState({workspaceUploadBatches:Mo(this.getState().workspaceUploadBatches,t)})}updateUploadProgress(t,i){const s=this.getUploadBatch(t);s?.status==="uploading"&&this.setUploadBatch(sh(s,i))}async completeUploadBatch(t,i,s){const r=this.getUploadBatch(t);if(r?.status!=="uploading"||(this.setUploadBatch(rh(r,i,this.now()),{error:""}),!this.isCurrentWorkspaceBatch(r)))return;await this.refreshFiles();const o=i[0]?.path;s.selectUploadedFile!==!1&&o!==void 0&&this.isCurrentWorkspaceBatch(r)&&await this.selectFile(o)}async handleUploadFailure(t,i,s){const r=this.failUploadBatch(t,i);if(!(i instanceof Da)||i.responses.length===0||r===void 0||!this.isCurrentWorkspaceBatch(r))return;await this.refreshFiles();const o=i.responses[0]?.path;s.selectUploadedFile!==!1&&o!==void 0&&this.isCurrentWorkspaceBatch(r)&&await this.selectFile(o)}failUploadBatch(t,i){const s=this.getUploadBatch(t);if(s?.status!=="uploading")return;if(ah(i)){const n=Ro(s,this.now());return this.setUploadBatch(n),n}const r=lh(i),o=oh(s,r,this.now());return this.setUploadBatch(o,{error:r}),o}getUploadBatch(t){return this.getState().workspaceUploadBatches[t]}setUploadBatch(t,i={}){this.setState({workspaceUploadBatches:{...this.getState().workspaceUploadBatches,[t.id]:t},...i})}isCurrentWorkspaceBatch(t){const i=this.getState();return i.selectedProject?.id===t.projectId&&i.selectedWorkspace?.id===t.workspaceId&&f(i)===t.machineId}}function To(e){const t=String(e);return t.includes("Path does not exist")||t.includes("ENOENT")||t.includes("no such file or directory")}function ah(e){return e instanceof Ji}function lh(e){return e instanceof Error?e.message:String(e)}function Mo(e,t){return Object.fromEntries(Object.entries(e).filter(([i])=>i!==t))}function vs(e){const t=e.selectedFilePath;return t===void 0?"file":ch(e.fileTree,e.expandedDirs,t)?.type==="directory"?"directory":"file"}function ch(e,t,i){const s=e.find(r=>r.path===i);if(s!==void 0)return s;for(const r of Object.values(t)){const o=r.find(n=>n.path===i);if(o!==void 0)return o}}const Eo=Jt("core:workspace.git");class dh{constructor(t,i,s){this.getState=t,this.setState=i,this.updateUrl=s}dispose(){this.pollTimer!==void 0&&window.clearInterval(this.pollTimer),this.pollTimer=void 0}async refreshGit(){const t=this.getState().selectedProject,i=this.getState().selectedWorkspace;if(!(t===void 0||i===void 0))try{const s=await N.gitStatus(t.id,i.id,f(this.getState()));this.setState({gitStatus:s,gitStale:!1,error:""});const r=this.getState().selectedDiffPath;r!==void 0&&(s.files.some(o=>o.path===r)?await this.refreshDiff(r):(this.setState({selectedDiffPath:void 0,selectedDiff:void 0,selectedStagedDiff:void 0}),he(Eo,"diff",void 0,{replace:!0})))}catch(s){this.setState({error:String(s)})}}async selectDiff(t){this.setState({selectedDiffPath:t,selectedDiff:void 0,selectedStagedDiff:void 0,workspaceTool:"core:workspace.git",mainView:this.getState().mainView==="chat"?"chat":"core:workspace.git"}),he(Eo,"diff",t),this.updateUrl({replace:!0}),await this.refreshDiff(t)}async restoreDiff(t){this.setState({selectedDiffPath:t,selectedDiff:void 0,selectedStagedDiff:void 0}),await this.refreshDiff(t)}async refreshDiff(t){const i=this.getState().selectedProject,s=this.getState().selectedWorkspace;if(!(i===void 0||s===void 0))try{const[r,o]=await Promise.all([N.gitDiff(i.id,s.id,{path:t},f(this.getState())),N.gitDiff(i.id,s.id,{path:t,staged:!0},f(this.getState()))]);this.setState({selectedDiff:r,selectedStagedDiff:o,error:""})}catch(r){this.setState({error:String(r)})}}updatePolling(){this.dispose();const t=this.getState();(t.workspaceTool==="core:workspace.git"||t.mainView==="core:workspace.git")&&(this.pollTimer=window.setInterval(()=>{this.refreshGit()},8e3))}}class ph{constructor(t,i,s,r){this.getState=t,this.setState=i,this.updateUrl=s,this.projects=r}async loadMachines(t){this.setState({error:"",isLoadingMachines:!0});try{const i=await N.machines(),s=await this.selectInitialMachine(i,t),r=new Set(i.map(o=>o.id));this.setState({machines:i,selectedMachine:s,machineActivities:Do(this.getState().machineActivities,r),machineRuntimes:Do(this.getState().machineRuntimes,r)}),this.refreshMachineHealthFor(i),this.refreshMachineRuntimeFor(i)}catch(i){this.setState({error:String(i)})}finally{this.setState({isLoadingMachines:!1})}}async selectMachine(t,i={}){this.getState().selectedMachine?.id!==t.id&&(this.setState({selectedMachine:t,projects:[],workspaces:[],isLoadingWorkspaces:!1,selectedProject:void 0,selectedWorkspace:void 0,selectedSession:void 0,messages:[],messagePageStart:0,messagePageTotal:0,status:void 0,activity:void 0,sessionStatuses:{},sessionActivities:{},sendingPrompts:{},workspaceActivities:{},workspacesByProjectId:{},workspaceDeletionRuns:{},activeTerminalCount:0,...gi()}),i.updateUrl!==!1&&this.updateUrl(),await this.projects.loadProjects(),this.refreshMachineHealth(t.id),this.refreshMachineRuntime(t.id))}async addMachine(t){this.setState({error:""});try{const i=await N.addMachine(t);return this.setState({machines:[...this.getState().machines.filter(s=>s.id!==i.id),i]}),await this.selectMachine(i),i}catch(i){this.setState({error:String(i)});return}}async deleteMachine(t=this.getState().selectedMachine,i={}){if(t!==void 0){if(t.kind==="local"){this.setState({error:"The local machine cannot be removed."});return}try{const s=this.getState().selectedMachine?.id===t.id;await N.deleteMachine(t.id);const r=this.getState().machines.filter(n=>n.id!==t.id),o=r.find(n=>n.id==="local")??r[0];return this.setState({machines:r,machineStatuses:bs(this.getState().machineStatuses,t.id),machineRuntimes:bs(this.getState().machineRuntimes,t.id),machineActivities:bs(this.getState().machineActivities,t.id)}),s&&o!==void 0?(i.selectFallback===!1||await this.selectMachine(o),o):void 0}catch(s){this.setState({error:String(s)});return}}}async refreshMachineHealth(t=this.getState().selectedMachine?.id??"local"){try{const i=await N.health(t);return this.setState({machineStatuses:{...this.getState().machineStatuses,[i.machineId]:i}}),i}catch(i){this.setState({error:String(i)});return}}async refreshMachineRuntime(t=this.getState().selectedMachine?.id??"local"){try{const i=await N.runtime(t);this.setState({machineRuntimes:{...this.getState().machineRuntimes,[i.machineId]:i}})}catch(i){this.setState({error:String(i)})}}async selectInitialMachine(t,i){const s=t.find(o=>o.id===(i??"local"));if(s===void 0)return this.localMachine(t);if(s.kind!=="remote")return s;const r=await this.safeRemoteHealth(s);return this.setState({machineStatuses:{...this.getState().machineStatuses,[r.machineId]:r},...r.ok?{}:{error:`${s.name} is unavailable; reconnecting…`}}),s}async safeRemoteHealth(t){try{return await N.health(t.id)}catch(i){return{machineId:t.id,ok:!1,checkedAt:new Date().toISOString(),status:"offline",error:i instanceof Error?i.message:String(i)}}}localMachine(t){return t.find(i=>i.id==="local")??t[0]}async refreshMachineHealthFor(t){const i=await Promise.allSettled(t.map(r=>N.health(r.id))),s=Object.fromEntries(i.flatMap(r=>r.status==="fulfilled"?[[r.value.machineId,r.value]]:[]));Object.keys(s).length>0&&this.setState({machineStatuses:{...this.getState().machineStatuses,...s}})}async refreshMachineRuntimeFor(t){const i=await Promise.allSettled(t.map(r=>N.runtime(r.id))),s=Object.fromEntries(i.flatMap(r=>r.status==="fulfilled"?[[r.value.machineId,r.value]]:[]));Object.keys(s).length>0&&this.setState({machineRuntimes:{...this.getState().machineRuntimes,...s}})}}function bs(e,t){return Object.fromEntries(Object.entries(e).filter(([i])=>i!==t))}function Do(e,t){return Object.fromEntries(Object.entries(e).filter(([i])=>t.has(i)))}class hh{constructor(t,i,s){this.getState=t,this.setState=i,this.workspaces=s}async loadProjects(){const t=f(this.getState());this.setState({error:"",isLoadingProjects:!0});try{const i=await N.projects(t);if(f(this.getState())!==t)return;const s=new Set(i.map(o=>o.id)),r=Object.fromEntries(Object.entries(this.getState().workspacesByProjectId).filter(([o])=>s.has(o)));this.setState({projects:i,workspacesByProjectId:r})}catch(i){f(this.getState())===t&&this.setState({error:String(i)})}finally{f(this.getState())===t&&this.setState({isLoadingProjects:!1})}}async addProject(t,i){if(t.trim()!=="")try{const s=await N.addProject(t.trim(),void 0,i,f(this.getState())),r=this.getState().projects;this.setState({projects:[...r.filter(o=>o.id!==s.id),s],projectDialogOpen:!1}),await this.workspaces.selectProject(s)}catch(s){this.setState({error:String(s)})}}async closeProject(t){try{await N.closeProject(t,f(this.getState())),this.workspaces.forgetProject(t);const i=this.getState();this.setState({projects:i.projects.filter(s=>s.id!==t)}),i.selectedProject?.id===t&&this.workspaces.clearSelection()}catch(i){this.setState({error:String(i)})}}}const Vs="pi-web:cached-new-sessions:v1",uh="browserCachedNew",It="local";function Qt(){try{return typeof localStorage>"u"?void 0:localStorage}catch{return}}function Wo(e,t=It,i=Qt()){if(e.messageCount!==0||e.archived===!0)return;const s=kr(i).filter(r=>r.id!==e.id||r.machineId!==t);$r([Gs(e,t),...s],i)}function Gs(e,t=It){return{...e,browserCachedNew:!0,machineId:t}}function Oo(e,t=It,i=Qt()){const s=kr(i).filter(r=>r.id!==e||r.machineId!==t);$r(s,i)}function ja(e,t,i=It,s=Qt()){const r=new Set(t.map(c=>c.id)),o=kr(s),n=o.filter(c=>c.machineId!==i||!r.has(c.id));return n.length!==o.length&&$r(n,s),[...n.filter(c=>c.machineId===i&&c.cwd===e),...t]}function Z(e){return e===void 0?!1:mh(e)&&e.browserCachedNew===!0}function fh(e){return{id:e.id,path:e.path,cwd:e.cwd,...e.name===void 0?{}:{name:e.name},created:e.created,modified:e.modified,messageCount:e.messageCount,firstMessage:e.firstMessage,...e.parentSessionPath===void 0?{}:{parentSessionPath:e.parentSessionPath},..."machineId"in e&&typeof e.machineId=="string"?{machineId:e.machineId}:{machineId:It},...e.archived===!0?{archived:!0}:{},...e.archivedAt===void 0?{}:{archivedAt:e.archivedAt}}}function kr(e=Qt()){try{const t=e?.getItem(Vs);if(t==null||t==="")return[];const i=JSON.parse(t);return Array.isArray(i)?i.flatMap(s=>gh(s)):[]}catch{return[]}}function $r(e,t=Qt()){try{e.length===0?t?.removeItem(Vs):t?.setItem(Vs,JSON.stringify(e))}catch{}}function gh(e){if(!vh(e))return[];const t=gt(e,"id"),i=gt(e,"path"),s=gt(e,"cwd"),r=gt(e,"created"),o=gt(e,"modified"),n=gt(e,"firstMessage"),a=bh(e,"messageCount");if(t===void 0||i===void 0||s===void 0||r===void 0||o===void 0||n===void 0||a!==0)return[];const c=ws(e,"name"),p=ws(e,"parentSessionPath"),u=ws(e,"machineId")??It;return[{id:t,path:i,cwd:s,...c===void 0?{}:{name:c},created:r,modified:o,messageCount:a,firstMessage:n,...p===void 0?{}:{parentSessionPath:p},machineId:u,browserCachedNew:!0}]}function mh(e){return uh in e}function vh(e){return typeof e=="object"&&e!==null}function gt(e,t){const i=e[t];return typeof i=="string"?i:void 0}function ws(e,t){const i=e[t];return i===void 0||typeof i!="string"?void 0:i}function bh(e,t){const i=e[t];return typeof i=="number"?i:void 0}function wh(e){return Oh(e.flatMap(Pr)).filter(t=>t.parts.length>0)}function _e(e,t){return{role:e,parts:[{type:"text",text:t}]}}function Et(e,t){const i=Ih(t);return i===void 0?e:{...e,meta:i}}function yh(e,t,i){if(i==="")return e;const s=e.at(-1),r=s?.parts.at(-1);return s?.role===t&&r?.type==="text"?[...e.slice(0,-1),{...s,parts:[...s.parts.slice(0,-1),{...r,text:r.text+i}]}]:s?.role===t?[...e.slice(0,-1),{...s,parts:[...s.parts,{type:"text",text:i}]}]:[...e,_e(t,i)]}function xh(e,t){if(t==="")return e;const i=e.at(-1),s=i?.parts.at(-1);return i?.role==="assistant"&&s?.type==="thinking"?[...e.slice(0,-1),{...i,parts:[...i.parts.slice(0,-1),{...s,text:s.text+t}]}]:i?.role==="assistant"?[...e.slice(0,-1),{...i,parts:[...i.parts,{type:"thinking",text:t}]}]:[...e,{role:"assistant",parts:[{type:"thinking",text:t}]}]}function Pr(e){if(kh(e))return[e];if(_(e,"role")==="bashExecution")return[Et(Th(e),e)];const t=Mh(_(e,"role")),i=Eh(ye(e,"content"),e),s=t==="user"?$h(i):void 0;if(s!==void 0)return s.map(p=>Et(p,e));const r=Ch(e);if(t==="tool")return[Et({role:t,parts:i,...r===void 0?{}:{source:r}},e)];const o=i.filter(p=>p.type!=="empty"),n=t==="assistant"&&o.length>0&&o.every(p=>p.type==="skillRead")?"skill":t,a=o.length>0?[Et({role:n,parts:o,...r===void 0?{}:{source:r}},e)]:[],c=Sh(e);return c===void 0?a:[...a,Et(c,e)]}function Sh(e){if(_(e,"role")!=="assistant"||_(e,"stopReason")!=="error")return;const t=_(e,"errorMessage")?.trim();return _e("system",`Model response failed: ${t===void 0||t===""?"The model returned an error.":t}`)}function kh(e){const t=_(e,"role");return(t==="user"||t==="assistant"||t==="tool"||t==="system"||t==="bash"||t==="skill")&&Array.isArray(ye(e,"parts"))}function $h(e){if(e.length!==1||e[0]?.type!=="text")return;const t=Ph(e[0].text);if(t!==void 0)return[{role:"user",parts:[{type:"skillInvocation",name:t.name,location:t.location,content:t.content}]},...t.userMessage===void 0?[]:[{role:"user",parts:[{type:"text",text:t.userMessage}]}]]}function Ph(e){const t=/^<skill name="([^"]+)" location="([^"]+)">\n([\s\S]*?)\n<\/skill>(?:\n\n([\s\S]+))?$/.exec(e);if(t===null)return;const i=t[4]?.trim();return{name:t[1]??"skill",location:t[2]??"",content:t[3]??"",...i===void 0||i===""?{}:{userMessage:i}}}function Ch(e){const t=_(e,"source");if(t==="compaction"||t==="branch_summary")return t}function Ih(e){const t=Rh(ye(e,"timestamp")),i=Ah(e);if(!(t===void 0&&i===void 0))return{...t===void 0?{}:{timestamp:t},...i===void 0?{}:{model:i}}}function Rh(e){if(typeof e=="number"&&Number.isFinite(e))return new Date(e).toISOString();if(typeof e!="string"||e==="")return;const t=Date.parse(e);return Number.isFinite(t)?new Date(t).toISOString():void 0}function Ah(e){if(_(e,"role")!=="assistant")return;const t=_(e,"provider"),i=_(e,"model"),s=_(e,"responseModel");if(!((t===void 0||t==="")&&(i===void 0||i==="")&&(s===void 0||s==="")))return{...t===void 0||t===""?{}:{provider:t},...i===void 0||i===""?{}:{id:i},...s===void 0||s===""?{}:{responseId:s}}}function Th(e){const t=_(e,"command")??"",i=mi(e,"excludeFromContext")===!0?["excluded from context","",`$ ${t}`]:[`$ ${t}`],s=ye(e,"output");s!=null&&i.push("",Ai(s));const r=ye(e,"exitCode");r!=null&&i.push("",`exit ${Ai(r)}`),mi(e,"cancelled")===!0&&i.push("","cancelled"),mi(e,"truncated")===!0&&i.push("","output truncated");const o=_(e,"fullOutputPath");return o!==void 0&&o!==""&&i.push("",`full output: ${o}`),{role:"bash",parts:[{type:"text",text:i.join(`
5
5
  `)}]}}function Mh(e){return e==="assistant"?"assistant":e==="user"?"user":e==="toolResult"?"tool":"system"}function Eh(e,t){return typeof e=="string"?e!==""?[{type:"text",text:e}]:[]:Array.isArray(e)?e.flatMap(i=>{const s=_(i,"type"),r=_(i,"text");if(s==="text")return r!==void 0&&r!==""?[{type:"text",text:r}]:[];if(s==="thinking"){const o=_(i,"thinking")??r;return o!==void 0&&o!==""?[{type:"thinking",text:o}]:[]}if(s==="toolCall"){const o=_(i,"name")??"tool",n=ye(i,"arguments"),a=_(i,"id"),c=o==="read"?Wh(_(n,"path")):void 0;return c!==void 0?[{type:"skillRead",...c,...a===void 0?{}:{toolCallId:a}}]:[{type:"toolCall",...a===void 0?{}:{toolCallId:a},toolName:o,summary:Zt(n),...n===void 0?{}:{args:n}}]}if(s==="image"){const o=_(i,"data"),n=_(i,"mimeType");return o!==void 0&&o!==""&&n!==void 0&&n!==""?[{type:"image",mimeType:n,data:o}]:[{type:"text",text:"[image]"}]}return _o(i)}).map(i=>i.type==="text"&&_(t,"role")==="toolResult"?Dh(i.text,t):i):_o(e)}function Dh(e,t){const i=_(t,"toolCallId"),s=ye(t,"content"),r=ye(t,"details");return{type:"toolResult",...i===void 0?{}:{toolCallId:i},toolName:_(t,"toolName")??"tool",text:e,...s===void 0?{}:{content:s},...r===void 0?{}:{details:r},isError:mi(t,"isError")===!0}}function Wh(e){if(e===void 0||e==="")return;const t=e.replace(/\\/g,"/");if(!t.endsWith("/SKILL.md")&&t!=="SKILL.md")return;const i=t.split("/").at(-2);if(!(i===void 0||i===""))return{name:i,path:e}}function Oh(e){const t=[],i=new Map;for(const s of e){let r=[];const o={...s.source===void 0?{}:{source:s.source},...s.meta===void 0?{}:{meta:s.meta}},n=()=>{r.length!==0&&(t.push({role:s.role,parts:r,...o}),r=[])};for(const a of s.parts){if(a.type==="toolCall"){n();const c=_h(a),p=t.length;t.push({role:"tool",parts:[c],...o}),c.toolCallId!==void 0&&i.set(c.toolCallId,{lineIndex:p,partIndex:0});continue}if(a.type==="toolResult"){const c=a.toolCallId===void 0?void 0:i.get(a.toolCallId);if(c!==void 0&&Lh(t,c,a)){i.delete(a.toolCallId??"");continue}}r.push(a)}n()}return t}function _h(e){return{type:"toolExecution",...e.toolCallId===void 0?{}:{toolCallId:e.toolCallId},toolName:e.toolName,summary:e.summary,...e.args===void 0?{}:{args:e.args},status:"pending"}}function Lh(e,t,i){const s=e[t.lineIndex],r=s?.parts[t.partIndex];if(s===void 0||r?.type!=="toolExecution")return!1;const o=Ri(i.details)??r.preview,n={...r,status:i.isError?"error":"success",resultText:i.text,...i.content===void 0?{}:{content:i.content},...i.details===void 0?{}:{details:i.details},...o===void 0?{}:{preview:o}};return e[t.lineIndex]={...s,parts:[...s.parts.slice(0,t.partIndex),n,...s.parts.slice(t.partIndex+1)]},!0}function Ri(e){const t=ye(e,"preview");if(!Cr(t))return;const i=_(t,"diff"),s=_(t,"error"),r=Fh(t,"firstChangedLine");if(!(i===void 0&&s===void 0&&r===void 0))return{...i===void 0?{}:{diff:i},...s===void 0?{}:{error:s},...r===void 0?{}:{firstChangedLine:r}}}function _o(e){return e==null?[]:typeof e=="object"?[{type:"text",text:Zt(e)}]:[{type:"text",text:Ai(e)}]}function Zt(e){if(!Cr(e))return Ai(e);const t=_(e,"command");if(t!==void 0)return t;const i=_(e,"path");if(i!==void 0)return i;if(typeof e.oldText=="string"&&typeof e.newText=="string")return"edit text replacement";const s=e.edits;return Array.isArray(s)?`${String(s.length)} edit${s.length===1?"":"s"}`:Object.entries(e).filter(([,o])=>o!=null).slice(0,3).map(([o,n])=>`${o}: ${jh(n)}`).join(" · ")}function jh(e){return typeof e=="string"?e.length>80?`${e.slice(0,77)}…`:e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?`${String(e.length)} item${e.length===1?"":"s"}`:typeof e=="object"&&e!==null?"object":""}function Cr(e){return typeof e=="object"&&e!==null}function ye(e,t){return Cr(e)?e[t]:void 0}function _(e,t){const i=ye(e,t);return typeof i=="string"?i:void 0}function mi(e,t){const i=ye(e,t);return typeof i=="boolean"?i:void 0}function Fh(e,t){const i=ye(e,t);return typeof i=="number"&&Number.isFinite(i)?i:void 0}function Ai(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"||typeof e=="bigint"?String(e):""}const Uh="pi-web:prompt-draft:";function Ti(e){return`${Uh}${e}`}function Qi(){try{return typeof localStorage>"u"?void 0:localStorage}catch{return}}function Fa(e,t=Qi()){try{return t?.getItem(Ti(e))??""}catch{return""}}function Mi(e,t,i=Qi()){try{t?i?.setItem(Ti(e),t):i?.removeItem(Ti(e))}catch{}}function Ir(e,t=Qi()){try{t?.removeItem(Ti(e))}catch{}}function zh(e,t,i=Qi()){const s=Fa(e,i);s!==""&&(Mi(t,s,i),Ir(e,i))}function Bh(e,t){return _e("bash",`${t===!0?`不加入上下文
6
6
 
7
7
  `:""}$ ${e}`)}function Nh(e,t){const i=e.at(-1),s=i?.parts.at(-1);if(i?.role!=="bash"||s?.type!=="text")return[...e,_e("bash",t)];const r=qh(s.text)?"":`
@@ -21,7 +21,7 @@ ${r.join(`
21
21
  `)+1,s=e.slice(i),r=zo(s,"@ "),o=zo(s,"!@"),n=Math.max(r,o);if(n===-1)return;const a=n===o?"!@":"@ ",c=i+n,p=c+a.length;return{kind:"file",query:e.slice(p),from:c,to:t,fileScope:"all",allPrefix:a}}function zo(e,t){for(let i=e.lastIndexOf(t);i>=0;i=e.lastIndexOf(t,i-1))if(i===0||Cu(e[i-1]))return i;return-1}function Cu(e){return e===" "||e===" "}function Oi(e){const t=e.trimStart();return t.startsWith("!@")?{kind:"file"}:t.startsWith("!")?{kind:"shell",excludeFromContext:t.startsWith("!!")}:Au(e).startsWith("/")?{kind:"command"}:qa(e)?.kind==="file"?{kind:"file"}:{kind:"normal"}}function Iu(e){return Oi(e).kind==="shell"}function Ru(e,t){return e.kind!==t.kind?!1:e.kind==="shell"&&t.kind==="shell"?e.excludeFromContext===t.excludeFromContext:!0}function Au(e){const t=Math.max(e.lastIndexOf(" "),e.lastIndexOf(`
22
22
  `))+1;return e.slice(t)}class Tu{constructor(){this.reconnectDelay=500,this.shouldReconnect=!1,this.hasOpened=!1,this.machineId="local"}connect(t,i,s,r="local"){this.close(),this.machineId=r,this.session=t,this.onEvent=i,this.onReconnect=s,this.shouldReconnect=!0,this.open()}setHandler(t){this.onEvent=t}close(){this.shouldReconnect=!1,window.clearTimeout(this.reconnectTimer),Ga(this.socket),this.socket=void 0,this.session=void 0,this.onEvent=void 0,this.onReconnect=void 0,this.hasOpened=!1,this.machineId="local"}open(){if(this.session===void 0||this.session.id===""||this.session.cwd===""||!this.shouldReconnect)return;const t=Ep(this.session,this.machineId);this.socket=t,t.onopen=()=>{this.reconnectDelay=500,this.hasOpened&&this.onReconnect?.(),this.hasOpened=!0},t.onmessage=i=>{this.handleMessage(i.data)},t.onerror=()=>{t.close()},t.onclose=()=>{this.socket===t&&(this.socket=void 0),this.scheduleReconnect()}}scheduleReconnect(){if(!this.shouldReconnect)return;window.clearTimeout(this.reconnectTimer);const t=this.reconnectDelay;this.reconnectDelay=Math.min(this.reconnectDelay*1.6,5e3),this.reconnectTimer=window.setTimeout(()=>{this.open()},t)}async handleMessage(t){const i=await Va(t);Mu(i)&&this.onEvent?.(i)}}class Bo{constructor(){this.reconnectDelay=500,this.shouldReconnect=!1,this.machineId="local"}connect(t,i,s="local"){this.close(),this.machineId=s,this.onEvent=t,this.onOpen=i,this.shouldReconnect=!0,this.open()}close(){this.shouldReconnect=!1,window.clearTimeout(this.reconnectTimer),Ga(this.socket),this.socket=void 0,this.onEvent=void 0,this.onOpen=void 0,this.machineId="local"}open(){if(!this.shouldReconnect)return;const t=Dp(this.machineId);this.socket=t,t.onopen=()=>{this.reconnectDelay=500,this.onOpen?.()},t.onmessage=i=>{this.handleMessage(i.data)},t.onerror=()=>{t.close()},t.onclose=()=>{this.socket===t&&(this.socket=void 0),this.scheduleReconnect()}}scheduleReconnect(){if(!this.shouldReconnect)return;window.clearTimeout(this.reconnectTimer);const t=this.reconnectDelay;this.reconnectDelay=Math.min(this.reconnectDelay*1.6,5e3),this.reconnectTimer=window.setTimeout(()=>{this.open()},t)}async handleMessage(t){const i=await Va(t);Du(i)&&this.onEvent?.(i)}}function Mu(e){const t=Rr(e);return["message.append","assistant.delta","assistant.thinking.delta","tool.start","tool.update","tool.end","shell.start","shell.chunk","shell.end","agent.start","agent.end","message.end","status.update","activity.update","command.output","session.error","session.name","session.created","pi.event"].includes(t)}function Eu(e){const t=Rr(e);return t==="status.update"||t==="activity.update"||t==="session.name"||t==="session.created"}function Du(e){const t=Rr(e);return Eu(e)||t==="terminal.created"||t==="terminal.exited"||t==="terminal.closed"||t==="workspace.activity"}function Rr(e){if(typeof e!="object"||e===null||!("type"in e))return"";const t=e.type;return typeof t=="string"?t:""}async function Va(e){try{return typeof e=="string"?JSON.parse(e):e instanceof Blob?JSON.parse(await e.text()):e instanceof ArrayBuffer?JSON.parse(new TextDecoder().decode(e)):void 0}catch{return}}function Ga(e){if(e!==void 0){if(e.onmessage=null,e.onerror=null,e.onclose=null,e.readyState===WebSocket.CONNECTING){e.onopen=()=>{e.close()};return}e.close()}}function Xt(){try{return typeof sessionStorage>"u"?void 0:sessionStorage}catch{return}}class Zi{constructor(t,i,s=Xt()){this.storageKey=t,this.storage=s,this.values=new Map;for(const[r,o]of Wu(t,i,s))this.values.set(r,o)}get(t){return this.values.get(t)}set(t,i){this.values.set(t,i),this.save()}delete(t){this.values.delete(t),this.save()}entries(){return[...this.values.entries()]}save(){try{if(this.values.size===0){this.storage?.removeItem(this.storageKey);return}const t={version:1,entries:[...this.values.entries()]};this.storage?.setItem(this.storageKey,JSON.stringify(t))}catch{}}}function Ar(e){return typeof e=="string"&&e!==""?e:void 0}function Wu(e,t,i){try{const s=i?.getItem(e);if(s==null||s==="")return[];const r=JSON.parse(s);if(!Ou(r))return[];const o=[];for(const n of r.entries){const a=n[0],c=t(n[1]);c!==void 0&&o.push([a,c])}return o}catch{return[]}}function Ou(e){return!_u(e)||e.version!==1||!Array.isArray(e.entries)?!1:e.entries.every(t=>Array.isArray(t)&&t.length===2&&typeof t[0]=="string"&&t[0]!=="")}function _u(e){return typeof e=="object"&&e!==null}class Lu{constructor(){this.sessionIdsByCwd=new Map}latestSessionId(t){return this.sessionIdsByCwd.get(t)}rememberSession(t){this.sessionIdsByCwd.set(t.cwd,t.id)}forgetWorkspace(t){this.sessionIdsByCwd.delete(t)}}const ju="pi-web:session-selection:v1";class Fu{constructor(t=Xt()){this.sessionIdsByCwd=new Zi(ju,Ar,t)}latestSessionId(t){return this.sessionIdsByCwd.get(t)}rememberSession(t){this.sessionIdsByCwd.set(t.cwd,t.id)}forgetWorkspace(t){this.sessionIdsByCwd.delete(t)}}function Uu(e,t){const i=t?.targetSessionId;if(i!==void 0&&i!=="")return Bu(e,i);const s=t?.latestSessionId;return s!==void 0&&s!==""?e.find(r=>r.id===s)??e.find(r=>r.archived!==!0):e.find(r=>r.archived!==!0)}function zu(e,t){return t?.archived!==!0?!1:!e.some(i=>i.archived!==!0)}function Bu(e,t){return e.find(i=>i.id===t||i.id.startsWith(t))}function Nu(e,t,i){return vi(e,[t],i)}function vi(e,t,i){const s=new Set(t);return e.map(r=>s.has(r.id)?{...r,archived:!0,archivedAt:i}:r)}function Hu(e,t,i){return bi(e,t,[i])}function bi(e,t,i){if(t===void 0||!i.includes(t))return{type:"unchanged"};const s=new Set(i),r=e.find(o=>!s.has(o.id)&&o.archived!==!0);return r===void 0?{type:"clear"}:{type:"select",session:r}}const Dt=100,No=4;class qu{constructor(t,i,s,r=new Lu,o={}){this.getState=t,this.setState=i,this.updateUrl=s,this.sessionSelection=r,this.selectionSeq=0,this.pendingTranscriptEvents=[],this.pendingStatusBySession=new Map,this.pendingActivityBySession=new Map,this.socket=o.socket??new Tu,this.api=o.api??N,this.transcripts=o.transcripts??new ku}applyGlobalEvent(t){t.type==="status.update"?this.queueStatusUpdate(t.status):t.type==="activity.update"?this.queueActivityUpdate(t.activity):t.type==="session.created"?this.applyCreatedSession(t.session):this.applySessionName(t.sessionId,t.name)}dispose(){this.socket.close(),this.clearPendingUpdates()}clearActiveSession(){this.selectionSeq+=1,this.socket.close(),this.catchupStreamSessionId=void 0,this.clearPendingUpdates(),this.setState({selectedSession:void 0,messages:[],messagePageStart:0,messagePageEnd:0,messagePageTotal:0,isLoadingEarlierMessages:!1,isReceivingPartialStream:!1,status:void 0,activity:void 0,availableThinkingLevels:[]})}deselectSession(t){const i=this.getState(),s=i.selectedSession?.cwd??i.selectedWorkspace?.path;t?.forgetRememberedSelection===!0&&s!==void 0&&this.sessionSelection.forgetWorkspace(this.workspaceSelectionKey(s)),this.clearActiveSession(),t?.updateUrl!==!1&&this.updateUrl()}clearSelectionAfterArchivedCollapse(){const t=this.getState();zu(t.sessions,t.selectedSession)&&this.deselectSession({forgetRememberedSelection:!0})}async startSession(){const t=this.getState().selectedWorkspace;if(t)try{const i=f(this.getState()),s=await this.api.startSession(t.path,i);Wo(s,i);const r=Gs(s,i);this.setState({sessions:[r,...this.getState().sessions.filter(o=>o.id!==r.id)]}),await this.selectSession(r)}catch(i){this.setState({error:String(i)})}}preferredSession(t,i,s){return Uu(i,{targetSessionId:s,latestSessionId:this.sessionSelection.latestSessionId(this.workspaceSelectionKey(t))})}async selectSession(t,i){this.sessionSelection.rememberSession({...t,cwd:this.workspaceSelectionKey(t.cwd)});const s=++this.selectionSeq;this.socket.close(),this.catchupStreamSessionId=void 0,this.clearPendingUpdates();const r=this.sessionCacheKey(t.id),o=this.transcripts.cachedView(r);this.setState({selectedSession:t,...o,isLoadingEarlierMessages:!1,isReceivingPartialStream:!1,status:t.archived===!0?void 0:this.getState().sessionStatuses[t.id],activity:t.archived===!0?void 0:this.getState().sessionActivities[t.id]});try{if(t.archived===!0){const u=await this.api.messages(t,{limit:Dt},f(this.getState()));if(s!==this.selectionSeq||this.getState().selectedSession?.id!==t.id)return;const h=this.transcripts.mergeHistory(r,u);this.setState({...h,isLoadingEarlierMessages:!1,isReceivingPartialStream:!1,status:void 0,activity:void 0}),i?.updateUrl!==!1&&this.updateUrl();return}const n=[];this.socket.connect(t,u=>n.push(u),()=>{this.refreshSelectedSession(t.id)},f(this.getState()));const[a,c]=await Promise.all([this.api.messages(t,{limit:Dt},f(this.getState())),this.api.status(t,f(this.getState()))]);if(s!==this.selectionSeq||this.getState().selectedSession?.id!==t.id)return;const p=this.transcripts.mergeHistory(r,a);this.setState({...p,isLoadingEarlierMessages:!1,...this.setStreamCatchup(c.isStreaming?t.id:void 0),status:c,activity:this.getState().sessionActivities[t.id],availableThinkingLevels:[]}),this.applyStatus(c),this.refreshAvailableThinkingLevels();for(const u of n)this.applyEvent(u);this.socket.setHandler(u=>{this.applyEvent(u)}),i?.updateUrl!==!1&&this.updateUrl()}catch(n){if(s!==this.selectionSeq||this.getState().selectedSession?.id!==t.id)return;if(Z(t)&&Xu(n)){await this.recreateCachedNewSession(t,i);return}this.setState({error:String(n)})}}async loadEarlierMessages(){const t=this.getState(),i=t.selectedSession;if(!(!i||t.isLoadingEarlierMessages||t.messagePageStart<=0)){this.setState({isLoadingEarlierMessages:!0});try{const s=await this.api.messages(i,{before:t.messagePageStart,limit:Dt},f(this.getState()));if(this.getState().selectedSession?.id!==i.id)return;const r=this.transcripts.mergeHistory(this.sessionCacheKey(i.id),s);this.setState(r)}catch(s){this.setState({error:String(s)})}finally{this.getState().selectedSession?.id===i.id&&this.setState({isLoadingEarlierMessages:!1})}}}async send(t,i,s,r="inline"){const o=t.trim(),n=s!==void 0&&s.length>0;if(!n&&o.startsWith("/"))return this.runCommand(t);if(!n&&Iu(t))return this.runShell(t);const a=this.getState().selectedSession;if(!a||a.archived===!0)return;const c=a.id,p=f(this.getState());n&&this.markSendingPrompt(c,!0);try{if(n&&r==="folder"){const h=(await this.api.saveAttachments(a,s,p)).map(w=>Ka(w.path,!1)).join(" "),g=t===""?h:`${t}
23
23
 
24
- ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.markCachedNewSessionPersisted(a)}catch(u){this.setState({error:String(u)})}finally{n&&this.markSendingPrompt(c,!1)}}markSendingPrompt(t,i){const s=this.getState().sendingPrompts;i?s[t]!==!0&&this.setState({sendingPrompts:{...s,[t]:!0}}):t in s&&this.setState({sendingPrompts:Ja(s,t)})}async runShell(t){const i=this.getState().selectedSession;if(!(!i||i.archived===!0)){this.setState({messages:[...this.getState().messages,_e("user",t)]});try{await this.api.shell(i,t,f(this.getState())),this.markCachedNewSessionPersisted(i)}catch(s){this.setState({messages:[...this.getState().messages,_e("system",String(s))],error:String(s)})}}}async runCommand(t){const i=this.getState().selectedSession;if(!i||i.archived===!0)return;const s=i.id;this.markSendingPrompt(s,!0);try{this.applyCommandResult(await this.api.runCommand(i,t,f(this.getState()))),this.markCachedNewSessionPersisted(i)}catch(r){this.setState({messages:[...this.getState().messages,_e("system",String(r))],error:String(r)})}finally{this.markSendingPrompt(s,!1)}}async respondToCommand(t,i){const s=this.getState().selectedSession;if(s){this.setState({commandDialog:void 0});try{this.applyCommandResult(await this.api.respondToCommand(s,t,i,f(this.getState())))}catch(r){this.setState({error:String(r)})}}}cancelCommand(){this.setState({commandDialog:void 0})}applySessionStatus(t){this.applyStatus(t)}async archiveSession(t=this.getState().selectedSession){if(t){if(Z(t)){await this.deleteCachedNewSession(t);return}try{await this.api.archive(t,f(this.getState()));const i=this.getState(),s=Nu(i.sessions,t.id,new Date().toISOString()),r=Hu(s,i.selectedSession?.id,t.id);this.setState({sessions:s}),r.type==="select"?await this.selectSession(r.session):r.type==="clear"&&this.deselectSession({forgetRememberedSelection:!0})}catch(i){this.setState({error:String(i)})}}}async archiveSessionWithDescendants(t=this.getState().selectedSession){if(!(!t||Z(t)))try{const i=await this.api.archiveWithDescendants(t,f(this.getState())),s=i.sessionIds!==void 0&&i.sessionIds.length>0?i.sessionIds:[t.id],r=this.getState(),o=vi(r.sessions,s,new Date().toISOString()),n=bi(o,r.selectedSession?.id,s);this.setState({sessions:o}),n.type==="select"?await this.selectSession(n.session):n.type==="clear"&&this.deselectSession({forgetRememberedSelection:!0})}catch(i){this.setState({error:String(i)})}}async archiveSessions(t){const i=qo(t).filter(s=>s.archived!==!0&&!Z(s));if(i.length!==0)try{const s=f(this.getState()),{succeededIds:r,failures:o,generatedAt:n}=await this.archiveSessionBatch(i,s);if(r.length>0){const a=this.getState(),c=vi(a.sessions,r,n??new Date().toISOString()),p=bi(c,a.selectedSession?.id,r);this.setState({sessions:c}),p.type==="select"?await this.selectSession(p.session):p.type==="clear"&&this.deselectSession({forgetRememberedSelection:!0})}this.applyBulkSessionFailures("Archive",o)}catch(s){this.setState({error:`Archive failed: ${Qs(s)}`})}}async deleteArchivedSessions(t){const i=qo(t).filter(o=>o.archived===!0);if(i.length===0)return;const s=f(this.getState()),r=this.getState().machineRuntimes[s];if(r?.ok!==!0||!Be(r,Oe.sessionsDeleteArchived)){this.setState({error:"Deleting archived sessions requires an updated Pi-Web runtime on this machine."});return}try{const{succeededIds:o,failures:n}=await this.deleteArchivedSessionBatch(i,s);if(o.length>0){const a=new Set(o),c=this.getState(),p=c.sessions.filter(u=>!a.has(u.id));if(this.setState({sessions:p}),c.selectedSession!==void 0&&a.has(c.selectedSession.id)){const u=p.find(h=>h.archived!==!0)??p[0];u!==void 0?await this.selectSession(u):this.deselectSession({forgetRememberedSelection:!0})}}this.applyBulkSessionFailures("Delete",n)}catch(o){this.setState({error:`Delete failed: ${Qs(o)}`})}}async archiveSessionBatch(t,i){const s=this.getState().machineRuntimes[i];if(s?.ok===!0&&Be(s,Oe.sessionsBulkMutations)){const o=await this.api.archiveMany(t,i);return{succeededIds:o.archivedSessionIds,failures:Vo(o.failures),generatedAt:o.generatedAt}}const r=await Jo(t,No,async o=>(await this.api.archive(o,i),o.id));return{succeededIds:Ko(r),failures:Go(t,r)}}async deleteArchivedSessionBatch(t,i){const s=this.getState().machineRuntimes[i];if(s?.ok===!0&&Be(s,Oe.sessionsBulkMutations)){const o=await this.api.deleteArchivedMany(t,i);return{succeededIds:o.deletedSessionIds,failures:Vo(o.failures)}}const r=await Jo(t,No,async o=>(await this.api.deleteArchived(o,i),o.id));return{succeededIds:Ko(r),failures:Go(t,r)}}async applySessionCleanupResult(t,i=f(this.getState())){if(f(this.getState())!==i)return;const s=t.archivedSessionIds,r=t.deletedSessionIds;if(s.length>0||r.length>0){const o=this.getState(),n=new Set(r),a=[...s,...r],c=vi(o.sessions,s,t.generatedAt).filter(u=>!n.has(u.id)),p=o.selectedSession!==void 0&&a.includes(o.selectedSession.id);if(this.setState({sessions:c,sessionStatuses:Ho(o.sessionStatuses,a),sessionActivities:Ho(o.sessionActivities,a),...p?{status:void 0,activity:void 0}:{}}),o.selectedSession!==void 0&&n.has(o.selectedSession.id)){const u=c.find(h=>h.archived!==!0)??c[0];u!==void 0?await this.selectSession(u):this.deselectSession({forgetRememberedSelection:!0})}else{const u=bi(c,o.selectedSession?.id,s);u.type==="select"?await this.selectSession(u.session):u.type==="clear"&&this.deselectSession({forgetRememberedSelection:!0})}}await this.refreshCurrentWorkspaceSessions(i)}async refreshCurrentWorkspaceSessions(t=f(this.getState())){const i=this.getState().selectedWorkspace;if(i!==void 0)try{const s=ja(i.path,await this.api.sessions(i.path,t),t);if(f(this.getState())!==t||this.getState().selectedWorkspace?.id!==i.id)return;const r=this.getState().selectedSession;if(this.setState({sessions:s}),r===void 0)return;const o=s.find(a=>a.id===r.id);if(o!==void 0){o!==r&&this.setState({selectedSession:o});return}const n=s.find(a=>a.archived!==!0)??s[0];n!==void 0?await this.selectSession(n):this.deselectSession({forgetRememberedSelection:!0})}catch(s){f(this.getState())===t&&this.getState().selectedWorkspace?.id===i.id&&this.setState({error:String(s)})}}async deleteCachedNewSession(t=this.getState().selectedSession){if(!Z(t))return;this.api.stop(t,f(this.getState())).catch(()=>{}),Oo(t.id,f(this.getState())),Ir(this.sessionCacheKey(t.id));const i=this.getState().sessions.filter(r=>r.id!==t.id);if(this.setState({sessions:i}),this.getState().selectedSession?.id!==t.id)return;const s=i.find(r=>r.archived!==!0)??i[0];s!==void 0?await this.selectSession(s):(this.clearActiveSession(),this.updateUrl())}async restoreSession(t=this.getState().selectedSession){if(t)try{await this.api.restore(t,f(this.getState()));const i={...t};delete i.archived,delete i.archivedAt,this.replaceSession(i),this.getState().selectedSession?.id===i.id&&await this.selectSession(i)}catch(i){this.setState({error:String(i)})}}async reloadSession(t=this.getState().selectedSession){if(t===void 0||Z(t)||t.archived===!0)return;const i=f(this.getState()),s=this.getState().machineRuntimes[i];if(s?.ok!==!0||!Be(s,Oe.sessionsReload)){this.setState({error:"Reloading sessions requires an updated Pi-Web runtime on this machine."});return}try{await this.api.reloadSession(t.id,i),this.transcripts.discard(this.sessionCacheKey(t.id)),this.getState().selectedSession?.id===t.id&&await this.selectSession(t,{updateUrl:!1})}catch(r){this.setState({error:String(r)})}}async detachParent(t=this.getState().selectedSession){if(t?.parentSessionPath!==void 0)try{await this.api.detachParent(t,f(this.getState()));const i={...t};delete i.parentSessionPath,this.replaceSession(i)}catch(i){this.setState({error:String(i)})}}async listModels(){const t=this.getState().selectedSession;if(!t||t.archived===!0)return[];try{return(await this.api.models(t,f(this.getState()))).models}catch(i){return this.setState({error:String(i)}),[]}}async setModel(t,i){const s=this.getState().selectedSession;if(!(!s||s.archived===!0))try{this.applyStatus(await this.api.setModel(s,t,i,f(this.getState()))),await this.refreshAvailableThinkingLevels()}catch(r){this.setState({error:String(r)})}}async cycleModel(t){const i=this.getState().selectedSession;if(!(!i||i.archived===!0))try{this.applyStatus(await this.api.cycleModel(i,t,f(this.getState()))),await this.refreshAvailableThinkingLevels()}catch(s){this.setState({error:String(s)})}}async listThinkingLevels(){const t=this.getState().selectedSession;if(!t||t.archived===!0)return[];try{return(await this.api.thinkingLevels(t,f(this.getState()))).levels}catch(i){return this.setState({error:String(i)}),[]}}async refreshAvailableThinkingLevels(){const t=this.getState().selectedSession;if(!t||t.archived===!0){this.getState().availableThinkingLevels.length>0&&this.setState({availableThinkingLevels:[]});return}const i=await this.listThinkingLevels();this.getState().selectedSession?.id===t.id&&this.setState({availableThinkingLevels:i})}async setThinkingLevel(t){const i=this.getState().selectedSession;if(!(!i||i.archived===!0))try{this.applyStatus(await this.api.setThinkingLevel(i,t,f(this.getState())))}catch(s){this.setState({error:String(s)})}}async cycleThinkingLevel(){const t=this.getState().selectedSession;if(!(!t||t.archived===!0))try{this.applyStatus(await this.api.cycleThinkingLevel(t,f(this.getState())))}catch(i){this.setState({error:String(i)})}}async stopActiveWork(){const t=this.getState().selectedSession;if(t)try{await this.api.abort(t,f(this.getState()))}catch(i){this.setState({error:String(i)})}}async refreshSelectedSession(t=this.getState().selectedSession?.id){const i=this.getState().selectedSession;if(!(t===void 0||i?.id!==t||i.archived===!0))try{this.flushPendingUpdates();const[s,r]=await Promise.all([this.api.messages(i,{limit:Dt},f(this.getState())),this.api.status(i,f(this.getState()))]);if(this.getState().selectedSession?.id!==t)return;const o=this.transcripts.mergeHistory(this.sessionCacheKey(t),s);this.setState({...o,status:r,activity:this.getState().sessionActivities[t],...this.setStreamCatchup(r.isStreaming?t:void 0)}),this.applyStatus(r)}catch(s){this.getState().selectedSession?.id===t&&this.setState({error:String(s)})}}applyBulkSessionFailures(t,i){i.length!==0&&this.setState({error:`${t} failed for ${String(i.length)} session${i.length===1?"":"s"}: ${i.join("; ")}`})}sessionCacheKey(t){return La(f(this.getState()),t)}workspaceSelectionKey(t){return`${f(this.getState())}:${t}`}replaceSession(t){const i=this.getState().selectedSession;this.setState({sessions:this.getState().sessions.map(s=>s.id===t.id?t:s),selectedSession:i?.id===t.id?t:i})}async recreateCachedNewSession(t,i){try{const s=f(this.getState()),r=await this.api.startSession(t.cwd,s);Wo(r,s),zh(this.sessionCacheKey(t.id),this.sessionCacheKey(r.id)),Oo(t.id,s);const o=Gs(r,s);this.setState({sessions:[o,...this.getState().sessions.filter(n=>n.id!==t.id)],error:""}),await this.selectSession(o,{updateUrl:!1}),this.updateUrl(i?.updateUrl===!1?{replace:!0}:void 0)}catch(s){this.setState({error:String(s)})}}markCachedNewSessionPersisted(t){if(!Z(t))return;const i=this.getState().sessions.find(s=>s.id===t.id)??t;this.replaceSession(fh(i))}applyCommandResult(t){if(t.type==="select"){this.setState({commandDialog:t});return}const i=(t.type==="unsupported",t.message);if(i!==void 0&&i!==""&&this.setState({messages:[...this.getState().messages,_e(t.type==="unsupported"?"system":"tool",i)]}),t.type==="done"&&t.session){t.promptDraft!==void 0&&Mi(this.sessionCacheKey(t.session.id),t.promptDraft);const s=this.getState().selectedSession,r=[t.session,...this.getState().sessions.filter(o=>o.id!==t.session?.id)];this.setState({sessions:r,selectedSession:s?.id===t.session.id?t.session:s}),s?.id!==t.session.id&&this.selectSession(t.session)}}applyCreatedSession(t){const i=this.getState();i.selectedWorkspace?.path===t.cwd&&(i.sessions.some(s=>s.id===t.id)||this.setState({sessions:[t,...i.sessions]}))}applyActivity(t){this.setState({sessionActivities:{...this.getState().sessionActivities,[t.sessionId]:t},activity:this.getState().selectedSession?.id===t.sessionId?t:this.getState().activity})}applyStatus(t){const i=this.getState(),s=i.sessionActivities[t.sessionId]?.phase==="active"&&!Ye(t);this.setState({sessionStatuses:{...i.sessionStatuses,[t.sessionId]:t},...Ju(i,t.sessionId,t.messageCount),...s?{sessionActivities:Ku(i.sessionActivities,t.sessionId)}:{},status:i.selectedSession?.id===t.sessionId?t:i.status,activity:i.selectedSession?.id===t.sessionId&&s?void 0:i.activity}),t.isStreaming||this.finishStreamCatchup(t.sessionId)}applySessionName(t,i){const s=o=>{if(o.id!==t)return o;const n={...o};return i===void 0||i===""?delete n.name:n.name=i,n},r=this.getState().selectedSession;this.setState({sessions:this.getState().sessions.map(s),selectedSession:r===void 0?void 0:s(r)})}applyEvent(t){const i=this.getState().selectedSession?.id;if(this.catchupStreamSessionId!==void 0&&this.catchupStreamSessionId===i){if(t.type==="message.end"||t.type==="agent.end"){this.finishStreamCatchup(this.catchupStreamSessionId);return}if(Qu(t))return}if(t.type==="status.update"){this.queueStatusUpdate(t.status);return}if(t.type==="activity.update"){this.queueActivityUpdate(t.activity);return}if(Zu(t)){this.queueTranscriptEvent(t);return}this.flushPendingUpdates();const s=this.transcripts.applyLiveEvent(this.getState().messages,t);s?this.setState({messages:s}):t.type==="session.name"&&this.applySessionName(t.sessionId,t.name)}queueTranscriptEvent(t){this.pendingTranscriptEvents.push(t),this.schedulePendingFlush()}queueStatusUpdate(t){this.pendingStatusBySession.set(t.sessionId,t),this.schedulePendingFlush()}queueActivityUpdate(t){this.pendingActivityBySession.set(t.sessionId,t),this.schedulePendingFlush()}schedulePendingFlush(){this.pendingFrame===void 0&&(this.pendingFrame=requestAnimationFrame(()=>{this.pendingFrame=void 0,this.flushPendingUpdates()}))}flushPendingUpdates(){if(this.pendingTranscriptEvents.length>0){const t=this.pendingTranscriptEvents;this.pendingTranscriptEvents=[];let i=this.getState().messages;for(const s of t)i=this.transcripts.applyLiveEvent(i,s)??i;i!==this.getState().messages&&this.setState({messages:i})}if(this.pendingActivityBySession.size>0){const t=Array.from(this.pendingActivityBySession.values());this.pendingActivityBySession.clear();for(const i of t)this.applyActivity(i)}if(this.pendingStatusBySession.size>0){const t=Array.from(this.pendingStatusBySession.values());this.pendingStatusBySession.clear();for(const i of t)this.applyStatus(i)}}clearPendingUpdates(){this.pendingTranscriptEvents=[],this.pendingStatusBySession.clear(),this.pendingActivityBySession.clear(),this.pendingFrame!==void 0&&(cancelAnimationFrame(this.pendingFrame),this.pendingFrame=void 0)}setStreamCatchup(t){return this.catchupStreamSessionId=t,{isReceivingPartialStream:t!==void 0}}finishStreamCatchup(t){const i=this.getState().selectedSession?.id===t;(this.catchupStreamSessionId===t||i&&this.getState().isReceivingPartialStream)&&(this.catchupStreamSessionId=void 0,i&&this.setState({isReceivingPartialStream:!1}),this.refreshMessages(t))}async refreshMessages(t){try{const i=this.getState().selectedSession;if(i?.id!==t)return;const s=await this.api.messages(i,{limit:Dt},f(this.getState()));if(this.getState().selectedSession?.id!==t)return;this.setState(this.transcripts.mergeHistory(this.sessionCacheKey(t),s))}catch(i){this.getState().selectedSession?.id===t&&this.setState({error:String(i)})}}}function Ku(e,t){return Ja(e,t)}function Ja(e,t){return Object.fromEntries(Object.entries(e).filter(([i])=>i!==t))}function Ho(e,t){if(t.length===0)return e;const i=new Set(t);return Object.fromEntries(Object.entries(e).filter(([s])=>!i.has(s)))}function qo(e){const t=new Set,i=[];for(const s of e)t.has(s.id)||(t.add(s.id),i.push(s));return i}function Ko(e){return e.filter(Vu).map(t=>t.value)}function Vo(e){return e.map(t=>`${t.sessionId}: ${t.error}`)}function Go(e,t){return t.flatMap((i,s)=>Gu(i)?[`${e[s]?.id??"unknown"}: ${Qs(i.reason)}`]:[])}async function Jo(e,t,i){const s=e.map((c,p)=>({item:c,index:p})),r=[];let o=0;async function n(){for(;o<s.length;){const c=s[o];if(c===void 0)return;o+=1;try{r[c.index]={status:"fulfilled",value:await i(c.item)}}catch(p){r[c.index]={status:"rejected",reason:p}}}}const a=Math.min(Math.max(1,t),s.length);return await Promise.all(Array.from({length:a},()=>n())),r}function Vu(e){return e.status==="fulfilled"}function Gu(e){return e.status==="rejected"}function Qs(e){return e instanceof Error?e.message:String(e)}function Ju(e,t,i){if(i===void 0)return{};const r=e.sessions.some(n=>n.id===t&&n.messageCount!==i)?e.sessions.map(n=>n.id===t?{...n,messageCount:i}:n):void 0,o=e.selectedSession?.id===t&&e.selectedSession.messageCount!==i?{...e.selectedSession,messageCount:i}:e.selectedSession;return{...r===void 0?{}:{sessions:r},...o!==e.selectedSession?{selectedSession:o}:{}}}function Qu(e){return["message.append","assistant.delta","assistant.thinking.delta","tool.start","tool.update","tool.end","shell.start","shell.chunk","shell.end","command.output","session.error"].includes(e.type)}function Zu(e){return e.type==="assistant.delta"||e.type==="assistant.thinking.delta"||e.type==="shell.chunk"}function Xu(e){if(!(e instanceof Error))return!1;const t=e.message.toLowerCase();return t.includes("session not found")||t.includes("未找到会话")}class Yu{constructor(){this.workspaceIdsByProject=new Map}latestWorkspaceId(t){return this.workspaceIdsByProject.get(t)}rememberWorkspace(t){this.workspaceIdsByProject.set(t.projectId,t.id)}forgetProject(t){this.workspaceIdsByProject.delete(t)}}const ef="pi-web:workspace-selection:v1";class tf{constructor(t=Xt()){this.workspaceIdsByProject=new Zi(ef,Ar,t)}latestWorkspaceId(t){return this.workspaceIdsByProject.get(t)}rememberWorkspace(t){this.workspaceIdsByProject.set(t.projectId,t.id)}forgetProject(t){this.workspaceIdsByProject.delete(t)}}function sf(e,t){const i=t?.targetWorkspaceId;if(i!==void 0&&i!=="")return e.find(r=>r.id===i);const s=t?.latestWorkspaceId;return s!==void 0&&s!==""?e.find(r=>r.id===s)??e[0]:e[0]}class rf{constructor(t,i,s,r,o=new Yu,n={}){this.getState=t,this.setState=i,this.updateUrl=s,this.sessions=r,this.workspaceSelection=o,this.api=n.api??N}clearSelection(t){this.sessions.clearActiveSession(),this.setState({selectedProject:void 0,selectedWorkspace:void 0,workspaces:[],isLoadingWorkspaces:!1,...gi()}),t?.updateUrl!==!1&&this.updateUrl()}forgetProject(t){this.workspaceSelection.forgetProject(gs(f(this.getState()),t));const i=Object.fromEntries(Object.entries(this.getState().workspacesByProjectId).filter(([s])=>s!==t));this.setState({workspacesByProjectId:i})}async selectProject(t,i){const s=f(this.getState());this.sessions.clearActiveSession(),this.setState({selectedProject:t,selectedWorkspace:void 0,workspaces:[],isLoadingWorkspaces:!0,...gi()});try{const r=await this.api.workspaces(t.id,s);if(f(this.getState())!==s||this.getState().selectedProject?.id!==t.id)return;this.setState({workspaces:r,workspacesByProjectId:{...this.getState().workspacesByProjectId,[t.id]:r},isLoadingWorkspaces:!1});const o=sf(r,{targetWorkspaceId:i?.workspaceId,latestWorkspaceId:this.workspaceSelection.latestWorkspaceId(gs(s,t.id))});o?await this.selectWorkspace(o,{sessionId:i?.sessionId,updateUrl:i?.updateUrl}):i?.updateUrl!==!1&&this.updateUrl()}catch(r){f(this.getState())===s&&this.getState().selectedProject?.id===t.id&&this.setState({error:String(r),isLoadingWorkspaces:!1})}}async selectWorkspace(t,i){const s=f(this.getState());this.workspaceSelection.rememberWorkspace({...t,projectId:gs(s,t.projectId)}),this.sessions.clearActiveSession(),this.setState({selectedWorkspace:t,isLoadingWorkspaces:!1,...gi()});try{const r=ja(t.path,await this.api.sessions(t.path,s),s);if(f(this.getState())!==s||this.getState().selectedWorkspace?.id!==t.id||this.getState().selectedProject?.id!==t.projectId)return;this.setState({sessions:r});const o=this.sessions.preferredSession(t.path,r,i?.sessionId);o?await this.sessions.selectSession(o,{updateUrl:i?.updateUrl}):i?.updateUrl!==!1&&this.updateUrl()}catch(r){f(this.getState())===s&&this.getState().selectedWorkspace?.id===t.id&&this.setState({error:String(r)})}}async refreshProjectWorkspaces(t){const i=this.getState().projects.find(r=>r.id===t);if(i===void 0)throw new Error("Project not found");const s=await this.api.workspaces(i.id,f(this.getState()));return this.applyProjectWorkspaces(i.id,s),s}async refreshAfterWorkspaceDeleted(t,i){const s=await this.refreshProjectWorkspaces(t),r=this.getState();if(r.selectedProject?.id!==t||r.selectedWorkspace?.id!==i)return;const o=nf(s);o!==void 0?await this.selectWorkspace(o):this.clearSelection()}applyProjectWorkspaces(t,i){const s=this.getState(),r={...s.workspacesByProjectId,[t]:i};s.selectedProject?.id===t?this.setState({workspaces:i,workspacesByProjectId:r}):this.setState({workspacesByProjectId:r})}}function of(e){return e!==void 0&&e.isGitWorktree&&!e.isMain}function nf(e){return e.find(t=>t.isMain)??e[0]}const af="pi-web:machine-navigation:v1";class lf{constructor(t=Xt()){this.snapshotsByMachine=new Zi(af,df,t)}latest(t){const i=this.snapshotsByMachine.get(t);return i?.machineId===t?Xo(i):void 0}remember(t){this.snapshotsByMachine.set(t.machineId,Xo(t))}forget(t){this.snapshotsByMachine.delete(t)}}function cf(e){return{machineId:e,surface:{}}}function Qo(e){const t=e.selectedWorkspace!==void 0;return{machineId:e.selectedMachine?.id??_a,projectId:e.selectedProject?.id,workspaceId:e.selectedWorkspace?.id,sessionId:e.selectedSession?.id,tool:e.workspaceTool,view:e.mainView,surface:{selectedFilePath:t?e.selectedFilePath:void 0,selectedDiffPath:t?e.selectedDiffPath:void 0,selectedTerminalId:t?e.selectedTerminalId:void 0}}}function Zo(e){return{machineId:e.machineId,projectId:e.projectId,workspaceId:e.workspaceId,sessionId:e.sessionId,tool:e.tool,view:e.view==="navigation"?void 0:e.view}}function Xo(e){return{...e,surface:{...e.surface}}}function df(e){if(!Za(e))return;const t=ze(e,"machineId");if(t===void 0)return;const i=Qa(ze(e,"tool")),s=hf(ze(e,"view"));return{machineId:t,projectId:ze(e,"projectId"),workspaceId:ze(e,"workspaceId"),sessionId:ze(e,"sessionId"),...i===void 0?{}:{tool:i},...s===void 0?{}:{view:s},surface:pf(e.surface)}}function pf(e){return Za(e)?{selectedFilePath:ze(e,"selectedFilePath"),selectedDiffPath:ze(e,"selectedDiffPath"),selectedTerminalId:ze(e,"selectedTerminalId")}:{}}function hf(e){return e==="navigation"||e==="chat"?e:Qa(e)}function Qa(e){return uf(e)?e:void 0}function uf(e){return e!==void 0&&/^[a-z][a-z0-9.-]*:[a-z][a-z0-9.-]*$/u.test(e)}function ze(e,t){const i=e[t];return typeof i=="string"&&i!==""?i:void 0}function Za(e){return typeof e=="object"&&e!==null}const ff="pi-web:terminal-selection:v1";class gf{constructor(t=Xt()){this.terminalIdsByCwd=new Zi(ff,Ar,t)}latestTerminalId(t){return this.terminalIdsByCwd.get(t)}rememberTerminal(t,i){this.terminalIdsByCwd.set(t,i)}forgetWorkspace(t){this.terminalIdsByCwd.delete(t)}forgetTerminal(t){for(const[i,s]of this.terminalIdsByCwd.entries())s===t&&this.terminalIdsByCwd.delete(i)}}function ax(e,t){const i=t?.targetTerminalId;if(i!==void 0&&i!=="")return e.find(r=>r.id===i);const s=t?.latestTerminalId;return s!==void 0&&s!==""?e.find(r=>r.id===s)??e.find(r=>!r.exited)??e[0]:e.find(r=>!r.exited)??e[0]}function lx(e){return e.find(t=>!t.exited)??e[0]}const Xa=1200,mf=["mod","alt","shift"];class vf{constructor(){this.pendingTokens=[]}handle(t,i,s={}){const r=el(t);if(r===void 0)return!1;const o=Tr(i,s.shortcuts,{enabledOnly:!0}).filter(n=>n.active).map(n=>({action:n.action,tokens:n.tokens}));if(this.pendingTokens.length>0){if(this.handleSequence([...this.pendingTokens,r],o))return!0;if(this.clearPending(),!Vt(r))return!1}else if(!Vt(r))return!1;return this.handleSequence([r],o)}reset(){this.clearPending()}handleSequence(t,i){const s=i.find(o=>If(o.tokens,t));return s!==void 0?(this.clearPending(),s.action.run(),!0):i.some(o=>Mr(o.tokens,t))?(this.setPending(t),!0):!1}setPending(t){this.clearPending(),this.pendingTokens=t,this.pendingTimer=globalThis.setTimeout(()=>{this.pendingTokens=[],this.pendingTimer=void 0},Xa)}clearPending(){this.pendingTokens=[],this.pendingTimer!==void 0&&(globalThis.clearTimeout(this.pendingTimer),this.pendingTimer=void 0)}}function Tr(e,t,i={}){const s=e.flatMap((p,u)=>{if(i.enabledOnly===!0&&p.enabled===!1)return[];const h=bf(p,t,u);return h===void 0?[]:[h]}),r=new Map;for(const p of s)r.set(p.key,[...r.get(p.key)??[],p]);const o=new Map;for(const p of r.values()){const u=[...p].sort(Zs)[0];u!==void 0&&o.set(u.key,u)}const n=[...o.values()].sort(xf),a=new Map,c=new Map;for(const p of s){const u=o.get(p.key);if(u===void 0)continue;const h=Sf(u,n)??u;c.set(p,h),p!==h&&a.set(h,[...a.get(h)??[],p])}return s.map(p=>{const u=c.get(p),h=u===p,g=u===void 0||h?void 0:Yo(u),w=h?[...a.get(p)??[]].sort(Zs).map(Yo):[];return{...p,active:h,shadows:w,...g===void 0?{}:{shadowedBy:g}}}).sort((p,u)=>p.order-u.order)}function ys(e){return tl(e,{requireFirstChordActivator:!0})}function Ya(e){const t=tl(e,{requireFirstChordActivator:!1});return t.ok?t.tokens:[]}function wi(e){return Ya(e).map(t=>t.split("+").map(sl).join("+")).join(" ")}function el(e){if(e.isComposing)return;const t=Pf(e.key);if(t===void 0)return;const i=[];return(e.metaKey||e.ctrlKey)&&i.push("mod"),e.altKey&&i.push("alt"),e.shiftKey&&i.push("shift"),i.push(t),i.join("+")}function Vt(e){return e.split("+").includes("mod")||e.split("+").includes("alt")}function bf(e,t,i){const s=wf(e.id,t);if(s===null)return;const r=s??e.shortcut;if(r===void 0||r==="")return;const o=Ya(r),n=o[0];if(!(n===void 0||!Vt(n)))return{action:e,shortcut:o.join(" "),source:s===void 0?"default":"custom",tokens:o,key:yf(o),order:i}}function wf(e,t){if(!(t===void 0||!Object.hasOwn(t,e)))return t[e]}function yf(e){return e.join("\0")}function Yo(e){return{action:e.action,shortcut:e.shortcut,source:e.source}}function Zs(e,t){return en(e.source)-en(t.source)||tn(e.action.id,t.action.id)||tn(e.action.title,t.action.title)||e.order-t.order}function xf(e,t){return e.tokens.length-t.tokens.length||Zs(e,t)}function Sf(e,t){return t.find(i=>i!==e&&i.tokens.length<e.tokens.length&&Mr(e.tokens,i.tokens))}function en(e){switch(e){case"custom":return 0;case"default":return 1}}function tn(e,t){return e<t?-1:e>t?1:0}function tl(e,t){const i=e.trim().toLowerCase().replace(/\s*\+\s*/gu,"+");if(i==="")return{ok:!1,message:"请输入快捷键,选择无,或重置为默认值。"};const s=[],r=i.split(/\s+/u).filter(o=>o!=="");for(const[o,n]of r.entries()){const a=kf(n);if(!a.ok)return a;if(o===0&&t.requireFirstChordActivator&&!Vt(a.token))return{ok:!1,message:"快捷键必须以 Ctrl/⌘ 或 Alt 开头,避免拦截普通输入。"};s.push(a.token)}return{ok:!0,shortcut:s.join(" "),tokens:s}}function kf(e){const t=e.split("+").filter(o=>o!=="");if(t.length===0)return{ok:!1,message:"快捷键组合必须包含一个按键。"};const i=new Set;let s;for(const o of t){const n=$f(o);if(n!==void 0){if(i.has(n))return{ok:!1,message:`快捷键包含重复的 ${sl(n)} 修饰键。`};i.add(n);continue}const a=il(o);if(a===void 0)return{ok:!1,message:`不支持的快捷键按键:${o}`};if(s!==void 0)return{ok:!1,message:"每个快捷键组合只能包含一个非修饰键。"};s=a}return s===void 0?{ok:!1,message:"快捷键组合必须包含一个按键。"}:{ok:!0,token:[...mf.filter(o=>i.has(o)),s].join("+")}}function $f(e){switch(e){case"mod":case"meta":case"cmd":case"command":case"ctrl":case"control":case"primary":return"mod";case"alt":case"option":case"opt":return"alt";case"shift":return"shift";default:return}}function il(e){const t=Cf(e);if(t!==void 0)return t;if(/^f(?:[1-9]|1[0-9]|2[0-4])$/u.test(e)||e.length===1)return e}function Pf(e){if(e===" ")return"space";const t=e.toLowerCase();return il(t)}function Cf(e){switch(e){case" ":case"spacebar":case"space":return"space";case"esc":case"escape":return"escape";case"return":case"enter":return"enter";case"del":case"delete":return"delete";case"backspace":return"backspace";case"tab":return"tab";case"up":case"arrowup":return"arrowup";case"down":case"arrowdown":return"arrowdown";case"left":case"arrowleft":return"arrowleft";case"right":case"arrowright":return"arrowright";case"pageup":case"pagedown":case"home":case"end":return e;case"+":case"plus":return"plus";case"period":case"dot":return".";case"comma":return",";case"slash":return"/";case"backslash":return"\\";case"minus":return"-";default:return}}function sl(e){return e==="mod"?sn()?"⌘":"Ctrl":e==="shift"?"Shift":e==="alt"?sn()?"⌥":"Alt":e==="enter"?"Enter":e==="escape"?"Esc":e==="space"?"Space":e==="tab"?"Tab":e==="backspace"?"Backspace":e==="delete"?"Delete":e==="arrowup"?"↑":e==="arrowdown"?"↓":e==="arrowleft"?"←":e==="arrowright"?"→":e==="pageup"?"PageUp":e==="pagedown"?"PageDown":e==="home"?"Home":e==="end"?"End":e==="plus"?"+":/^f(?:[1-9]|1[0-9]|2[0-4])$/u.test(e)||e.length===1?e.toUpperCase():`${e.charAt(0).toUpperCase()}${e.slice(1)}`}function If(e,t){return e.length===t.length&&Mr(e,t)}function Mr(e,t){return t.every((i,s)=>e[s]===i)}function sn(){return typeof navigator<"u"&&navigator.userAgent.toLowerCase().includes("mac")}const Rf={archiveIdleEnabled:!0,archiveIdleDays:"30",deleteArchivedEnabled:!1,deleteArchivedDays:"90"};function Ut(e){if(!e.archiveIdleEnabled&&!e.deleteArchivedEnabled)return{ok:!1,error:"请至少启用一项清理操作。"};const t={archiveIdleDays:null,deleteArchivedDays:null};if(e.archiveIdleEnabled){const i=nn(e.archiveIdleDays,"归档空闲会话天数");if(typeof i=="string")return{ok:!1,error:i};t.archiveIdleDays=i}if(e.deleteArchivedEnabled){const i=nn(e.deleteArchivedDays,"删除已归档会话天数");if(typeof i=="string")return{ok:!1,error:i};t.deleteArchivedDays=i}return{ok:!0,request:t}}function $t(e){return JSON.stringify({archiveIdleDays:e?.archiveIdleDays??null,deleteArchivedDays:e?.deleteArchivedDays??null})}function rn(e){if(!e.canCleanup||e.loading===!0||e.running===!0||e.preview===void 0)return!1;const t=Ut(e.draft);return!t.ok||$t(t.request)!==$t(e.previewRequest)?!1:yi(e.preview)}function yi(e){return e.totals.archiveCount>0||e.totals.deleteCount>0}function rl(e,t){const i=e.projects.map(r=>r.cwd);if(t===void 0)return i;const s=new Set(t);return i.filter(r=>s.has(r))}function on(e,t){const i=new Set(rl(e,t)),s=e.projects.filter(r=>i.has(r.cwd));return{...e,projects:s,totals:s.reduce((r,o)=>({archiveCount:r.archiveCount+o.archiveCount,deleteCount:r.deleteCount+o.deleteCount}),{archiveCount:0,deleteCount:0})}}function Af(e,t){return t(Tf(e))}function Tf(e){const t=e.totals.archiveCount,i=e.totals.deleteCount,s=[];return t>0&&s.push(`归档 ${String(t)} 个空闲会话`),i>0&&s.push(`永久删除 ${String(i)} 个已归档会话`),`运行清理并${s.length===0?"执行清理":s.join("并")}?
24
+ ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.markCachedNewSessionPersisted(a)}catch(u){this.setState({error:String(u)})}finally{n&&this.markSendingPrompt(c,!1)}}markSendingPrompt(t,i){const s=this.getState().sendingPrompts;i?s[t]!==!0&&this.setState({sendingPrompts:{...s,[t]:!0}}):t in s&&this.setState({sendingPrompts:Ja(s,t)})}async runShell(t){const i=this.getState().selectedSession;if(!(!i||i.archived===!0)){this.setState({messages:[...this.getState().messages,_e("user",t)]});try{await this.api.shell(i,t,f(this.getState())),this.markCachedNewSessionPersisted(i)}catch(s){this.setState({messages:[...this.getState().messages,_e("system",String(s))],error:String(s)})}}}async runCommand(t){const i=this.getState().selectedSession;if(!i||i.archived===!0)return;const s=i.id;this.markSendingPrompt(s,!0);try{this.applyCommandResult(await this.api.runCommand(i,t,f(this.getState()))),this.markCachedNewSessionPersisted(i)}catch(r){this.setState({messages:[...this.getState().messages,_e("system",String(r))],error:String(r)})}finally{this.markSendingPrompt(s,!1)}}async respondToCommand(t,i){const s=this.getState().selectedSession;if(s){this.setState({commandDialog:void 0});try{this.applyCommandResult(await this.api.respondToCommand(s,t,i,f(this.getState())))}catch(r){this.setState({error:String(r)})}}}cancelCommand(){this.setState({commandDialog:void 0})}applySessionStatus(t){this.applyStatus(t)}async archiveSession(t=this.getState().selectedSession){if(t){if(Z(t)){await this.deleteCachedNewSession(t);return}try{await this.api.archive(t,f(this.getState()));const i=this.getState(),s=Nu(i.sessions,t.id,new Date().toISOString()),r=Hu(s,i.selectedSession?.id,t.id);this.setState({sessions:s}),r.type==="select"?await this.selectSession(r.session):r.type==="clear"&&this.deselectSession({forgetRememberedSelection:!0})}catch(i){this.setState({error:String(i)})}}}async archiveSessionWithDescendants(t=this.getState().selectedSession){if(!(!t||Z(t)))try{const i=await this.api.archiveWithDescendants(t,f(this.getState())),s=i.sessionIds!==void 0&&i.sessionIds.length>0?i.sessionIds:[t.id],r=this.getState(),o=vi(r.sessions,s,new Date().toISOString()),n=bi(o,r.selectedSession?.id,s);this.setState({sessions:o}),n.type==="select"?await this.selectSession(n.session):n.type==="clear"&&this.deselectSession({forgetRememberedSelection:!0})}catch(i){this.setState({error:String(i)})}}async archiveSessions(t){const i=qo(t).filter(s=>s.archived!==!0&&!Z(s));if(i.length!==0)try{const s=f(this.getState()),{succeededIds:r,failures:o,generatedAt:n}=await this.archiveSessionBatch(i,s);if(r.length>0){const a=this.getState(),c=vi(a.sessions,r,n??new Date().toISOString()),p=bi(c,a.selectedSession?.id,r);this.setState({sessions:c}),p.type==="select"?await this.selectSession(p.session):p.type==="clear"&&this.deselectSession({forgetRememberedSelection:!0})}this.applyBulkSessionFailures("Archive",o)}catch(s){this.setState({error:`Archive failed: ${Qs(s)}`})}}async deleteArchivedSessions(t){const i=qo(t).filter(o=>o.archived===!0);if(i.length===0)return;const s=f(this.getState()),r=this.getState().machineRuntimes[s];if(r?.ok!==!0||!Be(r,Oe.sessionsDeleteArchived)){this.setState({error:"Deleting archived sessions requires an updated Pi-Web runtime on this machine."});return}try{const{succeededIds:o,failures:n}=await this.deleteArchivedSessionBatch(i,s);if(o.length>0){const a=new Set(o),c=this.getState(),p=c.sessions.filter(u=>!a.has(u.id));if(this.setState({sessions:p}),c.selectedSession!==void 0&&a.has(c.selectedSession.id)){const u=p.find(h=>h.archived!==!0)??p[0];u!==void 0?await this.selectSession(u):this.deselectSession({forgetRememberedSelection:!0})}}this.applyBulkSessionFailures("Delete",n)}catch(o){this.setState({error:`Delete failed: ${Qs(o)}`})}}async archiveSessionBatch(t,i){const s=this.getState().machineRuntimes[i];if(s?.ok===!0&&Be(s,Oe.sessionsBulkMutations)){const o=await this.api.archiveMany(t,i);return{succeededIds:o.archivedSessionIds,failures:Vo(o.failures),generatedAt:o.generatedAt}}const r=await Jo(t,No,async o=>(await this.api.archive(o,i),o.id));return{succeededIds:Ko(r),failures:Go(t,r)}}async deleteArchivedSessionBatch(t,i){const s=this.getState().machineRuntimes[i];if(s?.ok===!0&&Be(s,Oe.sessionsBulkMutations)){const o=await this.api.deleteArchivedMany(t,i);return{succeededIds:o.deletedSessionIds,failures:Vo(o.failures)}}const r=await Jo(t,No,async o=>(await this.api.deleteArchived(o,i),o.id));return{succeededIds:Ko(r),failures:Go(t,r)}}async applySessionCleanupResult(t,i=f(this.getState())){if(f(this.getState())!==i)return;const s=t.archivedSessionIds,r=t.deletedSessionIds;if(s.length>0||r.length>0){const o=this.getState(),n=new Set(r),a=[...s,...r],c=vi(o.sessions,s,t.generatedAt).filter(u=>!n.has(u.id)),p=o.selectedSession!==void 0&&a.includes(o.selectedSession.id);if(this.setState({sessions:c,sessionStatuses:Ho(o.sessionStatuses,a),sessionActivities:Ho(o.sessionActivities,a),...p?{status:void 0,activity:void 0}:{}}),o.selectedSession!==void 0&&n.has(o.selectedSession.id)){const u=c.find(h=>h.archived!==!0)??c[0];u!==void 0?await this.selectSession(u):this.deselectSession({forgetRememberedSelection:!0})}else{const u=bi(c,o.selectedSession?.id,s);u.type==="select"?await this.selectSession(u.session):u.type==="clear"&&this.deselectSession({forgetRememberedSelection:!0})}}await this.refreshCurrentWorkspaceSessions(i)}async refreshCurrentWorkspaceSessions(t=f(this.getState())){const i=this.getState().selectedWorkspace;if(i!==void 0)try{const s=ja(i.path,await this.api.sessions(i.path,t),t);if(f(this.getState())!==t||this.getState().selectedWorkspace?.id!==i.id)return;const r=this.getState().selectedSession;if(this.setState({sessions:s}),r===void 0)return;const o=s.find(a=>a.id===r.id);if(o!==void 0){o!==r&&this.setState({selectedSession:o});return}const n=s.find(a=>a.archived!==!0)??s[0];n!==void 0?await this.selectSession(n):this.deselectSession({forgetRememberedSelection:!0})}catch(s){f(this.getState())===t&&this.getState().selectedWorkspace?.id===i.id&&this.setState({error:String(s)})}}async deleteCachedNewSession(t=this.getState().selectedSession){if(!Z(t))return;this.api.stop(t,f(this.getState())).catch(()=>{}),Oo(t.id,f(this.getState())),Ir(this.sessionCacheKey(t.id));const i=this.getState().sessions.filter(r=>r.id!==t.id);if(this.setState({sessions:i}),this.getState().selectedSession?.id!==t.id)return;const s=i.find(r=>r.archived!==!0)??i[0];s!==void 0?await this.selectSession(s):(this.clearActiveSession(),this.updateUrl())}async restoreSession(t=this.getState().selectedSession){if(t)try{await this.api.restore(t,f(this.getState()));const i={...t};delete i.archived,delete i.archivedAt,this.replaceSession(i),this.getState().selectedSession?.id===i.id&&await this.selectSession(i)}catch(i){this.setState({error:String(i)})}}async reloadSession(t=this.getState().selectedSession){if(t===void 0||Z(t)||t.archived===!0)return;const i=f(this.getState()),s=this.getState().machineRuntimes[i];if(s?.ok!==!0||!Be(s,Oe.sessionsReload)){this.setState({error:"Reloading sessions requires an updated Pi-Web runtime on this machine."});return}try{await this.api.reloadSession(t.id,i),this.transcripts.discard(this.sessionCacheKey(t.id)),this.getState().selectedSession?.id===t.id&&await this.selectSession(t,{updateUrl:!1})}catch(r){this.setState({error:String(r)})}}async detachParent(t=this.getState().selectedSession){if(t?.parentSessionPath!==void 0)try{await this.api.detachParent(t,f(this.getState()));const i={...t};delete i.parentSessionPath,this.replaceSession(i)}catch(i){this.setState({error:String(i)})}}async listModels(){const t=this.getState().selectedSession;if(!t||t.archived===!0)return[];try{return(await this.api.models(t,f(this.getState()))).models}catch(i){return this.setState({error:String(i)}),[]}}async setModel(t,i){const s=this.getState().selectedSession;if(!(!s||s.archived===!0))try{this.applyStatus(await this.api.setModel(s,t,i,f(this.getState()))),await this.refreshAvailableThinkingLevels()}catch(r){this.setState({error:String(r)})}}async cycleModel(t){const i=this.getState().selectedSession;if(!(!i||i.archived===!0))try{this.applyStatus(await this.api.cycleModel(i,t,f(this.getState()))),await this.refreshAvailableThinkingLevels()}catch(s){this.setState({error:String(s)})}}async listThinkingLevels(){const t=this.getState().selectedSession;if(!t||t.archived===!0)return[];try{return(await this.api.thinkingLevels(t,f(this.getState()))).levels}catch(i){return this.setState({error:String(i)}),[]}}async refreshAvailableThinkingLevels(){const t=this.getState().selectedSession;if(!t||t.archived===!0){this.getState().availableThinkingLevels.length>0&&this.setState({availableThinkingLevels:[]});return}const i=await this.listThinkingLevels();this.getState().selectedSession?.id===t.id&&this.setState({availableThinkingLevels:i})}async setThinkingLevel(t){const i=this.getState().selectedSession;if(!(!i||i.archived===!0))try{this.applyStatus(await this.api.setThinkingLevel(i,t,f(this.getState())))}catch(s){this.setState({error:String(s)})}}async cycleThinkingLevel(){const t=this.getState().selectedSession;if(!(!t||t.archived===!0))try{this.applyStatus(await this.api.cycleThinkingLevel(t,f(this.getState())))}catch(i){this.setState({error:String(i)})}}async stopActiveWork(){const t=this.getState().selectedSession;if(t)try{await this.api.abort(t,f(this.getState()))}catch(i){this.setState({error:String(i)})}}async refreshSelectedSession(t=this.getState().selectedSession?.id){const i=this.getState().selectedSession;if(!(t===void 0||i?.id!==t||i.archived===!0))try{this.flushPendingUpdates();const[s,r]=await Promise.all([this.api.messages(i,{limit:Dt},f(this.getState())),this.api.status(i,f(this.getState()))]);if(this.getState().selectedSession?.id!==t)return;const o=this.transcripts.mergeHistory(this.sessionCacheKey(t),s);this.setState({...o,status:r,activity:this.getState().sessionActivities[t],...this.setStreamCatchup(r.isStreaming?t:void 0)}),this.applyStatus(r)}catch(s){this.getState().selectedSession?.id===t&&this.setState({error:String(s)})}}applyBulkSessionFailures(t,i){i.length!==0&&this.setState({error:`${t} failed for ${String(i.length)} session${i.length===1?"":"s"}: ${i.join("; ")}`})}sessionCacheKey(t){return La(f(this.getState()),t)}workspaceSelectionKey(t){return`${f(this.getState())}:${t}`}replaceSession(t){const i=this.getState().selectedSession;this.setState({sessions:this.getState().sessions.map(s=>s.id===t.id?t:s),selectedSession:i?.id===t.id?t:i})}async recreateCachedNewSession(t,i){try{const s=f(this.getState()),r=await this.api.startSession(t.cwd,s);Wo(r,s),zh(this.sessionCacheKey(t.id),this.sessionCacheKey(r.id)),Oo(t.id,s);const o=Gs(r,s);this.setState({sessions:[o,...this.getState().sessions.filter(n=>n.id!==t.id)],error:""}),await this.selectSession(o,{updateUrl:!1}),this.updateUrl(i?.updateUrl===!1?{replace:!0}:void 0)}catch(s){this.setState({error:String(s)})}}markCachedNewSessionPersisted(t){if(!Z(t))return;const i=this.getState().sessions.find(s=>s.id===t.id)??t;this.replaceSession(fh(i))}applyCommandResult(t){if(t.type==="select"){this.setState({commandDialog:t});return}const i=(t.type==="unsupported",t.message);if(i!==void 0&&i!==""&&this.setState({messages:[...this.getState().messages,_e(t.type==="unsupported"?"system":"tool",i)]}),t.type==="done"&&t.session){t.promptDraft!==void 0&&Mi(this.sessionCacheKey(t.session.id),t.promptDraft);const s=this.getState().selectedSession,r=[t.session,...this.getState().sessions.filter(o=>o.id!==t.session?.id)];this.setState({sessions:r,selectedSession:s?.id===t.session.id?t.session:s}),s?.id!==t.session.id&&this.selectSession(t.session)}}applyCreatedSession(t){const i=this.getState();i.selectedWorkspace?.path===t.cwd&&(i.sessions.some(s=>s.id===t.id)||this.setState({sessions:[t,...i.sessions]}))}applyActivity(t){this.setState({sessionActivities:{...this.getState().sessionActivities,[t.sessionId]:t},activity:this.getState().selectedSession?.id===t.sessionId?t:this.getState().activity})}applyStatus(t){const i=this.getState(),s=i.sessionActivities[t.sessionId]?.phase==="active"&&!Ye(t);this.setState({sessionStatuses:{...i.sessionStatuses,[t.sessionId]:t},...Ju(i,t.sessionId,t.messageCount),...s?{sessionActivities:Ku(i.sessionActivities,t.sessionId)}:{},status:i.selectedSession?.id===t.sessionId?t:i.status,activity:i.selectedSession?.id===t.sessionId&&s?void 0:i.activity}),t.isStreaming||this.finishStreamCatchup(t.sessionId)}applySessionName(t,i){const s=o=>{if(o.id!==t)return o;const n={...o};return i===void 0||i===""?delete n.name:n.name=i,n},r=this.getState().selectedSession;this.setState({sessions:this.getState().sessions.map(s),selectedSession:r===void 0?void 0:s(r)})}applyEvent(t){const i=this.getState().selectedSession?.id;if(this.catchupStreamSessionId!==void 0&&this.catchupStreamSessionId===i){if(t.type==="message.end"||t.type==="agent.end"){this.finishStreamCatchup(this.catchupStreamSessionId);return}if(Qu(t))return}if(t.type==="status.update"){this.queueStatusUpdate(t.status);return}if(t.type==="activity.update"){this.queueActivityUpdate(t.activity);return}if(Zu(t)){this.queueTranscriptEvent(t);return}this.flushPendingUpdates();const s=this.transcripts.applyLiveEvent(this.getState().messages,t);s?this.setState({messages:s}):t.type==="session.name"&&this.applySessionName(t.sessionId,t.name)}queueTranscriptEvent(t){this.pendingTranscriptEvents.push(t),this.schedulePendingFlush()}queueStatusUpdate(t){this.pendingStatusBySession.set(t.sessionId,t),this.schedulePendingFlush()}queueActivityUpdate(t){this.pendingActivityBySession.set(t.sessionId,t),this.schedulePendingFlush()}schedulePendingFlush(){this.pendingFrame===void 0&&(this.pendingFrame=requestAnimationFrame(()=>{this.pendingFrame=void 0,this.flushPendingUpdates()}))}flushPendingUpdates(){if(this.pendingTranscriptEvents.length>0){const t=this.pendingTranscriptEvents;this.pendingTranscriptEvents=[];let i=this.getState().messages;for(const s of t)i=this.transcripts.applyLiveEvent(i,s)??i;i!==this.getState().messages&&this.setState({messages:i})}if(this.pendingActivityBySession.size>0){const t=Array.from(this.pendingActivityBySession.values());this.pendingActivityBySession.clear();for(const i of t)this.applyActivity(i)}if(this.pendingStatusBySession.size>0){const t=Array.from(this.pendingStatusBySession.values());this.pendingStatusBySession.clear();for(const i of t)this.applyStatus(i)}}clearPendingUpdates(){this.pendingTranscriptEvents=[],this.pendingStatusBySession.clear(),this.pendingActivityBySession.clear(),this.pendingFrame!==void 0&&(cancelAnimationFrame(this.pendingFrame),this.pendingFrame=void 0)}setStreamCatchup(t){return this.catchupStreamSessionId=t,{isReceivingPartialStream:t!==void 0}}finishStreamCatchup(t){const i=this.getState().selectedSession?.id===t;(this.catchupStreamSessionId===t||i&&this.getState().isReceivingPartialStream)&&(this.catchupStreamSessionId=void 0,i&&this.setState({isReceivingPartialStream:!1}),this.refreshMessages(t))}async refreshMessages(t){try{const i=this.getState().selectedSession;if(i?.id!==t)return;const s=await this.api.messages(i,{limit:Dt},f(this.getState()));if(this.getState().selectedSession?.id!==t)return;this.setState(this.transcripts.mergeHistory(this.sessionCacheKey(t),s))}catch(i){this.getState().selectedSession?.id===t&&this.setState({error:String(i)})}}}function Ku(e,t){return Ja(e,t)}function Ja(e,t){return Object.fromEntries(Object.entries(e).filter(([i])=>i!==t))}function Ho(e,t){if(t.length===0)return e;const i=new Set(t);return Object.fromEntries(Object.entries(e).filter(([s])=>!i.has(s)))}function qo(e){const t=new Set,i=[];for(const s of e)t.has(s.id)||(t.add(s.id),i.push(s));return i}function Ko(e){return e.filter(Vu).map(t=>t.value)}function Vo(e){return e.map(t=>`${t.sessionId}: ${t.error}`)}function Go(e,t){return t.flatMap((i,s)=>Gu(i)?[`${e[s]?.id??"unknown"}: ${Qs(i.reason)}`]:[])}async function Jo(e,t,i){const s=e.map((c,p)=>({item:c,index:p})),r=[];let o=0;async function n(){for(;o<s.length;){const c=s[o];if(c===void 0)return;o+=1;try{r[c.index]={status:"fulfilled",value:await i(c.item)}}catch(p){r[c.index]={status:"rejected",reason:p}}}}const a=Math.min(Math.max(1,t),s.length);return await Promise.all(Array.from({length:a},()=>n())),r}function Vu(e){return e.status==="fulfilled"}function Gu(e){return e.status==="rejected"}function Qs(e){return e instanceof Error?e.message:String(e)}function Ju(e,t,i){if(i===void 0)return{};const r=e.sessions.some(n=>n.id===t&&n.messageCount!==i)?e.sessions.map(n=>n.id===t?{...n,messageCount:i}:n):void 0,o=e.selectedSession?.id===t&&e.selectedSession.messageCount!==i?{...e.selectedSession,messageCount:i}:e.selectedSession;return{...r===void 0?{}:{sessions:r},...o!==e.selectedSession?{selectedSession:o}:{}}}function Qu(e){return["message.append","assistant.delta","assistant.thinking.delta","tool.start","tool.update","tool.end","shell.start","shell.chunk","shell.end","command.output","session.error"].includes(e.type)}function Zu(e){return e.type==="assistant.delta"||e.type==="assistant.thinking.delta"||e.type==="shell.chunk"}function Xu(e){if(!(e instanceof Error))return!1;const t=e.message.toLowerCase();return t.includes("session not found")||t.includes("未找到会话")}class Yu{constructor(){this.workspaceIdsByProject=new Map}latestWorkspaceId(t){return this.workspaceIdsByProject.get(t)}rememberWorkspace(t){this.workspaceIdsByProject.set(t.projectId,t.id)}forgetProject(t){this.workspaceIdsByProject.delete(t)}}const ef="pi-web:workspace-selection:v1";class tf{constructor(t=Xt()){this.workspaceIdsByProject=new Zi(ef,Ar,t)}latestWorkspaceId(t){return this.workspaceIdsByProject.get(t)}rememberWorkspace(t){this.workspaceIdsByProject.set(t.projectId,t.id)}forgetProject(t){this.workspaceIdsByProject.delete(t)}}function sf(e,t){const i=t?.targetWorkspaceId;if(i!==void 0&&i!=="")return e.find(r=>r.id===i);const s=t?.latestWorkspaceId;return s!==void 0&&s!==""?e.find(r=>r.id===s)??e[0]:e[0]}class rf{constructor(t,i,s,r,o=new Yu,n={}){this.getState=t,this.setState=i,this.updateUrl=s,this.sessions=r,this.workspaceSelection=o,this.api=n.api??N}clearSelection(t){this.sessions.clearActiveSession(),this.setState({selectedProject:void 0,selectedWorkspace:void 0,workspaces:[],isLoadingWorkspaces:!1,...gi()}),t?.updateUrl!==!1&&this.updateUrl()}forgetProject(t){this.workspaceSelection.forgetProject(gs(f(this.getState()),t));const i=Object.fromEntries(Object.entries(this.getState().workspacesByProjectId).filter(([s])=>s!==t));this.setState({workspacesByProjectId:i})}async selectProject(t,i){const s=f(this.getState());this.sessions.clearActiveSession(),this.setState({selectedProject:t,selectedWorkspace:void 0,workspaces:[],isLoadingWorkspaces:!0,...gi()});try{const r=await this.api.workspaces(t.id,s);if(f(this.getState())!==s||this.getState().selectedProject?.id!==t.id)return;this.setState({workspaces:r,workspacesByProjectId:{...this.getState().workspacesByProjectId,[t.id]:r},isLoadingWorkspaces:!1});const o=sf(r,{targetWorkspaceId:i?.workspaceId,latestWorkspaceId:this.workspaceSelection.latestWorkspaceId(gs(s,t.id))});o?await this.selectWorkspace(o,{sessionId:i?.sessionId,updateUrl:i?.updateUrl}):i?.updateUrl!==!1&&this.updateUrl()}catch(r){f(this.getState())===s&&this.getState().selectedProject?.id===t.id&&this.setState({error:String(r),isLoadingWorkspaces:!1})}}async selectWorkspace(t,i){const s=f(this.getState());this.workspaceSelection.rememberWorkspace({...t,projectId:gs(s,t.projectId)}),this.sessions.clearActiveSession(),this.setState({selectedWorkspace:t,isLoadingWorkspaces:!1,...gi()});try{const r=ja(t.path,await this.api.sessions(t.path,s),s);if(f(this.getState())!==s||this.getState().selectedWorkspace?.id!==t.id||this.getState().selectedProject?.id!==t.projectId)return;this.setState({sessions:r});const o=this.sessions.preferredSession(t.path,r,i?.sessionId);o?await this.sessions.selectSession(o,{updateUrl:i?.updateUrl}):i?.updateUrl!==!1&&this.updateUrl()}catch(r){f(this.getState())===s&&this.getState().selectedWorkspace?.id===t.id&&this.setState({error:String(r)})}}async refreshProjectWorkspaces(t){const i=this.getState().projects.find(r=>r.id===t);if(i===void 0)throw new Error("Project not found");const s=await this.api.workspaces(i.id,f(this.getState()));return this.applyProjectWorkspaces(i.id,s),s}async refreshAfterWorkspaceDeleted(t,i){const s=await this.refreshProjectWorkspaces(t),r=this.getState();if(r.selectedProject?.id!==t||r.selectedWorkspace?.id!==i)return;const o=nf(s);o!==void 0?await this.selectWorkspace(o):this.clearSelection()}applyProjectWorkspaces(t,i){const s=this.getState(),r={...s.workspacesByProjectId,[t]:i};s.selectedProject?.id===t?this.setState({workspaces:i,workspacesByProjectId:r}):this.setState({workspacesByProjectId:r})}}function of(e){return e!==void 0&&e.isGitWorktree&&!e.isMain}function nf(e){return e.find(t=>t.isMain)??e[0]}const af="pi-web:machine-navigation:v1";class lf{constructor(t=Xt()){this.snapshotsByMachine=new Zi(af,df,t)}latest(t){const i=this.snapshotsByMachine.get(t);return i?.machineId===t?Xo(i):void 0}remember(t){this.snapshotsByMachine.set(t.machineId,Xo(t))}forget(t){this.snapshotsByMachine.delete(t)}}function cf(e){return{machineId:e,surface:{}}}function Qo(e){const t=e.selectedWorkspace!==void 0;return{machineId:e.selectedMachine?.id??_a,projectId:e.selectedProject?.id,workspaceId:e.selectedWorkspace?.id,sessionId:e.selectedSession?.id,tool:e.workspaceTool,view:e.mainView,surface:{selectedFilePath:t?e.selectedFilePath:void 0,selectedDiffPath:t?e.selectedDiffPath:void 0,selectedTerminalId:t?e.selectedTerminalId:void 0}}}function Zo(e){return{machineId:e.machineId,projectId:e.projectId,workspaceId:e.workspaceId,sessionId:e.sessionId,tool:e.tool,view:e.view==="navigation"?void 0:e.view}}function Xo(e){return{...e,surface:{...e.surface}}}function df(e){if(!Za(e))return;const t=ze(e,"machineId");if(t===void 0)return;const i=Qa(ze(e,"tool")),s=hf(ze(e,"view"));return{machineId:t,projectId:ze(e,"projectId"),workspaceId:ze(e,"workspaceId"),sessionId:ze(e,"sessionId"),...i===void 0?{}:{tool:i},...s===void 0?{}:{view:s},surface:pf(e.surface)}}function pf(e){return Za(e)?{selectedFilePath:ze(e,"selectedFilePath"),selectedDiffPath:ze(e,"selectedDiffPath"),selectedTerminalId:ze(e,"selectedTerminalId")}:{}}function hf(e){return e==="navigation"||e==="chat"?e:Qa(e)}function Qa(e){return uf(e)?e:void 0}function uf(e){return e!==void 0&&/^[a-z][a-z0-9.-]*:[a-z][a-z0-9.-]*$/u.test(e)}function ze(e,t){const i=e[t];return typeof i=="string"&&i!==""?i:void 0}function Za(e){return typeof e=="object"&&e!==null}const ff="pi-web:terminal-selection:v1";class gf{constructor(t=Xt()){this.terminalIdsByCwd=new Zi(ff,Ar,t)}latestTerminalId(t){return this.terminalIdsByCwd.get(t)}rememberTerminal(t,i){this.terminalIdsByCwd.set(t,i)}forgetWorkspace(t){this.terminalIdsByCwd.delete(t)}forgetTerminal(t){for(const[i,s]of this.terminalIdsByCwd.entries())s===t&&this.terminalIdsByCwd.delete(i)}}function lx(e,t){const i=t?.targetTerminalId;if(i!==void 0&&i!=="")return e.find(r=>r.id===i);const s=t?.latestTerminalId;return s!==void 0&&s!==""?e.find(r=>r.id===s)??e.find(r=>!r.exited)??e[0]:e.find(r=>!r.exited)??e[0]}function cx(e){return e.find(t=>!t.exited)??e[0]}const Xa=1200,mf=["mod","alt","shift"];class vf{constructor(){this.pendingTokens=[]}handle(t,i,s={}){const r=el(t);if(r===void 0)return!1;const o=Tr(i,s.shortcuts,{enabledOnly:!0}).filter(n=>n.active).map(n=>({action:n.action,tokens:n.tokens}));if(this.pendingTokens.length>0){if(this.handleSequence([...this.pendingTokens,r],o))return!0;if(this.clearPending(),!Vt(r))return!1}else if(!Vt(r))return!1;return this.handleSequence([r],o)}reset(){this.clearPending()}handleSequence(t,i){const s=i.find(o=>If(o.tokens,t));return s!==void 0?(this.clearPending(),s.action.run(),!0):i.some(o=>Mr(o.tokens,t))?(this.setPending(t),!0):!1}setPending(t){this.clearPending(),this.pendingTokens=t,this.pendingTimer=globalThis.setTimeout(()=>{this.pendingTokens=[],this.pendingTimer=void 0},Xa)}clearPending(){this.pendingTokens=[],this.pendingTimer!==void 0&&(globalThis.clearTimeout(this.pendingTimer),this.pendingTimer=void 0)}}function Tr(e,t,i={}){const s=e.flatMap((p,u)=>{if(i.enabledOnly===!0&&p.enabled===!1)return[];const h=bf(p,t,u);return h===void 0?[]:[h]}),r=new Map;for(const p of s)r.set(p.key,[...r.get(p.key)??[],p]);const o=new Map;for(const p of r.values()){const u=[...p].sort(Zs)[0];u!==void 0&&o.set(u.key,u)}const n=[...o.values()].sort(xf),a=new Map,c=new Map;for(const p of s){const u=o.get(p.key);if(u===void 0)continue;const h=Sf(u,n)??u;c.set(p,h),p!==h&&a.set(h,[...a.get(h)??[],p])}return s.map(p=>{const u=c.get(p),h=u===p,g=u===void 0||h?void 0:Yo(u),w=h?[...a.get(p)??[]].sort(Zs).map(Yo):[];return{...p,active:h,shadows:w,...g===void 0?{}:{shadowedBy:g}}}).sort((p,u)=>p.order-u.order)}function ys(e){return tl(e,{requireFirstChordActivator:!0})}function Ya(e){const t=tl(e,{requireFirstChordActivator:!1});return t.ok?t.tokens:[]}function wi(e){return Ya(e).map(t=>t.split("+").map(sl).join("+")).join(" ")}function el(e){if(e.isComposing)return;const t=Pf(e.key);if(t===void 0)return;const i=[];return(e.metaKey||e.ctrlKey)&&i.push("mod"),e.altKey&&i.push("alt"),e.shiftKey&&i.push("shift"),i.push(t),i.join("+")}function Vt(e){return e.split("+").includes("mod")||e.split("+").includes("alt")}function bf(e,t,i){const s=wf(e.id,t);if(s===null)return;const r=s??e.shortcut;if(r===void 0||r==="")return;const o=Ya(r),n=o[0];if(!(n===void 0||!Vt(n)))return{action:e,shortcut:o.join(" "),source:s===void 0?"default":"custom",tokens:o,key:yf(o),order:i}}function wf(e,t){if(!(t===void 0||!Object.hasOwn(t,e)))return t[e]}function yf(e){return e.join("\0")}function Yo(e){return{action:e.action,shortcut:e.shortcut,source:e.source}}function Zs(e,t){return en(e.source)-en(t.source)||tn(e.action.id,t.action.id)||tn(e.action.title,t.action.title)||e.order-t.order}function xf(e,t){return e.tokens.length-t.tokens.length||Zs(e,t)}function Sf(e,t){return t.find(i=>i!==e&&i.tokens.length<e.tokens.length&&Mr(e.tokens,i.tokens))}function en(e){switch(e){case"custom":return 0;case"default":return 1}}function tn(e,t){return e<t?-1:e>t?1:0}function tl(e,t){const i=e.trim().toLowerCase().replace(/\s*\+\s*/gu,"+");if(i==="")return{ok:!1,message:"请输入快捷键,选择无,或重置为默认值。"};const s=[],r=i.split(/\s+/u).filter(o=>o!=="");for(const[o,n]of r.entries()){const a=kf(n);if(!a.ok)return a;if(o===0&&t.requireFirstChordActivator&&!Vt(a.token))return{ok:!1,message:"快捷键必须以 Ctrl/⌘ 或 Alt 开头,避免拦截普通输入。"};s.push(a.token)}return{ok:!0,shortcut:s.join(" "),tokens:s}}function kf(e){const t=e.split("+").filter(o=>o!=="");if(t.length===0)return{ok:!1,message:"快捷键组合必须包含一个按键。"};const i=new Set;let s;for(const o of t){const n=$f(o);if(n!==void 0){if(i.has(n))return{ok:!1,message:`快捷键包含重复的 ${sl(n)} 修饰键。`};i.add(n);continue}const a=il(o);if(a===void 0)return{ok:!1,message:`不支持的快捷键按键:${o}`};if(s!==void 0)return{ok:!1,message:"每个快捷键组合只能包含一个非修饰键。"};s=a}return s===void 0?{ok:!1,message:"快捷键组合必须包含一个按键。"}:{ok:!0,token:[...mf.filter(o=>i.has(o)),s].join("+")}}function $f(e){switch(e){case"mod":case"meta":case"cmd":case"command":case"ctrl":case"control":case"primary":return"mod";case"alt":case"option":case"opt":return"alt";case"shift":return"shift";default:return}}function il(e){const t=Cf(e);if(t!==void 0)return t;if(/^f(?:[1-9]|1[0-9]|2[0-4])$/u.test(e)||e.length===1)return e}function Pf(e){if(e===" ")return"space";const t=e.toLowerCase();return il(t)}function Cf(e){switch(e){case" ":case"spacebar":case"space":return"space";case"esc":case"escape":return"escape";case"return":case"enter":return"enter";case"del":case"delete":return"delete";case"backspace":return"backspace";case"tab":return"tab";case"up":case"arrowup":return"arrowup";case"down":case"arrowdown":return"arrowdown";case"left":case"arrowleft":return"arrowleft";case"right":case"arrowright":return"arrowright";case"pageup":case"pagedown":case"home":case"end":return e;case"+":case"plus":return"plus";case"period":case"dot":return".";case"comma":return",";case"slash":return"/";case"backslash":return"\\";case"minus":return"-";default:return}}function sl(e){return e==="mod"?sn()?"⌘":"Ctrl":e==="shift"?"Shift":e==="alt"?sn()?"⌥":"Alt":e==="enter"?"Enter":e==="escape"?"Esc":e==="space"?"Space":e==="tab"?"Tab":e==="backspace"?"Backspace":e==="delete"?"Delete":e==="arrowup"?"↑":e==="arrowdown"?"↓":e==="arrowleft"?"←":e==="arrowright"?"→":e==="pageup"?"PageUp":e==="pagedown"?"PageDown":e==="home"?"Home":e==="end"?"End":e==="plus"?"+":/^f(?:[1-9]|1[0-9]|2[0-4])$/u.test(e)||e.length===1?e.toUpperCase():`${e.charAt(0).toUpperCase()}${e.slice(1)}`}function If(e,t){return e.length===t.length&&Mr(e,t)}function Mr(e,t){return t.every((i,s)=>e[s]===i)}function sn(){return typeof navigator<"u"&&navigator.userAgent.toLowerCase().includes("mac")}const Rf={archiveIdleEnabled:!0,archiveIdleDays:"30",deleteArchivedEnabled:!1,deleteArchivedDays:"90"};function Ut(e){if(!e.archiveIdleEnabled&&!e.deleteArchivedEnabled)return{ok:!1,error:"请至少启用一项清理操作。"};const t={archiveIdleDays:null,deleteArchivedDays:null};if(e.archiveIdleEnabled){const i=nn(e.archiveIdleDays,"归档空闲会话天数");if(typeof i=="string")return{ok:!1,error:i};t.archiveIdleDays=i}if(e.deleteArchivedEnabled){const i=nn(e.deleteArchivedDays,"删除已归档会话天数");if(typeof i=="string")return{ok:!1,error:i};t.deleteArchivedDays=i}return{ok:!0,request:t}}function $t(e){return JSON.stringify({archiveIdleDays:e?.archiveIdleDays??null,deleteArchivedDays:e?.deleteArchivedDays??null})}function rn(e){if(!e.canCleanup||e.loading===!0||e.running===!0||e.preview===void 0)return!1;const t=Ut(e.draft);return!t.ok||$t(t.request)!==$t(e.previewRequest)?!1:yi(e.preview)}function yi(e){return e.totals.archiveCount>0||e.totals.deleteCount>0}function rl(e,t){const i=e.projects.map(r=>r.cwd);if(t===void 0)return i;const s=new Set(t);return i.filter(r=>s.has(r))}function on(e,t){const i=new Set(rl(e,t)),s=e.projects.filter(r=>i.has(r.cwd));return{...e,projects:s,totals:s.reduce((r,o)=>({archiveCount:r.archiveCount+o.archiveCount,deleteCount:r.deleteCount+o.deleteCount}),{archiveCount:0,deleteCount:0})}}function Af(e,t){return t(Tf(e))}function Tf(e){const t=e.totals.archiveCount,i=e.totals.deleteCount,s=[];return t>0&&s.push(`归档 ${String(t)} 个空闲会话`),i>0&&s.push(`永久删除 ${String(i)} 个已归档会话`),`运行清理并${s.length===0?"执行清理":s.join("并")}?
25
25
 
26
26
  永久删除只适用于已归档会话,且无法撤销。`}function Mf(e){return`请更新并重启 ${e??"此机器"} 上的 Pi-Web 后再清理会话。`}function nn(e,t){const i=e.trim();if(i==="")return`${t}必须设置。`;const s=Number(i);return!Number.isInteger(s)||s<0?`${t}必须是非负整数天数。`:s}const Er="themes:classic",Ef="themes:pi-web-dark",Df={themeId:Ef,auto:!0},ol="pi-web-app-theme",Wf=["--pi-bg","--pi-surface","--pi-surface-hover","--pi-terminal-bg","--pi-terminal-text","--pi-border","--pi-border-muted","--pi-text","--pi-text-secondary","--pi-text-bright","--pi-muted","--pi-dim","--pi-accent","--pi-accent-border","--pi-selection-bg","--pi-success","--pi-success-border","--pi-success-bg","--pi-success-surface","--pi-success-ring","--pi-warning","--pi-warning-border","--pi-warning-surface","--pi-danger","--pi-purple","--pi-purple-border","--pi-purple-surface","--pi-overlay","--pi-shadow-soft","--pi-shadow","--pi-shadow-strong","--pi-bg-overlay-soft","--pi-bg-overlay","--pi-success-bg-overlay","--pi-terminal-selection"],Of=/^[a-z][a-z0-9.-]*:[a-z][a-z0-9.-]*$/u;function _f(){try{const e=window.localStorage.getItem(ol);return e===null?void 0:zf(e)}catch{return}}function Lf(e){try{window.localStorage.setItem(ol,JSON.stringify(e))}catch{}}function jf(e){const t=document.documentElement;t.dataset.piWebTheme=e.id,t.style.colorScheme=e.colorScheme;for(const i of Wf){const s=e.tokens[i];typeof s=="string"&&s!==""?t.style.setProperty(i,s):t.style.removeProperty(i)}}function Ff(e){const t=Uf(e.themes,e.fallbackThemeId??Er),i=e.themes.find(n=>n.id===e.preference.themeId)??t;if(i===void 0)return{selectedTheme:void 0,activeTheme:void 0,selectedThemePair:void 0,fallbackTheme:t};const s=nl(e.themePairs,i.id);if(!e.preference.auto||s===void 0)return{selectedTheme:i,activeTheme:i,selectedThemePair:s,fallbackTheme:t};const r=e.prefersLight?s.light:s.dark,o=e.themes.find(n=>n.id===r)??i;return{selectedTheme:i,activeTheme:o,selectedThemePair:s,fallbackTheme:t}}function Uf(e,t=Er){return e.find(i=>i.id===t)??e[0]}function nl(e,t){return e.find(i=>i.light===t||i.dark===t)}function zf(e){const t=e.trim();if(t!=="")try{const i=JSON.parse(t);return Bf(i)?i:void 0}catch{return}}function Bf(e){if(!Nf(e))return!1;const t=e.themeId,i=e.auto;return Hf(t)&&typeof i=="boolean"}function Nf(e){return typeof e=="object"&&e!==null}function Hf(e){return typeof e=="string"&&Of.test(e)}const qf="management";function Kf(e){return Vf(Gf())===qf}function Vf(e){if(e===void 0||e==="")return;const t=new URLSearchParams(e).get("embed")?.trim();return t===""?void 0:t}function Gf(){return typeof window>"u"?void 0:window.location.search}const Jf="workspace.delete",Qf="pi.operation",Zf="target.workspaceId";function Xf(e){return{...e===void 0?{}:{projectId:e},metadata:{[Qf]:Jf}}}function Yf(e){const t={};for(const i of e){const s=Xs(i);if(s===void 0)continue;const r=t[s];(r===void 0||i.createdAt.localeCompare(r.createdAt)>=0)&&(t[s]=i)}return t}function eg(e){return Object.entries(e).filter(([,t])=>_i(t)).map(([t])=>t)}function al(e,t){if(t===void 0)return!1;const i=e.workspaceDeletionRuns[t.id];return i!==void 0&&_i(i)}function Xs(e){return e.metadata[Zf]}function _i(e){return e.status==="queued"||e.status==="running"}function an(){return[{id:"actions.show",title:"显示操作",description:"打开命令面板",shortcut:"mod+k",group:"通用",run:e=>{e.openActionPalette()}},{id:"prompt.focus",title:"聚焦提示词输入框",description:"将键盘焦点移动到消息编辑器",shortcut:"mod+g c",group:"通用",enabled:e=>e.state.selectedSession!==void 0,run:e=>{e.focusPrompt()}},{id:"machine.add",title:"添加机器",description:"注册另一个可从当前网关访问的 PI WEB 运行时",group:"机器",run:e=>e.addMachine()},{id:"machine.refresh",title:"刷新所选机器",description:"检查所选 PI WEB 运行时是否在线",group:"机器",run:e=>e.refreshSelectedMachine()},{id:"machine.open",title:"打开所选机器的 PI WEB",description:"在新标签页中直接打开所选远程 PI WEB",group:"机器",enabled:e=>e.state.selectedMachine?.kind==="remote"&&e.state.selectedMachine.baseUrl!==void 0,run:e=>e.openSelectedMachine()},{id:"machine.remove",title:"移除所选机器",description:"从当前网关移除所选远程机器",group:"机器",enabled:e=>e.state.selectedMachine?.kind==="remote",run:e=>e.removeSelectedMachine()},{id:"project.add",title:"添加项目",group:"项目",run:e=>e.addProject()},{id:"auth.login",title:"配置提供商认证",description:"运行 /login,但不将认证绑定到某个会话",group:"通用",run:e=>e.configureAuth()},{id:"auth.logout",title:"移除提供商认证",description:"针对已保存的 pi 凭据运行 /logout",group:"通用",run:e=>e.logoutAuth()},{id:"theme.select",title:"选择主题",description:"选择 PI WEB 颜色主题",group:"偏好设置",run:e=>{e.openThemePicker()}},{id:"settings.open",title:"打开设置",description:"管理 PI WEB 配置和键盘快捷键",shortcut:"mod+,",group:"偏好设置",run:e=>{e.piWebUnstable?.openSettings?.()}},{id:"app.reload-page",title:"完整重载页面",description:"重新加载 PI WEB 浏览器页面",group:"通用",run:e=>{e.reloadPage()}},{id:"view.chat",title:"转到聊天",shortcut:"mod+1",group:"导航",run:e=>{e.focusPrompt()}},{id:"view.files",title:"转到文件",shortcut:"mod+2",group:"导航",enabled:Wt,run:e=>{e.selectMainView("core:workspace.files")}},{id:"view.git",title:"转到 Git",shortcut:"mod+3",group:"导航",enabled:ln,run:e=>{e.selectMainView("core:workspace.git")}},{id:"view.terminal",title:"转到终端",shortcut:"mod+4",group:"导航",enabled:Wt,run:e=>{e.selectMainView("core:workspace.terminal")}},{id:"workspace.refresh-files",title:"刷新文件",shortcut:"mod+shift+f",group:"工作区",enabled:Wt,run:e=>e.refreshFiles()},{id:"workspace.refresh-git",title:"刷新 Git",shortcut:"mod+shift+g",group:"工作区",enabled:ln,run:e=>e.refreshGit()},{id:"workspace.refresh-current",title:"刷新当前面板",shortcut:"mod+shift+r",group:"工作区",enabled:Wt,run:e=>e.state.workspaceTool==="core:workspace.git"&&e.state.selectedWorkspace?.isGitRepo===!0?e.refreshGit():e.refreshFiles()},{id:"workspace.delete",title:"删除工作区",description:"移除所选 Git worktree",group:"工作区",enabled:tg,run:e=>e.deleteWorkspace()},{id:"session.start",title:"启动会话",shortcut:"mod+enter",group:"会话",enabled:Wt,run:e=>e.startSession()},{id:"session.archive",title:"归档会话",description:"归档所选会话",group:"会话",enabled:ig,run:e=>e.archiveSession()},{id:"session.reload",title:"重新加载会话",description:"从磁盘重新读取所选会话,以获取其他进程写入的条目",group:"会话",enabled:rg,disabledReason:ll,run:e=>e.reloadSession()},{id:"session.delete",title:"删除新会话",description:"删除所选浏览器缓存的新会话",group:"会话",enabled:sg,run:e=>e.deleteCachedNewSession()},{id:"session.stop",title:"停止活动工作",shortcut:"mod+.",group:"会话",enabled:e=>e.state.selectedSession!==void 0&&Ye(e.state.status,e.state.activity),run:e=>e.stopActiveWork()}]}function Wt(e){return e.state.selectedWorkspace!==void 0}function ln(e){return e.state.selectedWorkspace?.isGitRepo===!0}function tg(e){const t=e.state.selectedWorkspace;return t!==void 0&&t.isGitWorktree&&!t.isMain&&!al(e.state,t)}function ig(e){const t=e.state.selectedSession;return t!==void 0&&t.archived!==!0&&!Z(t)}function sg(e){return Z(e.state.selectedSession)}function rg(e){const t=e.state.selectedSession;return t===void 0||t.archived===!0||Z(t)||ll(e)!==void 0?!1:!Ye(e.state.status,e.state.activity)}function ll(e){const t=e.state.selectedSession;if(!(t===void 0||t.archived===!0||Z(t))&&!Ye(e.state.status,e.state.activity))return og(e.state,Oe.sessionsReload,"reload sessions")}function og(e,t,i){const s=e.machineRuntimes[f(e)];if(!(s?.ok===!0&&Be(s,t)))return`Update and restart Pi-Web on ${e.selectedMachine?.name??"this machine"} to ${i}.`}const ng="modulepreload",ag=function(e){return"/"+e},cn={},Dr=function(t,i,s){let r=Promise.resolve();if(i&&i.length>0){let c=function(p){return Promise.all(p.map(u=>Promise.resolve(u).then(h=>({status:"fulfilled",value:h}),h=>({status:"rejected",reason:h}))))};document.getElementsByTagName("link");const n=document.querySelector("meta[property=csp-nonce]"),a=n?.nonce||n?.getAttribute("nonce");r=c(i.map(p=>{if(p=ag(p),p in cn)return;cn[p]=!0;const u=p.endsWith(".css"),h=u?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${p}"]${h}`))return;const g=document.createElement("link");if(g.rel=u?"stylesheet":ng,u||(g.as="script"),g.crossOrigin="",g.href=p,a&&g.setAttribute("nonce",a),document.head.appendChild(g),u)return new Promise((w,P)=>{g.addEventListener("load",w),g.addEventListener("error",()=>P(new Error(`Unable to preload CSS for ${p}`)))})}))}function o(n){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=n,window.dispatchEvent(a),!a.defaultPrevented)throw n}return r.then(n=>{for(const a of n||[])a.status==="rejected"&&o(a.reason);return t().catch(o)})};function lg(e){return typeof e!="string"?l`<span class="tab-custom-icon" aria-hidden="true">${e}</span>`:xi(e)}function xi(e){switch(e){case"navigation":return be`
27
27
  <svg class="tab-icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
@@ -163,7 +163,7 @@ ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.
163
163
  button { padding: 5px 7px; }
164
164
  .icon-button { width: 34px; height: 34px; }
165
165
  }
166
- `;var ug=Object.defineProperty,fg=Object.getOwnPropertyDescriptor,Ke=(e,t,i,s)=>{for(var r=s>1?void 0:s?fg(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&ug(t,i,r),r};let Te=class extends A{constructor(){super(...arguments),this.destinationFolder="",this.overwrite=!1,this.createDirs=!0,this.formError="",this.dragActive=!1,this.dragDepth=0,this.openFilePicker=()=>{this.uploadInput?.click()},this.handleFileInputChange=e=>{const t=e.currentTarget instanceof HTMLInputElement?e.currentTarget:void 0,i=gn(t?.files);t!==void 0&&(t.value=""),i.length>0&&this.openUploadReview(i)},this.handleDragEnter=e=>{ni(e)&&(e.preventDefault(),this.dragDepth+=1,this.dragActive=!0)},this.handleDragOver=e=>{ni(e)&&(e.preventDefault(),e.dataTransfer!==null&&(e.dataTransfer.dropEffect="copy"),this.dragActive=!0)},this.handleDragLeave=e=>{ni(e)&&(e.preventDefault(),this.dragDepth=Math.max(0,this.dragDepth-1),this.dragDepth===0&&(this.dragActive=!1))},this.handleDrop=e=>{if(!ni(e))return;e.preventDefault(),this.dragDepth=0,this.dragActive=!1;const t=gn(e.dataTransfer?.files),i=this.context;t.length>0&&i!==void 0&&bg(i,t)},this.handleDestinationInput=e=>{const t=e.currentTarget instanceof HTMLInputElement?e.currentTarget:void 0;this.destinationFolder=t?.value??"",this.formError=""},this.handleCreateDirsChange=e=>{const t=e.currentTarget instanceof HTMLInputElement?e.currentTarget:void 0;this.createDirs=t?.checked??!0},this.handleOverwriteChange=e=>{const t=e.currentTarget instanceof HTMLInputElement?e.currentTarget:void 0;this.overwrite=t?.checked??!1},this.handleDialogKeyDown=e=>{e.key==="Escape"&&(e.preventDefault(),this.closeUploadDialog())}}willUpdate(e){if(!e.has("context"))return;const t=e.get("context");t!==void 0&&this.context!==void 0&&hn(t)!==hn(this.context)&&this.resetPendingUpload()}render(){const e=this.context;if(e===void 0)return l`<p class="muted">文件不可用。</p>`;const t=e.selectedFilePath,i=dn(e.fileTree,e.expandedDirs,t),s=t!==void 0&&t!=="";return l`
166
+ `;var ug=Object.defineProperty,fg=Object.getOwnPropertyDescriptor,Ke=(e,t,i,s)=>{for(var r=s>1?void 0:s?fg(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&ug(t,i,r),r};let Te=class extends A{constructor(){super(...arguments),this.destinationFolder="",this.overwrite=!1,this.createDirs=!0,this.formError="",this.dragActive=!1,this.dragDepth=0,this.openFilePicker=()=>{this.uploadInput?.click()},this.handleFileInputChange=e=>{const t=e.currentTarget instanceof HTMLInputElement?e.currentTarget:void 0,i=gn(t?.files);t!==void 0&&(t.value=""),i.length>0&&this.openUploadReview(i)},this.handleDragEnter=e=>{ni(e)&&(e.preventDefault(),this.dragDepth+=1,this.dragActive=!0)},this.handleDragOver=e=>{ni(e)&&(e.preventDefault(),e.dataTransfer!==null&&(e.dataTransfer.dropEffect="copy"),this.dragActive=!0)},this.handleDragLeave=e=>{ni(e)&&(e.preventDefault(),this.dragDepth=Math.max(0,this.dragDepth-1),this.dragDepth===0&&(this.dragActive=!1))},this.handleDrop=e=>{if(!ni(e))return;e.preventDefault(),this.dragDepth=0,this.dragActive=!1;const t=gn(e.dataTransfer?.files),i=this.context;t.length>0&&i!==void 0&&wg(i,t)},this.handleDestinationInput=e=>{const t=e.currentTarget instanceof HTMLInputElement?e.currentTarget:void 0;this.destinationFolder=t?.value??"",this.formError=""},this.handleCreateDirsChange=e=>{const t=e.currentTarget instanceof HTMLInputElement?e.currentTarget:void 0;this.createDirs=t?.checked??!0},this.handleOverwriteChange=e=>{const t=e.currentTarget instanceof HTMLInputElement?e.currentTarget:void 0;this.overwrite=t?.checked??!1},this.handleDialogKeyDown=e=>{e.key==="Escape"&&(e.preventDefault(),this.closeUploadDialog())}}willUpdate(e){if(!e.has("context"))return;const t=e.get("context");t!==void 0&&this.context!==void 0&&hn(t)!==hn(this.context)&&this.resetPendingUpload()}render(){const e=this.context;if(e===void 0)return l`<p class="muted">文件不可用。</p>`;const t=e.selectedFilePath,i=dn(e.fileTree,e.expandedDirs,t),s=bg(t,i),r=t!==void 0&&t!=="";return l`
167
167
  <section
168
168
  class=${this.dragActive?"files-panel dragging":"files-panel"}
169
169
  @dragenter=${this.handleDragEnter}
@@ -178,7 +178,8 @@ ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.
178
178
  <button @click=${()=>{this.promptCreateFile(e,i)}}>新建文件</button>
179
179
  <button @click=${()=>{this.promptCreateDirectory(e,i)}}>新建文件夹</button>
180
180
  <button aria-label="上传文件" @click=${this.openFilePicker}>上传</button>
181
- <button class="danger" title=${s?`删除 ${t}`:"请选择要删除的文件或文件夹"} ?disabled=${!s} @click=${()=>{this.confirmDeleteSelectedPath(e)}}>删除</button>
181
+ <button title=${s?`下载 ${t??""}`:"请选择要下载的文件"} ?disabled=${!s} @click=${e.onDownloadSelectedFile}>下载</button>
182
+ <button class="danger" title=${r?`删除 ${t}`:"请选择要删除的文件或文件夹"} ?disabled=${!r} @click=${()=>{this.confirmDeleteSelectedPath(e)}}>删除</button>
182
183
  <button @click=${e.onRefreshFiles}>刷新</button>
183
184
  </div>
184
185
  <input id="workspace-upload-input" class="visually-hidden" type="file" multiple @change=${this.handleFileInputChange} />
@@ -186,7 +187,7 @@ ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.
186
187
  ${this.renderUploadProgress(e)}
187
188
  <section class="split">
188
189
  <div class="list tree">
189
- ${e.fileTree.length===0?l`<p class="muted">尚未加载文件。</p>`:e.fileTree.map(r=>this.renderTreeEntry(e,r,0))}
190
+ ${e.fileTree.length===0?l`<p class="muted">尚未加载文件。</p>`:e.fileTree.map(o=>this.renderTreeEntry(e,o,0))}
190
191
  </div>
191
192
  <div class="viewer">
192
193
  ${this.renderFileViewer(e)}
@@ -206,7 +207,7 @@ ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.
206
207
  <span>${t.name}</span>
207
208
  </button>
208
209
  ${r?s.map(n=>this.renderTreeEntry(e,n,i+1)):null}
209
- `}selectTreeEntry(e,t){if(t.type==="directory"){e.onSelectDirectory(t.path),e.onExpandDir(t.path);return}e.onSelectFile(t.path)}renderFileViewer(e){const t=e.selectedFileContent;return e.selectedFilePath===void 0||e.selectedFilePath===""?l`<p class="muted">请选择文件。</p>`:dn(e.fileTree,e.expandedDirs,e.selectedFilePath)==="directory"?l`<p class="muted">已选择文件夹:${e.selectedFilePath}</p>`:t===void 0?l`<p class="muted">正在加载 ${e.selectedFilePath}…</p>`:t.mediaType==="image"?this.renderImageViewer(e,t):t.binary?l`<p class="muted">二进制文件:${t.path} · ${xt(t.size)}</p>`:(Ig(),l`
210
+ `}selectTreeEntry(e,t){if(t.type==="directory"){e.onSelectDirectory(t.path),e.onExpandDir(t.path);return}e.onSelectFile(t.path)}renderFileViewer(e){const t=e.selectedFileContent;return e.selectedFilePath===void 0||e.selectedFilePath===""?l`<p class="muted">请选择文件。</p>`:dn(e.fileTree,e.expandedDirs,e.selectedFilePath)==="directory"?l`<p class="muted">已选择文件夹:${e.selectedFilePath}</p>`:t===void 0?l`<p class="muted">正在加载 ${e.selectedFilePath}…</p>`:t.mediaType==="image"?this.renderImageViewer(e,t):t.binary?l`<p class="muted">二进制文件:${t.path} · ${xt(t.size)}</p>`:(Rg(),l`
210
211
  <div class="viewer-header"><strong>${t.path}</strong><small>${t.language??"文本"}${t.truncated?" · 已截断":""}</small></div>
211
212
  <code-viewer .content=${t.content} .language=${t.language}></code-viewer>
212
213
  `)}renderImageViewer(e,t){const i=`${t.mimeType??"image"} · ${xt(t.size)}`;if(t.size>cg)return l`
@@ -221,7 +222,7 @@ ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.
221
222
  <section class="upload-progress" aria-label="工作区上传">
222
223
  <div class="upload-progress-header">
223
224
  <strong>上传</strong>
224
- <small>${xg(t)}</small>
225
+ <small>${Sg(t)}</small>
225
226
  </div>
226
227
  ${t.map(i=>this.renderUploadBatch(e,i))}
227
228
  </section>
@@ -229,12 +230,12 @@ ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.
229
230
  <article class=${`upload-batch ${t.status}`}>
230
231
  <div class="upload-batch-heading">
231
232
  <div>
232
- <strong>${Sg(t)}</strong>
233
+ <strong>${kg(t)}</strong>
233
234
  <small>${t.destinationFolder===""?"工作区根目录":t.destinationFolder}</small>
234
235
  </div>
235
- <span>${kg(t)}</span>
236
+ <span>${$g(t)}</span>
236
237
  </div>
237
- <progress max="1" .value=${$g(t)}></progress>
238
+ <progress max="1" .value=${Pg(t)}></progress>
238
239
  <div class="upload-file-list">
239
240
  ${t.files.map(i=>this.renderUploadFile(i))}
240
241
  </div>
@@ -242,13 +243,13 @@ ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.
242
243
  ${t.status==="uploading"?l`<button @click=${()=>{e.onCancelWorkspaceUpload(t.id)}}>取消</button>`:l`<button @click=${()=>{e.onClearWorkspaceUpload(t.id)}}>关闭</button>`}
243
244
  </div>
244
245
  </article>
245
- `}renderUploadFile(e){const t=Cg(e);return l`
246
+ `}renderUploadFile(e){const t=Ig(e);return l`
246
247
  <div class=${`upload-file ${e.status}`}>
247
248
  <div class="upload-file-main">
248
249
  <span>${e.name}</span>
249
250
  <small>${t}</small>
250
251
  </div>
251
- <span class="upload-file-status">${Pg(e)}</span>
252
+ <span class="upload-file-status">${Cg(e)}</span>
252
253
  </div>
253
254
  `}renderUploadDialog(e,t){const i=t.files.length;return l`
254
255
  <div class="dialog-backdrop" @mousedown=${()=>{this.closeUploadDialog()}}>
@@ -341,7 +342,7 @@ ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.
341
342
  .review-file span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
342
343
  .dialog-error { border: 1px solid var(--pi-danger); border-radius: 8px; background: color-mix(in srgb, var(--pi-danger) 10%, transparent); color: var(--pi-danger); padding: 9px; line-height: 1.35; overflow-wrap: anywhere; }
343
344
  footer { display: flex; justify-content: flex-end; gap: 8px; padding-top: 4px; }
344
- `];Ke([d({attribute:!1})],Te.prototype,"context",2);Ke([B("#workspace-upload-input")],Te.prototype,"uploadInput",2);Ke([x()],Te.prototype,"pendingUpload",2);Ke([x()],Te.prototype,"destinationFolder",2);Ke([x()],Te.prototype,"overwrite",2);Ke([x()],Te.prototype,"createDirs",2);Ke([x()],Te.prototype,"formError",2);Ke([x()],Te.prototype,"dragActive",2);Te=Ke([W("workspace-files-panel")],Te);function gg(e,t){return Object.values(e).filter(i=>i.projectId===t.projectId&&i.workspaceId===t.workspaceId&&i.machineId===t.machineId).sort((i,s)=>s.startedAt.localeCompare(i.startedAt))}function mg(e,t){if(e.length===0)return"请至少选择一个要上传的文件。";for(const i of e)try{yr(t,i.name)}catch(s){return s instanceof Error?s.message:String(s)}}function vg(e){return{destinationFolder:e,createDirs:!0,overwrite:!1}}function dn(e,t,i){if(i!==void 0)return wg(e,t,i)?.type}function pn(e,t,i){if(e===void 0||e==="")return i;if(t==="directory")return fn(e,i);const s=yg(e);return s===""?i:fn(s,i)}function bg(e,t){if(t.length!==0)return e.onStartWorkspaceUpload(t,{destinationFolder:e.workspaceUploadDefaultFolder,createDirs:!0,overwrite:!1,selectUploadedFile:!0})}function hn(e){return`${e.machine.id}:${e.workspace.projectId}:${e.workspace.id}`}function un(e,t){const i=window.prompt(e,t);if(i===null)return;const s=i.trim();return s===""?void 0:s}function wg(e,t,i){const s=e.find(r=>r.path===i);if(s!==void 0)return s;for(const r of Object.values(t)){const o=r.find(n=>n.path===i);if(o!==void 0)return o}}function yg(e){const t=e.lastIndexOf("/");return t<0?"":e.slice(0,t)}function fn(e,t){return e===""?t:`${e.replace(/\/+$/u,"")}/${t.replace(/^\/+/u,"")}`}function gn(e){return e==null?[]:Array.from(e)}function ni(e){return Array.from(e.dataTransfer?.types??[]).includes("Files")}function xg(e){const t=e.filter(i=>i.status==="uploading").length;return t===0?`${String(e.length)} 个最近`:`${String(t)} 个上传中`}function Sg(e){const t=String(e.files.length);switch(e.status){case"completed":return`已上传 ${t} 个文件`;case"error":return`${t} 个文件上传失败`;case"cancelled":return`已取消 ${t} 个文件的上传`;case"uploading":return`正在上传 ${t} 个文件`}}function kg(e){switch(e.status){case"completed":return"完成";case"error":return"失败";case"cancelled":return"已取消";case"uploading":return cl(e.percent)}}function $g(e){return e.status==="uploading"?e.percent:1}function Pg(e){switch(e.status){case"pending":return"待处理";case"uploading":return cl(e.percent);case"completed":return"完成";case"error":return"错误";case"cancelled":return"已取消"}}function Cg(e){return e.error!==void 0?e.error:e.response!==void 0?`已写入 ${e.response.path}`:`${e.path} · ${xt(e.loaded)} / ${xt(e.total)}`}function cl(e){return`${String(Math.round(Math.max(0,Math.min(1,e))*100))}%`}function Ig(){Dr(()=>import("./CodeViewer-B8UDBbru.js"),__vite__mapDeps([0,1,2,3]))}function xt(e){if(!Number.isFinite(e)||e<0)return"0 B";if(e<1024)return`${String(e)} B`;const t=e/1024;if(t<1024)return`${xs(t)} KB`;const i=t/1024;return i<1024?`${xs(i)} MB`:`${xs(i/1024)} GB`}function xs(e){return e>=10?String(Math.round(e)):e.toFixed(1)}function mn(){return[{id:"workspace.files",title:"文件",icon:xi("files"),order:10,render:Rg},{id:"workspace.git",title:"Git",icon:xi("git"),order:20,visible:({workspace:e})=>e.isGitRepo,render:Tg},{id:"workspace.terminal",title:"终端",icon:xi("terminal"),order:30,badge:e=>e.activeTerminalCount>0?e.activeTerminalCount:void 0,render:Ag}]}function Rg(e){return l`<workspace-files-panel .context=${e}></workspace-files-panel>`}function Ag(e){return Wg(),l`<terminal-panel .workspace=${e.workspace} .machineId=${e.machine.id} .selectedTerminalId=${e.selectedTerminalId} .autoStart=${e.terminalAutoStart} .onSelectTerminal=${e.onSelectTerminal}></terminal-panel>`}function Tg(e){const t=e.gitStatus;return l`
345
+ `];Ke([d({attribute:!1})],Te.prototype,"context",2);Ke([B("#workspace-upload-input")],Te.prototype,"uploadInput",2);Ke([x()],Te.prototype,"pendingUpload",2);Ke([x()],Te.prototype,"destinationFolder",2);Ke([x()],Te.prototype,"overwrite",2);Ke([x()],Te.prototype,"createDirs",2);Ke([x()],Te.prototype,"formError",2);Ke([x()],Te.prototype,"dragActive",2);Te=Ke([W("workspace-files-panel")],Te);function gg(e,t){return Object.values(e).filter(i=>i.projectId===t.projectId&&i.workspaceId===t.workspaceId&&i.machineId===t.machineId).sort((i,s)=>s.startedAt.localeCompare(i.startedAt))}function mg(e,t){if(e.length===0)return"请至少选择一个要上传的文件。";for(const i of e)try{yr(t,i.name)}catch(s){return s instanceof Error?s.message:String(s)}}function vg(e){return{destinationFolder:e,createDirs:!0,overwrite:!1}}function dn(e,t,i){if(i!==void 0)return yg(e,t,i)?.type}function bg(e,t){return e!==void 0&&e!==""&&t==="file"}function pn(e,t,i){if(e===void 0||e==="")return i;if(t==="directory")return fn(e,i);const s=xg(e);return s===""?i:fn(s,i)}function wg(e,t){if(t.length!==0)return e.onStartWorkspaceUpload(t,{destinationFolder:e.workspaceUploadDefaultFolder,createDirs:!0,overwrite:!1,selectUploadedFile:!0})}function hn(e){return`${e.machine.id}:${e.workspace.projectId}:${e.workspace.id}`}function un(e,t){const i=window.prompt(e,t);if(i===null)return;const s=i.trim();return s===""?void 0:s}function yg(e,t,i){const s=e.find(r=>r.path===i);if(s!==void 0)return s;for(const r of Object.values(t)){const o=r.find(n=>n.path===i);if(o!==void 0)return o}}function xg(e){const t=e.lastIndexOf("/");return t<0?"":e.slice(0,t)}function fn(e,t){return e===""?t:`${e.replace(/\/+$/u,"")}/${t.replace(/^\/+/u,"")}`}function gn(e){return e==null?[]:Array.from(e)}function ni(e){return Array.from(e.dataTransfer?.types??[]).includes("Files")}function Sg(e){const t=e.filter(i=>i.status==="uploading").length;return t===0?`${String(e.length)} 个最近`:`${String(t)} 个上传中`}function kg(e){const t=String(e.files.length);switch(e.status){case"completed":return`已上传 ${t} 个文件`;case"error":return`${t} 个文件上传失败`;case"cancelled":return`已取消 ${t} 个文件的上传`;case"uploading":return`正在上传 ${t} 个文件`}}function $g(e){switch(e.status){case"completed":return"完成";case"error":return"失败";case"cancelled":return"已取消";case"uploading":return cl(e.percent)}}function Pg(e){return e.status==="uploading"?e.percent:1}function Cg(e){switch(e.status){case"pending":return"待处理";case"uploading":return cl(e.percent);case"completed":return"完成";case"error":return"错误";case"cancelled":return"已取消"}}function Ig(e){return e.error!==void 0?e.error:e.response!==void 0?`已写入 ${e.response.path}`:`${e.path} · ${xt(e.loaded)} / ${xt(e.total)}`}function cl(e){return`${String(Math.round(Math.max(0,Math.min(1,e))*100))}%`}function Rg(){Dr(()=>import("./CodeViewer-Cyy3_LEk.js"),__vite__mapDeps([0,1,2,3]))}function xt(e){if(!Number.isFinite(e)||e<0)return"0 B";if(e<1024)return`${String(e)} B`;const t=e/1024;if(t<1024)return`${xs(t)} KB`;const i=t/1024;return i<1024?`${xs(i)} MB`:`${xs(i/1024)} GB`}function xs(e){return e>=10?String(Math.round(e)):e.toFixed(1)}function mn(){return[{id:"workspace.files",title:"文件",icon:xi("files"),order:10,render:Ag},{id:"workspace.git",title:"Git",icon:xi("git"),order:20,visible:({workspace:e})=>e.isGitRepo,render:Mg},{id:"workspace.terminal",title:"终端",icon:xi("terminal"),order:30,badge:e=>e.activeTerminalCount>0?e.activeTerminalCount:void 0,render:Tg}]}function Ag(e){return l`<workspace-files-panel .context=${e}></workspace-files-panel>`}function Tg(e){return Og(),l`<terminal-panel .workspace=${e.workspace} .machineId=${e.machine.id} .selectedTerminalId=${e.selectedTerminalId} .autoStart=${e.terminalAutoStart} .onSelectTerminal=${e.onSelectTerminal}></terminal-panel>`}function Mg(e){const t=e.gitStatus;return l`
345
346
  <section class="toolbar">
346
347
  <strong>Git</strong>
347
348
  ${e.gitStale?l`<span class="stale">过期</span>`:null}
@@ -350,29 +351,29 @@ ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.
350
351
  <section class="split">
351
352
  <div class="list">
352
353
  ${t===void 0?l`<p class="muted">尚未加载状态。</p>`:t.isGitRepo?l`
353
- <p class="summary">${Og(t)}</p>
354
+ <p class="summary">${_g(t)}</p>
354
355
  ${t.files.length===0?l`<p class="muted">没有变更。</p>`:t.files.map(i=>l`
355
356
  <button class="row ${e.selectedDiffPath===i.path?"selected":""}" @click=${()=>{e.onSelectDiff(i.path)}}>
356
- <span>${_g(i.index,i.workingTree)}</span>
357
+ <span>${Lg(i.index,i.workingTree)}</span>
357
358
  <span>${i.path}</span>
358
359
  </button>
359
360
  `)}
360
361
  `:l`<p class="muted">不是 Git 仓库。</p>`}
361
362
  </div>
362
363
  <div class="viewer">
363
- ${Mg(e)}
364
+ ${Eg(e)}
364
365
  </div>
365
366
  </section>
366
- `}function Mg(e){if(e.selectedDiffPath===void 0||e.selectedDiffPath==="")return l`<p class="muted">请选择一个已变更文件。</p>`;const t=e.selectedDiff,i=e.selectedStagedDiff;if(t===void 0||i===void 0)return l`<p class="muted">正在加载 diff…</p>`;const s=[i,t].filter(r=>r.diff!=="");return s.length===0?l`<p class="muted">没有 staged 或 unstaged diff。</p>`:l`
367
+ `}function Eg(e){if(e.selectedDiffPath===void 0||e.selectedDiffPath==="")return l`<p class="muted">请选择一个已变更文件。</p>`;const t=e.selectedDiff,i=e.selectedStagedDiff;if(t===void 0||i===void 0)return l`<p class="muted">正在加载 diff…</p>`;const s=[i,t].filter(r=>r.diff!=="");return s.length===0?l`<p class="muted">没有 staged 或 unstaged diff。</p>`:l`
367
368
  <div class=${s.length===1?"diffs single":"diffs"}>
368
- ${s.map(r=>Eg(r))}
369
+ ${s.map(r=>Dg(r))}
369
370
  </div>
370
- `}function Eg(e){return Dg(),l`
371
+ `}function Dg(e){return Wg(),l`
371
372
  <section class="diff-section">
372
373
  <div class="viewer-header"><strong>${e.path??"diff"}</strong><small>${e.staged?"已暂存":"未暂存"}${e.truncated?" · 已截断":""}</small></div>
373
374
  <unified-diff-viewer .diff=${e.diff}></unified-diff-viewer>
374
375
  </section>
375
- `}function Dg(){Dr(()=>import("./UnifiedDiffViewer-C9IllVsZ.js"),__vite__mapDeps([4,1,2]))}function Wg(){Dr(()=>import("./TerminalPanel-BG0-cSjI.js"),__vite__mapDeps([5,6,7,1,2]))}function Og(e){const t=e.branch??"分离 HEAD",i=e.ahead??0,s=e.behind??0;return i===0&&s===0?t:`${t} · ↑${String(i)} ↓${String(s)}`}function _g(e,t){return(t!=="unmodified"?t:e).slice(0,1).toUpperCase()}const Lg={apiVersion:1,name:"PI WEB 核心",activate:()=>{const e=!Kf();return{contributions:{actions:e?an():an().filter(t=>t.id!=="view.terminal"),workspacePanels:e?mn():mn().filter(t=>t.id!=="workspace.terminal")}}}},jg={"--pi-bg":"#0d1117","--pi-surface":"#161b22","--pi-surface-hover":"#21262d","--pi-terminal-bg":"#05070a","--pi-terminal-text":"#e6edf3","--pi-border":"#30363d","--pi-border-muted":"#21262d","--pi-text":"#e6edf3","--pi-text-secondary":"#c9d1d9","--pi-text-bright":"#f0f6fc","--pi-muted":"#8b949e","--pi-dim":"#6e7681","--pi-accent":"#58a6ff","--pi-accent-border":"#2f81f7","--pi-selection-bg":"#0d2847","--pi-success":"#3fb950","--pi-success-border":"#238636","--pi-success-bg":"#0f1b12","--pi-success-surface":"#0f2a16","--pi-success-ring":"#3fb95055","--pi-warning":"#d29922","--pi-warning-border":"#6e5200","--pi-warning-surface":"#1f1a10","--pi-danger":"#ff7b72","--pi-purple":"#d2a8ff","--pi-purple-border":"#a371f7","--pi-purple-surface":"#21132f","--pi-overlay":"#0008","--pi-shadow-soft":"#0006","--pi-shadow":"#0008","--pi-shadow-strong":"#000b","--pi-bg-overlay-soft":"#0d1117dd","--pi-bg-overlay":"#0d1117e6","--pi-success-bg-overlay":"#0f1b12ee","--pi-terminal-selection":"#264f78"},Fg={"--pi-bg":"#070912","--pi-surface":"#101527","--pi-surface-hover":"#151b31","--pi-terminal-bg":"#050710","--pi-terminal-text":"#f7f4ff","--pi-border":"#26304f","--pi-border-muted":"#26304f","--pi-text":"#f7f4ff","--pi-text-secondary":"#aaa4bd","--pi-text-bright":"#ffffff","--pi-muted":"#aaa4bd","--pi-dim":"#817a99","--pi-accent":"#7c3cff","--pi-accent-border":"#5a47b0","--pi-selection-bg":"#1d2547","--pi-success":"#00f0d8","--pi-success-border":"#00f0d8","--pi-success-bg":"#071e22","--pi-success-surface":"#092d31","--pi-success-ring":"#00f0d855","--pi-warning":"#ffb000","--pi-warning-border":"#ffb000","--pi-warning-surface":"#16140d","--pi-danger":"#ff4f7b","--pi-purple":"#b7a2ff","--pi-purple-border":"#7c3cff","--pi-purple-surface":"#181026","--pi-overlay":"#0008","--pi-shadow-soft":"#0006","--pi-shadow":"#0008","--pi-shadow-strong":"#000b","--pi-bg-overlay-soft":"#070912dd","--pi-bg-overlay":"#070912e6","--pi-success-bg-overlay":"#071e22ee","--pi-terminal-selection":"#3d4a78"},Ug={"--pi-bg":"#f7f1e6","--pi-surface":"#fff9ee","--pi-surface-hover":"#f0e6d6","--pi-terminal-bg":"#15131b","--pi-terminal-text":"#fff9ee","--pi-border":"#c9bca8","--pi-border-muted":"#d8cdbc","--pi-text":"#15131b","--pi-text-secondary":"#15131b","--pi-text-bright":"#15131b","--pi-muted":"#5f586a","--pi-dim":"#766f7e","--pi-accent":"#6430d8","--pi-accent-border":"#6430d8","--pi-selection-bg":"#eadff8","--pi-success":"#008c82","--pi-success-border":"#008c82","--pi-success-bg":"#e1f4ef","--pi-success-surface":"#d7f0ec","--pi-success-ring":"#008c8255","--pi-warning":"#b05f00","--pi-warning-border":"#b05f00","--pi-warning-surface":"#fff2d2","--pi-danger":"#b51d49","--pi-purple":"#6430d8","--pi-purple-border":"#6430d8","--pi-purple-surface":"#eadff8","--pi-overlay":"#15131b66","--pi-shadow-soft":"#15131b22","--pi-shadow":"#15131b33","--pi-shadow-strong":"#15131b44","--pi-bg-overlay-soft":"#f7f1e6dd","--pi-bg-overlay":"#f7f1e6e6","--pi-success-bg-overlay":"#e1f4efee","--pi-terminal-selection":"#8d7b64"},zg={apiVersion:1,name:"PI WEB 主题",activate:()=>({contributions:{themes:[{id:"pi-web-dark",name:"PI WEB 深色",description:"PI WEB 深色配色。",order:10,colorScheme:"dark",tokens:Fg},{id:"pi-web-light",name:"PI WEB 浅色",description:"PI WEB 浅色配色。",order:20,colorScheme:"light",tokens:Ug},{id:"classic",name:"PI WEB 经典",description:"原始 PI WEB 深色配色。",order:30,colorScheme:"dark",tokens:jg}],themePairs:[{id:"pi-web",name:"PI WEB",description:"跟随系统浅色/深色偏好使用 PI WEB 主题。",order:10,light:"pi-web-light",dark:"pi-web-dark"}]}})},Bg=/^[a-z][a-z0-9.-]*$/u;function Ng(e){return Bg.test(e)}const Hg="machine.";function qg(e,t){if(e==="")throw new Error("Machine id is required");if(!Ng(t))throw new Error(`Invalid PI WEB plugin id: ${t}`);return`${Hg}${Kg(e)}.${t}`}function Kg(e){return[...new TextEncoder().encode(e)].map(t=>t.toString(16).padStart(2,"0")).join("")}async function vn(e="/pi-web-plugins/manifest.json",t={}){const i=await Vg(e);if(i===void 0)return[];const s=[];for(const r of i.plugins)if(t.shouldLoadPlugin?.(r)!==!1)try{const o=new URL(r.module,new URL(e,window.location.href)).toString(),n=await import(o),a=Qg(n,o);s.push({id:t.machineId===void 0?r.id:qg(t.machineId,r.id),plugin:a,machineSpecific:r.machineSpecific,...t.machineId===void 0?{}:{machineId:t.machineId,sourcePluginId:r.id}})}catch(o){console.warn(`Failed to load PI WEB plugin ${r.module}`,o)}return s}async function Vg(e){const t=await fetch(e,{cache:"no-store"});if(t.status!==404){if(!t.ok)throw new Error(`Failed to load plugin manifest: ${t.statusText}`);return Gg(await t.json())}}function Gg(e){if(!Li(e)||!Array.isArray(e.plugins))throw new Error("Invalid plugin manifest");return{plugins:e.plugins.map(t=>{if(!Li(t)||typeof t.id!="string"||t.id===""||typeof t.module!="string"||t.module==="")throw new Error("Invalid plugin manifest entry");return{id:t.id,module:t.module,machineSpecific:Jg(t.machineSpecific)}})}}function Jg(e){if(e===void 0)return!1;if(typeof e!="boolean")throw new Error("Invalid plugin manifest entry");return e}function Qg(e,t){if(!Li(e))throw new Error(`Plugin module ${t} did not export an object`);const i=e.default;if(!Zg(i))throw new Error(`Plugin module ${t} default export is not a PiWebPlugin`);return i}function Zg(e){return Li(e)&&e.apiVersion===1&&typeof e.name=="string"&&typeof e.activate=="function"}function Li(e){return typeof e=="object"&&e!==null}const Xg=/^[a-z][a-z0-9.-]*$/u,Yg=/^[a-z][a-z0-9.-]*$/u,dl=new WeakMap,pl=new WeakMap;class em{constructor(){this.actions=[],this.workspacePanels=[],this.workspaceLabels=[],this.themes=[],this.themePairs=[],this.pluginIds=new Set,this.gatewayPluginIds=new Set,this.gatewayMachineSpecificPluginIds=new Set,this.remoteMachineSpecificPluginIds=new Map,this.contributionIds=new Set}register(t){const{id:i,plugin:s}=t;this.validatePluginId(i);const r=this.parseMachineSpecific(i,t.machineSpecific);if(this.pluginIds.has(i))throw new Error(`Duplicate plugin id: ${i}`);if(this.isRemoteDuplicateHiddenByGateway(t.sourcePluginId,t.machineId,r))return;this.pluginIds.add(i);const o=s.apiVersion;if(o!==1)throw new Error(`Unsupported plugin API version for ${i}: ${String(o)}`);const a=s.activate({apiVersion:1,pluginId:i,html:l,svg:be}).contributions;for(const c of a.actions??[])this.actions.push(this.qualifyAction(i,c,t.machineId,t.sourcePluginId));for(const c of a.workspacePanels??[])this.workspacePanels.push(this.qualifyWorkspacePanel(i,c,t.machineId,t.sourcePluginId));for(const c of a.workspaceLabels??[])this.workspaceLabels.push(this.qualifyWorkspaceLabelContribution(i,c,t.machineId,t.sourcePluginId));if(t.machineId===void 0){for(const c of a.themes??[])this.themes.push(this.qualifyTheme(i,c));for(const c of a.themePairs??[])this.themePairs.push(this.qualifyThemePair(i,c));this.gatewayPluginIds.add(i),r&&this.gatewayMachineSpecificPluginIds.add(i)}else t.sourcePluginId!==void 0&&r&&rm(this.remoteMachineSpecificPluginIds,t.sourcePluginId,t.machineId)}shouldLoadRemotePlugin(t,i=!1){return!this.gatewayPluginIds.has(t)||this.gatewayMachineSpecificPluginIds.has(t)||i}getActions(t){const i=nm(t);return this.actions.filter(s=>this.isContributionActive(s.pluginId,s.machineId,i,s.sourcePluginId)).map(s=>{const r=tm(t,s.pluginId),o=s.enabled?.(r),n=o===!1?s.disabledReason?.(r):void 0,a={id:s.id,pluginId:s.pluginId,localId:s.localId,...s.machineId===void 0?{}:{machineId:s.machineId},title:s.title,run:()=>s.run(r)};return s.description!==void 0&&(a.description=s.description),s.shortcut!==void 0&&(a.shortcut=s.shortcut),s.group!==void 0&&(a.group=s.group),o!==void 0&&(a.enabled=o),n!==void 0&&n!==""&&(a.disabledReason=n),a})}getWorkspacePanels(){return[...this.workspacePanels].sort((t,i)=>(t.order??1e3)-(i.order??1e3)||t.title.localeCompare(i.title))}getThemes(){return[...this.themes].sort((t,i)=>(t.order??1e3)-(i.order??1e3)||t.name.localeCompare(i.name))}getThemePairs(){return[...this.themePairs].sort((t,i)=>(t.order??1e3)-(i.order??1e3)||t.name.localeCompare(i.name))}getWorkspaceLabelItems(t){return[...this.workspaceLabels].sort((i,s)=>(i.order??1e3)-(s.order??1e3)||i.id.localeCompare(s.id)).flatMap(i=>i.visible?.(t)===!1?[]:i.items(t))}qualifyAction(t,i,s,r){const o=this.qualify(t,i.id);return{...i,id:o,pluginId:t,localId:i.id,...s===void 0?{}:{machineId:s},...r===void 0?{}:{sourcePluginId:r}}}qualifyWorkspacePanel(t,i,s,r){const o=this.qualify(t,i.id),n=i.badge,a=i.visible;return{...i,id:o,pluginId:t,localId:i.id,...s===void 0?{}:{machineId:s},visible:c=>this.isContributionActive(t,s,c.machine.id,r)&&(a?.(Ss(c,t))??!0),...n===void 0?{}:{badge:c=>this.isContributionActive(t,s,c.machine.id,r)?n(Ss(c,t)):void 0},render:c=>i.render(Ss(c,t))}}qualifyWorkspaceLabelContribution(t,i,s,r){const o=this.qualify(t,i.id),n=i.visible,a=i.items;return{...i,id:o,pluginId:t,localId:i.id,...s===void 0?{}:{machineId:s},visible:c=>this.isContributionActive(t,s,c.machine.id,r)&&(n?.(c)??!0),items:c=>this.isContributionActive(t,s,c.machine.id,r)?a(c):[]}}qualifyTheme(t,i){const s=this.qualify(t,i.id);return{...i,id:s,pluginId:t,localId:i.id}}qualifyThemePair(t,i){const s=this.qualify(t,i.id);return{...i,id:s,pluginId:t,localId:i.id,light:this.qualifyReference(t,i.light),dark:this.qualifyReference(t,i.dark)}}qualify(t,i){this.validateLocalId(i);const s=`${t}:${i}`;if(this.contributionIds.has(s))throw new Error(`Duplicate contribution id: ${s}`);return this.contributionIds.add(s),s}qualifyReference(t,i){return this.validateLocalId(i),`${t}:${i}`}isContributionActive(t,i,s,r){return i===void 0?!this.isGatewayPluginHiddenForMachine(t,s):i===s&&!this.isRemotePluginHiddenByGateway(r,i)}isRemoteDuplicateHiddenByGateway(t,i,s){return t!==void 0&&i!==void 0&&this.gatewayPluginIds.has(t)&&!this.gatewayMachineSpecificPluginIds.has(t)&&!s}isRemotePluginHiddenByGateway(t,i){return t===void 0||this.gatewayMachineSpecificPluginIds.has(t)||this.remoteMachineSpecificPluginIds.get(t)?.has(i)===!0?!1:this.gatewayPluginIds.has(t)}isGatewayPluginHiddenForMachine(t,i){return i!=="local"&&(this.gatewayMachineSpecificPluginIds.has(t)||this.remoteMachineSpecificPluginIds.get(t)?.has(i)===!0)}validatePluginId(t){if(!Xg.test(t))throw new Error(`Invalid plugin id: ${t}`)}validateLocalId(t){if(!Yg.test(t))throw new Error(`Invalid contribution id: ${t}`)}parseMachineSpecific(t,i){if(i===void 0)return!1;if(typeof i!="boolean")throw new Error(`Invalid plugin machineSpecific value for ${t}: ${om(i)}`);return i}}function tm(e,t){return dl.get(e)?.(t)??e}function Ss(e,t){return pl.get(e)?.(t)??e}function im(e,t){return dl.set(e,t),e}function sm(e,t){return pl.set(e,t),e}function rm(e,t,i){const s=e.get(t);s===void 0?e.set(t,new Set([i])):s.add(i)}function om(e){if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean"||typeof e=="bigint"||typeof e=="symbol"||typeof e=="function"||e===null||e===void 0)return String(e);try{return JSON.stringify(e)}catch{return Object.prototype.toString.call(e)}}function nm(e){return e.state.selectedMachine?.id??"local"}const am=["(display-mode: standalone)","(display-mode: fullscreen)","(display-mode: minimal-ui)"];function lm(){return typeof window>"u"||!("matchMedia"in window)?[]:am.map(e=>window.matchMedia(e))}function bn(e,t=cm()){return e.some(i=>i.matches)||dm(t)}function cm(){return typeof navigator>"u"?void 0:navigator}function dm(e){return e!==void 0&&"standalone"in e&&e.standalone===!0}const pm=250;class hm{constructor(t=um()){this.scheduler=t}repair(t){if(!t){this.clear();return}this.resetViewportScroll(),this.repairFrame!==void 0&&this.scheduler.cancelAnimationFrame(this.repairFrame),this.repairFrame=this.scheduler.requestAnimationFrame(()=>{this.repairFrame=void 0,this.resetViewportScroll(),this.repairFrame=this.scheduler.requestAnimationFrame(()=>{this.repairFrame=void 0,this.resetViewportScroll()})}),this.repairTimer!==void 0&&this.scheduler.clearTimeout(this.repairTimer),this.repairTimer=this.scheduler.setTimeout(()=>{this.repairTimer=void 0,this.resetViewportScroll()},pm)}clear(){this.repairFrame!==void 0&&(this.scheduler.cancelAnimationFrame(this.repairFrame),this.repairFrame=void 0),this.repairTimer!==void 0&&(this.scheduler.clearTimeout(this.repairTimer),this.repairTimer=void 0)}resetViewportScroll(){this.scheduler.scrollTo(0,0);const t=this.scheduler.documentElement;t!==void 0&&(t.scrollTop=0);const i=this.scheduler.body;i!==void 0&&(i.scrollTop=0)}}function um(){return{requestAnimationFrame(e){return window.requestAnimationFrame(e)},cancelAnimationFrame(e){window.cancelAnimationFrame(e)},setTimeout(e,t){return window.setTimeout(e,t)},clearTimeout(e){window.clearTimeout(e)},scrollTo(e,t){window.scrollTo(e,t)},get documentElement(){return typeof document>"u"?void 0:document.documentElement},get body(){return typeof document>"u"?void 0:document.body}}}const fm="(max-width: 760px)",gm="(max-width: 1180px)";class mm{constructor(t,i={}){this.host=t,this.onMobileNavigationMediaChange=s=>{this.isMobileNavigationLayout!==s.matches&&(this.isMobileNavigationLayout=s.matches,this.host.requestUpdate())},this.onStackedWorkspaceMediaChange=s=>{this.isStackedWorkspaceLayout!==s.matches&&(this.isStackedWorkspaceLayout=s.matches,this.host.requestUpdate())},this.onPwaDisplayModeChange=()=>{const s=bn(this.pwaDisplayModeMedia);this.isPwaDisplayMode!==s&&(this.isPwaDisplayMode=s,this.host.requestUpdate())},t.addController(this),this.mobileNavigationMedia=i.mobileNavigationMedia??vm(),this.stackedWorkspaceMedia=i.stackedWorkspaceMedia??bm(),this.pwaDisplayModeMedia=i.pwaDisplayModeMedia??lm(),this.viewportPositionRepairer=i.viewportPositionRepairer??new hm,this.isMobileNavigationLayout=this.mobileNavigationMedia?.matches??!1,this.isStackedWorkspaceLayout=this.stackedWorkspaceMedia?.matches??!1,this.isPwaDisplayMode=bn(this.pwaDisplayModeMedia)}hostConnected(){this.mobileNavigationMedia?.addEventListener("change",this.onMobileNavigationMediaChange),this.stackedWorkspaceMedia?.addEventListener("change",this.onStackedWorkspaceMediaChange);for(const t of this.pwaDisplayModeMedia)t.addEventListener("change",this.onPwaDisplayModeChange)}hostDisconnected(){this.mobileNavigationMedia?.removeEventListener("change",this.onMobileNavigationMediaChange),this.stackedWorkspaceMedia?.removeEventListener("change",this.onStackedWorkspaceMediaChange);for(const t of this.pwaDisplayModeMedia)t.removeEventListener("change",this.onPwaDisplayModeChange);this.viewportPositionRepairer.clear()}shouldAutoFocusPrompt(){return!this.isMobileNavigationLayout&&!this.isPwaDisplayMode}shouldShowAppRefreshInHeader(){return this.isPwaDisplayMode&&!this.isMobileNavigationLayout}shouldShowAppRefreshInContextBar(){return this.isPwaDisplayMode&&this.isMobileNavigationLayout}defaultRouteView(){return this.normalizedMainView(void 0,!1)}normalizedMainView(t,i){return wm(t,{isMobileNavigationLayout:this.isMobileNavigationLayout,isStackedWorkspaceLayout:this.isStackedWorkspaceLayout,hasSelectedSession:i})}repairViewportPosition(){this.viewportPositionRepairer.repair(this.shouldRepairViewportPosition())}shouldRepairViewportPosition(){return this.isMobileNavigationLayout||this.isPwaDisplayMode}}function vm(){if(!(typeof window>"u"||!("matchMedia"in window)))return window.matchMedia(fm)}function bm(){if(!(typeof window>"u"||!("matchMedia"in window)))return window.matchMedia(gm)}function wm(e,t){const i=e??(t.isMobileNavigationLayout?"navigation":"chat");return t.isMobileNavigationLayout||!t.isStackedWorkspaceLayout||!t.hasSelectedSession||i==="navigation"||i==="chat"?i:"chat"}const ji=["machines","projects","workspaces","sessions"];function ym(e){return e.selectedProject===void 0?"projects":e.selectedWorkspace===void 0?"workspaces":"sessions"}function Wr(e,t){if(e!=="none")return e??ym(t)}function xm(e,t){return t.isMobileLayout?Wr(t.expanded,t.state)!==e:t.collapsedSections?.includes(e)??!1}function Sm(e,t,i){return Wr(e,i.state)===t?"none":t}function km(e,t,i){return i?t:e}function $m(e,t){const i=new Set(e);return i.has(t)?i.delete(t):i.add(t),Im(i)}function Pm(e){return ji[ji.indexOf(e)+1]}class Cm{constructor(t,i,s){this.host=t,this.getState=i,this.isMobileLayout=s,this.collapsedSections=[],t.addController(this)}hostConnected(){}expandedSection(){return Wr(this.expanded,this.getState())}isCollapsed(t){return xm(t,{isMobileLayout:this.isMobileLayout(),expanded:this.expanded,state:this.getState(),collapsedSections:this.collapsedSections})}toggle(t){if(this.isMobileLayout()){this.setExpanded(Sm(this.expanded,t,{state:this.getState()}));return}this.setCollapsedSections($m(this.collapsedSections,t))}expand(t){if(this.isMobileLayout()){this.setExpanded(km(this.expanded,t,!0));return}this.setCollapsedSections(this.collapsedSections.filter(i=>i!==t))}advanceAfterSelection(t){if(!this.isMobileLayout())return;const i=Pm(t);i!==void 0&&this.expand(i)}open(t,i){this.isMobileLayout()&&(this.expand(t),i())}setExpanded(t){this.expanded!==t&&(this.expanded=t,this.host.requestUpdate())}setCollapsedSections(t){Rm(this.collapsedSections,t)||(this.collapsedSections=t,this.host.requestUpdate())}}function Im(e){const t=new Set(e);return ji.filter(i=>t.has(i))}function Rm(e,t){return e.length===t.length&&e.every((i,s)=>i===t[s])}class Am{constructor(t){this.host=t,this.navigationPanelCollapsed=!1,this.workspacePanelCollapsed=!1,t.addController(this)}hostConnected(){}toggleNavigationPanel(){this.navigationPanelCollapsed=!this.navigationPanelCollapsed,this.host.requestUpdate()}toggleWorkspacePanel(){this.workspacePanelCollapsed=!this.workspacePanelCollapsed,this.host.requestUpdate()}expandNavigationPanel(){this.navigationPanelCollapsed&&(this.navigationPanelCollapsed=!1,this.host.requestUpdate())}expandWorkspacePanel(){this.workspacePanelCollapsed&&(this.workspacePanelCollapsed=!1,this.host.requestUpdate())}shellClass(t){return["shell",hl(t),...this.navigationPanelCollapsed?["navigation-panel-collapsed"]:[],...this.workspacePanelCollapsed?["workspace-panel-collapsed"]:[]].join(" ")}}function hl(e){return e==="navigation"?"navigation-view":e==="chat"?"chat-view":"workspace-view"}const Ys="pi-web:panel-sizes:v1",Tm={navigation:{minWidth:180,maxWidth:4096,defaultWidth:340,keyboardStep:24,largeKeyboardStep:72},workspace:{minWidth:240,maxWidth:4096,defaultWidth:480,keyboardStep:24,largeKeyboardStep:72}};class Mm{constructor(t,i={}){this.host=t,t.addController(this),this.storage=i.storage??Or(),this.panelSizes=Om(this.storage)}hostConnected(){}constraints(t){return Yt(t)}panelWidth(t,i){return we(t,i??this.storedPanelWidth(t)??this.constraints(t).defaultWidth)}resizePanel(t,i,s={}){const r=we(t,i);this.storedPanelWidth(t)!==r&&(this.panelSizes=jm(this.panelSizes,t,r),s.persist!==!1&&this.persistPanelSizes(),this.host.requestUpdate())}resetPanel(t,i={}){this.storedPanelWidth(t)!==void 0&&(this.panelSizes=Fm(this.panelSizes,t),i.persist!==!1&&this.persistPanelSizes(),this.host.requestUpdate())}resetPanels(t={}){this.panelSizes.navigationPanelWidth===void 0&&this.panelSizes.workspacePanelWidth===void 0||(this.panelSizes={},t.persist!==!1&&this.persistPanelSizes(),this.host.requestUpdate())}persistPanelSizes(){_m(this.panelSizes,this.storage)}shellStyle(t={}){const i=[];return this.panelSizes.navigationPanelWidth!==void 0&&i.push(`--navigation-panel-size: ${yn(we("navigation",this.panelSizes.navigationPanelWidth,t.navigation))};`),this.panelSizes.workspacePanelWidth!==void 0&&i.push(`--workspace-panel-size: ${yn(we("workspace",this.panelSizes.workspacePanelWidth,t.workspace))};`),i.join(" ")}storedPanelWidth(t){return t==="navigation"?this.panelSizes.navigationPanelWidth:this.panelSizes.workspacePanelWidth}}function Yt(e){return Tm[e]}function Em(e,t,i){return e==="navigation"?i-t:t-i}function Dm(e,t,i,s,r=Yt(e)){return we(e,t+Em(e,i,s),r)}function Wm(e,t,i,s={}){const r=s.constraints??Yt(e);if(i==="Home")return r.minWidth;if(i==="End")return r.maxWidth;const o=s.largeStep===!0?r.largeKeyboardStep:r.keyboardStep,n=Um(e,i,o);if(n!==void 0)return we(e,t+n,r)}function we(e,t,i=Yt(e)){return Number.isFinite(t)?Math.round(Math.min(Math.max(t,i.minWidth),i.maxWidth)):i.defaultWidth}function Om(e=Or()){try{const t=e?.getItem(Ys);if(t==null||t==="")return{};const i=JSON.parse(t);return Lm(i)}catch{return{}}}function _m(e,t=Or()){if(t!==void 0)try{if(e.navigationPanelWidth===void 0&&e.workspacePanelWidth===void 0){t.removeItem(Ys);return}const i={version:1};e.navigationPanelWidth!==void 0&&(i.navigationPanelWidth=we("navigation",e.navigationPanelWidth)),e.workspacePanelWidth!==void 0&&(i.workspacePanelWidth=we("workspace",e.workspacePanelWidth)),t.setItem(Ys,JSON.stringify(i))}catch{}}function Lm(e){if(!zm(e)||e.version!==1)return{};const t={},i=wn(e.navigationPanelWidth),s=wn(e.workspacePanelWidth);return i!==void 0&&(t.navigationPanelWidth=we("navigation",i)),s!==void 0&&(t.workspacePanelWidth=we("workspace",s)),t}function wn(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function jm(e,t,i){return t==="navigation"?{...e,navigationPanelWidth:i}:{...e,workspacePanelWidth:i}}function Fm(e,t){return t==="navigation"?e.workspacePanelWidth===void 0?{}:{workspacePanelWidth:e.workspacePanelWidth}:e.navigationPanelWidth===void 0?{}:{navigationPanelWidth:e.navigationPanelWidth}}function Um(e,t,i){if(e==="navigation")return t==="ArrowRight"?i:t==="ArrowLeft"?-i:void 0;if(t==="ArrowLeft")return i;if(t==="ArrowRight")return-i}function yn(e){return`${String(Math.round(e))}px`}function Or(){try{return typeof window>"u"?void 0:window.localStorage}catch{return}}function zm(e){return typeof e=="object"&&e!==null}function xn(){const e=new URLSearchParams(window.location.search);return{machineId:e.get("machine")??void 0,projectId:e.get("project")??void 0,workspaceId:e.get("workspace")??void 0,sessionId:e.get("session")??void 0,tool:Bm(e.get("tool")),view:Nm(e.get("view"))}}function ks(e,t){const i=new URL(window.location.href);i.searchParams.delete("machine"),i.searchParams.delete("project"),i.searchParams.delete("workspace"),i.searchParams.delete("session"),i.searchParams.delete("tool"),i.searchParams.delete("view"),e.machineId!==void 0&&e.machineId!==""&&e.machineId!=="local"&&i.searchParams.set("machine",e.machineId),e.projectId!==void 0&&e.projectId!==""&&i.searchParams.set("project",e.projectId),e.workspaceId!==void 0&&e.workspaceId!==""&&i.searchParams.set("workspace",e.workspaceId),e.sessionId!==void 0&&e.sessionId!==""&&i.searchParams.set("session",e.sessionId),e.tool!==void 0&&i.searchParams.set("tool",e.tool),e.view!==void 0&&i.searchParams.set("view",e.view);const s=`${i.pathname}${i.search}${i.hash}`,r=`${window.location.pathname}${window.location.search}${window.location.hash}`;s!==r&&(t?.replace===!0?window.history.replaceState({},"",i):window.history.pushState({},"",i))}function Bm(e){return e==="files"?"core:workspace.files":e==="git"?"core:workspace.git":ul(e)?e:void 0}function Nm(e){return e==="chat"?"chat":e==="files"?"core:workspace.files":e==="git"?"core:workspace.git":ul(e)?e:void 0}function ul(e){return e!==null&&/^[a-z][a-z0-9.-]*:[a-z][a-z0-9.-]*$/u.test(e)}function Sn(){return Hm(new URLSearchParams(window.location.search).get("settings"))}function $s(e,t){const i=new URL(window.location.href);e===void 0?i.searchParams.delete("settings"):i.searchParams.set("settings",e);const s=`${i.pathname}${i.search}${i.hash}`,r=`${window.location.pathname}${window.location.search}${window.location.hash}`;s!==r&&window.history.pushState({},"",i)}function Hm(e){if(e==="general")return"general";if(e==="sessiond"||e==="sessions")return"sessiond";if(e==="plugins")return"plugins";if(e==="shortcuts"||e==="keyboard"||e==="keyboard-shortcuts")return"shortcuts"}function qm(e,t){return t===void 0?e:e.map(i=>Vm(i,t))}function Km(e,t){const i=new Set(Tr(e,t,{enabledOnly:!0}).filter(s=>s.active).map(s=>s.action.id));return qm(e,t).map(s=>s.shortcut!==void 0&&!i.has(s.id)?fl(s):s)}function Vm(e,t){if(!Object.hasOwn(t,e.id))return e;const i=t[e.id];return i===void 0?e:i===null?fl(e):{...e,shortcut:i}}function fl(e){const t={...e};return delete t.shortcut,t}function Gm(e,t){const i=t.api??yt,s=t.pollIntervalMs??1e3,r=t.setTimeout??Qm(),o=t.clearTimeout??Zm();return{async runCommand(n){const a=await i.runTerminalCommand(e,n);return n.open===!0&&t.openTerminal(n.workspace,{terminalId:a.terminalId}),{run:a,completed:Jm(a,i,s,r,o)}},listCommandRuns:n=>i.listCommandRuns(n),getCommandRun:n=>i.getCommandRun(n),open:n=>{t.openTerminal(void 0,n)}}}function Jm(e,t,i,s,r){return kn(e)?Promise.resolve(e):new Promise((o,n)=>{let a,c=!1;const p=g=>{c||(c=!0,a!==void 0&&r(a),o(g))},u=g=>{c||(c=!0,a!==void 0&&r(a),n(g instanceof Error?g:new Error(String(g))))},h=()=>{t.getCommandRun(e.id).then(g=>{if(g!==void 0&&kn(g)){p(g);return}a=s(h,i)}).catch(u)};a=s(h,i)})}function kn(e){return e.status==="succeeded"||e.status==="failed"}function Qm(){return(e,t)=>globalThis.setTimeout(e,t)}function Zm(){return e=>{globalThis.clearTimeout(e)}}function Xm(e,t){return t[e.path]}function Ym(e){if(e?.hasSessionActivity===!0)return"session";if(e?.hasTerminalActivity===!0)return"terminal"}function ev(e,t,i){return ml(tv(e,t,i))}function gl(e){return ml(Object.values(e??{}))}function ml(e){if(e.some(t=>t.hasSessionActivity))return"session";if(e.some(t=>t.hasTerminalActivity))return"terminal"}function tv(e,t,i){const s=new Set(t.filter(o=>o.projectId===e.id).map(o=>o.path)),r=new Map;for(const o of s){const n=i[o];n!==void 0&&r.set(n.cwd,n)}for(const o of Object.values(i))(o.cwd===e.path||o.cwd.startsWith(`${e.path}/`))&&r.set(o.cwd,o);return[...r.values()]}function vl(e,t="活跃"){if(e!==void 0)return l`<span class=${`activity-indicator ${e}`} role="img" aria-label=${t} title=${t}></span>`}function Xi(e,t="活跃"){const i=vl(e,t);if(i!==void 0)return l`<span class="action-activity">${i}</span>`}const ai=0,iv=120;function bl(e,t={}){if(typeof HTMLElement>"u"||typeof window>"u"||!(e instanceof HTMLElement))return"";const i=e.getBoundingClientRect(),s=t.constrainTo==="viewport"?wl():sv(e),r=window.innerWidth,o=window.innerHeight,n=Math.max(0,s.left),a=Math.min(r,s.right),c=Math.max(0,s.top),p=Math.min(o,s.bottom),u=Math.min(i.right,a),h=p-i.bottom-ai,g=i.top-c-ai;return[...h<iv&&g>h?[`bottom: ${mt(o-i.top+ai)};`,`max-height: ${mt(Math.max(0,g))};`]:[`top: ${mt(i.bottom+ai)};`,`max-height: ${mt(Math.max(0,h))};`],`right: ${mt(Math.max(0,r-u))};`,`max-width: ${mt(Math.max(0,u-n))};`].join(" ")}function sv(e){const t=e.getRootNode();return typeof ShadowRoot<"u"&&t instanceof ShadowRoot&&t.host instanceof HTMLElement?t.host.getBoundingClientRect():wl()}function wl(){return{top:0,right:window.innerWidth,bottom:window.innerHeight,left:0}}function mt(e){return`${String(Math.round(e))}px`}class Yi{constructor(t){this.host=t,this.menuStyle="",this.onDocumentClick=i=>{i.composedPath().includes(this.host)||this.close()},t.addController(this)}hostConnected(){document.addEventListener("click",this.onDocumentClick)}hostDisconnected(){document.removeEventListener("click",this.onDocumentClick)}isOpen(t){return this.openId===t}toggle(t,i){if(this.openId===t){this.close();return}this.menuStyle=bl(i,{constrainTo:"viewport"}),this.openId=t,this.host.requestUpdate()}close(){this.openId===void 0&&this.menuStyle===""||(this.openId=void 0,this.menuStyle="",this.host.requestUpdate())}closeIfOpenIdMissing(t){this.openId!==void 0&&!t(this.openId)&&this.close()}closeIf(t){t&&this.close()}closeForEscape(t,i){return t.key!=="Escape"||this.openId!==i?!1:(t.preventDefault(),t.stopPropagation(),this.close(),!0)}}const rv=["a[href]","button","input","select","textarea","summary","[role='button']","[role='link']","[contenteditable='true']"].join(",");function yl(e){return e.composedPath().some(t=>ov(t,rv))}function ov(e,t){if(typeof Element<"u"&&e instanceof Element)return e.matches(t);if(!("matches"in e))return!1;const{matches:i}=e;return typeof i=="function"&&i.call(e,t)===!0}function es(e,t){yl(e)||t()}function ts(e,t){return yl(e)?!1:e.key==="Enter"||e.key===" "?(e.preventDefault(),t.activate(),!0):e.key==="ArrowUp"?rt(e,()=>{$n(e.currentTarget,-1)}):e.key==="ArrowDown"?rt(e,()=>{$n(e.currentTarget,1)}):e.key==="Home"?rt(e,()=>{Pn(e.currentTarget,0)}):e.key==="End"?rt(e,()=>{Pn(e.currentTarget,-1)}):e.key==="ArrowLeft"&&t.previousSection!==void 0?rt(e,t.previousSection):e.key==="ArrowRight"&&t.nextSection!==void 0?rt(e,t.nextSection):e.key==="Escape"&&t.cancel!==void 0?rt(e,t.cancel):!1}function is(e,t={}){const i=e.querySelector(".action-row.selected")??e.querySelector(".action-row")??(t.fallbackSelector===void 0?void 0:e.querySelector(t.fallbackSelector));return i==null?!1:(i.focus(),i.scrollIntoView({block:"nearest"}),!0)}function rt(e,t){return e.preventDefault(),e.stopPropagation?.(),t(),!0}function $n(e,t){const i=Sl(e),s=kl(e);if(s===void 0||i.length===0)return;const r=i.indexOf(s);r<0||xl(i,r+t)}function Pn(e,t){const i=Sl(e);i.length!==0&&xl(i,t<0?i.length-1:t)}function xl(e,t){const i=e[Math.min(Math.max(t,0),e.length-1)];i?.focus(),i?.scrollIntoView({block:"nearest"})}function Sl(e){const t=kl(e)?.getRootNode();return t===void 0||!nv(t)?[]:Array.from(t.querySelectorAll(".action-row"))}function nv(e){return typeof Document<"u"&&e instanceof Document||typeof DocumentFragment<"u"&&e instanceof DocumentFragment}function kl(e){if(!(typeof HTMLElement>"u"||!(e instanceof HTMLElement)))return e.closest(".action-row")??void 0}const ss=E`
376
+ `}function Wg(){Dr(()=>import("./UnifiedDiffViewer-BprnYHmM.js"),__vite__mapDeps([4,1,2]))}function Og(){Dr(()=>import("./TerminalPanel-CNsIQZbo.js"),__vite__mapDeps([5,6,7,1,2]))}function _g(e){const t=e.branch??"分离 HEAD",i=e.ahead??0,s=e.behind??0;return i===0&&s===0?t:`${t} · ↑${String(i)} ↓${String(s)}`}function Lg(e,t){return(t!=="unmodified"?t:e).slice(0,1).toUpperCase()}const jg={apiVersion:1,name:"PI WEB 核心",activate:()=>{const e=!Kf();return{contributions:{actions:e?an():an().filter(t=>t.id!=="view.terminal"),workspacePanels:e?mn():mn().filter(t=>t.id!=="workspace.terminal")}}}},Fg={"--pi-bg":"#0d1117","--pi-surface":"#161b22","--pi-surface-hover":"#21262d","--pi-terminal-bg":"#05070a","--pi-terminal-text":"#e6edf3","--pi-border":"#30363d","--pi-border-muted":"#21262d","--pi-text":"#e6edf3","--pi-text-secondary":"#c9d1d9","--pi-text-bright":"#f0f6fc","--pi-muted":"#8b949e","--pi-dim":"#6e7681","--pi-accent":"#58a6ff","--pi-accent-border":"#2f81f7","--pi-selection-bg":"#0d2847","--pi-success":"#3fb950","--pi-success-border":"#238636","--pi-success-bg":"#0f1b12","--pi-success-surface":"#0f2a16","--pi-success-ring":"#3fb95055","--pi-warning":"#d29922","--pi-warning-border":"#6e5200","--pi-warning-surface":"#1f1a10","--pi-danger":"#ff7b72","--pi-purple":"#d2a8ff","--pi-purple-border":"#a371f7","--pi-purple-surface":"#21132f","--pi-overlay":"#0008","--pi-shadow-soft":"#0006","--pi-shadow":"#0008","--pi-shadow-strong":"#000b","--pi-bg-overlay-soft":"#0d1117dd","--pi-bg-overlay":"#0d1117e6","--pi-success-bg-overlay":"#0f1b12ee","--pi-terminal-selection":"#264f78"},Ug={"--pi-bg":"#070912","--pi-surface":"#101527","--pi-surface-hover":"#151b31","--pi-terminal-bg":"#050710","--pi-terminal-text":"#f7f4ff","--pi-border":"#26304f","--pi-border-muted":"#26304f","--pi-text":"#f7f4ff","--pi-text-secondary":"#aaa4bd","--pi-text-bright":"#ffffff","--pi-muted":"#aaa4bd","--pi-dim":"#817a99","--pi-accent":"#7c3cff","--pi-accent-border":"#5a47b0","--pi-selection-bg":"#1d2547","--pi-success":"#00f0d8","--pi-success-border":"#00f0d8","--pi-success-bg":"#071e22","--pi-success-surface":"#092d31","--pi-success-ring":"#00f0d855","--pi-warning":"#ffb000","--pi-warning-border":"#ffb000","--pi-warning-surface":"#16140d","--pi-danger":"#ff4f7b","--pi-purple":"#b7a2ff","--pi-purple-border":"#7c3cff","--pi-purple-surface":"#181026","--pi-overlay":"#0008","--pi-shadow-soft":"#0006","--pi-shadow":"#0008","--pi-shadow-strong":"#000b","--pi-bg-overlay-soft":"#070912dd","--pi-bg-overlay":"#070912e6","--pi-success-bg-overlay":"#071e22ee","--pi-terminal-selection":"#3d4a78"},zg={"--pi-bg":"#f7f1e6","--pi-surface":"#fff9ee","--pi-surface-hover":"#f0e6d6","--pi-terminal-bg":"#15131b","--pi-terminal-text":"#fff9ee","--pi-border":"#c9bca8","--pi-border-muted":"#d8cdbc","--pi-text":"#15131b","--pi-text-secondary":"#15131b","--pi-text-bright":"#15131b","--pi-muted":"#5f586a","--pi-dim":"#766f7e","--pi-accent":"#6430d8","--pi-accent-border":"#6430d8","--pi-selection-bg":"#eadff8","--pi-success":"#008c82","--pi-success-border":"#008c82","--pi-success-bg":"#e1f4ef","--pi-success-surface":"#d7f0ec","--pi-success-ring":"#008c8255","--pi-warning":"#b05f00","--pi-warning-border":"#b05f00","--pi-warning-surface":"#fff2d2","--pi-danger":"#b51d49","--pi-purple":"#6430d8","--pi-purple-border":"#6430d8","--pi-purple-surface":"#eadff8","--pi-overlay":"#15131b66","--pi-shadow-soft":"#15131b22","--pi-shadow":"#15131b33","--pi-shadow-strong":"#15131b44","--pi-bg-overlay-soft":"#f7f1e6dd","--pi-bg-overlay":"#f7f1e6e6","--pi-success-bg-overlay":"#e1f4efee","--pi-terminal-selection":"#8d7b64"},Bg={apiVersion:1,name:"PI WEB 主题",activate:()=>({contributions:{themes:[{id:"pi-web-dark",name:"PI WEB 深色",description:"PI WEB 深色配色。",order:10,colorScheme:"dark",tokens:Ug},{id:"pi-web-light",name:"PI WEB 浅色",description:"PI WEB 浅色配色。",order:20,colorScheme:"light",tokens:zg},{id:"classic",name:"PI WEB 经典",description:"原始 PI WEB 深色配色。",order:30,colorScheme:"dark",tokens:Fg}],themePairs:[{id:"pi-web",name:"PI WEB",description:"跟随系统浅色/深色偏好使用 PI WEB 主题。",order:10,light:"pi-web-light",dark:"pi-web-dark"}]}})},Ng=/^[a-z][a-z0-9.-]*$/u;function Hg(e){return Ng.test(e)}const qg="machine.";function Kg(e,t){if(e==="")throw new Error("Machine id is required");if(!Hg(t))throw new Error(`Invalid PI WEB plugin id: ${t}`);return`${qg}${Vg(e)}.${t}`}function Vg(e){return[...new TextEncoder().encode(e)].map(t=>t.toString(16).padStart(2,"0")).join("")}async function vn(e="/pi-web-plugins/manifest.json",t={}){const i=await Gg(e);if(i===void 0)return[];const s=[];for(const r of i.plugins)if(t.shouldLoadPlugin?.(r)!==!1)try{const o=new URL(r.module,new URL(e,window.location.href)).toString(),n=await import(o),a=Zg(n,o);s.push({id:t.machineId===void 0?r.id:Kg(t.machineId,r.id),plugin:a,machineSpecific:r.machineSpecific,...t.machineId===void 0?{}:{machineId:t.machineId,sourcePluginId:r.id}})}catch(o){console.warn(`Failed to load PI WEB plugin ${r.module}`,o)}return s}async function Gg(e){const t=await fetch(e,{cache:"no-store"});if(t.status!==404){if(!t.ok)throw new Error(`Failed to load plugin manifest: ${t.statusText}`);return Jg(await t.json())}}function Jg(e){if(!Li(e)||!Array.isArray(e.plugins))throw new Error("Invalid plugin manifest");return{plugins:e.plugins.map(t=>{if(!Li(t)||typeof t.id!="string"||t.id===""||typeof t.module!="string"||t.module==="")throw new Error("Invalid plugin manifest entry");return{id:t.id,module:t.module,machineSpecific:Qg(t.machineSpecific)}})}}function Qg(e){if(e===void 0)return!1;if(typeof e!="boolean")throw new Error("Invalid plugin manifest entry");return e}function Zg(e,t){if(!Li(e))throw new Error(`Plugin module ${t} did not export an object`);const i=e.default;if(!Xg(i))throw new Error(`Plugin module ${t} default export is not a PiWebPlugin`);return i}function Xg(e){return Li(e)&&e.apiVersion===1&&typeof e.name=="string"&&typeof e.activate=="function"}function Li(e){return typeof e=="object"&&e!==null}const Yg=/^[a-z][a-z0-9.-]*$/u,em=/^[a-z][a-z0-9.-]*$/u,dl=new WeakMap,pl=new WeakMap;class tm{constructor(){this.actions=[],this.workspacePanels=[],this.workspaceLabels=[],this.themes=[],this.themePairs=[],this.pluginIds=new Set,this.gatewayPluginIds=new Set,this.gatewayMachineSpecificPluginIds=new Set,this.remoteMachineSpecificPluginIds=new Map,this.contributionIds=new Set}register(t){const{id:i,plugin:s}=t;this.validatePluginId(i);const r=this.parseMachineSpecific(i,t.machineSpecific);if(this.pluginIds.has(i))throw new Error(`Duplicate plugin id: ${i}`);if(this.isRemoteDuplicateHiddenByGateway(t.sourcePluginId,t.machineId,r))return;this.pluginIds.add(i);const o=s.apiVersion;if(o!==1)throw new Error(`Unsupported plugin API version for ${i}: ${String(o)}`);const a=s.activate({apiVersion:1,pluginId:i,html:l,svg:be}).contributions;for(const c of a.actions??[])this.actions.push(this.qualifyAction(i,c,t.machineId,t.sourcePluginId));for(const c of a.workspacePanels??[])this.workspacePanels.push(this.qualifyWorkspacePanel(i,c,t.machineId,t.sourcePluginId));for(const c of a.workspaceLabels??[])this.workspaceLabels.push(this.qualifyWorkspaceLabelContribution(i,c,t.machineId,t.sourcePluginId));if(t.machineId===void 0){for(const c of a.themes??[])this.themes.push(this.qualifyTheme(i,c));for(const c of a.themePairs??[])this.themePairs.push(this.qualifyThemePair(i,c));this.gatewayPluginIds.add(i),r&&this.gatewayMachineSpecificPluginIds.add(i)}else t.sourcePluginId!==void 0&&r&&om(this.remoteMachineSpecificPluginIds,t.sourcePluginId,t.machineId)}shouldLoadRemotePlugin(t,i=!1){return!this.gatewayPluginIds.has(t)||this.gatewayMachineSpecificPluginIds.has(t)||i}getActions(t){const i=am(t);return this.actions.filter(s=>this.isContributionActive(s.pluginId,s.machineId,i,s.sourcePluginId)).map(s=>{const r=im(t,s.pluginId),o=s.enabled?.(r),n=o===!1?s.disabledReason?.(r):void 0,a={id:s.id,pluginId:s.pluginId,localId:s.localId,...s.machineId===void 0?{}:{machineId:s.machineId},title:s.title,run:()=>s.run(r)};return s.description!==void 0&&(a.description=s.description),s.shortcut!==void 0&&(a.shortcut=s.shortcut),s.group!==void 0&&(a.group=s.group),o!==void 0&&(a.enabled=o),n!==void 0&&n!==""&&(a.disabledReason=n),a})}getWorkspacePanels(){return[...this.workspacePanels].sort((t,i)=>(t.order??1e3)-(i.order??1e3)||t.title.localeCompare(i.title))}getThemes(){return[...this.themes].sort((t,i)=>(t.order??1e3)-(i.order??1e3)||t.name.localeCompare(i.name))}getThemePairs(){return[...this.themePairs].sort((t,i)=>(t.order??1e3)-(i.order??1e3)||t.name.localeCompare(i.name))}getWorkspaceLabelItems(t){return[...this.workspaceLabels].sort((i,s)=>(i.order??1e3)-(s.order??1e3)||i.id.localeCompare(s.id)).flatMap(i=>i.visible?.(t)===!1?[]:i.items(t))}qualifyAction(t,i,s,r){const o=this.qualify(t,i.id);return{...i,id:o,pluginId:t,localId:i.id,...s===void 0?{}:{machineId:s},...r===void 0?{}:{sourcePluginId:r}}}qualifyWorkspacePanel(t,i,s,r){const o=this.qualify(t,i.id),n=i.badge,a=i.visible;return{...i,id:o,pluginId:t,localId:i.id,...s===void 0?{}:{machineId:s},visible:c=>this.isContributionActive(t,s,c.machine.id,r)&&(a?.(Ss(c,t))??!0),...n===void 0?{}:{badge:c=>this.isContributionActive(t,s,c.machine.id,r)?n(Ss(c,t)):void 0},render:c=>i.render(Ss(c,t))}}qualifyWorkspaceLabelContribution(t,i,s,r){const o=this.qualify(t,i.id),n=i.visible,a=i.items;return{...i,id:o,pluginId:t,localId:i.id,...s===void 0?{}:{machineId:s},visible:c=>this.isContributionActive(t,s,c.machine.id,r)&&(n?.(c)??!0),items:c=>this.isContributionActive(t,s,c.machine.id,r)?a(c):[]}}qualifyTheme(t,i){const s=this.qualify(t,i.id);return{...i,id:s,pluginId:t,localId:i.id}}qualifyThemePair(t,i){const s=this.qualify(t,i.id);return{...i,id:s,pluginId:t,localId:i.id,light:this.qualifyReference(t,i.light),dark:this.qualifyReference(t,i.dark)}}qualify(t,i){this.validateLocalId(i);const s=`${t}:${i}`;if(this.contributionIds.has(s))throw new Error(`Duplicate contribution id: ${s}`);return this.contributionIds.add(s),s}qualifyReference(t,i){return this.validateLocalId(i),`${t}:${i}`}isContributionActive(t,i,s,r){return i===void 0?!this.isGatewayPluginHiddenForMachine(t,s):i===s&&!this.isRemotePluginHiddenByGateway(r,i)}isRemoteDuplicateHiddenByGateway(t,i,s){return t!==void 0&&i!==void 0&&this.gatewayPluginIds.has(t)&&!this.gatewayMachineSpecificPluginIds.has(t)&&!s}isRemotePluginHiddenByGateway(t,i){return t===void 0||this.gatewayMachineSpecificPluginIds.has(t)||this.remoteMachineSpecificPluginIds.get(t)?.has(i)===!0?!1:this.gatewayPluginIds.has(t)}isGatewayPluginHiddenForMachine(t,i){return i!=="local"&&(this.gatewayMachineSpecificPluginIds.has(t)||this.remoteMachineSpecificPluginIds.get(t)?.has(i)===!0)}validatePluginId(t){if(!Yg.test(t))throw new Error(`Invalid plugin id: ${t}`)}validateLocalId(t){if(!em.test(t))throw new Error(`Invalid contribution id: ${t}`)}parseMachineSpecific(t,i){if(i===void 0)return!1;if(typeof i!="boolean")throw new Error(`Invalid plugin machineSpecific value for ${t}: ${nm(i)}`);return i}}function im(e,t){return dl.get(e)?.(t)??e}function Ss(e,t){return pl.get(e)?.(t)??e}function sm(e,t){return dl.set(e,t),e}function rm(e,t){return pl.set(e,t),e}function om(e,t,i){const s=e.get(t);s===void 0?e.set(t,new Set([i])):s.add(i)}function nm(e){if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean"||typeof e=="bigint"||typeof e=="symbol"||typeof e=="function"||e===null||e===void 0)return String(e);try{return JSON.stringify(e)}catch{return Object.prototype.toString.call(e)}}function am(e){return e.state.selectedMachine?.id??"local"}const lm=["(display-mode: standalone)","(display-mode: fullscreen)","(display-mode: minimal-ui)"];function cm(){return typeof window>"u"||!("matchMedia"in window)?[]:lm.map(e=>window.matchMedia(e))}function bn(e,t=dm()){return e.some(i=>i.matches)||pm(t)}function dm(){return typeof navigator>"u"?void 0:navigator}function pm(e){return e!==void 0&&"standalone"in e&&e.standalone===!0}const hm=250;class um{constructor(t=fm()){this.scheduler=t}repair(t){if(!t){this.clear();return}this.resetViewportScroll(),this.repairFrame!==void 0&&this.scheduler.cancelAnimationFrame(this.repairFrame),this.repairFrame=this.scheduler.requestAnimationFrame(()=>{this.repairFrame=void 0,this.resetViewportScroll(),this.repairFrame=this.scheduler.requestAnimationFrame(()=>{this.repairFrame=void 0,this.resetViewportScroll()})}),this.repairTimer!==void 0&&this.scheduler.clearTimeout(this.repairTimer),this.repairTimer=this.scheduler.setTimeout(()=>{this.repairTimer=void 0,this.resetViewportScroll()},hm)}clear(){this.repairFrame!==void 0&&(this.scheduler.cancelAnimationFrame(this.repairFrame),this.repairFrame=void 0),this.repairTimer!==void 0&&(this.scheduler.clearTimeout(this.repairTimer),this.repairTimer=void 0)}resetViewportScroll(){this.scheduler.scrollTo(0,0);const t=this.scheduler.documentElement;t!==void 0&&(t.scrollTop=0);const i=this.scheduler.body;i!==void 0&&(i.scrollTop=0)}}function fm(){return{requestAnimationFrame(e){return window.requestAnimationFrame(e)},cancelAnimationFrame(e){window.cancelAnimationFrame(e)},setTimeout(e,t){return window.setTimeout(e,t)},clearTimeout(e){window.clearTimeout(e)},scrollTo(e,t){window.scrollTo(e,t)},get documentElement(){return typeof document>"u"?void 0:document.documentElement},get body(){return typeof document>"u"?void 0:document.body}}}const gm="(max-width: 760px)",mm="(max-width: 1180px)";class vm{constructor(t,i={}){this.host=t,this.onMobileNavigationMediaChange=s=>{this.isMobileNavigationLayout!==s.matches&&(this.isMobileNavigationLayout=s.matches,this.host.requestUpdate())},this.onStackedWorkspaceMediaChange=s=>{this.isStackedWorkspaceLayout!==s.matches&&(this.isStackedWorkspaceLayout=s.matches,this.host.requestUpdate())},this.onPwaDisplayModeChange=()=>{const s=bn(this.pwaDisplayModeMedia);this.isPwaDisplayMode!==s&&(this.isPwaDisplayMode=s,this.host.requestUpdate())},t.addController(this),this.mobileNavigationMedia=i.mobileNavigationMedia??bm(),this.stackedWorkspaceMedia=i.stackedWorkspaceMedia??wm(),this.pwaDisplayModeMedia=i.pwaDisplayModeMedia??cm(),this.viewportPositionRepairer=i.viewportPositionRepairer??new um,this.isMobileNavigationLayout=this.mobileNavigationMedia?.matches??!1,this.isStackedWorkspaceLayout=this.stackedWorkspaceMedia?.matches??!1,this.isPwaDisplayMode=bn(this.pwaDisplayModeMedia)}hostConnected(){this.mobileNavigationMedia?.addEventListener("change",this.onMobileNavigationMediaChange),this.stackedWorkspaceMedia?.addEventListener("change",this.onStackedWorkspaceMediaChange);for(const t of this.pwaDisplayModeMedia)t.addEventListener("change",this.onPwaDisplayModeChange)}hostDisconnected(){this.mobileNavigationMedia?.removeEventListener("change",this.onMobileNavigationMediaChange),this.stackedWorkspaceMedia?.removeEventListener("change",this.onStackedWorkspaceMediaChange);for(const t of this.pwaDisplayModeMedia)t.removeEventListener("change",this.onPwaDisplayModeChange);this.viewportPositionRepairer.clear()}shouldAutoFocusPrompt(){return!this.isMobileNavigationLayout&&!this.isPwaDisplayMode}shouldShowAppRefreshInHeader(){return this.isPwaDisplayMode&&!this.isMobileNavigationLayout}shouldShowAppRefreshInContextBar(){return this.isPwaDisplayMode&&this.isMobileNavigationLayout}defaultRouteView(){return this.normalizedMainView(void 0,!1)}normalizedMainView(t,i){return ym(t,{isMobileNavigationLayout:this.isMobileNavigationLayout,isStackedWorkspaceLayout:this.isStackedWorkspaceLayout,hasSelectedSession:i})}repairViewportPosition(){this.viewportPositionRepairer.repair(this.shouldRepairViewportPosition())}shouldRepairViewportPosition(){return this.isMobileNavigationLayout||this.isPwaDisplayMode}}function bm(){if(!(typeof window>"u"||!("matchMedia"in window)))return window.matchMedia(gm)}function wm(){if(!(typeof window>"u"||!("matchMedia"in window)))return window.matchMedia(mm)}function ym(e,t){const i=e??(t.isMobileNavigationLayout?"navigation":"chat");return t.isMobileNavigationLayout||!t.isStackedWorkspaceLayout||!t.hasSelectedSession||i==="navigation"||i==="chat"?i:"chat"}const ji=["machines","projects","workspaces","sessions"];function xm(e){return e.selectedProject===void 0?"projects":e.selectedWorkspace===void 0?"workspaces":"sessions"}function Wr(e,t){if(e!=="none")return e??xm(t)}function Sm(e,t){return t.isMobileLayout?Wr(t.expanded,t.state)!==e:t.collapsedSections?.includes(e)??!1}function km(e,t,i){return Wr(e,i.state)===t?"none":t}function $m(e,t,i){return i?t:e}function Pm(e,t){const i=new Set(e);return i.has(t)?i.delete(t):i.add(t),Rm(i)}function Cm(e){return ji[ji.indexOf(e)+1]}class Im{constructor(t,i,s){this.host=t,this.getState=i,this.isMobileLayout=s,this.collapsedSections=[],t.addController(this)}hostConnected(){}expandedSection(){return Wr(this.expanded,this.getState())}isCollapsed(t){return Sm(t,{isMobileLayout:this.isMobileLayout(),expanded:this.expanded,state:this.getState(),collapsedSections:this.collapsedSections})}toggle(t){if(this.isMobileLayout()){this.setExpanded(km(this.expanded,t,{state:this.getState()}));return}this.setCollapsedSections(Pm(this.collapsedSections,t))}expand(t){if(this.isMobileLayout()){this.setExpanded($m(this.expanded,t,!0));return}this.setCollapsedSections(this.collapsedSections.filter(i=>i!==t))}advanceAfterSelection(t){if(!this.isMobileLayout())return;const i=Cm(t);i!==void 0&&this.expand(i)}open(t,i){this.isMobileLayout()&&(this.expand(t),i())}setExpanded(t){this.expanded!==t&&(this.expanded=t,this.host.requestUpdate())}setCollapsedSections(t){Am(this.collapsedSections,t)||(this.collapsedSections=t,this.host.requestUpdate())}}function Rm(e){const t=new Set(e);return ji.filter(i=>t.has(i))}function Am(e,t){return e.length===t.length&&e.every((i,s)=>i===t[s])}class Tm{constructor(t){this.host=t,this.navigationPanelCollapsed=!1,this.workspacePanelCollapsed=!1,t.addController(this)}hostConnected(){}toggleNavigationPanel(){this.navigationPanelCollapsed=!this.navigationPanelCollapsed,this.host.requestUpdate()}toggleWorkspacePanel(){this.workspacePanelCollapsed=!this.workspacePanelCollapsed,this.host.requestUpdate()}expandNavigationPanel(){this.navigationPanelCollapsed&&(this.navigationPanelCollapsed=!1,this.host.requestUpdate())}expandWorkspacePanel(){this.workspacePanelCollapsed&&(this.workspacePanelCollapsed=!1,this.host.requestUpdate())}shellClass(t){return["shell",hl(t),...this.navigationPanelCollapsed?["navigation-panel-collapsed"]:[],...this.workspacePanelCollapsed?["workspace-panel-collapsed"]:[]].join(" ")}}function hl(e){return e==="navigation"?"navigation-view":e==="chat"?"chat-view":"workspace-view"}const Ys="pi-web:panel-sizes:v1",Mm={navigation:{minWidth:180,maxWidth:4096,defaultWidth:340,keyboardStep:24,largeKeyboardStep:72},workspace:{minWidth:240,maxWidth:4096,defaultWidth:480,keyboardStep:24,largeKeyboardStep:72}};class Em{constructor(t,i={}){this.host=t,t.addController(this),this.storage=i.storage??Or(),this.panelSizes=_m(this.storage)}hostConnected(){}constraints(t){return Yt(t)}panelWidth(t,i){return we(t,i??this.storedPanelWidth(t)??this.constraints(t).defaultWidth)}resizePanel(t,i,s={}){const r=we(t,i);this.storedPanelWidth(t)!==r&&(this.panelSizes=Fm(this.panelSizes,t,r),s.persist!==!1&&this.persistPanelSizes(),this.host.requestUpdate())}resetPanel(t,i={}){this.storedPanelWidth(t)!==void 0&&(this.panelSizes=Um(this.panelSizes,t),i.persist!==!1&&this.persistPanelSizes(),this.host.requestUpdate())}resetPanels(t={}){this.panelSizes.navigationPanelWidth===void 0&&this.panelSizes.workspacePanelWidth===void 0||(this.panelSizes={},t.persist!==!1&&this.persistPanelSizes(),this.host.requestUpdate())}persistPanelSizes(){Lm(this.panelSizes,this.storage)}shellStyle(t={}){const i=[];return this.panelSizes.navigationPanelWidth!==void 0&&i.push(`--navigation-panel-size: ${yn(we("navigation",this.panelSizes.navigationPanelWidth,t.navigation))};`),this.panelSizes.workspacePanelWidth!==void 0&&i.push(`--workspace-panel-size: ${yn(we("workspace",this.panelSizes.workspacePanelWidth,t.workspace))};`),i.join(" ")}storedPanelWidth(t){return t==="navigation"?this.panelSizes.navigationPanelWidth:this.panelSizes.workspacePanelWidth}}function Yt(e){return Mm[e]}function Dm(e,t,i){return e==="navigation"?i-t:t-i}function Wm(e,t,i,s,r=Yt(e)){return we(e,t+Dm(e,i,s),r)}function Om(e,t,i,s={}){const r=s.constraints??Yt(e);if(i==="Home")return r.minWidth;if(i==="End")return r.maxWidth;const o=s.largeStep===!0?r.largeKeyboardStep:r.keyboardStep,n=zm(e,i,o);if(n!==void 0)return we(e,t+n,r)}function we(e,t,i=Yt(e)){return Number.isFinite(t)?Math.round(Math.min(Math.max(t,i.minWidth),i.maxWidth)):i.defaultWidth}function _m(e=Or()){try{const t=e?.getItem(Ys);if(t==null||t==="")return{};const i=JSON.parse(t);return jm(i)}catch{return{}}}function Lm(e,t=Or()){if(t!==void 0)try{if(e.navigationPanelWidth===void 0&&e.workspacePanelWidth===void 0){t.removeItem(Ys);return}const i={version:1};e.navigationPanelWidth!==void 0&&(i.navigationPanelWidth=we("navigation",e.navigationPanelWidth)),e.workspacePanelWidth!==void 0&&(i.workspacePanelWidth=we("workspace",e.workspacePanelWidth)),t.setItem(Ys,JSON.stringify(i))}catch{}}function jm(e){if(!Bm(e)||e.version!==1)return{};const t={},i=wn(e.navigationPanelWidth),s=wn(e.workspacePanelWidth);return i!==void 0&&(t.navigationPanelWidth=we("navigation",i)),s!==void 0&&(t.workspacePanelWidth=we("workspace",s)),t}function wn(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function Fm(e,t,i){return t==="navigation"?{...e,navigationPanelWidth:i}:{...e,workspacePanelWidth:i}}function Um(e,t){return t==="navigation"?e.workspacePanelWidth===void 0?{}:{workspacePanelWidth:e.workspacePanelWidth}:e.navigationPanelWidth===void 0?{}:{navigationPanelWidth:e.navigationPanelWidth}}function zm(e,t,i){if(e==="navigation")return t==="ArrowRight"?i:t==="ArrowLeft"?-i:void 0;if(t==="ArrowLeft")return i;if(t==="ArrowRight")return-i}function yn(e){return`${String(Math.round(e))}px`}function Or(){try{return typeof window>"u"?void 0:window.localStorage}catch{return}}function Bm(e){return typeof e=="object"&&e!==null}function xn(){const e=new URLSearchParams(window.location.search);return{machineId:e.get("machine")??void 0,projectId:e.get("project")??void 0,workspaceId:e.get("workspace")??void 0,sessionId:e.get("session")??void 0,tool:Nm(e.get("tool")),view:Hm(e.get("view"))}}function ks(e,t){const i=new URL(window.location.href);i.searchParams.delete("machine"),i.searchParams.delete("project"),i.searchParams.delete("workspace"),i.searchParams.delete("session"),i.searchParams.delete("tool"),i.searchParams.delete("view"),e.machineId!==void 0&&e.machineId!==""&&e.machineId!=="local"&&i.searchParams.set("machine",e.machineId),e.projectId!==void 0&&e.projectId!==""&&i.searchParams.set("project",e.projectId),e.workspaceId!==void 0&&e.workspaceId!==""&&i.searchParams.set("workspace",e.workspaceId),e.sessionId!==void 0&&e.sessionId!==""&&i.searchParams.set("session",e.sessionId),e.tool!==void 0&&i.searchParams.set("tool",e.tool),e.view!==void 0&&i.searchParams.set("view",e.view);const s=`${i.pathname}${i.search}${i.hash}`,r=`${window.location.pathname}${window.location.search}${window.location.hash}`;s!==r&&(t?.replace===!0?window.history.replaceState({},"",i):window.history.pushState({},"",i))}function Nm(e){return e==="files"?"core:workspace.files":e==="git"?"core:workspace.git":ul(e)?e:void 0}function Hm(e){return e==="chat"?"chat":e==="files"?"core:workspace.files":e==="git"?"core:workspace.git":ul(e)?e:void 0}function ul(e){return e!==null&&/^[a-z][a-z0-9.-]*:[a-z][a-z0-9.-]*$/u.test(e)}function Sn(){return qm(new URLSearchParams(window.location.search).get("settings"))}function $s(e,t){const i=new URL(window.location.href);e===void 0?i.searchParams.delete("settings"):i.searchParams.set("settings",e);const s=`${i.pathname}${i.search}${i.hash}`,r=`${window.location.pathname}${window.location.search}${window.location.hash}`;s!==r&&window.history.pushState({},"",i)}function qm(e){if(e==="general")return"general";if(e==="sessiond"||e==="sessions")return"sessiond";if(e==="plugins")return"plugins";if(e==="shortcuts"||e==="keyboard"||e==="keyboard-shortcuts")return"shortcuts"}function Km(e,t){return t===void 0?e:e.map(i=>Gm(i,t))}function Vm(e,t){const i=new Set(Tr(e,t,{enabledOnly:!0}).filter(s=>s.active).map(s=>s.action.id));return Km(e,t).map(s=>s.shortcut!==void 0&&!i.has(s.id)?fl(s):s)}function Gm(e,t){if(!Object.hasOwn(t,e.id))return e;const i=t[e.id];return i===void 0?e:i===null?fl(e):{...e,shortcut:i}}function fl(e){const t={...e};return delete t.shortcut,t}function Jm(e,t){const i=t.api??yt,s=t.pollIntervalMs??1e3,r=t.setTimeout??Zm(),o=t.clearTimeout??Xm();return{async runCommand(n){const a=await i.runTerminalCommand(e,n);return n.open===!0&&t.openTerminal(n.workspace,{terminalId:a.terminalId}),{run:a,completed:Qm(a,i,s,r,o)}},listCommandRuns:n=>i.listCommandRuns(n),getCommandRun:n=>i.getCommandRun(n),open:n=>{t.openTerminal(void 0,n)}}}function Qm(e,t,i,s,r){return kn(e)?Promise.resolve(e):new Promise((o,n)=>{let a,c=!1;const p=g=>{c||(c=!0,a!==void 0&&r(a),o(g))},u=g=>{c||(c=!0,a!==void 0&&r(a),n(g instanceof Error?g:new Error(String(g))))},h=()=>{t.getCommandRun(e.id).then(g=>{if(g!==void 0&&kn(g)){p(g);return}a=s(h,i)}).catch(u)};a=s(h,i)})}function kn(e){return e.status==="succeeded"||e.status==="failed"}function Zm(){return(e,t)=>globalThis.setTimeout(e,t)}function Xm(){return e=>{globalThis.clearTimeout(e)}}function Ym(e,t){return t[e.path]}function ev(e){if(e?.hasSessionActivity===!0)return"session";if(e?.hasTerminalActivity===!0)return"terminal"}function tv(e,t,i){return ml(iv(e,t,i))}function gl(e){return ml(Object.values(e??{}))}function ml(e){if(e.some(t=>t.hasSessionActivity))return"session";if(e.some(t=>t.hasTerminalActivity))return"terminal"}function iv(e,t,i){const s=new Set(t.filter(o=>o.projectId===e.id).map(o=>o.path)),r=new Map;for(const o of s){const n=i[o];n!==void 0&&r.set(n.cwd,n)}for(const o of Object.values(i))(o.cwd===e.path||o.cwd.startsWith(`${e.path}/`))&&r.set(o.cwd,o);return[...r.values()]}function vl(e,t="活跃"){if(e!==void 0)return l`<span class=${`activity-indicator ${e}`} role="img" aria-label=${t} title=${t}></span>`}function Xi(e,t="活跃"){const i=vl(e,t);if(i!==void 0)return l`<span class="action-activity">${i}</span>`}const ai=0,sv=120;function bl(e,t={}){if(typeof HTMLElement>"u"||typeof window>"u"||!(e instanceof HTMLElement))return"";const i=e.getBoundingClientRect(),s=t.constrainTo==="viewport"?wl():rv(e),r=window.innerWidth,o=window.innerHeight,n=Math.max(0,s.left),a=Math.min(r,s.right),c=Math.max(0,s.top),p=Math.min(o,s.bottom),u=Math.min(i.right,a),h=p-i.bottom-ai,g=i.top-c-ai;return[...h<sv&&g>h?[`bottom: ${mt(o-i.top+ai)};`,`max-height: ${mt(Math.max(0,g))};`]:[`top: ${mt(i.bottom+ai)};`,`max-height: ${mt(Math.max(0,h))};`],`right: ${mt(Math.max(0,r-u))};`,`max-width: ${mt(Math.max(0,u-n))};`].join(" ")}function rv(e){const t=e.getRootNode();return typeof ShadowRoot<"u"&&t instanceof ShadowRoot&&t.host instanceof HTMLElement?t.host.getBoundingClientRect():wl()}function wl(){return{top:0,right:window.innerWidth,bottom:window.innerHeight,left:0}}function mt(e){return`${String(Math.round(e))}px`}class Yi{constructor(t){this.host=t,this.menuStyle="",this.onDocumentClick=i=>{i.composedPath().includes(this.host)||this.close()},t.addController(this)}hostConnected(){document.addEventListener("click",this.onDocumentClick)}hostDisconnected(){document.removeEventListener("click",this.onDocumentClick)}isOpen(t){return this.openId===t}toggle(t,i){if(this.openId===t){this.close();return}this.menuStyle=bl(i,{constrainTo:"viewport"}),this.openId=t,this.host.requestUpdate()}close(){this.openId===void 0&&this.menuStyle===""||(this.openId=void 0,this.menuStyle="",this.host.requestUpdate())}closeIfOpenIdMissing(t){this.openId!==void 0&&!t(this.openId)&&this.close()}closeIf(t){t&&this.close()}closeForEscape(t,i){return t.key!=="Escape"||this.openId!==i?!1:(t.preventDefault(),t.stopPropagation(),this.close(),!0)}}const ov=["a[href]","button","input","select","textarea","summary","[role='button']","[role='link']","[contenteditable='true']"].join(",");function yl(e){return e.composedPath().some(t=>nv(t,ov))}function nv(e,t){if(typeof Element<"u"&&e instanceof Element)return e.matches(t);if(!("matches"in e))return!1;const{matches:i}=e;return typeof i=="function"&&i.call(e,t)===!0}function es(e,t){yl(e)||t()}function ts(e,t){return yl(e)?!1:e.key==="Enter"||e.key===" "?(e.preventDefault(),t.activate(),!0):e.key==="ArrowUp"?rt(e,()=>{$n(e.currentTarget,-1)}):e.key==="ArrowDown"?rt(e,()=>{$n(e.currentTarget,1)}):e.key==="Home"?rt(e,()=>{Pn(e.currentTarget,0)}):e.key==="End"?rt(e,()=>{Pn(e.currentTarget,-1)}):e.key==="ArrowLeft"&&t.previousSection!==void 0?rt(e,t.previousSection):e.key==="ArrowRight"&&t.nextSection!==void 0?rt(e,t.nextSection):e.key==="Escape"&&t.cancel!==void 0?rt(e,t.cancel):!1}function is(e,t={}){const i=e.querySelector(".action-row.selected")??e.querySelector(".action-row")??(t.fallbackSelector===void 0?void 0:e.querySelector(t.fallbackSelector));return i==null?!1:(i.focus(),i.scrollIntoView({block:"nearest"}),!0)}function rt(e,t){return e.preventDefault(),e.stopPropagation?.(),t(),!0}function $n(e,t){const i=Sl(e),s=kl(e);if(s===void 0||i.length===0)return;const r=i.indexOf(s);r<0||xl(i,r+t)}function Pn(e,t){const i=Sl(e);i.length!==0&&xl(i,t<0?i.length-1:t)}function xl(e,t){const i=e[Math.min(Math.max(t,0),e.length-1)];i?.focus(),i?.scrollIntoView({block:"nearest"})}function Sl(e){const t=kl(e)?.getRootNode();return t===void 0||!av(t)?[]:Array.from(t.querySelectorAll(".action-row"))}function av(e){return typeof Document<"u"&&e instanceof Document||typeof DocumentFragment<"u"&&e instanceof DocumentFragment}function kl(e){if(!(typeof HTMLElement>"u"||!(e instanceof HTMLElement)))return e.closest(".action-row")??void 0}const ss=E`
376
377
  :host { display: flex; flex-direction: column; min-height: 0; overflow: hidden; color: var(--pi-text); font: 14px system-ui, sans-serif; }
377
378
  :host([collapsed]) { flex: 0 0 auto; min-height: auto; overflow: hidden; }
378
379
  section { box-sizing: border-box; flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; padding: 10px; }
@@ -433,7 +434,7 @@ ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.
433
434
  .workspace-detail-row .workspace-label { overflow: visible; white-space: normal; flex-wrap: wrap; }
434
435
  .workspace-detail-row .workspace-label-base, .workspace-detail-row .workspace-label-item, .workspace-detail-row .workspace-label-render { overflow: visible; text-overflow: clip; overflow-wrap: anywhere; white-space: normal; }
435
436
  @keyframes pulse { 0%, 100% { transform: scale(.75); opacity: .55; } 50% { transform: scale(1.2); opacity: 1; } }
436
- `;var av=Object.defineProperty,lv=Object.getOwnPropertyDescriptor,$e=(e,t,i,s)=>{for(var r=s>1?void 0:s?lv(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&av(t,i,r),r};let ae=class extends A{constructor(){super(...arguments),this.machines=[],this.statuses={},this.activities={},this.collapsible=!1,this.collapsed=!1,this.menu=new Yi(this)}updated(e){e.has("machines")&&this.menu.closeIfOpenIdMissing(t=>this.machines.some(i=>i.id===t)),e.has("collapsed")&&this.menu.closeIf(this.collapsed)}async focusSelectedOrFirst(){return await this.updateComplete,is(this.renderRoot,{fallbackSelector:".section-toggle"})}render(){return l`
437
+ `;var lv=Object.defineProperty,cv=Object.getOwnPropertyDescriptor,$e=(e,t,i,s)=>{for(var r=s>1?void 0:s?cv(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&lv(t,i,r),r};let ae=class extends A{constructor(){super(...arguments),this.machines=[],this.statuses={},this.activities={},this.collapsible=!1,this.collapsed=!1,this.menu=new Yi(this)}updated(e){e.has("machines")&&this.menu.closeIfOpenIdMissing(t=>this.machines.some(i=>i.id===t)),e.has("collapsed")&&this.menu.closeIf(this.collapsed)}async focusSelectedOrFirst(){return await this.updateComplete,is(this.renderRoot,{fallbackSelector:".section-toggle"})}render(){return l`
437
438
  <section>
438
439
  <h2>${this.renderHeading()}</h2>
439
440
  ${this.collapsed?null:l`
@@ -455,7 +456,7 @@ ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.
455
456
  </div>
456
457
  ${s?this.renderMachineMenu(e):null}
457
458
  </div>
458
- `}renderActivity(e){const t=this.statuses[e.id]?.status??e.status;if(t==="offline"||t==="error")return;const i=gl(this.activities[e.id]);return Xi(i,i==="terminal"?"机器终端活跃":"机器活跃")}renderMachineMenu(e){const t=this.menu.isOpen(e.id),i=cv(e.id);return l`
459
+ `}renderActivity(e){const t=this.statuses[e.id]?.status??e.status;if(t==="offline"||t==="error")return;const i=gl(this.activities[e.id]);return Xi(i,i==="terminal"?"机器终端活跃":"机器活跃")}renderMachineMenu(e){const t=this.menu.isOpen(e.id),i=dv(e.id);return l`
459
460
  <div class="action-menu">
460
461
  <button
461
462
  class="action-menu-toggle"
@@ -477,7 +478,7 @@ ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.
477
478
  .machine-primary-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
478
479
  .machine-menu-panel button.danger { color: var(--pi-danger); }
479
480
  .machine-menu-panel button.danger:hover, .machine-menu-panel button.danger:focus { background: color-mix(in srgb, var(--pi-danger) 14%, transparent); }
480
- `];$e([d({attribute:!1})],ae.prototype,"machines",2);$e([d({attribute:!1})],ae.prototype,"selected",2);$e([d({attribute:!1})],ae.prototype,"statuses",2);$e([d({attribute:!1})],ae.prototype,"activities",2);$e([d({type:Boolean,reflect:!0})],ae.prototype,"collapsible",2);$e([d({type:Boolean,reflect:!0})],ae.prototype,"collapsed",2);$e([d({attribute:!1})],ae.prototype,"onSelect",2);$e([d({attribute:!1})],ae.prototype,"onRemove",2);$e([d({attribute:!1})],ae.prototype,"onToggleCollapsed",2);$e([d({attribute:!1})],ae.prototype,"onFocusNextSection",2);$e([d({attribute:!1})],ae.prototype,"onCancelKeyboardNavigation",2);ae=$e([W("machine-list")],ae);function $l(e){return e.kind==="remote"}function cv(e){return`machine-menu-${e.replace(/[^a-zA-Z0-9_-]/g,"-")}`}var dv=Object.defineProperty,pv=Object.getOwnPropertyDescriptor,fe=(e,t,i,s)=>{for(var r=s>1?void 0:s?pv(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&dv(t,i,r),r};let te=class extends A{constructor(){super(...arguments),this.projects=[],this.activities={},this.workspacesByProjectId={},this.collapsible=!1,this.collapsed=!1,this.menu=new Yi(this)}updated(e){e.has("projects")&&this.menu.closeIfOpenIdMissing(t=>this.projects.some(i=>i.id===t)),e.has("collapsed")&&this.menu.closeIf(this.collapsed)}async focusSelectedOrFirst(){return await this.updateComplete,is(this.renderRoot,{fallbackSelector:".section-toggle"})}render(){return l`
481
+ `];$e([d({attribute:!1})],ae.prototype,"machines",2);$e([d({attribute:!1})],ae.prototype,"selected",2);$e([d({attribute:!1})],ae.prototype,"statuses",2);$e([d({attribute:!1})],ae.prototype,"activities",2);$e([d({type:Boolean,reflect:!0})],ae.prototype,"collapsible",2);$e([d({type:Boolean,reflect:!0})],ae.prototype,"collapsed",2);$e([d({attribute:!1})],ae.prototype,"onSelect",2);$e([d({attribute:!1})],ae.prototype,"onRemove",2);$e([d({attribute:!1})],ae.prototype,"onToggleCollapsed",2);$e([d({attribute:!1})],ae.prototype,"onFocusNextSection",2);$e([d({attribute:!1})],ae.prototype,"onCancelKeyboardNavigation",2);ae=$e([W("machine-list")],ae);function $l(e){return e.kind==="remote"}function dv(e){return`machine-menu-${e.replace(/[^a-zA-Z0-9_-]/g,"-")}`}var pv=Object.defineProperty,hv=Object.getOwnPropertyDescriptor,fe=(e,t,i,s)=>{for(var r=s>1?void 0:s?hv(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&pv(t,i,r),r};let te=class extends A{constructor(){super(...arguments),this.projects=[],this.activities={},this.workspacesByProjectId={},this.collapsible=!1,this.collapsed=!1,this.menu=new Yi(this)}updated(e){e.has("projects")&&this.menu.closeIfOpenIdMissing(t=>this.projects.some(i=>i.id===t)),e.has("collapsed")&&this.menu.closeIf(this.collapsed)}async focusSelectedOrFirst(){return await this.updateComplete,is(this.renderRoot,{fallbackSelector:".section-toggle"})}render(){return l`
481
482
  <section>
482
483
  <h2>${this.renderHeading()}</h2>
483
484
  ${this.collapsed?null:l`
@@ -512,14 +513,14 @@ ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.
512
513
  </div>
513
514
  `}
514
515
  </section>
515
- `}handleProjectKeydown(e,t){ts(e,{activate:()=>this.onSelect?.(t),previousSection:this.onFocusPreviousSection===void 0?void 0:()=>{this.onFocusPreviousSection?.()},nextSection:this.onFocusNextSection===void 0?void 0:()=>{this.onFocusNextSection?.()},cancel:this.onCancelKeyboardNavigation===void 0?void 0:()=>{this.onCancelKeyboardNavigation?.()}})}renderHeading(){if(!this.collapsible)return"项目";const e=this.selected?.name??"未选择项目",t=this.selected?.path??e;return l`<button class="section-toggle" aria-expanded=${String(!this.collapsed)} @click=${()=>{this.onToggleCollapsed?.()}}><span class="section-title"><span class="section-name">${this.collapsed?"▸":"▾"} 项目</span>${this.collapsed?l`<small class="section-selected" title=${t}>${e}</small>`:null}</span><small class="section-count">${this.projects.length}</small></button>`}renderActivity(e){const t=ev(e,this.workspacesByProjectId[e.id]??[],this.activities);return Xi(t,t==="terminal"?"项目终端活跃":"项目活跃")}close(e){this.menu.close(),confirm(`关闭 ${e.name}?
516
+ `}handleProjectKeydown(e,t){ts(e,{activate:()=>this.onSelect?.(t),previousSection:this.onFocusPreviousSection===void 0?void 0:()=>{this.onFocusPreviousSection?.()},nextSection:this.onFocusNextSection===void 0?void 0:()=>{this.onFocusNextSection?.()},cancel:this.onCancelKeyboardNavigation===void 0?void 0:()=>{this.onCancelKeyboardNavigation?.()}})}renderHeading(){if(!this.collapsible)return"项目";const e=this.selected?.name??"未选择项目",t=this.selected?.path??e;return l`<button class="section-toggle" aria-expanded=${String(!this.collapsed)} @click=${()=>{this.onToggleCollapsed?.()}}><span class="section-title"><span class="section-name">${this.collapsed?"▸":"▾"} 项目</span>${this.collapsed?l`<small class="section-selected" title=${t}>${e}</small>`:null}</span><small class="section-count">${this.projects.length}</small></button>`}renderActivity(e){const t=tv(e,this.workspacesByProjectId[e.id]??[],this.activities);return Xi(t,t==="terminal"?"项目终端活跃":"项目活跃")}close(e){this.menu.close(),confirm(`关闭 ${e.name}?
516
517
 
517
- 这只会从 PI WEB 中移除它,不会修改项目文件夹。`)&&this.onClose?.(e)}};te.styles=ss;fe([d({attribute:!1})],te.prototype,"projects",2);fe([d({attribute:!1})],te.prototype,"selected",2);fe([d({attribute:!1})],te.prototype,"activities",2);fe([d({attribute:!1})],te.prototype,"workspacesByProjectId",2);fe([d({type:Boolean,reflect:!0})],te.prototype,"collapsible",2);fe([d({type:Boolean,reflect:!0})],te.prototype,"collapsed",2);fe([d({attribute:!1})],te.prototype,"onSelect",2);fe([d({attribute:!1})],te.prototype,"onClose",2);fe([d({attribute:!1})],te.prototype,"onToggleCollapsed",2);fe([d({attribute:!1})],te.prototype,"onFocusPreviousSection",2);fe([d({attribute:!1})],te.prototype,"onFocusNextSection",2);fe([d({attribute:!1})],te.prototype,"onCancelKeyboardNavigation",2);te=fe([W("project-list")],te);function Cn(e=[]){return e.map((t,i)=>l`${i===0?null:l`<span class="workspace-label-separator">·</span>`}${hv(t)}`)}function hv(e){if(e.type==="render")return l`<span class="workspace-label-render">${e.render()}</span>`;if(e.type==="link"&&uv(e.href)){const t=e.target??"_blank",i=t==="_blank"?"noopener noreferrer":void 0;return l`<a class="workspace-label-item workspace-label-link" href=${e.href} title=${e.title??e.text} target=${t} rel=${i??void 0}>${e.text}</a>`}return l`<span class="workspace-label-item" title=${e.title??e.text}>${e.text}</span>`}function uv(e){const t=e.trim().toLowerCase();return t!==""&&!t.startsWith("javascript:")&&!t.startsWith("data:")}var fv=Object.defineProperty,gv=Object.getOwnPropertyDescriptor,pe=(e,t,i,s)=>{for(var r=s>1?void 0:s?gv(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&fv(t,i,r),r};let Y=class extends A{constructor(){super(...arguments),this.workspaces=[],this.collapsible=!1,this.collapsed=!1,this.workspaceLabelItems=()=>[],this.activities={},this.deletingWorkspaceIds=[],this.menu=new Yi(this)}updated(e){e.has("workspaces")&&this.menu.closeIfOpenIdMissing(t=>this.workspaces.some(i=>i.id===t)),e.has("collapsed")&&this.menu.closeIf(this.collapsed),(e.has("selected")||e.has("workspaces")||e.has("collapsed"))&&!this.collapsed&&this.scrollSelectedIntoView()}async focusSelectedOrFirst(){return await this.updateComplete,is(this.renderRoot,{fallbackSelector:".section-toggle"})}render(){return l`
518
+ 这只会从 PI WEB 中移除它,不会修改项目文件夹。`)&&this.onClose?.(e)}};te.styles=ss;fe([d({attribute:!1})],te.prototype,"projects",2);fe([d({attribute:!1})],te.prototype,"selected",2);fe([d({attribute:!1})],te.prototype,"activities",2);fe([d({attribute:!1})],te.prototype,"workspacesByProjectId",2);fe([d({type:Boolean,reflect:!0})],te.prototype,"collapsible",2);fe([d({type:Boolean,reflect:!0})],te.prototype,"collapsed",2);fe([d({attribute:!1})],te.prototype,"onSelect",2);fe([d({attribute:!1})],te.prototype,"onClose",2);fe([d({attribute:!1})],te.prototype,"onToggleCollapsed",2);fe([d({attribute:!1})],te.prototype,"onFocusPreviousSection",2);fe([d({attribute:!1})],te.prototype,"onFocusNextSection",2);fe([d({attribute:!1})],te.prototype,"onCancelKeyboardNavigation",2);te=fe([W("project-list")],te);function Cn(e=[]){return e.map((t,i)=>l`${i===0?null:l`<span class="workspace-label-separator">·</span>`}${uv(t)}`)}function uv(e){if(e.type==="render")return l`<span class="workspace-label-render">${e.render()}</span>`;if(e.type==="link"&&fv(e.href)){const t=e.target??"_blank",i=t==="_blank"?"noopener noreferrer":void 0;return l`<a class="workspace-label-item workspace-label-link" href=${e.href} title=${e.title??e.text} target=${t} rel=${i??void 0}>${e.text}</a>`}return l`<span class="workspace-label-item" title=${e.title??e.text}>${e.text}</span>`}function fv(e){const t=e.trim().toLowerCase();return t!==""&&!t.startsWith("javascript:")&&!t.startsWith("data:")}var gv=Object.defineProperty,mv=Object.getOwnPropertyDescriptor,pe=(e,t,i,s)=>{for(var r=s>1?void 0:s?mv(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&gv(t,i,r),r};let Y=class extends A{constructor(){super(...arguments),this.workspaces=[],this.collapsible=!1,this.collapsed=!1,this.workspaceLabelItems=()=>[],this.activities={},this.deletingWorkspaceIds=[],this.menu=new Yi(this)}updated(e){e.has("workspaces")&&this.menu.closeIfOpenIdMissing(t=>this.workspaces.some(i=>i.id===t)),e.has("collapsed")&&this.menu.closeIf(this.collapsed),(e.has("selected")||e.has("workspaces")||e.has("collapsed"))&&!this.collapsed&&this.scrollSelectedIntoView()}async focusSelectedOrFirst(){return await this.updateComplete,is(this.renderRoot,{fallbackSelector:".section-toggle"})}render(){return l`
518
519
  <section>
519
520
  <h2>${this.renderHeading()}</h2>
520
521
  ${this.collapsed?null:l`
521
522
  <div class="list-body">
522
- ${this.workspaces.map(e=>{const t=mv(e),i=this.workspaceLabelItems(e);return l`
523
+ ${this.workspaces.map(e=>{const t=vv(e),i=this.workspaceLabelItems(e);return l`
523
524
  <div
524
525
  class=${`action-row workspace-row ${this.selected?.id===e.id?"selected":""}`}
525
526
  tabindex="0"
@@ -536,7 +537,7 @@ ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.
536
537
  </div>
537
538
  `}
538
539
  </section>
539
- `}renderHeading(){if(!this.collapsible)return"工作区";const e=this.selected===void 0?"未选择工作区":`${this.selected.label}${this.selected.isMain?" · 主工作区":""} · ${this.selected.path}`,t=this.selected?.path??e;return l`<button class="section-toggle" aria-expanded=${String(!this.collapsed)} @click=${()=>{this.onToggleCollapsed?.()}}><span class="section-title"><span class="section-name">${this.collapsed?"▸":"▾"} 工作区</span>${this.collapsed?l`<small class="section-selected" title=${t}>${e}</small>`:null}</span><small class="section-count">${this.workspaces.length}</small></button>`}renderActivity(e){const t=Ym(Xm(e,this.activities));return Xi(t,t==="terminal"?"工作区终端活跃":"工作区活跃")}renderWorkspaceMain(e,t,i){return l`
540
+ `}renderHeading(){if(!this.collapsible)return"工作区";const e=this.selected===void 0?"未选择工作区":`${this.selected.label}${this.selected.isMain?" · 主工作区":""} · ${this.selected.path}`,t=this.selected?.path??e;return l`<button class="section-toggle" aria-expanded=${String(!this.collapsed)} @click=${()=>{this.onToggleCollapsed?.()}}><span class="section-title"><span class="section-name">${this.collapsed?"▸":"▾"} 工作区</span>${this.collapsed?l`<small class="section-selected" title=${t}>${e}</small>`:null}</span><small class="section-count">${this.workspaces.length}</small></button>`}renderActivity(e){const t=ev(Ym(e,this.activities));return Xi(t,t==="terminal"?"工作区终端活跃":"工作区活跃")}renderWorkspaceMain(e,t,i){return l`
540
541
  <span class="workspace-primary">
541
542
  <span class="workspace-primary-label">${e}</span>
542
543
  ${this.isDeleting(i)?l`<span class="workspace-status">正在删除…</span>`:null}
@@ -547,7 +548,7 @@ ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.
547
548
  </small>
548
549
  `}
549
550
  ${this.renderActivity(i)}
550
- `}renderWorkspaceMenu(e,t,i){const s=this.menu.isOpen(i.id),r=bv(i.id);return l`
551
+ `}renderWorkspaceMenu(e,t,i){const s=this.menu.isOpen(i.id),r=wv(i.id);return l`
551
552
  <div class="action-menu">
552
553
  <button
553
554
  class="action-menu-toggle"
@@ -564,7 +565,7 @@ ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.
564
565
  </div>
565
566
  `:null}
566
567
  </div>
567
- `}renderWorkspaceActions(e){if(!vv(e))return;const t=this.isDeleting(e);return l`
568
+ `}renderWorkspaceActions(e){if(!bv(e))return;const t=this.isDeleting(e);return l`
568
569
  <div class="workspace-menu-actions">
569
570
  <button class="danger" title=${t?"正在删除工作区":"删除工作区"} ?disabled=${t} @click=${()=>{this.delete(e)}}>${t?"正在删除…":"删除工作区"}</button>
570
571
  </div>
@@ -585,7 +586,7 @@ ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.
585
586
  </div>
586
587
  `}
587
588
  </dl>
588
- `}delete(e){this.isDeleting(e)||(this.menu.close(),this.onDelete?.(e))}isDeleting(e){return this.deletingWorkspaceIds.includes(e.id)}handleWorkspaceKeydown(e,t){this.menu.closeForEscape(e,t.id)||ts(e,{activate:()=>this.onSelect?.(t),previousSection:this.onFocusPreviousSection===void 0?void 0:()=>{this.onFocusPreviousSection?.()},nextSection:this.onFocusNextSection===void 0?void 0:()=>{this.onFocusNextSection?.()},cancel:this.onCancelKeyboardNavigation===void 0?void 0:()=>{this.onCancelKeyboardNavigation?.()}})}scrollSelectedIntoView(){this.renderRoot.querySelector(".action-row.selected")?.scrollIntoView({block:"nearest"})}};Y.styles=ss;pe([d({attribute:!1})],Y.prototype,"workspaces",2);pe([d({attribute:!1})],Y.prototype,"selected",2);pe([d({type:Boolean,reflect:!0})],Y.prototype,"collapsible",2);pe([d({type:Boolean,reflect:!0})],Y.prototype,"collapsed",2);pe([d({attribute:!1})],Y.prototype,"workspaceLabelItems",2);pe([d({attribute:!1})],Y.prototype,"activities",2);pe([d({attribute:!1})],Y.prototype,"deletingWorkspaceIds",2);pe([d({attribute:!1})],Y.prototype,"onSelect",2);pe([d({attribute:!1})],Y.prototype,"onDelete",2);pe([d({attribute:!1})],Y.prototype,"onToggleCollapsed",2);pe([d({attribute:!1})],Y.prototype,"onFocusPreviousSection",2);pe([d({attribute:!1})],Y.prototype,"onFocusNextSection",2);pe([d({attribute:!1})],Y.prototype,"onCancelKeyboardNavigation",2);Y=pe([W("workspace-list")],Y);function mv(e){return`${e.branch??e.label}${e.isMain?" · 主工作区":""}`}function vv(e){return e.isGitWorktree&&!e.isMain}function bv(e){return`workspace-menu-${e.replace(/[^a-zA-Z0-9_-]/g,"-")}`}var wv=Object.defineProperty,yv=Object.getOwnPropertyDescriptor,M=(e,t,i,s)=>{for(var r=s>1?void 0:s?yv(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&wv(t,i,r),r};function Ot(e){return e.name!==void 0&&e.name!==""?e.name:e.firstMessage!==""?e.firstMessage:e.id.slice(0,8)}let R=class extends A{constructor(){super(...arguments),this.sessions=[],this.statuses={},this.activities={},this.sending={},this.canStart=!1,this.canDeleteArchived=!1,this.canReload=!1,this.canCleanup=!1,this.archivedDeleteUnavailableMessage="请更新并重启此机器上的 Pi-Web 后再删除已归档会话。",this.cleanupUnavailableMessage="请更新并重启此机器上的 Pi-Web 后再清理会话。",this.collapsible=!1,this.collapsed=!1,this.menu=new Yi(this),this.archivedExpanded=!1,this.selectionScopes=new Set,this.selectedSessionIds=new Set}updated(e){e.has("sessions")&&(this.menu.closeIfOpenIdMissing(i=>this.sessions.some(s=>s.id===i)),this.sessions.some(i=>i.archived===!0)||(this.archivedExpanded=!1),this.pruneSelectedSessionIds()),e.has("collapsed")&&this.menu.closeIf(this.collapsed);const t=e.get("selected");if(e.has("selected")&&this.selected?.archived===!0&&(t?.id!==this.selected.id||t.archived!==!0)&&!this.archivedExpanded){this.archivedExpanded=!0,this.updateComplete.then(()=>{this.scrollSelectedIntoView()});return}(e.has("selected")||e.has("sessions")||e.has("collapsed"))&&!this.collapsed&&this.scrollSelectedIntoView()}async focusSelectedOrFirst(){return await this.updateComplete,is(this.renderRoot,{fallbackSelector:".section-toggle, h2 button:not([disabled])"})}render(){const e=kv(this.sessions),t=new Set(e.map(o=>o.session.id)),i=e.map(o=>o.session).filter(o=>_t(o)==="current"),s=Pl(this.sessions.filter(o=>o.archived===!0&&!t.has(o.id))),r=xv(this.sessions);return l`
589
+ `}delete(e){this.isDeleting(e)||(this.menu.close(),this.onDelete?.(e))}isDeleting(e){return this.deletingWorkspaceIds.includes(e.id)}handleWorkspaceKeydown(e,t){this.menu.closeForEscape(e,t.id)||ts(e,{activate:()=>this.onSelect?.(t),previousSection:this.onFocusPreviousSection===void 0?void 0:()=>{this.onFocusPreviousSection?.()},nextSection:this.onFocusNextSection===void 0?void 0:()=>{this.onFocusNextSection?.()},cancel:this.onCancelKeyboardNavigation===void 0?void 0:()=>{this.onCancelKeyboardNavigation?.()}})}scrollSelectedIntoView(){this.renderRoot.querySelector(".action-row.selected")?.scrollIntoView({block:"nearest"})}};Y.styles=ss;pe([d({attribute:!1})],Y.prototype,"workspaces",2);pe([d({attribute:!1})],Y.prototype,"selected",2);pe([d({type:Boolean,reflect:!0})],Y.prototype,"collapsible",2);pe([d({type:Boolean,reflect:!0})],Y.prototype,"collapsed",2);pe([d({attribute:!1})],Y.prototype,"workspaceLabelItems",2);pe([d({attribute:!1})],Y.prototype,"activities",2);pe([d({attribute:!1})],Y.prototype,"deletingWorkspaceIds",2);pe([d({attribute:!1})],Y.prototype,"onSelect",2);pe([d({attribute:!1})],Y.prototype,"onDelete",2);pe([d({attribute:!1})],Y.prototype,"onToggleCollapsed",2);pe([d({attribute:!1})],Y.prototype,"onFocusPreviousSection",2);pe([d({attribute:!1})],Y.prototype,"onFocusNextSection",2);pe([d({attribute:!1})],Y.prototype,"onCancelKeyboardNavigation",2);Y=pe([W("workspace-list")],Y);function vv(e){return`${e.branch??e.label}${e.isMain?" · 主工作区":""}`}function bv(e){return e.isGitWorktree&&!e.isMain}function wv(e){return`workspace-menu-${e.replace(/[^a-zA-Z0-9_-]/g,"-")}`}var yv=Object.defineProperty,xv=Object.getOwnPropertyDescriptor,M=(e,t,i,s)=>{for(var r=s>1?void 0:s?xv(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&yv(t,i,r),r};function Ot(e){return e.name!==void 0&&e.name!==""?e.name:e.firstMessage!==""?e.firstMessage:e.id.slice(0,8)}let R=class extends A{constructor(){super(...arguments),this.sessions=[],this.statuses={},this.activities={},this.sending={},this.canStart=!1,this.canDeleteArchived=!1,this.canReload=!1,this.canCleanup=!1,this.archivedDeleteUnavailableMessage="请更新并重启此机器上的 Pi-Web 后再删除已归档会话。",this.cleanupUnavailableMessage="请更新并重启此机器上的 Pi-Web 后再清理会话。",this.collapsible=!1,this.collapsed=!1,this.menu=new Yi(this),this.archivedExpanded=!1,this.selectionScopes=new Set,this.selectedSessionIds=new Set}updated(e){e.has("sessions")&&(this.menu.closeIfOpenIdMissing(i=>this.sessions.some(s=>s.id===i)),this.sessions.some(i=>i.archived===!0)||(this.archivedExpanded=!1),this.pruneSelectedSessionIds()),e.has("collapsed")&&this.menu.closeIf(this.collapsed);const t=e.get("selected");if(e.has("selected")&&this.selected?.archived===!0&&(t?.id!==this.selected.id||t.archived!==!0)&&!this.archivedExpanded){this.archivedExpanded=!0,this.updateComplete.then(()=>{this.scrollSelectedIntoView()});return}(e.has("selected")||e.has("sessions")||e.has("collapsed"))&&!this.collapsed&&this.scrollSelectedIntoView()}async focusSelectedOrFirst(){return await this.updateComplete,is(this.renderRoot,{fallbackSelector:".section-toggle, h2 button:not([disabled])"})}render(){const e=$v(this.sessions),t=new Set(e.map(o=>o.session.id)),i=e.map(o=>o.session).filter(o=>_t(o)==="current"),s=Pl(this.sessions.filter(o=>o.archived===!0&&!t.has(o.id))),r=Sv(this.sessions);return l`
589
590
  <section>
590
591
  ${this.renderHeading(e.length+s.length,i)}
591
592
  ${this.collapsed?null:l`
@@ -671,7 +672,7 @@ ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.
671
672
  `:null}
672
673
  </div>
673
674
  </div>
674
- `}handleSessionKeydown(e,t,i){ts(e,{activate:()=>{this.activateSessionRow(t,i)},previousSection:this.onFocusPreviousSection===void 0?void 0:()=>{this.onFocusPreviousSection?.()},nextSection:this.onFocusNextSection===void 0?void 0:()=>{this.onFocusNextSection?.()},cancel:this.onCancelKeyboardNavigation===void 0?void 0:()=>{this.onCancelKeyboardNavigation?.()}})}activateSessionRow(e,t){if(this.selectionScopes.has(t)&&_t(e)===t){this.toggleSelected(e.id);return}this.onSelect?.(e)}confirmArchiveWithDescendants(e,t){confirm(`归档“${Ot(e)}”及其 ${String(t)} 个后代会话?`)&&this.onArchiveWithDescendants?.(e)}confirmDeleteArchived(e){this.canDeleteArchived&&confirm(`永久删除已归档会话“${Ot(e)}”?此操作无法撤销。`)&&this.onDeleteArchived?.(e)}confirmDeleteSelectedArchived(){if(!this.canDeleteArchived)return;const e=this.selectedSessions("archived");e.length!==0&&confirm(`永久删除 ${String(e.length)} 个所选已归档会话?此操作无法撤销。`)&&(this.selectedSessionIds=Ps(this.selectedSessionIds,e.map(t=>t.id)),this.onDeleteArchivedMany?.(e))}archiveSelectedCurrent(){const e=this.selectedSessions("current").filter(t=>!Z(t));this.selectedSessionIds=Ps(this.selectedSessionIds,e.map(t=>t.id)),this.onArchiveMany?.(e)}toggleSelection(e,t){if(this.selectionScopes.has(e)){this.closeSelection(e);return}this.startSelection(e,t)}startSelection(e,t){this.selectionScopes=new Set([...this.selectionScopes,e]);const i=t.length===1?t[0]:void 0;i!==void 0&&(this.selectedSessionIds=new Set([...this.selectedSessionIds,i.id]))}closeSelection(e){this.selectionScopes=new Set([...this.selectionScopes].filter(t=>t!==e)),this.clearSelection(e)}clearSelection(e){const t=this.sessions.filter(i=>_t(i)===e).map(i=>i.id);this.selectedSessionIds=Ps(this.selectedSessionIds,t)}toggleSelected(e){const t=new Set(this.selectedSessionIds);t.has(e)?t.delete(e):t.add(e),this.selectedSessionIds=t}toggleVisibleSelection(e,t){const i=new Set(this.selectedSessionIds);for(const s of e)t?i.add(s.id):i.delete(s.id);this.selectedSessionIds=i}selectedSessions(e){return this.sessions.filter(t=>this.selectedSessionIds.has(t.id)&&_t(t)===e)}pruneSelectedSessionIds(){const e=new Set(this.sessions.map(i=>i.id)),t=new Set([...this.selectedSessionIds].filter(i=>e.has(i)));t.size!==this.selectedSessionIds.size&&(this.selectedSessionIds=t),this.selectionScopes.has("archived")&&!this.sessions.some(i=>i.archived===!0)&&this.closeSelection("archived"),this.selectionScopes.has("current")&&!this.sessions.some(i=>i.archived!==!0)&&this.closeSelection("current")}toggleArchived(){this.archivedExpanded=!this.archivedExpanded,this.archivedExpanded||(this.menu.close(),this.selectionScopes.has("archived")&&this.closeSelection("archived"),this.onArchivedCollapsed?.())}scrollSelectedIntoView(){this.renderRoot.querySelector(".action-row.selected")?.scrollIntoView({block:"nearest"})}renderSessionMetaPrefix(e){return Z(e)?"新建 · ":e.archived===!0?"只读 · ":""}renderActivity(e){const t=Sv(e,this.statuses[e.id],this.activities[e.id],this.sending[e.id]===!0);return Xi(t,t==="sending"?"正在发送消息":"会话活跃")}};R.styles=[ss,E`
675
+ `}handleSessionKeydown(e,t,i){ts(e,{activate:()=>{this.activateSessionRow(t,i)},previousSection:this.onFocusPreviousSection===void 0?void 0:()=>{this.onFocusPreviousSection?.()},nextSection:this.onFocusNextSection===void 0?void 0:()=>{this.onFocusNextSection?.()},cancel:this.onCancelKeyboardNavigation===void 0?void 0:()=>{this.onCancelKeyboardNavigation?.()}})}activateSessionRow(e,t){if(this.selectionScopes.has(t)&&_t(e)===t){this.toggleSelected(e.id);return}this.onSelect?.(e)}confirmArchiveWithDescendants(e,t){confirm(`归档“${Ot(e)}”及其 ${String(t)} 个后代会话?`)&&this.onArchiveWithDescendants?.(e)}confirmDeleteArchived(e){this.canDeleteArchived&&confirm(`永久删除已归档会话“${Ot(e)}”?此操作无法撤销。`)&&this.onDeleteArchived?.(e)}confirmDeleteSelectedArchived(){if(!this.canDeleteArchived)return;const e=this.selectedSessions("archived");e.length!==0&&confirm(`永久删除 ${String(e.length)} 个所选已归档会话?此操作无法撤销。`)&&(this.selectedSessionIds=Ps(this.selectedSessionIds,e.map(t=>t.id)),this.onDeleteArchivedMany?.(e))}archiveSelectedCurrent(){const e=this.selectedSessions("current").filter(t=>!Z(t));this.selectedSessionIds=Ps(this.selectedSessionIds,e.map(t=>t.id)),this.onArchiveMany?.(e)}toggleSelection(e,t){if(this.selectionScopes.has(e)){this.closeSelection(e);return}this.startSelection(e,t)}startSelection(e,t){this.selectionScopes=new Set([...this.selectionScopes,e]);const i=t.length===1?t[0]:void 0;i!==void 0&&(this.selectedSessionIds=new Set([...this.selectedSessionIds,i.id]))}closeSelection(e){this.selectionScopes=new Set([...this.selectionScopes].filter(t=>t!==e)),this.clearSelection(e)}clearSelection(e){const t=this.sessions.filter(i=>_t(i)===e).map(i=>i.id);this.selectedSessionIds=Ps(this.selectedSessionIds,t)}toggleSelected(e){const t=new Set(this.selectedSessionIds);t.has(e)?t.delete(e):t.add(e),this.selectedSessionIds=t}toggleVisibleSelection(e,t){const i=new Set(this.selectedSessionIds);for(const s of e)t?i.add(s.id):i.delete(s.id);this.selectedSessionIds=i}selectedSessions(e){return this.sessions.filter(t=>this.selectedSessionIds.has(t.id)&&_t(t)===e)}pruneSelectedSessionIds(){const e=new Set(this.sessions.map(i=>i.id)),t=new Set([...this.selectedSessionIds].filter(i=>e.has(i)));t.size!==this.selectedSessionIds.size&&(this.selectedSessionIds=t),this.selectionScopes.has("archived")&&!this.sessions.some(i=>i.archived===!0)&&this.closeSelection("archived"),this.selectionScopes.has("current")&&!this.sessions.some(i=>i.archived!==!0)&&this.closeSelection("current")}toggleArchived(){this.archivedExpanded=!this.archivedExpanded,this.archivedExpanded||(this.menu.close(),this.selectionScopes.has("archived")&&this.closeSelection("archived"),this.onArchivedCollapsed?.())}scrollSelectedIntoView(){this.renderRoot.querySelector(".action-row.selected")?.scrollIntoView({block:"nearest"})}renderSessionMetaPrefix(e){return Z(e)?"新建 · ":e.archived===!0?"只读 · ":""}renderActivity(e){const t=kv(e,this.statuses[e.id],this.activities[e.id],this.sending[e.id]===!0);return Xi(t,t==="sending"?"正在发送消息":"会话活跃")}};R.styles=[ss,E`
675
676
  h2 { min-height: 30px; }
676
677
  h2 > .section-count { flex: 0 0 auto; display: inline; color: var(--pi-muted); font-size: inherit; }
677
678
  .bulk-select-entry { box-sizing: border-box; flex: 0 0 auto; display: inline-grid; place-items: center; width: 30px; height: 30px; padding: 0; font-size: 13px; line-height: 1; text-transform: none; }
@@ -687,7 +688,7 @@ ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.
687
688
  .action-row.bulk-selected .action-main { border-color: var(--pi-accent); box-shadow: inset 3px 0 0 var(--pi-accent); }
688
689
  .action-main.selecting { padding-left: calc(32px + var(--depth, 0) * 16px); }
689
690
  .session-checkbox { position: absolute; top: 9px; left: calc(8px + var(--depth, 0) * 16px); z-index: 2; margin: 0; }
690
- `];M([d({attribute:!1})],R.prototype,"sessions",2);M([d({attribute:!1})],R.prototype,"statuses",2);M([d({attribute:!1})],R.prototype,"activities",2);M([d({attribute:!1})],R.prototype,"sending",2);M([d({attribute:!1})],R.prototype,"selected",2);M([d({type:Boolean})],R.prototype,"canStart",2);M([d({type:Boolean})],R.prototype,"canDeleteArchived",2);M([d({type:Boolean})],R.prototype,"canReload",2);M([d({type:Boolean})],R.prototype,"canCleanup",2);M([d({type:String})],R.prototype,"archivedDeleteUnavailableMessage",2);M([d({type:String})],R.prototype,"cleanupUnavailableMessage",2);M([d({type:Boolean,reflect:!0})],R.prototype,"collapsible",2);M([d({type:Boolean,reflect:!0})],R.prototype,"collapsed",2);M([d({attribute:!1})],R.prototype,"onSelect",2);M([d({attribute:!1})],R.prototype,"onStart",2);M([d({attribute:!1})],R.prototype,"onToggleCollapsed",2);M([d({attribute:!1})],R.prototype,"onArchivedCollapsed",2);M([d({attribute:!1})],R.prototype,"onFocusPreviousSection",2);M([d({attribute:!1})],R.prototype,"onFocusNextSection",2);M([d({attribute:!1})],R.prototype,"onCancelKeyboardNavigation",2);M([d({attribute:!1})],R.prototype,"onArchive",2);M([d({attribute:!1})],R.prototype,"onArchiveWithDescendants",2);M([d({attribute:!1})],R.prototype,"onArchiveMany",2);M([d({attribute:!1})],R.prototype,"onRestore",2);M([d({attribute:!1})],R.prototype,"onDelete",2);M([d({attribute:!1})],R.prototype,"onDeleteArchived",2);M([d({attribute:!1})],R.prototype,"onDeleteArchivedMany",2);M([d({attribute:!1})],R.prototype,"onDetachParent",2);M([d({attribute:!1})],R.prototype,"onReload",2);M([d({attribute:!1})],R.prototype,"onCleanup",2);M([x()],R.prototype,"archivedExpanded",2);M([x()],R.prototype,"selectionScopes",2);M([x()],R.prototype,"selectedSessionIds",2);R=M([W("session-list")],R);function _t(e){return e.archived===!0?"archived":"current"}function Ps(e,t){const i=new Set(t);return new Set([...e].filter(s=>!i.has(s)))}function xv(e){const t=new Map;for(const s of e){if(s.parentSessionPath===void 0)continue;const r=t.get(s.parentSessionPath)??[];r.push(s),t.set(s.parentSessionPath,r)}const i=(s,r)=>{if(r.has(s.path))return 0;const o=new Set(r);o.add(s.path);let n=0;for(const a of t.get(s.path)??[])o.has(a.path)||(a.archived!==!0&&(n+=1),n+=i(a,o));return n};return new Map(e.map(s=>[s.id,i(s,new Set)]))}function Sv(e,t,i,s){if(!(Z(e)||e.archived===!0))return s?"sending":Ye(t,i)?"session":void 0}function kv(e){const t=new Map(e.map(s=>[s.path,s])),i=new Set;for(const s of e){if(s.archived===!0)continue;i.add(s.id);let r=s.parentSessionPath;const o=new Set([s.path]);for(;r!==void 0&&!o.has(r);){o.add(r);const n=t.get(r);if(n===void 0)break;i.add(n.id),r=n.parentSessionPath}}return Pl(e.filter(s=>i.has(s.id)))}function Pl(e){const t=new Map(e.map(n=>[n.path,n])),i=new Map,s=[];for(const n of e){const a=n.parentSessionPath,c=a===void 0?void 0:t.get(a);if(c===void 0){s.push(n);continue}const p=i.get(c.path)??[];p.push(n),i.set(c.path,p)}const r=[],o=(n,a,c)=>{if(c.has(n.path))return;const p=n.parentSessionPath;r.push({session:n,depth:a,hasMissingParent:p!==void 0&&!t.has(p)});const u=new Set(c);u.add(n.path);for(const h of i.get(n.path)??[])o(h,a+1,u)};for(const n of s)o(n,0,new Set);return r}var $v=Object.defineProperty,Pv=Object.getOwnPropertyDescriptor,oe=(e,t,i,s)=>{for(var r=s>1?void 0:s?Pv(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&$v(t,i,r),r};let J=class extends A{constructor(){super(...arguments),this.canCleanup=!0,this.unavailableMessage="请更新并重启此机器上的 Pi-Web 后再清理会话。",this.loading=!1,this.running=!1,this.error="",this.draft={...Rf},this.formError=""}willUpdate(e){e.has("preview")&&(this.selectedProjectCwds=this.preview?.projects.map(t=>t.cwd))}render(){const e=Ut(this.draft),t=this.selectedPreview(),i=rn({canCleanup:this.canCleanup,draft:this.draft,preview:t,previewRequest:this.previewRequest,loading:this.loading,running:this.running}),s=i?"运行清理":t!==void 0&&!yi(t)?"至少选择一个项目才能运行清理":"运行清理前请先预览";return l`
691
+ `];M([d({attribute:!1})],R.prototype,"sessions",2);M([d({attribute:!1})],R.prototype,"statuses",2);M([d({attribute:!1})],R.prototype,"activities",2);M([d({attribute:!1})],R.prototype,"sending",2);M([d({attribute:!1})],R.prototype,"selected",2);M([d({type:Boolean})],R.prototype,"canStart",2);M([d({type:Boolean})],R.prototype,"canDeleteArchived",2);M([d({type:Boolean})],R.prototype,"canReload",2);M([d({type:Boolean})],R.prototype,"canCleanup",2);M([d({type:String})],R.prototype,"archivedDeleteUnavailableMessage",2);M([d({type:String})],R.prototype,"cleanupUnavailableMessage",2);M([d({type:Boolean,reflect:!0})],R.prototype,"collapsible",2);M([d({type:Boolean,reflect:!0})],R.prototype,"collapsed",2);M([d({attribute:!1})],R.prototype,"onSelect",2);M([d({attribute:!1})],R.prototype,"onStart",2);M([d({attribute:!1})],R.prototype,"onToggleCollapsed",2);M([d({attribute:!1})],R.prototype,"onArchivedCollapsed",2);M([d({attribute:!1})],R.prototype,"onFocusPreviousSection",2);M([d({attribute:!1})],R.prototype,"onFocusNextSection",2);M([d({attribute:!1})],R.prototype,"onCancelKeyboardNavigation",2);M([d({attribute:!1})],R.prototype,"onArchive",2);M([d({attribute:!1})],R.prototype,"onArchiveWithDescendants",2);M([d({attribute:!1})],R.prototype,"onArchiveMany",2);M([d({attribute:!1})],R.prototype,"onRestore",2);M([d({attribute:!1})],R.prototype,"onDelete",2);M([d({attribute:!1})],R.prototype,"onDeleteArchived",2);M([d({attribute:!1})],R.prototype,"onDeleteArchivedMany",2);M([d({attribute:!1})],R.prototype,"onDetachParent",2);M([d({attribute:!1})],R.prototype,"onReload",2);M([d({attribute:!1})],R.prototype,"onCleanup",2);M([x()],R.prototype,"archivedExpanded",2);M([x()],R.prototype,"selectionScopes",2);M([x()],R.prototype,"selectedSessionIds",2);R=M([W("session-list")],R);function _t(e){return e.archived===!0?"archived":"current"}function Ps(e,t){const i=new Set(t);return new Set([...e].filter(s=>!i.has(s)))}function Sv(e){const t=new Map;for(const s of e){if(s.parentSessionPath===void 0)continue;const r=t.get(s.parentSessionPath)??[];r.push(s),t.set(s.parentSessionPath,r)}const i=(s,r)=>{if(r.has(s.path))return 0;const o=new Set(r);o.add(s.path);let n=0;for(const a of t.get(s.path)??[])o.has(a.path)||(a.archived!==!0&&(n+=1),n+=i(a,o));return n};return new Map(e.map(s=>[s.id,i(s,new Set)]))}function kv(e,t,i,s){if(!(Z(e)||e.archived===!0))return s?"sending":Ye(t,i)?"session":void 0}function $v(e){const t=new Map(e.map(s=>[s.path,s])),i=new Set;for(const s of e){if(s.archived===!0)continue;i.add(s.id);let r=s.parentSessionPath;const o=new Set([s.path]);for(;r!==void 0&&!o.has(r);){o.add(r);const n=t.get(r);if(n===void 0)break;i.add(n.id),r=n.parentSessionPath}}return Pl(e.filter(s=>i.has(s.id)))}function Pl(e){const t=new Map(e.map(n=>[n.path,n])),i=new Map,s=[];for(const n of e){const a=n.parentSessionPath,c=a===void 0?void 0:t.get(a);if(c===void 0){s.push(n);continue}const p=i.get(c.path)??[];p.push(n),i.set(c.path,p)}const r=[],o=(n,a,c)=>{if(c.has(n.path))return;const p=n.parentSessionPath;r.push({session:n,depth:a,hasMissingParent:p!==void 0&&!t.has(p)});const u=new Set(c);u.add(n.path);for(const h of i.get(n.path)??[])o(h,a+1,u)};for(const n of s)o(n,0,new Set);return r}var Pv=Object.defineProperty,Cv=Object.getOwnPropertyDescriptor,oe=(e,t,i,s)=>{for(var r=s>1?void 0:s?Cv(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&Pv(t,i,r),r};let J=class extends A{constructor(){super(...arguments),this.canCleanup=!0,this.unavailableMessage="请更新并重启此机器上的 Pi-Web 后再清理会话。",this.loading=!1,this.running=!1,this.error="",this.draft={...Rf},this.formError=""}willUpdate(e){e.has("preview")&&(this.selectedProjectCwds=this.preview?.projects.map(t=>t.cwd))}render(){const e=Ut(this.draft),t=this.selectedPreview(),i=rn({canCleanup:this.canCleanup,draft:this.draft,preview:t,previewRequest:this.previewRequest,loading:this.loading,running:this.running}),s=i?"运行清理":t!==void 0&&!yi(t)?"至少选择一个项目才能运行清理":"运行清理前请先预览";return l`
691
692
  <div class="backdrop" @mousedown=${()=>{this.onClose?.()}}>
692
693
  <section role="dialog" aria-modal="true" aria-label="清理会话" @mousedown=${r=>{r.stopPropagation()}} @keydown=${r=>{this.handleKeyDown(r)}}>
693
694
  <header>
@@ -819,7 +820,7 @@ ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.
819
820
  table { min-width: 560px; }
820
821
  thead th:first-child, td.select-cell { width: 58px; }
821
822
  }
822
- `;oe([d({type:Boolean})],J.prototype,"canCleanup",2);oe([d({type:String})],J.prototype,"unavailableMessage",2);oe([d({attribute:!1})],J.prototype,"preview",2);oe([d({attribute:!1})],J.prototype,"previewRequest",2);oe([d({attribute:!1})],J.prototype,"result",2);oe([d({type:Boolean})],J.prototype,"loading",2);oe([d({type:Boolean})],J.prototype,"running",2);oe([d({type:String})],J.prototype,"error",2);oe([d({attribute:!1})],J.prototype,"onPreview",2);oe([d({attribute:!1})],J.prototype,"onRun",2);oe([d({attribute:!1})],J.prototype,"onClose",2);oe([x()],J.prototype,"draft",2);oe([x()],J.prototype,"formError",2);oe([x()],J.prototype,"selectedProjectCwds",2);J=oe([W("session-cleanup-dialog")],J);function Cs(e){return e.target instanceof HTMLInputElement?e.target.checked:!1}function In(e){return e.target instanceof HTMLInputElement?e.target.value:""}const _r={CHILD:2,ELEMENT:6},Lr=e=>(...t)=>({_$litDirective$:e,values:t});let jr=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,i,s){this._$Ct=t,this._$AM=i,this._$Ci=s}_$AS(t,i){return this.update(t,i)}update(t,i){return this.render(...i)}};const{I:Cv}=Mc,Rn=e=>e,An=()=>document.createComment(""),Lt=(e,t,i)=>{const s=e._$AA.parentNode,r=t===void 0?e._$AB:t._$AA;if(i===void 0){const o=s.insertBefore(An(),r),n=s.insertBefore(An(),r);i=new Cv(o,n,e,e.options)}else{const o=i._$AB.nextSibling,n=i._$AM,a=n!==e;if(a){let c;i._$AQ?.(e),i._$AM=e,i._$AP!==void 0&&(c=e._$AU)!==n._$AU&&i._$AP(c)}if(o!==r||a){let c=i._$AA;for(;c!==o;){const p=Rn(c).nextSibling;Rn(s).insertBefore(c,r),c=p}}}return i},ot=(e,t,i=e)=>(e._$AI(t,i),e),Iv={},Rv=(e,t=Iv)=>e._$AH=t,Av=e=>e._$AH,Is=e=>{e._$AR(),e._$AA.remove()};const Tn=(e,t,i)=>{const s=new Map;for(let r=t;r<=i;r++)s.set(e[r],r);return s},Tv=Lr(class extends jr{constructor(e){if(super(e),e.type!==_r.CHILD)throw Error("repeat() can only be used in text expressions")}dt(e,t,i){let s;i===void 0?i=t:t!==void 0&&(s=t);const r=[],o=[];let n=0;for(const a of e)r[n]=s?s(a,n):n,o[n]=i(a,n),n++;return{values:o,keys:r}}render(e,t,i){return this.dt(e,t,i).values}update(e,[t,i,s]){const r=Av(e),{values:o,keys:n}=this.dt(t,i,s);if(!Array.isArray(r))return this.ut=n,o;const a=this.ut??=[],c=[];let p,u,h=0,g=r.length-1,w=0,P=o.length-1;for(;h<=g&&w<=P;)if(r[h]===null)h++;else if(r[g]===null)g--;else if(a[h]===n[w])c[w]=ot(r[h],o[w]),h++,w++;else if(a[g]===n[P])c[P]=ot(r[g],o[P]),g--,P--;else if(a[h]===n[P])c[P]=ot(r[h],o[P]),Lt(e,c[P+1],r[h]),h++,P--;else if(a[g]===n[w])c[w]=ot(r[g],o[w]),Lt(e,r[h],r[g]),g--,w++;else if(p===void 0&&(p=Tn(n,w,P),u=Tn(a,h,g)),p.has(a[h]))if(p.has(a[g])){const I=u.get(n[w]),V=I!==void 0?r[I]:null;if(V===null){const Je=Lt(e,r[h]);ot(Je,o[w]),c[w]=Je}else c[w]=ot(V,o[w]),Lt(e,r[h],V),r[I]=null;w++}else Is(r[g]),g--;else Is(r[h]),h++;for(;w<=P;){const I=Lt(e,c[P+1]);ot(I,o[w]),c[w++]=I}for(;h<=g;){const I=r[h++];I!==null&&Is(I)}return this.ut=n,Rv(e,c),Xe}}),Mv="pi-web:chat-groups:",Ev={read(e){try{if(typeof localStorage>"u")return;const t=localStorage.getItem(Mn(e));return t===null||t===""?void 0:Wv(JSON.parse(t))}catch{return}},write(e,t){try{if(typeof localStorage>"u")return;localStorage.setItem(Mn(e),JSON.stringify(t))}catch{}}};class Dv{constructor(t=Ev){this.storage=t,this.sessionId="",this.openGroupKeys=new Set,this.closedDefaultOpenGroupKeys=new Set}syncSession(t){if(this.sessionId===t)return;this.sessionId=t;const i=t===""?void 0:this.storage.read(t);this.openGroupKeys=new Set(i?.open??[]),this.closedDefaultOpenGroupKeys=new Set(i?.closedDefaultOpen??[])}isOpen(t,i){return i?!this.closedDefaultOpenGroupKeys.has(t):this.openGroupKeys.has(t)}applyToggle(t,i,s){const r=this.isOpen(t,s),o=new Set(this.openGroupKeys),n=new Set(this.closedDefaultOpenGroupKeys);return s?(o.delete(t),i?n.delete(t):n.add(t)):(n.delete(t),i?o.add(t):o.delete(t)),(s?!n.has(t):o.has(t))===r&&En(o,this.openGroupKeys)&&En(n,this.closedDefaultOpenGroupKeys)?!1:(this.openGroupKeys=o,this.closedDefaultOpenGroupKeys=n,this.persist(),!0)}snapshot(){return{open:[...this.openGroupKeys],closedDefaultOpen:[...this.closedDefaultOpenGroupKeys]}}persist(){this.sessionId!==""&&this.storage.write(this.sessionId,this.snapshot())}}function Mn(e){return`${Mv}${e}`}function Wv(e){if(Array.isArray(e))return{open:Rs(e),closedDefaultOpen:[]};if(Ov(e))return{open:Array.isArray(e.open)?Rs(e.open):[],closedDefaultOpen:Array.isArray(e.closedDefaultOpen)?Rs(e.closedDefaultOpen):[]}}function Rs(e){return e.filter(t=>typeof t=="string")}function En(e,t){if(e.size!==t.size)return!1;for(const i of e)if(!t.has(i))return!1;return!0}function Ov(e){return typeof e=="object"&&e!==null}function _v(e,t=0){const i=[];let s=[],r=0;const o=(a,c)=>{s.length||(r=c),s.push(a)},n=()=>{s.length&&(i.push({kind:"group",messages:s,startIndex:r,endIndex:r+s.length-1}),s=[])};return e.forEach((a,c)=>{const p=a.parts.filter(w=>Dn(a,w)),u=a.parts.filter(w=>!Dn(a,w)),h=t+c,g={...a.source===void 0?{}:{source:a.source},...a.meta===void 0?{}:{meta:a.meta}};if(u.length&&o({role:a.role,parts:u,...g},h),p.length){n();const w=p.every(P=>P.type==="skillRead")?"skill":a.role;i.push({kind:"message",message:{role:w,parts:p,...g},index:h})}}),n(),i}function Lv(e){if(e.every(s=>s.source==="compaction"))return`${String(e.length)} 条历史压缩摘要`;if(e.every(s=>s.source==="branch_summary"))return`${String(e.length)} 条分支摘要`;const t=e.reduce((s,r)=>(s[r.role]=(s[r.role]??0)+1,s),{}),i=Object.entries(t).map(([s,r])=>`${String(r)} ${jv(s)}`).join(" · ");return`${String(e.length)} 个事件${i!==""?` · ${i}`:""}`}function jv(e){return e==="user"?"用户":e==="assistant"?"助手":e==="system"?"系统":e==="tool"?"工具":e==="toolResult"?"工具结果":e==="bash"?"Shell":e==="skill"?"技能":e}function Dn(e,t){return e.source==="compaction"||e.source==="branch_summary"?!1:t.type==="skillInvocation"||t.type==="skillRead"?!0:t.type==="text"&&(e.role==="user"||e.role==="assistant"||e.role==="system"||e.role==="bash")}const Fv=30;function Uv(e,t){const i=Bv(qv(e,t)),s={distanceFromBottom:e.scrollHeight-e.scrollTop};return i===void 0?s:{...s,markerId:i.id,markerOffset:i.offset}}function zv(e,t,i){if(i!==void 0&&t.markerOffset!==void 0){const s=i.getBoundingClientRect().top-e.getBoundingClientRect().top;e.scrollTop+=Nv(s,t.markerOffset);return}e.scrollTop=Hv(e.scrollHeight,t.distanceFromBottom)}function Bv(e){let t,i=Number.NEGATIVE_INFINITY,s,r=Number.POSITIVE_INFINITY;for(const o of e)o.offset<=0&&o.offset>=i?(t=o,i=o.offset):o.offset>0&&o.offset<r&&(s=o,r=o.offset);return t??s}function Nv(e,t){return e-t}function Hv(e,t){return Math.max(0,e-t)}function qv(e,t){const i=e.getBoundingClientRect().top;return t.flatMap(s=>{const r=s.dataset.markerId;return r===void 0?[]:[{id:r,offset:s.getBoundingClientRect().top-i}]})}const Kv=600,Vv=1;function Gv(e){return!e.hasMore||e.loadingMore||!e.canRequest||e.clientHeight<=0?!1:Jv(e)||Qv(e)}function Jv(e){return e.scrollTop<(e.topThreshold??Math.max(Kv,e.clientHeight))}function Qv(e){return e.scrollHeight<=e.clientHeight+Vv}const Zv="pi-web:chat-scroll:",Xv=180,Yv=48,eb=2,tb={getItem(e){return typeof localStorage>"u"?null:localStorage.getItem(e)},setItem(e,t){typeof localStorage>"u"||localStorage.setItem(e,t)},removeItem(e){typeof localStorage>"u"||localStorage.removeItem(e)}},ib={setTimeout(e,t){return window.setTimeout(e,t)},clearTimeout(e){window.clearTimeout(e)}};class sb{constructor(t=tb,i=ib){this.storage=t,this.scheduler=i}dispose(){this.clearScheduledSave()}clearScheduledSave(){this.saveTimer!==void 0&&(this.scheduler.clearTimeout(this.saveTimer),this.saveTimer=void 0)}scheduleSave(t,i,s=Xv){this.clearScheduledSave(),this.saveTimer=this.scheduler.setTimeout(()=>{this.saveTimer=void 0,i(t)},s)}savePosition(t,i,s,r=eb){if(t===""||i===void 0||!Ts(i))return"skipped";try{if(Il(i,r)){const a={mode:"bottom"};return this.storage.setItem(As(t),JSON.stringify(a)),"saved"}const o=nb(i,s);if(o===void 0)return"skipped";const n=ob(i,o);return this.storage.setItem(As(t),JSON.stringify(n)),"saved"}catch{return"skipped"}}restorePosition(t,i,s,r){const o=this.readPosition(t);return o===void 0?this.scrollToBottom(i):this.restoreExplicitPosition(o,i,s,r)}restoreExplicitPosition(t,i,s,r){if(t.mode==="bottom")return this.scrollToBottom(i);if(i===void 0||!Ts(i))return{status:"skipped"};const o=ab(s,t.anchorId);if(o===void 0)return r?.fallbackToBottom===!1?{status:"missing",position:t}:this.scrollToBottom(i);const n=i.getBoundingClientRect().top,a=o.getBoundingClientRect().top-n;return i.scrollTop+=a-t.offset,{status:"restored"}}readPosition(t){if(t!=="")try{const i=this.storage.getItem(As(t));if(i===null||i==="")return;const s=JSON.parse(i);return rb(s)?s:void 0}catch{return}}scrollToBottom(t){return t===void 0||!Ts(t)?{status:"skipped"}:(t.scrollTop=t.scrollHeight,{status:"bottom"})}}function As(e){return`${Zv}${e}`}function rb(e){return typeof e!="object"||e===null||!("mode"in e)?!1:e.mode==="bottom"?!0:e.mode==="anchor"&&"anchorId"in e&&typeof e.anchorId=="string"&&e.anchorId!==""&&"offset"in e&&typeof e.offset=="number"}function Ts(e){return e.clientHeight>0&&e.scrollHeight>0}function Cl(e){return e.scrollHeight-e.scrollTop-e.clientHeight}function Il(e,t=Yv){return Cl(e)<t}function ob(e,t){const i=e.getBoundingClientRect().top;return{mode:"anchor",anchorId:Fr(t)??"",offset:t.getBoundingClientRect().top-i}}function nb(e,t){const i=e.getBoundingClientRect();let s,r=Number.NEGATIVE_INFINITY,o,n=Number.POSITIVE_INFINITY;for(const a of t){if(Fr(a)===void 0)continue;const c=a.getBoundingClientRect();if(c.bottom<=c.top||c.bottom<i.top||c.top>i.bottom)continue;const p=c.top-i.top;p<=0&&p>=r?(s=a,r=p):p>0&&p<n&&(o=a,n=p)}return s??o}function Wn(e,t){const i=e.getBoundingClientRect();return t.find(s=>{const r=s.getBoundingClientRect();return r.bottom>=i.top&&r.top<=i.bottom})}function ab(e,t){return e.find(i=>Fr(i)===t)}function Fr(e){return e.dataset.scrollAnchorId!==void 0&&e.dataset.scrollAnchorId!==""?e.dataset.scrollAnchorId:void 0}async function Ur(e){try{return await navigator.clipboard.writeText(e),!0}catch{return!1}}const lb=E`
823
+ `;oe([d({type:Boolean})],J.prototype,"canCleanup",2);oe([d({type:String})],J.prototype,"unavailableMessage",2);oe([d({attribute:!1})],J.prototype,"preview",2);oe([d({attribute:!1})],J.prototype,"previewRequest",2);oe([d({attribute:!1})],J.prototype,"result",2);oe([d({type:Boolean})],J.prototype,"loading",2);oe([d({type:Boolean})],J.prototype,"running",2);oe([d({type:String})],J.prototype,"error",2);oe([d({attribute:!1})],J.prototype,"onPreview",2);oe([d({attribute:!1})],J.prototype,"onRun",2);oe([d({attribute:!1})],J.prototype,"onClose",2);oe([x()],J.prototype,"draft",2);oe([x()],J.prototype,"formError",2);oe([x()],J.prototype,"selectedProjectCwds",2);J=oe([W("session-cleanup-dialog")],J);function Cs(e){return e.target instanceof HTMLInputElement?e.target.checked:!1}function In(e){return e.target instanceof HTMLInputElement?e.target.value:""}const _r={CHILD:2,ELEMENT:6},Lr=e=>(...t)=>({_$litDirective$:e,values:t});let jr=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,i,s){this._$Ct=t,this._$AM=i,this._$Ci=s}_$AS(t,i){return this.update(t,i)}update(t,i){return this.render(...i)}};const{I:Iv}=Mc,Rn=e=>e,An=()=>document.createComment(""),Lt=(e,t,i)=>{const s=e._$AA.parentNode,r=t===void 0?e._$AB:t._$AA;if(i===void 0){const o=s.insertBefore(An(),r),n=s.insertBefore(An(),r);i=new Iv(o,n,e,e.options)}else{const o=i._$AB.nextSibling,n=i._$AM,a=n!==e;if(a){let c;i._$AQ?.(e),i._$AM=e,i._$AP!==void 0&&(c=e._$AU)!==n._$AU&&i._$AP(c)}if(o!==r||a){let c=i._$AA;for(;c!==o;){const p=Rn(c).nextSibling;Rn(s).insertBefore(c,r),c=p}}}return i},ot=(e,t,i=e)=>(e._$AI(t,i),e),Rv={},Av=(e,t=Rv)=>e._$AH=t,Tv=e=>e._$AH,Is=e=>{e._$AR(),e._$AA.remove()};const Tn=(e,t,i)=>{const s=new Map;for(let r=t;r<=i;r++)s.set(e[r],r);return s},Mv=Lr(class extends jr{constructor(e){if(super(e),e.type!==_r.CHILD)throw Error("repeat() can only be used in text expressions")}dt(e,t,i){let s;i===void 0?i=t:t!==void 0&&(s=t);const r=[],o=[];let n=0;for(const a of e)r[n]=s?s(a,n):n,o[n]=i(a,n),n++;return{values:o,keys:r}}render(e,t,i){return this.dt(e,t,i).values}update(e,[t,i,s]){const r=Tv(e),{values:o,keys:n}=this.dt(t,i,s);if(!Array.isArray(r))return this.ut=n,o;const a=this.ut??=[],c=[];let p,u,h=0,g=r.length-1,w=0,P=o.length-1;for(;h<=g&&w<=P;)if(r[h]===null)h++;else if(r[g]===null)g--;else if(a[h]===n[w])c[w]=ot(r[h],o[w]),h++,w++;else if(a[g]===n[P])c[P]=ot(r[g],o[P]),g--,P--;else if(a[h]===n[P])c[P]=ot(r[h],o[P]),Lt(e,c[P+1],r[h]),h++,P--;else if(a[g]===n[w])c[w]=ot(r[g],o[w]),Lt(e,r[h],r[g]),g--,w++;else if(p===void 0&&(p=Tn(n,w,P),u=Tn(a,h,g)),p.has(a[h]))if(p.has(a[g])){const I=u.get(n[w]),V=I!==void 0?r[I]:null;if(V===null){const Je=Lt(e,r[h]);ot(Je,o[w]),c[w]=Je}else c[w]=ot(V,o[w]),Lt(e,r[h],V),r[I]=null;w++}else Is(r[g]),g--;else Is(r[h]),h++;for(;w<=P;){const I=Lt(e,c[P+1]);ot(I,o[w]),c[w++]=I}for(;h<=g;){const I=r[h++];I!==null&&Is(I)}return this.ut=n,Av(e,c),Xe}}),Ev="pi-web:chat-groups:",Dv={read(e){try{if(typeof localStorage>"u")return;const t=localStorage.getItem(Mn(e));return t===null||t===""?void 0:Ov(JSON.parse(t))}catch{return}},write(e,t){try{if(typeof localStorage>"u")return;localStorage.setItem(Mn(e),JSON.stringify(t))}catch{}}};class Wv{constructor(t=Dv){this.storage=t,this.sessionId="",this.openGroupKeys=new Set,this.closedDefaultOpenGroupKeys=new Set}syncSession(t){if(this.sessionId===t)return;this.sessionId=t;const i=t===""?void 0:this.storage.read(t);this.openGroupKeys=new Set(i?.open??[]),this.closedDefaultOpenGroupKeys=new Set(i?.closedDefaultOpen??[])}isOpen(t,i){return i?!this.closedDefaultOpenGroupKeys.has(t):this.openGroupKeys.has(t)}applyToggle(t,i,s){const r=this.isOpen(t,s),o=new Set(this.openGroupKeys),n=new Set(this.closedDefaultOpenGroupKeys);return s?(o.delete(t),i?n.delete(t):n.add(t)):(n.delete(t),i?o.add(t):o.delete(t)),(s?!n.has(t):o.has(t))===r&&En(o,this.openGroupKeys)&&En(n,this.closedDefaultOpenGroupKeys)?!1:(this.openGroupKeys=o,this.closedDefaultOpenGroupKeys=n,this.persist(),!0)}snapshot(){return{open:[...this.openGroupKeys],closedDefaultOpen:[...this.closedDefaultOpenGroupKeys]}}persist(){this.sessionId!==""&&this.storage.write(this.sessionId,this.snapshot())}}function Mn(e){return`${Ev}${e}`}function Ov(e){if(Array.isArray(e))return{open:Rs(e),closedDefaultOpen:[]};if(_v(e))return{open:Array.isArray(e.open)?Rs(e.open):[],closedDefaultOpen:Array.isArray(e.closedDefaultOpen)?Rs(e.closedDefaultOpen):[]}}function Rs(e){return e.filter(t=>typeof t=="string")}function En(e,t){if(e.size!==t.size)return!1;for(const i of e)if(!t.has(i))return!1;return!0}function _v(e){return typeof e=="object"&&e!==null}function Lv(e,t=0){const i=[];let s=[],r=0;const o=(a,c)=>{s.length||(r=c),s.push(a)},n=()=>{s.length&&(i.push({kind:"group",messages:s,startIndex:r,endIndex:r+s.length-1}),s=[])};return e.forEach((a,c)=>{const p=a.parts.filter(w=>Dn(a,w)),u=a.parts.filter(w=>!Dn(a,w)),h=t+c,g={...a.source===void 0?{}:{source:a.source},...a.meta===void 0?{}:{meta:a.meta}};if(u.length&&o({role:a.role,parts:u,...g},h),p.length){n();const w=p.every(P=>P.type==="skillRead")?"skill":a.role;i.push({kind:"message",message:{role:w,parts:p,...g},index:h})}}),n(),i}function jv(e){if(e.every(s=>s.source==="compaction"))return`${String(e.length)} 条历史压缩摘要`;if(e.every(s=>s.source==="branch_summary"))return`${String(e.length)} 条分支摘要`;const t=e.reduce((s,r)=>(s[r.role]=(s[r.role]??0)+1,s),{}),i=Object.entries(t).map(([s,r])=>`${String(r)} ${Fv(s)}`).join(" · ");return`${String(e.length)} 个事件${i!==""?` · ${i}`:""}`}function Fv(e){return e==="user"?"用户":e==="assistant"?"助手":e==="system"?"系统":e==="tool"?"工具":e==="toolResult"?"工具结果":e==="bash"?"Shell":e==="skill"?"技能":e}function Dn(e,t){return e.source==="compaction"||e.source==="branch_summary"?!1:t.type==="skillInvocation"||t.type==="skillRead"?!0:t.type==="text"&&(e.role==="user"||e.role==="assistant"||e.role==="system"||e.role==="bash")}const Uv=30;function zv(e,t){const i=Nv(Kv(e,t)),s={distanceFromBottom:e.scrollHeight-e.scrollTop};return i===void 0?s:{...s,markerId:i.id,markerOffset:i.offset}}function Bv(e,t,i){if(i!==void 0&&t.markerOffset!==void 0){const s=i.getBoundingClientRect().top-e.getBoundingClientRect().top;e.scrollTop+=Hv(s,t.markerOffset);return}e.scrollTop=qv(e.scrollHeight,t.distanceFromBottom)}function Nv(e){let t,i=Number.NEGATIVE_INFINITY,s,r=Number.POSITIVE_INFINITY;for(const o of e)o.offset<=0&&o.offset>=i?(t=o,i=o.offset):o.offset>0&&o.offset<r&&(s=o,r=o.offset);return t??s}function Hv(e,t){return e-t}function qv(e,t){return Math.max(0,e-t)}function Kv(e,t){const i=e.getBoundingClientRect().top;return t.flatMap(s=>{const r=s.dataset.markerId;return r===void 0?[]:[{id:r,offset:s.getBoundingClientRect().top-i}]})}const Vv=600,Gv=1;function Jv(e){return!e.hasMore||e.loadingMore||!e.canRequest||e.clientHeight<=0?!1:Qv(e)||Zv(e)}function Qv(e){return e.scrollTop<(e.topThreshold??Math.max(Vv,e.clientHeight))}function Zv(e){return e.scrollHeight<=e.clientHeight+Gv}const Xv="pi-web:chat-scroll:",Yv=180,eb=48,tb=2,ib={getItem(e){return typeof localStorage>"u"?null:localStorage.getItem(e)},setItem(e,t){typeof localStorage>"u"||localStorage.setItem(e,t)},removeItem(e){typeof localStorage>"u"||localStorage.removeItem(e)}},sb={setTimeout(e,t){return window.setTimeout(e,t)},clearTimeout(e){window.clearTimeout(e)}};class rb{constructor(t=ib,i=sb){this.storage=t,this.scheduler=i}dispose(){this.clearScheduledSave()}clearScheduledSave(){this.saveTimer!==void 0&&(this.scheduler.clearTimeout(this.saveTimer),this.saveTimer=void 0)}scheduleSave(t,i,s=Yv){this.clearScheduledSave(),this.saveTimer=this.scheduler.setTimeout(()=>{this.saveTimer=void 0,i(t)},s)}savePosition(t,i,s,r=tb){if(t===""||i===void 0||!Ts(i))return"skipped";try{if(Il(i,r)){const a={mode:"bottom"};return this.storage.setItem(As(t),JSON.stringify(a)),"saved"}const o=ab(i,s);if(o===void 0)return"skipped";const n=nb(i,o);return this.storage.setItem(As(t),JSON.stringify(n)),"saved"}catch{return"skipped"}}restorePosition(t,i,s,r){const o=this.readPosition(t);return o===void 0?this.scrollToBottom(i):this.restoreExplicitPosition(o,i,s,r)}restoreExplicitPosition(t,i,s,r){if(t.mode==="bottom")return this.scrollToBottom(i);if(i===void 0||!Ts(i))return{status:"skipped"};const o=lb(s,t.anchorId);if(o===void 0)return r?.fallbackToBottom===!1?{status:"missing",position:t}:this.scrollToBottom(i);const n=i.getBoundingClientRect().top,a=o.getBoundingClientRect().top-n;return i.scrollTop+=a-t.offset,{status:"restored"}}readPosition(t){if(t!=="")try{const i=this.storage.getItem(As(t));if(i===null||i==="")return;const s=JSON.parse(i);return ob(s)?s:void 0}catch{return}}scrollToBottom(t){return t===void 0||!Ts(t)?{status:"skipped"}:(t.scrollTop=t.scrollHeight,{status:"bottom"})}}function As(e){return`${Xv}${e}`}function ob(e){return typeof e!="object"||e===null||!("mode"in e)?!1:e.mode==="bottom"?!0:e.mode==="anchor"&&"anchorId"in e&&typeof e.anchorId=="string"&&e.anchorId!==""&&"offset"in e&&typeof e.offset=="number"}function Ts(e){return e.clientHeight>0&&e.scrollHeight>0}function Cl(e){return e.scrollHeight-e.scrollTop-e.clientHeight}function Il(e,t=eb){return Cl(e)<t}function nb(e,t){const i=e.getBoundingClientRect().top;return{mode:"anchor",anchorId:Fr(t)??"",offset:t.getBoundingClientRect().top-i}}function ab(e,t){const i=e.getBoundingClientRect();let s,r=Number.NEGATIVE_INFINITY,o,n=Number.POSITIVE_INFINITY;for(const a of t){if(Fr(a)===void 0)continue;const c=a.getBoundingClientRect();if(c.bottom<=c.top||c.bottom<i.top||c.top>i.bottom)continue;const p=c.top-i.top;p<=0&&p>=r?(s=a,r=p):p>0&&p<n&&(o=a,n=p)}return s??o}function Wn(e,t){const i=e.getBoundingClientRect();return t.find(s=>{const r=s.getBoundingClientRect();return r.bottom>=i.top&&r.top<=i.bottom})}function lb(e,t){return e.find(i=>Fr(i)===t)}function Fr(e){return e.dataset.scrollAnchorId!==void 0&&e.dataset.scrollAnchorId!==""?e.dataset.scrollAnchorId:void 0}async function Ur(e){try{return await navigator.clipboard.writeText(e),!0}catch{return!1}}const cb=E`
823
824
  :host { position: relative; z-index: 0; display: flex; flex: 1 1 0; flex-direction: column; min-height: 0; max-height: 100%; overflow: hidden; contain: size layout; color: var(--pi-text); font: 14px system-ui, sans-serif; }
824
825
  .chat-wrap { position: relative; flex: 1 1 0; min-height: 0; max-height: 100%; overflow: hidden; }
825
826
  .chat { height: 100%; min-height: 0; overflow: auto; overflow-anchor: none; padding: 26px 16px 64px; box-sizing: border-box; }
@@ -908,7 +909,7 @@ ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.
908
909
  pre { margin: 6px 0 0; white-space: pre-wrap; overflow-wrap: anywhere; font: inherit; }
909
910
  .shell-output { color: var(--pi-text); font: 13px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; line-height: 1.45; }
910
911
  @keyframes pulse { 0%, 100% { transform: scale(.75); opacity: .55; } 50% { transform: scale(1.2); opacity: 1; } }
911
- `;var cb=Object.defineProperty,db=Object.getOwnPropertyDescriptor,zr=(e,t,i,s)=>{for(var r=s>1?void 0:s?db(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&cb(t,i,r),r};let Gt=class extends A{constructor(){super(...arguments),this.positionPercent=0,this.loadedPercent=100}render(){const e=On(this.positionPercent),t=On(this.loadedPercent),i=`消息位置:约在会话 ${String(Math.round(e))}% 处。已加载 ${String(Math.round(t))}% 的消息。`;return l`
912
+ `;var db=Object.defineProperty,pb=Object.getOwnPropertyDescriptor,zr=(e,t,i,s)=>{for(var r=s>1?void 0:s?pb(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&db(t,i,r),r};let Gt=class extends A{constructor(){super(...arguments),this.positionPercent=0,this.loadedPercent=100}render(){const e=On(this.positionPercent),t=On(this.loadedPercent),i=`消息位置:约在会话 ${String(Math.round(e))}% 处。已加载 ${String(Math.round(t))}% 的消息。`;return l`
912
913
  <div
913
914
  class="meter"
914
915
  style=${`--position:${e.toFixed(2)}%;`}
@@ -931,12 +932,12 @@ ${h}`;await this.api.prompt(a,g,i,p)}else await this.api.prompt(a,t,i,p,s);this.
931
932
  .track { position: relative; height: 4px; margin-top: 4px; border-radius: 999px; background: color-mix(in srgb, var(--pi-border-muted) 34%, transparent); box-shadow: 0 0 0 1px color-mix(in srgb, var(--pi-bg) 55%, transparent); }
932
933
  .progress { position: absolute; left: 0; width: var(--position); top: 0; bottom: 0; border-radius: 999px; background: color-mix(in srgb, var(--pi-accent) 42%, var(--pi-border-muted)); }
933
934
  .marker { position: absolute; left: var(--position); top: 50%; width: 10px; height: 10px; border: 2px solid var(--pi-bg); border-radius: 50%; background: var(--pi-accent); box-shadow: 0 2px 8px var(--pi-shadow); transform: translate(-50%, -50%); }
934
- `;zr([d({type:Number})],Gt.prototype,"positionPercent",2);zr([d({type:Number})],Gt.prototype,"loadedPercent",2);Gt=zr([W("conversation-meter")],Gt);function On(e){return Number.isFinite(e)?Math.min(100,Math.max(0,e)):0}class er extends jr{constructor(t){if(super(t),this.it=z,t.type!==_r.CHILD)throw Error(this.constructor.directiveName+"() can only be used in child bindings")}render(t){if(t===z||t==null)return this._t=void 0,this.it=t;if(t===Xe)return t;if(typeof t!="string")throw Error(this.constructor.directiveName+"() called with a non-string value");if(t===this.it)return this._t;this.it=t;const i=[t];return i.raw=i,this._t={_$litType$:this.constructor.resultType,strings:i,values:[]}}}er.directiveName="unsafeHTML",er.resultType=1;const pb=Lr(er);function Br(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var ht=Br();function Rl(e){ht=e}var nt={exec:()=>null};function vt(e){let t=[];return i=>{let s=Math.max(0,Math.min(3,i-1)),r=t[s];return r||(r=e(s),t[s]=r),r}}function T(e,t=""){let i=typeof e=="string"?e:e.source,s={replace:(r,o)=>{let n=typeof o=="string"?o:o.source;return n=n.replace(X.caret,"$1"),i=i.replace(r,n),s},getRegex:()=>new RegExp(i,t)};return s}var hb=((e="")=>{try{return!!new RegExp("(?<=1)(?<!1)"+e)}catch{return!1}})(),X={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:e=>new RegExp(`^( {0,3}${e})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:vt(e=>new RegExp(`^ {0,${e}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)),hrRegex:vt(e=>new RegExp(`^ {0,${e}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`)),fencesBeginRegex:vt(e=>new RegExp(`^ {0,${e}}(?:\`\`\`|~~~)`)),headingBeginRegex:vt(e=>new RegExp(`^ {0,${e}}#`)),htmlBeginRegex:vt(e=>new RegExp(`^ {0,${e}}<(?:[a-z].*>|!--)`,"i")),blockquoteBeginRegex:vt(e=>new RegExp(`^ {0,${e}}>`))},ub=/^(?:[ \t]*(?:\n|$))+/,fb=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,gb=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,ei=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,mb=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,Nr=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,Al=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,Tl=T(Al).replace(/bull/g,Nr).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),vb=T(Al).replace(/bull/g,Nr).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),Hr=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,bb=/^[^\n]+/,qr=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,wb=T(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",qr).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),yb=T(/^(bull)([ \t][^\n]*?)?(?:\n|$)/).replace(/bull/g,Nr).getRegex(),rs="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",Kr=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,xb=T("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",Kr).replace("tag",rs).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Ml=T(Hr).replace("hr",ei).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",rs).getRegex(),Sb=T(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",Ml).getRegex(),Vr={blockquote:Sb,code:fb,def:wb,fences:gb,heading:mb,hr:ei,html:xb,lheading:Tl,list:yb,newline:ub,paragraph:Ml,table:nt,text:bb},_n=T("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",ei).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",rs).getRegex(),kb={...Vr,lheading:vb,table:_n,paragraph:T(Hr).replace("hr",ei).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",_n).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",rs).getRegex()},$b={...Vr,html:T(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",Kr).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:nt,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:T(Hr).replace("hr",ei).replace("heading",` *#{1,6} *[^
935
- ]`).replace("lheading",Tl).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},Pb=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,Cb=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,El=/^( {2,}|\\)\n(?!\s*$)/,Ib=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,Rt=/[\p{P}\p{S}]/u,os=/[\s\p{P}\p{S}]/u,Gr=/[^\s\p{P}\p{S}]/u,Rb=T(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,os).getRegex(),Dl=/(?!~)[\p{P}\p{S}]/u,Ab=/(?!~)[\s\p{P}\p{S}]/u,Tb=/(?:[^\s\p{P}\p{S}]|~)/u,Mb=T(/link|precode-code|html/,"g").replace("link",/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",hb?"(?<!`)()":"(^^|[^`])").replace("code",/(?<b>`+)[^`]+\k<b>(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),Wl=/^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/,Eb=T(Wl,"u").replace(/punct/g,Rt).getRegex(),Db=T(Wl,"u").replace(/punct/g,Dl).getRegex(),Ol="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",Wb=T(Ol,"gu").replace(/notPunctSpace/g,Gr).replace(/punctSpace/g,os).replace(/punct/g,Rt).getRegex(),Ob=T(Ol,"gu").replace(/notPunctSpace/g,Tb).replace(/punctSpace/g,Ab).replace(/punct/g,Dl).getRegex(),_b=T("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,Gr).replace(/punctSpace/g,os).replace(/punct/g,Rt).getRegex(),Lb=T(/^~~?(?:((?!~)punct)|[^\s~])/,"u").replace(/punct/g,Rt).getRegex(),jb="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",Fb=T(jb,"gu").replace(/notPunctSpace/g,Gr).replace(/punctSpace/g,os).replace(/punct/g,Rt).getRegex(),Ub=T(/\\(punct)/,"gu").replace(/punct/g,Rt).getRegex(),zb=T(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Bb=T(Kr).replace("(?:-->|$)","-->").getRegex(),Nb=T("^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment",Bb).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),Fi=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/,Hb=T(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label",Fi).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),_l=T(/^!?\[(label)\]\[(ref)\]/).replace("label",Fi).replace("ref",qr).getRegex(),Ll=T(/^!?\[(ref)\](?:\[\])?/).replace("ref",qr).getRegex(),qb=T("reflink|nolink(?!\\()","g").replace("reflink",_l).replace("nolink",Ll).getRegex(),Ln=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,Jr={_backpedal:nt,anyPunctuation:Ub,autolink:zb,blockSkip:Mb,br:El,code:Cb,del:nt,delLDelim:nt,delRDelim:nt,emStrongLDelim:Eb,emStrongRDelimAst:Wb,emStrongRDelimUnd:_b,escape:Pb,link:Hb,nolink:Ll,punctuation:Rb,reflink:_l,reflinkSearch:qb,tag:Nb,text:Ib,url:nt},Kb={...Jr,link:T(/^!?\[(label)\]\((.*?)\)/).replace("label",Fi).getRegex(),reflink:T(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Fi).getRegex()},tr={...Jr,emStrongRDelimAst:Ob,emStrongLDelim:Db,delLDelim:Lb,delRDelim:Fb,url:T(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",Ln).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:T(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/).replace("protocol",Ln).getRegex()},Vb={...tr,br:T(El).replace("{2,}","*").getRegex(),text:T(tr.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()},li={normal:Vr,gfm:kb,pedantic:$b},jt={normal:Jr,gfm:tr,breaks:Vb,pedantic:Kb},Gb={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},jn=e=>Gb[e];function We(e,t){if(t){if(X.escapeTest.test(e))return e.replace(X.escapeReplace,jn)}else if(X.escapeTestNoEncode.test(e))return e.replace(X.escapeReplaceNoEncode,jn);return e}function Fn(e){try{e=encodeURI(e).replace(X.percentDecode,"%")}catch{return null}return e}function Un(e,t){let i=e.replace(X.findPipe,(o,n,a)=>{let c=!1,p=n;for(;--p>=0&&a[p]==="\\";)c=!c;return c?"|":" |"}),s=i.split(X.splitPipe),r=0;if(s[0].trim()||s.shift(),s.length>0&&!s.at(-1)?.trim()&&s.pop(),t)if(s.length>t)s.splice(t);else for(;s.length<t;)s.push("");for(;r<s.length;r++)s[r]=s[r].trim().replace(X.slashPipe,"|");return s}function Qe(e,t,i){let s=e.length;if(s===0)return"";let r=0;for(;r<s&&e.charAt(s-r-1)===t;)r++;return e.slice(0,s-r)}function zn(e){let t=e.split(`
935
+ `;zr([d({type:Number})],Gt.prototype,"positionPercent",2);zr([d({type:Number})],Gt.prototype,"loadedPercent",2);Gt=zr([W("conversation-meter")],Gt);function On(e){return Number.isFinite(e)?Math.min(100,Math.max(0,e)):0}class er extends jr{constructor(t){if(super(t),this.it=z,t.type!==_r.CHILD)throw Error(this.constructor.directiveName+"() can only be used in child bindings")}render(t){if(t===z||t==null)return this._t=void 0,this.it=t;if(t===Xe)return t;if(typeof t!="string")throw Error(this.constructor.directiveName+"() called with a non-string value");if(t===this.it)return this._t;this.it=t;const i=[t];return i.raw=i,this._t={_$litType$:this.constructor.resultType,strings:i,values:[]}}}er.directiveName="unsafeHTML",er.resultType=1;const hb=Lr(er);function Br(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var ht=Br();function Rl(e){ht=e}var nt={exec:()=>null};function vt(e){let t=[];return i=>{let s=Math.max(0,Math.min(3,i-1)),r=t[s];return r||(r=e(s),t[s]=r),r}}function T(e,t=""){let i=typeof e=="string"?e:e.source,s={replace:(r,o)=>{let n=typeof o=="string"?o:o.source;return n=n.replace(X.caret,"$1"),i=i.replace(r,n),s},getRegex:()=>new RegExp(i,t)};return s}var ub=((e="")=>{try{return!!new RegExp("(?<=1)(?<!1)"+e)}catch{return!1}})(),X={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:e=>new RegExp(`^( {0,3}${e})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:vt(e=>new RegExp(`^ {0,${e}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)),hrRegex:vt(e=>new RegExp(`^ {0,${e}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`)),fencesBeginRegex:vt(e=>new RegExp(`^ {0,${e}}(?:\`\`\`|~~~)`)),headingBeginRegex:vt(e=>new RegExp(`^ {0,${e}}#`)),htmlBeginRegex:vt(e=>new RegExp(`^ {0,${e}}<(?:[a-z].*>|!--)`,"i")),blockquoteBeginRegex:vt(e=>new RegExp(`^ {0,${e}}>`))},fb=/^(?:[ \t]*(?:\n|$))+/,gb=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,mb=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,ei=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,vb=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,Nr=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,Al=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,Tl=T(Al).replace(/bull/g,Nr).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),bb=T(Al).replace(/bull/g,Nr).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),Hr=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,wb=/^[^\n]+/,qr=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,yb=T(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",qr).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),xb=T(/^(bull)([ \t][^\n]*?)?(?:\n|$)/).replace(/bull/g,Nr).getRegex(),rs="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",Kr=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,Sb=T("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",Kr).replace("tag",rs).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Ml=T(Hr).replace("hr",ei).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",rs).getRegex(),kb=T(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",Ml).getRegex(),Vr={blockquote:kb,code:gb,def:yb,fences:mb,heading:vb,hr:ei,html:Sb,lheading:Tl,list:xb,newline:fb,paragraph:Ml,table:nt,text:wb},_n=T("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",ei).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",rs).getRegex(),$b={...Vr,lheading:bb,table:_n,paragraph:T(Hr).replace("hr",ei).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",_n).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",rs).getRegex()},Pb={...Vr,html:T(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",Kr).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:nt,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:T(Hr).replace("hr",ei).replace("heading",` *#{1,6} *[^
936
+ ]`).replace("lheading",Tl).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},Cb=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,Ib=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,El=/^( {2,}|\\)\n(?!\s*$)/,Rb=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,Rt=/[\p{P}\p{S}]/u,os=/[\s\p{P}\p{S}]/u,Gr=/[^\s\p{P}\p{S}]/u,Ab=T(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,os).getRegex(),Dl=/(?!~)[\p{P}\p{S}]/u,Tb=/(?!~)[\s\p{P}\p{S}]/u,Mb=/(?:[^\s\p{P}\p{S}]|~)/u,Eb=T(/link|precode-code|html/,"g").replace("link",/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",ub?"(?<!`)()":"(^^|[^`])").replace("code",/(?<b>`+)[^`]+\k<b>(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),Wl=/^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/,Db=T(Wl,"u").replace(/punct/g,Rt).getRegex(),Wb=T(Wl,"u").replace(/punct/g,Dl).getRegex(),Ol="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",Ob=T(Ol,"gu").replace(/notPunctSpace/g,Gr).replace(/punctSpace/g,os).replace(/punct/g,Rt).getRegex(),_b=T(Ol,"gu").replace(/notPunctSpace/g,Mb).replace(/punctSpace/g,Tb).replace(/punct/g,Dl).getRegex(),Lb=T("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,Gr).replace(/punctSpace/g,os).replace(/punct/g,Rt).getRegex(),jb=T(/^~~?(?:((?!~)punct)|[^\s~])/,"u").replace(/punct/g,Rt).getRegex(),Fb="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",Ub=T(Fb,"gu").replace(/notPunctSpace/g,Gr).replace(/punctSpace/g,os).replace(/punct/g,Rt).getRegex(),zb=T(/\\(punct)/,"gu").replace(/punct/g,Rt).getRegex(),Bb=T(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Nb=T(Kr).replace("(?:-->|$)","-->").getRegex(),Hb=T("^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment",Nb).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),Fi=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/,qb=T(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label",Fi).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),_l=T(/^!?\[(label)\]\[(ref)\]/).replace("label",Fi).replace("ref",qr).getRegex(),Ll=T(/^!?\[(ref)\](?:\[\])?/).replace("ref",qr).getRegex(),Kb=T("reflink|nolink(?!\\()","g").replace("reflink",_l).replace("nolink",Ll).getRegex(),Ln=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,Jr={_backpedal:nt,anyPunctuation:zb,autolink:Bb,blockSkip:Eb,br:El,code:Ib,del:nt,delLDelim:nt,delRDelim:nt,emStrongLDelim:Db,emStrongRDelimAst:Ob,emStrongRDelimUnd:Lb,escape:Cb,link:qb,nolink:Ll,punctuation:Ab,reflink:_l,reflinkSearch:Kb,tag:Hb,text:Rb,url:nt},Vb={...Jr,link:T(/^!?\[(label)\]\((.*?)\)/).replace("label",Fi).getRegex(),reflink:T(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Fi).getRegex()},tr={...Jr,emStrongRDelimAst:_b,emStrongLDelim:Wb,delLDelim:jb,delRDelim:Ub,url:T(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",Ln).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:T(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/).replace("protocol",Ln).getRegex()},Gb={...tr,br:T(El).replace("{2,}","*").getRegex(),text:T(tr.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()},li={normal:Vr,gfm:$b,pedantic:Pb},jt={normal:Jr,gfm:tr,breaks:Gb,pedantic:Vb},Jb={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},jn=e=>Jb[e];function We(e,t){if(t){if(X.escapeTest.test(e))return e.replace(X.escapeReplace,jn)}else if(X.escapeTestNoEncode.test(e))return e.replace(X.escapeReplaceNoEncode,jn);return e}function Fn(e){try{e=encodeURI(e).replace(X.percentDecode,"%")}catch{return null}return e}function Un(e,t){let i=e.replace(X.findPipe,(o,n,a)=>{let c=!1,p=n;for(;--p>=0&&a[p]==="\\";)c=!c;return c?"|":" |"}),s=i.split(X.splitPipe),r=0;if(s[0].trim()||s.shift(),s.length>0&&!s.at(-1)?.trim()&&s.pop(),t)if(s.length>t)s.splice(t);else for(;s.length<t;)s.push("");for(;r<s.length;r++)s[r]=s[r].trim().replace(X.slashPipe,"|");return s}function Qe(e,t,i){let s=e.length;if(s===0)return"";let r=0;for(;r<s&&e.charAt(s-r-1)===t;)r++;return e.slice(0,s-r)}function zn(e){let t=e.split(`
936
937
  `),i=t.length-1;for(;i>=0&&X.blankLine.test(t[i]);)i--;return t.length-i<=2?e:t.slice(0,i+1).join(`
937
- `)}function Jb(e,t){if(e.indexOf(t[1])===-1)return-1;let i=0;for(let s=0;s<e.length;s++)if(e[s]==="\\")s++;else if(e[s]===t[0])i++;else if(e[s]===t[1]&&(i--,i<0))return s;return i>0?-2:-1}function Qb(e,t=0){let i=t,s="";for(let r of e)if(r===" "){let o=4-i%4;s+=" ".repeat(o),i+=o}else s+=r,i++;return s}function Bn(e,t,i,s,r){let o=t.href,n=t.title||null,a=e[1].replace(r.other.outputLinkReplace,"$1");s.state.inLink=!0;let c={type:e[0].charAt(0)==="!"?"image":"link",raw:i,href:o,title:n,text:a,tokens:s.inlineTokens(a)};return s.state.inLink=!1,c}function Zb(e,t,i){let s=e.match(i.other.indentCodeCompensation);if(s===null)return t;let r=s[1];return t.split(`
938
+ `)}function Qb(e,t){if(e.indexOf(t[1])===-1)return-1;let i=0;for(let s=0;s<e.length;s++)if(e[s]==="\\")s++;else if(e[s]===t[0])i++;else if(e[s]===t[1]&&(i--,i<0))return s;return i>0?-2:-1}function Zb(e,t=0){let i=t,s="";for(let r of e)if(r===" "){let o=4-i%4;s+=" ".repeat(o),i+=o}else s+=r,i++;return s}function Bn(e,t,i,s,r){let o=t.href,n=t.title||null,a=e[1].replace(r.other.outputLinkReplace,"$1");s.state.inLink=!0;let c={type:e[0].charAt(0)==="!"?"image":"link",raw:i,href:o,title:n,text:a,tokens:s.inlineTokens(a)};return s.state.inLink=!1,c}function Xb(e,t,i){let s=e.match(i.other.indentCodeCompensation);if(s===null)return t;let r=s[1];return t.split(`
938
939
  `).map(o=>{let n=o.match(i.other.beginningSpace);if(n===null)return o;let[a]=n;return a.length>=r.length?o.slice(r.length):o}).join(`
939
- `)}var Ui=class{options;rules;lexer;constructor(e){this.options=e||ht}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:"space",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let i=this.options.pedantic?t[0]:zn(t[0]),s=i.replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:i,codeBlockStyle:"indented",text:s}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let i=t[0],s=Zb(i,t[3]||"",this.rules);return{type:"code",raw:i,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:s}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let i=t[2].trim();if(this.rules.other.endingHash.test(i)){let s=Qe(i,"#");(this.options.pedantic||!s||this.rules.other.endingSpaceChar.test(s))&&(i=s.trim())}return{type:"heading",raw:Qe(t[0],`
940
+ `)}var Ui=class{options;rules;lexer;constructor(e){this.options=e||ht}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:"space",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let i=this.options.pedantic?t[0]:zn(t[0]),s=i.replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:i,codeBlockStyle:"indented",text:s}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let i=t[0],s=Xb(i,t[3]||"",this.rules);return{type:"code",raw:i,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:s}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let i=t[2].trim();if(this.rules.other.endingHash.test(i)){let s=Qe(i,"#");(this.options.pedantic||!s||this.rules.other.endingSpaceChar.test(s))&&(i=s.trim())}return{type:"heading",raw:Qe(t[0],`
940
941
  `),depth:t[1].length,text:i,tokens:this.lexer.inline(i)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:Qe(t[0],`
941
942
  `)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let i=Qe(t[0],`
942
943
  `).split(`
@@ -949,7 +950,7 @@ ${u}`:u;let h=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTo
949
950
  `),I=this.blockquote(P);o[o.length-1]=I,s=s.substring(0,s.length-w.raw.length)+I.raw,r=r.substring(0,r.length-w.text.length)+I.text;break}else if(g?.type==="list"){let w=g,P=w.raw+`
950
951
  `+i.join(`
951
952
  `),I=this.list(P);o[o.length-1]=I,s=s.substring(0,s.length-g.raw.length)+I.raw,r=r.substring(0,r.length-w.raw.length)+I.raw,i=P.substring(o.at(-1).raw.length).split(`
952
- `);continue}}return{type:"blockquote",raw:s,tokens:o,text:r}}}list(e){let t=this.rules.block.list.exec(e);if(t){let i=t[1].trim(),s=i.length>1,r={type:"list",raw:"",ordered:s,start:s?+i.slice(0,-1):"",loose:!1,items:[]};i=s?`\\d{1,9}\\${i.slice(-1)}`:`\\${i}`,this.options.pedantic&&(i=s?i:"[*+-]");let o=this.rules.other.listItemRegex(i),n=!1;for(;e;){let c=!1,p="",u="";if(!(t=o.exec(e))||this.rules.block.hr.test(e))break;p=t[0],e=e.substring(p.length);let h=Qb(t[2].split(`
953
+ `);continue}}return{type:"blockquote",raw:s,tokens:o,text:r}}}list(e){let t=this.rules.block.list.exec(e);if(t){let i=t[1].trim(),s=i.length>1,r={type:"list",raw:"",ordered:s,start:s?+i.slice(0,-1):"",loose:!1,items:[]};i=s?`\\d{1,9}\\${i.slice(-1)}`:`\\${i}`,this.options.pedantic&&(i=s?i:"[*+-]");let o=this.rules.other.listItemRegex(i),n=!1;for(;e;){let c=!1,p="",u="";if(!(t=o.exec(e))||this.rules.block.hr.test(e))break;p=t[0],e=e.substring(p.length);let h=Zb(t[2].split(`
953
954
  `,1)[0],t[1].length),g=e.split(`
954
955
  `,1)[0],w=!h.trim(),P=0;if(this.options.pedantic?(P=2,u=h.trimStart()):w?P=t[1].length+1:(P=h.search(this.rules.other.nonSpaceChar),P=P>4?1:P,u=h.slice(P),P+=t[1].length),w&&this.rules.other.blankLine.test(g)&&(p+=g+`
955
956
  `,e=e.substring(g.length+1),c=!0),!c){let I=this.rules.other.nextBulletRegex(P),V=this.rules.other.hrRegex(P),Je=this.rules.other.fencesBeginRegex(P),Yr=this.rules.other.headingBeginRegex(P),Xl=this.rules.other.htmlBeginRegex(P),Yl=this.rules.other.blockquoteBeginRegex(P);for(;e;){let ps=e.split(`
@@ -961,7 +962,7 @@ ${u}`:u;let h=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTo
961
962
  `):[],o={type:"table",raw:Qe(t[0],`
962
963
  `),header:[],align:[],rows:[]};if(i.length===s.length){for(let n of s)this.rules.other.tableAlignRight.test(n)?o.align.push("right"):this.rules.other.tableAlignCenter.test(n)?o.align.push("center"):this.rules.other.tableAlignLeft.test(n)?o.align.push("left"):o.align.push(null);for(let n=0;n<i.length;n++)o.header.push({text:i[n],tokens:this.lexer.inline(i[n]),header:!0,align:o.align[n]});for(let n of r)o.rows.push(Un(n,o.header.length).map((a,c)=>({text:a,tokens:this.lexer.inline(a),header:!1,align:o.align[c]})));return o}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t){let i=t[1].trim();return{type:"heading",raw:Qe(t[0],`
963
964
  `),depth:t[2].charAt(0)==="="?1:2,text:i,tokens:this.lexer.inline(i)}}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let i=t[1].charAt(t[1].length-1)===`
964
- `?t[1].slice(0,-1):t[1];return{type:"paragraph",raw:t[0],text:i,tokens:this.lexer.inline(i)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:"text",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let i=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(i)){if(!this.rules.other.endAngleBracket.test(i))return;let o=Qe(i.slice(0,-1),"\\");if((i.length-o.length)%2===0)return}else{let o=Jb(t[2],"()");if(o===-2)return;if(o>-1){let n=(t[0].indexOf("!")===0?5:4)+t[1].length+o;t[2]=t[2].substring(0,o),t[0]=t[0].substring(0,n).trim(),t[3]=""}}let s=t[2],r="";if(this.options.pedantic){let o=this.rules.other.pedanticHrefTitle.exec(s);o&&(s=o[1],r=o[3])}else r=t[3]?t[3].slice(1,-1):"";return s=s.trim(),this.rules.other.startAngleBracket.test(s)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(i)?s=s.slice(1):s=s.slice(1,-1)),Bn(t,{href:s&&s.replace(this.rules.inline.anyPunctuation,"$1"),title:r&&r.replace(this.rules.inline.anyPunctuation,"$1")},t[0],this.lexer,this.rules)}}reflink(e,t){let i;if((i=this.rules.inline.reflink.exec(e))||(i=this.rules.inline.nolink.exec(e))){let s=(i[2]||i[1]).replace(this.rules.other.multipleSpaceGlobal," "),r=t[s.toLowerCase()];if(!r){let o=i[0].charAt(0);return{type:"text",raw:o,text:o}}return Bn(i,r,i[0],this.lexer,this.rules)}}emStrong(e,t,i=""){let s=this.rules.inline.emStrongLDelim.exec(e);if(!(!s||!s[1]&&!s[2]&&!s[3]&&!s[4]||s[4]&&i.match(this.rules.other.unicodeAlphaNumeric))&&(!(s[1]||s[3])||!i||this.rules.inline.punctuation.exec(i))){let r=[...s[0]].length-1,o,n,a=r,c=0,p=s[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(p.lastIndex=0,t=t.slice(-1*e.length+r);(s=p.exec(t))!==null;){if(o=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!o)continue;if(n=[...o].length,s[3]||s[4]){a+=n;continue}else if((s[5]||s[6])&&r%3&&!((r+n)%3)){c+=n;continue}if(a-=n,a>0)continue;n=Math.min(n,n+a+c);let u=[...s[0]][0].length,h=e.slice(0,r+s.index+u+n);if(Math.min(r,n)%2){let w=h.slice(1,-1);return{type:"em",raw:h,text:w,tokens:this.lexer.inlineTokens(w)}}let g=h.slice(2,-2);return{type:"strong",raw:h,text:g,tokens:this.lexer.inlineTokens(g)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let i=t[2].replace(this.rules.other.newLineCharGlobal," "),s=this.rules.other.nonSpaceChar.test(i),r=this.rules.other.startingSpaceChar.test(i)&&this.rules.other.endingSpaceChar.test(i);return s&&r&&(i=i.substring(1,i.length-1)),{type:"codespan",raw:t[0],text:i}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}del(e,t,i=""){let s=this.rules.inline.delLDelim.exec(e);if(s&&(!s[1]||!i||this.rules.inline.punctuation.exec(i))){let r=[...s[0]].length-1,o,n,a=r,c=this.rules.inline.delRDelim;for(c.lastIndex=0,t=t.slice(-1*e.length+r);(s=c.exec(t))!==null;){if(o=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!o||(n=[...o].length,n!==r))continue;if(s[3]||s[4]){a+=n;continue}if(a-=n,a>0)continue;n=Math.min(n,n+a);let p=[...s[0]][0].length,u=e.slice(0,r+s.index+p+n),h=u.slice(r,-r);return{type:"del",raw:u,text:h,tokens:this.lexer.inlineTokens(h)}}}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let i,s;return t[2]==="@"?(i=t[1],s="mailto:"+i):(i=t[1],s=i),{type:"link",raw:t[0],text:i,href:s,tokens:[{type:"text",raw:i,text:i}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let i,s;if(t[2]==="@")i=t[0],s="mailto:"+i;else{let r;do r=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??"";while(r!==t[0]);i=t[0],t[1]==="www."?s="http://"+t[0]:s=t[0]}return{type:"link",raw:t[0],text:i,href:s,tokens:[{type:"text",raw:i,text:i}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let i=this.lexer.state.inRawBlock;return{type:"text",raw:t[0],text:t[0],escaped:i}}}},Re=class ir{tokens;options;state;inlineQueue;tokenizer;constructor(t){this.tokens=[],this.tokens.links=Object.create(null),this.options=t||ht,this.options.tokenizer=this.options.tokenizer||new Ui,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let i={other:X,block:li.normal,inline:jt.normal};this.options.pedantic?(i.block=li.pedantic,i.inline=jt.pedantic):this.options.gfm&&(i.block=li.gfm,this.options.breaks?i.inline=jt.breaks:i.inline=jt.gfm),this.tokenizer.rules=i}static get rules(){return{block:li,inline:jt}}static lex(t,i){return new ir(i).lex(t)}static lexInline(t,i){return new ir(i).inlineTokens(t)}lex(t){t=t.replace(X.carriageReturn,`
965
+ `?t[1].slice(0,-1):t[1];return{type:"paragraph",raw:t[0],text:i,tokens:this.lexer.inline(i)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:"text",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let i=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(i)){if(!this.rules.other.endAngleBracket.test(i))return;let o=Qe(i.slice(0,-1),"\\");if((i.length-o.length)%2===0)return}else{let o=Qb(t[2],"()");if(o===-2)return;if(o>-1){let n=(t[0].indexOf("!")===0?5:4)+t[1].length+o;t[2]=t[2].substring(0,o),t[0]=t[0].substring(0,n).trim(),t[3]=""}}let s=t[2],r="";if(this.options.pedantic){let o=this.rules.other.pedanticHrefTitle.exec(s);o&&(s=o[1],r=o[3])}else r=t[3]?t[3].slice(1,-1):"";return s=s.trim(),this.rules.other.startAngleBracket.test(s)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(i)?s=s.slice(1):s=s.slice(1,-1)),Bn(t,{href:s&&s.replace(this.rules.inline.anyPunctuation,"$1"),title:r&&r.replace(this.rules.inline.anyPunctuation,"$1")},t[0],this.lexer,this.rules)}}reflink(e,t){let i;if((i=this.rules.inline.reflink.exec(e))||(i=this.rules.inline.nolink.exec(e))){let s=(i[2]||i[1]).replace(this.rules.other.multipleSpaceGlobal," "),r=t[s.toLowerCase()];if(!r){let o=i[0].charAt(0);return{type:"text",raw:o,text:o}}return Bn(i,r,i[0],this.lexer,this.rules)}}emStrong(e,t,i=""){let s=this.rules.inline.emStrongLDelim.exec(e);if(!(!s||!s[1]&&!s[2]&&!s[3]&&!s[4]||s[4]&&i.match(this.rules.other.unicodeAlphaNumeric))&&(!(s[1]||s[3])||!i||this.rules.inline.punctuation.exec(i))){let r=[...s[0]].length-1,o,n,a=r,c=0,p=s[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(p.lastIndex=0,t=t.slice(-1*e.length+r);(s=p.exec(t))!==null;){if(o=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!o)continue;if(n=[...o].length,s[3]||s[4]){a+=n;continue}else if((s[5]||s[6])&&r%3&&!((r+n)%3)){c+=n;continue}if(a-=n,a>0)continue;n=Math.min(n,n+a+c);let u=[...s[0]][0].length,h=e.slice(0,r+s.index+u+n);if(Math.min(r,n)%2){let w=h.slice(1,-1);return{type:"em",raw:h,text:w,tokens:this.lexer.inlineTokens(w)}}let g=h.slice(2,-2);return{type:"strong",raw:h,text:g,tokens:this.lexer.inlineTokens(g)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let i=t[2].replace(this.rules.other.newLineCharGlobal," "),s=this.rules.other.nonSpaceChar.test(i),r=this.rules.other.startingSpaceChar.test(i)&&this.rules.other.endingSpaceChar.test(i);return s&&r&&(i=i.substring(1,i.length-1)),{type:"codespan",raw:t[0],text:i}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}del(e,t,i=""){let s=this.rules.inline.delLDelim.exec(e);if(s&&(!s[1]||!i||this.rules.inline.punctuation.exec(i))){let r=[...s[0]].length-1,o,n,a=r,c=this.rules.inline.delRDelim;for(c.lastIndex=0,t=t.slice(-1*e.length+r);(s=c.exec(t))!==null;){if(o=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!o||(n=[...o].length,n!==r))continue;if(s[3]||s[4]){a+=n;continue}if(a-=n,a>0)continue;n=Math.min(n,n+a);let p=[...s[0]][0].length,u=e.slice(0,r+s.index+p+n),h=u.slice(r,-r);return{type:"del",raw:u,text:h,tokens:this.lexer.inlineTokens(h)}}}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let i,s;return t[2]==="@"?(i=t[1],s="mailto:"+i):(i=t[1],s=i),{type:"link",raw:t[0],text:i,href:s,tokens:[{type:"text",raw:i,text:i}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let i,s;if(t[2]==="@")i=t[0],s="mailto:"+i;else{let r;do r=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??"";while(r!==t[0]);i=t[0],t[1]==="www."?s="http://"+t[0]:s=t[0]}return{type:"link",raw:t[0],text:i,href:s,tokens:[{type:"text",raw:i,text:i}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let i=this.lexer.state.inRawBlock;return{type:"text",raw:t[0],text:t[0],escaped:i}}}},Re=class ir{tokens;options;state;inlineQueue;tokenizer;constructor(t){this.tokens=[],this.tokens.links=Object.create(null),this.options=t||ht,this.options.tokenizer=this.options.tokenizer||new Ui,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let i={other:X,block:li.normal,inline:jt.normal};this.options.pedantic?(i.block=li.pedantic,i.inline=jt.pedantic):this.options.gfm&&(i.block=li.gfm,this.options.breaks?i.inline=jt.breaks:i.inline=jt.gfm),this.tokenizer.rules=i}static get rules(){return{block:li,inline:jt}}static lex(t,i){return new ir(i).lex(t)}static lexInline(t,i){return new ir(i).inlineTokens(t)}lex(t){t=t.replace(X.carriageReturn,`
965
966
  `),this.blockTokens(t,this.tokens);for(let i=0;i<this.inlineQueue.length;i++){let s=this.inlineQueue[i];this.inlineTokens(s.src,s.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(t,i=[],s=!1){this.tokenizer.lexer=this,this.options.pedantic&&(t=t.replace(X.tabCharGlobal," ").replace(X.spaceLine,""));let r=1/0;for(;t;){if(t.length<r)r=t.length;else{this.infiniteLoopError(t.charCodeAt(0));break}let o;if(this.options.extensions?.block?.some(a=>(o=a.call({lexer:this},t,i))?(t=t.substring(o.raw.length),i.push(o),!0):!1))continue;if(o=this.tokenizer.space(t)){t=t.substring(o.raw.length);let a=i.at(-1);o.raw.length===1&&a!==void 0?a.raw+=`
966
967
  `:i.push(o);continue}if(o=this.tokenizer.code(t)){t=t.substring(o.raw.length);let a=i.at(-1);a?.type==="paragraph"||a?.type==="text"?(a.raw+=(a.raw.endsWith(`
967
968
  `)?"":`
@@ -993,8 +994,8 @@ ${this.parser.parse(e)}</blockquote>
993
994
  `}tablerow({text:e}){return`<tr>
994
995
  ${e}</tr>
995
996
  `}tablecell(e){let t=this.parser.parseInline(e.tokens),i=e.header?"th":"td";return(e.align?`<${i} align="${e.align}">`:`<${i}>`)+t+`</${i}>
996
- `}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${We(e,!0)}</code>`}br(e){return"<br>"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,tokens:i}){let s=this.parser.parseInline(i),r=Fn(e);if(r===null)return s;e=r;let o='<a href="'+e+'"';return t&&(o+=' title="'+We(t)+'"'),o+=">"+s+"</a>",o}image({href:e,title:t,text:i,tokens:s}){s&&(i=this.parser.parseInline(s,this.parser.textRenderer));let r=Fn(e);if(r===null)return We(i);e=r;let o=`<img src="${e}" alt="${We(i)}"`;return t&&(o+=` title="${We(t)}"`),o+=">",o}text(e){return"tokens"in e&&e.tokens?this.parser.parseInline(e.tokens):"escaped"in e&&e.escaped?e.text:We(e.text)}},Qr=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return""+e}image({text:e}){return""+e}br(){return""}checkbox({raw:e}){return e}},Ae=class sr{options;renderer;textRenderer;constructor(t){this.options=t||ht,this.options.renderer=this.options.renderer||new zi,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new Qr}static parse(t,i){return new sr(i).parse(t)}static parseInline(t,i){return new sr(i).parseInline(t)}parse(t){this.renderer.parser=this;let i="";for(let s=0;s<t.length;s++){let r=t[s];if(this.options.extensions?.renderers?.[r.type]){let n=r,a=this.options.extensions.renderers[n.type].call({parser:this},n);if(a!==!1||!["space","hr","heading","code","table","blockquote","list","html","def","paragraph","text"].includes(n.type)){i+=a||"";continue}}let o=r;switch(o.type){case"space":{i+=this.renderer.space(o);break}case"hr":{i+=this.renderer.hr(o);break}case"heading":{i+=this.renderer.heading(o);break}case"code":{i+=this.renderer.code(o);break}case"table":{i+=this.renderer.table(o);break}case"blockquote":{i+=this.renderer.blockquote(o);break}case"list":{i+=this.renderer.list(o);break}case"checkbox":{i+=this.renderer.checkbox(o);break}case"html":{i+=this.renderer.html(o);break}case"def":{i+=this.renderer.def(o);break}case"paragraph":{i+=this.renderer.paragraph(o);break}case"text":{i+=this.renderer.text(o);break}default:{let n='Token with "'+o.type+'" type was not found.';if(this.options.silent)return console.error(n),"";throw new Error(n)}}}return i}parseInline(t,i=this.renderer){this.renderer.parser=this;let s="";for(let r=0;r<t.length;r++){let o=t[r];if(this.options.extensions?.renderers?.[o.type]){let a=this.options.extensions.renderers[o.type].call({parser:this},o);if(a!==!1||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(o.type)){s+=a||"";continue}}let n=o;switch(n.type){case"escape":{s+=i.text(n);break}case"html":{s+=i.html(n);break}case"link":{s+=i.link(n);break}case"image":{s+=i.image(n);break}case"checkbox":{s+=i.checkbox(n);break}case"strong":{s+=i.strong(n);break}case"em":{s+=i.em(n);break}case"codespan":{s+=i.codespan(n);break}case"br":{s+=i.br(n);break}case"del":{s+=i.del(n);break}case"text":{s+=i.text(n);break}default:{let a='Token with "'+n.type+'" type was not found.';if(this.options.silent)return console.error(a),"";throw new Error(a)}}}return s}},zt=class{options;block;constructor(e){this.options=e||ht}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens","emStrongMask"]);static passThroughHooksRespectAsync=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(e=this.block){return e?Re.lex:Re.lexInline}provideParser(e=this.block){return e?Ae.parse:Ae.parseInline}},Xb=class{defaults=Br();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=Ae;Renderer=zi;TextRenderer=Qr;Lexer=Re;Tokenizer=Ui;Hooks=zt;constructor(...e){this.use(...e)}walkTokens(e,t){let i=[];for(let s of e)switch(i=i.concat(t.call(this,s)),s.type){case"table":{let r=s;for(let o of r.header)i=i.concat(this.walkTokens(o.tokens,t));for(let o of r.rows)for(let n of o)i=i.concat(this.walkTokens(n.tokens,t));break}case"list":{let r=s;i=i.concat(this.walkTokens(r.items,t));break}default:{let r=s;this.defaults.extensions?.childTokens?.[r.type]?this.defaults.extensions.childTokens[r.type].forEach(o=>{let n=r[o].flat(1/0);i=i.concat(this.walkTokens(n,t))}):r.tokens&&(i=i.concat(this.walkTokens(r.tokens,t)))}}return i}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(i=>{let s={...i};if(s.async=this.defaults.async||s.async||!1,i.extensions&&(i.extensions.forEach(r=>{if(!r.name)throw new Error("extension name required");if("renderer"in r){let o=t.renderers[r.name];o?t.renderers[r.name]=function(...n){let a=r.renderer.apply(this,n);return a===!1&&(a=o.apply(this,n)),a}:t.renderers[r.name]=r.renderer}if("tokenizer"in r){if(!r.level||r.level!=="block"&&r.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let o=t[r.level];o?o.unshift(r.tokenizer):t[r.level]=[r.tokenizer],r.start&&(r.level==="block"?t.startBlock?t.startBlock.push(r.start):t.startBlock=[r.start]:r.level==="inline"&&(t.startInline?t.startInline.push(r.start):t.startInline=[r.start]))}"childTokens"in r&&r.childTokens&&(t.childTokens[r.name]=r.childTokens)}),s.extensions=t),i.renderer){let r=this.defaults.renderer||new zi(this.defaults);for(let o in i.renderer){if(!(o in r))throw new Error(`renderer '${o}' does not exist`);if(["options","parser"].includes(o))continue;let n=o,a=i.renderer[n],c=r[n];r[n]=(...p)=>{let u=a.apply(r,p);return u===!1&&(u=c.apply(r,p)),u||""}}s.renderer=r}if(i.tokenizer){let r=this.defaults.tokenizer||new Ui(this.defaults);for(let o in i.tokenizer){if(!(o in r))throw new Error(`tokenizer '${o}' does not exist`);if(["options","rules","lexer"].includes(o))continue;let n=o,a=i.tokenizer[n],c=r[n];r[n]=(...p)=>{let u=a.apply(r,p);return u===!1&&(u=c.apply(r,p)),u}}s.tokenizer=r}if(i.hooks){let r=this.defaults.hooks||new zt;for(let o in i.hooks){if(!(o in r))throw new Error(`hook '${o}' does not exist`);if(["options","block"].includes(o))continue;let n=o,a=i.hooks[n],c=r[n];zt.passThroughHooks.has(o)?r[n]=p=>{if(this.defaults.async&&zt.passThroughHooksRespectAsync.has(o))return(async()=>{let h=await a.call(r,p);return c.call(r,h)})();let u=a.call(r,p);return c.call(r,u)}:r[n]=(...p)=>{if(this.defaults.async)return(async()=>{let h=await a.apply(r,p);return h===!1&&(h=await c.apply(r,p)),h})();let u=a.apply(r,p);return u===!1&&(u=c.apply(r,p)),u}}s.hooks=r}if(i.walkTokens){let r=this.defaults.walkTokens,o=i.walkTokens;s.walkTokens=function(n){let a=[];return a.push(o.call(this,n)),r&&(a=a.concat(r.call(this,n))),a}}this.defaults={...this.defaults,...s}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return Re.lex(e,t??this.defaults)}parser(e,t){return Ae.parse(e,t??this.defaults)}parseMarkdown(e){return(t,i)=>{let s={...i},r={...this.defaults,...s},o=this.onError(!!r.silent,!!r.async);if(this.defaults.async===!0&&s.async===!1)return o(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof t>"u"||t===null)return o(new Error("marked(): input parameter is undefined or null"));if(typeof t!="string")return o(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(t)+", string expected"));if(r.hooks&&(r.hooks.options=r,r.hooks.block=e),r.async)return(async()=>{let n=r.hooks?await r.hooks.preprocess(t):t,a=await(r.hooks?await r.hooks.provideLexer(e):e?Re.lex:Re.lexInline)(n,r),c=r.hooks?await r.hooks.processAllTokens(a):a;r.walkTokens&&await Promise.all(this.walkTokens(c,r.walkTokens));let p=await(r.hooks?await r.hooks.provideParser(e):e?Ae.parse:Ae.parseInline)(c,r);return r.hooks?await r.hooks.postprocess(p):p})().catch(o);try{r.hooks&&(t=r.hooks.preprocess(t));let n=(r.hooks?r.hooks.provideLexer(e):e?Re.lex:Re.lexInline)(t,r);r.hooks&&(n=r.hooks.processAllTokens(n)),r.walkTokens&&this.walkTokens(n,r.walkTokens);let a=(r.hooks?r.hooks.provideParser(e):e?Ae.parse:Ae.parseInline)(n,r);return r.hooks&&(a=r.hooks.postprocess(a)),a}catch(n){return o(n)}}}onError(e,t){return i=>{if(i.message+=`
997
- Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error occurred:</p><pre>"+We(i.message+"",!0)+"</pre>";return t?Promise.resolve(s):s}if(t)return Promise.reject(i);throw i}}},dt=new Xb;function O(e,t){return dt.parse(e,t)}O.options=O.setOptions=function(e){return dt.setOptions(e),O.defaults=dt.defaults,Rl(O.defaults),O};O.getDefaults=Br;O.defaults=ht;O.use=function(...e){return dt.use(...e),O.defaults=dt.defaults,Rl(O.defaults),O};O.walkTokens=function(e,t){return dt.walkTokens(e,t)};O.parseInline=dt.parseInline;O.Parser=Ae;O.parser=Ae.parse;O.Renderer=zi;O.TextRenderer=Qr;O.Lexer=Re;O.lexer=Re.lex;O.Tokenizer=Ui;O.Hooks=zt;O.parse=O;O.options;O.setOptions;O.use;O.walkTokens;O.parseInline;Ae.parse;Re.lex;const jl=new O.Renderer;jl.html=({text:e})=>tw(e);const Yb=300,Ft=new Map;function ew(e){const t=Ft.get(e);if(t!==void 0)return t;const i=O.parse(e,{async:!1,breaks:!0,gfm:!0,renderer:jl}),s=iw(i);if(Ft.set(e,s),Ft.size>Yb){const r=Ft.keys().next().value;r!==void 0&&Ft.delete(r)}return s}function tw(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;")}function iw(e){const t=document.createElement("template");return t.innerHTML=e,t.content.querySelectorAll("script, style, iframe, object, embed").forEach(i=>{i.remove()}),t.content.querySelectorAll("*").forEach(i=>{for(const s of[...i.attributes]){const r=s.name.toLowerCase();r.startsWith("on")&&i.removeAttribute(s.name),(r==="href"||r==="src")&&!sw(s.value)&&i.removeAttribute(s.name)}i.tagName==="A"&&(i.setAttribute("target","_blank"),i.setAttribute("rel","noreferrer noopener"))}),t.innerHTML}function sw(e){if(e.startsWith("#")||e.startsWith("/"))return!0;try{return["http:","https:","mailto:"].includes(new URL(e).protocol)}catch{return!1}}var rw=Object.defineProperty,ow=Object.getOwnPropertyDescriptor,Fl=(e,t,i,s)=>{for(var r=s>1?void 0:s?ow(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&rw(t,i,r),r};const nw=E`
997
+ `}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${We(e,!0)}</code>`}br(e){return"<br>"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,tokens:i}){let s=this.parser.parseInline(i),r=Fn(e);if(r===null)return s;e=r;let o='<a href="'+e+'"';return t&&(o+=' title="'+We(t)+'"'),o+=">"+s+"</a>",o}image({href:e,title:t,text:i,tokens:s}){s&&(i=this.parser.parseInline(s,this.parser.textRenderer));let r=Fn(e);if(r===null)return We(i);e=r;let o=`<img src="${e}" alt="${We(i)}"`;return t&&(o+=` title="${We(t)}"`),o+=">",o}text(e){return"tokens"in e&&e.tokens?this.parser.parseInline(e.tokens):"escaped"in e&&e.escaped?e.text:We(e.text)}},Qr=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return""+e}image({text:e}){return""+e}br(){return""}checkbox({raw:e}){return e}},Ae=class sr{options;renderer;textRenderer;constructor(t){this.options=t||ht,this.options.renderer=this.options.renderer||new zi,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new Qr}static parse(t,i){return new sr(i).parse(t)}static parseInline(t,i){return new sr(i).parseInline(t)}parse(t){this.renderer.parser=this;let i="";for(let s=0;s<t.length;s++){let r=t[s];if(this.options.extensions?.renderers?.[r.type]){let n=r,a=this.options.extensions.renderers[n.type].call({parser:this},n);if(a!==!1||!["space","hr","heading","code","table","blockquote","list","html","def","paragraph","text"].includes(n.type)){i+=a||"";continue}}let o=r;switch(o.type){case"space":{i+=this.renderer.space(o);break}case"hr":{i+=this.renderer.hr(o);break}case"heading":{i+=this.renderer.heading(o);break}case"code":{i+=this.renderer.code(o);break}case"table":{i+=this.renderer.table(o);break}case"blockquote":{i+=this.renderer.blockquote(o);break}case"list":{i+=this.renderer.list(o);break}case"checkbox":{i+=this.renderer.checkbox(o);break}case"html":{i+=this.renderer.html(o);break}case"def":{i+=this.renderer.def(o);break}case"paragraph":{i+=this.renderer.paragraph(o);break}case"text":{i+=this.renderer.text(o);break}default:{let n='Token with "'+o.type+'" type was not found.';if(this.options.silent)return console.error(n),"";throw new Error(n)}}}return i}parseInline(t,i=this.renderer){this.renderer.parser=this;let s="";for(let r=0;r<t.length;r++){let o=t[r];if(this.options.extensions?.renderers?.[o.type]){let a=this.options.extensions.renderers[o.type].call({parser:this},o);if(a!==!1||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(o.type)){s+=a||"";continue}}let n=o;switch(n.type){case"escape":{s+=i.text(n);break}case"html":{s+=i.html(n);break}case"link":{s+=i.link(n);break}case"image":{s+=i.image(n);break}case"checkbox":{s+=i.checkbox(n);break}case"strong":{s+=i.strong(n);break}case"em":{s+=i.em(n);break}case"codespan":{s+=i.codespan(n);break}case"br":{s+=i.br(n);break}case"del":{s+=i.del(n);break}case"text":{s+=i.text(n);break}default:{let a='Token with "'+n.type+'" type was not found.';if(this.options.silent)return console.error(a),"";throw new Error(a)}}}return s}},zt=class{options;block;constructor(e){this.options=e||ht}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens","emStrongMask"]);static passThroughHooksRespectAsync=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(e=this.block){return e?Re.lex:Re.lexInline}provideParser(e=this.block){return e?Ae.parse:Ae.parseInline}},Yb=class{defaults=Br();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=Ae;Renderer=zi;TextRenderer=Qr;Lexer=Re;Tokenizer=Ui;Hooks=zt;constructor(...e){this.use(...e)}walkTokens(e,t){let i=[];for(let s of e)switch(i=i.concat(t.call(this,s)),s.type){case"table":{let r=s;for(let o of r.header)i=i.concat(this.walkTokens(o.tokens,t));for(let o of r.rows)for(let n of o)i=i.concat(this.walkTokens(n.tokens,t));break}case"list":{let r=s;i=i.concat(this.walkTokens(r.items,t));break}default:{let r=s;this.defaults.extensions?.childTokens?.[r.type]?this.defaults.extensions.childTokens[r.type].forEach(o=>{let n=r[o].flat(1/0);i=i.concat(this.walkTokens(n,t))}):r.tokens&&(i=i.concat(this.walkTokens(r.tokens,t)))}}return i}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(i=>{let s={...i};if(s.async=this.defaults.async||s.async||!1,i.extensions&&(i.extensions.forEach(r=>{if(!r.name)throw new Error("extension name required");if("renderer"in r){let o=t.renderers[r.name];o?t.renderers[r.name]=function(...n){let a=r.renderer.apply(this,n);return a===!1&&(a=o.apply(this,n)),a}:t.renderers[r.name]=r.renderer}if("tokenizer"in r){if(!r.level||r.level!=="block"&&r.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let o=t[r.level];o?o.unshift(r.tokenizer):t[r.level]=[r.tokenizer],r.start&&(r.level==="block"?t.startBlock?t.startBlock.push(r.start):t.startBlock=[r.start]:r.level==="inline"&&(t.startInline?t.startInline.push(r.start):t.startInline=[r.start]))}"childTokens"in r&&r.childTokens&&(t.childTokens[r.name]=r.childTokens)}),s.extensions=t),i.renderer){let r=this.defaults.renderer||new zi(this.defaults);for(let o in i.renderer){if(!(o in r))throw new Error(`renderer '${o}' does not exist`);if(["options","parser"].includes(o))continue;let n=o,a=i.renderer[n],c=r[n];r[n]=(...p)=>{let u=a.apply(r,p);return u===!1&&(u=c.apply(r,p)),u||""}}s.renderer=r}if(i.tokenizer){let r=this.defaults.tokenizer||new Ui(this.defaults);for(let o in i.tokenizer){if(!(o in r))throw new Error(`tokenizer '${o}' does not exist`);if(["options","rules","lexer"].includes(o))continue;let n=o,a=i.tokenizer[n],c=r[n];r[n]=(...p)=>{let u=a.apply(r,p);return u===!1&&(u=c.apply(r,p)),u}}s.tokenizer=r}if(i.hooks){let r=this.defaults.hooks||new zt;for(let o in i.hooks){if(!(o in r))throw new Error(`hook '${o}' does not exist`);if(["options","block"].includes(o))continue;let n=o,a=i.hooks[n],c=r[n];zt.passThroughHooks.has(o)?r[n]=p=>{if(this.defaults.async&&zt.passThroughHooksRespectAsync.has(o))return(async()=>{let h=await a.call(r,p);return c.call(r,h)})();let u=a.call(r,p);return c.call(r,u)}:r[n]=(...p)=>{if(this.defaults.async)return(async()=>{let h=await a.apply(r,p);return h===!1&&(h=await c.apply(r,p)),h})();let u=a.apply(r,p);return u===!1&&(u=c.apply(r,p)),u}}s.hooks=r}if(i.walkTokens){let r=this.defaults.walkTokens,o=i.walkTokens;s.walkTokens=function(n){let a=[];return a.push(o.call(this,n)),r&&(a=a.concat(r.call(this,n))),a}}this.defaults={...this.defaults,...s}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return Re.lex(e,t??this.defaults)}parser(e,t){return Ae.parse(e,t??this.defaults)}parseMarkdown(e){return(t,i)=>{let s={...i},r={...this.defaults,...s},o=this.onError(!!r.silent,!!r.async);if(this.defaults.async===!0&&s.async===!1)return o(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof t>"u"||t===null)return o(new Error("marked(): input parameter is undefined or null"));if(typeof t!="string")return o(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(t)+", string expected"));if(r.hooks&&(r.hooks.options=r,r.hooks.block=e),r.async)return(async()=>{let n=r.hooks?await r.hooks.preprocess(t):t,a=await(r.hooks?await r.hooks.provideLexer(e):e?Re.lex:Re.lexInline)(n,r),c=r.hooks?await r.hooks.processAllTokens(a):a;r.walkTokens&&await Promise.all(this.walkTokens(c,r.walkTokens));let p=await(r.hooks?await r.hooks.provideParser(e):e?Ae.parse:Ae.parseInline)(c,r);return r.hooks?await r.hooks.postprocess(p):p})().catch(o);try{r.hooks&&(t=r.hooks.preprocess(t));let n=(r.hooks?r.hooks.provideLexer(e):e?Re.lex:Re.lexInline)(t,r);r.hooks&&(n=r.hooks.processAllTokens(n)),r.walkTokens&&this.walkTokens(n,r.walkTokens);let a=(r.hooks?r.hooks.provideParser(e):e?Ae.parse:Ae.parseInline)(n,r);return r.hooks&&(a=r.hooks.postprocess(a)),a}catch(n){return o(n)}}}onError(e,t){return i=>{if(i.message+=`
998
+ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error occurred:</p><pre>"+We(i.message+"",!0)+"</pre>";return t?Promise.resolve(s):s}if(t)return Promise.reject(i);throw i}}},dt=new Yb;function O(e,t){return dt.parse(e,t)}O.options=O.setOptions=function(e){return dt.setOptions(e),O.defaults=dt.defaults,Rl(O.defaults),O};O.getDefaults=Br;O.defaults=ht;O.use=function(...e){return dt.use(...e),O.defaults=dt.defaults,Rl(O.defaults),O};O.walkTokens=function(e,t){return dt.walkTokens(e,t)};O.parseInline=dt.parseInline;O.Parser=Ae;O.parser=Ae.parse;O.Renderer=zi;O.TextRenderer=Qr;O.Lexer=Re;O.lexer=Re.lex;O.Tokenizer=Ui;O.Hooks=zt;O.parse=O;O.options;O.setOptions;O.use;O.walkTokens;O.parseInline;Ae.parse;Re.lex;const jl=new O.Renderer;jl.html=({text:e})=>iw(e);const ew=300,Ft=new Map;function tw(e){const t=Ft.get(e);if(t!==void 0)return t;const i=O.parse(e,{async:!1,breaks:!0,gfm:!0,renderer:jl}),s=sw(i);if(Ft.set(e,s),Ft.size>ew){const r=Ft.keys().next().value;r!==void 0&&Ft.delete(r)}return s}function iw(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;")}function sw(e){const t=document.createElement("template");return t.innerHTML=e,t.content.querySelectorAll("script, style, iframe, object, embed").forEach(i=>{i.remove()}),t.content.querySelectorAll("*").forEach(i=>{for(const s of[...i.attributes]){const r=s.name.toLowerCase();r.startsWith("on")&&i.removeAttribute(s.name),(r==="href"||r==="src")&&!rw(s.value)&&i.removeAttribute(s.name)}i.tagName==="A"&&(i.setAttribute("target","_blank"),i.setAttribute("rel","noreferrer noopener"))}),t.innerHTML}function rw(e){if(e.startsWith("#")||e.startsWith("/"))return!0;try{return["http:","https:","mailto:"].includes(new URL(e).protocol)}catch{return!1}}var ow=Object.defineProperty,nw=Object.getOwnPropertyDescriptor,Fl=(e,t,i,s)=>{for(var r=s>1?void 0:s?nw(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&ow(t,i,r),r};const aw=E`
998
999
  :host { display: block; }
999
1000
  .formatted { white-space: normal; overflow-wrap: anywhere; line-height: 1.45; }
1000
1001
  p, ul, ol, pre, blockquote, table, .code-block-wrapper { margin: 0 0 10px; }
@@ -1019,18 +1020,18 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1019
1020
  table { border-collapse: collapse; display: block; overflow-x: auto; overflow-y: hidden; }
1020
1021
  th, td { border: 1px solid var(--pi-border); padding: 4px 8px; }
1021
1022
  th { background: var(--pi-surface); }
1022
- `;let Bi=class extends A{constructor(){super(...arguments),this.text="",this.onFormattedClick=e=>{if(!(e.target instanceof Element))return;const t=e.target.closest(".code-copy-button");if(!(t instanceof HTMLButtonElement))return;const i=t.closest(".code-block-wrapper");if(!(i instanceof HTMLElement))return;const s=i.querySelector("pre code");s instanceof HTMLElement&&this.copyCode(s.textContent,t)}}render(){return l`<div class="formatted" dir="auto" @click=${this.onFormattedClick}>${pb(ew(this.text))}</div>`}updated(){this.enhanceCodeBlocks()}enhanceCodeBlocks(){this.renderRoot.querySelectorAll("pre").forEach(e=>{if(!(e instanceof HTMLPreElement)||e.parentElement?.classList.contains("code-block-wrapper")===!0||!(e.querySelector("code")instanceof HTMLElement))return;const i=document.createElement("div");i.className="code-block-wrapper";const s=document.createElement("button");s.type="button",s.className="code-copy-button",s.title="复制代码块",s.setAttribute("aria-label","复制代码块");const r=document.createElement("span");r.setAttribute("aria-hidden","true"),r.textContent="⧉",s.append(r),e.before(i),i.append(e,s)})}async copyCode(e,t){const i=await Ur(e);this.setCopyButtonState(t,i?"copied":"failed"),window.setTimeout(()=>{this.setCopyButtonState(t,"idle")},1200)}setCopyButtonState(e,t){const i=e.querySelector("span");i!==null&&(i.textContent=t==="copied"?"✓":"⧉");const s=t==="copied"?"已复制代码块":t==="failed"?"复制代码块失败":"复制代码块";e.title=s,e.setAttribute("aria-label",s)}};Bi.styles=nw;Fl([d()],Bi.prototype,"text",2);Bi=Fl([W("formatted-text")],Bi);var aw=Object.defineProperty,lw=Object.getOwnPropertyDescriptor,ti=(e,t,i,s)=>{for(var r=s>1?void 0:s?lw(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&aw(t,i,r),r};const Nn=180;let pt=class extends A{constructor(){super(...arguments),this.showFullDiff=!1,this.copied=!1,this.diffOpen=!0}render(){const e=this.execution;if(e===void 0)return null;const t=e.toolName==="edit",i=cw(e.args),s=dw(e.details),r=e.preview,o=s??r?.diff,n=o===void 0?void 0:pw(o),a=s!==void 0&&r?.diff!==void 0&&s!==r.diff,c=e.status==="error"?e.resultText:r?.error,p=o===void 0?e.resultText:void 0;return l`
1023
+ `;let Bi=class extends A{constructor(){super(...arguments),this.text="",this.onFormattedClick=e=>{if(!(e.target instanceof Element))return;const t=e.target.closest(".code-copy-button");if(!(t instanceof HTMLButtonElement))return;const i=t.closest(".code-block-wrapper");if(!(i instanceof HTMLElement))return;const s=i.querySelector("pre code");s instanceof HTMLElement&&this.copyCode(s.textContent,t)}}render(){return l`<div class="formatted" dir="auto" @click=${this.onFormattedClick}>${hb(tw(this.text))}</div>`}updated(){this.enhanceCodeBlocks()}enhanceCodeBlocks(){this.renderRoot.querySelectorAll("pre").forEach(e=>{if(!(e instanceof HTMLPreElement)||e.parentElement?.classList.contains("code-block-wrapper")===!0||!(e.querySelector("code")instanceof HTMLElement))return;const i=document.createElement("div");i.className="code-block-wrapper";const s=document.createElement("button");s.type="button",s.className="code-copy-button",s.title="复制代码块",s.setAttribute("aria-label","复制代码块");const r=document.createElement("span");r.setAttribute("aria-hidden","true"),r.textContent="⧉",s.append(r),e.before(i),i.append(e,s)})}async copyCode(e,t){const i=await Ur(e);this.setCopyButtonState(t,i?"copied":"failed"),window.setTimeout(()=>{this.setCopyButtonState(t,"idle")},1200)}setCopyButtonState(e,t){const i=e.querySelector("span");i!==null&&(i.textContent=t==="copied"?"✓":"⧉");const s=t==="copied"?"已复制代码块":t==="failed"?"复制代码块失败":"复制代码块";e.title=s,e.setAttribute("aria-label",s)}};Bi.styles=aw;Fl([d()],Bi.prototype,"text",2);Bi=Fl([W("formatted-text")],Bi);var lw=Object.defineProperty,cw=Object.getOwnPropertyDescriptor,ti=(e,t,i,s)=>{for(var r=s>1?void 0:s?cw(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&lw(t,i,r),r};const Nn=180;let pt=class extends A{constructor(){super(...arguments),this.showFullDiff=!1,this.copied=!1,this.diffOpen=!0}render(){const e=this.execution;if(e===void 0)return null;const t=e.toolName==="edit",i=dw(e.args),s=pw(e.details),r=e.preview,o=s??r?.diff,n=o===void 0?void 0:hw(o),a=s!==void 0&&r?.diff!==void 0&&s!==r.diff,c=e.status==="error"?e.resultText:r?.error,p=o===void 0?e.resultText:void 0;return l`
1023
1024
  <section class=${`tool-card ${e.status}`}>
1024
1025
  <div class="tool-header">
1025
1026
  <div class="tool-title">
1026
- <span class="status-icon" aria-hidden="true">${uw(e.status)}</span>
1027
+ <span class="status-icon" aria-hidden="true">${fw(e.status)}</span>
1027
1028
  <strong>${e.toolName}</strong>
1028
1029
  ${i===void 0?l`<span class="summary">${e.summary}</span>`:l`<span class="path">${i}</span>`}
1029
1030
  </div>
1030
1031
  <div class="tool-meta">
1031
1032
  ${Hn(e)===void 0?null:l`<span>${Hn(e)}</span>`}
1032
1033
  ${n===void 0?null:l`<span class="diff-stats"><b class="added">+${n.added}</b><span>/</span><b class="removed">-${n.removed}</b></span>`}
1033
- <span class="status-label">${fw(e.status)}</span>
1034
+ <span class="status-label">${gw(e.status)}</span>
1034
1035
  </div>
1035
1036
  </div>
1036
1037
 
@@ -1055,7 +1056,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1055
1056
  <span>${s?`显示 ${String(r.length)} / ${String(i.length)} 行`:"完整 diff"}</span>
1056
1057
  <button type="button" @click=${()=>{this.copyDiff(e)}}>${this.copied?"已复制":"复制 diff"}</button>
1057
1058
  </div>
1058
- <pre class="diff" aria-label=${t}><code class="diff-content">${r.map(o=>l`<span class=${hw(o)}>${o}</span>`)}</code></pre>
1059
+ <pre class="diff" aria-label=${t}><code class="diff-content">${r.map(o=>l`<span class=${uw(o)}>${o}</span>`)}</code></pre>
1059
1060
  ${s?l`
1060
1061
  <button class="show-more" type="button" @click=${()=>{this.showFullDiff=!0}}>
1061
1062
  显示全部 ${String(i.length)} 行 diff
@@ -1102,19 +1103,19 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1102
1103
  .diff .added { background: color-mix(in srgb, var(--pi-success) 12%, transparent); }
1103
1104
  .diff .removed { background: color-mix(in srgb, var(--pi-danger) 12%, transparent); }
1104
1105
  .show-more { justify-self: start; }
1105
- `;ti([d({attribute:!1})],pt.prototype,"execution",2);ti([x()],pt.prototype,"showFullDiff",2);ti([x()],pt.prototype,"copied",2);ti([x()],pt.prototype,"diffOpen",2);pt=ti([W("tool-execution-view")],pt);function cw(e){return rr(e,"path")??rr(e,"file_path")}function Hn(e){if(e.toolName!=="edit")return;const t=Si(e.args,"edits");if(Array.isArray(t))return`${String(t.length)} 处编辑`;if(typeof Si(e.args,"oldText")=="string"&&typeof Si(e.args,"newText")=="string")return"1 处编辑"}function dw(e){return rr(e,"diff")}function pw(e){let t=0,i=0;for(const s of e.split(`
1106
- `))Ul(s)?t++:zl(s)&&i++;return{added:t,removed:i}}function hw(e){return Ul(e)?"added":zl(e)?"removed":e.startsWith("@@")?"hunk":e.startsWith("+++")||e.startsWith("---")?"file":e.startsWith("diff ")||e.startsWith("index ")?"meta":"context"}function Ul(e){return e.startsWith("+")&&!e.startsWith("+++")}function zl(e){return e.startsWith("-")&&!e.startsWith("---")}function uw(e){return e==="success"?"✓":e==="error"?"✖":e==="running"?"●":"○"}function fw(e){return e==="success"?"完成":e==="error"?"失败":e==="running"?"运行中":"等待中"}function gw(e){return typeof e=="object"&&e!==null}function Si(e,t){return gw(e)?e[t]:void 0}function rr(e,t){const i=Si(e,t);return typeof i=="string"?i:void 0}var mw=Object.defineProperty,vw=Object.getOwnPropertyDescriptor,H=(e,t,i,s)=>{for(var r=s>1?void 0:s?vw(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&mw(t,i,r),r};const bw=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}),ww=new Intl.DateTimeFormat(void 0,{dateStyle:"medium",timeStyle:"medium"}),Ms=["你打开此会话时助手已经在回复。完整答案很快会显示。","当前标签页接入得稍晚,完整回复准备好后会显示。","助手已先开始回复,完整答案到达后会显示。","正在等待完整回复,避免显示不完整内容。","回复仍在生成中,完整答案即将显示。","正在同步这次回复,稍后会显示完整版本。"],yw={active:"活跃","agent running":"助手运行中","bash complete":"Shell 已完成","bash failed":"Shell 失败","compaction complete":"压缩已完成","compaction failed":"压缩失败",compacting:"正在压缩","duplicate queued message ignored":"已忽略重复排队消息",error:"错误",idle:"空闲","message complete":"消息已完成","message queued":"消息已排队","message queued during compaction":"压缩期间消息已排队","message started":"消息已开始","prompt accepted":"提示已接受",queued:"已排队","receiving response":"正在接收回复","running bash":"Shell 运行中","running tool":"工具运行中","steering queued":"引导已排队",stopped:"已停止","tool complete":"工具已完成","tool failed":"工具失败","turn complete":"回合已完成"};function qn(){return Ms[Math.floor(Math.random()*Ms.length)]??Ms[0]}function Kn(e){return ki(e,0,100)}function ki(e,t,i){return Number.isFinite(e)?Math.min(i,Math.max(t,e)):t}let U=class extends A{constructor(){super(...arguments),this.messages=[],this.sessionId="",this.messageStart=0,this.messageEnd=0,this.messageTotal=0,this.hasMore=!1,this.loadingMore=!1,this.isReceivingPartialStream=!1,this.isSendingPrompt=!1,this.isCompacting=!1,this.pendingMessageCount=0,this.pinnedToBottom=!0,this.disclosures=new Dv,this.scrollController=new sb,this.suppressScrollSave=!1,this.suppressLoadMoreRequests=!1,this.groupedMessagesStart=0,this.groupedMessagesCache=[],this.messageMetaCache=new WeakMap,this.messageCopyTextCache=new WeakMap,this.lastScrollTop=0,this.lastClientHeight=0,this.prependRestoreToken=0,this.loadMoreRequested=!1,this.onViewportResize=()=>{this.pinnedToBottom?this.scrollToBottom():this.lastClientHeight=this.chat?.clientHeight??0},this.onPageHide=()=>{this.saveScrollPosition()}}connectedCallback(){super.connectedCallback(),window.addEventListener("resize",this.onViewportResize),window.addEventListener("pagehide",this.onPageHide),window.visualViewport?.addEventListener("resize",this.onViewportResize)}firstUpdated(){this.lastClientHeight=this.chat?.clientHeight??0}disconnectedCallback(){this.saveScrollPosition(),this.scrollController.dispose(),this.prependRestoreToken+=1,this.restoreScrollFrame!==void 0&&cancelAnimationFrame(this.restoreScrollFrame),this.loadMoreCheckFrame!==void 0&&cancelAnimationFrame(this.loadMoreCheckFrame),this.scrollToBottomFrame!==void 0&&cancelAnimationFrame(this.scrollToBottomFrame),this.conversationRailFrame!==void 0&&cancelAnimationFrame(this.conversationRailFrame),window.removeEventListener("resize",this.onViewportResize),window.removeEventListener("pagehide",this.onPageHide),window.visualViewport?.removeEventListener("resize",this.onViewportResize),super.disconnectedCallback()}savePreviousSessionScrollPosition(e){typeof e!="string"||e===""||e===this.sessionId||this.saveScrollPosition(e)}prepareSessionUiState(){this.disclosures.syncSession(this.sessionId),this.scrollController.clearScheduledSave(),this.suppressScrollSave=!1,this.suppressLoadMoreRequests=!1,this.pendingScrollRestoreSessionId=void 0,this.pendingScrollRestorePosition=void 0,this.prependRestoreToken+=1,this.restoreScrollFrame!==void 0&&(cancelAnimationFrame(this.restoreScrollFrame),this.restoreScrollFrame=void 0)}willUpdate(e){e.has("sessionId")&&(this.savePreviousSessionScrollPosition(e.get("sessionId")),this.prepareSessionUiState()),(e.has("isReceivingPartialStream")||e.has("sessionId")&&this.isReceivingPartialStream)&&this.syncPartialStreamNoticeBody(),e.has("messages")&&(this.pinnedToBottom=this.pinnedToBottom&&(this.didChatHeightChange()||this.isNearBottom()))}update(e){const t=this.isPrependingMessages(e)?this.capturePrependScrollAnchor():void 0;super.update(e),t!==void 0&&this.restorePrependScrollAnchor(t)}updated(e){e.has("loadingMore")&&!this.loadingMore&&(this.loadMoreRequested=!1),e.has("hasMore")&&!this.hasMore&&(this.loadMoreRequested=!1),e.has("sessionId")&&this.restoreScrollPosition(),!e.has("sessionId")&&e.has("messages")&&this.pinnedToBottom&&this.scrollToBottom(),(e.has("messages")||e.has("messageStart")||e.has("messageTotal")||e.has("hasMore")||e.has("loadingMore"))&&this.scheduleConversationRailUpdate(),(e.has("messages")||e.has("messageStart")||e.has("hasMore")||e.has("loadingMore"))&&this.continuePendingScrollRestore(),(e.has("messages")||e.has("hasMore")||e.has("loadingMore"))&&this.requestLoadMoreIfNeeded()}render(){const e=this.groupedMessages();return l`
1106
+ `;ti([d({attribute:!1})],pt.prototype,"execution",2);ti([x()],pt.prototype,"showFullDiff",2);ti([x()],pt.prototype,"copied",2);ti([x()],pt.prototype,"diffOpen",2);pt=ti([W("tool-execution-view")],pt);function dw(e){return rr(e,"path")??rr(e,"file_path")}function Hn(e){if(e.toolName!=="edit")return;const t=Si(e.args,"edits");if(Array.isArray(t))return`${String(t.length)} 处编辑`;if(typeof Si(e.args,"oldText")=="string"&&typeof Si(e.args,"newText")=="string")return"1 处编辑"}function pw(e){return rr(e,"diff")}function hw(e){let t=0,i=0;for(const s of e.split(`
1107
+ `))Ul(s)?t++:zl(s)&&i++;return{added:t,removed:i}}function uw(e){return Ul(e)?"added":zl(e)?"removed":e.startsWith("@@")?"hunk":e.startsWith("+++")||e.startsWith("---")?"file":e.startsWith("diff ")||e.startsWith("index ")?"meta":"context"}function Ul(e){return e.startsWith("+")&&!e.startsWith("+++")}function zl(e){return e.startsWith("-")&&!e.startsWith("---")}function fw(e){return e==="success"?"✓":e==="error"?"✖":e==="running"?"●":"○"}function gw(e){return e==="success"?"完成":e==="error"?"失败":e==="running"?"运行中":"等待中"}function mw(e){return typeof e=="object"&&e!==null}function Si(e,t){return mw(e)?e[t]:void 0}function rr(e,t){const i=Si(e,t);return typeof i=="string"?i:void 0}var vw=Object.defineProperty,bw=Object.getOwnPropertyDescriptor,H=(e,t,i,s)=>{for(var r=s>1?void 0:s?bw(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&vw(t,i,r),r};const ww=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}),yw=new Intl.DateTimeFormat(void 0,{dateStyle:"medium",timeStyle:"medium"}),Ms=["你打开此会话时助手已经在回复。完整答案很快会显示。","当前标签页接入得稍晚,完整回复准备好后会显示。","助手已先开始回复,完整答案到达后会显示。","正在等待完整回复,避免显示不完整内容。","回复仍在生成中,完整答案即将显示。","正在同步这次回复,稍后会显示完整版本。"],xw={active:"活跃","agent running":"助手运行中","bash complete":"Shell 已完成","bash failed":"Shell 失败","compaction complete":"压缩已完成","compaction failed":"压缩失败",compacting:"正在压缩","duplicate queued message ignored":"已忽略重复排队消息",error:"错误",idle:"空闲","message complete":"消息已完成","message queued":"消息已排队","message queued during compaction":"压缩期间消息已排队","message started":"消息已开始","prompt accepted":"提示已接受",queued:"已排队","receiving response":"正在接收回复","running bash":"Shell 运行中","running tool":"工具运行中","steering queued":"引导已排队",stopped:"已停止","tool complete":"工具已完成","tool failed":"工具失败","turn complete":"回合已完成"};function qn(){return Ms[Math.floor(Math.random()*Ms.length)]??Ms[0]}function Kn(e){return ki(e,0,100)}function ki(e,t,i){return Number.isFinite(e)?Math.min(i,Math.max(t,e)):t}let U=class extends A{constructor(){super(...arguments),this.messages=[],this.sessionId="",this.messageStart=0,this.messageEnd=0,this.messageTotal=0,this.hasMore=!1,this.loadingMore=!1,this.isReceivingPartialStream=!1,this.isSendingPrompt=!1,this.isCompacting=!1,this.pendingMessageCount=0,this.pinnedToBottom=!0,this.disclosures=new Wv,this.scrollController=new rb,this.suppressScrollSave=!1,this.suppressLoadMoreRequests=!1,this.groupedMessagesStart=0,this.groupedMessagesCache=[],this.messageMetaCache=new WeakMap,this.messageCopyTextCache=new WeakMap,this.lastScrollTop=0,this.lastClientHeight=0,this.prependRestoreToken=0,this.loadMoreRequested=!1,this.onViewportResize=()=>{this.pinnedToBottom?this.scrollToBottom():this.lastClientHeight=this.chat?.clientHeight??0},this.onPageHide=()=>{this.saveScrollPosition()}}connectedCallback(){super.connectedCallback(),window.addEventListener("resize",this.onViewportResize),window.addEventListener("pagehide",this.onPageHide),window.visualViewport?.addEventListener("resize",this.onViewportResize)}firstUpdated(){this.lastClientHeight=this.chat?.clientHeight??0}disconnectedCallback(){this.saveScrollPosition(),this.scrollController.dispose(),this.prependRestoreToken+=1,this.restoreScrollFrame!==void 0&&cancelAnimationFrame(this.restoreScrollFrame),this.loadMoreCheckFrame!==void 0&&cancelAnimationFrame(this.loadMoreCheckFrame),this.scrollToBottomFrame!==void 0&&cancelAnimationFrame(this.scrollToBottomFrame),this.conversationRailFrame!==void 0&&cancelAnimationFrame(this.conversationRailFrame),window.removeEventListener("resize",this.onViewportResize),window.removeEventListener("pagehide",this.onPageHide),window.visualViewport?.removeEventListener("resize",this.onViewportResize),super.disconnectedCallback()}savePreviousSessionScrollPosition(e){typeof e!="string"||e===""||e===this.sessionId||this.saveScrollPosition(e)}prepareSessionUiState(){this.disclosures.syncSession(this.sessionId),this.scrollController.clearScheduledSave(),this.suppressScrollSave=!1,this.suppressLoadMoreRequests=!1,this.pendingScrollRestoreSessionId=void 0,this.pendingScrollRestorePosition=void 0,this.prependRestoreToken+=1,this.restoreScrollFrame!==void 0&&(cancelAnimationFrame(this.restoreScrollFrame),this.restoreScrollFrame=void 0)}willUpdate(e){e.has("sessionId")&&(this.savePreviousSessionScrollPosition(e.get("sessionId")),this.prepareSessionUiState()),(e.has("isReceivingPartialStream")||e.has("sessionId")&&this.isReceivingPartialStream)&&this.syncPartialStreamNoticeBody(),e.has("messages")&&(this.pinnedToBottom=this.pinnedToBottom&&(this.didChatHeightChange()||this.isNearBottom()))}update(e){const t=this.isPrependingMessages(e)?this.capturePrependScrollAnchor():void 0;super.update(e),t!==void 0&&this.restorePrependScrollAnchor(t)}updated(e){e.has("loadingMore")&&!this.loadingMore&&(this.loadMoreRequested=!1),e.has("hasMore")&&!this.hasMore&&(this.loadMoreRequested=!1),e.has("sessionId")&&this.restoreScrollPosition(),!e.has("sessionId")&&e.has("messages")&&this.pinnedToBottom&&this.scrollToBottom(),(e.has("messages")||e.has("messageStart")||e.has("messageTotal")||e.has("hasMore")||e.has("loadingMore"))&&this.scheduleConversationRailUpdate(),(e.has("messages")||e.has("messageStart")||e.has("hasMore")||e.has("loadingMore"))&&this.continuePendingScrollRestore(),(e.has("messages")||e.has("hasMore")||e.has("loadingMore"))&&this.requestLoadMoreIfNeeded()}render(){const e=this.groupedMessages();return l`
1107
1108
  <div class="chat-wrap">
1108
1109
  ${this.renderConversationRail()}
1109
1110
  <div class="chat" @scroll=${()=>{this.onScroll()}} @wheel=${t=>{this.onWheel(t)}} @touchstart=${t=>{this.onTouchStart(t)}} @touchmove=${t=>{this.onTouchMove(t)}}>
1110
1111
  ${this.renderHistoryBoundary()}
1111
- ${Tv(e,t=>t.kind==="message"?this.messageAnchorKey(t.index):this.groupRenderKey(t.startIndex),(t,i)=>t.kind==="message"?this.renderMessage(t.message,t.index):this.renderMessageGroup(t.messages,t.startIndex,t.endIndex,this.isLiveTailGroup(e,i)))}
1112
+ ${Mv(e,t=>t.kind==="message"?this.messageAnchorKey(t.index):this.groupRenderKey(t.startIndex),(t,i)=>t.kind==="message"?this.renderMessage(t.message,t.index):this.renderMessageGroup(t.messages,t.startIndex,t.endIndex,this.isLiveTailGroup(e,i)))}
1112
1113
  ${this.renderQueuedMessages()}
1113
1114
  ${this.renderSessionActivity()}
1114
1115
  </div>
1115
1116
  ${this.renderActivityDock()}
1116
1117
  </div>
1117
- `}groupedMessages(){return this.groupedMessagesInput===this.messages&&this.groupedMessagesStart===this.messageStart?this.groupedMessagesCache:(this.groupedMessagesInput=this.messages,this.groupedMessagesStart=this.messageStart,this.groupedMessagesCache=_v(this.messages,this.messageStart),this.groupedMessagesCache)}isLiveTailGroup(e,t){return t===e.length-1&&this.isSessionLive()}isSessionLive(){return this.isSendingPrompt||this.status?.isStreaming===!0||this.status?.isCompacting===!0||this.status?.isBashRunning===!0||this.activity?.phase==="active"}renderActivityDock(){if(this.isSendingPrompt)return l`
1118
+ `}groupedMessages(){return this.groupedMessagesInput===this.messages&&this.groupedMessagesStart===this.messageStart?this.groupedMessagesCache:(this.groupedMessagesInput=this.messages,this.groupedMessagesStart=this.messageStart,this.groupedMessagesCache=Lv(this.messages,this.messageStart),this.groupedMessagesCache)}isLiveTailGroup(e,t){return t===e.length-1&&this.isSessionLive()}isSessionLive(){return this.isSendingPrompt||this.status?.isStreaming===!0||this.status?.isCompacting===!0||this.status?.isBashRunning===!0||this.activity?.phase==="active"}renderActivityDock(){if(this.isSendingPrompt)return l`
1118
1119
  <div class="activity-dock active" aria-live="polite">
1119
1120
  <span class="dot"></span>
1120
1121
  <span class="activity-text">正在发送你的消息…</span>
@@ -1166,7 +1167,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1166
1167
  <details class=${s?"msg event-group live":"msg event-group"} data-index=${t} data-scroll-anchor-id=${this.groupAnchorKey(t)} ?open=${o} @toggle=${n=>{this.onGroupToggle(r,n,s)}}>
1167
1168
  <summary>
1168
1169
  <b class="label">${s?"实时事件":"事件"}</b>
1169
- <span>${Lv(e)}</span>
1170
+ <span>${jv(e)}</span>
1170
1171
  </summary>
1171
1172
  <div class="group-body">
1172
1173
  ${e.map((n,a)=>{const c=this.isToolExecutionOnlyMessage(n);return l`
@@ -1193,7 +1194,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1193
1194
  </div>
1194
1195
  `}onMetaKeydown(e,t,i){e.key!=="Enter"&&e.key!==" "||(e.preventDefault(),this.expandedMetaKey=i?void 0:t)}isCopyableMessage(e){return(e.role==="user"||e.role==="assistant")&&this.messageCopyText(e)!==""}messageCopyText(e){const t=this.messageCopyTextCache.get(e);if(t!==void 0)return t;const i=e.parts.filter(s=>s.type==="text").map(s=>s.text.trim()).filter(s=>s!=="").join(`
1195
1196
 
1196
- `);return this.messageCopyTextCache.set(e,i),i}async copyMessage(e,t,i){i.stopPropagation(),await Ur(this.messageCopyText(e))&&(this.copiedMessageKey=t,window.setTimeout(()=>{this.copiedMessageKey===t&&(this.copiedMessageKey=void 0)},1200))}messageMetaLabel(e){const t=this.messageMetaCache.get(e);if(t!==void 0)return t;const i=e.meta?.timestamp,s=this.modelLabel(e);if(i===void 0&&s===void 0){const c={short:"无信息",full:"没有可用的 Pi 消息元数据"};return this.messageMetaCache.set(e,c),c}const r=i===void 0?void 0:this.formatTimestamp(i),o=[r?.short,s].filter(c=>c!==void 0&&c!==""),n=[r?.full,s===void 0?void 0:`模型:${s}`].filter(c=>c!==void 0&&c!==""),a={short:o.join(" · "),full:n.join(" · ")};return this.messageMetaCache.set(e,a),a}formatTimestamp(e){const t=new Date(e);if(Number.isFinite(t.getTime()))return{short:bw.format(t),full:ww.format(t)}}modelLabel(e){const t=e.meta?.model;if(t===void 0)return;const i=t.responseId??t.id;return i===void 0||i===""?t.provider:t.provider!==void 0&&t.provider!==""?`${t.provider}/${i}`:i}renderPart(e,t){return e.type==="text"&&t?.role==="bash"?l`<pre class="part shell-output">${e.text}</pre>`:e.type==="text"?l`<formatted-text class="part" .text=${e.text}></formatted-text>`:e.type==="image"?l`<figure class="part chat-image"><img src=${`data:${e.mimeType};base64,${e.data}`} alt="用户上传的图片" loading="lazy"></figure>`:e.type==="thinking"?l`<details class="part"><summary>思考</summary><formatted-text .text=${e.text}></formatted-text></details>`:e.type==="skillInvocation"?l`
1197
+ `);return this.messageCopyTextCache.set(e,i),i}async copyMessage(e,t,i){i.stopPropagation(),await Ur(this.messageCopyText(e))&&(this.copiedMessageKey=t,window.setTimeout(()=>{this.copiedMessageKey===t&&(this.copiedMessageKey=void 0)},1200))}messageMetaLabel(e){const t=this.messageMetaCache.get(e);if(t!==void 0)return t;const i=e.meta?.timestamp,s=this.modelLabel(e);if(i===void 0&&s===void 0){const c={short:"无信息",full:"没有可用的 Pi 消息元数据"};return this.messageMetaCache.set(e,c),c}const r=i===void 0?void 0:this.formatTimestamp(i),o=[r?.short,s].filter(c=>c!==void 0&&c!==""),n=[r?.full,s===void 0?void 0:`模型:${s}`].filter(c=>c!==void 0&&c!==""),a={short:o.join(" · "),full:n.join(" · ")};return this.messageMetaCache.set(e,a),a}formatTimestamp(e){const t=new Date(e);if(Number.isFinite(t.getTime()))return{short:ww.format(t),full:yw.format(t)}}modelLabel(e){const t=e.meta?.model;if(t===void 0)return;const i=t.responseId??t.id;return i===void 0||i===""?t.provider:t.provider!==void 0&&t.provider!==""?`${t.provider}/${i}`:i}renderPart(e,t){return e.type==="text"&&t?.role==="bash"?l`<pre class="part shell-output">${e.text}</pre>`:e.type==="text"?l`<formatted-text class="part" .text=${e.text}></formatted-text>`:e.type==="image"?l`<figure class="part chat-image"><img src=${`data:${e.mimeType};base64,${e.data}`} alt="用户上传的图片" loading="lazy"></figure>`:e.type==="thinking"?l`<details class="part"><summary>思考</summary><formatted-text .text=${e.text}></formatted-text></details>`:e.type==="skillInvocation"?l`
1197
1198
  <details class="part skill-invocation">
1198
1199
  <summary><b>[技能]</b> ${e.name}</summary>
1199
1200
  <small>${e.location}</small>
@@ -1209,7 +1210,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1209
1210
  <summary>${e.isError?"✖":"✓"} ${e.toolName} 结果</summary>
1210
1211
  <formatted-text .text=${e.text}></formatted-text>
1211
1212
  </details>
1212
- `:null}onGroupToggle(e,t,i){const s=t.currentTarget;s instanceof HTMLDetailsElement&&this.disclosures.applyToggle(e,s.open,i)&&this.requestUpdate()}onScroll(){this.requestLoadMoreIfNeeded(),this.updatePinnedToBottomFromScroll(),this.scheduleConversationRailUpdate(),this.suppressScrollSave||this.scheduleScrollPositionSave()}onWheel(e){e.deltaY<0&&this.canScrollUp()&&(this.pinnedToBottom=!1)}onTouchStart(e){this.touchStartY=e.touches[0]?.clientY}onTouchMove(e){const t=e.touches[0]?.clientY;this.touchStartY!==void 0&&t!==void 0&&t>this.touchStartY&&this.canScrollUp()&&(this.pinnedToBottom=!1)}updatePinnedToBottomFromScroll(){const e=this.chat;if(!e)return;const t=this.didChatHeightChange(),i=this.pinnedToBottom,s=e.scrollTop<this.lastScrollTop;if(t&&i){this.lastClientHeight=e.clientHeight,this.scrollToBottom();return}this.isAtBottom()?this.pinnedToBottom=!0:s?this.pinnedToBottom=!1:this.pinnedToBottom=this.isNearBottom(),this.lastScrollTop=e.scrollTop,this.lastClientHeight=e.clientHeight}didChatHeightChange(){const e=this.chat;return e!==void 0&&this.lastClientHeight!==0&&e.clientHeight!==this.lastClientHeight}isPrependingMessages(e){const t=e.get("messageStart");return typeof t=="number"&&this.messageStart<t}requestLoadMoreIfNeeded(){this.loadMoreCheckFrame===void 0&&(this.loadMoreCheckFrame=requestAnimationFrame(()=>{if(this.loadMoreCheckFrame=void 0,this.suppressLoadMoreRequests)return;const e=this.chat;e&&Gv({hasMore:this.hasMore,loadingMore:this.loadingMore||this.loadMoreRequested,canRequest:this.onLoadMore!==void 0,scrollTop:e.scrollTop,scrollHeight:e.scrollHeight,clientHeight:e.clientHeight})&&this.requestLoadMore()}))}requestLoadMore(){this.loadMoreRequested||!this.hasMore||this.loadingMore||this.onLoadMore===void 0||(this.loadMoreRequested=!0,this.onLoadMore())}isNearBottom(){const e=this.chat;return e?Il(e):!0}isAtBottom(){const e=this.chat;return e?Cl(e)<2:!0}canScrollUp(){const e=this.chat;return e!==void 0&&e.scrollTop>0}scrollToBottom(){this.scrollToBottomFrame===void 0&&(this.scrollToBottomFrame=requestAnimationFrame(()=>{this.scrollToBottomFrame=void 0;const e=this.chat;e&&this.withSuppressedScrollSave(()=>{e.scrollTop=e.scrollHeight,this.lastScrollTop=e.scrollTop,this.lastClientHeight=e.clientHeight})}))}restoreScrollPosition(){const e=this.sessionId;this.restoreScrollFrame!==void 0&&cancelAnimationFrame(this.restoreScrollFrame),this.restoreScrollFrame=requestAnimationFrame(()=>{this.restoreScrollFrame=void 0,this.sessionId===e&&this.withSuppressedScrollSave(()=>{const t=this.scrollController.restorePosition(e,this.chat,this.scrollAnchorElements(),{fallbackToBottom:this.shouldFallbackToBottomForMissingAnchor()});this.handleScrollRestoreResult(e,t)})})}continuePendingScrollRestore(){const e=this.pendingScrollRestoreSessionId,t=this.pendingScrollRestorePosition;e===void 0||t===void 0||e!==this.sessionId||this.restoreScrollFrame!==void 0||(this.restoreScrollFrame=requestAnimationFrame(()=>{this.restoreScrollFrame=void 0,this.sessionId===e&&this.withSuppressedScrollSave(()=>{const i=this.scrollController.restoreExplicitPosition(t,this.chat,this.scrollAnchorElements(),{fallbackToBottom:this.shouldFallbackToBottomForMissingAnchor()});this.handleScrollRestoreResult(e,i)})}))}handleScrollRestoreResult(e,t){if(this.syncScrollMetrics(),t.status!=="missing"){this.updatePinnedToBottomAfterRestore(t.status),(t.status==="restored"||t.status==="bottom")&&this.cancelPrependRestore(),this.pendingScrollRestoreSessionId=void 0,this.pendingScrollRestorePosition=void 0;return}this.pinnedToBottom=!1,this.pendingScrollRestoreSessionId=e,this.pendingScrollRestorePosition=t.position;const i=this.chat;i===void 0||!this.hasMore||this.loadingMore||(i.scrollTop=0,this.syncScrollMetrics(),this.requestLoadMore())}shouldFallbackToBottomForMissingAnchor(){return!this.hasMore&&!this.isReceivingPartialStream}updatePinnedToBottomAfterRestore(e){e==="bottom"?this.pinnedToBottom=!0:e==="restored"&&(this.pinnedToBottom=this.isNearBottom())}syncScrollMetrics(){const e=this.chat;e!==void 0&&(this.lastScrollTop=e.scrollTop,this.lastClientHeight=e.clientHeight)}cancelPrependRestore(){this.prependRestoreToken+=1,this.suppressLoadMoreRequests=!1}capturePrependScrollAnchor(){const e=this.chat;if(e)return Uv(e,this.scrollMarkers())}restorePrependScrollAnchor(e){if(!this.chat||!e)return;this.suppressLoadMoreRequests=!0,this.suppressScrollSave=!0;const t=this.prependRestoreToken+1;this.prependRestoreToken=t;let i=0;const s=()=>{const r=this.chat;if(!(!r||t!==this.prependRestoreToken)){if(zv(r,e,e.markerId===void 0?void 0:this.scrollMarkerAt(e.markerId)),this.lastScrollTop=r.scrollTop,i+=1,i<Fv){requestAnimationFrame(s);return}requestAnimationFrame(()=>{t===this.prependRestoreToken&&(this.suppressScrollSave=!1,this.suppressLoadMoreRequests=!1)})}};s()}saveScrollPosition(e=this.sessionId){e&&this.scrollController.savePosition(e,this.chat,this.scrollAnchorElements())}scheduleScrollPositionSave(){const e=this.sessionId;this.scrollController.scheduleSave(e,t=>{this.sessionId===t&&this.saveScrollPosition(t)})}scheduleConversationRailUpdate(){this.conversationRailFrame===void 0&&(this.conversationRailFrame=requestAnimationFrame(()=>{this.conversationRailFrame=void 0,this.updateConversationRailPosition()}))}updateConversationRailPosition(){if(!this.messages.length||this.messageTotal<=0){this.currentConversationIndex=void 0;return}const e=this.conversationDisplayTotal(),t=this.firstVisibleArticle(),i=Number(t?.dataset.index);if(Number.isFinite(i)){this.currentConversationIndex=ki(i,0,Math.max(0,e-1));return}this.currentConversationIndex=ki(this.pinnedToBottom?this.messageStart+this.messages.length-1:this.messageStart,0,Math.max(0,e-1))}scrollMarkers(){return Array.from(this.renderRoot.querySelectorAll(".scroll-marker"))}scrollMarkerAt(e){return this.scrollMarkers().find(t=>t.dataset.markerId===e)}firstVisibleArticle(){const e=this.chat;if(e===void 0)return;const t=Array.from(this.renderRoot.querySelectorAll("article.msg"));return Wn(e,t)??Wn(e,this.articles())}articles(){return Array.from(this.renderRoot.querySelectorAll("article.msg, details.msg"))}scrollAnchorElements(){return Array.from(this.renderRoot.querySelectorAll("[data-scroll-anchor-id]"))}withSuppressedScrollSave(e){this.suppressScrollSave=!0,e(),requestAnimationFrame(()=>{requestAnimationFrame(()=>{this.suppressScrollSave=!1})})}groupDisclosureKey(e,t,i){return i?`${this.sessionId}:live:${String(e)}`:`${this.sessionId}:${String(t)}`}messageAnchorKey(e){return`m:${String(e)}`}groupRenderKey(e){return`g:${String(e)}`}groupAnchorKey(e){return`g:${String(e)}`}eventAnchorKey(e){return`e:${String(e)}`}messageScrollMarkerId(e){return`m:${String(e)}`}groupScrollMarkerId(e){return`g:${String(e)}`}};U.styles=lb;H([d({attribute:!1})],U.prototype,"messages",2);H([d()],U.prototype,"sessionId",2);H([d({type:Number})],U.prototype,"messageStart",2);H([d({type:Number})],U.prototype,"messageEnd",2);H([d({type:Number})],U.prototype,"messageTotal",2);H([d({type:Boolean})],U.prototype,"hasMore",2);H([d({type:Boolean})],U.prototype,"loadingMore",2);H([d({type:Boolean})],U.prototype,"isReceivingPartialStream",2);H([d({type:Boolean})],U.prototype,"isSendingPrompt",2);H([d({type:Boolean})],U.prototype,"isCompacting",2);H([d({type:Number})],U.prototype,"pendingMessageCount",2);H([d({attribute:!1})],U.prototype,"status",2);H([d({attribute:!1})],U.prototype,"activity",2);H([d({attribute:!1})],U.prototype,"onLoadMore",2);H([B(".chat")],U.prototype,"chat",2);H([x()],U.prototype,"pinnedToBottom",2);H([x()],U.prototype,"expandedMetaKey",2);H([x()],U.prototype,"copiedMessageKey",2);H([x()],U.prototype,"currentConversationIndex",2);H([x()],U.prototype,"loadMoreRequested",2);U=H([W("chat-view")],U);function Vn(e){return e==="user"?"用户":e==="assistant"?"助手":e==="system"?"系统":e==="tool"?"工具":e==="toolResult"?"工具结果":e==="bash"?"Shell":e==="skill"?"技能":e}function Es(e){return e==="bash"?"Shell 运行中":e==="running"?"运行中":yw[e]??e}const xw=["image/jpeg","image/png","image/gif","image/webp"],Sw=new Set(xw);function Zr(e){return typeof e=="string"&&Sw.has(e)}function kw(e){switch(e){case"image/jpeg":return"jpg";case"image/png":return"png";case"image/gif":return"gif";case"image/webp":return"webp";default:return"bin"}}const $w="application/octet-stream",Pw="读取附件失败。";async function Cw(e,t){const i=[];let s;for(const r of e)try{const o=await t(r);i.push(Rw(r,o))}catch{s=Pw}return{attachments:i,...s===void 0?{}:{error:s}}}function or(e){return e.kind==="image"&&Zr(e.mimeType)}function nr(e){return e.every(t=>or(t))}function Iw(e,t){return nr(t)?e:"folder"}function Rw(e,t){return Zr(e.type)?{kind:"image",name:Gn(e),mimeType:e.type,data:t,size:e.size}:{kind:"file",name:Gn(e),mimeType:Aw(e),data:t,size:e.size}}function Aw(e){const t=e.type.trim();return t===""?$w:t}function Gn(e){return e.name!==""?e.name:Zr(e.type)?`pasted-image.${kw(e.type)}`:"pasted-file.bin"}const Bl="pi-web:attachment-delivery";function Nl(){try{return typeof localStorage>"u"?void 0:localStorage}catch{return}}function Tw(e=Nl()){try{return e?.getItem(Bl)==="folder"?"folder":"inline"}catch{return"inline"}}function Mw(e,t=Nl()){try{t?.setItem(Bl,e)}catch{}}const Ew="(pointer: coarse), (max-width: 760px)",Hl="pi-web.promptEnterPreference";function ns(){return typeof window<"u"&&"matchMedia"in window?window.matchMedia(Ew):void 0}function Dw(e){return e==="send"||e==="newline"?e:"auto"}function as(e=ql()){if(e===void 0)return"auto";try{return Dw(e.getItem(Hl))}catch{return"auto"}}function Ww(e,t=ql()){if(t!==void 0)try{t.setItem(Hl,e)}catch{}}function Ow(e=ns(),t=as()){return t==="send"?!0:t==="newline"?!1:e?.matches!==!0}function _w(e,t,i=ns()){return e?i?.matches===!0?t:!0:!1}function Lw(e,t=ns(),i=as()){const s=Ow(t,i);return e?!s:s}function ql(){if(!(typeof window>"u"))try{return window.localStorage}catch{return}}function jw(){return be`
1213
+ `:null}onGroupToggle(e,t,i){const s=t.currentTarget;s instanceof HTMLDetailsElement&&this.disclosures.applyToggle(e,s.open,i)&&this.requestUpdate()}onScroll(){this.requestLoadMoreIfNeeded(),this.updatePinnedToBottomFromScroll(),this.scheduleConversationRailUpdate(),this.suppressScrollSave||this.scheduleScrollPositionSave()}onWheel(e){e.deltaY<0&&this.canScrollUp()&&(this.pinnedToBottom=!1)}onTouchStart(e){this.touchStartY=e.touches[0]?.clientY}onTouchMove(e){const t=e.touches[0]?.clientY;this.touchStartY!==void 0&&t!==void 0&&t>this.touchStartY&&this.canScrollUp()&&(this.pinnedToBottom=!1)}updatePinnedToBottomFromScroll(){const e=this.chat;if(!e)return;const t=this.didChatHeightChange(),i=this.pinnedToBottom,s=e.scrollTop<this.lastScrollTop;if(t&&i){this.lastClientHeight=e.clientHeight,this.scrollToBottom();return}this.isAtBottom()?this.pinnedToBottom=!0:s?this.pinnedToBottom=!1:this.pinnedToBottom=this.isNearBottom(),this.lastScrollTop=e.scrollTop,this.lastClientHeight=e.clientHeight}didChatHeightChange(){const e=this.chat;return e!==void 0&&this.lastClientHeight!==0&&e.clientHeight!==this.lastClientHeight}isPrependingMessages(e){const t=e.get("messageStart");return typeof t=="number"&&this.messageStart<t}requestLoadMoreIfNeeded(){this.loadMoreCheckFrame===void 0&&(this.loadMoreCheckFrame=requestAnimationFrame(()=>{if(this.loadMoreCheckFrame=void 0,this.suppressLoadMoreRequests)return;const e=this.chat;e&&Jv({hasMore:this.hasMore,loadingMore:this.loadingMore||this.loadMoreRequested,canRequest:this.onLoadMore!==void 0,scrollTop:e.scrollTop,scrollHeight:e.scrollHeight,clientHeight:e.clientHeight})&&this.requestLoadMore()}))}requestLoadMore(){this.loadMoreRequested||!this.hasMore||this.loadingMore||this.onLoadMore===void 0||(this.loadMoreRequested=!0,this.onLoadMore())}isNearBottom(){const e=this.chat;return e?Il(e):!0}isAtBottom(){const e=this.chat;return e?Cl(e)<2:!0}canScrollUp(){const e=this.chat;return e!==void 0&&e.scrollTop>0}scrollToBottom(){this.scrollToBottomFrame===void 0&&(this.scrollToBottomFrame=requestAnimationFrame(()=>{this.scrollToBottomFrame=void 0;const e=this.chat;e&&this.withSuppressedScrollSave(()=>{e.scrollTop=e.scrollHeight,this.lastScrollTop=e.scrollTop,this.lastClientHeight=e.clientHeight})}))}restoreScrollPosition(){const e=this.sessionId;this.restoreScrollFrame!==void 0&&cancelAnimationFrame(this.restoreScrollFrame),this.restoreScrollFrame=requestAnimationFrame(()=>{this.restoreScrollFrame=void 0,this.sessionId===e&&this.withSuppressedScrollSave(()=>{const t=this.scrollController.restorePosition(e,this.chat,this.scrollAnchorElements(),{fallbackToBottom:this.shouldFallbackToBottomForMissingAnchor()});this.handleScrollRestoreResult(e,t)})})}continuePendingScrollRestore(){const e=this.pendingScrollRestoreSessionId,t=this.pendingScrollRestorePosition;e===void 0||t===void 0||e!==this.sessionId||this.restoreScrollFrame!==void 0||(this.restoreScrollFrame=requestAnimationFrame(()=>{this.restoreScrollFrame=void 0,this.sessionId===e&&this.withSuppressedScrollSave(()=>{const i=this.scrollController.restoreExplicitPosition(t,this.chat,this.scrollAnchorElements(),{fallbackToBottom:this.shouldFallbackToBottomForMissingAnchor()});this.handleScrollRestoreResult(e,i)})}))}handleScrollRestoreResult(e,t){if(this.syncScrollMetrics(),t.status!=="missing"){this.updatePinnedToBottomAfterRestore(t.status),(t.status==="restored"||t.status==="bottom")&&this.cancelPrependRestore(),this.pendingScrollRestoreSessionId=void 0,this.pendingScrollRestorePosition=void 0;return}this.pinnedToBottom=!1,this.pendingScrollRestoreSessionId=e,this.pendingScrollRestorePosition=t.position;const i=this.chat;i===void 0||!this.hasMore||this.loadingMore||(i.scrollTop=0,this.syncScrollMetrics(),this.requestLoadMore())}shouldFallbackToBottomForMissingAnchor(){return!this.hasMore&&!this.isReceivingPartialStream}updatePinnedToBottomAfterRestore(e){e==="bottom"?this.pinnedToBottom=!0:e==="restored"&&(this.pinnedToBottom=this.isNearBottom())}syncScrollMetrics(){const e=this.chat;e!==void 0&&(this.lastScrollTop=e.scrollTop,this.lastClientHeight=e.clientHeight)}cancelPrependRestore(){this.prependRestoreToken+=1,this.suppressLoadMoreRequests=!1}capturePrependScrollAnchor(){const e=this.chat;if(e)return zv(e,this.scrollMarkers())}restorePrependScrollAnchor(e){if(!this.chat||!e)return;this.suppressLoadMoreRequests=!0,this.suppressScrollSave=!0;const t=this.prependRestoreToken+1;this.prependRestoreToken=t;let i=0;const s=()=>{const r=this.chat;if(!(!r||t!==this.prependRestoreToken)){if(Bv(r,e,e.markerId===void 0?void 0:this.scrollMarkerAt(e.markerId)),this.lastScrollTop=r.scrollTop,i+=1,i<Uv){requestAnimationFrame(s);return}requestAnimationFrame(()=>{t===this.prependRestoreToken&&(this.suppressScrollSave=!1,this.suppressLoadMoreRequests=!1)})}};s()}saveScrollPosition(e=this.sessionId){e&&this.scrollController.savePosition(e,this.chat,this.scrollAnchorElements())}scheduleScrollPositionSave(){const e=this.sessionId;this.scrollController.scheduleSave(e,t=>{this.sessionId===t&&this.saveScrollPosition(t)})}scheduleConversationRailUpdate(){this.conversationRailFrame===void 0&&(this.conversationRailFrame=requestAnimationFrame(()=>{this.conversationRailFrame=void 0,this.updateConversationRailPosition()}))}updateConversationRailPosition(){if(!this.messages.length||this.messageTotal<=0){this.currentConversationIndex=void 0;return}const e=this.conversationDisplayTotal(),t=this.firstVisibleArticle(),i=Number(t?.dataset.index);if(Number.isFinite(i)){this.currentConversationIndex=ki(i,0,Math.max(0,e-1));return}this.currentConversationIndex=ki(this.pinnedToBottom?this.messageStart+this.messages.length-1:this.messageStart,0,Math.max(0,e-1))}scrollMarkers(){return Array.from(this.renderRoot.querySelectorAll(".scroll-marker"))}scrollMarkerAt(e){return this.scrollMarkers().find(t=>t.dataset.markerId===e)}firstVisibleArticle(){const e=this.chat;if(e===void 0)return;const t=Array.from(this.renderRoot.querySelectorAll("article.msg"));return Wn(e,t)??Wn(e,this.articles())}articles(){return Array.from(this.renderRoot.querySelectorAll("article.msg, details.msg"))}scrollAnchorElements(){return Array.from(this.renderRoot.querySelectorAll("[data-scroll-anchor-id]"))}withSuppressedScrollSave(e){this.suppressScrollSave=!0,e(),requestAnimationFrame(()=>{requestAnimationFrame(()=>{this.suppressScrollSave=!1})})}groupDisclosureKey(e,t,i){return i?`${this.sessionId}:live:${String(e)}`:`${this.sessionId}:${String(t)}`}messageAnchorKey(e){return`m:${String(e)}`}groupRenderKey(e){return`g:${String(e)}`}groupAnchorKey(e){return`g:${String(e)}`}eventAnchorKey(e){return`e:${String(e)}`}messageScrollMarkerId(e){return`m:${String(e)}`}groupScrollMarkerId(e){return`g:${String(e)}`}};U.styles=cb;H([d({attribute:!1})],U.prototype,"messages",2);H([d()],U.prototype,"sessionId",2);H([d({type:Number})],U.prototype,"messageStart",2);H([d({type:Number})],U.prototype,"messageEnd",2);H([d({type:Number})],U.prototype,"messageTotal",2);H([d({type:Boolean})],U.prototype,"hasMore",2);H([d({type:Boolean})],U.prototype,"loadingMore",2);H([d({type:Boolean})],U.prototype,"isReceivingPartialStream",2);H([d({type:Boolean})],U.prototype,"isSendingPrompt",2);H([d({type:Boolean})],U.prototype,"isCompacting",2);H([d({type:Number})],U.prototype,"pendingMessageCount",2);H([d({attribute:!1})],U.prototype,"status",2);H([d({attribute:!1})],U.prototype,"activity",2);H([d({attribute:!1})],U.prototype,"onLoadMore",2);H([B(".chat")],U.prototype,"chat",2);H([x()],U.prototype,"pinnedToBottom",2);H([x()],U.prototype,"expandedMetaKey",2);H([x()],U.prototype,"copiedMessageKey",2);H([x()],U.prototype,"currentConversationIndex",2);H([x()],U.prototype,"loadMoreRequested",2);U=H([W("chat-view")],U);function Vn(e){return e==="user"?"用户":e==="assistant"?"助手":e==="system"?"系统":e==="tool"?"工具":e==="toolResult"?"工具结果":e==="bash"?"Shell":e==="skill"?"技能":e}function Es(e){return e==="bash"?"Shell 运行中":e==="running"?"运行中":xw[e]??e}const Sw=["image/jpeg","image/png","image/gif","image/webp"],kw=new Set(Sw);function Zr(e){return typeof e=="string"&&kw.has(e)}function $w(e){switch(e){case"image/jpeg":return"jpg";case"image/png":return"png";case"image/gif":return"gif";case"image/webp":return"webp";default:return"bin"}}const Pw="application/octet-stream",Cw="读取附件失败。";async function Iw(e,t){const i=[];let s;for(const r of e)try{const o=await t(r);i.push(Aw(r,o))}catch{s=Cw}return{attachments:i,...s===void 0?{}:{error:s}}}function or(e){return e.kind==="image"&&Zr(e.mimeType)}function nr(e){return e.every(t=>or(t))}function Rw(e,t){return nr(t)?e:"folder"}function Aw(e,t){return Zr(e.type)?{kind:"image",name:Gn(e),mimeType:e.type,data:t,size:e.size}:{kind:"file",name:Gn(e),mimeType:Tw(e),data:t,size:e.size}}function Tw(e){const t=e.type.trim();return t===""?Pw:t}function Gn(e){return e.name!==""?e.name:Zr(e.type)?`pasted-image.${$w(e.type)}`:"pasted-file.bin"}const Bl="pi-web:attachment-delivery";function Nl(){try{return typeof localStorage>"u"?void 0:localStorage}catch{return}}function Mw(e=Nl()){try{return e?.getItem(Bl)==="folder"?"folder":"inline"}catch{return"inline"}}function Ew(e,t=Nl()){try{t?.setItem(Bl,e)}catch{}}const Dw="(pointer: coarse), (max-width: 760px)",Hl="pi-web.promptEnterPreference";function ns(){return typeof window<"u"&&"matchMedia"in window?window.matchMedia(Dw):void 0}function Ww(e){return e==="send"||e==="newline"?e:"auto"}function as(e=ql()){if(e===void 0)return"auto";try{return Ww(e.getItem(Hl))}catch{return"auto"}}function Ow(e,t=ql()){if(t!==void 0)try{t.setItem(Hl,e)}catch{}}function _w(e=ns(),t=as()){return t==="send"?!0:t==="newline"?!1:e?.matches!==!0}function Lw(e,t,i=ns()){return e?i?.matches===!0?t:!0:!1}function jw(e,t=ns(),i=as()){const s=_w(t,i);return e?!s:s}function ql(){if(!(typeof window>"u"))try{return window.localStorage}catch{return}}function Fw(){return be`
1213
1214
  <svg class="prompt-action-icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
1214
1215
  <path d="M20 11.5 12.5 19a4 4 0 0 1-5.66-5.66l7.07-7.07a2.5 2.5 0 0 1 3.54 3.54l-7.07 7.07a1 1 0 0 1-1.42-1.42l6.37-6.36"></path>
1215
1216
  </svg>
@@ -1218,22 +1219,22 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1218
1219
  <path d="M21 3 13.5 21l-2-8.5L3 10.5Z"></path>
1219
1220
  <path d="M21 3 11.5 12.5"></path>
1220
1221
  </svg>
1221
- `}function Fw(){return be`
1222
+ `}function Uw(){return be`
1222
1223
  <svg class="prompt-action-icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
1223
1224
  <path d="M4 7h11"></path>
1224
1225
  <path d="M4 12h7"></path>
1225
1226
  <path d="M4 17h7"></path>
1226
1227
  <path d="m15 14 5 3-5 3z"></path>
1227
1228
  </svg>
1228
- `}function Uw(){return Kl()}function zw(){return be`
1229
+ `}function zw(){return Kl()}function Bw(){return be`
1229
1230
  <svg class="prompt-action-icon prompt-action-icon-filled" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
1230
1231
  <rect x="6.5" y="6.5" width="11" height="11" rx="2"></rect>
1231
1232
  </svg>
1232
- `}function Bw(e){const t=Math.max(e.total,1),i=t>1?1.2:0,s=3,n=(21-s-i*(t-1))/t,a=Array.from({length:t},(c,p)=>{const u=s+p*(n+i),h=4+(p+1)/t*12,g=20-h,w=p<e.filled;return be`<rect class=${w?"gauge-bar gauge-bar-active":"gauge-bar"} x=${u} y=${g} width=${n} height=${h} rx="1"></rect>`});return be`
1233
+ `}function Nw(e){const t=Math.max(e.total,1),i=t>1?1.2:0,s=3,n=(21-s-i*(t-1))/t,a=Array.from({length:t},(c,p)=>{const u=s+p*(n+i),h=4+(p+1)/t*12,g=20-h,w=p<e.filled;return be`<rect class=${w?"gauge-bar gauge-bar-active":"gauge-bar"} x=${u} y=${g} width=${n} height=${h} rx="1"></rect>`});return be`
1233
1234
  <svg class="prompt-thinking-gauge" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
1234
1235
  ${a}
1235
1236
  </svg>
1236
- `}const Nw=["off","minimal","low","medium","high","xhigh"];function ar(e){return e===void 0||e===""?"off":e}function Hw(e,t){const i=t.length>=2?t:Nw,s=i.length-1,r=ar(e),o=i.indexOf(r),n=o<=0?0:Math.min(o,s);return{total:s,filled:n}}class qw extends jr{constructor(t){super(t),this.wasSelected=!1,this.isElementPart=t.type===_r.ELEMENT}update(t,[i,s]){if(!this.isElementPart)throw new Error("scrollWhenSelected must be used on an element");if(i&&(!this.wasSelected||s!==this.previousKey)){const r="element"in t?t.element:void 0;requestAnimationFrame(()=>{r instanceof HTMLElement&&r.scrollIntoView({block:"nearest"})})}this.wasSelected=i,this.previousKey=s}render(t,i){}}const Xr=Lr(qw);var Kw=Object.defineProperty,Vw=Object.getOwnPropertyDescriptor,ls=(e,t,i,s)=>{for(var r=s>1?void 0:s?Vw(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&Kw(t,i,r),r};const Gw=E`
1237
+ `}const Hw=["off","minimal","low","medium","high","xhigh"];function ar(e){return e===void 0||e===""?"off":e}function qw(e,t){const i=t.length>=2?t:Hw,s=i.length-1,r=ar(e),o=i.indexOf(r),n=o<=0?0:Math.min(o,s);return{total:s,filled:n}}class Kw extends jr{constructor(t){super(t),this.wasSelected=!1,this.isElementPart=t.type===_r.ELEMENT}update(t,[i,s]){if(!this.isElementPart)throw new Error("scrollWhenSelected must be used on an element");if(i&&(!this.wasSelected||s!==this.previousKey)){const r="element"in t?t.element:void 0;requestAnimationFrame(()=>{r instanceof HTMLElement&&r.scrollIntoView({block:"nearest"})})}this.wasSelected=i,this.previousKey=s}render(t,i){}}const Xr=Lr(Kw);var Vw=Object.defineProperty,Gw=Object.getOwnPropertyDescriptor,ls=(e,t,i,s)=>{for(var r=s>1?void 0:s?Gw(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&Vw(t,i,r),r};const Jw=E`
1237
1238
  :host { display: block; }
1238
1239
  .menu { position: absolute; left: 0; right: 0; bottom: calc(100% + 6px); z-index: 10; max-height: 260px; overflow: auto; border: 1px solid var(--pi-border); border-radius: 8px; background: var(--pi-surface); box-shadow: 0 10px 30px var(--pi-shadow); }
1239
1240
  button { display: grid; grid-template-columns: minmax(120px, 1fr) auto; gap: 4px 10px; width: 100%; border: 0; border-bottom: 1px solid var(--pi-border); border-radius: 0; background: transparent; color: var(--pi-text); padding: 8px 10px; text-align: left; cursor: pointer; }
@@ -1251,12 +1252,12 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1251
1252
  </button>
1252
1253
  `)}
1253
1254
  </div>
1254
- `:null}};Pt.styles=Gw;ls([d({attribute:!1})],Pt.prototype,"items",2);ls([d({type:Number})],Pt.prototype,"selectedIndex",2);ls([d({attribute:!1})],Pt.prototype,"onPick",2);Pt=ls([W("autocomplete-menu")],Pt);var Jw=Object.defineProperty,Qw=Object.getOwnPropertyDescriptor,F=(e,t,i,s)=>{for(var r=s>1?void 0:s?Qw(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&Jw(t,i,r),r};let L=class extends A{constructor(){super(...arguments),this.disabled=!1,this.machineId="local",this.workspaceScopedFileSuggestions=!1,this.canSteer=!1,this.isCompacting=!1,this.canStop=!1,this.sending=!1,this.availableThinkingLevels=[],this.draft="",this.currentInputMode={kind:"normal"},this.completions=[],this.selectedIndex=0,this.attachments=[],this.attachmentDelivery=Tw(),this.attachmentError=void 0,this.attachmentSeq=0,this.requestVersion=0,this.editableCompartment=new eo,this.readOnlyCompartment=new eo,this.mobilePromptEnterMedia=ns(),this.explicitShiftKeyActive=!1}willUpdate(e){if(!e.has("sessionId")&&!e.has("machineId"))return;const t=e.has("sessionId")?e.get("sessionId"):this.sessionId,i=e.has("machineId")?e.get("machineId"):this.machineId,s=ci(i,t);s!==void 0&&Mi(s,this.draft);const r=ci(this.machineId,this.sessionId);this.draft=r!==void 0?Fa(r):"",this.currentInputMode=Oi(this.draft),this.completions=[],this.selectedIndex=0}shouldUpdate(e){return e.has("status")&&e.size===1?!Zw(e.get("status"),this.status):!0}firstUpdated(){this.createEditor()}updated(e){e.has("disabled")&&this.updateEditorDisabledState(),(e.has("sessionId")||e.has("machineId"))&&this.syncEditorDoc()}disconnectedCallback(){this.editor?.destroy(),this.editor=void 0,super.disconnectedCallback()}render(){const e=this.currentInputMode.kind==="shell"?this.currentInputMode:void 0,t=e!==void 0,i=this.canSteer||this.isCompacting,s=this.disabled||this.sending;return l`
1255
+ `:null}};Pt.styles=Jw;ls([d({attribute:!1})],Pt.prototype,"items",2);ls([d({type:Number})],Pt.prototype,"selectedIndex",2);ls([d({attribute:!1})],Pt.prototype,"onPick",2);Pt=ls([W("autocomplete-menu")],Pt);var Qw=Object.defineProperty,Zw=Object.getOwnPropertyDescriptor,F=(e,t,i,s)=>{for(var r=s>1?void 0:s?Zw(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&Qw(t,i,r),r};let L=class extends A{constructor(){super(...arguments),this.disabled=!1,this.machineId="local",this.workspaceScopedFileSuggestions=!1,this.canSteer=!1,this.isCompacting=!1,this.canStop=!1,this.sending=!1,this.availableThinkingLevels=[],this.draft="",this.currentInputMode={kind:"normal"},this.completions=[],this.selectedIndex=0,this.attachments=[],this.attachmentDelivery=Mw(),this.attachmentError=void 0,this.attachmentSeq=0,this.requestVersion=0,this.editableCompartment=new eo,this.readOnlyCompartment=new eo,this.mobilePromptEnterMedia=ns(),this.explicitShiftKeyActive=!1}willUpdate(e){if(!e.has("sessionId")&&!e.has("machineId"))return;const t=e.has("sessionId")?e.get("sessionId"):this.sessionId,i=e.has("machineId")?e.get("machineId"):this.machineId,s=ci(i,t);s!==void 0&&Mi(s,this.draft);const r=ci(this.machineId,this.sessionId);this.draft=r!==void 0?Fa(r):"",this.currentInputMode=Oi(this.draft),this.completions=[],this.selectedIndex=0}shouldUpdate(e){return e.has("status")&&e.size===1?!Xw(e.get("status"),this.status):!0}firstUpdated(){this.createEditor()}updated(e){e.has("disabled")&&this.updateEditorDisabledState(),(e.has("sessionId")||e.has("machineId"))&&this.syncEditorDoc()}disconnectedCallback(){this.editor?.destroy(),this.editor=void 0,super.disconnectedCallback()}render(){const e=this.currentInputMode.kind==="shell"?this.currentInputMode:void 0,t=e!==void 0,i=this.canSteer||this.isCompacting,s=this.disabled||this.sending;return l`
1255
1256
  <footer class=${t?"shell-mode":""} @paste=${r=>{this.handlePaste(r)}} @dragover=${r=>{this.handleDragOver(r)}} @drop=${r=>{this.handleDrop(r)}}>
1256
1257
  <div class="editor-wrap">
1257
1258
  <div class=${`markdown-editor${this.disabled?" markdown-editor-disabled":""}`} aria-label="给 pi 发送消息" aria-disabled=${this.disabled?"true":"false"}></div>
1258
1259
  <input class="attachment-input" type="file" multiple hidden @change=${r=>{this.handleFileInput(r)}} />
1259
- <button class="editor-attach icon-button" ?disabled=${s} title="附加文件" aria-label="附加文件" @click=${()=>{this.attachmentInput?.click()}}>${jw()}</button>
1260
+ <button class="editor-attach icon-button" ?disabled=${s} title="附加文件" aria-label="附加文件" @click=${()=>{this.attachmentInput?.click()}}>${Fw()}</button>
1260
1261
  ${t?l`<div class="mode-hint">Shell 命令${e.excludeFromContext?" · 已排除上下文":""}</div>`:null}
1261
1262
  ${this.isCompacting&&!t?l`<div class="mode-hint">正在压缩历史 · 消息将排队发送</div>`:null}
1262
1263
  ${this.renderAttachments()}
@@ -1264,15 +1265,15 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1264
1265
  </div>
1265
1266
  <div class="actions">
1266
1267
  ${this.renderCompactStatus()}
1267
- <button class="icon-button send-button" ?disabled=${s} title=${i?"当前活动结束后排队发送":"发送"} aria-label=${i?"排队发送":"发送"} @click=${()=>{this.send("followUp")}}>${i?Fw():Kl()}</button>
1268
- ${this.canSteer&&!this.isCompacting?l`<button class="icon-button steer-button" ?disabled=${s} title="在下次模型调用前引导当前回复" aria-label="引导当前回复" @click=${()=>{this.send("steer")}}>${Uw()}</button>`:null}
1269
- <button class="icon-button stop-button" ?disabled=${this.disabled||!this.canStop} title=${this.canStop?"停止当前工作并清空排队消息":"当前没有运行任务"} aria-label="停止" @click=${()=>this.onStop?.()}>${zw()}</button>
1268
+ <button class="icon-button send-button" ?disabled=${s} title=${i?"当前活动结束后排队发送":"发送"} aria-label=${i?"排队发送":"发送"} @click=${()=>{this.send("followUp")}}>${i?Uw():Kl()}</button>
1269
+ ${this.canSteer&&!this.isCompacting?l`<button class="icon-button steer-button" ?disabled=${s} title="在下次模型调用前引导当前回复" aria-label="引导当前回复" @click=${()=>{this.send("steer")}}>${zw()}</button>`:null}
1270
+ <button class="icon-button stop-button" ?disabled=${this.disabled||!this.canStop} title=${this.canStop?"停止当前工作并清空排队消息":"当前没有运行任务"} aria-label="停止" @click=${()=>this.onStop?.()}>${Bw()}</button>
1270
1271
  </div>
1271
1272
  </footer>
1272
1273
  `}focusInput(){this.editor?.focus()}get view(){return this.editor}renderCompactStatus(){const e=this.status;if(e===void 0)return null;const t=e.model?.id??"无模型",i=e.model?.provider!==void 0&&e.model.provider!==""?`${e.model.provider}/`:"";return l`
1273
1274
  <div class="compact-status" aria-label="会话状态">
1274
1275
  <button class="select-model" title="选择模型" @click=${()=>this.onSelectModel?.()}>${i}${t}</button>
1275
- <button class="select-thinking icon-button" title=${`思考级别:${ar(e.thinkingLevel)}`} aria-label=${`思考级别:${ar(e.thinkingLevel)}`} @click=${()=>this.onSelectThinking?.()}>${Bw(Hw(e.thinkingLevel,this.availableThinkingLevels))}</button>
1276
+ <button class="select-thinking icon-button" title=${`思考级别:${ar(e.thinkingLevel)}`} aria-label=${`思考级别:${ar(e.thinkingLevel)}`} @click=${()=>this.onSelectThinking?.()}>${Nw(qw(e.thinkingLevel,this.availableThinkingLevels))}</button>
1276
1277
  </div>
1277
1278
  `}renderAttachments(){if(this.attachments.length===0&&this.attachmentError===void 0)return null;const e=nr(this.attachments),t=this.effectiveAttachmentDelivery();return l`
1278
1279
  <div class="attachments" aria-label="待发送附件">
@@ -1293,9 +1294,9 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1293
1294
  ${this.attachmentError!==void 0?l`<div class="attachment-error">${this.attachmentError}</div>`:null}
1294
1295
  </div>
1295
1296
  `}renderAttachmentPreview(e){return or(e)?l`<img src=${`data:${e.mimeType};base64,${e.data}`} alt=${e.name} />`:l`
1296
- <div class="attachment-file-preview" aria-hidden="true">${iy(e.name)}</div>
1297
+ <div class="attachment-file-preview" aria-hidden="true">${sy(e.name)}</div>
1297
1298
  <span class="attachment-file-name">${e.name}</span>
1298
- `}changeDelivery(e){if(!(e.target instanceof HTMLSelectElement))return;const t=e.target.value==="folder"?"folder":"inline";if(t==="inline"&&!nr(this.attachments)){e.target.value="folder";return}this.attachmentDelivery=t,Mw(this.attachmentDelivery)}removeAttachment(e){this.attachments=this.attachments.filter(t=>t.id!==e)}async handlePaste(e){const t=Jn(e.clipboardData);t.length!==0&&(e.preventDefault(),await this.addAttachmentFiles(t))}handleDragOver(e){e.dataTransfer!==null&&ey(e.dataTransfer)&&e.preventDefault()}async handleDrop(e){const t=Jn(e.dataTransfer);t.length!==0&&(e.preventDefault(),await this.addAttachmentFiles(t))}async handleFileInput(e){if(!(e.target instanceof HTMLInputElement)||e.target.files===null)return;const t=Array.from(e.target.files);e.target.value="",await this.addAttachmentFiles(t)}async addAttachmentFiles(e){this.attachmentError=void 0;const{attachments:t,error:i}=await Cw(e,sy);t.length>0&&(this.attachments=[...this.attachments,...t.map(s=>({id:`attachment-${String(++this.attachmentSeq)}`,...s}))]),i!==void 0&&(this.attachmentError=i)}currentAttachments(){return this.attachments.map(e=>ty(e))}effectiveAttachmentDelivery(){return Iw(this.attachmentDelivery,this.attachments)}createEditor(){!this.editorHost||this.editor!==void 0||(this.editor=new it({parent:this.editorHost,state:hs.create({doc:this.draft,extensions:[ec(),dc(),tc(),ic.of(" "),sc(rc,{fallback:!0}),it.lineWrapping,it.contentAttributes.of(e=>ny(e.state.sliceDoc(0,e.state.selection.main.head))),it.domEventHandlers({keyup:e=>this.handleEditorKeyUp(e),blur:()=>this.resetEditorModifierState()}),oc("给 pi 发送消息... 使用 / 输入命令,@ 输入已跟踪文件,@ 空格显示所有文件"),this.editableCompartment.of(it.editable.of(!this.disabled)),this.readOnlyCompartment.of(hs.readOnly.of(this.disabled)),it.updateListener.of(e=>{e.docChanged&&this.updateDraft(e.state.doc.toString())}),nc.of([{any:(e,t)=>this.handleEditorKeyDown(t,e)},{key:"ArrowDown",run:()=>this.moveCompletion(1)},{key:"ArrowUp",run:()=>this.moveCompletion(-1)},{key:"Escape",run:()=>this.closeCompletions()},{key:"Tab",run:e=>this.handleEditorTab(e)},{key:"Shift-Tab",run:e=>to.shift?.(e)??!1},{key:"Backspace",run:e=>pc(e)},...ac,...lc])]})}))}syncEditorDoc(){const e=this.editor;if(!e)return;const t=e.state.doc.toString();t!==this.draft&&e.dispatch({changes:{from:0,to:t.length,insert:this.draft},selection:io.cursor(this.draft.length)})}updateEditorDisabledState(){this.editor?.dispatch({effects:[this.editableCompartment.reconfigure(it.editable.of(!this.disabled)),this.readOnlyCompartment.reconfigure(hs.readOnly.of(this.disabled))]})}updateDraft(e){this.draft=e;const t=ci(this.machineId,this.sessionId);t!==void 0&&Mi(t,this.draft);const i=Oi(this.draft);Ru(i,this.currentInputMode)||(this.currentInputMode=i),this.refreshCompletions()}async refreshCompletions(){const e=this.currentTrigger(),t=++this.requestVersion;if(this.selectedIndex=0,e===void 0){this.completions=[];return}if(e.kind==="command"&&this.sessionId!==void 0&&this.sessionId!==""&&this.cwd!==void 0&&this.cwd!==""){const i=await N.commands({id:this.sessionId,cwd:this.cwd},this.machineId).catch(Xw);if(t!==this.requestVersion)return;this.completions=i.filter(s=>s.name.toLowerCase().includes(e.query.toLowerCase())).slice(0,12).map(s=>({kind:"command",replaceFrom:e.from,replaceTo:e.to,insertText:`/${s.name}`,detail:s.source,...s.description===void 0?{}:{description:s.description}}))}else if(e.kind==="file"&&this.cwd!==void 0&&this.cwd!==""){const i=await N.files(this.cwd,e.query,{scope:e.fileScope,machineId:this.machineId,projectId:this.projectId,workspaceId:this.workspaceId,workspaceScoped:this.workspaceScopedFileSuggestions}).catch(Yw);if(t!==this.requestVersion)return;this.completions=i.slice(0,12).map(s=>{const r=Ka(s.path,e.quoted===!0,s.path.endsWith("/")?e.allPrefix:void 0);return{kind:"file",replaceFrom:e.from,replaceTo:e.to,insertText:r,detail:s.kind,...s.path.endsWith("/")&&r.endsWith('"')?{cursorOffset:r.length-1}:{}}})}}currentTrigger(){return qa(this.draft,this.editor?.state.selection.main.head??this.draft.length)}moveCompletion(e){return this.completions.length?(this.selectedIndex=(this.selectedIndex+e+this.completions.length)%this.completions.length,!0):!1}closeCompletions(){return this.completions.length?(this.completions=[],!0):!1}handleEditorKeyDown(e,t){if(e.key==="Shift")return this.explicitShiftKeyActive=!0,!1;if(e.key!=="Enter")return this.explicitShiftKeyActive=!1,!1;if(e.defaultPrevented||e.isComposing||t.composing)return!1;const i=_w(e.shiftKey,this.explicitShiftKeyActive,this.mobilePromptEnterMedia);return this.explicitShiftKeyActive=!1,this.handleEditorEnter(t,i)}handleEditorKeyUp(e){return e.key==="Shift"&&(this.explicitShiftKeyActive=!1),!1}resetEditorModifierState(){return this.explicitShiftKeyActive=!1,!1}handleEditorEnter(e,t){if(!t&&this.completions.length){const i=this.completions[this.selectedIndex];return i!==void 0&&this.pick(i),!0}return Lw(t,this.mobilePromptEnterMedia,as())?(this.send(this.canSteer||this.isCompacting?"followUp":void 0),!0):hc(e)||cc(e)}handleEditorTab(e){if(this.completions.length){const i=this.completions[this.selectedIndex];return i!==void 0&&this.pick(i),!0}return this.currentTrigger()?.kind==="file"?(this.refreshCompletions(),!0):to.run?.(e)??!1}pick(e){const t=this.editor;if(!t)return;const i=e.kind==="file"&&(e.insertText.endsWith("/")||e.cursorOffset!==void 0)?"":" ",s=e.replaceFrom+(e.cursorOffset??e.insertText.length)+i.length,r=e.insertText.endsWith('"')&&this.draft.slice(e.replaceTo).startsWith('"')?e.replaceTo+1:e.replaceTo;t.dispatch({changes:{from:e.replaceFrom,to:r,insert:`${e.insertText}${i}`},selection:io.cursor(s),scrollIntoView:!0}),this.completions=[]}send(e){if(this.disabled||this.sending)return;const t=this.draft.trim(),i=this.attachments;if(t===""&&i.length===0)return;const s=this.canSteer||this.isCompacting?e:void 0,r=i.length>0?this.currentAttachments():void 0,o=this.effectiveAttachmentDelivery();this.resetComposer(),this.onSend?.(t,s,r,r===void 0?void 0:o)}resetComposer(){this.draft="",this.currentInputMode={kind:"normal"};const e=ci(this.machineId,this.sessionId);e!==void 0&&Ir(e),this.completions=[],this.attachments=[],this.attachmentError=void 0,this.syncEditorDoc()}};L.styles=hg;F([d({type:Boolean})],L.prototype,"disabled",2);F([d()],L.prototype,"sessionId",2);F([d()],L.prototype,"cwd",2);F([d()],L.prototype,"machineId",2);F([d()],L.prototype,"projectId",2);F([d()],L.prototype,"workspaceId",2);F([d({type:Boolean})],L.prototype,"workspaceScopedFileSuggestions",2);F([d({type:Boolean})],L.prototype,"canSteer",2);F([d({type:Boolean})],L.prototype,"isCompacting",2);F([d({type:Boolean})],L.prototype,"canStop",2);F([d({attribute:!1})],L.prototype,"status",2);F([d({type:Boolean})],L.prototype,"sending",2);F([d({attribute:!1})],L.prototype,"onSend",2);F([d({attribute:!1})],L.prototype,"onStop",2);F([d({attribute:!1})],L.prototype,"onSelectModel",2);F([d({attribute:!1})],L.prototype,"onSelectThinking",2);F([d({attribute:!1})],L.prototype,"availableThinkingLevels",2);F([B(".markdown-editor")],L.prototype,"editorHost",2);F([B(".attachment-input")],L.prototype,"attachmentInput",2);F([x()],L.prototype,"currentInputMode",2);F([x()],L.prototype,"completions",2);F([x()],L.prototype,"selectedIndex",2);F([x()],L.prototype,"attachments",2);F([x()],L.prototype,"attachmentDelivery",2);F([x()],L.prototype,"attachmentError",2);L=F([W("prompt-editor")],L);function Zw(e,t){return e===t?!0:e===void 0||t===void 0?!1:e.model?.id===t.model?.id&&e.model?.provider===t.model?.provider&&e.thinkingLevel===t.thinkingLevel}function ci(e,t){if(!(typeof e!="string"||e==="")&&!(typeof t!="string"||t===""))return La(e,t)}function Xw(){return[]}function Yw(){return[]}function Jn(e){return e===null?[]:Array.from(e.files)}function ey(e){const t=Array.from(e.items);return t.length>0?t.some(i=>i.kind==="file"):Array.from(e.types).includes("Files")}function ty(e){return e.kind==="image"?{kind:"image",mimeType:e.mimeType,data:e.data,name:e.name}:{kind:"file",mimeType:e.mimeType,data:e.data,name:e.name}}function iy(e){const t=e.trim(),i=t.lastIndexOf(".");return i>=0&&i<t.length-1?t.slice(i+1,i+5).toUpperCase():"FILE"}function sy(e){return new Promise((t,i)=>{const s=new FileReader;s.onerror=()=>{i(s.error??new Error("读取文件失败"))},s.onload=()=>{const r=s.result;if(typeof r!="string"){i(new Error("文件读取结果异常"));return}const o=r.indexOf(",");t(o===-1?r:r.slice(o+1))},s.readAsDataURL(e)})}const ry={spellcheck:"true",autocorrect:"on",autocapitalize:"sentences",writingsuggestions:"true",dir:"auto"},oy={spellcheck:"false",autocorrect:"off",autocapitalize:"off",writingsuggestions:"false",dir:"auto"};function ny(e){return Oi(e).kind==="normal"?ry:oy}function di(e){return Number.isFinite(e)?e<1e3?Math.round(e).toString():e<1e4?`${(e/1e3).toFixed(1)}k`:e<1e6?`${String(Math.round(e/1e3))}k`:e<1e7?`${(e/1e6).toFixed(1)}M`:`${String(Math.round(e/1e6))}M`:"0"}function ay(e){return!Number.isFinite(e)||e===0?"$0":e<.01?`$${e.toFixed(4)}`:`$${e.toFixed(2)}`}var ly=Object.defineProperty,cy=Object.getOwnPropertyDescriptor,Vl=(e,t,i,s)=>{for(var r=s>1?void 0:s?cy(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&ly(t,i,r),r};const dy=E`
1299
+ `}changeDelivery(e){if(!(e.target instanceof HTMLSelectElement))return;const t=e.target.value==="folder"?"folder":"inline";if(t==="inline"&&!nr(this.attachments)){e.target.value="folder";return}this.attachmentDelivery=t,Ew(this.attachmentDelivery)}removeAttachment(e){this.attachments=this.attachments.filter(t=>t.id!==e)}async handlePaste(e){const t=Jn(e.clipboardData);t.length!==0&&(e.preventDefault(),await this.addAttachmentFiles(t))}handleDragOver(e){e.dataTransfer!==null&&ty(e.dataTransfer)&&e.preventDefault()}async handleDrop(e){const t=Jn(e.dataTransfer);t.length!==0&&(e.preventDefault(),await this.addAttachmentFiles(t))}async handleFileInput(e){if(!(e.target instanceof HTMLInputElement)||e.target.files===null)return;const t=Array.from(e.target.files);e.target.value="",await this.addAttachmentFiles(t)}async addAttachmentFiles(e){this.attachmentError=void 0;const{attachments:t,error:i}=await Iw(e,ry);t.length>0&&(this.attachments=[...this.attachments,...t.map(s=>({id:`attachment-${String(++this.attachmentSeq)}`,...s}))]),i!==void 0&&(this.attachmentError=i)}currentAttachments(){return this.attachments.map(e=>iy(e))}effectiveAttachmentDelivery(){return Rw(this.attachmentDelivery,this.attachments)}createEditor(){!this.editorHost||this.editor!==void 0||(this.editor=new it({parent:this.editorHost,state:hs.create({doc:this.draft,extensions:[ec(),dc(),tc(),ic.of(" "),sc(rc,{fallback:!0}),it.lineWrapping,it.contentAttributes.of(e=>ay(e.state.sliceDoc(0,e.state.selection.main.head))),it.domEventHandlers({keyup:e=>this.handleEditorKeyUp(e),blur:()=>this.resetEditorModifierState()}),oc("给 pi 发送消息... 使用 / 输入命令,@ 输入已跟踪文件,@ 空格显示所有文件"),this.editableCompartment.of(it.editable.of(!this.disabled)),this.readOnlyCompartment.of(hs.readOnly.of(this.disabled)),it.updateListener.of(e=>{e.docChanged&&this.updateDraft(e.state.doc.toString())}),nc.of([{any:(e,t)=>this.handleEditorKeyDown(t,e)},{key:"ArrowDown",run:()=>this.moveCompletion(1)},{key:"ArrowUp",run:()=>this.moveCompletion(-1)},{key:"Escape",run:()=>this.closeCompletions()},{key:"Tab",run:e=>this.handleEditorTab(e)},{key:"Shift-Tab",run:e=>to.shift?.(e)??!1},{key:"Backspace",run:e=>pc(e)},...ac,...lc])]})}))}syncEditorDoc(){const e=this.editor;if(!e)return;const t=e.state.doc.toString();t!==this.draft&&e.dispatch({changes:{from:0,to:t.length,insert:this.draft},selection:io.cursor(this.draft.length)})}updateEditorDisabledState(){this.editor?.dispatch({effects:[this.editableCompartment.reconfigure(it.editable.of(!this.disabled)),this.readOnlyCompartment.reconfigure(hs.readOnly.of(this.disabled))]})}updateDraft(e){this.draft=e;const t=ci(this.machineId,this.sessionId);t!==void 0&&Mi(t,this.draft);const i=Oi(this.draft);Ru(i,this.currentInputMode)||(this.currentInputMode=i),this.refreshCompletions()}async refreshCompletions(){const e=this.currentTrigger(),t=++this.requestVersion;if(this.selectedIndex=0,e===void 0){this.completions=[];return}if(e.kind==="command"&&this.sessionId!==void 0&&this.sessionId!==""&&this.cwd!==void 0&&this.cwd!==""){const i=await N.commands({id:this.sessionId,cwd:this.cwd},this.machineId).catch(Yw);if(t!==this.requestVersion)return;this.completions=i.filter(s=>s.name.toLowerCase().includes(e.query.toLowerCase())).slice(0,12).map(s=>({kind:"command",replaceFrom:e.from,replaceTo:e.to,insertText:`/${s.name}`,detail:s.source,...s.description===void 0?{}:{description:s.description}}))}else if(e.kind==="file"&&this.cwd!==void 0&&this.cwd!==""){const i=await N.files(this.cwd,e.query,{scope:e.fileScope,machineId:this.machineId,projectId:this.projectId,workspaceId:this.workspaceId,workspaceScoped:this.workspaceScopedFileSuggestions}).catch(ey);if(t!==this.requestVersion)return;this.completions=i.slice(0,12).map(s=>{const r=Ka(s.path,e.quoted===!0,s.path.endsWith("/")?e.allPrefix:void 0);return{kind:"file",replaceFrom:e.from,replaceTo:e.to,insertText:r,detail:s.kind,...s.path.endsWith("/")&&r.endsWith('"')?{cursorOffset:r.length-1}:{}}})}}currentTrigger(){return qa(this.draft,this.editor?.state.selection.main.head??this.draft.length)}moveCompletion(e){return this.completions.length?(this.selectedIndex=(this.selectedIndex+e+this.completions.length)%this.completions.length,!0):!1}closeCompletions(){return this.completions.length?(this.completions=[],!0):!1}handleEditorKeyDown(e,t){if(e.key==="Shift")return this.explicitShiftKeyActive=!0,!1;if(e.key!=="Enter")return this.explicitShiftKeyActive=!1,!1;if(e.defaultPrevented||e.isComposing||t.composing)return!1;const i=Lw(e.shiftKey,this.explicitShiftKeyActive,this.mobilePromptEnterMedia);return this.explicitShiftKeyActive=!1,this.handleEditorEnter(t,i)}handleEditorKeyUp(e){return e.key==="Shift"&&(this.explicitShiftKeyActive=!1),!1}resetEditorModifierState(){return this.explicitShiftKeyActive=!1,!1}handleEditorEnter(e,t){if(!t&&this.completions.length){const i=this.completions[this.selectedIndex];return i!==void 0&&this.pick(i),!0}return jw(t,this.mobilePromptEnterMedia,as())?(this.send(this.canSteer||this.isCompacting?"followUp":void 0),!0):hc(e)||cc(e)}handleEditorTab(e){if(this.completions.length){const i=this.completions[this.selectedIndex];return i!==void 0&&this.pick(i),!0}return this.currentTrigger()?.kind==="file"?(this.refreshCompletions(),!0):to.run?.(e)??!1}pick(e){const t=this.editor;if(!t)return;const i=e.kind==="file"&&(e.insertText.endsWith("/")||e.cursorOffset!==void 0)?"":" ",s=e.replaceFrom+(e.cursorOffset??e.insertText.length)+i.length,r=e.insertText.endsWith('"')&&this.draft.slice(e.replaceTo).startsWith('"')?e.replaceTo+1:e.replaceTo;t.dispatch({changes:{from:e.replaceFrom,to:r,insert:`${e.insertText}${i}`},selection:io.cursor(s),scrollIntoView:!0}),this.completions=[]}send(e){if(this.disabled||this.sending)return;const t=this.draft.trim(),i=this.attachments;if(t===""&&i.length===0)return;const s=this.canSteer||this.isCompacting?e:void 0,r=i.length>0?this.currentAttachments():void 0,o=this.effectiveAttachmentDelivery();this.resetComposer(),this.onSend?.(t,s,r,r===void 0?void 0:o)}resetComposer(){this.draft="",this.currentInputMode={kind:"normal"};const e=ci(this.machineId,this.sessionId);e!==void 0&&Ir(e),this.completions=[],this.attachments=[],this.attachmentError=void 0,this.syncEditorDoc()}};L.styles=hg;F([d({type:Boolean})],L.prototype,"disabled",2);F([d()],L.prototype,"sessionId",2);F([d()],L.prototype,"cwd",2);F([d()],L.prototype,"machineId",2);F([d()],L.prototype,"projectId",2);F([d()],L.prototype,"workspaceId",2);F([d({type:Boolean})],L.prototype,"workspaceScopedFileSuggestions",2);F([d({type:Boolean})],L.prototype,"canSteer",2);F([d({type:Boolean})],L.prototype,"isCompacting",2);F([d({type:Boolean})],L.prototype,"canStop",2);F([d({attribute:!1})],L.prototype,"status",2);F([d({type:Boolean})],L.prototype,"sending",2);F([d({attribute:!1})],L.prototype,"onSend",2);F([d({attribute:!1})],L.prototype,"onStop",2);F([d({attribute:!1})],L.prototype,"onSelectModel",2);F([d({attribute:!1})],L.prototype,"onSelectThinking",2);F([d({attribute:!1})],L.prototype,"availableThinkingLevels",2);F([B(".markdown-editor")],L.prototype,"editorHost",2);F([B(".attachment-input")],L.prototype,"attachmentInput",2);F([x()],L.prototype,"currentInputMode",2);F([x()],L.prototype,"completions",2);F([x()],L.prototype,"selectedIndex",2);F([x()],L.prototype,"attachments",2);F([x()],L.prototype,"attachmentDelivery",2);F([x()],L.prototype,"attachmentError",2);L=F([W("prompt-editor")],L);function Xw(e,t){return e===t?!0:e===void 0||t===void 0?!1:e.model?.id===t.model?.id&&e.model?.provider===t.model?.provider&&e.thinkingLevel===t.thinkingLevel}function ci(e,t){if(!(typeof e!="string"||e==="")&&!(typeof t!="string"||t===""))return La(e,t)}function Yw(){return[]}function ey(){return[]}function Jn(e){return e===null?[]:Array.from(e.files)}function ty(e){const t=Array.from(e.items);return t.length>0?t.some(i=>i.kind==="file"):Array.from(e.types).includes("Files")}function iy(e){return e.kind==="image"?{kind:"image",mimeType:e.mimeType,data:e.data,name:e.name}:{kind:"file",mimeType:e.mimeType,data:e.data,name:e.name}}function sy(e){const t=e.trim(),i=t.lastIndexOf(".");return i>=0&&i<t.length-1?t.slice(i+1,i+5).toUpperCase():"FILE"}function ry(e){return new Promise((t,i)=>{const s=new FileReader;s.onerror=()=>{i(s.error??new Error("读取文件失败"))},s.onload=()=>{const r=s.result;if(typeof r!="string"){i(new Error("文件读取结果异常"));return}const o=r.indexOf(",");t(o===-1?r:r.slice(o+1))},s.readAsDataURL(e)})}const oy={spellcheck:"true",autocorrect:"on",autocapitalize:"sentences",writingsuggestions:"true",dir:"auto"},ny={spellcheck:"false",autocorrect:"off",autocapitalize:"off",writingsuggestions:"false",dir:"auto"};function ay(e){return Oi(e).kind==="normal"?oy:ny}function di(e){return Number.isFinite(e)?e<1e3?Math.round(e).toString():e<1e4?`${(e/1e3).toFixed(1)}k`:e<1e6?`${String(Math.round(e/1e3))}k`:e<1e7?`${(e/1e6).toFixed(1)}M`:`${String(Math.round(e/1e6))}M`:"0"}function ly(e){return!Number.isFinite(e)||e===0?"$0":e<.01?`$${e.toFixed(4)}`:`$${e.toFixed(2)}`}var cy=Object.defineProperty,dy=Object.getOwnPropertyDescriptor,Vl=(e,t,i,s)=>{for(var r=s>1?void 0:s?dy(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&cy(t,i,r),r};const py=E`
1299
1300
  :host { display: block; color: var(--pi-muted); font: 12px system-ui, sans-serif; }
1300
1301
  .bar { display: flex; justify-content: flex-end; gap: 12px; align-items: center; min-width: 0; padding: 7px 12px; border-top: 1px solid var(--pi-border); background: var(--pi-bg); white-space: nowrap; overflow: hidden; }
1301
1302
  span { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
@@ -1310,10 +1311,10 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1310
1311
  <span>↑${di(s.input)}</span>
1311
1312
  <span>↓${di(s.output)}</span>
1312
1313
  <span class="context">${i}</span>
1313
- <span>${ay(e.cost)}</span>
1314
+ <span>${ly(e.cost)}</span>
1314
1315
  ${e.pendingMessageCount>0?l`<span>${String(e.pendingMessageCount)} 条排队</span>`:null}
1315
1316
  </div>
1316
- `}};Ni.styles=dy;Vl([d({attribute:!1})],Ni.prototype,"status",2);Ni=Vl([W("status-bar")],Ni);const Gl=E`
1317
+ `}};Ni.styles=py;Vl([d({attribute:!1})],Ni.prototype,"status",2);Ni=Vl([W("status-bar")],Ni);const Gl=E`
1317
1318
  :host { position: fixed; inset: 0; z-index: 10; color: var(--pi-text); font: 14px system-ui, sans-serif; }
1318
1319
  .backdrop { display: grid; place-items: center; width: 100%; height: 100%; background: var(--pi-overlay); }
1319
1320
  section { width: min(720px, calc(100vw - 40px)); max-height: min(640px, calc(100vh - 40px)); display: flex; flex-direction: column; border: 1px solid var(--pi-border); border-radius: 12px; background: var(--pi-bg); box-shadow: 0 20px 60px var(--pi-shadow-strong); overflow: hidden; }
@@ -1327,7 +1328,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1327
1328
  .options button.selected, .options button:hover { background: var(--pi-selection-bg); }
1328
1329
  small { display: block; margin-top: 4px; color: var(--pi-muted); }
1329
1330
  .empty { padding: 24px; color: var(--pi-muted); text-align: center; }
1330
- `;var py=Object.defineProperty,hy=Object.getOwnPropertyDescriptor,Ve=(e,t,i,s)=>{for(var r=s>1?void 0:s?hy(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&py(t,i,r),r};let Me=class extends A{constructor(){super(...arguments),this.title="选择",this.searchable=!1,this.options=[],this.selectedIndex=0,this.query=""}render(){const e=this.filteredOptions();return l`
1331
+ `;var hy=Object.defineProperty,uy=Object.getOwnPropertyDescriptor,Ve=(e,t,i,s)=>{for(var r=s>1?void 0:s?uy(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&hy(t,i,r),r};let Me=class extends A{constructor(){super(...arguments),this.title="选择",this.searchable=!1,this.options=[],this.selectedIndex=0,this.query=""}render(){const e=this.filteredOptions();return l`
1331
1332
  <div class="backdrop" @mousedown=${()=>this.onCancel?.()}>
1332
1333
  <section @mousedown=${t=>{t.stopPropagation()}}>
1333
1334
  <header>
@@ -1346,7 +1347,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1346
1347
  </div>
1347
1348
  </section>
1348
1349
  </div>
1349
- `}firstUpdated(){this.selectInitialValue(),this.renderRoot.querySelector(this.searchable?"input":".options")?.focus()}selectInitialValue(){if(this.selectedValue===void 0)return;const e=this.filteredOptions().findIndex(t=>t.value===this.selectedValue);e>=0&&(this.selectedIndex=e)}handleSearchInput(e){e.target instanceof HTMLInputElement&&(this.query=e.target.value,this.selectedIndex=0)}filteredOptions(){const e=this.query.trim().toLowerCase();return e===""?this.options:this.options.filter(t=>`${t.label} ${t.description??""} ${t.value}`.toLowerCase().includes(e))}handleKeyDown(e){const t=this.filteredOptions();if(e.key==="Escape")e.preventDefault(),this.onCancel?.();else if(e.key==="ArrowDown")e.preventDefault(),t.length>0&&(this.selectedIndex=(this.selectedIndex+1)%t.length);else if(e.key==="ArrowUp")e.preventDefault(),t.length>0&&(this.selectedIndex=(this.selectedIndex-1+t.length)%t.length);else if(e.key==="Enter"){e.preventDefault();const i=t[this.selectedIndex];i&&this.onPick?.(i.value)}}};Me.styles=Gl;Ve([d()],Me.prototype,"title",2);Ve([d({type:Boolean})],Me.prototype,"searchable",2);Ve([d({attribute:!1})],Me.prototype,"options",2);Ve([d({attribute:!1})],Me.prototype,"selectedValue",2);Ve([d({attribute:!1})],Me.prototype,"onPick",2);Ve([d({attribute:!1})],Me.prototype,"onCancel",2);Ve([x()],Me.prototype,"selectedIndex",2);Ve([x()],Me.prototype,"query",2);Me=Ve([W("command-picker")],Me);var uy=Object.defineProperty,fy=Object.getOwnPropertyDescriptor,ut=(e,t,i,s)=>{for(var r=s>1?void 0:s?fy(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&uy(t,i,r),r};const gy=E`
1350
+ `}firstUpdated(){this.selectInitialValue(),this.renderRoot.querySelector(this.searchable?"input":".options")?.focus()}selectInitialValue(){if(this.selectedValue===void 0)return;const e=this.filteredOptions().findIndex(t=>t.value===this.selectedValue);e>=0&&(this.selectedIndex=e)}handleSearchInput(e){e.target instanceof HTMLInputElement&&(this.query=e.target.value,this.selectedIndex=0)}filteredOptions(){const e=this.query.trim().toLowerCase();return e===""?this.options:this.options.filter(t=>`${t.label} ${t.description??""} ${t.value}`.toLowerCase().includes(e))}handleKeyDown(e){const t=this.filteredOptions();if(e.key==="Escape")e.preventDefault(),this.onCancel?.();else if(e.key==="ArrowDown")e.preventDefault(),t.length>0&&(this.selectedIndex=(this.selectedIndex+1)%t.length);else if(e.key==="ArrowUp")e.preventDefault(),t.length>0&&(this.selectedIndex=(this.selectedIndex-1+t.length)%t.length);else if(e.key==="Enter"){e.preventDefault();const i=t[this.selectedIndex];i&&this.onPick?.(i.value)}}};Me.styles=Gl;Ve([d()],Me.prototype,"title",2);Ve([d({type:Boolean})],Me.prototype,"searchable",2);Ve([d({attribute:!1})],Me.prototype,"options",2);Ve([d({attribute:!1})],Me.prototype,"selectedValue",2);Ve([d({attribute:!1})],Me.prototype,"onPick",2);Ve([d({attribute:!1})],Me.prototype,"onCancel",2);Ve([x()],Me.prototype,"selectedIndex",2);Ve([x()],Me.prototype,"query",2);Me=Ve([W("command-picker")],Me);var fy=Object.defineProperty,gy=Object.getOwnPropertyDescriptor,ut=(e,t,i,s)=>{for(var r=s>1?void 0:s?gy(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&fy(t,i,r),r};const my=E`
1350
1351
  :host { position: fixed; inset: 0; z-index: 20; color: var(--pi-text); font: 14px system-ui, sans-serif; }
1351
1352
  .backdrop { --palette-top: min(12dvh, 90px); --palette-bottom: max(20px, env(safe-area-inset-bottom)); display: grid; align-items: start; justify-items: center; width: 100%; height: 100dvh; background: var(--pi-overlay); padding: var(--palette-top) 20px var(--palette-bottom); box-sizing: border-box; overflow: hidden; }
1352
1353
  section { width: min(720px, 100%); max-height: min(640px, calc(100dvh - var(--palette-top) - var(--palette-bottom))); display: flex; flex-direction: column; border: 1px solid var(--pi-border); border-radius: 12px; background: var(--pi-bg); box-shadow: 0 20px 60px var(--pi-shadow-strong); overflow: hidden; }
@@ -1390,7 +1391,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1390
1391
  </div>
1391
1392
  </section>
1392
1393
  </div>
1393
- `}firstUpdated(){this.input?.focus()}updated(e){if(!e.has("actions")&&!e.has("queryText"))return;const t=Math.max(0,this.filteredActions().length-1);this.selectedIndex>t&&(this.selectedIndex=t)}filteredActions(){return my(this.actions,this.queryText)}handleKeyDown(e){const t=this.filteredActions();if(e.key==="Escape")e.preventDefault(),this.onCancel?.();else if(e.key==="ArrowDown")e.preventDefault(),t.length>0&&(this.selectedIndex=(this.selectedIndex+1)%t.length);else if(e.key==="ArrowUp")e.preventDefault(),t.length>0&&(this.selectedIndex=(this.selectedIndex-1+t.length)%t.length);else if(e.key==="Enter"){e.preventDefault();const i=t[this.selectedIndex];i!==void 0&&this.run(i)}}run(e){e.enabled!==!1&&this.onRun?.(e)}};He.styles=gy;ut([d({attribute:!1})],He.prototype,"actions",2);ut([d({attribute:!1})],He.prototype,"onRun",2);ut([d({attribute:!1})],He.prototype,"onCancel",2);ut([B("input")],He.prototype,"input",2);ut([x()],He.prototype,"queryText",2);ut([x()],He.prototype,"selectedIndex",2);He=ut([W("action-palette")],He);function my(e,t){const i=t.trim().toLowerCase();return e.filter(s=>s.enabled!==!1||s.disabledReason!==void 0).filter(s=>i===""?!0:[s.title,s.description??"",s.disabledReason??"",s.group??"",s.shortcut??""].join(" ").toLowerCase().includes(i))}var vy=Object.defineProperty,by=Object.getOwnPropertyDescriptor,Pe=(e,t,i,s)=>{for(var r=s>1?void 0:s?by(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&vy(t,i,r),r};let le=class extends A{render(){const e=this.state;return e===void 0?null:l`
1394
+ `}firstUpdated(){this.input?.focus()}updated(e){if(!e.has("actions")&&!e.has("queryText"))return;const t=Math.max(0,this.filteredActions().length-1);this.selectedIndex>t&&(this.selectedIndex=t)}filteredActions(){return vy(this.actions,this.queryText)}handleKeyDown(e){const t=this.filteredActions();if(e.key==="Escape")e.preventDefault(),this.onCancel?.();else if(e.key==="ArrowDown")e.preventDefault(),t.length>0&&(this.selectedIndex=(this.selectedIndex+1)%t.length);else if(e.key==="ArrowUp")e.preventDefault(),t.length>0&&(this.selectedIndex=(this.selectedIndex-1+t.length)%t.length);else if(e.key==="Enter"){e.preventDefault();const i=t[this.selectedIndex];i!==void 0&&this.run(i)}}run(e){e.enabled!==!1&&this.onRun?.(e)}};He.styles=my;ut([d({attribute:!1})],He.prototype,"actions",2);ut([d({attribute:!1})],He.prototype,"onRun",2);ut([d({attribute:!1})],He.prototype,"onCancel",2);ut([B("input")],He.prototype,"input",2);ut([x()],He.prototype,"queryText",2);ut([x()],He.prototype,"selectedIndex",2);He=ut([W("action-palette")],He);function vy(e,t){const i=t.trim().toLowerCase();return e.filter(s=>s.enabled!==!1||s.disabledReason!==void 0).filter(s=>i===""?!0:[s.title,s.description??"",s.disabledReason??"",s.group??"",s.shortcut??""].join(" ").toLowerCase().includes(i))}var by=Object.defineProperty,wy=Object.getOwnPropertyDescriptor,Pe=(e,t,i,s)=>{for(var r=s>1?void 0:s?wy(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&by(t,i,r),r};let le=class extends A{render(){const e=this.state;return e===void 0?null:l`
1394
1395
  <div class="backdrop" @mousedown=${()=>{this.cancel()}}>
1395
1396
  <section @mousedown=${t=>{t.stopPropagation()}} @keydown=${t=>{this.handleKeyDown(t)}}>
1396
1397
  <header>
@@ -1416,7 +1417,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1416
1417
  <button @click=${()=>{this.onLogoutProvider?.(t.id)}}><span>${t.name}</span><small>${t.id} · ${Qn(t.authType)}</small></button>
1417
1418
  `)}</div>`}}renderProviderButton(e){return l`
1418
1419
  <button @click=${()=>{this.onSelectProvider?.(e.id,e.authType)}}>
1419
- <span>${e.name}${e.status.source!==void 0?l` <em>${yy(e)}</em>`:null}</span>
1420
+ <span>${e.name}${e.status.source!==void 0?l` <em>${xy(e)}</em>`:null}</span>
1420
1421
  <small>${e.id} · ${Qn(e.authType)}</small>
1421
1422
  </button>
1422
1423
  `}renderOAuth(e){const t=e.flow,i=t.prompt,s=t.select;return l`
@@ -1437,10 +1438,10 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1437
1438
  <div class="inline-options">${s.options.map(r=>l`<button @click=${()=>{this.onOAuthRespond?.(r.value)}}>${r.label}</button>`)}</div>
1438
1439
  `:null}
1439
1440
  ${e.error!==void 0&&e.error!==""?l`<div class="error-text">${e.error}</div>`:null}
1440
- ${t.status==="error"||t.status==="cancelled"?l`<div class="error-text">${t.error??xy(t.status)}</div><div class="actions"><button @click=${()=>{this.cancel()}}>关闭</button></div>`:null}
1441
+ ${t.status==="error"||t.status==="cancelled"?l`<div class="error-text">${t.error??Sy(t.status)}</div><div class="actions"><button @click=${()=>{this.cancel()}}>关闭</button></div>`:null}
1441
1442
  ${i===void 0&&s===void 0&&t.status==="running"?l`<div class="actions"><button @click=${()=>{this.onOAuthCancel?.()}}>取消</button></div>`:null}
1442
1443
  </div>
1443
- `}focusInputIfNeeded(){const e=wy(this.state);if(e===void 0){this.lastFocusedInputKey=void 0;return}e!==this.lastFocusedInputKey&&(this.lastFocusedInputKey=e,this.input?.focus())}handleKeyDown(e){if(e.key==="Escape"){e.preventDefault(),this.cancel();return}if(e.key!=="Enter")return;const t=this.state;t?.step==="apiKey"?(e.preventDefault(),this.onSaveApiKey?.()):t?.step==="oauth"&&t.flow.prompt!==void 0&&(e.preventDefault(),this.onOAuthRespond?.())}cancel(){this.state?.step==="oauth"?this.onOAuthCancel?.():this.onCancel?.()}};le.styles=[Gl,E`
1444
+ `}focusInputIfNeeded(){const e=yy(this.state);if(e===void 0){this.lastFocusedInputKey=void 0;return}e!==this.lastFocusedInputKey&&(this.lastFocusedInputKey=e,this.input?.focus())}handleKeyDown(e){if(e.key==="Escape"){e.preventDefault(),this.cancel();return}if(e.key!=="Enter")return;const t=this.state;t?.step==="apiKey"?(e.preventDefault(),this.onSaveApiKey?.()):t?.step==="oauth"&&t.flow.prompt!==void 0&&(e.preventDefault(),this.onOAuthRespond?.())}cancel(){this.state?.step==="oauth"?this.onOAuthCancel?.():this.onCancel?.()}};le.styles=[Gl,E`
1444
1445
  .form { display: grid; gap: 12px; padding: 14px; overflow: auto; }
1445
1446
  .form p { margin: 0; color: var(--pi-text-secondary); overflow-wrap: anywhere; }
1446
1447
  .form a { color: var(--pi-accent); overflow-wrap: anywhere; }
@@ -1455,7 +1456,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1455
1456
  .progress { margin: 0; padding-left: 18px; color: var(--pi-muted); }
1456
1457
  .inline-options { display: grid; gap: 8px; }
1457
1458
  em { color: var(--pi-success); font-style: normal; font-size: 12px; }
1458
- `];Pe([d({attribute:!1})],le.prototype,"state",2);Pe([d({attribute:!1})],le.prototype,"onChooseMethod",2);Pe([d({attribute:!1})],le.prototype,"onSelectProvider",2);Pe([d({attribute:!1})],le.prototype,"onApiKeyInput",2);Pe([d({attribute:!1})],le.prototype,"onSaveApiKey",2);Pe([d({attribute:!1})],le.prototype,"onLogoutProvider",2);Pe([d({attribute:!1})],le.prototype,"onOAuthInput",2);Pe([d({attribute:!1})],le.prototype,"onOAuthRespond",2);Pe([d({attribute:!1})],le.prototype,"onOAuthCancel",2);Pe([d({attribute:!1})],le.prototype,"onCancel",2);Pe([B("input")],le.prototype,"input",2);le=Pe([W("auth-dialog")],le);function Qn(e){return e==="oauth"?"订阅":"API key"}function wy(e){if(e?.step==="apiKey")return`api-key:${e.provider.authType}:${e.provider.id}`;if(e?.step==="oauth"&&e.flow.prompt!==void 0)return`oauth:${e.flow.flowId}:${e.flow.prompt.requestId}`}function yy(e){if(e.status.source===void 0)return"";switch(e.status.source){case"stored":return"✓ 已配置";case"environment":return`✓ 环境变量${e.status.label===void 0?"":`: ${e.status.label}`}`;case"runtime":return"✓ 运行时";case"fallback":return"✓ 自定义 key";case"models_json_key":return"✓ models.json key";case"models_json_command":return"✓ models.json command";default:return""}}function xy(e){return e==="cancelled"?"已取消":e==="error"?"错误":e}var Sy=Object.defineProperty,ky=Object.getOwnPropertyDescriptor,je=(e,t,i,s)=>{for(var r=s>1?void 0:s?ky(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&Sy(t,i,r),r};let xe=class extends A{constructor(){super(...arguments),this.machineId="local",this.path="",this.createMissing=!0,this.suggestions=[],this.selected=0,this.loading=!1,this.requestId=0}connectedCallback(){super.connectedCallback(),this.loadSuggestions()}firstUpdated(){this.pathInput?.focus()}async loadSuggestions(){const e=++this.requestId;this.loading=!0;try{const t=await N.projectDirectories(this.path,this.machineId);if(e!==this.requestId)return;this.suggestions=t,this.selected=Math.min(this.selected,Math.max(0,t.length-1))}catch{e===this.requestId&&(this.suggestions=[])}finally{e===this.requestId&&(this.loading=!1)}}setPath(e){this.path=e,this.selected=0,this.loadSuggestions()}pick(e){this.setPath(e.path)}submit(){this.path.trim()!==""&&this.onSubmit?.(this.path,this.createMissing)}onPathInput(e){e.target instanceof HTMLInputElement&&this.setPath(e.target.value)}onCreateMissingChange(e){e.target instanceof HTMLInputElement&&(this.createMissing=e.target.checked)}onKeyDown(e){if(e.key==="Escape")e.preventDefault(),this.onCancel?.();else if(e.key==="Enter")e.preventDefault(),this.submit();else if(e.key==="ArrowDown")e.preventDefault(),this.selected=Math.min(this.selected+1,Math.max(0,this.suggestions.length-1));else if(e.key==="ArrowUp")e.preventDefault(),this.selected=Math.max(0,this.selected-1);else if(e.key==="Tab"){const t=this.suggestions[this.selected];if(t===void 0)return;e.preventDefault(),this.pick(t)}}render(){return l`
1459
+ `];Pe([d({attribute:!1})],le.prototype,"state",2);Pe([d({attribute:!1})],le.prototype,"onChooseMethod",2);Pe([d({attribute:!1})],le.prototype,"onSelectProvider",2);Pe([d({attribute:!1})],le.prototype,"onApiKeyInput",2);Pe([d({attribute:!1})],le.prototype,"onSaveApiKey",2);Pe([d({attribute:!1})],le.prototype,"onLogoutProvider",2);Pe([d({attribute:!1})],le.prototype,"onOAuthInput",2);Pe([d({attribute:!1})],le.prototype,"onOAuthRespond",2);Pe([d({attribute:!1})],le.prototype,"onOAuthCancel",2);Pe([d({attribute:!1})],le.prototype,"onCancel",2);Pe([B("input")],le.prototype,"input",2);le=Pe([W("auth-dialog")],le);function Qn(e){return e==="oauth"?"订阅":"API key"}function yy(e){if(e?.step==="apiKey")return`api-key:${e.provider.authType}:${e.provider.id}`;if(e?.step==="oauth"&&e.flow.prompt!==void 0)return`oauth:${e.flow.flowId}:${e.flow.prompt.requestId}`}function xy(e){if(e.status.source===void 0)return"";switch(e.status.source){case"stored":return"✓ 已配置";case"environment":return`✓ 环境变量${e.status.label===void 0?"":`: ${e.status.label}`}`;case"runtime":return"✓ 运行时";case"fallback":return"✓ 自定义 key";case"models_json_key":return"✓ models.json key";case"models_json_command":return"✓ models.json command";default:return""}}function Sy(e){return e==="cancelled"?"已取消":e==="error"?"错误":e}var ky=Object.defineProperty,$y=Object.getOwnPropertyDescriptor,je=(e,t,i,s)=>{for(var r=s>1?void 0:s?$y(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&ky(t,i,r),r};let xe=class extends A{constructor(){super(...arguments),this.machineId="local",this.path="",this.createMissing=!0,this.suggestions=[],this.selected=0,this.loading=!1,this.requestId=0}connectedCallback(){super.connectedCallback(),this.loadSuggestions()}firstUpdated(){this.pathInput?.focus()}async loadSuggestions(){const e=++this.requestId;this.loading=!0;try{const t=await N.projectDirectories(this.path,this.machineId);if(e!==this.requestId)return;this.suggestions=t,this.selected=Math.min(this.selected,Math.max(0,t.length-1))}catch{e===this.requestId&&(this.suggestions=[])}finally{e===this.requestId&&(this.loading=!1)}}setPath(e){this.path=e,this.selected=0,this.loadSuggestions()}pick(e){this.setPath(e.path)}submit(){this.path.trim()!==""&&this.onSubmit?.(this.path,this.createMissing)}onPathInput(e){e.target instanceof HTMLInputElement&&this.setPath(e.target.value)}onCreateMissingChange(e){e.target instanceof HTMLInputElement&&(this.createMissing=e.target.checked)}onKeyDown(e){if(e.key==="Escape")e.preventDefault(),this.onCancel?.();else if(e.key==="Enter")e.preventDefault(),this.submit();else if(e.key==="ArrowDown")e.preventDefault(),this.selected=Math.min(this.selected+1,Math.max(0,this.suggestions.length-1));else if(e.key==="ArrowUp")e.preventDefault(),this.selected=Math.max(0,this.selected-1);else if(e.key==="Tab"){const t=this.suggestions[this.selected];if(t===void 0)return;e.preventDefault(),this.pick(t)}}render(){return l`
1459
1460
  <div class="backdrop" @click=${()=>this.onCancel?.()}>
1460
1461
  <section @click=${e=>{e.stopPropagation()}}>
1461
1462
  <header>
@@ -1505,7 +1506,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1505
1506
  header button { border: 0; background: transparent; color: var(--pi-muted); font-size: 22px; padding: 0 8px; }
1506
1507
  .primary { border-color: var(--pi-success-border); background: var(--pi-success-border); }
1507
1508
  button:disabled { opacity: .5; cursor: not-allowed; }
1508
- `;je([d({attribute:!1})],xe.prototype,"onSubmit",2);je([d({attribute:!1})],xe.prototype,"onCancel",2);je([d()],xe.prototype,"machineId",2);je([x()],xe.prototype,"path",2);je([x()],xe.prototype,"createMissing",2);je([x()],xe.prototype,"suggestions",2);je([x()],xe.prototype,"selected",2);je([x()],xe.prototype,"loading",2);je([B("input")],xe.prototype,"pathInput",2);xe=je([W("project-dialog")],xe);var $y=Object.defineProperty,Py=Object.getOwnPropertyDescriptor,Fe=(e,t,i,s)=>{for(var r=s>1?void 0:s?Py(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&$y(t,i,r),r};let Se=class extends A{constructor(){super(...arguments),this.error="",this.url="",this.name="",this.token="",this.submitting=!1,this.nameEdited=!1,this.previousSuggestedName=""}firstUpdated(){this.urlInput?.focus()}handleUrlInput(e){if(!(e.target instanceof HTMLInputElement))return;const t=e.target.value,i=Cy(t);(!this.nameEdited||this.name.trim()===""||this.name===this.previousSuggestedName)&&(this.name=i),this.previousSuggestedName=i,this.url=t}handleNameInput(e){e.target instanceof HTMLInputElement&&(this.nameEdited=!0,this.name=e.target.value)}handleTokenInput(e){e.target instanceof HTMLInputElement&&(this.token=e.target.value)}handleKeyDown(e){if(e.key==="Escape"){e.preventDefault(),this.onCancel?.();return}e.key==="Enter"&&e.target instanceof HTMLInputElement&&e.target.name==="baseUrl"&&Ds(this.url)===void 0&&(e.preventDefault(),this.updateComplete.then(()=>{this.nameInput?.focus(),this.nameInput?.select()}))}handleSubmit(e){e.preventDefault(),this.submit()}async submit(){const e=this.validInput();if(!(e===void 0||this.submitting)){this.submitting=!0;try{await this.onSubmit?.(e)}finally{this.isConnected&&(this.submitting=!1)}}}validInput(){const e=this.url.trim(),t=this.name.trim();if(e===""||t===""||Ds(e)!==void 0)return;const i=this.token.trim();return{name:t,baseUrl:e,...i===""?{}:{token:i}}}render(){const e=this.url.trim()!=="",t=e?Ds(this.url):void 0,i=this.validInput()!==void 0&&!this.submitting;return l`
1509
+ `;je([d({attribute:!1})],xe.prototype,"onSubmit",2);je([d({attribute:!1})],xe.prototype,"onCancel",2);je([d()],xe.prototype,"machineId",2);je([x()],xe.prototype,"path",2);je([x()],xe.prototype,"createMissing",2);je([x()],xe.prototype,"suggestions",2);je([x()],xe.prototype,"selected",2);je([x()],xe.prototype,"loading",2);je([B("input")],xe.prototype,"pathInput",2);xe=je([W("project-dialog")],xe);var Py=Object.defineProperty,Cy=Object.getOwnPropertyDescriptor,Fe=(e,t,i,s)=>{for(var r=s>1?void 0:s?Cy(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&Py(t,i,r),r};let Se=class extends A{constructor(){super(...arguments),this.error="",this.url="",this.name="",this.token="",this.submitting=!1,this.nameEdited=!1,this.previousSuggestedName=""}firstUpdated(){this.urlInput?.focus()}handleUrlInput(e){if(!(e.target instanceof HTMLInputElement))return;const t=e.target.value,i=Iy(t);(!this.nameEdited||this.name.trim()===""||this.name===this.previousSuggestedName)&&(this.name=i),this.previousSuggestedName=i,this.url=t}handleNameInput(e){e.target instanceof HTMLInputElement&&(this.nameEdited=!0,this.name=e.target.value)}handleTokenInput(e){e.target instanceof HTMLInputElement&&(this.token=e.target.value)}handleKeyDown(e){if(e.key==="Escape"){e.preventDefault(),this.onCancel?.();return}e.key==="Enter"&&e.target instanceof HTMLInputElement&&e.target.name==="baseUrl"&&Ds(this.url)===void 0&&(e.preventDefault(),this.updateComplete.then(()=>{this.nameInput?.focus(),this.nameInput?.select()}))}handleSubmit(e){e.preventDefault(),this.submit()}async submit(){const e=this.validInput();if(!(e===void 0||this.submitting)){this.submitting=!0;try{await this.onSubmit?.(e)}finally{this.isConnected&&(this.submitting=!1)}}}validInput(){const e=this.url.trim(),t=this.name.trim();if(e===""||t===""||Ds(e)!==void 0)return;const i=this.token.trim();return{name:t,baseUrl:e,...i===""?{}:{token:i}}}render(){const e=this.url.trim()!=="",t=e?Ds(this.url):void 0,i=this.validInput()!==void 0&&!this.submitting;return l`
1509
1510
  <div class="backdrop" @click=${()=>this.onCancel?.()}>
1510
1511
  <section @click=${s=>{s.stopPropagation()}}>
1511
1512
  <form @submit=${s=>{this.handleSubmit(s)}} @keydown=${s=>{this.handleKeyDown(s)}}>
@@ -1560,10 +1561,10 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1560
1561
  header button { border: 0; background: transparent; color: var(--pi-muted); font-size: 22px; padding: 0 8px; }
1561
1562
  .primary { border-color: var(--pi-success-border); background: var(--pi-success-border); }
1562
1563
  button:disabled { opacity: .5; cursor: not-allowed; }
1563
- `;Fe([d({attribute:!1})],Se.prototype,"onSubmit",2);Fe([d({attribute:!1})],Se.prototype,"onCancel",2);Fe([d()],Se.prototype,"error",2);Fe([x()],Se.prototype,"url",2);Fe([x()],Se.prototype,"name",2);Fe([x()],Se.prototype,"token",2);Fe([x()],Se.prototype,"submitting",2);Fe([B("input[name='baseUrl']")],Se.prototype,"urlInput",2);Fe([B("input[name='name']")],Se.prototype,"nameInput",2);Se=Fe([W("machine-dialog")],Se);function Cy(e){const t=e.trim();if(t==="")return"";const i=Zn(t)??Zn(`http://${t.replace(/^\/+/u,"")}`);return i!==void 0&&i.hostname!==""?i.hostname.replace(/^\[(.*)\]$/u,"$1"):Iy(t)}function Ds(e){const t=e.trim();if(t==="")return"必须填写远程 PI WEB URL。";let i;try{i=new URL(t)}catch{return"请输入包含 http:// 或 https:// 的有效 URL。"}if(i.protocol!=="http:"&&i.protocol!=="https:")return"请使用 http:// 或 https:// URL。";if(i.username!==""||i.password!=="")return"机器 URL 中不要包含凭据。";if(i.search!==""||i.hash!=="")return"不要包含查询字符串或片段。"}function Zn(e){try{const t=new URL(e);return t.protocol==="http:"||t.protocol==="https:"?t:void 0}catch{return}}function Iy(e){const t=e.replace(/^[a-z][a-z\d+.-]*:\/\//iu,""),s=t.slice(t.lastIndexOf("@")+1).split(/[/?#]/u)[0]??"";return s.startsWith("[")&&s.includes("]")?s.slice(1,s.indexOf("]")):s.replace(/:\d+$/u,"")}function Ry(){return{host:"",port:"",allowedHostsMode:"list",allowedHostsText:"",allowedPathsText:""}}function Ay(e){return{host:e.host??"",port:e.port===void 0?"":String(e.port),allowedHostsMode:e.allowedHosts===!0?"all":"list",allowedHostsText:Array.isArray(e.allowedHosts)?e.allowedHosts.join(`
1564
+ `;Fe([d({attribute:!1})],Se.prototype,"onSubmit",2);Fe([d({attribute:!1})],Se.prototype,"onCancel",2);Fe([d()],Se.prototype,"error",2);Fe([x()],Se.prototype,"url",2);Fe([x()],Se.prototype,"name",2);Fe([x()],Se.prototype,"token",2);Fe([x()],Se.prototype,"submitting",2);Fe([B("input[name='baseUrl']")],Se.prototype,"urlInput",2);Fe([B("input[name='name']")],Se.prototype,"nameInput",2);Se=Fe([W("machine-dialog")],Se);function Iy(e){const t=e.trim();if(t==="")return"";const i=Zn(t)??Zn(`http://${t.replace(/^\/+/u,"")}`);return i!==void 0&&i.hostname!==""?i.hostname.replace(/^\[(.*)\]$/u,"$1"):Ry(t)}function Ds(e){const t=e.trim();if(t==="")return"必须填写远程 PI WEB URL。";let i;try{i=new URL(t)}catch{return"请输入包含 http:// 或 https:// 的有效 URL。"}if(i.protocol!=="http:"&&i.protocol!=="https:")return"请使用 http:// 或 https:// URL。";if(i.username!==""||i.password!=="")return"机器 URL 中不要包含凭据。";if(i.search!==""||i.hash!=="")return"不要包含查询字符串或片段。"}function Zn(e){try{const t=new URL(e);return t.protocol==="http:"||t.protocol==="https:"?t:void 0}catch{return}}function Ry(e){const t=e.replace(/^[a-z][a-z\d+.-]*:\/\//iu,""),s=t.slice(t.lastIndexOf("@")+1).split(/[/?#]/u)[0]??"";return s.startsWith("[")&&s.includes("]")?s.slice(1,s.indexOf("]")):s.replace(/:\d+$/u,"")}function Ay(){return{host:"",port:"",allowedHostsMode:"list",allowedHostsText:"",allowedPathsText:""}}function Ty(e){return{host:e.host??"",port:e.port===void 0?"":String(e.port),allowedHostsMode:e.allowedHosts===!0?"all":"list",allowedHostsText:Array.isArray(e.allowedHosts)?e.allowedHosts.join(`
1564
1565
  `):"",allowedPathsText:e.pathAccess?.allowedPaths?.join(`
1565
- `)??""}}function Ty(e,t={}){const i={...t.shortcuts===void 0?{}:{shortcuts:t.shortcuts},...t.plugins===void 0?{}:{plugins:t.plugins},...t.uploads===void 0?{}:{uploads:t.uploads},...t.maxUploadBytes===void 0?{}:{maxUploadBytes:t.maxUploadBytes},...t.spawnSessions===void 0?{}:{spawnSessions:t.spawnSessions},...t.subsessions===void 0?{}:{subsessions:t.subsessions}},s=e.host.trim(),r=e.port.trim();if(s!==""&&(i.host=s),r!==""){const n=Number(r);if(!Number.isInteger(n)||n<1||n>65535)throw new Error("端口必须是 1 到 65535 之间的整数。");i.port=n}i.allowedHosts=e.allowedHostsMode==="all"?!0:My(e.allowedHostsText);const o=Ey(e.allowedPathsText);return o.length>0&&(i.pathAccess={allowedPaths:o}),i}function My(e){return e.split(/[\n,]/u).map(t=>t.trim()).filter(t=>t!=="")}function Ey(e){const t=e.split(`
1566
- `).map(s=>s.trim()).filter(s=>s!==""),i=t.find(s=>!Dy(s));if(i!==void 0)throw new Error(`Allowed external paths must be absolute paths or start with ~: ${i}`);return t}function Dy(e){return e==="~"||e.startsWith("~/")||e.startsWith("~\\")||e.startsWith("/")||e.startsWith("\\")||/^[A-Za-z]:[\\/]/u.test(e)}function cs(e,t){return e!==""?l`<div class="message error-message">${e}</div>`:t!==""?l`<div class="message success-message">${t}</div>`:null}const ds=E`
1566
+ `)??""}}function My(e,t={}){const i={...t.shortcuts===void 0?{}:{shortcuts:t.shortcuts},...t.plugins===void 0?{}:{plugins:t.plugins},...t.uploads===void 0?{}:{uploads:t.uploads},...t.maxUploadBytes===void 0?{}:{maxUploadBytes:t.maxUploadBytes},...t.spawnSessions===void 0?{}:{spawnSessions:t.spawnSessions},...t.subsessions===void 0?{}:{subsessions:t.subsessions}},s=e.host.trim(),r=e.port.trim();if(s!==""&&(i.host=s),r!==""){const n=Number(r);if(!Number.isInteger(n)||n<1||n>65535)throw new Error("端口必须是 1 到 65535 之间的整数。");i.port=n}i.allowedHosts=e.allowedHostsMode==="all"?!0:Ey(e.allowedHostsText);const o=Dy(e.allowedPathsText);return o.length>0&&(i.pathAccess={allowedPaths:o}),i}function Ey(e){return e.split(/[\n,]/u).map(t=>t.trim()).filter(t=>t!=="")}function Dy(e){const t=e.split(`
1567
+ `).map(s=>s.trim()).filter(s=>s!==""),i=t.find(s=>!Wy(s));if(i!==void 0)throw new Error(`Allowed external paths must be absolute paths or start with ~: ${i}`);return t}function Wy(e){return e==="~"||e.startsWith("~/")||e.startsWith("~\\")||e.startsWith("/")||e.startsWith("\\")||/^[A-Za-z]:[\\/]/u.test(e)}function cs(e,t){return e!==""?l`<div class="message error-message">${e}</div>`:t!==""?l`<div class="message success-message">${t}</div>`:null}const ds=E`
1567
1568
  :host { display: block; }
1568
1569
  .section-heading { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 14px; }
1569
1570
  .section-heading > div { display: grid; gap: 6px; min-width: 0; }
@@ -1599,7 +1600,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1599
1600
  .section-heading .secondary { justify-self: start; }
1600
1601
  .effective-card dl > div { grid-template-columns: minmax(0, 1fr); gap: 3px; }
1601
1602
  }
1602
- `;var Wy=Object.defineProperty,Oy=Object.getOwnPropertyDescriptor,Ue=(e,t,i,s)=>{for(var r=s>1?void 0:s?Oy(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&Wy(t,i,r),r};let ke=class extends A{constructor(){super(...arguments),this.loading=!1,this.saving=!1,this.error="",this.savedMessage="",this.draft=Ry(),this.localError=""}willUpdate(e){e.has("configResponse")&&this.configResponse!==void 0&&(this.draft=Ay(this.configResponse.config),this.localError="")}render(){const e=this.configResponse;return l`
1603
+ `;var Oy=Object.defineProperty,_y=Object.getOwnPropertyDescriptor,Ue=(e,t,i,s)=>{for(var r=s>1?void 0:s?_y(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&Oy(t,i,r),r};let ke=class extends A{constructor(){super(...arguments),this.loading=!1,this.saving=!1,this.error="",this.savedMessage="",this.draft=Ay(),this.localError=""}willUpdate(e){e.has("configResponse")&&this.configResponse!==void 0&&(this.draft=Ty(this.configResponse.config),this.localError="")}render(){const e=this.configResponse;return l`
1603
1604
  <div class="section-heading">
1604
1605
  <div>
1605
1606
  <h2>通用配置</h2>
@@ -1638,7 +1639,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1638
1639
  <span>允许的 hosts</span>
1639
1640
  ${this.renderOverrideBadge("allowedHosts")}
1640
1641
  </span>
1641
- <select .value=${this.draft.allowedHostsMode} @change=${t=>{this.updateDraft({allowedHostsMode:jy(t)==="all"?"all":"list"})}}>
1642
+ <select .value=${this.draft.allowedHostsMode} @change=${t=>{this.updateDraft({allowedHostsMode:Fy(t)==="all"?"all":"list"})}}>
1642
1643
  <option value="list">仅允许列出的 hosts</option>
1643
1644
  <option value="all">允许所有 host</option>
1644
1645
  </select>
@@ -1667,18 +1668,18 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1667
1668
  <dl>
1668
1669
  <div><dt>Host</dt><dd>${e.host??l`<span class="muted">默认 127.0.0.1</span>`}</dd></div>
1669
1670
  <div><dt>端口</dt><dd>${e.port??l`<span class="muted">默认 8504</span>`}</dd></div>
1670
- <div><dt>允许的 hosts</dt><dd>${_y(e.allowedHosts)}</dd></div>
1671
- <div><dt>外部根目录</dt><dd>${Ly(e.pathAccess?.allowedPaths)}</dd></div>
1671
+ <div><dt>允许的 hosts</dt><dd>${Ly(e.allowedHosts)}</dd></div>
1672
+ <div><dt>外部根目录</dt><dd>${jy(e.pathAccess?.allowedPaths)}</dd></div>
1672
1673
  </dl>
1673
1674
  </section>
1674
- `}async saveConfig(e){e.preventDefault(),this.localError="";try{await this.onSave?.(Ty(this.draft,this.configResponse?.config??{}))}catch(t){this.localError=Fy(t)}}updateDraft(e){this.draft={...this.draft,...e},this.localError=""}};ke.styles=[ds,E`
1675
+ `}async saveConfig(e){e.preventDefault(),this.localError="";try{await this.onSave?.(My(this.draft,this.configResponse?.config??{}))}catch(t){this.localError=Uy(t)}}updateDraft(e){this.draft={...this.draft,...e},this.localError=""}};ke.styles=[ds,E`
1675
1676
  .config-form { display: grid; gap: 14px; }
1676
1677
  input, select, textarea { box-sizing: border-box; width: 100%; min-width: 0; border: 1px solid var(--pi-border); border-radius: 8px; background: var(--pi-bg); color: var(--pi-text); padding: 9px 10px; outline: none; font: var(--pi-control-font-size, 16px) var(--pi-control-font-family, system-ui, sans-serif); }
1677
1678
  input:focus, select:focus, textarea:focus { border-color: var(--pi-accent); box-shadow: 0 0 0 1px var(--pi-accent-border); }
1678
1679
  textarea { resize: vertical; min-height: 94px; font-family: var(--pi-control-monospace-font-family, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace); }
1679
1680
  textarea:disabled { opacity: .55; }
1680
1681
  .form-actions { display: flex; justify-content: flex-end; gap: 8px; padding-top: 2px; }
1681
- `];Ue([d({attribute:!1})],ke.prototype,"configResponse",2);Ue([d({type:Boolean})],ke.prototype,"loading",2);Ue([d({type:Boolean})],ke.prototype,"saving",2);Ue([d()],ke.prototype,"error",2);Ue([d()],ke.prototype,"savedMessage",2);Ue([d({attribute:!1})],ke.prototype,"onReload",2);Ue([d({attribute:!1})],ke.prototype,"onSave",2);Ue([x()],ke.prototype,"draft",2);Ue([x()],ke.prototype,"localError",2);ke=Ue([W("settings-general-panel")],ke);function _y(e){return e===!0?"任意 host":Array.isArray(e)?e.length===0?l`<span class="muted">未列出</span>`:e.join(", "):l`<span class="muted">未设置</span>`}function Ly(e){return e===void 0||e.length===0?l`<span class="muted">已禁止外部路径</span>`:e.join(", ")}function Xn(e){return e.target instanceof HTMLInputElement?e.target.value:""}function jy(e){return e.target instanceof HTMLSelectElement?e.target.value:""}function Yn(e){return e.target instanceof HTMLTextAreaElement?e.target.value:""}function Fy(e){return e instanceof Error?e.message:String(e)}var Uy=Object.defineProperty,zy=Object.getOwnPropertyDescriptor,tt=(e,t,i,s)=>{for(var r=s>1?void 0:s?zy(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&Uy(t,i,r),r};let Le=class extends A{constructor(){super(...arguments),this.loading=!1,this.saving=!1,this.error="",this.savedMessage=""}render(){const e=this.configResponse,t=e?.envOverrides.spawnSessions===!0,i=e?.effectiveConfig.spawnSessions!==!1,s=e?.envOverrides.subsessions===!0,r=e?.effectiveConfig.subsessions===!0&&i;return l`
1682
+ `];Ue([d({attribute:!1})],ke.prototype,"configResponse",2);Ue([d({type:Boolean})],ke.prototype,"loading",2);Ue([d({type:Boolean})],ke.prototype,"saving",2);Ue([d()],ke.prototype,"error",2);Ue([d()],ke.prototype,"savedMessage",2);Ue([d({attribute:!1})],ke.prototype,"onReload",2);Ue([d({attribute:!1})],ke.prototype,"onSave",2);Ue([x()],ke.prototype,"draft",2);Ue([x()],ke.prototype,"localError",2);ke=Ue([W("settings-general-panel")],ke);function Ly(e){return e===!0?"任意 host":Array.isArray(e)?e.length===0?l`<span class="muted">未列出</span>`:e.join(", "):l`<span class="muted">未设置</span>`}function jy(e){return e===void 0||e.length===0?l`<span class="muted">已禁止外部路径</span>`:e.join(", ")}function Xn(e){return e.target instanceof HTMLInputElement?e.target.value:""}function Fy(e){return e.target instanceof HTMLSelectElement?e.target.value:""}function Yn(e){return e.target instanceof HTMLTextAreaElement?e.target.value:""}function Uy(e){return e instanceof Error?e.message:String(e)}var zy=Object.defineProperty,By=Object.getOwnPropertyDescriptor,tt=(e,t,i,s)=>{for(var r=s>1?void 0:s?By(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&zy(t,i,r),r};let Le=class extends A{constructor(){super(...arguments),this.loading=!1,this.saving=!1,this.error="",this.savedMessage=""}render(){const e=this.configResponse,t=e?.envOverrides.spawnSessions===!0,i=e?.effectiveConfig.spawnSessions!==!1,s=e?.envOverrides.subsessions===!0,r=e?.effectiveConfig.subsessions===!0&&i;return l`
1682
1683
  <div class="section-heading">
1683
1684
  <div>
1684
1685
  <h2>会话守护进程</h2>
@@ -1742,7 +1743,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1742
1743
  .toggle input { width: 16px; height: 16px; }
1743
1744
  .toggle input:disabled { cursor: not-allowed; }
1744
1745
  .beta-badge { border: 1px solid var(--pi-border); border-radius: 999px; color: var(--pi-muted); background: var(--pi-bg); padding: 2px 7px; font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: .04em; }
1745
- `];tt([d({attribute:!1})],Le.prototype,"configResponse",2);tt([d({type:Boolean})],Le.prototype,"loading",2);tt([d({type:Boolean})],Le.prototype,"saving",2);tt([d()],Le.prototype,"error",2);tt([d()],Le.prototype,"savedMessage",2);tt([d({attribute:!1})],Le.prototype,"onReload",2);tt([d({attribute:!1})],Le.prototype,"onSave",2);Le=tt([W("settings-sessiond-panel")],Le);var By=Object.defineProperty,Ny=Object.getOwnPropertyDescriptor,Ge=(e,t,i,s)=>{for(var r=s>1?void 0:s?Ny(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&By(t,i,r),r};let Ee=class extends A{constructor(){super(...arguments),this.loading=!1,this.saving=!1,this.error="",this.savedMessage=""}render(){const e=this.pluginsResponse?.plugins??[];return l`
1746
+ `];tt([d({attribute:!1})],Le.prototype,"configResponse",2);tt([d({type:Boolean})],Le.prototype,"loading",2);tt([d({type:Boolean})],Le.prototype,"saving",2);tt([d()],Le.prototype,"error",2);tt([d()],Le.prototype,"savedMessage",2);tt([d({attribute:!1})],Le.prototype,"onReload",2);tt([d({attribute:!1})],Le.prototype,"onSave",2);Le=tt([W("settings-sessiond-panel")],Le);var Ny=Object.defineProperty,Hy=Object.getOwnPropertyDescriptor,Ge=(e,t,i,s)=>{for(var r=s>1?void 0:s?Hy(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&Ny(t,i,r),r};let Ee=class extends A{constructor(){super(...arguments),this.loading=!1,this.saving=!1,this.error="",this.savedMessage=""}render(){const e=this.pluginsResponse?.plugins??[];return l`
1746
1747
  <div class="section-heading">
1747
1748
  <div>
1748
1749
  <h2>插件</h2>
@@ -1786,7 +1787,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1786
1787
  .plugin-card { grid-template-columns: minmax(0, 1fr); align-items: start; }
1787
1788
  .toggle { justify-self: start; }
1788
1789
  }
1789
- `];Ge([d({attribute:!1})],Ee.prototype,"pluginsResponse",2);Ge([d({attribute:!1})],Ee.prototype,"configResponse",2);Ge([d({type:Boolean})],Ee.prototype,"loading",2);Ge([d({type:Boolean})],Ee.prototype,"saving",2);Ge([d()],Ee.prototype,"error",2);Ge([d()],Ee.prototype,"savedMessage",2);Ge([d({attribute:!1})],Ee.prototype,"onReload",2);Ge([d({attribute:!1})],Ee.prototype,"onTogglePlugin",2);Ee=Ge([W("settings-plugins-panel")],Ee);var Hy=Object.defineProperty,qy=Object.getOwnPropertyDescriptor,ge=(e,t,i,s)=>{for(var r=s>1?void 0:s?qy(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&Hy(t,i,r),r};const ea={capture:!0},Ky=[{value:"auto",label:"Auto/default",description:"Desktop-like Enter sends; mobile, coarse pointer, or narrow screens insert a new line."},{value:"send",label:"Enter sends message",description:"Enter sends the chat message; Shift+Enter adds a new line when supported."},{value:"newline",label:"Enter inserts new line",description:"Enter adds a line break; Shift+Enter sends the chat message when supported."}];let ie=class extends A{constructor(){super(...arguments),this.actions=[],this.loading=!1,this.saving=!1,this.error="",this.savedMessage="",this.drafts={},this.localError="",this.promptEnterPreference=as(),this.recordingListenerActive=!1,this.onRecordKeyDown=e=>{const t=this.recording;if(t===void 0)return;if(e.preventDefault(),e.stopPropagation(),e.key==="Escape"){this.stopRecording();return}const i=el(e);if(i===void 0){this.localError="Press a letter, number, punctuation, function, or navigation key. Press Esc to cancel recording.";return}if(t.tokens.length===0&&!Vt(i)){this.localError="Start shortcuts with Ctrl/⌘ or Alt so normal typing is not captured.";return}const s=[...t.tokens,i];this.localError="",this.drafts={[t.actionId]:s.join(" ")},this.recording={actionId:t.actionId,tokens:s},this.armRecordingTimer()}}willUpdate(e){e.has("configResponse")&&this.configResponse!==void 0&&(this.drafts={},this.localError="",this.stopRecording())}disconnectedCallback(){this.stopRecording(),super.disconnectedCallback()}render(){const e=Qy(this.actions),t=this.shortcutResolutions();return l`
1790
+ `];Ge([d({attribute:!1})],Ee.prototype,"pluginsResponse",2);Ge([d({attribute:!1})],Ee.prototype,"configResponse",2);Ge([d({type:Boolean})],Ee.prototype,"loading",2);Ge([d({type:Boolean})],Ee.prototype,"saving",2);Ge([d()],Ee.prototype,"error",2);Ge([d()],Ee.prototype,"savedMessage",2);Ge([d({attribute:!1})],Ee.prototype,"onReload",2);Ge([d({attribute:!1})],Ee.prototype,"onTogglePlugin",2);Ee=Ge([W("settings-plugins-panel")],Ee);var qy=Object.defineProperty,Ky=Object.getOwnPropertyDescriptor,ge=(e,t,i,s)=>{for(var r=s>1?void 0:s?Ky(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&qy(t,i,r),r};const ea={capture:!0},Vy=[{value:"auto",label:"Auto/default",description:"Desktop-like Enter sends; mobile, coarse pointer, or narrow screens insert a new line."},{value:"send",label:"Enter sends message",description:"Enter sends the chat message; Shift+Enter adds a new line when supported."},{value:"newline",label:"Enter inserts new line",description:"Enter adds a line break; Shift+Enter sends the chat message when supported."}];let ie=class extends A{constructor(){super(...arguments),this.actions=[],this.loading=!1,this.saving=!1,this.error="",this.savedMessage="",this.drafts={},this.localError="",this.promptEnterPreference=as(),this.recordingListenerActive=!1,this.onRecordKeyDown=e=>{const t=this.recording;if(t===void 0)return;if(e.preventDefault(),e.stopPropagation(),e.key==="Escape"){this.stopRecording();return}const i=el(e);if(i===void 0){this.localError="Press a letter, number, punctuation, function, or navigation key. Press Esc to cancel recording.";return}if(t.tokens.length===0&&!Vt(i)){this.localError="Start shortcuts with Ctrl/⌘ or Alt so normal typing is not captured.";return}const s=[...t.tokens,i];this.localError="",this.drafts={[t.actionId]:s.join(" ")},this.recording={actionId:t.actionId,tokens:s},this.armRecordingTimer()}}willUpdate(e){e.has("configResponse")&&this.configResponse!==void 0&&(this.drafts={},this.localError="",this.stopRecording())}disconnectedCallback(){this.stopRecording(),super.disconnectedCallback()}render(){const e=Zy(this.actions),t=this.shortcutResolutions();return l`
1790
1791
  <div class="section-heading">
1791
1792
  <div>
1792
1793
  <h2>键盘快捷键</h2>
@@ -1819,7 +1820,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1819
1820
  <p>Choose what Enter does in this browser. Shift+Enter does the opposite when supported; automatic touch-keyboard capitalization is ignored to avoid accidental sends.</p>
1820
1821
  </div>
1821
1822
  <div class="prompt-enter-options" role="radiogroup" aria-label="Enter and Shift Enter behavior in the chat composer">
1822
- ${Ky.map(e=>l`
1823
+ ${Vy.map(e=>l`
1823
1824
  <label class="prompt-enter-option">
1824
1825
  <input
1825
1826
  type="radio"
@@ -1836,8 +1837,8 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1836
1837
  `)}
1837
1838
  </div>
1838
1839
  </section>
1839
- `}updatePromptEnterPreference(e){this.promptEnterPreference=e,Ww(e)}renderShortcutRow(e,t){const i=this.configResponse?.config.shortcuts,s=Hi(e.id,i),r=e0(e,i),o=this.shortcutInputText(e),n=o.trim()===""?void 0:ys(o),a=n?.ok===!0?n.shortcut:Yy(e,i),c=s!==void 0,p=this.drafts[e.id]!==void 0,u=p&&o.trim()!==""?"custom":r,h=this.recordingHint(e.id),g=Jy(t);return l`
1840
- <article class=${Vy(t)}>
1840
+ `}updatePromptEnterPreference(e){this.promptEnterPreference=e,Ow(e)}renderShortcutRow(e,t){const i=this.configResponse?.config.shortcuts,s=Hi(e.id,i),r=t0(e,i),o=this.shortcutInputText(e),n=o.trim()===""?void 0:ys(o),a=n?.ok===!0?n.shortcut:e0(e,i),c=s!==void 0,p=this.drafts[e.id]!==void 0,u=p&&o.trim()!==""?"custom":r,h=this.recordingHint(e.id),g=Qy(t);return l`
1841
+ <article class=${Gy(t)}>
1841
1842
  <div class="shortcut-main">
1842
1843
  <strong>${e.title}</strong>
1843
1844
  ${e.description!==void 0&&e.description!==""?l`<small>${e.description}</small>`:null}
@@ -1847,8 +1848,8 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1847
1848
  <div class="shortcut-editor">
1848
1849
  <div class="shortcut-status">
1849
1850
  ${a!==void 0&&a!==""?l`<kbd>${wi(a)}</kbd>`:l`<span class="unassigned">${r==="disabled"?"已禁用":"未分配"}</span>`}
1850
- <small class=${u}>${t0(u)}${p?" · 未保存":""}</small>
1851
- ${g===void 0?null:l`<small class=${Gy(t)}>${g}</small>`}
1851
+ <small class=${u}>${i0(u)}${p?" · 未保存":""}</small>
1852
+ ${g===void 0?null:l`<small class=${Jy(t)}>${g}</small>`}
1852
1853
  </div>
1853
1854
  <label class="shortcut-input-label">
1854
1855
  <span>快捷键</span>
@@ -1861,7 +1862,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1861
1862
  autocapitalize="off"
1862
1863
  spellcheck="false"
1863
1864
  ?disabled=${this.saving}
1864
- @input=${w=>{this.updateDraft(e.id,i0(w))}}
1865
+ @input=${w=>{this.updateDraft(e.id,s0(w))}}
1865
1866
  >
1866
1867
  </label>
1867
1868
  ${h!==""?l`<small class="recording-hint">${h}</small>`:null}
@@ -1873,7 +1874,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1873
1874
  </div>
1874
1875
  </div>
1875
1876
  </article>
1876
- `}shortcutInputText(e){const t=this.drafts[e.id];if(t!==void 0)return t;const i=Hi(e.id,this.configResponse?.config.shortcuts);return i===null?"":i??e.shortcut??""}recordingHint(e){const t=this.recording;return t?.actionId!==e?"":t.tokens.length===0?"Recording: press Ctrl/⌘ or Alt with a key. Press Esc to cancel.":`Recording: ${wi(t.tokens.join(" "))}. Press another key to add a sequence, or wait to finish.`}updateDraft(e,t){this.drafts={[e]:t},this.localError=""}async saveShortcut(e){this.stopRecording();const t=this.shortcutInputText(e).trim(),i=ys(t);if(!i.ok){this.localError=i.message;return}this.localError="",await this.saveShortcutPreference(e.id,i.shortcut)}async setShortcutNone(e){this.stopRecording(),this.localError="",await this.saveShortcutPreference(e,null)}async resetShortcut(e){this.stopRecording(),this.localError="",await this.saveShortcutPreference(e,void 0)}async saveShortcutPreference(e,t){const i={...this.configResponse?.config??{}},s=i.shortcuts??{},r=t===void 0?Xy(s,e):{...s,[e]:t};Object.keys(r).length===0?delete i.shortcuts:i.shortcuts=r,await this.onSave?.(i)}shortcutResolutions(){return new Map(Tr(this.actions,this.previewShortcutConfig(),{enabledOnly:!0}).map(e=>[e.action.id,e]))}previewShortcutConfig(){const e={...this.configResponse?.config.shortcuts??{}};for(const[t,i]of Object.entries(this.drafts)){const s=i.trim();if(s==="")continue;const r=ys(s);r.ok&&(e[t]=r.shortcut)}return Object.keys(e).length===0?void 0:e}async toggleRecording(e){if(this.recording?.actionId===e){this.stopRecording();return}this.stopRecording(),this.localError="",this.recording={actionId:e,tokens:[]},this.ensureRecordingListener(),await this.updateComplete,this.focusShortcutInput(e)}focusShortcutInput(e){for(const t of this.renderRoot.querySelectorAll(".shortcut-input"))if(t.dataset.actionId===e){t.focus(),t.select();return}}armRecordingTimer(){this.clearRecordingTimer(),this.recordingTimer=window.setTimeout(()=>{this.recordingTimer=void 0,this.stopRecording()},Xa)}stopRecording(){this.clearRecordingTimer(),this.removeRecordingListener(),this.recording=void 0}clearRecordingTimer(){this.recordingTimer!==void 0&&(window.clearTimeout(this.recordingTimer),this.recordingTimer=void 0)}ensureRecordingListener(){this.recordingListenerActive||(window.addEventListener("keydown",this.onRecordKeyDown,ea),this.recordingListenerActive=!0)}removeRecordingListener(){this.recordingListenerActive&&(window.removeEventListener("keydown",this.onRecordKeyDown,ea),this.recordingListenerActive=!1)}};ie.styles=[ds,E`
1877
+ `}shortcutInputText(e){const t=this.drafts[e.id];if(t!==void 0)return t;const i=Hi(e.id,this.configResponse?.config.shortcuts);return i===null?"":i??e.shortcut??""}recordingHint(e){const t=this.recording;return t?.actionId!==e?"":t.tokens.length===0?"Recording: press Ctrl/⌘ or Alt with a key. Press Esc to cancel.":`Recording: ${wi(t.tokens.join(" "))}. Press another key to add a sequence, or wait to finish.`}updateDraft(e,t){this.drafts={[e]:t},this.localError=""}async saveShortcut(e){this.stopRecording();const t=this.shortcutInputText(e).trim(),i=ys(t);if(!i.ok){this.localError=i.message;return}this.localError="",await this.saveShortcutPreference(e.id,i.shortcut)}async setShortcutNone(e){this.stopRecording(),this.localError="",await this.saveShortcutPreference(e,null)}async resetShortcut(e){this.stopRecording(),this.localError="",await this.saveShortcutPreference(e,void 0)}async saveShortcutPreference(e,t){const i={...this.configResponse?.config??{}},s=i.shortcuts??{},r=t===void 0?Yy(s,e):{...s,[e]:t};Object.keys(r).length===0?delete i.shortcuts:i.shortcuts=r,await this.onSave?.(i)}shortcutResolutions(){return new Map(Tr(this.actions,this.previewShortcutConfig(),{enabledOnly:!0}).map(e=>[e.action.id,e]))}previewShortcutConfig(){const e={...this.configResponse?.config.shortcuts??{}};for(const[t,i]of Object.entries(this.drafts)){const s=i.trim();if(s==="")continue;const r=ys(s);r.ok&&(e[t]=r.shortcut)}return Object.keys(e).length===0?void 0:e}async toggleRecording(e){if(this.recording?.actionId===e){this.stopRecording();return}this.stopRecording(),this.localError="",this.recording={actionId:e,tokens:[]},this.ensureRecordingListener(),await this.updateComplete,this.focusShortcutInput(e)}focusShortcutInput(e){for(const t of this.renderRoot.querySelectorAll(".shortcut-input"))if(t.dataset.actionId===e){t.focus(),t.select();return}}armRecordingTimer(){this.clearRecordingTimer(),this.recordingTimer=window.setTimeout(()=>{this.recordingTimer=void 0,this.stopRecording()},Xa)}stopRecording(){this.clearRecordingTimer(),this.removeRecordingListener(),this.recording=void 0}clearRecordingTimer(){this.recordingTimer!==void 0&&(window.clearTimeout(this.recordingTimer),this.recordingTimer=void 0)}ensureRecordingListener(){this.recordingListenerActive||(window.addEventListener("keydown",this.onRecordKeyDown,ea),this.recordingListenerActive=!0)}removeRecordingListener(){this.recordingListenerActive&&(window.removeEventListener("keydown",this.onRecordKeyDown,ea),this.recordingListenerActive=!1)}};ie.styles=[ds,E`
1877
1878
  .prompt-enter-card { border: 1px solid var(--pi-border); border-radius: 10px; background: var(--pi-surface); padding: 12px; display: grid; grid-template-columns: minmax(0, .85fr) minmax(260px, 1fr); gap: 12px; align-items: start; margin-bottom: 14px; }
1878
1879
  .prompt-enter-copy { display: grid; gap: 5px; min-width: 0; }
1879
1880
  .prompt-enter-copy p, .prompt-enter-option small { font-size: 12px; }
@@ -1916,7 +1917,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
1916
1917
  .shortcut-row { grid-template-columns: minmax(0, 1fr); align-items: start; }
1917
1918
  .shortcut-status, .shortcut-actions { justify-content: flex-start; }
1918
1919
  }
1919
- `];ge([d({attribute:!1})],ie.prototype,"actions",2);ge([d({attribute:!1})],ie.prototype,"configResponse",2);ge([d({type:Boolean})],ie.prototype,"loading",2);ge([d({type:Boolean})],ie.prototype,"saving",2);ge([d()],ie.prototype,"error",2);ge([d()],ie.prototype,"savedMessage",2);ge([d({attribute:!1})],ie.prototype,"onReload",2);ge([d({attribute:!1})],ie.prototype,"onSave",2);ge([x()],ie.prototype,"drafts",2);ge([x()],ie.prototype,"localError",2);ge([x()],ie.prototype,"promptEnterPreference",2);ge([x()],ie.prototype,"recording",2);ie=ge([W("settings-shortcuts-panel")],ie);function Vy(e){return e?.active===!1?"shortcut-row shadowed":e?.active===!0&&e.shadows.length>0?"shortcut-row shadowing":"shortcut-row"}function Gy(e){return e?.active===!1?"conflict shadowed":"conflict shadowing"}function Jy(e){if(e===void 0)return;if(!e.active)return`Shadowed by ${e.shadowedBy?.action.title??"another action"}`;const t=e.shadows.length;if(t===0)return;const i=e.shadows.slice(0,2).map(r=>r.action.title).join(", "),s=t>2?`, +${String(t-2)} more`:"";return`Shadows ${String(t)} ${t===1?"action":"actions"}: ${i}${s}`}function Qy(e){const t=new Map;for(const i of[...e].sort(Zy)){const s=i.group??"其他";t.set(s,[...t.get(s)??[],i])}return[...t.entries()].map(([i,s])=>({name:i,actions:s}))}function Zy(e,t){return(e.group??"其他").localeCompare(t.group??"其他")||e.title.localeCompare(t.title)}function Hi(e,t){if(!(t===void 0||!Object.hasOwn(t,e)))return t[e]}function Xy(e,t){return Object.fromEntries(Object.entries(e).filter(([i])=>i!==t))}function Yy(e,t){const i=Hi(e.id,t);if(i!==null)return i??e.shortcut}function e0(e,t){const i=Hi(e.id,t);return i===null?"disabled":i!==void 0?"custom":e.shortcut===void 0||e.shortcut===""?"unassigned":"default"}function t0(e){switch(e){case"default":return"默认";case"custom":return"配置覆盖";case"disabled":return"配置禁用";case"unassigned":return"无默认值"}}function i0(e){return e.target instanceof HTMLInputElement?e.target.value:""}var s0=Object.defineProperty,r0=Object.getOwnPropertyDescriptor,Ce=(e,t,i,s)=>{for(var r=s>1?void 0:s?r0(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&s0(t,i,r),r};let ce=class extends A{constructor(){super(...arguments),this.section="general",this.actions=[],this.loading=!0,this.saving=!1,this.error="",this.savedMessage=""}connectedCallback(){super.connectedCallback(),this.loadConfig()}disconnectedCallback(){this.savedMessageTimer!==void 0&&window.clearTimeout(this.savedMessageTimer),this.savedMessageTimer=void 0,super.disconnectedCallback()}render(){return l`
1920
+ `];ge([d({attribute:!1})],ie.prototype,"actions",2);ge([d({attribute:!1})],ie.prototype,"configResponse",2);ge([d({type:Boolean})],ie.prototype,"loading",2);ge([d({type:Boolean})],ie.prototype,"saving",2);ge([d()],ie.prototype,"error",2);ge([d()],ie.prototype,"savedMessage",2);ge([d({attribute:!1})],ie.prototype,"onReload",2);ge([d({attribute:!1})],ie.prototype,"onSave",2);ge([x()],ie.prototype,"drafts",2);ge([x()],ie.prototype,"localError",2);ge([x()],ie.prototype,"promptEnterPreference",2);ge([x()],ie.prototype,"recording",2);ie=ge([W("settings-shortcuts-panel")],ie);function Gy(e){return e?.active===!1?"shortcut-row shadowed":e?.active===!0&&e.shadows.length>0?"shortcut-row shadowing":"shortcut-row"}function Jy(e){return e?.active===!1?"conflict shadowed":"conflict shadowing"}function Qy(e){if(e===void 0)return;if(!e.active)return`Shadowed by ${e.shadowedBy?.action.title??"another action"}`;const t=e.shadows.length;if(t===0)return;const i=e.shadows.slice(0,2).map(r=>r.action.title).join(", "),s=t>2?`, +${String(t-2)} more`:"";return`Shadows ${String(t)} ${t===1?"action":"actions"}: ${i}${s}`}function Zy(e){const t=new Map;for(const i of[...e].sort(Xy)){const s=i.group??"其他";t.set(s,[...t.get(s)??[],i])}return[...t.entries()].map(([i,s])=>({name:i,actions:s}))}function Xy(e,t){return(e.group??"其他").localeCompare(t.group??"其他")||e.title.localeCompare(t.title)}function Hi(e,t){if(!(t===void 0||!Object.hasOwn(t,e)))return t[e]}function Yy(e,t){return Object.fromEntries(Object.entries(e).filter(([i])=>i!==t))}function e0(e,t){const i=Hi(e.id,t);if(i!==null)return i??e.shortcut}function t0(e,t){const i=Hi(e.id,t);return i===null?"disabled":i!==void 0?"custom":e.shortcut===void 0||e.shortcut===""?"unassigned":"default"}function i0(e){switch(e){case"default":return"默认";case"custom":return"配置覆盖";case"disabled":return"配置禁用";case"unassigned":return"无默认值"}}function s0(e){return e.target instanceof HTMLInputElement?e.target.value:""}var r0=Object.defineProperty,o0=Object.getOwnPropertyDescriptor,Ce=(e,t,i,s)=>{for(var r=s>1?void 0:s?o0(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&r0(t,i,r),r};let ce=class extends A{constructor(){super(...arguments),this.section="general",this.actions=[],this.loading=!0,this.saving=!1,this.error="",this.savedMessage=""}connectedCallback(){super.connectedCallback(),this.loadConfig()}disconnectedCallback(){this.savedMessageTimer!==void 0&&window.clearTimeout(this.savedMessageTimer),this.savedMessageTimer=void 0,super.disconnectedCallback()}render(){return l`
1920
1921
  <div class="backdrop" @mousedown=${()=>this.onClose?.()}>
1921
1922
  <section class="settings-shell" role="dialog" aria-modal="true" aria-label="PI WEB 设置" @mousedown=${e=>{e.stopPropagation()}} @keydown=${e=>{this.handleKeyDown(e)}}>
1922
1923
  <header class="settings-header">
@@ -2013,7 +2014,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
2013
2014
  .settings-nav button { flex: 0 0 auto; width: auto; min-width: 128px; margin: 0; }
2014
2015
  .settings-content { padding: 14px 12px calc(18px + env(safe-area-inset-bottom)); }
2015
2016
  }
2016
- `;Ce([d({attribute:!1})],ce.prototype,"section",2);Ce([d({attribute:!1})],ce.prototype,"actions",2);Ce([d({attribute:!1})],ce.prototype,"onNavigate",2);Ce([d({attribute:!1})],ce.prototype,"onClose",2);Ce([d({attribute:!1})],ce.prototype,"onConfigSaved",2);Ce([x()],ce.prototype,"configResponse",2);Ce([x()],ce.prototype,"pluginsResponse",2);Ce([x()],ce.prototype,"loading",2);Ce([x()],ce.prototype,"saving",2);Ce([x()],ce.prototype,"error",2);Ce([x()],ce.prototype,"savedMessage",2);ce=Ce([W("settings-dialog")],ce);function Ws(e){return e instanceof Error?e.message:String(e)}var o0=Object.defineProperty,n0=Object.getOwnPropertyDescriptor,De=(e,t,i,s)=>{for(var r=s>1?void 0:s?n0(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&o0(t,i,r),r};const a0=E`
2017
+ `;Ce([d({attribute:!1})],ce.prototype,"section",2);Ce([d({attribute:!1})],ce.prototype,"actions",2);Ce([d({attribute:!1})],ce.prototype,"onNavigate",2);Ce([d({attribute:!1})],ce.prototype,"onClose",2);Ce([d({attribute:!1})],ce.prototype,"onConfigSaved",2);Ce([x()],ce.prototype,"configResponse",2);Ce([x()],ce.prototype,"pluginsResponse",2);Ce([x()],ce.prototype,"loading",2);Ce([x()],ce.prototype,"saving",2);Ce([x()],ce.prototype,"error",2);Ce([x()],ce.prototype,"savedMessage",2);ce=Ce([W("settings-dialog")],ce);function Ws(e){return e instanceof Error?e.message:String(e)}var n0=Object.defineProperty,a0=Object.getOwnPropertyDescriptor,De=(e,t,i,s)=>{for(var r=s>1?void 0:s?a0(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&n0(t,i,r),r};const l0=E`
2017
2018
  :host { display: flex; flex-direction: column; min-height: 0; color: var(--pi-text); background: var(--pi-bg); font: 13px system-ui, sans-serif; container-type: inline-size; }
2018
2019
  header { flex: 0 0 auto; min-width: 0; border-bottom: 1px solid var(--pi-border); }
2019
2020
  .workspace-header-scroll-frame { position: relative; min-width: 0; background: var(--pi-bg); }
@@ -2102,32 +2103,32 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
2102
2103
  <h2>${e.title}</h2>
2103
2104
  ${e.body===void 0?null:l`<p>${e.body}</p>`}
2104
2105
  </section>
2105
- `}workspaceHeaderFrameClass(){return`workspace-header-scroll-frame${this.workspaceHeaderCanScrollLeft?" can-scroll-left":""}${this.workspaceHeaderCanScrollRight?" can-scroll-right":""}`}observeWorkspaceHeaderStrip(){const e=this.workspaceHeaderStripElement();this.observedWorkspaceHeaderStrip!==e&&(this.workspaceHeaderResizeObserver?.disconnect(),this.observedWorkspaceHeaderStrip=e,this.workspaceHeaderResizeObserver=void 0,!(e===void 0||typeof ResizeObserver>"u")&&(this.workspaceHeaderResizeObserver=new ResizeObserver(()=>{this.updateWorkspaceHeaderScrollState()}),this.workspaceHeaderResizeObserver.observe(e)))}updateWorkspaceHeaderScrollState(){const e=this.workspaceHeaderStripElement(),t=e===void 0?0:Math.max(0,e.scrollWidth-e.clientWidth),i=e!==void 0&&e.scrollLeft>1,s=e!==void 0&&t-e.scrollLeft>1;this.workspaceHeaderCanScrollLeft!==i&&(this.workspaceHeaderCanScrollLeft=i),this.workspaceHeaderCanScrollRight!==s&&(this.workspaceHeaderCanScrollRight=s)}workspaceHeaderStripElement(){const e=this.workspaceHeaderStrip;return e instanceof HTMLElement?e:void 0}};ue.styles=a0;De([d({attribute:!1})],ue.prototype,"workspace",2);De([d({attribute:!1})],ue.prototype,"panelContext",2);De([d({attribute:!1})],ue.prototype,"emptyState",2);De([d()],ue.prototype,"tool",2);De([d({attribute:!1})],ue.prototype,"panels",2);De([d({type:Boolean})],ue.prototype,"hideToolTabs",2);De([d({attribute:!1})],ue.prototype,"onSelectTool",2);De([B(".workspace-header-strip")],ue.prototype,"workspaceHeaderStrip",2);De([x()],ue.prototype,"workspaceHeaderCanScrollLeft",2);De([x()],ue.prototype,"workspaceHeaderCanScrollRight",2);ue=De([W("workspace-panel")],ue);var l0=Object.defineProperty,c0=Object.getOwnPropertyDescriptor,Ie=(e,t,i,s)=>{for(var r=s>1?void 0:s?c0(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&l0(t,i,r),r};let de=class extends A{constructor(){super(...arguments),this.machines=[],this.canScrollLeft=!1,this.canScrollRight=!1,this.onContextScroll=()=>{this.updateScrollState()}}disconnectedCallback(){this.contextItemsResizeObserver?.disconnect(),this.contextItemsResizeObserver=void 0,this.observedContextItems=void 0,super.disconnectedCallback()}firstUpdated(){this.observeContextItems(),this.updateScrollState()}updated(){this.observeContextItems(),this.updateScrollState()}render(){const e=d0(this.machines),t=p0(this.machine),i=u0(this.project),s=g0(this.workspace),r=v0(this.session);return l`
2106
+ `}workspaceHeaderFrameClass(){return`workspace-header-scroll-frame${this.workspaceHeaderCanScrollLeft?" can-scroll-left":""}${this.workspaceHeaderCanScrollRight?" can-scroll-right":""}`}observeWorkspaceHeaderStrip(){const e=this.workspaceHeaderStripElement();this.observedWorkspaceHeaderStrip!==e&&(this.workspaceHeaderResizeObserver?.disconnect(),this.observedWorkspaceHeaderStrip=e,this.workspaceHeaderResizeObserver=void 0,!(e===void 0||typeof ResizeObserver>"u")&&(this.workspaceHeaderResizeObserver=new ResizeObserver(()=>{this.updateWorkspaceHeaderScrollState()}),this.workspaceHeaderResizeObserver.observe(e)))}updateWorkspaceHeaderScrollState(){const e=this.workspaceHeaderStripElement(),t=e===void 0?0:Math.max(0,e.scrollWidth-e.clientWidth),i=e!==void 0&&e.scrollLeft>1,s=e!==void 0&&t-e.scrollLeft>1;this.workspaceHeaderCanScrollLeft!==i&&(this.workspaceHeaderCanScrollLeft=i),this.workspaceHeaderCanScrollRight!==s&&(this.workspaceHeaderCanScrollRight=s)}workspaceHeaderStripElement(){const e=this.workspaceHeaderStrip;return e instanceof HTMLElement?e:void 0}};ue.styles=l0;De([d({attribute:!1})],ue.prototype,"workspace",2);De([d({attribute:!1})],ue.prototype,"panelContext",2);De([d({attribute:!1})],ue.prototype,"emptyState",2);De([d()],ue.prototype,"tool",2);De([d({attribute:!1})],ue.prototype,"panels",2);De([d({type:Boolean})],ue.prototype,"hideToolTabs",2);De([d({attribute:!1})],ue.prototype,"onSelectTool",2);De([B(".workspace-header-strip")],ue.prototype,"workspaceHeaderStrip",2);De([x()],ue.prototype,"workspaceHeaderCanScrollLeft",2);De([x()],ue.prototype,"workspaceHeaderCanScrollRight",2);ue=De([W("workspace-panel")],ue);var c0=Object.defineProperty,d0=Object.getOwnPropertyDescriptor,Ie=(e,t,i,s)=>{for(var r=s>1?void 0:s?d0(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&c0(t,i,r),r};let de=class extends A{constructor(){super(...arguments),this.machines=[],this.canScrollLeft=!1,this.canScrollRight=!1,this.onContextScroll=()=>{this.updateScrollState()}}disconnectedCallback(){this.contextItemsResizeObserver?.disconnect(),this.contextItemsResizeObserver=void 0,this.observedContextItems=void 0,super.disconnectedCallback()}firstUpdated(){this.observeContextItems(),this.updateScrollState()}updated(){this.observeContextItems(),this.updateScrollState()}render(){const e=p0(this.machines),t=h0(this.machine),i=f0(this.project),s=m0(this.workspace),r=b0(this.session);return l`
2106
2107
  <nav class=${this.contextBarClass()} aria-label="当前位置">
2107
2108
  <span class="context-bar-label">位置</span>
2108
2109
  <ol class="context-items" @scroll=${this.onContextScroll}>
2109
2110
  ${e?l`
2110
2111
  <li class="context-item">
2111
- <button type="button" class=${this.machine===void 0?"context-chip empty":"context-chip"} title=${h0(this.machine)} aria-label=${`机器:${t}。打开机器选择。`} @click=${()=>{this.onOpenSection?.("machines")}}>
2112
+ <button type="button" class=${this.machine===void 0?"context-chip empty":"context-chip"} title=${u0(this.machine)} aria-label=${`机器:${t}。打开机器选择。`} @click=${()=>{this.onOpenSection?.("machines")}}>
2112
2113
  <span class="context-kind">机器</span>
2113
2114
  <span class="context-value">${t}</span>
2114
2115
  </button>
2115
2116
  </li>
2116
2117
  `:null}
2117
2118
  <li class="context-item">
2118
- <button type="button" class=${this.project===void 0?"context-chip empty":"context-chip"} title=${f0(this.project)} aria-label=${`项目:${i}。打开项目选择。`} @click=${()=>{this.onOpenSection?.("projects")}}>
2119
+ <button type="button" class=${this.project===void 0?"context-chip empty":"context-chip"} title=${g0(this.project)} aria-label=${`项目:${i}。打开项目选择。`} @click=${()=>{this.onOpenSection?.("projects")}}>
2119
2120
  <span class="context-kind">项目</span>
2120
2121
  <span class="context-value">${i}</span>
2121
2122
  </button>
2122
2123
  </li>
2123
2124
  <li class="context-item">
2124
- <button type="button" class=${this.workspace===void 0?"context-chip empty":"context-chip"} title=${m0(this.workspace)} aria-label=${`工作区:${s}。打开工作区选择。`} @click=${()=>{this.onOpenSection?.("workspaces")}}>
2125
+ <button type="button" class=${this.workspace===void 0?"context-chip empty":"context-chip"} title=${v0(this.workspace)} aria-label=${`工作区:${s}。打开工作区选择。`} @click=${()=>{this.onOpenSection?.("workspaces")}}>
2125
2126
  <span class="context-kind">工作区</span>
2126
2127
  <span class="context-value">${s}</span>
2127
2128
  </button>
2128
2129
  </li>
2129
2130
  <li class="context-item">
2130
- <button type="button" class=${this.session===void 0?"context-chip empty":"context-chip"} title=${b0(this.session)} aria-label=${`会话:${r}。打开会话选择。`} @click=${()=>{this.onOpenSection?.("sessions")}}>
2131
+ <button type="button" class=${this.session===void 0?"context-chip empty":"context-chip"} title=${w0(this.session)} aria-label=${`会话:${r}。打开会话选择。`} @click=${()=>{this.onOpenSection?.("sessions")}}>
2131
2132
  <span class="context-kind">会话</span>
2132
2133
  <span class="context-value">${r}</span>
2133
2134
  </button>
@@ -2167,7 +2168,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
2167
2168
  .context-kind { display: none; }
2168
2169
  .context-value { min-width: 0; overflow: visible; text-overflow: clip; white-space: nowrap; }
2169
2170
  button { cursor: pointer; }
2170
- `;Ie([d({attribute:!1})],de.prototype,"machines",2);Ie([d({attribute:!1})],de.prototype,"machine",2);Ie([d({attribute:!1})],de.prototype,"project",2);Ie([d({attribute:!1})],de.prototype,"workspace",2);Ie([d({attribute:!1})],de.prototype,"session",2);Ie([d({attribute:!1})],de.prototype,"refreshControl",2);Ie([d({attribute:!1})],de.prototype,"onOpenSection",2);Ie([d({attribute:!1})],de.prototype,"onShowActions",2);Ie([B(".context-items")],de.prototype,"contextItems",2);Ie([x()],de.prototype,"canScrollLeft",2);Ie([x()],de.prototype,"canScrollRight",2);de=Ie([W("app-context-bar")],de);function d0(e){return e.length>1}function p0(e){return e===void 0?"未选择机器":`${e.name}${e.kind==="remote"?" · 远程":""}`}function h0(e){return e===void 0?"未选择机器":e.baseUrl??e.name}function u0(e){return e?.name??"未选择项目"}function f0(e){return e===void 0?"未选择项目":`${e.name} — ${e.path}`}function g0(e){return e===void 0?"未选择工作区":`${e.label}${e.isMain?" · 主工作区":""} · ${e.path}`}function m0(e){return e===void 0?"未选择工作区":`${e.label}${e.isMain?" · 主工作区":""} — ${e.path}`}function v0(e){const t=e?.name?.trim(),i=e?.firstMessage.trim();return t!==void 0&&t!==""?t:i!==void 0&&i!==""?i:e?.id.slice(0,8)??"未选择会话"}function b0(e){return e===void 0?"未选择会话":e.path}var w0=Object.defineProperty,y0=Object.getOwnPropertyDescriptor,ft=(e,t,i,s)=>{for(var r=s>1?void 0:s?y0(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&w0(t,i,r),r};let qe=class extends A{constructor(){super(...arguments),this.tabs=[],this.selectedView="chat",this.canScrollLeft=!1,this.canScrollRight=!1,this.onMobileTabsScroll=()=>{this.updateScrollState()}}disconnectedCallback(){this.mobileTabsResizeObserver?.disconnect(),this.mobileTabsResizeObserver=void 0,this.observedMobileTabs=void 0,super.disconnectedCallback()}firstUpdated(){this.observeMobileTabs(),this.updateScrollState()}updated(){this.observeMobileTabs(),this.updateScrollState()}render(){const e=this.fallbackLabels();return l`
2171
+ `;Ie([d({attribute:!1})],de.prototype,"machines",2);Ie([d({attribute:!1})],de.prototype,"machine",2);Ie([d({attribute:!1})],de.prototype,"project",2);Ie([d({attribute:!1})],de.prototype,"workspace",2);Ie([d({attribute:!1})],de.prototype,"session",2);Ie([d({attribute:!1})],de.prototype,"refreshControl",2);Ie([d({attribute:!1})],de.prototype,"onOpenSection",2);Ie([d({attribute:!1})],de.prototype,"onShowActions",2);Ie([B(".context-items")],de.prototype,"contextItems",2);Ie([x()],de.prototype,"canScrollLeft",2);Ie([x()],de.prototype,"canScrollRight",2);de=Ie([W("app-context-bar")],de);function p0(e){return e.length>1}function h0(e){return e===void 0?"未选择机器":`${e.name}${e.kind==="remote"?" · 远程":""}`}function u0(e){return e===void 0?"未选择机器":e.baseUrl??e.name}function f0(e){return e?.name??"未选择项目"}function g0(e){return e===void 0?"未选择项目":`${e.name} — ${e.path}`}function m0(e){return e===void 0?"未选择工作区":`${e.label}${e.isMain?" · 主工作区":""} · ${e.path}`}function v0(e){return e===void 0?"未选择工作区":`${e.label}${e.isMain?" · 主工作区":""} — ${e.path}`}function b0(e){const t=e?.name?.trim(),i=e?.firstMessage.trim();return t!==void 0&&t!==""?t:i!==void 0&&i!==""?i:e?.id.slice(0,8)??"未选择会话"}function w0(e){return e===void 0?"未选择会话":e.path}var y0=Object.defineProperty,x0=Object.getOwnPropertyDescriptor,ft=(e,t,i,s)=>{for(var r=s>1?void 0:s?x0(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&y0(t,i,r),r};let qe=class extends A{constructor(){super(...arguments),this.tabs=[],this.selectedView="chat",this.canScrollLeft=!1,this.canScrollRight=!1,this.onMobileTabsScroll=()=>{this.updateScrollState()}}disconnectedCallback(){this.mobileTabsResizeObserver?.disconnect(),this.mobileTabsResizeObserver=void 0,this.observedMobileTabs=void 0,super.disconnectedCallback()}firstUpdated(){this.observeMobileTabs(),this.updateScrollState()}updated(){this.observeMobileTabs(),this.updateScrollState()}render(){const e=this.fallbackLabels();return l`
2171
2172
  <div class=${this.frameClass()}>
2172
2173
  <div class="mobile-tabs" @scroll=${this.onMobileTabsScroll}>
2173
2174
  ${this.tabs.map(t=>{const i=this.selectedView===t.id;return l`
@@ -2205,7 +2206,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
2205
2206
  .tab-label { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; border: 0; }
2206
2207
  .tab-badge { min-width: 13px; padding: 0 4px; font-size: 10px; line-height: 13px; }
2207
2208
  }
2208
- `;ft([d({attribute:!1})],qe.prototype,"tabs",2);ft([d({attribute:!1})],qe.prototype,"selectedView",2);ft([d({attribute:!1})],qe.prototype,"onSelect",2);ft([B(".mobile-tabs")],qe.prototype,"mobileTabs",2);ft([x()],qe.prototype,"canScrollLeft",2);ft([x()],qe.prototype,"canScrollRight",2);qe=ft([W("app-mobile-main-tabs")],qe);var x0=Object.defineProperty,S0=Object.getOwnPropertyDescriptor,me=(e,t,i,s)=>{for(var r=s>1?void 0:s?S0(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&x0(t,i,r),r};let se=class extends A{constructor(){super(...arguments),this.machines=[],this.statuses={},this.activities={},this.open=!1,this.menuStyle="",this.actionMenuStyle="",this.onDocumentClick=e=>{e.composedPath().includes(this)||(this.open=!1,this.openActionsMachineId=void 0)}}connectedCallback(){super.connectedCallback(),document.addEventListener("click",this.onDocumentClick)}disconnectedCallback(){document.removeEventListener("click",this.onDocumentClick),super.disconnectedCallback()}updated(e){e.has("machines")&&this.open&&this.selectedMachine()===void 0&&(this.open=!1),e.has("machines")&&this.openActionsMachineId!==void 0&&!this.machines.some(t=>t.id===this.openActionsMachineId)&&(this.openActionsMachineId=void 0)}async focusSelectedOrFirst(){const e=this.switcherButton();return e===null?!1:await this.openMenuAndFocusOption(e)}render(){const e=this.selectedMachine();if(e===void 0)return null;const t=Os(e,this.statuses),i=e.name;return l`
2209
+ `;ft([d({attribute:!1})],qe.prototype,"tabs",2);ft([d({attribute:!1})],qe.prototype,"selectedView",2);ft([d({attribute:!1})],qe.prototype,"onSelect",2);ft([B(".mobile-tabs")],qe.prototype,"mobileTabs",2);ft([x()],qe.prototype,"canScrollLeft",2);ft([x()],qe.prototype,"canScrollRight",2);qe=ft([W("app-mobile-main-tabs")],qe);var S0=Object.defineProperty,k0=Object.getOwnPropertyDescriptor,me=(e,t,i,s)=>{for(var r=s>1?void 0:s?k0(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&S0(t,i,r),r};let se=class extends A{constructor(){super(...arguments),this.machines=[],this.statuses={},this.activities={},this.open=!1,this.menuStyle="",this.actionMenuStyle="",this.onDocumentClick=e=>{e.composedPath().includes(this)||(this.open=!1,this.openActionsMachineId=void 0)}}connectedCallback(){super.connectedCallback(),document.addEventListener("click",this.onDocumentClick)}disconnectedCallback(){document.removeEventListener("click",this.onDocumentClick),super.disconnectedCallback()}updated(e){e.has("machines")&&this.open&&this.selectedMachine()===void 0&&(this.open=!1),e.has("machines")&&this.openActionsMachineId!==void 0&&!this.machines.some(t=>t.id===this.openActionsMachineId)&&(this.openActionsMachineId=void 0)}async focusSelectedOrFirst(){const e=this.switcherButton();return e===null?!1:await this.openMenuAndFocusOption(e)}render(){const e=this.selectedMachine();if(e===void 0)return null;const t=Os(e,this.statuses),i=e.name;return l`
2209
2210
  <div class="machine-switcher">
2210
2211
  <button
2211
2212
  type="button"
@@ -2294,7 +2295,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
2294
2295
  .machine-option-actions-panel button:hover, .machine-option-actions-panel button:focus-visible { background: var(--pi-selection-bg); }
2295
2296
  .machine-option-actions-panel button.danger:hover, .machine-option-actions-panel button.danger:focus-visible { background: color-mix(in srgb, var(--pi-danger) 14%, transparent); }
2296
2297
  @keyframes pulse { 0%, 100% { opacity: .55; } 50% { opacity: 1; } }
2297
- `;me([d({attribute:!1})],se.prototype,"machines",2);me([d({attribute:!1})],se.prototype,"selected",2);me([d({attribute:!1})],se.prototype,"statuses",2);me([d({attribute:!1})],se.prototype,"activities",2);me([d({attribute:!1})],se.prototype,"onSelect",2);me([d({attribute:!1})],se.prototype,"onRemove",2);me([d({attribute:!1})],se.prototype,"onFocusNextSection",2);me([d({attribute:!1})],se.prototype,"onCancelKeyboardNavigation",2);me([x()],se.prototype,"open",2);me([x()],se.prototype,"menuStyle",2);me([x()],se.prototype,"openActionsMachineId",2);me([x()],se.prototype,"actionMenuStyle",2);se=me([W("machine-switcher")],se);function Os(e,t){return t[e.id]?.status??e.status??"unknown"}function ta(e){return e==="online"?"online":e==="offline"?"offline":e==="error"?"error":"unknown"}function ia(e){return e.baseUrl??e.name}function sa(e){if(typeof HTMLElement>"u"||typeof window>"u"||!(e instanceof HTMLElement))return"";const t=e.getBoundingClientRect(),i=8,s=Math.min(280,Math.max(0,window.innerWidth-i*2)),r=Math.min(Math.max(i,t.left),Math.max(i,window.innerWidth-i-s)),o=Math.max(0,window.innerHeight-t.bottom-i);return[`top: ${pi(t.bottom)};`,`left: ${pi(r)};`,`width: ${pi(s)};`,`max-height: ${pi(o)};`].join(" ")}function pi(e){return`${String(Math.round(e))}px`}var k0=Object.defineProperty,$0=Object.getOwnPropertyDescriptor,k=(e,t,i,s)=>{for(var r=s>1?void 0:s?$0(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&k0(t,i,r),r};let S=class extends A{constructor(){super(...arguments),this.machines=[],this.machineStatuses={},this.machineActivities={},this.projects=[],this.workspaces=[],this.sessions=[],this.workspaceActivities={},this.sessionActivities={},this.sessionStatuses={},this.sendingPrompts={},this.workspacesByProjectId={},this.deletingWorkspaceIds=[],this.workspaceLabelItems=()=>[],this.collapsible=!1,this.compact=!1,this.machinesCollapsed=!1,this.projectsCollapsed=!1,this.workspacesCollapsed=!1,this.sessionsCollapsed=!1,this.canStartSession=!1,this.canDeleteArchivedSessions=!1,this.canReloadSessions=!1,this.canCleanupSessions=!1,this.archivedDeleteUnavailableMessage="请更新并重启此机器上的 Pi-Web 后再删除已归档会话。",this.cleanupUnavailableMessage="请更新并重启此机器上的 Pi-Web 后再清理会话。"}async focusSection(e){switch(await this.updateComplete,e){case"machines":return await this.focusNavigableSection(this.compact?this.machineList:this.machineSwitcher);case"projects":return await this.focusNavigableSection(this.projectList);case"workspaces":return await this.focusNavigableSection(this.workspaceList);case"sessions":return await this.focusNavigableSection(this.sessionList)}}render(){return l`
2298
+ `;me([d({attribute:!1})],se.prototype,"machines",2);me([d({attribute:!1})],se.prototype,"selected",2);me([d({attribute:!1})],se.prototype,"statuses",2);me([d({attribute:!1})],se.prototype,"activities",2);me([d({attribute:!1})],se.prototype,"onSelect",2);me([d({attribute:!1})],se.prototype,"onRemove",2);me([d({attribute:!1})],se.prototype,"onFocusNextSection",2);me([d({attribute:!1})],se.prototype,"onCancelKeyboardNavigation",2);me([x()],se.prototype,"open",2);me([x()],se.prototype,"menuStyle",2);me([x()],se.prototype,"openActionsMachineId",2);me([x()],se.prototype,"actionMenuStyle",2);se=me([W("machine-switcher")],se);function Os(e,t){return t[e.id]?.status??e.status??"unknown"}function ta(e){return e==="online"?"online":e==="offline"?"offline":e==="error"?"error":"unknown"}function ia(e){return e.baseUrl??e.name}function sa(e){if(typeof HTMLElement>"u"||typeof window>"u"||!(e instanceof HTMLElement))return"";const t=e.getBoundingClientRect(),i=8,s=Math.min(280,Math.max(0,window.innerWidth-i*2)),r=Math.min(Math.max(i,t.left),Math.max(i,window.innerWidth-i-s)),o=Math.max(0,window.innerHeight-t.bottom-i);return[`top: ${pi(t.bottom)};`,`left: ${pi(r)};`,`width: ${pi(s)};`,`max-height: ${pi(o)};`].join(" ")}function pi(e){return`${String(Math.round(e))}px`}var $0=Object.defineProperty,P0=Object.getOwnPropertyDescriptor,k=(e,t,i,s)=>{for(var r=s>1?void 0:s?P0(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&$0(t,i,r),r};let S=class extends A{constructor(){super(...arguments),this.machines=[],this.machineStatuses={},this.machineActivities={},this.projects=[],this.workspaces=[],this.sessions=[],this.workspaceActivities={},this.sessionActivities={},this.sessionStatuses={},this.sendingPrompts={},this.workspacesByProjectId={},this.deletingWorkspaceIds=[],this.workspaceLabelItems=()=>[],this.collapsible=!1,this.compact=!1,this.machinesCollapsed=!1,this.projectsCollapsed=!1,this.workspacesCollapsed=!1,this.sessionsCollapsed=!1,this.canStartSession=!1,this.canDeleteArchivedSessions=!1,this.canReloadSessions=!1,this.canCleanupSessions=!1,this.archivedDeleteUnavailableMessage="请更新并重启此机器上的 Pi-Web 后再删除已归档会话。",this.cleanupUnavailableMessage="请更新并重启此机器上的 Pi-Web 后再清理会话。"}async focusSection(e){switch(await this.updateComplete,e){case"machines":return await this.focusNavigableSection(this.compact?this.machineList:this.machineSwitcher);case"projects":return await this.focusNavigableSection(this.projectList);case"workspaces":return await this.focusNavigableSection(this.workspaceList);case"sessions":return await this.focusNavigableSection(this.sessionList)}}render(){return l`
2298
2299
  <header>
2299
2300
  <strong>PI WEB</strong>
2300
2301
  ${qi(this.machines)?l`
@@ -2390,7 +2391,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
2390
2391
  .onFocusNextSection=${()=>{this.focusNextFrom("sessions")}}
2391
2392
  .onCancelKeyboardNavigation=${()=>{this.cancelKeyboardNavigation()}}
2392
2393
  ></session-list>
2393
- `}async focusNavigableSection(e){return e===void 0?!1:await e.focusSelectedOrFirst()}focusPreviousFrom(e){const t=P0(e,this.machines);t!==void 0&&this.onFocusNavigationTarget?.(t)}focusNextFrom(e){this.onFocusNavigationTarget?.(C0(e,this.machines))}cancelKeyboardNavigation(){this.onCancelKeyboardNavigation?.()}};S.styles=E`
2394
+ `}async focusNavigableSection(e){return e===void 0?!1:await e.focusSelectedOrFirst()}focusPreviousFrom(e){const t=C0(e,this.machines);t!==void 0&&this.onFocusNavigationTarget?.(t)}focusNextFrom(e){this.onFocusNavigationTarget?.(I0(e,this.machines))}cancelKeyboardNavigation(){this.onCancelKeyboardNavigation?.()}};S.styles=E`
2394
2395
  :host { display: flex; flex-direction: column; min-height: 0; overflow: hidden; }
2395
2396
  :host([compact]) { flex: 1 1 auto; }
2396
2397
  header { flex: 0 0 auto; display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 12px; border-bottom: 1px solid var(--pi-border); }
@@ -2413,7 +2414,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
2413
2414
  :host([compact]) workspace-list[collapsed],
2414
2415
  :host([compact]) session-list[collapsed] { flex: 0 0 auto; min-height: auto; overflow: hidden; }
2415
2416
  button { border: 1px solid var(--pi-border); border-radius: 8px; background: var(--pi-surface); color: var(--pi-text); padding: 7px 9px; cursor: pointer; }
2416
- `;k([d({attribute:!1})],S.prototype,"machines",2);k([d({attribute:!1})],S.prototype,"selectedMachine",2);k([d({attribute:!1})],S.prototype,"machineStatuses",2);k([d({attribute:!1})],S.prototype,"machineActivities",2);k([d({attribute:!1})],S.prototype,"projects",2);k([d({attribute:!1})],S.prototype,"selectedProject",2);k([d({attribute:!1})],S.prototype,"workspaces",2);k([d({attribute:!1})],S.prototype,"selectedWorkspace",2);k([d({attribute:!1})],S.prototype,"sessions",2);k([d({attribute:!1})],S.prototype,"selectedSession",2);k([d({attribute:!1})],S.prototype,"workspaceActivities",2);k([d({attribute:!1})],S.prototype,"sessionActivities",2);k([d({attribute:!1})],S.prototype,"sessionStatuses",2);k([d({attribute:!1})],S.prototype,"sendingPrompts",2);k([d({attribute:!1})],S.prototype,"workspacesByProjectId",2);k([d({attribute:!1})],S.prototype,"deletingWorkspaceIds",2);k([d({attribute:!1})],S.prototype,"workspaceLabelItems",2);k([d({attribute:!1})],S.prototype,"refreshControl",2);k([d({type:Boolean,reflect:!0})],S.prototype,"collapsible",2);k([d({type:Boolean,reflect:!0})],S.prototype,"compact",2);k([d({type:Boolean})],S.prototype,"machinesCollapsed",2);k([d({type:Boolean})],S.prototype,"projectsCollapsed",2);k([d({type:Boolean})],S.prototype,"workspacesCollapsed",2);k([d({type:Boolean})],S.prototype,"sessionsCollapsed",2);k([d({type:Boolean})],S.prototype,"canStartSession",2);k([d({type:Boolean})],S.prototype,"canDeleteArchivedSessions",2);k([d({type:Boolean})],S.prototype,"canReloadSessions",2);k([d({type:Boolean})],S.prototype,"canCleanupSessions",2);k([d({type:String})],S.prototype,"archivedDeleteUnavailableMessage",2);k([d({type:String})],S.prototype,"cleanupUnavailableMessage",2);k([d({attribute:!1})],S.prototype,"onShowActions",2);k([d({attribute:!1})],S.prototype,"onToggleMachines",2);k([d({attribute:!1})],S.prototype,"onToggleProjects",2);k([d({attribute:!1})],S.prototype,"onToggleWorkspaces",2);k([d({attribute:!1})],S.prototype,"onToggleSessions",2);k([d({attribute:!1})],S.prototype,"onSelectProject",2);k([d({attribute:!1})],S.prototype,"onCloseProject",2);k([d({attribute:!1})],S.prototype,"onSelectWorkspace",2);k([d({attribute:!1})],S.prototype,"onDeleteWorkspace",2);k([d({attribute:!1})],S.prototype,"onStartSession",2);k([d({attribute:!1})],S.prototype,"onSelectSession",2);k([d({attribute:!1})],S.prototype,"onArchiveSession",2);k([d({attribute:!1})],S.prototype,"onArchiveSessionWithDescendants",2);k([d({attribute:!1})],S.prototype,"onArchiveSessions",2);k([d({attribute:!1})],S.prototype,"onRestoreSession",2);k([d({attribute:!1})],S.prototype,"onDeleteCachedNewSession",2);k([d({attribute:!1})],S.prototype,"onDeleteArchivedSession",2);k([d({attribute:!1})],S.prototype,"onDeleteArchivedSessions",2);k([d({attribute:!1})],S.prototype,"onDetachParentSession",2);k([d({attribute:!1})],S.prototype,"onReloadSession",2);k([d({attribute:!1})],S.prototype,"onCleanupSessions",2);k([d({attribute:!1})],S.prototype,"onArchivedCollapsed",2);k([d({attribute:!1})],S.prototype,"onSelectMachine",2);k([d({attribute:!1})],S.prototype,"onRemoveMachine",2);k([d({attribute:!1})],S.prototype,"onFocusNavigationTarget",2);k([d({attribute:!1})],S.prototype,"onCancelKeyboardNavigation",2);k([B("machine-list")],S.prototype,"machineList",2);k([B("machine-switcher")],S.prototype,"machineSwitcher",2);k([B("project-list")],S.prototype,"projectList",2);k([B("workspace-list")],S.prototype,"workspaceList",2);k([B("session-list")],S.prototype,"sessionList",2);S=k([W("app-navigation-panel")],S);function qi(e){return e.length>1}function P0(e,t){const i=Jl(t);return i[i.indexOf(e)-1]}function C0(e,t){const i=Jl(t);return i[i.indexOf(e)+1]??"chat"}function Jl(e){return ji.filter(t=>t!=="machines"||qi(e))}var I0=Object.defineProperty,R0=Object.getOwnPropertyDescriptor,ee=(e,t,i,s)=>{for(var r=s>1?void 0:s?R0(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&I0(t,i,r),r};const A0=new Set(["ArrowLeft","ArrowRight","Home","End"]),T0=420,M0=4;let K=class extends A{constructor(){super(...arguments),this.side="navigation",this.collapsed=!1,this.resizable=!1,this.controls="",this.resizeLabel="调整面板宽度",this.expandLabel="展开面板",this.collapseLabel="折叠面板",this.lastTapAt=0}disconnectedCallback(){this.finishActiveResize(),super.disconnectedCallback()}render(){const e=this.collapsed?this.expandLabel:this.collapseLabel;return l`
2417
+ `;k([d({attribute:!1})],S.prototype,"machines",2);k([d({attribute:!1})],S.prototype,"selectedMachine",2);k([d({attribute:!1})],S.prototype,"machineStatuses",2);k([d({attribute:!1})],S.prototype,"machineActivities",2);k([d({attribute:!1})],S.prototype,"projects",2);k([d({attribute:!1})],S.prototype,"selectedProject",2);k([d({attribute:!1})],S.prototype,"workspaces",2);k([d({attribute:!1})],S.prototype,"selectedWorkspace",2);k([d({attribute:!1})],S.prototype,"sessions",2);k([d({attribute:!1})],S.prototype,"selectedSession",2);k([d({attribute:!1})],S.prototype,"workspaceActivities",2);k([d({attribute:!1})],S.prototype,"sessionActivities",2);k([d({attribute:!1})],S.prototype,"sessionStatuses",2);k([d({attribute:!1})],S.prototype,"sendingPrompts",2);k([d({attribute:!1})],S.prototype,"workspacesByProjectId",2);k([d({attribute:!1})],S.prototype,"deletingWorkspaceIds",2);k([d({attribute:!1})],S.prototype,"workspaceLabelItems",2);k([d({attribute:!1})],S.prototype,"refreshControl",2);k([d({type:Boolean,reflect:!0})],S.prototype,"collapsible",2);k([d({type:Boolean,reflect:!0})],S.prototype,"compact",2);k([d({type:Boolean})],S.prototype,"machinesCollapsed",2);k([d({type:Boolean})],S.prototype,"projectsCollapsed",2);k([d({type:Boolean})],S.prototype,"workspacesCollapsed",2);k([d({type:Boolean})],S.prototype,"sessionsCollapsed",2);k([d({type:Boolean})],S.prototype,"canStartSession",2);k([d({type:Boolean})],S.prototype,"canDeleteArchivedSessions",2);k([d({type:Boolean})],S.prototype,"canReloadSessions",2);k([d({type:Boolean})],S.prototype,"canCleanupSessions",2);k([d({type:String})],S.prototype,"archivedDeleteUnavailableMessage",2);k([d({type:String})],S.prototype,"cleanupUnavailableMessage",2);k([d({attribute:!1})],S.prototype,"onShowActions",2);k([d({attribute:!1})],S.prototype,"onToggleMachines",2);k([d({attribute:!1})],S.prototype,"onToggleProjects",2);k([d({attribute:!1})],S.prototype,"onToggleWorkspaces",2);k([d({attribute:!1})],S.prototype,"onToggleSessions",2);k([d({attribute:!1})],S.prototype,"onSelectProject",2);k([d({attribute:!1})],S.prototype,"onCloseProject",2);k([d({attribute:!1})],S.prototype,"onSelectWorkspace",2);k([d({attribute:!1})],S.prototype,"onDeleteWorkspace",2);k([d({attribute:!1})],S.prototype,"onStartSession",2);k([d({attribute:!1})],S.prototype,"onSelectSession",2);k([d({attribute:!1})],S.prototype,"onArchiveSession",2);k([d({attribute:!1})],S.prototype,"onArchiveSessionWithDescendants",2);k([d({attribute:!1})],S.prototype,"onArchiveSessions",2);k([d({attribute:!1})],S.prototype,"onRestoreSession",2);k([d({attribute:!1})],S.prototype,"onDeleteCachedNewSession",2);k([d({attribute:!1})],S.prototype,"onDeleteArchivedSession",2);k([d({attribute:!1})],S.prototype,"onDeleteArchivedSessions",2);k([d({attribute:!1})],S.prototype,"onDetachParentSession",2);k([d({attribute:!1})],S.prototype,"onReloadSession",2);k([d({attribute:!1})],S.prototype,"onCleanupSessions",2);k([d({attribute:!1})],S.prototype,"onArchivedCollapsed",2);k([d({attribute:!1})],S.prototype,"onSelectMachine",2);k([d({attribute:!1})],S.prototype,"onRemoveMachine",2);k([d({attribute:!1})],S.prototype,"onFocusNavigationTarget",2);k([d({attribute:!1})],S.prototype,"onCancelKeyboardNavigation",2);k([B("machine-list")],S.prototype,"machineList",2);k([B("machine-switcher")],S.prototype,"machineSwitcher",2);k([B("project-list")],S.prototype,"projectList",2);k([B("workspace-list")],S.prototype,"workspaceList",2);k([B("session-list")],S.prototype,"sessionList",2);S=k([W("app-navigation-panel")],S);function qi(e){return e.length>1}function C0(e,t){const i=Jl(t);return i[i.indexOf(e)-1]}function I0(e,t){const i=Jl(t);return i[i.indexOf(e)+1]??"chat"}function Jl(e){return ji.filter(t=>t!=="machines"||qi(e))}var R0=Object.defineProperty,A0=Object.getOwnPropertyDescriptor,ee=(e,t,i,s)=>{for(var r=s>1?void 0:s?A0(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&R0(t,i,r),r};const T0=new Set(["ArrowLeft","ArrowRight","Home","End"]),M0=420,E0=4;let K=class extends A{constructor(){super(...arguments),this.side="navigation",this.collapsed=!1,this.resizable=!1,this.controls="",this.resizeLabel="调整面板宽度",this.expandLabel="展开面板",this.collapseLabel="折叠面板",this.lastTapAt=0}disconnectedCallback(){this.finishActiveResize(),super.disconnectedCallback()}render(){const e=this.collapsed?this.expandLabel:this.collapseLabel;return l`
2417
2418
  ${this.renderResizeHandle()}
2418
2419
  <button
2419
2420
  type="button"
@@ -2443,7 +2444,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
2443
2444
  @dblclick=${t=>{this.onResizeDoubleClick(t)}}
2444
2445
  @keydown=${t=>{this.onResizeKeyDown(t)}}
2445
2446
  ></div>
2446
- `}resizeAriaValueNow(){return this.panelWidth===void 0?z:String(Math.round(this.panelWidth))}renderIcon(){const t=this.iconDirection()==="left"?"M15 18l-6-6 6-6":"M9 18l6-6-6-6";return l`<svg class="edge-icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d=${t}/></svg>`}iconDirection(){return this.side==="navigation"?this.collapsed?"right":"left":this.collapsed?"left":"right"}onResizePointerDown(e){if(!this.resizable||e.button!==0)return;const t=e.currentTarget;if(!(t instanceof HTMLElement))return;const i=this.resizeStartWidth();i!==void 0&&(e.preventDefault(),e.stopPropagation(),t.setPointerCapture(e.pointerId),this.activeResize={pointerId:e.pointerId,startClientX:e.clientX,startWidth:i,handle:t,moved:!1},this.toggleAttribute("resizing",!0))}onResizePointerMove(e){const t=this.activeResize;t?.pointerId===e.pointerId&&(e.preventDefault(),!(Math.abs(e.clientX-t.startClientX)<=M0)&&(t.moved=!0,this.commitPanelWidth(Dm(this.side,t.startWidth,t.startClientX,e.clientX,this.resizeConstraints()))))}onResizePointerUp(e){const t=this.activeResize;t?.pointerId===e.pointerId&&(e.preventDefault(),this.finishActiveResize(),t.moved||this.registerTapForReset())}onResizePointerCancel(e){this.activeResize?.pointerId===e.pointerId&&this.finishActiveResize()}onResizeDoubleClick(e){e.preventDefault(),e.stopPropagation(),this.resetPanelSize()}onResizeKeyDown(e){if(!this.resizable||!A0.has(e.key))return;const t=this.resizeStartWidth();if(t===void 0)return;const i=Wm(this.side,t,e.key,{largeStep:e.shiftKey,constraints:this.resizeConstraints()});i!==void 0&&(e.preventDefault(),e.stopPropagation(),this.commitPanelWidth(i),this.onResizeEnd?.())}registerTapForReset(){const e=Date.now();if(e-this.lastTapAt<=T0){this.lastTapAt=0,this.resetPanelSize();return}this.lastTapAt=e}resetPanelSize(){this.finishActiveResize(),this.onReset?.()}resizeStartWidth(){const e=this.onResizeStart?.()??this.panelWidth;if(e!==void 0)return we(this.side,e,this.resizeConstraints())}commitPanelWidth(e){this.onResize?.(we(this.side,e,this.resizeConstraints()))}finishActiveResize(){const e=this.activeResize;if(e!==void 0){try{e.handle.releasePointerCapture(e.pointerId)}catch{}this.activeResize=void 0,this.toggleAttribute("resizing",!1),this.onResizeEnd?.()}}resizeConstraints(){const e=Yt(this.side);return{...e,minWidth:this.minWidth??e.minWidth,maxWidth:this.maxWidth??e.maxWidth}}};K.styles=E`
2447
+ `}resizeAriaValueNow(){return this.panelWidth===void 0?z:String(Math.round(this.panelWidth))}renderIcon(){const t=this.iconDirection()==="left"?"M15 18l-6-6 6-6":"M9 18l6-6-6-6";return l`<svg class="edge-icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d=${t}/></svg>`}iconDirection(){return this.side==="navigation"?this.collapsed?"right":"left":this.collapsed?"left":"right"}onResizePointerDown(e){if(!this.resizable||e.button!==0)return;const t=e.currentTarget;if(!(t instanceof HTMLElement))return;const i=this.resizeStartWidth();i!==void 0&&(e.preventDefault(),e.stopPropagation(),t.setPointerCapture(e.pointerId),this.activeResize={pointerId:e.pointerId,startClientX:e.clientX,startWidth:i,handle:t,moved:!1},this.toggleAttribute("resizing",!0))}onResizePointerMove(e){const t=this.activeResize;t?.pointerId===e.pointerId&&(e.preventDefault(),!(Math.abs(e.clientX-t.startClientX)<=E0)&&(t.moved=!0,this.commitPanelWidth(Wm(this.side,t.startWidth,t.startClientX,e.clientX,this.resizeConstraints()))))}onResizePointerUp(e){const t=this.activeResize;t?.pointerId===e.pointerId&&(e.preventDefault(),this.finishActiveResize(),t.moved||this.registerTapForReset())}onResizePointerCancel(e){this.activeResize?.pointerId===e.pointerId&&this.finishActiveResize()}onResizeDoubleClick(e){e.preventDefault(),e.stopPropagation(),this.resetPanelSize()}onResizeKeyDown(e){if(!this.resizable||!T0.has(e.key))return;const t=this.resizeStartWidth();if(t===void 0)return;const i=Om(this.side,t,e.key,{largeStep:e.shiftKey,constraints:this.resizeConstraints()});i!==void 0&&(e.preventDefault(),e.stopPropagation(),this.commitPanelWidth(i),this.onResizeEnd?.())}registerTapForReset(){const e=Date.now();if(e-this.lastTapAt<=M0){this.lastTapAt=0,this.resetPanelSize();return}this.lastTapAt=e}resetPanelSize(){this.finishActiveResize(),this.onReset?.()}resizeStartWidth(){const e=this.onResizeStart?.()??this.panelWidth;if(e!==void 0)return we(this.side,e,this.resizeConstraints())}commitPanelWidth(e){this.onResize?.(we(this.side,e,this.resizeConstraints()))}finishActiveResize(){const e=this.activeResize;if(e!==void 0){try{e.handle.releasePointerCapture(e.pointerId)}catch{}this.activeResize=void 0,this.toggleAttribute("resizing",!1),this.onResizeEnd?.()}}resizeConstraints(){const e=Yt(this.side);return{...e,minWidth:this.minWidth??e.minWidth,maxWidth:this.maxWidth??e.maxWidth}}};K.styles=E`
2447
2448
  :host { position: relative; min-width: 0; min-height: 0; display: flex; align-items: center; justify-content: center; overflow: visible; background: var(--pi-border-muted); z-index: 2; }
2448
2449
  :host([side="navigation"]) { grid-column: 2; }
2449
2450
  :host([side="workspace"]) { grid-column: 4; }
@@ -2462,7 +2463,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
2462
2463
  @media (max-width: 760px) {
2463
2464
  :host([side="navigation"]) { display: none; }
2464
2465
  }
2465
- `;ee([d({reflect:!0})],K.prototype,"side",2);ee([d({type:Boolean,reflect:!0})],K.prototype,"collapsed",2);ee([d({type:Boolean})],K.prototype,"resizable",2);ee([d({type:Number})],K.prototype,"panelWidth",2);ee([d({type:Number})],K.prototype,"minWidth",2);ee([d({type:Number})],K.prototype,"maxWidth",2);ee([d()],K.prototype,"controls",2);ee([d()],K.prototype,"resizeLabel",2);ee([d()],K.prototype,"expandLabel",2);ee([d()],K.prototype,"collapseLabel",2);ee([d({attribute:!1})],K.prototype,"onToggle",2);ee([d({attribute:!1})],K.prototype,"onResizeStart",2);ee([d({attribute:!1})],K.prototype,"onResize",2);ee([d({attribute:!1})],K.prototype,"onResizeEnd",2);ee([d({attribute:!1})],K.prototype,"onReset",2);K=ee([W("app-panel-edge-control")],K);var E0=Object.defineProperty,D0=Object.getOwnPropertyDescriptor,Ql=(e,t,i,s)=>{for(var r=s>1?void 0:s?D0(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&E0(t,i,r),r};let Ki=class extends A{constructor(){super(...arguments),this.onReloadClick=e=>{e.stopPropagation(),this.onReload?.()}}render(){const e="完整重载页面";return l`
2466
+ `;ee([d({reflect:!0})],K.prototype,"side",2);ee([d({type:Boolean,reflect:!0})],K.prototype,"collapsed",2);ee([d({type:Boolean})],K.prototype,"resizable",2);ee([d({type:Number})],K.prototype,"panelWidth",2);ee([d({type:Number})],K.prototype,"minWidth",2);ee([d({type:Number})],K.prototype,"maxWidth",2);ee([d()],K.prototype,"controls",2);ee([d()],K.prototype,"resizeLabel",2);ee([d()],K.prototype,"expandLabel",2);ee([d()],K.prototype,"collapseLabel",2);ee([d({attribute:!1})],K.prototype,"onToggle",2);ee([d({attribute:!1})],K.prototype,"onResizeStart",2);ee([d({attribute:!1})],K.prototype,"onResize",2);ee([d({attribute:!1})],K.prototype,"onResizeEnd",2);ee([d({attribute:!1})],K.prototype,"onReset",2);K=ee([W("app-panel-edge-control")],K);var D0=Object.defineProperty,W0=Object.getOwnPropertyDescriptor,Ql=(e,t,i,s)=>{for(var r=s>1?void 0:s?W0(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&D0(t,i,r),r};let Ki=class extends A{constructor(){super(...arguments),this.onReloadClick=e=>{e.stopPropagation(),this.onReload?.()}}render(){const e="完整重载页面";return l`
2466
2467
  <button
2467
2468
  class="app-refresh-button"
2468
2469
  title=${e}
@@ -2481,7 +2482,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
2481
2482
  :host, :host * { -webkit-user-select: none; user-select: none; }
2482
2483
  .app-refresh-button { box-sizing: border-box; width: 36px; height: 36px; display: grid; place-items: center; border: 1px solid var(--pi-border); border-radius: 999px; background: var(--pi-surface); color: var(--pi-text); padding: 0; line-height: 1; cursor: pointer; touch-action: manipulation; -webkit-touch-callout: none; }
2483
2484
  .app-refresh-icon { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; pointer-events: none; }
2484
- `;Ql([d({attribute:!1})],Ki.prototype,"onReload",2);Ki=Ql([W("app-refresh-control")],Ki);var W0=Object.defineProperty,O0=Object.getOwnPropertyDescriptor,ve=(e,t,i,s)=>{for(var r=s>1?void 0:s?O0(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&W0(t,i,r),r};const _0=E`
2485
+ `;Ql([d({attribute:!1})],Ki.prototype,"onReload",2);Ki=Ql([W("app-refresh-control")],Ki);var O0=Object.defineProperty,_0=Object.getOwnPropertyDescriptor,ve=(e,t,i,s)=>{for(var r=s>1?void 0:s?_0(t,i):t,o=e.length-1,n;o>=0;o--)(n=e[o])&&(r=(s?n(t,i,r):n(r))||r);return s&&r&&O0(t,i,r),r};const L0=E`
2485
2486
  /* Mobile browsers already subtract browser controls from 100dvh; reserve bottom safe area only in standalone PWA modes. */
2486
2487
  :host { --pi-app-safe-area-bottom: 0px; position: fixed; top: 0; right: 0; left: 0; display: block; height: 100dvh; box-sizing: border-box; overflow: hidden; padding: env(safe-area-inset-top) env(safe-area-inset-right) var(--pi-app-safe-area-bottom) env(safe-area-inset-left); color: var(--pi-text); background: var(--pi-bg); font: 14px system-ui, sans-serif; }
2487
2488
  :host([pwa-display-mode]) { --pi-app-safe-area-bottom: env(safe-area-inset-bottom); }
@@ -2580,7 +2581,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
2580
2581
  button { border: 1px solid var(--pi-border); border-radius: 8px; background: var(--pi-surface); color: var(--pi-text); padding: 7px 9px; cursor: pointer; }
2581
2582
  .empty { margin: auto; color: var(--pi-muted); }
2582
2583
  .error { padding: 10px 16px; border-bottom: 1px solid var(--pi-border); color: var(--pi-danger); }
2583
- `,L0=900*1e3,j0=750,lr=[1e3,3e3,8e3,15e3,3e4],ra={capture:!0},_s="auto:on",oa="auto:off",hi="theme:",Ls=Jt("core:workspace.files"),js=Jt("core:workspace.git"),ui=Jt("core:workspace.terminal"),F0=320,U0=2,z0="(min-width: 1181px)";let re=class extends A{constructor(){super(...arguments),this.state=Gp(),this.sessions=new qu(()=>this.state,e=>{this.setState(e)},()=>{this.updateUrl()},new Fu),this.activity=new Jp(()=>this.state,e=>{this.setState(e)}),this.auth=new Xp(()=>this.state,e=>{this.setState(e)},e=>{this.sessions.applySessionStatus(e)}),this.workspaces=new rf(()=>this.state,e=>{this.setState(e)},()=>{this.updateUrl()},this.sessions,new tf),this.projects=new hh(()=>this.state,e=>{this.setState(e)},this.workspaces),this.machines=new ph(()=>this.state,e=>{this.setState(e)},()=>{this.updateUrl()},this.projects),this.files=new nh(()=>this.state,e=>{this.setState(e)},()=>{this.updateUrl()}),this.git=new dh(()=>this.state,e=>{this.setState(e)},()=>{this.updateUrl()}),this.keyboard=new vf,this.realtime=new Bo,this.machineActivitySockets=new Map,this.activeTerminalIds=new Set,this.machineNavigation=new lf,this.terminalSelection=new gf,this.appShell=new mm(this),this.panelCollapse=new Am(this),this.panelResize=new Mm(this),this.navigationSections=new Cm(this,()=>this.state,()=>this.appShell.isMobileNavigationLayout),this.systemLightThemeMedia=typeof window<"u"&&"matchMedia"in window?window.matchMedia("(prefers-color-scheme: light)"):void 0,this.refreshingWorkspaceDeletionRuns=!1,this.handledWorkspaceDeletionRunIds=new Set,this.terminalCommandRunRuntimes=new Map,this.machineNavigationRestoreSeq=0,this.navigationSelectionSeq=0,this.routeRestoreSeq=0,this.routeRestoreDepth=0,this.remoteRouteRestoreAttempt=0,this.remoteRouteRestoreInProgress=!1,this.plugins=B0(),this.loadedMachinePluginIds=new Set,this.machinePluginLoadPromises=new Map,this.themePreference=_f()??Df,this.activeThemeId=Er,this.isRefreshingApp=!1,this.settingsSection=Sn(),this.shortcutConfig={},this.workspaceUploadDefaultFolder=Co(void 0),this.onPopState=()=>{this.withChatScrollTransition(async()=>{this.restoreSettingsRoute(),await this.restoreRoute(!1)})},this.onPageShow=()=>{this.appShell.repairViewportPosition(),this.retryPendingRemoteRouteRestoreSoon()},this.onFocus=()=>{this.appShell.repairViewportPosition(),this.sessions.refreshSelectedSession(),this.schedulePiWebStatusRefresh(),this.refreshMachineActivities(),this.refreshWorkspaceDeletionRuns(),this.retryPendingRemoteRouteRestoreSoon()},this.onVisibilityChange=()=>{document.visibilityState==="visible"&&(this.appShell.repairViewportPosition(),this.sessions.refreshSelectedSession(),this.schedulePiWebStatusRefresh(),this.refreshMachineActivities(),this.refreshWorkspaceDeletionRuns(),this.retryPendingRemoteRouteRestoreSoon())},this.onSystemLightThemeChange=()=>{this.themePreference.auto&&this.applyPreferredTheme(!1)},this.previousStackedWorkspaceLayout=this.appShell.isStackedWorkspaceLayout,this.onKeyDown=e=>{this.settingsSection===void 0&&this.keyboard.handle(e,this.getDefaultActions(),{shortcuts:this.shortcutConfig})&&(e.preventDefault(),e.stopPropagation())},this.handleSendPrompt=(e,t,i,s)=>{this.sendPrompt(e,t,i,s)},this.handleStopActiveWork=()=>{this.sessions.stopActiveWork()},this.handleSelectModel=()=>{this.openModelDialog()},this.handleSelectThinking=()=>{this.openThinkingDialog()}}get routeRestoreInProgress(){return this.routeRestoreDepth>0}willUpdate(){this.toggleAttribute("pwa-display-mode",this.appShell.isPwaDisplayMode),this.normalizeMainViewForLayoutChange()}connectedCallback(){super.connectedCallback(),window.addEventListener("popstate",this.onPopState),window.addEventListener("pageshow",this.onPageShow),window.addEventListener("focus",this.onFocus),document.addEventListener("visibilitychange",this.onVisibilityChange),window.addEventListener("keydown",this.onKeyDown,ra),this.systemLightThemeMedia?.addEventListener("change",this.onSystemLightThemeChange),this.applyPreferredTheme(!1),this.connectRealtime(),this.piWebStatusTimer=window.setInterval(()=>{this.schedulePiWebStatusRefresh()},L0),this.refreshWorkspaceActivity(),this.loadClientConfig(),this.ensureGatewayPluginsLoaded(),this.loadProjectsAndRestoreRoute().finally(()=>{this.schedulePiWebStatusRefresh()})}disconnectedCallback(){window.removeEventListener("popstate",this.onPopState),window.removeEventListener("pageshow",this.onPageShow),window.removeEventListener("focus",this.onFocus),document.removeEventListener("visibilitychange",this.onVisibilityChange),window.removeEventListener("keydown",this.onKeyDown,ra),this.systemLightThemeMedia?.removeEventListener("change",this.onSystemLightThemeChange),this.keyboard.reset(),this.auth.dispose(),this.sessions.dispose(),this.realtime.close(),this.closeMachineActivitySockets(),this.git.dispose(),this.piWebStatusTimer!==void 0&&window.clearInterval(this.piWebStatusTimer),this.piWebStatusTimer=void 0,this.clearScheduledPiWebStatusRefresh(),this.workspaceDeletionPollTimer!==void 0&&window.clearInterval(this.workspaceDeletionPollTimer),this.workspaceDeletionPollTimer=void 0,this.clearPendingRemoteRouteRestore(),super.disconnectedCallback()}setState(e){if(!q0(this.state,e))return;const t=this.state;this.state={...this.state,...e},this.handleActivityTransition(t,this.state),this.handleWorkspaceChange(t,this.state),this.handleMachineChange(t,this.state),N0(t,this.state)&&this.syncMachineActivitySubscriptions()}async loadProjectsAndRestoreRoute(){this.restoreSettingsRoute();const e=xn();await this.machines.loadMachines(e.machineId);const t=this.routeForSelectedMachine(e),i=this.state.machineStatuses[t.machineId??"local"];t!==e&&this.replaceRouteAndClearWorkspaceQuery(t),await this.projects.loadProjects(),await this.withChatScrollTransition(()=>this.restoreRouteFor(t,!1)),this.shouldDeferRemoteRouteRestore(t,i)?this.deferRemoteRouteRestore(t):(this.clearPendingRemoteRouteRestore(),this.rememberCurrentMachineNavigation()),await this.refreshWorkspaceDeletionRuns()}schedulePiWebStatusRefresh(e=j0){this.clearScheduledPiWebStatusRefresh(),this.piWebStatusDeferredTimer=window.setTimeout(()=>{this.piWebStatusDeferredTimer=void 0,this.refreshPiWebStatus()},e)}clearScheduledPiWebStatusRefresh(){this.piWebStatusDeferredTimer!==void 0&&(window.clearTimeout(this.piWebStatusDeferredTimer),this.piWebStatusDeferredTimer=void 0)}async refreshPiWebStatus(){const e=f(this.state);try{const t=await Ta.piWebStatus(e);f(this.state)===e&&this.setState({piWebStatus:t})}catch(t){f(this.state)===e&&this.setState({piWebStatus:void 0}),console.warn(`Failed to refresh PI WEB status for ${e}`,t)}}async refreshWorkspaceActivity(e=f(this.state)){try{await this.activity.refresh(e)}catch(t){console.warn(`Failed to refresh workspace activity for ${e}`,t)}}async refreshMachineActivities(){const e=this.state.machines.length===0?[f(this.state)]:this.state.machines.filter(t=>Zl(t,this.state.machineStatuses[t.id])).map(t=>t.id);await Promise.all(e.map(t=>this.refreshWorkspaceActivity(t)))}async loadClientConfig(){try{this.applyClientConfig((await Ii.config()).effectiveConfig)}catch(e){console.warn("Failed to load PI WEB config",e)}}applyClientConfig(e){this.shortcutConfig=e.shortcuts??{},this.workspaceUploadDefaultFolder=Co(e)}async refreshAppData(){if(!this.isRefreshingApp){this.isRefreshingApp=!0;try{await Promise.all([this.sessions.refreshSelectedSession(),this.refreshMachineActivities(),this.loadClientConfig(),this.refreshWorkspaceDeletionRuns(),this.refreshCurrentWorkspaceSurface()]),this.schedulePiWebStatusRefresh()}finally{this.isRefreshingApp=!1}}}async refreshCurrentWorkspaceSurface(){const e=this.state.selectedWorkspace,t=this.state.mainView!=="chat"&&this.state.mainView!=="navigation"?this.state.mainView:this.state.workspaceTool;t==="core:workspace.files"?await this.files.refreshFiles():t==="core:workspace.git"?await this.git.refreshGit():t==="core:workspace.terminal"&&e!==void 0&&await this.refreshActiveTerminals(e)}hardReloadApp(){window.location.reload()}async restoreRoute(e){await this.restoreRouteFor(xn(),e),this.rememberCurrentMachineNavigation()}async restoreRouteFor(e,t,i=this.readWorkspaceRouteSurface(e),s){const r=f(this.state),o=e.projectId===void 0||e.projectId===""?la():i,n=++this.routeRestoreSeq;this.routeRestoreDepth+=1,this.restoringRouteTerminalId=o.selectedTerminalId;try{await this.restoreRouteMachine(e,!1);const a=this.loadPluginsForSelectedMachine();if(e.tool?.startsWith("machine.")===!0&&await a,!this.isCurrentRouteRestore(n))return;if(this.setState({workspaceTool:e.tool??this.state.workspaceTool,mainView:this.appShell.normalizedMainView(s??e.view,e.sessionId!==void 0),selectedFilePath:o.selectedFilePath,selectedDiffPath:o.selectedDiffPath,selectedTerminalId:o.selectedTerminalId}),e.projectId===void 0||e.projectId===""){t&&this.updateUrl();return}if(this.routeMatchesCurrentSelection(e)){o.selectedTerminalId!==void 0&&this.rememberSelectedTerminal(o.selectedTerminalId),await this.refreshRestoredWorkspaceTool(e.tool,o.selectedFilePath),this.git.updatePolling(),t&&this.updateUrl();return}const c=this.state.projects.find(p=>p.id===e.projectId);if(!c){this.setState({selectedFilePath:void 0,selectedDiffPath:void 0,selectedTerminalId:void 0}),t&&this.updateUrl();return}if(await this.workspaces.selectProject(c,{workspaceId:e.workspaceId,sessionId:e.sessionId,updateUrl:!1}),!this.isCurrentRouteRestore(n))return;this.setState({selectedFilePath:o.selectedFilePath,selectedDiffPath:o.selectedDiffPath,selectedTerminalId:o.selectedTerminalId}),o.selectedTerminalId!==void 0&&this.rememberSelectedTerminal(o.selectedTerminalId),await this.refreshRestoredWorkspaceTool(e.tool,o.selectedFilePath),this.git.updatePolling(),t&&this.updateUrl()}finally{this.routeRestoreDepth=Math.max(0,this.routeRestoreDepth-1),this.routeRestoreDepth===0&&(this.restoringRouteTerminalId=void 0),f(this.state)!==r&&this.schedulePiWebStatusRefresh()}}isCurrentRouteRestore(e){return e===this.routeRestoreSeq}readWorkspaceRouteSurface(e){return e.projectId===void 0||e.projectId===""?la():{selectedFilePath:ms(Ls,"file"),selectedDiffPath:ms(js,"diff"),selectedTerminalId:ms(ui,"terminal")}}routeForSelectedMachine(e){const t=this.state.selectedMachine?.id??"local";return(e.machineId??"local")===t?e:{machineId:t,projectId:void 0,workspaceId:void 0,sessionId:void 0,tool:void 0,view:void 0}}replaceRouteAndClearWorkspaceQuery(e){ks(e,{replace:!0}),he(Ls,"file",void 0,{replace:!0}),he(js,"diff",void 0,{replace:!0}),he(ui,"terminal",void 0,{replace:!0})}shouldDeferRemoteRouteRestore(e,t=this.state.machineStatuses[e.machineId??"local"]){const i=e.machineId??"local",s=this.state.selectedMachine;return i==="local"||s?.id!==i||s.kind!=="remote"||t?.ok!==!1?!1:e.projectId===void 0||e.projectId===""?this.state.projects.length===0:this.state.selectedProject?.id!==e.projectId}deferRemoteRouteRestore(e){this.pendingRemoteRouteRestore=e,this.remoteRouteRestoreAttempt=0,this.setRemoteRouteRestoreMessage(e),this.schedulePendingRemoteRouteRestore()}retryPendingRemoteRouteRestoreSoon(){this.pendingRemoteRouteRestore!==void 0&&this.schedulePendingRemoteRouteRestore(0)}schedulePendingRemoteRouteRestore(e=V0(this.remoteRouteRestoreAttempt)){this.pendingRemoteRouteRestore!==void 0&&(this.clearPendingRemoteRouteRestoreTimer(),this.remoteRouteRestoreTimer=window.setTimeout(()=>{this.remoteRouteRestoreTimer=void 0,this.retryPendingRemoteRouteRestore()},e))}async retryPendingRemoteRouteRestore(){if(this.remoteRouteRestoreInProgress)return;const e=this.pendingRemoteRouteRestore;if(e!==void 0){if(!this.pendingRemoteRouteRestoreStillCurrent(e)){this.clearPendingRemoteRouteRestore();return}this.remoteRouteRestoreInProgress=!0;try{const t=e.machineId??"local",i=await this.machines.refreshMachineHealth(t);if(!this.pendingRemoteRouteRestoreStillCurrent(e))return;if(i?.ok!==!0){this.scheduleNextRemoteRouteRestoreAttempt(e);return}if(await this.machines.refreshMachineRuntime(t),!this.pendingRemoteRouteRestoreStillCurrent(e)||(await this.projects.loadProjects(),!this.pendingRemoteRouteRestoreStillCurrent(e)))return;if(this.state.error!==""){this.scheduleNextRemoteRouteRestoreAttempt(e);return}if(await this.withChatScrollTransition(()=>this.restoreRouteFor(e,!1)),!this.pendingRemoteRouteRestoreStillCurrent(e))return;this.clearPendingRemoteRouteRestore(),this.rememberCurrentMachineNavigation(),await this.refreshWorkspaceDeletionRuns()}finally{this.remoteRouteRestoreInProgress=!1}}}scheduleNextRemoteRouteRestoreAttempt(e){if(this.remoteRouteRestoreAttempt+=1,this.remoteRouteRestoreAttempt>=lr.length){this.setRemoteRouteRestoreMessage(e,{exhausted:!0}),this.clearPendingRemoteRouteRestore();return}this.setRemoteRouteRestoreMessage(e),this.schedulePendingRemoteRouteRestore()}setRemoteRouteRestoreMessage(e,t={}){const i=e.machineId??"local",s=this.state.machines.find(a=>a.id===i)?.name??this.state.selectedMachine?.name??"Remote machine",o=this.state.machineStatuses[i]?.error??(this.state.error===""?void 0:this.state.error),n=t.exhausted===!0?`${s} is still unavailable.`:`${s} is unavailable; reconnecting…`;this.setState({error:`${n}${o===void 0?"":` ${o}`}`})}pendingRemoteRouteRestoreStillCurrent(e){const t=e.machineId??"local";return t!=="local"&&this.pendingRemoteRouteRestore===e&&this.state.selectedMachine?.id===t&&this.state.machines.some(i=>i.id===t)}clearPendingRemoteRouteRestore(){this.clearPendingRemoteRouteRestoreTimer(),this.pendingRemoteRouteRestore=void 0,this.remoteRouteRestoreAttempt=0}clearPendingRemoteRouteRestoreTimer(){this.remoteRouteRestoreTimer!==void 0&&(window.clearTimeout(this.remoteRouteRestoreTimer),this.remoteRouteRestoreTimer=void 0)}async restoreRouteMachine(e,t){const i=e.machineId??"local";if(this.state.selectedMachine?.id===i)return;const s=this.state.machines.find(r=>r.id===i);s!==void 0&&await this.machines.selectMachine(s,{updateUrl:t})}routeMatchesCurrentSelection(e){return(e.machineId??"local")===(this.state.selectedMachine?.id??"local")&&e.workspaceId!==void 0&&e.workspaceId!==""&&this.state.selectedProject?.id===e.projectId&&this.state.selectedWorkspace?.id===e.workspaceId&&this.state.selectedSession?.id===e.sessionId}async refreshRestoredWorkspaceTool(e,t){e==="core:workspace.files"&&await this.files.refreshFiles(),e==="core:workspace.files"&&t!==void 0&&await this.files.restoreFile(t),e==="core:workspace.git"&&await this.git.refreshGit()}async withChatScrollTransition(e,t=()=>!0){this.chatView?.saveScrollPosition(),await e(),t()&&(await this.updateComplete,t()&&(await this.chatView?.updateComplete,t()&&(await Us(),t()&&(this.chatView?.restoreScrollPosition(),this.shouldAutoFocusPrompt()&&this.promptEditor?.focusInput()))))}shouldAutoFocusPrompt(){return this.appShell.shouldAutoFocusPrompt()}async withChatPrependTransition(e){await e(),await this.updateComplete,await this.chatView?.updateComplete}defaultRouteView(){return this.appShell.defaultRouteView()}normalizeMainViewForLayoutChange(){const e=this.previousStackedWorkspaceLayout,t=this.appShell.isStackedWorkspaceLayout;if(this.previousStackedWorkspaceLayout=t,e||!t)return;const i=this.appShell.normalizedMainView(this.state.mainView,this.state.selectedSession!==void 0);i!==this.state.mainView&&(this.setState({mainView:i}),this.updateUrl({replace:!0}))}updateUrl(e){this.rememberCurrentMachineNavigation(),ks({machineId:this.state.selectedMachine?.id,projectId:this.state.selectedProject?.id,workspaceId:this.state.selectedWorkspace?.id,sessionId:this.state.selectedSession?.id,tool:this.state.workspaceTool,view:this.state.mainView==="navigation"?void 0:this.state.mainView},e),this.syncWorkspaceRouteSurfaceToUrl()}rememberCurrentMachineNavigation(){this.machineNavigation.remember(Qo(this.state))}syncWorkspaceRouteSurfaceToUrl(){this.writeWorkspaceRouteSurfaceToUrl(Qo(this.state).surface)}writeMachineNavigationSnapshotToUrl(e,t){ks(Zo(e),t),this.writeWorkspaceRouteSurfaceToUrl(e.surface)}writeWorkspaceRouteSurfaceToUrl(e){he(Ls,"file",e.selectedFilePath,{replace:!0}),he(js,"diff",e.selectedDiffPath,{replace:!0}),he(ui,"terminal",e.selectedTerminalId,{replace:!0})}async selectMachineWithMemory(e,t={}){if(this.state.selectedMachine?.id===e.id)return;t.rememberCurrent!==!1&&!this.routeRestoreInProgress&&this.rememberCurrentMachineNavigation();const i=++this.machineNavigationRestoreSeq,s=this.machineNavigation.latest(e.id)??cf(e.id);if(await this.restoreRouteFor(Zo(s),!1,s.surface,s.view),!(i!==this.machineNavigationRestoreSeq||this.state.selectedMachine?.id!==e.id)){if(this.shouldPreserveUnrestoredMachineNavigation(s)){this.machineNavigation.remember(s),this.writeMachineNavigationSnapshotToUrl(s);return}this.updateUrl()}}shouldPreserveUnrestoredMachineNavigation(e){return e.projectId!==void 0&&this.state.selectedProject?.id!==e.projectId&&this.state.error!==""}openWorkspaceTool(e){e==="core:workspace.terminal"&&(this.terminalAutoStartWorkspaceId=this.state.selectedWorkspace?.id),this.setState({workspaceTool:e,mainView:e}),this.updateUrl(),this.refreshSelectedWorkspaceTool(e),this.git.updatePolling()}openTerminal(e){e?.terminalId!==void 0&&this.selectTerminal(e.terminalId,{replace:!0}),this.openWorkspaceTool("core:workspace.terminal")}terminalCommandRunsForOrigin(e,t=f(this.state)){const i=ca(t,e),s=this.terminalCommandRunRuntimes.get(i);if(s!==void 0)return s;const r=Gm(e,{api:{runTerminalCommand:(o,n)=>yt.runTerminalCommand(o,n,t),listCommandRuns:o=>yt.listCommandRuns(o,t),getCommandRun:o=>yt.getCommandRun(o,t)},openTerminal:(o,n)=>{this.openRuntimeTerminal(t,o,n)}});return this.terminalCommandRunRuntimes.set(i,r),r}async openRuntimeTerminal(e,t,i){if((f(this.state)!==e||t!==void 0&&(this.state.selectedWorkspace?.id!==t.id||this.state.selectedProject?.id!==t.projectId))&&(this.routeRestoreInProgress||this.rememberCurrentMachineNavigation(),await this.restoreRouteFor({machineId:e,projectId:t?.projectId,workspaceId:t?.id,sessionId:void 0,tool:"core:workspace.terminal",view:"core:workspace.terminal"},!1,{selectedTerminalId:i?.terminalId},"core:workspace.terminal"),f(this.state)!==e)){this.setState({error:"Machine not found for terminal command run"});return}this.openTerminal(i)}selectTerminal(e,t){this.rememberSelectedTerminal(e),this.setState({selectedTerminalId:e}),this.rememberCurrentMachineNavigation(),this.writeSelectedTerminalToUrl(e,t)}rememberSelectedTerminal(e){const t=this.state.selectedWorkspace;t!==void 0&&(e===void 0?this.terminalSelection.forgetWorkspace(this.terminalWorkspaceKey(t)):this.terminalSelection.rememberTerminal(this.terminalWorkspaceKey(t),e))}writeSelectedTerminalToUrl(e,t){he(ui,"terminal",e,t)}terminalWorkspaceKey(e){return`${f(this.state)}:${e.path}`}selectMainView(e){if(e!=="navigation"&&e!=="chat"){this.openWorkspaceTool(e);return}this.setState({mainView:e}),this.updateUrl(),this.git.updatePolling()}openSettings(e="general"){this.settingsSection=e,$s(e)}closeSettings(){this.settingsSection=void 0,$s(void 0)}navigateSettings(e){this.settingsSection=e,$s(e)}restoreSettingsRoute(){this.settingsSection=Sn()}handleWorkspaceChange(e,t){if(e.selectedWorkspace?.id===t.selectedWorkspace?.id)return;this.terminalAutoStartWorkspaceId=void 0,this.activeTerminalIds.clear();const i=this.routeRestoreInProgress?this.restoringRouteTerminalId:t.selectedWorkspace===void 0?void 0:this.terminalSelection.latestTerminalId(this.terminalWorkspaceKey(t.selectedWorkspace));this.setState({activeTerminalCount:0,selectedTerminalId:i}),this.routeRestoreInProgress||(this.rememberCurrentMachineNavigation(),this.writeSelectedTerminalToUrl(i,{replace:!0})),t.selectedWorkspace!==void 0&&(this.refreshActiveTerminals(t.selectedWorkspace),this.refreshWorkspaceDeletionRuns(),this.refreshSelectedWorkspaceTool(t.workspaceTool),this.git.updatePolling())}connectRealtime(){this.realtime.connect(e=>{this.handleRealtimeEvent(e)},()=>{const e=this.state.selectedWorkspace;e!==void 0&&this.refreshActiveTerminals(e),this.refreshWorkspaceActivity()},f(this.state))}syncMachineActivitySubscriptions(){const e=this.machineActivitySubscriptionIds();for(const[t,i]of this.machineActivitySockets.entries())e.has(t)||(i.close(),this.machineActivitySockets.delete(t));for(const t of e){if(this.machineActivitySockets.has(t))continue;const i=new Bo;i.connect(s=>{this.handleMachineActivityEvent(t,s)},()=>{this.refreshWorkspaceActivity(t)},t),this.machineActivitySockets.set(t,i)}}closeMachineActivitySockets(){for(const e of this.machineActivitySockets.values())e.close();this.machineActivitySockets.clear()}machineActivitySubscriptionIds(){const e=f(this.state);return new Set(this.state.machines.filter(t=>t.id!==e).filter(t=>H0(t,this.state.machineStatuses[t.id])).map(t=>t.id))}handleMachineActivityEvent(e,t){t.type==="workspace.activity"&&this.activity.applyWorkspaceActivity(t.activity,e)}handleRealtimeEvent(e){e.type==="workspace.activity"?this.activity.applyWorkspaceActivity(e.activity):K0(e)?(this.applyTerminalEvent(e),e.type==="terminal.exited"&&this.refreshWorkspaceDeletionRuns()):this.sessions.applyGlobalEvent(e)}applyTerminalEvent(e){const t=this.state.selectedWorkspace;t===void 0||(e.type==="terminal.closed"?e.cwd:e.terminal.cwd)!==t.path||(e.type==="terminal.created"&&!e.terminal.exited?this.activeTerminalIds.add(e.terminal.id):this.activeTerminalIds.delete(e.type==="terminal.closed"?e.terminalId:e.terminal.id),e.type==="terminal.closed"&&(this.terminalSelection.forgetTerminal(e.terminalId),this.state.selectedTerminalId===e.terminalId&&this.selectTerminal(void 0,{replace:!0})),this.setState({activeTerminalCount:this.activeTerminalIds.size}))}async refreshActiveTerminals(e){const t=f(this.state);try{const i=await yt.terminals(e.projectId,e.id,t);if(f(this.state)!==t||this.state.selectedWorkspace?.id!==e.id)return;this.activeTerminalIds.clear();for(const s of i)s.exited||this.activeTerminalIds.add(s.id);this.setState({activeTerminalCount:this.activeTerminalIds.size})}catch(i){this.setState({error:String(i)})}}handleActivityTransition(e,t){const i=aa(e),s=aa(t);i&&!s&&(this.setState({fileTreeStale:!0,gitStale:!0}),this.refreshSelectedWorkspaceTool(this.state.workspaceTool))}handleMachineChange(e,t){if((e.selectedMachine?.id??"local")===(t.selectedMachine?.id??"local"))return;(this.pendingRemoteRouteRestore?.machineId??"local")!==(t.selectedMachine?.id??"local")&&this.clearPendingRemoteRouteRestore(),this.sessions.clearActiveSession(),this.realtime.close(),this.connectRealtime(),this.activeTerminalIds.clear(),this.sessionCleanupDialog=void 0,this.setState({piWebStatus:void 0}),this.git.updatePolling(),this.loadPluginsForSelectedMachine()}refreshSelectedWorkspaceTool(e){e==="core:workspace.files"&&this.files.refreshFiles(),e==="core:workspace.git"&&this.git.refreshGit()}renderWorkspacePanel(){const e=this.state.selectedWorkspace,t=e===void 0?void 0:this.createWorkspacePanelContext(e),i=e===void 0?this.workspacePanelEmptyState():void 0;return l`
2584
+ `,j0=900*1e3,F0=750,lr=[1e3,3e3,8e3,15e3,3e4],ra={capture:!0},_s="auto:on",oa="auto:off",hi="theme:",Ls=Jt("core:workspace.files"),js=Jt("core:workspace.git"),ui=Jt("core:workspace.terminal"),U0=320,z0=2,B0="(min-width: 1181px)";let re=class extends A{constructor(){super(...arguments),this.state=Gp(),this.sessions=new qu(()=>this.state,e=>{this.setState(e)},()=>{this.updateUrl()},new Fu),this.activity=new Jp(()=>this.state,e=>{this.setState(e)}),this.auth=new Xp(()=>this.state,e=>{this.setState(e)},e=>{this.sessions.applySessionStatus(e)}),this.workspaces=new rf(()=>this.state,e=>{this.setState(e)},()=>{this.updateUrl()},this.sessions,new tf),this.projects=new hh(()=>this.state,e=>{this.setState(e)},this.workspaces),this.machines=new ph(()=>this.state,e=>{this.setState(e)},()=>{this.updateUrl()},this.projects),this.files=new nh(()=>this.state,e=>{this.setState(e)},()=>{this.updateUrl()}),this.git=new dh(()=>this.state,e=>{this.setState(e)},()=>{this.updateUrl()}),this.keyboard=new vf,this.realtime=new Bo,this.machineActivitySockets=new Map,this.activeTerminalIds=new Set,this.machineNavigation=new lf,this.terminalSelection=new gf,this.appShell=new vm(this),this.panelCollapse=new Tm(this),this.panelResize=new Em(this),this.navigationSections=new Im(this,()=>this.state,()=>this.appShell.isMobileNavigationLayout),this.systemLightThemeMedia=typeof window<"u"&&"matchMedia"in window?window.matchMedia("(prefers-color-scheme: light)"):void 0,this.refreshingWorkspaceDeletionRuns=!1,this.handledWorkspaceDeletionRunIds=new Set,this.terminalCommandRunRuntimes=new Map,this.machineNavigationRestoreSeq=0,this.navigationSelectionSeq=0,this.routeRestoreSeq=0,this.routeRestoreDepth=0,this.remoteRouteRestoreAttempt=0,this.remoteRouteRestoreInProgress=!1,this.plugins=N0(),this.loadedMachinePluginIds=new Set,this.machinePluginLoadPromises=new Map,this.themePreference=_f()??Df,this.activeThemeId=Er,this.isRefreshingApp=!1,this.settingsSection=Sn(),this.shortcutConfig={},this.workspaceUploadDefaultFolder=Co(void 0),this.onPopState=()=>{this.withChatScrollTransition(async()=>{this.restoreSettingsRoute(),await this.restoreRoute(!1)})},this.onPageShow=()=>{this.appShell.repairViewportPosition(),this.retryPendingRemoteRouteRestoreSoon()},this.onFocus=()=>{this.appShell.repairViewportPosition(),this.sessions.refreshSelectedSession(),this.schedulePiWebStatusRefresh(),this.refreshMachineActivities(),this.refreshWorkspaceDeletionRuns(),this.retryPendingRemoteRouteRestoreSoon()},this.onVisibilityChange=()=>{document.visibilityState==="visible"&&(this.appShell.repairViewportPosition(),this.sessions.refreshSelectedSession(),this.schedulePiWebStatusRefresh(),this.refreshMachineActivities(),this.refreshWorkspaceDeletionRuns(),this.retryPendingRemoteRouteRestoreSoon())},this.onSystemLightThemeChange=()=>{this.themePreference.auto&&this.applyPreferredTheme(!1)},this.previousStackedWorkspaceLayout=this.appShell.isStackedWorkspaceLayout,this.onKeyDown=e=>{this.settingsSection===void 0&&this.keyboard.handle(e,this.getDefaultActions(),{shortcuts:this.shortcutConfig})&&(e.preventDefault(),e.stopPropagation())},this.handleSendPrompt=(e,t,i,s)=>{this.sendPrompt(e,t,i,s)},this.handleStopActiveWork=()=>{this.sessions.stopActiveWork()},this.handleSelectModel=()=>{this.openModelDialog()},this.handleSelectThinking=()=>{this.openThinkingDialog()}}get routeRestoreInProgress(){return this.routeRestoreDepth>0}willUpdate(){this.toggleAttribute("pwa-display-mode",this.appShell.isPwaDisplayMode),this.normalizeMainViewForLayoutChange()}connectedCallback(){super.connectedCallback(),window.addEventListener("popstate",this.onPopState),window.addEventListener("pageshow",this.onPageShow),window.addEventListener("focus",this.onFocus),document.addEventListener("visibilitychange",this.onVisibilityChange),window.addEventListener("keydown",this.onKeyDown,ra),this.systemLightThemeMedia?.addEventListener("change",this.onSystemLightThemeChange),this.applyPreferredTheme(!1),this.connectRealtime(),this.piWebStatusTimer=window.setInterval(()=>{this.schedulePiWebStatusRefresh()},j0),this.refreshWorkspaceActivity(),this.loadClientConfig(),this.ensureGatewayPluginsLoaded(),this.loadProjectsAndRestoreRoute().finally(()=>{this.schedulePiWebStatusRefresh()})}disconnectedCallback(){window.removeEventListener("popstate",this.onPopState),window.removeEventListener("pageshow",this.onPageShow),window.removeEventListener("focus",this.onFocus),document.removeEventListener("visibilitychange",this.onVisibilityChange),window.removeEventListener("keydown",this.onKeyDown,ra),this.systemLightThemeMedia?.removeEventListener("change",this.onSystemLightThemeChange),this.keyboard.reset(),this.auth.dispose(),this.sessions.dispose(),this.realtime.close(),this.closeMachineActivitySockets(),this.git.dispose(),this.piWebStatusTimer!==void 0&&window.clearInterval(this.piWebStatusTimer),this.piWebStatusTimer=void 0,this.clearScheduledPiWebStatusRefresh(),this.workspaceDeletionPollTimer!==void 0&&window.clearInterval(this.workspaceDeletionPollTimer),this.workspaceDeletionPollTimer=void 0,this.clearPendingRemoteRouteRestore(),super.disconnectedCallback()}setState(e){if(!K0(this.state,e))return;const t=this.state;this.state={...this.state,...e},this.handleActivityTransition(t,this.state),this.handleWorkspaceChange(t,this.state),this.handleMachineChange(t,this.state),H0(t,this.state)&&this.syncMachineActivitySubscriptions()}async loadProjectsAndRestoreRoute(){this.restoreSettingsRoute();const e=xn();await this.machines.loadMachines(e.machineId);const t=this.routeForSelectedMachine(e),i=this.state.machineStatuses[t.machineId??"local"];t!==e&&this.replaceRouteAndClearWorkspaceQuery(t),await this.projects.loadProjects(),await this.withChatScrollTransition(()=>this.restoreRouteFor(t,!1)),this.shouldDeferRemoteRouteRestore(t,i)?this.deferRemoteRouteRestore(t):(this.clearPendingRemoteRouteRestore(),this.rememberCurrentMachineNavigation()),await this.refreshWorkspaceDeletionRuns()}schedulePiWebStatusRefresh(e=F0){this.clearScheduledPiWebStatusRefresh(),this.piWebStatusDeferredTimer=window.setTimeout(()=>{this.piWebStatusDeferredTimer=void 0,this.refreshPiWebStatus()},e)}clearScheduledPiWebStatusRefresh(){this.piWebStatusDeferredTimer!==void 0&&(window.clearTimeout(this.piWebStatusDeferredTimer),this.piWebStatusDeferredTimer=void 0)}async refreshPiWebStatus(){const e=f(this.state);try{const t=await Ta.piWebStatus(e);f(this.state)===e&&this.setState({piWebStatus:t})}catch(t){f(this.state)===e&&this.setState({piWebStatus:void 0}),console.warn(`Failed to refresh PI WEB status for ${e}`,t)}}async refreshWorkspaceActivity(e=f(this.state)){try{await this.activity.refresh(e)}catch(t){console.warn(`Failed to refresh workspace activity for ${e}`,t)}}async refreshMachineActivities(){const e=this.state.machines.length===0?[f(this.state)]:this.state.machines.filter(t=>Zl(t,this.state.machineStatuses[t.id])).map(t=>t.id);await Promise.all(e.map(t=>this.refreshWorkspaceActivity(t)))}async loadClientConfig(){try{this.applyClientConfig((await Ii.config()).effectiveConfig)}catch(e){console.warn("Failed to load PI WEB config",e)}}applyClientConfig(e){this.shortcutConfig=e.shortcuts??{},this.workspaceUploadDefaultFolder=Co(e)}async refreshAppData(){if(!this.isRefreshingApp){this.isRefreshingApp=!0;try{await Promise.all([this.sessions.refreshSelectedSession(),this.refreshMachineActivities(),this.loadClientConfig(),this.refreshWorkspaceDeletionRuns(),this.refreshCurrentWorkspaceSurface()]),this.schedulePiWebStatusRefresh()}finally{this.isRefreshingApp=!1}}}async refreshCurrentWorkspaceSurface(){const e=this.state.selectedWorkspace,t=this.state.mainView!=="chat"&&this.state.mainView!=="navigation"?this.state.mainView:this.state.workspaceTool;t==="core:workspace.files"?await this.files.refreshFiles():t==="core:workspace.git"?await this.git.refreshGit():t==="core:workspace.terminal"&&e!==void 0&&await this.refreshActiveTerminals(e)}hardReloadApp(){window.location.reload()}async restoreRoute(e){await this.restoreRouteFor(xn(),e),this.rememberCurrentMachineNavigation()}async restoreRouteFor(e,t,i=this.readWorkspaceRouteSurface(e),s){const r=f(this.state),o=e.projectId===void 0||e.projectId===""?la():i,n=++this.routeRestoreSeq;this.routeRestoreDepth+=1,this.restoringRouteTerminalId=o.selectedTerminalId;try{await this.restoreRouteMachine(e,!1);const a=this.loadPluginsForSelectedMachine();if(e.tool?.startsWith("machine.")===!0&&await a,!this.isCurrentRouteRestore(n))return;if(this.setState({workspaceTool:e.tool??this.state.workspaceTool,mainView:this.appShell.normalizedMainView(s??e.view,e.sessionId!==void 0),selectedFilePath:o.selectedFilePath,selectedDiffPath:o.selectedDiffPath,selectedTerminalId:o.selectedTerminalId}),e.projectId===void 0||e.projectId===""){t&&this.updateUrl();return}if(this.routeMatchesCurrentSelection(e)){o.selectedTerminalId!==void 0&&this.rememberSelectedTerminal(o.selectedTerminalId),await this.refreshRestoredWorkspaceTool(e.tool,o.selectedFilePath),this.git.updatePolling(),t&&this.updateUrl();return}const c=this.state.projects.find(p=>p.id===e.projectId);if(!c){this.setState({selectedFilePath:void 0,selectedDiffPath:void 0,selectedTerminalId:void 0}),t&&this.updateUrl();return}if(await this.workspaces.selectProject(c,{workspaceId:e.workspaceId,sessionId:e.sessionId,updateUrl:!1}),!this.isCurrentRouteRestore(n))return;this.setState({selectedFilePath:o.selectedFilePath,selectedDiffPath:o.selectedDiffPath,selectedTerminalId:o.selectedTerminalId}),o.selectedTerminalId!==void 0&&this.rememberSelectedTerminal(o.selectedTerminalId),await this.refreshRestoredWorkspaceTool(e.tool,o.selectedFilePath),this.git.updatePolling(),t&&this.updateUrl()}finally{this.routeRestoreDepth=Math.max(0,this.routeRestoreDepth-1),this.routeRestoreDepth===0&&(this.restoringRouteTerminalId=void 0),f(this.state)!==r&&this.schedulePiWebStatusRefresh()}}isCurrentRouteRestore(e){return e===this.routeRestoreSeq}readWorkspaceRouteSurface(e){return e.projectId===void 0||e.projectId===""?la():{selectedFilePath:ms(Ls,"file"),selectedDiffPath:ms(js,"diff"),selectedTerminalId:ms(ui,"terminal")}}routeForSelectedMachine(e){const t=this.state.selectedMachine?.id??"local";return(e.machineId??"local")===t?e:{machineId:t,projectId:void 0,workspaceId:void 0,sessionId:void 0,tool:void 0,view:void 0}}replaceRouteAndClearWorkspaceQuery(e){ks(e,{replace:!0}),he(Ls,"file",void 0,{replace:!0}),he(js,"diff",void 0,{replace:!0}),he(ui,"terminal",void 0,{replace:!0})}shouldDeferRemoteRouteRestore(e,t=this.state.machineStatuses[e.machineId??"local"]){const i=e.machineId??"local",s=this.state.selectedMachine;return i==="local"||s?.id!==i||s.kind!=="remote"||t?.ok!==!1?!1:e.projectId===void 0||e.projectId===""?this.state.projects.length===0:this.state.selectedProject?.id!==e.projectId}deferRemoteRouteRestore(e){this.pendingRemoteRouteRestore=e,this.remoteRouteRestoreAttempt=0,this.setRemoteRouteRestoreMessage(e),this.schedulePendingRemoteRouteRestore()}retryPendingRemoteRouteRestoreSoon(){this.pendingRemoteRouteRestore!==void 0&&this.schedulePendingRemoteRouteRestore(0)}schedulePendingRemoteRouteRestore(e=G0(this.remoteRouteRestoreAttempt)){this.pendingRemoteRouteRestore!==void 0&&(this.clearPendingRemoteRouteRestoreTimer(),this.remoteRouteRestoreTimer=window.setTimeout(()=>{this.remoteRouteRestoreTimer=void 0,this.retryPendingRemoteRouteRestore()},e))}async retryPendingRemoteRouteRestore(){if(this.remoteRouteRestoreInProgress)return;const e=this.pendingRemoteRouteRestore;if(e!==void 0){if(!this.pendingRemoteRouteRestoreStillCurrent(e)){this.clearPendingRemoteRouteRestore();return}this.remoteRouteRestoreInProgress=!0;try{const t=e.machineId??"local",i=await this.machines.refreshMachineHealth(t);if(!this.pendingRemoteRouteRestoreStillCurrent(e))return;if(i?.ok!==!0){this.scheduleNextRemoteRouteRestoreAttempt(e);return}if(await this.machines.refreshMachineRuntime(t),!this.pendingRemoteRouteRestoreStillCurrent(e)||(await this.projects.loadProjects(),!this.pendingRemoteRouteRestoreStillCurrent(e)))return;if(this.state.error!==""){this.scheduleNextRemoteRouteRestoreAttempt(e);return}if(await this.withChatScrollTransition(()=>this.restoreRouteFor(e,!1)),!this.pendingRemoteRouteRestoreStillCurrent(e))return;this.clearPendingRemoteRouteRestore(),this.rememberCurrentMachineNavigation(),await this.refreshWorkspaceDeletionRuns()}finally{this.remoteRouteRestoreInProgress=!1}}}scheduleNextRemoteRouteRestoreAttempt(e){if(this.remoteRouteRestoreAttempt+=1,this.remoteRouteRestoreAttempt>=lr.length){this.setRemoteRouteRestoreMessage(e,{exhausted:!0}),this.clearPendingRemoteRouteRestore();return}this.setRemoteRouteRestoreMessage(e),this.schedulePendingRemoteRouteRestore()}setRemoteRouteRestoreMessage(e,t={}){const i=e.machineId??"local",s=this.state.machines.find(a=>a.id===i)?.name??this.state.selectedMachine?.name??"Remote machine",o=this.state.machineStatuses[i]?.error??(this.state.error===""?void 0:this.state.error),n=t.exhausted===!0?`${s} is still unavailable.`:`${s} is unavailable; reconnecting…`;this.setState({error:`${n}${o===void 0?"":` ${o}`}`})}pendingRemoteRouteRestoreStillCurrent(e){const t=e.machineId??"local";return t!=="local"&&this.pendingRemoteRouteRestore===e&&this.state.selectedMachine?.id===t&&this.state.machines.some(i=>i.id===t)}clearPendingRemoteRouteRestore(){this.clearPendingRemoteRouteRestoreTimer(),this.pendingRemoteRouteRestore=void 0,this.remoteRouteRestoreAttempt=0}clearPendingRemoteRouteRestoreTimer(){this.remoteRouteRestoreTimer!==void 0&&(window.clearTimeout(this.remoteRouteRestoreTimer),this.remoteRouteRestoreTimer=void 0)}async restoreRouteMachine(e,t){const i=e.machineId??"local";if(this.state.selectedMachine?.id===i)return;const s=this.state.machines.find(r=>r.id===i);s!==void 0&&await this.machines.selectMachine(s,{updateUrl:t})}routeMatchesCurrentSelection(e){return(e.machineId??"local")===(this.state.selectedMachine?.id??"local")&&e.workspaceId!==void 0&&e.workspaceId!==""&&this.state.selectedProject?.id===e.projectId&&this.state.selectedWorkspace?.id===e.workspaceId&&this.state.selectedSession?.id===e.sessionId}async refreshRestoredWorkspaceTool(e,t){e==="core:workspace.files"&&await this.files.refreshFiles(),e==="core:workspace.files"&&t!==void 0&&await this.files.restoreFile(t),e==="core:workspace.git"&&await this.git.refreshGit()}async withChatScrollTransition(e,t=()=>!0){this.chatView?.saveScrollPosition(),await e(),t()&&(await this.updateComplete,t()&&(await this.chatView?.updateComplete,t()&&(await Us(),t()&&(this.chatView?.restoreScrollPosition(),this.shouldAutoFocusPrompt()&&this.promptEditor?.focusInput()))))}shouldAutoFocusPrompt(){return this.appShell.shouldAutoFocusPrompt()}async withChatPrependTransition(e){await e(),await this.updateComplete,await this.chatView?.updateComplete}defaultRouteView(){return this.appShell.defaultRouteView()}normalizeMainViewForLayoutChange(){const e=this.previousStackedWorkspaceLayout,t=this.appShell.isStackedWorkspaceLayout;if(this.previousStackedWorkspaceLayout=t,e||!t)return;const i=this.appShell.normalizedMainView(this.state.mainView,this.state.selectedSession!==void 0);i!==this.state.mainView&&(this.setState({mainView:i}),this.updateUrl({replace:!0}))}updateUrl(e){this.rememberCurrentMachineNavigation(),ks({machineId:this.state.selectedMachine?.id,projectId:this.state.selectedProject?.id,workspaceId:this.state.selectedWorkspace?.id,sessionId:this.state.selectedSession?.id,tool:this.state.workspaceTool,view:this.state.mainView==="navigation"?void 0:this.state.mainView},e),this.syncWorkspaceRouteSurfaceToUrl()}rememberCurrentMachineNavigation(){this.machineNavigation.remember(Qo(this.state))}syncWorkspaceRouteSurfaceToUrl(){this.writeWorkspaceRouteSurfaceToUrl(Qo(this.state).surface)}writeMachineNavigationSnapshotToUrl(e,t){ks(Zo(e),t),this.writeWorkspaceRouteSurfaceToUrl(e.surface)}writeWorkspaceRouteSurfaceToUrl(e){he(Ls,"file",e.selectedFilePath,{replace:!0}),he(js,"diff",e.selectedDiffPath,{replace:!0}),he(ui,"terminal",e.selectedTerminalId,{replace:!0})}async selectMachineWithMemory(e,t={}){if(this.state.selectedMachine?.id===e.id)return;t.rememberCurrent!==!1&&!this.routeRestoreInProgress&&this.rememberCurrentMachineNavigation();const i=++this.machineNavigationRestoreSeq,s=this.machineNavigation.latest(e.id)??cf(e.id);if(await this.restoreRouteFor(Zo(s),!1,s.surface,s.view),!(i!==this.machineNavigationRestoreSeq||this.state.selectedMachine?.id!==e.id)){if(this.shouldPreserveUnrestoredMachineNavigation(s)){this.machineNavigation.remember(s),this.writeMachineNavigationSnapshotToUrl(s);return}this.updateUrl()}}shouldPreserveUnrestoredMachineNavigation(e){return e.projectId!==void 0&&this.state.selectedProject?.id!==e.projectId&&this.state.error!==""}openWorkspaceTool(e){e==="core:workspace.terminal"&&(this.terminalAutoStartWorkspaceId=this.state.selectedWorkspace?.id),this.setState({workspaceTool:e,mainView:e}),this.updateUrl(),this.refreshSelectedWorkspaceTool(e),this.git.updatePolling()}openTerminal(e){e?.terminalId!==void 0&&this.selectTerminal(e.terminalId,{replace:!0}),this.openWorkspaceTool("core:workspace.terminal")}terminalCommandRunsForOrigin(e,t=f(this.state)){const i=ca(t,e),s=this.terminalCommandRunRuntimes.get(i);if(s!==void 0)return s;const r=Jm(e,{api:{runTerminalCommand:(o,n)=>yt.runTerminalCommand(o,n,t),listCommandRuns:o=>yt.listCommandRuns(o,t),getCommandRun:o=>yt.getCommandRun(o,t)},openTerminal:(o,n)=>{this.openRuntimeTerminal(t,o,n)}});return this.terminalCommandRunRuntimes.set(i,r),r}async openRuntimeTerminal(e,t,i){if((f(this.state)!==e||t!==void 0&&(this.state.selectedWorkspace?.id!==t.id||this.state.selectedProject?.id!==t.projectId))&&(this.routeRestoreInProgress||this.rememberCurrentMachineNavigation(),await this.restoreRouteFor({machineId:e,projectId:t?.projectId,workspaceId:t?.id,sessionId:void 0,tool:"core:workspace.terminal",view:"core:workspace.terminal"},!1,{selectedTerminalId:i?.terminalId},"core:workspace.terminal"),f(this.state)!==e)){this.setState({error:"Machine not found for terminal command run"});return}this.openTerminal(i)}selectTerminal(e,t){this.rememberSelectedTerminal(e),this.setState({selectedTerminalId:e}),this.rememberCurrentMachineNavigation(),this.writeSelectedTerminalToUrl(e,t)}rememberSelectedTerminal(e){const t=this.state.selectedWorkspace;t!==void 0&&(e===void 0?this.terminalSelection.forgetWorkspace(this.terminalWorkspaceKey(t)):this.terminalSelection.rememberTerminal(this.terminalWorkspaceKey(t),e))}writeSelectedTerminalToUrl(e,t){he(ui,"terminal",e,t)}terminalWorkspaceKey(e){return`${f(this.state)}:${e.path}`}selectMainView(e){if(e!=="navigation"&&e!=="chat"){this.openWorkspaceTool(e);return}this.setState({mainView:e}),this.updateUrl(),this.git.updatePolling()}openSettings(e="general"){this.settingsSection=e,$s(e)}closeSettings(){this.settingsSection=void 0,$s(void 0)}navigateSettings(e){this.settingsSection=e,$s(e)}restoreSettingsRoute(){this.settingsSection=Sn()}handleWorkspaceChange(e,t){if(e.selectedWorkspace?.id===t.selectedWorkspace?.id)return;this.terminalAutoStartWorkspaceId=void 0,this.activeTerminalIds.clear();const i=this.routeRestoreInProgress?this.restoringRouteTerminalId:t.selectedWorkspace===void 0?void 0:this.terminalSelection.latestTerminalId(this.terminalWorkspaceKey(t.selectedWorkspace));this.setState({activeTerminalCount:0,selectedTerminalId:i}),this.routeRestoreInProgress||(this.rememberCurrentMachineNavigation(),this.writeSelectedTerminalToUrl(i,{replace:!0})),t.selectedWorkspace!==void 0&&(this.refreshActiveTerminals(t.selectedWorkspace),this.refreshWorkspaceDeletionRuns(),this.refreshSelectedWorkspaceTool(t.workspaceTool),this.git.updatePolling())}connectRealtime(){this.realtime.connect(e=>{this.handleRealtimeEvent(e)},()=>{const e=this.state.selectedWorkspace;e!==void 0&&this.refreshActiveTerminals(e),this.refreshWorkspaceActivity()},f(this.state))}syncMachineActivitySubscriptions(){const e=this.machineActivitySubscriptionIds();for(const[t,i]of this.machineActivitySockets.entries())e.has(t)||(i.close(),this.machineActivitySockets.delete(t));for(const t of e){if(this.machineActivitySockets.has(t))continue;const i=new Bo;i.connect(s=>{this.handleMachineActivityEvent(t,s)},()=>{this.refreshWorkspaceActivity(t)},t),this.machineActivitySockets.set(t,i)}}closeMachineActivitySockets(){for(const e of this.machineActivitySockets.values())e.close();this.machineActivitySockets.clear()}machineActivitySubscriptionIds(){const e=f(this.state);return new Set(this.state.machines.filter(t=>t.id!==e).filter(t=>q0(t,this.state.machineStatuses[t.id])).map(t=>t.id))}handleMachineActivityEvent(e,t){t.type==="workspace.activity"&&this.activity.applyWorkspaceActivity(t.activity,e)}handleRealtimeEvent(e){e.type==="workspace.activity"?this.activity.applyWorkspaceActivity(e.activity):V0(e)?(this.applyTerminalEvent(e),e.type==="terminal.exited"&&this.refreshWorkspaceDeletionRuns()):this.sessions.applyGlobalEvent(e)}applyTerminalEvent(e){const t=this.state.selectedWorkspace;t===void 0||(e.type==="terminal.closed"?e.cwd:e.terminal.cwd)!==t.path||(e.type==="terminal.created"&&!e.terminal.exited?this.activeTerminalIds.add(e.terminal.id):this.activeTerminalIds.delete(e.type==="terminal.closed"?e.terminalId:e.terminal.id),e.type==="terminal.closed"&&(this.terminalSelection.forgetTerminal(e.terminalId),this.state.selectedTerminalId===e.terminalId&&this.selectTerminal(void 0,{replace:!0})),this.setState({activeTerminalCount:this.activeTerminalIds.size}))}async refreshActiveTerminals(e){const t=f(this.state);try{const i=await yt.terminals(e.projectId,e.id,t);if(f(this.state)!==t||this.state.selectedWorkspace?.id!==e.id)return;this.activeTerminalIds.clear();for(const s of i)s.exited||this.activeTerminalIds.add(s.id);this.setState({activeTerminalCount:this.activeTerminalIds.size})}catch(i){this.setState({error:String(i)})}}handleActivityTransition(e,t){const i=aa(e),s=aa(t);i&&!s&&(this.setState({fileTreeStale:!0,gitStale:!0}),this.refreshSelectedWorkspaceTool(this.state.workspaceTool))}handleMachineChange(e,t){if((e.selectedMachine?.id??"local")===(t.selectedMachine?.id??"local"))return;(this.pendingRemoteRouteRestore?.machineId??"local")!==(t.selectedMachine?.id??"local")&&this.clearPendingRemoteRouteRestore(),this.sessions.clearActiveSession(),this.realtime.close(),this.connectRealtime(),this.activeTerminalIds.clear(),this.sessionCleanupDialog=void 0,this.setState({piWebStatus:void 0}),this.git.updatePolling(),this.loadPluginsForSelectedMachine()}refreshSelectedWorkspaceTool(e){e==="core:workspace.files"&&this.files.refreshFiles(),e==="core:workspace.git"&&this.git.refreshGit()}renderWorkspacePanel(){const e=this.state.selectedWorkspace,t=e===void 0?void 0:this.createWorkspacePanelContext(e),i=e===void 0?this.workspacePanelEmptyState():void 0;return l`
2584
2585
  <workspace-panel
2585
2586
  id="workspace-panel"
2586
2587
  .workspace=${e}
@@ -2626,7 +2627,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
2626
2627
  .onResizeEnd=${()=>{this.panelResize.persistPanelSizes()}}
2627
2628
  .onReset=${()=>{this.resetResizablePanel("workspace")}}
2628
2629
  ></app-panel-edge-control>
2629
- `}startPanelResize(e){return e==="navigation"?this.panelCollapse.expandNavigationPanel():this.panelCollapse.expandWorkspacePanel(),this.measuredPanelWidth(e)??this.panelResize.panelWidth(e)}resizablePanelConstraints(e){const t=this.panelResize.constraints(e);return{...t,maxWidth:this.resizablePanelMaxWidth(e,t)}}resizablePanelMaxWidth(e,t){const i=this.getBoundingClientRect().width||(typeof window>"u"?0:window.innerWidth);if(i<=0)return t.maxWidth;const s=this.oppositeResizablePanelWidth(e),r=Math.floor(i-s-U0-F0);return Math.max(t.minWidth,Math.min(t.maxWidth,r))}oppositeResizablePanelWidth(e){const t=e==="navigation"?"workspace":"navigation";return this.isResizablePanelCollapsedOrStacked(t)?0:this.measuredPanelWidth(t)??this.panelResize.panelWidth(t)}isResizablePanelCollapsedOrStacked(e){return e==="navigation"?this.panelCollapse.navigationPanelCollapsed:this.panelCollapse.workspacePanelCollapsed||!this.isDesktopSideBySideLayout()}isDesktopSideBySideLayout(){return typeof window>"u"||!("matchMedia"in window)?!0:window.matchMedia(z0).matches}measuredPanelWidth(e){const i=(e==="navigation"?this.navigationPanelFrame:this.workspacePanelFrame)?.getBoundingClientRect().width;return i===void 0||i<=0?void 0:i}resetResizablePanel(e){this.panelResize.resetPanel(e)}resetResizablePanels(){this.panelResize.resetPanels()}canDeleteArchivedSessions(){const e=this.selectedMachineRuntime();return e?.ok===!0&&Be(e,Oe.sessionsDeleteArchived)}canReloadSessions(){const e=this.selectedMachineRuntime();return e?.ok===!0&&Be(e,Oe.sessionsReload)}canCleanupSessions(){const e=this.selectedMachineRuntime();return e?.ok===!0&&Be(e,Oe.sessionsCleanup)}supportsWorkspaceFileSuggestions(e=f(this.state)){if(e==="local")return!0;const t=this.state.machineRuntimes[e];return t?.ok===!0&&Be(t,Oe.workspaceFileSuggestions)}archivedDeleteUnavailableMessage(){return`请更新并重启 ${this.state.selectedMachine?.name??"此机器"} 上的 Pi-Web 后再删除已归档会话。`}sessionCleanupUnavailableMessage(){return Mf(this.state.selectedMachine?.name)}selectedMachineRuntime(){return this.state.machineRuntimes[f(this.state)]}openSessionCleanupDialog(){this.sessionCleanupDialog={error:""}}closeSessionCleanupDialog(){this.sessionCleanupDialog=void 0}async previewSessionCleanup(e){if(!this.canCleanupSessions()){this.sessionCleanupDialog={...this.sessionCleanupDialog??{},error:this.sessionCleanupUnavailableMessage(),preview:void 0,previewRequest:void 0,result:void 0,loading:!1};return}const t=f(this.state);this.sessionCleanupDialog={...this.sessionCleanupDialog??{},loading:!0,error:"",preview:void 0,previewRequest:void 0,result:void 0};try{const i=await Ks.cleanupPreview(e,t);if(f(this.state)!==t)return;this.sessionCleanupDialog={...this.sessionCleanupDialog,preview:i,previewRequest:e,result:void 0,loading:!1,error:""}}catch(i){f(this.state)===t&&(this.sessionCleanupDialog={...this.sessionCleanupDialog,loading:!1,error:`预览清理失败:${Fs(i)}`})}}async runSessionCleanup(e){const t=this.sessionCleanupDialog;if(t?.preview===void 0||$t(t.previewRequest)!==$t(e)){this.sessionCleanupDialog={...t??{},error:"运行清理前请先预览。"};return}if(!this.canCleanupSessions()){this.sessionCleanupDialog={...t,error:this.sessionCleanupUnavailableMessage(),running:!1};return}const i=f(this.state);this.sessionCleanupDialog={...t,running:!0,error:""};try{const s=await Ks.cleanup(e,i);if(f(this.state)!==i)return;this.sessionCleanupDialog={...this.sessionCleanupDialog,preview:s,previewRequest:e,result:s,running:!1,error:""},await this.sessions.applySessionCleanupResult(s,i)}catch(s){f(this.state)===i&&(this.sessionCleanupDialog={...this.sessionCleanupDialog,running:!1,error:`运行清理失败:${Fs(s)}`})}}renderNavigationPanel(){return l`
2630
+ `}startPanelResize(e){return e==="navigation"?this.panelCollapse.expandNavigationPanel():this.panelCollapse.expandWorkspacePanel(),this.measuredPanelWidth(e)??this.panelResize.panelWidth(e)}resizablePanelConstraints(e){const t=this.panelResize.constraints(e);return{...t,maxWidth:this.resizablePanelMaxWidth(e,t)}}resizablePanelMaxWidth(e,t){const i=this.getBoundingClientRect().width||(typeof window>"u"?0:window.innerWidth);if(i<=0)return t.maxWidth;const s=this.oppositeResizablePanelWidth(e),r=Math.floor(i-s-z0-U0);return Math.max(t.minWidth,Math.min(t.maxWidth,r))}oppositeResizablePanelWidth(e){const t=e==="navigation"?"workspace":"navigation";return this.isResizablePanelCollapsedOrStacked(t)?0:this.measuredPanelWidth(t)??this.panelResize.panelWidth(t)}isResizablePanelCollapsedOrStacked(e){return e==="navigation"?this.panelCollapse.navigationPanelCollapsed:this.panelCollapse.workspacePanelCollapsed||!this.isDesktopSideBySideLayout()}isDesktopSideBySideLayout(){return typeof window>"u"||!("matchMedia"in window)?!0:window.matchMedia(B0).matches}measuredPanelWidth(e){const i=(e==="navigation"?this.navigationPanelFrame:this.workspacePanelFrame)?.getBoundingClientRect().width;return i===void 0||i<=0?void 0:i}resetResizablePanel(e){this.panelResize.resetPanel(e)}resetResizablePanels(){this.panelResize.resetPanels()}canDeleteArchivedSessions(){const e=this.selectedMachineRuntime();return e?.ok===!0&&Be(e,Oe.sessionsDeleteArchived)}canReloadSessions(){const e=this.selectedMachineRuntime();return e?.ok===!0&&Be(e,Oe.sessionsReload)}canCleanupSessions(){const e=this.selectedMachineRuntime();return e?.ok===!0&&Be(e,Oe.sessionsCleanup)}supportsWorkspaceFileSuggestions(e=f(this.state)){if(e==="local")return!0;const t=this.state.machineRuntimes[e];return t?.ok===!0&&Be(t,Oe.workspaceFileSuggestions)}archivedDeleteUnavailableMessage(){return`请更新并重启 ${this.state.selectedMachine?.name??"此机器"} 上的 Pi-Web 后再删除已归档会话。`}sessionCleanupUnavailableMessage(){return Mf(this.state.selectedMachine?.name)}selectedMachineRuntime(){return this.state.machineRuntimes[f(this.state)]}openSessionCleanupDialog(){this.sessionCleanupDialog={error:""}}closeSessionCleanupDialog(){this.sessionCleanupDialog=void 0}async previewSessionCleanup(e){if(!this.canCleanupSessions()){this.sessionCleanupDialog={...this.sessionCleanupDialog??{},error:this.sessionCleanupUnavailableMessage(),preview:void 0,previewRequest:void 0,result:void 0,loading:!1};return}const t=f(this.state);this.sessionCleanupDialog={...this.sessionCleanupDialog??{},loading:!0,error:"",preview:void 0,previewRequest:void 0,result:void 0};try{const i=await Ks.cleanupPreview(e,t);if(f(this.state)!==t)return;this.sessionCleanupDialog={...this.sessionCleanupDialog,preview:i,previewRequest:e,result:void 0,loading:!1,error:""}}catch(i){f(this.state)===t&&(this.sessionCleanupDialog={...this.sessionCleanupDialog,loading:!1,error:`预览清理失败:${Fs(i)}`})}}async runSessionCleanup(e){const t=this.sessionCleanupDialog;if(t?.preview===void 0||$t(t.previewRequest)!==$t(e)){this.sessionCleanupDialog={...t??{},error:"运行清理前请先预览。"};return}if(!this.canCleanupSessions()){this.sessionCleanupDialog={...t,error:this.sessionCleanupUnavailableMessage(),running:!1};return}const i=f(this.state);this.sessionCleanupDialog={...t,running:!0,error:""};try{const s=await Ks.cleanup(e,i);if(f(this.state)!==i)return;this.sessionCleanupDialog={...this.sessionCleanupDialog,preview:s,previewRequest:e,result:s,running:!1,error:""},await this.sessions.applySessionCleanupResult(s,i)}catch(s){f(this.state)===i&&(this.sessionCleanupDialog={...this.sessionCleanupDialog,running:!1,error:`运行清理失败:${Fs(s)}`})}}renderNavigationPanel(){return l`
2630
2631
  <app-navigation-panel
2631
2632
  .machines=${this.state.machines}
2632
2633
  .selectedMachine=${this.state.selectedMachine}
@@ -2685,14 +2686,14 @@ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error
2685
2686
  .onFocusNavigationTarget=${e=>{this.focusNavigationTarget(e)}}
2686
2687
  .onCancelKeyboardNavigation=${()=>{this.focusChatComposer()}}
2687
2688
  ></app-navigation-panel>
2688
- `}openNavigationSection(e){this.navigationSections.open(e,()=>{this.selectMainView("navigation")})}async selectNavigationItem(e,t,i){const s=++this.navigationSelectionSeq,r=()=>s===this.navigationSelectionSeq;await this.withChatScrollTransition(async()=>{this.navigationSections.advanceAfterSelection(e),await i()},r),r()&&await this.focusNavigationTarget(t)}async focusNavigationTarget(e){if(e==="chat"){await this.focusChatComposer();return}await this.focusNavigationSection(e)}async focusNavigationSection(e){if(e==="machines"&&!qi(this.state.machines)){await this.focusNavigationSection("projects");return}this.panelCollapse.expandNavigationPanel(),this.appShell.isMobileNavigationLayout&&this.selectMainView("navigation"),this.navigationSections.expand(e),await this.updateComplete,await Us(),await this.navigationPanel?.focusSection(e)}async focusChatComposer(){this.state.mainView!=="chat"&&this.selectMainView("chat"),await this.updateComplete,await Us(),this.promptEditor?.focusInput()}visibleWorkspacePanels(){const e=this.state.selectedWorkspace;if(e===void 0)return[];const t=this.createWorkspacePanelContext(e);return this.plugins.getWorkspacePanels().filter(i=>i.visible?.(t)??!0)}workspacePanelEmptyState(){const e=this.state.selectedProject;return this.state.isLoadingProjects?{title:"正在加载项目…",body:"正在查找你已添加到 PI WEB 的项目。"}:e===void 0?this.state.projects.length===0?{title:"还没有项目",body:"使用“操作 → 添加项目”添加文件夹。选择工作区后,工作区工具会显示在这里。"}:{title:"选择项目",body:"从侧边栏选择一个项目,然后选择工作区来查看文件、Git 或终端。"}:this.state.isLoadingWorkspaces?{title:"正在加载工作区…",body:`正在为 ${e.name} 准备工作区工具。`}:this.state.workspaces.length===0?{title:"未找到工作区",body:`${e.name} 没有可用工作区。请尝试重新选择该项目,或重新添加它。`}:{title:"选择工作区",body:`选择 ${e.name} 中的工作区,以查看文件、Git 或终端。`}}sessionEmptyMessage(){return this.state.isLoadingProjects?"正在加载项目…":this.state.selectedWorkspace!==void 0?"选择或启动会话。":this.state.selectedProject!==void 0?"选择工作区以启动会话。":this.state.projects.length===0?"添加项目以启动会话。":"选择项目和工作区以开始会话。"}mobilePanelBadge(e){const t=this.state.selectedWorkspace;if(t!==void 0)return e.badge?.(this.createWorkspacePanelContext(t))}mobilePanelIcon(e){switch(e.id){case"core:workspace.files":return"files";case"core:workspace.git":return"git";case"core:workspace.terminal":return"terminal";default:return}}workspaceLabelItems(e){return this.plugins.getWorkspaceLabelItems(this.createWorkspaceLabelContext(e))}createWorkspaceLabelContext(e){const t=na(this.state);return{machine:t,workspace:e,state:this.state,files:this.createWorkspaceFiles(e,t.id),host:this.createWorkspaceHost()}}createWorkspaceFiles(e,t){return{readFile:i=>wt.workspaceFile(e.projectId,e.id,i,t),writeFile:async(i,s,r)=>{const o=await wt.writeWorkspaceFile(e.projectId,e.id,i,s,r,t);return this.files.refreshFiles(),o},deleteFile:async i=>{const s=await wt.deleteWorkspaceFile(e.projectId,e.id,i,t);return this.files.refreshFiles(),s},moveFile:async(i,s,r)=>{const o=await wt.moveWorkspaceFile(e.projectId,e.id,i,s,r,t);return this.files.refreshFiles(),o}}}createWorkspaceHost(){return{requestRender:()=>{this.requestUpdate()}}}createWorkspacePanelContext(e){const t=na(this.state),i=t.id,s=r=>{const o=this.terminalCommandRunsForOrigin(r,i);return sm({machine:t,workspace:e,state:this.state,files:this.createWorkspaceFiles(e,i),prompt:this.createPromptEditor(),terminal:{open:n=>{this.openRuntimeTerminal(i,e,n)},runCommand:n=>o.runCommand({...n,workspace:e})},openTerminal:n=>{this.openRuntimeTerminal(i,e,n)},host:this.createWorkspaceHost(),piWebUnstable:{terminalCommandRuns:o},fileTree:this.state.fileTree,expandedDirs:this.state.expandedDirs,selectedFilePath:this.state.selectedFilePath,selectedFileContent:this.state.selectedFileContent,fileTreeStale:this.state.fileTreeStale,gitStatus:this.state.gitStatus,selectedDiffPath:this.state.selectedDiffPath,selectedDiff:this.state.selectedDiff,selectedStagedDiff:this.state.selectedStagedDiff,gitStale:this.state.gitStale,activeTerminalCount:this.state.activeTerminalCount,selectedTerminalId:this.state.selectedTerminalId,terminalAutoStart:this.terminalAutoStartWorkspaceId===e.id,workspaceUploadDefaultFolder:Wp(e.effectiveConfig,this.workspaceUploadDefaultFolder),onRefreshFiles:()=>{this.files.refreshFiles()},onCreateFile:n=>{this.files.createFile(n)},onCreateDirectory:n=>{this.files.createDirectory(n)},onMoveSelectedPath:n=>{this.files.moveSelectedPath(n)},onDeleteSelectedPath:()=>{this.files.deleteSelectedPath()},onDownloadSelectedFile:()=>{this.files.downloadSelectedFile()},onExpandDir:n=>{this.files.expandDir(n)},onSelectDirectory:n=>{this.files.selectDirectory(n)},onSelectFile:n=>{this.files.selectFile(n)},onStartWorkspaceUpload:(n,a)=>this.files.startWorkspaceUpload(n,a),onCancelWorkspaceUpload:n=>{this.files.cancelWorkspaceUpload(n)},onClearWorkspaceUpload:n=>{this.files.clearWorkspaceUpload(n)},onRefreshGit:()=>{this.git.refreshGit()},onSelectDiff:n=>{this.git.selectDiff(n)},onSelectTerminal:(n,a)=>{this.selectTerminal(n,a)}},s)};return s("core")}getActions(){return Km(this.getDefaultActions(),this.shortcutConfig)}getDefaultActions(){return[...this.plugins.getActions(this.createPluginRuntimeContext()),...this.sessionActions(),...this.navigationFocusActions(),...this.panelLayoutActions()]}sessionActions(){return[{id:"app.sessions.cleanup",title:"清理会话",description:"预览并手动清理所选机器上的空闲或已归档会话",group:"Sessions",...this.canCleanupSessions()?{}:{enabled:!1,disabledReason:this.sessionCleanupUnavailableMessage()},run:()=>{this.openSessionCleanupDialog()}}]}panelLayoutActions(){return[{id:"app.layout.reset-navigation-panel-size",title:"重置导航面板宽度",description:"将导航面板恢复为默认宽度",group:"视图",run:()=>{this.resetResizablePanel("navigation")}},{id:"app.layout.reset-workspace-panel-size",title:"重置工作区面板宽度",description:"将工作区面板恢复为默认宽度",group:"视图",run:()=>{this.resetResizablePanel("workspace")}},{id:"app.layout.reset-panel-sizes",title:"重置面板宽度",description:"将所有侧边面板恢复为默认宽度",group:"视图",run:()=>{this.resetResizablePanels()}}]}navigationFocusActions(){return[{id:"app.navigation.focus-machines",title:"聚焦机器",description:"将键盘焦点移到机器选择器",shortcut:"mod+g m",group:"导航",run:()=>this.focusNavigationSection("machines")},{id:"app.navigation.focus-projects",title:"聚焦项目",description:"将键盘焦点移到项目列表",shortcut:"mod+g p",group:"导航",run:()=>this.focusNavigationSection("projects")},{id:"app.navigation.focus-workspaces",title:"聚焦工作区",description:"将键盘焦点移到工作区列表",shortcut:"mod+g w",group:"导航",run:()=>this.focusNavigationSection("workspaces")},{id:"app.navigation.focus-sessions",title:"聚焦会话",description:"将键盘焦点移到会话列表",shortcut:"mod+g s",group:"导航",run:()=>this.focusNavigationSection("sessions")}]}ensureGatewayPluginsLoaded(){return this.gatewayPluginLoadPromise??=this.loadExternalPlugins(),this.gatewayPluginLoadPromise}async loadExternalPlugins(){await this.registerExternalPlugins("PI WEB plugins",()=>vn())}async loadPluginsForSelectedMachine(){const e=this.state.selectedMachine;e?.kind==="remote"&&await this.loadPluginsForMachine(e)}async loadPluginsForMachine(e){if(await this.ensureGatewayPluginsLoaded(),e.kind!=="remote"||this.loadedMachinePluginIds.has(e.id))return;const t=this.machinePluginLoadPromises.get(e.id);if(t!==void 0)return t;const i=this.registerExternalPlugins(`PI WEB plugins from ${e.name}`,()=>vn(`/api/machines/${encodeURIComponent(e.id)}/pi-web-plugins/manifest.json`,{machineId:e.id,shouldLoadPlugin:s=>this.plugins.shouldLoadRemotePlugin(s.id,s.machineSpecific)})).then(s=>{s&&this.loadedMachinePluginIds.add(e.id)}).finally(()=>{this.machinePluginLoadPromises.delete(e.id)});this.machinePluginLoadPromises.set(e.id,i),await i}async registerExternalPlugins(e,t){try{const i=await t();for(const s of i)try{this.plugins.register(s)}catch(r){console.warn(`Failed to register PI WEB plugin ${s.id}`,r)}return this.applyPreferredTheme(!1),this.requestUpdate(),!0}catch(i){return console.warn(`Failed to load ${e}`,i),!1}}createPromptEditor(){return{insertText:e=>{const t=this.promptEditor?.view;if(!t)return;t.hasFocus||t.focus();const i=t.state.selection.main;t.dispatch({changes:{from:i.from,to:i.to,insert:e},selection:{anchor:i.from+e.length}})},getText:()=>this.promptEditor?.view?.state.doc.toString()??"",getSelection:()=>{const e=this.promptEditor?.view;if(!e)return null;const t=e.state.selection.main;return t.empty?null:{start:t.from,end:t.to,text:e.state.sliceDoc(t.from,t.to)}}}}createPluginRuntimeContext(){const e=t=>im({state:this.state,prompt:this.createPromptEditor(),piWebUnstable:{terminalCommandRuns:this.terminalCommandRunsForOrigin(t),openSettings:i=>{this.openSettings(i)}},openActionPalette:()=>{this.setState({actionPaletteOpen:!0})},focusPrompt:()=>{this.focusChatComposer()},addProject:()=>{this.setState({projectDialogOpen:!0})},addMachine:()=>{this.openMachineDialog()},refreshSelectedMachine:async()=>{await Promise.all([this.machines.refreshMachineHealth(),this.machines.refreshMachineRuntime()])},removeSelectedMachine:()=>this.removeMachine(),openSelectedMachine:()=>{this.openSelectedMachine()},configureAuth:()=>this.auth.openLogin(),logoutAuth:()=>this.auth.openLogout(),openThemePicker:()=>{this.openThemeDialog()},selectMainView:i=>{this.selectMainView(i)},selectWorkspaceTool:i=>{this.openWorkspaceTool(i)},openTerminal:i=>{this.openTerminal(i)},refreshFiles:()=>this.files.refreshFiles(),refreshGit:()=>this.git.refreshGit(),refreshAppData:()=>this.refreshAppData(),reloadPage:()=>{this.hardReloadApp()},deleteWorkspace:i=>this.deleteWorkspace(i),startSession:()=>this.withChatScrollTransition(()=>this.sessions.startSession()),archiveSession:()=>this.sessions.archiveSession(),reloadSession:()=>this.sessions.reloadSession(),deleteCachedNewSession:()=>this.sessions.deleteCachedNewSession(),stopActiveWork:()=>this.sessions.stopActiveWork()},e);return e("core")}async deleteWorkspace(e=this.state.selectedWorkspace){if(e===void 0)return;if(!of(e)){this.setState({error:"Only secondary Git worktrees can be deleted"});return}if(al(this.state,e))return;const t=e.branch??e.label;if(!confirm(`Delete workspace ${t}?
2689
+ `}openNavigationSection(e){this.navigationSections.open(e,()=>{this.selectMainView("navigation")})}async selectNavigationItem(e,t,i){const s=++this.navigationSelectionSeq,r=()=>s===this.navigationSelectionSeq;await this.withChatScrollTransition(async()=>{this.navigationSections.advanceAfterSelection(e),await i()},r),r()&&await this.focusNavigationTarget(t)}async focusNavigationTarget(e){if(e==="chat"){await this.focusChatComposer();return}await this.focusNavigationSection(e)}async focusNavigationSection(e){if(e==="machines"&&!qi(this.state.machines)){await this.focusNavigationSection("projects");return}this.panelCollapse.expandNavigationPanel(),this.appShell.isMobileNavigationLayout&&this.selectMainView("navigation"),this.navigationSections.expand(e),await this.updateComplete,await Us(),await this.navigationPanel?.focusSection(e)}async focusChatComposer(){this.state.mainView!=="chat"&&this.selectMainView("chat"),await this.updateComplete,await Us(),this.promptEditor?.focusInput()}visibleWorkspacePanels(){const e=this.state.selectedWorkspace;if(e===void 0)return[];const t=this.createWorkspacePanelContext(e);return this.plugins.getWorkspacePanels().filter(i=>i.visible?.(t)??!0)}workspacePanelEmptyState(){const e=this.state.selectedProject;return this.state.isLoadingProjects?{title:"正在加载项目…",body:"正在查找你已添加到 PI WEB 的项目。"}:e===void 0?this.state.projects.length===0?{title:"还没有项目",body:"使用“操作 → 添加项目”添加文件夹。选择工作区后,工作区工具会显示在这里。"}:{title:"选择项目",body:"从侧边栏选择一个项目,然后选择工作区来查看文件、Git 或终端。"}:this.state.isLoadingWorkspaces?{title:"正在加载工作区…",body:`正在为 ${e.name} 准备工作区工具。`}:this.state.workspaces.length===0?{title:"未找到工作区",body:`${e.name} 没有可用工作区。请尝试重新选择该项目,或重新添加它。`}:{title:"选择工作区",body:`选择 ${e.name} 中的工作区,以查看文件、Git 或终端。`}}sessionEmptyMessage(){return this.state.isLoadingProjects?"正在加载项目…":this.state.selectedWorkspace!==void 0?"选择或启动会话。":this.state.selectedProject!==void 0?"选择工作区以启动会话。":this.state.projects.length===0?"添加项目以启动会话。":"选择项目和工作区以开始会话。"}mobilePanelBadge(e){const t=this.state.selectedWorkspace;if(t!==void 0)return e.badge?.(this.createWorkspacePanelContext(t))}mobilePanelIcon(e){switch(e.id){case"core:workspace.files":return"files";case"core:workspace.git":return"git";case"core:workspace.terminal":return"terminal";default:return}}workspaceLabelItems(e){return this.plugins.getWorkspaceLabelItems(this.createWorkspaceLabelContext(e))}createWorkspaceLabelContext(e){const t=na(this.state);return{machine:t,workspace:e,state:this.state,files:this.createWorkspaceFiles(e,t.id),host:this.createWorkspaceHost()}}createWorkspaceFiles(e,t){return{readFile:i=>wt.workspaceFile(e.projectId,e.id,i,t),writeFile:async(i,s,r)=>{const o=await wt.writeWorkspaceFile(e.projectId,e.id,i,s,r,t);return this.files.refreshFiles(),o},deleteFile:async i=>{const s=await wt.deleteWorkspaceFile(e.projectId,e.id,i,t);return this.files.refreshFiles(),s},moveFile:async(i,s,r)=>{const o=await wt.moveWorkspaceFile(e.projectId,e.id,i,s,r,t);return this.files.refreshFiles(),o}}}createWorkspaceHost(){return{requestRender:()=>{this.requestUpdate()}}}createWorkspacePanelContext(e){const t=na(this.state),i=t.id,s=r=>{const o=this.terminalCommandRunsForOrigin(r,i);return rm({machine:t,workspace:e,state:this.state,files:this.createWorkspaceFiles(e,i),prompt:this.createPromptEditor(),terminal:{open:n=>{this.openRuntimeTerminal(i,e,n)},runCommand:n=>o.runCommand({...n,workspace:e})},openTerminal:n=>{this.openRuntimeTerminal(i,e,n)},host:this.createWorkspaceHost(),piWebUnstable:{terminalCommandRuns:o},fileTree:this.state.fileTree,expandedDirs:this.state.expandedDirs,selectedFilePath:this.state.selectedFilePath,selectedFileContent:this.state.selectedFileContent,fileTreeStale:this.state.fileTreeStale,gitStatus:this.state.gitStatus,selectedDiffPath:this.state.selectedDiffPath,selectedDiff:this.state.selectedDiff,selectedStagedDiff:this.state.selectedStagedDiff,gitStale:this.state.gitStale,activeTerminalCount:this.state.activeTerminalCount,selectedTerminalId:this.state.selectedTerminalId,terminalAutoStart:this.terminalAutoStartWorkspaceId===e.id,workspaceUploadDefaultFolder:Wp(e.effectiveConfig,this.workspaceUploadDefaultFolder),onRefreshFiles:()=>{this.files.refreshFiles()},onCreateFile:n=>{this.files.createFile(n)},onCreateDirectory:n=>{this.files.createDirectory(n)},onMoveSelectedPath:n=>{this.files.moveSelectedPath(n)},onDeleteSelectedPath:()=>{this.files.deleteSelectedPath()},onDownloadSelectedFile:()=>{this.files.downloadSelectedFile()},onExpandDir:n=>{this.files.expandDir(n)},onSelectDirectory:n=>{this.files.selectDirectory(n)},onSelectFile:n=>{this.files.selectFile(n)},onStartWorkspaceUpload:(n,a)=>this.files.startWorkspaceUpload(n,a),onCancelWorkspaceUpload:n=>{this.files.cancelWorkspaceUpload(n)},onClearWorkspaceUpload:n=>{this.files.clearWorkspaceUpload(n)},onRefreshGit:()=>{this.git.refreshGit()},onSelectDiff:n=>{this.git.selectDiff(n)},onSelectTerminal:(n,a)=>{this.selectTerminal(n,a)}},s)};return s("core")}getActions(){return Vm(this.getDefaultActions(),this.shortcutConfig)}getDefaultActions(){return[...this.plugins.getActions(this.createPluginRuntimeContext()),...this.sessionActions(),...this.navigationFocusActions(),...this.panelLayoutActions()]}sessionActions(){return[{id:"app.sessions.cleanup",title:"清理会话",description:"预览并手动清理所选机器上的空闲或已归档会话",group:"Sessions",...this.canCleanupSessions()?{}:{enabled:!1,disabledReason:this.sessionCleanupUnavailableMessage()},run:()=>{this.openSessionCleanupDialog()}}]}panelLayoutActions(){return[{id:"app.layout.reset-navigation-panel-size",title:"重置导航面板宽度",description:"将导航面板恢复为默认宽度",group:"视图",run:()=>{this.resetResizablePanel("navigation")}},{id:"app.layout.reset-workspace-panel-size",title:"重置工作区面板宽度",description:"将工作区面板恢复为默认宽度",group:"视图",run:()=>{this.resetResizablePanel("workspace")}},{id:"app.layout.reset-panel-sizes",title:"重置面板宽度",description:"将所有侧边面板恢复为默认宽度",group:"视图",run:()=>{this.resetResizablePanels()}}]}navigationFocusActions(){return[{id:"app.navigation.focus-machines",title:"聚焦机器",description:"将键盘焦点移到机器选择器",shortcut:"mod+g m",group:"导航",run:()=>this.focusNavigationSection("machines")},{id:"app.navigation.focus-projects",title:"聚焦项目",description:"将键盘焦点移到项目列表",shortcut:"mod+g p",group:"导航",run:()=>this.focusNavigationSection("projects")},{id:"app.navigation.focus-workspaces",title:"聚焦工作区",description:"将键盘焦点移到工作区列表",shortcut:"mod+g w",group:"导航",run:()=>this.focusNavigationSection("workspaces")},{id:"app.navigation.focus-sessions",title:"聚焦会话",description:"将键盘焦点移到会话列表",shortcut:"mod+g s",group:"导航",run:()=>this.focusNavigationSection("sessions")}]}ensureGatewayPluginsLoaded(){return this.gatewayPluginLoadPromise??=this.loadExternalPlugins(),this.gatewayPluginLoadPromise}async loadExternalPlugins(){await this.registerExternalPlugins("PI WEB plugins",()=>vn())}async loadPluginsForSelectedMachine(){const e=this.state.selectedMachine;e?.kind==="remote"&&await this.loadPluginsForMachine(e)}async loadPluginsForMachine(e){if(await this.ensureGatewayPluginsLoaded(),e.kind!=="remote"||this.loadedMachinePluginIds.has(e.id))return;const t=this.machinePluginLoadPromises.get(e.id);if(t!==void 0)return t;const i=this.registerExternalPlugins(`PI WEB plugins from ${e.name}`,()=>vn(`/api/machines/${encodeURIComponent(e.id)}/pi-web-plugins/manifest.json`,{machineId:e.id,shouldLoadPlugin:s=>this.plugins.shouldLoadRemotePlugin(s.id,s.machineSpecific)})).then(s=>{s&&this.loadedMachinePluginIds.add(e.id)}).finally(()=>{this.machinePluginLoadPromises.delete(e.id)});this.machinePluginLoadPromises.set(e.id,i),await i}async registerExternalPlugins(e,t){try{const i=await t();for(const s of i)try{this.plugins.register(s)}catch(r){console.warn(`Failed to register PI WEB plugin ${s.id}`,r)}return this.applyPreferredTheme(!1),this.requestUpdate(),!0}catch(i){return console.warn(`Failed to load ${e}`,i),!1}}createPromptEditor(){return{insertText:e=>{const t=this.promptEditor?.view;if(!t)return;t.hasFocus||t.focus();const i=t.state.selection.main;t.dispatch({changes:{from:i.from,to:i.to,insert:e},selection:{anchor:i.from+e.length}})},getText:()=>this.promptEditor?.view?.state.doc.toString()??"",getSelection:()=>{const e=this.promptEditor?.view;if(!e)return null;const t=e.state.selection.main;return t.empty?null:{start:t.from,end:t.to,text:e.state.sliceDoc(t.from,t.to)}}}}createPluginRuntimeContext(){const e=t=>sm({state:this.state,prompt:this.createPromptEditor(),piWebUnstable:{terminalCommandRuns:this.terminalCommandRunsForOrigin(t),openSettings:i=>{this.openSettings(i)}},openActionPalette:()=>{this.setState({actionPaletteOpen:!0})},focusPrompt:()=>{this.focusChatComposer()},addProject:()=>{this.setState({projectDialogOpen:!0})},addMachine:()=>{this.openMachineDialog()},refreshSelectedMachine:async()=>{await Promise.all([this.machines.refreshMachineHealth(),this.machines.refreshMachineRuntime()])},removeSelectedMachine:()=>this.removeMachine(),openSelectedMachine:()=>{this.openSelectedMachine()},configureAuth:()=>this.auth.openLogin(),logoutAuth:()=>this.auth.openLogout(),openThemePicker:()=>{this.openThemeDialog()},selectMainView:i=>{this.selectMainView(i)},selectWorkspaceTool:i=>{this.openWorkspaceTool(i)},openTerminal:i=>{this.openTerminal(i)},refreshFiles:()=>this.files.refreshFiles(),refreshGit:()=>this.git.refreshGit(),refreshAppData:()=>this.refreshAppData(),reloadPage:()=>{this.hardReloadApp()},deleteWorkspace:i=>this.deleteWorkspace(i),startSession:()=>this.withChatScrollTransition(()=>this.sessions.startSession()),archiveSession:()=>this.sessions.archiveSession(),reloadSession:()=>this.sessions.reloadSession(),deleteCachedNewSession:()=>this.sessions.deleteCachedNewSession(),stopActiveWork:()=>this.sessions.stopActiveWork()},e);return e("core")}async deleteWorkspace(e=this.state.selectedWorkspace){if(e===void 0)return;if(!of(e)){this.setState({error:"Only secondary Git worktrees can be deleted"});return}if(al(this.state,e))return;const t=e.branch??e.label;if(!confirm(`Delete workspace ${t}?
2689
2690
 
2690
2691
  This will run git worktree remove and delete:
2691
2692
  ${e.path}
2692
2693
 
2693
- The Git branch will not be deleted.`))return;const s=f(this.state);try{const r=await wt.deleteWorkspace(e.projectId,e.id,s);if(f(this.state)!==s)return;this.recordWorkspaceDeletionRun(r,s);const o=await this.workspaceForCommandRun(r);if(f(this.state)!==s)return;o!==void 0&&this.openRuntimeTerminal(s,o,{terminalId:r.terminalId})}catch(r){f(this.state)===s&&this.setState({error:`启动工作区删除失败:${Fs(r)}`})}}async workspaceForCommandRun(e){let t=this.state.selectedProject?.id===e.projectId?this.state.workspaces:this.state.workspacesByProjectId[e.projectId];return(t===void 0||t.length===0)&&(t=await this.workspaces.refreshProjectWorkspaces(e.projectId)),t.find(i=>i.id===e.workspaceId)}recordWorkspaceDeletionRun(e,t){if(f(this.state)!==t)return;const i=Xs(e);i!==void 0&&(this.setState({workspaceDeletionRuns:{...this.state.workspaceDeletionRuns,[i]:e}}),this.updateWorkspaceDeletionPolling())}async refreshWorkspaceDeletionRuns(){if(this.refreshingWorkspaceDeletionRuns)return;const e=f(this.state),t=this.state.selectedProject;if(t===void 0){this.setState({workspaceDeletionRuns:{}}),this.updateWorkspaceDeletionPolling();return}this.refreshingWorkspaceDeletionRuns=!0;try{const i=await this.terminalCommandRunsForOrigin("core",e).listCommandRuns(Xf(t.id));if(f(this.state)!==e)return;const s=Yf(i);this.setState({workspaceDeletionRuns:s});for(const r of Object.values(s))_i(r)||await this.handleCompletedWorkspaceDeletionRun(r,e)}catch(i){console.warn("Failed to refresh workspace deletion runs",i)}finally{this.refreshingWorkspaceDeletionRuns=!1,this.updateWorkspaceDeletionPolling()}}updateWorkspaceDeletionPolling(){const e=Object.values(this.state.workspaceDeletionRuns).some(_i);if(e&&this.workspaceDeletionPollTimer===void 0){this.workspaceDeletionPollTimer=window.setInterval(()=>{this.refreshWorkspaceDeletionRuns()},1e3);return}!e&&this.workspaceDeletionPollTimer!==void 0&&(window.clearInterval(this.workspaceDeletionPollTimer),this.workspaceDeletionPollTimer=void 0)}async handleCompletedWorkspaceDeletionRun(e,t=f(this.state)){if(f(this.state)!==t)return;const i=ca(t,e.id);if(this.handledWorkspaceDeletionRunIds.has(i))return;const s=Xs(e);if(s!==void 0){if(this.handledWorkspaceDeletionRunIds.add(i),e.status==="succeeded"){if(await this.workspaces.refreshAfterWorkspaceDeleted(e.projectId,s),f(this.state)!==t)return;this.setState({workspaceDeletionRuns:G0(this.state.workspaceDeletionRuns,s)}),this.updateWorkspaceDeletionPolling();return}e.status==="failed"&&(this.setState({error:"工作区删除失败。请查看终端输出。"}),this.updateWorkspaceDeletionPolling())}}openMachineDialog(){this.setState({machineDialogOpen:!0,error:""})}async submitMachineDialog(e){await this.machines.addMachine(e)!==void 0&&(this.setState({machineDialogOpen:!1}),this.schedulePiWebStatusRefresh())}async removeMachine(e=this.state.selectedMachine){if(e===void 0||e.kind==="local"||!window.confirm(`移除 ${e.name}?
2694
+ The Git branch will not be deleted.`))return;const s=f(this.state);try{const r=await wt.deleteWorkspace(e.projectId,e.id,s);if(f(this.state)!==s)return;this.recordWorkspaceDeletionRun(r,s);const o=await this.workspaceForCommandRun(r);if(f(this.state)!==s)return;o!==void 0&&this.openRuntimeTerminal(s,o,{terminalId:r.terminalId})}catch(r){f(this.state)===s&&this.setState({error:`启动工作区删除失败:${Fs(r)}`})}}async workspaceForCommandRun(e){let t=this.state.selectedProject?.id===e.projectId?this.state.workspaces:this.state.workspacesByProjectId[e.projectId];return(t===void 0||t.length===0)&&(t=await this.workspaces.refreshProjectWorkspaces(e.projectId)),t.find(i=>i.id===e.workspaceId)}recordWorkspaceDeletionRun(e,t){if(f(this.state)!==t)return;const i=Xs(e);i!==void 0&&(this.setState({workspaceDeletionRuns:{...this.state.workspaceDeletionRuns,[i]:e}}),this.updateWorkspaceDeletionPolling())}async refreshWorkspaceDeletionRuns(){if(this.refreshingWorkspaceDeletionRuns)return;const e=f(this.state),t=this.state.selectedProject;if(t===void 0){this.setState({workspaceDeletionRuns:{}}),this.updateWorkspaceDeletionPolling();return}this.refreshingWorkspaceDeletionRuns=!0;try{const i=await this.terminalCommandRunsForOrigin("core",e).listCommandRuns(Xf(t.id));if(f(this.state)!==e)return;const s=Yf(i);this.setState({workspaceDeletionRuns:s});for(const r of Object.values(s))_i(r)||await this.handleCompletedWorkspaceDeletionRun(r,e)}catch(i){console.warn("Failed to refresh workspace deletion runs",i)}finally{this.refreshingWorkspaceDeletionRuns=!1,this.updateWorkspaceDeletionPolling()}}updateWorkspaceDeletionPolling(){const e=Object.values(this.state.workspaceDeletionRuns).some(_i);if(e&&this.workspaceDeletionPollTimer===void 0){this.workspaceDeletionPollTimer=window.setInterval(()=>{this.refreshWorkspaceDeletionRuns()},1e3);return}!e&&this.workspaceDeletionPollTimer!==void 0&&(window.clearInterval(this.workspaceDeletionPollTimer),this.workspaceDeletionPollTimer=void 0)}async handleCompletedWorkspaceDeletionRun(e,t=f(this.state)){if(f(this.state)!==t)return;const i=ca(t,e.id);if(this.handledWorkspaceDeletionRunIds.has(i))return;const s=Xs(e);if(s!==void 0){if(this.handledWorkspaceDeletionRunIds.add(i),e.status==="succeeded"){if(await this.workspaces.refreshAfterWorkspaceDeleted(e.projectId,s),f(this.state)!==t)return;this.setState({workspaceDeletionRuns:J0(this.state.workspaceDeletionRuns,s)}),this.updateWorkspaceDeletionPolling();return}e.status==="failed"&&(this.setState({error:"工作区删除失败。请查看终端输出。"}),this.updateWorkspaceDeletionPolling())}}openMachineDialog(){this.setState({machineDialogOpen:!0,error:""})}async submitMachineDialog(e){await this.machines.addMachine(e)!==void 0&&(this.setState({machineDialogOpen:!1}),this.schedulePiWebStatusRefresh())}async removeMachine(e=this.state.selectedMachine){if(e===void 0||e.kind==="local"||!window.confirm(`移除 ${e.name}?
2694
2695
 
2695
- 这只会从当前 PI WEB 网关移除它。`))return;const t=this.state.selectedMachine?.id===e.id;t&&this.rememberCurrentMachineNavigation();const i=await this.machines.deleteMachine(e,{selectFallback:!t});this.state.machines.some(s=>s.id===e.id)||this.machineNavigation.forget(e.id),t&&i!==void 0&&await this.selectMachineWithMemory(i,{rememberCurrent:!1})}openSelectedMachine(){const e=this.state.selectedMachine;e?.kind!=="remote"||e.baseUrl===void 0||window.open(e.baseUrl,"_blank","noopener,noreferrer")}runAction(e){Promise.resolve().then(()=>e.run()).catch(t=>{const i=t instanceof Error?t.message:String(t);console.warn(`Action failed: ${e.id}`,t),this.setState({error:`操作失败:${i}`})})}async openModelDialog(){const e=await this.sessions.listModels(),t=this.state.status?.model?.provider,i=this.state.status?.model?.id;this.setState({modelDialog:{title:"选择模型",...t!==void 0&&i!==void 0?{selectedValue:`${t}/${i}`}:{},options:e.map(s=>{const r=s.provider??"",o=s.id??"",n=r===t&&o===i;return{value:`${r}/${o}`,label:`${o}${n?" ✓ 当前":""}`,description:r}})}})}async pickModel(e){this.setState({modelDialog:void 0});const t=e.indexOf("/");t<=0||await this.sessions.setModel(e.slice(0,t),e.slice(t+1))}openThemeDialog(){const e=this.plugins.getThemes(),t=this.resolveCurrentThemePreference(e),i=t.selectedTheme?.id,s=this.themePreference.auto?oa:_s;this.setState({themeDialog:{title:"选择主题",selectedValue:i===void 0?s:`${hi}${i}`,options:[{value:s,label:`自动 ${this.themePreference.auto?"✓ 开启":"关闭"}`,description:this.autoThemeDescription(t)},...e.map(r=>({value:`${hi}${r.id}`,label:this.themeOptionLabel(r,i),description:this.themeOptionDescription(r)}))]}})}pickTheme(e){if(this.setState({themeDialog:void 0}),e===_s||e===oa){const s=this.resolveCurrentThemePreference().selectedTheme?.id;if(s===void 0)return;this.themePreference={themeId:s,auto:e===_s},this.applyPreferredTheme(!0);return}if(!e.startsWith(hi))return;const t=e.slice(hi.length),i=this.plugins.getThemes().find(s=>s.id===t);i!==void 0&&(this.themePreference={themeId:i.id,auto:this.themePreference.auto},this.applyPreferredTheme(!0))}applyPreferredTheme(e){const t=this.resolveCurrentThemePreference().activeTheme;t!==void 0&&(this.activeThemeId=t.id,jf(t),e&&Lf(this.themePreference))}resolveCurrentThemePreference(e=this.plugins.getThemes()){return Ff({themes:e,themePairs:this.plugins.getThemePairs(),preference:this.themePreference,prefersLight:this.systemPrefersLight()})}themePairForTheme(e){return nl(this.plugins.getThemePairs(),e)}systemPrefersLight(){return this.systemLightThemeMedia?.matches??!1}autoThemeDescription(e){return!this.themePreference.auto||e.selectedTheme===void 0?"当所选主题有配对主题时,跟随系统明暗偏好。":e.selectedThemePair===void 0?"已开启,但所选主题没有明暗配对,因此会保持当前主题。":`已开启 · ${e.selectedThemePair.name} 跟随系统${this.systemPrefersLight()?"浅色":"深色"}偏好。`}themeOptionLabel(e,t){const i=[...e.id===t?["已选择"]:[],...e.id===this.activeThemeId&&e.id!==t?["生效中"]:[]];return i.length===0?e.name:`${e.name} ✓ ${i.join(" · ")}`}themeOptionDescription(e){const t=[e.colorScheme];return this.themePairForTheme(e.id)!==void 0&&t.push("自动配对"),e.description!==void 0&&t.push(e.description),t.join(" · ")}async openThinkingDialog(){const e=await this.sessions.listThinkingLevels(),t=this.state.status?.thinkingLevel??"off";this.setState({thinkingDialog:{title:"选择思考级别",selectedValue:t,options:e.map(i=>{const s=J0(i);return{value:i,label:`${i}${i===t?" ✓ 当前":""}`,...s===void 0?{}:{description:s}}})}})}async pickThinking(e){this.setState({thinkingDialog:void 0}),e!==""&&await this.sessions.setThinkingLevel(e)}sendPrompt(e,t,i,s){!(i!==void 0&&i.length>0)&&t===void 0&&this.auth.handleSlashCommand(e)||this.sessions.send(e,t,i,s)}renderContextBar(){return this.appShell.isMobileNavigationLayout?l`
2696
+ 这只会从当前 PI WEB 网关移除它。`))return;const t=this.state.selectedMachine?.id===e.id;t&&this.rememberCurrentMachineNavigation();const i=await this.machines.deleteMachine(e,{selectFallback:!t});this.state.machines.some(s=>s.id===e.id)||this.machineNavigation.forget(e.id),t&&i!==void 0&&await this.selectMachineWithMemory(i,{rememberCurrent:!1})}openSelectedMachine(){const e=this.state.selectedMachine;e?.kind!=="remote"||e.baseUrl===void 0||window.open(e.baseUrl,"_blank","noopener,noreferrer")}runAction(e){Promise.resolve().then(()=>e.run()).catch(t=>{const i=t instanceof Error?t.message:String(t);console.warn(`Action failed: ${e.id}`,t),this.setState({error:`操作失败:${i}`})})}async openModelDialog(){const e=await this.sessions.listModels(),t=this.state.status?.model?.provider,i=this.state.status?.model?.id;this.setState({modelDialog:{title:"选择模型",...t!==void 0&&i!==void 0?{selectedValue:`${t}/${i}`}:{},options:e.map(s=>{const r=s.provider??"",o=s.id??"",n=r===t&&o===i;return{value:`${r}/${o}`,label:`${o}${n?" ✓ 当前":""}`,description:r}})}})}async pickModel(e){this.setState({modelDialog:void 0});const t=e.indexOf("/");t<=0||await this.sessions.setModel(e.slice(0,t),e.slice(t+1))}openThemeDialog(){const e=this.plugins.getThemes(),t=this.resolveCurrentThemePreference(e),i=t.selectedTheme?.id,s=this.themePreference.auto?oa:_s;this.setState({themeDialog:{title:"选择主题",selectedValue:i===void 0?s:`${hi}${i}`,options:[{value:s,label:`自动 ${this.themePreference.auto?"✓ 开启":"关闭"}`,description:this.autoThemeDescription(t)},...e.map(r=>({value:`${hi}${r.id}`,label:this.themeOptionLabel(r,i),description:this.themeOptionDescription(r)}))]}})}pickTheme(e){if(this.setState({themeDialog:void 0}),e===_s||e===oa){const s=this.resolveCurrentThemePreference().selectedTheme?.id;if(s===void 0)return;this.themePreference={themeId:s,auto:e===_s},this.applyPreferredTheme(!0);return}if(!e.startsWith(hi))return;const t=e.slice(hi.length),i=this.plugins.getThemes().find(s=>s.id===t);i!==void 0&&(this.themePreference={themeId:i.id,auto:this.themePreference.auto},this.applyPreferredTheme(!0))}applyPreferredTheme(e){const t=this.resolveCurrentThemePreference().activeTheme;t!==void 0&&(this.activeThemeId=t.id,jf(t),e&&Lf(this.themePreference))}resolveCurrentThemePreference(e=this.plugins.getThemes()){return Ff({themes:e,themePairs:this.plugins.getThemePairs(),preference:this.themePreference,prefersLight:this.systemPrefersLight()})}themePairForTheme(e){return nl(this.plugins.getThemePairs(),e)}systemPrefersLight(){return this.systemLightThemeMedia?.matches??!1}autoThemeDescription(e){return!this.themePreference.auto||e.selectedTheme===void 0?"当所选主题有配对主题时,跟随系统明暗偏好。":e.selectedThemePair===void 0?"已开启,但所选主题没有明暗配对,因此会保持当前主题。":`已开启 · ${e.selectedThemePair.name} 跟随系统${this.systemPrefersLight()?"浅色":"深色"}偏好。`}themeOptionLabel(e,t){const i=[...e.id===t?["已选择"]:[],...e.id===this.activeThemeId&&e.id!==t?["生效中"]:[]];return i.length===0?e.name:`${e.name} ✓ ${i.join(" · ")}`}themeOptionDescription(e){const t=[e.colorScheme];return this.themePairForTheme(e.id)!==void 0&&t.push("自动配对"),e.description!==void 0&&t.push(e.description),t.join(" · ")}async openThinkingDialog(){const e=await this.sessions.listThinkingLevels(),t=this.state.status?.thinkingLevel??"off";this.setState({thinkingDialog:{title:"选择思考级别",selectedValue:t,options:e.map(i=>{const s=Q0(i);return{value:i,label:`${i}${i===t?" ✓ 当前":""}`,...s===void 0?{}:{description:s}}})}})}async pickThinking(e){this.setState({thinkingDialog:void 0}),e!==""&&await this.sessions.setThinkingLevel(e)}sendPrompt(e,t,i,s){!(i!==void 0&&i.length>0)&&t===void 0&&this.auth.handleSlashCommand(e)||this.sessions.send(e,t,i,s)}renderContextBar(){return this.appShell.isMobileNavigationLayout?l`
2696
2697
  <app-context-bar
2697
2698
  .machines=${this.state.machines}
2698
2699
  .machine=${this.state.selectedMachine}
@@ -2737,4 +2738,4 @@ The Git branch will not be deleted.`))return;const s=f(this.state);try{const r=a
2737
2738
  ${e.themeDialog!==void 0?l`<command-picker title=${e.themeDialog.title} .options=${e.themeDialog.options} .selectedValue=${e.themeDialog.selectedValue} .onPick=${t=>{this.pickTheme(t)}} .onCancel=${()=>{this.setState({themeDialog:void 0})}}></command-picker>`:null}
2738
2739
  ${this.settingsSection!==void 0?l`<settings-dialog .section=${this.settingsSection} .actions=${this.getDefaultActions()} .onNavigate=${t=>{this.navigateSettings(t)}} .onClose=${()=>{this.closeSettings()}} .onConfigSaved=${t=>{this.applyClientConfig(t)}}></settings-dialog>`:null}
2739
2740
  </div>
2740
- `}};re.styles=_0;ve([x()],re.prototype,"state",2);ve([B("chat-view")],re.prototype,"chatView",2);ve([B("prompt-editor")],re.prototype,"promptEditor",2);ve([B("app-navigation-panel")],re.prototype,"navigationPanel",2);ve([B("#navigation-panel")],re.prototype,"navigationPanelFrame",2);ve([B("#workspace-panel")],re.prototype,"workspacePanelFrame",2);ve([x()],re.prototype,"activeThemeId",2);ve([x()],re.prototype,"isRefreshingApp",2);ve([x()],re.prototype,"sessionCleanupDialog",2);ve([x()],re.prototype,"settingsSection",2);ve([x()],re.prototype,"shortcutConfig",2);ve([x()],re.prototype,"workspaceUploadDefaultFolder",2);re=ve([W("pi-web-app")],re);function B0(){const e=new em;return e.register({id:"core",plugin:Lg}),e.register({id:"themes",plugin:zg}),e}function na(e){const t=e.selectedMachine;return t!==void 0?{id:t.id,name:t.name,kind:t.kind}:{id:"local",name:"local",kind:"local"}}function N0(e,t){return e.machines!==t.machines||e.machineStatuses!==t.machineStatuses||(e.selectedMachine?.id??"local")!==(t.selectedMachine?.id??"local")}function H0(e,t){return Zl(e,t)}function Zl(e,t){if(e.kind==="local")return!0;const i=t?.status??e.status;return i===void 0||i==="unknown"||i==="online"}function q0(e,t){return Object.entries(t).some(([i,s])=>Reflect.get(e,i)!==s)}function aa(e){return Ye(e.status,e.activity)}function K0(e){return e.type==="terminal.created"||e.type==="terminal.exited"||e.type==="terminal.closed"}function la(){return{}}function ca(e,t){return JSON.stringify([e,t])}function V0(e){const t=Math.min(e,lr.length-1);return lr[t]??3e4}function Fs(e){return e instanceof Error?e.message:String(e)}function G0(e,t){return Object.fromEntries(Object.entries(e).filter(([i])=>i!==t))}function Us(){return new Promise(e=>requestAnimationFrame(()=>{e()}))}function J0(e){switch(e){case"off":return"不使用推理";case"minimal":return"极简推理(约 1k tokens)";case"low":return"轻量推理(约 2k tokens)";case"medium":return"中等推理(约 8k tokens)";case"high":return"深度推理(约 16k tokens)";case"xhigh":return"最大推理(约 32k tokens)";default:return}}export{E as a,l as b,yt as c,lx as d,nx as e,B as f,A as i,d as n,x as r,ax as s,W as t};
2741
+ `}};re.styles=L0;ve([x()],re.prototype,"state",2);ve([B("chat-view")],re.prototype,"chatView",2);ve([B("prompt-editor")],re.prototype,"promptEditor",2);ve([B("app-navigation-panel")],re.prototype,"navigationPanel",2);ve([B("#navigation-panel")],re.prototype,"navigationPanelFrame",2);ve([B("#workspace-panel")],re.prototype,"workspacePanelFrame",2);ve([x()],re.prototype,"activeThemeId",2);ve([x()],re.prototype,"isRefreshingApp",2);ve([x()],re.prototype,"sessionCleanupDialog",2);ve([x()],re.prototype,"settingsSection",2);ve([x()],re.prototype,"shortcutConfig",2);ve([x()],re.prototype,"workspaceUploadDefaultFolder",2);re=ve([W("pi-web-app")],re);function N0(){const e=new tm;return e.register({id:"core",plugin:jg}),e.register({id:"themes",plugin:Bg}),e}function na(e){const t=e.selectedMachine;return t!==void 0?{id:t.id,name:t.name,kind:t.kind}:{id:"local",name:"local",kind:"local"}}function H0(e,t){return e.machines!==t.machines||e.machineStatuses!==t.machineStatuses||(e.selectedMachine?.id??"local")!==(t.selectedMachine?.id??"local")}function q0(e,t){return Zl(e,t)}function Zl(e,t){if(e.kind==="local")return!0;const i=t?.status??e.status;return i===void 0||i==="unknown"||i==="online"}function K0(e,t){return Object.entries(t).some(([i,s])=>Reflect.get(e,i)!==s)}function aa(e){return Ye(e.status,e.activity)}function V0(e){return e.type==="terminal.created"||e.type==="terminal.exited"||e.type==="terminal.closed"}function la(){return{}}function ca(e,t){return JSON.stringify([e,t])}function G0(e){const t=Math.min(e,lr.length-1);return lr[t]??3e4}function Fs(e){return e instanceof Error?e.message:String(e)}function J0(e,t){return Object.fromEntries(Object.entries(e).filter(([i])=>i!==t))}function Us(){return new Promise(e=>requestAnimationFrame(()=>{e()}))}function Q0(e){switch(e){case"off":return"不使用推理";case"minimal":return"极简推理(约 1k tokens)";case"low":return"轻量推理(约 2k tokens)";case"medium":return"中等推理(约 8k tokens)";case"high":return"深度推理(约 16k tokens)";case"xhigh":return"最大推理(约 32k tokens)";default:return}}export{E as a,l as b,yt as c,cx as d,ax as e,B as f,A as i,d as n,x as r,lx as s,W as t};