@owloops/browserbird 1.0.7 → 1.0.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/index.mjs
CHANGED
|
@@ -122,8 +122,8 @@ function unknownSubcommand(subcommand, command, validCommands) {
|
|
|
122
122
|
/** @fileoverview ASCII banner displayed on daemon startup and in help text. */
|
|
123
123
|
const pkg = createRequire(import.meta.url)("../package.json");
|
|
124
124
|
const buildInfo = [];
|
|
125
|
-
buildInfo.push(`commit: ${"
|
|
126
|
-
buildInfo.push(`built: 2026-03-01T16:
|
|
125
|
+
buildInfo.push(`commit: ${"52cba8b240fcfea6d183adc4b5c414f36141e4de".substring(0, 7)}`);
|
|
126
|
+
buildInfo.push(`built: 2026-03-01T16:47:58+04:00`);
|
|
127
127
|
const buildString = buildInfo.length > 0 ? ` (${buildInfo.join(", ")})` : "";
|
|
128
128
|
const VERSION = `browserbird ${pkg.version}${buildString}`;
|
|
129
129
|
const BIRD = [
|
package/package.json
CHANGED
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
`),this._sock.flush(),Se("Sent ProtocolVersion: "+n),this._rfbInitState="Security"}_isSupportedSecurityType(e){return[Ro,di,Io,Qo,ur,zo,No,Uo,Oo].includes(e)}_negotiateSecurity(){if(this._rfbVersion>=3.7){const e=this._sock.rQshift8();if(this._sock.rQwait("security type",e,1))return!1;if(e===0)return this._rfbInitState="SecurityReason",this._securityContext="no security types",this._securityStatus=1,!0;const s=this._sock.rQshiftBytes(e);Se("Server security types: "+s),this._rfbAuthScheme=-1;for(let n of s)if(this._isSupportedSecurityType(n)){this._rfbAuthScheme=n;break}if(this._rfbAuthScheme===-1)return this._fail("Unsupported security types (types: "+s+")");this._sock.sQpush8(this._rfbAuthScheme),this._sock.flush()}else{if(this._sock.rQwait("security scheme",4))return!1;if(this._rfbAuthScheme=this._sock.rQshift32(),this._rfbAuthScheme==0)return this._rfbInitState="SecurityReason",this._securityContext="authentication scheme",this._securityStatus=1,!0}return this._rfbInitState="Authentication",Se("Authenticating using scheme: "+this._rfbAuthScheme),!0}_handleSecurityReason(){if(this._sock.rQwait("reason length",4))return!1;const e=this._sock.rQshift32();let s="";if(e>0){if(this._sock.rQwait("reason",e,4))return!1;s=this._sock.rQshiftStr(e)}return s!==""?(this.dispatchEvent(new CustomEvent("securityfailure",{detail:{status:this._securityStatus,reason:s}})),this._fail("Security negotiation failed on "+this._securityContext+" (reason: "+s+")")):(this.dispatchEvent(new CustomEvent("securityfailure",{detail:{status:this._securityStatus}})),this._fail("Security negotiation failed on "+this._securityContext))}_negotiateXvpAuth(){return this._rfbCredentials.username===void 0||this._rfbCredentials.password===void 0||this._rfbCredentials.target===void 0?(this.dispatchEvent(new CustomEvent("credentialsrequired",{detail:{types:["username","password","target"]}})),!1):(this._sock.sQpush8(this._rfbCredentials.username.length),this._sock.sQpush8(this._rfbCredentials.target.length),this._sock.sQpushString(this._rfbCredentials.username),this._sock.sQpushString(this._rfbCredentials.target),this._sock.flush(),this._rfbAuthScheme=di,this._negotiateAuthentication())}_negotiateVeNCryptAuth(){if(this._rfbVeNCryptState==0){if(this._sock.rQwait("vencrypt version",2))return!1;const e=this._sock.rQshift8(),s=this._sock.rQshift8();if(!(e==0&&s==2))return this._fail("Unsupported VeNCrypt version "+e+"."+s);this._sock.sQpush8(0),this._sock.sQpush8(2),this._sock.flush(),this._rfbVeNCryptState=1}if(this._rfbVeNCryptState==1){if(this._sock.rQwait("vencrypt ack",1))return!1;const e=this._sock.rQshift8();if(e!=0)return this._fail("VeNCrypt failure "+e);this._rfbVeNCryptState=2}if(this._rfbVeNCryptState==2){if(this._sock.rQwait("vencrypt subtypes length",1))return!1;const e=this._sock.rQshift8();if(e<1)return this._fail("VeNCrypt subtypes empty");this._rfbVeNCryptSubtypesLength=e,this._rfbVeNCryptState=3}if(this._rfbVeNCryptState==3){if(this._sock.rQwait("vencrypt subtypes",4*this._rfbVeNCryptSubtypesLength))return!1;const e=[];for(let s=0;s<this._rfbVeNCryptSubtypesLength;s++)e.push(this._sock.rQshift32());this._rfbAuthScheme=-1;for(let s of e)if(s!==ur&&this._isSupportedSecurityType(s)){this._rfbAuthScheme=s;break}return this._rfbAuthScheme===-1?this._fail("Unsupported security types (types: "+e+")"):(this._sock.sQpush32(this._rfbAuthScheme),this._sock.flush(),this._rfbVeNCryptState=4,!0)}}_negotiatePlainAuth(){if(this._rfbCredentials.username===void 0||this._rfbCredentials.password===void 0)return this.dispatchEvent(new CustomEvent("credentialsrequired",{detail:{types:["username","password"]}})),!1;const e=js(this._rfbCredentials.username),s=js(this._rfbCredentials.password);return this._sock.sQpush32(e.length),this._sock.sQpush32(s.length),this._sock.sQpushString(e),this._sock.sQpushString(s),this._sock.flush(),this._rfbInitState="SecurityResult",!0}_negotiateStdVNCAuth(){if(this._sock.rQwait("auth challenge",16))return!1;if(this._rfbCredentials.password===void 0)return this.dispatchEvent(new CustomEvent("credentialsrequired",{detail:{types:["password"]}})),!1;const e=Array.prototype.slice.call(this._sock.rQshiftBytes(16)),s=Xe.genDES(this._rfbCredentials.password,e);return this._sock.sQpushBytes(s),this._sock.flush(),this._rfbInitState="SecurityResult",!0}_negotiateARDAuth(){if(this._rfbCredentials.username===void 0||this._rfbCredentials.password===void 0)return this.dispatchEvent(new CustomEvent("credentialsrequired",{detail:{types:["username","password"]}})),!1;if(this._rfbCredentials.ardPublicKey!=null&&this._rfbCredentials.ardCredentials!=null)return this._sock.sQpushBytes(this._rfbCredentials.ardCredentials),this._sock.sQpushBytes(this._rfbCredentials.ardPublicKey),this._sock.flush(),this._rfbCredentials.ardCredentials=null,this._rfbCredentials.ardPublicKey=null,this._rfbInitState="SecurityResult",!0;if(this._sock.rQwait("read ard",4))return!1;let e=this._sock.rQshiftBytes(2),s=this._sock.rQshift16();if(this._sock.rQwait("read ard keylength",s*2,4))return!1;let n=this._sock.rQshiftBytes(s),a=this._sock.rQshiftBytes(s),i=vt.generateKey({name:"DH",g:e,p:n},!1,["deriveBits"]);return this._negotiateARDAuthAsync(s,a,i),!1}async _negotiateARDAuthAsync(e,s,n){const a=vt.exportKey("raw",n.publicKey),i=vt.deriveBits({name:"DH",public:s},n.privateKey,e*8),r=js(this._rfbCredentials.username).substring(0,63),l=js(this._rfbCredentials.password).substring(0,63),d=window.crypto.getRandomValues(new Uint8Array(128));for(let p=0;p<r.length;p++)d[p]=r.charCodeAt(p);d[r.length]=0;for(let p=0;p<l.length;p++)d[64+p]=l.charCodeAt(p);d[64+l.length]=0;const o=await vt.digest("MD5",i),u=await vt.importKey("raw",o,{name:"AES-ECB"},!1,["encrypt"]),_=await vt.encrypt({name:"AES-ECB"},u,d);this._rfbCredentials.ardCredentials=_,this._rfbCredentials.ardPublicKey=a,this._resumeAuthentication()}_negotiateTightUnixAuth(){return this._rfbCredentials.username===void 0||this._rfbCredentials.password===void 0?(this.dispatchEvent(new CustomEvent("credentialsrequired",{detail:{types:["username","password"]}})),!1):(this._sock.sQpush32(this._rfbCredentials.username.length),this._sock.sQpush32(this._rfbCredentials.password.length),this._sock.sQpushString(this._rfbCredentials.username),this._sock.sQpushString(this._rfbCredentials.password),this._sock.flush(),this._rfbInitState="SecurityResult",!0)}_negotiateTightTunnels(e){const s={0:{vendor:"TGHT",signature:"NOTUNNEL"}},n={};for(let a=0;a<e;a++){const i=this._sock.rQshift32(),r=this._sock.rQshiftStr(4),l=this._sock.rQshiftStr(8);n[i]={vendor:r,signature:l}}return Se("Server Tight tunnel types: "+n),n[1]&&n[1].vendor==="SICR"&&n[1].signature==="SCHANNEL"&&(Se("Detected Siemens server. Assuming NOTUNNEL support."),n[0]={vendor:"TGHT",signature:"NOTUNNEL"}),n[0]?n[0].vendor!=s[0].vendor||n[0].signature!=s[0].signature?this._fail("Client's tunnel type had the incorrect vendor or signature"):(Se("Selected tunnel type: "+s[0]),this._sock.sQpush32(0),this._sock.flush(),!1):this._fail("Server wanted tunnels, but doesn't support the notunnel type")}_negotiateTightAuth(){if(!this._rfbTightVNC){if(this._sock.rQwait("num tunnels",4))return!1;const a=this._sock.rQshift32();if(a>0&&this._sock.rQwait("tunnel capabilities",16*a,4))return!1;if(this._rfbTightVNC=!0,a>0)return this._negotiateTightTunnels(a),!1}if(this._sock.rQwait("sub auth count",4))return!1;const e=this._sock.rQshift32();if(e===0)return this._rfbInitState="SecurityResult",!0;if(this._sock.rQwait("sub auth capabilities",16*e,4))return!1;const s={STDVNOAUTH__:1,STDVVNCAUTH_:2,TGHTULGNAUTH:129},n=[];for(let a=0;a<e;a++){this._sock.rQshift32();const i=this._sock.rQshiftStr(12);n.push(i)}Se("Server Tight authentication types: "+n);for(let a in s)if(n.indexOf(a)!=-1)switch(this._sock.sQpush32(s[a]),this._sock.flush(),Se("Selected authentication type: "+a),a){case"STDVNOAUTH__":return this._rfbInitState="SecurityResult",!0;case"STDVVNCAUTH_":return this._rfbAuthScheme=di,!0;case"TGHTULGNAUTH":return this._rfbAuthScheme=Ho,!0;default:return this._fail("Unsupported tiny auth scheme (scheme: "+a+")")}return this._fail("No supported sub-auth types!")}_handleRSAAESCredentialsRequired(e){this.dispatchEvent(e)}_handleRSAAESServerVerification(e){this.dispatchEvent(e)}_negotiateRA2neAuth(){return this._rfbRSAAESAuthenticationState===null&&(this._rfbRSAAESAuthenticationState=new ev(this._sock,()=>this._rfbCredentials),this._rfbRSAAESAuthenticationState.addEventListener("serververification",this._eventHandlers.handleRSAAESServerVerification),this._rfbRSAAESAuthenticationState.addEventListener("credentialsrequired",this._eventHandlers.handleRSAAESCredentialsRequired)),this._rfbRSAAESAuthenticationState.checkInternalEvents(),this._rfbRSAAESAuthenticationState.hasStarted||this._rfbRSAAESAuthenticationState.negotiateRA2neAuthAsync().catch(e=>{e.message!=="disconnect normally"&&this._fail(e.message)}).then(()=>(this._rfbInitState="SecurityResult",!0)).finally(()=>{this._rfbRSAAESAuthenticationState.removeEventListener("serververification",this._eventHandlers.handleRSAAESServerVerification),this._rfbRSAAESAuthenticationState.removeEventListener("credentialsrequired",this._eventHandlers.handleRSAAESCredentialsRequired),this._rfbRSAAESAuthenticationState=null}),!1}_negotiateMSLogonIIAuth(){if(this._sock.rQwait("mslogonii dh param",24))return!1;if(this._rfbCredentials.username===void 0||this._rfbCredentials.password===void 0)return this.dispatchEvent(new CustomEvent("credentialsrequired",{detail:{types:["username","password"]}})),!1;const e=this._sock.rQshiftBytes(8),s=this._sock.rQshiftBytes(8),n=this._sock.rQshiftBytes(8),a=vt.generateKey({name:"DH",g:e,p:s},!0,["deriveBits"]),i=vt.exportKey("raw",a.publicKey),r=vt.deriveBits({name:"DH",public:n},a.privateKey,64),l=vt.importKey("raw",r,{name:"DES-CBC"},!1,["encrypt"]),d=js(this._rfbCredentials.username).substring(0,255),o=js(this._rfbCredentials.password).substring(0,63);let u=new Uint8Array(256),_=new Uint8Array(64);window.crypto.getRandomValues(u),window.crypto.getRandomValues(_);for(let p=0;p<d.length;p++)u[p]=d.charCodeAt(p);u[d.length]=0;for(let p=0;p<o.length;p++)_[p]=o.charCodeAt(p);return _[o.length]=0,u=vt.encrypt({name:"DES-CBC",iv:r},l,u),_=vt.encrypt({name:"DES-CBC",iv:r},l,_),this._sock.sQpushBytes(i),this._sock.sQpushBytes(u),this._sock.sQpushBytes(_),this._sock.flush(),this._rfbInitState="SecurityResult",!0}_negotiateAuthentication(){switch(this._rfbAuthScheme){case Ro:return this._rfbVersion>=3.8?this._rfbInitState="SecurityResult":this._rfbInitState="ClientInitialisation",!0;case zo:return this._negotiateXvpAuth();case No:return this._negotiateARDAuth();case di:return this._negotiateStdVNCAuth();case Qo:return this._negotiateTightAuth();case ur:return this._negotiateVeNCryptAuth();case Oo:return this._negotiatePlainAuth();case Ho:return this._negotiateTightUnixAuth();case Io:return this._negotiateRA2neAuth();case Uo:return this._negotiateMSLogonIIAuth();default:return this._fail("Unsupported auth scheme (scheme: "+this._rfbAuthScheme+")")}}_handleSecurityResult(){if(this._sock.rQwait("VNC auth response ",4))return!1;const e=this._sock.rQshift32();return e===0?(this._rfbInitState="ClientInitialisation",Se("Authentication OK"),!0):this._rfbVersion>=3.8?(this._rfbInitState="SecurityReason",this._securityContext="security result",this._securityStatus=e,!0):(this.dispatchEvent(new CustomEvent("securityfailure",{detail:{status:e}})),this._fail("Security handshake failed"))}_negotiateServerInit(){if(this._sock.rQwait("server initialization",24))return!1;const e=this._sock.rQshift16(),s=this._sock.rQshift16(),n=this._sock.rQshift8(),a=this._sock.rQshift8(),i=this._sock.rQshift8(),r=this._sock.rQshift8(),l=this._sock.rQshift16(),d=this._sock.rQshift16(),o=this._sock.rQshift16(),u=this._sock.rQshift8(),_=this._sock.rQshift8(),p=this._sock.rQshift8();this._sock.rQskipBytes(3);const v=this._sock.rQshift32();if(this._sock.rQwait("server init name",v,24))return!1;let x=this._sock.rQshiftStr(v);if(x=Oi(x,!0),this._rfbTightVNC){if(this._sock.rQwait("TightVNC extended server init header",8,24+v))return!1;const y=this._sock.rQshift16(),w=this._sock.rQshift16(),S=this._sock.rQshift16();this._sock.rQskipBytes(2);const E=(y+w+S)*16;if(this._sock.rQwait("TightVNC extended server init header",E,32+v))return!1;this._sock.rQskipBytes(16*y),this._sock.rQskipBytes(16*w),this._sock.rQskipBytes(16*S)}return Vt("Screen: "+e+"x"+s+", bpp: "+n+", depth: "+a+", bigEndian: "+i+", trueColor: "+r+", redMax: "+l+", greenMax: "+d+", blueMax: "+o+", redShift: "+u+", greenShift: "+_+", blueShift: "+p),this._setDesktopName(x),this._resize(e,s),this._viewOnly||this._keyboard.grab(),this._fbDepth=24,this._fbName==="Intel(r) AMT KVM"&&(Zt("Intel AMT KVM only supports 8/16 bit depths. Using low color mode."),this._fbDepth=8),Xe.messages.pixelFormat(this._sock,this._fbDepth,!0),this._sendEncodings(),Xe.messages.fbUpdateRequest(this._sock,!1,0,0,this._fbWidth,this._fbHeight),this._updateConnectionState("connected"),!0}_sendEncodings(){const e=[];e.push(Ce.encodingCopyRect),this._fbDepth==24&&(Zc&&e.push(Ce.encodingH264),e.push(Ce.encodingTight),e.push(Ce.encodingTightPNG),e.push(Ce.encodingZRLE),e.push(Ce.encodingJPEG),e.push(Ce.encodingHextile),e.push(Ce.encodingRRE),e.push(Ce.encodingZlib)),e.push(Ce.encodingRaw),e.push(Ce.pseudoEncodingQualityLevel0+this._qualityLevel),e.push(Ce.pseudoEncodingCompressLevel0+this._compressionLevel),e.push(Ce.pseudoEncodingDesktopSize),e.push(Ce.pseudoEncodingLastRect),e.push(Ce.pseudoEncodingQEMUExtendedKeyEvent),e.push(Ce.pseudoEncodingQEMULedEvent),e.push(Ce.pseudoEncodingExtendedDesktopSize),e.push(Ce.pseudoEncodingXvp),e.push(Ce.pseudoEncodingFence),e.push(Ce.pseudoEncodingContinuousUpdates),e.push(Ce.pseudoEncodingDesktopName),e.push(Ce.pseudoEncodingExtendedClipboard),e.push(Ce.pseudoEncodingExtendedMouseButtons),this._fbDepth==24&&(e.push(Ce.pseudoEncodingVMwareCursor),e.push(Ce.pseudoEncodingCursor)),Xe.messages.clientEncodings(this._sock,e)}_initMsg(){switch(this._rfbInitState){case"ProtocolVersion":return this._negotiateProtocolVersion();case"Security":return this._negotiateSecurity();case"Authentication":return this._negotiateAuthentication();case"SecurityResult":return this._handleSecurityResult();case"SecurityReason":return this._handleSecurityReason();case"ClientInitialisation":return this._sock.sQpush8(this._shared?1:0),this._sock.flush(),this._rfbInitState="ServerInitialisation",!0;case"ServerInitialisation":return this._negotiateServerInit();default:return this._fail("Unknown init state (state: "+this._rfbInitState+")")}}_resumeAuthentication(){setTimeout(this._initMsg.bind(this),0)}_handleSetColourMapMsg(){return Se("SetColorMapEntries"),this._fail("Unexpected SetColorMapEntries message")}_handleServerCutText(){if(Se("ServerCutText"),this._sock.rQwait("ServerCutText header",7,1))return!1;this._sock.rQskipBytes(3);let e=this._sock.rQshift32();if(e=Fr(e),this._sock.rQwait("ServerCutText content",Math.abs(e),8))return!1;if(e>=0){const s=this._sock.rQshiftStr(e);if(this._viewOnly)return!0;this.dispatchEvent(new CustomEvent("clipboard",{detail:{text:s}}))}else{e=Math.abs(e);const s=this._sock.rQshift32();let n=s&65535,a=s&4278190080;if(!!(a&Vo)){this._clipboardServerCapabilitiesFormats={},this._clipboardServerCapabilitiesActions={};for(let l=0;l<=15;l++){let d=1<<l;n&d&&(this._clipboardServerCapabilitiesFormats[d]=!0,this._sock.rQshift32())}for(let l=24;l<=31;l++){let d=1<<l;this._clipboardServerCapabilitiesActions[d]=!!(a&d)}let r=[Vo,_i,Go,Sa,vi];Xe.messages.extendedClipboardCaps(this._sock,r,{extendedClipboardFormatText:0})}else if(a===_i){if(this._viewOnly)return!0;this._clipboardText!=null&&this._clipboardServerCapabilitiesActions[vi]&&n&Is&&Xe.messages.extendedClipboardProvide(this._sock,[Is],[this._clipboardText])}else if(a===Go){if(this._viewOnly)return!0;this._clipboardServerCapabilitiesActions[Sa]&&(this._clipboardText!=null?Xe.messages.extendedClipboardNotify(this._sock,[Is]):Xe.messages.extendedClipboardNotify(this._sock,[]))}else if(a===Sa){if(this._viewOnly)return!0;this._clipboardServerCapabilitiesActions[_i]&&n&Is&&Xe.messages.extendedClipboardRequest(this._sock,[Is])}else if(a===vi){if(this._viewOnly||!(n&Is))return!0;this._clipboardText=null;let r=this._sock.rQshiftBytes(e-4),l=new Bi,d=null;l.setInput(r);for(let o=0;o<=15;o++){let u=1<<o;if(n&u){let _=0,p=l.inflate(4);_|=p[0]<<24,_|=p[1]<<16,_|=p[2]<<8,_|=p[3];let v=l.inflate(_);u===Is&&(d=v)}}if(l.setInput(null),d!==null){let o="";for(let u=0;u<d.length;u++)o+=String.fromCharCode(d[u]);d=o,d=Oi(d),d.length>0&&d.charAt(d.length-1)==="\0"&&(d=d.slice(0,-1)),d=d.replaceAll(`\r
|
|
4
4
|
`,`
|
|
5
5
|
`),this.dispatchEvent(new CustomEvent("clipboard",{detail:{text:d}}))}}else return this._fail("Unexpected action in extended clipboard message: "+a)}return!0}_handleServerFenceMsg(){if(this._sock.rQwait("ServerFence header",8,1))return!1;this._sock.rQskipBytes(3);let e=this._sock.rQshift32(),s=this._sock.rQshift8();if(this._sock.rQwait("ServerFence payload",s,9))return!1;s>64&&(Zt("Bad payload length ("+s+") in fence response"),s=64);const n=this._sock.rQshiftStr(s);return this._supportsFence=!0,e&1<<31?(e&=3,Xe.messages.clientFence(this._sock,e,n),!0):this._fail("Unexpected fence response")}_handleXvpMsg(){if(this._sock.rQwait("XVP version and message",3,1))return!1;this._sock.rQskipBytes(1);const e=this._sock.rQshift8(),s=this._sock.rQshift8();switch(s){case 0:rt("XVP operation failed");break;case 1:this._rfbXvpVer=e,Vt("XVP extensions enabled (version "+this._rfbXvpVer+")"),this._setCapability("power",!0);break;default:this._fail("Illegal server XVP message (msg: "+s+")");break}return!0}_normalMsg(){let e;this._FBU.rects>0?e=0:e=this._sock.rQshift8();let s,n;switch(e){case 0:return n=this._framebufferUpdate(),n&&!this._enabledContinuousUpdates&&Xe.messages.fbUpdateRequest(this._sock,!0,0,0,this._fbWidth,this._fbHeight),n;case 1:return this._handleSetColourMapMsg();case 2:return Se("Bell"),this.dispatchEvent(new CustomEvent("bell",{detail:{}})),!0;case 3:return this._handleServerCutText();case 150:return s=!this._supportsContinuousUpdates,this._supportsContinuousUpdates=!0,this._enabledContinuousUpdates=!1,s&&(this._enabledContinuousUpdates=!0,this._updateContinuousUpdates(),Vt("Enabling continuous updates.")),!0;case 248:return this._handleServerFenceMsg();case 250:return this._handleXvpMsg();default:return this._fail("Unexpected server message (type "+e+")"),Se("sock.rQpeekBytes(30): "+this._sock.rQpeekBytes(30)),!0}}_framebufferUpdate(){if(this._FBU.rects===0){if(this._sock.rQwait("FBU header",3,1))return!1;if(this._sock.rQskipBytes(1),this._FBU.rects=this._sock.rQshift16(),this._display.pending())return this._flushing=!0,this._display.flush().then(()=>{this._flushing=!1,this._sock.rQwait("message",1)||this._handleMessage()}),!1}for(;this._FBU.rects>0;){if(this._FBU.encoding===null){if(this._sock.rQwait("rect header",12))return!1;this._FBU.x=this._sock.rQshift16(),this._FBU.y=this._sock.rQshift16(),this._FBU.width=this._sock.rQshift16(),this._FBU.height=this._sock.rQshift16(),this._FBU.encoding=this._sock.rQshift32(),this._FBU.encoding>>=0}if(!this._handleRect())return!1;this._FBU.rects--,this._FBU.encoding=null}return this._display.flip(),!0}_handleRect(){switch(this._FBU.encoding){case Ce.pseudoEncodingLastRect:return this._FBU.rects=1,!0;case Ce.pseudoEncodingVMwareCursor:return this._handleVMwareCursor();case Ce.pseudoEncodingCursor:return this._handleCursor();case Ce.pseudoEncodingQEMUExtendedKeyEvent:return this._qemuExtKeyEventSupported=!0,!0;case Ce.pseudoEncodingDesktopName:return this._handleDesktopName();case Ce.pseudoEncodingDesktopSize:return this._resize(this._FBU.width,this._FBU.height),!0;case Ce.pseudoEncodingExtendedDesktopSize:return this._handleExtendedDesktopSize();case Ce.pseudoEncodingExtendedMouseButtons:return this._extendedPointerEventSupported=!0,!0;case Ce.pseudoEncodingQEMULedEvent:return this._handleLedEvent();default:return this._handleDataRect()}}_handleVMwareCursor(){const e=this._FBU.x,s=this._FBU.y,n=this._FBU.width,a=this._FBU.height;if(this._sock.rQwait("VMware cursor encoding",1))return!1;const i=this._sock.rQshift8();this._sock.rQshift8();let r;const l=4;if(i==0){if(r=new Array(n*a*l),this._sock.rQwait("VMware cursor classic encoding",n*a*l*2,2))return!1;let o=new Array(n*a);for(let _=0;_<n*a;_++)o[_]=this._sock.rQshift32();let u=new Array(n*a);for(let _=0;_<n*a;_++)u[_]=this._sock.rQshift32();for(let _=0;_<n*a;_++)if(o[_]==0){let p=u[_],v=p>>8&255,x=p>>16&255,y=p>>24&255;r[_*l]=v,r[_*l+1]=x,r[_*l+2]=y,r[_*l+3]=255}else(o[_]&-256)==-256?u[_]==0?(r[_*l]=0,r[_*l+1]=0,r[_*l+2]=0,r[_*l+3]=0):(u[_]&-256,r[_*l]=0,r[_*l+1]=0,r[_*l+2]=0,r[_*l+3]=255):(r[_*l]=0,r[_*l+1]=0,r[_*l+2]=0,r[_*l+3]=255)}else if(i==1){if(this._sock.rQwait("VMware cursor alpha encoding",n*a*4,2))return!1;r=new Array(n*a*l);for(let d=0;d<n*a;d++){let o=this._sock.rQshift32();r[d*4]=o>>24&255,r[d*4+1]=o>>16&255,r[d*4+2]=o>>8&255,r[d*4+3]=o&255}}else return Zt("The given cursor type is not supported: "+i+" given."),!1;return this._updateCursor(r,e,s,n,a),!0}_handleCursor(){const e=this._FBU.x,s=this._FBU.y,n=this._FBU.width,a=this._FBU.height,i=n*a*4,r=Math.ceil(n/8)*a;let l=i+r;if(this._sock.rQwait("cursor encoding",l))return!1;const d=this._sock.rQshiftBytes(i),o=this._sock.rQshiftBytes(r);let u=new Uint8Array(n*a*4),_=0;for(let p=0;p<a;p++)for(let v=0;v<n;v++){let x=p*Math.ceil(n/8)+Math.floor(v/8),y=o[x]<<v%8&128?255:0;u[_]=d[_+2],u[_+1]=d[_+1],u[_+2]=d[_],u[_+3]=y,_+=4}return this._updateCursor(u,e,s,n,a),!0}_handleDesktopName(){if(this._sock.rQwait("DesktopName",4))return!1;let e=this._sock.rQshift32();if(this._sock.rQwait("DesktopName",e,4))return!1;let s=this._sock.rQshiftStr(e);return s=Oi(s,!0),this._setDesktopName(s),!0}_handleLedEvent(){if(this._sock.rQwait("LED status",1))return!1;let e=this._sock.rQshift8(),s=!!(e&2),n=!!(e&4);return this._remoteCapsLock=n,this._remoteNumLock=s,!0}_handleExtendedDesktopSize(){if(this._sock.rQwait("ExtendedDesktopSize",4))return!1;const e=this._sock.rQpeek8();let s=4+e*16;if(this._sock.rQwait("ExtendedDesktopSize",s))return!1;const n=!this._supportsSetDesktopSize;this._supportsSetDesktopSize=!0,this._sock.rQskipBytes(1),this._sock.rQskipBytes(3);for(let a=0;a<e;a+=1)a===0?(this._screenID=this._sock.rQshift32(),this._sock.rQskipBytes(2),this._sock.rQskipBytes(2),this._sock.rQskipBytes(2),this._sock.rQskipBytes(2),this._screenFlags=this._sock.rQshift32()):this._sock.rQskipBytes(16);if(this._FBU.x===1&&(this._pendingRemoteResize=!1),this._FBU.x===1&&this._FBU.y!==0){let a="";switch(this._FBU.y){case 1:a="Resize is administratively prohibited";break;case 2:a="Out of resources";break;case 3:a="Invalid screen layout";break;default:a="Unknown reason";break}Zt("Server did not accept the resize request: "+a)}else this._resize(this._FBU.width,this._FBU.height);return n&&this._requestRemoteResize(),this._FBU.x===1&&this._FBU.y===0&&this._requestRemoteResize(),!0}_handleDataRect(){let e=this._decoders[this._FBU.encoding];if(!e)return this._fail("Unsupported encoding (encoding: "+this._FBU.encoding+")"),!1;try{return e.decodeRect(this._FBU.x,this._FBU.y,this._FBU.width,this._FBU.height,this._sock,this._display,this._fbDepth)}catch(s){return this._fail("Error decoding rect: "+s),!1}}_updateContinuousUpdates(){this._enabledContinuousUpdates&&Xe.messages.enableContinuousUpdates(this._sock,!0,0,0,this._fbWidth,this._fbHeight)}_resize(e,s){this._fbWidth=e,this._fbHeight=s,this._display.resize(this._fbWidth,this._fbHeight),this._updateClip(),this._updateScale(),this._updateContinuousUpdates(),this._saveExpectedClientSize()}_xvpOp(e,s){this._rfbXvpVer<e||(Vt("Sending XVP operation "+s+" (version "+e+")"),Xe.messages.xvpOp(this._sock,e,s))}_updateCursor(e,s,n,a,i){this._cursorImage={rgbaPixels:e,hotx:s,hoty:n,w:a,h:i},this._refreshCursor()}_shouldShowDotCursor(){if(!this._showDotCursor)return!1;for(let e=3;e<this._cursorImage.rgbaPixels.length;e+=4)if(this._cursorImage.rgbaPixels[e])return!1;return!0}_refreshCursor(){if(this._rfbConnectionState!=="connecting"&&this._rfbConnectionState!=="connected")return;const e=this._shouldShowDotCursor()?Xe.cursors.dot:this._cursorImage;this._cursor.change(e.rgbaPixels,e.hotx,e.hoty,e.w,e.h)}static genDES(e,s){const n=e.split("").map(i=>i.charCodeAt(0)),a=vt.importKey("raw",n,{name:"DES-ECB"},!1,["encrypt"]);return vt.encrypt({name:"DES-ECB"},a,s)}}Xe.messages={keyEvent(t,e,s){t.sQpush8(4),t.sQpush8(s),t.sQpush16(0),t.sQpush32(e),t.flush()},QEMUExtendedKeyEvent(t,e,s,n){function a(r){const l=n>>8,d=n&255;return l===224&&d<127?d|128:r}t.sQpush8(255),t.sQpush8(0),t.sQpush16(s),t.sQpush32(e);const i=a(n);t.sQpush32(i),t.flush()},pointerEvent(t,e,s,n){t.sQpush8(5),n=n&127,t.sQpush8(n),t.sQpush16(e),t.sQpush16(s),t.flush()},extendedPointerEvent(t,e,s,n){t.sQpush8(5);let a=n>>7&255;if(a&252)throw new Error("Invalid mouse button mask: "+n);let i=n&127;i|=128,t.sQpush8(i),t.sQpush16(e),t.sQpush16(s),t.sQpush8(a),t.flush()},_buildExtendedClipboardFlags(t,e){let s=new Uint8Array(4),n=0,a=0;for(let i=0;i<t.length;i++)a|=t[i];for(let i=0;i<e.length;i++)n|=e[i];return s[0]=a>>24,s[1]=0,s[2]=0,s[3]=n,s},extendedClipboardProvide(t,e,s){let n=new M_,a=[];for(let l=0;l<e.length;l++){if(e[l]!=Is)throw new Error("Unsupported extended clipboard format for Provide message.");s[l]=s[l].replace(/\r\n|\r|\n/gm,`\r
|
|
6
|
-
`);let d=js(s[l]+"\0");a.push(d.length>>24&255,d.length>>16&255,d.length>>8&255,d.length&255);for(let o=0;o<d.length;o++)a.push(d.charCodeAt(o))}let i=n.deflate(new Uint8Array(a)),r=new Uint8Array(4+i.length);r.set(Xe.messages._buildExtendedClipboardFlags([vi],e)),r.set(i,4),Xe.messages.clientCutText(t,r,!0)},extendedClipboardNotify(t,e){let s=Xe.messages._buildExtendedClipboardFlags([Sa],e);Xe.messages.clientCutText(t,s,!0)},extendedClipboardRequest(t,e){let s=Xe.messages._buildExtendedClipboardFlags([_i],e);Xe.messages.clientCutText(t,s,!0)},extendedClipboardCaps(t,e,s){let n=Object.keys(s),a=new Uint8Array(4+4*n.length);n.map(r=>parseInt(r)),n.sort((r,l)=>r-l),a.set(Xe.messages._buildExtendedClipboardFlags(e,[]));let i=4;for(let r=0;r<n.length;r++)a[i]=s[n[r]]>>24,a[i+1]=s[n[r]]>>16,a[i+2]=s[n[r]]>>8,a[i+3]=s[n[r]]>>0,i+=4,a[3]|=1<<n[r];Xe.messages.clientCutText(t,a,!0)},clientCutText(t,e,s=!1){t.sQpush8(6),t.sQpush8(0),t.sQpush8(0),t.sQpush8(0);let n;s?n=lf(-e.length):n=e.length,t.sQpush32(n),t.sQpushBytes(e),t.flush()},setDesktopSize(t,e,s,n,a){t.sQpush8(251),t.sQpush8(0),t.sQpush16(e),t.sQpush16(s),t.sQpush8(1),t.sQpush8(0),t.sQpush32(n),t.sQpush16(0),t.sQpush16(0),t.sQpush16(e),t.sQpush16(s),t.sQpush32(a),t.flush()},clientFence(t,e,s){t.sQpush8(248),t.sQpush8(0),t.sQpush8(0),t.sQpush8(0),t.sQpush32(e),t.sQpush8(s.length),t.sQpushString(s),t.flush()},enableContinuousUpdates(t,e,s,n,a,i){t.sQpush8(150),t.sQpush8(e),t.sQpush16(s),t.sQpush16(n),t.sQpush16(a),t.sQpush16(i),t.flush()},pixelFormat(t,e,s){let n;e>16?n=32:e>8?n=16:n=8;const a=Math.floor(e/3);t.sQpush8(0),t.sQpush8(0),t.sQpush8(0),t.sQpush8(0),t.sQpush8(n),t.sQpush8(e),t.sQpush8(0),t.sQpush8(s?1:0),t.sQpush16((1<<a)-1),t.sQpush16((1<<a)-1),t.sQpush16((1<<a)-1),t.sQpush8(a*0),t.sQpush8(a*1),t.sQpush8(a*2),t.sQpush8(0),t.sQpush8(0),t.sQpush8(0),t.flush()},clientEncodings(t,e){t.sQpush8(2),t.sQpush8(0),t.sQpush16(e.length);for(let s=0;s<e.length;s++)t.sQpush32(e[s]);t.flush()},fbUpdateRequest(t,e,s,n,a,i){typeof s>"u"&&(s=0),typeof n>"u"&&(n=0),t.sQpush8(3),t.sQpush8(e?1:0),t.sQpush16(s),t.sQpush16(n),t.sQpush16(a),t.sQpush16(i),t.flush()},xvpOp(t,e,s){t.sQpush8(250),t.sQpush8(0),t.sQpush8(e),t.sQpush8(s),t.flush()}};Xe.cursors={none:{rgbaPixels:new Uint8Array,w:0,h:0,hotx:0,hoty:0},dot:{rgbaPixels:new Uint8Array([255,255,255,255,0,0,0,255,255,255,255,255,0,0,0,255,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,255,255,255,255,255]),w:3,h:3,hotx:1,hoty:1}};var pv=T('<div class="loading svelte-1szlhua">Loading...</div>'),gv=T('<div class="disabled-state svelte-1szlhua"><div class="disabled-icon svelte-1szlhua"><svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="svelte-1szlhua"><rect x="2" y="3" width="20" height="14" rx="2" class="svelte-1szlhua"></rect><line x1="8" y1="21" x2="16" y2="21" class="svelte-1szlhua"></line><line x1="12" y1="17" x2="12" y2="21" class="svelte-1szlhua"></line></svg></div> <h2 class="disabled-title svelte-1szlhua">Browser Not Enabled</h2> <p class="disabled-text svelte-1szlhua">Enable the browser from Settings to connect to a running VM with noVNC.</p> <a href="#/settings" class="btn btn-outline btn-sm svelte-1szlhua">Go to Settings</a></div>'),xv=T('<div class="conn-info-popover svelte-1szlhua"><div class="conn-info-row svelte-1szlhua"><span class="conn-info-key svelte-1szlhua">VNC port</span> <span class="mono conn-info-val svelte-1szlhua"> </span></div> <div class="conn-info-row svelte-1szlhua"><span class="conn-info-key svelte-1szlhua">noVNC port</span> <span class="mono conn-info-val svelte-1szlhua"> </span></div></div>'),bv=T('<button class="toolbar-btn toolbar-btn-danger svelte-1szlhua"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svelte-1szlhua"><path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4" class="svelte-1szlhua"></path><polyline points="16 17 21 12 16 7" class="svelte-1szlhua"></polyline><line x1="21" y1="12" x2="9" y2="12" class="svelte-1szlhua"></line></svg> Disconnect</button>'),mv=T('<div class="toolbar-right svelte-1szlhua"><span class="toolbar-sep svelte-1szlhua"></span> <button><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svelte-1szlhua"><rect x="9" y="2" width="6" height="4" rx="1" class="svelte-1szlhua"></rect><path d="M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2h-2" class="svelte-1szlhua"></path></svg> Clipboard</button> <!></div>'),wv=T('<div class="clipboard-popover svelte-1szlhua"><p class="clipboard-label svelte-1szlhua">Type or paste, then use Ctrl+V inside the desktop</p> <textarea class="clipboard-textarea svelte-1szlhua" placeholder="Paste text here..."></textarea></div>'),yv=T('<div class="error-overlay svelte-1szlhua"><p class="error-text svelte-1szlhua"> </p> <p class="error-hint svelte-1szlhua">Ensure the browser stack (noVNC) is running</p> <button class="btn btn-outline btn-sm svelte-1szlhua">Reconnect</button></div>'),kv=T('<div class="browser-viewer svelte-1szlhua"><div class="toolbar svelte-1szlhua"><div class="toolbar-left svelte-1szlhua"><button class="conn-status svelte-1szlhua"><span></span> <span class="toolbar-label svelte-1szlhua"> </span></button> <!></div> <!></div> <div class="vnc-container svelte-1szlhua"><!> <!> <div></div></div></div>');function Sv(t,e){et(e,!0);let s=W(null),n=W(!0),a=W("connecting"),i=W(void 0),r=W(0),l=W(null),d=W(!1),o=W(""),u=W(!1);const _=Ee(()=>e.status?.browser.enabled??!1),p={connecting:"Connecting",connected:"Connected",disconnected:"Disconnected",failed:"Failed"},v=Ee(()=>p[c(a)]);gt(()=>{const C=new AbortController;return ke("/api/config").then(F=>{C.signal.aborted||b(s,F,!0)}).finally(()=>{C.signal.aborted||b(n,!1)}),()=>C.abort()});const x=Ee(()=>{if(!c(s)?.browser)return"";const C=Xi(),F=C?`?token=${encodeURIComponent(C)}`:"";return`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/vnc${F}`});gt(()=>{if(!c(_)||!c(x)||!c(i)||c(r)<0)return;b(a,"connecting");let C=null;try{C=new Xe(c(i),c(x)),C.scaleViewport=!0,C.resizeSession=!1,C.qualityLevel=9,C.compressionLevel=0,b(l,C,!0),C.addEventListener("connect",()=>{b(a,"connected")}),C.addEventListener("disconnect",F=>{const L=F.detail;b(a,L.clean?"disconnected":"failed",!0),b(l,null)})}catch{b(a,"failed"),b(l,null)}return()=>{C?.disconnect(),b(l,null)}});function y(){b(a,"connecting"),b(r,c(r)+1)}function w(){c(l)?.disconnect()}function S(){b(d,!c(d)),b(o,"")}function E(){c(l)&&c(l).clipboardPasteFrom(c(o))}var A=pt(),K=ye(A);{var U=C=>{var F=pv();k(C,F)},te=C=>{var F=gv();k(C,F)},X=C=>{var F=kv(),L=h(F),Z=h(L),oe=h(Z),ue=h(oe);let ee;var N=f(ue,2),se=h(N),ae=f(oe,2);{var me=ce=>{var ve=xv(),J=h(ve),j=f(h(J),2),V=h(j),pe=f(J,2),Ae=f(h(pe),2),Pe=h(Ae);O(()=>{M(V,c(s).browser.vncPort),M(Pe,c(s).browser.novncPort)}),k(ce,ve)};H(ae,ce=>{c(u)&&c(s)?.browser&&ce(me)})}var be=f(Z,2);{var he=ce=>{var ve=mv(),J=f(h(ve),2);let j;var V=f(J,2);{var pe=Ae=>{var Pe=bv();G("click",Pe,w),k(Ae,Pe)};H(V,Ae=>{c(a)==="connected"&&Ae(pe)})}O(()=>{j=xe(J,1,"toolbar-btn svelte-1szlhua",null,j,{"toolbar-btn-active":c(d)}),J.disabled=c(a)!=="connected"}),G("click",J,S),k(ce,ve)};H(be,ce=>{c(s)?.browser&&ce(he)})}var Te=f(L,2),ne=h(Te);{var re=ce=>{var ve=wv(),J=f(h(ve),2);Jt(J,"rows",4),G("input",J,E),Oe(J,()=>c(o),j=>b(o,j)),k(ce,ve)};H(ne,ce=>{c(d)&&ce(re)})}var de=f(ne,2);{var _e=ce=>{var ve=yv(),J=h(ve),j=h(J),V=f(J,4);O(()=>M(j,c(a)==="failed"?"Connection failed":"Disconnected")),G("click",V,y),k(ce,ve)};H(de,ce=>{(c(a)==="failed"||c(a)==="disconnected")&&ce(_e)})}var fe=f(de,2);let we;_h(fe,ce=>b(i,ce),()=>c(i)),O(()=>{ee=xe(ue,1,"conn-dot svelte-1szlhua",null,ee,{"conn-connecting":c(a)==="connecting","conn-on":c(a)==="connected","conn-off":c(a)==="disconnected"||c(a)==="failed"}),M(se,c(v)),we=xe(fe,1,"vnc-canvas svelte-1szlhua",null,we,{"vnc-hidden":c(a)!=="connected"})}),G("click",oe,()=>{b(u,!c(u))}),k(C,F)};H(K,C=>{c(n)?C(U):c(_)?C(X,!1):C(te,1)})}k(t,A),tt()}ut(["click","input"]);var Ev=T('<button class="val-btn agent-name editable svelte-ys3ftv"> </button>'),Cv=T('<button class="btn btn-outline btn-sm btn-danger">Delete</button>'),Av=T('<button class="val-btn mono editable"> </button>'),Kv=T('<button class="val-btn mono editable"> </button>'),Fv=T('<button class="val-btn mono editable"> </button>'),Tv=T('<button class="val-btn mono editable"> </button>'),Mv=T('<button class="prompt-block editable svelte-ys3ftv"> </button>'),Xv=T('<div class="agent-card svelte-ys3ftv"><div class="agent-bar svelte-ys3ftv"></div> <div class="agent-top svelte-ys3ftv"><div class="agent-identity svelte-ys3ftv"><!> <span class="agent-id mono svelte-ys3ftv"> </span></div> <div class="agent-actions svelte-ys3ftv"><select class="inline-select mono"><option>claude</option><option>opencode</option></select> <!></div></div> <div class="agent-fields svelte-ys3ftv"><div class="agent-field svelte-ys3ftv"><span class="row-label">Model</span> <!></div> <div class="agent-field svelte-ys3ftv"><span class="row-label">Fallback</span> <!></div> <div class="agent-field svelte-ys3ftv"><span class="row-label">Turns</span> <!></div> <div class="agent-field svelte-ys3ftv"><span class="row-label">Channels</span> <!></div></div> <div class="agent-prompt-area svelte-ys3ftv"><span class="row-label">System Prompt</span> <!></div></div>');function Lv(t,e){et(e,!0);let s=W("");function n(j,V){b(s,String(V),!0),e.editor.startEdit(`agent.${e.index}.${j}`,V)}function a(j){return e.editor.editingField===`agent.${e.index}.${j}`}var i=Xv(),r=f(h(i),2),l=h(r),d=h(l);{var o=j=>{mt(j,{get saving(){return e.editor.editingSaving},onsave:V=>e.onsavefield("name",V),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(V){b(s,V,!0)}})},u=Ee(()=>a("name")),_=j=>{var V=Ev(),pe=h(V);O(()=>M(pe,e.agent.name)),G("click",V,()=>n("name",e.agent.name)),k(j,V)};H(d,j=>{c(u)?j(o):j(_,!1)})}var p=f(d,2),v=h(p),x=f(l,2),y=h(x),w=h(y);w.value=w.__value="claude";var S=f(w);S.value=S.__value="opencode";var E;Nc(y);var A=f(y,2);{var K=j=>{var V=Cv();G("click",V,function(...pe){e.ondelete?.apply(this,pe)}),k(j,V)};H(A,j=>{e.agentCount>1&&j(K)})}var U=f(r,2),te=h(U),X=f(h(te),2);{var C=j=>{mt(j,{mono:!0,get saving(){return e.editor.editingSaving},onsave:V=>e.onsavefield("model",V),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(V){b(s,V,!0)}})},F=Ee(()=>a("model")),L=j=>{var V=Av(),pe=h(V);O(()=>M(pe,e.agent.model)),G("click",V,()=>n("model",e.agent.model)),k(j,V)};H(X,j=>{c(F)?j(C):j(L,!1)})}var Z=f(te,2),oe=f(h(Z),2);{var ue=j=>{mt(j,{mono:!0,get saving(){return e.editor.editingSaving},placeholder:"none",onsave:V=>e.onsavefield("fallbackModel",V,pe=>pe.trim()||null),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(V){b(s,V,!0)}})},ee=Ee(()=>a("fallbackModel")),N=j=>{var V=Kv(),pe=h(V);O(()=>M(pe,e.agent.fallbackModel??"none")),G("click",V,()=>n("fallbackModel",e.agent.fallbackModel??"")),k(j,V)};H(oe,j=>{c(ee)?j(ue):j(N,!1)})}var se=f(Z,2),ae=f(h(se),2);{var me=j=>{mt(j,{mono:!0,get saving(){return e.editor.editingSaving},onsave:V=>e.onsavefield("maxTurns",V,pe=>Number(pe)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(V){b(s,V,!0)}})},be=Ee(()=>a("maxTurns")),he=j=>{var V=Fv(),pe=h(V);O(()=>M(pe,e.agent.maxTurns)),G("click",V,()=>n("maxTurns",e.agent.maxTurns)),k(j,V)};H(ae,j=>{c(be)?j(me):j(he,!1)})}var Te=f(se,2),ne=f(h(Te),2);{var re=j=>{mt(j,{mono:!0,get saving(){return e.editor.editingSaving},onsave:V=>e.onsavefield("channels",V,pe=>pe.split(",").map(Ae=>Ae.trim()).filter(Boolean)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(V){b(s,V,!0)}})},de=Ee(()=>a("channels")),_e=j=>{var V=Tv(),pe=h(V);O(Ae=>M(pe,Ae),[()=>e.agent.channels.join(", ")||"*"]),G("click",V,()=>n("channels",e.agent.channels.join(", "))),k(j,V)};H(ne,j=>{c(de)?j(re):j(_e,!1)})}var fe=f(U,2),we=f(h(fe),2);{var ce=j=>{mt(j,{multiline:!0,get saving(){return e.editor.editingSaving},onsave:V=>e.onsavefield("systemPrompt",V),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(V){b(s,V,!0)}})},ve=Ee(()=>a("systemPrompt")),J=j=>{var V=Mv(),pe=h(V);O(()=>M(pe,e.agent.systemPrompt)),G("click",V,()=>n("systemPrompt",e.agent.systemPrompt)),k(j,V)};H(we,j=>{c(ve)?j(ce):j(J,!1)})}O(()=>{M(v,e.agent.id),E!==(E=e.agent.provider)&&(y.value=(y.__value=e.agent.provider)??"",Gr(y,e.agent.provider))}),G("change",y,j=>e.onsavefield("provider",j.currentTarget.value)),k(t,i),tt()}ut(["click","change"]);var Pv=T('<div class="agent-card agent-card-new svelte-6z0nn3"><div class="agent-bar agent-bar-new svelte-6z0nn3"></div> <div class="agent-top svelte-6z0nn3"><span class="agent-name svelte-6z0nn3" style="color: var(--color-accent)">New Agent</span> <button class="btn btn-outline btn-sm">Cancel</button></div> <div class="new-agent-form svelte-6z0nn3"><div class="form-row svelte-6z0nn3"><label class="form-lbl svelte-6z0nn3" for="new-agent-name">Name</label> <input id="new-agent-name" class="form-field svelte-6z0nn3" type="text" placeholder="Agent name"/></div> <div class="form-row svelte-6z0nn3"><label class="form-lbl svelte-6z0nn3" for="new-agent-provider">Provider</label> <select id="new-agent-provider" class="inline-select mono"><option>claude</option><option>opencode</option></select></div> <div class="form-row svelte-6z0nn3"><label class="form-lbl svelte-6z0nn3" for="new-agent-model">Model</label> <input id="new-agent-model" class="form-field mono svelte-6z0nn3" type="text" placeholder="sonnet"/></div> <div class="form-row svelte-6z0nn3"><label class="form-lbl svelte-6z0nn3" for="new-agent-turns">Max Turns</label> <input id="new-agent-turns" class="form-field mono svelte-6z0nn3" type="text" placeholder="50"/></div> <div class="form-row svelte-6z0nn3"><label class="form-lbl svelte-6z0nn3" for="new-agent-channels">Channels</label> <input id="new-agent-channels" class="form-field mono svelte-6z0nn3" type="text" placeholder="* (comma-separated)"/></div> <div class="form-row form-row-full svelte-6z0nn3"><label class="form-lbl svelte-6z0nn3" for="new-agent-prompt">System Prompt</label> <textarea id="new-agent-prompt" class="form-field form-field-textarea svelte-6z0nn3" placeholder="Optional system prompt"></textarea></div> <div class="form-row form-row-actions svelte-6z0nn3"><button class="btn btn-primary btn-sm">Create Agent</button></div></div></div>');function Bv(t,e){et(e,!0);let s=W(Ue({name:"",provider:"claude",model:"",maxTurns:"50",systemPrompt:"",channels:"*"}));function n(F){return F.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}async function a(){const F=n(c(s).name)||"agent",L=c(s).channels.split(",").map(ue=>ue.trim()).filter(Boolean),Z={id:F,name:c(s).name,provider:c(s).provider,model:c(s).model,fallbackModel:null,maxTurns:Number(c(s).maxTurns)||50,systemPrompt:c(s).systemPrompt||"You are responding in a Slack workspace. Be concise, helpful, and natural.",channels:L.length>0?L:["*"]};await e.onsave(Z)&&b(s,{name:"",provider:"claude",model:"",maxTurns:"50",systemPrompt:"",channels:"*"},!0)}var i=Pv(),r=f(h(i),2),l=f(h(r),2),d=f(r,2),o=h(d),u=f(h(o),2),_=f(o,2),p=f(h(_),2),v=h(p);v.value=v.__value="claude";var x=f(v);x.value=x.__value="opencode";var y=f(_,2),w=f(h(y),2),S=f(y,2),E=f(h(S),2),A=f(S,2),K=f(h(A),2),U=f(A,2),te=f(h(U),2),X=f(U,2),C=h(X);O(F=>C.disabled=F,[()=>!c(s).name.trim()||!c(s).model.trim()]),G("click",l,function(...F){e.oncancel?.apply(this,F)}),Oe(u,()=>c(s).name,F=>c(s).name=F),Uc(p,()=>c(s).provider,F=>c(s).provider=F),Oe(w,()=>c(s).model,F=>c(s).model=F),Oe(E,()=>c(s).maxTurns,F=>c(s).maxTurns=F),Oe(K,()=>c(s).channels,F=>c(s).channels=F),Oe(te,()=>c(s).systemPrompt,F=>c(s).systemPrompt=F),G("click",C,a),k(t,i),tt()}ut(["click"]);var Dv=T('<button class="btn btn-outline btn-sm">Add Agent</button>'),Rv=T('<div class="section"><div class="section-header"><h2 class="section-title">Agents</h2> <!></div> <!> <!></div>');function Iv(t,e){et(e,!0);let s=W(!1);async function n(v,x,y,w){const S=e.config.agents.map(U=>({...U})),E=S[v];if(!E)return;const A=w?w(y):y;E[x]=A,await e.editor.saveConfigPatch({agents:S})&&e.editor.cancelEdit()}async function a(v){if(e.config.agents.length<=1)return;const x=e.config.agents[v];if(!x||!await jr(`Delete agent "${x.name}"?`))return;const w=e.config.agents.filter((S,E)=>E!==v);await e.editor.saveConfigPatch({agents:w})}async function i(v){const x=[...e.config.agents,v],y=await e.editor.saveConfigPatch({agents:x});return y&&b(s,!1),y}var r=Rv(),l=h(r),d=f(h(l),2);{var o=v=>{var x=Dv();G("click",x,()=>{b(s,!0)}),k(v,x)};H(d,v=>{c(s)||v(o)})}var u=f(l,2);Ct(u,19,()=>e.config.agents,v=>v.id,(v,x,y)=>{Lv(v,{get agent(){return c(x)},get index(){return c(y)},get agentCount(){return e.config.agents.length},get editor(){return e.editor},onsavefield:(w,S,E)=>n(c(y),w,S,E),ondelete:()=>a(c(y))})});var _=f(u,2);{var p=v=>{Bv(v,{onsave:i,oncancel:()=>{b(s,!1)}})};H(_,v=>{c(s)&&v(p)})}k(t,r),tt()}ut(["click"]);var Qv=T('<div class="row"><span class="row-label">Uptime</span> <span class="row-value mono"> </span></div>'),zv=T('<button class="val-btn mono editable"> </button>'),Nv=T('<span class="cli-pill svelte-u0w225"><span class="dot dot-muted"></span> claude ...</span>'),Uv=T('<span class="cli-pill svelte-u0w225"><span class="dot dot-muted"></span> opencode ...</span>'),Hv=T('<span class="dim">Checking...</span>'),Ov=T("<!> <!> <!>",1),Vv=T('<span class="cli-pill cli-pill-ok svelte-u0w225"><span class="dot dot-on"></span> </span>'),Gv=T('<span class="cli-pill cli-pill-err svelte-u0w225"><span class="dot dot-off"></span> </span>'),qv=T('<span class="cli-pill svelte-u0w225"><span class="dot dot-muted"></span> </span>'),Wv=T('<div class="row"><span class="row-label">Node.js</span> <span class="row-value mono"> </span></div>'),jv=En('<svg viewBox="0 0 16 16" fill="none" aria-hidden="true" class="svelte-u0w225"><path d="M3 8.5l3.5 3.5L13 4.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></svg>'),Yv=T('<div class="secret-edit svelte-u0w225"><input type="password" autocomplete="off" class="secret-input mono svelte-u0w225" placeholder="sk-ant-..."/> <button class="inline-btn inline-btn-save svelte-u0w225" title="Save"><!></button> <button class="inline-btn inline-btn-cancel svelte-u0w225" title="Cancel"><svg viewBox="0 0 16 16" fill="none" aria-hidden="true" class="svelte-u0w225"><path d="M4 4l8 8M12 4l-8 8" stroke="currentColor" stroke-width="2" stroke-linecap="round"></path></svg></button></div>'),Zv=T('<button class="val-btn mono editable"> </button>'),Jv=T('<span class="dim">...</span>'),$v=T('<button class="val-btn mono editable"> </button>'),ep=T('<button class="val-btn mono editable"> </button>'),tp=T('<button class="val-btn mono editable"> </button>'),sp=T("<span><span></span> </span>"),np=En('<svg viewBox="0 0 16 16" fill="none" aria-hidden="true" class="svelte-u0w225"><path d="M3 8.5l3.5 3.5L13 4.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></svg>'),ap=T('<div class="secret-edit svelte-u0w225"><input type="password" autocomplete="off" class="secret-input mono svelte-u0w225"/> <button class="inline-btn inline-btn-save svelte-u0w225" title="Save"><!></button> <button class="inline-btn inline-btn-cancel svelte-u0w225" title="Cancel"><svg viewBox="0 0 16 16" fill="none" aria-hidden="true" class="svelte-u0w225"><path d="M4 4l8 8M12 4l-8 8" stroke="currentColor" stroke-width="2" stroke-linecap="round"></path></svg></button></div>'),ip=T('<button class="val-btn mono editable"> </button>'),rp=T('<span class="dim">...</span>'),lp=T('<div class="row"><span class="row-label"> </span> <span class="row-value"><!></span></div>'),op=T('<div class="notice svelte-u0w225">Restart the daemon to apply new Slack tokens.</div>'),cp=T('<button class="val-btn mono editable"> </button>'),dp=T('<button class="val-btn mono editable"> </button>'),up=T('<button class="val-btn mono editable"> </button>'),hp=T('<button class="val-btn mono editable"> </button>'),fp=T('<div class="row"><span class="row-label">Start / End</span> <span class="row-value"><!> <span class="dim">–</span> <!></span></div>'),_p=T("<span><span></span> </span>"),vp=T('<button class="val-btn mono editable"> </button>'),pp=T('<div class="row"><span class="row-label">VM Host</span> <span class="row-value"><!></span></div> <div class="row"><span class="row-label">Mode</span> <span class="row-value mono"> </span></div> <div class="row"><span class="row-label">VNC Port</span> <span class="row-value mono"> </span></div> <div class="row"><span class="row-label">noVNC Port</span> <span class="row-value mono"> </span></div>',1),gp=T('<button class="val-btn mono editable"> </button>'),xp=T('<button class="val-btn mono editable"> </button>'),bp=T('<div class="config-grid svelte-u0w225"><div class="panel"><div class="panel-header"><span class="panel-title">System</span></div> <div class="panel-body"><!> <div class="row"><span class="row-label">Timezone</span> <span class="row-value"><!></span></div> <div class="row"><span class="row-label">Web Port</span> <span class="row-value mono"> </span></div> <div class="row"><span class="row-label">Agent CLI</span> <span class="row-value"><!></span></div> <!> <div class="row"><span class="row-label">API Key</span> <span class="row-value"><!></span></div></div></div> <div class="panel"><div class="panel-header"><span class="panel-title">Sessions</span></div> <div class="panel-body"><div class="row"><span class="row-label">Max Concurrent</span> <span class="row-value"><!></span></div> <div class="row"><span class="row-label">TTL</span> <span class="row-value"><!></span></div> <div class="row"><span class="row-label">Timeout</span> <span class="row-value"><!></span></div></div></div> <div class="panel"><div class="panel-header"><span class="panel-title">Slack</span> <!></div> <div class="panel-body"><!> <!> <!> <div class="row"><span class="row-label">Require Mention</span> <span class="row-value"><!></span></div> <div class="row"><span class="row-label">Debounce</span> <span class="row-value"><!></span></div> <div class="row"><span class="row-label">Bypass DMs</span> <span class="row-value"><!></span></div> <div class="row"><span class="row-label">Channels</span> <span class="row-value"><!></span></div> <div class="row"><span class="row-label">Quiet Hours</span> <span class="row-value"><!></span></div> <!></div></div> <div class="panel"><div class="panel-header"><span class="panel-title">Browser</span> <!></div> <div class="panel-body"><div class="row"><span class="row-label">Enabled</span> <span class="row-value"><!></span></div> <!></div></div> <div class="panel"><div class="panel-header"><span class="panel-title">Birds</span></div> <div class="panel-body"><div class="row"><span class="row-label">Max Attempts</span> <span class="row-value"><!></span></div></div></div> <div class="panel"><div class="panel-header"><span class="panel-title">Database</span></div> <div class="panel-body"><div class="row"><span class="row-label">Retention</span> <span class="row-value"><!></span></div></div></div></div> <!>',1);function mp(t,e){et(e,!0);let s=W("");const n=Ee(()=>new Set(e.config.agents.map($=>$.provider)));function a($,q){b(s,String(q),!0),e.editor.startEdit($,q)}let i=W(null),r=W(""),l=W(!1),d=W(!1);function o($){b(i,$,!0),b(r,"")}function u(){b(i,null),b(l,!1)}async function _(){if(!(!c(i)||!c(r).trim())){b(l,!0);try{if(c(i)==="slackBotToken"||c(i)==="slackAppToken"){const $=c(i)==="slackBotToken"?{botToken:c(r).trim()}:{appToken:c(r).trim()},q=await ke("/api/secrets/slack",{method:"PUT",body:$});Me("Slack token saved","success"),q.requiresRestart&&b(d,!0)}else await ke("/api/secrets/anthropic",{method:"PUT",body:{apiKey:c(r).trim()}}),Me("API key saved (effective next session)","success");b(i,null),b(r,""),e.onsecretsupdate()}catch($){Me($.message,"error")}finally{b(l,!1)}}}function p($){$.key==="Escape"?u():$.key==="Enter"&&($.preventDefault(),_())}var v=bp(),x=ye(v),y=h(x),w=f(h(y),2),S=h(w);{var E=$=>{var q=Qv(),le=f(h(q),2),Le=h(le);O($e=>M(Le,$e),[()=>Vh(e.status.uptime)]),k($,q)};H(S,$=>{e.status&&$(E)})}var A=f(S,2),K=f(h(A),2),U=h(K);{var te=$=>{mt($,{mono:!0,get saving(){return e.editor.editingSaving},onsave:q=>e.editor.saveField("timezone",q),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(q){b(s,q,!0)}})},X=$=>{var q=zv(),le=h(q);O(()=>M(le,e.config.timezone)),G("click",q,()=>a("timezone",e.config.timezone)),k($,q)};H(U,$=>{e.editor.editingField==="timezone"?$(te):$(X,!1)})}var C=f(A,2),F=f(h(C),2),L=h(F),Z=f(C,2),oe=f(h(Z),2),ue=h(oe);{var ee=$=>{const q=Ee(()=>c(n).has("claude")),le=Ee(()=>c(n).has("opencode"));var Le=Ov(),$e=ye(Le);{var yt=Qe=>{var Je=Nv();k(Qe,Je)};H($e,Qe=>{c(q)&&Qe(yt)})}var Xt=f($e,2);{var Yt=Qe=>{var Je=Uv();k(Qe,Je)};H(Xt,Qe=>{c(le)&&Qe(Yt)})}var St=f(Xt,2);{var os=Qe=>{var Je=Hv();k(Qe,Je)};H(St,Qe=>{!c(q)&&!c(le)&&Qe(os)})}k($,Le)},N=$=>{var q=pt(),le=ye(q);Ct(le,17,()=>[{key:"claude",info:e.doctor.claude},{key:"opencode",info:e.doctor.opencode}],Vr,(Le,$e)=>{let yt=()=>c($e).key,Xt=()=>c($e).info;const Yt=Ee(()=>c(n).has(yt()));var St=pt(),os=ye(St);{var Qe=cs=>{var kt=Vv(),zt=f(h(kt));O(()=>M(zt,` ${yt()??""} ${Xt().version??""}`)),k(cs,kt)},Je=cs=>{var kt=Gv(),zt=f(h(kt));O(()=>M(zt,` ${yt()??""} not found`)),k(cs,kt)},Gs=cs=>{var kt=qv(),zt=f(h(kt));O(()=>M(zt,` ${yt()??""} ${Xt().version??""}`)),k(cs,kt)};H(os,cs=>{c(Yt)&&Xt().available?cs(Qe):c(Yt)&&!Xt().available?cs(Je,1):!c(Yt)&&Xt().available&&cs(Gs,2)})}k(Le,St)}),k($,q)};H(ue,$=>{e.doctorLoading?$(ee):e.doctor&&$(N,1)})}var se=f(Z,2);{var ae=$=>{var q=Wv(),le=f(h(q),2),Le=h(le);O(()=>M(Le,e.doctor.node)),k($,q)};H(se,$=>{e.doctor&&$(ae)})}var me=f(se,2),be=f(h(me),2),he=h(be);{var Te=$=>{var q=Yv(),le=h(q),Le=f(le,2),$e=h(Le);{var yt=St=>{var os=Qs("...");k(St,os)},Xt=St=>{var os=jv();k(St,os)};H($e,St=>{c(l)?St(yt):St(Xt,!1)})}var Yt=f(Le,2);O(()=>Le.disabled=c(l)||!c(r)),G("keydown",le,p),Oe(le,()=>c(r),St=>b(r,St)),G("click",Le,_),G("click",Yt,u),k($,q)},ne=$=>{var q=Zv(),le=h(q);O(()=>M(le,e.secrets.anthropic.set?e.secrets.anthropic.hint:"not set")),G("click",q,()=>o("apiKey")),k($,q)},re=$=>{var q=Jv();k($,q)};H(he,$=>{c(i)==="apiKey"?$(Te):e.secrets?$(ne,1):$(re,!1)})}var de=f(y,2),_e=f(h(de),2),fe=h(_e),we=f(h(fe),2),ce=h(we);{var ve=$=>{mt($,{mono:!0,get saving(){return e.editor.editingSaving},onsave:q=>e.editor.saveField("sessions.maxConcurrent",q,le=>Number(le)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(q){b(s,q,!0)}})},J=$=>{var q=$v(),le=h(q);O(()=>M(le,e.config.sessions.maxConcurrent)),G("click",q,()=>a("sessions.maxConcurrent",e.config.sessions.maxConcurrent)),k($,q)};H(ce,$=>{e.editor.editingField==="sessions.maxConcurrent"?$(ve):$(J,!1)})}var j=f(fe,2),V=f(h(j),2),pe=h(V);{var Ae=$=>{mt($,{mono:!0,get saving(){return e.editor.editingSaving},onsave:q=>e.editor.saveField("sessions.ttlHours",q,le=>Number(le)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(q){b(s,q,!0)}})},Pe=$=>{var q=ep(),le=h(q);O(()=>M(le,`${e.config.sessions.ttlHours??""}h`)),G("click",q,()=>a("sessions.ttlHours",e.config.sessions.ttlHours)),k($,q)};H(pe,$=>{e.editor.editingField==="sessions.ttlHours"?$(Ae):$(Pe,!1)})}var Ie=f(j,2),st=f(h(Ie),2),De=h(st);{var xt=$=>{mt($,{mono:!0,get saving(){return e.editor.editingSaving},onsave:q=>e.editor.saveField("sessions.processTimeoutMs",q,le=>Math.round(Number(le)*1e3)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(q){b(s,q,!0)}})},Gt=$=>{var q=tp(),le=h(q);O(Le=>M(le,`${Le??""}s`),[()=>(e.config.sessions.processTimeoutMs/1e3).toFixed(0)]),G("click",q,()=>a("sessions.processTimeoutMs",(e.config.sessions.processTimeoutMs/1e3).toFixed(0))),k($,q)};H(De,$=>{e.editor.editingField==="sessions.processTimeoutMs"?$(xt):$(Gt,!1)})}var rs=f(de,2),qt=h(rs),es=f(h(qt),2);{var lt=$=>{var q=sp();let le;var Le=h(q);let $e;var yt=f(Le);O(()=>{le=xe(q,1,"svc-chip",null,le,{"svc-chip-ok":e.status.slack.connected,"svc-chip-err":!e.status.slack.connected}),$e=xe(Le,1,"dot",null,$e,{"dot-on":e.status.slack.connected,"dot-off":!e.status.slack.connected}),M(yt,` ${e.status.slack.connected?"connected":"disconnected"}`)}),k($,q)};H(es,$=>{e.status&&$(lt)})}var Wt=f(qt,2);{const $=(q,le=ba,Le=ba,$e=ba,yt=ba)=>{var Xt=lp(),Yt=h(Xt),St=h(Yt),os=f(Yt,2),Qe=h(os);{var Je=kt=>{var zt=ap(),ds=h(zt),vs=f(ds,2),zi=h(vs);{var Ld=on=>{var Ni=Qs("...");k(on,Ni)},Pd=on=>{var Ni=np();k(on,Ni)};H(zi,on=>{c(l)?on(Ld):on(Pd,!1)})}var Bd=f(vs,2);O(()=>{Jt(ds,"placeholder",$e()),vs.disabled=c(l)||!c(r)}),G("keydown",ds,p),Oe(ds,()=>c(r),on=>b(r,on)),G("click",vs,_),G("click",Bd,u),k(kt,zt)},Gs=kt=>{var zt=ip(),ds=h(zt);O(()=>M(ds,yt().set?yt().hint:"not set")),G("click",zt,()=>o(le())),k(kt,zt)},cs=kt=>{var zt=rp();k(kt,zt)};H(Qe,kt=>{c(i)===le()?kt(Je):yt()?kt(Gs,1):kt(cs,!1)})}O(()=>M(St,Le())),k(q,Xt)};var ts=h(Wt);{var ls=q=>{var le=op();k(q,le)};H(ts,q=>{c(d)&&q(ls)})}var bt=f(ts,2);$(bt,()=>"slackBotToken",()=>"Bot Token",()=>"xoxb-...",()=>e.secrets?.slack.botToken);var _s=f(bt,2);$(_s,()=>"slackAppToken",()=>"App Token",()=>"xapp-...",()=>e.secrets?.slack.appToken);var Us=f(_s,2),Cn=f(h(Us),2),Hs=h(Cn);Pn(Hs,{get active(){return e.config.slack.requireMention},onToggle:()=>e.editor.toggleField("slack.requireMention",e.config.slack.requireMention)});var ks=f(Us,2),Os=f(h(ks),2),Xs=h(Os);{var Ss=q=>{mt(q,{mono:!0,get saving(){return e.editor.editingSaving},onsave:le=>e.editor.saveField("slack.coalesce.debounceMs",le,Le=>Number(Le)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(le){b(s,le,!0)}})},rn=q=>{var le=cp(),Le=h(le);O(()=>M(Le,`${e.config.slack.coalesce.debounceMs??""}ms`)),G("click",le,()=>a("slack.coalesce.debounceMs",e.config.slack.coalesce.debounceMs)),k(q,le)};H(Xs,q=>{e.editor.editingField==="slack.coalesce.debounceMs"?q(Ss):q(rn,!1)})}var Ls=f(ks,2),ln=f(h(Ls),2),Ge=h(ln);Pn(Ge,{get active(){return e.config.slack.coalesce.bypassDms},onToggle:()=>e.editor.toggleField("slack.coalesce.bypassDms",e.config.slack.coalesce.bypassDms)});var qe=f(Ls,2),ht=f(h(qe),2),ot=h(ht);{var At=q=>{mt(q,{mono:!0,get saving(){return e.editor.editingSaving},onsave:le=>e.editor.saveField("slack.channels",le,Le=>Le.split(",").map($e=>$e.trim()).filter(Boolean)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(le){b(s,le,!0)}})},ct=q=>{var le=dp(),Le=h(le);O($e=>M(Le,$e),[()=>e.config.slack.channels.join(", ")||"*"]),G("click",le,()=>a("slack.channels",e.config.slack.channels.join(", "))),k(q,le)};H(ot,q=>{e.editor.editingField==="slack.channels"?q(At):q(ct,!1)})}var We=f(qe,2),ft=f(h(We),2),Ye=h(ft);Pn(Ye,{get active(){return e.config.slack.quietHours.enabled},onToggle:()=>e.editor.toggleField("slack.quietHours.enabled",e.config.slack.quietHours.enabled)});var Y=f(We,2);{var ie=q=>{var le=fp(),Le=f(h(le),2),$e=h(Le);{var yt=Qe=>{mt(Qe,{mono:!0,get saving(){return e.editor.editingSaving},placeholder:"HH:MM",onsave:Je=>e.editor.saveField("slack.quietHours.start",Je),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(Je){b(s,Je,!0)}})},Xt=Qe=>{var Je=up(),Gs=h(Je);O(()=>M(Gs,e.config.slack.quietHours.start)),G("click",Je,()=>a("slack.quietHours.start",e.config.slack.quietHours.start)),k(Qe,Je)};H($e,Qe=>{e.editor.editingField==="slack.quietHours.start"?Qe(yt):Qe(Xt,!1)})}var Yt=f($e,4);{var St=Qe=>{mt(Qe,{mono:!0,get saving(){return e.editor.editingSaving},placeholder:"HH:MM",onsave:Je=>e.editor.saveField("slack.quietHours.end",Je),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(Je){b(s,Je,!0)}})},os=Qe=>{var Je=hp(),Gs=h(Je);O(()=>M(Gs,e.config.slack.quietHours.end)),G("click",Je,()=>a("slack.quietHours.end",e.config.slack.quietHours.end)),k(Qe,Je)};H(Yt,Qe=>{e.editor.editingField==="slack.quietHours.end"?Qe(St):Qe(os,!1)})}k(q,le)};H(Y,q=>{e.config.slack.quietHours.enabled&&q(ie)})}}var ge=f(rs,2),Ke=h(ge),Ne=f(h(Ke),2);{var je=$=>{var q=_p();let le;var Le=h(q);let $e;var yt=f(Le);O(()=>{le=xe(q,1,"svc-chip",null,le,{"svc-chip-ok":e.status.browser.connected,"svc-chip-err":!e.status.browser.connected}),$e=xe(Le,1,"dot",null,$e,{"dot-on":e.status.browser.connected,"dot-off":!e.status.browser.connected}),M(yt,` ${e.status.browser.connected?"connected":"unreachable"}`)}),k($,q)};H(Ne,$=>{e.config.browser.enabled&&e.status&&$(je)})}var dt=f(Ke,2),_t=h(dt),Rt=f(h(_t),2),Mt=h(Rt);Pn(Mt,{get active(){return e.config.browser.enabled},onToggle:()=>e.editor.toggleField("browser.enabled",e.config.browser.enabled)});var It=f(_t,2);{var Ps=$=>{var q=pp(),le=ye(q),Le=f(h(le),2),$e=h(Le);{var yt=ds=>{mt(ds,{mono:!0,get saving(){return e.editor.editingSaving},onsave:vs=>e.editor.saveField("browser.novncHost",vs),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(vs){b(s,vs,!0)}})},Xt=ds=>{var vs=vp(),zi=h(vs);O(()=>M(zi,e.config.browser.novncHost)),G("click",vs,()=>a("browser.novncHost",e.config.browser.novncHost)),k(ds,vs)};H($e,ds=>{e.editor.editingField==="browser.novncHost"?ds(yt):ds(Xt,!1)})}var Yt=f(le,2),St=f(h(Yt),2),os=h(St),Qe=f(Yt,2),Je=f(h(Qe),2),Gs=h(Je),cs=f(Qe,2),kt=f(h(cs),2),zt=h(kt);O(()=>{M(os,e.config.browser.mode),M(Gs,e.config.browser.vncPort),M(zt,e.config.browser.novncPort)}),k($,q)};H(It,$=>{e.config.browser.enabled&&$(Ps)})}var Fe=f(ge,2),Ze=f(h(Fe),2),nt=h(Ze),Qt=f(h(nt),2),jt=h(Qt);{var An=$=>{mt($,{mono:!0,get saving(){return e.editor.editingSaving},onsave:q=>e.editor.saveField("birds.maxAttempts",q,le=>Number(le)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(q){b(s,q,!0)}})},Vs=$=>{var q=gp(),le=h(q);O(()=>M(le,e.config.birds.maxAttempts)),G("click",q,()=>a("birds.maxAttempts",e.config.birds.maxAttempts)),k($,q)};H(jt,$=>{e.editor.editingField==="birds.maxAttempts"?$(An):$(Vs,!1)})}var Bs=f(Fe,2),da=f(h(Bs),2),Qi=h(da),Kd=f(h(Qi),2),Fd=h(Kd);{var Td=$=>{mt($,{mono:!0,get saving(){return e.editor.editingSaving},onsave:q=>e.editor.saveField("database.retentionDays",q,le=>Number(le)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(q){b(s,q,!0)}})},Md=$=>{var q=xp(),le=h(q);O(()=>M(le,`${e.config.database.retentionDays??""} days`)),G("click",q,()=>a("database.retentionDays",e.config.database.retentionDays)),k($,q)};H(Fd,$=>{e.editor.editingField==="database.retentionDays"?$(Td):$(Md,!1)})}var Xd=f(x,2);Iv(Xd,{get config(){return e.config},get editor(){return e.editor}}),O(()=>M(L,e.config.web.port)),k(t,v),tt()}ut(["click","keydown"]);var wp=T('<span class="queue-summary mono svelte-17vayue"> </span>'),yp=T('<div class="stat-row svelte-17vayue"><div class="stat-cell svelte-17vayue"><span class="stat-num svelte-17vayue"> </span> <span class="stat-lbl svelte-17vayue">pending</span></div> <div class="stat-cell svelte-17vayue"><span class="stat-num stat-num-active svelte-17vayue"> </span> <span class="stat-lbl svelte-17vayue">running</span></div> <div class="stat-cell svelte-17vayue"><span class="stat-num stat-num-ok svelte-17vayue"> </span> <span class="stat-lbl svelte-17vayue">completed</span></div> <div class="stat-cell svelte-17vayue"><span class="stat-num stat-num-err svelte-17vayue"> </span> <span class="stat-lbl svelte-17vayue">failed</span></div></div>'),kp=T('<div class="panel"><div class="panel-header"><span class="panel-title">Job Queue</span> <!></div> <div class="panel-body"><!> <div class="action-row svelte-17vayue"><button class="btn btn-outline btn-sm"> </button> <button class="btn btn-outline btn-sm"> </button> <button class="btn btn-outline btn-sm"> </button></div></div></div>');function Sp(t,e){et(e,!0);let s=W(null);gt(()=>{e.initialStats!=null&&b(s,e.initialStats,!0)});let n=W(!1),a=W(!1),i=W(!1);async function r(){b(s,await ke("/api/jobs/stats"),!0)}async function l(){b(n,!0);try{const C=await ke("/api/jobs/retry-all",{method:"POST"});Me(`${C.count} failed job(s) queued for retry`,"success"),await r()}catch(C){Me(`Failed: ${C.message}`,"error")}finally{b(n,!1)}}async function d(){b(a,!0);try{const C=await ke("/api/jobs/clear?status=completed",{method:"DELETE"});Me(`${C.count} completed job(s) cleared`,"success"),await r()}catch(C){Me(`Failed: ${C.message}`,"error")}finally{b(a,!1)}}async function o(){b(i,!0);try{const C=await ke("/api/jobs/clear?status=failed",{method:"DELETE"});Me(`${C.count} failed job(s) cleared`,"success"),await r()}catch(C){Me(`Failed: ${C.message}`,"error")}finally{b(i,!1)}}var u=kp(),_=h(u),p=f(h(_),2);{var v=C=>{var F=wp(),L=h(F);O(()=>M(L,`${c(s).total??""} total`)),k(C,F)};H(p,C=>{c(s)&&C(v)})}var x=f(_,2),y=h(x);{var w=C=>{var F=yp(),L=h(F),Z=h(L),oe=h(Z),ue=f(L,2),ee=h(ue),N=h(ee),se=f(ue,2),ae=h(se),me=h(ae),be=f(se,2),he=h(be),Te=h(he);O(()=>{M(oe,c(s).pending),M(N,c(s).running),M(me,c(s).completed),M(Te,c(s).failed)}),k(C,F)};H(y,C=>{c(s)&&C(w)})}var S=f(y,2),E=h(S),A=h(E),K=f(E,2),U=h(K),te=f(K,2),X=h(te);O(()=>{E.disabled=c(n)||(c(s)?.failed??0)===0,M(A,c(n)?"Retrying...":"Retry Failed"),K.disabled=c(a)||(c(s)?.completed??0)===0,M(U,c(a)?"Clearing...":"Clear Completed"),te.disabled=c(i)||(c(s)?.failed??0)===0,M(X,c(i)?"Clearing...":"Clear Failed")}),G("click",E,l),G("click",K,d),G("click",te,o),k(t,u),tt()}ut(["click"]);var Ep=T('<div class="row"><span class="dim">No system birds registered</span></div>'),Cp=T('<span class="bird-last-run svelte-12folcn"> <!></span>'),Ap=T('<button class="btn btn-outline btn-sm">Flights</button>'),Kp=T('<div class="flight-empty svelte-12folcn"><span class="dim">No flights recorded</span></div>'),Fp=T('<div class="flight-row svelte-12folcn"><span class="mono flight-id svelte-12folcn"> </span> <!> <span class="mono"> </span> <span class="flight-time svelte-12folcn"> </span></div>'),Tp=T('<div class="flight-list svelte-12folcn"><!></div>'),Mp=T('<div><div class="bird-top svelte-12folcn"><div class="bird-info svelte-12folcn"><span class="bird-name mono svelte-12folcn"> </span> <span class="bird-schedule mono dim svelte-12folcn"> </span></div> <div class="bird-actions svelte-12folcn"><!> <!> <button class="btn btn-outline btn-sm">Fly</button></div></div> <!></div>'),Xp=T('<div class="panel"><div class="panel-header"><span class="panel-title">System Birds</span> <span class="bird-count mono svelte-12folcn"> </span></div> <div class="panel-body"><!></div></div>');function Lp(t,e){et(e,!0);let s=W(Ue({}));async function n(v){if(!c(s)[v])try{const x=await ke(`/api/birds/${v}/flights?perPage=5`);b(s,{...c(s),[v]:x.items},!0)}catch{b(s,{...c(s),[v]:[]},!0)}}async function a(v,x){try{const y=await ke(`/api/birds/${v}/fly`,{method:"POST"});Me(`${x} sent on a flight (job #${y.jobId})`,"success");const{[v]:w,...S}=c(s);b(s,S,!0)}catch(y){Me(`Failed: ${y.message}`,"error")}}var i=Xp(),r=h(i),l=f(h(r),2),d=h(l),o=f(r,2),u=h(o);{var _=v=>{var x=Ep();k(v,x)},p=v=>{var x=pt(),y=ye(x);Ct(y,19,()=>e.birds,w=>w.uid,(w,S,E)=>{var A=Mp();let K;var U=h(A),te=h(U),X=h(te),C=h(X),F=f(X,2),L=h(F),Z=f(te,2),oe=h(Z);{var ue=be=>{var he=Cp(),Te=h(he),ne=f(Te);{var re=de=>{mn(de,{get status(){return c(S).last_status}})};H(ne,de=>{c(S).last_status&&de(re)})}O(de=>M(Te,`${de??""} `),[()=>bs(c(S).last_run)]),k(be,he)};H(oe,be=>{c(S).last_run&&be(ue)})}var ee=f(oe,2);{var N=be=>{var he=Ap();G("click",he,()=>n(c(S).uid)),k(be,he)};H(ee,be=>{c(s)[c(S).uid]||be(N)})}var se=f(ee,2),ae=f(U,2);{var me=be=>{var he=Tp(),Te=h(he);{var ne=de=>{var _e=Kp();k(de,_e)},re=de=>{var _e=pt(),fe=ye(_e);Ct(fe,17,()=>c(s)[c(S).uid],we=>we.uid,(we,ce)=>{var ve=Fp(),J=h(ve),j=h(J),V=f(J,2);mn(V,{get status(){return c(ce).status}});var pe=f(V,2),Ae=h(pe),Pe=f(pe,2),Ie=h(Pe);O((st,De,xt)=>{M(j,st),M(Ae,De),M(Ie,xt)},[()=>Kt(c(ce).uid),()=>bi(c(ce).started_at,c(ce).finished_at),()=>bs(c(ce).started_at)]),k(we,ve)}),k(de,_e)};H(Te,de=>{c(s)[c(S).uid].length===0?de(ne):de(re,!1)})}k(be,he)};H(ae,be=>{c(s)[c(S).uid]!=null&&be(me)})}O(()=>{K=xe(A,1,"bird-entry svelte-12folcn",null,K,{"bird-entry-border":c(E)<e.birds.length-1}),M(C,c(S).name),M(L,c(S).schedule)}),G("click",se,()=>a(c(S).uid,c(S).name)),k(w,A)}),k(v,x)};H(u,v=>{e.birds.length===0?v(_):v(p,!1)})}O(()=>M(d,e.birds.length)),k(t,i),tt()}ut(["click"]);var Pp=T('<span class="error-count svelte-ht9bxs"> </span>'),Bp=T('<div class="row"><span class="dim">No errors recorded</span></div>'),Dp=T('<div class="error-entry svelte-ht9bxs"><div class="error-top svelte-ht9bxs"><span class="error-source mono svelte-ht9bxs"> </span> <span class="error-time svelte-ht9bxs"> </span></div> <span class="error-message svelte-ht9bxs"> </span></div>'),Rp=T('<div class="db-grid svelte-ht9bxs"><!> <div class="panel"><div class="panel-header"><span class="panel-title">Recent Errors</span> <!></div> <div class="panel-body"><!></div></div></div> <!>',1);function Ip(t,e){et(e,!0);var s=Rp(),n=ye(s),a=h(n);Sp(a,{get initialStats(){return e.jobStats}});var i=f(a,2),r=h(i),l=f(h(r),2);{var d=x=>{var y=Pp(),w=h(y);O(()=>M(w,e.recentErrors.length)),k(x,y)};H(l,x=>{e.recentErrors.length>0&&x(d)})}var o=f(r,2),u=h(o);{var _=x=>{var y=Bp();k(x,y)},p=x=>{var y=pt(),w=ye(y);Ct(w,17,()=>e.recentErrors,S=>S.id,(S,E)=>{var A=Dp(),K=h(A),U=h(K),te=h(U),X=f(U,2),C=h(X),F=f(K,2),L=h(F);O(Z=>{M(te,c(E).source),M(C,Z),M(L,c(E).message)},[()=>bs(c(E).created_at)]),k(S,A)}),k(x,y)};H(u,x=>{e.recentErrors.length===0?x(_):x(p,!1)})}var v=f(n,2);Lp(v,{get birds(){return e.systemBirds}}),k(t,s),tt()}var Qp=T('<div class="loading">Loading...</div>'),zp=T('<div class="tabs svelte-1ozf5k3"><button>Config</button> <button>Database</button></div> <!> <!>',1);function Np(t,e){et(e,!0);let s=W(null),n=W(null),a=W(null),i=W(!0),r=W(Ue([])),l=W(null),d=W(Ue([])),o=W(!0),u=W("config"),_=W(null),p=W(!1);gt(()=>{const F=new AbortController;return Promise.all([ke("/api/config"),ke("/api/logs?level=error&perPage=10"),ke("/api/jobs/stats"),ke("/api/birds?system=true&perPage=100"),ke("/api/secrets")]).then(([L,Z,oe,ue,ee])=>{F.signal.aborted||(b(s,L,!0),b(r,Z.items,!0),b(l,oe,!0),b(d,ue.items.filter(N=>N.name.startsWith("__bb_")),!0),b(n,ee,!0))}).finally(()=>{F.signal.aborted||b(o,!1)}),()=>F.abort()}),gt(()=>{const F=new AbortController;return ke("/api/doctor").then(L=>{F.signal.aborted||b(a,L,!0)}).finally(()=>{F.signal.aborted||b(i,!1)}),()=>F.abort()}),gt(()=>Pi(F=>{F.resource==="config"&&ke("/api/config").then(L=>{b(s,L,!0)}).catch(()=>{}),F.resource==="secrets"&&v()}));function v(){ke("/api/secrets").then(F=>{b(n,F,!0)}).catch(()=>{})}function x(F,L){const Z=F.split(".");let oe={};const ue=oe;for(let ee=0;ee<Z.length-1;ee++){const N={};oe[Z[ee]]=N,oe=N}return oe[Z[Z.length-1]]=L,ue}async function y(F){try{const L=await ke("/api/config",{method:"PATCH",body:F});return b(s,L,!0),Me("Config saved","success"),!0}catch(L){return Me(`Failed: ${L.message}`,"error"),!1}}function w(F,L){b(_,F,!0),b(p,!1)}function S(){b(_,null),b(p,!1)}async function E(F,L,Z){b(p,!0);const oe=Z?Z(L):L;await y(x(F,oe))?S():b(p,!1)}async function A(F,L){await y(x(F,!L))}const K=Ee(()=>({editingField:c(_),editingSaving:c(p),startEdit:w,cancelEdit:S,saveField:E,toggleField:A,saveConfigPatch:y}));var U=pt(),te=ye(U);{var X=F=>{var L=Qp();k(F,L)},C=F=>{var L=zp(),Z=ye(L),oe=h(Z);let ue;var ee=f(oe,2);let N;var se=f(Z,2);{var ae=he=>{mp(he,{get config(){return c(s)},get status(){return e.status},get doctor(){return c(a)},get doctorLoading(){return c(i)},get editor(){return c(K)},get secrets(){return c(n)},onsecretsupdate:v})};H(se,he=>{c(u)==="config"&&he(ae)})}var me=f(se,2);{var be=he=>{Ip(he,{get jobStats(){return c(l)},get systemBirds(){return c(d)},get recentErrors(){return c(r)}})};H(me,he=>{c(u)==="database"&&he(be)})}O(()=>{ue=xe(oe,1,"tab svelte-1ozf5k3",null,ue,{"tab-active":c(u)==="config"}),N=xe(ee,1,"tab svelte-1ozf5k3",null,N,{"tab-active":c(u)==="database"})}),G("click",oe,()=>{b(u,"config")}),G("click",ee,()=>{b(u,"database")}),k(F,L)};H(te,F=>{c(o)?F(X):c(s)&&F(C,1)})}k(t,U),tt()}ut(["click"]);var Up=T('<div class="card-sub svelte-1tf674w"> </div>'),Hp=T('<div><div class="card-label svelte-1tf674w"> </div> <div class="card-value svelte-1tf674w"> </div> <!></div>');function hr(t,e){var s=Hp();let n;var a=h(s),i=h(a),r=f(a,2),l=h(r),d=f(r,2);{var o=u=>{var _=Up(),p=h(_);O(()=>M(p,e.sub)),k(u,_)};H(d,u=>{e.sub&&u(o)})}O(()=>{n=xe(s,1,"stat-card svelte-1tf674w",null,n,{"stat-card-info":e.variant==="info","stat-card-warning":e.variant==="warning","stat-card-success":e.variant==="success","stat-card-error":e.variant==="error"}),M(i,e.label),M(l,e.value)}),k(t,s)}var Op=T('<div class="error-state svelte-1lyclyh"><p> </p> <button class="btn btn-outline btn-sm">Back to Sessions</button></div>'),Vp=T('<div class="loading">Loading...</div>'),Gp=T('<div class="filter-spacer svelte-1lyclyh"></div> <span class="last-updated svelte-1lyclyh"> </span>',1),qp=T('<tr><td><!></td><td class="mono"> </td><td class="content-cell svelte-1lyclyh"> </td><td class="mono"> </td><td class="mono"> </td><td> </td></tr>'),Wp=T('<div class="detail-header svelte-1lyclyh"><button class="btn btn-outline btn-sm"><svg class="back-icon svelte-1lyclyh" viewBox="0 0 6 10" fill="none" aria-hidden="true"><path d="M5 1L1 5L5 9" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg> Sessions</button> <h2 class="session-title svelte-1lyclyh"> </h2> <span class="session-meta svelte-1lyclyh"><span class="mono"> </span> <span class="meta-sep svelte-1lyclyh"></span> <span class="meta-sep svelte-1lyclyh"></span> </span></div> <div class="stat-cards svelte-1lyclyh"><!> <!> <!></div> <!>',1);function jp(t,e){et(e,!0);const s=Li().get("id")??"",n=[{key:"direction",label:"Dir"},{key:"user_id",label:"User",sortable:!0},{key:"content",label:"Content"},{key:"tokens_in",label:"Tokens In"},{key:"tokens_out",label:"Tokens Out"},{key:"created_at",label:"Time",sortable:!0}];let a=W(Ue(kn())),i=W(null),r=W(null),l=W("");const d=s?Yr({endpoint:`/api/sessions/${s}`,columns:n,defaultSort:"created_at",invalidateOn:"sessions",transformResponse:y=>y.messages,onResponse:y=>{b(a,kn(),!0),b(i,y.session,!0),b(r,y.stats,!0)}}):null;d||b(l,"Invalid session ID");function o(){window.location.hash="#/sessions"}var u=pt(),_=ye(u);{var p=y=>{var w=Op(),S=h(w),E=h(S),A=f(S,2);O(()=>M(E,c(l))),G("click",A,o),k(y,w)},v=y=>{var w=Vp();k(y,w)},x=y=>{var w=Wp(),S=ye(w),E=h(S),A=f(E,2),K=h(A),U=f(A,2),te=h(U),X=h(te),C=f(te,3),F=f(C,2),L=f(S,2),Z=h(L);hr(Z,{label:"Messages",get value(){return c(i).message_count}});var oe=f(Z,2);{let N=Ee(()=>c(r).totalTokensIn.toLocaleString());hr(oe,{label:"Tokens In",get value(){return c(N)}})}var ue=f(oe,2);{let N=Ee(()=>c(r).totalTokensOut.toLocaleString());hr(ue,{label:"Tokens Out",get value(){return c(N)}})}var ee=f(L,2);{const N=ae=>{var me=Gp(),be=f(ye(me),2),he=h(be);O(()=>M(he,`Updated ${c(a)??""}`)),k(ae,me)};let se=Ee(()=>d.items.length===0);hn(ee,{get columns(){return n},get isEmpty(){return c(se)},emptyMessage:"No messages recorded for this session",get fetching(){return d.fetching},get page(){return d.page},get totalPages(){return d.totalPages},get totalItems(){return d.totalItems},get sort(){return d.sort},get search(){return d.search},searchPlaceholder:"Search messages...",get onPageChange(){return d.setPage},get onSortChange(){return d.setSort},get onSearchChange(){return d.setSearch},toolbar:N,children:(ae,me)=>{var be=pt(),he=ye(be);Ct(he,17,()=>d.items,Te=>Te.id,(Te,ne)=>{var re=qp(),de=h(re),_e=h(de);{let Ie=Ee(()=>c(ne).direction==="in"?"info":"success");mn(_e,{get status(){return c(Ie)}})}var fe=f(de),we=h(fe),ce=f(fe),ve=h(ce),J=f(ce),j=h(J),V=f(J),pe=h(V),Ae=f(V),Pe=h(Ae);O(Ie=>{M(we,c(ne).user_id),M(ve,c(ne).content??"-"),M(j,c(ne).tokens_in??"-"),M(pe,c(ne).tokens_out??"-"),M(Pe,Ie)},[()=>bs(c(ne).created_at)]),k(Te,re)}),k(ae,be)},$$slots:{toolbar:!0,default:!0}})}O((N,se)=>{M(K,`Session ${N??""}`),M(X,c(i).channel_id),M(C,` ${c(i).agent_id??""} `),M(F,` ${se??""}`)},[()=>Kt(c(i).uid),()=>bs(c(i).last_active)]),G("click",E,o),k(y,w)};H(_,y=>{c(l)?y(p):d?.loading?y(v,1):c(i)&&c(r)&&d&&y(x,2)})}k(t,u),tt()}ut(["click"]);var Yp=T("<div></div>"),Zp=T('<div><span class="step-number svelte-dm5b3b"></span></div> <!>',1),Jp=T('<div class="step-indicator svelte-dm5b3b"></div>'),$p=T('<div class="login-error svelte-dm5b3b"> </div>'),eg=T(`<p class="onboarding-desc svelte-dm5b3b">Create a Slack app at <a target="_blank" rel="noopener" class="onboarding-link svelte-dm5b3b">api.slack.com/apps</a> using the <a target="_blank" rel="noopener" class="onboarding-link svelte-dm5b3b">manifest.json</a>.</p> <form><label class="form-label">Bot Token <input type="password" class="form-input" placeholder="xoxb-..." autocomplete="off"/> <span class="form-hint svelte-dm5b3b">OAuth & Permissions, click "Install to Workspace", then copy the token</span></label> <label class="form-label">App Token <input type="password" class="form-input" placeholder="xapp-..." autocomplete="off"/> <span class="form-hint svelte-dm5b3b">Basic Information, click "Generate Token and Scopes", add connections:write, then copy
|
|
6
|
+
`);let d=js(s[l]+"\0");a.push(d.length>>24&255,d.length>>16&255,d.length>>8&255,d.length&255);for(let o=0;o<d.length;o++)a.push(d.charCodeAt(o))}let i=n.deflate(new Uint8Array(a)),r=new Uint8Array(4+i.length);r.set(Xe.messages._buildExtendedClipboardFlags([vi],e)),r.set(i,4),Xe.messages.clientCutText(t,r,!0)},extendedClipboardNotify(t,e){let s=Xe.messages._buildExtendedClipboardFlags([Sa],e);Xe.messages.clientCutText(t,s,!0)},extendedClipboardRequest(t,e){let s=Xe.messages._buildExtendedClipboardFlags([_i],e);Xe.messages.clientCutText(t,s,!0)},extendedClipboardCaps(t,e,s){let n=Object.keys(s),a=new Uint8Array(4+4*n.length);n.map(r=>parseInt(r)),n.sort((r,l)=>r-l),a.set(Xe.messages._buildExtendedClipboardFlags(e,[]));let i=4;for(let r=0;r<n.length;r++)a[i]=s[n[r]]>>24,a[i+1]=s[n[r]]>>16,a[i+2]=s[n[r]]>>8,a[i+3]=s[n[r]]>>0,i+=4,a[3]|=1<<n[r];Xe.messages.clientCutText(t,a,!0)},clientCutText(t,e,s=!1){t.sQpush8(6),t.sQpush8(0),t.sQpush8(0),t.sQpush8(0);let n;s?n=lf(-e.length):n=e.length,t.sQpush32(n),t.sQpushBytes(e),t.flush()},setDesktopSize(t,e,s,n,a){t.sQpush8(251),t.sQpush8(0),t.sQpush16(e),t.sQpush16(s),t.sQpush8(1),t.sQpush8(0),t.sQpush32(n),t.sQpush16(0),t.sQpush16(0),t.sQpush16(e),t.sQpush16(s),t.sQpush32(a),t.flush()},clientFence(t,e,s){t.sQpush8(248),t.sQpush8(0),t.sQpush8(0),t.sQpush8(0),t.sQpush32(e),t.sQpush8(s.length),t.sQpushString(s),t.flush()},enableContinuousUpdates(t,e,s,n,a,i){t.sQpush8(150),t.sQpush8(e),t.sQpush16(s),t.sQpush16(n),t.sQpush16(a),t.sQpush16(i),t.flush()},pixelFormat(t,e,s){let n;e>16?n=32:e>8?n=16:n=8;const a=Math.floor(e/3);t.sQpush8(0),t.sQpush8(0),t.sQpush8(0),t.sQpush8(0),t.sQpush8(n),t.sQpush8(e),t.sQpush8(0),t.sQpush8(s?1:0),t.sQpush16((1<<a)-1),t.sQpush16((1<<a)-1),t.sQpush16((1<<a)-1),t.sQpush8(a*0),t.sQpush8(a*1),t.sQpush8(a*2),t.sQpush8(0),t.sQpush8(0),t.sQpush8(0),t.flush()},clientEncodings(t,e){t.sQpush8(2),t.sQpush8(0),t.sQpush16(e.length);for(let s=0;s<e.length;s++)t.sQpush32(e[s]);t.flush()},fbUpdateRequest(t,e,s,n,a,i){typeof s>"u"&&(s=0),typeof n>"u"&&(n=0),t.sQpush8(3),t.sQpush8(e?1:0),t.sQpush16(s),t.sQpush16(n),t.sQpush16(a),t.sQpush16(i),t.flush()},xvpOp(t,e,s){t.sQpush8(250),t.sQpush8(0),t.sQpush8(e),t.sQpush8(s),t.flush()}};Xe.cursors={none:{rgbaPixels:new Uint8Array,w:0,h:0,hotx:0,hoty:0},dot:{rgbaPixels:new Uint8Array([255,255,255,255,0,0,0,255,255,255,255,255,0,0,0,255,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,255,255,255,255,255]),w:3,h:3,hotx:1,hoty:1}};var pv=T('<div class="loading svelte-1szlhua">Loading...</div>'),gv=T('<div class="disabled-state svelte-1szlhua"><div class="disabled-icon svelte-1szlhua"><svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="svelte-1szlhua"><rect x="2" y="3" width="20" height="14" rx="2" class="svelte-1szlhua"></rect><line x1="8" y1="21" x2="16" y2="21" class="svelte-1szlhua"></line><line x1="12" y1="17" x2="12" y2="21" class="svelte-1szlhua"></line></svg></div> <h2 class="disabled-title svelte-1szlhua">Browser Not Enabled</h2> <p class="disabled-text svelte-1szlhua">Enable the browser from Settings to connect to a running VM with noVNC.</p> <a href="#/settings" class="btn btn-outline btn-sm svelte-1szlhua">Go to Settings</a></div>'),xv=T('<div class="conn-info-popover svelte-1szlhua"><div class="conn-info-row svelte-1szlhua"><span class="conn-info-key svelte-1szlhua">VNC port</span> <span class="mono conn-info-val svelte-1szlhua"> </span></div> <div class="conn-info-row svelte-1szlhua"><span class="conn-info-key svelte-1szlhua">noVNC port</span> <span class="mono conn-info-val svelte-1szlhua"> </span></div></div>'),bv=T('<button class="toolbar-btn toolbar-btn-danger svelte-1szlhua"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svelte-1szlhua"><path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4" class="svelte-1szlhua"></path><polyline points="16 17 21 12 16 7" class="svelte-1szlhua"></polyline><line x1="21" y1="12" x2="9" y2="12" class="svelte-1szlhua"></line></svg> Disconnect</button>'),mv=T('<div class="toolbar-right svelte-1szlhua"><span class="toolbar-sep svelte-1szlhua"></span> <button><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svelte-1szlhua"><rect x="9" y="2" width="6" height="4" rx="1" class="svelte-1szlhua"></rect><path d="M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2h-2" class="svelte-1szlhua"></path></svg> Clipboard</button> <!></div>'),wv=T('<div class="clipboard-popover svelte-1szlhua"><p class="clipboard-label svelte-1szlhua">Type or paste, then use Ctrl+V inside the desktop</p> <textarea class="clipboard-textarea svelte-1szlhua" placeholder="Paste text here..."></textarea></div>'),yv=T('<div class="error-overlay svelte-1szlhua"><p class="error-text svelte-1szlhua"> </p> <p class="error-hint svelte-1szlhua">Ensure the browser stack (noVNC) is running</p> <button class="btn btn-outline btn-sm svelte-1szlhua">Reconnect</button></div>'),kv=T('<div class="browser-viewer svelte-1szlhua"><div class="toolbar svelte-1szlhua"><div class="toolbar-left svelte-1szlhua"><button class="conn-status svelte-1szlhua"><span></span> <span class="toolbar-label svelte-1szlhua"> </span></button> <!></div> <!></div> <div class="vnc-container svelte-1szlhua"><!> <!> <div></div></div></div>');function Sv(t,e){et(e,!0);let s=W(null),n=W(!0),a=W("connecting"),i=W(void 0),r=W(0),l=W(null),d=W(!1),o=W(""),u=W(!1);const _=Ee(()=>e.status?.browser.enabled??!1),p={connecting:"Connecting",connected:"Connected",disconnected:"Disconnected",failed:"Failed"},v=Ee(()=>p[c(a)]);gt(()=>{const C=new AbortController;return ke("/api/config").then(F=>{C.signal.aborted||b(s,F,!0)}).finally(()=>{C.signal.aborted||b(n,!1)}),()=>C.abort()});const x=Ee(()=>{if(!c(s)?.browser)return"";const C=Xi(),F=C?`?token=${encodeURIComponent(C)}`:"";return`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/vnc${F}`});gt(()=>{if(!c(_)||!c(x)||!c(i)||c(r)<0)return;b(a,"connecting");let C=null;try{C=new Xe(c(i),c(x)),C.scaleViewport=!0,C.resizeSession=!1,C.qualityLevel=6,C.compressionLevel=2,b(l,C,!0),C.addEventListener("connect",()=>{b(a,"connected")}),C.addEventListener("disconnect",F=>{const L=F.detail;b(a,L.clean?"disconnected":"failed",!0),b(l,null)})}catch{b(a,"failed"),b(l,null)}return()=>{C?.disconnect(),b(l,null)}});function y(){b(a,"connecting"),b(r,c(r)+1)}function w(){c(l)?.disconnect()}function S(){b(d,!c(d)),b(o,"")}function E(){c(l)&&c(l).clipboardPasteFrom(c(o))}var A=pt(),K=ye(A);{var U=C=>{var F=pv();k(C,F)},te=C=>{var F=gv();k(C,F)},X=C=>{var F=kv(),L=h(F),Z=h(L),oe=h(Z),ue=h(oe);let ee;var N=f(ue,2),se=h(N),ae=f(oe,2);{var me=ce=>{var ve=xv(),J=h(ve),j=f(h(J),2),V=h(j),pe=f(J,2),Ae=f(h(pe),2),Pe=h(Ae);O(()=>{M(V,c(s).browser.vncPort),M(Pe,c(s).browser.novncPort)}),k(ce,ve)};H(ae,ce=>{c(u)&&c(s)?.browser&&ce(me)})}var be=f(Z,2);{var he=ce=>{var ve=mv(),J=f(h(ve),2);let j;var V=f(J,2);{var pe=Ae=>{var Pe=bv();G("click",Pe,w),k(Ae,Pe)};H(V,Ae=>{c(a)==="connected"&&Ae(pe)})}O(()=>{j=xe(J,1,"toolbar-btn svelte-1szlhua",null,j,{"toolbar-btn-active":c(d)}),J.disabled=c(a)!=="connected"}),G("click",J,S),k(ce,ve)};H(be,ce=>{c(s)?.browser&&ce(he)})}var Te=f(L,2),ne=h(Te);{var re=ce=>{var ve=wv(),J=f(h(ve),2);Jt(J,"rows",4),G("input",J,E),Oe(J,()=>c(o),j=>b(o,j)),k(ce,ve)};H(ne,ce=>{c(d)&&ce(re)})}var de=f(ne,2);{var _e=ce=>{var ve=yv(),J=h(ve),j=h(J),V=f(J,4);O(()=>M(j,c(a)==="failed"?"Connection failed":"Disconnected")),G("click",V,y),k(ce,ve)};H(de,ce=>{(c(a)==="failed"||c(a)==="disconnected")&&ce(_e)})}var fe=f(de,2);let we;_h(fe,ce=>b(i,ce),()=>c(i)),O(()=>{ee=xe(ue,1,"conn-dot svelte-1szlhua",null,ee,{"conn-connecting":c(a)==="connecting","conn-on":c(a)==="connected","conn-off":c(a)==="disconnected"||c(a)==="failed"}),M(se,c(v)),we=xe(fe,1,"vnc-canvas svelte-1szlhua",null,we,{"vnc-hidden":c(a)!=="connected"})}),G("click",oe,()=>{b(u,!c(u))}),k(C,F)};H(K,C=>{c(n)?C(U):c(_)?C(X,!1):C(te,1)})}k(t,A),tt()}ut(["click","input"]);var Ev=T('<button class="val-btn agent-name editable svelte-ys3ftv"> </button>'),Cv=T('<button class="btn btn-outline btn-sm btn-danger">Delete</button>'),Av=T('<button class="val-btn mono editable"> </button>'),Kv=T('<button class="val-btn mono editable"> </button>'),Fv=T('<button class="val-btn mono editable"> </button>'),Tv=T('<button class="val-btn mono editable"> </button>'),Mv=T('<button class="prompt-block editable svelte-ys3ftv"> </button>'),Xv=T('<div class="agent-card svelte-ys3ftv"><div class="agent-bar svelte-ys3ftv"></div> <div class="agent-top svelte-ys3ftv"><div class="agent-identity svelte-ys3ftv"><!> <span class="agent-id mono svelte-ys3ftv"> </span></div> <div class="agent-actions svelte-ys3ftv"><select class="inline-select mono"><option>claude</option><option>opencode</option></select> <!></div></div> <div class="agent-fields svelte-ys3ftv"><div class="agent-field svelte-ys3ftv"><span class="row-label">Model</span> <!></div> <div class="agent-field svelte-ys3ftv"><span class="row-label">Fallback</span> <!></div> <div class="agent-field svelte-ys3ftv"><span class="row-label">Turns</span> <!></div> <div class="agent-field svelte-ys3ftv"><span class="row-label">Channels</span> <!></div></div> <div class="agent-prompt-area svelte-ys3ftv"><span class="row-label">System Prompt</span> <!></div></div>');function Lv(t,e){et(e,!0);let s=W("");function n(j,V){b(s,String(V),!0),e.editor.startEdit(`agent.${e.index}.${j}`,V)}function a(j){return e.editor.editingField===`agent.${e.index}.${j}`}var i=Xv(),r=f(h(i),2),l=h(r),d=h(l);{var o=j=>{mt(j,{get saving(){return e.editor.editingSaving},onsave:V=>e.onsavefield("name",V),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(V){b(s,V,!0)}})},u=Ee(()=>a("name")),_=j=>{var V=Ev(),pe=h(V);O(()=>M(pe,e.agent.name)),G("click",V,()=>n("name",e.agent.name)),k(j,V)};H(d,j=>{c(u)?j(o):j(_,!1)})}var p=f(d,2),v=h(p),x=f(l,2),y=h(x),w=h(y);w.value=w.__value="claude";var S=f(w);S.value=S.__value="opencode";var E;Nc(y);var A=f(y,2);{var K=j=>{var V=Cv();G("click",V,function(...pe){e.ondelete?.apply(this,pe)}),k(j,V)};H(A,j=>{e.agentCount>1&&j(K)})}var U=f(r,2),te=h(U),X=f(h(te),2);{var C=j=>{mt(j,{mono:!0,get saving(){return e.editor.editingSaving},onsave:V=>e.onsavefield("model",V),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(V){b(s,V,!0)}})},F=Ee(()=>a("model")),L=j=>{var V=Av(),pe=h(V);O(()=>M(pe,e.agent.model)),G("click",V,()=>n("model",e.agent.model)),k(j,V)};H(X,j=>{c(F)?j(C):j(L,!1)})}var Z=f(te,2),oe=f(h(Z),2);{var ue=j=>{mt(j,{mono:!0,get saving(){return e.editor.editingSaving},placeholder:"none",onsave:V=>e.onsavefield("fallbackModel",V,pe=>pe.trim()||null),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(V){b(s,V,!0)}})},ee=Ee(()=>a("fallbackModel")),N=j=>{var V=Kv(),pe=h(V);O(()=>M(pe,e.agent.fallbackModel??"none")),G("click",V,()=>n("fallbackModel",e.agent.fallbackModel??"")),k(j,V)};H(oe,j=>{c(ee)?j(ue):j(N,!1)})}var se=f(Z,2),ae=f(h(se),2);{var me=j=>{mt(j,{mono:!0,get saving(){return e.editor.editingSaving},onsave:V=>e.onsavefield("maxTurns",V,pe=>Number(pe)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(V){b(s,V,!0)}})},be=Ee(()=>a("maxTurns")),he=j=>{var V=Fv(),pe=h(V);O(()=>M(pe,e.agent.maxTurns)),G("click",V,()=>n("maxTurns",e.agent.maxTurns)),k(j,V)};H(ae,j=>{c(be)?j(me):j(he,!1)})}var Te=f(se,2),ne=f(h(Te),2);{var re=j=>{mt(j,{mono:!0,get saving(){return e.editor.editingSaving},onsave:V=>e.onsavefield("channels",V,pe=>pe.split(",").map(Ae=>Ae.trim()).filter(Boolean)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(V){b(s,V,!0)}})},de=Ee(()=>a("channels")),_e=j=>{var V=Tv(),pe=h(V);O(Ae=>M(pe,Ae),[()=>e.agent.channels.join(", ")||"*"]),G("click",V,()=>n("channels",e.agent.channels.join(", "))),k(j,V)};H(ne,j=>{c(de)?j(re):j(_e,!1)})}var fe=f(U,2),we=f(h(fe),2);{var ce=j=>{mt(j,{multiline:!0,get saving(){return e.editor.editingSaving},onsave:V=>e.onsavefield("systemPrompt",V),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(V){b(s,V,!0)}})},ve=Ee(()=>a("systemPrompt")),J=j=>{var V=Mv(),pe=h(V);O(()=>M(pe,e.agent.systemPrompt)),G("click",V,()=>n("systemPrompt",e.agent.systemPrompt)),k(j,V)};H(we,j=>{c(ve)?j(ce):j(J,!1)})}O(()=>{M(v,e.agent.id),E!==(E=e.agent.provider)&&(y.value=(y.__value=e.agent.provider)??"",Gr(y,e.agent.provider))}),G("change",y,j=>e.onsavefield("provider",j.currentTarget.value)),k(t,i),tt()}ut(["click","change"]);var Pv=T('<div class="agent-card agent-card-new svelte-6z0nn3"><div class="agent-bar agent-bar-new svelte-6z0nn3"></div> <div class="agent-top svelte-6z0nn3"><span class="agent-name svelte-6z0nn3" style="color: var(--color-accent)">New Agent</span> <button class="btn btn-outline btn-sm">Cancel</button></div> <div class="new-agent-form svelte-6z0nn3"><div class="form-row svelte-6z0nn3"><label class="form-lbl svelte-6z0nn3" for="new-agent-name">Name</label> <input id="new-agent-name" class="form-field svelte-6z0nn3" type="text" placeholder="Agent name"/></div> <div class="form-row svelte-6z0nn3"><label class="form-lbl svelte-6z0nn3" for="new-agent-provider">Provider</label> <select id="new-agent-provider" class="inline-select mono"><option>claude</option><option>opencode</option></select></div> <div class="form-row svelte-6z0nn3"><label class="form-lbl svelte-6z0nn3" for="new-agent-model">Model</label> <input id="new-agent-model" class="form-field mono svelte-6z0nn3" type="text" placeholder="sonnet"/></div> <div class="form-row svelte-6z0nn3"><label class="form-lbl svelte-6z0nn3" for="new-agent-turns">Max Turns</label> <input id="new-agent-turns" class="form-field mono svelte-6z0nn3" type="text" placeholder="50"/></div> <div class="form-row svelte-6z0nn3"><label class="form-lbl svelte-6z0nn3" for="new-agent-channels">Channels</label> <input id="new-agent-channels" class="form-field mono svelte-6z0nn3" type="text" placeholder="* (comma-separated)"/></div> <div class="form-row form-row-full svelte-6z0nn3"><label class="form-lbl svelte-6z0nn3" for="new-agent-prompt">System Prompt</label> <textarea id="new-agent-prompt" class="form-field form-field-textarea svelte-6z0nn3" placeholder="Optional system prompt"></textarea></div> <div class="form-row form-row-actions svelte-6z0nn3"><button class="btn btn-primary btn-sm">Create Agent</button></div></div></div>');function Bv(t,e){et(e,!0);let s=W(Ue({name:"",provider:"claude",model:"",maxTurns:"50",systemPrompt:"",channels:"*"}));function n(F){return F.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}async function a(){const F=n(c(s).name)||"agent",L=c(s).channels.split(",").map(ue=>ue.trim()).filter(Boolean),Z={id:F,name:c(s).name,provider:c(s).provider,model:c(s).model,fallbackModel:null,maxTurns:Number(c(s).maxTurns)||50,systemPrompt:c(s).systemPrompt||"You are responding in a Slack workspace. Be concise, helpful, and natural.",channels:L.length>0?L:["*"]};await e.onsave(Z)&&b(s,{name:"",provider:"claude",model:"",maxTurns:"50",systemPrompt:"",channels:"*"},!0)}var i=Pv(),r=f(h(i),2),l=f(h(r),2),d=f(r,2),o=h(d),u=f(h(o),2),_=f(o,2),p=f(h(_),2),v=h(p);v.value=v.__value="claude";var x=f(v);x.value=x.__value="opencode";var y=f(_,2),w=f(h(y),2),S=f(y,2),E=f(h(S),2),A=f(S,2),K=f(h(A),2),U=f(A,2),te=f(h(U),2),X=f(U,2),C=h(X);O(F=>C.disabled=F,[()=>!c(s).name.trim()||!c(s).model.trim()]),G("click",l,function(...F){e.oncancel?.apply(this,F)}),Oe(u,()=>c(s).name,F=>c(s).name=F),Uc(p,()=>c(s).provider,F=>c(s).provider=F),Oe(w,()=>c(s).model,F=>c(s).model=F),Oe(E,()=>c(s).maxTurns,F=>c(s).maxTurns=F),Oe(K,()=>c(s).channels,F=>c(s).channels=F),Oe(te,()=>c(s).systemPrompt,F=>c(s).systemPrompt=F),G("click",C,a),k(t,i),tt()}ut(["click"]);var Dv=T('<button class="btn btn-outline btn-sm">Add Agent</button>'),Rv=T('<div class="section"><div class="section-header"><h2 class="section-title">Agents</h2> <!></div> <!> <!></div>');function Iv(t,e){et(e,!0);let s=W(!1);async function n(v,x,y,w){const S=e.config.agents.map(U=>({...U})),E=S[v];if(!E)return;const A=w?w(y):y;E[x]=A,await e.editor.saveConfigPatch({agents:S})&&e.editor.cancelEdit()}async function a(v){if(e.config.agents.length<=1)return;const x=e.config.agents[v];if(!x||!await jr(`Delete agent "${x.name}"?`))return;const w=e.config.agents.filter((S,E)=>E!==v);await e.editor.saveConfigPatch({agents:w})}async function i(v){const x=[...e.config.agents,v],y=await e.editor.saveConfigPatch({agents:x});return y&&b(s,!1),y}var r=Rv(),l=h(r),d=f(h(l),2);{var o=v=>{var x=Dv();G("click",x,()=>{b(s,!0)}),k(v,x)};H(d,v=>{c(s)||v(o)})}var u=f(l,2);Ct(u,19,()=>e.config.agents,v=>v.id,(v,x,y)=>{Lv(v,{get agent(){return c(x)},get index(){return c(y)},get agentCount(){return e.config.agents.length},get editor(){return e.editor},onsavefield:(w,S,E)=>n(c(y),w,S,E),ondelete:()=>a(c(y))})});var _=f(u,2);{var p=v=>{Bv(v,{onsave:i,oncancel:()=>{b(s,!1)}})};H(_,v=>{c(s)&&v(p)})}k(t,r),tt()}ut(["click"]);var Qv=T('<div class="row"><span class="row-label">Uptime</span> <span class="row-value mono"> </span></div>'),zv=T('<button class="val-btn mono editable"> </button>'),Nv=T('<span class="cli-pill svelte-u0w225"><span class="dot dot-muted"></span> claude ...</span>'),Uv=T('<span class="cli-pill svelte-u0w225"><span class="dot dot-muted"></span> opencode ...</span>'),Hv=T('<span class="dim">Checking...</span>'),Ov=T("<!> <!> <!>",1),Vv=T('<span class="cli-pill cli-pill-ok svelte-u0w225"><span class="dot dot-on"></span> </span>'),Gv=T('<span class="cli-pill cli-pill-err svelte-u0w225"><span class="dot dot-off"></span> </span>'),qv=T('<span class="cli-pill svelte-u0w225"><span class="dot dot-muted"></span> </span>'),Wv=T('<div class="row"><span class="row-label">Node.js</span> <span class="row-value mono"> </span></div>'),jv=En('<svg viewBox="0 0 16 16" fill="none" aria-hidden="true" class="svelte-u0w225"><path d="M3 8.5l3.5 3.5L13 4.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></svg>'),Yv=T('<div class="secret-edit svelte-u0w225"><input type="password" autocomplete="off" class="secret-input mono svelte-u0w225" placeholder="sk-ant-..."/> <button class="inline-btn inline-btn-save svelte-u0w225" title="Save"><!></button> <button class="inline-btn inline-btn-cancel svelte-u0w225" title="Cancel"><svg viewBox="0 0 16 16" fill="none" aria-hidden="true" class="svelte-u0w225"><path d="M4 4l8 8M12 4l-8 8" stroke="currentColor" stroke-width="2" stroke-linecap="round"></path></svg></button></div>'),Zv=T('<button class="val-btn mono editable"> </button>'),Jv=T('<span class="dim">...</span>'),$v=T('<button class="val-btn mono editable"> </button>'),ep=T('<button class="val-btn mono editable"> </button>'),tp=T('<button class="val-btn mono editable"> </button>'),sp=T("<span><span></span> </span>"),np=En('<svg viewBox="0 0 16 16" fill="none" aria-hidden="true" class="svelte-u0w225"><path d="M3 8.5l3.5 3.5L13 4.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></svg>'),ap=T('<div class="secret-edit svelte-u0w225"><input type="password" autocomplete="off" class="secret-input mono svelte-u0w225"/> <button class="inline-btn inline-btn-save svelte-u0w225" title="Save"><!></button> <button class="inline-btn inline-btn-cancel svelte-u0w225" title="Cancel"><svg viewBox="0 0 16 16" fill="none" aria-hidden="true" class="svelte-u0w225"><path d="M4 4l8 8M12 4l-8 8" stroke="currentColor" stroke-width="2" stroke-linecap="round"></path></svg></button></div>'),ip=T('<button class="val-btn mono editable"> </button>'),rp=T('<span class="dim">...</span>'),lp=T('<div class="row"><span class="row-label"> </span> <span class="row-value"><!></span></div>'),op=T('<div class="notice svelte-u0w225">Restart the daemon to apply new Slack tokens.</div>'),cp=T('<button class="val-btn mono editable"> </button>'),dp=T('<button class="val-btn mono editable"> </button>'),up=T('<button class="val-btn mono editable"> </button>'),hp=T('<button class="val-btn mono editable"> </button>'),fp=T('<div class="row"><span class="row-label">Start / End</span> <span class="row-value"><!> <span class="dim">–</span> <!></span></div>'),_p=T("<span><span></span> </span>"),vp=T('<button class="val-btn mono editable"> </button>'),pp=T('<div class="row"><span class="row-label">VM Host</span> <span class="row-value"><!></span></div> <div class="row"><span class="row-label">Mode</span> <span class="row-value mono"> </span></div> <div class="row"><span class="row-label">VNC Port</span> <span class="row-value mono"> </span></div> <div class="row"><span class="row-label">noVNC Port</span> <span class="row-value mono"> </span></div>',1),gp=T('<button class="val-btn mono editable"> </button>'),xp=T('<button class="val-btn mono editable"> </button>'),bp=T('<div class="config-grid svelte-u0w225"><div class="panel"><div class="panel-header"><span class="panel-title">System</span></div> <div class="panel-body"><!> <div class="row"><span class="row-label">Timezone</span> <span class="row-value"><!></span></div> <div class="row"><span class="row-label">Web Port</span> <span class="row-value mono"> </span></div> <div class="row"><span class="row-label">Agent CLI</span> <span class="row-value"><!></span></div> <!> <div class="row"><span class="row-label">API Key</span> <span class="row-value"><!></span></div></div></div> <div class="panel"><div class="panel-header"><span class="panel-title">Sessions</span></div> <div class="panel-body"><div class="row"><span class="row-label">Max Concurrent</span> <span class="row-value"><!></span></div> <div class="row"><span class="row-label">TTL</span> <span class="row-value"><!></span></div> <div class="row"><span class="row-label">Timeout</span> <span class="row-value"><!></span></div></div></div> <div class="panel"><div class="panel-header"><span class="panel-title">Slack</span> <!></div> <div class="panel-body"><!> <!> <!> <div class="row"><span class="row-label">Require Mention</span> <span class="row-value"><!></span></div> <div class="row"><span class="row-label">Debounce</span> <span class="row-value"><!></span></div> <div class="row"><span class="row-label">Bypass DMs</span> <span class="row-value"><!></span></div> <div class="row"><span class="row-label">Channels</span> <span class="row-value"><!></span></div> <div class="row"><span class="row-label">Quiet Hours</span> <span class="row-value"><!></span></div> <!></div></div> <div class="panel"><div class="panel-header"><span class="panel-title">Browser</span> <!></div> <div class="panel-body"><div class="row"><span class="row-label">Enabled</span> <span class="row-value"><!></span></div> <!></div></div> <div class="panel"><div class="panel-header"><span class="panel-title">Birds</span></div> <div class="panel-body"><div class="row"><span class="row-label">Max Attempts</span> <span class="row-value"><!></span></div></div></div> <div class="panel"><div class="panel-header"><span class="panel-title">Database</span></div> <div class="panel-body"><div class="row"><span class="row-label">Retention</span> <span class="row-value"><!></span></div></div></div></div> <!>',1);function mp(t,e){et(e,!0);let s=W("");const n=Ee(()=>new Set(e.config.agents.map($=>$.provider)));function a($,q){b(s,String(q),!0),e.editor.startEdit($,q)}let i=W(null),r=W(""),l=W(!1),d=W(!1);function o($){b(i,$,!0),b(r,"")}function u(){b(i,null),b(l,!1)}async function _(){if(!(!c(i)||!c(r).trim())){b(l,!0);try{if(c(i)==="slackBotToken"||c(i)==="slackAppToken"){const $=c(i)==="slackBotToken"?{botToken:c(r).trim()}:{appToken:c(r).trim()},q=await ke("/api/secrets/slack",{method:"PUT",body:$});Me("Slack token saved","success"),q.requiresRestart&&b(d,!0)}else await ke("/api/secrets/anthropic",{method:"PUT",body:{apiKey:c(r).trim()}}),Me("API key saved (effective next session)","success");b(i,null),b(r,""),e.onsecretsupdate()}catch($){Me($.message,"error")}finally{b(l,!1)}}}function p($){$.key==="Escape"?u():$.key==="Enter"&&($.preventDefault(),_())}var v=bp(),x=ye(v),y=h(x),w=f(h(y),2),S=h(w);{var E=$=>{var q=Qv(),le=f(h(q),2),Le=h(le);O($e=>M(Le,$e),[()=>Vh(e.status.uptime)]),k($,q)};H(S,$=>{e.status&&$(E)})}var A=f(S,2),K=f(h(A),2),U=h(K);{var te=$=>{mt($,{mono:!0,get saving(){return e.editor.editingSaving},onsave:q=>e.editor.saveField("timezone",q),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(q){b(s,q,!0)}})},X=$=>{var q=zv(),le=h(q);O(()=>M(le,e.config.timezone)),G("click",q,()=>a("timezone",e.config.timezone)),k($,q)};H(U,$=>{e.editor.editingField==="timezone"?$(te):$(X,!1)})}var C=f(A,2),F=f(h(C),2),L=h(F),Z=f(C,2),oe=f(h(Z),2),ue=h(oe);{var ee=$=>{const q=Ee(()=>c(n).has("claude")),le=Ee(()=>c(n).has("opencode"));var Le=Ov(),$e=ye(Le);{var yt=Qe=>{var Je=Nv();k(Qe,Je)};H($e,Qe=>{c(q)&&Qe(yt)})}var Xt=f($e,2);{var Yt=Qe=>{var Je=Uv();k(Qe,Je)};H(Xt,Qe=>{c(le)&&Qe(Yt)})}var St=f(Xt,2);{var os=Qe=>{var Je=Hv();k(Qe,Je)};H(St,Qe=>{!c(q)&&!c(le)&&Qe(os)})}k($,Le)},N=$=>{var q=pt(),le=ye(q);Ct(le,17,()=>[{key:"claude",info:e.doctor.claude},{key:"opencode",info:e.doctor.opencode}],Vr,(Le,$e)=>{let yt=()=>c($e).key,Xt=()=>c($e).info;const Yt=Ee(()=>c(n).has(yt()));var St=pt(),os=ye(St);{var Qe=cs=>{var kt=Vv(),zt=f(h(kt));O(()=>M(zt,` ${yt()??""} ${Xt().version??""}`)),k(cs,kt)},Je=cs=>{var kt=Gv(),zt=f(h(kt));O(()=>M(zt,` ${yt()??""} not found`)),k(cs,kt)},Gs=cs=>{var kt=qv(),zt=f(h(kt));O(()=>M(zt,` ${yt()??""} ${Xt().version??""}`)),k(cs,kt)};H(os,cs=>{c(Yt)&&Xt().available?cs(Qe):c(Yt)&&!Xt().available?cs(Je,1):!c(Yt)&&Xt().available&&cs(Gs,2)})}k(Le,St)}),k($,q)};H(ue,$=>{e.doctorLoading?$(ee):e.doctor&&$(N,1)})}var se=f(Z,2);{var ae=$=>{var q=Wv(),le=f(h(q),2),Le=h(le);O(()=>M(Le,e.doctor.node)),k($,q)};H(se,$=>{e.doctor&&$(ae)})}var me=f(se,2),be=f(h(me),2),he=h(be);{var Te=$=>{var q=Yv(),le=h(q),Le=f(le,2),$e=h(Le);{var yt=St=>{var os=Qs("...");k(St,os)},Xt=St=>{var os=jv();k(St,os)};H($e,St=>{c(l)?St(yt):St(Xt,!1)})}var Yt=f(Le,2);O(()=>Le.disabled=c(l)||!c(r)),G("keydown",le,p),Oe(le,()=>c(r),St=>b(r,St)),G("click",Le,_),G("click",Yt,u),k($,q)},ne=$=>{var q=Zv(),le=h(q);O(()=>M(le,e.secrets.anthropic.set?e.secrets.anthropic.hint:"not set")),G("click",q,()=>o("apiKey")),k($,q)},re=$=>{var q=Jv();k($,q)};H(he,$=>{c(i)==="apiKey"?$(Te):e.secrets?$(ne,1):$(re,!1)})}var de=f(y,2),_e=f(h(de),2),fe=h(_e),we=f(h(fe),2),ce=h(we);{var ve=$=>{mt($,{mono:!0,get saving(){return e.editor.editingSaving},onsave:q=>e.editor.saveField("sessions.maxConcurrent",q,le=>Number(le)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(q){b(s,q,!0)}})},J=$=>{var q=$v(),le=h(q);O(()=>M(le,e.config.sessions.maxConcurrent)),G("click",q,()=>a("sessions.maxConcurrent",e.config.sessions.maxConcurrent)),k($,q)};H(ce,$=>{e.editor.editingField==="sessions.maxConcurrent"?$(ve):$(J,!1)})}var j=f(fe,2),V=f(h(j),2),pe=h(V);{var Ae=$=>{mt($,{mono:!0,get saving(){return e.editor.editingSaving},onsave:q=>e.editor.saveField("sessions.ttlHours",q,le=>Number(le)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(q){b(s,q,!0)}})},Pe=$=>{var q=ep(),le=h(q);O(()=>M(le,`${e.config.sessions.ttlHours??""}h`)),G("click",q,()=>a("sessions.ttlHours",e.config.sessions.ttlHours)),k($,q)};H(pe,$=>{e.editor.editingField==="sessions.ttlHours"?$(Ae):$(Pe,!1)})}var Ie=f(j,2),st=f(h(Ie),2),De=h(st);{var xt=$=>{mt($,{mono:!0,get saving(){return e.editor.editingSaving},onsave:q=>e.editor.saveField("sessions.processTimeoutMs",q,le=>Math.round(Number(le)*1e3)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(q){b(s,q,!0)}})},Gt=$=>{var q=tp(),le=h(q);O(Le=>M(le,`${Le??""}s`),[()=>(e.config.sessions.processTimeoutMs/1e3).toFixed(0)]),G("click",q,()=>a("sessions.processTimeoutMs",(e.config.sessions.processTimeoutMs/1e3).toFixed(0))),k($,q)};H(De,$=>{e.editor.editingField==="sessions.processTimeoutMs"?$(xt):$(Gt,!1)})}var rs=f(de,2),qt=h(rs),es=f(h(qt),2);{var lt=$=>{var q=sp();let le;var Le=h(q);let $e;var yt=f(Le);O(()=>{le=xe(q,1,"svc-chip",null,le,{"svc-chip-ok":e.status.slack.connected,"svc-chip-err":!e.status.slack.connected}),$e=xe(Le,1,"dot",null,$e,{"dot-on":e.status.slack.connected,"dot-off":!e.status.slack.connected}),M(yt,` ${e.status.slack.connected?"connected":"disconnected"}`)}),k($,q)};H(es,$=>{e.status&&$(lt)})}var Wt=f(qt,2);{const $=(q,le=ba,Le=ba,$e=ba,yt=ba)=>{var Xt=lp(),Yt=h(Xt),St=h(Yt),os=f(Yt,2),Qe=h(os);{var Je=kt=>{var zt=ap(),ds=h(zt),vs=f(ds,2),zi=h(vs);{var Ld=on=>{var Ni=Qs("...");k(on,Ni)},Pd=on=>{var Ni=np();k(on,Ni)};H(zi,on=>{c(l)?on(Ld):on(Pd,!1)})}var Bd=f(vs,2);O(()=>{Jt(ds,"placeholder",$e()),vs.disabled=c(l)||!c(r)}),G("keydown",ds,p),Oe(ds,()=>c(r),on=>b(r,on)),G("click",vs,_),G("click",Bd,u),k(kt,zt)},Gs=kt=>{var zt=ip(),ds=h(zt);O(()=>M(ds,yt().set?yt().hint:"not set")),G("click",zt,()=>o(le())),k(kt,zt)},cs=kt=>{var zt=rp();k(kt,zt)};H(Qe,kt=>{c(i)===le()?kt(Je):yt()?kt(Gs,1):kt(cs,!1)})}O(()=>M(St,Le())),k(q,Xt)};var ts=h(Wt);{var ls=q=>{var le=op();k(q,le)};H(ts,q=>{c(d)&&q(ls)})}var bt=f(ts,2);$(bt,()=>"slackBotToken",()=>"Bot Token",()=>"xoxb-...",()=>e.secrets?.slack.botToken);var _s=f(bt,2);$(_s,()=>"slackAppToken",()=>"App Token",()=>"xapp-...",()=>e.secrets?.slack.appToken);var Us=f(_s,2),Cn=f(h(Us),2),Hs=h(Cn);Pn(Hs,{get active(){return e.config.slack.requireMention},onToggle:()=>e.editor.toggleField("slack.requireMention",e.config.slack.requireMention)});var ks=f(Us,2),Os=f(h(ks),2),Xs=h(Os);{var Ss=q=>{mt(q,{mono:!0,get saving(){return e.editor.editingSaving},onsave:le=>e.editor.saveField("slack.coalesce.debounceMs",le,Le=>Number(Le)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(le){b(s,le,!0)}})},rn=q=>{var le=cp(),Le=h(le);O(()=>M(Le,`${e.config.slack.coalesce.debounceMs??""}ms`)),G("click",le,()=>a("slack.coalesce.debounceMs",e.config.slack.coalesce.debounceMs)),k(q,le)};H(Xs,q=>{e.editor.editingField==="slack.coalesce.debounceMs"?q(Ss):q(rn,!1)})}var Ls=f(ks,2),ln=f(h(Ls),2),Ge=h(ln);Pn(Ge,{get active(){return e.config.slack.coalesce.bypassDms},onToggle:()=>e.editor.toggleField("slack.coalesce.bypassDms",e.config.slack.coalesce.bypassDms)});var qe=f(Ls,2),ht=f(h(qe),2),ot=h(ht);{var At=q=>{mt(q,{mono:!0,get saving(){return e.editor.editingSaving},onsave:le=>e.editor.saveField("slack.channels",le,Le=>Le.split(",").map($e=>$e.trim()).filter(Boolean)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(le){b(s,le,!0)}})},ct=q=>{var le=dp(),Le=h(le);O($e=>M(Le,$e),[()=>e.config.slack.channels.join(", ")||"*"]),G("click",le,()=>a("slack.channels",e.config.slack.channels.join(", "))),k(q,le)};H(ot,q=>{e.editor.editingField==="slack.channels"?q(At):q(ct,!1)})}var We=f(qe,2),ft=f(h(We),2),Ye=h(ft);Pn(Ye,{get active(){return e.config.slack.quietHours.enabled},onToggle:()=>e.editor.toggleField("slack.quietHours.enabled",e.config.slack.quietHours.enabled)});var Y=f(We,2);{var ie=q=>{var le=fp(),Le=f(h(le),2),$e=h(Le);{var yt=Qe=>{mt(Qe,{mono:!0,get saving(){return e.editor.editingSaving},placeholder:"HH:MM",onsave:Je=>e.editor.saveField("slack.quietHours.start",Je),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(Je){b(s,Je,!0)}})},Xt=Qe=>{var Je=up(),Gs=h(Je);O(()=>M(Gs,e.config.slack.quietHours.start)),G("click",Je,()=>a("slack.quietHours.start",e.config.slack.quietHours.start)),k(Qe,Je)};H($e,Qe=>{e.editor.editingField==="slack.quietHours.start"?Qe(yt):Qe(Xt,!1)})}var Yt=f($e,4);{var St=Qe=>{mt(Qe,{mono:!0,get saving(){return e.editor.editingSaving},placeholder:"HH:MM",onsave:Je=>e.editor.saveField("slack.quietHours.end",Je),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(Je){b(s,Je,!0)}})},os=Qe=>{var Je=hp(),Gs=h(Je);O(()=>M(Gs,e.config.slack.quietHours.end)),G("click",Je,()=>a("slack.quietHours.end",e.config.slack.quietHours.end)),k(Qe,Je)};H(Yt,Qe=>{e.editor.editingField==="slack.quietHours.end"?Qe(St):Qe(os,!1)})}k(q,le)};H(Y,q=>{e.config.slack.quietHours.enabled&&q(ie)})}}var ge=f(rs,2),Ke=h(ge),Ne=f(h(Ke),2);{var je=$=>{var q=_p();let le;var Le=h(q);let $e;var yt=f(Le);O(()=>{le=xe(q,1,"svc-chip",null,le,{"svc-chip-ok":e.status.browser.connected,"svc-chip-err":!e.status.browser.connected}),$e=xe(Le,1,"dot",null,$e,{"dot-on":e.status.browser.connected,"dot-off":!e.status.browser.connected}),M(yt,` ${e.status.browser.connected?"connected":"unreachable"}`)}),k($,q)};H(Ne,$=>{e.config.browser.enabled&&e.status&&$(je)})}var dt=f(Ke,2),_t=h(dt),Rt=f(h(_t),2),Mt=h(Rt);Pn(Mt,{get active(){return e.config.browser.enabled},onToggle:()=>e.editor.toggleField("browser.enabled",e.config.browser.enabled)});var It=f(_t,2);{var Ps=$=>{var q=pp(),le=ye(q),Le=f(h(le),2),$e=h(Le);{var yt=ds=>{mt(ds,{mono:!0,get saving(){return e.editor.editingSaving},onsave:vs=>e.editor.saveField("browser.novncHost",vs),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(vs){b(s,vs,!0)}})},Xt=ds=>{var vs=vp(),zi=h(vs);O(()=>M(zi,e.config.browser.novncHost)),G("click",vs,()=>a("browser.novncHost",e.config.browser.novncHost)),k(ds,vs)};H($e,ds=>{e.editor.editingField==="browser.novncHost"?ds(yt):ds(Xt,!1)})}var Yt=f(le,2),St=f(h(Yt),2),os=h(St),Qe=f(Yt,2),Je=f(h(Qe),2),Gs=h(Je),cs=f(Qe,2),kt=f(h(cs),2),zt=h(kt);O(()=>{M(os,e.config.browser.mode),M(Gs,e.config.browser.vncPort),M(zt,e.config.browser.novncPort)}),k($,q)};H(It,$=>{e.config.browser.enabled&&$(Ps)})}var Fe=f(ge,2),Ze=f(h(Fe),2),nt=h(Ze),Qt=f(h(nt),2),jt=h(Qt);{var An=$=>{mt($,{mono:!0,get saving(){return e.editor.editingSaving},onsave:q=>e.editor.saveField("birds.maxAttempts",q,le=>Number(le)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(q){b(s,q,!0)}})},Vs=$=>{var q=gp(),le=h(q);O(()=>M(le,e.config.birds.maxAttempts)),G("click",q,()=>a("birds.maxAttempts",e.config.birds.maxAttempts)),k($,q)};H(jt,$=>{e.editor.editingField==="birds.maxAttempts"?$(An):$(Vs,!1)})}var Bs=f(Fe,2),da=f(h(Bs),2),Qi=h(da),Kd=f(h(Qi),2),Fd=h(Kd);{var Td=$=>{mt($,{mono:!0,get saving(){return e.editor.editingSaving},onsave:q=>e.editor.saveField("database.retentionDays",q,le=>Number(le)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(q){b(s,q,!0)}})},Md=$=>{var q=xp(),le=h(q);O(()=>M(le,`${e.config.database.retentionDays??""} days`)),G("click",q,()=>a("database.retentionDays",e.config.database.retentionDays)),k($,q)};H(Fd,$=>{e.editor.editingField==="database.retentionDays"?$(Td):$(Md,!1)})}var Xd=f(x,2);Iv(Xd,{get config(){return e.config},get editor(){return e.editor}}),O(()=>M(L,e.config.web.port)),k(t,v),tt()}ut(["click","keydown"]);var wp=T('<span class="queue-summary mono svelte-17vayue"> </span>'),yp=T('<div class="stat-row svelte-17vayue"><div class="stat-cell svelte-17vayue"><span class="stat-num svelte-17vayue"> </span> <span class="stat-lbl svelte-17vayue">pending</span></div> <div class="stat-cell svelte-17vayue"><span class="stat-num stat-num-active svelte-17vayue"> </span> <span class="stat-lbl svelte-17vayue">running</span></div> <div class="stat-cell svelte-17vayue"><span class="stat-num stat-num-ok svelte-17vayue"> </span> <span class="stat-lbl svelte-17vayue">completed</span></div> <div class="stat-cell svelte-17vayue"><span class="stat-num stat-num-err svelte-17vayue"> </span> <span class="stat-lbl svelte-17vayue">failed</span></div></div>'),kp=T('<div class="panel"><div class="panel-header"><span class="panel-title">Job Queue</span> <!></div> <div class="panel-body"><!> <div class="action-row svelte-17vayue"><button class="btn btn-outline btn-sm"> </button> <button class="btn btn-outline btn-sm"> </button> <button class="btn btn-outline btn-sm"> </button></div></div></div>');function Sp(t,e){et(e,!0);let s=W(null);gt(()=>{e.initialStats!=null&&b(s,e.initialStats,!0)});let n=W(!1),a=W(!1),i=W(!1);async function r(){b(s,await ke("/api/jobs/stats"),!0)}async function l(){b(n,!0);try{const C=await ke("/api/jobs/retry-all",{method:"POST"});Me(`${C.count} failed job(s) queued for retry`,"success"),await r()}catch(C){Me(`Failed: ${C.message}`,"error")}finally{b(n,!1)}}async function d(){b(a,!0);try{const C=await ke("/api/jobs/clear?status=completed",{method:"DELETE"});Me(`${C.count} completed job(s) cleared`,"success"),await r()}catch(C){Me(`Failed: ${C.message}`,"error")}finally{b(a,!1)}}async function o(){b(i,!0);try{const C=await ke("/api/jobs/clear?status=failed",{method:"DELETE"});Me(`${C.count} failed job(s) cleared`,"success"),await r()}catch(C){Me(`Failed: ${C.message}`,"error")}finally{b(i,!1)}}var u=kp(),_=h(u),p=f(h(_),2);{var v=C=>{var F=wp(),L=h(F);O(()=>M(L,`${c(s).total??""} total`)),k(C,F)};H(p,C=>{c(s)&&C(v)})}var x=f(_,2),y=h(x);{var w=C=>{var F=yp(),L=h(F),Z=h(L),oe=h(Z),ue=f(L,2),ee=h(ue),N=h(ee),se=f(ue,2),ae=h(se),me=h(ae),be=f(se,2),he=h(be),Te=h(he);O(()=>{M(oe,c(s).pending),M(N,c(s).running),M(me,c(s).completed),M(Te,c(s).failed)}),k(C,F)};H(y,C=>{c(s)&&C(w)})}var S=f(y,2),E=h(S),A=h(E),K=f(E,2),U=h(K),te=f(K,2),X=h(te);O(()=>{E.disabled=c(n)||(c(s)?.failed??0)===0,M(A,c(n)?"Retrying...":"Retry Failed"),K.disabled=c(a)||(c(s)?.completed??0)===0,M(U,c(a)?"Clearing...":"Clear Completed"),te.disabled=c(i)||(c(s)?.failed??0)===0,M(X,c(i)?"Clearing...":"Clear Failed")}),G("click",E,l),G("click",K,d),G("click",te,o),k(t,u),tt()}ut(["click"]);var Ep=T('<div class="row"><span class="dim">No system birds registered</span></div>'),Cp=T('<span class="bird-last-run svelte-12folcn"> <!></span>'),Ap=T('<button class="btn btn-outline btn-sm">Flights</button>'),Kp=T('<div class="flight-empty svelte-12folcn"><span class="dim">No flights recorded</span></div>'),Fp=T('<div class="flight-row svelte-12folcn"><span class="mono flight-id svelte-12folcn"> </span> <!> <span class="mono"> </span> <span class="flight-time svelte-12folcn"> </span></div>'),Tp=T('<div class="flight-list svelte-12folcn"><!></div>'),Mp=T('<div><div class="bird-top svelte-12folcn"><div class="bird-info svelte-12folcn"><span class="bird-name mono svelte-12folcn"> </span> <span class="bird-schedule mono dim svelte-12folcn"> </span></div> <div class="bird-actions svelte-12folcn"><!> <!> <button class="btn btn-outline btn-sm">Fly</button></div></div> <!></div>'),Xp=T('<div class="panel"><div class="panel-header"><span class="panel-title">System Birds</span> <span class="bird-count mono svelte-12folcn"> </span></div> <div class="panel-body"><!></div></div>');function Lp(t,e){et(e,!0);let s=W(Ue({}));async function n(v){if(!c(s)[v])try{const x=await ke(`/api/birds/${v}/flights?perPage=5`);b(s,{...c(s),[v]:x.items},!0)}catch{b(s,{...c(s),[v]:[]},!0)}}async function a(v,x){try{const y=await ke(`/api/birds/${v}/fly`,{method:"POST"});Me(`${x} sent on a flight (job #${y.jobId})`,"success");const{[v]:w,...S}=c(s);b(s,S,!0)}catch(y){Me(`Failed: ${y.message}`,"error")}}var i=Xp(),r=h(i),l=f(h(r),2),d=h(l),o=f(r,2),u=h(o);{var _=v=>{var x=Ep();k(v,x)},p=v=>{var x=pt(),y=ye(x);Ct(y,19,()=>e.birds,w=>w.uid,(w,S,E)=>{var A=Mp();let K;var U=h(A),te=h(U),X=h(te),C=h(X),F=f(X,2),L=h(F),Z=f(te,2),oe=h(Z);{var ue=be=>{var he=Cp(),Te=h(he),ne=f(Te);{var re=de=>{mn(de,{get status(){return c(S).last_status}})};H(ne,de=>{c(S).last_status&&de(re)})}O(de=>M(Te,`${de??""} `),[()=>bs(c(S).last_run)]),k(be,he)};H(oe,be=>{c(S).last_run&&be(ue)})}var ee=f(oe,2);{var N=be=>{var he=Ap();G("click",he,()=>n(c(S).uid)),k(be,he)};H(ee,be=>{c(s)[c(S).uid]||be(N)})}var se=f(ee,2),ae=f(U,2);{var me=be=>{var he=Tp(),Te=h(he);{var ne=de=>{var _e=Kp();k(de,_e)},re=de=>{var _e=pt(),fe=ye(_e);Ct(fe,17,()=>c(s)[c(S).uid],we=>we.uid,(we,ce)=>{var ve=Fp(),J=h(ve),j=h(J),V=f(J,2);mn(V,{get status(){return c(ce).status}});var pe=f(V,2),Ae=h(pe),Pe=f(pe,2),Ie=h(Pe);O((st,De,xt)=>{M(j,st),M(Ae,De),M(Ie,xt)},[()=>Kt(c(ce).uid),()=>bi(c(ce).started_at,c(ce).finished_at),()=>bs(c(ce).started_at)]),k(we,ve)}),k(de,_e)};H(Te,de=>{c(s)[c(S).uid].length===0?de(ne):de(re,!1)})}k(be,he)};H(ae,be=>{c(s)[c(S).uid]!=null&&be(me)})}O(()=>{K=xe(A,1,"bird-entry svelte-12folcn",null,K,{"bird-entry-border":c(E)<e.birds.length-1}),M(C,c(S).name),M(L,c(S).schedule)}),G("click",se,()=>a(c(S).uid,c(S).name)),k(w,A)}),k(v,x)};H(u,v=>{e.birds.length===0?v(_):v(p,!1)})}O(()=>M(d,e.birds.length)),k(t,i),tt()}ut(["click"]);var Pp=T('<span class="error-count svelte-ht9bxs"> </span>'),Bp=T('<div class="row"><span class="dim">No errors recorded</span></div>'),Dp=T('<div class="error-entry svelte-ht9bxs"><div class="error-top svelte-ht9bxs"><span class="error-source mono svelte-ht9bxs"> </span> <span class="error-time svelte-ht9bxs"> </span></div> <span class="error-message svelte-ht9bxs"> </span></div>'),Rp=T('<div class="db-grid svelte-ht9bxs"><!> <div class="panel"><div class="panel-header"><span class="panel-title">Recent Errors</span> <!></div> <div class="panel-body"><!></div></div></div> <!>',1);function Ip(t,e){et(e,!0);var s=Rp(),n=ye(s),a=h(n);Sp(a,{get initialStats(){return e.jobStats}});var i=f(a,2),r=h(i),l=f(h(r),2);{var d=x=>{var y=Pp(),w=h(y);O(()=>M(w,e.recentErrors.length)),k(x,y)};H(l,x=>{e.recentErrors.length>0&&x(d)})}var o=f(r,2),u=h(o);{var _=x=>{var y=Bp();k(x,y)},p=x=>{var y=pt(),w=ye(y);Ct(w,17,()=>e.recentErrors,S=>S.id,(S,E)=>{var A=Dp(),K=h(A),U=h(K),te=h(U),X=f(U,2),C=h(X),F=f(K,2),L=h(F);O(Z=>{M(te,c(E).source),M(C,Z),M(L,c(E).message)},[()=>bs(c(E).created_at)]),k(S,A)}),k(x,y)};H(u,x=>{e.recentErrors.length===0?x(_):x(p,!1)})}var v=f(n,2);Lp(v,{get birds(){return e.systemBirds}}),k(t,s),tt()}var Qp=T('<div class="loading">Loading...</div>'),zp=T('<div class="tabs svelte-1ozf5k3"><button>Config</button> <button>Database</button></div> <!> <!>',1);function Np(t,e){et(e,!0);let s=W(null),n=W(null),a=W(null),i=W(!0),r=W(Ue([])),l=W(null),d=W(Ue([])),o=W(!0),u=W("config"),_=W(null),p=W(!1);gt(()=>{const F=new AbortController;return Promise.all([ke("/api/config"),ke("/api/logs?level=error&perPage=10"),ke("/api/jobs/stats"),ke("/api/birds?system=true&perPage=100"),ke("/api/secrets")]).then(([L,Z,oe,ue,ee])=>{F.signal.aborted||(b(s,L,!0),b(r,Z.items,!0),b(l,oe,!0),b(d,ue.items.filter(N=>N.name.startsWith("__bb_")),!0),b(n,ee,!0))}).finally(()=>{F.signal.aborted||b(o,!1)}),()=>F.abort()}),gt(()=>{const F=new AbortController;return ke("/api/doctor").then(L=>{F.signal.aborted||b(a,L,!0)}).finally(()=>{F.signal.aborted||b(i,!1)}),()=>F.abort()}),gt(()=>Pi(F=>{F.resource==="config"&&ke("/api/config").then(L=>{b(s,L,!0)}).catch(()=>{}),F.resource==="secrets"&&v()}));function v(){ke("/api/secrets").then(F=>{b(n,F,!0)}).catch(()=>{})}function x(F,L){const Z=F.split(".");let oe={};const ue=oe;for(let ee=0;ee<Z.length-1;ee++){const N={};oe[Z[ee]]=N,oe=N}return oe[Z[Z.length-1]]=L,ue}async function y(F){try{const L=await ke("/api/config",{method:"PATCH",body:F});return b(s,L,!0),Me("Config saved","success"),!0}catch(L){return Me(`Failed: ${L.message}`,"error"),!1}}function w(F,L){b(_,F,!0),b(p,!1)}function S(){b(_,null),b(p,!1)}async function E(F,L,Z){b(p,!0);const oe=Z?Z(L):L;await y(x(F,oe))?S():b(p,!1)}async function A(F,L){await y(x(F,!L))}const K=Ee(()=>({editingField:c(_),editingSaving:c(p),startEdit:w,cancelEdit:S,saveField:E,toggleField:A,saveConfigPatch:y}));var U=pt(),te=ye(U);{var X=F=>{var L=Qp();k(F,L)},C=F=>{var L=zp(),Z=ye(L),oe=h(Z);let ue;var ee=f(oe,2);let N;var se=f(Z,2);{var ae=he=>{mp(he,{get config(){return c(s)},get status(){return e.status},get doctor(){return c(a)},get doctorLoading(){return c(i)},get editor(){return c(K)},get secrets(){return c(n)},onsecretsupdate:v})};H(se,he=>{c(u)==="config"&&he(ae)})}var me=f(se,2);{var be=he=>{Ip(he,{get jobStats(){return c(l)},get systemBirds(){return c(d)},get recentErrors(){return c(r)}})};H(me,he=>{c(u)==="database"&&he(be)})}O(()=>{ue=xe(oe,1,"tab svelte-1ozf5k3",null,ue,{"tab-active":c(u)==="config"}),N=xe(ee,1,"tab svelte-1ozf5k3",null,N,{"tab-active":c(u)==="database"})}),G("click",oe,()=>{b(u,"config")}),G("click",ee,()=>{b(u,"database")}),k(F,L)};H(te,F=>{c(o)?F(X):c(s)&&F(C,1)})}k(t,U),tt()}ut(["click"]);var Up=T('<div class="card-sub svelte-1tf674w"> </div>'),Hp=T('<div><div class="card-label svelte-1tf674w"> </div> <div class="card-value svelte-1tf674w"> </div> <!></div>');function hr(t,e){var s=Hp();let n;var a=h(s),i=h(a),r=f(a,2),l=h(r),d=f(r,2);{var o=u=>{var _=Up(),p=h(_);O(()=>M(p,e.sub)),k(u,_)};H(d,u=>{e.sub&&u(o)})}O(()=>{n=xe(s,1,"stat-card svelte-1tf674w",null,n,{"stat-card-info":e.variant==="info","stat-card-warning":e.variant==="warning","stat-card-success":e.variant==="success","stat-card-error":e.variant==="error"}),M(i,e.label),M(l,e.value)}),k(t,s)}var Op=T('<div class="error-state svelte-1lyclyh"><p> </p> <button class="btn btn-outline btn-sm">Back to Sessions</button></div>'),Vp=T('<div class="loading">Loading...</div>'),Gp=T('<div class="filter-spacer svelte-1lyclyh"></div> <span class="last-updated svelte-1lyclyh"> </span>',1),qp=T('<tr><td><!></td><td class="mono"> </td><td class="content-cell svelte-1lyclyh"> </td><td class="mono"> </td><td class="mono"> </td><td> </td></tr>'),Wp=T('<div class="detail-header svelte-1lyclyh"><button class="btn btn-outline btn-sm"><svg class="back-icon svelte-1lyclyh" viewBox="0 0 6 10" fill="none" aria-hidden="true"><path d="M5 1L1 5L5 9" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg> Sessions</button> <h2 class="session-title svelte-1lyclyh"> </h2> <span class="session-meta svelte-1lyclyh"><span class="mono"> </span> <span class="meta-sep svelte-1lyclyh"></span> <span class="meta-sep svelte-1lyclyh"></span> </span></div> <div class="stat-cards svelte-1lyclyh"><!> <!> <!></div> <!>',1);function jp(t,e){et(e,!0);const s=Li().get("id")??"",n=[{key:"direction",label:"Dir"},{key:"user_id",label:"User",sortable:!0},{key:"content",label:"Content"},{key:"tokens_in",label:"Tokens In"},{key:"tokens_out",label:"Tokens Out"},{key:"created_at",label:"Time",sortable:!0}];let a=W(Ue(kn())),i=W(null),r=W(null),l=W("");const d=s?Yr({endpoint:`/api/sessions/${s}`,columns:n,defaultSort:"created_at",invalidateOn:"sessions",transformResponse:y=>y.messages,onResponse:y=>{b(a,kn(),!0),b(i,y.session,!0),b(r,y.stats,!0)}}):null;d||b(l,"Invalid session ID");function o(){window.location.hash="#/sessions"}var u=pt(),_=ye(u);{var p=y=>{var w=Op(),S=h(w),E=h(S),A=f(S,2);O(()=>M(E,c(l))),G("click",A,o),k(y,w)},v=y=>{var w=Vp();k(y,w)},x=y=>{var w=Wp(),S=ye(w),E=h(S),A=f(E,2),K=h(A),U=f(A,2),te=h(U),X=h(te),C=f(te,3),F=f(C,2),L=f(S,2),Z=h(L);hr(Z,{label:"Messages",get value(){return c(i).message_count}});var oe=f(Z,2);{let N=Ee(()=>c(r).totalTokensIn.toLocaleString());hr(oe,{label:"Tokens In",get value(){return c(N)}})}var ue=f(oe,2);{let N=Ee(()=>c(r).totalTokensOut.toLocaleString());hr(ue,{label:"Tokens Out",get value(){return c(N)}})}var ee=f(L,2);{const N=ae=>{var me=Gp(),be=f(ye(me),2),he=h(be);O(()=>M(he,`Updated ${c(a)??""}`)),k(ae,me)};let se=Ee(()=>d.items.length===0);hn(ee,{get columns(){return n},get isEmpty(){return c(se)},emptyMessage:"No messages recorded for this session",get fetching(){return d.fetching},get page(){return d.page},get totalPages(){return d.totalPages},get totalItems(){return d.totalItems},get sort(){return d.sort},get search(){return d.search},searchPlaceholder:"Search messages...",get onPageChange(){return d.setPage},get onSortChange(){return d.setSort},get onSearchChange(){return d.setSearch},toolbar:N,children:(ae,me)=>{var be=pt(),he=ye(be);Ct(he,17,()=>d.items,Te=>Te.id,(Te,ne)=>{var re=qp(),de=h(re),_e=h(de);{let Ie=Ee(()=>c(ne).direction==="in"?"info":"success");mn(_e,{get status(){return c(Ie)}})}var fe=f(de),we=h(fe),ce=f(fe),ve=h(ce),J=f(ce),j=h(J),V=f(J),pe=h(V),Ae=f(V),Pe=h(Ae);O(Ie=>{M(we,c(ne).user_id),M(ve,c(ne).content??"-"),M(j,c(ne).tokens_in??"-"),M(pe,c(ne).tokens_out??"-"),M(Pe,Ie)},[()=>bs(c(ne).created_at)]),k(Te,re)}),k(ae,be)},$$slots:{toolbar:!0,default:!0}})}O((N,se)=>{M(K,`Session ${N??""}`),M(X,c(i).channel_id),M(C,` ${c(i).agent_id??""} `),M(F,` ${se??""}`)},[()=>Kt(c(i).uid),()=>bs(c(i).last_active)]),G("click",E,o),k(y,w)};H(_,y=>{c(l)?y(p):d?.loading?y(v,1):c(i)&&c(r)&&d&&y(x,2)})}k(t,u),tt()}ut(["click"]);var Yp=T("<div></div>"),Zp=T('<div><span class="step-number svelte-dm5b3b"></span></div> <!>',1),Jp=T('<div class="step-indicator svelte-dm5b3b"></div>'),$p=T('<div class="login-error svelte-dm5b3b"> </div>'),eg=T(`<p class="onboarding-desc svelte-dm5b3b">Create a Slack app at <a target="_blank" rel="noopener" class="onboarding-link svelte-dm5b3b">api.slack.com/apps</a> using the <a target="_blank" rel="noopener" class="onboarding-link svelte-dm5b3b">manifest.json</a>.</p> <form><label class="form-label">Bot Token <input type="password" class="form-input" placeholder="xoxb-..." autocomplete="off"/> <span class="form-hint svelte-dm5b3b">OAuth & Permissions, click "Install to Workspace", then copy the token</span></label> <label class="form-label">App Token <input type="password" class="form-input" placeholder="xapp-..." autocomplete="off"/> <span class="form-hint svelte-dm5b3b">Basic Information, click "Generate Token and Scopes", add connections:write, then copy
|
|
7
7
|
the token</span></label> <!> <button type="submit" class="btn btn-primary onboarding-submit svelte-dm5b3b"> </button></form>`,1),tg=T('<div class="login-error svelte-dm5b3b"> </div>'),sg=T('<p class="onboarding-desc svelte-dm5b3b">Configure your first agent. You can add more agents and change settings later.</p> <form><label class="form-label">Name <input type="text" class="form-input" placeholder="BrowserBird"/></label> <div class="form-row svelte-dm5b3b"><label class="form-label">Provider <select class="form-input"><option>Claude</option><option>OpenCode</option></select></label> <label class="form-label">Model <input type="text" class="form-input" placeholder="sonnet"/></label></div> <label class="form-label">System Prompt <textarea class="form-textarea" rows="3"></textarea></label> <label class="form-label">Anthropic Key <input type="password" class="form-input" placeholder="sk-ant-..." autocomplete="off"/> <span class="form-hint svelte-dm5b3b">API key from platform.claude.com/settings/keys</span></label> <!> <div class="onboarding-actions svelte-dm5b3b"><button type="button" class="btn btn-outline">Back</button> <button type="submit" class="btn btn-primary"> </button></div></form>',1),ng=T('<div class="probe-result probe-ok svelte-dm5b3b">Connected</div>'),ag=T('<div class="probe-result probe-fail svelte-dm5b3b">Not reachable. Make sure the VM container is running.</div>'),ig=T('<label class="form-label">VM Host <div class="probe-row svelte-dm5b3b"><input type="text" class="form-input svelte-dm5b3b" placeholder="vm"/> <button type="button" class="btn btn-outline btn-sm"> </button></div> <span class="form-hint svelte-dm5b3b">Hostname of the VM container (e.g. vm, vm.internal, localhost)</span></label> <!>',1),rg=T('<div class="login-error svelte-dm5b3b"> </div>'),lg=T('<p class="onboarding-desc svelte-dm5b3b">Optionally enable browser access for your agent. You can configure this later.</p> <form><div class="browser-toggle svelte-dm5b3b"><span class="browser-toggle-label svelte-dm5b3b">Enable browser</span> <!></div> <!> <!> <div class="onboarding-actions svelte-dm5b3b"><button type="button" class="btn btn-outline">Back</button> <div class="onboarding-actions-right svelte-dm5b3b"><button type="button" class="btn btn-outline"> </button> <button type="submit" class="btn btn-primary"> </button></div></div></form>',1),og=T('<div class="launch-summary svelte-dm5b3b"><div class="summary-row svelte-dm5b3b"><span class="summary-label svelte-dm5b3b">Slack</span> <span class="summary-value svelte-dm5b3b"> </span></div> <div class="summary-row svelte-dm5b3b"><span class="summary-label svelte-dm5b3b">Agent</span> <span class="summary-value svelte-dm5b3b"> </span></div> <div class="summary-row svelte-dm5b3b"><span class="summary-label svelte-dm5b3b">Browser</span> <span class="summary-value svelte-dm5b3b"> </span></div></div> <div class="done-tips svelte-dm5b3b"><div class="done-tip svelte-dm5b3b"><span class="done-tip-label svelte-dm5b3b">Mention your bot</span> <span class="done-tip-detail svelte-dm5b3b"> </span></div> <div class="done-tip svelte-dm5b3b"><span class="done-tip-label svelte-dm5b3b">Direct message</span> <span class="done-tip-detail svelte-dm5b3b">Open a DM with your bot in Slack</span></div> <div class="done-tip svelte-dm5b3b"><span class="done-tip-label svelte-dm5b3b">Slash commands</span> <span class="done-tip-detail svelte-dm5b3b">Type /bird in Slack to manage scheduled tasks</span></div> <div class="done-tip svelte-dm5b3b"><span class="done-tip-label svelte-dm5b3b">Scheduled tasks</span> <span class="done-tip-detail svelte-dm5b3b">Create birds from the dashboard, via /bird create, or ask your bot in Slack</span></div></div> <button type="button" class="btn btn-primary onboarding-submit svelte-dm5b3b">Go to Dashboard</button>',1),cg=T('<div class="login-error svelte-dm5b3b"> </div>'),dg=T('<!> <div class="onboarding-actions svelte-dm5b3b"><button type="button" class="btn btn-outline">Back</button> <button type="button" class="btn btn-primary"> </button></div>',1),ug=T('<div class="login-overlay svelte-dm5b3b"><div class="onboarding-card svelte-dm5b3b"><div class="onboarding-brand svelte-dm5b3b"><img src="/logo.svg" alt="BrowserBird" class="login-logo"/></div> <!> <h2 class="onboarding-heading svelte-dm5b3b"><!></h2> <!></div></div>');function hg(t,e){et(e,!0);const s=["Slack","Agent","Browser"],n="https://api.slack.com/apps",a="https://raw.githubusercontent.com/Owloops/browserbird/main/manifest.json";let i=W(0),r=W(!1),l=W(""),d=Ue({botToken:"",appToken:"",team:"",botUser:""}),o=Ue({name:"BrowserBird",provider:"claude",model:"sonnet",systemPrompt:"You are responding in a Slack workspace. Be concise, helpful, and natural.",maxTurns:50,channels:["*"],apiKey:""}),u=Ue({enabled:!1,novncHost:"localhost",novncPort:6080}),_=W("idle"),p=W(null);gt(()=>{wh().then(ne=>{b(p,ne,!0),o.name=ne.agent.name,o.provider=ne.agent.provider,o.model=ne.agent.model,o.systemPrompt=ne.agent.systemPrompt,o.maxTurns=ne.agent.maxTurns,o.channels=ne.agent.channels,u.enabled=ne.browser.enabled,u.novncHost=ne.browser.novncHost,u.novncPort=ne.browser.novncPort}).catch(()=>{})});async function v(ne){if(ne.preventDefault(),!(!d.botToken.trim()||!d.appToken.trim())){b(r,!0),b(l,"");try{const re=await yh(d.botToken.trim(),d.appToken.trim());d.team=re.team,d.botUser=re.botUser,b(i,1)}catch(re){b(l,re.message,!0)}finally{b(r,!1)}}}async function x(ne){if(ne.preventDefault(),!(!o.name.trim()||!o.provider.trim()||!o.model.trim())){if(!o.apiKey.trim()){b(l,"API key is required");return}b(r,!0),b(l,"");try{await kh({name:o.name.trim(),provider:o.provider.trim(),model:o.model.trim(),systemPrompt:o.systemPrompt.trim(),maxTurns:o.maxTurns,channels:o.channels}),await Sh({apiKey:o.apiKey.trim()}),b(i,2)}catch(re){b(l,re.message,!0)}finally{b(r,!1)}}}async function y(ne){ne.preventDefault(),b(r,!0),b(l,"");try{await Eh({enabled:u.enabled,novncHost:u.enabled?u.novncHost.trim():void 0}),await E()}catch(re){b(l,re.message,!0)}finally{b(r,!1)}}async function w(){b(r,!0),b(l,"");try{await E()}catch(ne){b(l,ne.message,!0)}finally{b(r,!1)}}let S=W(!1);async function E(){await Ah(),b(S,!0),b(i,3)}async function A(){b(r,!0),b(l,"");try{await E()}catch(ne){b(l,ne.message,!0)}finally{b(r,!1)}}async function K(){const ne=u.novncHost.trim();if(ne){b(_,"checking");try{const re=await Ch(ne,u.novncPort);b(_,re.reachable?"reachable":"unreachable",!0)}catch{b(_,"unreachable")}}}function U(){b(l,""),c(i)===3&&!c(S)?b(i,2):mr(i,-1)}var te=ug(),X=h(te),C=f(h(X),2);{var F=ne=>{var re=Jp();Ct(re,21,()=>s,Vr,(de,_e,fe)=>{var we=Zp(),ce=ye(we);let ve;var J=h(ce);J.textContent=fe+1;var j=f(ce,2);{var V=pe=>{var Ae=Yp();let Pe;O(()=>Pe=xe(Ae,1,"step-line svelte-dm5b3b",null,Pe,{completed:fe<c(i)})),k(pe,Ae)};H(j,pe=>{fe<s.length-1&&pe(V)})}O(()=>ve=xe(ce,1,"step-dot svelte-dm5b3b",null,ve,{active:fe===c(i),completed:fe<c(i)})),k(de,we)}),k(ne,re)};H(C,ne=>{c(i)<s.length&&ne(F)})}var L=f(C,2),Z=h(L);{var oe=ne=>{var re=Qs("Connect Slack");k(ne,re)},ue=ne=>{var re=Qs("Configure Agent");k(ne,re)},ee=ne=>{var re=Qs("Browser");k(ne,re)},N=ne=>{var re=Qs();O(()=>M(re,c(S)?"You're all set":"Launching...")),k(ne,re)};H(Z,ne=>{c(i)===0?ne(oe):c(i)===1?ne(ue,1):c(i)===2?ne(ee,2):ne(N,!1)})}var se=f(L,2);{var ae=ne=>{var re=eg(),de=ye(re),_e=f(h(de));Jt(_e,"href",n);var fe=f(_e,2);Jt(fe,"href",a);var we=f(de,2),ce=h(we),ve=f(h(ce)),J=f(ce,2),j=f(h(J)),V=f(J,2);{var pe=Ie=>{var st=$p(),De=h(st);O(()=>M(De,c(l))),k(Ie,st)};H(V,Ie=>{c(l)&&Ie(pe)})}var Ae=f(V,2),Pe=h(Ae);O(()=>{Ae.disabled=c(r),M(Pe,c(r)?"Validating...":"Validate & Save")}),In("submit",we,v),Oe(ve,()=>d.botToken,Ie=>d.botToken=Ie),Oe(j,()=>d.appToken,Ie=>d.appToken=Ie),k(ne,re)},me=ne=>{var re=sg(),de=f(ye(re),2),_e=h(de),fe=f(h(_e)),we=f(_e,2),ce=h(we),ve=f(h(ce)),J=h(ve);J.value=J.__value="claude";var j=f(J);j.value=j.__value="opencode";var V=f(ce,2),pe=f(h(V)),Ae=f(we,2),Pe=f(h(Ae)),Ie=f(Ae,2),st=f(h(Ie)),De=f(Ie,2);{var xt=lt=>{var Wt=tg(),ts=h(Wt);O(()=>M(ts,c(l))),k(lt,Wt)};H(De,lt=>{c(l)&<(xt)})}var Gt=f(De,2),rs=h(Gt),qt=f(rs,2),es=h(qt);O(()=>{qt.disabled=c(r),M(es,c(r)?"Saving...":"Save & Continue")}),In("submit",de,x),Oe(fe,()=>o.name,lt=>o.name=lt),Uc(ve,()=>o.provider,lt=>o.provider=lt),Oe(pe,()=>o.model,lt=>o.model=lt),Oe(Pe,()=>o.systemPrompt,lt=>o.systemPrompt=lt),Oe(st,()=>o.apiKey,lt=>o.apiKey=lt),G("click",rs,U),k(ne,re)},be=ne=>{var re=lg(),de=f(ye(re),2),_e=h(de),fe=f(h(_e),2);Pn(fe,{get active(){return u.enabled},onToggle:()=>{u.enabled=!u.enabled,b(_,"idle")}});var we=f(_e,2);{var ce=De=>{var xt=ig(),Gt=ye(xt),rs=f(h(Gt)),qt=h(rs),es=f(qt,2),lt=h(es),Wt=f(Gt,2);{var ts=bt=>{var _s=ng();k(bt,_s)},ls=bt=>{var _s=ag();k(bt,_s)};H(Wt,bt=>{c(_)==="reachable"?bt(ts):c(_)==="unreachable"&&bt(ls,1)})}O(bt=>{es.disabled=bt,M(lt,c(_)==="checking"?"Checking...":"Test Connection")},[()=>c(_)==="checking"||!u.novncHost.trim()]),G("input",qt,()=>{b(_,"idle")}),Oe(qt,()=>u.novncHost,bt=>u.novncHost=bt),G("click",es,K),k(De,xt)};H(we,De=>{u.enabled&&De(ce)})}var ve=f(we,2);{var J=De=>{var xt=rg(),Gt=h(xt);O(()=>M(Gt,c(l))),k(De,xt)};H(ve,De=>{c(l)&&De(J)})}var j=f(ve,2),V=h(j),pe=f(V,2),Ae=h(pe),Pe=h(Ae),Ie=f(Ae,2),st=h(Ie);O(()=>{Ae.disabled=c(r),M(Pe,c(r)?"Launching...":"Skip"),Ie.disabled=c(r),M(st,c(r)?"Launching...":"Save & Launch")}),In("submit",de,y),G("click",V,U),G("click",Ae,w),k(ne,re)},he=ne=>{var re=og(),de=ye(re),_e=h(de),fe=f(h(_e),2),we=h(fe),ce=f(_e,2),ve=f(h(ce),2),J=h(ve),j=f(ce,2),V=f(h(j),2),pe=h(V),Ae=f(de,2),Pe=h(Ae),Ie=f(h(Pe),2),st=h(Ie),De=f(Ae,2);O(()=>{M(we,d.team||"Connected"),M(J,`${o.name??""} (${o.provider??""}/${o.model??""})`),M(pe,u.enabled?"Enabled":"Disabled"),M(st,`@${o.name??""} in any channel`)}),G("click",De,function(...xt){e.oncomplete?.apply(this,xt)}),k(ne,re)},Te=ne=>{var re=dg(),de=ye(re);{var _e=J=>{var j=cg(),V=h(j);O(()=>M(V,c(l))),k(J,j)};H(de,J=>{c(l)&&J(_e)})}var fe=f(de,2),we=h(fe),ce=f(we,2),ve=h(ce);O(()=>{ce.disabled=c(r),M(ve,c(r)?"Launching...":"Retry")}),G("click",we,U),G("click",ce,A),k(ne,re)};H(se,ne=>{c(i)===0?ne(ae):c(i)===1?ne(me,1):c(i)===2?ne(be,2):c(S)?ne(he,3):ne(Te,!1)})}k(t,te),tt()}ut(["click","input"]);var fg=T('<div class="loading">Loading...</div>'),_g=T('<div class="login-error svelte-1n46o8q"> </div>'),vg=T('<div class="login-overlay svelte-1n46o8q"><div class="login-card svelte-1n46o8q"><div class="login-brand svelte-1n46o8q"><img src="/logo.svg" alt="BrowserBird" class="login-logo"/></div> <h2 class="login-heading svelte-1n46o8q">Create your account</h2> <form><label class="form-label">Email <input type="email" class="form-input" placeholder="you@example.com" autocomplete="email"/></label> <label class="form-label">Password <input type="password" class="form-input" placeholder="At least 8 characters" autocomplete="new-password"/></label> <label class="form-label">Confirm Password <input type="password" class="form-input" placeholder="Repeat password" autocomplete="new-password"/></label> <!> <button type="submit" class="btn btn-primary login-submit svelte-1n46o8q">Create Account</button></form></div></div>'),pg=T('<div class="login-error svelte-1n46o8q"> </div>'),gg=T('<div class="login-overlay svelte-1n46o8q"><div class="login-card svelte-1n46o8q"><div class="login-brand svelte-1n46o8q"><img src="/logo.svg" alt="BrowserBird" class="login-logo"/></div> <form><label class="form-label">Email <input type="email" class="form-input" placeholder="you@example.com" autocomplete="email"/></label> <label class="form-label">Password <input type="password" class="form-input" placeholder="Enter password" autocomplete="current-password"/></label> <!> <button type="submit" class="btn btn-primary login-submit svelte-1n46o8q">Sign In</button></form></div></div>'),xg=T('<div class="app svelte-1n46o8q"><!> <main class="content svelte-1n46o8q"><div class="content-header svelte-1n46o8q"><button class="hamburger svelte-1n46o8q" aria-label="Open navigation"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="3" y1="6" x2="21" y2="6"></line><line x1="3" y1="12" x2="21" y2="12"></line><line x1="3" y1="18" x2="21" y2="18"></line></svg></button> <h1 class="page-title svelte-1n46o8q"> </h1> <div class="header-right svelte-1n46o8q"><!></div></div> <div class="content-body svelte-1n46o8q"><!></div></main></div>'),bg=T("<!> <!> <!>",1);function mg(t,e){et(e,!0);const s={status:"Status",sessions:"Sessions","session-detail":"Session Detail",birds:"Birds",browser:"Browser",settings:"Settings"};let n=W(Ue(kl())),a=W("checking"),i=W(null),r=W("connecting"),l=W(localStorage.getItem("sidebar-collapsed")==="true"),d=W(!1),o=W(""),u=W(""),_=W(""),p=W(""),v=W(""),x=W(""),y=W("");const w=Ee(()=>s[c(n)]??"Status");gt(()=>{document.title=`${c(w)} - BrowserBird`});function S(){b(l,!c(l)),localStorage.setItem("sidebar-collapsed",String(c(l)))}gh(()=>{b(a,"login")}),gt(()=>{const ee=()=>{b(n,kl(),!0),b(d,!1)};return window.addEventListener("hashchange",ee),()=>window.removeEventListener("hashchange",ee)}),gt(()=>{if(c(n)!=="flights")return;const ee=Li().get("birdUid");window.location.hash=ee?`#/birds?expand=${ee}`:"#/birds"}),gt(()=>{yl().then(async ee=>{ee.setupRequired?b(a,"setup"):ee.authRequired?Xi()?await mh()?ee.onboardingRequired?b(a,"onboarding"):b(a,"authenticated"):b(a,"login"):b(a,(ee.onboardingRequired,"login"),!0):b(a,"authenticated")})}),gt(()=>{if(c(a)!=="authenticated")return;Sl(N=>{b(i,N,!0),b(r,"connected")},N=>El(N),N=>{b(r,N,!0)});const ee=setInterval(()=>{Kh()||ke("/api/status").then(()=>{b(r,"connected"),Sl(N=>{b(i,N,!0),b(r,"connected")},N=>El(N),N=>{b(r,N,!0)})}).catch(()=>{b(r,"disconnected")})},3e4);return()=>{qc(),clearInterval(ee)}});function E(){Wr(),b(a,"login")}async function A(ee){ee.preventDefault();const N=c(o).trim(),se=c(u);if(!(!N||!se))try{const ae=await xh(N,se);wl(ae.token),b(_,""),b(o,""),b(u,""),b(a,"authenticated")}catch(ae){b(_,ae.message,!0)}}async function K(ee){ee.preventDefault();const N=c(p).trim(),se=c(v),ae=c(x);if(!(!N||!se)){if(se!==ae){b(y,"Passwords do not match");return}if(se.length<8){b(y,"Password must be at least 8 characters");return}try{const me=await bh(N,se);wl(me.token),b(y,""),b(p,""),b(v,""),b(x,"");const be=await yl();b(a,be.onboardingRequired?"onboarding":"authenticated",!0)}catch(me){b(y,me.message,!0)}}}var U=bg(),te=ye(U);Uh(te,{});var X=f(te,2);Oh(X,{});var C=f(X,2);{var F=ee=>{var N=fg();k(ee,N)},L=ee=>{var N=vg(),se=h(N),ae=f(h(se),4),me=h(ae),be=f(h(me)),he=f(me,2),Te=f(h(he)),ne=f(he,2),re=f(h(ne)),de=f(ne,2);{var _e=fe=>{var we=_g(),ce=h(we);O(()=>M(ce,c(y))),k(fe,we)};H(de,fe=>{c(y)&&fe(_e)})}In("submit",ae,K),Oe(be,()=>c(p),fe=>b(p,fe)),Oe(Te,()=>c(v),fe=>b(v,fe)),Oe(re,()=>c(x),fe=>b(x,fe)),k(ee,N)},Z=ee=>{var N=gg(),se=h(N),ae=f(h(se),2),me=h(ae),be=f(h(me)),he=f(me,2),Te=f(h(he)),ne=f(he,2);{var re=de=>{var _e=pg(),fe=h(_e);O(()=>M(fe,c(_))),k(de,_e)};H(ne,de=>{c(_)&&de(re)})}In("submit",ae,A),Oe(be,()=>c(o),de=>b(o,de)),Oe(Te,()=>c(u),de=>b(u,de)),k(ee,N)},oe=ee=>{hg(ee,{oncomplete:()=>{b(a,"authenticated")}})},ue=ee=>{var N=xg(),se=h(N);Ph(se,{get currentPage(){return c(n)},get collapsed(){return c(l)},get mobileOpen(){return c(d)},ontoggle:S,onmobileclose:()=>{b(d,!1)},onsignout:E});var ae=f(se,2),me=h(ae),be=h(me),he=f(be,2),Te=h(he),ne=f(he,2),re=h(ne);Ih(re,{get status(){return c(i)}});var de=f(me,2),_e=h(de);{var fe=V=>{m0(V,{})},we=V=>{jp(V,{})},ce=V=>{rf(V,{})},ve=V=>{Sv(V,{get status(){return c(i)}})},J=V=>{Np(V,{get status(){return c(i)}})},j=V=>{_0(V,{get status(){return c(i)}})};H(_e,V=>{c(n)==="sessions"?V(fe):c(n)==="session-detail"?V(we,1):c(n)==="birds"?V(ce,2):c(n)==="browser"?V(ve,3):c(n)==="settings"?V(J,4):V(j,!1)})}O(()=>M(Te,c(w))),G("click",be,()=>{b(d,!0)}),k(ee,N)};H(C,ee=>{c(a)==="checking"?ee(F):c(a)==="setup"?ee(L,1):c(a)==="login"?ee(Z,2):c(a)==="onboarding"?ee(oe,3):ee(ue,!1)})}k(t,U),tt()}ut(["click"]);eh(mg,{target:document.getElementById("app")});
|
package/web/dist/index.html
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap"
|
|
12
12
|
rel="stylesheet"
|
|
13
13
|
/>
|
|
14
|
-
<script type="module" crossorigin src="/assets/index-
|
|
14
|
+
<script type="module" crossorigin src="/assets/index-ND8WMX3A.js"></script>
|
|
15
15
|
<link rel="stylesheet" crossorigin href="/assets/index-JMPJCJ2F.css">
|
|
16
16
|
</head>
|
|
17
17
|
<body>
|