@chainingintention/pi-web-cn 1.202608.8 → 1.202608.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/assets/{CodeViewer-CWKEeX0r.js → CodeViewer-B9BLGnQ2.js} +1 -1
- package/dist/client/assets/{TerminalPanel-BmA7Ayzk.js → TerminalPanel-C1BWg5W2.js} +1 -1
- package/dist/client/assets/{UnifiedDiffViewer-2DACwxFY.js → UnifiedDiffViewer-ClTQ6Ok0.js} +1 -1
- package/dist/client/assets/{index-D6j67Izj.js → index-x7EWN9ro.js} +124 -124
- package/dist/client/index.html +1 -1
- package/dist/server/audit/managementAuditStore.js +4 -2
- package/dist/server/audit/managementAuditStore.js.map +1 -1
- package/dist/server/managementEmbed.js +6 -0
- package/dist/server/managementEmbed.js.map +1 -1
- package/dist/server/sessions/managementAgentTools.js +12 -4
- package/dist/server/sessions/managementAgentTools.js.map +1 -1
- package/dist/server/sessions/managementSandbox.js +5 -5
- package/dist/server/sessions/managementSandbox.js.map +1 -1
- package/dist/server/sessions/piSessionService.js +137 -22
- package/dist/server/sessions/piSessionService.js.map +1 -1
- package/dist/server/workbench/skillSync.js +9 -1
- package/dist/server/workbench/skillSync.js.map +1 -1
- package/package.json +2 -1
- package/skills/README.md +12 -0
- package/skills/relay/SKILL.md +115 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./CodeViewer-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./CodeViewer-B9BLGnQ2.js","./vendor-editor-core-vUi74DnD.js","./vendor-editor-languages-DoaXUodB.js","./vendor-editor-legacy-CYBnW6ZU.js","./TerminalPanel-C1BWg5W2.js","./vendor-terminal-D8k4UKM2.js","./vendor-terminal-BrP-ENHg.css"])))=>i.map(i=>d[i]);
|
|
2
2
|
import{$ as e,A as t,J as n,P as r,Q as i,S as a,X as o,Z as s,d as c,f as l,j as u,l as d,p as f,q as p,u as m}from"./vendor-editor-core-vUi74DnD.js";import{a as ee,o as te,s as ne}from"./vendor-editor-languages-DoaXUodB.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var re=globalThis,ie=re.ShadowRoot&&(re.ShadyCSS===void 0||re.ShadyCSS.nativeShadow)&&`adoptedStyleSheets`in Document.prototype&&`replace`in CSSStyleSheet.prototype,ae=Symbol(),oe=new WeakMap,se=class{constructor(e,t,n){if(this._$cssResult$=!0,n!==ae)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=e,this.t=t}get styleSheet(){let e=this.o,t=this.t;if(ie&&e===void 0){let n=t!==void 0&&t.length===1;n&&(e=oe.get(t)),e===void 0&&((this.o=e=new CSSStyleSheet).replaceSync(this.cssText),n&&oe.set(t,e))}return e}toString(){return this.cssText}},ce=e=>new se(typeof e==`string`?e:e+``,void 0,ae),h=(e,...t)=>new se(e.length===1?e[0]:t.reduce((t,n,r)=>t+(e=>{if(!0===e._$cssResult$)return e.cssText;if(typeof e==`number`)return e;throw Error(`Value passed to 'css' function must be a 'css' function result: `+e+`. Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.`)})(n)+e[r+1],e[0]),e,ae),le=(e,t)=>{if(ie)e.adoptedStyleSheets=t.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(let n of t){let t=document.createElement(`style`),r=re.litNonce;r!==void 0&&t.setAttribute(`nonce`,r),t.textContent=n.cssText,e.appendChild(t)}},ue=ie?e=>e:e=>e instanceof CSSStyleSheet?(e=>{let t=``;for(let n of e.cssRules)t+=n.cssText;return ce(t)})(e):e,{is:de,defineProperty:fe,getOwnPropertyDescriptor:pe,getOwnPropertyNames:me,getOwnPropertySymbols:he,getPrototypeOf:ge}=Object,_e=globalThis,ve=_e.trustedTypes,ye=ve?ve.emptyScript:``,be=_e.reactiveElementPolyfillSupport,xe=(e,t)=>e,Se={toAttribute(e,t){switch(t){case Boolean:e=e?ye:null;break;case Object:case Array:e=e==null?e:JSON.stringify(e)}return e},fromAttribute(e,t){let n=e;switch(t){case Boolean:n=e!==null;break;case Number:n=e===null?null:Number(e);break;case Object:case Array:try{n=JSON.parse(e)}catch{n=null}}return n}},Ce=(e,t)=>!de(e,t),we={attribute:!0,type:String,converter:Se,reflect:!1,useDefault:!1,hasChanged:Ce};Symbol.metadata??=Symbol(`metadata`),_e.litPropertyMetadata??=new WeakMap;var Te=class extends HTMLElement{static addInitializer(e){this._$Ei(),(this.l??=[]).push(e)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(e,t=we){if(t.state&&(t.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(e)&&((t=Object.create(t)).wrapped=!0),this.elementProperties.set(e,t),!t.noAccessor){let n=Symbol(),r=this.getPropertyDescriptor(e,n,t);r!==void 0&&fe(this.prototype,e,r)}}static getPropertyDescriptor(e,t,n){let{get:r,set:i}=pe(this.prototype,e)??{get(){return this[t]},set(e){this[t]=e}};return{get:r,set(t){let a=r?.call(this);i?.call(this,t),this.requestUpdate(e,a,n)},configurable:!0,enumerable:!0}}static getPropertyOptions(e){return this.elementProperties.get(e)??we}static _$Ei(){if(this.hasOwnProperty(xe(`elementProperties`)))return;let e=ge(this);e.finalize(),e.l!==void 0&&(this.l=[...e.l]),this.elementProperties=new Map(e.elementProperties)}static finalize(){if(this.hasOwnProperty(xe(`finalized`)))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(xe(`properties`))){let e=this.properties,t=[...me(e),...he(e)];for(let n of t)this.createProperty(n,e[n])}let e=this[Symbol.metadata];if(e!==null){let t=litPropertyMetadata.get(e);if(t!==void 0)for(let[e,n]of t)this.elementProperties.set(e,n)}this._$Eh=new Map;for(let[e,t]of this.elementProperties){let n=this._$Eu(e,t);n!==void 0&&this._$Eh.set(n,e)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(e){let t=[];if(Array.isArray(e)){let n=new Set(e.flat(1/0).reverse());for(let e of n)t.unshift(ue(e))}else e!==void 0&&t.push(ue(e));return t}static _$Eu(e,t){let n=t.attribute;return!1===n?void 0:typeof n==`string`?n:typeof e==`string`?e.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(e=>this.enableUpdating=e),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(e=>e(this))}addController(e){(this._$EO??=new Set).add(e),this.renderRoot!==void 0&&this.isConnected&&e.hostConnected?.()}removeController(e){this._$EO?.delete(e)}_$E_(){let e=new Map,t=this.constructor.elementProperties;for(let n of t.keys())this.hasOwnProperty(n)&&(e.set(n,this[n]),delete this[n]);e.size>0&&(this._$Ep=e)}createRenderRoot(){let e=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return le(e,this.constructor.elementStyles),e}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(e=>e.hostConnected?.())}enableUpdating(e){}disconnectedCallback(){this._$EO?.forEach(e=>e.hostDisconnected?.())}attributeChangedCallback(e,t,n){this._$AK(e,n)}_$ET(e,t){let n=this.constructor.elementProperties.get(e),r=this.constructor._$Eu(e,n);if(r!==void 0&&!0===n.reflect){let i=(n.converter?.toAttribute===void 0?Se:n.converter).toAttribute(t,n.type);this._$Em=e,i==null?this.removeAttribute(r):this.setAttribute(r,i),this._$Em=null}}_$AK(e,t){let n=this.constructor,r=n._$Eh.get(e);if(r!==void 0&&this._$Em!==r){let e=n.getPropertyOptions(r),i=typeof e.converter==`function`?{fromAttribute:e.converter}:e.converter?.fromAttribute===void 0?Se:e.converter;this._$Em=r;let a=i.fromAttribute(t,e.type);this[r]=a??this._$Ej?.get(r)??a,this._$Em=null}}requestUpdate(e,t,n,r=!1,i){if(e!==void 0){let a=this.constructor;if(!1===r&&(i=this[e]),n??=a.getPropertyOptions(e),!((n.hasChanged??Ce)(i,t)||n.useDefault&&n.reflect&&i===this._$Ej?.get(e)&&!this.hasAttribute(a._$Eu(e,n))))return;this.C(e,t,n)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(e,t,{useDefault:n,reflect:r,wrapped:i},a){n&&!(this._$Ej??=new Map).has(e)&&(this._$Ej.set(e,a??t??this[e]),!0!==i||a!==void 0)||(this._$AL.has(e)||(this.hasUpdated||n||(t=void 0),this._$AL.set(e,t)),!0===r&&this._$Em!==e&&(this._$Eq??=new Set).add(e))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(e){Promise.reject(e)}let e=this.scheduleUpdate();return e!=null&&await e,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(let[e,t]of this._$Ep)this[e]=t;this._$Ep=void 0}let e=this.constructor.elementProperties;if(e.size>0)for(let[t,n]of e){let{wrapped:e}=n,r=this[t];!0!==e||this._$AL.has(t)||r===void 0||this.C(t,void 0,n,r)}}let e=!1,t=this._$AL;try{e=this.shouldUpdate(t),e?(this.willUpdate(t),this._$EO?.forEach(e=>e.hostUpdate?.()),this.update(t)):this._$EM()}catch(t){throw e=!1,this._$EM(),t}e&&this._$AE(t)}willUpdate(e){}_$AE(e){this._$EO?.forEach(e=>e.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(e)),this.updated(e)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(e){return!0}update(e){this._$Eq&&=this._$Eq.forEach(e=>this._$ET(e,this[e])),this._$EM()}updated(e){}firstUpdated(e){}};Te.elementStyles=[],Te.shadowRootOptions={mode:`open`},Te[xe(`elementProperties`)]=new Map,Te[xe(`finalized`)]=new Map,be?.({ReactiveElement:Te}),(_e.reactiveElementVersions??=[]).push(`2.1.2`);var Ee=globalThis,De=e=>e,Oe=Ee.trustedTypes,ke=Oe?Oe.createPolicy(`lit-html`,{createHTML:e=>e}):void 0,Ae=`$lit$`,je=`lit$${Math.random().toFixed(9).slice(2)}$`,Me=`?`+je,Ne=`<${Me}>`,Pe=document,Fe=()=>Pe.createComment(``),Ie=e=>e===null||typeof e!=`object`&&typeof e!=`function`,Le=Array.isArray,Re=e=>Le(e)||typeof e?.[Symbol.iterator]==`function`,ze=`[
|
|
3
3
|
\f\r]`,Be=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,Ve=/-->/g,He=/>/g,Ue=RegExp(`>|${ze}(?:([^\\s"'>=/]+)(${ze}*=${ze}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,`g`),We=/'/g,Ge=/"/g,Ke=/^(?:script|style|textarea|title)$/i,qe=e=>(t,...n)=>({_$litType$:e,strings:t,values:n}),g=qe(1),_=qe(2),Je=Symbol.for(`lit-noChange`),v=Symbol.for(`lit-nothing`),Ye=new WeakMap,Xe=Pe.createTreeWalker(Pe,129);function Ze(e,t){if(!Le(e)||!e.hasOwnProperty(`raw`))throw Error(`invalid template strings array`);return ke===void 0?t:ke.createHTML(t)}var Qe=(e,t)=>{let n=e.length-1,r=[],i,a=t===2?`<svg>`:t===3?`<math>`:``,o=Be;for(let t=0;t<n;t++){let n=e[t],s,c,l=-1,u=0;for(;u<n.length&&(o.lastIndex=u,c=o.exec(n),c!==null);)u=o.lastIndex,o===Be?c[1]===`!--`?o=Ve:c[1]===void 0?c[2]===void 0?c[3]!==void 0&&(o=Ue):(Ke.test(c[2])&&(i=RegExp(`</`+c[2],`g`)),o=Ue):o=He:o===Ue?c[0]===`>`?(o=i??Be,l=-1):c[1]===void 0?l=-2:(l=o.lastIndex-c[2].length,s=c[1],o=c[3]===void 0?Ue:c[3]===`"`?Ge:We):o===Ge||o===We?o=Ue:o===Ve||o===He?o=Be:(o=Ue,i=void 0);let d=o===Ue&&e[t+1].startsWith(`/>`)?` `:``;a+=o===Be?n+Ne:l>=0?(r.push(s),n.slice(0,l)+Ae+n.slice(l)+je+d):n+je+(l===-2?t:d)}return[Ze(e,a+(e[n]||`<?>`)+(t===2?`</svg>`:t===3?`</math>`:``)),r]},$e=class e{constructor({strings:t,_$litType$:n},r){let i;this.parts=[];let a=0,o=0,s=t.length-1,c=this.parts,[l,u]=Qe(t,n);if(this.el=e.createElement(l,r),Xe.currentNode=this.el.content,n===2||n===3){let e=this.el.content.firstChild;e.replaceWith(...e.childNodes)}for(;(i=Xe.nextNode())!==null&&c.length<s;){if(i.nodeType===1){if(i.hasAttributes())for(let e of i.getAttributeNames())if(e.endsWith(Ae)){let t=u[o++],n=i.getAttribute(e).split(je),r=/([.?@])?(.*)/.exec(t);c.push({type:1,index:a,name:r[2],strings:n,ctor:r[1]===`.`?it:r[1]===`?`?at:r[1]===`@`?ot:rt}),i.removeAttribute(e)}else e.startsWith(je)&&(c.push({type:6,index:a}),i.removeAttribute(e));if(Ke.test(i.tagName)){let e=i.textContent.split(je),t=e.length-1;if(t>0){i.textContent=Oe?Oe.emptyScript:``;for(let n=0;n<t;n++)i.append(e[n],Fe()),Xe.nextNode(),c.push({type:2,index:++a});i.append(e[t],Fe())}}}else if(i.nodeType===8)if(i.data===Me)c.push({type:2,index:a});else{let e=-1;for(;(e=i.data.indexOf(je,e+1))!==-1;)c.push({type:7,index:a}),e+=je.length-1}a++}}static createElement(e,t){let n=Pe.createElement(`template`);return n.innerHTML=e,n}};function et(e,t,n=e,r){if(t===Je)return t;let i=r===void 0?n._$Cl:n._$Co?.[r],a=Ie(t)?void 0:t._$litDirective$;return i?.constructor!==a&&(i?._$AO?.(!1),a===void 0?i=void 0:(i=new a(e),i._$AT(e,n,r)),r===void 0?n._$Cl=i:(n._$Co??=[])[r]=i),i!==void 0&&(t=et(e,i._$AS(e,t.values),i,r)),t}var tt=class{constructor(e,t){this._$AV=[],this._$AN=void 0,this._$AD=e,this._$AM=t}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(e){let{el:{content:t},parts:n}=this._$AD,r=(e?.creationScope??Pe).importNode(t,!0);Xe.currentNode=r;let i=Xe.nextNode(),a=0,o=0,s=n[0];for(;s!==void 0;){if(a===s.index){let t;s.type===2?t=new nt(i,i.nextSibling,this,e):s.type===1?t=new s.ctor(i,s.name,s.strings,this,e):s.type===6&&(t=new st(i,this,e)),this._$AV.push(t),s=n[++o]}a!==s?.index&&(i=Xe.nextNode(),a++)}return Xe.currentNode=Pe,r}p(e){let t=0;for(let n of this._$AV)n!==void 0&&(n.strings===void 0?n._$AI(e[t]):(n._$AI(e,n,t),t+=n.strings.length-2)),t++}},nt=class e{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(e,t,n,r){this.type=2,this._$AH=v,this._$AN=void 0,this._$AA=e,this._$AB=t,this._$AM=n,this.options=r,this._$Cv=r?.isConnected??!0}get parentNode(){let e=this._$AA.parentNode,t=this._$AM;return t!==void 0&&e?.nodeType===11&&(e=t.parentNode),e}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(e,t=this){e=et(this,e,t),Ie(e)?e===v||e==null||e===``?(this._$AH!==v&&this._$AR(),this._$AH=v):e!==this._$AH&&e!==Je&&this._(e):e._$litType$===void 0?e.nodeType===void 0?Re(e)?this.k(e):this._(e):this.T(e):this.$(e)}O(e){return this._$AA.parentNode.insertBefore(e,this._$AB)}T(e){this._$AH!==e&&(this._$AR(),this._$AH=this.O(e))}_(e){this._$AH!==v&&Ie(this._$AH)?this._$AA.nextSibling.data=e:this.T(Pe.createTextNode(e)),this._$AH=e}$(e){let{values:t,_$litType$:n}=e,r=typeof n==`number`?this._$AC(e):(n.el===void 0&&(n.el=$e.createElement(Ze(n.h,n.h[0]),this.options)),n);if(this._$AH?._$AD===r)this._$AH.p(t);else{let e=new tt(r,this),n=e.u(this.options);e.p(t),this.T(n),this._$AH=e}}_$AC(e){let t=Ye.get(e.strings);return t===void 0&&Ye.set(e.strings,t=new $e(e)),t}k(t){Le(this._$AH)||(this._$AH=[],this._$AR());let n=this._$AH,r,i=0;for(let a of t)i===n.length?n.push(r=new e(this.O(Fe()),this.O(Fe()),this,this.options)):r=n[i],r._$AI(a),i++;i<n.length&&(this._$AR(r&&r._$AB.nextSibling,i),n.length=i)}_$AR(e=this._$AA.nextSibling,t){for(this._$AP?.(!1,!0,t);e!==this._$AB;){let t=De(e).nextSibling;De(e).remove(),e=t}}setConnected(e){this._$AM===void 0&&(this._$Cv=e,this._$AP?.(e))}},rt=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(e,t,n,r,i){this.type=1,this._$AH=v,this._$AN=void 0,this.element=e,this.name=t,this._$AM=r,this.options=i,n.length>2||n[0]!==``||n[1]!==``?(this._$AH=Array(n.length-1).fill(new String),this.strings=n):this._$AH=v}_$AI(e,t=this,n,r){let i=this.strings,a=!1;if(i===void 0)e=et(this,e,t,0),a=!Ie(e)||e!==this._$AH&&e!==Je,a&&(this._$AH=e);else{let r=e,o,s;for(e=i[0],o=0;o<i.length-1;o++)s=et(this,r[n+o],t,o),s===Je&&(s=this._$AH[o]),a||=!Ie(s)||s!==this._$AH[o],s===v?e=v:e!==v&&(e+=(s??``)+i[o+1]),this._$AH[o]=s}a&&!r&&this.j(e)}j(e){e===v?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,e??``)}},it=class extends rt{constructor(){super(...arguments),this.type=3}j(e){this.element[this.name]=e===v?void 0:e}},at=class extends rt{constructor(){super(...arguments),this.type=4}j(e){this.element.toggleAttribute(this.name,!!e&&e!==v)}},ot=class extends rt{constructor(e,t,n,r,i){super(e,t,n,r,i),this.type=5}_$AI(e,t=this){if((e=et(this,e,t,0)??v)===Je)return;let n=this._$AH,r=e===v&&n!==v||e.capture!==n.capture||e.once!==n.once||e.passive!==n.passive,i=e!==v&&(n===v||r);r&&this.element.removeEventListener(this.name,this,n),i&&this.element.addEventListener(this.name,this,e),this._$AH=e}handleEvent(e){typeof this._$AH==`function`?this._$AH.call(this.options?.host??this.element,e):this._$AH.handleEvent(e)}},st=class{constructor(e,t,n){this.element=e,this.type=6,this._$AN=void 0,this._$AM=t,this.options=n}get _$AU(){return this._$AM._$AU}_$AI(e){et(this,e)}},ct={M:Ae,P:je,A:Me,C:1,L:Qe,R:tt,D:Re,V:et,I:nt,H:rt,N:at,U:ot,B:it,F:st},lt=Ee.litHtmlPolyfillSupport;lt?.($e,nt),(Ee.litHtmlVersions??=[]).push(`3.3.3`);var ut=(e,t,n)=>{let r=n?.renderBefore??t,i=r._$litPart$;if(i===void 0){let e=n?.renderBefore??null;r._$litPart$=i=new nt(t.insertBefore(Fe(),e),e,void 0,n??{})}return i._$AI(e),i},dt=globalThis,y=class extends Te{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){let e=super.createRenderRoot();return this.renderOptions.renderBefore??=e.firstChild,e}update(e){let t=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(e),this._$Do=ut(t,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return Je}};y._$litElement$=!0,y.finalized=!0,dt.litElementHydrateSupport?.({LitElement:y});var ft=dt.litElementPolyfillSupport;ft?.({LitElement:y}),(dt.litElementVersions??=[]).push(`4.2.2`);var b=e=>(t,n)=>{n===void 0?customElements.define(e,t):n.addInitializer(()=>{customElements.define(e,t)})},pt={attribute:!0,type:String,converter:Se,reflect:!1,hasChanged:Ce},mt=(e=pt,t,n)=>{let{kind:r,metadata:i}=n,a=globalThis.litPropertyMetadata.get(i);if(a===void 0&&globalThis.litPropertyMetadata.set(i,a=new Map),r===`setter`&&((e=Object.create(e)).wrapped=!0),a.set(n.name,e),r===`accessor`){let{name:r}=n;return{set(n){let i=t.get.call(this);t.set.call(this,n),this.requestUpdate(r,i,e,!0,n)},init(t){return t!==void 0&&this.C(r,void 0,e,t),t}}}if(r===`setter`){let{name:r}=n;return function(n){let i=this[r];t.call(this,n),this.requestUpdate(r,i,e,!0,n)}}throw Error(`Unsupported decorator location: `+r)};function x(e){return(t,n)=>typeof n==`object`?mt(e,t,n):((e,t,n)=>{let r=t.hasOwnProperty(n);return t.constructor.createProperty(n,e),r?Object.getOwnPropertyDescriptor(t,n):void 0})(e,t,n)}function S(e){return x({...e,state:!0,attribute:!1})}var ht=(e,t,n)=>(n.configurable=!0,n.enumerable=!0,Reflect.decorate&&typeof t!=`object`&&Object.defineProperty(e,t,n),n);function C(e,t){return(n,r,i)=>{let a=t=>t.renderRoot?.querySelector(e)??null;if(t){let{get:e,set:t}=typeof r==`object`?n:i??(()=>{let e=Symbol();return{get(){return this[e]},set(t){this[e]=t}}})();return ht(n,r,{get(){let n=e.call(this);return n===void 0&&(n=a(this),(n!==null||this.hasUpdated)&&t.call(this,n)),n}})}return ht(n,r,{get(){return a(this)}})}}var gt=`management`;function _t(e=Tt()){return wt(e)===gt}function vt(e=Et()){return _t(e?.search)?`management`:`normal`}function yt(e,t=Et(),n=`management`){return St(e,t,n,!0)}function bt(e,t=Et(),n=`management`){return St(e,t,n,!1)}function xt(e){if(e!==`management`||globalThis.history===void 0)return;let t=Et();t===void 0||Ct(t)?.token===void 0||(t.searchParams.delete(`token`),globalThis.history.replaceState(globalThis.history.state,``,`${t.pathname}${t.search}${t.hash}`))}function St(e,t,n,r){if(n===`normal`||t===void 0)return e;let i=Ct(t);if(i===void 0)return e;let a=new URL(e,t.origin);return a.searchParams.set(`embed`,i.embed),i.token!==void 0&&a.searchParams.set(`token`,i.token),`${a.pathname}${a.search}${r?a.hash:``}`}function Ct(e){if(e===void 0)return;let t=wt(e.search),n=e.searchParams.get(`token`)?.trim();if(t===gt)return{embed:t,...n===void 0||n===``?{}:{token:n}}}function wt(e){if(e===void 0||e===``)return;let t=new URLSearchParams(e).get(`embed`)?.trim();return t===``?void 0:t}function Tt(){return typeof window>`u`?void 0:window.location.search}function Et(){if(globalThis.location===void 0)return;let e=globalThis.location;if(typeof e.href==`string`&&e.href!==``)return new URL(e.href);let t=typeof e.protocol==`string`&&e.protocol!==``?e.protocol:`http:`,n=typeof e.host==`string`&&e.host!==``?e.host:`localhost`,r=typeof e.search==`string`?e.search:``;return new URL(`${t}//${n}/${r}`)}function Dt(e,t=kt()){let n=new URL(t.viteBaseUrl,t.documentBaseUrl);return new URL(At(e),n).toString()}function Ot(e,t=kt()){let n=new URL(Dt(e,t));if(n.protocol===`http:`)n.protocol=`ws:`;else if(n.protocol===`https:`)n.protocol=`wss:`;else throw Error(`Cannot create a WebSocket URL from ${n.protocol}`);return n.toString()}function kt(){return{viteBaseUrl:`./`,documentBaseUrl:typeof document>`u`?`http://localhost/`:document.baseURI}}function At(e){return e.startsWith(`/`)?`.${e}`:e}var jt=vt();function Mt(e){jt=e}function Nt(e){return Dt(yt(e,void 0,jt))}async function w(e,t,n){let r=new Headers(n?.headers);n?.body!==void 0&&!r.has(`content-type`)&&r.set(`content-type`,`application/json`);let i=await fetch(Nt(e),{...n,headers:r});if(!i.ok){let e=await i.json().catch(()=>({}));throw Error(Ft(e)??i.statusText)}return xt(jt),t(await i.json())}async function Pt(e,t){let n=await fetch(Nt(e));if(n.status===204){xt(jt);return}if(n.status!==404){if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(Ft(e)??n.statusText)}return xt(jt),t(await n.json())}}function Ft(e){if(It(e))return typeof e.error==`string`?e.error:void 0}function It(e){return typeof e==`object`&&!!e}var T={sessionsDeleteArchived:`sessions.deleteArchived`,sessionsBulkMutations:`sessions.bulkMutations`,sessionsCleanup:`sessions.cleanup`,sessionsReload:`sessions.reload`,sessionsClearQueue:`sessions.clearQueue`,sessionsPersistedState:`sessions.persistedState`,sessionsNotifications:`sessions.notifications`,sessionsUnread:`sessions.unread`,sessionsAskUser:`sessions.askUser`,promptAttachments:`prompt.attachments`,workspaceFileSuggestions:`workspace.fileSuggestions`,piPackagesManage:`piPackages.manage`,selectedMachineSettings:`settings.selectedMachine`,agentProfileConfig:`settings.agentProfile`},Lt=1e3,Rt=32*1024,zt=8*1024,Bt=1e3,Vt=4e3,Ht=1e3,Ut=4e3;function Wt(e){return(e.split(/[\\/]/u).at(-1)?.toLowerCase()??e.toLowerCase()).replace(/(?:\.[cm]?js|\.exe|\.cmd)$/iu,``)===`pi`}function Gt(e){return!e.includes(`/`)&&!e.includes(`\\`)&&Wt(e)}var Kt=new Set([`schemaVersion`,`revision`,`command`,`dir`,`sessionDirEnvKeys`]),qt=/^sha256:[0-9a-f]{64}$/u,Jt=/^[A-Za-z0-9_][A-Za-z0-9._+-]*$/u,Yt=new Set([`PI_WEB_AGENT_SESSION_DIR`,`PI_CODING_AGENT_SESSION_DIR`]);function Xt(e){if(!tn(e)||Object.keys(e).some(e=>!Kt.has(e)))return;let t=e.schemaVersion,n=e.revision,r=e.command,i=e.dir,a=e.sessionDirEnvKeys;if(t===1&&!(typeof n!=`string`||!qt.test(n))&&!(typeof r!=`string`||!Zt(r))&&!(typeof i!=`string`||!Qt(i))&&en(a)&&new Set(a).size===a.length&&!(a[0]!==`PI_WEB_AGENT_SESSION_DIR`||a.some(e=>!Yt.has(e))))return Object.freeze({schemaVersion:t,revision:n,command:r,dir:i,sessionDirEnvKeys:Object.freeze([...a])})}function Zt(e){return e!==e.trim()||/[\s;&|`$<>]/u.test(e)?!1:Qt(e)?!e.endsWith(`/`)&&!e.endsWith(`\\`):Jt.test(e)}function Qt(e){if(e===``||e!==e.trim()||$t(e))return!1;let t=e.replace(/\\/g,`/`);return t.startsWith(`/`)||/^[A-Za-z]:\//u.test(t)}function $t(e){for(let t of e){let e=t.charCodeAt(0);if(e<32||e===127)return!0}return!1}function en(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`&&e!==``)}function tn(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}var nn=Object.values(T),rn=new Set(nn);T.sessionsDeleteArchived,T.sessionsBulkMutations,T.sessionsCleanup,T.sessionsReload,T.sessionsClearQueue,T.sessionsPersistedState,T.sessionsNotifications,T.sessionsUnread,T.sessionsAskUser,T.promptAttachments,T.workspaceFileSuggestions,T.piPackagesManage,T.selectedMachineSettings,T.agentProfileConfig,T.sessionsDeleteArchived,T.sessionsBulkMutations,T.sessionsCleanup,T.sessionsReload,T.sessionsClearQueue,T.sessionsPersistedState,T.sessionsNotifications,T.sessionsUnread,T.sessionsAskUser,T.promptAttachments,T.sessionsDeleteArchived,T.sessionsBulkMutations,T.sessionsCleanup,T.sessionsReload,T.sessionsClearQueue,T.sessionsPersistedState,T.sessionsNotifications,T.sessionsUnread,T.sessionsAskUser,T.promptAttachments,T.workspaceFileSuggestions,T.piPackagesManage,T.selectedMachineSettings,T.agentProfileConfig;function an(e){return typeof e==`string`&&rn.has(e)}function on(e){if(!(!Array.isArray(e)||!e.every(e=>typeof e==`string`)))return e.filter(an)}function sn(e){return typeof e==`object`&&!!e}function E(e){if(!sn(e))throw Error(`Expected object response`);return e}function D(e,t){let n=e[t];if(typeof n!=`string`)throw Error(`Expected string field: ${t}`);return n}function O(e,t){let n=e[t];if(n!==void 0){if(typeof n!=`string`)throw Error(`Expected optional string field: ${t}`);return n}}function k(e,t){let n=e[t];if(typeof n!=`number`)throw Error(`Expected number field: ${t}`);return n}function A(e,t){let n=e[t];if(typeof n!=`boolean`)throw Error(`Expected boolean field: ${t}`);return n}function j(e){return t=>{if(!Array.isArray(t))throw Error(`Expected array response`);return t.map(e)}}function cn(e){if(!Array.isArray(e))throw Error(`Expected array response`);return e}function ln(e,t){if(!Array.isArray(e)||!e.every(e=>typeof e==`string`))throw Error(`Expected string array field: ${t}`);return e}function un(e){if(Array.isArray(e))return{messages:e,start:0,total:e.length};let t=E(e);return{messages:cn(t.messages),start:k(t,`start`),total:k(t,`total`)}}function dn(e){let t=E(e);return j(fn)(t.machines)}function fn(e){let t=E(e),n=hn(t,`kind`),r=O(t,`baseUrl`),i=gn(t,`status`),a=O(t,`statusMessage`);return{id:D(t,`id`),name:D(t,`name`),kind:n,...r===void 0?{}:{baseUrl:r},createdAt:D(t,`createdAt`),updatedAt:D(t,`updatedAt`),...i===void 0?{}:{status:i},...a===void 0?{}:{statusMessage:a}}}function pn(e){let t=E(e),n=gn(t,`status`),r=O(t,`error`);return{machineId:D(t,`machineId`),ok:A(t,`ok`),checkedAt:D(t,`checkedAt`),...n===void 0?{}:{status:n},...t.web===void 0?{}:{web:ta(t.web)},...t.sessiond===void 0?{}:{sessiond:ta(t.sessiond)},...r===void 0?{}:{error:r}}}function mn(e){let t=E(e),n=O(t,`error`);return{machineId:D(t,`machineId`),ok:A(t,`ok`),checkedAt:D(t,`checkedAt`),...N(`packageName`,O(t,`packageName`)),...N(`generatedAt`,O(t,`generatedAt`)),...t.components===void 0?{}:{components:$i(t.components)},...t.capabilities===void 0?{}:{capabilities:sa(t.capabilities)},...n===void 0?{}:{error:n}}}function hn(e,t){let n=D(e,t);if(n!==`local`&&n!==`remote`)throw Error(`Expected machine kind field: ${t}`);return n}function gn(e,t){let n=O(e,t);if(n!==void 0){if(n!==`unknown`&&n!==`online`&&n!==`offline`&&n!==`error`)throw Error(`Expected machine status field: ${t}`);return n}}function _n(e){let t=E(e);return{id:D(t,`id`),name:D(t,`name`),path:D(t,`path`),createdAt:D(t,`createdAt`)}}function vn(e){let t=E(e),n=O(t,`branch`);return{id:D(t,`id`),projectId:D(t,`projectId`),path:D(t,`path`),label:D(t,`label`),...n===void 0?{}:{branch:n},isMain:A(t,`isMain`),isGitRepo:A(t,`isGitRepo`),isGitWorktree:A(t,`isGitWorktree`),...N(`effectiveConfig`,yn(t.effectiveConfig))}}function yn(e){if(e!==void 0){if(!sn(e)||Array.isArray(e))throw Error(`Invalid workspace effectiveConfig field`);return{...N(`uploads`,Ni(e.uploads))}}}function bn(e){let t=E(e),n=O(t,`name`),r=Ji(t.persisted,`persisted`),i=O(t,`parentSessionPath`),a=O(t,`parentSessionCwd`),o=O(t,`parentSessionId`),s=Yi(t.childSessionsElsewhere,`childSessionsElsewhere`),c=O(t,`archivedAt`);return{id:D(t,`id`),path:D(t,`path`),cwd:D(t,`cwd`),...r===void 0?{}:{persisted:r},...n===void 0?{}:{name:n},created:D(t,`created`),modified:D(t,`modified`),messageCount:k(t,`messageCount`),firstMessage:D(t,`firstMessage`),...i===void 0?{}:{parentSessionPath:i},...a===void 0?{}:{parentSessionCwd:a},...o===void 0?{}:{parentSessionId:o},...s===void 0?{}:{childSessionsElsewhere:s},...t.archived===!0?{archived:!0}:{},...c===void 0?{}:{archivedAt:c}}}function xn(e){let t=E(e);return{configured:A(t,`configured`),authenticated:A(t,`authenticated`)}}function Sn(e){return{path:D(E(e),`path`)}}function Cn(e){let t=E(e);if(t.deleted!==!0)throw Error(`Expected deleted response`);return{deleted:!0,path:D(t,`path`)}}function wn(e){return{sessionIds:ln(E(e).sessionIds,`sessionIds`)}}function Tn(e){return{pinned:A(E(e),`pinned`)}}function En(e){let t=E(e);return{results:j(Dn)(t.results),matchCount:k(t,`matchCount`),truncated:A(t,`truncated`)}}function Dn(e){let t=E(e);return{session:bn(t.session),matches:j(On)(t.matches)}}function On(e){let t=E(e),n=D(t,`role`);if(n!==`user`&&n!==`assistant`)throw Error(`Invalid session content search role`);return{messageIndex:k(t,`messageIndex`),role:n,excerpts:j(kn)(t.excerpts),occurrenceCount:k(t,`occurrenceCount`)}}function kn(e){let t=E(e);return{text:D(t,`text`),matchRanges:j(e=>{let t=E(e);return{start:k(t,`start`),length:k(t,`length`)}})(t.matchRanges)}}function An(e){if(e!==`info`&&e!==`warning`&&e!==`error`)throw Error(`Invalid session warning severity`);return e}function jn(e){if(e!==void 0)return{id:D(E(e),`id`)}}function Mn(e){let t=E(e),n=jn(t.dismiss);return{severity:An(t.severity),message:D(t,`message`),...N(`source`,O(t,`source`)),...N(`path`,O(t,`path`)),...n===void 0?{}:{dismiss:n}}}function Nn(e){return e===void 0?{}:{warnings:j(Mn)(e)}}function Pn(e){let t=E(e);return{value:M(t,`value`,128),label:M(t,`label`,Bt),...N(`detail`,pr(t,`detail`,Bt))}}function Fn(e){let t=E(e),n=wr(t.options,Pn,12,`options`);Gn(n.map(e=>e.value),`ask option value`),Ji(t.allowOther,`allowOther`);let r=Ji(t.multiple,`multiple`);return{id:M(t,`id`,128),question:M(t,`question`,Bt),...N(`detail`,pr(t,`detail`,Bt)),options:n,allowOther:!0,...r===void 0?{}:{multiple:r}}}function In(e){let t=E(e),n=wr(t.questions,Fn,20,`questions`);if(n.length===0)throw Error(`Pending ask has no questions`);return Gn(n.map(e=>e.id),`ask question id`),{askId:M(t,`askId`,128),askedAt:Er(t,`askedAt`),questions:n}}function Ln(e){return e===void 0?{}:{pendingAsk:In(e)}}function Rn(e){let t=E(e);if(t.type!==`ask.opened`)throw Error(`Invalid ask opened event type`);return{type:`ask.opened`,ask:In(t.ask)}}function zn(e){let t=E(e);if(t.type!==`ask.closed`)throw Error(`Invalid ask closed event type`);return{type:`ask.closed`,askId:M(t,`askId`,128),reason:Bn(t.reason)}}function Bn(e){if(e!==`submitted`&&e!==`superseded`&&e!==`cancelled`)throw Error(`Invalid ask close reason`);return e}function Vn(e){let t=E(e),n=Fn(t.question),r=wr(t.values,Tr,12,`values`),i=new Set(n.options.map(e=>e.value));if(r.some(e=>!i.has(e)))throw Error(`Ask answer selected an option the question never offered`);let a=pr(t,`otherText`,Vt),o=A(t,`answered`);if(o!==(r.length>0||a!==void 0))throw Error(`Ask answer contradicts its answered flag`);return{question:n,answered:o,values:r,...a===void 0?{}:{otherText:a}}}function Hn(e){let t=E(e),n=wr(t.questions,Vn,20,`questions`),r=Dr(t,`answeredCount`),i=ln(t.unansweredIds,`unansweredIds`),a=n.filter(e=>!e.answered).map(e=>e.question.id);if(r!==n.length-a.length)throw Error(`Ask outcome answered count mismatch`);if(i.length!==a.length||i.some((e,t)=>e!==a[t]))throw Error(`Ask outcome unanswered ids mismatch`);return{askId:M(t,`askId`,128),reason:Bn(t.reason),askedAt:Er(t,`askedAt`),closedAt:Er(t,`closedAt`),questions:n,answeredCount:r,unansweredIds:i,summary:Er(t,`summary`)}}function Un(e){let t=E(e),n=t.result;if(n!==`closed`&&n!==`stale`)throw Error(`Invalid ask close result`);let r=t.outcome===void 0?void 0:Hn(t.outcome);if(n===`closed`!=(r!==void 0))throw Error(`Ask close response outcome mismatch`);return{result:n,...r===void 0?{}:{outcome:r},sessionStatus:nr(t.sessionStatus)}}function Wn(e){let t=E(e),n=t.result;if(n!==`closed`&&n!==`stale`)throw Error(`Invalid dialog close result`);let r=t.outcome===void 0?void 0:er(t.outcome);if(n===`closed`!=(r!==void 0))throw Error(`Dialog close response outcome mismatch`);return{result:n,...r===void 0?{}:{outcome:r},sessionStatus:nr(t.sessionStatus)}}function Gn(e,t){if(new Set(e).size!==e.length)throw Error(`Duplicate ${t}`)}function Kn(e){if(e!==`confirm`&&e!==`select`&&e!==`input`)throw Error(`Invalid extension dialog kind`);return e}function qn(e){if(e!==`answered`&&e!==`cancelled`&&e!==`timeout`&&e!==`aborted`&&e!==`session-ended`)throw Error(`Invalid extension dialog close reason`);return e}function Jn(e){if(typeof e==`boolean`||typeof e==`string`&&e.length<=4e3)return e;throw Error(`Invalid extension dialog answer`)}function Yn(e){let t=Tr(e);if(t.length>1e3)throw Error(`String field exceeds limit: option`);return t}function Xn(e){let t=E(e),n=Kn(t.kind),r=t.options===void 0?void 0:wr(t.options,Yn,24,`options`);if(r!==void 0&&Gn(r,`dialog option`),n===`select`&&(r===void 0||r.length===0))throw Error(`Select dialog has no options`);return{dialogId:M(t,`dialogId`,128),kind:n,title:M(t,`title`,Ht),...N(`message`,pr(t,`message`,Ht)),...r===void 0?{}:{options:r},...N(`placeholder`,pr(t,`placeholder`,Ht)),askedAt:Er(t,`askedAt`),...N(`timeoutAt`,tr(t,`timeoutAt`)),runScoped:A(t,`runScoped`)}}function Zn(e){if(e===void 0)return{};let t=j(Xn)(e);return Gn(t.map(e=>e.dialogId),`dialog id`),{pendingDialogs:t}}function Qn(e){let t=E(e);if(t.type!==`dialog.opened`)throw Error(`Invalid dialog opened event type`);return{type:`dialog.opened`,dialog:Xn(t.dialog)}}function $n(e){let t=E(e);if(t.type!==`dialog.closed`)throw Error(`Invalid dialog closed event type`);let n=qn(t.reason),r=t.answer===void 0?void 0:Jn(t.answer);if(n===`answered`!=(r!==void 0))throw Error(`Dialog closed event answer mismatch`);return{type:`dialog.closed`,dialogId:M(t,`dialogId`,128),reason:n,...r===void 0?{}:{answer:r}}}function er(e){let t=E(e),n=qn(t.reason),r=t.answer===void 0?void 0:Jn(t.answer);if(n===`answered`!=(r!==void 0))throw Error(`Dialog outcome answer mismatch`);return{dialogId:M(t,`dialogId`,128),reason:n,...r===void 0?{}:{answer:r},askedAt:Er(t,`askedAt`),closedAt:Er(t,`closedAt`)}}function tr(e,t){let n=O(e,t);if(n!==void 0){if(n===``)throw Error(`Expected non-empty string field: ${t}`);return n}}function nr(e){let t=E(e);return{sessionId:D(t,`sessionId`),...N(`persisted`,Ji(t.persisted,`persisted`)),isStreaming:A(t,`isStreaming`),isCompacting:A(t,`isCompacting`),isBashRunning:A(t,`isBashRunning`),pendingMessageCount:k(t,`pendingMessageCount`),queuedMessages:t.queuedMessages===void 0?[]:j(Br)(t.queuedMessages),...N(`messageCount`,Ma(t,`messageCount`)),tokens:Vr(t.tokens),cost:k(t,`cost`),...Ur(t.model),...si(t.contextUsage),...N(`thinkingLevel`,O(t,`thinkingLevel`)),...Nn(t.warnings),...Ln(t.pendingAsk),...Zn(t.pendingDialogs)}}function rr(e){let t=E(e);return{seq:k(t,`seq`),partial:t.partial??null}}function ir(e){let t=E(e),n=Dr(t,`catalogRevision`),r=wr(t.sessions,ur,Lt,`sessions`);if(dr(r),fr(r),r.some(e=>e.completionOrder>n))throw Error(`Session unread completion order exceeds catalog revision`);return{catalogId:M(t,`catalogId`,512),catalogRevision:n,sessions:r}}function ar(e){let t=E(e);if(t.type!==`sessions.unread`)throw Error(`Invalid session unread event type`);let n=M(t,`sessionId`,512),r=M(t,`cwd`,Rt),i=mr(t,`catalogRevision`),a=t.unread===null?null:ur(t.unread);if(a!==null&&(a.sessionId!==n||a.cwd!==r))throw Error(`Session unread event identity mismatch`);if(a!==null&&a.completionOrder>i)throw Error(`Session unread completion order exceeds catalog revision`);return{type:`sessions.unread`,catalogId:M(t,`catalogId`,512),catalogRevision:i,sessionId:n,cwd:r,unread:a}}function or(e){let t=E(e);if(t.type!==`session.startup`)throw Error(`Invalid session startup event type`);let n=O(t,`startupToken`);if(n===``)throw Error(`Expected non-empty string field: startupToken`);return{type:`session.startup`,...N(`startupToken`,n),activity:sr(t.activity)}}function sr(e){let t=E(e);return{sessionId:Er(t,`sessionId`),phase:lr(t,`phase`),label:Er(t,`label`),...N(`detail`,O(t,`detail`)),at:Er(t,`at`),...N(`startup`,cr(t))}}function cr(e){let t=e.startup;if(t!==void 0){if(typeof t!=`boolean`)throw Error(`Expected optional boolean field: startup`);return t}}function lr(e,t){let n=D(e,t);if(n!==`active`&&n!==`idle`&&n!==`error`)throw Error(`Expected session activity phase field: ${t}`);return n}function ur(e){let t=E(e),n=M(t,`completedAt`,64),r=new Date(n);if(!Number.isFinite(r.getTime())||r.toISOString()!==n)throw Error(`Invalid canonical session unread completion time`);return{sessionId:M(t,`sessionId`,512),cwd:M(t,`cwd`,Rt),completionOrder:mr(t,`completionOrder`),completedAt:n}}function dr(e){let t=e.map(e=>JSON.stringify([e.sessionId,e.cwd]));if(new Set(t).size!==t.length)throw Error(`Duplicate session unread identity`);let n=e.map(e=>e.completionOrder);if(new Set(n).size!==n.length)throw Error(`Duplicate session unread completion order`)}function fr(e){for(let t=1;t<e.length;t+=1){let n=e[t-1],r=e[t];if(n===void 0||r===void 0||n.completionOrder<=r.completionOrder)throw Error(`Session unread summaries are not newest-first`)}}function M(e,t,n){let r=Er(e,t);if(r.length>n)throw Error(`String field exceeds limit: ${t}`);return r}function pr(e,t,n){let r=O(e,t);if(r!==void 0){if(r===``)throw Error(`Expected non-empty string field: ${t}`);if(r.length>n)throw Error(`String field exceeds limit: ${t}`);return r}}function mr(e,t){let n=Dr(e,t);if(n===0)throw Error(`Expected positive safe integer field: ${t}`);return n}function hr(e){let t=E(e),n=_r(t.summary),r=wr(t.notifications,vr,100,`notifications`);if(Or(r),kr(r),n.retainedCount!==r.length)throw Error(`Notification snapshot retained count mismatch`);if(n.highestSeverity!==jr(r))throw Error(`Notification snapshot severity mismatch`);let i=yr(t.dismissThrough),a=r[0]?.order??0;if(i.order!==a)throw Error(`Notification snapshot dismiss cutoff mismatch`);if(i.overflowWatermark<n.discardedCount)throw Error(`Notification snapshot overflow cutoff mismatch`);return{daemonInstanceId:Er(t,`daemonInstanceId`),catalogRevision:Dr(t,`catalogRevision`),summary:n,notifications:r,dismissThrough:i}}function gr(e){let t=E(e);if(t.type!==`notifications.inbox`)throw Error(`Invalid notification inbox event type`);let n=_r(t.summary),r=yr(t.dismissThrough);if(r.overflowWatermark<n.discardedCount)throw Error(`Notification event overflow cutoff mismatch`);let i=br(t.delta);if(i.kind===`cleared`&&!Ar(n))throw Error(`Notification clear event summary mismatch`);if(i.kind===`added`&&n.retainedCount===0)throw Error(`Notification add event summary mismatch`);return{type:`notifications.inbox`,daemonInstanceId:Er(t,`daemonInstanceId`),catalogRevision:Dr(t,`catalogRevision`),summary:n,dismissThrough:r,delta:i}}function _r(e){let t=E(e),n=Dr(t,`retainedCount`);if(n>100)throw Error(`Notification retained count exceeds limit`);let r=Dr(t,`discardedCount`),i=Sr(t.highestSeverity);if(n===0!=(i===void 0))throw Error(`Notification summary severity mismatch`);return{sessionId:Er(t,`sessionId`),cwd:Er(t,`cwd`),inboxRevision:Dr(t,`inboxRevision`),retainedCount:n,discardedCount:r,...i===void 0?{}:{highestSeverity:i}}}function vr(e){let t=E(e),n=D(t,`message`);if(new TextEncoder().encode(n).byteLength>8192)throw Error(`Notification message exceeds byte limit`);let r=D(t,`receivedAt`);if(!Number.isFinite(Date.parse(r)))throw Error(`Invalid notification receive time`);let i=Dr(t,`order`);if(i===0)throw Error(`Invalid notification order`);return{id:Er(t,`id`),message:n,truncated:A(t,`truncated`),severity:xr(t.severity),receivedAt:r,order:i}}function yr(e){let t=E(e);return{order:Dr(t,`order`),overflowWatermark:Dr(t,`overflowWatermark`)}}function br(e){let t=E(e);switch(t.kind){case`added`:{let e=O(t,`evictedNotificationId`);return{kind:`added`,notification:vr(t.notification),...e===void 0?{}:{evictedNotificationId:e}}}case`dismissed`:{let e=wr(t.notificationIds,Tr,100,`notificationIds`);if(new Set(e).size!==e.length)throw Error(`Duplicate dismissed notification id`);return{kind:`dismissed`,notificationIds:e}}case`cleared`:return{kind:`cleared`,reason:Cr(t.reason)};case`resync`:return{kind:`resync`};default:throw Error(`Invalid notification inbox delta`)}}function xr(e){if(e!==`info`&&e!==`warning`&&e!==`error`)throw Error(`Invalid notification severity`);return e}function Sr(e){return e===void 0?void 0:xr(e)}function Cr(e){switch(e){case`runtime-close`:case`archive`:case`delete`:case`restore`:case`archive-reconcile`:case`replacement`:case`initialization-failed`:case`service-dispose`:return e;default:throw Error(`Invalid notification clear reason`)}}function wr(e,t,n,r){if(!Array.isArray(e))throw Error(`Expected array field: ${r}`);if(e.length>n)throw Error(`Array field exceeds limit: ${r}`);return e.map(t)}function Tr(e){if(typeof e!=`string`||e===``)throw Error(`Expected non-empty string`);return e}function Er(e,t){let n=D(e,t);if(n===``)throw Error(`Expected non-empty string field: ${t}`);return n}function Dr(e,t){let n=e[t];if(typeof n!=`number`||!Number.isSafeInteger(n)||n<0)throw Error(`Expected non-negative safe integer field: ${t}`);return n}function Or(e){if(new Set(e.map(e=>e.id)).size!==e.length)throw Error(`Duplicate notification id`);if(new Set(e.map(e=>e.order)).size!==e.length)throw Error(`Duplicate notification order`)}function kr(e){for(let t=1;t<e.length;t+=1){let n=e[t-1],r=e[t];if(n===void 0||r===void 0||n.order<=r.order)throw Error(`Notifications are not newest-first`)}}function Ar(e){return e.retainedCount===0&&e.discardedCount===0}function jr(e){let t;for(let n of e){if(n.severity===`error`)return`error`;n.severity===`warning`?t=`warning`:t??=`info`}return t}function Mr(e){let t=E(e),n=t.skippedBusySessionIds===void 0?void 0:ln(t.skippedBusySessionIds,`skippedBusySessionIds`);return{generatedAt:D(t,`generatedAt`),thresholds:Lr(t.thresholds),projects:j(Rr)(t.projects),totals:zr(t.totals),...n===void 0?{}:{skippedBusySessionIds:n}}}function Nr(e){let t=E(e);return{...Mr(t),archivedSessionIds:ln(t.archivedSessionIds,`archivedSessionIds`),deletedSessionIds:ln(t.deletedSessionIds,`deletedSessionIds`)}}function Pr(e){let t=E(e);if(t.archived!==!0)throw Error(`Expected bulk archived response`);return{archived:!0,archivedSessionIds:ln(t.archivedSessionIds,`archivedSessionIds`),failures:j(Ir)(t.failures),generatedAt:D(t,`generatedAt`)}}function Fr(e){let t=E(e);if(t.deleted!==!0)throw Error(`Expected bulk deleted response`);return{deleted:!0,deletedSessionIds:ln(t.deletedSessionIds,`deletedSessionIds`),failures:j(Ir)(t.failures),generatedAt:D(t,`generatedAt`)}}function Ir(e){let t=E(e);return{sessionId:D(t,`sessionId`),error:D(t,`error`)}}function Lr(e){let t=E(e);return{...N(`archiveIdleDays`,Ma(t,`archiveIdleDays`)),...N(`deleteArchivedDays`,Ma(t,`deleteArchivedDays`))}}function Rr(e){let t=E(e);return{cwd:D(t,`cwd`),archiveCount:k(t,`archiveCount`),deleteCount:k(t,`deleteCount`)}}function zr(e){let t=E(e);return{archiveCount:k(t,`archiveCount`),deleteCount:k(t,`deleteCount`)}}function Br(e){let t=E(e),n=D(t,`kind`);if(n!==`steer`&&n!==`followUp`)throw Error(`Invalid queued message kind`);return{kind:n,text:D(t,`text`)}}function Vr(e){let t=E(e);return{input:k(t,`input`),output:k(t,`output`),cacheRead:k(t,`cacheRead`),cacheWrite:k(t,`cacheWrite`),total:k(t,`total`)}}function Hr(e){let t=E(e);return{...N(`provider`,O(t,`provider`)),...N(`id`,O(t,`id`)),...N(`name`,O(t,`name`)),...N(`contextWindow`,Ma(t,`contextWindow`)),...N(`reasoning`,t.reasoning)}}function Ur(e){return e===void 0?{}:{model:Hr(e)}}function Wr(e){let t=E(e);return{models:j(Hr)(t.models)}}function Gr(e){if(typeof e!=`string`)throw Error(`Invalid thinking level`);return e}function Kr(e){let t=E(e);return{levels:j(Gr)(t.levels)}}function qr(e){if(e!==`oauth`&&e!==`api_key`)throw Error(`Invalid auth type`);return e}function Jr(e){if(e!==`stored`&&e!==`runtime`&&e!==`environment`&&e!==`fallback`&&e!==`models_json_key`&&e!==`models_json_command`)throw Error(`Invalid auth status source`);return e}function Yr(e){let t=E(e),n=t.source===void 0?void 0:Jr(t.source);return{configured:A(t,`configured`),...N(`source`,n),...N(`label`,O(t,`label`))}}function Xr(e){let t=E(e),n=t.loginFlow;if(n!==void 0&&n!==`interactive`)throw Error(`Invalid auth provider login flow`);return{id:D(t,`id`),name:D(t,`name`),authType:qr(t.authType),status:Yr(t.status),...n===void 0?{}:{loginFlow:n}}}function Zr(e){let t=E(e);return{providers:j(Xr)(t.providers)}}function Qr(e){let t=E(e);return{flowId:D(t,`flowId`),providerId:D(t,`providerId`),providerName:D(t,`providerName`),status:$r(t.status),progress:j(e=>{if(typeof e!=`string`)throw Error(`Expected progress item string`);return e})(t.progress),...N(`error`,O(t,`error`)),...N(`auth`,ei(t.auth)),...N(`prompt`,ni(t.prompt)),...N(`select`,ii(t.select)),...N(`info`,ai(t.info))}}function $r(e){if(e!==`running`&&e!==`complete`&&e!==`error`&&e!==`cancelled`)throw Error(`Invalid OAuth flow status`);return e}function ei(e){if(e===void 0)return;let t=E(e);return{url:D(t,`url`),...N(`instructions`,O(t,`instructions`)),...N(`deviceCode`,ti(t.deviceCode))}}function ti(e){if(e===void 0)return;let t=E(e);return{userCode:D(t,`userCode`),...N(`intervalSeconds`,Ma(t,`intervalSeconds`)),...N(`expiresInSeconds`,Ma(t,`expiresInSeconds`))}}function ni(e){if(e===void 0)return;let t=E(e),n=D(t,`kind`);if(n!==`prompt`&&n!==`manual`)throw Error(`Invalid OAuth prompt kind`);let r=t.promptType===void 0?n===`manual`?`manual_code`:`text`:ri(t.promptType);return{requestId:D(t,`requestId`),message:D(t,`message`),kind:n,promptType:r,...N(`placeholder`,O(t,`placeholder`)),...N(`allowEmpty`,ja(t,`allowEmpty`))}}function ri(e){if(e!==`text`&&e!==`secret`&&e!==`manual_code`)throw Error(`Invalid OAuth prompt type`);return e}function ii(e){if(e===void 0)return;let t=E(e);return{requestId:D(t,`requestId`),message:D(t,`message`),options:j(va)(t.options)}}function ai(e){if(e!==void 0)return j(e=>{let t=E(e);return{message:D(t,`message`),...N(`links`,t.links===void 0?void 0:j(oi)(t.links))}})(e)}function oi(e){let t=E(e);return{url:D(t,`url`),...N(`label`,O(t,`label`))}}function si(e){if(e===void 0)return{};let t=E(e);return{contextUsage:{tokens:Na(t,`tokens`),contextWindow:k(t,`contextWindow`),percent:Na(t,`percent`)}}}function ci(e){let t=E(e),n=D(t,`source`);if(n!==`extension`&&n!==`prompt`&&n!==`skill`&&n!==`builtin`)throw Error(`Invalid command source`);return{name:D(t,`name`),source:n,...N(`description`,O(t,`description`))}}function li(e){let t=E(e),n=D(t,`kind`);if(n!==`tracked`&&n!==`untracked`&&n!==`other`)throw Error(`Invalid file kind`);return{path:D(t,`path`),kind:n}}function ui(e){let t=E(e);return{path:D(t,`path`),entries:j(di)(t.entries),scannedAt:D(t,`scannedAt`),truncated:A(t,`truncated`)}}function di(e){let t=E(e),n=D(t,`type`);if(n!==`file`&&n!==`directory`&&n!==`symlink`)throw Error(`Invalid file tree entry type`);return{name:D(t,`name`),path:D(t,`path`),type:n,...N(`size`,Ma(t,`size`)),...N(`modifiedAt`,O(t,`modifiedAt`))}}function fi(e){let t=E(e),n=D(t,`encoding`);if(n!==`utf8`)throw Error(`Invalid file encoding`);return{path:D(t,`path`),...N(`language`,O(t,`language`)),...N(`mediaType`,gi(t.mediaType)),...N(`mimeType`,O(t,`mimeType`)),encoding:n,size:k(t,`size`),modifiedAt:D(t,`modifiedAt`),content:D(t,`content`),truncated:A(t,`truncated`),binary:A(t,`binary`)}}function pi(e){let t=E(e);return{path:D(t,`path`),size:k(t,`size`),modifiedAt:D(t,`modifiedAt`),created:A(t,`created`)}}function mi(e){let t=E(e);return{path:D(t,`path`),existed:A(t,`existed`)}}function hi(e){let t=E(e);return{fromPath:D(t,`fromPath`),toPath:D(t,`toPath`),size:k(t,`size`),modifiedAt:D(t,`modifiedAt`)}}function gi(e){if(e!==void 0){if(e!==`image`)throw Error(`Invalid file media type`);return e}}function _i(e){let t=E(e);return{isGitRepo:A(t,`isGitRepo`),hash:D(t,`hash`),...N(`branch`,O(t,`branch`)),...N(`upstream`,O(t,`upstream`)),...N(`ahead`,Ma(t,`ahead`)),...N(`behind`,Ma(t,`behind`)),files:j(vi)(t.files),submodules:t.submodules===void 0?[]:ln(t.submodules,`submodules`)}}function vi(e){let t=E(e);return{path:D(t,`path`),...N(`oldPath`,O(t,`oldPath`)),index:yi(t.index),workingTree:yi(t.workingTree),...N(`submoduleFromCommit`,O(t,`submoduleFromCommit`)),...N(`submoduleToCommit`,O(t,`submoduleToCommit`))}}function yi(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 Error(`Invalid git file state`)}}function bi(e){let t=E(e);return{...N(`path`,O(t,`path`)),staged:A(t,`staged`),hash:D(t,`hash`),diff:D(t,`diff`),truncated:A(t,`truncated`)}}function xi(e){let t=E(e);return{id:D(t,`id`),cwd:D(t,`cwd`),name:D(t,`name`),createdAt:D(t,`createdAt`),exited:A(t,`exited`),...N(`exitCode`,Ma(t,`exitCode`)),...N(`commandRunId`,O(t,`commandRunId`))}}function Si(e){let t=E(e);return{id:D(t,`id`),origin:D(t,`origin`),projectId:D(t,`projectId`),workspaceId:D(t,`workspaceId`),terminalId:D(t,`terminalId`),title:D(t,`title`),command:D(t,`command`),status:Ci(t.status),...N(`exitCode`,Ma(t,`exitCode`)),createdAt:D(t,`createdAt`),...N(`startedAt`,O(t,`startedAt`)),...N(`completedAt`,O(t,`completedAt`)),metadata:wi(t.metadata,`metadata`)}}function Ci(e){if(e!==`queued`&&e!==`running`&&e!==`succeeded`&&e!==`failed`)throw Error(`Invalid terminal command run status`);return e}function wi(e,t){let n=E(e);return Object.fromEntries(Object.entries(n).map(([e,n])=>{if(typeof n!=`string`)throw Error(`Expected string record field: ${t}.${e}`);return[e,n]}))}function Ti(e){let t=E(e);return{cwd:D(t,`cwd`),hasSessionActivity:A(t,`hasSessionActivity`),hasTerminalActivity:A(t,`hasTerminalActivity`),updatedAt:D(t,`updatedAt`)}}function Ei(e){let t=E(e);return{workspaces:j(Ti)(t.workspaces),generatedAt:D(t,`generatedAt`)}}function Di(e){let t=E(e);return{path:D(t,`path`),exists:A(t,`exists`),config:Oi(t.config),effectiveConfig:Oi(t.effectiveConfig),envOverrides:Ri(t.envOverrides)}}function Oi(e){let t=E(e);return{...N(`host`,O(t,`host`)),...N(`port`,Ma(t,`port`)),...N(`allowedHosts`,Ai(t.allowedHosts)),...N(`shortcuts`,Ii(t.shortcuts)),...N(`plugins`,Li(t.plugins)),...N(`pathAccess`,ji(t.pathAccess)),...N(`uploads`,Ni(t.uploads)),...N(`maxUploadBytes`,Ma(t,`maxUploadBytes`)),...N(`agent`,ki(t.agent)),...N(`spawnSessions`,ja(t,`spawnSessions`)),...N(`subsessions`,ja(t,`subsessions`)),...N(`askUser`,ja(t,`askUser`))}}function ki(e){if(e!==void 0){if(!sn(e)||Array.isArray(e))throw Error(`Invalid PI WEB agent field`);return{...N(`command`,O(e,`command`)),...N(`dir`,O(e,`dir`))}}}function Ai(e){if(e!==void 0){if(e===!0)return!0;if(Pi(e))return e;throw Error(`Invalid PI WEB allowedHosts field`)}}function ji(e){if(e===void 0)return;if(!sn(e))throw Error(`Invalid PI WEB pathAccess field`);let t=e.allowedPaths;return{...N(`allowedPaths`,Mi(t,`pathAccess.allowedPaths`))}}function Mi(e,t){if(e!==void 0){if(Fi(e))return e;throw Error(`Invalid PI WEB ${t} field`)}}function Ni(e){if(e!==void 0){if(!sn(e)||Array.isArray(e))throw Error(`Invalid PI WEB uploads field`);return{...N(`defaultFolder`,O(e,`defaultFolder`))}}}function Pi(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function Fi(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`&&e!==``)}function Ii(e){if(e!==void 0){if(!sn(e)||Array.isArray(e))throw Error(`Invalid PI WEB shortcuts field`);return Object.fromEntries(Object.entries(e).map(([e,t])=>{if(t!==null&&(typeof t!=`string`||t===``))throw Error(`Invalid PI WEB shortcut field`);return[e,t]}))}}function Li(e){if(e!==void 0){if(!sn(e)||Array.isArray(e))throw Error(`Invalid PI WEB plugins field`);return Object.fromEntries(Object.entries(e).map(([e,t])=>{if(!sn(t)||Array.isArray(t))throw Error(`Invalid PI WEB plugin config field`);let n=t.enabled;if(n!==void 0&&typeof n!=`boolean`)throw Error(`Invalid PI WEB plugin enabled field`);let r=t.settings;if(r!==void 0&&(!sn(r)||Array.isArray(r)))throw Error(`Invalid PI WEB plugin settings field`);return[e,t]}))}}function Ri(e){let t=E(e);return{host:A(t,`host`),port:A(t,`port`),allowedHosts:A(t,`allowedHosts`),spawnSessions:A(t,`spawnSessions`),subsessions:A(t,`subsessions`),askUser:ja(t,`askUser`)??!1,agentCommand:ja(t,`agentCommand`)??!1,agentDir:ja(t,`agentDir`)??!1,...zi(t),agentSessionDir:ja(t,`agentSessionDir`)??!1}}function zi(e){let t=e.agentDirSource;if(t===void 0)return{};if(t!==`pi-web`&&t!==`pi-compatibility`)throw Error(`Invalid PI WEB agentDirSource field`);return{agentDirSource:t}}function Bi(e){let t=E(e);return{packages:j(Hi)(t.packages)}}function Vi(e){let t=E(e),n=O(t,`source`),r=t.scope===void 0?void 0:Ui(t.scope),i=Ji(t.removed,`removed`);return{action:Wi(t.action),...N(`source`,n),...N(`scope`,r),...N(`removed`,i),packages:j(Hi)(t.packages)}}function Hi(e){let t=E(e);return{source:D(t,`source`),scope:Ui(t.scope),filtered:A(t,`filtered`),...N(`installedPath`,O(t,`installedPath`))}}function Ui(e){if(e!==`user`&&e!==`project`)throw Error(`Invalid Pi package scope`);return e}function Wi(e){if(e!==`install`&&e!==`remove`&&e!==`update`)throw Error(`Invalid Pi package mutation action`);return e}function Gi(e){let t=E(e);return{plugins:j(Ki)(t.plugins)}}function Ki(e){let t=E(e);return{id:D(t,`id`),module:D(t,`module`),source:D(t,`source`),scope:qi(t.scope),machineSpecific:Ji(t.machineSpecific,`machineSpecific`)??!1,enabled:A(t,`enabled`)}}function qi(e){if(e!==`bundled`&&e!==`local`&&e!==`user`&&e!==`project`)throw Error(`Invalid PI WEB plugin scope`);return e}function Ji(e,t){if(e!==void 0){if(typeof e!=`boolean`)throw Error(`Expected optional boolean field: ${t}`);return e}}function Yi(e,t){if(e!==void 0){if(typeof e!=`number`||!Number.isInteger(e)||e<0)throw Error(`Expected optional count field: ${t}`);return e===0?void 0:e}}function Xi(e){let t=E(e);return{packageName:D(t,`packageName`),generatedAt:D(t,`generatedAt`),components:Qi(t.components),release:ra(t.release),commands:ia(t.commands),messages:j(aa)(t.messages)}}function Zi(e){let t=E(e);return{packageName:D(t,`packageName`),generatedAt:D(t,`generatedAt`),components:$i(t.components),capabilities:sa(t.capabilities)}}function Qi(e){let t=E(e);return{web:ta(t.web),sessiond:ta(t.sessiond)}}function $i(e){let t=E(e);return{web:ea(t.web),sessiond:ea(t.sessiond)}}function ea(e){let t=E(e),n=oa(t.component),r=t.activeAgentProfile,i=r===void 0?void 0:Xt(r);if(r!==void 0&&(n!==`sessiond`||i===void 0))throw Error(`Invalid active agent profile descriptor`);return{component:n,label:D(t,`label`),...N(`runtimeVersion`,O(t,`runtimeVersion`)),available:A(t,`available`),capabilities:sa(t.capabilities),...N(`activeAgentProfile`,i),...N(`error`,O(t,`error`))}}function ta(e){let t=E(e);return{component:oa(t.component),label:D(t,`label`),...N(`runtimeVersion`,O(t,`runtimeVersion`)),...N(`installedVersion`,O(t,`installedVersion`)),stale:A(t,`stale`),available:A(t,`available`),...N(`installation`,na(t.installation)),...N(`error`,O(t,`error`))}}function na(e){if(e===void 0)return;let t=E(e),n=D(t,`kind`);if(n!==`pi-package`&&n!==`npm-global`&&n!==`local`&&n!==`docker`&&n!==`unknown`)throw Error(`Invalid PI WEB installation kind`);let r=t.scope;if(r!==void 0&&r!==`user`&&r!==`project`)throw Error(`Invalid PI WEB installation scope`);let i=t.dockerMode;if(i!==void 0&&i!==`runtime`&&i!==`dev`)throw Error(`Invalid PI WEB Docker mode`);return{kind:n,...N(`path`,O(t,`path`)),...N(`source`,O(t,`source`)),...r===void 0?{}:{scope:r},...N(`npmRoot`,O(t,`npmRoot`)),...i===void 0?{}:{dockerMode:i}}}function ra(e){let t=E(e);return{packageName:D(t,`packageName`),...N(`latestVersion`,O(t,`latestVersion`)),updateAvailable:A(t,`updateAvailable`),...N(`checkedAt`,O(t,`checkedAt`)),...t.skipped===!0?{skipped:!0}:{},...N(`error`,O(t,`error`))}}function ia(e){let t=E(e);return{...N(`update`,O(t,`update`)),...N(`restart`,O(t,`restart`)),...N(`restartWeb`,O(t,`restartWeb`)),...N(`restartSessiond`,O(t,`restartSessiond`)),...N(`status`,O(t,`status`))}}function aa(e){let t=E(e);return{id:D(t,`id`),severity:ca(t.severity),title:D(t,`title`),body:D(t,`body`),...N(`command`,O(t,`command`))}}function oa(e){if(e!==`web`&&e!==`sessiond`)throw Error(`Invalid PI WEB service component`);return e}function sa(e){let t=on(e);if(t===void 0)throw Error(`Invalid PI WEB capabilities`);return t}function ca(e){if(e!==`info`&&e!==`warning`&&e!==`error`)throw Error(`Invalid PI WEB status severity`);return e}function la(e){let t=E(e),n=D(t,`type`);if(n===`unsupported`)return{type:n,message:D(t,`message`)};if(n===`select`)return{type:n,requestId:D(t,`requestId`),title:D(t,`title`),options:j(va)(t.options)};if(n===`tree`)return{type:n,tree:ua(t.tree)};if(n===`done`)return{type:n,...N(`message`,O(t,`message`)),...ya(t.session),...N(`promptDraft`,O(t,`promptDraft`))};throw Error(`Invalid command result type`)}function ua(e){let t=E(e),n=j(da)(t.nodes),r=new Set(n.map(e=>e.id));if(r.size!==n.length)throw Error(`Duplicate session tree node id`);let i=ha(t,`activeLeafId`);if(i!==null&&!r.has(i))throw Error(`Invalid session tree activeLeafId`);return{nodes:n,activeLeafId:i,activePathIds:_a(t.activePathIds,`activePathIds`)}}function da(e){let t=E(e);return{id:ga(t,`id`),parentId:ha(t,`parentId`),kind:fa(t.kind),summary:D(t,`summary`),...N(`timestamp`,O(t,`timestamp`)),...N(`label`,O(t,`label`))}}function fa(e){switch(e){case`user`:case`assistant`:case`tool-result`:case`bash`:case`custom-message`:case`compaction`:case`branch-summary`:case`model-change`:case`thinking-level-change`:case`session-info`:case`label`:case`custom`:case`other`:return e;default:throw Error(`Invalid session tree node kind`)}}function pa(e){let t=E(e),n=A(t,`cancelled`);if(Object.hasOwn(t,`summaryEntry`))throw Error(`Invalid session tree navigation result field: summaryEntry`);if(n){ma(t,`editorText`,`session tree cancellation result`);let e=t.aborted;if(e!==void 0&&typeof e!=`boolean`)throw Error(`Expected optional boolean field: aborted`);return{cancelled:n,...e===void 0?{}:{aborted:e}}}return ma(t,`aborted`,`session tree navigation result`),{cancelled:n,...N(`editorText`,O(t,`editorText`))}}function ma(e,t,n){if(Object.hasOwn(e,t))throw Error(`Invalid ${n} field: ${t}`)}function ha(e,t){let n=e[t];if(n!==null&&typeof n!=`string`)throw Error(`Expected string or null field: ${t}`);if(typeof n==`string`&&n.trim()===``)throw Error(`Expected non-blank string or null field: ${t}`);return n}function ga(e,t){let n=D(e,t);if(n.trim()===``)throw Error(`Expected non-blank string field: ${t}`);return n}function _a(e,t){let n=ln(e,t);if(n.some(e=>e.trim()===``))throw Error(`Expected non-blank string array field: ${t}`);return n}function va(e){let t=E(e);return{value:D(t,`value`),label:D(t,`label`),...N(`description`,O(t,`description`))}}function ya(e){return e===void 0?{}:{session:bn(e)}}function ba(e){if(E(e).accepted!==!0)throw Error(`Expected accepted response`);return{accepted:!0}}function xa(e){let t=E(e);return j(Sa)(t.attachments)}function Sa(e){let t=E(e);return{path:D(t,`path`),mimeType:D(t,`mimeType`),size:k(t,`size`)}}function Ca(e){if(E(e).closed!==!0)throw Error(`Expected closed response`);return{closed:!0}}function wa(e){if(E(e).aborted!==!0)throw Error(`Expected aborted response`);return{aborted:!0}}function Ta(e){if(E(e).stopped!==!0)throw Error(`Expected stopped response`);return{stopped:!0}}function Ea(e){let t=E(e);if(t.archived!==!0)throw Error(`Expected archived response`);let n=t.sessionIds===void 0?void 0:ln(t.sessionIds,`sessionIds`),r=Ma(t,`archivedCount`),i=Ma(t,`skippedAlreadyArchivedCount`);return{archived:!0,...n===void 0?{}:{sessionIds:n},...r===void 0?{}:{archivedCount:r},...i===void 0?{}:{skippedAlreadyArchivedCount:i}}}function Da(e){if(E(e).restored!==!0)throw Error(`Expected restored response`);return{restored:!0}}function Oa(e){if(E(e).deleted!==!0)throw Error(`Expected deleted response`);return{deleted:!0}}function ka(e){if(E(e).detached!==!0)throw Error(`Expected detached response`);return{detached:!0}}function Aa(e){if(E(e).reloaded!==!0)throw Error(`Expected reloaded response`);return{reloaded:!0}}function ja(e,t){let n=e[t];if(n!==void 0){if(typeof n!=`boolean`)throw Error(`Invalid PI WEB ${t} field`);return n}}function Ma(e,t){let n=e[t];if(n!==void 0){if(typeof n!=`number`)throw Error(`Expected optional number field: ${t}`);return n}}function Na(e,t){let n=e[t];if(n===null)return null;if(typeof n!=`number`)throw Error(`Expected number|null field: ${t}`);return n}function N(e,t){return t===void 0?{}:{[e]:t}}function Pa(e,t,n,r){let i=new URLSearchParams;r?.path!==void 0&&i.set(`path`,r.path),r?.staged===!0&&i.set(`staged`,`true`);let a=i.toString();return`api/machines/${encodeURIComponent(e)}/projects/${encodeURIComponent(t)}/workspaces/${encodeURIComponent(n)}/git/diff${a?`?${a}`:``}`}function Fa(e,t,n=`local`){let r=new URLSearchParams({cwd:e.cwd});t?.limit!==void 0&&r.set(`limit`,String(t.limit)),t?.before!==void 0&&r.set(`before`,String(t.before));let i=r.toString();return`api/machines/${encodeURIComponent(n)}/sessions/${encodeURIComponent(e.id)}/messages?${i}`}function Ia(e,t,n,r){let i=new URLSearchParams({path:n});return r?.createDirs===!1&&i.set(`createDirs`,`false`),r?.overwrite===!1&&i.set(`overwrite`,`false`),Dt(yt(`${`api/machines/${encodeURIComponent(r?.machineId??`local`)}`}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file?${i.toString()}`))}function La(e,t,n,r){let i=new URLSearchParams;return i.set(`path`,n),r?.modifiedAt!==void 0&&i.set(`v`,r.modifiedAt),Dt(yt(`${`api/machines/${encodeURIComponent(r?.machineId??`local`)}`}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file/preview?${i.toString()}`))}function Ra(e,t,n,r){let i=new URLSearchParams;return i.set(`path`,n),Dt(yt(`${`api/machines/${encodeURIComponent(r?.machineId??`local`)}`}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file/download?${i.toString()}`))}var P=(e=`local`)=>`api/machines/${encodeURIComponent(e)}`;function za(e,t=`local`){return`${P(t)}/sessions/${encodeURIComponent(e.id)}`}function F(e,t,n=`local`){return`${za(e,n)}/${t}`}function Ba(e,t,n=`local`){return`${F(e,t,n)}${Ha(e)}`}function Va(e,t=`local`){return`${za(e,t)}${Ha(e)}`}function Ha(e){return`?${new URLSearchParams({cwd:e.cwd}).toString()}`}function I(e,t={}){return JSON.stringify({cwd:e.cwd,...t})}function Ua(e){return JSON.stringify({sessions:e})}function Wa(e,t){let n=new URLSearchParams;t.projectId!==void 0&&n.set(`projectId`,t.projectId);let r=n.toString();return`${P(t.machineId)}/auth/${e}${r===``?``:`?${r}`}`}function Ga(e){return e===`local`?`api/pi-web/status`:`${P(e)}/pi-web/status`}var Ka={piWebStatus:(e=`local`)=>w(Ga(e),Xi),checkForUpdates:(e=`local`)=>w(`${Ga(e)}?refresh=1`,Xi,{cache:`no-store`}),piWebRuntime:()=>w(`api/pi-web/runtime`,Zi)},qa={machines:()=>w(`api/machines`,dn),addMachine:e=>w(`api/machines`,fn,{method:`POST`,body:JSON.stringify(e)}),deleteMachine:e=>w(`api/machines/${encodeURIComponent(e)}`,e=>e,{method:`DELETE`}),health:e=>w(`api/machines/${encodeURIComponent(e)}/health`,pn),runtime:(e,t=!1)=>w(`api/machines/${encodeURIComponent(e)}/runtime${t?`?refresh=1`:``}`,mn,t?{cache:`no-store`}:{})};function Ja(e){return e===void 0?`api/config`:`${P(e)}/config`}function Ya(e){return e===void 0?`api/plugins`:`${P(e)}/plugins`}var Xa={config:e=>w(Ja(e),Di),saveConfig:(e,t)=>w(Ja(t),Di,{method:`PUT`,body:JSON.stringify({config:e})})},Za={status:()=>w(`api/normal-auth/status`,xn),setup:e=>w(`api/normal-auth/setup`,ba,{method:`POST`,body:JSON.stringify({password:e})}),login:e=>w(`api/normal-auth/login`,ba,{method:`POST`,body:JSON.stringify({password:e})}),changePassword:(e,t)=>w(`api/normal-auth/change-password`,ba,{method:`POST`,body:JSON.stringify({currentPassword:e,newPassword:t})})},Qa={plugins:e=>w(Ya(e),Gi)};function $a(e=``,t){let n=t===void 0?`api/pi-packages`:`${P(t)}/pi-packages`;return e===``?n:`${n}/${e}`}var eo={packages:e=>w($a(``,e),Bi),install:(e,t)=>{let n={source:e};return w($a(`install`,t),Vi,{method:`POST`,body:JSON.stringify(n)})},remove:(e,t,n)=>{let r=t===void 0?{source:e}:{source:e,scope:t};return w($a(`remove`,n),Vi,{method:`POST`,body:JSON.stringify(r)})},update:(e,t)=>{let n=e===void 0?void 0:{source:e};return w($a(`update`,t),Vi,{method:`POST`,...n===void 0?{}:{body:JSON.stringify(n)}})}},to={workspaceActivity:(e=`local`)=>w(`${P(e)}/activity`,Ei)},no={projects:(e=`local`)=>w(`${P(e)}/projects`,j(_n)),addProject:(e,t,n,r=`local`)=>w(`${P(r)}/projects`,_n,{method:`POST`,body:JSON.stringify({path:e,name:t,create:n})}),closeProject:(e,t=`local`)=>w(`${P(t)}/projects/${encodeURIComponent(e)}`,Ca,{method:`DELETE`}),projectDirectories:(e,t=`local`)=>w(`${P(t)}/project-directories?q=${encodeURIComponent(e)}`,j(li))};function ro(e,t,n,r,i,a=`local`){let o=new URLSearchParams({path:n});i?.createDirs===!1&&o.set(`createDirs`,`false`),i?.overwrite===!1&&o.set(`overwrite`,`false`);let s=r instanceof Uint8Array,c=s?new Uint8Array(r):new TextEncoder().encode(r);return w(`${P(a)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file?${o.toString()}`,pi,{method:`PUT`,body:c,headers:{"Content-Type":s?`application/octet-stream`:`text/plain`}})}var io={workspaces:(e,t=`local`)=>w(`${P(t)}/projects/${encodeURIComponent(e)}/workspaces`,j(vn)),deleteWorkspace:(e,t,n=`local`)=>w(`${P(n)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}`,Si,{method:`DELETE`}),workspaceTree:(e,t,n=``,r=`local`)=>w(`${P(r)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/tree?path=${encodeURIComponent(n)}`,ui),workspaceFile:(e,t,n,r=`local`)=>w(`${P(r)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file?path=${encodeURIComponent(n)}`,fi),optionalWorkspaceFile:(e,t,n,r=`local`)=>Pt(`${P(r)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file?path=${encodeURIComponent(n)}&optional=true`,fi),createWorkspaceFile:(e,t,n,r=`local`)=>ro(e,t,n,new Uint8Array,void 0,r),writeWorkspaceFile:ro,deleteWorkspaceFile:(e,t,n,r=`local`)=>{let i=new URLSearchParams({path:n});return w(`${P(r)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file?${i.toString()}`,mi,{method:`DELETE`})},moveWorkspaceFile:(e,t,n,r,i,a=`local`)=>{let o=new URLSearchParams({fromPath:n,toPath:r});return i?.createDirs===!1&&o.set(`createDirs`,`false`),i?.overwrite===!0&&o.set(`overwrite`,`true`),w(`${P(a)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/file/move?${o.toString()}`,hi,{method:`POST`})},createWorkspaceDirectory:(e,t,n,r=`local`)=>w(`${P(r)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/directory`,Sn,{method:`POST`,body:JSON.stringify({path:n})}),moveWorkspaceDirectory:(e,t,n,r,i=`local`)=>w(`${P(i)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/directory`,Sn,{method:`PATCH`,body:JSON.stringify({fromPath:n,toPath:r})}),deleteWorkspaceDirectory:(e,t,n,r=`local`)=>w(`${P(r)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/directory?path=${encodeURIComponent(n)}`,Cn,{method:`DELETE`}),downloadWorkspaceFile:(e,t,n,r=`local`)=>uo(e,t,n,r)},ao={sessions:(e,t=`local`)=>w(`${P(t)}/sessions?cwd=${encodeURIComponent(e)}`,j(bn)),search:(e,t,n=`local`)=>w(`${P(n)}/sessions/search?${new URLSearchParams({cwd:e,q:t}).toString()}`,j(bn)),searchContent:(e,t,n=`local`)=>w(`${P(n)}/sessions/search-content?${new URLSearchParams({cwd:e,q:t}).toString()}`,En),pinned:(e,t=`local`)=>w(`${P(t)}/sessions/pins?cwd=${encodeURIComponent(e)}`,wn),pin:(e,t=`local`)=>w(`${za(e,t)}/pin`,Tn,{method:`PUT`,body:I(e)}),unpin:(e,t=`local`)=>w(`${za(e,t)}/pin${Ha(e)}`,Tn,{method:`DELETE`}),unreadCatalog:(e=`local`)=>w(`${P(e)}/sessions/unread`,ir,{cache:`no-store`}),acknowledgeUnread:(e,t,n,r=`local`)=>{let i={cwd:e.cwd,catalogId:t,throughCompletionOrder:n};return w(F(e,`unread/acknowledge`,r),ir,{method:`POST`,body:JSON.stringify(i)})},notificationInbox:(e,t=`local`)=>w(Ba(e,`notifications`,t),hr),dismissNotification:(e,t,n,r=`local`)=>w(F(e,`notifications/dismiss`,r),hr,{method:`POST`,body:I(e,{daemonInstanceId:t,notificationId:n})}),dismissAllNotifications:(e,t,n,r=`local`)=>w(F(e,`notifications/dismiss-all`,r),hr,{method:`POST`,body:I(e,{daemonInstanceId:t,throughOrder:n.order,throughOverflowWatermark:n.overflowWatermark})}),startSession:(e,t=`local`,n)=>w(`${P(t)}/sessions`,bn,{method:`POST`,body:JSON.stringify(n===void 0?{cwd:e}:{cwd:e,startupToken:n})}),cleanupPreview:(e,t=`local`)=>w(`${P(t)}/sessions/cleanup/preview`,Mr,{method:`POST`,body:JSON.stringify(e)}),cleanup:(e,t=`local`)=>w(`${P(t)}/sessions/cleanup`,Nr,{method:`POST`,body:JSON.stringify(e)}),archiveMany:(e,t=`local`)=>w(`${P(t)}/sessions/bulk/archive`,Pr,{method:`POST`,body:Ua(e)}),deleteArchivedMany:(e,t=`local`)=>w(`${P(t)}/sessions/bulk/delete-archived`,Fr,{method:`POST`,body:Ua(e)}),messages:(e,t,n=`local`)=>w(Fa(e,t,n),un),status:(e,t=`local`)=>w(Ba(e,`status`,t),nr),streamSnapshot:(e,t=`local`)=>w(Ba(e,`stream-snapshot`,t),rr),models:(e,t=`local`)=>w(Ba(e,`models`,t),Wr),setModel:(e,t,n,r=`local`)=>w(F(e,`model`,r),nr,{method:`POST`,body:I(e,{provider:t,modelId:n})}),cycleModel:(e,t,n=`local`)=>w(F(e,`model/cycle`,n),nr,{method:`POST`,body:I(e,{direction:t})}),thinkingLevels:(e,t=`local`)=>w(Ba(e,`thinking-levels`,t),Kr),setThinkingLevel:(e,t,n=`local`)=>w(F(e,`thinking-level`,n),nr,{method:`POST`,body:I(e,{level:t})}),cycleThinkingLevel:(e,t=`local`)=>w(F(e,`thinking-level/cycle`,t),nr,{method:`POST`,body:I(e)}),commands:(e,t=`local`)=>w(Ba(e,`commands`,t),j(ci)),prompt:(e,t,n,r=`local`,i)=>w(F(e,`prompt`,r),ba,{method:`POST`,body:I(e,{text:t,...n===void 0?{}:{streamingBehavior:n},...i!==void 0&&i.length>0?{attachments:i}:{}})}),saveAttachments:(e,t,n=`local`,r)=>w(F(e,`attachments`,n),xa,{method:`POST`,body:I(e,{attachments:t,...r===void 0?{}:{folder:r}})}),shell:(e,t,n=`local`)=>w(F(e,`shell`,n),ba,{method:`POST`,body:I(e,{text:t})}),runCommand:(e,t,n=`local`)=>w(F(e,`commands/run`,n),la,{method:`POST`,body:I(e,{text:t})}),respondToCommand:(e,t,n,r=`local`)=>w(F(e,`commands/respond`,r),la,{method:`POST`,body:I(e,{requestId:t,value:n})}),navigateTree:(e,t,n=`local`)=>w(F(e,`tree/navigate`,n),pa,{method:`POST`,body:I(e,{targetId:t.targetId,expectedLeafId:t.expectedLeafId,summary:t.summary})}),abort:(e,t=`local`)=>w(F(e,`abort`,t),wa,{method:`POST`,body:I(e)}),stop:(e,t=`local`)=>w(F(e,`stop`,t),Ta,{method:`POST`,body:I(e)}),archive:(e,t=`local`)=>w(F(e,`archive`,t),Ea,{method:`POST`,body:I(e)}),archiveWithDescendants:(e,t=`local`)=>w(F(e,`archive-tree`,t),Ea,{method:`POST`,body:I(e)}),restore:(e,t=`local`)=>w(F(e,`restore`,t),Da,{method:`POST`,body:I(e)}),deleteArchived:(e,t=`local`)=>w(Va(e,t),Oa,{method:`DELETE`}),detachParent:(e,t=`local`)=>w(F(e,`detach-parent`,t),ka,{method:`POST`,body:I(e)}),reloadSession:(e,t=`local`)=>w(F(e,`reload`,t),Aa,{method:`POST`,body:I(e)}),clearQueue:(e,t=`local`)=>w(F(e,`queue/clear`,t),nr,{method:`POST`,body:I(e)}),dismissWarning:(e,t,n=`local`)=>w(F(e,`warnings/dismiss`,n),nr,{method:`POST`,body:I(e,{dismissId:t})}),submitAsk:(e,t,n,r=`local`)=>w(F(e,`ask/submit`,r),Un,{method:`POST`,body:I(e,{askId:t,answers:n.answers})}),cancelAsk:(e,t,n=`local`)=>w(F(e,`ask/cancel`,n),Un,{method:`POST`,body:I(e,{askId:t})}),answerDialog:(e,t,n,r=`local`)=>w(F(e,`dialogs/answer`,r),Wn,{method:`POST`,body:I(e,{dialogId:t,value:n})}),cancelDialog:(e,t,n=`local`)=>w(F(e,`dialogs/cancel`,n),Wn,{method:`POST`,body:I(e,{dialogId:t})}),authProviders:e=>{let t=new URLSearchParams;e.mode!==void 0&&t.set(`mode`,e.mode),e.authType!==void 0&&t.set(`authType`,e.authType),e.projectId!==void 0&&t.set(`projectId`,e.projectId);let n=t.toString();return w(`${P(e.machineId)}/auth/providers${n===``?``:`?${n}`}`,Zr)},saveApiKey:(e,t,n)=>w(Wa(`api-key`,n),ba,{method:`POST`,body:JSON.stringify({providerId:e,key:t})}),startInteractiveApiKeyLogin:(e,t)=>w(Wa(`api-key/interactive`,t),Qr,{method:`POST`,body:JSON.stringify({providerId:e})}),logoutProvider:(e,t)=>w(Wa(`logout`,t),ba,{method:`POST`,body:JSON.stringify({providerId:e})}),startOAuthLogin:(e,t)=>w(Wa(`oauth`,t),Qr,{method:`POST`,body:JSON.stringify({providerId:e})}),oauthFlow:(e,t)=>w(Wa(`oauth/${encodeURIComponent(e)}`,t),Qr),respondOAuthFlow:(e,t,n,r)=>w(Wa(`oauth/${encodeURIComponent(e)}/respond`,r),Qr,{method:`POST`,body:JSON.stringify({requestId:t,value:n})}),cancelOAuthFlow:(e,t)=>w(Wa(`oauth/${encodeURIComponent(e)}/cancel`,t),Qr,{method:`POST`})},oo={terminals:(e,t,n=`local`)=>w(`${P(n)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/terminals`,j(xi)),startTerminal:(e,t,n,r=`local`)=>w(`${P(r)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/terminals`,xi,{method:`POST`,body:JSON.stringify(n??{})}),closeWorkspaceTerminals:(e,t,n=`local`)=>w(`${P(n)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/terminals`,Ca,{method:`DELETE`}),closeTerminal:(e,t,n,r=`local`)=>w(`${P(r)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/terminals/${encodeURIComponent(n)}`,Ca,{method:`DELETE`}),continueTerminal:(e,t,n,r=`local`)=>w(`${P(r)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/terminals/${encodeURIComponent(n)}/continue`,xi,{method:`POST`}),runTerminalCommand:(e,t,n=`local`)=>w(`${P(n)}/projects/${encodeURIComponent(t.workspace.projectId)}/workspaces/${encodeURIComponent(t.workspace.id)}/terminal-command-runs`,Si,{method:`POST`,body:JSON.stringify({origin:e,title:t.title,command:t.command,metadata:t.metadata??{}})}),listCommandRuns:(e,t=`local`)=>w(`${P(t)}/terminal-command-runs${co(e)}`,j(Si)),getCommandRun:(e,t=`local`)=>so(e,t),cancelCommandRun:(e,t=`local`)=>w(`${P(t)}/terminal-command-runs/${encodeURIComponent(e)}/cancel`,Si,{method:`POST`})};async function so(e,t){return Pt(`${P(t)}/terminal-command-runs/${encodeURIComponent(e)}`,Si)}function co(e){if(e===void 0)return``;let 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));let n=t.toString();return n===``?``:`?${n}`}function lo(e){if(!fo(e))return;let t=e.error;return typeof t==`string`?t:void 0}async function uo(e,t,n,r){let i=await fetch(Ra(e,t,n,{machineId:r}));if(!i.ok){let e=await i.json().catch(()=>({}));throw Error(lo(e)??i.statusText)}let a=await i.blob(),o=URL.createObjectURL(a),s=document.createElement(`a`);s.href=o;let c=n.split(`/`).pop();s.download=c===void 0||c===``?`download`:c,document.body.append(s),s.click(),s.remove(),URL.revokeObjectURL(o)}function fo(e){return typeof e==`object`&&!!e}var po={files:(e,t,n={})=>{let r=new URLSearchParams({q:t});return n.kind!==void 0&&r.set(`kind`,n.kind),n.mode!==void 0&&r.set(`mode`,n.mode),n.scope!==void 0&&r.set(`scope`,n.scope),n.workspaceScoped===!0&&n.projectId!==void 0&&n.workspaceId!==void 0?w(`${P(n.machineId)}/projects/${encodeURIComponent(n.projectId)}/workspaces/${encodeURIComponent(n.workspaceId)}/files?${r.toString()}`,j(li)):(r.set(`cwd`,e),w(`${P(n.machineId)}/files?${r.toString()}`,j(li)))}},mo={gitStatus:(e,t,n=`local`)=>w(`${P(n)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/git/status`,_i),gitDiff:(e,t,n,r=`local`)=>w(Pa(r,e,t,n),bi)},L={...Ka,...qa,...Xa,...Za,...Qa,...eo,...to,...no,...io,...ao,...oo,...po,...mo};function ho(e,t=`local`,n=vt()){let r=typeof e==`string`?void 0:e.cwd,i=r===void 0||r===``?``:`?${new URLSearchParams({cwd:r}).toString()}`,a=typeof e==`string`?e:e.id,o=bt(`${vo(t)}/sessions/${encodeURIComponent(a)}/events${i}`,void 0,n);return new WebSocket(Ot(o))}function go(e,t,n,r,i=`local`){let a=r===void 0?``:`?${new URLSearchParams({cols:String(r.cols),rows:String(r.rows)}).toString()}`;return new WebSocket(Ot(`${vo(i)}/projects/${encodeURIComponent(e)}/workspaces/${encodeURIComponent(t)}/terminals/${encodeURIComponent(n)}/socket${a}`))}function _o(e=`local`,t=vt()){let n=bt(`${vo(e)}/events`,void 0,t);return new WebSocket(Ot(n))}function vo(e){return`api/machines/${encodeURIComponent(e)}`}var yo=`.pi-web/uploads`,bo=class extends Error{constructor(e=`工作区上传已取消`){super(e),this.name=`WorkspaceUploadCancelledError`}},xo=class extends Error{constructor(e,t){super(Mo(e)),this.name=`WorkspaceUploadBatchError`,this.failures=e.map(e=>({...e})),this.responses=t.map(e=>({...e}))}};function So(e){return e?.uploads?.defaultFolder??`.pi-web/uploads`}function Co(e,t){return e?.uploads?.defaultFolder??t}function wo(e,t){let n=Fo(e,`上传目标`,{allowEmpty:!0}),r=Fo(t,`上传文件名`,{allowEmpty:!1});return n===``?r:`${n}/${r}`}function To(e,t,n,r={}){let i=r.xhrFactory?.()??new XMLHttpRequest,a=!1,o=!1;return{promise:new Promise((s,c)=>{let l=e=>{a||(a=!0,c(e))},u=e=>{a||(a=!0,s(e))};i.open(`PUT`,Ia(e,t,n.path,Oo(r)),!0),i.responseType=`json`,i.setRequestHeader(`Content-Type`,(n.contentType??n.file.type)||`application/octet-stream`),i.upload.onprogress=e=>{r.onProgress?.(ko(e,n.file.size))},i.onload=()=>{if(i.status>=200&&i.status<300){try{r.onProgress?.({loaded:n.file.size,total:n.file.size,percent:1,lengthComputable:!0}),u(pi(Lo(i)))}catch(e){l(e instanceof Error?e:Error(String(e)))}return}l(Error(Ro(i)))},i.onerror=()=>{l(Error(`工作区上传失败`))},i.onabort=()=>{l(new bo(o?void 0:`工作区上传已中止`))},i.send(n.file)}),cancel:()=>{a||(o=!0,i.abort())}}}function Eo(e,t,n,r={}){let i=r.destinationFolder??`.pi-web/uploads`,a=n.map((e,t)=>({index:t,name:e.name,path:wo(i,e.name),loaded:0,total:e.size,percent:jo(0,e.size),lengthComputable:!0,done:!1})),o,s=0,c={requested:!1},l=()=>{r.onProgress?.(Ao(a,s,a.every(e=>e.done)))};return{promise:(async()=>{let i=[],u=[];for(let d=0;d<n.length;d+=1){if(c.requested)throw new bo;s=d;let f=n[d],p=a[d];if(!(f===void 0||p===void 0)){o=To(e,t,{path:p.path,file:f},{...Do(r),onProgress:e=>{p.total=e.total,p.loaded=Math.min(e.loaded,p.total),p.percent=e.percent,p.lengthComputable=e.lengthComputable,l()}});try{let e=await o.promise;p.loaded=p.total,p.percent=1,p.lengthComputable=!0,p.done=!0,i.push(e),l()}catch(e){if(Po(e,c))throw e;let t=No(e);p.loaded=p.total,p.percent=1,p.lengthComputable=!0,p.done=!0,p.error=t,u.push({index:d,name:f.name,path:p.path,error:t}),l()}finally{o=void 0}}}if(u.length>0)throw new xo(u,i);return i})(),cancel:()=>{c.requested=!0,o?.cancel()}}}function Do(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 Oo(e){return{...e.createDirs===void 0?{}:{createDirs:e.createDirs},...e.overwrite===void 0?{}:{overwrite:e.overwrite},...e.machineId===void 0?{}:{machineId:e.machineId}}}function ko(e,t){let n=e.lengthComputable?e.total:t;return{loaded:e.loaded,total:n,percent:jo(e.loaded,n),lengthComputable:e.lengthComputable}}function Ao(e,t,n){let r=e.reduce((e,t)=>e+t.total,0),i=e.reduce((e,t)=>e+t.loaded,0);return{currentFileIndex:t,files:e.map(e=>({...e})),loaded:i,total:r,percent:jo(i,r),done:n}}function jo(e,t){return t<=0?e<=0?0:1:Math.max(0,Math.min(1,e/t))}function Mo(e){return e.length===1?e[0]?.error??`工作区上传失败`:`${String(e.length)} 个文件上传失败`}function No(e){return e instanceof Error?e.message:String(e)}function Po(e,t){return t.requested||e instanceof bo}function Fo(e,t,n){let r=e.trim();if(r===``){if(n.allowEmpty)return``;throw Error(`${t}不能为空`)}if(Io(r))throw Error(`${t}必须是工作区相对路径`);let i=r.split(/[\\/]+/u).filter(e=>e!==``&&e!==`.`);if(i.length===0){if(n.allowEmpty)return``;throw Error(`${t}不能为空`)}if(i.some(e=>e===`..`))throw Error(`${t}不能包含路径穿越`);return i.join(`/`)}function Io(e){let t=e.replace(/\\/g,`/`);return t.startsWith(`/`)||/^[A-Za-z]:\//u.test(t)}function Lo(e){return e.response!==void 0&&e.response!==null&&e.response!==``?e.response:e.responseText===``?{}:JSON.parse(e.responseText)}function Ro(e){let t=zo(e);return Bo(t)&&typeof t.error==`string`?t.error:e.statusText||`HTTP ${String(e.status)}`}function zo(e){try{return Lo(e)}catch{return}}function Bo(e){return typeof e==`object`&&!!e}function Vo(){return{sessions:[],pinnedSessionIds:[],sessionSearchQuery:``,sessionSearchResults:void 0,isSearchingSessions:!1,sessionSearchError:``,sessionSearchTarget:void 0,clientQueuedSessionMessages:{},startingSessionCount:0,selectedNotificationInbox:void 0,treeDialog:void 0,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 Ho(){return{machines:[],selectedMachine:void 0,isLoadingMachines:!1,machineStatuses:{},machineRuntimes:{},projects:[],workspaces:[],sessions:[],pinnedSessionIds:[],sessionSearchQuery:``,sessionSearchResults:void 0,isSearchingSessions:!1,sessionSearchError:``,sessionSearchTarget:void 0,messages:[],messagePageStart:0,messagePageEnd:0,messagePageTotal:0,isLoadingEarlierMessages:!1,sendingPrompts:{},clientQueuedSessionMessages:{},startingSessionCount:0,isLoadingProjects:!1,isLoadingWorkspaces:!1,selectedProject:void 0,selectedWorkspace:void 0,selectedSession:void 0,status:void 0,activity:void 0,pendingAsk:void 0,pendingDialogs:[],closedDialogs:[],availableThinkingLevels:[],sessionStatuses:{},sessionActivities:{},workspaceActivities:{},machineActivities:{},selectedNotificationInbox:void 0,workspacesByProjectId:{},workspaceDeletionRuns:{},commandDialog:void 0,treeDialog: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 Uo(e,t){return t?.phase===`active`&&t.startup!==!0||e?.isStreaming===!0||e?.isBashRunning===!0||e?.isCompacting===!0||(e?.pendingMessageCount??0)>0}function Wo(e){return e!==void 0&&(e.hasSessionActivity||e.hasTerminalActivity)}var Go=[`off`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`];function Ko(e){return Go.some(t=>t===e)}function qo(e){return e===void 0||e===``?`off`:e}function Jo(e){let t=qo(e);return Ko(t)?{off:`关闭`,minimal:`最低`,low:`低`,medium:`中`,high:`高`,xhigh:`极高`,max:`最高`}[t]??t:t}function Yo(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)`;case`max`:return`最高推理(约 64k tokens)`;default:return}}function Xo(e,t){let n=t.length>=2?t:Go,r=n.length-1,i=qo(e),a=n.indexOf(i);return{total:r,filled:a<=0?0:Math.min(a,r)}}function Zo(e,t){return`${e}:${t}`}function Qo(e,t){return`${e}:${t}`}function R(e){return e.selectedMachine?.id??`local`}var $o=class{constructor(){this.pendingByKey=new Map}request(e,t){let n=this.pendingByKey.get(e);if(n!==void 0)return n.latestRefresh=t,n.started&&(n.trailing=!0),n.promise;let r={promise:Promise.resolve(),latestRefresh:t,started:!1,trailing:!1};return r.promise=Promise.resolve().then(async()=>{let e,t;do{r.trailing=!1;let n=r.latestRefresh;r.started=!0,t=!1;try{await n()}catch(n){e=n,t=!0}}while(this.hasTrailingRequest(r));if(t)throw e}).finally(()=>{this.pendingByKey.get(e)===r&&this.pendingByKey.delete(e)}),this.pendingByKey.set(e,r),r.promise}hasTrailingRequest(e){return e.trailing}},es=class{constructor(e,t,n={}){this.getState=e,this.setState=t,this.refreshes=new $o,this.api=n.api??to,this.onActivityApplied=n.onActivityApplied}refresh(e=R(this.getState())){return this.refreshes.request(e,async()=>{this.applyMachineActivitySnapshot(e,ts(await this.api.workspaceActivity(e)))})}applyWorkspaceActivity(e,t=R(this.getState())){let n=this.getState(),r=R(n)===t,i=ns(n.machineActivities[t]??(r?n.workspaceActivities:{}),e);this.setState({machineActivities:{...n.machineActivities,[t]:i},...r?{workspaceActivities:i}:{}}),this.onActivityApplied?.(t)}applyMachineActivitySnapshot(e,t){let n=this.getState();this.setState({machineActivities:{...n.machineActivities,[e]:t},...R(n)===e?{workspaceActivities:t}:{}}),this.onActivityApplied?.(e)}};function ts(e){let t={};for(let n of e.workspaces)Wo(n)&&(t[n.cwd]=n);return t}function ns(e,t){let n={...e};return Wo(t)?(n[t.cwd]=t,n):Object.fromEntries(Object.entries(n).filter(([e])=>e!==t.cwd))}var rs=class{constructor(e,t,n,r){this.getState=e,this.setState=t,this.applyStatus=n,this.oauthOperationGeneration=0,this.pollGeneration=0,this.api=r.api??L,this.pollIntervalMs=r.pollIntervalMs??1e3,this.scope=r.scope}dispose(){this.oauthOperationGeneration+=1,this.stopPolling()}handleSlashCommand(e){let t=ss(e);return t===void 0?!1:(t.command===`login`?this.openLogin(t.providerId):this.openLogout(t.providerId),!0)}async openLogin(e){let t=this.captureTarget();if(t!==void 0){if(e!==void 0&&e!==``){await this.openLoginProvider(e,t);return}this.setState({authDialog:{step:`method`,target:t}})}}async chooseLoginMethod(e){let t=this.getState().authDialog;if(t?.step===`method`)try{let{providers:n}=await this.api.authProviders({mode:`login`,authType:e,...as(t.target)});this.setState({authDialog:{step:`providers`,mode:`login`,authType:e,providers:n,target:t.target}})}catch(e){this.setState({error:String(e)})}}async selectLoginProvider(e,t){let n=this.getState().authDialog;if(n?.step!==`providers`)return;let r=n.providers.find(n=>n.id===e&&(t===void 0||n.authType===t));r!==void 0&&(r.authType===`oauth`||r.loginFlow===`interactive`?await this.startOAuth(r,n.target):this.setState({authDialog:{step:`apiKey`,provider:r,value:``,target:n.target}}))}updateApiKey(e){let t=this.getState().authDialog;if(t?.step!==`apiKey`)return;let n={...t};delete n.error,this.setState({authDialog:{...n,value:e}})}async saveApiKey(){let e=this.getState().authDialog;if(e?.step!==`apiKey`)return;let t=e.value.trim();if(t===``){this.setState({authDialog:{...e,error:`必须填写 API key`}});return}let n={...e};delete n.error,this.setState({authDialog:{...n,saving:!0}});try{let n=e.target;await this.api.saveApiKey(e.provider.id,t,n),this.closeDialog(),this.refreshStatus(n)}catch(t){this.setState({authDialog:{...e,saving:!1,error:String(t)}})}}async openLogout(e){let t=this.captureTarget();if(t!==void 0)try{let{providers:n}=await this.api.authProviders({mode:`logout`,...as(t)});if(e!==void 0&&e!==``){let r=n.find(t=>t.id===e);r!==void 0&&!this.rejectRemoteOAuth(`logout`,r,t)?await this.logoutProviderForTarget(r.id,t):r===void 0&&this.setState({error:`没有 ${e} 的已保存凭据`});return}this.setState({authDialog:{step:`logout`,providers:n,target:t}})}catch(e){this.setState({error:String(e)})}}async logoutProvider(e){let t=this.getState().authDialog;if(t?.step!==`logout`)return;let n=t.providers.find(t=>t.id===e);n===void 0||this.rejectRemoteOAuth(`logout`,n,t.target)||await this.logoutProviderForTarget(e,t.target)}async logoutProviderForTarget(e,t){try{await this.api.logoutProvider(e,t),this.closeDialog(),this.refreshStatus(t)}catch(e){this.setState({error:String(e)})}}updateOAuthInput(e){let t=this.getState().authDialog;if(t?.step!==`oauth`)return;let n={...t};delete n.error,this.setState({authDialog:{...n,inputValue:e}})}async respondOAuth(e){let t=this.getState().authDialog;if(t?.step!==`oauth`)return;let n=t.flow.prompt??t.flow.select;if(n===void 0)return;let r=this.oauthOperationGeneration,i=t.flow.flowId,a=n.requestId,o=e??t.inputValue??``,s={...t};delete s.error,this.setState({authDialog:{...s,responding:!0}});try{let e=await this.api.respondOAuthFlow(t.flow.flowId,n.requestId,o,t.target);this.updateOAuthFlow(e,t.target)}catch(e){let t=this.currentOAuthDialog(r,i);if(t===void 0||os(t.flow)!==a)return;this.setState({authDialog:{...t,responding:!1,error:String(e)}})}}async cancelOAuth(){let e=this.getState().authDialog;if(e?.step!==`oauth`){this.closeDialog();return}let t=e.flow.flowId,n=e.target;this.closeDialog();try{await this.api.cancelOAuthFlow(t,n)}catch{}}closeDialog(){this.oauthOperationGeneration+=1,this.stopPolling(),this.setState({authDialog:void 0})}async openLoginProvider(e,t){try{let{providers:n}=await this.api.authProviders({mode:`login`,...as(t)}),r=n.filter(t=>t.id===e);if(r.length===0){this.setState({error:`找不到认证提供商:${e}`});return}if(r.length>1){this.setState({authDialog:{step:`providers`,mode:`login`,providers:r,target:t}});return}let i=r[0];if(i===void 0)return;i.authType===`oauth`||i.loginFlow===`interactive`?await this.startOAuth(i,t):this.setState({authDialog:{step:`apiKey`,provider:i,value:``,target:t}})}catch(e){this.setState({error:String(e)})}}async startOAuth(e,t){if(this.rejectRemoteOAuth(`login`,e,t))return;let n=++this.oauthOperationGeneration;this.stopPolling();try{let r=e.authType===`oauth`?await this.api.startOAuthLogin(e.id,t):await this.api.startInteractiveApiKeyLogin(e.id,t);if(n!==this.oauthOperationGeneration){if(r.status===`running`)try{await this.api.cancelOAuthFlow(r.flowId,t)}catch{}return}this.updateOAuthFlow(r,t),r.status===`running`&&this.startPolling(r.flowId,t)}catch(e){n===this.oauthOperationGeneration&&this.setState({error:String(e)})}}rejectRemoteOAuth(e,t,n){let r=this.getState().selectedMachine;if(t.authType!==`oauth`||n.machineKind!==`remote`)return!1;let i=r?.baseUrl??`对应的远程 PI WEB 实例`,a=e===`login`?`登录`:`退出`;return this.setState({error:`远程机器的 OAuth ${a}必须直接在 ${i} 上配置。`}),!0}updateOAuthFlow(e,t){if(e.status===`complete`){this.stopPolling(),this.closeDialog(),this.refreshStatus(t);return}(e.status===`error`||e.status===`cancelled`)&&(this.oauthOperationGeneration+=1,this.stopPolling());let n=this.getState().authDialog,r=n?.step===`oauth`&&n.flow.flowId===e.flowId?n.inputValue??``:``,i=n?.step===`oauth`?os(n.flow):void 0,a=os(e),o=i!==void 0&&i===a,s=o?r:``,c=o&&n?.step===`oauth`?n.responding===!0:!1;this.setState({authDialog:{step:`oauth`,flow:e,inputValue:s,responding:c,target:t}})}startPolling(e,t){this.stopPolling();let n=this.oauthOperationGeneration,r=this.pollGeneration;this.pollTimer=window.setInterval(()=>{this.poll(e,t,n,r)},this.pollIntervalMs)}stopPolling(){this.pollGeneration+=1,this.pollTimer!==void 0&&(window.clearInterval(this.pollTimer),this.pollTimer=void 0)}async poll(e,t,n,r){if(r!==this.pollGeneration)return;let i=this.currentOAuthDialog(n,e);if(i===void 0||!is(i.target,t)){this.stopPolling();return}let a=os(i.flow);try{this.updateOAuthFlow(await this.api.oauthFlow(e,i.target),i.target)}catch(i){let o=this.currentOAuthDialog(n,e);if(r!==this.pollGeneration||o===void 0||!is(o.target,t)||os(o.flow)!==a)return;this.stopPolling(),this.setState({authDialog:{...o,error:String(i)}})}}currentOAuthDialog(e,t){if(e!==this.oauthOperationGeneration)return;let n=this.getState().authDialog;return n?.step===`oauth`&&n.flow.flowId===t?n:void 0}async refreshStatus(e){let t=this.selectedSessionForMachine(e.machineId);if(t!==void 0&&this.targetStillSelected(e))try{this.applyStatus(await this.api.status(t,e.machineId))}catch{}}selectedSessionForMachine(e){let t=this.getState();if(R(t)!==e)return;let n=t.selectedSession;if(!(n===void 0||n.archived===!0))return n}captureTarget(){let e=this.getState(),t=e.selectedMachine,n={machineId:R(e),...t?.kind===void 0?{}:{machineKind:t.kind}};if(this.scope===`management`)return n;let r=e.selectedProject;if(r===void 0){this.setState({error:`请先选择项目,再配置提供商认证。`});return}return{...n,projectId:r.id,projectName:r.name}}targetStillSelected(e){return R(this.getState())===e.machineId?e.projectId===void 0||this.getState().selectedProject?.id===e.projectId:!1}};function is(e,t){return e.machineId===t.machineId&&e.projectId===t.projectId}function as(e){return e.projectId===void 0?{machineId:e.machineId}:{machineId:e.machineId,projectId:e.projectId,...e.projectName===void 0?{}:{projectName:e.projectName}}}function os(e){return e.prompt?.requestId??e.select?.requestId}function ss(e){let t=e.trim(),n=/^\/(login|logout)(?:\s+(\S+))?\s*$/u.exec(t);if(n===null)return;let r=n[1];if(r!==`login`&&r!==`logout`)return;let i=n[2];return i===void 0||i===``?{command:r}:{command:r,providerId:i}}function cs(e){return e.replaceAll(`:`,`.`)}function ls(e){let t=new URLSearchParams(window.location.search),n=`${e}--`,r={};for(let[e,i]of t.entries()){if(!e.startsWith(n))continue;let t=e.slice(n.length),a=r[t];a===void 0?r[t]=i:Array.isArray(a)?a.push(i):r[t]=[a,i]}return r}function us(e,t){let n=ls(e)[t];return Array.isArray(n)?n[0]:n===``?void 0:n}function ds(e,t,n,r){let i=new URL(window.location.href),a=`${e}--${t}`;if(i.searchParams.delete(a),n!=null&&n!==``)if(Array.isArray(n))for(let e of n)i.searchParams.append(a,String(e));else i.searchParams.set(a,String(n));fs(i,r)}function fs(e,t){`${e.pathname}${e.search}${e.hash}`!=`${window.location.pathname}${window.location.search}${window.location.hash}`&&(t?.replace===!0?window.history.replaceState({},``,e):window.history.pushState({},``,e))}function ps(e){let t=e.files.map((t,n)=>{let r=t.size;return{index:n,name:t.name,path:wo(e.destinationFolder,t.name),size:t.size,loaded:0,total:r,percent:ys(0,r),lengthComputable:!0,status:n===0?`uploading`:`pending`}}),n=t.reduce((e,t)=>e+t.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:n,percent:ys(0,n),status:`uploading`,startedAt:e.startedAt}}function ms(e,t){let n=new Map(t.files.map(e=>[e.index,e])),r=e.files.map(e=>{let r=n.get(e.index);if(r===void 0)return e;let i={...e,path:r.path,loaded:r.loaded,total:r.total,percent:r.percent,lengthComputable:r.lengthComputable,status:r.error===void 0?r.done?`completed`:t.currentFileIndex===e.index?`uploading`:e.status:`error`};return r.error===void 0?delete i.error:i.error=r.error,i});return{...e,files:r,currentFileIndex:t.currentFileIndex,loaded:t.loaded,total:t.total,percent:t.percent}}function hs(e,t,n){let r=e.files.map((e,n)=>{let r=t[n];return{...e,...r===void 0?{}:{path:r.path,response:r},loaded:e.total,percent:1,lengthComputable:!0,status:`completed`}}),i=vs(r);return{...e,files:r,currentFileIndex:r.length===0?-1:r.length-1,...i,status:`completed`,completedAt:n}}function gs(e,t,n){let r=e.files.map(n=>n.status===`completed`||n.status===`error`?n:n.status===`uploading`||n.index===e.currentFileIndex?{...n,status:`error`,error:t}:{...n,status:`cancelled`,error:`因前面的文件上传失败而未上传。`});return{...e,files:r,...vs(r),status:`error`,error:t,completedAt:n}}function _s(e,t){let n=`上传已取消`,r=e.files.map(e=>e.status===`completed`||e.status===`error`?e:{...e,status:`cancelled`,error:n});return{...e,files:r,...vs(r),status:`cancelled`,error:n,completedAt:t}}function vs(e){let t=e.reduce((e,t)=>e+t.total,0);return{loaded:t,total:t,percent:e.length===0?0:1}}function ys(e,t){return t<=0?e<=0?0:1:Math.max(0,Math.min(1,e/t))}var bs=cs(`core:workspace.files`),xs=class{constructor(e,t,n,r={}){this.getState=e,this.setState=t,this.updateUrl=n,this.uploadTasks=new Map,this.uploadBatchSequence=0,this.api=r.api??L,this.uploadWorkspaceFiles=r.uploadWorkspaceFiles??Eo,this.createUploadBatchId=r.createUploadBatchId??(()=>(this.uploadBatchSequence+=1,`workspace-upload-${String(this.uploadBatchSequence)}`)),this.now=r.now??(()=>new Date().toISOString())}async refreshFiles(){let e=this.getState().selectedProject,t=this.getState().selectedWorkspace;if(!(e===void 0||t===void 0))try{let n=R(this.getState()),r=await this.api.workspaceTree(e.id,t.id,``,n),i=await Promise.all(Object.keys(this.getState().expandedDirs).map(async r=>{try{return[r,(await this.api.workspaceTree(e.id,t.id,r,n)).entries]}catch(e){if(Ss(e))return;throw e}})),a=Object.fromEntries(i.filter(e=>e!==void 0));this.setState({fileTree:r.entries,expandedDirs:a,fileTreeStale:!1,error:``})}catch(e){this.setState({error:String(e)})}}async expandDir(e){let t=this.getState().selectedProject,n=this.getState().selectedWorkspace;if(!(t===void 0||n===void 0)){if(this.getState().expandedDirs[e]!==void 0){this.setState({expandedDirs:Ts(this.getState().expandedDirs,e)});return}try{let r=await this.api.workspaceTree(t.id,n.id,e,R(this.getState()));this.setState({expandedDirs:{...this.getState().expandedDirs,[e]:r.entries},error:``})}catch(e){this.setState({error:String(e)})}}}async selectFile(e){this.setState({selectedFilePath:e,selectedFileContent:void 0,workspaceTool:`core:workspace.files`,mainView:this.getState().mainView===`chat`?`chat`:`core:workspace.files`}),ds(bs,`file`,e),this.updateUrl({replace:!0}),await this.restoreFile(e)}selectDirectory(e){this.setState({selectedFilePath:e,selectedFileContent:void 0,workspaceTool:`core:workspace.files`,mainView:this.getState().mainView===`chat`?`chat`:`core:workspace.files`}),ds(bs,`file`,void 0,{replace:!0}),this.updateUrl({replace:!0})}async restoreFile(e){let t=this.getState().selectedProject,n=this.getState().selectedWorkspace;if(!(t===void 0||n===void 0)){this.setState({selectedFilePath:e,selectedFileContent:void 0});try{let r=await this.api.workspaceFile(t.id,n.id,e,R(this.getState()));this.getState().selectedFilePath===e&&this.setState({selectedFileContent:r,error:``})}catch(t){if(this.getState().selectedFilePath!==e)return;if(Ss(t)){this.setState({selectedFilePath:void 0,selectedFileContent:void 0,error:``}),ds(bs,`file`,void 0,{replace:!0}),this.updateUrl({replace:!0});return}this.setState({error:String(t)})}}}async createFile(e){let t=this.getState().selectedProject,n=this.getState().selectedWorkspace;if(!(t===void 0||n===void 0||e===``))try{await this.api.createWorkspaceFile(t.id,n.id,e,R(this.getState())),await this.refreshFiles(),await this.selectFile(e),this.setState({error:``})}catch(e){this.setState({error:String(e)})}}async createDirectory(e){let t=this.getState().selectedProject,n=this.getState().selectedWorkspace;if(!(t===void 0||n===void 0||e===``))try{await this.api.createWorkspaceDirectory(t.id,n.id,e,R(this.getState())),await this.refreshFiles(),this.selectDirectory(e),this.setState({error:``})}catch(e){this.setState({error:String(e)})}}async moveSelectedPath(e){let t=this.getState().selectedProject,n=this.getState().selectedWorkspace,r=this.getState().selectedFilePath;if(!(t===void 0||n===void 0||r===void 0||r===``||e===``))try{let i=R(this.getState());Es(this.getState())===`directory`?(await this.api.moveWorkspaceDirectory(t.id,n.id,r,e,i),await this.refreshFiles(),this.selectDirectory(e)):(await this.api.moveWorkspaceFile(t.id,n.id,r,e,void 0,i),await this.refreshFiles(),await this.selectFile(e)),this.setState({error:``})}catch(e){this.setState({error:String(e)})}}async deleteSelectedPath(){let e=this.getState().selectedProject,t=this.getState().selectedWorkspace,n=this.getState().selectedFilePath;if(!(e===void 0||t===void 0||n===void 0||n===``))try{let r=R(this.getState());Es(this.getState())===`directory`?await this.api.deleteWorkspaceDirectory(e.id,t.id,n,r):await this.api.deleteWorkspaceFile(e.id,t.id,n,r),await this.refreshFiles(),this.clearSelection(),this.setState({error:``})}catch(e){this.setState({error:String(e)})}}async downloadSelectedFile(){let e=this.getState().selectedProject,t=this.getState().selectedWorkspace,n=this.getState().selectedFilePath;if(!(e===void 0||t===void 0||n===void 0||n===``||Es(this.getState())===`directory`))try{await this.api.downloadWorkspaceFile(e.id,t.id,n,R(this.getState())),this.setState({error:``})}catch(e){this.setState({error:String(e)})}}clearSelection(){this.setState({selectedFilePath:void 0,selectedFileContent:void 0}),ds(bs,`file`,void 0,{replace:!0}),this.updateUrl({replace:!0})}startWorkspaceUpload(e,t){let n=this.getState().selectedProject,r=this.getState().selectedWorkspace;if(n===void 0||r===void 0){this.setState({error:`上传文件前请选择工作区。`});return}if(e.length===0)return;let i=R(this.getState()),a=t.overwrite??!1,o=t.createDirs??!0,s;try{s=ps({id:this.createUploadBatchId(),projectId:n.id,workspaceId:r.id,machineId:i,destinationFolder:t.destinationFolder,overwrite:a,createDirs:o,files:e,startedAt:this.now()})}catch(e){this.setState({error:String(e)});return}this.setUploadBatch(s);let c;try{c=this.uploadWorkspaceFiles(n.id,r.id,e,{destinationFolder:t.destinationFolder,machineId:i,overwrite:a,createDirs:o,onProgress:e=>{this.updateUploadProgress(s.id,e)}})}catch(e){return this.failUploadBatch(s.id,e),{batchId:s.id,done:Promise.resolve()}}this.uploadTasks.set(s.id,c);let l=c.promise.then(async e=>{await this.completeUploadBatch(s.id,e,t)}).catch(async e=>{await this.handleUploadFailure(s.id,e,t)}).finally(()=>{this.uploadTasks.delete(s.id)});return{batchId:s.id,done:l}}cancelWorkspaceUpload(e){let t=this.getUploadBatch(e);t?.status===`uploading`&&(this.setUploadBatch(_s(t,this.now())),this.uploadTasks.get(e)?.cancel())}clearWorkspaceUpload(e){this.uploadTasks.get(e)?.cancel(),this.uploadTasks.delete(e),this.setState({workspaceUploadBatches:Ts(this.getState().workspaceUploadBatches,e)})}updateUploadProgress(e,t){let n=this.getUploadBatch(e);n?.status===`uploading`&&this.setUploadBatch(ms(n,t))}async completeUploadBatch(e,t,n){let r=this.getUploadBatch(e);if(r?.status!==`uploading`||(this.setUploadBatch(hs(r,t,this.now()),{error:``}),!this.isCurrentWorkspaceBatch(r)))return;await this.refreshFiles();let i=t[0]?.path;n.selectUploadedFile!==!1&&i!==void 0&&this.isCurrentWorkspaceBatch(r)&&await this.selectFile(i)}async handleUploadFailure(e,t,n){let r=this.failUploadBatch(e,t);if(!(t instanceof xo)||t.responses.length===0||r===void 0||!this.isCurrentWorkspaceBatch(r))return;await this.refreshFiles();let i=t.responses[0]?.path;n.selectUploadedFile!==!1&&i!==void 0&&this.isCurrentWorkspaceBatch(r)&&await this.selectFile(i)}failUploadBatch(e,t){let n=this.getUploadBatch(e);if(n?.status!==`uploading`)return;if(Cs(t)){let e=_s(n,this.now());return this.setUploadBatch(e),e}let r=ws(t),i=gs(n,r,this.now());return this.setUploadBatch(i,{error:r}),i}getUploadBatch(e){return this.getState().workspaceUploadBatches[e]}setUploadBatch(e,t={}){this.setState({workspaceUploadBatches:{...this.getState().workspaceUploadBatches,[e.id]:e},...t})}isCurrentWorkspaceBatch(e){let t=this.getState();return t.selectedProject?.id===e.projectId&&t.selectedWorkspace?.id===e.workspaceId&&R(t)===e.machineId}};function Ss(e){let t=String(e);return t.includes(`Path does not exist`)||t.includes(`ENOENT`)||t.includes(`no such file or directory`)}function Cs(e){return e instanceof bo}function ws(e){return e instanceof Error?e.message:String(e)}function Ts(e,t){return Object.fromEntries(Object.entries(e).filter(([e])=>e!==t))}function Es(e){let t=e.selectedFilePath;return t===void 0?`file`:Ds(e.fileTree,e.expandedDirs,t)?.type===`directory`?`directory`:`file`}function Ds(e,t,n){let r=e.find(e=>e.path===n);if(r!==void 0)return r;for(let e of Object.values(t)){let t=e.find(e=>e.path===n);if(t!==void 0)return t}}var Os=cs(`core:workspace.git`),ks=class{constructor(e,t,n){this.getState=e,this.setState=t,this.updateUrl=n}dispose(){this.pollTimer!==void 0&&window.clearInterval(this.pollTimer),this.pollTimer=void 0}async refreshGit(){let e=this.getState().selectedProject,t=this.getState().selectedWorkspace;if(!(e===void 0||t===void 0))try{let n=await L.gitStatus(e.id,t.id,R(this.getState()));this.setState({gitStatus:n,gitStale:!1,error:``});let r=this.getState().selectedDiffPath;r!==void 0&&(n.files.some(e=>e.path===r)?await this.refreshDiff(r):(this.setState({selectedDiffPath:void 0,selectedDiff:void 0,selectedStagedDiff:void 0}),ds(Os,`diff`,void 0,{replace:!0})))}catch(e){this.setState({error:String(e)})}}async selectDiff(e){this.setState({selectedDiffPath:e,selectedDiff:void 0,selectedStagedDiff:void 0,workspaceTool:`core:workspace.git`,mainView:this.getState().mainView===`chat`?`chat`:`core:workspace.git`}),ds(Os,`diff`,e),this.updateUrl({replace:!0}),await this.refreshDiff(e)}async restoreDiff(e){this.setState({selectedDiffPath:e,selectedDiff:void 0,selectedStagedDiff:void 0}),await this.refreshDiff(e)}async refreshDiff(e){let t=this.getState().selectedProject,n=this.getState().selectedWorkspace;if(!(t===void 0||n===void 0))try{let[r,i]=await Promise.all([L.gitDiff(t.id,n.id,{path:e},R(this.getState())),L.gitDiff(t.id,n.id,{path:e,staged:!0},R(this.getState()))]);this.setState({selectedDiff:r,selectedStagedDiff:i,error:``})}catch(e){this.setState({error:String(e)})}}updatePolling(){this.dispose();let e=this.getState();(e.workspaceTool===`core:workspace.git`||e.mainView===`core:workspace.git`)&&(this.pollTimer=window.setInterval(()=>{this.refreshGit()},8e3))}},As=class{constructor(e,t,n,r){this.getState=e,this.setState=t,this.updateUrl=n,this.projects=r,this.runtimeRefreshSeqByMachine=new Map}async loadMachines(e){this.setState({error:``,isLoadingMachines:!0});try{let t=await L.machines(),n=await this.selectInitialMachine(t,e),r=new Set(t.map(e=>e.id));this.setState({machines:t,selectedMachine:n,machineActivities:Ms(this.getState().machineActivities,r),machineRuntimes:Ms(this.getState().machineRuntimes,r)}),this.refreshMachineHealthFor(t),this.refreshMachineRuntimeFor(t)}catch(e){this.setState({error:String(e)})}finally{this.setState({isLoadingMachines:!1})}}async selectMachine(e,t={}){this.getState().selectedMachine?.id!==e.id&&(this.setState({selectedMachine:e,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,...Vo()}),t.updateUrl!==!1&&this.updateUrl(),await this.projects.loadProjects(),this.refreshMachineHealth(e.id),this.refreshMachineRuntime(e.id))}async addMachine(e){this.setState({error:``});try{let t=await L.addMachine(e);return this.setState({machines:[...this.getState().machines.filter(e=>e.id!==t.id),t]}),await this.selectMachine(t),t}catch(e){this.setState({error:String(e)});return}}async deleteMachine(e=this.getState().selectedMachine,t={}){if(e!==void 0){if(e.kind===`local`){this.setState({error:`无法移除本地机器。`});return}try{let n=this.getState().selectedMachine?.id===e.id;await L.deleteMachine(e.id);let r=this.getState().machines.filter(t=>t.id!==e.id),i=r.find(e=>e.id===`local`)??r[0];return this.setState({machines:r,machineStatuses:js(this.getState().machineStatuses,e.id),machineRuntimes:js(this.getState().machineRuntimes,e.id),machineActivities:js(this.getState().machineActivities,e.id)}),n&&i!==void 0?(t.selectFallback===!1||await this.selectMachine(i),i):void 0}catch(e){this.setState({error:String(e)});return}}}async refreshMachineHealth(e=this.getState().selectedMachine?.id??`local`){try{let t=await L.health(e);return this.setState({machineStatuses:{...this.getState().machineStatuses,[t.machineId]:t}}),t}catch(e){this.setState({error:String(e)});return}}async refreshMachineRuntime(e=this.getState().selectedMachine?.id??`local`){let t=(this.runtimeRefreshSeqByMachine.get(e)??0)+1;this.runtimeRefreshSeqByMachine.set(e,t);try{let n=await L.runtime(e,!0);return this.runtimeRefreshSeqByMachine.get(e)===t?(this.setState({machineRuntimes:{...this.getState().machineRuntimes,[n.machineId]:n}}),n):void 0}catch(n){this.runtimeRefreshSeqByMachine.get(e)===t&&this.setState({error:String(n)});return}}async selectInitialMachine(e,t){let n=e.find(e=>e.id===(t??`local`));if(n===void 0)return this.localMachine(e);if(n.kind!==`remote`)return n;let r=await this.safeRemoteHealth(n);return this.setState({machineStatuses:{...this.getState().machineStatuses,[r.machineId]:r},...r.ok?{}:{error:`${n.name} 暂不可用,正在重新连接…`}}),n}async safeRemoteHealth(e){try{return await L.health(e.id)}catch(t){return{machineId:e.id,ok:!1,checkedAt:new Date().toISOString(),status:`offline`,error:t instanceof Error?t.message:String(t)}}}localMachine(e){return e.find(e=>e.id===`local`)??e[0]}async refreshMachineHealthFor(e){let t=await Promise.allSettled(e.map(e=>L.health(e.id))),n=Object.fromEntries(t.flatMap(e=>e.status===`fulfilled`?[[e.value.machineId,e.value]]:[]));Object.keys(n).length>0&&this.setState({machineStatuses:{...this.getState().machineStatuses,...n}})}async refreshMachineRuntimeFor(e){let t=await Promise.allSettled(e.map(e=>L.runtime(e.id))),n=Object.fromEntries(t.flatMap(e=>e.status===`fulfilled`?[[e.value.machineId,e.value]]:[]));Object.keys(n).length>0&&this.setState({machineRuntimes:{...this.getState().machineRuntimes,...n}})}};function js(e,t){return Object.fromEntries(Object.entries(e).filter(([e])=>e!==t))}function Ms(e,t){return Object.fromEntries(Object.entries(e).filter(([e])=>t.has(e)))}var Ns=class{constructor(e,t,n,r={}){this.getState=e,this.setState=t,this.workspaces=n,this.api=r.api??L,this.onProjectsApplied=r.onProjectsApplied}async loadProjects(){let e=R(this.getState());this.setState({error:``,isLoadingProjects:!0});try{let t=await this.api.projects(e);if(R(this.getState())!==e)return;let n=new Set(t.map(e=>e.id)),r=Object.fromEntries(Object.entries(this.getState().workspacesByProjectId).filter(([e])=>n.has(e)));this.setState({projects:t,workspacesByProjectId:r}),this.onProjectsApplied?.(e)}catch(t){R(this.getState())===e&&this.setState({error:String(t)})}finally{R(this.getState())===e&&this.setState({isLoadingProjects:!1})}}async addProject(e,t){if(e.trim()===``)return;let n=R(this.getState());try{let r=await this.api.addProject(e.trim(),void 0,t,n);if(R(this.getState())!==n)return;let i=this.getState().projects;this.setState({projects:[...i.filter(e=>e.id!==r.id),r],projectDialogOpen:!1}),this.onProjectsApplied?.(n),await this.workspaces.selectProject(r)}catch(e){R(this.getState())===n&&this.setState({error:String(e)})}}async closeProject(e){let t=R(this.getState());try{if(await this.api.closeProject(e,t),R(this.getState())!==t)return;this.workspaces.forgetProject(e);let n=this.getState();this.setState({projects:n.projects.filter(t=>t.id!==e)}),this.onProjectsApplied?.(t),n.selectedProject?.id===e&&this.workspaces.clearSelection()}catch(e){R(this.getState())===t&&this.setState({error:String(e)})}}};function Ps(e,t){return t[e.path]}function Fs(e){if(e?.hasSessionActivity===!0)return`session`;if(e?.hasTerminalActivity===!0)return`terminal`}function Is(e,t,n){return zs(Bs(e,t,n))}function Ls(e,t,n){return t.some(t=>t.projectId===e.id&&t.path===n)||n===e.path||n.startsWith(`${e.path}/`)}function Rs(e){return zs(Object.values(e??{}))}function zs(e){if(e.some(e=>e.hasSessionActivity))return`session`;if(e.some(e=>e.hasTerminalActivity))return`terminal`}function Bs(e,t,n){return Object.values(n).filter(n=>Ls(e,t,n.cwd))}var Vs=class{constructor(e,t,n={}){this.getState=e,this.setState=t,this.machineGeneration=0,this.activityMachineGeneration=-1,this.projectTopologyGeneration=0,this.nextCwdActivation=0,this.observedActiveCwds=new Set,this.cwdActivations=new Map,this.attemptedCwdActivations=new Map,this.api=n.api??io,this.onError=n.onError}handleActivityApplied(e){return R(this.getState())===e?(this.activityMachineGeneration=this.machineGeneration,this.reconcile(e)):Promise.resolve()}handleProjectsApplied(e){return R(this.getState())!==e||(this.projectTopologyGeneration+=1,this.attemptedCwdActivations.clear(),this.activePass=void 0,this.activityMachineGeneration!==this.machineGeneration)?Promise.resolve():this.reconcile(e)}handleSelectedMachineChanged(){this.machineGeneration+=1,this.projectTopologyGeneration+=1,this.observedActiveCwds.clear(),this.cwdActivations.clear(),this.attemptedCwdActivations.clear(),this.activePass=void 0}reconcile(e){let t=this.getState();if(R(t)!==e)return Promise.resolve();let n=this.syncActiveCwds(t),r=new Map([...n].filter(([e,n])=>!Hs(t.projects,t.workspacesByProjectId,e)&&this.attemptedCwdActivations.get(e)!==n)),i=this.activePass;if(i!==void 0)return(i.machineGeneration!==this.machineGeneration||i.projectTopologyGeneration!==this.projectTopologyGeneration||[...r].some(([e,t])=>i.cwdActivations.get(e)!==t))&&(i.trailingRequested=!0),i.promise;if(r.size===0||t.projects.length===0)return Promise.resolve();let a={machineGeneration:this.machineGeneration,projectTopologyGeneration:this.projectTopologyGeneration,machineId:e,projects:t.projects.map(e=>({id:e.id,path:e.path,startingWorkspaces:t.workspacesByProjectId[e.id]})),cwdActivations:r,trailingRequested:!1,promise:Promise.resolve()};return this.activePass=a,a.promise=this.runPass(a),a.promise}async runPass(e){if(await Promise.all(e.projects.map(async t=>{try{let n=await this.api.workspaces(t.id,e.machineId);this.applyProjectWorkspaces(e,t,n)}catch(n){this.isPassScopeCurrent(e)&&this.reportError({machineId:e.machineId,projectId:t.id,error:n})}})),this.activePass!==e)return;let t=this.getState(),n=this.syncActiveCwds(t);for(let[r,i]of e.cwdActivations)n.get(r)===i&&!Hs(t.projects,t.workspacesByProjectId,r)&&this.attemptedCwdActivations.set(r,i);let r=e.trailingRequested;this.activePass=void 0,r&&await this.reconcile(R(this.getState()))}applyProjectWorkspaces(e,t,n){if(this.activePass!==e||!this.isPassScopeCurrent(e))return;let r=this.getState();r.projects.find(e=>e.id===t.id)?.path===t.path&&r.workspacesByProjectId[t.id]===t.startingWorkspaces&&this.setState({workspacesByProjectId:{...r.workspacesByProjectId,[t.id]:n}})}isPassScopeCurrent(e){return e.machineGeneration===this.machineGeneration&&e.projectTopologyGeneration===this.projectTopologyGeneration&&R(this.getState())===e.machineId}syncActiveCwds(e){let t=new Set(Object.values(e.workspaceActivities).filter(Wo).map(e=>e.cwd));for(let e of this.observedActiveCwds)t.has(e)||(this.cwdActivations.delete(e),this.attemptedCwdActivations.delete(e));for(let e of t)this.observedActiveCwds.has(e)||(this.nextCwdActivation+=1,this.cwdActivations.set(e,this.nextCwdActivation),this.attemptedCwdActivations.delete(e));return this.observedActiveCwds=t,new Map([...t].map(e=>[e,this.cwdActivations.get(e)??0]))}reportError(e){if(this.onError!==void 0)try{this.onError(e)}catch{}}};function Hs(e,t,n){return e.some(e=>Ls(e,t[e.id]??[],n))}var Us=class{constructor(e,t,n={}){this.getState=e,this.setState=t,this.requestSequence=0,this.api=n.api??Ka,this.onRefreshError=n.onRefreshError??(()=>void 0)}async refresh(){let e=R(this.getState());if(this.pendingUpdateCheck?.machineId===e)return;let t=++this.requestSequence;try{let n=await this.api.piWebStatus(e);this.isCurrent(e,t)&&this.setState({piWebStatus:n})}catch(n){if(!this.isCurrent(e,t))return;this.setState({piWebStatus:void 0}),this.onRefreshError(e,n)}}checkForUpdates(){let e=R(this.getState()),t=this.pendingUpdateCheck;if(t?.machineId===e)return t.promise;let n=++this.requestSequence,r=this.api.checkForUpdates(e).then(t=>{this.isCurrent(e,n)&&(this.setState({piWebStatus:t}),Ws(t))}).catch(t=>{if(this.isCurrent(e,n))throw t}).finally(()=>{this.pendingUpdateCheck?.requestSequence===n&&(this.pendingUpdateCheck=void 0)});return this.pendingUpdateCheck={machineId:e,requestSequence:n,promise:r},r}isCurrent(e,t){return R(this.getState())===e&&t===this.requestSequence}};function Ws(e){if(e.release.error!==void 0)throw Error(`PI WEB 更新检查失败:${e.release.error}`);if(e.release.skipped===!0)throw Error(`由于离线或版本检查设置禁用了远程版本检查,已跳过 PI WEB 更新检查`)}var Gs=`pi-web:cached-new-sessions:v1`,Ks=`browserCachedNew`,qs=`local`;function Js(){try{return typeof localStorage>`u`?void 0:localStorage}catch{return}}function Ys(e,t=qs,n=Js()){if(e.messageCount!==0||e.archived===!0)return;let r=tc(n).filter(n=>n.id!==e.id||n.machineId!==t);nc([Xs(e,t),...r],n)}function Xs(e,t=qs){return{...e,browserCachedNew:!0,machineId:t}}function Zs(e,t=qs,n=Js()){nc(tc(n).filter(n=>n.id!==e||n.machineId!==t),n)}function Qs(e,t,n=qs,r=Js()){let i=new Set(t.map(e=>e.id)),a=tc(r),o=a.filter(e=>e.machineId!==n||!i.has(e.id));return o.length!==a.length&&nc(o,r),[...o.filter(t=>t.machineId===n&&t.cwd===e),...t]}function $s(e){return e!==void 0&&ic(e)&&e.browserCachedNew===!0}function ec(e){return{id:e.id,path:e.path,cwd:e.cwd,...e.persisted===void 0?{}:{persisted:e.persisted},...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:qs},...e.archived===!0?{archived:!0}:{},...e.archivedAt===void 0?{}:{archivedAt:e.archivedAt}}}function tc(e=Js()){try{let t=e?.getItem(Gs);if(t==null||t===``)return[];let n=JSON.parse(t);return Array.isArray(n)?n.flatMap(e=>rc(e)):[]}catch{return[]}}function nc(e,t=Js()){try{e.length===0?t?.removeItem(Gs):t?.setItem(Gs,JSON.stringify(e))}catch{}}function rc(e){if(!ac(e))return[];let t=oc(e,`id`),n=oc(e,`path`),r=oc(e,`cwd`),i=oc(e,`created`),a=oc(e,`modified`),o=oc(e,`firstMessage`),s=cc(e,`messageCount`);if(t===void 0||n===void 0||r===void 0||i===void 0||a===void 0||o===void 0||s!==0)return[];let c=sc(e,`name`),l=sc(e,`parentSessionPath`),u=sc(e,`machineId`)??qs;return[{id:t,path:n,cwd:r,...c===void 0?{}:{name:c},created:i,modified:a,messageCount:s,firstMessage:o,...l===void 0?{}:{parentSessionPath:l},machineId:u,browserCachedNew:!0}]}function ic(e){return Ks in e}function ac(e){return typeof e==`object`&&!!e}function oc(e,t){let n=e[t];return typeof n==`string`?n:void 0}function sc(e,t){let n=e[t];return n===void 0||typeof n!=`string`?void 0:n}function cc(e,t){let n=e[t];return typeof n==`number`?n:void 0}function lc(e,t){return jc(t===void 0?e.flatMap(mc):e.flatMap((e,n)=>mc(e).map(e=>({...e,transcriptIndex:t+n})))).filter(e=>e.parts.length>0)}function uc(e,t){return{role:e,parts:[{type:`text`,text:t}]}}function dc(e,t){let n=bc(t);return n===void 0?e:{...e,meta:n}}function fc(e,t,n){if(n===``)return e;let r=e.at(-1),i=r?.parts.at(-1);return r?.role===t&&i?.type===`text`?[...e.slice(0,-1),{...r,parts:[...r.parts.slice(0,-1),{...i,text:i.text+n}]}]:r?.role===t?[...e.slice(0,-1),{...r,parts:[...r.parts,{type:`text`,text:n}]}]:[...e,uc(t,n)]}function pc(e,t){if(t===``)return e;let n=e.at(-1),r=n?.parts.at(-1);return n?.role===`assistant`&&r?.type===`thinking`?[...e.slice(0,-1),{...n,parts:[...n.parts.slice(0,-1),{...r,text:r.text+t}]}]:n?.role===`assistant`?[...e.slice(0,-1),{...n,parts:[...n.parts,{type:`thinking`,text:t}]}]:[...e,{role:`assistant`,parts:[{type:`thinking`,text:t}]}]}function mc(e){if(gc(e))return[e];if(z(e,`role`)===`bashExecution`)return[dc(Cc(e),e)];let t=z(e,`role`),n=wc(t),r=Tc(zc(e,`content`),e),i=t===`toolResult`?Dc(z(e,`toolName`)??``,zc(e,`details`)):void 0,a=i===void 0?r:[...r,i],o=n===`user`?_c(a):void 0;if(o!==void 0)return o.map(t=>dc(t,e));let s=yc(e);if(n===`tool`)return[dc({role:n,parts:a,...s===void 0?{}:{source:s}},e)];let c=a.filter(e=>e.type!==`empty`),l=n===`assistant`&&c.length>0&&c.every(e=>e.type===`skillRead`)?`skill`:n,u=c.length>0?[dc({role:l,parts:c,...s===void 0?{}:{source:s}},e)]:[],d=hc(e);return d===void 0?u:[...u,dc(d,e)]}function hc(e){if(z(e,`role`)!==`assistant`||z(e,`stopReason`)!==`error`)return;let t=z(e,`errorMessage`)?.trim();return uc(`system`,`模型响应失败:${t===void 0||t===``?`模型返回了错误。`:t}`)}function gc(e){let t=z(e,`role`);return(t===`user`||t===`assistant`||t===`tool`||t===`system`||t===`bash`||t===`skill`)&&Array.isArray(zc(e,`parts`))}function _c(e){if(e.length!==1||e[0]?.type!==`text`)return;let t=vc(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 vc(e){let t=/^<skill name="([^"]+)" location="([^"]+)">\n([\s\S]*?)\n<\/skill>(?:\n\n([\s\S]+))?$/.exec(e);if(t===null)return;let n=t[4]?.trim();return{name:t[1]??`skill`,location:t[2]??``,content:t[3]??``,...n===void 0||n===``?{}:{userMessage:n}}}function yc(e){let t=z(e,`source`);if(t===`compaction`||t===`branch_summary`)return t}function bc(e){let t=xc(zc(e,`timestamp`)),n=Sc(e),r=z(e,`thinkingLevel`);if(!(t===void 0&&n===void 0&&(r===void 0||r===``)))return{...t===void 0?{}:{timestamp:t},...n===void 0?{}:{model:n},...r===void 0||r===``?{}:{thinkingLevel:r}}}function xc(e){if(typeof e==`number`&&Number.isFinite(e))return new Date(e).toISOString();if(typeof e!=`string`||e===``)return;let t=Date.parse(e);return Number.isFinite(t)?new Date(t).toISOString():void 0}function Sc(e){if(z(e,`role`)!==`assistant`)return;let t=z(e,`provider`),n=z(e,`model`),r=z(e,`responseModel`);if(!((t===void 0||t===``)&&(n===void 0||n===``)&&(r===void 0||r===``)))return{...t===void 0||t===``?{}:{provider:t},...n===void 0||n===``?{}:{id:n},...r===void 0||r===``?{}:{responseId:r}}}function Cc(e){let t=z(e,`command`)??``,n=Bc(e,`excludeFromContext`)===!0?[`已从上下文中排除`,``,`$ ${t}`]:[`$ ${t}`],r=zc(e,`output`);r!=null&&n.push(``,Hc(r));let i=zc(e,`exitCode`);i!=null&&n.push(``,`退出码 ${Hc(i)}`),Bc(e,`cancelled`)===!0&&n.push(``,`已取消`),Bc(e,`truncated`)===!0&&n.push(``,`输出已截断`);let a=z(e,`fullOutputPath`);return a!==void 0&&a!==``&&n.push(``,`完整输出:${a}`),{role:`bash`,parts:[{type:`text`,text:n.join(`
|
|
4
4
|
`)}]}}function wc(e){return e===`assistant`?`assistant`:e===`user`?`user`:e===`toolResult`?`tool`:`system`}function Tc(e,t){let n=Ec(t);return n===void 0?typeof e==`string`?e===``?[]:[{type:`text`,text:e}]:Array.isArray(e)?e.flatMap(e=>{let t=z(e,`type`),n=z(e,`text`);if(t===`text`)return n!==void 0&&n!==``?[{type:`text`,text:n}]:[];if(t===`thinking`){let t=z(e,`thinking`)??n;return t!==void 0&&t!==``?[{type:`thinking`,text:t}]:[]}if(t===`toolCall`){let t=z(e,`name`)??`tool`,n=zc(e,`arguments`),r=z(e,`id`),i=t===`read`?Ac(z(n,`path`)):void 0;return i===void 0?[{type:`toolCall`,...r===void 0?{}:{toolCallId:r},toolName:t,summary:Ic(n),...n===void 0?{}:{args:n}}]:[{type:`skillRead`,...i,...r===void 0?{}:{toolCallId:r}}]}if(t===`image`){let t=z(e,`data`),n=z(e,`mimeType`);return t!==void 0&&t!==``&&n!==void 0&&n!==``?[{type:`image`,mimeType:n,data:t}]:[{type:`text`,text:`[image]`}]}return Fc(e)}).map(e=>e.type===`text`&&z(t,`role`)===`toolResult`?kc(e.text,t):e):Fc(e):[n]}function Ec(e){if(!(z(e,`role`)!==`custom`||z(e,`customType`)!==`pi-web.ask.answers`))return Oc(zc(e,`details`))}function Dc(e,t){if(e===`ask_user`)return Oc(zc(t,`superseded`))}function Oc(e){try{return{type:`askUserRecord`,outcome:Hn(e)}}catch{return}}function kc(e,t){let n=z(t,`toolCallId`),r=zc(t,`content`),i=zc(t,`details`);return{type:`toolResult`,...n===void 0?{}:{toolCallId:n},toolName:z(t,`toolName`)??`tool`,text:e,...r===void 0?{}:{content:r},...i===void 0?{}:{details:i},isError:Bc(t,`isError`)===!0}}function Ac(e){if(e===void 0||e===``)return;let t=e.replace(/\\/g,`/`);if(!t.endsWith(`/SKILL.md`)&&t!==`SKILL.md`)return;let n=t.split(`/`).at(-2);if(!(n===void 0||n===``))return{name:n,path:e}}function jc(e){let t=[],n=new Map;for(let r of e){let e=[],i={...r.transcriptIndex===void 0?{}:{transcriptIndex:r.transcriptIndex},...r.source===void 0?{}:{source:r.source},...r.meta===void 0?{}:{meta:r.meta}},a=()=>{e.length!==0&&(t.push({role:r.role,parts:e,...i}),e=[])};for(let o of r.parts){if(o.type===`toolCall`){a();let e=Mc(o),r=t.length;t.push({role:`tool`,parts:[e],...i}),e.toolCallId!==void 0&&n.set(e.toolCallId,{lineIndex:r,partIndex:0});continue}if(o.type===`toolResult`){let e=o.toolCallId===void 0?void 0:n.get(o.toolCallId);if(e!==void 0&&Nc(t,e,o)){n.delete(o.toolCallId??``);continue}}e.push(o)}a()}return t}function Mc(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 Nc(e,t,n){let r=e[t.lineIndex],i=r?.parts[t.partIndex];if(r===void 0||i?.type!==`toolExecution`)return!1;let a=Pc(n.details)??i.preview,o={...i,status:n.isError?`error`:`success`,resultText:n.text,...n.content===void 0?{}:{content:n.content},...n.details===void 0?{}:{details:n.details},...a===void 0?{}:{preview:a}};return e[t.lineIndex]={...r,parts:[...r.parts.slice(0,t.partIndex),o,...r.parts.slice(t.partIndex+1)]},!0}function Pc(e){let t=zc(e,`preview`);if(!Rc(t))return;let n=z(t,`diff`),r=z(t,`error`),i=Vc(t,`firstChangedLine`);if(!(n===void 0&&r===void 0&&i===void 0))return{...n===void 0?{}:{diff:n},...r===void 0?{}:{error:r},...i===void 0?{}:{firstChangedLine:i}}}function Fc(e){return e==null?[]:typeof e==`object`?[{type:`text`,text:Ic(e)}]:[{type:`text`,text:Hc(e)}]}function Ic(e){if(!Rc(e))return Hc(e);let t=z(e,`command`);if(t!==void 0)return t;let n=z(e,`path`);if(n!==void 0)return n;if(typeof e.oldText==`string`&&typeof e.newText==`string`)return`edit text replacement`;let r=e.edits;return Array.isArray(r)?`${String(r.length)} edit${r.length===1?``:`s`}`:Object.entries(e).filter(([,e])=>e!=null).slice(0,3).map(([e,t])=>`${e}: ${Lc(t)}`).join(` · `)}function Lc(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?`object`:``}function Rc(e){return typeof e==`object`&&!!e}function zc(e,t){return Rc(e)?e[t]:void 0}function z(e,t){let n=zc(e,t);return typeof n==`string`?n:void 0}function Bc(e,t){let n=zc(e,t);return typeof n==`boolean`?n:void 0}function Vc(e,t){let n=zc(e,t);return typeof n==`number`&&Number.isFinite(n)?n:void 0}function Hc(e){return e==null?``:typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`?String(e):``}var Uc=`pi-web:prompt-draft:`;function Wc(e){return`${Uc}${e}`}function Gc(){try{return typeof localStorage>`u`?void 0:localStorage}catch{return}}function Kc(e,t=Gc()){try{return t?.getItem(Wc(e))??``}catch{return``}}function qc(e,t,n=Gc()){try{t?n?.setItem(Wc(e),t):n?.removeItem(Wc(e))}catch{}}function Jc(e,t=Gc()){try{t?.removeItem(Wc(e))}catch{}}function Yc(e,t,n=Gc()){let r=Kc(e,n);r!==``&&(qc(t,r,n),Jc(e,n))}var Xc=`pi-web:ask-draft:`;function Zc(e,t){return`${Xc}${e}:${t}`}function Qc(){try{return typeof localStorage>`u`?void 0:localStorage}catch{return}}function $c(e,t,n=Qc()){try{let r=n?.getItem(Zc(e,t));return r==null?{}:nl(r)}catch{return{}}}function el(e,t,n,r=Qc()){try{let i=Object.entries(n).filter(([,e])=>e.values.length>0||(e.otherText??``)!==``);i.length===0?r?.removeItem(Zc(e,t)):r?.setItem(Zc(e,t),JSON.stringify(Object.fromEntries(i)))}catch{}}function tl(e,t,n=Qc()){try{n?.removeItem(Zc(e,t))}catch{}}function nl(e){let t=JSON.parse(e);if(typeof t!=`object`||!t||Array.isArray(t))return{};let n={};for(let[e,r]of Object.entries(t)){let t=rl(r);t!==void 0&&(n[e]=t)}return n}function rl(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t={...e},n=t.values,r=t.otherText;if(!(!Array.isArray(n)||!n.every(e=>typeof e==`string`))&&!(r!==void 0&&typeof r!=`string`))return{values:[...n],...r===void 0?{}:{otherText:r}}}function il(e,t){return e.filter(e=>sl(e,t[e.id])!==void 0).length}function al(e,t){return e.filter(e=>sl(e,t[e.id])===void 0)}function ol(e,t){let n=[];for(let r of e){let e=sl(r,t[r.id]);e!==void 0&&n.push(e)}return{answers:n}}function sl(e,t){if(t===void 0)return;let n=new Set(e.options.map(e=>e.value)),r=[...new Set(t.values)].filter(e=>n.has(e)),i=cl(t.otherText);if(e.multiple!==!0&&r.length+(i===void 0?0:1)>1){let t=r[0];return t===void 0?i===void 0?void 0:{id:e.id,values:[],otherText:i}:{id:e.id,values:[t]}}if(!(r.length===0&&i===void 0))return{id:e.id,values:r,...i===void 0?{}:{otherText:i}}}function cl(e){if(e===void 0)return;let t=e.trim().slice(0,Vt);return t===``?void 0:t}function ll(e,t){return uc(`bash`,`${t===!0?`已从上下文中排除
|
|
@@ -773,7 +773,7 @@ import{$ as e,A as t,J as n,P as r,Q as i,S as a,X as o,Z as s,d as c,f as l,j a
|
|
|
773
773
|
.review-file span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
774
774
|
.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; }
|
|
775
775
|
footer { display: flex; justify-content: flex-end; gap: 8px; padding-top: 4px; }
|
|
776
|
-
`]}};V([x({attribute:!1})],qm.prototype,`context`,void 0),V([C(`#workspace-upload-input`)],qm.prototype,`uploadInput`,void 0),V([S()],qm.prototype,`pendingUpload`,void 0),V([S()],qm.prototype,`destinationFolder`,void 0),V([S()],qm.prototype,`overwrite`,void 0),V([S()],qm.prototype,`createDirs`,void 0),V([S()],qm.prototype,`formError`,void 0),V([S()],qm.prototype,`dragActive`,void 0),qm=V([b(`workspace-files-panel`)],qm);function Jm(e,t){return Object.values(e).filter(e=>e.projectId===t.projectId&&e.workspaceId===t.workspaceId&&e.machineId===t.machineId).sort((e,t)=>t.startedAt.localeCompare(e.startedAt))}function Ym(e,t){if(e.length===0)return`请至少选择一个要上传的文件。`;for(let n of e)try{wo(t,n.name)}catch(e){return e instanceof Error?e.message:String(e)}}function Xm(e){return{destinationFolder:e,createDirs:!0,overwrite:!1}}function Zm(e){let t=e.selectedFileContent;if(e.selectedFilePath===void 0||e.selectedFilePath===``)return`请选择文件。`;if(t===void 0)return`正在加载 ${e.selectedFilePath}…`;if(t.mediaType!==`image`&&t.binary)return`二进制文件:${t.path} · ${gh(t.size)}`}function Qm(e,t,n){if(n!==void 0)return rh(e,t,n)?.type}function $m(e,t,n){if(e===void 0||e===``)return n;if(t===`directory`)return ah(e,n);let r=ih(e);return r===``?n:ah(r,n)}function eh(e,t){if(t.length!==0)return e.onStartWorkspaceUpload(t,{destinationFolder:e.workspaceUploadDefaultFolder,createDirs:!0,overwrite:!1,selectUploadedFile:!0})}function th(e){return`${e.machine.id}:${e.workspace.projectId}:${e.workspace.id}`}function nh(e,t){let n=window.prompt(e,t);if(n===null)return;let r=n.trim();return r===``?void 0:r}function rh(e,t,n){let r=e.find(e=>e.path===n);if(r!==void 0)return r;for(let e of Object.values(t)){let t=e.find(e=>e.path===n);if(t!==void 0)return t}}function ih(e){let t=e.lastIndexOf(`/`);return t<0?``:e.slice(0,t)}function ah(e,t){return e===``?t:`${e.replace(/\/+$/u,``)}/${t.replace(/^\/+/u,``)}`}function oh(e){return e==null?[]:Array.from(e)}function sh(e){return Array.from(e.dataTransfer?.types??[]).includes(`Files`)}function ch(e){let t=e.filter(e=>e.status===`uploading`).length;return t===0?`最近 ${String(e.length)} 项`:`${String(t)} 项正在上传`}function lh(e){let t=e.files.length;switch(e.status){case`completed`:return`已上传 ${String(t)} 个文件`;case`error`:return`${String(t)} 个文件上传失败`;case`cancelled`:return`已取消上传 ${String(t)} 个文件`;case`uploading`:return`正在上传 ${String(t)} 个文件`}}function uh(e){switch(e.status){case`completed`:return`完成`;case`error`:return`失败`;case`cancelled`:return`已取消`;case`uploading`:return mh(e.percent)}}function dh(e){return e.status===`uploading`?e.percent:1}function fh(e){switch(e.status){case`pending`:return`等待中`;case`uploading`:return mh(e.percent);case`completed`:return`完成`;case`error`:return`错误`;case`cancelled`:return`已取消`}}function ph(e){return e.error===void 0?e.response===void 0?`${e.path} · ${gh(e.loaded)} / ${gh(e.total)}`:`已写入 ${e.response.path}`:e.error}function mh(e){return`${String(Math.round(Math.max(0,Math.min(1,e))*100))}%`}function hh(){Km(()=>import(`./CodeViewer-
|
|
776
|
+
`]}};V([x({attribute:!1})],qm.prototype,`context`,void 0),V([C(`#workspace-upload-input`)],qm.prototype,`uploadInput`,void 0),V([S()],qm.prototype,`pendingUpload`,void 0),V([S()],qm.prototype,`destinationFolder`,void 0),V([S()],qm.prototype,`overwrite`,void 0),V([S()],qm.prototype,`createDirs`,void 0),V([S()],qm.prototype,`formError`,void 0),V([S()],qm.prototype,`dragActive`,void 0),qm=V([b(`workspace-files-panel`)],qm);function Jm(e,t){return Object.values(e).filter(e=>e.projectId===t.projectId&&e.workspaceId===t.workspaceId&&e.machineId===t.machineId).sort((e,t)=>t.startedAt.localeCompare(e.startedAt))}function Ym(e,t){if(e.length===0)return`请至少选择一个要上传的文件。`;for(let n of e)try{wo(t,n.name)}catch(e){return e instanceof Error?e.message:String(e)}}function Xm(e){return{destinationFolder:e,createDirs:!0,overwrite:!1}}function Zm(e){let t=e.selectedFileContent;if(e.selectedFilePath===void 0||e.selectedFilePath===``)return`请选择文件。`;if(t===void 0)return`正在加载 ${e.selectedFilePath}…`;if(t.mediaType!==`image`&&t.binary)return`二进制文件:${t.path} · ${gh(t.size)}`}function Qm(e,t,n){if(n!==void 0)return rh(e,t,n)?.type}function $m(e,t,n){if(e===void 0||e===``)return n;if(t===`directory`)return ah(e,n);let r=ih(e);return r===``?n:ah(r,n)}function eh(e,t){if(t.length!==0)return e.onStartWorkspaceUpload(t,{destinationFolder:e.workspaceUploadDefaultFolder,createDirs:!0,overwrite:!1,selectUploadedFile:!0})}function th(e){return`${e.machine.id}:${e.workspace.projectId}:${e.workspace.id}`}function nh(e,t){let n=window.prompt(e,t);if(n===null)return;let r=n.trim();return r===``?void 0:r}function rh(e,t,n){let r=e.find(e=>e.path===n);if(r!==void 0)return r;for(let e of Object.values(t)){let t=e.find(e=>e.path===n);if(t!==void 0)return t}}function ih(e){let t=e.lastIndexOf(`/`);return t<0?``:e.slice(0,t)}function ah(e,t){return e===``?t:`${e.replace(/\/+$/u,``)}/${t.replace(/^\/+/u,``)}`}function oh(e){return e==null?[]:Array.from(e)}function sh(e){return Array.from(e.dataTransfer?.types??[]).includes(`Files`)}function ch(e){let t=e.filter(e=>e.status===`uploading`).length;return t===0?`最近 ${String(e.length)} 项`:`${String(t)} 项正在上传`}function lh(e){let t=e.files.length;switch(e.status){case`completed`:return`已上传 ${String(t)} 个文件`;case`error`:return`${String(t)} 个文件上传失败`;case`cancelled`:return`已取消上传 ${String(t)} 个文件`;case`uploading`:return`正在上传 ${String(t)} 个文件`}}function uh(e){switch(e.status){case`completed`:return`完成`;case`error`:return`失败`;case`cancelled`:return`已取消`;case`uploading`:return mh(e.percent)}}function dh(e){return e.status===`uploading`?e.percent:1}function fh(e){switch(e.status){case`pending`:return`等待中`;case`uploading`:return mh(e.percent);case`completed`:return`完成`;case`error`:return`错误`;case`cancelled`:return`已取消`}}function ph(e){return e.error===void 0?e.response===void 0?`${e.path} · ${gh(e.loaded)} / ${gh(e.total)}`:`已写入 ${e.response.path}`:e.error}function mh(e){return`${String(Math.round(Math.max(0,Math.min(1,e))*100))}%`}function hh(){Km(()=>import(`./CodeViewer-B9BLGnQ2.js`),__vite__mapDeps([0,1,2,3]),import.meta.url)}function gh(e){if(!Number.isFinite(e)||e<0)return`0 B`;if(e<1024)return`${String(e)} B`;let t=e/1024;if(t<1024)return`${_h(t)} KB`;let n=t/1024;return n<1024?`${_h(n)} MB`:`${_h(n/1024)} GB`}function _h(e){return e>=10?String(Math.round(e)):e.toFixed(1)}function vh(e){let t=e.submoduleFromCommit,n=e.submoduleToCommit;return t!==void 0&&n!==void 0?`${t} → ${n}`:`commit`}function yh(e){let t=e.split(`/`);return t[t.length-1]??e}function bh(e,t=[]){let n=Sh(``),r=new Set(t);for(let e of t)wh(n,e).isSubmodule=!0;for(let t of e){if(r.has(t.path)){let e=wh(n,t.path);e.isSubmodule=!0,e.pointer={kind:`file`,name:vh(t),path:t.path,file:t,isSubmodulePointer:!0};continue}let e=t.path.split(`/`).filter(e=>e.length>0),i=e[e.length-1];if(i===void 0)continue;let a=n;for(let t=0;t<e.length-1;t+=1){let n=e[t];n!==void 0&&(a=Ch(a,n))}a.files.push({kind:`file`,name:i,path:t.path,file:t})}return Th(n)}function xh(e){let t=[];for(let n of e)n.kind===`directory`&&(t.push(n.path),t.push(...xh(n.children)));return t}function Sh(e){return{path:e,directories:new Map,files:[],isSubmodule:!1}}function Ch(e,t){let n=e.path.length===0?t:`${e.path}/${t}`,r=e.directories.get(n);if(r!==void 0)return r;let i=Sh(n);return e.directories.set(n,i),i}function wh(e,t){let n=e;for(let e of t.split(`/`).filter(e=>e.length>0))n=Ch(n,e);return n}function Th(e){let t=[...e.directories.values()].map(e=>({kind:`directory`,name:yh(e.path),path:e.path,...e.isSubmodule?{isSubmodule:!0}:{},children:Th(e)})).sort((e,t)=>e.name.localeCompare(t.name)),n=[...e.files].sort((e,t)=>e.name.localeCompare(t.name));return[...e.pointer===void 0?[]:[e.pointer],...t,...n]}function Eh(e,t=[]){let n=new Set(t),r=new Map,i=new Map;for(let e of t)i.set(e,[]);let a=[];for(let o of e){if(n.has(o.path)){r.set(o.path,{name:vh(o),file:o});continue}let e=Dh(o.path,t);if(e!==void 0){i.get(e)?.push({path:o.path,relativePath:o.path.slice(e.length+1),file:o});continue}a.push(o)}return{submodules:t.map(e=>{let t=r.get(e),n=i.get(e)??[];return{path:e,name:yh(e),...t===void 0?{}:{pointer:t},files:[...n].sort((e,t)=>e.relativePath.localeCompare(t.relativePath))}}).sort((e,t)=>e.name.localeCompare(t.name)),files:a}}function Dh(e,t){let n;for(let r of t)r!==``&&e.startsWith(`${r}/`)&&(n===void 0||r.length>n.length)&&(n=r);return n}var Oh=`pi-web.gitFileView`;function kh(e){return e===`tree`?`tree`:`list`}function Ah(e=Mh()){if(e===void 0)return`list`;try{return kh(e.getItem(Oh))}catch{return`list`}}function jh(e,t=Mh()){if(t!==void 0)try{t.setItem(Oh,e)}catch{}}function Mh(){if(!(typeof window>`u`))try{return window.localStorage}catch{return}}var Nh={submodules:[],files:[]},Ph={nodes:[],listModel:Nh,expandablePaths:[]},Fh=class extends y{constructor(...e){super(...e),this.view=Ah(),this.expandedDirectories=new Set}static{this.styles=[Am,h`
|
|
777
777
|
:host { flex: 1 1 auto; }
|
|
778
778
|
.toolbar-actions { display: flex; align-items: center; gap: 8px; margin-left: auto; }
|
|
779
779
|
.toolbar .toolbar-actions button { margin-left: 0; }
|
|
@@ -841,7 +841,7 @@ import{$ as e,A as t,J as n,P as r,Q as i,S as a,X as o,Z as s,d as c,f as l,j a
|
|
|
841
841
|
<div class="viewer-header"><strong>${e.path??`差异`}</strong><small>${e.staged?`已暂存`:`未暂存`}${e.truncated?` · 已截断`:``}</small></div>
|
|
842
842
|
<unified-diff-viewer .diff=${e.diff}></unified-diff-viewer>
|
|
843
843
|
</section>
|
|
844
|
-
`}function zh(){Km(()=>import(`./UnifiedDiffViewer-2DACwxFY.js`),[],import.meta.url)}function Bh(e){let t=e.branch??`游离 HEAD`,n=e.ahead??0,r=e.behind??0;return n===0&&r===0?t:`${t} · ↑${String(n)} ↓${String(r)}`}function Vh(e,t){return(t===`unmodified`?e:t).slice(0,1).toUpperCase()}function Hh(e){return`${e.machine.id}:${e.workspace.projectId}:${e.workspace.id}`}function Uh(){return[{id:`workspace.files`,title:`文件`,icon:Dm(`files`),order:10,render:Wh},{id:`workspace.git`,title:`Git`,icon:Dm(`git`),order:20,visible:({workspace:e})=>e.isGitRepo,render:Kh},{id:`workspace.terminal`,title:`终端`,icon:Dm(`terminal`),order:30,badge:e=>e.activeTerminalCount>0?e.activeTerminalCount:void 0,render:Gh}]}function Wh(e){return g`<workspace-files-panel .context=${e}></workspace-files-panel>`}function Gh(e){return qh(),g`<terminal-panel .workspace=${e.workspace} .machineId=${e.machine.id} .selectedTerminalId=${e.selectedTerminalId} .autoStart=${e.terminalAutoStart} .onSelectTerminal=${e.onSelectTerminal}></terminal-panel>`}function Kh(e){return g`<workspace-git-panel .context=${e}></workspace-git-panel>`}function qh(){Km(()=>import(`./TerminalPanel-BmA7Ayzk.js`),__vite__mapDeps([4,5,6]),import.meta.url)}var Jh={apiVersion:1,name:`PI WEB 核心`,activate:()=>{let e=!_t();return{contributions:{actions:e?hm():hm().filter(e=>e.id!==`view.terminal`),workspacePanels:e?Uh():Uh().filter(e=>e.id!==`workspace.terminal`)}}}},Yh={"--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`},Xh={"--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`},Zh={"--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`},Qh={apiVersion:1,name:`PI WEB 主题`,activate:()=>({contributions:{themes:[{id:`pi-web-dark`,name:`PI WEB 深色`,description:`PI WEB 深色配色。`,order:10,colorScheme:`dark`,tokens:Xh},{id:`pi-web-light`,name:`PI WEB 浅色`,description:`PI WEB 浅色配色。`,order:20,colorScheme:`light`,tokens:Zh},{id:`classic`,name:`PI WEB 经典`,description:`原始 PI WEB 深色配色。`,order:30,colorScheme:`dark`,tokens:Yh}],themePairs:[{id:`pi-web`,name:`PI WEB`,description:`跟随系统浅色/深色偏好使用 PI WEB 主题。`,order:10,light:`pi-web-light`,dark:`pi-web-dark`}]}})},$h=/^[a-z][a-z0-9.-]*$/u,eg=/^[a-z][a-z0-9.-]*$/u,tg=new WeakMap,ng=new WeakMap,rg=class{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(e){let{id:t,plugin:n}=e;this.validatePluginId(t);let r=this.parseMachineSpecific(t,e.machineSpecific);if(this.pluginIds.has(t))throw Error(`Duplicate plugin id: ${t}`);if(this.isRemoteDuplicateHiddenByGateway(e.sourcePluginId,e.machineId,r))return;this.pluginIds.add(t);let i=n.apiVersion;if(i!==1)throw Error(`Unsupported plugin API version for ${t}: ${String(i)}`);let a=n.activate({apiVersion:1,pluginId:t,html:g,svg:_}).contributions;for(let n of a.actions??[])this.actions.push(this.qualifyAction(t,n,e.machineId,e.sourcePluginId));for(let n of a.workspacePanels??[])this.workspacePanels.push(this.qualifyWorkspacePanel(t,n,e.machineId,e.sourcePluginId));for(let n of a.workspaceLabels??[])this.workspaceLabels.push(this.qualifyWorkspaceLabelContribution(t,n,e.machineId,e.sourcePluginId));if(e.machineId===void 0){for(let e of a.themes??[])this.themes.push(this.qualifyTheme(t,e));for(let e of a.themePairs??[])this.themePairs.push(this.qualifyThemePair(t,e));this.gatewayPluginIds.add(t),r&&this.gatewayMachineSpecificPluginIds.add(t)}else e.sourcePluginId!==void 0&&r&&cg(this.remoteMachineSpecificPluginIds,e.sourcePluginId,e.machineId)}shouldLoadRemotePlugin(e,t=!1){return!this.gatewayPluginIds.has(e)||this.gatewayMachineSpecificPluginIds.has(e)||t}getActions(e){let t=ug(e);return this.actions.filter(e=>this.isContributionActive(e.pluginId,e.machineId,t,e.sourcePluginId)).map(t=>{let n=ig(e,t.pluginId),r=t.enabled?.(n),i=r===!1?t.disabledReason?.(n):void 0,a={id:t.id,pluginId:t.pluginId,localId:t.localId,...t.machineId===void 0?{}:{machineId:t.machineId},title:t.title,run:()=>t.run(n)};return t.description!==void 0&&(a.description=t.description),t.shortcut!==void 0&&(a.shortcut=t.shortcut),t.group!==void 0&&(a.group=t.group),r!==void 0&&(a.enabled=r),i!==void 0&&i!==``&&(a.disabledReason=i),a})}getWorkspacePanels(){return[...this.workspacePanels].sort((e,t)=>(e.order??1e3)-(t.order??1e3)||e.title.localeCompare(t.title))}getThemes(){return[...this.themes].sort((e,t)=>(e.order??1e3)-(t.order??1e3)||e.name.localeCompare(t.name))}getThemePairs(){return[...this.themePairs].sort((e,t)=>(e.order??1e3)-(t.order??1e3)||e.name.localeCompare(t.name))}getWorkspaceLabelItems(e){return[...this.workspaceLabels].sort((e,t)=>(e.order??1e3)-(t.order??1e3)||e.id.localeCompare(t.id)).flatMap(t=>t.visible?.(e)===!1?[]:t.items(e))}qualifyAction(e,t,n,r){let i=this.qualify(e,t.id);return{...t,id:i,pluginId:e,localId:t.id,...n===void 0?{}:{machineId:n},...r===void 0?{}:{sourcePluginId:r}}}qualifyWorkspacePanel(e,t,n,r){let i=this.qualify(e,t.id),a=t.badge,o=t.visible;return{...t,id:i,pluginId:e,localId:t.id,...n===void 0?{}:{machineId:n},visible:t=>this.isContributionActive(e,n,t.machine.id,r)&&(o?.(ag(t,e))??!0),...a===void 0?{}:{badge:t=>this.isContributionActive(e,n,t.machine.id,r)?a(ag(t,e)):void 0},render:n=>t.render(ag(n,e))}}qualifyWorkspaceLabelContribution(e,t,n,r){let i=this.qualify(e,t.id),a=t.visible,o=t.items;return{...t,id:i,pluginId:e,localId:t.id,...n===void 0?{}:{machineId:n},visible:t=>this.isContributionActive(e,n,t.machine.id,r)&&(a?.(t)??!0),items:t=>this.isContributionActive(e,n,t.machine.id,r)?o(t):[]}}qualifyTheme(e,t){let n=this.qualify(e,t.id);return{...t,id:n,pluginId:e,localId:t.id}}qualifyThemePair(e,t){let n=this.qualify(e,t.id);return{...t,id:n,pluginId:e,localId:t.id,light:this.qualifyReference(e,t.light),dark:this.qualifyReference(e,t.dark)}}qualify(e,t){this.validateLocalId(t);let n=`${e}:${t}`;if(this.contributionIds.has(n))throw Error(`Duplicate contribution id: ${n}`);return this.contributionIds.add(n),n}qualifyReference(e,t){return this.validateLocalId(t),`${e}:${t}`}isContributionActive(e,t,n,r){return t===void 0?!this.isGatewayPluginHiddenForMachine(e,n):t===n&&!this.isRemotePluginHiddenByGateway(r,t)}isRemoteDuplicateHiddenByGateway(e,t,n){return e!==void 0&&t!==void 0&&this.gatewayPluginIds.has(e)&&!this.gatewayMachineSpecificPluginIds.has(e)&&!n}isRemotePluginHiddenByGateway(e,t){return e===void 0||this.gatewayMachineSpecificPluginIds.has(e)||this.remoteMachineSpecificPluginIds.get(e)?.has(t)===!0?!1:this.gatewayPluginIds.has(e)}isGatewayPluginHiddenForMachine(e,t){return t!==`local`&&(this.gatewayMachineSpecificPluginIds.has(e)||this.remoteMachineSpecificPluginIds.get(e)?.has(t)===!0)}validatePluginId(e){if(!$h.test(e))throw Error(`Invalid plugin id: ${e}`)}validateLocalId(e){if(!eg.test(e))throw Error(`Invalid contribution id: ${e}`)}parseMachineSpecific(e,t){if(t===void 0)return!1;if(typeof t!=`boolean`)throw Error(`Invalid plugin machineSpecific value for ${e}: ${lg(t)}`);return t}};function ig(e,t){return tg.get(e)?.(t)??e}function ag(e,t){return ng.get(e)?.(t)??e}function og(e,t){return tg.set(e,t),e}function sg(e,t){return ng.set(e,t),e}function cg(e,t,n){let r=e.get(t);r===void 0?e.set(t,new Set([n])):r.add(n)}function lg(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)return String(e);try{return JSON.stringify(e)}catch{return Object.prototype.toString.call(e)}}function ug(e){return e.state.selectedMachine?.id??`local`}var dg=/^[a-z][a-z0-9.-]*$/u;function fg(e){return dg.test(e)}var pg=`machine.`;function mg(e,t){if(e===``)throw Error(`Machine id is required`);if(!fg(t))throw Error(`Invalid PI WEB plugin id: ${t}`);return`${pg}${hg(e)}.${t}`}function hg(e){return[...new TextEncoder().encode(e)].map(e=>e.toString(16).padStart(2,`0`)).join(``)}async function gg(e=`pi-web-plugins/manifest.json`,t={}){let n=Dt(e),r=await yg(n);if(r===void 0)return[];let i=[];for(let e of r.plugins)if(t.shouldLoadPlugin?.(e)!==!1)try{let r=_g(e.module,n),a=Sg(await(t.moduleLoader??vg)(r),r);i.push({id:t.machineId===void 0?e.id:mg(t.machineId,e.id),plugin:a,machineSpecific:e.machineSpecific,...t.machineId===void 0?{}:{machineId:t.machineId,sourcePluginId:e.id}})}catch(t){console.warn(`Failed to load PI WEB plugin ${e.module}`,t)}return i}function _g(e,t,n){return e.startsWith(`/`)?n===void 0?Dt(e):Dt(e,n):new URL(e,t).toString()}async function vg(e){return Km(()=>import(e),[],import.meta.url)}async function yg(e){let t=await fetch(e,{cache:`no-store`});if(t.status!==404){if(!t.ok)throw Error(`Failed to load plugin manifest: ${t.statusText}`);return bg(await t.json())}}function bg(e){if(!wg(e)||!Array.isArray(e.plugins))throw Error(`Invalid plugin manifest`);return{plugins:e.plugins.map(e=>{if(!wg(e)||typeof e.id!=`string`||e.id===``||typeof e.module!=`string`||e.module===``)throw Error(`Invalid plugin manifest entry`);return{id:e.id,module:e.module,machineSpecific:xg(e.machineSpecific)}})}}function xg(e){if(e===void 0)return!1;if(typeof e!=`boolean`)throw Error(`Invalid plugin manifest entry`);return e}function Sg(e,t){if(!wg(e))throw Error(`Plugin module ${t} did not export an object`);let n=e.default;if(!Cg(n))throw Error(`Plugin module ${t} default export is not a PiWebPlugin`);return n}function Cg(e){return wg(e)&&e.apiVersion===1&&typeof e.name==`string`&&typeof e.activate==`function`}function wg(e){return typeof e==`object`&&!!e}var Tg=class{constructor(e,t){this.registerPlugins=e,this.shouldLoadRemotePlugin=t,this.loadedMachineIds=new Set,this.machineLoads=new Map}ensureGatewayLoaded(){return this.gatewayLoad??=this.registerPlugins(`PI WEB 插件`,()=>gg()),this.gatewayLoad}async loadForMachine(e){if(await this.ensureGatewayLoaded(),e.kind!==`remote`||this.loadedMachineIds.has(e.id))return;let t=this.machineLoads.get(e.id);if(t!==void 0)return t;let n=this.registerPlugins(`来自 ${e.name} 的 PI WEB 插件`,()=>gg(`api/machines/${encodeURIComponent(e.id)}/pi-web-plugins/manifest.json`,{machineId:e.id,shouldLoadPlugin:e=>this.shouldLoadRemotePlugin(e.id,e.machineSpecific)})).then(t=>{t&&this.loadedMachineIds.add(e.id)}).finally(()=>{this.machineLoads.delete(e.id)});this.machineLoads.set(e.id,n),await n}},Eg=[`(display-mode: standalone)`,`(display-mode: fullscreen)`,`(display-mode: minimal-ui)`];function Dg(){return typeof window>`u`||!(`matchMedia`in window)?[]:Eg.map(e=>window.matchMedia(e))}function Og(e,t=kg()){return e.some(e=>e.matches)||Ag(t)}function kg(){return typeof navigator>`u`?void 0:navigator}function Ag(e){return e!==void 0&&`standalone`in e&&e.standalone===!0}var jg=class{constructor(e=Mg()){this.scheduler=e}repair(e){if(!e){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()},250)}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);let e=this.scheduler.documentElement;e!==void 0&&(e.scrollTop=0);let t=this.scheduler.body;t!==void 0&&(t.scrollTop=0)}};function Mg(){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}}}var Ng=`(max-width: 760px)`,Pg=`(max-width: 1180px)`,Fg=class{constructor(e,t={}){this.host=e,this.onMobileNavigationMediaChange=e=>{this.isMobileNavigationLayout!==e.matches&&(this.isMobileNavigationLayout=e.matches,this.host.requestUpdate())},this.onStackedWorkspaceMediaChange=e=>{this.isStackedWorkspaceLayout!==e.matches&&(this.isStackedWorkspaceLayout=e.matches,this.host.requestUpdate())},this.onPwaDisplayModeChange=()=>{let e=Og(this.pwaDisplayModeMedia);this.isPwaDisplayMode!==e&&(this.isPwaDisplayMode=e,this.host.requestUpdate())},e.addController(this),this.mobileNavigationMedia=t.mobileNavigationMedia??Ig(),this.stackedWorkspaceMedia=t.stackedWorkspaceMedia??Lg(),this.pwaDisplayModeMedia=t.pwaDisplayModeMedia??Dg(),this.viewportPositionRepairer=t.viewportPositionRepairer??new jg,this.isMobileNavigationLayout=this.mobileNavigationMedia?.matches??!1,this.isStackedWorkspaceLayout=this.stackedWorkspaceMedia?.matches??!1,this.isPwaDisplayMode=Og(this.pwaDisplayModeMedia)}hostConnected(){this.mobileNavigationMedia?.addEventListener(`change`,this.onMobileNavigationMediaChange),this.stackedWorkspaceMedia?.addEventListener(`change`,this.onStackedWorkspaceMediaChange);for(let e of this.pwaDisplayModeMedia)e.addEventListener(`change`,this.onPwaDisplayModeChange)}hostDisconnected(){this.mobileNavigationMedia?.removeEventListener(`change`,this.onMobileNavigationMediaChange),this.stackedWorkspaceMedia?.removeEventListener(`change`,this.onStackedWorkspaceMediaChange);for(let e of this.pwaDisplayModeMedia)e.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(e,t){return Rg(e,{isMobileNavigationLayout:this.isMobileNavigationLayout,isStackedWorkspaceLayout:this.isStackedWorkspaceLayout,hasSelectedSession:t})}repairViewportPosition(){this.viewportPositionRepairer.repair(this.shouldRepairViewportPosition())}shouldRepairViewportPosition(){return this.isMobileNavigationLayout||this.isPwaDisplayMode}};function Ig(){if(!(typeof window>`u`||!(`matchMedia`in window)))return window.matchMedia(Ng)}function Lg(){if(!(typeof window>`u`||!(`matchMedia`in window)))return window.matchMedia(Pg)}function Rg(e,t){let n=e??(t.isMobileNavigationLayout?`navigation`:`chat`);return t.isMobileNavigationLayout||!t.isStackedWorkspaceLayout||!t.hasSelectedSession||n===`navigation`||n===`chat`?n:`chat`}var zg=class{constructor(e,t={}){this.callbacks=e,this.refreshes=new $o,this.connected=!1,this.onFocus=()=>{this.handleResumeSignal()},this.onVisibilityChange=()=>{this.isDocumentVisible()&&this.handleResumeSignal()},this.windowTarget=t.windowTarget??Bg(),this.documentTarget=t.documentTarget??Vg(),this.isDocumentVisible=t.isDocumentVisible??Hg,this.scheduleFrame=t.scheduleFrame??Ug}connect(){this.connected||(this.connected=!0,this.windowTarget?.addEventListener(`focus`,this.onFocus),this.documentTarget?.addEventListener(`visibilitychange`,this.onVisibilityChange))}disconnect(){this.connected&&(this.connected=!1,this.windowTarget?.removeEventListener(`focus`,this.onFocus),this.documentTarget?.removeEventListener(`visibilitychange`,this.onVisibilityChange),this.scheduledRefresh?.cancel(),this.scheduledRefresh=void 0)}handleResumeSignal(){this.callbacks.onResumeSignal(),this.scheduledRefresh===void 0&&(this.scheduledRefresh=this.scheduleFrame(()=>{this.scheduledRefresh=void 0,this.connected&&this.refreshes.request(`browser-resume`,async()=>{this.connected&&await this.callbacks.refreshAfterResume()}).catch(e=>{this.callbacks.onRefreshError(e)})}))}};function Bg(){return typeof window>`u`?void 0:window}function Vg(){return typeof document>`u`?void 0:document}function Hg(){return typeof document>`u`||document.visibilityState===`visible`}function Ug(e){if(typeof window<`u`&&typeof window.requestAnimationFrame==`function`){let t=window.requestAnimationFrame(()=>{e()});return{cancel:()=>{window.cancelAnimationFrame(t)}}}let t=globalThis.setTimeout(e,0);return{cancel:()=>{globalThis.clearTimeout(t)}}}var Wg=[`machines`,`projects`,`workspaces`,`sessions`];function Gg(e){return e.selectedProject===void 0?`projects`:e.selectedWorkspace===void 0?`workspaces`:`sessions`}function Kg(e,t){if(e!==`none`)return e??Gg(t)}function qg(e,t){return t.isMobileLayout?Kg(t.expanded,t.state)!==e:t.collapsedSections?.includes(e)??!1}function Jg(e,t,n){return n.isMobileLayout?Kg(e,n.state)===t?`none`:t:e}function Yg(e,t,n){return n?t:e}function Xg(e,t){let n=new Set(e);return n.has(t)?n.delete(t):n.add(t),$g(n)}function Zg(e){return Wg[Wg.indexOf(e)+1]}var Qg=class{hostConnected(){}constructor(e,t,n){this.host=e,this.getState=t,this.isMobileLayout=n,this.collapsedSections=[],e.addController(this)}expandedSection(){return Kg(this.expanded,this.getState())}isCollapsed(e){return qg(e,{isMobileLayout:this.isMobileLayout(),expanded:this.expanded,state:this.getState(),collapsedSections:this.collapsedSections})}toggle(e){if(this.isMobileLayout()){this.setExpanded(Jg(this.expanded,e,{isMobileLayout:!0,state:this.getState()}));return}this.setCollapsedSections(Xg(this.collapsedSections,e))}expand(e){if(this.isMobileLayout()){this.setExpanded(Yg(this.expanded,e,!0));return}this.setCollapsedSections(this.collapsedSections.filter(t=>t!==e))}advanceAfterSelection(e){if(!this.isMobileLayout())return;let t=Zg(e);t!==void 0&&this.expand(t)}open(e,t){this.isMobileLayout()&&(this.expand(e),t())}setExpanded(e){this.expanded!==e&&(this.expanded=e,this.host.requestUpdate())}setCollapsedSections(e){e_(this.collapsedSections,e)||(this.collapsedSections=e,this.host.requestUpdate())}};function $g(e){let t=new Set(e);return Wg.filter(e=>t.has(e))}function e_(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}var t_=class{hostConnected(){}constructor(e){this.host=e,this.navigationPanelCollapsed=!1,this.workspacePanelCollapsed=!1,e.addController(this)}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(e){return[`shell`,n_(e),...this.navigationPanelCollapsed?[`navigation-panel-collapsed`]:[],...this.workspacePanelCollapsed?[`workspace-panel-collapsed`]:[]].join(` `)}};function n_(e){return e===`navigation`?`navigation-view`:e===`chat`?`chat-view`:`workspace-view`}var r_=`pi-web:panel-sizes:v1`,i_={navigation:{minWidth:180,maxWidth:4096,defaultWidth:340,keyboardStep:24,largeKeyboardStep:72},workspace:{minWidth:240,maxWidth:4096,defaultWidth:480,keyboardStep:24,largeKeyboardStep:72}},a_=class{constructor(e,t={}){this.host=e,e.addController(this),this.storage=t.storage??y_(),this.panelSizes=d_(this.storage)}hostConnected(){}constraints(e){return o_(e)}panelWidth(e,t){return u_(e,t??this.storedPanelWidth(e)??this.constraints(e).defaultWidth)}resizePanel(e,t,n={}){let r=u_(e,t);this.storedPanelWidth(e)!==r&&(this.panelSizes=h_(this.panelSizes,e,r),n.persist!==!1&&this.persistPanelSizes(),this.host.requestUpdate())}resetPanel(e,t={}){this.storedPanelWidth(e)!==void 0&&(this.panelSizes=g_(this.panelSizes,e),t.persist!==!1&&this.persistPanelSizes(),this.host.requestUpdate())}resetPanels(e={}){this.panelSizes.navigationPanelWidth===void 0&&this.panelSizes.workspacePanelWidth===void 0||(this.panelSizes={},e.persist!==!1&&this.persistPanelSizes(),this.host.requestUpdate())}persistPanelSizes(){f_(this.panelSizes,this.storage)}shellStyle(e={}){let t=[];return this.panelSizes.navigationPanelWidth!==void 0&&t.push(`--navigation-panel-size: ${v_(u_(`navigation`,this.panelSizes.navigationPanelWidth,e.navigation))};`),this.panelSizes.workspacePanelWidth!==void 0&&t.push(`--workspace-panel-size: ${v_(u_(`workspace`,this.panelSizes.workspacePanelWidth,e.workspace))};`),t.join(` `)}storedPanelWidth(e){return e===`navigation`?this.panelSizes.navigationPanelWidth:this.panelSizes.workspacePanelWidth}};function o_(e){return i_[e]}function s_(e,t,n){return e===`navigation`?n-t:t-n}function c_(e,t,n,r,i=o_(e)){return u_(e,t+s_(e,n,r),i)}function l_(e,t,n,r={}){let i=r.constraints??o_(e);if(n===`Home`)return i.minWidth;if(n===`End`)return i.maxWidth;let a=__(e,n,r.largeStep===!0?i.largeKeyboardStep:i.keyboardStep);if(a!==void 0)return u_(e,t+a,i)}function u_(e,t,n=o_(e)){return Number.isFinite(t)?Math.round(Math.min(Math.max(t,n.minWidth),n.maxWidth)):n.defaultWidth}function d_(e=y_()){try{let t=e?.getItem(r_);return t==null||t===``?{}:p_(JSON.parse(t))}catch{return{}}}function f_(e,t=y_()){if(t!==void 0)try{if(e.navigationPanelWidth===void 0&&e.workspacePanelWidth===void 0){t.removeItem(r_);return}let n={version:1};e.navigationPanelWidth!==void 0&&(n.navigationPanelWidth=u_(`navigation`,e.navigationPanelWidth)),e.workspacePanelWidth!==void 0&&(n.workspacePanelWidth=u_(`workspace`,e.workspacePanelWidth)),t.setItem(r_,JSON.stringify(n))}catch{}}function p_(e){if(!b_(e)||e.version!==1)return{};let t={},n=m_(e.navigationPanelWidth),r=m_(e.workspacePanelWidth);return n!==void 0&&(t.navigationPanelWidth=u_(`navigation`,n)),r!==void 0&&(t.workspacePanelWidth=u_(`workspace`,r)),t}function m_(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function h_(e,t,n){return t===`navigation`?{...e,navigationPanelWidth:n}:{...e,workspacePanelWidth:n}}function g_(e,t){return t===`navigation`?e.workspacePanelWidth===void 0?{}:{workspacePanelWidth:e.workspacePanelWidth}:e.navigationPanelWidth===void 0?{}:{navigationPanelWidth:e.navigationPanelWidth}}function __(e,t,n){if(e===`navigation`)return t===`ArrowRight`?n:t===`ArrowLeft`?-n:void 0;if(t===`ArrowLeft`)return n;if(t===`ArrowRight`)return-n}function v_(e){return`${String(Math.round(e))}px`}function y_(){try{return typeof window>`u`?void 0:window.localStorage}catch{return}}function b_(e){return typeof e==`object`&&!!e}function x_(){let 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:C_(e.get(`tool`)),view:w_(e.get(`view`))}}function S_(e,t){let n=new URL(window.location.href);n.searchParams.delete(`machine`),n.searchParams.delete(`project`),n.searchParams.delete(`workspace`),n.searchParams.delete(`session`),n.searchParams.delete(`tool`),n.searchParams.delete(`view`),e.machineId!==void 0&&e.machineId!==``&&e.machineId!==`local`&&n.searchParams.set(`machine`,e.machineId),e.projectId!==void 0&&e.projectId!==``&&n.searchParams.set(`project`,e.projectId),e.workspaceId!==void 0&&e.workspaceId!==``&&n.searchParams.set(`workspace`,e.workspaceId),e.sessionId!==void 0&&e.sessionId!==``&&n.searchParams.set(`session`,e.sessionId),e.tool!==void 0&&n.searchParams.set(`tool`,e.tool),e.view!==void 0&&n.searchParams.set(`view`,e.view),`${n.pathname}${n.search}${n.hash}`!=`${window.location.pathname}${window.location.search}${window.location.hash}`&&(t?.replace===!0?window.history.replaceState({},``,n):window.history.pushState({},``,n))}function C_(e){return e===`files`?`core:workspace.files`:e===`git`?`core:workspace.git`:T_(e)?e:void 0}function w_(e){return e===`chat`?`chat`:e===`files`?`core:workspace.files`:e===`git`?`core:workspace.git`:T_(e)?e:void 0}function T_(e){return e!==null&&/^[a-z][a-z0-9.-]*:[a-z][a-z0-9.-]*$/u.test(e)}function E_(){return O_(new URLSearchParams(window.location.search).get(`settings`))}function D_(e,t){let n=new URL(window.location.href);e===void 0?n.searchParams.delete(`settings`):n.searchParams.set(`settings`,e),`${n.pathname}${n.search}${n.hash}`!=`${window.location.pathname}${window.location.search}${window.location.hash}`&&(t?.replace===!0?window.history.replaceState({},``,n):window.history.pushState({},``,n))}function O_(e){if(e===`general`)return`general`;if(e===`sessiond`||e===`sessions`)return`sessiond`;if(e===`packages`||e===`pi-packages`)return`packages`;if(e===`plugins`)return`plugins`;if(e===`shortcuts`||e===`keyboard`||e===`keyboard-shortcuts`)return`shortcuts`}function k_(e,t){return t===void 0?e:e.map(e=>j_(e,t))}function A_(e,t){let n=new Set(Af(e,t,{enabledOnly:!0}).filter(e=>e.active).map(e=>e.action.id));return k_(e,t).map(e=>e.shortcut!==void 0&&!n.has(e.id)?M_(e):e)}function j_(e,t){if(!Object.hasOwn(t,e.id))return e;let n=t[e.id];return n===void 0?e:n===null?M_(e):{...e,shortcut:n}}function M_(e){let t={...e};return delete t.shortcut,t}function N_(e,t){let n=t.api??oo,r=t.pollIntervalMs??1e3,i=t.setTimeout??I_(),a=t.clearTimeout??L_();return{async runCommand(o){let s=await n.runTerminalCommand(e,o);return o.open===!0&&t.openTerminal(o.workspace,{terminalId:s.terminalId}),{run:s,completed:P_(s,n,r,i,a)}},listCommandRuns:e=>n.listCommandRuns(e),getCommandRun:e=>n.getCommandRun(e),open:e=>{t.openTerminal(void 0,e)}}}function P_(e,t,n,r,i){return F_(e)?Promise.resolve(e):new Promise((a,o)=>{let s,c=!1,l=e=>{c||(c=!0,s!==void 0&&i(s),a(e))},u=e=>{c||(c=!0,s!==void 0&&i(s),o(e instanceof Error?e:Error(String(e))))},d=()=>{t.getCommandRun(e.id).then(e=>{if(e!==void 0&&F_(e)){l(e);return}s=r(d,n)}).catch(u)};s=r(d,n)})}function F_(e){return e.status===`succeeded`||e.status===`failed`}function I_(){return(e,t)=>globalThis.setTimeout(e,t)}function L_(){return e=>{globalThis.clearTimeout(e)}}function R_(e,t=`活动中`,n){if(e===void 0)return n===void 0?void 0:g`<span class="activity-indicator unread" role="img" aria-label=${n} title=${n}></span>`;if(n===void 0)return g`<span class=${`activity-indicator ${e}`} role="img" aria-label=${t} title=${t}></span>`;let r=`${n} · ${t}`;return g`<span class="unread-ring" role="img" aria-label=${r} title=${r}><span class=${`activity-indicator ${e}`} aria-hidden="true"></span></span>`}function z_(e,t=`活动中`,n){let r=R_(e,t,n);if(r!==void 0)return g`<span class="action-activity">${r}</span>`}var B_=0,V_=120;function H_(e,t={}){if(typeof HTMLElement>`u`||typeof window>`u`||!(e instanceof HTMLElement))return``;let n=e.getBoundingClientRect(),r=t.constrainTo===`viewport`?W_():U_(e),i=window.innerWidth,a=window.innerHeight,o=Math.max(0,r.left),s=Math.min(i,r.right),c=Math.max(0,r.top),l=Math.min(a,r.bottom),u=Math.min(n.right,s),d=l-n.bottom-B_,f=n.top-c-B_;return[...d<V_&&f>d?[`bottom: ${G_(a-n.top+B_)};`,`max-height: ${G_(Math.max(0,f))};`]:[`top: ${G_(n.bottom+B_)};`,`max-height: ${G_(Math.max(0,d))};`],`right: ${G_(Math.max(0,i-u))};`,`max-width: ${G_(Math.max(0,u-o))};`].join(` `)}function U_(e){let t=e.getRootNode();return typeof ShadowRoot<`u`&&t instanceof ShadowRoot&&t.host instanceof HTMLElement?t.host.getBoundingClientRect():W_()}function W_(){return{top:0,right:window.innerWidth,bottom:window.innerHeight,left:0}}function G_(e){return`${String(Math.round(e))}px`}var K_=class{constructor(e){this.host=e,this.menuStyle=``,this.onDocumentClick=e=>{e.composedPath().includes(this.host)||this.close()},e.addController(this)}hostConnected(){document.addEventListener(`click`,this.onDocumentClick)}hostDisconnected(){document.removeEventListener(`click`,this.onDocumentClick)}isOpen(e){return this.openId===e}toggle(e,t){if(this.openId===e){this.close();return}this.menuStyle=H_(t,{constrainTo:`viewport`}),this.openId=e,this.host.requestUpdate()}close(){this.openId===void 0&&this.menuStyle===``||(this.openId=void 0,this.menuStyle=``,this.host.requestUpdate())}closeIfOpenIdMissing(e){this.openId!==void 0&&!e(this.openId)&&this.close()}closeIf(e){e&&this.close()}closeForEscape(e,t){return e.key!==`Escape`||this.openId!==t?!1:(e.preventDefault(),e.stopPropagation(),this.close(),!0)}},q_=[`a[href]`,`button`,`input`,`select`,`textarea`,`summary`,`[role='button']`,`[role='link']`,`[contenteditable='true']`].join(`,`);function J_(e){return e.composedPath().some(e=>Y_(e,q_))}function Y_(e,t){if(typeof Element<`u`&&e instanceof Element)return e.matches(t);if(!(`matches`in e))return!1;let{matches:n}=e;return typeof n==`function`&&n.call(e,t)===!0}function X_(e,t){J_(e)||t()}function Z_(e,t){return J_(e)?!1:e.key===`Enter`||e.key===` `?(e.preventDefault(),t.activate(),!0):e.key===`ArrowUp`?$_(e,()=>{ev(e.currentTarget,-1)}):e.key===`ArrowDown`?$_(e,()=>{ev(e.currentTarget,1)}):e.key===`Home`?$_(e,()=>{tv(e.currentTarget,0)}):e.key===`End`?$_(e,()=>{tv(e.currentTarget,-1)}):e.key===`ArrowLeft`&&t.previousSection!==void 0?$_(e,t.previousSection):e.key===`ArrowRight`&&t.nextSection!==void 0?$_(e,t.nextSection):e.key===`Escape`&&t.cancel!==void 0&&$_(e,t.cancel)}function Q_(e,t={}){let n=e.querySelector(`.action-row.selected`)??e.querySelector(`.action-row`)??(t.fallbackSelector===void 0?void 0:e.querySelector(t.fallbackSelector));return n==null?!1:(n.focus(),n.scrollIntoView({block:`nearest`}),!0)}function $_(e,t){return e.preventDefault(),e.stopPropagation?.(),t(),!0}function ev(e,t){let n=rv(e),r=av(e);if(r===void 0||n.length===0)return;let i=n.indexOf(r);i<0||nv(n,i+t)}function tv(e,t){let n=rv(e);n.length!==0&&nv(n,t<0?n.length-1:t)}function nv(e,t){let n=e[Math.min(Math.max(t,0),e.length-1)];n?.focus(),n?.scrollIntoView({block:`nearest`})}function rv(e){let t=av(e)?.getRootNode();return t===void 0||!iv(t)?[]:Array.from(t.querySelectorAll(`.action-row`))}function iv(e){return typeof Document<`u`&&e instanceof Document||typeof DocumentFragment<`u`&&e instanceof DocumentFragment}function av(e){if(!(typeof HTMLElement>`u`||!(e instanceof HTMLElement)))return e.closest(`.action-row`)??void 0}var ov=h`
|
|
844
|
+
`}function zh(){Km(()=>import(`./UnifiedDiffViewer-ClTQ6Ok0.js`),[],import.meta.url)}function Bh(e){let t=e.branch??`游离 HEAD`,n=e.ahead??0,r=e.behind??0;return n===0&&r===0?t:`${t} · ↑${String(n)} ↓${String(r)}`}function Vh(e,t){return(t===`unmodified`?e:t).slice(0,1).toUpperCase()}function Hh(e){return`${e.machine.id}:${e.workspace.projectId}:${e.workspace.id}`}function Uh(){return[{id:`workspace.files`,title:`文件`,icon:Dm(`files`),order:10,render:Wh},{id:`workspace.git`,title:`Git`,icon:Dm(`git`),order:20,visible:({workspace:e})=>e.isGitRepo,render:Kh},{id:`workspace.terminal`,title:`终端`,icon:Dm(`terminal`),order:30,badge:e=>e.activeTerminalCount>0?e.activeTerminalCount:void 0,render:Gh}]}function Wh(e){return g`<workspace-files-panel .context=${e}></workspace-files-panel>`}function Gh(e){return qh(),g`<terminal-panel .workspace=${e.workspace} .machineId=${e.machine.id} .selectedTerminalId=${e.selectedTerminalId} .autoStart=${e.terminalAutoStart} .onSelectTerminal=${e.onSelectTerminal}></terminal-panel>`}function Kh(e){return g`<workspace-git-panel .context=${e}></workspace-git-panel>`}function qh(){Km(()=>import(`./TerminalPanel-C1BWg5W2.js`),__vite__mapDeps([4,5,6]),import.meta.url)}var Jh={apiVersion:1,name:`PI WEB 核心`,activate:()=>{let e=!_t();return{contributions:{actions:e?hm():hm().filter(e=>e.id!==`view.terminal`),workspacePanels:e?Uh():Uh().filter(e=>e.id!==`workspace.terminal`)}}}},Yh={"--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`},Xh={"--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`},Zh={"--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`},Qh={apiVersion:1,name:`PI WEB 主题`,activate:()=>({contributions:{themes:[{id:`pi-web-dark`,name:`PI WEB 深色`,description:`PI WEB 深色配色。`,order:10,colorScheme:`dark`,tokens:Xh},{id:`pi-web-light`,name:`PI WEB 浅色`,description:`PI WEB 浅色配色。`,order:20,colorScheme:`light`,tokens:Zh},{id:`classic`,name:`PI WEB 经典`,description:`原始 PI WEB 深色配色。`,order:30,colorScheme:`dark`,tokens:Yh}],themePairs:[{id:`pi-web`,name:`PI WEB`,description:`跟随系统浅色/深色偏好使用 PI WEB 主题。`,order:10,light:`pi-web-light`,dark:`pi-web-dark`}]}})},$h=/^[a-z][a-z0-9.-]*$/u,eg=/^[a-z][a-z0-9.-]*$/u,tg=new WeakMap,ng=new WeakMap,rg=class{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(e){let{id:t,plugin:n}=e;this.validatePluginId(t);let r=this.parseMachineSpecific(t,e.machineSpecific);if(this.pluginIds.has(t))throw Error(`Duplicate plugin id: ${t}`);if(this.isRemoteDuplicateHiddenByGateway(e.sourcePluginId,e.machineId,r))return;this.pluginIds.add(t);let i=n.apiVersion;if(i!==1)throw Error(`Unsupported plugin API version for ${t}: ${String(i)}`);let a=n.activate({apiVersion:1,pluginId:t,html:g,svg:_}).contributions;for(let n of a.actions??[])this.actions.push(this.qualifyAction(t,n,e.machineId,e.sourcePluginId));for(let n of a.workspacePanels??[])this.workspacePanels.push(this.qualifyWorkspacePanel(t,n,e.machineId,e.sourcePluginId));for(let n of a.workspaceLabels??[])this.workspaceLabels.push(this.qualifyWorkspaceLabelContribution(t,n,e.machineId,e.sourcePluginId));if(e.machineId===void 0){for(let e of a.themes??[])this.themes.push(this.qualifyTheme(t,e));for(let e of a.themePairs??[])this.themePairs.push(this.qualifyThemePair(t,e));this.gatewayPluginIds.add(t),r&&this.gatewayMachineSpecificPluginIds.add(t)}else e.sourcePluginId!==void 0&&r&&cg(this.remoteMachineSpecificPluginIds,e.sourcePluginId,e.machineId)}shouldLoadRemotePlugin(e,t=!1){return!this.gatewayPluginIds.has(e)||this.gatewayMachineSpecificPluginIds.has(e)||t}getActions(e){let t=ug(e);return this.actions.filter(e=>this.isContributionActive(e.pluginId,e.machineId,t,e.sourcePluginId)).map(t=>{let n=ig(e,t.pluginId),r=t.enabled?.(n),i=r===!1?t.disabledReason?.(n):void 0,a={id:t.id,pluginId:t.pluginId,localId:t.localId,...t.machineId===void 0?{}:{machineId:t.machineId},title:t.title,run:()=>t.run(n)};return t.description!==void 0&&(a.description=t.description),t.shortcut!==void 0&&(a.shortcut=t.shortcut),t.group!==void 0&&(a.group=t.group),r!==void 0&&(a.enabled=r),i!==void 0&&i!==``&&(a.disabledReason=i),a})}getWorkspacePanels(){return[...this.workspacePanels].sort((e,t)=>(e.order??1e3)-(t.order??1e3)||e.title.localeCompare(t.title))}getThemes(){return[...this.themes].sort((e,t)=>(e.order??1e3)-(t.order??1e3)||e.name.localeCompare(t.name))}getThemePairs(){return[...this.themePairs].sort((e,t)=>(e.order??1e3)-(t.order??1e3)||e.name.localeCompare(t.name))}getWorkspaceLabelItems(e){return[...this.workspaceLabels].sort((e,t)=>(e.order??1e3)-(t.order??1e3)||e.id.localeCompare(t.id)).flatMap(t=>t.visible?.(e)===!1?[]:t.items(e))}qualifyAction(e,t,n,r){let i=this.qualify(e,t.id);return{...t,id:i,pluginId:e,localId:t.id,...n===void 0?{}:{machineId:n},...r===void 0?{}:{sourcePluginId:r}}}qualifyWorkspacePanel(e,t,n,r){let i=this.qualify(e,t.id),a=t.badge,o=t.visible;return{...t,id:i,pluginId:e,localId:t.id,...n===void 0?{}:{machineId:n},visible:t=>this.isContributionActive(e,n,t.machine.id,r)&&(o?.(ag(t,e))??!0),...a===void 0?{}:{badge:t=>this.isContributionActive(e,n,t.machine.id,r)?a(ag(t,e)):void 0},render:n=>t.render(ag(n,e))}}qualifyWorkspaceLabelContribution(e,t,n,r){let i=this.qualify(e,t.id),a=t.visible,o=t.items;return{...t,id:i,pluginId:e,localId:t.id,...n===void 0?{}:{machineId:n},visible:t=>this.isContributionActive(e,n,t.machine.id,r)&&(a?.(t)??!0),items:t=>this.isContributionActive(e,n,t.machine.id,r)?o(t):[]}}qualifyTheme(e,t){let n=this.qualify(e,t.id);return{...t,id:n,pluginId:e,localId:t.id}}qualifyThemePair(e,t){let n=this.qualify(e,t.id);return{...t,id:n,pluginId:e,localId:t.id,light:this.qualifyReference(e,t.light),dark:this.qualifyReference(e,t.dark)}}qualify(e,t){this.validateLocalId(t);let n=`${e}:${t}`;if(this.contributionIds.has(n))throw Error(`Duplicate contribution id: ${n}`);return this.contributionIds.add(n),n}qualifyReference(e,t){return this.validateLocalId(t),`${e}:${t}`}isContributionActive(e,t,n,r){return t===void 0?!this.isGatewayPluginHiddenForMachine(e,n):t===n&&!this.isRemotePluginHiddenByGateway(r,t)}isRemoteDuplicateHiddenByGateway(e,t,n){return e!==void 0&&t!==void 0&&this.gatewayPluginIds.has(e)&&!this.gatewayMachineSpecificPluginIds.has(e)&&!n}isRemotePluginHiddenByGateway(e,t){return e===void 0||this.gatewayMachineSpecificPluginIds.has(e)||this.remoteMachineSpecificPluginIds.get(e)?.has(t)===!0?!1:this.gatewayPluginIds.has(e)}isGatewayPluginHiddenForMachine(e,t){return t!==`local`&&(this.gatewayMachineSpecificPluginIds.has(e)||this.remoteMachineSpecificPluginIds.get(e)?.has(t)===!0)}validatePluginId(e){if(!$h.test(e))throw Error(`Invalid plugin id: ${e}`)}validateLocalId(e){if(!eg.test(e))throw Error(`Invalid contribution id: ${e}`)}parseMachineSpecific(e,t){if(t===void 0)return!1;if(typeof t!=`boolean`)throw Error(`Invalid plugin machineSpecific value for ${e}: ${lg(t)}`);return t}};function ig(e,t){return tg.get(e)?.(t)??e}function ag(e,t){return ng.get(e)?.(t)??e}function og(e,t){return tg.set(e,t),e}function sg(e,t){return ng.set(e,t),e}function cg(e,t,n){let r=e.get(t);r===void 0?e.set(t,new Set([n])):r.add(n)}function lg(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)return String(e);try{return JSON.stringify(e)}catch{return Object.prototype.toString.call(e)}}function ug(e){return e.state.selectedMachine?.id??`local`}var dg=/^[a-z][a-z0-9.-]*$/u;function fg(e){return dg.test(e)}var pg=`machine.`;function mg(e,t){if(e===``)throw Error(`Machine id is required`);if(!fg(t))throw Error(`Invalid PI WEB plugin id: ${t}`);return`${pg}${hg(e)}.${t}`}function hg(e){return[...new TextEncoder().encode(e)].map(e=>e.toString(16).padStart(2,`0`)).join(``)}async function gg(e=`pi-web-plugins/manifest.json`,t={}){let n=Dt(e),r=await yg(n);if(r===void 0)return[];let i=[];for(let e of r.plugins)if(t.shouldLoadPlugin?.(e)!==!1)try{let r=_g(e.module,n),a=Sg(await(t.moduleLoader??vg)(r),r);i.push({id:t.machineId===void 0?e.id:mg(t.machineId,e.id),plugin:a,machineSpecific:e.machineSpecific,...t.machineId===void 0?{}:{machineId:t.machineId,sourcePluginId:e.id}})}catch(t){console.warn(`Failed to load PI WEB plugin ${e.module}`,t)}return i}function _g(e,t,n){return e.startsWith(`/`)?n===void 0?Dt(e):Dt(e,n):new URL(e,t).toString()}async function vg(e){return Km(()=>import(e),[],import.meta.url)}async function yg(e){let t=await fetch(e,{cache:`no-store`});if(t.status!==404){if(!t.ok)throw Error(`Failed to load plugin manifest: ${t.statusText}`);return bg(await t.json())}}function bg(e){if(!wg(e)||!Array.isArray(e.plugins))throw Error(`Invalid plugin manifest`);return{plugins:e.plugins.map(e=>{if(!wg(e)||typeof e.id!=`string`||e.id===``||typeof e.module!=`string`||e.module===``)throw Error(`Invalid plugin manifest entry`);return{id:e.id,module:e.module,machineSpecific:xg(e.machineSpecific)}})}}function xg(e){if(e===void 0)return!1;if(typeof e!=`boolean`)throw Error(`Invalid plugin manifest entry`);return e}function Sg(e,t){if(!wg(e))throw Error(`Plugin module ${t} did not export an object`);let n=e.default;if(!Cg(n))throw Error(`Plugin module ${t} default export is not a PiWebPlugin`);return n}function Cg(e){return wg(e)&&e.apiVersion===1&&typeof e.name==`string`&&typeof e.activate==`function`}function wg(e){return typeof e==`object`&&!!e}var Tg=class{constructor(e,t){this.registerPlugins=e,this.shouldLoadRemotePlugin=t,this.loadedMachineIds=new Set,this.machineLoads=new Map}ensureGatewayLoaded(){return this.gatewayLoad??=this.registerPlugins(`PI WEB 插件`,()=>gg()),this.gatewayLoad}async loadForMachine(e){if(await this.ensureGatewayLoaded(),e.kind!==`remote`||this.loadedMachineIds.has(e.id))return;let t=this.machineLoads.get(e.id);if(t!==void 0)return t;let n=this.registerPlugins(`来自 ${e.name} 的 PI WEB 插件`,()=>gg(`api/machines/${encodeURIComponent(e.id)}/pi-web-plugins/manifest.json`,{machineId:e.id,shouldLoadPlugin:e=>this.shouldLoadRemotePlugin(e.id,e.machineSpecific)})).then(t=>{t&&this.loadedMachineIds.add(e.id)}).finally(()=>{this.machineLoads.delete(e.id)});this.machineLoads.set(e.id,n),await n}},Eg=[`(display-mode: standalone)`,`(display-mode: fullscreen)`,`(display-mode: minimal-ui)`];function Dg(){return typeof window>`u`||!(`matchMedia`in window)?[]:Eg.map(e=>window.matchMedia(e))}function Og(e,t=kg()){return e.some(e=>e.matches)||Ag(t)}function kg(){return typeof navigator>`u`?void 0:navigator}function Ag(e){return e!==void 0&&`standalone`in e&&e.standalone===!0}var jg=class{constructor(e=Mg()){this.scheduler=e}repair(e){if(!e){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()},250)}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);let e=this.scheduler.documentElement;e!==void 0&&(e.scrollTop=0);let t=this.scheduler.body;t!==void 0&&(t.scrollTop=0)}};function Mg(){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}}}var Ng=`(max-width: 760px)`,Pg=`(max-width: 1180px)`,Fg=class{constructor(e,t={}){this.host=e,this.onMobileNavigationMediaChange=e=>{this.isMobileNavigationLayout!==e.matches&&(this.isMobileNavigationLayout=e.matches,this.host.requestUpdate())},this.onStackedWorkspaceMediaChange=e=>{this.isStackedWorkspaceLayout!==e.matches&&(this.isStackedWorkspaceLayout=e.matches,this.host.requestUpdate())},this.onPwaDisplayModeChange=()=>{let e=Og(this.pwaDisplayModeMedia);this.isPwaDisplayMode!==e&&(this.isPwaDisplayMode=e,this.host.requestUpdate())},e.addController(this),this.mobileNavigationMedia=t.mobileNavigationMedia??Ig(),this.stackedWorkspaceMedia=t.stackedWorkspaceMedia??Lg(),this.pwaDisplayModeMedia=t.pwaDisplayModeMedia??Dg(),this.viewportPositionRepairer=t.viewportPositionRepairer??new jg,this.isMobileNavigationLayout=this.mobileNavigationMedia?.matches??!1,this.isStackedWorkspaceLayout=this.stackedWorkspaceMedia?.matches??!1,this.isPwaDisplayMode=Og(this.pwaDisplayModeMedia)}hostConnected(){this.mobileNavigationMedia?.addEventListener(`change`,this.onMobileNavigationMediaChange),this.stackedWorkspaceMedia?.addEventListener(`change`,this.onStackedWorkspaceMediaChange);for(let e of this.pwaDisplayModeMedia)e.addEventListener(`change`,this.onPwaDisplayModeChange)}hostDisconnected(){this.mobileNavigationMedia?.removeEventListener(`change`,this.onMobileNavigationMediaChange),this.stackedWorkspaceMedia?.removeEventListener(`change`,this.onStackedWorkspaceMediaChange);for(let e of this.pwaDisplayModeMedia)e.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(e,t){return Rg(e,{isMobileNavigationLayout:this.isMobileNavigationLayout,isStackedWorkspaceLayout:this.isStackedWorkspaceLayout,hasSelectedSession:t})}repairViewportPosition(){this.viewportPositionRepairer.repair(this.shouldRepairViewportPosition())}shouldRepairViewportPosition(){return this.isMobileNavigationLayout||this.isPwaDisplayMode}};function Ig(){if(!(typeof window>`u`||!(`matchMedia`in window)))return window.matchMedia(Ng)}function Lg(){if(!(typeof window>`u`||!(`matchMedia`in window)))return window.matchMedia(Pg)}function Rg(e,t){let n=e??(t.isMobileNavigationLayout?`navigation`:`chat`);return t.isMobileNavigationLayout||!t.isStackedWorkspaceLayout||!t.hasSelectedSession||n===`navigation`||n===`chat`?n:`chat`}var zg=class{constructor(e,t={}){this.callbacks=e,this.refreshes=new $o,this.connected=!1,this.onFocus=()=>{this.handleResumeSignal()},this.onVisibilityChange=()=>{this.isDocumentVisible()&&this.handleResumeSignal()},this.windowTarget=t.windowTarget??Bg(),this.documentTarget=t.documentTarget??Vg(),this.isDocumentVisible=t.isDocumentVisible??Hg,this.scheduleFrame=t.scheduleFrame??Ug}connect(){this.connected||(this.connected=!0,this.windowTarget?.addEventListener(`focus`,this.onFocus),this.documentTarget?.addEventListener(`visibilitychange`,this.onVisibilityChange))}disconnect(){this.connected&&(this.connected=!1,this.windowTarget?.removeEventListener(`focus`,this.onFocus),this.documentTarget?.removeEventListener(`visibilitychange`,this.onVisibilityChange),this.scheduledRefresh?.cancel(),this.scheduledRefresh=void 0)}handleResumeSignal(){this.callbacks.onResumeSignal(),this.scheduledRefresh===void 0&&(this.scheduledRefresh=this.scheduleFrame(()=>{this.scheduledRefresh=void 0,this.connected&&this.refreshes.request(`browser-resume`,async()=>{this.connected&&await this.callbacks.refreshAfterResume()}).catch(e=>{this.callbacks.onRefreshError(e)})}))}};function Bg(){return typeof window>`u`?void 0:window}function Vg(){return typeof document>`u`?void 0:document}function Hg(){return typeof document>`u`||document.visibilityState===`visible`}function Ug(e){if(typeof window<`u`&&typeof window.requestAnimationFrame==`function`){let t=window.requestAnimationFrame(()=>{e()});return{cancel:()=>{window.cancelAnimationFrame(t)}}}let t=globalThis.setTimeout(e,0);return{cancel:()=>{globalThis.clearTimeout(t)}}}var Wg=[`machines`,`projects`,`workspaces`,`sessions`];function Gg(e){return e.selectedProject===void 0?`projects`:e.selectedWorkspace===void 0?`workspaces`:`sessions`}function Kg(e,t){if(e!==`none`)return e??Gg(t)}function qg(e,t){return t.isMobileLayout?Kg(t.expanded,t.state)!==e:t.collapsedSections?.includes(e)??!1}function Jg(e,t,n){return n.isMobileLayout?Kg(e,n.state)===t?`none`:t:e}function Yg(e,t,n){return n?t:e}function Xg(e,t){let n=new Set(e);return n.has(t)?n.delete(t):n.add(t),$g(n)}function Zg(e){return Wg[Wg.indexOf(e)+1]}var Qg=class{hostConnected(){}constructor(e,t,n){this.host=e,this.getState=t,this.isMobileLayout=n,this.collapsedSections=[],e.addController(this)}expandedSection(){return Kg(this.expanded,this.getState())}isCollapsed(e){return qg(e,{isMobileLayout:this.isMobileLayout(),expanded:this.expanded,state:this.getState(),collapsedSections:this.collapsedSections})}toggle(e){if(this.isMobileLayout()){this.setExpanded(Jg(this.expanded,e,{isMobileLayout:!0,state:this.getState()}));return}this.setCollapsedSections(Xg(this.collapsedSections,e))}expand(e){if(this.isMobileLayout()){this.setExpanded(Yg(this.expanded,e,!0));return}this.setCollapsedSections(this.collapsedSections.filter(t=>t!==e))}advanceAfterSelection(e){if(!this.isMobileLayout())return;let t=Zg(e);t!==void 0&&this.expand(t)}open(e,t){this.isMobileLayout()&&(this.expand(e),t())}setExpanded(e){this.expanded!==e&&(this.expanded=e,this.host.requestUpdate())}setCollapsedSections(e){e_(this.collapsedSections,e)||(this.collapsedSections=e,this.host.requestUpdate())}};function $g(e){let t=new Set(e);return Wg.filter(e=>t.has(e))}function e_(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}var t_=class{hostConnected(){}constructor(e){this.host=e,this.navigationPanelCollapsed=!1,this.workspacePanelCollapsed=!1,e.addController(this)}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(e){return[`shell`,n_(e),...this.navigationPanelCollapsed?[`navigation-panel-collapsed`]:[],...this.workspacePanelCollapsed?[`workspace-panel-collapsed`]:[]].join(` `)}};function n_(e){return e===`navigation`?`navigation-view`:e===`chat`?`chat-view`:`workspace-view`}var r_=`pi-web:panel-sizes:v1`,i_={navigation:{minWidth:180,maxWidth:4096,defaultWidth:340,keyboardStep:24,largeKeyboardStep:72},workspace:{minWidth:240,maxWidth:4096,defaultWidth:480,keyboardStep:24,largeKeyboardStep:72}},a_=class{constructor(e,t={}){this.host=e,e.addController(this),this.storage=t.storage??y_(),this.panelSizes=d_(this.storage)}hostConnected(){}constraints(e){return o_(e)}panelWidth(e,t){return u_(e,t??this.storedPanelWidth(e)??this.constraints(e).defaultWidth)}resizePanel(e,t,n={}){let r=u_(e,t);this.storedPanelWidth(e)!==r&&(this.panelSizes=h_(this.panelSizes,e,r),n.persist!==!1&&this.persistPanelSizes(),this.host.requestUpdate())}resetPanel(e,t={}){this.storedPanelWidth(e)!==void 0&&(this.panelSizes=g_(this.panelSizes,e),t.persist!==!1&&this.persistPanelSizes(),this.host.requestUpdate())}resetPanels(e={}){this.panelSizes.navigationPanelWidth===void 0&&this.panelSizes.workspacePanelWidth===void 0||(this.panelSizes={},e.persist!==!1&&this.persistPanelSizes(),this.host.requestUpdate())}persistPanelSizes(){f_(this.panelSizes,this.storage)}shellStyle(e={}){let t=[];return this.panelSizes.navigationPanelWidth!==void 0&&t.push(`--navigation-panel-size: ${v_(u_(`navigation`,this.panelSizes.navigationPanelWidth,e.navigation))};`),this.panelSizes.workspacePanelWidth!==void 0&&t.push(`--workspace-panel-size: ${v_(u_(`workspace`,this.panelSizes.workspacePanelWidth,e.workspace))};`),t.join(` `)}storedPanelWidth(e){return e===`navigation`?this.panelSizes.navigationPanelWidth:this.panelSizes.workspacePanelWidth}};function o_(e){return i_[e]}function s_(e,t,n){return e===`navigation`?n-t:t-n}function c_(e,t,n,r,i=o_(e)){return u_(e,t+s_(e,n,r),i)}function l_(e,t,n,r={}){let i=r.constraints??o_(e);if(n===`Home`)return i.minWidth;if(n===`End`)return i.maxWidth;let a=__(e,n,r.largeStep===!0?i.largeKeyboardStep:i.keyboardStep);if(a!==void 0)return u_(e,t+a,i)}function u_(e,t,n=o_(e)){return Number.isFinite(t)?Math.round(Math.min(Math.max(t,n.minWidth),n.maxWidth)):n.defaultWidth}function d_(e=y_()){try{let t=e?.getItem(r_);return t==null||t===``?{}:p_(JSON.parse(t))}catch{return{}}}function f_(e,t=y_()){if(t!==void 0)try{if(e.navigationPanelWidth===void 0&&e.workspacePanelWidth===void 0){t.removeItem(r_);return}let n={version:1};e.navigationPanelWidth!==void 0&&(n.navigationPanelWidth=u_(`navigation`,e.navigationPanelWidth)),e.workspacePanelWidth!==void 0&&(n.workspacePanelWidth=u_(`workspace`,e.workspacePanelWidth)),t.setItem(r_,JSON.stringify(n))}catch{}}function p_(e){if(!b_(e)||e.version!==1)return{};let t={},n=m_(e.navigationPanelWidth),r=m_(e.workspacePanelWidth);return n!==void 0&&(t.navigationPanelWidth=u_(`navigation`,n)),r!==void 0&&(t.workspacePanelWidth=u_(`workspace`,r)),t}function m_(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function h_(e,t,n){return t===`navigation`?{...e,navigationPanelWidth:n}:{...e,workspacePanelWidth:n}}function g_(e,t){return t===`navigation`?e.workspacePanelWidth===void 0?{}:{workspacePanelWidth:e.workspacePanelWidth}:e.navigationPanelWidth===void 0?{}:{navigationPanelWidth:e.navigationPanelWidth}}function __(e,t,n){if(e===`navigation`)return t===`ArrowRight`?n:t===`ArrowLeft`?-n:void 0;if(t===`ArrowLeft`)return n;if(t===`ArrowRight`)return-n}function v_(e){return`${String(Math.round(e))}px`}function y_(){try{return typeof window>`u`?void 0:window.localStorage}catch{return}}function b_(e){return typeof e==`object`&&!!e}function x_(){let 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:C_(e.get(`tool`)),view:w_(e.get(`view`))}}function S_(e,t){let n=new URL(window.location.href);n.searchParams.delete(`machine`),n.searchParams.delete(`project`),n.searchParams.delete(`workspace`),n.searchParams.delete(`session`),n.searchParams.delete(`tool`),n.searchParams.delete(`view`),e.machineId!==void 0&&e.machineId!==``&&e.machineId!==`local`&&n.searchParams.set(`machine`,e.machineId),e.projectId!==void 0&&e.projectId!==``&&n.searchParams.set(`project`,e.projectId),e.workspaceId!==void 0&&e.workspaceId!==``&&n.searchParams.set(`workspace`,e.workspaceId),e.sessionId!==void 0&&e.sessionId!==``&&n.searchParams.set(`session`,e.sessionId),e.tool!==void 0&&n.searchParams.set(`tool`,e.tool),e.view!==void 0&&n.searchParams.set(`view`,e.view),`${n.pathname}${n.search}${n.hash}`!=`${window.location.pathname}${window.location.search}${window.location.hash}`&&(t?.replace===!0?window.history.replaceState({},``,n):window.history.pushState({},``,n))}function C_(e){return e===`files`?`core:workspace.files`:e===`git`?`core:workspace.git`:T_(e)?e:void 0}function w_(e){return e===`chat`?`chat`:e===`files`?`core:workspace.files`:e===`git`?`core:workspace.git`:T_(e)?e:void 0}function T_(e){return e!==null&&/^[a-z][a-z0-9.-]*:[a-z][a-z0-9.-]*$/u.test(e)}function E_(){return O_(new URLSearchParams(window.location.search).get(`settings`))}function D_(e,t){let n=new URL(window.location.href);e===void 0?n.searchParams.delete(`settings`):n.searchParams.set(`settings`,e),`${n.pathname}${n.search}${n.hash}`!=`${window.location.pathname}${window.location.search}${window.location.hash}`&&(t?.replace===!0?window.history.replaceState({},``,n):window.history.pushState({},``,n))}function O_(e){if(e===`general`)return`general`;if(e===`sessiond`||e===`sessions`)return`sessiond`;if(e===`packages`||e===`pi-packages`)return`packages`;if(e===`plugins`)return`plugins`;if(e===`shortcuts`||e===`keyboard`||e===`keyboard-shortcuts`)return`shortcuts`}function k_(e,t){return t===void 0?e:e.map(e=>j_(e,t))}function A_(e,t){let n=new Set(Af(e,t,{enabledOnly:!0}).filter(e=>e.active).map(e=>e.action.id));return k_(e,t).map(e=>e.shortcut!==void 0&&!n.has(e.id)?M_(e):e)}function j_(e,t){if(!Object.hasOwn(t,e.id))return e;let n=t[e.id];return n===void 0?e:n===null?M_(e):{...e,shortcut:n}}function M_(e){let t={...e};return delete t.shortcut,t}function N_(e,t){let n=t.api??oo,r=t.pollIntervalMs??1e3,i=t.setTimeout??I_(),a=t.clearTimeout??L_();return{async runCommand(o){let s=await n.runTerminalCommand(e,o);return o.open===!0&&t.openTerminal(o.workspace,{terminalId:s.terminalId}),{run:s,completed:P_(s,n,r,i,a)}},listCommandRuns:e=>n.listCommandRuns(e),getCommandRun:e=>n.getCommandRun(e),open:e=>{t.openTerminal(void 0,e)}}}function P_(e,t,n,r,i){return F_(e)?Promise.resolve(e):new Promise((a,o)=>{let s,c=!1,l=e=>{c||(c=!0,s!==void 0&&i(s),a(e))},u=e=>{c||(c=!0,s!==void 0&&i(s),o(e instanceof Error?e:Error(String(e))))},d=()=>{t.getCommandRun(e.id).then(e=>{if(e!==void 0&&F_(e)){l(e);return}s=r(d,n)}).catch(u)};s=r(d,n)})}function F_(e){return e.status===`succeeded`||e.status===`failed`}function I_(){return(e,t)=>globalThis.setTimeout(e,t)}function L_(){return e=>{globalThis.clearTimeout(e)}}function R_(e,t=`活动中`,n){if(e===void 0)return n===void 0?void 0:g`<span class="activity-indicator unread" role="img" aria-label=${n} title=${n}></span>`;if(n===void 0)return g`<span class=${`activity-indicator ${e}`} role="img" aria-label=${t} title=${t}></span>`;let r=`${n} · ${t}`;return g`<span class="unread-ring" role="img" aria-label=${r} title=${r}><span class=${`activity-indicator ${e}`} aria-hidden="true"></span></span>`}function z_(e,t=`活动中`,n){let r=R_(e,t,n);if(r!==void 0)return g`<span class="action-activity">${r}</span>`}var B_=0,V_=120;function H_(e,t={}){if(typeof HTMLElement>`u`||typeof window>`u`||!(e instanceof HTMLElement))return``;let n=e.getBoundingClientRect(),r=t.constrainTo===`viewport`?W_():U_(e),i=window.innerWidth,a=window.innerHeight,o=Math.max(0,r.left),s=Math.min(i,r.right),c=Math.max(0,r.top),l=Math.min(a,r.bottom),u=Math.min(n.right,s),d=l-n.bottom-B_,f=n.top-c-B_;return[...d<V_&&f>d?[`bottom: ${G_(a-n.top+B_)};`,`max-height: ${G_(Math.max(0,f))};`]:[`top: ${G_(n.bottom+B_)};`,`max-height: ${G_(Math.max(0,d))};`],`right: ${G_(Math.max(0,i-u))};`,`max-width: ${G_(Math.max(0,u-o))};`].join(` `)}function U_(e){let t=e.getRootNode();return typeof ShadowRoot<`u`&&t instanceof ShadowRoot&&t.host instanceof HTMLElement?t.host.getBoundingClientRect():W_()}function W_(){return{top:0,right:window.innerWidth,bottom:window.innerHeight,left:0}}function G_(e){return`${String(Math.round(e))}px`}var K_=class{constructor(e){this.host=e,this.menuStyle=``,this.onDocumentClick=e=>{e.composedPath().includes(this.host)||this.close()},e.addController(this)}hostConnected(){document.addEventListener(`click`,this.onDocumentClick)}hostDisconnected(){document.removeEventListener(`click`,this.onDocumentClick)}isOpen(e){return this.openId===e}toggle(e,t){if(this.openId===e){this.close();return}this.menuStyle=H_(t,{constrainTo:`viewport`}),this.openId=e,this.host.requestUpdate()}close(){this.openId===void 0&&this.menuStyle===``||(this.openId=void 0,this.menuStyle=``,this.host.requestUpdate())}closeIfOpenIdMissing(e){this.openId!==void 0&&!e(this.openId)&&this.close()}closeIf(e){e&&this.close()}closeForEscape(e,t){return e.key!==`Escape`||this.openId!==t?!1:(e.preventDefault(),e.stopPropagation(),this.close(),!0)}},q_=[`a[href]`,`button`,`input`,`select`,`textarea`,`summary`,`[role='button']`,`[role='link']`,`[contenteditable='true']`].join(`,`);function J_(e){return e.composedPath().some(e=>Y_(e,q_))}function Y_(e,t){if(typeof Element<`u`&&e instanceof Element)return e.matches(t);if(!(`matches`in e))return!1;let{matches:n}=e;return typeof n==`function`&&n.call(e,t)===!0}function X_(e,t){J_(e)||t()}function Z_(e,t){return J_(e)?!1:e.key===`Enter`||e.key===` `?(e.preventDefault(),t.activate(),!0):e.key===`ArrowUp`?$_(e,()=>{ev(e.currentTarget,-1)}):e.key===`ArrowDown`?$_(e,()=>{ev(e.currentTarget,1)}):e.key===`Home`?$_(e,()=>{tv(e.currentTarget,0)}):e.key===`End`?$_(e,()=>{tv(e.currentTarget,-1)}):e.key===`ArrowLeft`&&t.previousSection!==void 0?$_(e,t.previousSection):e.key===`ArrowRight`&&t.nextSection!==void 0?$_(e,t.nextSection):e.key===`Escape`&&t.cancel!==void 0&&$_(e,t.cancel)}function Q_(e,t={}){let n=e.querySelector(`.action-row.selected`)??e.querySelector(`.action-row`)??(t.fallbackSelector===void 0?void 0:e.querySelector(t.fallbackSelector));return n==null?!1:(n.focus(),n.scrollIntoView({block:`nearest`}),!0)}function $_(e,t){return e.preventDefault(),e.stopPropagation?.(),t(),!0}function ev(e,t){let n=rv(e),r=av(e);if(r===void 0||n.length===0)return;let i=n.indexOf(r);i<0||nv(n,i+t)}function tv(e,t){let n=rv(e);n.length!==0&&nv(n,t<0?n.length-1:t)}function nv(e,t){let n=e[Math.min(Math.max(t,0),e.length-1)];n?.focus(),n?.scrollIntoView({block:`nearest`})}function rv(e){let t=av(e)?.getRootNode();return t===void 0||!iv(t)?[]:Array.from(t.querySelectorAll(`.action-row`))}function iv(e){return typeof Document<`u`&&e instanceof Document||typeof DocumentFragment<`u`&&e instanceof DocumentFragment}function av(e){if(!(typeof HTMLElement>`u`||!(e instanceof HTMLElement)))return e.closest(`.action-row`)??void 0}var ov=h`
|
|
845
845
|
:host { display: flex; flex-direction: column; min-height: 0; overflow: hidden; color: var(--pi-text); font: 14px system-ui, sans-serif; }
|
|
846
846
|
:host([collapsed]) { flex: 0 0 auto; min-height: auto; overflow: hidden; }
|
|
847
847
|
section { box-sizing: border-box; flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; padding: 10px; }
|
|
@@ -2251,7 +2251,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2251
2251
|
<span>代理正在总结较早的上下文。压缩完成前,新提示词将进入队列。</span>
|
|
2252
2252
|
${this.pendingMessageCount>0?g`<small>${this.pendingMessageCount} 条消息正在排队</small>`:null}
|
|
2253
2253
|
</aside>
|
|
2254
|
-
`:null}activityState(){let e=this.status;return e===void 0?this.activity?.label:e.isCompacting?`compacting`:e.isBashRunning?`bash`:e.isStreaming?`running`:e.pendingMessageCount>0?`queued`:`idle`}activityText(e){
|
|
2254
|
+
`:null}activityState(){let e=this.status;return e===void 0?this.activity?.label:e.isCompacting?`compacting`:e.isBashRunning?`bash`:e.isStreaming?`running`:e.pendingMessageCount>0?`queued`:`idle`}activityText(e){return KS(e,this.activity)}renderConversationRail(){if(!this.messages.length||this.messageTotal<=0)return null;let e=this.conversationDisplayTotal();return g`<conversation-meter .positionPercent=${this.conversationPositionPercent(e)} .loadedPercent=${this.hasMore?OS(this.messages.length/e*100):100}></conversation-meter>`}conversationDisplayTotal(){return!this.hasMore&&this.messageStart===0?Math.max(1,this.messages.length):Math.max(1,this.messageTotal,this.messageStart+this.messages.length)}conversationPositionPercent(e=this.conversationDisplayTotal()){if(e<=1)return 100;let t=this.pinnedToBottom?this.messageStart+this.messages.length-1:this.messageStart;return OS(kS(this.currentConversationIndex??t,0,e-1)/(e-1)*100)}renderHistoryBoundary(){let e=this.historyRangeLabel();return this.loadingMore?g`<div class="history-boundary"><span>正在加载较早消息…</span>${e}</div>`:this.hasMore?g`
|
|
2255
2255
|
<div class="history-boundary">
|
|
2256
2256
|
<button type="button" class="history-load-button" ?disabled=${this.loadMoreRequested} @click=${()=>{this.requestLoadMore()}}>加载较早消息</button>
|
|
2257
2257
|
<span>向上滚动以加载较早消息</span>
|
|
@@ -2325,31 +2325,31 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2325
2325
|
<summary>${e.isError?`✖`:`✓`} ${e.toolName} result</summary>
|
|
2326
2326
|
<formatted-text .text=${e.text}></formatted-text>
|
|
2327
2327
|
</details>
|
|
2328
|
-
`:null}onGroupToggle(e,t,n){let r=t.currentTarget;r instanceof HTMLDetailsElement&&this.disclosures.applyToggle(e,r.open,n)&&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){let t=e.touches[0]?.clientY;this.touchStartY!==void 0&&t!==void 0&&t>this.touchStartY&&this.canScrollUp()&&(this.pinnedToBottom=!1)}updatePinnedToBottomFromScroll(){let e=this.chat;if(!e)return;let t=this.didChatHeightChange(),n=this.pinnedToBottom,r=e.scrollTop<this.lastScrollTop;if(t&&n){this.lastClientHeight=e.clientHeight,this.scrollToBottom();return}this.isAtBottom()?this.pinnedToBottom=!0:r?this.pinnedToBottom=!1:this.pinnedToBottom=this.isNearBottom(),this.lastScrollTop=e.scrollTop,this.lastClientHeight=e.clientHeight}didChatHeightChange(){let e=this.chat;return e!==void 0&&this.lastClientHeight!==0&&e.clientHeight!==this.lastClientHeight}isPrependingMessages(e){let 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;let e=this.chat;e&&By({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(){let e=this.chat;return!e||eb(e)}isAtBottom(){let e=this.chat;return!e||$y(e)<2}canScrollUp(){let e=this.chat;return e!==void 0&&e.scrollTop>0}scrollToBottom(){this.scrollToBottomFrame===void 0&&(this.scrollToBottomFrame=requestAnimationFrame(()=>{this.scrollToBottomFrame=void 0;let e=this.chat;e&&this.withSuppressedScrollSave(()=>{e.scrollTop=e.scrollHeight,this.lastScrollTop=e.scrollTop,this.lastClientHeight=e.clientHeight})}))}isNewPendingAsk(e){return this.pendingAsk!==void 0&&(typeof e!=`object`||!e||Reflect.get(e,`askId`)!==this.pendingAsk.askId)}isNewOpenDialog(e){let t=this.pendingDialogs[0];if(t===void 0)return!1;let n=(Array.isArray(e)?e:[])[0];return typeof n!=`object`||!n||Reflect.get(n,`dialogId`)!==t.dialogId}scrollToOpenAsk(){this.scrollToOpenAskFrame===void 0&&(this.scrollToBottomFrame!==void 0&&(cancelAnimationFrame(this.scrollToBottomFrame),this.scrollToBottomFrame=void 0),this.scrollToOpenAskFrame=requestAnimationFrame(()=>{this.scrollToOpenAskFrame=void 0,this.withSuppressedScrollSave(()=>{this.alignOpenAskToTop()})}))}alignOpenAskToTop(){let e=this.chat,t=this.renderRoot.querySelector(`.chat > ask-user-card`);return e===void 0||t===null?!1:(e.scrollTop+=t.getBoundingClientRect().top-e.getBoundingClientRect().top,this.syncScrollMetrics(),this.pinnedToBottom=this.isNearBottom(),!0)}scrollToOpenDialog(){this.scrollToOpenDialogFrame===void 0&&(this.scrollToBottomFrame!==void 0&&(cancelAnimationFrame(this.scrollToBottomFrame),this.scrollToBottomFrame=void 0),this.scrollToOpenDialogFrame=requestAnimationFrame(()=>{this.scrollToOpenDialogFrame=void 0,this.withSuppressedScrollSave(()=>{this.alignOpenDialogToTop()})}))}alignOpenDialogToTop(){let e=this.chat,t=this.renderRoot.querySelector(`.chat > extension-dialog-card.open-dialog-card`);return e===void 0||t===null?!1:(e.scrollTop+=t.getBoundingClientRect().top-e.getBoundingClientRect().top,this.syncScrollMetrics(),this.pinnedToBottom=this.isNearBottom(),!0)}restoreScrollPosition(){let e=this.sessionId;this.restoreScrollFrame!==void 0&&cancelAnimationFrame(this.restoreScrollFrame),this.restoreScrollFrame=requestAnimationFrame(()=>{this.restoreScrollFrame=void 0,this.sessionId===e&&this.withSuppressedScrollSave(()=>{if(this.pendingDialogs.length>0&&this.scrollController.readPosition(e)===void 0&&this.alignOpenDialogToTop()||this.pendingAsk!==void 0&&this.scrollController.readPosition(e)===void 0&&this.alignOpenAskToTop())return;let t=this.scrollController.restorePosition(e,this.chat,this.scrollAnchorElements(),{fallbackToBottom:this.shouldFallbackToBottomForMissingAnchor()});this.handleScrollRestoreResult(e,t)})})}continuePendingScrollRestore(){let 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(()=>{let n=this.scrollController.restoreExplicitPosition(t,this.chat,this.scrollAnchorElements(),{fallbackToBottom:this.shouldFallbackToBottomForMissingAnchor()});this.handleScrollRestoreResult(e,n)})}))}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;let n=this.chat;n===void 0||!this.hasMore||this.loadingMore||(n.scrollTop=0,this.syncScrollMetrics(),this.requestLoadMore())}shouldFallbackToBottomForMissingAnchor(){return!this.hasMore}updatePinnedToBottomAfterRestore(e){e===`bottom`?this.pinnedToBottom=!0:e===`restored`&&(this.pinnedToBottom=this.isNearBottom())}syncScrollMetrics(){let e=this.chat;e!==void 0&&(this.lastScrollTop=e.scrollTop,this.lastClientHeight=e.clientHeight)}cancelPrependRestore(){this.prependRestoreToken+=1,this.suppressLoadMoreRequests=!1}capturePrependScrollAnchor(){let e=this.chat;if(e)return My(e,this.scrollMarkers())}restorePrependScrollAnchor(e){if(!this.chat||!e)return;this.suppressLoadMoreRequests=!0,this.suppressScrollSave=!0;let t=this.prependRestoreToken+1;this.prependRestoreToken=t;let n=0,r=()=>{let i=this.chat;if(!(!i||t!==this.prependRestoreToken)){if(Ny(i,e,e.markerId===void 0?void 0:this.scrollMarkerAt(e.markerId)),this.lastScrollTop=i.scrollTop,n+=1,n<30){requestAnimationFrame(r);return}requestAnimationFrame(()=>{t===this.prependRestoreToken&&(this.suppressScrollSave=!1,this.suppressLoadMoreRequests=!1)})}};r()}saveScrollPosition(e=this.sessionId){e&&this.scrollController.savePosition(e,this.chat,this.scrollAnchorElements())}scheduleScrollPositionSave(){let e=this.sessionId;this.scrollController.scheduleSave(e,e=>{this.sessionId===e&&this.saveScrollPosition(e)})}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}let e=this.conversationDisplayTotal(),t=this.firstVisibleArticle(),n=Number(t?.dataset.index);if(Number.isFinite(n)){this.currentConversationIndex=kS(n,0,Math.max(0,e-1));return}this.currentConversationIndex=kS(this.pinnedToBottom?this.messageStart+this.messages.length-1:this.messageStart,0,Math.max(0,e-1))}scrollMarkers(){return this.scrollMarkerElements}scrollMarkerAt(e){return this.scrollMarkerElementById.get(e)}firstVisibleArticle(){let e=this.chat;if(e!==void 0)return rb(e,this.primaryArticleElements)??rb(e,this.articles())}articles(){return this.articleElements}scrollAnchorElements(){return this.scrollAnchorElementIndex}syncTranscriptElementIndex(){let e=this.currentTranscriptStructureKey();e!==this.transcriptStructureKey&&(this.transcriptStructureKey=e,this.primaryArticleElements=Array.from(this.renderRoot.querySelectorAll(`article.msg`)),this.articleElements=Array.from(this.renderRoot.querySelectorAll(`article.msg, details.msg`)),this.scrollAnchorElementIndex=Array.from(this.renderRoot.querySelectorAll(`[data-scroll-anchor-id]`)),this.scrollMarkerElements=Array.from(this.renderRoot.querySelectorAll(`.scroll-marker`)),this.scrollMarkerElementById=new Map(this.scrollMarkerElements.flatMap(e=>{let t=e.dataset.markerId;return t===void 0?[]:[[t,e]]})))}currentTranscriptStructureKey(){let e=this.groupedMessages(),t=e.map((t,n)=>{if(t.kind!==`group`)return[t.kind,t.index];let r=this.isLiveTailGroup(e,n),i=this.groupDisclosureKey(t.startIndex,t.endIndex,r);return[t.kind,t.startIndex,t.endIndex,this.disclosures.isOpen(i,r)]});return JSON.stringify([this.sessionId,this.messageStart,t,this.hasMore,this.loadingMore,this.pendingAsk?.askId])}clearTranscriptElementIndex(){this.transcriptStructureKey=``,this.primaryArticleElements=[],this.articleElements=[],this.scrollAnchorElementIndex=[],this.scrollMarkerElements=[],this.scrollMarkerElementById.clear()}withSuppressedScrollSave(e){this.suppressScrollSave=!0,e(),requestAnimationFrame(()=>{requestAnimationFrame(()=>{this.suppressScrollSave=!1})})}groupDisclosureKey(e,t,n){return n?`${this.sessionId}:live:${String(e)}`:`${this.sessionId}:${String(t)}`}messageAnchorKey(e){return FS(e)}groupRenderKey(e){return IS(e)}groupAnchorKey(e){return IS(e)}eventAnchorKey(e){return LS(e)}messageScrollMarkerId(e){return FS(e)}groupScrollMarkerId(e){return RS(e)}static{this.styles=Mm}};V([x({attribute:!1})],K.prototype,`messages`,void 0),V([x()],K.prototype,`sessionId`,void 0),V([x({type:Number})],K.prototype,`messageStart`,void 0),V([x({type:Number})],K.prototype,`messageEnd`,void 0),V([x({type:Number})],K.prototype,`messageTotal`,void 0),V([x({type:Boolean})],K.prototype,`hasMore`,void 0),V([x({type:Boolean})],K.prototype,`loadingMore`,void 0),V([x({type:Boolean})],K.prototype,`isSendingPrompt`,void 0),V([x({type:Boolean})],K.prototype,`isCompacting`,void 0),V([x({type:Number})],K.prototype,`pendingMessageCount`,void 0),V([x({attribute:!1})],K.prototype,`clientQueuedMessages`,void 0),V([x({attribute:!1})],K.prototype,`status`,void 0),V([x({attribute:!1})],K.prototype,`activity`,void 0),V([x({attribute:!1})],K.prototype,`pendingAsk`,void 0),V([x({attribute:!1})],K.prototype,`pendingDialogs`,void 0),V([x({attribute:!1})],K.prototype,`closedDialogs`,void 0),V([x({attribute:!1})],K.prototype,`onAnswerDialog`,void 0),V([x({attribute:!1})],K.prototype,`onCancelDialog`,void 0),V([x({attribute:!1})],K.prototype,`onDismissClosedDialog`,void 0),V([x({attribute:!1})],K.prototype,`askDraftSessionId`,void 0),V([x({attribute:!1})],K.prototype,`onSubmitAsk`,void 0),V([x({attribute:!1})],K.prototype,`notificationInbox`,void 0),V([x({type:Boolean})],K.prototype,`canClearServerQueue`,void 0),V([x({attribute:!1})],K.prototype,`onClearServerQueue`,void 0),V([x({attribute:!1})],K.prototype,`onDismissWarning`,void 0),V([x({attribute:!1})],K.prototype,`onDismissNotification`,void 0),V([x({attribute:!1})],K.prototype,`onDismissAllNotifications`,void 0),V([x({type:Boolean})],K.prototype,`warningsVisible`,void 0),V([x({attribute:!1})],K.prototype,`onToggleWarnings`,void 0),V([x({attribute:!1})],K.prototype,`onLoadMore`,void 0),V([C(`.chat`)],K.prototype,`chat`,void 0),V([C(`dialog.image-zoom`)],K.prototype,`imageZoomDialog`,void 0),V([S()],K.prototype,`pinnedToBottom`,void 0),V([S()],K.prototype,`zoomedImage`,void 0),V([S()],K.prototype,`expandedMetaKey`,void 0),V([S()],K.prototype,`copiedMessageKey`,void 0),V([S()],K.prototype,`currentConversationIndex`,void 0),V([S()],K.prototype,`collapsedNotificationTargetKeys`,void 0),V([S()],K.prototype,`retainedEmptyNotificationTrayTargetKey`,void 0),V([S()],K.prototype,`loadMoreRequested`,void 0),K=V([b(`chat-view`)],K);function KS(e,t){return t===`idle`?`空闲`:t===void 0?{"agent running":`代理正在运行`,"bash complete":`命令执行完成`,"bash failed":`命令执行失败`,"branch summary aborted":`分支汇总已终止`,compacting:`正在压缩上下文`,"compaction complete":`上下文压缩完成`,"compaction failed":`上下文压缩失败`,"duplicate queued message ignored":`已忽略重复的排队消息`,error:`发生错误`,"extension error":`扩展错误`,idle:`空闲`,"message complete":`消息处理完成`,"message queued":`消息已排队`,"message queued during compaction":`压缩期间消息已排队`,"message started":`消息开始处理`,"navigating session tree":`正在切换会话树`,"prompt accepted":`消息已接收`,"receiving response":`正在接收回复`,"reload failed":`重新加载失败`,"reloading resources":`正在重新加载资源`,"resources reloaded":`资源已重新加载`,running:`代理正在运行`,"running bash":`正在运行命令`,"running tool":`正在运行工具`,"session tree navigated":`已切换会话树`,"steering queued":`插队消息已排队`,"stop failed":`停止失败`,stopped:`已停止`,"summarizing branch":`正在汇总分支`,"tool complete":`工具执行完成`,"tool failed":`工具执行失败`,"tree navigation cancelled":`会话树切换已取消`,"turn complete":`本轮已完成`,"updating session":`正在更新会话`,queued:`正在排队`}[e]??e:KS(e)}var qS=new Set([`image/jpeg`,`image/png`,`image/gif`,`image/webp`]);function JS(e){return typeof e==`string`&&qS.has(e)}function YS(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`}}var XS=`application/octet-stream`,ZS=`读取附件失败。`;async function QS(e,t){let n=[],r;for(let i of e)try{let e=await t(i);n.push(nC(i,e))}catch{r=ZS}return{attachments:n,...r===void 0?{}:{error:r}}}function $S(e){return e.kind===`image`&&JS(e.mimeType)}function eC(e){return e.every(e=>$S(e))}function tC(e,t){return eC(t)?e:`folder`}function nC(e,t){return JS(e.type)?{kind:`image`,name:iC(e),mimeType:e.type,data:t,size:e.size}:{kind:`file`,name:iC(e),mimeType:rC(e),data:t,size:e.size}}function rC(e){let t=e.type.trim();return t===``?XS:t}function iC(e){return e.name===``?JS(e.type)?`pasted-image.${YS(e.type)}`:`pasted-file.bin`:e.name}var aC=`pi-web:attachment-delivery`;function oC(){try{return typeof localStorage>`u`?void 0:localStorage}catch{return}}function sC(e=oC()){try{return e?.getItem(aC)===`folder`?`folder`:`inline`}catch{return`inline`}}function cC(e,t=oC()){try{t?.setItem(aC,e)}catch{}}var lC=`(pointer: coarse), (max-width: 760px)`,uC=`pi-web.promptEnterPreference`;function dC(){return typeof window<`u`&&`matchMedia`in window?window.matchMedia(lC):void 0}function fC(e){return e===`send`||e===`newline`?e:`auto`}function pC(e=vC()){if(e===void 0)return`auto`;try{return fC(e.getItem(uC))}catch{return`auto`}}function mC(e,t=vC()){if(t!==void 0)try{t.setItem(uC,e)}catch{}}function hC(e=dC(),t=pC()){return t===`send`||t!==`newline`&&e?.matches!==!0}function gC(e,t,n=dC()){return e?n?.matches!==!0||t:!1}function _C(e,t=dC(),n=pC()){let r=hC(t,n);return e?!r:r}function vC(){if(!(typeof window>`u`))try{return window.localStorage}catch{return}}function yC(){return _`
|
|
2328
|
+
`:null}onGroupToggle(e,t,n){let r=t.currentTarget;r instanceof HTMLDetailsElement&&this.disclosures.applyToggle(e,r.open,n)&&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){let t=e.touches[0]?.clientY;this.touchStartY!==void 0&&t!==void 0&&t>this.touchStartY&&this.canScrollUp()&&(this.pinnedToBottom=!1)}updatePinnedToBottomFromScroll(){let e=this.chat;if(!e)return;let t=this.didChatHeightChange(),n=this.pinnedToBottom,r=e.scrollTop<this.lastScrollTop;if(t&&n){this.lastClientHeight=e.clientHeight,this.scrollToBottom();return}this.isAtBottom()?this.pinnedToBottom=!0:r?this.pinnedToBottom=!1:this.pinnedToBottom=this.isNearBottom(),this.lastScrollTop=e.scrollTop,this.lastClientHeight=e.clientHeight}didChatHeightChange(){let e=this.chat;return e!==void 0&&this.lastClientHeight!==0&&e.clientHeight!==this.lastClientHeight}isPrependingMessages(e){let 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;let e=this.chat;e&&By({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(){let e=this.chat;return!e||eb(e)}isAtBottom(){let e=this.chat;return!e||$y(e)<2}canScrollUp(){let e=this.chat;return e!==void 0&&e.scrollTop>0}scrollToBottom(){this.scrollToBottomFrame===void 0&&(this.scrollToBottomFrame=requestAnimationFrame(()=>{this.scrollToBottomFrame=void 0;let e=this.chat;e&&this.withSuppressedScrollSave(()=>{e.scrollTop=e.scrollHeight,this.lastScrollTop=e.scrollTop,this.lastClientHeight=e.clientHeight})}))}isNewPendingAsk(e){return this.pendingAsk!==void 0&&(typeof e!=`object`||!e||Reflect.get(e,`askId`)!==this.pendingAsk.askId)}isNewOpenDialog(e){let t=this.pendingDialogs[0];if(t===void 0)return!1;let n=(Array.isArray(e)?e:[])[0];return typeof n!=`object`||!n||Reflect.get(n,`dialogId`)!==t.dialogId}scrollToOpenAsk(){this.scrollToOpenAskFrame===void 0&&(this.scrollToBottomFrame!==void 0&&(cancelAnimationFrame(this.scrollToBottomFrame),this.scrollToBottomFrame=void 0),this.scrollToOpenAskFrame=requestAnimationFrame(()=>{this.scrollToOpenAskFrame=void 0,this.withSuppressedScrollSave(()=>{this.alignOpenAskToTop()})}))}alignOpenAskToTop(){let e=this.chat,t=this.renderRoot.querySelector(`.chat > ask-user-card`);return e===void 0||t===null?!1:(e.scrollTop+=t.getBoundingClientRect().top-e.getBoundingClientRect().top,this.syncScrollMetrics(),this.pinnedToBottom=this.isNearBottom(),!0)}scrollToOpenDialog(){this.scrollToOpenDialogFrame===void 0&&(this.scrollToBottomFrame!==void 0&&(cancelAnimationFrame(this.scrollToBottomFrame),this.scrollToBottomFrame=void 0),this.scrollToOpenDialogFrame=requestAnimationFrame(()=>{this.scrollToOpenDialogFrame=void 0,this.withSuppressedScrollSave(()=>{this.alignOpenDialogToTop()})}))}alignOpenDialogToTop(){let e=this.chat,t=this.renderRoot.querySelector(`.chat > extension-dialog-card.open-dialog-card`);return e===void 0||t===null?!1:(e.scrollTop+=t.getBoundingClientRect().top-e.getBoundingClientRect().top,this.syncScrollMetrics(),this.pinnedToBottom=this.isNearBottom(),!0)}restoreScrollPosition(){let e=this.sessionId;this.restoreScrollFrame!==void 0&&cancelAnimationFrame(this.restoreScrollFrame),this.restoreScrollFrame=requestAnimationFrame(()=>{this.restoreScrollFrame=void 0,this.sessionId===e&&this.withSuppressedScrollSave(()=>{if(this.pendingDialogs.length>0&&this.scrollController.readPosition(e)===void 0&&this.alignOpenDialogToTop()||this.pendingAsk!==void 0&&this.scrollController.readPosition(e)===void 0&&this.alignOpenAskToTop())return;let t=this.scrollController.restorePosition(e,this.chat,this.scrollAnchorElements(),{fallbackToBottom:this.shouldFallbackToBottomForMissingAnchor()});this.handleScrollRestoreResult(e,t)})})}continuePendingScrollRestore(){let 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(()=>{let n=this.scrollController.restoreExplicitPosition(t,this.chat,this.scrollAnchorElements(),{fallbackToBottom:this.shouldFallbackToBottomForMissingAnchor()});this.handleScrollRestoreResult(e,n)})}))}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;let n=this.chat;n===void 0||!this.hasMore||this.loadingMore||(n.scrollTop=0,this.syncScrollMetrics(),this.requestLoadMore())}shouldFallbackToBottomForMissingAnchor(){return!this.hasMore}updatePinnedToBottomAfterRestore(e){e===`bottom`?this.pinnedToBottom=!0:e===`restored`&&(this.pinnedToBottom=this.isNearBottom())}syncScrollMetrics(){let e=this.chat;e!==void 0&&(this.lastScrollTop=e.scrollTop,this.lastClientHeight=e.clientHeight)}cancelPrependRestore(){this.prependRestoreToken+=1,this.suppressLoadMoreRequests=!1}capturePrependScrollAnchor(){let e=this.chat;if(e)return My(e,this.scrollMarkers())}restorePrependScrollAnchor(e){if(!this.chat||!e)return;this.suppressLoadMoreRequests=!0,this.suppressScrollSave=!0;let t=this.prependRestoreToken+1;this.prependRestoreToken=t;let n=0,r=()=>{let i=this.chat;if(!(!i||t!==this.prependRestoreToken)){if(Ny(i,e,e.markerId===void 0?void 0:this.scrollMarkerAt(e.markerId)),this.lastScrollTop=i.scrollTop,n+=1,n<30){requestAnimationFrame(r);return}requestAnimationFrame(()=>{t===this.prependRestoreToken&&(this.suppressScrollSave=!1,this.suppressLoadMoreRequests=!1)})}};r()}saveScrollPosition(e=this.sessionId){e&&this.scrollController.savePosition(e,this.chat,this.scrollAnchorElements())}scheduleScrollPositionSave(){let e=this.sessionId;this.scrollController.scheduleSave(e,e=>{this.sessionId===e&&this.saveScrollPosition(e)})}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}let e=this.conversationDisplayTotal(),t=this.firstVisibleArticle(),n=Number(t?.dataset.index);if(Number.isFinite(n)){this.currentConversationIndex=kS(n,0,Math.max(0,e-1));return}this.currentConversationIndex=kS(this.pinnedToBottom?this.messageStart+this.messages.length-1:this.messageStart,0,Math.max(0,e-1))}scrollMarkers(){return this.scrollMarkerElements}scrollMarkerAt(e){return this.scrollMarkerElementById.get(e)}firstVisibleArticle(){let e=this.chat;if(e!==void 0)return rb(e,this.primaryArticleElements)??rb(e,this.articles())}articles(){return this.articleElements}scrollAnchorElements(){return this.scrollAnchorElementIndex}syncTranscriptElementIndex(){let e=this.currentTranscriptStructureKey();e!==this.transcriptStructureKey&&(this.transcriptStructureKey=e,this.primaryArticleElements=Array.from(this.renderRoot.querySelectorAll(`article.msg`)),this.articleElements=Array.from(this.renderRoot.querySelectorAll(`article.msg, details.msg`)),this.scrollAnchorElementIndex=Array.from(this.renderRoot.querySelectorAll(`[data-scroll-anchor-id]`)),this.scrollMarkerElements=Array.from(this.renderRoot.querySelectorAll(`.scroll-marker`)),this.scrollMarkerElementById=new Map(this.scrollMarkerElements.flatMap(e=>{let t=e.dataset.markerId;return t===void 0?[]:[[t,e]]})))}currentTranscriptStructureKey(){let e=this.groupedMessages(),t=e.map((t,n)=>{if(t.kind!==`group`)return[t.kind,t.index];let r=this.isLiveTailGroup(e,n),i=this.groupDisclosureKey(t.startIndex,t.endIndex,r);return[t.kind,t.startIndex,t.endIndex,this.disclosures.isOpen(i,r)]});return JSON.stringify([this.sessionId,this.messageStart,t,this.hasMore,this.loadingMore,this.pendingAsk?.askId])}clearTranscriptElementIndex(){this.transcriptStructureKey=``,this.primaryArticleElements=[],this.articleElements=[],this.scrollAnchorElementIndex=[],this.scrollMarkerElements=[],this.scrollMarkerElementById.clear()}withSuppressedScrollSave(e){this.suppressScrollSave=!0,e(),requestAnimationFrame(()=>{requestAnimationFrame(()=>{this.suppressScrollSave=!1})})}groupDisclosureKey(e,t,n){return n?`${this.sessionId}:live:${String(e)}`:`${this.sessionId}:${String(t)}`}messageAnchorKey(e){return FS(e)}groupRenderKey(e){return IS(e)}groupAnchorKey(e){return IS(e)}eventAnchorKey(e){return LS(e)}messageScrollMarkerId(e){return FS(e)}groupScrollMarkerId(e){return RS(e)}static{this.styles=Mm}};V([x({attribute:!1})],K.prototype,`messages`,void 0),V([x()],K.prototype,`sessionId`,void 0),V([x({type:Number})],K.prototype,`messageStart`,void 0),V([x({type:Number})],K.prototype,`messageEnd`,void 0),V([x({type:Number})],K.prototype,`messageTotal`,void 0),V([x({type:Boolean})],K.prototype,`hasMore`,void 0),V([x({type:Boolean})],K.prototype,`loadingMore`,void 0),V([x({type:Boolean})],K.prototype,`isSendingPrompt`,void 0),V([x({type:Boolean})],K.prototype,`isCompacting`,void 0),V([x({type:Number})],K.prototype,`pendingMessageCount`,void 0),V([x({attribute:!1})],K.prototype,`clientQueuedMessages`,void 0),V([x({attribute:!1})],K.prototype,`status`,void 0),V([x({attribute:!1})],K.prototype,`activity`,void 0),V([x({attribute:!1})],K.prototype,`pendingAsk`,void 0),V([x({attribute:!1})],K.prototype,`pendingDialogs`,void 0),V([x({attribute:!1})],K.prototype,`closedDialogs`,void 0),V([x({attribute:!1})],K.prototype,`onAnswerDialog`,void 0),V([x({attribute:!1})],K.prototype,`onCancelDialog`,void 0),V([x({attribute:!1})],K.prototype,`onDismissClosedDialog`,void 0),V([x({attribute:!1})],K.prototype,`askDraftSessionId`,void 0),V([x({attribute:!1})],K.prototype,`onSubmitAsk`,void 0),V([x({attribute:!1})],K.prototype,`notificationInbox`,void 0),V([x({type:Boolean})],K.prototype,`canClearServerQueue`,void 0),V([x({attribute:!1})],K.prototype,`onClearServerQueue`,void 0),V([x({attribute:!1})],K.prototype,`onDismissWarning`,void 0),V([x({attribute:!1})],K.prototype,`onDismissNotification`,void 0),V([x({attribute:!1})],K.prototype,`onDismissAllNotifications`,void 0),V([x({type:Boolean})],K.prototype,`warningsVisible`,void 0),V([x({attribute:!1})],K.prototype,`onToggleWarnings`,void 0),V([x({attribute:!1})],K.prototype,`onLoadMore`,void 0),V([C(`.chat`)],K.prototype,`chat`,void 0),V([C(`dialog.image-zoom`)],K.prototype,`imageZoomDialog`,void 0),V([S()],K.prototype,`pinnedToBottom`,void 0),V([S()],K.prototype,`zoomedImage`,void 0),V([S()],K.prototype,`expandedMetaKey`,void 0),V([S()],K.prototype,`copiedMessageKey`,void 0),V([S()],K.prototype,`currentConversationIndex`,void 0),V([S()],K.prototype,`collapsedNotificationTargetKeys`,void 0),V([S()],K.prototype,`retainedEmptyNotificationTrayTargetKey`,void 0),V([S()],K.prototype,`loadMoreRequested`,void 0),K=V([b(`chat-view`)],K);function KS(e,t){if(t===void 0||e!==`idle`&&t.phase===`idle`)return qS(e);let n=qS(t.label,t.phase);return t.detail!==void 0&&t.detail!==``?`${n}:${t.detail}`:n}function qS(e,t){return t===`idle`?`空闲`:t===void 0?{"agent running":`代理正在运行`,"bash complete":`命令执行完成`,"bash failed":`命令执行失败`,"branch summary aborted":`分支汇总已终止`,compacting:`正在压缩上下文`,"compaction complete":`上下文压缩完成`,"compaction failed":`上下文压缩失败`,"duplicate queued message ignored":`已忽略重复的排队消息`,error:`发生错误`,"extension error":`扩展错误`,idle:`空闲`,"message complete":`消息处理完成`,"message queued":`消息已排队`,"message queued during compaction":`压缩期间消息已排队`,"message started":`消息开始处理`,"navigating session tree":`正在切换会话树`,"prompt accepted":`消息已接收`,"receiving response":`正在接收回复`,"reload failed":`重新加载失败`,"reloading resources":`正在重新加载资源`,"resources reloaded":`资源已重新加载`,running:`运行中`,"running bash":`正在运行命令`,"running tool":`正在运行工具`,"session tree navigated":`已切换会话树`,"steering queued":`插队消息已排队`,"stop failed":`停止失败`,stopped:`已停止`,"summarizing branch":`正在汇总分支`,"tool complete":`工具执行完成`,"tool failed":`工具执行失败`,"tree navigation cancelled":`会话树切换已取消`,"turn complete":`本轮已完成`,"updating session":`正在更新会话`,queued:`正在排队`}[e]??e:qS(e)}var JS=new Set([`image/jpeg`,`image/png`,`image/gif`,`image/webp`]);function YS(e){return typeof e==`string`&&JS.has(e)}function XS(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`}}var ZS=`application/octet-stream`,QS=`读取附件失败。`;async function $S(e,t){let n=[],r;for(let i of e)try{let e=await t(i);n.push(rC(i,e))}catch{r=QS}return{attachments:n,...r===void 0?{}:{error:r}}}function eC(e){return e.kind===`image`&&YS(e.mimeType)}function tC(e){return e.every(e=>eC(e))}function nC(e,t){return tC(t)?e:`folder`}function rC(e,t){return YS(e.type)?{kind:`image`,name:aC(e),mimeType:e.type,data:t,size:e.size}:{kind:`file`,name:aC(e),mimeType:iC(e),data:t,size:e.size}}function iC(e){let t=e.type.trim();return t===``?ZS:t}function aC(e){return e.name===``?YS(e.type)?`pasted-image.${XS(e.type)}`:`pasted-file.bin`:e.name}var oC=`pi-web:attachment-delivery`;function sC(){try{return typeof localStorage>`u`?void 0:localStorage}catch{return}}function cC(e=sC()){try{return e?.getItem(oC)===`folder`?`folder`:`inline`}catch{return`inline`}}function lC(e,t=sC()){try{t?.setItem(oC,e)}catch{}}var uC=`(pointer: coarse), (max-width: 760px)`,dC=`pi-web.promptEnterPreference`;function fC(){return typeof window<`u`&&`matchMedia`in window?window.matchMedia(uC):void 0}function pC(e){return e===`send`||e===`newline`?e:`auto`}function mC(e=yC()){if(e===void 0)return`auto`;try{return pC(e.getItem(dC))}catch{return`auto`}}function hC(e,t=yC()){if(t!==void 0)try{t.setItem(dC,e)}catch{}}function gC(e=fC(),t=mC()){return t===`send`||t!==`newline`&&e?.matches!==!0}function _C(e,t,n=fC()){return e?n?.matches!==!0||t:!1}function vC(e,t=fC(),n=mC()){let r=gC(t,n);return e?!r:r}function yC(){if(!(typeof window>`u`))try{return window.localStorage}catch{return}}function bC(){return _`
|
|
2329
2329
|
<svg class="prompt-action-icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
|
|
2330
2330
|
<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>
|
|
2331
2331
|
</svg>
|
|
2332
|
-
`}function
|
|
2332
|
+
`}function xC(){return _`
|
|
2333
2333
|
<svg class="prompt-action-icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
|
|
2334
2334
|
<path d="M21 3 13.5 21l-2-8.5L3 10.5Z"></path>
|
|
2335
2335
|
<path d="M21 3 11.5 12.5"></path>
|
|
2336
2336
|
</svg>
|
|
2337
|
-
`}function
|
|
2337
|
+
`}function SC(){return _`
|
|
2338
2338
|
<svg class="prompt-action-icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
|
|
2339
2339
|
<path d="M4 7h11"></path>
|
|
2340
2340
|
<path d="M4 12h7"></path>
|
|
2341
2341
|
<path d="M4 17h7"></path>
|
|
2342
2342
|
<path d="m15 14 5 3-5 3z"></path>
|
|
2343
2343
|
</svg>
|
|
2344
|
-
`}function
|
|
2344
|
+
`}function CC(){return xC()}function wC(){return _`
|
|
2345
2345
|
<svg class="prompt-action-icon prompt-action-icon-filled" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
|
|
2346
2346
|
<rect x="6.5" y="6.5" width="11" height="11" rx="2"></rect>
|
|
2347
2347
|
</svg>
|
|
2348
|
-
`}function
|
|
2348
|
+
`}function TC(e){let t=Math.max(e.total,1),n=t>1?1.2:0,r=(18-n*(t-1))/t;return _`
|
|
2349
2349
|
<svg class="prompt-thinking-gauge" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
|
|
2350
2350
|
${Array.from({length:t},(i,a)=>{let o=3+a*(r+n),s=4+(a+1)/t*12,c=20-s;return _`<rect class=${a<e.filled?`gauge-bar gauge-bar-active`:`gauge-bar`} x=${o} y=${c} width=${r} height=${s} rx="1"></rect>`})}
|
|
2351
2351
|
</svg>
|
|
2352
|
-
`}var
|
|
2352
|
+
`}var EC=oy(class extends sy{constructor(e){super(e),this.wasSelected=!1,this.isElementPart=e.type===ay.ELEMENT}update(e,[t,n]){if(!this.isElementPart)throw Error(`scrollWhenSelected must be used on an element`);if(t&&(!this.wasSelected||n!==this.previousKey)){let t=`element`in e?e.element:void 0;requestAnimationFrame(()=>{t instanceof HTMLElement&&t.scrollIntoView({block:`nearest`})})}this.wasSelected=t,this.previousKey=n}render(e,t){}}),DC=h`
|
|
2353
2353
|
:host { display: block; }
|
|
2354
2354
|
.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); }
|
|
2355
2355
|
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; }
|
|
@@ -2357,22 +2357,22 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2357
2357
|
button.selected, button:hover { background: var(--pi-selection-bg); }
|
|
2358
2358
|
span { color: var(--pi-muted); font-size: 12px; }
|
|
2359
2359
|
small { grid-column: 1 / -1; color: var(--pi-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
2360
|
-
`,
|
|
2360
|
+
`,OC=class extends y{constructor(...e){super(...e),this.items=[],this.selectedIndex=0}render(){return this.items.length?g`
|
|
2361
2361
|
<div class="menu">
|
|
2362
2362
|
${this.items.map((e,t)=>g`
|
|
2363
|
-
<button class=${t===this.selectedIndex?`selected`:``} ${
|
|
2363
|
+
<button class=${t===this.selectedIndex?`selected`:``} ${EC(t===this.selectedIndex,e)} @mousedown=${t=>{t.preventDefault(),this.onPick?.(e)}}>
|
|
2364
2364
|
<strong>${e.insertText}</strong>
|
|
2365
2365
|
<span>${e.detail}</span>
|
|
2366
2366
|
${e.description!==void 0&&e.description!==``?g`<small>${e.description}</small>`:null}
|
|
2367
2367
|
</button>
|
|
2368
2368
|
`)}
|
|
2369
2369
|
</div>
|
|
2370
|
-
`:null}static{this.styles=
|
|
2370
|
+
`:null}static{this.styles=DC}};V([x({attribute:!1})],OC.prototype,`items`,void 0),V([x({type:Number})],OC.prototype,`selectedIndex`,void 0),V([x({attribute:!1})],OC.prototype,`onPick`,void 0),OC=V([b(`autocomplete-menu`)],OC);var q=class extends y{constructor(...e){super(...e),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=cC(),this.attachmentError=void 0,this.attachmentSeq=0,this.requestVersion=0,this.editableCompartment=new s,this.readOnlyCompartment=new s,this.mobilePromptEnterMedia=fC(),this.explicitShiftKeyActive=!1}willUpdate(e){if(!e.has(`sessionId`)&&!e.has(`machineId`))return;let t=e.has(`sessionId`)?e.get(`sessionId`):this.sessionId,n=AC(e.has(`machineId`)?e.get(`machineId`):this.machineId,t);n!==void 0&&qc(n,this.draft);let r=AC(this.machineId,this.sessionId);this.draft=r===void 0?``:Kc(r),this.currentInputMode=xu(this.draft),this.completions=[],this.selectedIndex=0}shouldUpdate(e){return e.has(`status`)&&e.size===1?!kC(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(){let e=this.currentInputMode.kind===`shell`?this.currentInputMode:void 0,t=e!==void 0,n=this.canSteer||this.isCompacting,r=this.disabled||this.sending;return g`
|
|
2371
2371
|
<footer class=${t?`shell-mode`:``} @paste=${e=>{this.handlePaste(e)}} @dragover=${e=>{this.handleDragOver(e)}} @drop=${e=>{this.handleDrop(e)}}>
|
|
2372
2372
|
<div class="editor-wrap">
|
|
2373
2373
|
<div class=${`markdown-editor${this.disabled?` markdown-editor-disabled`:``}`} aria-label="给 pi 发送消息" aria-disabled=${this.disabled?`true`:`false`}></div>
|
|
2374
2374
|
<input class="attachment-input" type="file" multiple hidden @change=${e=>{this.handleFileInput(e)}} />
|
|
2375
|
-
<button class="editor-attach icon-button" ?disabled=${r} title="附加文件" aria-label="附加文件" @click=${()=>{this.attachmentInput?.click()}}>${
|
|
2375
|
+
<button class="editor-attach icon-button" ?disabled=${r} title="附加文件" aria-label="附加文件" @click=${()=>{this.attachmentInput?.click()}}>${bC()}</button>
|
|
2376
2376
|
${t?g`<div class="mode-hint">终端命令${e.excludeFromContext?` · 已排除上下文`:``}</div>`:null}
|
|
2377
2377
|
${this.isCompacting&&!t?g`<div class="mode-hint">正在压缩历史 · 消息将排队发送</div>`:null}
|
|
2378
2378
|
${this.renderAttachments()}
|
|
@@ -2380,20 +2380,20 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2380
2380
|
</div>
|
|
2381
2381
|
<div class="actions">
|
|
2382
2382
|
${this.renderCompactStatus()}
|
|
2383
|
-
<button class="icon-button send-button" ?disabled=${r} title=${n?`当前活动结束后排队发送`:`发送`} aria-label=${n?`排队发送`:`发送`} @click=${()=>{this.send(`followUp`)}}>${n?
|
|
2384
|
-
${this.canSteer&&!this.isCompacting?g`<button class="icon-button steer-button" ?disabled=${r} title="在下次模型调用前引导当前回复" aria-label="引导当前回复" @click=${()=>{this.send(`steer`)}}>${
|
|
2385
|
-
<button class="icon-button stop-button" ?disabled=${this.disabled||!this.canStop} title=${this.canStop?`停止当前工作并清空排队消息`:`当前没有运行任务`} aria-label="停止" @click=${()=>this.onStop?.()}>${
|
|
2383
|
+
<button class="icon-button send-button" ?disabled=${r} title=${n?`当前活动结束后排队发送`:`发送`} aria-label=${n?`排队发送`:`发送`} @click=${()=>{this.send(`followUp`)}}>${n?SC():xC()}</button>
|
|
2384
|
+
${this.canSteer&&!this.isCompacting?g`<button class="icon-button steer-button" ?disabled=${r} title="在下次模型调用前引导当前回复" aria-label="引导当前回复" @click=${()=>{this.send(`steer`)}}>${CC()}</button>`:null}
|
|
2385
|
+
<button class="icon-button stop-button" ?disabled=${this.disabled||!this.canStop} title=${this.canStop?`停止当前工作并清空排队消息`:`当前没有运行任务`} aria-label="停止" @click=${()=>this.onStop?.()}>${wC()}</button>
|
|
2386
2386
|
</div>
|
|
2387
2387
|
</footer>
|
|
2388
|
-
`}focusInput(){this.editor?.focus()}replaceText(e){this.draft=e;let t=
|
|
2388
|
+
`}focusInput(){this.editor?.focus()}replaceText(e){this.draft=e;let t=AC(this.machineId,this.sessionId);t!==void 0&&qc(t,e);let n=this.editor;if(n!==void 0){let t=n.state.doc.toString();n.dispatch({...t===e?{}:{changes:{from:0,to:t.length,insert:e}},selection:i.cursor(e.length)})}this.requestVersion+=1,this.currentInputMode=xu(e),this.completions=[],this.selectedIndex=0}get view(){return this.editor}renderCompactStatus(){let e=this.status;if(e===void 0)return null;let t=e.model?.id??`无模型`;return g`
|
|
2389
2389
|
<div class="compact-status" aria-label="会话状态">
|
|
2390
2390
|
<button class="select-model" title="选择模型" @click=${()=>this.onSelectModel?.()}>${e.model?.provider!==void 0&&e.model.provider!==``?`${e.model.provider}/`:``}${t}</button>
|
|
2391
|
-
<button class="select-thinking icon-button" title=${`思考级别:${Jo(e.thinkingLevel)}`} aria-label=${`思考级别:${Jo(e.thinkingLevel)}`} @click=${()=>this.onSelectThinking?.()}>${
|
|
2391
|
+
<button class="select-thinking icon-button" title=${`思考级别:${Jo(e.thinkingLevel)}`} aria-label=${`思考级别:${Jo(e.thinkingLevel)}`} @click=${()=>this.onSelectThinking?.()}>${TC(Xo(e.thinkingLevel,this.availableThinkingLevels))}</button>
|
|
2392
2392
|
</div>
|
|
2393
|
-
`}renderAttachments(){if(this.attachments.length===0&&this.attachmentError===void 0)return null;let e=
|
|
2393
|
+
`}renderAttachments(){if(this.attachments.length===0&&this.attachmentError===void 0)return null;let e=tC(this.attachments),t=this.effectiveAttachmentDelivery();return g`
|
|
2394
2394
|
<div class="attachments" aria-label="待发送附件">
|
|
2395
2395
|
${this.attachments.map(e=>g`
|
|
2396
|
-
<div class=${`attachment-chip ${
|
|
2396
|
+
<div class=${`attachment-chip ${eC(e)?`attachment-chip-image`:`attachment-chip-file`}`} title=${e.name}>
|
|
2397
2397
|
${this.renderAttachmentPreview(e)}
|
|
2398
2398
|
<button type="button" class="attachment-remove" title="移除附件" aria-label=${`移除 ${e.name}`} @click=${()=>{this.removeAttachment(e.id)}}>×</button>
|
|
2399
2399
|
</div>
|
|
@@ -2408,10 +2408,10 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2408
2408
|
`:null}
|
|
2409
2409
|
${this.attachmentError===void 0?null:g`<div class="attachment-error">${this.attachmentError}</div>`}
|
|
2410
2410
|
</div>
|
|
2411
|
-
`}renderAttachmentPreview(e){return
|
|
2412
|
-
<div class="attachment-file-preview" aria-hidden="true">${
|
|
2411
|
+
`}renderAttachmentPreview(e){return eC(e)?g`<img src=${`data:${e.mimeType};base64,${e.data}`} alt=${e.name} />`:g`
|
|
2412
|
+
<div class="attachment-file-preview" aria-hidden="true">${LC(e.name)}</div>
|
|
2413
2413
|
<span class="attachment-file-name">${e.name}</span>
|
|
2414
|
-
`}changeDelivery(e){if(!(e.target instanceof HTMLSelectElement))return;let t=e.target.value===`folder`?`folder`:`inline`;if(t===`inline`&&!eC(this.attachments)){e.target.value=`folder`;return}this.attachmentDelivery=t,cC(this.attachmentDelivery)}removeAttachment(e){this.attachments=this.attachments.filter(t=>t.id!==e)}async handlePaste(e){let t=NC(e.clipboardData);t.length!==0&&(e.preventDefault(),await this.addAttachmentFiles(t))}handleDragOver(e){e.dataTransfer!==null&&PC(e.dataTransfer)&&e.preventDefault()}async handleDrop(e){let t=NC(e.dataTransfer);t.length!==0&&(e.preventDefault(),await this.addAttachmentFiles(t))}async handleFileInput(e){if(!(e.target instanceof HTMLInputElement)||e.target.files===null)return;let t=Array.from(e.target.files);e.target.value=``,await this.addAttachmentFiles(t)}async addAttachmentFiles(e){this.attachmentError=void 0;let{attachments:t,error:n}=await QS(e,LC);t.length>0&&(this.attachments=[...this.attachments,...t.map(e=>({id:`attachment-${String(++this.attachmentSeq)}`,...e}))]),n!==void 0&&(this.attachmentError=n)}currentAttachments(){return this.attachments.map(e=>FC(e))}effectiveAttachmentDelivery(){return tC(this.attachmentDelivery,this.attachments)}createEditor(){!this.editorHost||this.editor!==void 0||(this.editor=new p({parent:this.editorHost,state:e.create({doc:this.draft,extensions:[m(),ne(),t(),u.of(` `),r(a,{fallback:!0}),p.lineWrapping,p.contentAttributes.of(e=>BC(e.state.sliceDoc(0,e.state.selection.main.head))),p.domEventHandlers({keyup:e=>this.handleEditorKeyUp(e),blur:()=>this.resetEditorModifierState()}),o(`给 pi 发送消息... 使用 / 输入命令,@ 输入已跟踪文件,@ 空格显示所有文件,# 选择模型`),this.editableCompartment.of(p.editable.of(!this.disabled)),this.readOnlyCompartment.of(e.readOnly.of(this.disabled)),p.updateListener.of(e=>{e.docChanged&&this.updateDraft(e.state.doc.toString())}),n.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=>l.shift?.(e)??!1},{key:`Backspace`,run:e=>ee(e)},...c,...d])]})}))}syncEditorDoc(){let e=this.editor;if(!e)return;let t=e.state.doc.toString();t!==this.draft&&e.dispatch({changes:{from:0,to:t.length,insert:this.draft},selection:i.cursor(this.draft.length)})}updateEditorDisabledState(){this.editor?.dispatch({effects:[this.editableCompartment.reconfigure(p.editable.of(!this.disabled)),this.readOnlyCompartment.reconfigure(e.readOnly.of(this.disabled))]})}updateDraft(e){this.draft=e;let t=kC(this.machineId,this.sessionId);t!==void 0&&qc(t,this.draft);let n=xu(this.draft);Cu(n,this.currentInputMode)||(this.currentInputMode=n),this.refreshCompletions()}async refreshCompletions(){let 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!==``){let n=await L.commands({id:this.sessionId,cwd:this.cwd},this.machineId).catch(AC);if(t!==this.requestVersion)return;this.completions=n.filter(t=>t.name.toLowerCase().includes(e.query.toLowerCase())).slice(0,12).map(t=>({kind:`command`,replaceFrom:e.from,replaceTo:e.to,insertText:`/${t.name}`,detail:t.source,...t.description===void 0?{}:{description:t.description}}))}else if(e.kind===`file`&&this.cwd!==void 0&&this.cwd!==``){let n=await L.files(this.cwd,e.query,{scope:e.fileScope,machineId:this.machineId,projectId:this.projectId,workspaceId:this.workspaceId,workspaceScoped:this.workspaceScopedFileSuggestions}).catch(jC);if(t!==this.requestVersion)return;this.completions=n.slice(0,12).map(t=>{let n=gu(t.path,e.quoted===!0,t.path.endsWith(`/`)?e.allPrefix:void 0);return{kind:`file`,replaceFrom:e.from,replaceTo:e.to,insertText:n,detail:t.kind,...t.path.endsWith(`/`)&&n.endsWith(`"`)?{cursorOffset:n.length-1}:{}}})}else if(e.kind===`model`&&this.sessionId!==void 0&&this.sessionId!==``&&this.cwd!==void 0&&this.cwd!==``){let n=await L.models({id:this.sessionId,cwd:this.cwd},this.machineId).then(e=>e.models).catch(MC);if(t!==this.requestVersion)return;this.completions=pu(n,e.query).map(t=>({kind:`model`,replaceFrom:e.from,replaceTo:e.to,...t}))}}currentTrigger(){return du(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;let n=gC(e.shiftKey,this.explicitShiftKeyActive,this.mobilePromptEnterMedia);return this.explicitShiftKeyActive=!1,this.handleEditorEnter(t,n)}handleEditorKeyUp(e){return e.key===`Shift`&&(this.explicitShiftKeyActive=!1),!1}resetEditorModifierState(){return this.explicitShiftKeyActive=!1,!1}handleEditorEnter(e,t){if(!t&&this.completions.length){let e=this.completions[this.selectedIndex];return e!==void 0&&this.pick(e),!0}return _C(t,this.mobilePromptEnterMedia,pC())?(this.send(this.canSteer||this.isCompacting?`followUp`:void 0),!0):te(e)||f(e)}handleEditorTab(e){if(this.completions.length){let e=this.completions[this.selectedIndex];return e!==void 0&&this.pick(e),!0}return this.currentTrigger()?.kind===`file`?(this.refreshCompletions(),!0):l.run?.(e)??!1}pick(e){let t=this.editor;if(!t)return;let n=e.kind===`file`&&(e.insertText.endsWith(`/`)||e.cursorOffset!==void 0)?``:` `,r=e.replaceFrom+(e.cursorOffset??e.insertText.length)+n.length,a=e.insertText.endsWith(`"`)&&this.draft.slice(e.replaceTo).startsWith(`"`)?e.replaceTo+1:e.replaceTo;t.dispatch({changes:{from:e.replaceFrom,to:a,insert:`${e.insertText}${n}`},selection:i.cursor(r),scrollIntoView:!0}),this.completions=[]}send(e){if(this.disabled||this.sending)return;let t=this.draft.trim(),n=this.attachments;if(t===``&&n.length===0)return;let r=this.canSteer||this.isCompacting?e:void 0,i=n.length>0?this.currentAttachments():void 0,a=this.effectiveAttachmentDelivery();this.resetComposer(),this.onSend?.(t,r,i,i===void 0?void 0:a)}resetComposer(){this.draft=``,this.currentInputMode={kind:`normal`};let e=kC(this.machineId,this.sessionId);e!==void 0&&Jc(e),this.completions=[],this.attachments=[],this.attachmentError=void 0,this.syncEditorDoc()}static{this.styles=Pm}};V([x({type:Boolean})],q.prototype,`disabled`,void 0),V([x()],q.prototype,`sessionId`,void 0),V([x()],q.prototype,`cwd`,void 0),V([x()],q.prototype,`machineId`,void 0),V([x()],q.prototype,`projectId`,void 0),V([x()],q.prototype,`workspaceId`,void 0),V([x({type:Boolean})],q.prototype,`workspaceScopedFileSuggestions`,void 0),V([x({type:Boolean})],q.prototype,`canSteer`,void 0),V([x({type:Boolean})],q.prototype,`isCompacting`,void 0),V([x({type:Boolean})],q.prototype,`canStop`,void 0),V([x({attribute:!1})],q.prototype,`status`,void 0),V([x({type:Boolean})],q.prototype,`sending`,void 0),V([x({attribute:!1})],q.prototype,`onSend`,void 0),V([x({attribute:!1})],q.prototype,`onStop`,void 0),V([x({attribute:!1})],q.prototype,`onSelectModel`,void 0),V([x({attribute:!1})],q.prototype,`onSelectThinking`,void 0),V([x({attribute:!1})],q.prototype,`availableThinkingLevels`,void 0),V([C(`.markdown-editor`)],q.prototype,`editorHost`,void 0),V([C(`.attachment-input`)],q.prototype,`attachmentInput`,void 0),V([S()],q.prototype,`currentInputMode`,void 0),V([S()],q.prototype,`completions`,void 0),V([S()],q.prototype,`selectedIndex`,void 0),V([S()],q.prototype,`attachments`,void 0),V([S()],q.prototype,`attachmentDelivery`,void 0),V([S()],q.prototype,`attachmentError`,void 0),q=V([b(`prompt-editor`)],q);function OC(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 kC(e,t){if(!(typeof e!=`string`||e===``)&&!(typeof t!=`string`||t===``))return Qo(e,t)}function AC(){return[]}function jC(){return[]}function MC(){return[]}function NC(e){return e===null?[]:Array.from(e.files)}function PC(e){let t=Array.from(e.items);return t.length>0?t.some(e=>e.kind===`file`):Array.from(e.types).includes(`Files`)}function FC(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 IC(e){let t=e.trim(),n=t.lastIndexOf(`.`);return n>=0&&n<t.length-1?t.slice(n+1,n+5).toUpperCase():`文件`}function LC(e){return new Promise((t,n)=>{let r=new FileReader;r.onerror=()=>{n(r.error??Error(`读取文件失败`))},r.onload=()=>{let e=r.result;if(typeof e!=`string`){n(Error(`文件读取结果异常`));return}let i=e.indexOf(`,`);t(i===-1?e:e.slice(i+1))},r.readAsDataURL(e)})}var RC={spellcheck:`true`,autocorrect:`on`,autocapitalize:`sentences`,writingsuggestions:`true`,dir:`auto`},zC={spellcheck:`false`,autocorrect:`off`,autocapitalize:`off`,writingsuggestions:`false`,dir:`auto`};function BC(e){return xu(e).kind===`normal`?RC:zC}function VC(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 HC(e){return!Number.isFinite(e)||e===0?`$0`:e<.01?`$${e.toFixed(4)}`:`$${e.toFixed(2)}`}function UC(e,t){if(!Number.isInteger(e)||e<=0)return;let n=`${String(e)} 条警告`;return{countText:String(e),accessibleLabel:t?`最小化 ${n}`:`在警告区域显示 ${n}`}}var WC=class extends y{constructor(...e){super(...e),this.warningCount=0,this.warningsExpanded=!1,this.handleToggleWarnings=()=>{this.onToggleWarnings?.()}}render(){let e=this.status;if(e===void 0)return g`<div class="bar muted">尚无会话状态</div>`;let t=e.contextUsage,n=t?t.percent==null?`上下文 ${VC(t.contextWindow)}`:`${t.percent.toFixed(1)}%/${VC(t.contextWindow)}`:`上下文未知`,r=e.tokens,i=UC(this.warningCount,this.warningsExpanded);return g`
|
|
2414
|
+
`}changeDelivery(e){if(!(e.target instanceof HTMLSelectElement))return;let t=e.target.value===`folder`?`folder`:`inline`;if(t===`inline`&&!tC(this.attachments)){e.target.value=`folder`;return}this.attachmentDelivery=t,lC(this.attachmentDelivery)}removeAttachment(e){this.attachments=this.attachments.filter(t=>t.id!==e)}async handlePaste(e){let t=PC(e.clipboardData);t.length!==0&&(e.preventDefault(),await this.addAttachmentFiles(t))}handleDragOver(e){e.dataTransfer!==null&&FC(e.dataTransfer)&&e.preventDefault()}async handleDrop(e){let t=PC(e.dataTransfer);t.length!==0&&(e.preventDefault(),await this.addAttachmentFiles(t))}async handleFileInput(e){if(!(e.target instanceof HTMLInputElement)||e.target.files===null)return;let t=Array.from(e.target.files);e.target.value=``,await this.addAttachmentFiles(t)}async addAttachmentFiles(e){this.attachmentError=void 0;let{attachments:t,error:n}=await $S(e,RC);t.length>0&&(this.attachments=[...this.attachments,...t.map(e=>({id:`attachment-${String(++this.attachmentSeq)}`,...e}))]),n!==void 0&&(this.attachmentError=n)}currentAttachments(){return this.attachments.map(e=>IC(e))}effectiveAttachmentDelivery(){return nC(this.attachmentDelivery,this.attachments)}createEditor(){!this.editorHost||this.editor!==void 0||(this.editor=new p({parent:this.editorHost,state:e.create({doc:this.draft,extensions:[m(),ne(),t(),u.of(` `),r(a,{fallback:!0}),p.lineWrapping,p.contentAttributes.of(e=>VC(e.state.sliceDoc(0,e.state.selection.main.head))),p.domEventHandlers({keyup:e=>this.handleEditorKeyUp(e),blur:()=>this.resetEditorModifierState()}),o(`给 pi 发送消息... 使用 / 输入命令,@ 输入已跟踪文件,@ 空格显示所有文件,# 选择模型`),this.editableCompartment.of(p.editable.of(!this.disabled)),this.readOnlyCompartment.of(e.readOnly.of(this.disabled)),p.updateListener.of(e=>{e.docChanged&&this.updateDraft(e.state.doc.toString())}),n.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=>l.shift?.(e)??!1},{key:`Backspace`,run:e=>ee(e)},...c,...d])]})}))}syncEditorDoc(){let e=this.editor;if(!e)return;let t=e.state.doc.toString();t!==this.draft&&e.dispatch({changes:{from:0,to:t.length,insert:this.draft},selection:i.cursor(this.draft.length)})}updateEditorDisabledState(){this.editor?.dispatch({effects:[this.editableCompartment.reconfigure(p.editable.of(!this.disabled)),this.readOnlyCompartment.reconfigure(e.readOnly.of(this.disabled))]})}updateDraft(e){this.draft=e;let t=AC(this.machineId,this.sessionId);t!==void 0&&qc(t,this.draft);let n=xu(this.draft);Cu(n,this.currentInputMode)||(this.currentInputMode=n),this.refreshCompletions()}async refreshCompletions(){let 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!==``){let n=await L.commands({id:this.sessionId,cwd:this.cwd},this.machineId).catch(jC);if(t!==this.requestVersion)return;this.completions=n.filter(t=>t.name.toLowerCase().includes(e.query.toLowerCase())).slice(0,12).map(t=>({kind:`command`,replaceFrom:e.from,replaceTo:e.to,insertText:`/${t.name}`,detail:t.source,...t.description===void 0?{}:{description:t.description}}))}else if(e.kind===`file`&&this.cwd!==void 0&&this.cwd!==``){let n=await L.files(this.cwd,e.query,{scope:e.fileScope,machineId:this.machineId,projectId:this.projectId,workspaceId:this.workspaceId,workspaceScoped:this.workspaceScopedFileSuggestions}).catch(MC);if(t!==this.requestVersion)return;this.completions=n.slice(0,12).map(t=>{let n=gu(t.path,e.quoted===!0,t.path.endsWith(`/`)?e.allPrefix:void 0);return{kind:`file`,replaceFrom:e.from,replaceTo:e.to,insertText:n,detail:t.kind,...t.path.endsWith(`/`)&&n.endsWith(`"`)?{cursorOffset:n.length-1}:{}}})}else if(e.kind===`model`&&this.sessionId!==void 0&&this.sessionId!==``&&this.cwd!==void 0&&this.cwd!==``){let n=await L.models({id:this.sessionId,cwd:this.cwd},this.machineId).then(e=>e.models).catch(NC);if(t!==this.requestVersion)return;this.completions=pu(n,e.query).map(t=>({kind:`model`,replaceFrom:e.from,replaceTo:e.to,...t}))}}currentTrigger(){return du(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;let n=_C(e.shiftKey,this.explicitShiftKeyActive,this.mobilePromptEnterMedia);return this.explicitShiftKeyActive=!1,this.handleEditorEnter(t,n)}handleEditorKeyUp(e){return e.key===`Shift`&&(this.explicitShiftKeyActive=!1),!1}resetEditorModifierState(){return this.explicitShiftKeyActive=!1,!1}handleEditorEnter(e,t){if(!t&&this.completions.length){let e=this.completions[this.selectedIndex];return e!==void 0&&this.pick(e),!0}return vC(t,this.mobilePromptEnterMedia,mC())?(this.send(this.canSteer||this.isCompacting?`followUp`:void 0),!0):te(e)||f(e)}handleEditorTab(e){if(this.completions.length){let e=this.completions[this.selectedIndex];return e!==void 0&&this.pick(e),!0}return this.currentTrigger()?.kind===`file`?(this.refreshCompletions(),!0):l.run?.(e)??!1}pick(e){let t=this.editor;if(!t)return;let n=e.kind===`file`&&(e.insertText.endsWith(`/`)||e.cursorOffset!==void 0)?``:` `,r=e.replaceFrom+(e.cursorOffset??e.insertText.length)+n.length,a=e.insertText.endsWith(`"`)&&this.draft.slice(e.replaceTo).startsWith(`"`)?e.replaceTo+1:e.replaceTo;t.dispatch({changes:{from:e.replaceFrom,to:a,insert:`${e.insertText}${n}`},selection:i.cursor(r),scrollIntoView:!0}),this.completions=[]}send(e){if(this.disabled||this.sending)return;let t=this.draft.trim(),n=this.attachments;if(t===``&&n.length===0)return;let r=this.canSteer||this.isCompacting?e:void 0,i=n.length>0?this.currentAttachments():void 0,a=this.effectiveAttachmentDelivery();this.resetComposer(),this.onSend?.(t,r,i,i===void 0?void 0:a)}resetComposer(){this.draft=``,this.currentInputMode={kind:`normal`};let e=AC(this.machineId,this.sessionId);e!==void 0&&Jc(e),this.completions=[],this.attachments=[],this.attachmentError=void 0,this.syncEditorDoc()}static{this.styles=Pm}};V([x({type:Boolean})],q.prototype,`disabled`,void 0),V([x()],q.prototype,`sessionId`,void 0),V([x()],q.prototype,`cwd`,void 0),V([x()],q.prototype,`machineId`,void 0),V([x()],q.prototype,`projectId`,void 0),V([x()],q.prototype,`workspaceId`,void 0),V([x({type:Boolean})],q.prototype,`workspaceScopedFileSuggestions`,void 0),V([x({type:Boolean})],q.prototype,`canSteer`,void 0),V([x({type:Boolean})],q.prototype,`isCompacting`,void 0),V([x({type:Boolean})],q.prototype,`canStop`,void 0),V([x({attribute:!1})],q.prototype,`status`,void 0),V([x({type:Boolean})],q.prototype,`sending`,void 0),V([x({attribute:!1})],q.prototype,`onSend`,void 0),V([x({attribute:!1})],q.prototype,`onStop`,void 0),V([x({attribute:!1})],q.prototype,`onSelectModel`,void 0),V([x({attribute:!1})],q.prototype,`onSelectThinking`,void 0),V([x({attribute:!1})],q.prototype,`availableThinkingLevels`,void 0),V([C(`.markdown-editor`)],q.prototype,`editorHost`,void 0),V([C(`.attachment-input`)],q.prototype,`attachmentInput`,void 0),V([S()],q.prototype,`currentInputMode`,void 0),V([S()],q.prototype,`completions`,void 0),V([S()],q.prototype,`selectedIndex`,void 0),V([S()],q.prototype,`attachments`,void 0),V([S()],q.prototype,`attachmentDelivery`,void 0),V([S()],q.prototype,`attachmentError`,void 0),q=V([b(`prompt-editor`)],q);function kC(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 AC(e,t){if(!(typeof e!=`string`||e===``)&&!(typeof t!=`string`||t===``))return Qo(e,t)}function jC(){return[]}function MC(){return[]}function NC(){return[]}function PC(e){return e===null?[]:Array.from(e.files)}function FC(e){let t=Array.from(e.items);return t.length>0?t.some(e=>e.kind===`file`):Array.from(e.types).includes(`Files`)}function IC(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 LC(e){let t=e.trim(),n=t.lastIndexOf(`.`);return n>=0&&n<t.length-1?t.slice(n+1,n+5).toUpperCase():`文件`}function RC(e){return new Promise((t,n)=>{let r=new FileReader;r.onerror=()=>{n(r.error??Error(`读取文件失败`))},r.onload=()=>{let e=r.result;if(typeof e!=`string`){n(Error(`文件读取结果异常`));return}let i=e.indexOf(`,`);t(i===-1?e:e.slice(i+1))},r.readAsDataURL(e)})}var zC={spellcheck:`true`,autocorrect:`on`,autocapitalize:`sentences`,writingsuggestions:`true`,dir:`auto`},BC={spellcheck:`false`,autocorrect:`off`,autocapitalize:`off`,writingsuggestions:`false`,dir:`auto`};function VC(e){return xu(e).kind===`normal`?zC:BC}function HC(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 UC(e){return!Number.isFinite(e)||e===0?`$0`:e<.01?`$${e.toFixed(4)}`:`$${e.toFixed(2)}`}function WC(e,t){if(!Number.isInteger(e)||e<=0)return;let n=`${String(e)} 条警告`;return{countText:String(e),accessibleLabel:t?`最小化 ${n}`:`在警告区域显示 ${n}`}}var GC=class extends y{constructor(...e){super(...e),this.warningCount=0,this.warningsExpanded=!1,this.handleToggleWarnings=()=>{this.onToggleWarnings?.()}}render(){let e=this.status;if(e===void 0)return g`<div class="bar muted">尚无会话状态</div>`;let t=e.contextUsage,n=t?t.percent==null?`上下文 ${HC(t.contextWindow)}`:`${t.percent.toFixed(1)}%/${HC(t.contextWindow)}`:`上下文未知`,r=e.tokens,i=WC(this.warningCount,this.warningsExpanded);return g`
|
|
2415
2415
|
<div class="bar">
|
|
2416
2416
|
${i===void 0||this.onToggleWarnings===void 0?null:g`
|
|
2417
2417
|
<button
|
|
@@ -2426,13 +2426,13 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2426
2426
|
<span>${i.countText}</span>
|
|
2427
2427
|
</button>
|
|
2428
2428
|
`}
|
|
2429
|
-
<span>↑${
|
|
2430
|
-
<span>↓${
|
|
2429
|
+
<span>↑${HC(r.input)}</span>
|
|
2430
|
+
<span>↓${HC(r.output)}</span>
|
|
2431
2431
|
<span class="context">${n}</span>
|
|
2432
|
-
<span>${
|
|
2432
|
+
<span>${UC(e.cost)}</span>
|
|
2433
2433
|
${e.pendingMessageCount>0?g`<span>${String(e.pendingMessageCount)} 条排队中</span>`:null}
|
|
2434
2434
|
</div>
|
|
2435
|
-
`}static{this.styles=Nm}};V([x({attribute:!1})],
|
|
2435
|
+
`}static{this.styles=Nm}};V([x({attribute:!1})],GC.prototype,`status`,void 0),V([x({type:Number})],GC.prototype,`warningCount`,void 0),V([x({type:Boolean})],GC.prototype,`warningsExpanded`,void 0),V([x({attribute:!1})],GC.prototype,`onToggleWarnings`,void 0),GC=V([b(`status-bar`)],GC);var KC=h`
|
|
2436
2436
|
:host { position: fixed; inset: 0; z-index: 10; color: var(--pi-text); font: 14px system-ui, sans-serif; }
|
|
2437
2437
|
.backdrop { display: grid; place-items: center; width: 100%; height: 100%; background: var(--pi-overlay); }
|
|
2438
2438
|
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; }
|
|
@@ -2446,7 +2446,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2446
2446
|
.options button.selected, .options button:hover { background: var(--pi-selection-bg); }
|
|
2447
2447
|
small { display: block; margin-top: 4px; color: var(--pi-muted); }
|
|
2448
2448
|
.empty { padding: 24px; color: var(--pi-muted); text-align: center; }
|
|
2449
|
-
`,
|
|
2449
|
+
`,qC=class extends y{constructor(...e){super(...e),this.title=`选择`,this.searchable=!1,this.options=[],this.selectedIndex=0,this.query=``}render(){let e=this.filteredOptions();return g`
|
|
2450
2450
|
<div class="backdrop" @mousedown=${()=>this.onCancel?.()}>
|
|
2451
2451
|
<section @mousedown=${e=>{e.stopPropagation()}}>
|
|
2452
2452
|
<header>
|
|
@@ -2456,7 +2456,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2456
2456
|
${this.searchable?g`<input placeholder="搜索" .value=${this.query} @input=${e=>{this.handleSearchInput(e)}} @keydown=${e=>{this.handleKeyDown(e)}}>`:null}
|
|
2457
2457
|
<div class="options" @keydown=${e=>{this.handleKeyDown(e)}} tabindex="0">
|
|
2458
2458
|
${e.map((e,t)=>g`
|
|
2459
|
-
<button class=${t===this.selectedIndex?`selected`:``} ${
|
|
2459
|
+
<button class=${t===this.selectedIndex?`selected`:``} ${EC(t===this.selectedIndex,e.value)} @click=${()=>this.onPick?.(e.value)}>
|
|
2460
2460
|
<span>${e.label}</span>
|
|
2461
2461
|
${e.description!==void 0&&e.description!==``?g`<small>${e.description}</small>`:null}
|
|
2462
2462
|
</button>
|
|
@@ -2465,7 +2465,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2465
2465
|
</div>
|
|
2466
2466
|
</section>
|
|
2467
2467
|
</div>
|
|
2468
|
-
`}firstUpdated(){this.selectInitialValue(),this.renderRoot.querySelector(this.searchable?`input`:`.options`)?.focus()}selectInitialValue(){if(this.selectedValue===void 0)return;let e=this.filteredOptions().findIndex(e=>e.value===this.selectedValue);e>=0&&(this.selectedIndex=e)}handleSearchInput(e){e.target instanceof HTMLInputElement&&(this.query=e.target.value,this.selectedIndex=0)}filteredOptions(){let e=this.query.trim().toLowerCase();return e===``?this.options:this.options.filter(t=>`${t.label} ${t.description??``} ${t.value}`.toLowerCase().includes(e))}handleKeyDown(e){let 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();let n=t[this.selectedIndex];n&&this.onPick?.(n.value)}}static{this.styles=
|
|
2468
|
+
`}firstUpdated(){this.selectInitialValue(),this.renderRoot.querySelector(this.searchable?`input`:`.options`)?.focus()}selectInitialValue(){if(this.selectedValue===void 0)return;let e=this.filteredOptions().findIndex(e=>e.value===this.selectedValue);e>=0&&(this.selectedIndex=e)}handleSearchInput(e){e.target instanceof HTMLInputElement&&(this.query=e.target.value,this.selectedIndex=0)}filteredOptions(){let e=this.query.trim().toLowerCase();return e===``?this.options:this.options.filter(t=>`${t.label} ${t.description??``} ${t.value}`.toLowerCase().includes(e))}handleKeyDown(e){let 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();let n=t[this.selectedIndex];n&&this.onPick?.(n.value)}}static{this.styles=KC}};V([x()],qC.prototype,`title`,void 0),V([x({type:Boolean})],qC.prototype,`searchable`,void 0),V([x({attribute:!1})],qC.prototype,`options`,void 0),V([x({attribute:!1})],qC.prototype,`selectedValue`,void 0),V([x({attribute:!1})],qC.prototype,`onPick`,void 0),V([x({attribute:!1})],qC.prototype,`onCancel`,void 0),V([S()],qC.prototype,`selectedIndex`,void 0),V([S()],qC.prototype,`query`,void 0),qC=V([b(`command-picker`)],qC);var JC=h`
|
|
2469
2469
|
:host { position: fixed; inset: 0; z-index: 20; color: var(--pi-text); font: 14px system-ui, sans-serif; }
|
|
2470
2470
|
.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; }
|
|
2471
2471
|
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; }
|
|
@@ -2483,7 +2483,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2483
2483
|
.group { grid-column: 1 / -1; font-size: 12px; }
|
|
2484
2484
|
kbd { align-self: center; border: 1px solid var(--pi-border); border-radius: 6px; background: var(--pi-surface); color: var(--pi-muted); padding: 2px 6px; font: 12px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; white-space: nowrap; }
|
|
2485
2485
|
.empty { padding: 24px; color: var(--pi-muted); text-align: center; }
|
|
2486
|
-
`,
|
|
2486
|
+
`,YC=class extends y{constructor(...e){super(...e),this.actions=[],this.queryText=``,this.selectedIndex=0}render(){let e=this.filteredActions();return g`
|
|
2487
2487
|
<div class="backdrop" @mousedown=${()=>this.onCancel?.()}>
|
|
2488
2488
|
<section @mousedown=${e=>{e.stopPropagation()}} @keydown=${e=>{this.handleKeyDown(e)}}>
|
|
2489
2489
|
<header>
|
|
@@ -2496,7 +2496,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2496
2496
|
</header>
|
|
2497
2497
|
<div class="options">
|
|
2498
2498
|
${e.length===0?g`<div class="empty">未找到操作。</div>`:e.map((e,t)=>g`
|
|
2499
|
-
<button class=${`${t===this.selectedIndex?`selected`:``} ${e.enabled===!1?`disabled`:``}`} ?disabled=${e.enabled===!1} title=${e.disabledReason??e.title} ${
|
|
2499
|
+
<button class=${`${t===this.selectedIndex?`selected`:``} ${e.enabled===!1?`disabled`:``}`} ?disabled=${e.enabled===!1} title=${e.disabledReason??e.title} ${EC(t===this.selectedIndex,e.id)} @click=${()=>{this.run(e)}}>
|
|
2500
2500
|
<span class="main">
|
|
2501
2501
|
<strong>${e.title}</strong>
|
|
2502
2502
|
${e.description!==void 0&&e.description!==``?g`<small>${e.description}</small>`:null}
|
|
@@ -2509,7 +2509,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2509
2509
|
</div>
|
|
2510
2510
|
</section>
|
|
2511
2511
|
</div>
|
|
2512
|
-
`}firstUpdated(){this.input?.focus()}updated(e){if(!e.has(`actions`)&&!e.has(`queryText`))return;let t=Math.max(0,this.filteredActions().length-1);this.selectedIndex>t&&(this.selectedIndex=t)}filteredActions(){return
|
|
2512
|
+
`}firstUpdated(){this.input?.focus()}updated(e){if(!e.has(`actions`)&&!e.has(`queryText`))return;let t=Math.max(0,this.filteredActions().length-1);this.selectedIndex>t&&(this.selectedIndex=t)}filteredActions(){return XC(this.actions,this.queryText)}handleKeyDown(e){let 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();let n=t[this.selectedIndex];n!==void 0&&this.run(n)}}run(e){e.enabled!==!1&&this.onRun?.(e)}static{this.styles=JC}};V([x({attribute:!1})],YC.prototype,`actions`,void 0),V([x({attribute:!1})],YC.prototype,`onRun`,void 0),V([x({attribute:!1})],YC.prototype,`onCancel`,void 0),V([C(`input`)],YC.prototype,`input`,void 0),V([S()],YC.prototype,`queryText`,void 0),V([S()],YC.prototype,`selectedIndex`,void 0),YC=V([b(`action-palette`)],YC);function XC(e,t){let n=t.trim().toLowerCase();return e.filter(e=>e.enabled!==!1||e.disabledReason!==void 0).filter(e=>n===``||[e.title,e.description??``,e.disabledReason??``,e.group??``,e.shortcut??``].join(` `).toLowerCase().includes(n))}var ZC=class extends y{render(){let e=this.state;return e===void 0?null:g`
|
|
2513
2513
|
<div class="backdrop" @mousedown=${()=>{this.cancel()}}>
|
|
2514
2514
|
<section @mousedown=${e=>{e.stopPropagation()}} @keydown=${e=>{this.handleKeyDown(e)}}>
|
|
2515
2515
|
<header>
|
|
@@ -2532,13 +2532,13 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2532
2532
|
<div class="actions"><button @click=${()=>{this.cancel()}}>取消</button><button class="primary" ?disabled=${e.saving===!0} @click=${()=>{this.onSaveApiKey?.()}}>${e.saving===!0?`正在保存…`:`保存 API key`}</button></div>
|
|
2533
2533
|
</div>
|
|
2534
2534
|
`;case`oauth`:return this.renderOAuth(e);case`logout`:return g`<div class="options">${e.providers.length===0?g`<div class="empty">没有已保存的凭据。环境变量和 models.json 设置不会变化。</div>`:e.providers.map(e=>g`
|
|
2535
|
-
<button @click=${()=>{this.onLogoutProvider?.(e.id)}}><span>${e.name}</span><small>${e.id} · ${
|
|
2535
|
+
<button @click=${()=>{this.onLogoutProvider?.(e.id)}}><span>${e.name}</span><small>${e.id} · ${$C(e.authType)}</small></button>
|
|
2536
2536
|
`)}</div>`}}renderProviderButton(e){return g`
|
|
2537
2537
|
<button @click=${()=>{this.onSelectProvider?.(e.id,e.authType)}}>
|
|
2538
|
-
<span>${e.name}${e.status.source===void 0?null:g` <em>${
|
|
2539
|
-
<small>${e.id} · ${
|
|
2538
|
+
<span>${e.name}${e.status.source===void 0?null:g` <em>${tw(e)}</em>`}</span>
|
|
2539
|
+
<small>${e.id} · ${$C(e.authType)}</small>
|
|
2540
2540
|
</button>
|
|
2541
|
-
`}renderOAuth(e){let t=e.flow,n=t.prompt,r=t.select,i=
|
|
2541
|
+
`}renderOAuth(e){let t=e.flow,n=t.prompt,r=t.select,i=QC(n?.promptType);return g`
|
|
2542
2542
|
<div class="form">
|
|
2543
2543
|
${t.auth===void 0?g`<p>正在启动登录流程…</p>`:g`
|
|
2544
2544
|
<p>打开此授权链接:</p>
|
|
@@ -2568,10 +2568,10 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2568
2568
|
`)}</div>
|
|
2569
2569
|
`}
|
|
2570
2570
|
${e.error!==void 0&&e.error!==``?g`<div class="error-text">${e.error}</div>`:null}
|
|
2571
|
-
${t.status===`error`||t.status===`cancelled`?g`<div class="error-text">${t.error??
|
|
2571
|
+
${t.status===`error`||t.status===`cancelled`?g`<div class="error-text">${t.error??nw(t.status)}</div><div class="actions"><button @click=${()=>{this.cancel()}}>关闭</button></div>`:null}
|
|
2572
2572
|
${n===void 0&&r===void 0&&t.status===`running`?g`<div class="actions"><button @click=${()=>{this.onOAuthCancel?.()}}>取消</button></div>`:null}
|
|
2573
2573
|
</div>
|
|
2574
|
-
`}focusInputIfNeeded(){let e
|
|
2574
|
+
`}focusInputIfNeeded(){let e=ew(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;let 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?.()}static{this.styles=[KC,h`
|
|
2575
2575
|
.form { display: grid; gap: 12px; padding: 14px; overflow: auto; }
|
|
2576
2576
|
.form p { margin: 0; color: var(--pi-text-secondary); overflow-wrap: anywhere; }
|
|
2577
2577
|
.form a { color: var(--pi-accent); overflow-wrap: anywhere; }
|
|
@@ -2589,13 +2589,13 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2589
2589
|
.inline-options button { display: grid; gap: 2px; text-align: left; }
|
|
2590
2590
|
.inline-options small { color: var(--pi-muted); }
|
|
2591
2591
|
em { color: var(--pi-success); font-style: normal; font-size: 12px; }
|
|
2592
|
-
`]}};V([x({attribute:!1})],
|
|
2592
|
+
`]}};V([x({attribute:!1})],ZC.prototype,`state`,void 0),V([x({attribute:!1})],ZC.prototype,`onChooseMethod`,void 0),V([x({attribute:!1})],ZC.prototype,`onSelectProvider`,void 0),V([x({attribute:!1})],ZC.prototype,`onApiKeyInput`,void 0),V([x({attribute:!1})],ZC.prototype,`onSaveApiKey`,void 0),V([x({attribute:!1})],ZC.prototype,`onLogoutProvider`,void 0),V([x({attribute:!1})],ZC.prototype,`onOAuthInput`,void 0),V([x({attribute:!1})],ZC.prototype,`onOAuthRespond`,void 0),V([x({attribute:!1})],ZC.prototype,`onOAuthCancel`,void 0),V([x({attribute:!1})],ZC.prototype,`onCancel`,void 0),V([C(`input`)],ZC.prototype,`input`,void 0),ZC=V([b(`auth-dialog`)],ZC);function QC(e){return e===`secret`?`password`:`text`}function $C(e){return e===`oauth`?`订阅`:`API key`}function ew(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 tw(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 nw(e){return e===`cancelled`?`已取消`:e===`error`?`错误`:e}var rw=class extends y{constructor(...e){super(...e),this.mode=`login`,this.loading=!1,this.error=``,this.currentPassword=``,this.password=``,this.confirmPassword=``,this.localError=``}render(){return g`
|
|
2593
2593
|
<div class="backdrop">
|
|
2594
|
-
<section role="dialog" aria-modal="true" aria-label=${
|
|
2594
|
+
<section role="dialog" aria-modal="true" aria-label=${iw(this.mode)} @keydown=${e=>{this.handleKeyDown(e)}}>
|
|
2595
2595
|
<header>
|
|
2596
2596
|
<div>
|
|
2597
2597
|
<span class="eyebrow">普通模式</span>
|
|
2598
|
-
<h1>${
|
|
2598
|
+
<h1>${iw(this.mode)}</h1>
|
|
2599
2599
|
</div>
|
|
2600
2600
|
${this.mode===`change`?g`<button class="close-button" title="关闭" aria-label="关闭" @click=${()=>this.onCancel?.()}>×</button>`:null}
|
|
2601
2601
|
</header>
|
|
@@ -2603,17 +2603,17 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2603
2603
|
${this.mode===`change`?g`
|
|
2604
2604
|
<label>
|
|
2605
2605
|
<span>当前密码</span>
|
|
2606
|
-
<input type="password" .value=${this.currentPassword} autocomplete="current-password" @input=${e=>{this.currentPassword=
|
|
2606
|
+
<input type="password" .value=${this.currentPassword} autocomplete="current-password" @input=${e=>{this.currentPassword=ow(e),this.localError=``}}>
|
|
2607
2607
|
</label>
|
|
2608
2608
|
`:null}
|
|
2609
2609
|
<label>
|
|
2610
2610
|
<span>${this.mode===`login`?`密码`:`新密码`}</span>
|
|
2611
|
-
<input type="password" .value=${this.password} autocomplete=${this.mode===`login`?`current-password`:`new-password`} @input=${e=>{this.password=
|
|
2611
|
+
<input type="password" .value=${this.password} autocomplete=${this.mode===`login`?`current-password`:`new-password`} @input=${e=>{this.password=ow(e),this.localError=``}}>
|
|
2612
2612
|
</label>
|
|
2613
2613
|
${this.mode===`login`?null:g`
|
|
2614
2614
|
<label>
|
|
2615
2615
|
<span>确认密码</span>
|
|
2616
|
-
<input type="password" .value=${this.confirmPassword} autocomplete="new-password" @input=${e=>{this.confirmPassword=
|
|
2616
|
+
<input type="password" .value=${this.confirmPassword} autocomplete="new-password" @input=${e=>{this.confirmPassword=ow(e),this.localError=``}}>
|
|
2617
2617
|
</label>
|
|
2618
2618
|
`}
|
|
2619
2619
|
${this.message()===``?null:g`<p class="message">${this.message()}</p>`}
|
|
@@ -2624,7 +2624,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2624
2624
|
</form>
|
|
2625
2625
|
</section>
|
|
2626
2626
|
</div>
|
|
2627
|
-
`}submitLabel(){return this.mode===`setup`?`设置并进入`:this.mode===`change`?`保存密码`:`进入`}message(){return this.localError||this.error}async submit(e){e.preventDefault();let t={currentPassword:this.currentPassword,password:this.password,confirmPassword:this.confirmPassword},n=
|
|
2627
|
+
`}submitLabel(){return this.mode===`setup`?`设置并进入`:this.mode===`change`?`保存密码`:`进入`}message(){return this.localError||this.error}async submit(e){e.preventDefault();let t={currentPassword:this.currentPassword,password:this.password,confirmPassword:this.confirmPassword},n=aw(this.mode,t);if(n!==void 0){this.localError=n;return}this.localError=``,await this.onSubmit?.(t)}handleKeyDown(e){e.key!==`Escape`||this.mode!==`change`||(e.preventDefault(),e.stopPropagation(),this.onCancel?.())}static{this.styles=h`
|
|
2628
2628
|
:host { position: fixed; inset: 0; z-index: 40; color: var(--pi-text); font: 14px system-ui, sans-serif; }
|
|
2629
2629
|
.backdrop { box-sizing: border-box; width: 100%; height: 100dvh; display: grid; place-items: center; padding: max(20px, env(safe-area-inset-top)) max(20px, env(safe-area-inset-right)) max(20px, env(safe-area-inset-bottom)) max(20px, env(safe-area-inset-left)); background: var(--pi-bg); }
|
|
2630
2630
|
section { width: min(420px, 100%); border: 1px solid var(--pi-border); border-radius: 12px; background: var(--pi-surface); box-shadow: 0 20px 60px var(--pi-shadow-strong); overflow: hidden; }
|
|
@@ -2642,7 +2642,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2642
2642
|
.close-button { width: 34px; height: 34px; display: grid; place-items: center; border: 0; background: transparent; color: var(--pi-muted); padding: 0; font-size: 24px; }
|
|
2643
2643
|
.message { margin: 0; border: 1px solid var(--pi-danger-border); border-radius: 8px; background: var(--pi-danger-surface); color: var(--pi-danger); padding: 10px; }
|
|
2644
2644
|
footer { display: flex; justify-content: flex-end; gap: 8px; }
|
|
2645
|
-
`}};V([x()],
|
|
2645
|
+
`}};V([x()],rw.prototype,`mode`,void 0),V([x({type:Boolean})],rw.prototype,`loading`,void 0),V([x()],rw.prototype,`error`,void 0),V([x({attribute:!1})],rw.prototype,`onSubmit`,void 0),V([x({attribute:!1})],rw.prototype,`onCancel`,void 0),V([S()],rw.prototype,`currentPassword`,void 0),V([S()],rw.prototype,`password`,void 0),V([S()],rw.prototype,`confirmPassword`,void 0),V([S()],rw.prototype,`localError`,void 0),rw=V([b(`normal-auth-dialog`)],rw);function iw(e){return e===`setup`?`设置进入密码`:e===`change`?`修改进入密码`:`输入密码`}function aw(e,t){if(e===`change`&&(t.currentPassword??``)===``)return`请输入当前密码。`;if(t.password===``)return`请输入密码。`;if(e!==`login`&&t.password!==(t.confirmPassword??``))return`两次输入的密码不一致。`}function ow(e){return e.target instanceof HTMLInputElement?e.target.value:``}var sw=class extends y{constructor(...e){super(...e),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(){let e=++this.requestId;this.loading=!0;try{let t=await L.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`){let t=this.suggestions[this.selected];if(t===void 0)return;e.preventDefault(),this.pick(t)}}render(){return g`
|
|
2646
2646
|
<div class="backdrop" @click=${()=>this.onCancel?.()}>
|
|
2647
2647
|
<section @click=${e=>{e.stopPropagation()}}>
|
|
2648
2648
|
<header>
|
|
@@ -2692,7 +2692,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2692
2692
|
header button { border: 0; background: transparent; color: var(--pi-muted); font-size: 22px; padding: 0 8px; }
|
|
2693
2693
|
.primary { border-color: var(--pi-success-border); background: var(--pi-success-border); }
|
|
2694
2694
|
button:disabled { opacity: .5; cursor: not-allowed; }
|
|
2695
|
-
`}};V([x({attribute:!1})],
|
|
2695
|
+
`}};V([x({attribute:!1})],sw.prototype,`onSubmit`,void 0),V([x({attribute:!1})],sw.prototype,`onCancel`,void 0),V([x()],sw.prototype,`machineId`,void 0),V([S()],sw.prototype,`path`,void 0),V([S()],sw.prototype,`createMissing`,void 0),V([S()],sw.prototype,`suggestions`,void 0),V([S()],sw.prototype,`selected`,void 0),V([S()],sw.prototype,`loading`,void 0),V([C(`input`)],sw.prototype,`pathInput`,void 0),sw=V([b(`project-dialog`)],sw);var cw=class extends y{constructor(...e){super(...e),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;let t=e.target.value,n=lw(t);(!this.nameEdited||this.name.trim()===``||this.name===this.previousSuggestedName)&&(this.name=n),this.previousSuggestedName=n,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`&&uw(this.url)===void 0&&(e.preventDefault(),this.updateComplete.then(()=>{this.nameInput?.focus(),this.nameInput?.select()}))}handleSubmit(e){e.preventDefault(),this.submit()}async submit(){let e=this.validInput();if(!(e===void 0||this.submitting)){this.submitting=!0;try{await this.onSubmit?.(e)}finally{this.isConnected&&(this.submitting=!1)}}}validInput(){let e=this.url.trim(),t=this.name.trim();if(e===``||t===``||uw(e)!==void 0)return;let n=this.token.trim();return{name:t,baseUrl:e,...n===``?{}:{token:n}}}render(){let e=this.url.trim()!==``,t=e?uw(this.url):void 0,n=this.validInput()!==void 0&&!this.submitting;return g`
|
|
2696
2696
|
<div class="backdrop" @click=${()=>this.onCancel?.()}>
|
|
2697
2697
|
<section @click=${e=>{e.stopPropagation()}}>
|
|
2698
2698
|
<form @submit=${e=>{this.handleSubmit(e)}} @keydown=${e=>{this.handleKeyDown(e)}}>
|
|
@@ -2747,7 +2747,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2747
2747
|
header button { border: 0; background: transparent; color: var(--pi-muted); font-size: 22px; padding: 0 8px; }
|
|
2748
2748
|
.primary { border-color: var(--pi-success-border); background: var(--pi-success-border); }
|
|
2749
2749
|
button:disabled { opacity: .5; cursor: not-allowed; }
|
|
2750
|
-
`}};V([x({attribute:!1})],
|
|
2750
|
+
`}};V([x({attribute:!1})],cw.prototype,`onSubmit`,void 0),V([x({attribute:!1})],cw.prototype,`onCancel`,void 0),V([x()],cw.prototype,`error`,void 0),V([S()],cw.prototype,`url`,void 0),V([S()],cw.prototype,`name`,void 0),V([S()],cw.prototype,`token`,void 0),V([S()],cw.prototype,`submitting`,void 0),V([C(`input[name='baseUrl']`)],cw.prototype,`urlInput`,void 0),V([C(`input[name='name']`)],cw.prototype,`nameInput`,void 0),cw=V([b(`machine-dialog`)],cw);function lw(e){let t=e.trim();if(t===``)return``;let n=dw(t)??dw(`http://${t.replace(/^\/+/u,``)}`);return n!==void 0&&n.hostname!==``?n.hostname.replace(/^\[(.*)\]$/u,`$1`):fw(t)}function uw(e){let t=e.trim();if(t===``)return`必须填写远程 PI WEB URL。`;let n;try{n=new URL(t)}catch{return`请输入包含 http:// 或 https:// 的有效 URL。`}if(n.protocol!==`http:`&&n.protocol!==`https:`)return`请使用 http:// 或 https:// URL。`;if(n.username!==``||n.password!==``)return`机器 URL 中不要包含凭据。`;if(n.search!==``||n.hash!==``)return`不要包含查询字符串或片段。`}function dw(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`?t:void 0}catch{return}}function fw(e){let t=e.replace(/^[a-z][a-z\d+.-]*:\/\//iu,``),n=t.slice(t.lastIndexOf(`@`)+1).split(/[/?#]/u)[0]??``;return n.startsWith(`[`)&&n.includes(`]`)?n.slice(1,n.indexOf(`]`)):n.replace(/:\d+$/u,``)}var pw={availability:`error`,error:`error`,success:`success`,security:`warning`,warning:`warning`,info:`info`};function mw(e){return e.tone??pw[e.type]}var hw=class extends y{constructor(...e){super(...e),this.heading=``,this.description=``,this.actionLabel=``,this.actionTitle=``,this.actionDisabled=!1,this.notices=[]}render(){return g`
|
|
2751
2751
|
<section class="panel" aria-label=${this.heading||`设置面板`}>
|
|
2752
2752
|
<header class="section-heading">
|
|
2753
2753
|
<div class="heading-copy">
|
|
@@ -2770,7 +2770,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2770
2770
|
<div class="notice-stack" aria-label="设置通知">
|
|
2771
2771
|
${this.notices.map(e=>this.renderNotice(e))}
|
|
2772
2772
|
</div>
|
|
2773
|
-
`}renderNotice(e){let t=
|
|
2773
|
+
`}renderNotice(e){let t=mw(e),n=e.role??gw(t),r=e.title;return g`
|
|
2774
2774
|
<article class=${`notice ${t}`} role=${n}>
|
|
2775
2775
|
${r===void 0||r===``?v:g`<strong class="notice-title">${r}</strong>`}
|
|
2776
2776
|
<div class="notice-content">${e.content}</div>
|
|
@@ -2803,13 +2803,13 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2803
2803
|
.section-heading { display: grid; gap: 12px; }
|
|
2804
2804
|
.heading-actions { justify-self: start; }
|
|
2805
2805
|
}
|
|
2806
|
-
`}};V([x()],
|
|
2807
|
-
`):``}}function
|
|
2808
|
-
`)??``,uploadDefaultFolder:e.uploads?.defaultFolder??``}}function
|
|
2809
|
-
`).map(e=>e.trim()).filter(e=>e!==``),n=t.find(e=>!
|
|
2806
|
+
`}};V([x()],hw.prototype,`heading`,void 0),V([x({attribute:!1})],hw.prototype,`description`,void 0),V([x()],hw.prototype,`actionLabel`,void 0),V([x()],hw.prototype,`actionTitle`,void 0),V([x({type:Boolean})],hw.prototype,`actionDisabled`,void 0),V([x({attribute:!1})],hw.prototype,`notices`,void 0),V([x({attribute:!1})],hw.prototype,`onAction`,void 0),hw=V([b(`settings-panel-frame`)],hw);function gw(e){switch(e){case`error`:return`alert`;case`success`:return`status`;case`warning`:case`info`:return`note`}}function _w(){return{host:``,port:``,allowedHostsMode:`list`,allowedHostsText:``}}function vw(){return{allowedPathsText:``,uploadDefaultFolder:``}}function yw(){return{command:``,dir:``}}function bw(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(`
|
|
2807
|
+
`):``}}function xw(e){return{allowedPathsText:e.pathAccess?.allowedPaths?.join(`
|
|
2808
|
+
`)??``,uploadDefaultFolder:e.uploads?.defaultFolder??``}}function Sw(e){return{command:e.agent?.command??``,dir:e.agent?.dir??``}}function Cw(e){let t=e.command.trim(),n=e.dir.trim();return{agent:{...t===``?{}:{command:t},...n===``?{}:{dir:n}}}}function ww(e,t){let n=Cw(e).agent??{},r=t.agent??{};return n.command===r.command&&n.dir===r.dir}function Tw(e,t={}){let n=Dw(t),r=e.host.trim(),i=e.port.trim();if(r!==``&&(n.host=r),i!==``){let e=Number(i);if(!Number.isInteger(e)||e<1||e>65535)throw Error(`端口必须是 1 到 65535 之间的整数。`);n.port=e}return n.allowedHosts=e.allowedHostsMode===`all`||Ow(e.allowedHostsText),n}function Ew(e){let t=kw(e.allowedPathsText),n=Aw(e.uploadDefaultFolder);return{pathAccess:{allowedPaths:t},uploads:n===``?{}:{defaultFolder:n}}}function Dw(e){return{...e.shortcuts===void 0?{}:{shortcuts:e.shortcuts},...e.plugins===void 0?{}:{plugins:e.plugins},...e.normalAuth===void 0?{}:{normalAuth:e.normalAuth},...e.pathAccess===void 0?{}:{pathAccess:e.pathAccess},...e.uploads===void 0?{}:{uploads:e.uploads},...e.maxUploadBytes===void 0?{}:{maxUploadBytes:e.maxUploadBytes},...e.spawnSessions===void 0?{}:{spawnSessions:e.spawnSessions},...e.subsessions===void 0?{}:{subsessions:e.subsessions},...e.askUser===void 0?{}:{askUser:e.askUser},...e.agent===void 0?{}:{agent:e.agent}}}function Ow(e){return e.split(/[\n,]/u).map(e=>e.trim()).filter(e=>e!==``)}function kw(e){let t=e.split(`
|
|
2809
|
+
`).map(e=>e.trim()).filter(e=>e!==``),n=t.find(e=>!jw(e));if(n!==void 0)throw Error(`允许的外部路径必须是绝对路径或以 ~ 开头:${n}`);return t}function Aw(e){let t=e.trim();if(t===``)return``;if(Mw(t))throw Error(`上传默认文件夹必须是工作区相对路径。`);let n=t.split(/[\\/]+/u).filter(e=>e!==``&&e!==`.`);if(n.length===0)return``;if(n.some(e=>e===`..`))throw Error(`上传默认文件夹不能包含路径穿越。`);return n.join(`/`)}function jw(e){return e===`~`||e.startsWith(`~/`)||e.startsWith(`~\\`)||e.startsWith(`/`)||e.startsWith(`\\`)||/^[A-Za-z]:[\\/]/u.test(e)}function Mw(e){let t=e.replace(/\\/g,`/`);return t.startsWith(`/`)||/^[A-Za-z]:\//u.test(t)}function Nw(e){return g`网关服务器字段用于编辑当前本地网关;文件访问和上传默认值用于编辑 ${e}。`}var J=class extends y{constructor(...e){super(...e),this.loading=!1,this.machineLoading=!1,this.saving=!1,this.error=``,this.machineError=``,this.savedMessage=``,this.targetLabel=`selected machine`,this.gatewayDraft=_w(),this.machineDraft=vw(),this.gatewayLocalError=``,this.machineLocalError=``}willUpdate(e){e.has(`configResponse`)&&this.configResponse!==void 0&&(this.gatewayDraft=bw(this.configResponse.config),this.gatewayLocalError=``),e.has(`machineConfigResponse`)&&this.machineConfigResponse!==void 0&&(this.machineDraft=xw(this.machineConfigResponse.config),this.machineLocalError=``)}render(){return g`
|
|
2810
2810
|
<settings-panel-frame
|
|
2811
2811
|
heading="通用配置"
|
|
2812
|
-
.description=${
|
|
2812
|
+
.description=${Nw(this.targetLabel)}
|
|
2813
2813
|
actionLabel="重新加载"
|
|
2814
2814
|
.actionDisabled=${this.loading||this.machineLoading}
|
|
2815
2815
|
.notices=${this.panelNotices()}
|
|
@@ -2838,7 +2838,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2838
2838
|
<span>主机地址</span>
|
|
2839
2839
|
${this.renderOverrideBadge(`host`)}
|
|
2840
2840
|
</span>
|
|
2841
|
-
<input .value=${this.gatewayDraft.host} placeholder="127.0.0.1" autocomplete="off" spellcheck="false" @input=${e=>{this.updateGatewayDraft({host:
|
|
2841
|
+
<input .value=${this.gatewayDraft.host} placeholder="127.0.0.1" autocomplete="off" spellcheck="false" @input=${e=>{this.updateGatewayDraft({host:Iw(e)})}}>
|
|
2842
2842
|
<small>Web 服务器应绑定的地址。留空则使用 PI WEB 默认值。</small>
|
|
2843
2843
|
</label>
|
|
2844
2844
|
|
|
@@ -2847,7 +2847,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2847
2847
|
<span>端口</span>
|
|
2848
2848
|
${this.renderOverrideBadge(`port`)}
|
|
2849
2849
|
</span>
|
|
2850
|
-
<input .value=${this.gatewayDraft.port} inputmode="numeric" pattern="[0-9]*" placeholder="8504" autocomplete="off" @input=${e=>{this.updateGatewayDraft({port:
|
|
2850
|
+
<input .value=${this.gatewayDraft.port} inputmode="numeric" pattern="[0-9]*" placeholder="8504" autocomplete="off" @input=${e=>{this.updateGatewayDraft({port:Iw(e)})}}>
|
|
2851
2851
|
<small>TCP 端口,范围 1 到 65535。留空则使用 PI WEB 默认值。</small>
|
|
2852
2852
|
</label>
|
|
2853
2853
|
|
|
@@ -2856,11 +2856,11 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2856
2856
|
<span>允许的主机名</span>
|
|
2857
2857
|
${this.renderOverrideBadge(`allowedHosts`)}
|
|
2858
2858
|
</span>
|
|
2859
|
-
<select .value=${this.gatewayDraft.allowedHostsMode} @change=${e=>{this.updateGatewayDraft({allowedHostsMode:
|
|
2859
|
+
<select .value=${this.gatewayDraft.allowedHostsMode} @change=${e=>{this.updateGatewayDraft({allowedHostsMode:Lw(e)===`all`?`all`:`list`})}}>
|
|
2860
2860
|
<option value="list">仅允许列出的主机名</option>
|
|
2861
2861
|
<option value="all">允许所有主机名</option>
|
|
2862
2862
|
</select>
|
|
2863
|
-
<textarea .value=${this.gatewayDraft.allowedHostsText} ?disabled=${this.gatewayDraft.allowedHostsMode===`all`} rows="4" placeholder="example.local 192.168.1.20" spellcheck="false" @input=${e=>{this.updateGatewayDraft({allowedHostsText:
|
|
2863
|
+
<textarea .value=${this.gatewayDraft.allowedHostsText} ?disabled=${this.gatewayDraft.allowedHostsMode===`all`} rows="4" placeholder="example.local 192.168.1.20" spellcheck="false" @input=${e=>{this.updateGatewayDraft({allowedHostsText:Rw(e)})}}></textarea>
|
|
2864
2864
|
<small>每行输入一个主机名,或选择“允许所有主机名”写入 <code>true</code>。</small>
|
|
2865
2865
|
</div>
|
|
2866
2866
|
|
|
@@ -2890,7 +2890,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2890
2890
|
<span class="field-heading">
|
|
2891
2891
|
<span>外部文件系统根目录</span>
|
|
2892
2892
|
</span>
|
|
2893
|
-
<textarea .value=${this.machineDraft.allowedPathsText} rows="4" placeholder="~/SDKs /opt/reference" spellcheck="false" @input=${e=>{this.updateMachineDraft({allowedPathsText:
|
|
2893
|
+
<textarea .value=${this.machineDraft.allowedPathsText} rows="4" placeholder="~/SDKs /opt/reference" spellcheck="false" @input=${e=>{this.updateMachineDraft({allowedPathsText:Rw(e)})}}></textarea>
|
|
2894
2894
|
<small>${this.targetLabel} 上允许用于绝对路径 <code>@</code> 补全和工作区外文件读取的目录。每行输入一个绝对路径、Windows 绝对路径或以 <code>~</code> 开头的路径。留空则默认禁止外部路径。</small>
|
|
2895
2895
|
</label>
|
|
2896
2896
|
|
|
@@ -2898,7 +2898,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2898
2898
|
<span class="field-heading">
|
|
2899
2899
|
<span>默认上传文件夹</span>
|
|
2900
2900
|
</span>
|
|
2901
|
-
<input .value=${this.machineDraft.uploadDefaultFolder} placeholder=${yo} autocomplete="off" spellcheck="false" @input=${e=>{this.updateMachineDraft({uploadDefaultFolder:
|
|
2901
|
+
<input .value=${this.machineDraft.uploadDefaultFolder} placeholder=${yo} autocomplete="off" spellcheck="false" @input=${e=>{this.updateMachineDraft({uploadDefaultFolder:Iw(e)})}}>
|
|
2902
2902
|
<small>${this.targetLabel} 上手动上传文件使用的工作区相对目录。留空则使用 PI WEB 默认值 <code>${yo}</code>。</small>
|
|
2903
2903
|
</label>
|
|
2904
2904
|
|
|
@@ -2916,18 +2916,18 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2916
2916
|
<dl>
|
|
2917
2917
|
<div><dt>主机地址</dt><dd>${e.host??g`<span class="muted">默认 127.0.0.1</span>`}</dd></div>
|
|
2918
2918
|
<div><dt>端口</dt><dd>${e.port??g`<span class="muted">默认 8504</span>`}</dd></div>
|
|
2919
|
-
<div><dt>允许的主机名</dt><dd>${
|
|
2919
|
+
<div><dt>允许的主机名</dt><dd>${Pw(e.allowedHosts)}</dd></div>
|
|
2920
2920
|
</dl>
|
|
2921
2921
|
</section>
|
|
2922
2922
|
`}renderMachineEffectiveConfig(){let e=this.machineConfigResponse?.effectiveConfig??{};return g`
|
|
2923
2923
|
<section class="effective-card" aria-label="所选机器最终生效的文件访问和上传摘要">
|
|
2924
2924
|
<h3>所选机器的生效配置</h3>
|
|
2925
2925
|
<dl>
|
|
2926
|
-
<div><dt>外部根目录</dt><dd>${
|
|
2926
|
+
<div><dt>外部根目录</dt><dd>${Fw(e.pathAccess?.allowedPaths)}</dd></div>
|
|
2927
2927
|
<div><dt>上传文件夹</dt><dd>${e.uploads?.defaultFolder??g`<span class="muted">默认 ${`.pi-web/uploads`}</span>`}</dd></div>
|
|
2928
2928
|
</dl>
|
|
2929
2929
|
</section>
|
|
2930
|
-
`}reloadAll(){this.onReload?.(),this.onReloadMachine?.()}async saveGatewayConfig(e){e.preventDefault(),this.gatewayLocalError=``;try{await this.onSave?.(
|
|
2930
|
+
`}reloadAll(){this.onReload?.(),this.onReloadMachine?.()}async saveGatewayConfig(e){e.preventDefault(),this.gatewayLocalError=``;try{await this.onSave?.(Tw(this.gatewayDraft,this.configResponse?.config??{}))}catch(e){this.gatewayLocalError=zw(e)}}async saveMachineAccessConfig(e){e.preventDefault(),this.machineLocalError=``;try{await this.onSaveMachineConfig?.(Ew(this.machineDraft))}catch(e){this.machineLocalError=zw(e)}}updateGatewayDraft(e){this.gatewayDraft={...this.gatewayDraft,...e},this.gatewayLocalError=``}updateMachineDraft(e){this.machineDraft={...this.machineDraft,...e},this.machineLocalError=``}static{this.styles=h`
|
|
2931
2931
|
:host { display: block; }
|
|
2932
2932
|
.card-heading { display: grid; gap: 6px; min-width: 0; }
|
|
2933
2933
|
h3, p { margin: 0; }
|
|
@@ -2958,10 +2958,10 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2958
2958
|
@media (max-width: 760px) {
|
|
2959
2959
|
.effective-card dl > div { grid-template-columns: minmax(0, 1fr); gap: 3px; }
|
|
2960
2960
|
}
|
|
2961
|
-
`}};V([x({attribute:!1})],J.prototype,`configResponse`,void 0),V([x({attribute:!1})],J.prototype,`machineConfigResponse`,void 0),V([x({type:Boolean})],J.prototype,`loading`,void 0),V([x({type:Boolean})],J.prototype,`machineLoading`,void 0),V([x({type:Boolean})],J.prototype,`saving`,void 0),V([x()],J.prototype,`error`,void 0),V([x()],J.prototype,`machineError`,void 0),V([x()],J.prototype,`savedMessage`,void 0),V([x()],J.prototype,`targetLabel`,void 0),V([x({attribute:!1})],J.prototype,`onReload`,void 0),V([x({attribute:!1})],J.prototype,`onReloadMachine`,void 0),V([x({attribute:!1})],J.prototype,`onSave`,void 0),V([x({attribute:!1})],J.prototype,`onSaveMachineConfig`,void 0),V([S()],J.prototype,`gatewayDraft`,void 0),V([S()],J.prototype,`machineDraft`,void 0),V([S()],J.prototype,`gatewayLocalError`,void 0),V([S()],J.prototype,`machineLocalError`,void 0),J=V([b(`settings-general-panel`)],J);function
|
|
2961
|
+
`}};V([x({attribute:!1})],J.prototype,`configResponse`,void 0),V([x({attribute:!1})],J.prototype,`machineConfigResponse`,void 0),V([x({type:Boolean})],J.prototype,`loading`,void 0),V([x({type:Boolean})],J.prototype,`machineLoading`,void 0),V([x({type:Boolean})],J.prototype,`saving`,void 0),V([x()],J.prototype,`error`,void 0),V([x()],J.prototype,`machineError`,void 0),V([x()],J.prototype,`savedMessage`,void 0),V([x()],J.prototype,`targetLabel`,void 0),V([x({attribute:!1})],J.prototype,`onReload`,void 0),V([x({attribute:!1})],J.prototype,`onReloadMachine`,void 0),V([x({attribute:!1})],J.prototype,`onSave`,void 0),V([x({attribute:!1})],J.prototype,`onSaveMachineConfig`,void 0),V([S()],J.prototype,`gatewayDraft`,void 0),V([S()],J.prototype,`machineDraft`,void 0),V([S()],J.prototype,`gatewayLocalError`,void 0),V([S()],J.prototype,`machineLocalError`,void 0),J=V([b(`settings-general-panel`)],J);function Pw(e){return e===!0?`任意 host`:Array.isArray(e)?e.length===0?g`<span class="muted">未列出</span>`:e.join(`, `):g`<span class="muted">未设置</span>`}function Fw(e){return e===void 0||e.length===0?g`<span class="muted">已禁止外部路径</span>`:e.join(`, `)}function Iw(e){return e.target instanceof HTMLInputElement?e.target.value:``}function Lw(e){return e.target instanceof HTMLSelectElement?e.target.value:``}function Rw(e){return e.target instanceof HTMLTextAreaElement?e.target.value:``}function zw(e){return e instanceof Error?e.message:String(e)}function Bw(e){return{spawnSessions:e}}function Vw(e){return{subsessions:e}}function Hw(e){return{askUser:e}}function Uw(e,t){let n=e?.effectiveConfig.agent;if(n?.command===void 0||n.dir===void 0||t===void 0)return`unavailable`;let r=[`PI_WEB_AGENT_SESSION_DIR`,...Gt(n.command)?[`PI_CODING_AGENT_SESSION_DIR`]:[]];return n.command===t.command&&n.dir===t.dir&&Kw(t.sessionDirEnvKeys,r)?`active`:`restart-required`}function Ww(e,t){return e?.agentDirSource===`pi-web`?!0:e?.agentDirSource===`pi-compatibility`?Gt(t.trim()||`pi`):e?.agentDir===!0}function Gw(e,t){let n={...e.envOverrides,spawnSessions:t.envOverrides.spawnSessions,subsessions:t.envOverrides.subsessions,askUser:t.envOverrides.askUser,agentCommand:t.envOverrides.agentCommand,agentDir:t.envOverrides.agentDir,agentSessionDir:t.envOverrides.agentSessionDir};return t.envOverrides.agentDirSource===void 0?delete n.agentDirSource:n.agentDirSource=t.envOverrides.agentDirSource,{...e,config:{...e.config,...t.config},effectiveConfig:{...e.effectiveConfig,...t.effectiveConfig},envOverrides:n}}function Kw(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}var qw=class extends y{constructor(...e){super(...e),this.loading=!1,this.saving=!1,this.error=``,this.savedMessage=``,this.targetLabel=`本机(本地网关)`,this.agentProfileSupport={state:`supported`},this.agentDraft=yw(),this.agentDraftDirty=!1,this.agentLocalError=``}willUpdate(e){if(e.has(`configResponse`)){if(this.configResponse===void 0){this.agentDraft=yw(),this.agentDraftDirty=!1,this.agentLocalError=``;return}(!this.agentDraftDirty||ww(this.agentDraft,this.configResponse.config))&&(this.agentDraft=Sw(this.configResponse.config),this.agentDraftDirty=!1,this.agentLocalError=``)}}render(){let e=this.configResponse,t=e?.envOverrides.spawnSessions===!0,n=e?.effectiveConfig.spawnSessions!==!1,r=e?.envOverrides.subsessions===!0,i=e?.effectiveConfig.subsessions===!0&&n,a=e?.effectiveConfig.askUser!==void 0,o=e?.envOverrides.askUser===!0,s=e?.effectiveConfig.askUser===!0,c=e?.envOverrides.agentCommand===!0,l=this.agentProfileSupport.state===`supported`,u=c?e.effectiveConfig.agent?.command??this.agentDraft.command:this.agentDraft.command,d=Ww(e?.envOverrides,u),f=e?.envOverrides.agentDir===!0,p=e?.effectiveConfig.agent,m=Uw(e,this.activeAgentProfile);return g`
|
|
2962
2962
|
<settings-panel-frame
|
|
2963
2963
|
heading="会话守护进程"
|
|
2964
|
-
.description=${
|
|
2964
|
+
.description=${Zw(this.targetLabel)}
|
|
2965
2965
|
actionLabel="重新加载"
|
|
2966
2966
|
.actionDisabled=${this.loading}
|
|
2967
2967
|
.notices=${this.panelNotices(e)}
|
|
@@ -2987,7 +2987,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
2987
2987
|
.value=${this.agentDraft.command}
|
|
2988
2988
|
placeholder="pi"
|
|
2989
2989
|
?disabled=${this.loading||this.saving||!l||c}
|
|
2990
|
-
@input=${e=>{this.updateAgentDraft({command:
|
|
2990
|
+
@input=${e=>{this.updateAgentDraft({command:Yw(e)})}}
|
|
2991
2991
|
>
|
|
2992
2992
|
<small>设置诊断和更新检查所用的 Pi 兼容配套 CLI。内嵌会话运行时仍使用 PI WEB 捆绑的 Pi SDK。</small>
|
|
2993
2993
|
</label>
|
|
@@ -3004,7 +3004,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3004
3004
|
.value=${this.agentDraft.dir}
|
|
3005
3005
|
placeholder="~/.pi/agent 或 ~/agent-profiles/work"
|
|
3006
3006
|
?disabled=${this.loading||this.saving||!l||d}
|
|
3007
|
-
@input=${e=>{this.updateAgentDraft({dir:
|
|
3007
|
+
@input=${e=>{this.updateAgentDraft({dir:Yw(e)})}}
|
|
3008
3008
|
>
|
|
3009
3009
|
<small>选择 PI WEB 读取的 Pi 兼容认证、模型、设置和会话目录。备用命令会与其所需状态目录一并保存。</small>
|
|
3010
3010
|
</label>
|
|
@@ -3069,7 +3069,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3069
3069
|
<div><dt>期望状态目录</dt><dd>${p?.dir??g`<span class="muted">不可用</span>`}</dd></div>
|
|
3070
3070
|
<div><dt>当前命令</dt><dd>${this.activeAgentProfile?.command??g`<span class="muted">不可用</span>`}</dd></div>
|
|
3071
3071
|
<div><dt>当前状态目录</dt><dd>${this.activeAgentProfile?.dir??g`<span class="muted">不可用</span>`}</dd></div>
|
|
3072
|
-
<div><dt>配置档案状态</dt><dd>${
|
|
3072
|
+
<div><dt>配置档案状态</dt><dd>${Jw(m)}</dd></div>
|
|
3073
3073
|
<div><dt>派生会话</dt><dd>${n?`已启用`:g`<span class="muted">已禁用</span>`}</dd></div>
|
|
3074
3074
|
<div><dt>子会话</dt><dd>${i?`已启用`:g`<span class="muted">已禁用</span>`}</dd></div>
|
|
3075
3075
|
<div><dt>代理提问</dt><dd>${a?s?`已启用`:g`<span class="muted">已禁用</span>`:g`<span class="muted">不可用</span>`}</dd></div>
|
|
@@ -3077,7 +3077,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3077
3077
|
</section>
|
|
3078
3078
|
`}
|
|
3079
3079
|
</settings-panel-frame>
|
|
3080
|
-
`}panelNotices(e){let t=[],n=this.agentLocalError||this.error;return n!==``&&t.push({type:`error`,content:n}),this.savedMessage!==``&&t.push({type:`success`,content:this.savedMessage}),
|
|
3080
|
+
`}panelNotices(e){let t=[],n=this.agentLocalError||this.error;return n!==``&&t.push({type:`error`,content:n}),this.savedMessage!==``&&t.push({type:`success`,content:this.savedMessage}),Uw(e,this.activeAgentProfile)===`restart-required`&&t.push({type:`warning`,title:`${this.targetLabel} 需要重启`,content:g`更改这些设置后,请在该机器上运行 <code>pi-web restart</code>,或重启其会话守护进程服务。`}),t}renderUnavailableConfigState(){return g`<div class="loading-card">${this.loading?`正在加载配置…`:`配置不可用,请重新加载。`}</div>`}async saveAgentProfile(e){e.preventDefault(),this.agentLocalError=``;try{await this.onSave?.(Cw(this.agentDraft))}catch(e){this.agentLocalError=Xw(e)}}updateAgentDraft(e){this.agentDraft={...this.agentDraft,...e},this.agentDraftDirty=!0,this.agentLocalError=``}async toggleSpawnSessions(e){let t=e.target instanceof HTMLInputElement&&e.target.checked;await this.onSave?.(Bw(t))}async toggleSubsessions(e){let t=e.target instanceof HTMLInputElement&&e.target.checked;await this.onSave?.(Vw(t))}async toggleAskUser(e){let t=e.target instanceof HTMLInputElement&&e.target.checked;await this.onSave?.(Hw(t))}static{this.styles=h`
|
|
3081
3081
|
:host { display: block; }
|
|
3082
3082
|
h3 { margin: 0; font-size: 13px; line-height: 1.3; }
|
|
3083
3083
|
button, input { font: inherit; }
|
|
@@ -3122,10 +3122,10 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3122
3122
|
@media (max-width: 760px) {
|
|
3123
3123
|
.effective-card dl > div { grid-template-columns: minmax(0, 1fr); gap: 3px; }
|
|
3124
3124
|
}
|
|
3125
|
-
`}};V([x({attribute:!1})],
|
|
3125
|
+
`}};V([x({attribute:!1})],qw.prototype,`configResponse`,void 0),V([x({type:Boolean})],qw.prototype,`loading`,void 0),V([x({type:Boolean})],qw.prototype,`saving`,void 0),V([x()],qw.prototype,`error`,void 0),V([x()],qw.prototype,`savedMessage`,void 0),V([x()],qw.prototype,`targetLabel`,void 0),V([x({attribute:!1})],qw.prototype,`activeAgentProfile`,void 0),V([x({attribute:!1})],qw.prototype,`agentProfileSupport`,void 0),V([x({attribute:!1})],qw.prototype,`onReload`,void 0),V([x({attribute:!1})],qw.prototype,`onSave`,void 0),V([S()],qw.prototype,`agentDraft`,void 0),V([S()],qw.prototype,`agentDraftDirty`,void 0),V([S()],qw.prototype,`agentLocalError`,void 0),qw=V([b(`settings-sessiond-panel`)],qw);function Jw(e){return e===`active`?`已生效`:e===`restart-required`?`需要重启`:g`<span class="muted">不可用</span>`}function Yw(e){return e.target instanceof HTMLInputElement?e.target.value:``}function Xw(e){return e instanceof Error?e.message:String(e)}function Zw(e){return`这些设置会影响 ${e} 上长生命周期的会话运行时。更改会立即保存,但只有在该机器的会话守护进程重启后才会生效。`}function Qw(e){return e===void 0?{id:`local`,name:`本机`,kind:`local`}:{id:e.id,name:e.name,kind:e.kind}}function $w(e){return e.kind===`local`?`${e.name}(本地网关)`:`${e.name}(远程机器)`}function eT(e,t){return e.kind===`local`||t?.ok===!0?{state:`supported`}:{state:`unknown`}}function tT(e){return`${e.state}:${e.message??``}`}function nT(e){return e?.state===`unsupported`}function rT(e){return`${e.name} 不支持 Pi 包管理。请更新并重启该机器上的 PI WEB,然后重试。`}function iT(e){return e.kind===`local`}function aT(e){return e.trim()}function oT(e){if(aT(e)===``)return`请输入 Pi 支持的包来源,例如 npm:@scope/package、Git/URL 来源或本地路径。`}function sT(e){return e.scope===`project`?`项目范围`:`用户范围`}function cT(e){return e.filtered?`已被当前 Pi 包设置过滤`:`可用于此 PI WEB 进程`}function lT(e){return e.installedPath??`Pi 未报告安装路径`}function uT(e){return e.scope===`user`}function dT(e){if(!uT(e))return`此处会列出项目范围的 Pi 包,但 PI WEB 只能在此界面安全更新用户范围的 Pi 包。`}function fT(e){return e.length>0&&e.every(uT)}function pT(e){if(e.length===0)return`尚未配置 Pi 包。`;if(!fT(e))return`列表中包含项目范围的 Pi 包,无法全部更新;请逐个更新用户范围的包。`}function mT(e,t,n){return e?.kind===t?n===void 0||e.source===n:!1}function hT(e,t=Qw(void 0)){return`Pi 包${e===`install`?`已安装`:e===`remove`?`已移除`:`已更新`}${t.kind===`local`?``:`(${t.name})`}。请在 ${t.kind===`local`?`每个空闲的 PI WEB 会话`:`${t.name} 上每个空闲的 PI WEB 会话`} 中输入 /reload,重新发现 Pi 运行时资源:扩展、技能、提示词模板、主题以及上下文/系统提示文件。对于 ${t.kind===`local`?`PI WEB 浏览器插件变更`:`${t.name} 提供的 PI WEB 浏览器插件变更`},请另外重新加载浏览器页面。`}function gT(e,t){let n=e.trim();return t.kind===`remote`?_T(n)?rT(t):n===`Remote machine timeout`?`联系 ${t.name} 进行 Pi 包管理时超时。包操作可能仍在远端运行;重试前请重新加载包列表。`:n===`Remote machine unavailable`?`无法连接 ${t.name} 进行 Pi 包管理。请检查机器连接后重试。`:n:n}function _T(e){return e===`Not Found`||/route\s+(GET|POST):?\/api\/pi-packages\b.*not found/iu.test(e)||/cannot\s+(GET|POST)\s+.*\/api\/pi-packages\b/iu.test(e)}var vT=class extends y{constructor(...e){super(...e),this.loading=!1,this.error=``,this.operationMessage=``,this.installSource=``,this.validationMessage=``}render(){let e=this.packagesResponse?.packages??[],t=this.packageTarget,n=$w(t),r=this.packageManagementUnavailable,i=this.packagesResponse!==void 0&&!r;return g`
|
|
3126
3126
|
<settings-panel-frame
|
|
3127
3127
|
heading="Pi 包"
|
|
3128
|
-
.description=${
|
|
3128
|
+
.description=${yT(n)}
|
|
3129
3129
|
actionLabel="重新加载"
|
|
3130
3130
|
actionTitle=${r?this.packageManagementUnavailableMessage(n):`从 ${n} 重新加载 Pi 包`}
|
|
3131
3131
|
.actionDisabled=${this.loading||this.isOperating||r}
|
|
@@ -3142,12 +3142,12 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3142
3142
|
<label for="package-source">Pi 包来源</label>
|
|
3143
3143
|
<div class="install-row">
|
|
3144
3144
|
<input id="package-source" .value=${this.installSource} ?disabled=${this.isOperating} placeholder="npm:@scope/package、Git URL 或本地路径" @input=${e=>{this.updateInstallSource(e)}}>
|
|
3145
|
-
<button type="submit" title="安装此 Pi 包" ?disabled=${this.isOperating}>${
|
|
3145
|
+
<button type="submit" title="安装此 Pi 包" ?disabled=${this.isOperating}>${mT(this.operation,`install`)?`正在安装…`:`安装`}</button>
|
|
3146
3146
|
</div>
|
|
3147
3147
|
${this.validationMessage===``?null:g`<div class="field-error">${this.validationMessage}</div>`}
|
|
3148
3148
|
<small>安装操作在 ${e} 上运行并使用 Pi 的默认包位置,等同于 <code>pi install <source></code>。PI WEB 不会要求你选择安装位置。</small>
|
|
3149
3149
|
</form>
|
|
3150
|
-
`}renderPackageList(e,t){let n
|
|
3150
|
+
`}renderPackageList(e,t){let n=$w(t),r=this.packageManagementUnavailable?this.packageManagementUnavailableMessage(n):pT(e),i=r!==void 0&&e.length>0;return g`
|
|
3151
3151
|
<section class="package-section" aria-label="已配置的 Pi 包">
|
|
3152
3152
|
<div class="package-toolbar">
|
|
3153
3153
|
<div>
|
|
@@ -3155,7 +3155,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3155
3155
|
<p>此列表来自 ${n} 上的 Pi 包管理器设置。</p>
|
|
3156
3156
|
</div>
|
|
3157
3157
|
<button class="secondary" title=${r??`更新所有用户范围的 Pi 包`} ?disabled=${this.isOperating||r!==void 0} @click=${()=>{this.updatePackage()}}>
|
|
3158
|
-
${
|
|
3158
|
+
${mT(this.operation,`update-all`)?`正在更新…`:`全部更新`}
|
|
3159
3159
|
</button>
|
|
3160
3160
|
</div>
|
|
3161
3161
|
${i?g`<div class="action-note">${r}</div>`:null}
|
|
@@ -3166,12 +3166,12 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3166
3166
|
<div class="package-list">
|
|
3167
3167
|
${e.map(e=>this.renderPackage(e))}
|
|
3168
3168
|
</div>
|
|
3169
|
-
`}renderPackage(e){let t
|
|
3169
|
+
`}renderPackage(e){let t=$w(this.packageTarget),n=this.packageManagementUnavailable,r=n?this.packageManagementUnavailableMessage(t):dT(e),i=n?this.packageManagementUnavailableMessage(t):`移除此 Pi 包`,a=mT(this.operation,`update`,e.source),o=mT(this.operation,`remove`,e.source);return g`
|
|
3170
3170
|
<article class=${`package-card${e.filtered?` filtered`:``}`}>
|
|
3171
3171
|
<div class="package-main">
|
|
3172
3172
|
<strong>${e.source}</strong>
|
|
3173
|
-
<small>${
|
|
3174
|
-
<small>安装路径:<code>${
|
|
3173
|
+
<small>${sT(e)} · ${cT(e)}</small>
|
|
3174
|
+
<small>安装路径:<code>${lT(e)}</code></small>
|
|
3175
3175
|
${r===void 0?null:g`<small class="action-note">${r}</small>`}
|
|
3176
3176
|
</div>
|
|
3177
3177
|
<div class="package-actions">
|
|
@@ -3179,7 +3179,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3179
3179
|
<button class="danger" title=${i} ?disabled=${this.isOperating||n} @click=${()=>{this.removePackage(e)}}>${o?`正在移除…`:`移除`}</button>
|
|
3180
3180
|
</div>
|
|
3181
3181
|
</article>
|
|
3182
|
-
`}updateInstallSource(e){this.installSource=e.target instanceof HTMLInputElement?e.target.value:``,this.validationMessage=``}async installPackage(e){e.preventDefault();let t=
|
|
3182
|
+
`}updateInstallSource(e){this.installSource=e.target instanceof HTMLInputElement?e.target.value:``,this.validationMessage=``}async installPackage(e){e.preventDefault();let t=oT(this.installSource);if(t!==void 0){this.validationMessage=t;return}let n=aT(this.installSource);try{await this.onInstallPackage?.(n),this.installSource=``,this.validationMessage=``}catch{}}async removePackage(e){try{await this.onRemovePackage?.(e.source,e.scope)}catch{}}async updatePackage(e){try{await this.onUpdatePackage?.(e)}catch{}}get packageTarget(){return this.targetMachine??Qw(void 0)}get packageManagementUnavailable(){return nT(this.managementSupport)}packageManagementUnavailableMessage(e){return this.managementSupport?.message??`${e} 不支持 Pi 包管理。`}get isOperating(){return this.operation!==void 0}static{this.styles=h`
|
|
3183
3183
|
:host { display: block; }
|
|
3184
3184
|
.package-toolbar { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 14px; }
|
|
3185
3185
|
.package-toolbar > div, .package-main { display: grid; gap: 6px; min-width: 0; }
|
|
@@ -3214,10 +3214,10 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3214
3214
|
.package-actions { justify-self: start; flex-wrap: wrap; }
|
|
3215
3215
|
.package-main strong, .package-main small { white-space: normal; }
|
|
3216
3216
|
}
|
|
3217
|
-
`}};V([x({attribute:!1})],
|
|
3217
|
+
`}};V([x({attribute:!1})],vT.prototype,`packagesResponse`,void 0),V([x({type:Boolean})],vT.prototype,`loading`,void 0),V([x({attribute:!1})],vT.prototype,`operation`,void 0),V([x({attribute:!1})],vT.prototype,`targetMachine`,void 0),V([x({attribute:!1})],vT.prototype,`managementSupport`,void 0),V([x()],vT.prototype,`error`,void 0),V([x()],vT.prototype,`operationMessage`,void 0),V([x({attribute:!1})],vT.prototype,`onReload`,void 0),V([x({attribute:!1})],vT.prototype,`onInstallPackage`,void 0),V([x({attribute:!1})],vT.prototype,`onRemovePackage`,void 0),V([x({attribute:!1})],vT.prototype,`onUpdatePackage`,void 0),V([S()],vT.prototype,`installSource`,void 0),V([S()],vT.prototype,`validationMessage`,void 0),vT=V([b(`settings-packages-panel`)],vT);function yT(e){return g`管理 <strong>${e}</strong> 上的 Pi 包。你可以安装、移除和更新所选机器上由 Pi 管理的包。Pi 包可提供扩展、技能、提示词模板、主题、上下文/系统提示文件以及 PI WEB 浏览器插件。`}var bT=class extends y{constructor(...e){super(...e),this.loading=!1,this.saving=!1,this.error=``,this.savedMessage=``,this.targetLabel=`本机(本地网关)`}render(){let e=this.pluginsResponse?.plugins??[],t=this.pluginsResponse!==void 0;return g`
|
|
3218
3218
|
<settings-panel-frame
|
|
3219
3219
|
heading="PI WEB 插件"
|
|
3220
|
-
.description=${
|
|
3220
|
+
.description=${xT(this.targetLabel)}
|
|
3221
3221
|
actionLabel="重新加载"
|
|
3222
3222
|
actionTitle=${`从 ${this.targetLabel} 重新加载 PI WEB 插件`}
|
|
3223
3223
|
.actionDisabled=${this.loading}
|
|
@@ -3235,7 +3235,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3235
3235
|
<article class=${`plugin-card${e.enabled?``:` disabled`}`}>
|
|
3236
3236
|
<div class="plugin-main">
|
|
3237
3237
|
<strong>${e.id}</strong>
|
|
3238
|
-
<small>${
|
|
3238
|
+
<small>${ST(e.source)} · ${CT(e.scope)}${e.machineSpecific?` · 机器专属`:``}</small>
|
|
3239
3239
|
<small>${n}</small>
|
|
3240
3240
|
</div>
|
|
3241
3241
|
<label class="toggle">
|
|
@@ -3263,10 +3263,10 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3263
3263
|
.plugin-card { grid-template-columns: minmax(0, 1fr); align-items: start; }
|
|
3264
3264
|
.toggle { justify-self: start; }
|
|
3265
3265
|
}
|
|
3266
|
-
`}};V([x({attribute:!1})],
|
|
3266
|
+
`}};V([x({attribute:!1})],bT.prototype,`pluginsResponse`,void 0),V([x({attribute:!1})],bT.prototype,`configResponse`,void 0),V([x({type:Boolean})],bT.prototype,`loading`,void 0),V([x({type:Boolean})],bT.prototype,`saving`,void 0),V([x()],bT.prototype,`error`,void 0),V([x()],bT.prototype,`savedMessage`,void 0),V([x()],bT.prototype,`targetLabel`,void 0),V([x({attribute:!1})],bT.prototype,`onReload`,void 0),V([x({attribute:!1})],bT.prototype,`onTogglePlugin`,void 0),bT=V([b(`settings-plugins-panel`)],bT);function xT(e){return g`启用或禁用 <strong>${e}</strong> 上发现的 PI WEB 浏览器插件。这与安装 Pi 包相互独立;请重新加载浏览器标签页以应用插件运行时更改。`}function ST(e){return e===`bundled`?`内置`:e===`local`?`本地`:e===`dev`?`开发`:e}function CT(e){switch(e){case`bundled`:return`内置范围`;case`local`:return`本地范围`;case`user`:return`用户范围`;case`project`:return`项目范围`}}var wT={capture:!0},TT=[{value:`auto`,label:`自动/默认`,description:`桌面环境按 Enter 发送;移动设备、粗略指针或窄屏环境按 Enter 换行。`},{value:`send`,label:`Enter 发送消息`,description:`Enter 发送聊天消息;支持时 Shift+Enter 插入新行。`},{value:`newline`,label:`Enter 插入新行`,description:`Enter 插入换行;支持时 Shift+Enter 发送聊天消息。`}];function ET(){return g`按操作编辑应用快捷键。输入 <code>mod+k</code> 或 <code>mod+g p</code> 这类快捷键,也可以从键盘录制、设为无或恢复默认。快捷键冲突时,自定义快捷键优先于默认值;同级按操作 ID 排序,较短快捷键会遮蔽相同前缀的较长序列。`}var DT=class extends y{constructor(...e){super(...e),this.actions=[],this.loading=!1,this.saving=!1,this.error=``,this.savedMessage=``,this.drafts={},this.localError=``,this.promptEnterPreference=mC(),this.recordingListenerActive=!1,this.onRecordKeyDown=e=>{let t=this.recording;if(t===void 0)return;if(e.preventDefault(),e.stopPropagation(),e.key===`Escape`){this.stopRecording();return}let n=Pf(e);if(n===void 0){this.localError=`请按字母、数字、标点、功能键或导航键。按 Esc 取消录制。`;return}if(t.tokens.length===0&&!Ff(n)){this.localError=`快捷键请以 Ctrl/⌘ 或 Alt 开始,以免捕获正常输入。`;return}let r=[...t.tokens,n];this.localError=``,this.drafts={[t.actionId]:r.join(` `)},this.recording={actionId:t.actionId,tokens:r},this.armRecordingTimer()}}willUpdate(e){e.has(`configResponse`)&&this.configResponse!==void 0&&(this.drafts={},this.localError=``,this.stopRecording())}disconnectedCallback(){this.stopRecording(),super.disconnectedCallback()}render(){let e=jT(this.actions),t=this.shortcutResolutions();return g`
|
|
3267
3267
|
<settings-panel-frame
|
|
3268
3268
|
heading="键盘快捷键"
|
|
3269
|
-
.description=${
|
|
3269
|
+
.description=${ET()}
|
|
3270
3270
|
actionLabel="重新加载"
|
|
3271
3271
|
.actionDisabled=${this.loading}
|
|
3272
3272
|
.notices=${this.panelNotices()}
|
|
@@ -3297,7 +3297,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3297
3297
|
<p>选择当前浏览器中 Enter 键的行为。支持时 Shift+Enter 执行相反操作;为避免误发送,会忽略触摸键盘的自动大写状态。</p>
|
|
3298
3298
|
</div>
|
|
3299
3299
|
<div class="prompt-enter-options" role="radiogroup" aria-label="聊天输入框中的 Enter 和 Shift Enter 行为">
|
|
3300
|
-
${
|
|
3300
|
+
${TT.map(e=>g`
|
|
3301
3301
|
<label class="prompt-enter-option">
|
|
3302
3302
|
<input
|
|
3303
3303
|
type="radio"
|
|
@@ -3314,8 +3314,8 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3314
3314
|
`)}
|
|
3315
3315
|
</div>
|
|
3316
3316
|
</section>
|
|
3317
|
-
`}updatePromptEnterPreference(e){this.promptEnterPreference=e,
|
|
3318
|
-
<article class=${
|
|
3317
|
+
`}updatePromptEnterPreference(e){this.promptEnterPreference=e,hC(e)}renderShortcutRow(e,t){let n=this.configResponse?.config.shortcuts,r=NT(e.id,n),i=IT(e,n),a=this.shortcutInputText(e),o=a.trim()===``?void 0:jf(a),s=o?.ok===!0?o.shortcut:FT(e,n),c=r!==void 0,l=this.drafts[e.id]!==void 0,u=l&&a.trim()!==``?`custom`:i,d=this.recordingHint(e.id),f=AT(t);return g`
|
|
3318
|
+
<article class=${OT(t)}>
|
|
3319
3319
|
<div class="shortcut-main">
|
|
3320
3320
|
<strong>${e.title}</strong>
|
|
3321
3321
|
${e.description!==void 0&&e.description!==``?g`<small>${e.description}</small>`:null}
|
|
@@ -3325,8 +3325,8 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3325
3325
|
<div class="shortcut-editor">
|
|
3326
3326
|
<div class="shortcut-status">
|
|
3327
3327
|
${s!==void 0&&s!==``?g`<kbd>${Nf(s)}</kbd>`:g`<span class="unassigned">${i===`disabled`?`已禁用`:`未分配`}</span>`}
|
|
3328
|
-
<small class=${u}>${
|
|
3329
|
-
${f===void 0?null:g`<small class=${
|
|
3328
|
+
<small class=${u}>${LT(u)}${l?` · 未保存`:``}</small>
|
|
3329
|
+
${f===void 0?null:g`<small class=${kT(t)}>${f}</small>`}
|
|
3330
3330
|
</div>
|
|
3331
3331
|
<label class="shortcut-input-label">
|
|
3332
3332
|
<span>快捷键</span>
|
|
@@ -3339,7 +3339,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3339
3339
|
autocapitalize="off"
|
|
3340
3340
|
spellcheck="false"
|
|
3341
3341
|
?disabled=${this.saving}
|
|
3342
|
-
@input=${t=>{this.updateDraft(e.id,
|
|
3342
|
+
@input=${t=>{this.updateDraft(e.id,RT(t))}}
|
|
3343
3343
|
>
|
|
3344
3344
|
</label>
|
|
3345
3345
|
${d===``?null:g`<small class="recording-hint">${d}</small>`}
|
|
@@ -3351,7 +3351,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3351
3351
|
</div>
|
|
3352
3352
|
</div>
|
|
3353
3353
|
</article>
|
|
3354
|
-
`}shortcutInputText(e){let t=this.drafts[e.id];if(t!==void 0)return t;let n=
|
|
3354
|
+
`}shortcutInputText(e){let t=this.drafts[e.id];if(t!==void 0)return t;let n=NT(e.id,this.configResponse?.config.shortcuts);return n===null?``:n??e.shortcut??``}recordingHint(e){let t=this.recording;return t?.actionId===e?t.tokens.length===0?`正在录制:请按 Ctrl/⌘ 或 Alt 加一个按键。按 Esc 取消。`:`正在录制:${Nf(t.tokens.join(` `))}。继续按键可添加序列,或等待录制完成。`:``}updateDraft(e,t){this.drafts={[e]:t},this.localError=``}async saveShortcut(e){this.stopRecording();let t=jf(this.shortcutInputText(e).trim());if(!t.ok){this.localError=t.message;return}this.localError=``,await this.saveShortcutPreference(e.id,t.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){let n={...this.configResponse?.config??{}},r=n.shortcuts??{},i=t===void 0?PT(r,e):{...r,[e]:t};Object.keys(i).length===0?delete n.shortcuts:n.shortcuts=i,await this.onSave?.(n)}shortcutResolutions(){return new Map(Af(this.actions,this.previewShortcutConfig(),{enabledOnly:!0}).map(e=>[e.action.id,e]))}previewShortcutConfig(){let e={...this.configResponse?.config.shortcuts??{}};for(let[t,n]of Object.entries(this.drafts)){let r=n.trim();if(r===``)continue;let i=jf(r);i.ok&&(e[t]=i.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(let 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()},Df)}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,wT),!0)}removeRecordingListener(){this.recordingListenerActive&&=(window.removeEventListener(`keydown`,this.onRecordKeyDown,wT),!1)}static{this.styles=h`
|
|
3355
3355
|
:host { display: block; }
|
|
3356
3356
|
h3, p { margin: 0; }
|
|
3357
3357
|
h3 { font-size: 13px; line-height: 1.3; }
|
|
@@ -3407,7 +3407,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3407
3407
|
.shortcut-row { grid-template-columns: minmax(0, 1fr); align-items: start; }
|
|
3408
3408
|
.shortcut-status, .shortcut-actions { justify-content: flex-start; }
|
|
3409
3409
|
}
|
|
3410
|
-
`}};V([x({attribute:!1})],
|
|
3410
|
+
`}};V([x({attribute:!1})],DT.prototype,`actions`,void 0),V([x({attribute:!1})],DT.prototype,`configResponse`,void 0),V([x({type:Boolean})],DT.prototype,`loading`,void 0),V([x({type:Boolean})],DT.prototype,`saving`,void 0),V([x()],DT.prototype,`error`,void 0),V([x()],DT.prototype,`savedMessage`,void 0),V([x({attribute:!1})],DT.prototype,`onReload`,void 0),V([x({attribute:!1})],DT.prototype,`onSave`,void 0),V([S()],DT.prototype,`drafts`,void 0),V([S()],DT.prototype,`localError`,void 0),V([S()],DT.prototype,`promptEnterPreference`,void 0),V([S()],DT.prototype,`recording`,void 0),DT=V([b(`settings-shortcuts-panel`)],DT);function OT(e){return e?.active===!1?`shortcut-row shadowed`:e?.active===!0&&e.shadows.length>0?`shortcut-row shadowing`:`shortcut-row`}function kT(e){return e?.active===!1?`conflict shadowed`:`conflict shadowing`}function AT(e){if(e===void 0)return;if(!e.active)return`被“${e.shadowedBy?.action.title??`另一项操作`}”覆盖`;let t=e.shadows.length;if(t===0)return;let n=e.shadows.slice(0,2).map(e=>e.action.title).join(`, `),r=t>2?`,另有 ${String(t-2)} 项`:``;return`覆盖 ${String(t)} 项操作:${n}${r}`}function jT(e){let t=new Map;for(let n of[...e].sort(MT)){let e=n.group??`其他`;t.set(e,[...t.get(e)??[],n])}return[...t.entries()].map(([e,t])=>({name:e,actions:t}))}function MT(e,t){return(e.group??`其他`).localeCompare(t.group??`其他`)||e.title.localeCompare(t.title)}function NT(e,t){if(!(t===void 0||!Object.hasOwn(t,e)))return t[e]}function PT(e,t){return Object.fromEntries(Object.entries(e).filter(([e])=>e!==t))}function FT(e,t){let n=NT(e.id,t);if(n!==null)return n??e.shortcut}function IT(e,t){let n=NT(e.id,t);return n===null?`disabled`:n===void 0?e.shortcut===void 0||e.shortcut===``?`unassigned`:`default`:`custom`}function LT(e){switch(e){case`default`:return`默认`;case`custom`:return`配置覆盖`;case`disabled`:return`配置禁用`;case`unassigned`:return`无默认值`}}function RT(e){return e.target instanceof HTMLInputElement?e.target.value:``}async function zT(e){let[t,n]=await Promise.allSettled([e.loadConfig(),e.loadPlugins()]),r={error:``},i=[];return t.status===`fulfilled`?r.config=t.value:i.push(`配置:${VT(t.reason)}`),n.status===`fulfilled`?r.plugins=n.value:i.push(`PI WEB 插件:${VT(n.reason)}`),i.length>0&&(r.error=`加载设置失败:${i.join(`;`)}`),r}async function BT(e,t,n){if(nT(n))return{error:n.message??`${$w(e)} 不支持 Pi 包管理。`,skipped:!0};try{return{packagesResponse:await t(e.id),error:``}}catch(t){return{error:`从 ${$w(e)} 加载 Pi 包失败:${gT(VT(t),e)}`}}}function VT(e){return e instanceof Error?e.message:String(e)}function HT(e,t){return{...e,config:UT(e.config,t.config),effectiveConfig:UT(e.effectiveConfig,t.effectiveConfig)}}function UT(e,t){return{...e,...t.pathAccess===void 0?{}:{pathAccess:t.pathAccess},...t.uploads===void 0?{}:{uploads:t.uploads},...t.maxUploadBytes===void 0?{}:{maxUploadBytes:t.maxUploadBytes}}}function WT(e){return e===void 0?{id:`local`,name:`本机`,kind:`local`}:{id:e.id,name:e.name,kind:e.kind}}function Y(e){return e.kind===`local`?`${e.name}(本地网关)`:`${e.name}(远程机器)`}function GT(e,t){return e.kind===`local`||t?.ok===!0?{state:`supported`}:{state:`unknown`}}function KT(e,t){return e.kind===`local`||t?.ok===!0?{state:`supported`}:{state:`unknown`,message:`无法确认 ${e.name} 是否支持 Pi 兼容代理配置档案。更改配置档案前请重新加载机器状态。`}}function qT(e){return`${e.state}:${e.message??``}`}function JT(e){return e?.state===`unsupported`}function YT(e){return e?.state===`supported`}function XT(e){return`${e.name} 不支持所选机器设置。请更新并重启该机器上的 PI WEB,然后重试。`}function ZT(e,t){let n=e.trim();return t.kind===`remote`?QT(n)?XT(t):n===`Remote machine timeout`?`联系 ${t.name} 获取所选机器设置时超时。操作可能仍在远端运行;请重新加载后再重试。`:n===`Remote machine unavailable`?`无法连接 ${t.name} 以获取所选机器设置。请检查机器连接后重试。`:n:n}function QT(e){return e===`Not Found`||/route\s+(GET|PUT):?\/api\/(config|plugins)\b.*not found/iu.test(e)||/cannot\s+(GET|PUT)\s+.*\/api\/(config|plugins)\b/iu.test(e)}function $T(e,t,n){let r=e.plugins??{},i=r[t]??{};return{plugins:{...r,[t]:{...i,enabled:n}}}}function eE(e,t){return{...e,config:tE(e.config,t.config),effectiveConfig:tE(e.effectiveConfig,t.effectiveConfig)}}function tE(e,t){return t.plugins===void 0?e:{...e,plugins:t.plugins}}var X=class extends y{constructor(...e){super(...e),this.section=`general`,this.actions=[],this.loading=!0,this.accessLoading=!0,this.sessiondLoading=!0,this.pluginLoading=!0,this.packageLoading=!0,this.saving=!1,this.error=``,this.accessError=``,this.sessiondError=``,this.pluginError=``,this.packageError=``,this.savedMessage=``,this.packageMessage=``,this.loadRequestSeq=0,this.accessLoadRequestSeq=0,this.sessiondLoadRequestSeq=0,this.pluginLoadRequestSeq=0,this.packageLoadRequestSeq=0,this.packageMutationSeq=0}connectedCallback(){super.connectedCallback(),this.loadConfig(),this.loadAccessConfigForTarget(),this.reloadSessiondState(),this.loadPluginsForTarget(),this.loadPackagesForTarget()}disconnectedCallback(){this.savedMessageTimer!==void 0&&window.clearTimeout(this.savedMessageTimer),this.savedMessageTimer=void 0,super.disconnectedCallback()}updated(e){let t=this.settingsTarget();if(e.has(`machine`)&&WT(e.get(`machine`)).id!==t.id){this.resetAccessStateForTargetChange(),this.isConnected&&this.loadAccessConfigForTarget(t),this.resetSessiondStateForTargetChange(),this.isConnected&&this.loadSessiondConfigForTarget(t),this.resetPluginStateForTargetChange(),this.isConnected&&this.loadPluginsForTarget(t),this.resetPackageStateForTargetChange(),this.isConnected&&this.loadPackagesForTarget(t);return}e.has(`machineRuntime`)&&(this.selectedMachineSettingsSupportNeedsReload(e.get(`machineRuntime`),t)&&(this.resetAccessStateForTargetChange(),this.isConnected&&this.loadAccessConfigForTarget(t),this.resetSessiondStateForTargetChange(),this.isConnected&&this.loadSessiondConfigForTarget(t),this.resetPluginStateForTargetChange(),this.isConnected&&this.loadPluginsForTarget(t)),this.packageManagementSupportNeedsReload(e.get(`machineRuntime`),t)&&(this.resetPackageStateForTargetChange(),this.isConnected&&this.loadPackagesForTarget(t)))}render(){return g`
|
|
3411
3411
|
<div class="backdrop" @mousedown=${()=>this.onClose?.()}>
|
|
3412
3412
|
<section class="settings-shell" role="dialog" aria-modal="true" aria-label="PI WEB 设置" @mousedown=${e=>{e.stopPropagation()}} @keydown=${e=>{this.handleKeyDown(e)}}>
|
|
3413
3413
|
<header class="settings-header">
|
|
@@ -3502,7 +3502,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3502
3502
|
<strong>${t}</strong>
|
|
3503
3503
|
<small>${n}</small>
|
|
3504
3504
|
</button>
|
|
3505
|
-
`}navigate(e){this.onNavigate?.(e)}async loadConfig(){let e=++this.loadRequestSeq;this.loading=!0,this.error=``;try{let t=await
|
|
3505
|
+
`}navigate(e){this.onNavigate?.(e)}async loadConfig(){let e=++this.loadRequestSeq;this.loading=!0,this.error=``;try{let t=await zT({loadConfig:()=>Xa.config(),loadPlugins:()=>Qa.plugins()});if(!this.isCurrentLoad(e))return;t.config!==void 0&&(this.configResponse=t.config),t.plugins!==void 0&&(this.pluginsResponse=t.plugins),this.error=t.error}finally{this.isCurrentLoad(e)&&(this.loading=!1)}}async loadAccessConfigForTarget(e=this.settingsTarget()){let t=++this.accessLoadRequestSeq,n=this.selectedMachineSettingsSupport(e);if(JT(n)){this.accessConfigResponse=void 0,this.accessLoading=!1,this.accessError=n.message??`${Y(e)} 不支持所选机器设置。`;return}this.accessLoading=!0,this.accessError=``;try{let n=await Xa.config(e.id);if(!this.isCurrentAccessLoad(t,e))return;this.accessConfigResponse=n}catch(n){this.isCurrentAccessLoad(t,e)&&(this.accessError=`从 ${Y(e)} 加载文件访问/上传配置失败:${ZT(nE(n),e)}`)}finally{this.isCurrentAccessLoad(t,e)&&(this.accessLoading=!1)}}async reloadSessiondState(e=this.settingsTarget()){await Promise.all([this.loadSessiondConfigForTarget(e),this.onRefreshMachineRuntime?.(e.id)])}async loadSessiondConfigForTarget(e=this.settingsTarget()){let t=++this.sessiondLoadRequestSeq,n=this.selectedMachineSettingsSupport(e);if(JT(n)){this.sessiondConfigResponse=void 0,this.sessiondLoading=!1,this.sessiondError=n.message??`${Y(e)} 不支持所选机器设置。`;return}this.sessiondLoading=!0,this.sessiondError=``;try{let n=await Xa.config(e.id);if(!this.isCurrentSessiondLoad(t,e))return;this.sessiondConfigResponse=n}catch(n){this.isCurrentSessiondLoad(t,e)&&(this.sessiondError=`从 ${Y(e)} 加载会话守护进程配置失败:${ZT(nE(n),e)}`)}finally{this.isCurrentSessiondLoad(t,e)&&(this.sessiondLoading=!1)}}async loadPluginsForTarget(e=this.settingsTarget()){let t=++this.pluginLoadRequestSeq,n=this.selectedMachineSettingsSupport(e);if(JT(n)){this.selectedPluginConfigResponse=void 0,this.selectedPluginsResponse=void 0,this.pluginLoading=!1,this.pluginError=n.message??`${Y(e)} 不支持所选机器设置。`;return}this.pluginLoading=!0,this.pluginError=``;try{let[n,r]=await Promise.allSettled([Xa.config(e.id),Qa.plugins(e.id)]);if(!this.isCurrentPluginLoad(t,e))return;let i=[];n.status===`fulfilled`?this.selectedPluginConfigResponse=n.value:i.push(`配置:${ZT(nE(n.reason),e)}`),r.status===`fulfilled`?this.selectedPluginsResponse=r.value:i.push(`PI WEB 插件:${ZT(nE(r.reason),e)}`),this.pluginError=i.length===0?``:`从 ${Y(e)} 加载 PI WEB 插件设置失败:${i.join(`;`)}`}finally{this.isCurrentPluginLoad(t,e)&&(this.pluginLoading=!1)}}async loadPackagesForTarget(e=this.packageTarget()){let t=++this.packageLoadRequestSeq;this.packageLoading=!0,this.packageError=``,this.packageMessage=``;try{let n=await BT(e,e=>eo.packages(e),this.packageManagementSupport(e));if(!this.isCurrentPackageLoad(t,e))return;this.packagesResponse=n.packagesResponse,this.packageError=n.error}finally{this.isCurrentPackageLoad(t,e)&&(this.packageLoading=!1)}}async togglePlugin(e,t){if(this.saving)return;let n=this.settingsTarget(),r=this.selectedMachineSettingsSupport(n);if(JT(r)){this.pluginError=r.message??`${Y(n)} 不支持所选机器设置。`;return}if(this.selectedPluginConfigResponse===void 0){this.pluginError=`尚未加载 ${Y(n)} 的插件配置。更改插件启用状态前请重新加载。`;return}let i=$T(this.selectedPluginConfigResponse.config,e,t);this.saving=!0,this.pluginError=``,this.savedMessage=``;try{let e=await Xa.saveConfig(i,n.id);if(!this.isCurrentSettingsTarget(n))return;this.selectedPluginConfigResponse=e,n.kind===`local`&&this.configResponse!==void 0&&(this.configResponse=eE(this.configResponse,e),this.onConfigSaved?.(this.configResponse.effectiveConfig));let t=await this.refreshPluginsForTarget(n);if(!this.isCurrentSettingsTarget(n))return;t!==void 0&&(this.pluginError=t),this.showSavedMessage()}catch(e){this.isCurrentSettingsTarget(n)&&(this.pluginError=`在 ${Y(n)} 上保存 PI WEB 插件配置失败:${ZT(nE(e),n)}`)}finally{this.saving=!1}}async saveConfig(e){if(!this.saving){this.saving=!0,this.error=``,this.savedMessage=``;try{let t=await Xa.saveConfig(e);this.configResponse=t,this.onConfigSaved?.(t.effectiveConfig),this.showSavedMessage()}catch(e){this.error=`保存配置失败:${nE(e)}`}finally{this.saving=!1}}}async saveMachineAccessConfig(e){if(this.saving)return;let t=this.settingsTarget(),n=this.selectedMachineSettingsSupport(t);if(JT(n)){this.accessError=n.message??`${Y(t)} 不支持所选机器设置。`;return}this.saving=!0,this.accessError=``,this.savedMessage=``;try{let n=await Xa.saveConfig(e,t.id);if(!this.isCurrentSettingsTarget(t))return;this.accessConfigResponse=n,t.kind===`local`&&this.configResponse!==void 0&&(this.configResponse=HT(this.configResponse,n),this.onConfigSaved?.(this.configResponse.effectiveConfig)),this.showSavedMessage()}catch(e){this.isCurrentSettingsTarget(t)&&(this.accessError=`在 ${Y(t)} 上保存文件访问/上传配置失败:${ZT(nE(e),t)}`)}finally{this.saving=!1}}async saveSessiondConfig(e){if(this.saving)return;let t=this.settingsTarget(),n=this.selectedMachineSettingsSupport(t);if(JT(n)){this.sessiondError=n.message??`${Y(t)} 不支持所选机器设置。`;return}if(e.agent!==void 0){let e=this.agentProfileSettingsSupport(t);if(!YT(e)){this.sessiondError=e.message??`${Y(t)} 不支持 Pi 兼容代理配置档案设置。`;return}}this.saving=!0,this.sessiondError=``,this.savedMessage=``;try{let n=await Xa.saveConfig(e,t.id);if(!this.isCurrentSettingsTarget(t))return;this.sessiondConfigResponse=n,t.kind===`local`&&this.configResponse!==void 0&&(this.configResponse=Gw(this.configResponse,n)),this.showSavedMessage()}catch(e){this.isCurrentSettingsTarget(t)&&(this.sessiondError=`在 ${Y(t)} 上保存会话守护进程配置失败:${ZT(nE(e),t)}`)}finally{this.saving=!1}}async installPiPackage(e){let t=this.packageTarget();await this.runPiPackageMutation({kind:`install`,source:e},`安装 Pi 包`,t,()=>eo.install(e,t.id))}async removePiPackage(e,t){let n=this.packageTarget();await this.runPiPackageMutation({kind:`remove`,source:e},`移除 Pi 包`,n,()=>eo.remove(e,t,n.id))}async updatePiPackage(e){let t=this.packageTarget();await this.runPiPackageMutation(e===void 0?{kind:`update-all`}:{kind:`update`,source:e},`更新 Pi 包`,t,()=>eo.update(e,t.id))}async runPiPackageMutation(e,t,n,r){let i=this.packageManagementSupport(n);if(nT(i))throw this.packageError=i.message??`${$w(n)} 不支持 Pi 包管理。`,Error(this.packageError);if(this.saving)throw Error(`已有设置操作正在运行。`);let a=++this.packageMutationSeq;this.packageLoadRequestSeq+=1,this.packageLoading=!1,this.saving=!0,this.packageOperation=e,this.packageError=``,this.packageMessage=``;try{let e=await r();if(!this.isCurrentPackageMutation(a,n))return;this.packagesResponse={packages:e.packages};let t=iT(n)?await this.refreshGatewayPlugins():void 0;if(!this.isCurrentPackageMutation(a,n))return;t!==void 0&&(this.packageError=t),this.packageMessage=hT(e.action,n)}catch(e){throw this.isCurrentPackageMutation(a,n)&&(this.packageError=`在 ${$w(n)} 上${t}失败:${gT(nE(e),n)}`),e}finally{this.packageMutationSeq===a&&(this.packageOperation=void 0,this.saving=!1)}}async refreshGatewayPlugins(){try{this.pluginsResponse=await Qa.plugins();return}catch(e){return`刷新网关 PI WEB 插件失败:${nE(e)}`}}async refreshPluginsForTarget(e){try{let t=await Qa.plugins(e.id);this.isCurrentSettingsTarget(e)&&(this.selectedPluginsResponse=t);return}catch(t){return`配置已保存,但从 ${Y(e)} 刷新 PI WEB 插件失败:${ZT(nE(t),e)}`}}settingsTarget(){return WT(this.machine)}packageTarget(){return this.settingsTarget()}selectedMachineSettingsSupport(e=this.settingsTarget()){return GT(e,this.machineRuntime)}agentProfileSettingsSupport(e=this.settingsTarget()){return KT(e,this.machineRuntime)}selectedMachineSettingsSupportNeedsReload(e,t){let n=GT(t,e),r=this.selectedMachineSettingsSupport(t);return qT(n)!==qT(r)}packageManagementSupport(e=this.packageTarget()){return eT(e,this.machineRuntime)}packageManagementSupportNeedsReload(e,t){let n=eT(t,e),r=this.packageManagementSupport(t);return tT(n)===tT(r)?!1:n.state===`unsupported`||r.state===`unsupported`}isCurrentLoad(e){return e===this.loadRequestSeq}isCurrentAccessLoad(e,t){return e===this.accessLoadRequestSeq&&this.isCurrentSettingsTarget(t)}isCurrentSessiondLoad(e,t){return e===this.sessiondLoadRequestSeq&&this.isCurrentSettingsTarget(t)}isCurrentPluginLoad(e,t){return e===this.pluginLoadRequestSeq&&this.isCurrentSettingsTarget(t)}isCurrentPackageLoad(e,t){return e===this.packageLoadRequestSeq&&this.isCurrentPackageTarget(t)}isCurrentPackageMutation(e,t){return e===this.packageMutationSeq&&this.isCurrentPackageTarget(t)}isCurrentPackageTarget(e){return this.packageTarget().id===e.id}isCurrentSettingsTarget(e){return this.settingsTarget().id===e.id}resetAccessStateForTargetChange(){this.accessLoadRequestSeq+=1,this.accessLoading=!1,this.accessError=``,this.accessConfigResponse=void 0,this.savedMessage=``}resetSessiondStateForTargetChange(){this.sessiondLoadRequestSeq+=1,this.sessiondLoading=!1,this.sessiondError=``,this.sessiondConfigResponse=void 0,this.savedMessage=``}resetPluginStateForTargetChange(){this.pluginLoadRequestSeq+=1,this.pluginLoading=!1,this.pluginError=``,this.selectedPluginConfigResponse=void 0,this.selectedPluginsResponse=void 0,this.savedMessage=``}resetPackageStateForTargetChange(){let e=this.packageOperation!==void 0;this.packageLoadRequestSeq+=1,this.packageMutationSeq+=1,this.packageLoading=!1,this.packageOperation=void 0,this.packageMessage=``,this.packageError=``,this.packagesResponse=void 0,e&&(this.saving=!1)}showSavedMessage(){this.savedMessage=`配置已保存。`,this.savedMessageTimer!==void 0&&window.clearTimeout(this.savedMessageTimer),this.savedMessageTimer=window.setTimeout(()=>{this.savedMessage===`配置已保存。`&&(this.savedMessage=``),this.savedMessageTimer=void 0},3e3)}handleKeyDown(e){e.key===`Escape`&&(e.preventDefault(),e.stopPropagation(),this.onClose?.())}static{this.styles=h`
|
|
3506
3506
|
:host { position: fixed; inset: 0; z-index: 30; color: var(--pi-text); font: 14px system-ui, sans-serif; }
|
|
3507
3507
|
.backdrop { box-sizing: border-box; width: 100%; height: 100dvh; display: grid; place-items: center; padding: max(20px, env(safe-area-inset-top)) max(20px, env(safe-area-inset-right)) max(20px, env(safe-area-inset-bottom)) max(20px, env(safe-area-inset-left)); background: var(--pi-overlay); overflow: hidden; }
|
|
3508
3508
|
.settings-shell { width: min(980px, 100%); max-height: min(760px, 100%); min-height: min(620px, 100%); display: grid; grid-template-rows: auto minmax(0, 1fr); border: 1px solid var(--pi-border); border-radius: 14px; background: var(--pi-bg); box-shadow: 0 20px 60px var(--pi-shadow-strong); overflow: hidden; }
|
|
@@ -3529,7 +3529,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3529
3529
|
.settings-nav button { flex: 0 0 auto; width: auto; min-width: 128px; margin: 0; }
|
|
3530
3530
|
.settings-content { padding: 14px 12px calc(18px + env(safe-area-inset-bottom)); }
|
|
3531
3531
|
}
|
|
3532
|
-
`}};V([x({attribute:!1})],X.prototype,`section`,void 0),V([x({attribute:!1})],X.prototype,`actions`,void 0),V([x({attribute:!1})],X.prototype,`machine`,void 0),V([x({attribute:!1})],X.prototype,`machineRuntime`,void 0),V([x({attribute:!1})],X.prototype,`onNavigate`,void 0),V([x({attribute:!1})],X.prototype,`onClose`,void 0),V([x({attribute:!1})],X.prototype,`onConfigSaved`,void 0),V([x({attribute:!1})],X.prototype,`onRefreshMachineRuntime`,void 0),V([S()],X.prototype,`configResponse`,void 0),V([S()],X.prototype,`accessConfigResponse`,void 0),V([S()],X.prototype,`sessiondConfigResponse`,void 0),V([S()],X.prototype,`pluginsResponse`,void 0),V([S()],X.prototype,`selectedPluginConfigResponse`,void 0),V([S()],X.prototype,`selectedPluginsResponse`,void 0),V([S()],X.prototype,`packagesResponse`,void 0),V([S()],X.prototype,`loading`,void 0),V([S()],X.prototype,`accessLoading`,void 0),V([S()],X.prototype,`sessiondLoading`,void 0),V([S()],X.prototype,`pluginLoading`,void 0),V([S()],X.prototype,`packageLoading`,void 0),V([S()],X.prototype,`saving`,void 0),V([S()],X.prototype,`packageOperation`,void 0),V([S()],X.prototype,`error`,void 0),V([S()],X.prototype,`accessError`,void 0),V([S()],X.prototype,`sessiondError`,void 0),V([S()],X.prototype,`pluginError`,void 0),V([S()],X.prototype,`packageError`,void 0),V([S()],X.prototype,`savedMessage`,void 0),V([S()],X.prototype,`packageMessage`,void 0),X=V([b(`settings-dialog`)],X);function
|
|
3532
|
+
`}};V([x({attribute:!1})],X.prototype,`section`,void 0),V([x({attribute:!1})],X.prototype,`actions`,void 0),V([x({attribute:!1})],X.prototype,`machine`,void 0),V([x({attribute:!1})],X.prototype,`machineRuntime`,void 0),V([x({attribute:!1})],X.prototype,`onNavigate`,void 0),V([x({attribute:!1})],X.prototype,`onClose`,void 0),V([x({attribute:!1})],X.prototype,`onConfigSaved`,void 0),V([x({attribute:!1})],X.prototype,`onRefreshMachineRuntime`,void 0),V([S()],X.prototype,`configResponse`,void 0),V([S()],X.prototype,`accessConfigResponse`,void 0),V([S()],X.prototype,`sessiondConfigResponse`,void 0),V([S()],X.prototype,`pluginsResponse`,void 0),V([S()],X.prototype,`selectedPluginConfigResponse`,void 0),V([S()],X.prototype,`selectedPluginsResponse`,void 0),V([S()],X.prototype,`packagesResponse`,void 0),V([S()],X.prototype,`loading`,void 0),V([S()],X.prototype,`accessLoading`,void 0),V([S()],X.prototype,`sessiondLoading`,void 0),V([S()],X.prototype,`pluginLoading`,void 0),V([S()],X.prototype,`packageLoading`,void 0),V([S()],X.prototype,`saving`,void 0),V([S()],X.prototype,`packageOperation`,void 0),V([S()],X.prototype,`error`,void 0),V([S()],X.prototype,`accessError`,void 0),V([S()],X.prototype,`sessiondError`,void 0),V([S()],X.prototype,`pluginError`,void 0),V([S()],X.prototype,`packageError`,void 0),V([S()],X.prototype,`savedMessage`,void 0),V([S()],X.prototype,`packageMessage`,void 0),X=V([b(`settings-dialog`)],X);function nE(e){return e instanceof Error?e.message:String(e)}var rE=h`
|
|
3533
3533
|
: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; }
|
|
3534
3534
|
header { flex: 0 0 auto; min-width: 0; border-bottom: 1px solid var(--pi-border); }
|
|
3535
3535
|
.workspace-header-scroll-frame { position: relative; min-width: 0; background: var(--pi-bg); }
|
|
@@ -3588,7 +3588,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3588
3588
|
.image-preview img { display: block; max-width: 100%; max-height: 100%; object-fit: contain; border: 1px solid var(--pi-border-muted); border-radius: 8px; background-color: var(--pi-surface); background-image: linear-gradient(45deg, color-mix(in srgb, var(--pi-border-muted) 45%, transparent) 25%, transparent 25%), linear-gradient(-45deg, color-mix(in srgb, var(--pi-border-muted) 45%, transparent) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, color-mix(in srgb, var(--pi-border-muted) 45%, transparent) 75%), linear-gradient(-45deg, transparent 75%, color-mix(in srgb, var(--pi-border-muted) 45%, transparent) 75%); background-position: 0 0, 0 8px, 8px -8px, -8px 0; background-size: 16px 16px; box-shadow: 0 8px 24px var(--pi-shadow-soft); }
|
|
3589
3589
|
pre { margin: 0; padding: 10px; overflow: auto; font: 12px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; line-height: 1.45; white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
3590
3590
|
p { margin: 10px; }
|
|
3591
|
-
`,
|
|
3591
|
+
`,iE=class extends y{constructor(...e){super(...e),this.tool=`core:workspace.files`,this.panels=[],this.hideToolTabs=!1,this.onSelectTool=()=>void 0,this.workspaceHeaderCanScrollLeft=!1,this.workspaceHeaderCanScrollRight=!1,this.onWorkspaceHeaderScroll=()=>{this.updateWorkspaceHeaderScrollState()}}firstUpdated(){this.observeWorkspaceHeaderStrip(),this.updateWorkspaceHeaderScrollState()}updated(){this.observeWorkspaceHeaderStrip(),this.updateWorkspaceHeaderScrollState()}disconnectedCallback(){this.workspaceHeaderResizeObserver?.disconnect(),this.workspaceHeaderResizeObserver=void 0,this.observedWorkspaceHeaderStrip=void 0,super.disconnectedCallback()}render(){if(this.workspace===void 0)return this.renderEmptyState(this.emptyState??{title:`选择工作区`,body:`选择工作区来查看文件、Git 或终端。`});let e=this.panelContext;if(e===void 0)return this.renderEmptyState({title:`工作区工具不可用`,body:`请尝试重新选择工作区。`});let t=this.panels,n=t.find(e=>e.id===this.tool)??t[0];return g`
|
|
3592
3592
|
${this.hideToolTabs?null:g`
|
|
3593
3593
|
<header>
|
|
3594
3594
|
<div class=${this.workspaceHeaderFrameClass()}>
|
|
@@ -3618,32 +3618,32 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3618
3618
|
<h2>${e.title}</h2>
|
|
3619
3619
|
${e.body===void 0?null:g`<p>${e.body}</p>`}
|
|
3620
3620
|
</section>
|
|
3621
|
-
`}workspaceHeaderFrameClass(){return`workspace-header-scroll-frame${this.workspaceHeaderCanScrollLeft?` can-scroll-left`:``}${this.workspaceHeaderCanScrollRight?` can-scroll-right`:``}`}observeWorkspaceHeaderStrip(){let 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(){let e=this.workspaceHeaderStripElement(),t=e===void 0?0:Math.max(0,e.scrollWidth-e.clientWidth),n=e!==void 0&&e.scrollLeft>1,r=e!==void 0&&t-e.scrollLeft>1;this.workspaceHeaderCanScrollLeft!==n&&(this.workspaceHeaderCanScrollLeft=n),this.workspaceHeaderCanScrollRight!==r&&(this.workspaceHeaderCanScrollRight=r)}workspaceHeaderStripElement(){let e=this.workspaceHeaderStrip;return e instanceof HTMLElement?e:void 0}static{this.styles=
|
|
3621
|
+
`}workspaceHeaderFrameClass(){return`workspace-header-scroll-frame${this.workspaceHeaderCanScrollLeft?` can-scroll-left`:``}${this.workspaceHeaderCanScrollRight?` can-scroll-right`:``}`}observeWorkspaceHeaderStrip(){let 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(){let e=this.workspaceHeaderStripElement(),t=e===void 0?0:Math.max(0,e.scrollWidth-e.clientWidth),n=e!==void 0&&e.scrollLeft>1,r=e!==void 0&&t-e.scrollLeft>1;this.workspaceHeaderCanScrollLeft!==n&&(this.workspaceHeaderCanScrollLeft=n),this.workspaceHeaderCanScrollRight!==r&&(this.workspaceHeaderCanScrollRight=r)}workspaceHeaderStripElement(){let e=this.workspaceHeaderStrip;return e instanceof HTMLElement?e:void 0}static{this.styles=rE}};V([x({attribute:!1})],iE.prototype,`workspace`,void 0),V([x({attribute:!1})],iE.prototype,`panelContext`,void 0),V([x({attribute:!1})],iE.prototype,`emptyState`,void 0),V([x()],iE.prototype,`tool`,void 0),V([x({attribute:!1})],iE.prototype,`panels`,void 0),V([x({type:Boolean})],iE.prototype,`hideToolTabs`,void 0),V([x({attribute:!1})],iE.prototype,`onSelectTool`,void 0),V([C(`.workspace-header-strip`)],iE.prototype,`workspaceHeaderStrip`,void 0),V([S()],iE.prototype,`workspaceHeaderCanScrollLeft`,void 0),V([S()],iE.prototype,`workspaceHeaderCanScrollRight`,void 0),iE=V([b(`workspace-panel`)],iE);var aE=class extends y{constructor(...e){super(...e),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(){let e=oE(this.machines),t=sE(this.machine),n=lE(this.project),r=dE(this.workspace),i=pE(this.session);return g`
|
|
3622
3622
|
<nav class=${this.contextBarClass()} aria-label="当前位置">
|
|
3623
3623
|
<span class="context-bar-label">位置</span>
|
|
3624
3624
|
<ol class="context-items" @scroll=${this.onContextScroll}>
|
|
3625
3625
|
${e?g`
|
|
3626
3626
|
<li class="context-item">
|
|
3627
|
-
<button type="button" class=${this.machine===void 0?`context-chip empty`:`context-chip`} title=${
|
|
3627
|
+
<button type="button" class=${this.machine===void 0?`context-chip empty`:`context-chip`} title=${cE(this.machine)} aria-label=${`机器:${t}。打开机器选择。`} @click=${()=>{this.onOpenSection?.(`machines`)}}>
|
|
3628
3628
|
<span class="context-kind">机器</span>
|
|
3629
3629
|
<span class="context-value">${t}</span>
|
|
3630
3630
|
</button>
|
|
3631
3631
|
</li>
|
|
3632
3632
|
`:null}
|
|
3633
3633
|
<li class="context-item">
|
|
3634
|
-
<button type="button" class=${this.project===void 0?`context-chip empty`:`context-chip`} title=${
|
|
3634
|
+
<button type="button" class=${this.project===void 0?`context-chip empty`:`context-chip`} title=${uE(this.project)} aria-label=${`项目:${n}。打开项目选择。`} @click=${()=>{this.onOpenSection?.(`projects`)}}>
|
|
3635
3635
|
<span class="context-kind">项目</span>
|
|
3636
3636
|
<span class="context-value">${n}</span>
|
|
3637
3637
|
</button>
|
|
3638
3638
|
</li>
|
|
3639
3639
|
<li class="context-item">
|
|
3640
|
-
<button type="button" class=${this.workspace===void 0?`context-chip empty`:`context-chip`} title=${
|
|
3640
|
+
<button type="button" class=${this.workspace===void 0?`context-chip empty`:`context-chip`} title=${fE(this.workspace)} aria-label=${`工作区:${r}。打开工作区选择。`} @click=${()=>{this.onOpenSection?.(`workspaces`)}}>
|
|
3641
3641
|
<span class="context-kind">工作区</span>
|
|
3642
3642
|
<span class="context-value">${r}</span>
|
|
3643
3643
|
</button>
|
|
3644
3644
|
</li>
|
|
3645
3645
|
<li class="context-item">
|
|
3646
|
-
<button type="button" class=${this.session===void 0?`context-chip empty`:`context-chip`} title=${
|
|
3646
|
+
<button type="button" class=${this.session===void 0?`context-chip empty`:`context-chip`} title=${mE(this.session)} aria-label=${`会话:${i}。打开会话选择。`} @click=${()=>{this.onOpenSection?.(`sessions`)}}>
|
|
3647
3647
|
<span class="context-kind">会话</span>
|
|
3648
3648
|
<span class="context-value">${i}</span>
|
|
3649
3649
|
</button>
|
|
@@ -3683,7 +3683,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3683
3683
|
.context-kind { display: none; }
|
|
3684
3684
|
.context-value { min-width: 0; overflow: visible; text-overflow: clip; white-space: nowrap; }
|
|
3685
3685
|
button { cursor: pointer; }
|
|
3686
|
-
`}};V([x({attribute:!1})],
|
|
3686
|
+
`}};V([x({attribute:!1})],aE.prototype,`machines`,void 0),V([x({attribute:!1})],aE.prototype,`machine`,void 0),V([x({attribute:!1})],aE.prototype,`project`,void 0),V([x({attribute:!1})],aE.prototype,`workspace`,void 0),V([x({attribute:!1})],aE.prototype,`session`,void 0),V([x({attribute:!1})],aE.prototype,`refreshControl`,void 0),V([x({attribute:!1})],aE.prototype,`onOpenSection`,void 0),V([x({attribute:!1})],aE.prototype,`onShowActions`,void 0),V([C(`.context-items`)],aE.prototype,`contextItems`,void 0),V([S()],aE.prototype,`canScrollLeft`,void 0),V([S()],aE.prototype,`canScrollRight`,void 0),aE=V([b(`app-context-bar`)],aE);function oE(e){return e.length>1}function sE(e){return e===void 0?`未选择机器`:`${e.name}${e.kind===`remote`?` · 远程`:``}`}function cE(e){return e===void 0?`未选择机器`:e.baseUrl??e.name}function lE(e){return e?.name??`未选择项目`}function uE(e){return e===void 0?`未选择项目`:`${e.name} — ${e.path}`}function dE(e){return e===void 0?`未选择工作区`:`${e.label}${e.isMain?` · 主工作区`:``} · ${e.path}`}function fE(e){return e===void 0?`未选择工作区`:`${e.label}${e.isMain?` · 主工作区`:``} — ${e.path}`}function pE(e){let t=e?.name?.trim(),n=e?.firstMessage.trim();return t!==void 0&&t!==``?t:n!==void 0&&n!==``?n:e===void 0?`未选择会话`:Tv(e.id)}function mE(e){return e===void 0?`未选择会话`:e.path}var hE=class extends y{constructor(...e){super(...e),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(){let e=this.fallbackLabels();return g`
|
|
3687
3687
|
<div class=${this.frameClass()}>
|
|
3688
3688
|
<div class="mobile-tabs" @scroll=${this.onMobileTabsScroll}>
|
|
3689
3689
|
${this.tabs.map(t=>{let n=this.selectedView===t.id;return g`
|
|
@@ -3722,12 +3722,12 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3722
3722
|
.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; }
|
|
3723
3723
|
.tab-badge { min-width: 13px; padding: 0 4px; font-size: 10px; line-height: 13px; }
|
|
3724
3724
|
}
|
|
3725
|
-
`}};V([x({attribute:!1})],
|
|
3725
|
+
`}};V([x({attribute:!1})],hE.prototype,`tabs`,void 0),V([x({attribute:!1})],hE.prototype,`selectedView`,void 0),V([x({attribute:!1})],hE.prototype,`onSelect`,void 0),V([C(`.mobile-tabs`)],hE.prototype,`mobileTabs`,void 0),V([S()],hE.prototype,`canScrollLeft`,void 0),V([S()],hE.prototype,`canScrollRight`,void 0),hE=V([b(`app-mobile-main-tabs`)],hE);var gE=class extends y{constructor(...e){super(...e),this.machines=[],this.statuses={},this.activities={},this.unreadMachineIds=new Set,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(e=>e.id===this.openActionsMachineId)&&(this.openActionsMachineId=void 0)}async focusSelectedOrFirst(){let e=this.switcherButton();return e!==null&&await this.openMenuAndFocusOption(e)}render(){let e=this.selectedMachine();if(e===void 0)return null;let t=_E(e,this.statuses),n=e.name;return g`
|
|
3726
3726
|
<div class="machine-switcher">
|
|
3727
3727
|
<button
|
|
3728
3728
|
type="button"
|
|
3729
3729
|
class="machine-switcher-button"
|
|
3730
|
-
title=${
|
|
3730
|
+
title=${yE(e)}
|
|
3731
3731
|
aria-label=${this.machineSwitcherAriaLabel(e)}
|
|
3732
3732
|
aria-expanded=${String(this.open)}
|
|
3733
3733
|
@click=${e=>{this.toggleMenu(e.currentTarget)}}
|
|
@@ -3738,7 +3738,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3738
3738
|
<span class="machine-switcher-kicker">机器</span>
|
|
3739
3739
|
<span class="machine-switcher-label">${n}</span>
|
|
3740
3740
|
</span>
|
|
3741
|
-
<span class=${`machine-status ${t}`}>${
|
|
3741
|
+
<span class=${`machine-status ${t}`}>${vE(t)}</span>
|
|
3742
3742
|
<span class="machine-chevron" aria-hidden="true">▾</span>
|
|
3743
3743
|
</button>
|
|
3744
3744
|
${this.open?g`
|
|
@@ -3747,18 +3747,18 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3747
3747
|
</div>
|
|
3748
3748
|
`:null}
|
|
3749
3749
|
</div>
|
|
3750
|
-
`}renderMachineOption(e){let t=this.selected?.id===e.id,n=
|
|
3750
|
+
`}renderMachineOption(e){let t=this.selected?.id===e.id,n=_E(e,this.statuses),r=cv(e)&&this.onRemove!==void 0,i=this.openActionsMachineId===e.id;return g`
|
|
3751
3751
|
<div class=${`machine-option ${t?`selected`:``} ${r?``:`no-actions`}`}>
|
|
3752
3752
|
<button
|
|
3753
3753
|
type="button"
|
|
3754
3754
|
class="machine-option-main"
|
|
3755
|
-
title=${
|
|
3755
|
+
title=${yE(e)}
|
|
3756
3756
|
data-machine-id=${e.id}
|
|
3757
3757
|
@click=${()=>{this.select(e)}}
|
|
3758
3758
|
@keydown=${e=>{this.handleMachineOptionKeydown(e)}}
|
|
3759
3759
|
>
|
|
3760
3760
|
<span class="machine-option-name">${this.renderActivity(e)}<span>${e.name}</span></span>
|
|
3761
|
-
<small>${e.kind===`local`?`本地 PI WEB`:e.baseUrl??`远程 PI WEB`} · ${
|
|
3761
|
+
<small>${e.kind===`local`?`本地 PI WEB`:e.baseUrl??`远程 PI WEB`} · ${vE(n)}</small>
|
|
3762
3762
|
</button>
|
|
3763
3763
|
${r?g`
|
|
3764
3764
|
<div class="machine-option-actions">
|
|
@@ -3778,7 +3778,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3778
3778
|
</div>
|
|
3779
3779
|
`:null}
|
|
3780
3780
|
</div>
|
|
3781
|
-
`}renderActivity(e){let t=
|
|
3781
|
+
`}renderActivity(e){let t=_E(e,this.statuses),n=t===`offline`||t===`error`?void 0:Rs(this.activities[e.id]),r=this.unreadMachineIds.has(e.id)?`此机器上有未读会话`:void 0;return R_(n,n===`terminal`?`机器终端活动中`:`机器活动中`,r)}selectedMachine(){return this.selected??this.machines.find(e=>e.id===`local`)??this.machines[0]}machineSwitcherAriaLabel(e){return`机器:${e.name}。切换机器。`}switcherButton(){return this.renderRoot.querySelector(`.machine-switcher-button`)}handleSwitcherButtonKeydown(e){if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault(),e.stopPropagation(),this.openMenuAndFocusOption(e.currentTarget);return}if(e.key===`ArrowRight`&&this.onFocusNextSection!==void 0){e.preventDefault(),e.stopPropagation(),this.onFocusNextSection();return}e.key===`Escape`&&this.onCancelKeyboardNavigation!==void 0&&(e.preventDefault(),e.stopPropagation(),this.onCancelKeyboardNavigation())}handleMachineOptionKeydown(e){if(e.key===`ArrowUp`){this.focusRelativeMachineOption(e.currentTarget,-1,e);return}if(e.key===`ArrowDown`){this.focusRelativeMachineOption(e.currentTarget,1,e);return}if(e.key===`Home`){this.focusIndexedMachineOption(0,e);return}if(e.key===`End`){this.focusIndexedMachineOption(-1,e);return}if(e.key===`ArrowRight`&&this.onFocusNextSection!==void 0){e.preventDefault(),e.stopPropagation(),this.open=!1,this.onFocusNextSection();return}(e.key===`ArrowLeft`||e.key===`Escape`)&&(e.preventDefault(),e.stopPropagation(),this.open=!1,this.updateComplete.then(()=>{this.focusSwitcherButton()}))}toggleMenu(e){this.menuStyle=bE(e),this.open=!this.open,this.openActionsMachineId=void 0}focusSwitcherButton(){let e=this.switcherButton();return e===null?!1:(e.focus(),!0)}async openMenuAndFocusOption(e){return this.menuStyle=bE(e),this.open=!0,this.openActionsMachineId=void 0,await this.updateComplete,this.focusSelectedMachineOption()}focusSelectedMachineOption(){let e=this.renderRoot.querySelector(`.machine-option.selected .machine-option-main`),t=this.machineOptionButtons()[0],n=e??t;return n===void 0?!1:(n.focus(),n.scrollIntoView({block:`nearest`}),!0)}focusRelativeMachineOption(e,t,n){n.preventDefault(),n.stopPropagation();let r=this.machineOptionButtons();if(r.length===0||!(e instanceof HTMLElement))return;let i=r.indexOf(e);i<0||this.focusMachineOptionAt(i+t)}focusIndexedMachineOption(e,t){t.preventDefault(),t.stopPropagation(),this.focusMachineOptionAt(e<0?this.machineOptionButtons().length-1:e)}focusMachineOptionAt(e){let t=this.machineOptionButtons(),n=t[Math.min(Math.max(e,0),t.length-1)];n?.focus(),n?.scrollIntoView({block:`nearest`})}machineOptionButtons(){return Array.from(this.renderRoot.querySelectorAll(`.machine-option-main`))}toggleActionsMenu(e,t){if(this.openActionsMachineId===e){this.openActionsMachineId=void 0;return}this.actionMenuStyle=H_(t,{constrainTo:`viewport`}),this.openActionsMachineId=e}select(e){this.open=!1,this.openActionsMachineId=void 0,this.onSelect?.(e)}removeMachine(e){this.open=!1,this.openActionsMachineId=void 0,this.onRemove?.(e)}static{this.styles=h`
|
|
3782
3782
|
:host { min-width: 0; display: block; }
|
|
3783
3783
|
.machine-switcher { min-width: 0; }
|
|
3784
3784
|
.machine-switcher-button { box-sizing: border-box; width: 100%; min-width: 0; display: flex; align-items: center; gap: 6px; border: 1px solid var(--pi-border); border-radius: 999px; background: var(--pi-surface); color: var(--pi-text); padding: 5px 8px; cursor: pointer; text-align: left; }
|
|
@@ -3814,10 +3814,10 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3814
3814
|
.machine-option-actions-panel button:hover, .machine-option-actions-panel button:focus-visible { background: var(--pi-selection-bg); }
|
|
3815
3815
|
.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); }
|
|
3816
3816
|
@keyframes pulse { 0%, 100% { opacity: .55; } 50% { opacity: 1; } }
|
|
3817
|
-
`}};V([x({attribute:!1})],
|
|
3817
|
+
`}};V([x({attribute:!1})],gE.prototype,`machines`,void 0),V([x({attribute:!1})],gE.prototype,`selected`,void 0),V([x({attribute:!1})],gE.prototype,`statuses`,void 0),V([x({attribute:!1})],gE.prototype,`activities`,void 0),V([x({attribute:!1})],gE.prototype,`unreadMachineIds`,void 0),V([x({attribute:!1})],gE.prototype,`onSelect`,void 0),V([x({attribute:!1})],gE.prototype,`onRemove`,void 0),V([x({attribute:!1})],gE.prototype,`onFocusNextSection`,void 0),V([x({attribute:!1})],gE.prototype,`onCancelKeyboardNavigation`,void 0),V([S()],gE.prototype,`open`,void 0),V([S()],gE.prototype,`menuStyle`,void 0),V([S()],gE.prototype,`openActionsMachineId`,void 0),V([S()],gE.prototype,`actionMenuStyle`,void 0),gE=V([b(`machine-switcher`)],gE);function _E(e,t){return t[e.id]?.status??e.status??`unknown`}function vE(e){return e===`online`?`在线`:e===`offline`?`离线`:e===`error`?`错误`:`未知`}function yE(e){return e.baseUrl??e.name}function bE(e){if(typeof HTMLElement>`u`||typeof window>`u`||!(e instanceof HTMLElement))return``;let t=e.getBoundingClientRect(),n=Math.min(280,Math.max(0,window.innerWidth-16)),r=Math.min(Math.max(8,t.left),Math.max(8,window.innerWidth-8-n)),i=Math.max(0,window.innerHeight-t.bottom-8);return[`top: ${xE(t.bottom)};`,`left: ${xE(r)};`,`width: ${xE(n)};`,`max-height: ${xE(i)};`].join(` `)}function xE(e){return`${String(Math.round(e))}px`}var Z=class extends y{constructor(...e){super(...e),this.machines=[],this.machineStatuses={},this.machineActivities={},this.projects=[],this.workspaces=[],this.sessions=[],this.pinnedSessionIds=[],this.workspaceActivities={},this.sessionActivities={},this.sessionStatuses={},this.sendingPrompts={},this.unreadSessionIds=new Set,this.unreadPresence=kp,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.startingSessionCount=0,this.canStartSession=!1,this.canDeleteArchivedSessions=!1,this.canReloadSessions=!1,this.canCleanupSessions=!1,this.authoritativeSessionPersistence=!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 g`
|
|
3818
3818
|
<header>
|
|
3819
3819
|
<strong>PI WEB</strong>
|
|
3820
|
-
${
|
|
3820
|
+
${wE(this.machines)?g`
|
|
3821
3821
|
<machine-switcher
|
|
3822
3822
|
.machines=${this.machines}
|
|
3823
3823
|
.selected=${this.selectedMachine}
|
|
@@ -3835,7 +3835,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3835
3835
|
<button title="显示操作" aria-label="显示操作" @click=${()=>{this.onShowActions?.()}}>操作</button>
|
|
3836
3836
|
</div>
|
|
3837
3837
|
</header>
|
|
3838
|
-
${this.compact&&
|
|
3838
|
+
${this.compact&&wE(this.machines)?g`
|
|
3839
3839
|
<machine-list
|
|
3840
3840
|
.machines=${this.machines}
|
|
3841
3841
|
.selected=${this.selectedMachine}
|
|
@@ -3883,7 +3883,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3883
3883
|
.onCancelKeyboardNavigation=${()=>{this.cancelKeyboardNavigation()}}
|
|
3884
3884
|
></workspace-list>
|
|
3885
3885
|
<session-list
|
|
3886
|
-
.scopeKey=${
|
|
3886
|
+
.scopeKey=${SE(this.selectedMachine?.id,this.selectedWorkspace?.id)}
|
|
3887
3887
|
.sessions=${this.sessions}
|
|
3888
3888
|
.pinnedSessionIds=${this.pinnedSessionIds}
|
|
3889
3889
|
.statuses=${this.sessionStatuses}
|
|
@@ -3916,7 +3916,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3916
3916
|
.onDeleteArchivedMany=${e=>this.onDeleteArchivedSessions?.(e)}
|
|
3917
3917
|
.onRename=${(e,t)=>this.onRenameSession?.(e,t)}
|
|
3918
3918
|
.onDetachParent=${e=>this.onDetachParentSession?.(e)}
|
|
3919
|
-
.parentLocation=${this.parentSessionLocation??
|
|
3919
|
+
.parentLocation=${this.parentSessionLocation??CE}
|
|
3920
3920
|
.onGoToParent=${this.onGoToParentSession===void 0?void 0:(e,t)=>this.onGoToParentSession?.(e,t)}
|
|
3921
3921
|
.onMarkRead=${e=>this.onMarkSessionRead?.(e)}
|
|
3922
3922
|
.onMarkReadMany=${e=>this.onMarkSessionsRead?.(e)}
|
|
@@ -3926,7 +3926,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3926
3926
|
.onFocusNextSection=${()=>{this.focusNextFrom(`sessions`)}}
|
|
3927
3927
|
.onCancelKeyboardNavigation=${()=>{this.cancelKeyboardNavigation()}}
|
|
3928
3928
|
></session-list>
|
|
3929
|
-
`}async focusNavigableSection(e){return e!==void 0&&await e.focusSelectedOrFirst()}focusPreviousFrom(e){let t=
|
|
3929
|
+
`}async focusNavigableSection(e){return e!==void 0&&await e.focusSelectedOrFirst()}focusPreviousFrom(e){let t=TE(e,this.machines);t!==void 0&&this.onFocusNavigationTarget?.(t)}focusNextFrom(e){this.onFocusNavigationTarget?.(EE(e,this.machines))}cancelKeyboardNavigation(){this.onCancelKeyboardNavigation?.()}static{this.styles=h`
|
|
3930
3930
|
:host { display: flex; flex-direction: column; min-height: 0; overflow: hidden; }
|
|
3931
3931
|
:host([compact]) { flex: 1 1 auto; }
|
|
3932
3932
|
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); }
|
|
@@ -3949,7 +3949,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3949
3949
|
:host([compact]) workspace-list[collapsed],
|
|
3950
3950
|
:host([compact]) session-list[collapsed] { flex: 0 0 auto; min-height: auto; overflow: hidden; }
|
|
3951
3951
|
button { border: 1px solid var(--pi-border); border-radius: 8px; background: var(--pi-surface); color: var(--pi-text); padding: 7px 9px; cursor: pointer; }
|
|
3952
|
-
`}};V([x({attribute:!1})],Z.prototype,`machines`,void 0),V([x({attribute:!1})],Z.prototype,`selectedMachine`,void 0),V([x({attribute:!1})],Z.prototype,`machineStatuses`,void 0),V([x({attribute:!1})],Z.prototype,`machineActivities`,void 0),V([x({attribute:!1})],Z.prototype,`projects`,void 0),V([x({attribute:!1})],Z.prototype,`selectedProject`,void 0),V([x({attribute:!1})],Z.prototype,`workspaces`,void 0),V([x({attribute:!1})],Z.prototype,`selectedWorkspace`,void 0),V([x({attribute:!1})],Z.prototype,`sessions`,void 0),V([x({attribute:!1})],Z.prototype,`pinnedSessionIds`,void 0),V([x({attribute:!1})],Z.prototype,`selectedSession`,void 0),V([x({attribute:!1})],Z.prototype,`workspaceActivities`,void 0),V([x({attribute:!1})],Z.prototype,`sessionActivities`,void 0),V([x({attribute:!1})],Z.prototype,`sessionStatuses`,void 0),V([x({attribute:!1})],Z.prototype,`sendingPrompts`,void 0),V([x({attribute:!1})],Z.prototype,`unreadSessionIds`,void 0),V([x({attribute:!1})],Z.prototype,`unreadPresence`,void 0),V([x({attribute:!1})],Z.prototype,`workspacesByProjectId`,void 0),V([x({attribute:!1})],Z.prototype,`deletingWorkspaceIds`,void 0),V([x({attribute:!1})],Z.prototype,`workspaceLabelItems`,void 0),V([x({attribute:!1})],Z.prototype,`refreshControl`,void 0),V([x({type:Boolean,reflect:!0})],Z.prototype,`collapsible`,void 0),V([x({type:Boolean,reflect:!0})],Z.prototype,`compact`,void 0),V([x({type:Boolean})],Z.prototype,`machinesCollapsed`,void 0),V([x({type:Boolean})],Z.prototype,`projectsCollapsed`,void 0),V([x({type:Boolean})],Z.prototype,`workspacesCollapsed`,void 0),V([x({type:Boolean})],Z.prototype,`sessionsCollapsed`,void 0),V([x({type:Number})],Z.prototype,`startingSessionCount`,void 0),V([x({type:Boolean})],Z.prototype,`canStartSession`,void 0),V([x({type:Boolean})],Z.prototype,`canDeleteArchivedSessions`,void 0),V([x({type:Boolean})],Z.prototype,`canReloadSessions`,void 0),V([x({type:Boolean})],Z.prototype,`canCleanupSessions`,void 0),V([x({type:Boolean})],Z.prototype,`authoritativeSessionPersistence`,void 0),V([x({type:String})],Z.prototype,`archivedDeleteUnavailableMessage`,void 0),V([x({type:String})],Z.prototype,`cleanupUnavailableMessage`,void 0),V([x({attribute:!1})],Z.prototype,`onShowActions`,void 0),V([x({attribute:!1})],Z.prototype,`onToggleMachines`,void 0),V([x({attribute:!1})],Z.prototype,`onToggleProjects`,void 0),V([x({attribute:!1})],Z.prototype,`onToggleWorkspaces`,void 0),V([x({attribute:!1})],Z.prototype,`onToggleSessions`,void 0),V([x({attribute:!1})],Z.prototype,`onSelectProject`,void 0),V([x({attribute:!1})],Z.prototype,`onCloseProject`,void 0),V([x({attribute:!1})],Z.prototype,`onSelectWorkspace`,void 0),V([x({attribute:!1})],Z.prototype,`onDeleteWorkspace`,void 0),V([x({attribute:!1})],Z.prototype,`onStartSession`,void 0),V([x({attribute:!1})],Z.prototype,`onSelectSession`,void 0),V([x({attribute:!1})],Z.prototype,`onSearchSessions`,void 0),V([x({attribute:!1})],Z.prototype,`onToggleSessionPin`,void 0),V([x({attribute:!1})],Z.prototype,`onArchiveSession`,void 0),V([x({attribute:!1})],Z.prototype,`onArchiveSessionWithDescendants`,void 0),V([x({attribute:!1})],Z.prototype,`onArchiveSessions`,void 0),V([x({attribute:!1})],Z.prototype,`onRestoreSession`,void 0),V([x({attribute:!1})],Z.prototype,`onDeleteCachedNewSession`,void 0),V([x({attribute:!1})],Z.prototype,`onDeleteArchivedSession`,void 0),V([x({attribute:!1})],Z.prototype,`onDeleteArchivedSessions`,void 0),V([x({attribute:!1})],Z.prototype,`onRenameSession`,void 0),V([x({attribute:!1})],Z.prototype,`onDetachParentSession`,void 0),V([x({attribute:!1})],Z.prototype,`parentSessionLocation`,void 0),V([x({attribute:!1})],Z.prototype,`onGoToParentSession`,void 0),V([x({attribute:!1})],Z.prototype,`onMarkSessionRead`,void 0),V([x({attribute:!1})],Z.prototype,`onMarkSessionsRead`,void 0),V([x({attribute:!1})],Z.prototype,`onReloadSession`,void 0),V([x({attribute:!1})],Z.prototype,`onCleanupSessions`,void 0),V([x({attribute:!1})],Z.prototype,`onArchivedCollapsed`,void 0),V([x({attribute:!1})],Z.prototype,`onSelectMachine`,void 0),V([x({attribute:!1})],Z.prototype,`onRemoveMachine`,void 0),V([x({attribute:!1})],Z.prototype,`onFocusNavigationTarget`,void 0),V([x({attribute:!1})],Z.prototype,`onCancelKeyboardNavigation`,void 0),V([C(`machine-list`)],Z.prototype,`machineList`,void 0),V([C(`machine-switcher`)],Z.prototype,`machineSwitcher`,void 0),V([C(`project-list`)],Z.prototype,`projectList`,void 0),V([C(`workspace-list`)],Z.prototype,`workspaceList`,void 0),V([C(`session-list`)],Z.prototype,`sessionList`,void 0),Z=V([b(`app-navigation-panel`)],Z);function
|
|
3952
|
+
`}};V([x({attribute:!1})],Z.prototype,`machines`,void 0),V([x({attribute:!1})],Z.prototype,`selectedMachine`,void 0),V([x({attribute:!1})],Z.prototype,`machineStatuses`,void 0),V([x({attribute:!1})],Z.prototype,`machineActivities`,void 0),V([x({attribute:!1})],Z.prototype,`projects`,void 0),V([x({attribute:!1})],Z.prototype,`selectedProject`,void 0),V([x({attribute:!1})],Z.prototype,`workspaces`,void 0),V([x({attribute:!1})],Z.prototype,`selectedWorkspace`,void 0),V([x({attribute:!1})],Z.prototype,`sessions`,void 0),V([x({attribute:!1})],Z.prototype,`pinnedSessionIds`,void 0),V([x({attribute:!1})],Z.prototype,`selectedSession`,void 0),V([x({attribute:!1})],Z.prototype,`workspaceActivities`,void 0),V([x({attribute:!1})],Z.prototype,`sessionActivities`,void 0),V([x({attribute:!1})],Z.prototype,`sessionStatuses`,void 0),V([x({attribute:!1})],Z.prototype,`sendingPrompts`,void 0),V([x({attribute:!1})],Z.prototype,`unreadSessionIds`,void 0),V([x({attribute:!1})],Z.prototype,`unreadPresence`,void 0),V([x({attribute:!1})],Z.prototype,`workspacesByProjectId`,void 0),V([x({attribute:!1})],Z.prototype,`deletingWorkspaceIds`,void 0),V([x({attribute:!1})],Z.prototype,`workspaceLabelItems`,void 0),V([x({attribute:!1})],Z.prototype,`refreshControl`,void 0),V([x({type:Boolean,reflect:!0})],Z.prototype,`collapsible`,void 0),V([x({type:Boolean,reflect:!0})],Z.prototype,`compact`,void 0),V([x({type:Boolean})],Z.prototype,`machinesCollapsed`,void 0),V([x({type:Boolean})],Z.prototype,`projectsCollapsed`,void 0),V([x({type:Boolean})],Z.prototype,`workspacesCollapsed`,void 0),V([x({type:Boolean})],Z.prototype,`sessionsCollapsed`,void 0),V([x({type:Number})],Z.prototype,`startingSessionCount`,void 0),V([x({type:Boolean})],Z.prototype,`canStartSession`,void 0),V([x({type:Boolean})],Z.prototype,`canDeleteArchivedSessions`,void 0),V([x({type:Boolean})],Z.prototype,`canReloadSessions`,void 0),V([x({type:Boolean})],Z.prototype,`canCleanupSessions`,void 0),V([x({type:Boolean})],Z.prototype,`authoritativeSessionPersistence`,void 0),V([x({type:String})],Z.prototype,`archivedDeleteUnavailableMessage`,void 0),V([x({type:String})],Z.prototype,`cleanupUnavailableMessage`,void 0),V([x({attribute:!1})],Z.prototype,`onShowActions`,void 0),V([x({attribute:!1})],Z.prototype,`onToggleMachines`,void 0),V([x({attribute:!1})],Z.prototype,`onToggleProjects`,void 0),V([x({attribute:!1})],Z.prototype,`onToggleWorkspaces`,void 0),V([x({attribute:!1})],Z.prototype,`onToggleSessions`,void 0),V([x({attribute:!1})],Z.prototype,`onSelectProject`,void 0),V([x({attribute:!1})],Z.prototype,`onCloseProject`,void 0),V([x({attribute:!1})],Z.prototype,`onSelectWorkspace`,void 0),V([x({attribute:!1})],Z.prototype,`onDeleteWorkspace`,void 0),V([x({attribute:!1})],Z.prototype,`onStartSession`,void 0),V([x({attribute:!1})],Z.prototype,`onSelectSession`,void 0),V([x({attribute:!1})],Z.prototype,`onSearchSessions`,void 0),V([x({attribute:!1})],Z.prototype,`onToggleSessionPin`,void 0),V([x({attribute:!1})],Z.prototype,`onArchiveSession`,void 0),V([x({attribute:!1})],Z.prototype,`onArchiveSessionWithDescendants`,void 0),V([x({attribute:!1})],Z.prototype,`onArchiveSessions`,void 0),V([x({attribute:!1})],Z.prototype,`onRestoreSession`,void 0),V([x({attribute:!1})],Z.prototype,`onDeleteCachedNewSession`,void 0),V([x({attribute:!1})],Z.prototype,`onDeleteArchivedSession`,void 0),V([x({attribute:!1})],Z.prototype,`onDeleteArchivedSessions`,void 0),V([x({attribute:!1})],Z.prototype,`onRenameSession`,void 0),V([x({attribute:!1})],Z.prototype,`onDetachParentSession`,void 0),V([x({attribute:!1})],Z.prototype,`parentSessionLocation`,void 0),V([x({attribute:!1})],Z.prototype,`onGoToParentSession`,void 0),V([x({attribute:!1})],Z.prototype,`onMarkSessionRead`,void 0),V([x({attribute:!1})],Z.prototype,`onMarkSessionsRead`,void 0),V([x({attribute:!1})],Z.prototype,`onReloadSession`,void 0),V([x({attribute:!1})],Z.prototype,`onCleanupSessions`,void 0),V([x({attribute:!1})],Z.prototype,`onArchivedCollapsed`,void 0),V([x({attribute:!1})],Z.prototype,`onSelectMachine`,void 0),V([x({attribute:!1})],Z.prototype,`onRemoveMachine`,void 0),V([x({attribute:!1})],Z.prototype,`onFocusNavigationTarget`,void 0),V([x({attribute:!1})],Z.prototype,`onCancelKeyboardNavigation`,void 0),V([C(`machine-list`)],Z.prototype,`machineList`,void 0),V([C(`machine-switcher`)],Z.prototype,`machineSwitcher`,void 0),V([C(`project-list`)],Z.prototype,`projectList`,void 0),V([C(`workspace-list`)],Z.prototype,`workspaceList`,void 0),V([C(`session-list`)],Z.prototype,`sessionList`,void 0),Z=V([b(`app-navigation-panel`)],Z);function SE(e,t){return JSON.stringify([e??``,t??``])}var CE=()=>({kind:`unknown`});function wE(e){return e.length>1}function TE(e,t){let n=DE(t);return n[n.indexOf(e)-1]}function EE(e,t){let n=DE(t);return n[n.indexOf(e)+1]??`chat`}function DE(e){return Wg.filter(t=>t!==`machines`||wE(e))}var OE=new Set([`ArrowLeft`,`ArrowRight`,`Home`,`End`]),kE=420,AE=4,Q=class extends y{constructor(...e){super(...e),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(){let e=this.collapsed?this.expandLabel:this.collapseLabel;return g`
|
|
3953
3953
|
${this.renderResizeHandle()}
|
|
3954
3954
|
<button
|
|
3955
3955
|
type="button"
|
|
@@ -3979,7 +3979,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3979
3979
|
@dblclick=${e=>{this.onResizeDoubleClick(e)}}
|
|
3980
3980
|
@keydown=${e=>{this.onResizeKeyDown(e)}}
|
|
3981
3981
|
></div>
|
|
3982
|
-
`}resizeAriaValueNow(){return this.panelWidth===void 0?v:String(Math.round(this.panelWidth))}renderIcon(){return g`<svg class="edge-icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d=${this.iconDirection()===`left`?`M15 18l-6-6 6-6`:`M9 18l6-6-6-6`}/></svg>`}iconDirection(){return this.side===`navigation`?this.collapsed?`right`:`left`:this.collapsed?`left`:`right`}onResizePointerDown(e){if(!this.resizable||e.button!==0)return;let t=e.currentTarget;if(!(t instanceof HTMLElement))return;let n=this.resizeStartWidth();n!==void 0&&(e.preventDefault(),e.stopPropagation(),t.setPointerCapture(e.pointerId),this.activeResize={pointerId:e.pointerId,startClientX:e.clientX,startWidth:n,handle:t,moved:!1},this.toggleAttribute(`resizing`,!0))}onResizePointerMove(e){let t=this.activeResize;t?.pointerId===e.pointerId&&(e.preventDefault(),!(Math.abs(e.clientX-t.startClientX)<=
|
|
3982
|
+
`}resizeAriaValueNow(){return this.panelWidth===void 0?v:String(Math.round(this.panelWidth))}renderIcon(){return g`<svg class="edge-icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d=${this.iconDirection()===`left`?`M15 18l-6-6 6-6`:`M9 18l6-6-6-6`}/></svg>`}iconDirection(){return this.side===`navigation`?this.collapsed?`right`:`left`:this.collapsed?`left`:`right`}onResizePointerDown(e){if(!this.resizable||e.button!==0)return;let t=e.currentTarget;if(!(t instanceof HTMLElement))return;let n=this.resizeStartWidth();n!==void 0&&(e.preventDefault(),e.stopPropagation(),t.setPointerCapture(e.pointerId),this.activeResize={pointerId:e.pointerId,startClientX:e.clientX,startWidth:n,handle:t,moved:!1},this.toggleAttribute(`resizing`,!0))}onResizePointerMove(e){let t=this.activeResize;t?.pointerId===e.pointerId&&(e.preventDefault(),!(Math.abs(e.clientX-t.startClientX)<=AE)&&(t.moved=!0,this.commitPanelWidth(c_(this.side,t.startWidth,t.startClientX,e.clientX,this.resizeConstraints()))))}onResizePointerUp(e){let 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||!OE.has(e.key))return;let t=this.resizeStartWidth();if(t===void 0)return;let n=l_(this.side,t,e.key,{largeStep:e.shiftKey,constraints:this.resizeConstraints()});n!==void 0&&(e.preventDefault(),e.stopPropagation(),this.commitPanelWidth(n),this.onResizeEnd?.())}registerTapForReset(){let e=Date.now();if(e-this.lastTapAt<=kE){this.lastTapAt=0,this.resetPanelSize();return}this.lastTapAt=e}resetPanelSize(){this.finishActiveResize(),this.onReset?.()}resizeStartWidth(){let e=this.onResizeStart?.()??this.panelWidth;if(e!==void 0)return u_(this.side,e,this.resizeConstraints())}commitPanelWidth(e){this.onResize?.(u_(this.side,e,this.resizeConstraints()))}finishActiveResize(){let 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(){let e=o_(this.side);return{...e,minWidth:this.minWidth??e.minWidth,maxWidth:this.maxWidth??e.maxWidth}}static{this.styles=h`
|
|
3983
3983
|
: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; }
|
|
3984
3984
|
:host([side="navigation"]) { grid-column: 2; }
|
|
3985
3985
|
:host([side="workspace"]) { grid-column: 4; }
|
|
@@ -3998,7 +3998,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
3998
3998
|
@media (max-width: 760px) {
|
|
3999
3999
|
:host([side="navigation"]) { display: none; }
|
|
4000
4000
|
}
|
|
4001
|
-
`}};V([x({reflect:!0})],Q.prototype,`side`,void 0),V([x({type:Boolean,reflect:!0})],Q.prototype,`collapsed`,void 0),V([x({type:Boolean})],Q.prototype,`resizable`,void 0),V([x({type:Number})],Q.prototype,`panelWidth`,void 0),V([x({type:Number})],Q.prototype,`minWidth`,void 0),V([x({type:Number})],Q.prototype,`maxWidth`,void 0),V([x()],Q.prototype,`controls`,void 0),V([x()],Q.prototype,`resizeLabel`,void 0),V([x()],Q.prototype,`expandLabel`,void 0),V([x()],Q.prototype,`collapseLabel`,void 0),V([x({attribute:!1})],Q.prototype,`onToggle`,void 0),V([x({attribute:!1})],Q.prototype,`onResizeStart`,void 0),V([x({attribute:!1})],Q.prototype,`onResize`,void 0),V([x({attribute:!1})],Q.prototype,`onResizeEnd`,void 0),V([x({attribute:!1})],Q.prototype,`onReset`,void 0),Q=V([b(`app-panel-edge-control`)],Q);var
|
|
4001
|
+
`}};V([x({reflect:!0})],Q.prototype,`side`,void 0),V([x({type:Boolean,reflect:!0})],Q.prototype,`collapsed`,void 0),V([x({type:Boolean})],Q.prototype,`resizable`,void 0),V([x({type:Number})],Q.prototype,`panelWidth`,void 0),V([x({type:Number})],Q.prototype,`minWidth`,void 0),V([x({type:Number})],Q.prototype,`maxWidth`,void 0),V([x()],Q.prototype,`controls`,void 0),V([x()],Q.prototype,`resizeLabel`,void 0),V([x()],Q.prototype,`expandLabel`,void 0),V([x()],Q.prototype,`collapseLabel`,void 0),V([x({attribute:!1})],Q.prototype,`onToggle`,void 0),V([x({attribute:!1})],Q.prototype,`onResizeStart`,void 0),V([x({attribute:!1})],Q.prototype,`onResize`,void 0),V([x({attribute:!1})],Q.prototype,`onResizeEnd`,void 0),V([x({attribute:!1})],Q.prototype,`onReset`,void 0),Q=V([b(`app-panel-edge-control`)],Q);var jE=class extends y{constructor(...e){super(...e),this.onReloadClick=e=>{e.stopPropagation(),this.onReload?.()}}render(){let e=`完整重载页面`;return g`
|
|
4002
4002
|
<button
|
|
4003
4003
|
class="app-refresh-button"
|
|
4004
4004
|
title=${e}
|
|
@@ -4017,7 +4017,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
4017
4017
|
:host, :host * { -webkit-user-select: none; user-select: none; }
|
|
4018
4018
|
.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; }
|
|
4019
4019
|
.app-refresh-icon { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; pointer-events: none; }
|
|
4020
|
-
`}};V([x({attribute:!1})],
|
|
4020
|
+
`}};V([x({attribute:!1})],jE.prototype,`onReload`,void 0),jE=V([b(`app-refresh-control`)],jE);var ME=h`
|
|
4021
4021
|
/* Mobile browsers already subtract browser controls from 100dvh; reserve bottom safe area only in standalone PWA modes. */
|
|
4022
4022
|
: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; }
|
|
4023
4023
|
:host([pwa-display-mode]) { --pi-app-safe-area-bottom: env(safe-area-inset-bottom); }
|
|
@@ -4116,7 +4116,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
4116
4116
|
button { border: 1px solid var(--pi-border); border-radius: 8px; background: var(--pi-surface); color: var(--pi-text); padding: 7px 9px; cursor: pointer; }
|
|
4117
4117
|
.empty { margin: auto; color: var(--pi-muted); }
|
|
4118
4118
|
.error { padding: 10px 16px; border-bottom: 1px solid var(--pi-border); color: var(--pi-danger); }
|
|
4119
|
-
`,ME=900*1e3,NE=750,PE=[1e3,3e3,8e3,15e3,3e4],FE={capture:!0},IE=`auto:on`,LE=`auto:off`,RE=`theme:`,zE=cs(`core:workspace.files`),BE=cs(`core:workspace.git`),VE=cs(`core:workspace.terminal`),HE=320,UE=2,WE=`(min-width: 1181px)`,$=class extends y{constructor(...e){super(...e),this.state=Ho(),this.apiScope=KE(),this.sessionUnread=new xp({onChange:e=>{this.syncUnreadPresence(),R(this.state)===e&&(this.syncUnreadSessionIds(),this.syncSelectedSessionReadState())},onBackgroundError:(e,t,n)=>{console.warn(`Failed to ${e} session unread state for ${t}`,n)}}),this.unreadSessionIds=this.sessionUnread.unreadSessionIds(R(this.state),this.state.sessions),this.unreadPresence=kp,this.unreadConnected=!1,this.notifications=new Zd(()=>this.state,e=>{this.setState(e)},{onBackgroundError:(e,t)=>{console.warn(e,t)}}),this.sessions=new cd(()=>this.state,e=>{this.setState(e)},()=>{this.updateUrl()},new Xu,{socket:new Tu(this.apiScope),notifications:this.notifications,onSelectedSessionReady:({machineId:e,session:t})=>{this.commitReadyChatAfterRender(e,t)},replacePromptEditorText:async({machineId:e,sessionId:t,text:n})=>{await this.updateComplete,!(R(this.state)!==e||this.state.selectedSession?.id!==t)&&this.promptEditor?.replaceText(n)}}),this.projectActivityOwnership=new Vs(()=>this.state,e=>{this.setState(e)},{api:io,onError:({machineId:e,projectId:t,error:n})=>{console.warn(`Failed to discover project activity ownership for ${t} on ${e}`,n)}}),this.activity=new es(()=>this.state,e=>{this.setState(e)},{onActivityApplied:e=>{this.projectActivityOwnership.handleActivityApplied(e)}}),this.auth=new rs(()=>this.state,e=>{this.setState(e)},e=>{this.sessions.applySessionStatus(e)},{scope:this.apiScope}),this.workspaces=new of(()=>this.state,e=>{this.setState(e)},()=>{this.updateUrl()},this.sessions,new rf),this.projects=new Ns(()=>this.state,e=>{this.setState(e)},this.workspaces,{onProjectsApplied:e=>{this.projectActivityOwnership.handleProjectsApplied(e)}}),this.machines=new As(()=>this.state,e=>{this.setState(e)},()=>{this.updateUrl()},this.projects),this.piWebStatusController=new Us(()=>this.state,e=>{this.setState(e)},{onRefreshError:(e,t)=>{console.warn(`Failed to refresh PI WEB status for ${e}`,t)}}),this.files=new xs(()=>this.state,e=>{this.setState(e)},()=>{this.updateUrl()}),this.git=new ks(()=>this.state,e=>{this.setState(e)},()=>{this.updateUrl()}),this.keyboard=new kf,this.realtime=new Eu(this.apiScope),this.machineRealtimeSockets=new Map,this.unreadRuntimeRefreshes=new Map,this.activeTerminalIds=new Set,this.machineNavigation=new df,this.terminalSelection=new wf,this.appShell=new Fg(this),this.browserResume=new zg({onResumeSignal:()=>{this.handleBrowserResumeSignal()},refreshAfterResume:()=>this.refreshAfterBrowserResume(),onRefreshError:e=>{console.warn(`Failed to refresh after browser resume`,e)}}),this.panelCollapse=new t_(this),this.panelResize=new a_(this),this.navigationSections=new Qg(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=GE(),this.pluginLoads=new Tg((e,t)=>this.registerExternalPlugins(e,t),(e,t)=>this.plugins.shouldLoadRemotePlugin(e,t)),this.themePreference=Xp()??Kp,this.activeThemeId=Gp,this.isRefreshingApp=!1,this.sessionSearchDialogOpen=!1,this.settingsSection=E_(),this.normalAuthLoading=!0,this.normalAuthError=``,this.shortcutConfig={},this.workspaceUploadDefaultFolder=So(void 0),this.sessionWarningVisibility=zp(),this.authenticatedAppRunning=!1,this.normalAuthInitSeq=0,this.onPopState=()=>void this.withChatScrollTransition(async()=>{this.restoreSettingsRoute(),await this.restoreRoute(!1)}),this.onPageShow=()=>{this.renegotiateUnreadMachines(),this.appShell.repairViewportPosition(),this.retryPendingRemoteRouteRestoreSoon()},this.onSystemLightThemeChange=()=>{this.themePreference.auto&&this.applyPreferredTheme(!1)},this.previousStackedWorkspaceLayout=this.appShell.isStackedWorkspaceLayout,this.onKeyDown=e=>{this.settingsSection!==void 0||this.state.treeDialog!==void 0||this.keyboard.handle(e,this.getDefaultActions(),{shortcuts:this.shortcutConfig})&&(e.preventDefault(),e.stopPropagation())},this.parentSessionLocationFor=e=>tp(e,{workspaces:this.state.workspaces,workspacesByProjectId:this.state.workspacesByProjectId,projects:this.state.projects}),this.handleSendPrompt=(e,t,n,r)=>{this.sendPrompt(e,t,n,r)},this.handleStopActiveWork=()=>{this.sessions.stopActiveWork()},this.handleClearServerQueue=()=>{this.sessions.clearServerQueue()},this.handleDismissWarning=e=>{this.sessions.dismissWarning(e)},this.handleSubmitAsk=(e,t)=>this.sessions.submitAsk(e,t),this.handleAnswerDialog=(e,t)=>this.sessions.answerDialog(e,t),this.handleCancelDialog=e=>this.sessions.cancelDialog(e),this.handleDismissClosedDialog=e=>{this.sessions.dismissClosedDialog(e)},this.handleDismissNotification=e=>{this.notifications.dismissNotification(e)},this.handleDismissAllNotifications=()=>{this.notifications.dismissAll()},this.handleToggleWarnings=()=>{let e=Wp(this.sessionWarningVisibility);e!==this.sessionWarningVisibility&&(this.sessionWarningVisibility=e,this.requestUpdate())},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(),this.syncSessionWarningVisibility()}updated(){this.committedChatIdentity=YE(this.state),this.syncSelectedSessionReadState()}syncSessionWarningVisibility(){let e=this.state.selectedSession;this.sessionWarningVisibility=Vp(this.sessionWarningVisibility,e===void 0?void 0:Qo(R(this.state),e.id),this.state.status?.warnings)}syncSelectedSessionReadState(){let e=this.state.selectedSession;if(e===void 0)return;let t=R(this.state);this.isSessionSeen(t,e)&&this.sessionUnread.acknowledge(t,e)}markSessionsRead(e){let t=R(this.state);for(let n of e)this.sessionUnread.acknowledge(t,n)}async commitReadyChatAfterRender(e,t){let n=JE(e,t);await this.updateComplete,!(!this.unreadConnected||YE(this.state)!==n)&&(this.readyChatIdentity=n,this.syncSelectedSessionReadState())}syncUnreadSessionIds(){let e=this.sessionUnread.unreadSessionIds(R(this.state),this.state.sessions);tD(e,this.unreadSessionIds)||(this.unreadSessionIds=e)}syncUnreadPresence(){let e=Ap({machineIds:this.state.machines.map(e=>e.id),projectionFor:e=>this.sessionUnread.projection(e),selectedMachineId:R(this.state),projects:this.state.projects,workspaces:this.state.workspaces,workspacesByProjectId:this.state.workspacesByProjectId});Ip(e,this.unreadPresence)||(this.unreadPresence=e)}isSessionSeen(e,t){if(!this.unreadConnected)return!1;let n=JE(e,t);return YE(this.state)!==n||this.committedChatIdentity!==n||this.readyChatIdentity!==n||typeof document<`u`&&(document.visibilityState!==`visible`||typeof document.hasFocus==`function`&&!document.hasFocus())||this.isChatObscured()?!1:this.state.mainView===`chat`?!0:this.state.mainView===`navigation`?!this.appShell.isMobileNavigationLayout:this.isDesktopSideBySideLayout()}isChatObscured(){return this.settingsSection!==void 0||this.sessionCleanupDialog!==void 0||this.state.actionPaletteOpen||this.state.projectDialogOpen||this.state.machineDialogOpen||this.state.commandDialog!==void 0||this.state.treeDialog!==void 0||this.state.modelDialog!==void 0||this.state.thinkingDialog!==void 0||this.state.themeDialog!==void 0||this.state.authDialog!==void 0}connectedCallback(){super.connectedCallback(),this.normalAuthInitSeq+=1,window.addEventListener(`popstate`,this.onPopState),window.addEventListener(`pageshow`,this.onPageShow),this.browserResume.connect(),window.addEventListener(`keydown`,this.onKeyDown,FE),this.systemLightThemeMedia?.addEventListener(`change`,this.onSystemLightThemeChange),this.applyPreferredTheme(!1),this.initializeNormalAuth(this.normalAuthInitSeq)}startAuthenticatedApp(){!this.isConnected||this.authenticatedAppRunning||(this.authenticatedAppRunning=!0,this.connectRealtime(),this.renegotiateUnreadMachines(),this.piWebStatusTimer=window.setInterval(()=>{this.schedulePiWebStatusRefresh()},ME),this.refreshWorkspaceActivity(),this.loadClientConfig(),this.ensureGatewayPluginsLoaded(),this.loadProjectsAndRestoreRoute().finally(()=>{this.schedulePiWebStatusRefresh()}))}async initializeNormalAuth(e){if(this.apiScope===`management`){if(!this.isConnected||e!==this.normalAuthInitSeq)return;this.normalAuthStatus={configured:!0,authenticated:!0},this.normalAuthLoading=!1,this.startAuthenticatedApp();return}this.normalAuthLoading=!0,this.normalAuthError=``;try{let t=await Za.status();if(!this.isConnected||e!==this.normalAuthInitSeq)return;this.normalAuthStatus=t,t.authenticated&&this.startAuthenticatedApp()}catch(t){if(!this.isConnected||e!==this.normalAuthInitSeq)return;this.normalAuthError=`检查普通模式密码失败:${sD(t)}`}finally{this.isConnected&&e===this.normalAuthInitSeq&&(this.normalAuthLoading=!1)}}disconnectedCallback(){this.normalAuthInitSeq+=1,this.authenticatedAppRunning=!1,this.unreadConnected=!1,this.committedChatIdentity=void 0,this.readyChatIdentity=void 0,this.unreadRuntimeRefreshes.clear(),this.sessionUnread.retainMachines(new Set),window.removeEventListener(`popstate`,this.onPopState),window.removeEventListener(`pageshow`,this.onPageShow),this.browserResume.disconnect(),window.removeEventListener(`keydown`,this.onKeyDown,FE),this.systemLightThemeMedia?.removeEventListener(`change`,this.onSystemLightThemeChange),this.keyboard.reset(),this.auth.dispose(),this.sessions.dispose(),this.notifications.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(!eD(this.state,e))return;let t=this.state;this.state={...this.state,...e},YE(t)!==YE(this.state)&&(this.committedChatIdentity=void 0,this.readyChatIdentity=void 0),XE(t,this.state)&&this.syncSessionUnreadMachines(),this.syncUnreadSessionIds(),this.syncUnreadPresence(),this.handleActivityTransition(t,this.state),this.handleWorkspaceChange(t,this.state),this.handleMachineChange(t,this.state),ZE(t,this.state)&&this.syncMachineActivitySubscriptions(),this.notifications.syncEnvironment(t,this.state)}async loadProjectsAndRestoreRoute(){this.restoreSettingsRoute();let e=x_();await this.machines.loadMachines(e.machineId);let t=this.routeForSelectedMachine(e),n=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,n)?this.deferRemoteRouteRestore(t):(this.clearPendingRemoteRouteRestore(),this.rememberCurrentMachineNavigation()),await this.refreshWorkspaceDeletionRuns()}handleBrowserResumeSignal(){this.appShell.repairViewportPosition(),this.schedulePiWebStatusRefresh(),this.retryPendingRemoteRouteRestoreSoon()}async refreshAfterBrowserResume(){await this.renegotiateUnreadMachines(),await Promise.all([this.sessions.refreshSelectedSession(),this.refreshMachineActivities(),this.refreshWorkspaceDeletionRuns(),this.workspaces.refreshSelectedProjectTopology()])}schedulePiWebStatusRefresh(e=NE){this.clearScheduledPiWebStatusRefresh(),this.piWebStatusDeferredTimer=window.setTimeout(()=>{this.piWebStatusDeferredTimer=void 0,this.piWebStatusController.refresh()},e)}clearScheduledPiWebStatusRefresh(){this.piWebStatusDeferredTimer!==void 0&&(window.clearTimeout(this.piWebStatusDeferredTimer),this.piWebStatusDeferredTimer=void 0)}async refreshWorkspaceActivity(e=R(this.state)){try{await this.activity.refresh(e)}catch(t){console.warn(`Failed to refresh workspace activity for ${e}`,t)}}async refreshMachineActivities(){let e=this.state.machines.length===0?[R(this.state)]:this.state.machines.filter(e=>$E(e,this.state.machineStatuses[e.id])).map(e=>e.id);await Promise.all(e.map(e=>this.refreshWorkspaceActivity(e)))}async loadClientConfig(){try{this.applyClientConfig((await Xa.config()).effectiveConfig)}catch(e){console.warn(`Failed to load PI WEB config`,e)}}applyClientConfig(e){this.shortcutConfig=e.shortcuts??{},this.workspaceUploadDefaultFolder=So(e)}async submitNormalAuth(e){let t=this.normalAuthDialogMode??this.normalAuthGateMode();if(!(t===void 0||this.normalAuthLoading)){this.normalAuthLoading=!0,this.normalAuthError=``;try{t===`setup`?await Za.setup(e.password):t===`change`?await Za.changePassword(e.currentPassword??``,e.password):await Za.login(e.password);let n=await Za.status();this.normalAuthStatus=n,this.normalAuthDialogMode=void 0,n.authenticated&&this.startAuthenticatedApp()}catch(e){this.normalAuthError=sD(e)}finally{this.normalAuthLoading=!1}}}normalAuthGateMode(){if(this.apiScope!==`management`&&this.normalAuthStatus?.authenticated!==!0)return this.normalAuthStatus?.configured===!0?`login`:`setup`}async refreshAppData(){if(!this.isRefreshingApp){this.isRefreshingApp=!0;try{await Promise.all([this.sessions.refreshSelectedSession(),this.refreshMachineActivities(),this.loadClientConfig(),this.refreshWorkspaceDeletionRuns(),this.refreshCurrentWorkspaceSurface(),this.workspaces.refreshSelectedProjectTopology()]),this.schedulePiWebStatusRefresh()}finally{this.isRefreshingApp=!1}}}async refreshCurrentWorkspaceSurface(){let 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(x_(),e),this.rememberCurrentMachineNavigation()}async restoreRouteFor(e,t,n=this.readWorkspaceRouteSurface(e),r){let i=R(this.state),a=e.projectId===void 0||e.projectId===``?iD():n,o=++this.routeRestoreSeq;this.routeRestoreDepth+=1,this.restoringRouteTerminalId=a.selectedTerminalId;try{await this.restoreRouteMachine(e,!1);let n=this.loadPluginsForSelectedMachine();if(e.tool?.startsWith(`machine.`)===!0&&await n,!this.isCurrentRouteRestore(o))return;if(this.setState({workspaceTool:e.tool??this.state.workspaceTool,mainView:this.appShell.normalizedMainView(r??e.view,e.sessionId!==void 0),selectedFilePath:a.selectedFilePath,selectedDiffPath:a.selectedDiffPath,selectedTerminalId:a.selectedTerminalId}),e.projectId===void 0||e.projectId===``){t&&this.updateUrl();return}if(this.routeMatchesCurrentSelection(e)){a.selectedTerminalId!==void 0&&this.rememberSelectedTerminal(a.selectedTerminalId),await this.refreshRestoredWorkspaceTool(e.tool,a.selectedFilePath),this.git.updatePolling(),t&&this.updateUrl();return}let i=this.state.projects.find(t=>t.id===e.projectId);if(!i){this.setState({selectedFilePath:void 0,selectedDiffPath:void 0,selectedTerminalId:void 0}),t&&this.updateUrl();return}if(await this.workspaces.selectProject(i,{workspaceId:e.workspaceId,sessionId:e.sessionId,updateUrl:!1}),!this.isCurrentRouteRestore(o))return;this.setState({selectedFilePath:a.selectedFilePath,selectedDiffPath:a.selectedDiffPath,selectedTerminalId:a.selectedTerminalId}),a.selectedTerminalId!==void 0&&this.rememberSelectedTerminal(a.selectedTerminalId),await this.refreshRestoredWorkspaceTool(e.tool,a.selectedFilePath),this.git.updatePolling(),t&&this.updateUrl()}finally{this.routeRestoreDepth=Math.max(0,this.routeRestoreDepth-1),this.routeRestoreDepth===0&&(this.restoringRouteTerminalId=void 0),R(this.state)!==i&&this.schedulePiWebStatusRefresh()}}isCurrentRouteRestore(e){return e===this.routeRestoreSeq}readWorkspaceRouteSurface(e){return e.projectId===void 0||e.projectId===``?iD():{selectedFilePath:us(zE,`file`),selectedDiffPath:us(BE,`diff`),selectedTerminalId:us(VE,`terminal`)}}routeForSelectedMachine(e){let 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){S_(e,{replace:!0}),ds(zE,`file`,void 0,{replace:!0}),ds(BE,`diff`,void 0,{replace:!0}),ds(VE,`terminal`,void 0,{replace:!0})}shouldDeferRemoteRouteRestore(e,t=this.state.machineStatuses[e.machineId??`local`]){let n=e.machineId??`local`,r=this.state.selectedMachine;return n===`local`||r?.id!==n||r.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=oD(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;let e=this.pendingRemoteRouteRestore;if(e!==void 0){if(!this.pendingRemoteRouteRestoreStillCurrent(e)){this.clearPendingRemoteRouteRestore();return}this.remoteRouteRestoreInProgress=!0;try{let t=e.machineId??`local`,n=await this.machines.refreshMachineHealth(t);if(!this.pendingRemoteRouteRestoreStillCurrent(e))return;if(n?.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>=PE.length){this.setRemoteRouteRestoreMessage(e,{exhausted:!0}),this.clearPendingRemoteRouteRestore();return}this.setRemoteRouteRestoreMessage(e),this.schedulePendingRemoteRouteRestore()}setRemoteRouteRestoreMessage(e,t={}){let n=e.machineId??`local`,r=this.state.machines.find(e=>e.id===n)?.name??this.state.selectedMachine?.name??`远程机器`,i=this.state.machineStatuses[n]?.error??(this.state.error===``?void 0:this.state.error),a=t.exhausted===!0?`${r} 仍不可用。`:`${r} 暂不可用,正在重新连接…`;this.setState({error:`${a}${i===void 0?``:` ${i}`}`})}pendingRemoteRouteRestoreStillCurrent(e){let t=e.machineId??`local`;return t!==`local`&&this.pendingRemoteRouteRestore===e&&this.state.selectedMachine?.id===t&&this.state.machines.some(e=>e.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){let n=e.machineId??`local`;if(this.state.selectedMachine?.id===n)return;let r=this.state.machines.find(e=>e.id===n);r!==void 0&&await this.machines.selectMachine(r,{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 lD(),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(){let e=this.previousStackedWorkspaceLayout,t=this.appShell.isStackedWorkspaceLayout;if(this.previousStackedWorkspaceLayout=t,e||!t)return;let n=this.appShell.normalizedMainView(this.state.mainView,this.state.selectedSession!==void 0);n!==this.state.mainView&&(this.setState({mainView:n}),this.updateUrl({replace:!0}))}updateUrl(e){this.rememberCurrentMachineNavigation(),S_({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(pf(this.state))}syncWorkspaceRouteSurfaceToUrl(){this.writeWorkspaceRouteSurfaceToUrl(pf(this.state).surface)}writeMachineNavigationSnapshotToUrl(e,t){S_(mf(e),t),this.writeWorkspaceRouteSurfaceToUrl(e.surface)}writeWorkspaceRouteSurfaceToUrl(e){ds(zE,`file`,e.selectedFilePath,{replace:!0}),ds(BE,`diff`,e.selectedDiffPath,{replace:!0}),ds(VE,`terminal`,e.selectedTerminalId,{replace:!0})}async selectMachineWithMemory(e,t={}){if(this.state.selectedMachine?.id===e.id)return;t.rememberCurrent!==!1&&!this.routeRestoreInProgress&&this.rememberCurrentMachineNavigation();let n=++this.machineNavigationRestoreSeq,r=this.machineNavigation.latest(e.id)??ff(e.id);if(await this.restoreRouteFor(mf(r),!1,r.surface,r.view),!(n!==this.machineNavigationRestoreSeq||this.state.selectedMachine?.id!==e.id)){if(this.shouldPreserveUnrestoredMachineNavigation(r)){this.machineNavigation.remember(r),this.writeMachineNavigationSnapshotToUrl(r);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=R(this.state)){let n=aD(t,e),r=this.terminalCommandRunRuntimes.get(n);if(r!==void 0)return r;let i=N_(e,{api:{runTerminalCommand:(e,n)=>oo.runTerminalCommand(e,n,t),listCommandRuns:e=>oo.listCommandRuns(e,t),getCommandRun:e=>oo.getCommandRun(e,t)},openTerminal:(e,n)=>{this.openRuntimeTerminal(t,e,n)}});return this.terminalCommandRunRuntimes.set(n,i),i}async openRuntimeTerminal(e,t,n){if((R(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:n?.terminalId},`core:workspace.terminal`),R(this.state)!==e)){this.setState({error:`找不到用于运行终端命令的机器`});return}this.openTerminal(n)}selectTerminal(e,t){this.rememberSelectedTerminal(e),this.setState({selectedTerminalId:e}),this.rememberCurrentMachineNavigation(),this.writeSelectedTerminalToUrl(e,t)}rememberSelectedTerminal(e){let 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){ds(VE,`terminal`,e,t)}terminalWorkspaceKey(e){return`${R(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,D_(e)}closeSettings(){this.settingsSection=void 0,D_(void 0)}navigateSettings(e){this.settingsSection=e,D_(e)}restoreSettingsRoute(){this.settingsSection=E_()}handleWorkspaceChange(e,t){if(e.selectedWorkspace?.id===t.selectedWorkspace?.id)return;this.terminalAutoStartWorkspaceId=void 0,this.activeTerminalIds.clear();let n=this.routeRestoreInProgress?this.restoringRouteTerminalId:t.selectedWorkspace===void 0?void 0:this.terminalSelection.latestTerminalId(this.terminalWorkspaceKey(t.selectedWorkspace));this.setState({activeTerminalCount:0,selectedTerminalId:n}),this.routeRestoreInProgress||(this.rememberCurrentMachineNavigation(),this.writeSelectedTerminalToUrl(n,{replace:!0})),this.sessions.updatePolling(),t.selectedWorkspace!==void 0&&(this.sessions.refreshPinnedSessions(t.selectedWorkspace.path,R(this.state)),this.refreshActiveTerminals(t.selectedWorkspace),this.refreshWorkspaceDeletionRuns(),this.refreshSelectedWorkspaceTool(t.workspaceTool),this.git.updatePolling())}syncSessionUnreadMachines(){if(!this.unreadConnected){this.sessionUnread.retainMachines(new Set);return}let e=new Set(this.state.machines.map(e=>e.id));this.sessionUnread.retainMachines(e);for(let t of e){let e=this.state.machineRuntimes[t];if(e===void 0)continue;let n=this.unreadRuntimeRefreshes.has(t)||!e.ok?`unknown`:`supported`;this.sessionUnread.setCapability(t,n)&&this.sessionUnread.refresh(t)}}async renegotiateUnreadMachines(){if(!this.unreadConnected)return;let e=new Set(this.state.machines.map(e=>e.id));e.add(R(this.state)),await Promise.all([...e].map(async e=>{await this.renegotiateUnreadMachine(e)}))}renegotiateUnreadMachine(e){let t=this.unreadRuntimeRefreshes.get(e);if(t!==void 0)return t;this.sessionUnread.setCapability(e,`unknown`);let n=!1,r=Promise.resolve().then(async()=>{n=await this.machines.refreshMachineRuntime(e)!==void 0});this.unreadRuntimeRefreshes.set(e,r);let i=()=>{this.unreadRuntimeRefreshes.get(e)===r&&(this.unreadRuntimeRefreshes.delete(e),this.unreadConnected&&(n?this.syncSessionUnreadMachines():this.sessionUnread.setCapability(e,`unknown`)))};return r.then(i,i),r}connectRealtime(){let e=R(this.state);this.realtime.connect(t=>{this.handleRealtimeEvent(e,t)},()=>{this.renegotiateUnreadMachine(e);let t=this.state.selectedWorkspace;t!==void 0&&this.refreshActiveTerminals(t),this.refreshWorkspaceActivity(e)},e)}syncMachineActivitySubscriptions(){let e=this.machineActivitySubscriptionIds();for(let[t,n]of this.machineRealtimeSockets.entries())e.has(t)||(n.close(),this.machineRealtimeSockets.delete(t));for(let t of e){if(this.machineRealtimeSockets.has(t))continue;let e=new Eu(this.apiScope);e.connect(e=>{this.handleMachineActivityEvent(t,e)},()=>{this.renegotiateUnreadMachine(t),this.refreshWorkspaceActivity(t)},t),this.machineRealtimeSockets.set(t,e)}}closeMachineActivitySockets(){for(let e of this.machineRealtimeSockets.values())e.close();this.machineRealtimeSockets.clear()}machineActivitySubscriptionIds(){let e=R(this.state);return new Set(this.state.machines.filter(t=>t.id!==e).filter(e=>QE(e,this.state.machineStatuses[e.id])).map(e=>e.id))}handleMachineActivityEvent(e,t){t.type===`sessions.unread`?this.sessionUnread.applyEvent(e,t):t.type===`workspace.activity`&&this.activity.applyWorkspaceActivity(t.activity,e)}handleRealtimeEvent(e,t){t.type===`sessions.unread`?this.sessionUnread.applyEvent(e,t):t.type===`workspace.activity`?this.activity.applyWorkspaceActivity(t.activity):rD(t)?(this.applyTerminalEvent(t),t.type===`terminal.exited`&&this.refreshWorkspaceDeletionRuns()):this.sessions.applyGlobalEvent(t)}applyTerminalEvent(e){let 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){if(this.apiScope===`management`)return;let t=R(this.state);try{let n=await oo.terminals(e.projectId,e.id,t);if(R(this.state)!==t||this.state.selectedWorkspace?.id!==e.id)return;this.activeTerminalIds.clear();for(let e of n)e.exited||this.activeTerminalIds.add(e.id);this.setState({activeTerminalCount:this.activeTerminalIds.size})}catch(e){this.setState({error:String(e)})}}handleActivityTransition(e,t){let n=nD(e),r=nD(t);n&&!r&&(this.setState({fileTreeStale:!0,gitStale:!0}),this.refreshSelectedWorkspaceTool(this.state.workspaceTool))}handleMachineChange(e,t){(e.selectedMachine?.id??`local`)!==(t.selectedMachine?.id??`local`)&&(this.projectActivityOwnership.handleSelectedMachineChanged(),(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.sessions.updatePolling(),this.git.updatePolling(),this.loadPluginsForSelectedMachine())}refreshSelectedWorkspaceTool(e){e===`core:workspace.files`&&this.files.refreshFiles(),e===`core:workspace.git`&&this.git.refreshGit()}renderWorkspacePanel(){let e=this.state.selectedWorkspace;return g`
|
|
4119
|
+
`,NE=900*1e3,PE=750,FE=[1e3,3e3,8e3,15e3,3e4],IE={capture:!0},LE=`auto:on`,RE=`auto:off`,zE=`theme:`,BE=cs(`core:workspace.files`),VE=cs(`core:workspace.git`),HE=cs(`core:workspace.terminal`),UE=320,WE=2,GE=`(min-width: 1181px)`,$=class extends y{constructor(...e){super(...e),this.state=Ho(),this.apiScope=qE(),this.sessionUnread=new xp({onChange:e=>{this.syncUnreadPresence(),R(this.state)===e&&(this.syncUnreadSessionIds(),this.syncSelectedSessionReadState())},onBackgroundError:(e,t,n)=>{console.warn(`Failed to ${e} session unread state for ${t}`,n)}}),this.unreadSessionIds=this.sessionUnread.unreadSessionIds(R(this.state),this.state.sessions),this.unreadPresence=kp,this.unreadConnected=!1,this.notifications=new Zd(()=>this.state,e=>{this.setState(e)},{onBackgroundError:(e,t)=>{console.warn(e,t)}}),this.sessions=new cd(()=>this.state,e=>{this.setState(e)},()=>{this.updateUrl()},new Xu,{socket:new Tu(this.apiScope),notifications:this.notifications,onSelectedSessionReady:({machineId:e,session:t})=>{this.commitReadyChatAfterRender(e,t)},replacePromptEditorText:async({machineId:e,sessionId:t,text:n})=>{await this.updateComplete,!(R(this.state)!==e||this.state.selectedSession?.id!==t)&&this.promptEditor?.replaceText(n)}}),this.projectActivityOwnership=new Vs(()=>this.state,e=>{this.setState(e)},{api:io,onError:({machineId:e,projectId:t,error:n})=>{console.warn(`Failed to discover project activity ownership for ${t} on ${e}`,n)}}),this.activity=new es(()=>this.state,e=>{this.setState(e)},{onActivityApplied:e=>{this.projectActivityOwnership.handleActivityApplied(e)}}),this.auth=new rs(()=>this.state,e=>{this.setState(e)},e=>{this.sessions.applySessionStatus(e)},{scope:this.apiScope}),this.workspaces=new of(()=>this.state,e=>{this.setState(e)},()=>{this.updateUrl()},this.sessions,new rf),this.projects=new Ns(()=>this.state,e=>{this.setState(e)},this.workspaces,{onProjectsApplied:e=>{this.projectActivityOwnership.handleProjectsApplied(e)}}),this.machines=new As(()=>this.state,e=>{this.setState(e)},()=>{this.updateUrl()},this.projects),this.piWebStatusController=new Us(()=>this.state,e=>{this.setState(e)},{onRefreshError:(e,t)=>{console.warn(`Failed to refresh PI WEB status for ${e}`,t)}}),this.files=new xs(()=>this.state,e=>{this.setState(e)},()=>{this.updateUrl()}),this.git=new ks(()=>this.state,e=>{this.setState(e)},()=>{this.updateUrl()}),this.keyboard=new kf,this.realtime=new Eu(this.apiScope),this.machineRealtimeSockets=new Map,this.unreadRuntimeRefreshes=new Map,this.activeTerminalIds=new Set,this.machineNavigation=new df,this.terminalSelection=new wf,this.appShell=new Fg(this),this.browserResume=new zg({onResumeSignal:()=>{this.handleBrowserResumeSignal()},refreshAfterResume:()=>this.refreshAfterBrowserResume(),onRefreshError:e=>{console.warn(`Failed to refresh after browser resume`,e)}}),this.panelCollapse=new t_(this),this.panelResize=new a_(this),this.navigationSections=new Qg(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=KE(),this.pluginLoads=new Tg((e,t)=>this.registerExternalPlugins(e,t),(e,t)=>this.plugins.shouldLoadRemotePlugin(e,t)),this.themePreference=Xp()??Kp,this.activeThemeId=Gp,this.isRefreshingApp=!1,this.sessionSearchDialogOpen=!1,this.settingsSection=E_(),this.normalAuthLoading=!0,this.normalAuthError=``,this.shortcutConfig={},this.workspaceUploadDefaultFolder=So(void 0),this.sessionWarningVisibility=zp(),this.authenticatedAppRunning=!1,this.normalAuthInitSeq=0,this.onPopState=()=>void this.withChatScrollTransition(async()=>{this.restoreSettingsRoute(),await this.restoreRoute(!1)}),this.onPageShow=()=>{this.renegotiateUnreadMachines(),this.appShell.repairViewportPosition(),this.retryPendingRemoteRouteRestoreSoon()},this.onSystemLightThemeChange=()=>{this.themePreference.auto&&this.applyPreferredTheme(!1)},this.previousStackedWorkspaceLayout=this.appShell.isStackedWorkspaceLayout,this.onKeyDown=e=>{this.settingsSection!==void 0||this.state.treeDialog!==void 0||this.keyboard.handle(e,this.getDefaultActions(),{shortcuts:this.shortcutConfig})&&(e.preventDefault(),e.stopPropagation())},this.parentSessionLocationFor=e=>tp(e,{workspaces:this.state.workspaces,workspacesByProjectId:this.state.workspacesByProjectId,projects:this.state.projects}),this.handleSendPrompt=(e,t,n,r)=>{this.sendPrompt(e,t,n,r)},this.handleStopActiveWork=()=>{this.sessions.stopActiveWork()},this.handleClearServerQueue=()=>{this.sessions.clearServerQueue()},this.handleDismissWarning=e=>{this.sessions.dismissWarning(e)},this.handleSubmitAsk=(e,t)=>this.sessions.submitAsk(e,t),this.handleAnswerDialog=(e,t)=>this.sessions.answerDialog(e,t),this.handleCancelDialog=e=>this.sessions.cancelDialog(e),this.handleDismissClosedDialog=e=>{this.sessions.dismissClosedDialog(e)},this.handleDismissNotification=e=>{this.notifications.dismissNotification(e)},this.handleDismissAllNotifications=()=>{this.notifications.dismissAll()},this.handleToggleWarnings=()=>{let e=Wp(this.sessionWarningVisibility);e!==this.sessionWarningVisibility&&(this.sessionWarningVisibility=e,this.requestUpdate())},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(),this.syncSessionWarningVisibility()}updated(){this.committedChatIdentity=XE(this.state),this.syncSelectedSessionReadState()}syncSessionWarningVisibility(){let e=this.state.selectedSession;this.sessionWarningVisibility=Vp(this.sessionWarningVisibility,e===void 0?void 0:Qo(R(this.state),e.id),this.state.status?.warnings)}syncSelectedSessionReadState(){let e=this.state.selectedSession;if(e===void 0)return;let t=R(this.state);this.isSessionSeen(t,e)&&this.sessionUnread.acknowledge(t,e)}markSessionsRead(e){let t=R(this.state);for(let n of e)this.sessionUnread.acknowledge(t,n)}async commitReadyChatAfterRender(e,t){let n=YE(e,t);await this.updateComplete,!(!this.unreadConnected||XE(this.state)!==n)&&(this.readyChatIdentity=n,this.syncSelectedSessionReadState())}syncUnreadSessionIds(){let e=this.sessionUnread.unreadSessionIds(R(this.state),this.state.sessions);nD(e,this.unreadSessionIds)||(this.unreadSessionIds=e)}syncUnreadPresence(){let e=Ap({machineIds:this.state.machines.map(e=>e.id),projectionFor:e=>this.sessionUnread.projection(e),selectedMachineId:R(this.state),projects:this.state.projects,workspaces:this.state.workspaces,workspacesByProjectId:this.state.workspacesByProjectId});Ip(e,this.unreadPresence)||(this.unreadPresence=e)}isSessionSeen(e,t){if(!this.unreadConnected)return!1;let n=YE(e,t);return XE(this.state)!==n||this.committedChatIdentity!==n||this.readyChatIdentity!==n||typeof document<`u`&&(document.visibilityState!==`visible`||typeof document.hasFocus==`function`&&!document.hasFocus())||this.isChatObscured()?!1:this.state.mainView===`chat`?!0:this.state.mainView===`navigation`?!this.appShell.isMobileNavigationLayout:this.isDesktopSideBySideLayout()}isChatObscured(){return this.settingsSection!==void 0||this.sessionCleanupDialog!==void 0||this.state.actionPaletteOpen||this.state.projectDialogOpen||this.state.machineDialogOpen||this.state.commandDialog!==void 0||this.state.treeDialog!==void 0||this.state.modelDialog!==void 0||this.state.thinkingDialog!==void 0||this.state.themeDialog!==void 0||this.state.authDialog!==void 0}connectedCallback(){super.connectedCallback(),this.normalAuthInitSeq+=1,window.addEventListener(`popstate`,this.onPopState),window.addEventListener(`pageshow`,this.onPageShow),this.browserResume.connect(),window.addEventListener(`keydown`,this.onKeyDown,IE),this.systemLightThemeMedia?.addEventListener(`change`,this.onSystemLightThemeChange),this.applyPreferredTheme(!1),this.initializeNormalAuth(this.normalAuthInitSeq)}startAuthenticatedApp(){!this.isConnected||this.authenticatedAppRunning||(this.authenticatedAppRunning=!0,this.connectRealtime(),this.renegotiateUnreadMachines(),this.piWebStatusTimer=window.setInterval(()=>{this.schedulePiWebStatusRefresh()},NE),this.refreshWorkspaceActivity(),this.loadClientConfig(),this.ensureGatewayPluginsLoaded(),this.loadProjectsAndRestoreRoute().finally(()=>{this.schedulePiWebStatusRefresh()}))}async initializeNormalAuth(e){if(this.apiScope===`management`){if(!this.isConnected||e!==this.normalAuthInitSeq)return;this.normalAuthStatus={configured:!0,authenticated:!0},this.normalAuthLoading=!1,this.startAuthenticatedApp();return}this.normalAuthLoading=!0,this.normalAuthError=``;try{let t=await Za.status();if(!this.isConnected||e!==this.normalAuthInitSeq)return;this.normalAuthStatus=t,t.authenticated&&this.startAuthenticatedApp()}catch(t){if(!this.isConnected||e!==this.normalAuthInitSeq)return;this.normalAuthError=`检查普通模式密码失败:${cD(t)}`}finally{this.isConnected&&e===this.normalAuthInitSeq&&(this.normalAuthLoading=!1)}}disconnectedCallback(){this.normalAuthInitSeq+=1,this.authenticatedAppRunning=!1,this.unreadConnected=!1,this.committedChatIdentity=void 0,this.readyChatIdentity=void 0,this.unreadRuntimeRefreshes.clear(),this.sessionUnread.retainMachines(new Set),window.removeEventListener(`popstate`,this.onPopState),window.removeEventListener(`pageshow`,this.onPageShow),this.browserResume.disconnect(),window.removeEventListener(`keydown`,this.onKeyDown,IE),this.systemLightThemeMedia?.removeEventListener(`change`,this.onSystemLightThemeChange),this.keyboard.reset(),this.auth.dispose(),this.sessions.dispose(),this.notifications.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(!tD(this.state,e))return;let t=this.state;this.state={...this.state,...e},XE(t)!==XE(this.state)&&(this.committedChatIdentity=void 0,this.readyChatIdentity=void 0),ZE(t,this.state)&&this.syncSessionUnreadMachines(),this.syncUnreadSessionIds(),this.syncUnreadPresence(),this.handleActivityTransition(t,this.state),this.handleWorkspaceChange(t,this.state),this.handleMachineChange(t,this.state),QE(t,this.state)&&this.syncMachineActivitySubscriptions(),this.notifications.syncEnvironment(t,this.state)}async loadProjectsAndRestoreRoute(){this.restoreSettingsRoute();let e=x_();await this.machines.loadMachines(e.machineId);let t=this.routeForSelectedMachine(e),n=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,n)?this.deferRemoteRouteRestore(t):(this.clearPendingRemoteRouteRestore(),this.rememberCurrentMachineNavigation()),await this.refreshWorkspaceDeletionRuns()}handleBrowserResumeSignal(){this.appShell.repairViewportPosition(),this.schedulePiWebStatusRefresh(),this.retryPendingRemoteRouteRestoreSoon()}async refreshAfterBrowserResume(){await this.renegotiateUnreadMachines(),await Promise.all([this.sessions.refreshSelectedSession(),this.refreshMachineActivities(),this.refreshWorkspaceDeletionRuns(),this.workspaces.refreshSelectedProjectTopology()])}schedulePiWebStatusRefresh(e=PE){this.clearScheduledPiWebStatusRefresh(),this.piWebStatusDeferredTimer=window.setTimeout(()=>{this.piWebStatusDeferredTimer=void 0,this.piWebStatusController.refresh()},e)}clearScheduledPiWebStatusRefresh(){this.piWebStatusDeferredTimer!==void 0&&(window.clearTimeout(this.piWebStatusDeferredTimer),this.piWebStatusDeferredTimer=void 0)}async refreshWorkspaceActivity(e=R(this.state)){try{await this.activity.refresh(e)}catch(t){console.warn(`Failed to refresh workspace activity for ${e}`,t)}}async refreshMachineActivities(){let e=this.state.machines.length===0?[R(this.state)]:this.state.machines.filter(e=>eD(e,this.state.machineStatuses[e.id])).map(e=>e.id);await Promise.all(e.map(e=>this.refreshWorkspaceActivity(e)))}async loadClientConfig(){try{this.applyClientConfig((await Xa.config()).effectiveConfig)}catch(e){console.warn(`Failed to load PI WEB config`,e)}}applyClientConfig(e){this.shortcutConfig=e.shortcuts??{},this.workspaceUploadDefaultFolder=So(e)}async submitNormalAuth(e){let t=this.normalAuthDialogMode??this.normalAuthGateMode();if(!(t===void 0||this.normalAuthLoading)){this.normalAuthLoading=!0,this.normalAuthError=``;try{t===`setup`?await Za.setup(e.password):t===`change`?await Za.changePassword(e.currentPassword??``,e.password):await Za.login(e.password);let n=await Za.status();this.normalAuthStatus=n,this.normalAuthDialogMode=void 0,n.authenticated&&this.startAuthenticatedApp()}catch(e){this.normalAuthError=cD(e)}finally{this.normalAuthLoading=!1}}}normalAuthGateMode(){if(this.apiScope!==`management`&&this.normalAuthStatus?.authenticated!==!0)return this.normalAuthStatus?.configured===!0?`login`:`setup`}async refreshAppData(){if(!this.isRefreshingApp){this.isRefreshingApp=!0;try{await Promise.all([this.sessions.refreshSelectedSession(),this.refreshMachineActivities(),this.loadClientConfig(),this.refreshWorkspaceDeletionRuns(),this.refreshCurrentWorkspaceSurface(),this.workspaces.refreshSelectedProjectTopology()]),this.schedulePiWebStatusRefresh()}finally{this.isRefreshingApp=!1}}}async refreshCurrentWorkspaceSurface(){let 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(x_(),e),this.rememberCurrentMachineNavigation()}async restoreRouteFor(e,t,n=this.readWorkspaceRouteSurface(e),r){let i=R(this.state),a=e.projectId===void 0||e.projectId===``?aD():n,o=++this.routeRestoreSeq;this.routeRestoreDepth+=1,this.restoringRouteTerminalId=a.selectedTerminalId;try{await this.restoreRouteMachine(e,!1);let n=this.loadPluginsForSelectedMachine();if(e.tool?.startsWith(`machine.`)===!0&&await n,!this.isCurrentRouteRestore(o))return;if(this.setState({workspaceTool:e.tool??this.state.workspaceTool,mainView:this.appShell.normalizedMainView(r??e.view,e.sessionId!==void 0),selectedFilePath:a.selectedFilePath,selectedDiffPath:a.selectedDiffPath,selectedTerminalId:a.selectedTerminalId}),e.projectId===void 0||e.projectId===``){t&&this.updateUrl();return}if(this.routeMatchesCurrentSelection(e)){a.selectedTerminalId!==void 0&&this.rememberSelectedTerminal(a.selectedTerminalId),await this.refreshRestoredWorkspaceTool(e.tool,a.selectedFilePath),this.git.updatePolling(),t&&this.updateUrl();return}let i=this.state.projects.find(t=>t.id===e.projectId);if(!i){this.setState({selectedFilePath:void 0,selectedDiffPath:void 0,selectedTerminalId:void 0}),t&&this.updateUrl();return}if(await this.workspaces.selectProject(i,{workspaceId:e.workspaceId,sessionId:e.sessionId,updateUrl:!1}),!this.isCurrentRouteRestore(o))return;this.setState({selectedFilePath:a.selectedFilePath,selectedDiffPath:a.selectedDiffPath,selectedTerminalId:a.selectedTerminalId}),a.selectedTerminalId!==void 0&&this.rememberSelectedTerminal(a.selectedTerminalId),await this.refreshRestoredWorkspaceTool(e.tool,a.selectedFilePath),this.git.updatePolling(),t&&this.updateUrl()}finally{this.routeRestoreDepth=Math.max(0,this.routeRestoreDepth-1),this.routeRestoreDepth===0&&(this.restoringRouteTerminalId=void 0),R(this.state)!==i&&this.schedulePiWebStatusRefresh()}}isCurrentRouteRestore(e){return e===this.routeRestoreSeq}readWorkspaceRouteSurface(e){return e.projectId===void 0||e.projectId===``?aD():{selectedFilePath:us(BE,`file`),selectedDiffPath:us(VE,`diff`),selectedTerminalId:us(HE,`terminal`)}}routeForSelectedMachine(e){let 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){S_(e,{replace:!0}),ds(BE,`file`,void 0,{replace:!0}),ds(VE,`diff`,void 0,{replace:!0}),ds(HE,`terminal`,void 0,{replace:!0})}shouldDeferRemoteRouteRestore(e,t=this.state.machineStatuses[e.machineId??`local`]){let n=e.machineId??`local`,r=this.state.selectedMachine;return n===`local`||r?.id!==n||r.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=sD(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;let e=this.pendingRemoteRouteRestore;if(e!==void 0){if(!this.pendingRemoteRouteRestoreStillCurrent(e)){this.clearPendingRemoteRouteRestore();return}this.remoteRouteRestoreInProgress=!0;try{let t=e.machineId??`local`,n=await this.machines.refreshMachineHealth(t);if(!this.pendingRemoteRouteRestoreStillCurrent(e))return;if(n?.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>=FE.length){this.setRemoteRouteRestoreMessage(e,{exhausted:!0}),this.clearPendingRemoteRouteRestore();return}this.setRemoteRouteRestoreMessage(e),this.schedulePendingRemoteRouteRestore()}setRemoteRouteRestoreMessage(e,t={}){let n=e.machineId??`local`,r=this.state.machines.find(e=>e.id===n)?.name??this.state.selectedMachine?.name??`远程机器`,i=this.state.machineStatuses[n]?.error??(this.state.error===``?void 0:this.state.error),a=t.exhausted===!0?`${r} 仍不可用。`:`${r} 暂不可用,正在重新连接…`;this.setState({error:`${a}${i===void 0?``:` ${i}`}`})}pendingRemoteRouteRestoreStillCurrent(e){let t=e.machineId??`local`;return t!==`local`&&this.pendingRemoteRouteRestore===e&&this.state.selectedMachine?.id===t&&this.state.machines.some(e=>e.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){let n=e.machineId??`local`;if(this.state.selectedMachine?.id===n)return;let r=this.state.machines.find(e=>e.id===n);r!==void 0&&await this.machines.selectMachine(r,{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 uD(),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(){let e=this.previousStackedWorkspaceLayout,t=this.appShell.isStackedWorkspaceLayout;if(this.previousStackedWorkspaceLayout=t,e||!t)return;let n=this.appShell.normalizedMainView(this.state.mainView,this.state.selectedSession!==void 0);n!==this.state.mainView&&(this.setState({mainView:n}),this.updateUrl({replace:!0}))}updateUrl(e){this.rememberCurrentMachineNavigation(),S_({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(pf(this.state))}syncWorkspaceRouteSurfaceToUrl(){this.writeWorkspaceRouteSurfaceToUrl(pf(this.state).surface)}writeMachineNavigationSnapshotToUrl(e,t){S_(mf(e),t),this.writeWorkspaceRouteSurfaceToUrl(e.surface)}writeWorkspaceRouteSurfaceToUrl(e){ds(BE,`file`,e.selectedFilePath,{replace:!0}),ds(VE,`diff`,e.selectedDiffPath,{replace:!0}),ds(HE,`terminal`,e.selectedTerminalId,{replace:!0})}async selectMachineWithMemory(e,t={}){if(this.state.selectedMachine?.id===e.id)return;t.rememberCurrent!==!1&&!this.routeRestoreInProgress&&this.rememberCurrentMachineNavigation();let n=++this.machineNavigationRestoreSeq,r=this.machineNavigation.latest(e.id)??ff(e.id);if(await this.restoreRouteFor(mf(r),!1,r.surface,r.view),!(n!==this.machineNavigationRestoreSeq||this.state.selectedMachine?.id!==e.id)){if(this.shouldPreserveUnrestoredMachineNavigation(r)){this.machineNavigation.remember(r),this.writeMachineNavigationSnapshotToUrl(r);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=R(this.state)){let n=oD(t,e),r=this.terminalCommandRunRuntimes.get(n);if(r!==void 0)return r;let i=N_(e,{api:{runTerminalCommand:(e,n)=>oo.runTerminalCommand(e,n,t),listCommandRuns:e=>oo.listCommandRuns(e,t),getCommandRun:e=>oo.getCommandRun(e,t)},openTerminal:(e,n)=>{this.openRuntimeTerminal(t,e,n)}});return this.terminalCommandRunRuntimes.set(n,i),i}async openRuntimeTerminal(e,t,n){if((R(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:n?.terminalId},`core:workspace.terminal`),R(this.state)!==e)){this.setState({error:`找不到用于运行终端命令的机器`});return}this.openTerminal(n)}selectTerminal(e,t){this.rememberSelectedTerminal(e),this.setState({selectedTerminalId:e}),this.rememberCurrentMachineNavigation(),this.writeSelectedTerminalToUrl(e,t)}rememberSelectedTerminal(e){let 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){ds(HE,`terminal`,e,t)}terminalWorkspaceKey(e){return`${R(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,D_(e)}closeSettings(){this.settingsSection=void 0,D_(void 0)}navigateSettings(e){this.settingsSection=e,D_(e)}restoreSettingsRoute(){this.settingsSection=E_()}handleWorkspaceChange(e,t){if(e.selectedWorkspace?.id===t.selectedWorkspace?.id)return;this.terminalAutoStartWorkspaceId=void 0,this.activeTerminalIds.clear();let n=this.routeRestoreInProgress?this.restoringRouteTerminalId:t.selectedWorkspace===void 0?void 0:this.terminalSelection.latestTerminalId(this.terminalWorkspaceKey(t.selectedWorkspace));this.setState({activeTerminalCount:0,selectedTerminalId:n}),this.routeRestoreInProgress||(this.rememberCurrentMachineNavigation(),this.writeSelectedTerminalToUrl(n,{replace:!0})),this.sessions.updatePolling(),t.selectedWorkspace!==void 0&&(this.sessions.refreshPinnedSessions(t.selectedWorkspace.path,R(this.state)),this.refreshActiveTerminals(t.selectedWorkspace),this.refreshWorkspaceDeletionRuns(),this.refreshSelectedWorkspaceTool(t.workspaceTool),this.git.updatePolling())}syncSessionUnreadMachines(){if(!this.unreadConnected){this.sessionUnread.retainMachines(new Set);return}let e=new Set(this.state.machines.map(e=>e.id));this.sessionUnread.retainMachines(e);for(let t of e){let e=this.state.machineRuntimes[t];if(e===void 0)continue;let n=this.unreadRuntimeRefreshes.has(t)||!e.ok?`unknown`:`supported`;this.sessionUnread.setCapability(t,n)&&this.sessionUnread.refresh(t)}}async renegotiateUnreadMachines(){if(!this.unreadConnected)return;let e=new Set(this.state.machines.map(e=>e.id));e.add(R(this.state)),await Promise.all([...e].map(async e=>{await this.renegotiateUnreadMachine(e)}))}renegotiateUnreadMachine(e){let t=this.unreadRuntimeRefreshes.get(e);if(t!==void 0)return t;this.sessionUnread.setCapability(e,`unknown`);let n=!1,r=Promise.resolve().then(async()=>{n=await this.machines.refreshMachineRuntime(e)!==void 0});this.unreadRuntimeRefreshes.set(e,r);let i=()=>{this.unreadRuntimeRefreshes.get(e)===r&&(this.unreadRuntimeRefreshes.delete(e),this.unreadConnected&&(n?this.syncSessionUnreadMachines():this.sessionUnread.setCapability(e,`unknown`)))};return r.then(i,i),r}connectRealtime(){let e=R(this.state);this.realtime.connect(t=>{this.handleRealtimeEvent(e,t)},()=>{this.renegotiateUnreadMachine(e);let t=this.state.selectedWorkspace;t!==void 0&&this.refreshActiveTerminals(t),this.refreshWorkspaceActivity(e)},e)}syncMachineActivitySubscriptions(){let e=this.machineActivitySubscriptionIds();for(let[t,n]of this.machineRealtimeSockets.entries())e.has(t)||(n.close(),this.machineRealtimeSockets.delete(t));for(let t of e){if(this.machineRealtimeSockets.has(t))continue;let e=new Eu(this.apiScope);e.connect(e=>{this.handleMachineActivityEvent(t,e)},()=>{this.renegotiateUnreadMachine(t),this.refreshWorkspaceActivity(t)},t),this.machineRealtimeSockets.set(t,e)}}closeMachineActivitySockets(){for(let e of this.machineRealtimeSockets.values())e.close();this.machineRealtimeSockets.clear()}machineActivitySubscriptionIds(){let e=R(this.state);return new Set(this.state.machines.filter(t=>t.id!==e).filter(e=>$E(e,this.state.machineStatuses[e.id])).map(e=>e.id))}handleMachineActivityEvent(e,t){t.type===`sessions.unread`?this.sessionUnread.applyEvent(e,t):t.type===`workspace.activity`&&this.activity.applyWorkspaceActivity(t.activity,e)}handleRealtimeEvent(e,t){t.type===`sessions.unread`?this.sessionUnread.applyEvent(e,t):t.type===`workspace.activity`?this.activity.applyWorkspaceActivity(t.activity):iD(t)?(this.applyTerminalEvent(t),t.type===`terminal.exited`&&this.refreshWorkspaceDeletionRuns()):this.sessions.applyGlobalEvent(t)}applyTerminalEvent(e){let 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){if(this.apiScope===`management`)return;let t=R(this.state);try{let n=await oo.terminals(e.projectId,e.id,t);if(R(this.state)!==t||this.state.selectedWorkspace?.id!==e.id)return;this.activeTerminalIds.clear();for(let e of n)e.exited||this.activeTerminalIds.add(e.id);this.setState({activeTerminalCount:this.activeTerminalIds.size})}catch(e){this.setState({error:String(e)})}}handleActivityTransition(e,t){let n=rD(e),r=rD(t);n&&!r&&(this.setState({fileTreeStale:!0,gitStale:!0}),this.refreshSelectedWorkspaceTool(this.state.workspaceTool))}handleMachineChange(e,t){(e.selectedMachine?.id??`local`)!==(t.selectedMachine?.id??`local`)&&(this.projectActivityOwnership.handleSelectedMachineChanged(),(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.sessions.updatePolling(),this.git.updatePolling(),this.loadPluginsForSelectedMachine())}refreshSelectedWorkspaceTool(e){e===`core:workspace.files`&&this.files.refreshFiles(),e===`core:workspace.git`&&this.git.refreshGit()}renderWorkspacePanel(){let e=this.state.selectedWorkspace;return g`
|
|
4120
4120
|
<workspace-panel
|
|
4121
4121
|
id="workspace-panel"
|
|
4122
4122
|
.workspace=${e}
|
|
@@ -4162,7 +4162,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
4162
4162
|
.onResizeEnd=${()=>{this.panelResize.persistPanelSizes()}}
|
|
4163
4163
|
.onReset=${()=>{this.resetResizablePanel(`workspace`)}}
|
|
4164
4164
|
></app-panel-edge-control>
|
|
4165
|
-
`}startPanelResize(e){return e===`navigation`?this.panelCollapse.expandNavigationPanel():this.panelCollapse.expandWorkspacePanel(),this.measuredPanelWidth(e)??this.panelResize.panelWidth(e)}resizablePanelConstraints(e){let t=this.panelResize.constraints(e);return{...t,maxWidth:this.resizablePanelMaxWidth(e,t)}}resizablePanelMaxWidth(e,t){let n=this.getBoundingClientRect().width||(typeof window>`u`?0:window.innerWidth);if(n<=0)return t.maxWidth;let r=this.oppositeResizablePanelWidth(e),i=Math.floor(n-r-UE
|
|
4165
|
+
`}startPanelResize(e){return e===`navigation`?this.panelCollapse.expandNavigationPanel():this.panelCollapse.expandWorkspacePanel(),this.measuredPanelWidth(e)??this.panelResize.panelWidth(e)}resizablePanelConstraints(e){let t=this.panelResize.constraints(e);return{...t,maxWidth:this.resizablePanelMaxWidth(e,t)}}resizablePanelMaxWidth(e,t){let n=this.getBoundingClientRect().width||(typeof window>`u`?0:window.innerWidth);if(n<=0)return t.maxWidth;let r=this.oppositeResizablePanelWidth(e),i=Math.floor(n-r-WE-UE);return Math.max(t.minWidth,Math.min(t.maxWidth,i))}oppositeResizablePanelWidth(e){let 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)||window.matchMedia(GE).matches}measuredPanelWidth(e){let t=(e===`navigation`?this.navigationPanelFrame:this.workspacePanelFrame)?.getBoundingClientRect().width;return t===void 0||t<=0?void 0:t}resetResizablePanel(e){this.panelResize.resetPanel(e)}resetResizablePanels(){this.panelResize.resetPanels()}canDeleteArchivedSessions(){return!0}canReloadSessions(){return this.selectedMachineRuntime()?.ok===!0}canClearServerQueue(){return this.selectedMachineRuntime()?.ok===!0}canCleanupSessions(){let e=this.selectedMachineRuntime();return this.apiScope===`management`&&this.state.selectedProject===void 0?!1:e?.ok===!0}hasAuthoritativeSessionPersistence(){return Lu(this.selectedMachineRuntime())}supportsWorkspaceFileSuggestions(e=R(this.state)){return e===`local`||this.state.machineRuntimes[e]?.ok===!0}archivedDeleteUnavailableMessage(){return`请更新并重启 ${this.state.selectedMachine?.name??`此机器`} 上的 Pi-Web 后再删除已归档会话。`}sessionCleanupUnavailableMessage(){return gp(this.state.selectedMachine?.name)}selectedMachineRuntime(){return this.state.machineRuntimes[R(this.state)]}openSessionCleanupDialog(){this.sessionCleanupDialog={error:``}}openSessionSearchDialog(){this.sessions.searchSessions(``),this.sessionSearchDialogOpen=!0}closeSessionSearchDialog(){this.sessionSearchDialogOpen=!1,this.sessions.searchSessions(``)}async selectSessionSearchMatch(e,t){let n=this.state.sessionSearchQuery.trim();this.sessionSearchDialogOpen=!1,await this.selectNavigationItem(`sessions`,`chat`,()=>this.sessions.selectSearchMatch(e,t,n))}closeSessionCleanupDialog(){this.sessionCleanupDialog=void 0}async previewSessionCleanup(e){let t=this.sessionCleanupRequestForCurrentProject(e);if(!this.canCleanupSessions()){this.sessionCleanupDialog={...this.sessionCleanupDialog??{},error:this.sessionCleanupUnavailableMessage(),preview:void 0,previewRequest:void 0,result:void 0,loading:!1};return}let n=R(this.state);this.sessionCleanupDialog={...this.sessionCleanupDialog??{},loading:!0,error:``,preview:void 0,previewRequest:void 0,result:void 0};try{let e=await ao.cleanupPreview(t,n);if(R(this.state)!==n)return;this.sessionCleanupDialog={...this.sessionCleanupDialog,preview:e,previewRequest:t,result:void 0,loading:!1,error:``}}catch(e){R(this.state)===n&&(this.sessionCleanupDialog={...this.sessionCleanupDialog,loading:!1,error:`预览清理失败:${cD(e)}`})}}async runSessionCleanup(e){let t=this.sessionCleanupRequestForCurrentProject(e),n=this.sessionCleanupDialog;if(n?.preview===void 0||lp(n.previewRequest)!==lp(t)){this.sessionCleanupDialog={...n??{},error:`运行清理前请先预览。`};return}if(!this.canCleanupSessions()){this.sessionCleanupDialog={...n,error:this.sessionCleanupUnavailableMessage(),running:!1};return}let r=R(this.state);this.sessionCleanupDialog={...n,running:!0,error:``};try{let e=await ao.cleanup(t,r);if(R(this.state)!==r)return;this.sessionCleanupDialog={...this.sessionCleanupDialog,preview:e,previewRequest:t,result:e,running:!1,error:``},await this.sessions.applySessionCleanupResult(e,r)}catch(e){R(this.state)===r&&(this.sessionCleanupDialog={...this.sessionCleanupDialog,running:!1,error:`运行清理失败:${cD(e)}`})}}sessionCleanupRequestForCurrentProject(e){if(this.apiScope!==`management`)return e;let t=this.state.selectedProject,n=t===void 0?[]:this.state.workspaces.filter(e=>e.projectId===t.id).map(e=>e.path),r=e.projectCwds??n,i=new Set(n);return{...e,projectId:t?.id??``,projectCwds:r.filter(e=>i.has(e))}}renderNavigationPanel(){return g`
|
|
4166
4166
|
<app-navigation-panel
|
|
4167
4167
|
.machines=${this.state.machines}
|
|
4168
4168
|
.selectedMachine=${this.state.selectedMachine}
|
|
@@ -4233,14 +4233,14 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
4233
4233
|
.onFocusNavigationTarget=${e=>{this.focusNavigationTarget(e)}}
|
|
4234
4234
|
.onCancelKeyboardNavigation=${()=>{this.focusChatComposer()}}
|
|
4235
4235
|
></app-navigation-panel>
|
|
4236
|
-
`}openNavigationSection(e){this.navigationSections.open(e,()=>{this.selectMainView(`navigation`)})}async selectNavigationItem(e,t,n){let r=++this.navigationSelectionSeq,i=()=>r===this.navigationSelectionSeq;await this.withChatScrollTransition(async()=>{this.navigationSections.advanceAfterSelection(e),await n()},i),i()&&await this.focusNavigationTarget(t)}async goToParentSession(e){e.kind===`workspace`&&await this.selectNavigationItem(`sessions`,`chat`,async()=>{let t=this.state.workspaces.find(t=>t.id===e.workspaceId);if(t!==void 0){await this.workspaces.selectWorkspace(t,{sessionId:e.sessionId});return}let n=this.state.projects.find(t=>t.id===e.projectId);n!==void 0&&await this.workspaces.selectProject(n,{workspaceId:e.workspaceId,sessionId:e.sessionId})})}async startSessionFromNavigation(){let e=++this.navigationSelectionSeq;this.navigationSections.advanceAfterSelection(`sessions`),await this.startSessionAndOpenChat(()=>e===this.navigationSelectionSeq)}async startSessionAndOpenChat(e=()=>!0){this.sessions.startSession().catch(t=>{e()&&this.setState({error:String(t)})}),e()&&await this.focusChatComposer()}async focusNavigationTarget(e){if(e===`chat`){await this.focusChatComposer();return}await this.focusNavigationSection(e)}async focusNavigationSection(e){if(e===`machines`&&!
|
|
4236
|
+
`}openNavigationSection(e){this.navigationSections.open(e,()=>{this.selectMainView(`navigation`)})}async selectNavigationItem(e,t,n){let r=++this.navigationSelectionSeq,i=()=>r===this.navigationSelectionSeq;await this.withChatScrollTransition(async()=>{this.navigationSections.advanceAfterSelection(e),await n()},i),i()&&await this.focusNavigationTarget(t)}async goToParentSession(e){e.kind===`workspace`&&await this.selectNavigationItem(`sessions`,`chat`,async()=>{let t=this.state.workspaces.find(t=>t.id===e.workspaceId);if(t!==void 0){await this.workspaces.selectWorkspace(t,{sessionId:e.sessionId});return}let n=this.state.projects.find(t=>t.id===e.projectId);n!==void 0&&await this.workspaces.selectProject(n,{workspaceId:e.workspaceId,sessionId:e.sessionId})})}async startSessionFromNavigation(){let e=++this.navigationSelectionSeq;this.navigationSections.advanceAfterSelection(`sessions`),await this.startSessionAndOpenChat(()=>e===this.navigationSelectionSeq)}async startSessionAndOpenChat(e=()=>!0){this.sessions.startSession().catch(t=>{e()&&this.setState({error:String(t)})}),e()&&await this.focusChatComposer()}async focusNavigationTarget(e){if(e===`chat`){await this.focusChatComposer();return}await this.focusNavigationSection(e)}async focusNavigationSection(e){if(e===`machines`&&!wE(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 uD(),await this.navigationPanel?.focusSection(e)}async focusChatComposer(){this.state.mainView!==`chat`&&this.selectMainView(`chat`),await this.updateComplete,await uD(),this.promptEditor?.focusInput()}async navigateSessionTree(e,t){let n=R(this.state),r=this.state.selectedSession?.id,i=await this.sessions.navigateTree(e,t);return!i.cancelled&&r!==void 0&&R(this.state)===n&&this.state.selectedSession?.id===r&&await this.focusChatComposer(),i}closeSessionTreeNavigator(){this.sessions.closeTreeDialog(),this.focusChatComposer()}renderSessionTreeNavigator(e){return e.treeDialog===void 0?null:g`
|
|
4237
4237
|
<session-tree-navigator
|
|
4238
4238
|
.tree=${e.treeDialog}
|
|
4239
4239
|
.onNavigate=${(e,t)=>this.navigateSessionTree(e,t)}
|
|
4240
4240
|
.onAbort=${()=>this.sessions.abortTreeNavigation()}
|
|
4241
4241
|
.onCancel=${()=>{this.closeSessionTreeNavigator()}}
|
|
4242
4242
|
></session-tree-navigator>
|
|
4243
|
-
`}visibleWorkspacePanels(){let e=this.state.selectedWorkspace;if(e===void 0)return[];let t=this.createWorkspacePanelContext(e);return this.plugins.getWorkspacePanels().filter(e=>e.visible?.(t)??!0)}workspacePanelEmptyState(){let 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){let 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){let t=qE(this.state);return{machine:t,workspace:e,state:this.state,files:this.createWorkspaceFiles(e,t.id),host:this.createWorkspaceHost()}}createWorkspaceFiles(e,t){return{readFile:n=>io.workspaceFile(e.projectId,e.id,n,t),readOptionalFile:n=>io.optionalWorkspaceFile(e.projectId,e.id,n,t),listFiles:n=>io.workspaceTree(e.projectId,e.id,n,t),writeFile:async(n,r,i)=>{let a=await io.writeWorkspaceFile(e.projectId,e.id,n,r,i,t);return this.files.refreshFiles(),a},deleteFile:async n=>{let r=await io.deleteWorkspaceFile(e.projectId,e.id,n,t);return this.files.refreshFiles(),r},moveFile:async(n,r,i)=>{let a=await io.moveWorkspaceFile(e.projectId,e.id,n,r,i,t);return this.files.refreshFiles(),a}}}createWorkspaceHost(){return{requestRender:()=>{this.requestUpdate()}}}createWorkspacePanelContext(e){let t=qE(this.state),n=t.id,r=i=>{let a=this.terminalCommandRunsForOrigin(i,n);return sg({machine:t,workspace:e,state:this.state,files:this.createWorkspaceFiles(e,n),prompt:this.createPromptEditor(),terminal:{open:t=>{this.openRuntimeTerminal(n,e,t)},runCommand:t=>a.runCommand({...t,workspace:e})},openTerminal:t=>{this.openRuntimeTerminal(n,e,t)},host:this.createWorkspaceHost(),piWebUnstable:{terminalCommandRuns:a},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:Co(e.effectiveConfig,this.workspaceUploadDefaultFolder),onRefreshFiles:()=>{this.files.refreshFiles()},onCreateFile:e=>{this.files.createFile(e)},onCreateDirectory:e=>{this.files.createDirectory(e)},onMoveSelectedPath:e=>{this.files.moveSelectedPath(e)},onDeleteSelectedPath:()=>{this.files.deleteSelectedPath()},onDownloadSelectedFile:()=>{this.files.downloadSelectedFile()},onExpandDir:e=>{this.files.expandDir(e)},onSelectDirectory:e=>{this.files.selectDirectory(e)},onSelectFile:e=>{this.files.selectFile(e)},onStartWorkspaceUpload:(e,t)=>this.files.startWorkspaceUpload(e,t),onCancelWorkspaceUpload:e=>{this.files.cancelWorkspaceUpload(e)},onClearWorkspaceUpload:e=>{this.files.clearWorkspaceUpload(e)},onRefreshGit:()=>{this.git.refreshGit()},onSelectDiff:e=>{this.git.selectDiff(e)},onSelectTerminal:(e,t)=>{this.selectTerminal(e,t)}},r)};return r(`core`)}getActions(){return A_(this.getDefaultActions(),this.shortcutConfig)}getDefaultActions(){return[...this.plugins.getActions(this.createPluginRuntimeContext()),...this.normalAuthActions(),...this.sessionActions(),...this.navigationFocusActions(),...this.panelLayoutActions()]}normalAuthActions(){return this.apiScope===`management`?[]:[{id:`app.normal-auth.change-password`,title:`修改普通模式密码`,description:`更改进入普通模式所需的本地密码`,group:`偏好设置`,enabled:this.normalAuthStatus?.authenticated===!0,run:()=>{this.normalAuthDialogMode=`change`,this.normalAuthError=``}}]}sessionActions(){return[{id:`app.sessions.cleanup`,title:`清理会话`,description:`预览并手动清理所选机器上的空闲或已归档会话`,group:`会话`,...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.pluginLoads.ensureGatewayLoaded().then(()=>void 0)}async loadPluginsForSelectedMachine(){let e=this.state.selectedMachine;e?.kind===`remote`&&await this.loadPluginsForMachine(e)}async loadPluginsForMachine(e){await this.pluginLoads.loadForMachine(e)}async registerExternalPlugins(e,t){try{let e=await t();for(let t of e)try{this.plugins.register(t)}catch(e){console.warn(`Failed to register PI WEB plugin ${t.id}`,e)}return this.applyPreferredTheme(!1),this.requestUpdate(),!0}catch(t){return console.warn(`Failed to load ${e}`,t),!1}}createPromptEditor(){return{insertText:e=>{let t=this.promptEditor?.view;if(!t)return;t.hasFocus||t.focus();let n=t.state.selection.main;t.dispatch({changes:{from:n.from,to:n.to,insert:e},selection:{anchor:n.from+e.length}})},getText:()=>this.promptEditor?.view?.state.doc.toString()??``,getSelection:()=>{let e=this.promptEditor?.view;if(!e)return null;let t=e.state.selection.main;return t.empty?null:{start:t.from,end:t.to,text:e.state.sliceDoc(t.from,t.to)}}}}createPluginRuntimeContext(){let e=t=>og({state:this.state,prompt:this.createPromptEditor(),piWebUnstable:{terminalCommandRuns:this.terminalCommandRunsForOrigin(t),openSettings:e=>{this.openSettings(e)}},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()},openModelPicker:()=>this.openModelDialog(),openThinkingLevelPicker:()=>this.openThinkingDialog(),selectMainView:e=>{this.selectMainView(e)},selectWorkspaceTool:e=>{this.openWorkspaceTool(e)},openTerminal:e=>{this.openTerminal(e)},refreshFiles:()=>this.files.refreshFiles(),refreshGit:()=>this.git.refreshGit(),refreshAppData:()=>this.refreshAppData(),checkForPiWebUpdates:()=>this.piWebStatusController.checkForUpdates(),reloadPage:()=>{this.hardReloadApp()},deleteWorkspace:e=>this.deleteWorkspace(e),startSession:()=>this.withChatScrollTransition(()=>this.startSessionAndOpenChat()),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(!sf(e)){this.setState({error:`只能删除辅助 Git 工作树`});return}if(fm(this.state,e))return;let t=e.branch??e.label;if(!confirm(`删除工作区 ${t}?\n\n此操作将运行 git worktree remove 并删除:\n${e.path}\n\n不会删除 Git 分支。`))return;let n=R(this.state);try{let t=await io.deleteWorkspace(e.projectId,e.id,n);if(R(this.state)!==n)return;this.recordWorkspaceDeletionRun(t,n);let r=await this.workspaceForCommandRun(t);if(R(this.state)!==n)return;r!==void 0&&this.openRuntimeTerminal(n,r,{terminalId:t.terminalId})}catch(e){R(this.state)===n&&this.setState({error:`启动工作区删除失败:${sD(e)}`})}}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(t=>t.id===e.workspaceId)}recordWorkspaceDeletionRun(e,t){if(R(this.state)!==t)return;let n=pm(e);n!==void 0&&(this.setState({workspaceDeletionRuns:{...this.state.workspaceDeletionRuns,[n]:e}}),this.updateWorkspaceDeletionPolling())}async refreshWorkspaceDeletionRuns(){if(this.refreshingWorkspaceDeletionRuns)return;let e=R(this.state),t=this.state.selectedProject;if(t===void 0){this.setState({workspaceDeletionRuns:{}}),this.updateWorkspaceDeletionPolling();return}this.refreshingWorkspaceDeletionRuns=!0;try{let n=await this.terminalCommandRunsForOrigin(`core`,e).listCommandRuns(lm(t.id));if(R(this.state)!==e)return;let r=um(n);this.setState({workspaceDeletionRuns:r});for(let t of Object.values(r))mm(t)||await this.handleCompletedWorkspaceDeletionRun(t,e)}catch(e){console.warn(`Failed to refresh workspace deletion runs`,e)}finally{this.refreshingWorkspaceDeletionRuns=!1,this.updateWorkspaceDeletionPolling()}}updateWorkspaceDeletionPolling(){let e=Object.values(this.state.workspaceDeletionRuns).some(mm);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=R(this.state)){if(R(this.state)!==t)return;let n=aD(t,e.id);if(this.handledWorkspaceDeletionRunIds.has(n))return;let r=pm(e);if(r!==void 0){if(this.handledWorkspaceDeletionRunIds.add(n),e.status===`succeeded`){if(await this.workspaces.refreshAfterWorkspaceDeleted(e.projectId,r),R(this.state)!==t)return;this.setState({workspaceDeletionRuns:cD(this.state.workspaceDeletionRuns,r)}),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}?\n\n这只会从当前 PI WEB 网关移除它。`))return;let t=this.state.selectedMachine?.id===e.id;t&&this.rememberCurrentMachineNavigation();let n=await this.machines.deleteMachine(e,{selectFallback:!t});this.state.machines.some(t=>t.id===e.id)||this.machineNavigation.forget(e.id),t&&n!==void 0&&await this.selectMachineWithMemory(n,{rememberCurrent:!1})}openSelectedMachine(){let 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=>{let n=t instanceof Error?t.message:String(t);console.warn(`Action failed: ${e.id}`,t),this.setState({error:`操作失败:${n}`})})}async openModelDialog(){let e=await this.sessions.listModels(),t=this.state.status?.model?.provider,n=this.state.status?.model?.id;this.setState({modelDialog:{title:`选择模型`,...t!==void 0&&n!==void 0?{selectedValue:`${t}/${n}`}:{},options:e.map(e=>{let r=e.provider??``,i=e.id??``,a=r===t&&i===n;return{value:`${r}/${i}`,label:`${i}${a?` ✓ 当前`:``}`,description:r}})}})}async pickModel(e){this.setState({modelDialog:void 0});let t=e.indexOf(`/`);t<=0||await this.sessions.setModel(e.slice(0,t),e.slice(t+1))}openThemeDialog(){let e=this.plugins.getThemes(),t=this.resolveCurrentThemePreference(e),n=t.selectedTheme?.id,r=this.themePreference.auto?LE:IE;this.setState({themeDialog:{title:`选择主题`,selectedValue:n===void 0?r:`${RE}${n}`,options:[{value:r,label:`自动 ${this.themePreference.auto?`✓ 开启`:`关闭`}`,description:this.autoThemeDescription(t)},...e.map(e=>({value:`${RE}${e.id}`,label:this.themeOptionLabel(e,n),description:this.themeOptionDescription(e)}))]}})}pickTheme(e){if(this.setState({themeDialog:void 0}),e===IE||e===LE){let t=this.resolveCurrentThemePreference().selectedTheme?.id;if(t===void 0)return;this.themePreference={themeId:t,auto:e===IE},this.applyPreferredTheme(!0);return}if(!e.startsWith(RE))return;let t=e.slice(6),n=this.plugins.getThemes().find(e=>e.id===t);n!==void 0&&(this.themePreference={themeId:n.id,auto:this.themePreference.auto},this.applyPreferredTheme(!0))}applyPreferredTheme(e){let t=this.resolveCurrentThemePreference().activeTheme;t!==void 0&&(this.activeThemeId=t.id,Qp(t),e&&Zp(this.themePreference))}resolveCurrentThemePreference(e=this.plugins.getThemes()){return $p({themes:e,themePairs:this.plugins.getThemePairs(),preference:this.themePreference,prefersLight:this.systemPrefersLight()})}themePairForTheme(e){return tm(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){let n=[...e.id===t?[`已选择`]:[],...e.id===this.activeThemeId&&e.id!==t?[`生效中`]:[]];return n.length===0?e.name:`${e.name} ✓ ${n.join(` · `)}`}themeOptionDescription(e){let t=[e.colorScheme];return this.themePairForTheme(e.id)!==void 0&&t.push(`自动配对`),e.description!==void 0&&t.push(e.description),t.join(` · `)}async openThinkingDialog(){let e=await this.sessions.listThinkingLevels(),t=this.state.status?.thinkingLevel??`off`;this.setState({thinkingDialog:{title:`选择思考级别`,selectedValue:t,options:e.map(e=>{let n=Yo(e);return{value:e,label:`${Jo(e)}${e===t?` ✓ 当前`:``}`,...n===void 0?{}:{description:n}}})}})}async pickThinking(e){this.setState({thinkingDialog:void 0}),e!==``&&await this.sessions.setThinkingLevel(e)}sendPrompt(e,t,n,r){!(n!==void 0&&n.length>0)&&t===void 0&&this.auth.handleSlashCommand(e)||this.sessions.send(e,t,n,r)}renderChatView(e,t){return g`
|
|
4243
|
+
`}visibleWorkspacePanels(){let e=this.state.selectedWorkspace;if(e===void 0)return[];let t=this.createWorkspacePanelContext(e);return this.plugins.getWorkspacePanels().filter(e=>e.visible?.(t)??!0)}workspacePanelEmptyState(){let 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){let 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){let t=JE(this.state);return{machine:t,workspace:e,state:this.state,files:this.createWorkspaceFiles(e,t.id),host:this.createWorkspaceHost()}}createWorkspaceFiles(e,t){return{readFile:n=>io.workspaceFile(e.projectId,e.id,n,t),readOptionalFile:n=>io.optionalWorkspaceFile(e.projectId,e.id,n,t),listFiles:n=>io.workspaceTree(e.projectId,e.id,n,t),writeFile:async(n,r,i)=>{let a=await io.writeWorkspaceFile(e.projectId,e.id,n,r,i,t);return this.files.refreshFiles(),a},deleteFile:async n=>{let r=await io.deleteWorkspaceFile(e.projectId,e.id,n,t);return this.files.refreshFiles(),r},moveFile:async(n,r,i)=>{let a=await io.moveWorkspaceFile(e.projectId,e.id,n,r,i,t);return this.files.refreshFiles(),a}}}createWorkspaceHost(){return{requestRender:()=>{this.requestUpdate()}}}createWorkspacePanelContext(e){let t=JE(this.state),n=t.id,r=i=>{let a=this.terminalCommandRunsForOrigin(i,n);return sg({machine:t,workspace:e,state:this.state,files:this.createWorkspaceFiles(e,n),prompt:this.createPromptEditor(),terminal:{open:t=>{this.openRuntimeTerminal(n,e,t)},runCommand:t=>a.runCommand({...t,workspace:e})},openTerminal:t=>{this.openRuntimeTerminal(n,e,t)},host:this.createWorkspaceHost(),piWebUnstable:{terminalCommandRuns:a},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:Co(e.effectiveConfig,this.workspaceUploadDefaultFolder),onRefreshFiles:()=>{this.files.refreshFiles()},onCreateFile:e=>{this.files.createFile(e)},onCreateDirectory:e=>{this.files.createDirectory(e)},onMoveSelectedPath:e=>{this.files.moveSelectedPath(e)},onDeleteSelectedPath:()=>{this.files.deleteSelectedPath()},onDownloadSelectedFile:()=>{this.files.downloadSelectedFile()},onExpandDir:e=>{this.files.expandDir(e)},onSelectDirectory:e=>{this.files.selectDirectory(e)},onSelectFile:e=>{this.files.selectFile(e)},onStartWorkspaceUpload:(e,t)=>this.files.startWorkspaceUpload(e,t),onCancelWorkspaceUpload:e=>{this.files.cancelWorkspaceUpload(e)},onClearWorkspaceUpload:e=>{this.files.clearWorkspaceUpload(e)},onRefreshGit:()=>{this.git.refreshGit()},onSelectDiff:e=>{this.git.selectDiff(e)},onSelectTerminal:(e,t)=>{this.selectTerminal(e,t)}},r)};return r(`core`)}getActions(){return A_(this.getDefaultActions(),this.shortcutConfig)}getDefaultActions(){return[...this.plugins.getActions(this.createPluginRuntimeContext()),...this.normalAuthActions(),...this.sessionActions(),...this.navigationFocusActions(),...this.panelLayoutActions()]}normalAuthActions(){return this.apiScope===`management`?[]:[{id:`app.normal-auth.change-password`,title:`修改普通模式密码`,description:`更改进入普通模式所需的本地密码`,group:`偏好设置`,enabled:this.normalAuthStatus?.authenticated===!0,run:()=>{this.normalAuthDialogMode=`change`,this.normalAuthError=``}}]}sessionActions(){return[{id:`app.sessions.cleanup`,title:`清理会话`,description:`预览并手动清理所选机器上的空闲或已归档会话`,group:`会话`,...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.pluginLoads.ensureGatewayLoaded().then(()=>void 0)}async loadPluginsForSelectedMachine(){let e=this.state.selectedMachine;e?.kind===`remote`&&await this.loadPluginsForMachine(e)}async loadPluginsForMachine(e){await this.pluginLoads.loadForMachine(e)}async registerExternalPlugins(e,t){try{let e=await t();for(let t of e)try{this.plugins.register(t)}catch(e){console.warn(`Failed to register PI WEB plugin ${t.id}`,e)}return this.applyPreferredTheme(!1),this.requestUpdate(),!0}catch(t){return console.warn(`Failed to load ${e}`,t),!1}}createPromptEditor(){return{insertText:e=>{let t=this.promptEditor?.view;if(!t)return;t.hasFocus||t.focus();let n=t.state.selection.main;t.dispatch({changes:{from:n.from,to:n.to,insert:e},selection:{anchor:n.from+e.length}})},getText:()=>this.promptEditor?.view?.state.doc.toString()??``,getSelection:()=>{let e=this.promptEditor?.view;if(!e)return null;let t=e.state.selection.main;return t.empty?null:{start:t.from,end:t.to,text:e.state.sliceDoc(t.from,t.to)}}}}createPluginRuntimeContext(){let e=t=>og({state:this.state,prompt:this.createPromptEditor(),piWebUnstable:{terminalCommandRuns:this.terminalCommandRunsForOrigin(t),openSettings:e=>{this.openSettings(e)}},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()},openModelPicker:()=>this.openModelDialog(),openThinkingLevelPicker:()=>this.openThinkingDialog(),selectMainView:e=>{this.selectMainView(e)},selectWorkspaceTool:e=>{this.openWorkspaceTool(e)},openTerminal:e=>{this.openTerminal(e)},refreshFiles:()=>this.files.refreshFiles(),refreshGit:()=>this.git.refreshGit(),refreshAppData:()=>this.refreshAppData(),checkForPiWebUpdates:()=>this.piWebStatusController.checkForUpdates(),reloadPage:()=>{this.hardReloadApp()},deleteWorkspace:e=>this.deleteWorkspace(e),startSession:()=>this.withChatScrollTransition(()=>this.startSessionAndOpenChat()),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(!sf(e)){this.setState({error:`只能删除辅助 Git 工作树`});return}if(fm(this.state,e))return;let t=e.branch??e.label;if(!confirm(`删除工作区 ${t}?\n\n此操作将运行 git worktree remove 并删除:\n${e.path}\n\n不会删除 Git 分支。`))return;let n=R(this.state);try{let t=await io.deleteWorkspace(e.projectId,e.id,n);if(R(this.state)!==n)return;this.recordWorkspaceDeletionRun(t,n);let r=await this.workspaceForCommandRun(t);if(R(this.state)!==n)return;r!==void 0&&this.openRuntimeTerminal(n,r,{terminalId:t.terminalId})}catch(e){R(this.state)===n&&this.setState({error:`启动工作区删除失败:${cD(e)}`})}}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(t=>t.id===e.workspaceId)}recordWorkspaceDeletionRun(e,t){if(R(this.state)!==t)return;let n=pm(e);n!==void 0&&(this.setState({workspaceDeletionRuns:{...this.state.workspaceDeletionRuns,[n]:e}}),this.updateWorkspaceDeletionPolling())}async refreshWorkspaceDeletionRuns(){if(this.refreshingWorkspaceDeletionRuns)return;let e=R(this.state),t=this.state.selectedProject;if(t===void 0){this.setState({workspaceDeletionRuns:{}}),this.updateWorkspaceDeletionPolling();return}this.refreshingWorkspaceDeletionRuns=!0;try{let n=await this.terminalCommandRunsForOrigin(`core`,e).listCommandRuns(lm(t.id));if(R(this.state)!==e)return;let r=um(n);this.setState({workspaceDeletionRuns:r});for(let t of Object.values(r))mm(t)||await this.handleCompletedWorkspaceDeletionRun(t,e)}catch(e){console.warn(`Failed to refresh workspace deletion runs`,e)}finally{this.refreshingWorkspaceDeletionRuns=!1,this.updateWorkspaceDeletionPolling()}}updateWorkspaceDeletionPolling(){let e=Object.values(this.state.workspaceDeletionRuns).some(mm);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=R(this.state)){if(R(this.state)!==t)return;let n=oD(t,e.id);if(this.handledWorkspaceDeletionRunIds.has(n))return;let r=pm(e);if(r!==void 0){if(this.handledWorkspaceDeletionRunIds.add(n),e.status===`succeeded`){if(await this.workspaces.refreshAfterWorkspaceDeleted(e.projectId,r),R(this.state)!==t)return;this.setState({workspaceDeletionRuns:lD(this.state.workspaceDeletionRuns,r)}),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}?\n\n这只会从当前 PI WEB 网关移除它。`))return;let t=this.state.selectedMachine?.id===e.id;t&&this.rememberCurrentMachineNavigation();let n=await this.machines.deleteMachine(e,{selectFallback:!t});this.state.machines.some(t=>t.id===e.id)||this.machineNavigation.forget(e.id),t&&n!==void 0&&await this.selectMachineWithMemory(n,{rememberCurrent:!1})}openSelectedMachine(){let 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=>{let n=t instanceof Error?t.message:String(t);console.warn(`Action failed: ${e.id}`,t),this.setState({error:`操作失败:${n}`})})}async openModelDialog(){let e=await this.sessions.listModels(),t=this.state.status?.model?.provider,n=this.state.status?.model?.id;this.setState({modelDialog:{title:`选择模型`,...t!==void 0&&n!==void 0?{selectedValue:`${t}/${n}`}:{},options:e.map(e=>{let r=e.provider??``,i=e.id??``,a=r===t&&i===n;return{value:`${r}/${i}`,label:`${i}${a?` ✓ 当前`:``}`,description:r}})}})}async pickModel(e){this.setState({modelDialog:void 0});let t=e.indexOf(`/`);t<=0||await this.sessions.setModel(e.slice(0,t),e.slice(t+1))}openThemeDialog(){let e=this.plugins.getThemes(),t=this.resolveCurrentThemePreference(e),n=t.selectedTheme?.id,r=this.themePreference.auto?RE:LE;this.setState({themeDialog:{title:`选择主题`,selectedValue:n===void 0?r:`${zE}${n}`,options:[{value:r,label:`自动 ${this.themePreference.auto?`✓ 开启`:`关闭`}`,description:this.autoThemeDescription(t)},...e.map(e=>({value:`${zE}${e.id}`,label:this.themeOptionLabel(e,n),description:this.themeOptionDescription(e)}))]}})}pickTheme(e){if(this.setState({themeDialog:void 0}),e===LE||e===RE){let t=this.resolveCurrentThemePreference().selectedTheme?.id;if(t===void 0)return;this.themePreference={themeId:t,auto:e===LE},this.applyPreferredTheme(!0);return}if(!e.startsWith(zE))return;let t=e.slice(6),n=this.plugins.getThemes().find(e=>e.id===t);n!==void 0&&(this.themePreference={themeId:n.id,auto:this.themePreference.auto},this.applyPreferredTheme(!0))}applyPreferredTheme(e){let t=this.resolveCurrentThemePreference().activeTheme;t!==void 0&&(this.activeThemeId=t.id,Qp(t),e&&Zp(this.themePreference))}resolveCurrentThemePreference(e=this.plugins.getThemes()){return $p({themes:e,themePairs:this.plugins.getThemePairs(),preference:this.themePreference,prefersLight:this.systemPrefersLight()})}themePairForTheme(e){return tm(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){let n=[...e.id===t?[`已选择`]:[],...e.id===this.activeThemeId&&e.id!==t?[`生效中`]:[]];return n.length===0?e.name:`${e.name} ✓ ${n.join(` · `)}`}themeOptionDescription(e){let t=[e.colorScheme];return this.themePairForTheme(e.id)!==void 0&&t.push(`自动配对`),e.description!==void 0&&t.push(e.description),t.join(` · `)}async openThinkingDialog(){let e=await this.sessions.listThinkingLevels(),t=this.state.status?.thinkingLevel??`off`;this.setState({thinkingDialog:{title:`选择思考级别`,selectedValue:t,options:e.map(e=>{let n=Yo(e);return{value:e,label:`${Jo(e)}${e===t?` ✓ 当前`:``}`,...n===void 0?{}:{description:n}}})}})}async pickThinking(e){this.setState({thinkingDialog:void 0}),e!==``&&await this.sessions.setThinkingLevel(e)}sendPrompt(e,t,n,r){!(n!==void 0&&n.length>0)&&t===void 0&&this.auth.handleSlashCommand(e)||this.sessions.send(e,t,n,r)}renderChatView(e,t){return g`
|
|
4244
4244
|
<chat-view .sessionId=${t.id} .messages=${e.messages} .messageStart=${e.messagePageStart} .messageEnd=${e.messagePageEnd} .messageTotal=${e.messagePageTotal} .searchTarget=${e.sessionSearchTarget} .hasMore=${e.messagePageStart>0} .loadingMore=${e.isLoadingEarlierMessages} .isSendingPrompt=${e.sendingPrompts[t.id]===!0} .isCompacting=${e.status?.isCompacting===!0} .pendingMessageCount=${e.status?.pendingMessageCount??0} .clientQueuedMessages=${e.clientQueuedSessionMessages[t.id]??[]} .status=${e.status} .activity=${e.activity} .pendingAsk=${e.pendingAsk} .pendingDialogs=${e.pendingDialogs} .closedDialogs=${e.closedDialogs} .onAnswerDialog=${this.handleAnswerDialog} .onCancelDialog=${this.handleCancelDialog} .onDismissClosedDialog=${this.handleDismissClosedDialog} .askDraftSessionId=${Qo(R(e),t.id)} .onSubmitAsk=${this.handleSubmitAsk} .notificationInbox=${Md(e.selectedNotificationInbox)} .canClearServerQueue=${this.canClearServerQueue()} .onClearServerQueue=${this.handleClearServerQueue} .onDismissWarning=${this.handleDismissWarning} .onDismissNotification=${this.handleDismissNotification} .onDismissAllNotifications=${this.handleDismissAllNotifications} .warningsVisible=${!this.sessionWarningVisibility.collapsed} .onToggleWarnings=${this.handleToggleWarnings} .onLoadMore=${()=>this.withChatPrependTransition(()=>this.sessions.loadEarlierMessages())}></chat-view>
|
|
4245
4245
|
`}renderStatusBar(e){let t=this.sessionWarningVisibility.warningCount;return g`
|
|
4246
4246
|
<status-bar .status=${e.status} .warningCount=${t} .warningsExpanded=${t>0&&!this.sessionWarningVisibility.collapsed} .onToggleWarnings=${this.handleToggleWarnings}></status-bar>
|
|
@@ -4300,4 +4300,4 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
4300
4300
|
.onSubmit=${e=>{this.submitNormalAuth(e)}}
|
|
4301
4301
|
.onCancel=${()=>{this.normalAuthDialogMode=void 0,this.normalAuthError=``}}
|
|
4302
4302
|
></normal-auth-dialog>
|
|
4303
|
-
`}static{this.styles=
|
|
4303
|
+
`}static{this.styles=ME}};V([S()],$.prototype,`state`,void 0),V([C(`chat-view`)],$.prototype,`chatView`,void 0),V([C(`prompt-editor`)],$.prototype,`promptEditor`,void 0),V([C(`app-navigation-panel`)],$.prototype,`navigationPanel`,void 0),V([C(`#navigation-panel`)],$.prototype,`navigationPanelFrame`,void 0),V([C(`#workspace-panel`)],$.prototype,`workspacePanelFrame`,void 0),V([S()],$.prototype,`unreadSessionIds`,void 0),V([S()],$.prototype,`unreadPresence`,void 0),V([S()],$.prototype,`activeThemeId`,void 0),V([S()],$.prototype,`isRefreshingApp`,void 0),V([S()],$.prototype,`sessionCleanupDialog`,void 0),V([S()],$.prototype,`sessionSearchDialogOpen`,void 0),V([S()],$.prototype,`settingsSection`,void 0),V([S()],$.prototype,`normalAuthStatus`,void 0),V([S()],$.prototype,`normalAuthLoading`,void 0),V([S()],$.prototype,`normalAuthError`,void 0),V([S()],$.prototype,`normalAuthDialogMode`,void 0),V([S()],$.prototype,`shortcutConfig`,void 0),V([S()],$.prototype,`workspaceUploadDefaultFolder`,void 0),$=V([b(`pi-web-app`)],$);function KE(){let e=new rg;return e.register({id:`core`,plugin:Jh}),e.register({id:`themes`,plugin:Qh}),e}function qE(){let e=_t()?`management`:`normal`;return Mt(e),e}function JE(e){let t=e.selectedMachine;return t===void 0?{id:`local`,name:`本机`,kind:`local`}:{id:t.id,name:t.name,kind:t.kind}}function YE(e,t){return JSON.stringify([e,t.id,t.cwd])}function XE(e){let t=e.selectedSession;return t===void 0?void 0:YE(R(e),t)}function ZE(e,t){return e.machines!==t.machines||e.machineRuntimes!==t.machineRuntimes}function QE(e,t){return e.machines!==t.machines||e.machineStatuses!==t.machineStatuses||(e.selectedMachine?.id??`local`)!==(t.selectedMachine?.id??`local`)}function $E(e,t){return eD(e,t)}function eD(e,t){if(e.kind===`local`)return!0;let n=t?.status??e.status;return n===void 0||n===`unknown`||n===`online`}function tD(e,t){return Object.entries(t).some(([t,n])=>Reflect.get(e,t)!==n)}function nD(e,t){return e.size===t.size&&[...e].every(e=>t.has(e))}function rD(e){return Uo(e.status,e.activity)}function iD(e){return e.type===`terminal.created`||e.type===`terminal.exited`||e.type===`terminal.closed`}function aD(){return{}}function oD(e,t){return JSON.stringify([e,t])}function sD(e){return FE[Math.min(e,FE.length-1)]??3e4}function cD(e){return e instanceof Error?e.message:String(e)}function lD(e,t){return Object.fromEntries(Object.entries(e).filter(([e])=>e!==t))}function uD(){return new Promise(e=>requestAnimationFrame(()=>{e()}))}export{h as _,V as a,go as c,S as d,x as f,g,Je as h,dv as i,oo as l,y as m,sy as n,Ef as o,b as p,ay as r,Tf as s,oy as t,C as u};
|