@owloops/browserbird 1.6.0 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -73,7 +73,7 @@ Two services are deployed: **browserbird-app** (web dashboard, API, Slack) and *
73
73
 
74
74
  ## Slack (Optional)
75
75
 
76
- [![Create Slack App](https://img.shields.io/badge/Slack-Create_App-4A154B?style=for-the-badge&logo=slack&logoColor=white)](https://api.slack.com/apps?new_app=1&manifest_json=%7B%22display_information%22%3A%7B%22name%22%3A%22BrowserBird%22%2C%22description%22%3A%22A%20self-hosted%20AI%20assistant%20in%20Slack%2C%20with%20a%20real%20browser%20and%20a%20scheduler.%22%2C%22background_color%22%3A%22%231a1a2e%22%7D%2C%22features%22%3A%7B%22assistant_view%22%3A%7B%22assistant_description%22%3A%22A%20self-hosted%20AI%20assistant%20in%20Slack%2C%20with%20a%20real%20browser%20and%20a%20scheduler.%22%7D%2C%22app_home%22%3A%7B%22home_tab_enabled%22%3Atrue%2C%22messages_tab_enabled%22%3Atrue%2C%22messages_tab_read_only_enabled%22%3Afalse%7D%2C%22bot_user%22%3A%7B%22display_name%22%3A%22BrowserBird%22%2C%22always_online%22%3Atrue%7D%2C%22slash_commands%22%3A%5B%7B%22command%22%3A%22%2Fbird%22%2C%22description%22%3A%22Manage%20BrowserBird%20birds%22%2C%22usage_hint%22%3A%22list%20%7C%20fly%20%7C%20stop%20%7C%20logs%20%7C%20enable%20%7C%20disable%20%7C%20create%20%7C%20status%22%2C%22should_escape%22%3Afalse%7D%5D%7D%2C%22oauth_config%22%3A%7B%22scopes%22%3A%7B%22bot%22%3A%5B%22app_mentions%3Aread%22%2C%22assistant%3Awrite%22%2C%22channels%3Ahistory%22%2C%22channels%3Aread%22%2C%22chat%3Awrite%22%2C%22files%3Aread%22%2C%22files%3Awrite%22%2C%22groups%3Ahistory%22%2C%22groups%3Aread%22%2C%22im%3Ahistory%22%2C%22im%3Aread%22%2C%22im%3Awrite%22%2C%22mpim%3Ahistory%22%2C%22mpim%3Aread%22%2C%22reactions%3Aread%22%2C%22reactions%3Awrite%22%2C%22users%3Aread%22%2C%22commands%22%5D%7D%7D%2C%22settings%22%3A%7B%22event_subscriptions%22%3A%7B%22bot_events%22%3A%5B%22app_mention%22%2C%22assistant_thread_context_changed%22%2C%22assistant_thread_started%22%2C%22message.channels%22%2C%22message.groups%22%2C%22message.im%22%2C%22message.mpim%22%5D%7D%2C%22interactivity%22%3A%7B%22is_enabled%22%3Atrue%7D%2C%22org_deploy_enabled%22%3Afalse%2C%22socket_mode_enabled%22%3Atrue%2C%22token_rotation_enabled%22%3Afalse%7D%7D)
76
+ [![Create Slack App](https://img.shields.io/badge/Slack-Create_App-4A154B?style=for-the-badge&logo=slack&logoColor=white)](https://api.slack.com/apps?new_app=1&manifest_json=%7B%22display_information%22%3A%7B%22name%22%3A%22BrowserBird%22%2C%22description%22%3A%22A%20self-hosted%20AI%20assistant%20in%20Slack%2C%20with%20a%20real%20browser%20and%20a%20scheduler.%22%2C%22background_color%22%3A%22%231a1a2e%22%7D%2C%22features%22%3A%7B%22assistant_view%22%3A%7B%22assistant_description%22%3A%22A%20self-hosted%20AI%20assistant%20in%20Slack%2C%20with%20a%20real%20browser%20and%20a%20scheduler.%22%7D%2C%22app_home%22%3A%7B%22home_tab_enabled%22%3Atrue%2C%22messages_tab_enabled%22%3Atrue%2C%22messages_tab_read_only_enabled%22%3Afalse%7D%2C%22bot_user%22%3A%7B%22display_name%22%3A%22BrowserBird%22%2C%22always_online%22%3Atrue%7D%2C%22slash_commands%22%3A%5B%7B%22command%22%3A%22%2Fbird%22%2C%22description%22%3A%22Manage%20BrowserBird%20birds%22%2C%22usage_hint%22%3A%22list%20%7C%20fly%20%7C%20stop%20%7C%20logs%20%7C%20enable%20%7C%20disable%20%7C%20create%20%7C%20status%22%2C%22should_escape%22%3Afalse%7D%5D%7D%2C%22oauth_config%22%3A%7B%22scopes%22%3A%7B%22bot%22%3A%5B%22app_mentions%3Aread%22%2C%22assistant%3Awrite%22%2C%22channels%3Ahistory%22%2C%22channels%3Aread%22%2C%22chat%3Awrite%22%2C%22files%3Aread%22%2C%22files%3Awrite%22%2C%22groups%3Ahistory%22%2C%22groups%3Aread%22%2C%22im%3Ahistory%22%2C%22im%3Aread%22%2C%22im%3Awrite%22%2C%22mpim%3Ahistory%22%2C%22mpim%3Aread%22%2C%22reactions%3Aread%22%2C%22reactions%3Awrite%22%2C%22users%3Aread%22%2C%22commands%22%5D%7D%7D%2C%22settings%22%3A%7B%22event_subscriptions%22%3A%7B%22bot_events%22%3A%5B%22app_mention%22%2C%22assistant_thread_context_changed%22%2C%22assistant_thread_started%22%2C%22message.channels%22%2C%22message.groups%22%2C%22message.im%22%2C%22message.mpim%22%2C%22app_home_opened%22%5D%7D%2C%22interactivity%22%3A%7B%22is_enabled%22%3Atrue%7D%2C%22org_deploy_enabled%22%3Afalse%2C%22socket_mode_enabled%22%3Atrue%2C%22token_rotation_enabled%22%3Afalse%7D%7D)
77
77
 
78
78
  The manifest pre-configures all scopes, events, and slash commands. After creating the app, install it to your workspace and grab two tokens: the **Bot User OAuth Token** (`xoxb-...`) from OAuth & Permissions, and an **app-level token** (`xapp-...`) with `connections:write` scope from Basic Information.
79
79
 
package/dist/index.mjs CHANGED
@@ -192,8 +192,8 @@ function unknownSubcommand(subcommand, command, validCommands) {
192
192
  /** @fileoverview ASCII banner displayed on daemon startup and in help text. */
193
193
  const pkg = createRequire(import.meta.url)("../package.json");
194
194
  const buildInfo = [];
195
- buildInfo.push(`commit: ${"8468e2519ab927c9f810bc3af7d127829a93c83e".substring(0, 7)}`);
196
- buildInfo.push(`built: 2026-03-19T13:57:16+04:00`);
195
+ buildInfo.push(`commit: ${"ef1bf69c128bbeb16790f862e5173f259610511e".substring(0, 7)}`);
196
+ buildInfo.push(`built: 2026-03-19T14:43:58+04:00`);
197
197
  const buildString = buildInfo.length > 0 ? ` (${buildInfo.join(", ")})` : "";
198
198
  const VERSION = `browserbird ${pkg.version}${buildString}`;
199
199
  const BIRD = [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@owloops/browserbird",
3
- "version": "1.6.0",
3
+ "version": "1.6.1",
4
4
  "description": "AI agent orchestrator with a real browser, a cron scheduler, and a web dashboard",
5
5
  "type": "module",
6
6
  "bin": {
@@ -5,4 +5,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&&(Wt("Bad payload length ("+s+") in fence response"),s=64);const n=this._sock.rQshiftStr(s);return this._supportsFence=!0,e&1<<31?(e&=3,Le.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:ot("XVP operation failed");break;case 1:this._rfbXvpVer=e,Gt("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&&Le.messages.fbUpdateRequest(this._sock,!0,0,0,this._fbWidth,this._fbHeight),n;case 1:return this._handleSetColourMapMsg();case 2:return Ce("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(),Gt("Enabling continuous updates.")),!0;case 248:return this._handleServerFenceMsg();case 250:return this._handleXvpMsg();default:return this._fail("Unexpected server message (type "+e+")"),Ce("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 Ee.pseudoEncodingLastRect:return this._FBU.rects=1,!0;case Ee.pseudoEncodingVMwareCursor:return this._handleVMwareCursor();case Ee.pseudoEncodingCursor:return this._handleCursor();case Ee.pseudoEncodingQEMUExtendedKeyEvent:return this._qemuExtKeyEventSupported=!0,!0;case Ee.pseudoEncodingDesktopName:return this._handleDesktopName();case Ee.pseudoEncodingDesktopSize:return this._resize(this._FBU.width,this._FBU.height),!0;case Ee.pseudoEncodingExtendedDesktopSize:return this._handleExtendedDesktopSize();case Ee.pseudoEncodingExtendedMouseButtons:return this._extendedPointerEventSupported=!0,!0;case Ee.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 o=4;if(i==0){if(r=new Array(n*a*o),this._sock.rQwait("VMware cursor classic encoding",n*a*o*2,2))return!1;let l=new Array(n*a);for(let _=0;_<n*a;_++)l[_]=this._sock.rQshift32();let u=new Array(n*a);for(let _=0;_<n*a;_++)u[_]=this._sock.rQshift32();for(let _=0;_<n*a;_++)if(l[_]==0){let p=u[_],v=p>>8&255,x=p>>16&255,y=p>>24&255;r[_*o]=v,r[_*o+1]=x,r[_*o+2]=y,r[_*o+3]=255}else(l[_]&-256)==-256?u[_]==0?(r[_*o]=0,r[_*o+1]=0,r[_*o+2]=0,r[_*o+3]=0):(u[_]&-256,r[_*o]=0,r[_*o+1]=0,r[_*o+2]=0,r[_*o+3]=255):(r[_*o]=0,r[_*o+1]=0,r[_*o+2]=0,r[_*o+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*o);for(let d=0;d<n*a;d++){let l=this._sock.rQshift32();r[d*4]=l>>24&255,r[d*4+1]=l>>16&255,r[d*4+2]=l>>8&255,r[d*4+3]=l&255}}else return Wt("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 o=i+r;if(this._sock.rQwait("cursor encoding",o))return!1;const d=this._sock.rQshiftBytes(i),l=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=l[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=Hi(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}Wt("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&&Le.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||(Gt("Sending XVP operation "+s+" (version "+e+")"),Le.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()?Le.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=pt.importKey("raw",n,{name:"DES-ECB"},!1,["encrypt"]);return pt.encrypt({name:"DES-ECB"},a,s)}}Le.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 o=n>>8,d=n&255;return o===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 o=0;o<e.length;o++){if(e[o]!=Qs)throw new Error("Unsupported extended clipboard format for Provide message.");s[o]=s[o].replace(/\r\n|\r|\n/gm,`\r
6
6
  `);let d=js(s[o]+"\0");a.push(d.length>>24&255,d.length>>16&255,d.length>>8&255,d.length&255);for(let l=0;l<d.length;l++)a.push(d.charCodeAt(l))}let i=n.deflate(new Uint8Array(a)),r=new Uint8Array(4+i.length);r.set(Le.messages._buildExtendedClipboardFlags([fi],e)),r.set(i,4),Le.messages.clientCutText(t,r,!0)},extendedClipboardNotify(t,e){let s=Le.messages._buildExtendedClipboardFlags([ka],e);Le.messages.clientCutText(t,s,!0)},extendedClipboardRequest(t,e){let s=Le.messages._buildExtendedClipboardFlags([hi],e);Le.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,o)=>r-o),a.set(Le.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];Le.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=j0(-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()}};Le.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 iv=F('<div class="loading svelte-138orkn">Loading...</div>'),rv=F('<div class="disabled-state svelte-138orkn"><div class="disabled-icon svelte-138orkn"><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-138orkn"><rect x="2" y="3" width="20" height="14" rx="2" class="svelte-138orkn"></rect><line x1="8" y1="21" x2="16" y2="21" class="svelte-138orkn"></line><line x1="12" y1="17" x2="12" y2="21" class="svelte-138orkn"></line></svg></div> <h2 class="disabled-title svelte-138orkn">Computer Not Connected</h2> <p class="disabled-text svelte-138orkn">Enable the browser from Settings to connect to a running VM.</p> <a href="#/settings" class="btn btn-outline btn-sm svelte-138orkn">Go to Settings</a></div>'),ov=F('<div class="conn-info-popover svelte-138orkn"><div class="conn-info-row svelte-138orkn"><span class="conn-info-key svelte-138orkn">VNC port</span> <span class="mono conn-info-val svelte-138orkn"> </span></div> <div class="conn-info-row svelte-138orkn"><span class="conn-info-key svelte-138orkn">noVNC port</span> <span class="mono conn-info-val svelte-138orkn"> </span></div></div>'),lv=F('<button class="toolbar-btn toolbar-btn-danger svelte-138orkn"><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-138orkn"><path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4" class="svelte-138orkn"></path><polyline points="16 17 21 12 16 7" class="svelte-138orkn"></polyline><line x1="21" y1="12" x2="9" y2="12" class="svelte-138orkn"></line></svg> Disconnect</button>'),cv=F('<div class="toolbar-right svelte-138orkn"><span class="toolbar-sep svelte-138orkn"></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-138orkn"><rect x="9" y="2" width="6" height="4" rx="1" class="svelte-138orkn"></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-138orkn"></path></svg> Clipboard</button> <!></div>'),dv=F('<div class="clipboard-popover svelte-138orkn"><p class="clipboard-label svelte-138orkn">Type or paste, then use Ctrl+V inside the desktop</p> <textarea class="clipboard-textarea svelte-138orkn" placeholder="Paste text here..."></textarea></div>'),uv=F('<div class="error-overlay svelte-138orkn"><p class="error-text svelte-138orkn"> </p> <p class="error-hint svelte-138orkn">Ensure the browser stack (noVNC) is running</p> <button class="btn btn-outline btn-sm svelte-138orkn">Reconnect</button></div>'),hv=F('<div class="browser-viewer svelte-138orkn"><div class="toolbar svelte-138orkn"><div class="toolbar-left svelte-138orkn"><button class="conn-status svelte-138orkn"><span></span> <span class="toolbar-label svelte-138orkn"> </span></button> <!></div> <!></div> <div class="vnc-container svelte-138orkn"><!> <!> <div></div></div></div>');function fv(t,e){st(e,!0);let s=W(null),n=W(!0),a=W("connecting"),i=W(void 0),r=W(0),o=W(null),d=W(!1),l=W(""),u=W(!1);const _=Ae(()=>e.status?.browser.enabled??!1),p={connecting:"Connecting",connected:"Connected",disconnected:"Disconnected",failed:"Failed"},v=Ae(()=>p[c(a)]);xt(()=>{const A=new AbortController;return ke("/api/config").then(X=>{A.signal.aborted||b(s,X,!0)}).finally(()=>{A.signal.aborted||b(n,!1)}),()=>A.abort()});const x=Ae(()=>{if(!c(s)?.browser)return"";const A=Fi(),X=A?`?token=${encodeURIComponent(A)}`:"";return`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/vnc${X}`});xt(()=>{if(!c(_)||!c(x)||!c(i)||c(r)<0)return;b(a,"connecting");let A=null;try{A=new Le(c(i),c(x)),A.scaleViewport=!0,A.resizeSession=!1,A.qualityLevel=5,A.compressionLevel=2,b(o,A,!0),A.addEventListener("connect",()=>{b(a,"connected")}),A.addEventListener("disconnect",X=>{const L=X.detail;b(a,L.clean?"disconnected":"failed",!0),b(o,null)})}catch{b(a,"failed"),b(o,null)}return()=>{A?.disconnect(),b(o,null)}});function y(){b(a,"connecting"),b(r,c(r)+1)}function w(){c(o)?.disconnect()}function S(){b(d,!c(d)),b(l,"")}function C(){c(o)&&c(o).clipboardPasteFrom(c(l))}var K=yt(),E=me(K);{var U=A=>{var X=iv();k(A,X)},te=A=>{var X=rv();k(A,X)},T=A=>{var X=hv(),L=h(X),se=h(L),oe=h(se),de=h(oe);let $;var H=f(de,2),ne=h(H),ae=f(oe,2);{var xe=le=>{var _e=ov(),Z=h(_e),be=f(h(Z),2),z=h(be),J=f(Z,2),ue=f(h(J),2),Se=h(ue);V(()=>{M(z,c(s).browser.vncPort),M(Se,c(s).browser.novncPort)}),k(le,_e)};O(ae,le=>{c(u)&&c(s)?.browser&&le(xe)})}var ge=f(se,2);{var he=le=>{var _e=cv(),Z=f(h(_e),2);let be;var z=f(Z,2);{var J=ue=>{var Se=lv();G("click",Se,w),k(ue,Se)};O(z,ue=>{c(a)==="connected"&&ue(J)})}V(()=>{be=pe(Z,1,"toolbar-btn svelte-138orkn",null,be,{"toolbar-btn-active":c(d)}),Z.disabled=c(a)!=="connected"}),G("click",Z,S),k(le,_e)};O(ge,le=>{c(s)?.browser&&le(he)})}var Fe=f(L,2),Be=h(Fe);{var Xe=le=>{var _e=dv(),Z=f(h(_e),2);jt(Z,"rows",4),G("input",Z,C),He(Z,()=>c(l),be=>b(l,be)),k(le,_e)};O(Be,le=>{c(d)&&le(Xe)})}var q=f(Be,2);{var re=le=>{var _e=uv(),Z=h(_e),be=h(Z),z=f(Z,4);V(()=>M(be,c(a)==="failed"?"Connection failed":"Disconnected")),G("click",z,y),k(le,_e)};O(q,le=>{(c(a)==="failed"||c(a)==="disconnected")&&le(re)})}var fe=f(q,2);let we;nh(fe,le=>b(i,le),()=>c(i)),V(()=>{$=pe(de,1,"conn-dot svelte-138orkn",null,$,{"conn-connecting":c(a)==="connecting","conn-on":c(a)==="connected","conn-off":c(a)==="disconnected"||c(a)==="failed"}),M(ne,c(v)),we=pe(fe,1,"vnc-canvas svelte-138orkn",null,we,{"vnc-hidden":c(a)!=="connected"})}),G("click",oe,()=>{b(u,!c(u))}),k(A,X)};O(E,A=>{c(n)?A(U):c(_)?A(T,!1):A(te,1)})}k(t,K),nt()}_t(["click","input"]);var _v=F('<button class="val-btn agent-name editable svelte-ys3ftv"> </button>'),vv=F('<button class="btn btn-outline btn-sm btn-danger">Delete</button>'),pv=F('<button class="val-btn mono editable"> </button>'),gv=F('<button class="val-btn mono editable"> </button>'),xv=F('<button class="val-btn mono editable"> </button>'),bv=F('<button class="val-btn mono editable"> </button>'),mv=F('<button class="val-btn mono editable"> </button>'),wv=F('<button class="prompt-block editable svelte-ys3ftv"> </button>'),yv=F('<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"><!></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">Timeout</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 kv(t,e){st(e,!0);let s=W("");function n(z,J){b(s,String(J),!0),e.editor.startEdit(`agent.${e.index}.${z}`,J)}function a(z){return e.editor.editingField===`agent.${e.index}.${z}`}var i=yv(),r=f(h(i),2),o=h(r),d=h(o);{var l=z=>{gt(z,{get saving(){return e.editor.editingSaving},onsave:J=>e.onsavefield("name",J),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(J){b(s,J,!0)}})},u=Ae(()=>a("name")),_=z=>{var J=_v(),ue=h(J);V(()=>M(ue,e.agent.name)),G("click",J,()=>n("name",e.agent.name)),k(z,J)};O(d,z=>{c(u)?z(l):z(_,!1)})}var p=f(d,2),v=h(p),x=f(o,2),y=h(x);{var w=z=>{var J=vv();G("click",J,function(...ue){e.ondelete?.apply(this,ue)}),k(z,J)};O(y,z=>{e.agentCount>1&&z(w)})}var S=f(r,2),C=h(S),K=f(h(C),2);{var E=z=>{gt(z,{mono:!0,get saving(){return e.editor.editingSaving},onsave:J=>e.onsavefield("model",J),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(J){b(s,J,!0)}})},U=Ae(()=>a("model")),te=z=>{var J=pv(),ue=h(J);V(()=>M(ue,e.agent.model)),G("click",J,()=>n("model",e.agent.model)),k(z,J)};O(K,z=>{c(U)?z(E):z(te,!1)})}var T=f(C,2),A=f(h(T),2);{var X=z=>{gt(z,{mono:!0,get saving(){return e.editor.editingSaving},placeholder:"none",onsave:J=>e.onsavefield("fallbackModel",J,ue=>ue.trim()||null),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(J){b(s,J,!0)}})},L=Ae(()=>a("fallbackModel")),se=z=>{var J=gv(),ue=h(J);V(()=>M(ue,e.agent.fallbackModel??"none")),G("click",J,()=>n("fallbackModel",e.agent.fallbackModel??"")),k(z,J)};O(A,z=>{c(L)?z(X):z(se,!1)})}var oe=f(T,2),de=f(h(oe),2);{var $=z=>{gt(z,{mono:!0,get saving(){return e.editor.editingSaving},onsave:J=>e.onsavefield("maxTurns",J,ue=>Number(ue)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(J){b(s,J,!0)}})},H=Ae(()=>a("maxTurns")),ne=z=>{var J=xv(),ue=h(J);V(()=>M(ue,e.agent.maxTurns)),G("click",J,()=>n("maxTurns",e.agent.maxTurns)),k(z,J)};O(de,z=>{c(H)?z($):z(ne,!1)})}var ae=f(oe,2),xe=f(h(ae),2);{var ge=z=>{gt(z,{mono:!0,get saving(){return e.editor.editingSaving},placeholder:"global",onsave:J=>e.onsavefield("processTimeoutMs",J,ue=>{const Se=ue.trim();return Se?Number(Se)*1e3:null}),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(J){b(s,J,!0)}})},he=Ae(()=>a("processTimeoutMs")),Fe=z=>{var J=bv(),ue=h(J);V(()=>M(ue,e.agent.processTimeoutMs?`${e.agent.processTimeoutMs/1e3}s`:"global")),G("click",J,()=>n("processTimeoutMs",e.agent.processTimeoutMs?String(e.agent.processTimeoutMs/1e3):"")),k(z,J)};O(xe,z=>{c(he)?z(ge):z(Fe,!1)})}var Be=f(ae,2),Xe=f(h(Be),2);{var q=z=>{gt(z,{mono:!0,get saving(){return e.editor.editingSaving},onsave:J=>e.onsavefield("channels",J,ue=>ue.split(",").map(Se=>Se.trim()).filter(Boolean)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(J){b(s,J,!0)}})},re=Ae(()=>a("channels")),fe=z=>{var J=mv(),ue=h(J);V(Se=>M(ue,Se),[()=>e.agent.channels.join(", ")||"*"]),G("click",J,()=>n("channels",e.agent.channels.join(", "))),k(z,J)};O(Xe,z=>{c(re)?z(q):z(fe,!1)})}var we=f(S,2),le=f(h(we),2);{var _e=z=>{gt(z,{multiline:!0,get saving(){return e.editor.editingSaving},onsave:J=>e.onsavefield("systemPrompt",J),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(J){b(s,J,!0)}})},Z=Ae(()=>a("systemPrompt")),be=z=>{var J=wv(),ue=h(J);V(()=>M(ue,e.agent.systemPrompt)),G("click",J,()=>n("systemPrompt",e.agent.systemPrompt)),k(z,J)};O(le,z=>{c(Z)?z(_e):z(be,!1)})}V(()=>M(v,e.agent.id)),k(t,i),nt()}_t(["click"]);var Sv=F('<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-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 Cv(t,e){st(e,!0);let s=W(Ne({name:"",model:"",maxTurns:"50",systemPrompt:"",channels:"*"}));function n(U){return U.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}async function a(){const U=n(c(s).name)||"agent",te=c(s).channels.split(",").map(X=>X.trim()).filter(Boolean),T={id:U,name:c(s).name,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:te.length>0?te:["*"]};await e.onsave(T)&&b(s,{name:"",model:"",maxTurns:"50",systemPrompt:"",channels:"*"},!0)}var i=Sv(),r=f(h(i),2),o=f(h(r),2),d=f(r,2),l=h(d),u=f(h(l),2),_=f(l,2),p=f(h(_),2),v=f(_,2),x=f(h(v),2),y=f(v,2),w=f(h(y),2),S=f(y,2),C=f(h(S),2),K=f(S,2),E=h(K);V(U=>E.disabled=U,[()=>!c(s).name.trim()||!c(s).model.trim()]),G("click",o,function(...U){e.oncancel?.apply(this,U)}),He(u,()=>c(s).name,U=>c(s).name=U),He(p,()=>c(s).model,U=>c(s).model=U),He(x,()=>c(s).maxTurns,U=>c(s).maxTurns=U),He(w,()=>c(s).channels,U=>c(s).channels=U),He(C,()=>c(s).systemPrompt,U=>c(s).systemPrompt=U),G("click",E,a),k(t,i),nt()}_t(["click"]);var Ev=F('<button class="btn btn-outline btn-sm">Add Agent</button>'),Av=F('<div class="section"><div class="section-header"><h2 class="section-title">Agents</h2> <!></div> <!> <!></div>');function Kv(t,e){st(e,!0);let s=W(!1);async function n(v,x,y,w){const S=e.config.agents.map(U=>({...U})),C=S[v];if(!C)return;const K=w?w(y):y;C[x]=K,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 Or(`Delete agent "${x.name}"?`))return;const w=e.config.agents.filter((S,C)=>C!==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=Av(),o=h(r),d=f(h(o),2);{var l=v=>{var x=Ev();G("click",x,()=>{b(s,!0)}),k(v,x)};O(d,v=>{c(s)||v(l)})}var u=f(o,2);Mt(u,19,()=>e.config.agents,v=>v.id,(v,x,y)=>{kv(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,C)=>n(c(y),w,S,C),ondelete:()=>a(c(y))})});var _=f(u,2);{var p=v=>{Cv(v,{onsave:i,oncancel:()=>{b(s,!1)}})};O(_,v=>{c(s)&&v(p)})}k(t,r),nt()}_t(["click"]);var Fv=F('<div class="row"><span class="row-label">Uptime</span> <span class="row-value mono"> </span></div>'),Tv=F('<button class="val-btn mono editable"> </button>'),Mv=F('<span class="cli-pill svelte-u0w225"><span class="dot dot-muted"></span> claude ...</span>'),Xv=F('<span class="cli-pill cli-pill-ok svelte-u0w225"><span class="dot dot-on"></span> </span>'),Lv=F('<span class="cli-pill cli-pill-err svelte-u0w225"><span class="dot dot-off"></span> claude not found</span>'),Pv=F('<div class="row"><span class="row-label">Node.js</span> <span class="row-value mono"> </span></div>'),Bv=kn('<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>'),Dv=F('<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>'),Rv=F('<button class="val-btn mono editable"> </button>'),Iv=F('<span class="dim">...</span>'),Qv=F('<button class="val-btn mono editable"> </button>'),Nv=F('<button class="val-btn mono editable"> </button>'),Uv=F('<button class="val-btn mono editable"> </button>'),Hv=F("<span><span></span> </span>"),zv=kn('<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>'),Ov=F('<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>'),Vv=F('<button class="val-btn mono editable"> </button>'),Gv=F('<span class="dim">...</span>'),qv=F('<div class="row"><span class="row-label"> </span> <span class="row-value"><!></span></div>'),Wv=F('<button class="val-btn mono editable"> </button>'),jv=F('<button class="val-btn mono editable"> </button>'),Yv=F('<button class="val-btn mono editable"> </button>'),Zv=F('<button class="val-btn mono editable"> </button>'),Jv=F('<div class="row"><span class="row-label">Start / End</span> <span class="row-value"><!> <span class="dim">&ndash;</span> <!></span></div>'),$v=F("<span><span></span> </span>"),ep=F('<button class="val-btn mono editable"> </button>'),tp=F('<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),sp=F('<button class="val-btn mono editable"> </button>'),np=F('<button class="val-btn mono editable"> </button>'),ap=F('<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 ip(t,e){st(e,!0);let s=W("");function n(ee,j){b(s,String(j),!0),e.editor.startEdit(ee,j)}let a=W(null),i=W(""),r=W(!1);function o(ee){b(a,ee,!0),b(i,"")}function d(){b(a,null),b(r,!1)}async function l(){if(!(!c(a)||!c(i).trim())){b(r,!0);try{if(c(a)==="slackBotToken"||c(a)==="slackAppToken"){const ee=c(a)==="slackBotToken"?{botToken:c(i).trim()}:{appToken:c(i).trim()};await ke("/api/secrets/slack",{method:"PUT",body:ee}),Me("Slack token saved","success")}else await ke("/api/secrets/anthropic",{method:"PUT",body:{apiKey:c(i).trim()}}),Me("API key saved (effective next session)","success");b(a,null),b(i,""),e.onsecretsupdate()}catch(ee){Me(ee.message,"error")}finally{b(r,!1)}}}function u(ee){ee.key==="Escape"?d():ee.key==="Enter"&&(ee.preventDefault(),l())}var _=ap(),p=me(_),v=h(p),x=f(h(v),2),y=h(x);{var w=ee=>{var j=Fv(),ce=f(h(j),2),Re=h(ce);V(vt=>M(Re,vt),[()=>Ph(e.status.uptime)]),k(ee,j)};O(y,ee=>{e.status&&ee(w)})}var S=f(y,2),C=f(h(S),2),K=h(C);{var E=ee=>{gt(ee,{mono:!0,get saving(){return e.editor.editingSaving},onsave:j=>e.editor.saveField("timezone",j),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(j){b(s,j,!0)}})},U=ee=>{var j=Tv(),ce=h(j);V(()=>M(ce,e.config.timezone)),G("click",j,()=>n("timezone",e.config.timezone)),k(ee,j)};O(K,ee=>{e.editor.editingField==="timezone"?ee(E):ee(U,!1)})}var te=f(S,2),T=f(h(te),2),A=h(T),X=f(te,2),L=f(h(X),2),se=h(L);{var oe=ee=>{var j=Mv();k(ee,j)},de=ee=>{var j=yt(),ce=me(j);{var Re=St=>{var ns=Xv(),ms=f(h(ns));V(()=>M(ms,` claude ${e.doctor.claude.version??""}`)),k(St,ns)},vt=St=>{var ns=Lv();k(St,ns)};O(ce,St=>{e.doctor.claude.available?St(Re):St(vt,!1)})}k(ee,j)};O(se,ee=>{e.doctorLoading?ee(oe):e.doctor&&ee(de,1)})}var $=f(X,2);{var H=ee=>{var j=Pv(),ce=f(h(j),2),Re=h(ce);V(()=>M(Re,e.doctor.node)),k(ee,j)};O($,ee=>{e.doctor&&ee(H)})}var ne=f($,2),ae=f(h(ne),2),xe=h(ae);{var ge=ee=>{var j=Dv(),ce=h(j),Re=f(ce,2),vt=h(Re);{var St=Zt=>{var Gs=Ss("...");k(Zt,Gs)},ns=Zt=>{var Gs=Bv();k(Zt,Gs)};O(vt,Zt=>{c(r)?Zt(St):Zt(ns,!1)})}var ms=f(Re,2);V(()=>Re.disabled=c(r)||!c(i)),G("keydown",ce,u),He(ce,()=>c(i),Zt=>b(i,Zt)),G("click",Re,l),G("click",ms,d),k(ee,j)},he=ee=>{var j=Rv(),ce=h(j);V(()=>M(ce,e.secrets.anthropic.set?e.secrets.anthropic.hint:"not set")),G("click",j,()=>o("apiKey")),k(ee,j)},Fe=ee=>{var j=Iv();k(ee,j)};O(xe,ee=>{c(a)==="apiKey"?ee(ge):e.secrets?ee(he,1):ee(Fe,!1)})}var Be=f(v,2),Xe=f(h(Be),2),q=h(Xe),re=f(h(q),2),fe=h(re);{var we=ee=>{gt(ee,{mono:!0,get saving(){return e.editor.editingSaving},onsave:j=>e.editor.saveField("sessions.maxConcurrent",j,ce=>Number(ce)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(j){b(s,j,!0)}})},le=ee=>{var j=Qv(),ce=h(j);V(()=>M(ce,e.config.sessions.maxConcurrent)),G("click",j,()=>n("sessions.maxConcurrent",e.config.sessions.maxConcurrent)),k(ee,j)};O(fe,ee=>{e.editor.editingField==="sessions.maxConcurrent"?ee(we):ee(le,!1)})}var _e=f(q,2),Z=f(h(_e),2),be=h(Z);{var z=ee=>{gt(ee,{mono:!0,get saving(){return e.editor.editingSaving},onsave:j=>e.editor.saveField("sessions.ttlHours",j,ce=>Number(ce)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(j){b(s,j,!0)}})},J=ee=>{var j=Nv(),ce=h(j);V(()=>M(ce,`${e.config.sessions.ttlHours??""}h`)),G("click",j,()=>n("sessions.ttlHours",e.config.sessions.ttlHours)),k(ee,j)};O(be,ee=>{e.editor.editingField==="sessions.ttlHours"?ee(z):ee(J,!1)})}var ue=f(_e,2),Se=f(h(ue),2),Ie=h(Se);{var et=ee=>{gt(ee,{mono:!0,get saving(){return e.editor.editingSaving},onsave:j=>e.editor.saveField("sessions.processTimeoutMs",j,ce=>Math.round(Number(ce)*1e3)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(j){b(s,j,!0)}})},je=ee=>{var j=Uv(),ce=h(j);V(Re=>M(ce,`${Re??""}s`),[()=>(e.config.sessions.processTimeoutMs/1e3).toFixed(0)]),G("click",j,()=>n("sessions.processTimeoutMs",(e.config.sessions.processTimeoutMs/1e3).toFixed(0))),k(ee,j)};O(Ie,ee=>{e.editor.editingField==="sessions.processTimeoutMs"?ee(et):ee(je,!1)})}var bt=f(Be,2),tt=h(bt),Ye=f(h(tt),2);{var mt=ee=>{var j=Hv();let ce;var Re=h(j);let vt;var St=f(Re);V(()=>{ce=pe(j,1,"svc-chip",null,ce,{"svc-chip-ok":e.status.slack.connected,"svc-chip-err":!e.status.slack.connected}),vt=pe(Re,1,"dot",null,vt,{"dot-on":e.status.slack.connected,"dot-off":!e.status.slack.connected}),M(St,` ${e.status.slack.connected?"connected":"disconnected"}`)}),k(ee,j)};O(Ye,ee=>{e.status&&ee(mt)})}var ye=f(tt,2);{const ee=(j,ce=xa,Re=xa,vt=xa,St=xa)=>{var ns=qv(),ms=h(ns),Zt=h(ms),Gs=f(ms,2),Ft=h(Gs);{var Et=ws=>{var Ds=Ov(),as=h(Ds),cs=f(as,2),Ii=h(cs);{var yd=rn=>{var Qi=Ss("...");k(rn,Qi)},kd=rn=>{var Qi=zv();k(rn,Qi)};O(Ii,rn=>{c(r)?rn(yd):rn(kd,!1)})}var Sd=f(cs,2);V(()=>{jt(as,"placeholder",vt()),cs.disabled=c(r)||!c(i)}),G("keydown",as,u),He(as,()=>c(i),rn=>b(i,rn)),G("click",cs,l),G("click",Sd,d),k(ws,Ds)},Cn=ws=>{var Ds=Vv(),as=h(Ds);V(()=>M(as,St().set?St().hint:"not set")),G("click",Ds,()=>o(ce())),k(ws,Ds)},Ri=ws=>{var Ds=Gv();k(ws,Ds)};O(Ft,ws=>{c(a)===ce()?ws(Et):St()?ws(Cn,1):ws(Ri,!1)})}V(()=>M(Zt,Re())),k(j,ns)};var Oe=h(ye);ee(Oe,()=>"slackBotToken",()=>"Bot Token",()=>"xoxb-...",()=>e.secrets?.slack.botToken);var lt=f(Oe,2);ee(lt,()=>"slackAppToken",()=>"App Token",()=>"xapp-...",()=>e.secrets?.slack.appToken);var ls=f(lt,2),ss=f(h(ls),2),gs=h(ss);Xn(gs,{get active(){return e.config.slack.requireMention},onToggle:()=>e.editor.toggleField("slack.requireMention",e.config.slack.requireMention)});var Ts=f(ls,2),Ct=f(h(Ts),2),xs=h(Ct);{var Hs=j=>{gt(j,{mono:!0,get saving(){return e.editor.editingSaving},onsave:ce=>e.editor.saveField("slack.coalesce.debounceMs",ce,Re=>Number(Re)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(ce){b(s,ce,!0)}})},Ms=j=>{var ce=Wv(),Re=h(ce);V(()=>M(Re,`${e.config.slack.coalesce.debounceMs??""}ms`)),G("click",ce,()=>n("slack.coalesce.debounceMs",e.config.slack.coalesce.debounceMs)),k(j,ce)};O(xs,j=>{e.editor.editingField==="slack.coalesce.debounceMs"?j(Hs):j(Ms,!1)})}var Xs=f(Ts,2),Ls=f(h(Xs),2),bs=h(Ls);Xn(bs,{get active(){return e.config.slack.coalesce.bypassDms},onToggle:()=>e.editor.toggleField("slack.coalesce.bypassDms",e.config.slack.coalesce.bypassDms)});var zs=f(Xs,2),Os=f(h(zs),2),an=h(Os);{var Ve=j=>{gt(j,{mono:!0,get saving(){return e.editor.editingSaving},onsave:ce=>e.editor.saveField("slack.channels",ce,Re=>Re.split(",").map(vt=>vt.trim()).filter(Boolean)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(ce){b(s,ce,!0)}})},Ze=j=>{var ce=jv(),Re=h(ce);V(vt=>M(Re,vt),[()=>e.config.slack.channels.join(", ")||"*"]),G("click",ce,()=>n("slack.channels",e.config.slack.channels.join(", "))),k(j,ce)};O(an,j=>{e.editor.editingField==="slack.channels"?j(Ve):j(Ze,!1)})}var ct=f(zs,2),dt=f(h(ct),2),Kt=h(dt);Xn(Kt,{get active(){return e.config.slack.quietHours.enabled},onToggle:()=>e.editor.toggleField("slack.quietHours.enabled",e.config.slack.quietHours.enabled)});var ut=f(ct,2);{var Je=j=>{var ce=Jv(),Re=f(h(ce),2),vt=h(Re);{var St=Ft=>{gt(Ft,{mono:!0,get saving(){return e.editor.editingSaving},placeholder:"HH:MM",onsave:Et=>e.editor.saveField("slack.quietHours.start",Et),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(Et){b(s,Et,!0)}})},ns=Ft=>{var Et=Yv(),Cn=h(Et);V(()=>M(Cn,e.config.slack.quietHours.start)),G("click",Et,()=>n("slack.quietHours.start",e.config.slack.quietHours.start)),k(Ft,Et)};O(vt,Ft=>{e.editor.editingField==="slack.quietHours.start"?Ft(St):Ft(ns,!1)})}var ms=f(vt,4);{var Zt=Ft=>{gt(Ft,{mono:!0,get saving(){return e.editor.editingSaving},placeholder:"HH:MM",onsave:Et=>e.editor.saveField("slack.quietHours.end",Et),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(Et){b(s,Et,!0)}})},Gs=Ft=>{var Et=Zv(),Cn=h(Et);V(()=>M(Cn,e.config.slack.quietHours.end)),G("click",Et,()=>n("slack.quietHours.end",e.config.slack.quietHours.end)),k(Ft,Et)};O(ms,Ft=>{e.editor.editingField==="slack.quietHours.end"?Ft(Zt):Ft(Gs,!1)})}k(j,ce)};O(ut,j=>{e.config.slack.quietHours.enabled&&j(Je)})}}var ht=f(bt,2),Ge=h(ht),Y=f(h(Ge),2);{var ie=ee=>{var j=$v();let ce;var Re=h(j);let vt;var St=f(Re);V(()=>{ce=pe(j,1,"svc-chip",null,ce,{"svc-chip-ok":e.status.browser.connected,"svc-chip-err":!e.status.browser.connected}),vt=pe(Re,1,"dot",null,vt,{"dot-on":e.status.browser.connected,"dot-off":!e.status.browser.connected}),M(St,` ${e.status.browser.connected?"connected":"unreachable"}`)}),k(ee,j)};O(Y,ee=>{e.config.browser.enabled&&e.status&&ee(ie)})}var ve=f(Ge,2),Ke=h(ve),Qe=f(h(Ke),2),qe=h(Qe);Xn(qe,{get active(){return e.config.browser.enabled},onToggle:()=>e.editor.toggleField("browser.enabled",e.config.browser.enabled)});var ft=f(Ke,2);{var wt=ee=>{var j=tp(),ce=me(j),Re=f(h(ce),2),vt=h(Re);{var St=as=>{gt(as,{mono:!0,get saving(){return e.editor.editingSaving},onsave:cs=>e.editor.saveField("browser.novncHost",cs),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(cs){b(s,cs,!0)}})},ns=as=>{var cs=ep(),Ii=h(cs);V(()=>M(Ii,e.config.browser.novncHost)),G("click",cs,()=>n("browser.novncHost",e.config.browser.novncHost)),k(as,cs)};O(vt,as=>{e.editor.editingField==="browser.novncHost"?as(St):as(ns,!1)})}var ms=f(ce,2),Zt=f(h(ms),2),Gs=h(Zt),Ft=f(ms,2),Et=f(h(Ft),2),Cn=h(Et),Ri=f(Ft,2),ws=f(h(Ri),2),Ds=h(ws);V(()=>{M(Gs,e.config.browser.mode),M(Cn,e.config.browser.vncPort),M(Ds,e.config.browser.novncPort)}),k(ee,j)};O(ft,ee=>{e.config.browser.enabled&&ee(wt)})}var Pt=f(ht,2),Bt=f(h(Pt),2),Nt=h(Bt),Ps=f(h(Nt),2),Te=h(Ps);{var $e=ee=>{gt(ee,{mono:!0,get saving(){return e.editor.editingSaving},onsave:j=>e.editor.saveField("birds.maxAttempts",j,ce=>Number(ce)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(j){b(s,j,!0)}})},at=ee=>{var j=sp(),ce=h(j);V(()=>M(ce,e.config.birds.maxAttempts)),G("click",j,()=>n("birds.maxAttempts",e.config.birds.maxAttempts)),k(ee,j)};O(Te,ee=>{e.editor.editingField==="birds.maxAttempts"?ee($e):ee(at,!1)})}var Ut=f(Pt,2),qt=f(h(Ut),2),Sn=h(qt),Vs=f(h(Sn),2),Bs=h(Vs);{var ca=ee=>{gt(ee,{mono:!0,get saving(){return e.editor.editingSaving},onsave:j=>e.editor.saveField("database.retentionDays",j,ce=>Number(ce)),get oncancel(){return e.editor.cancelEdit},get value(){return c(s)},set value(j){b(s,j,!0)}})},Di=ee=>{var j=np(),ce=h(j);V(()=>M(ce,`${e.config.database.retentionDays??""} days`)),G("click",j,()=>n("database.retentionDays",e.config.database.retentionDays)),k(ee,j)};O(Bs,ee=>{e.editor.editingField==="database.retentionDays"?ee(ca):ee(Di,!1)})}var wd=f(p,2);Kv(wd,{get config(){return e.config},get editor(){return e.editor}}),V(()=>M(A,e.config.web.port)),k(t,_),nt()}_t(["click","keydown"]);var rp=F('<span class="queue-summary mono svelte-17vayue"> </span>'),op=F('<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>'),lp=F('<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 cp(t,e){st(e,!0);let s=W(null);xt(()=>{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 o(){b(n,!0);try{const A=await ke("/api/jobs/retry-all",{method:"POST"});Me(`${A.count} failed job(s) queued for retry`,"success"),await r()}catch(A){Me(`Failed: ${A.message}`,"error")}finally{b(n,!1)}}async function d(){b(a,!0);try{const A=await ke("/api/jobs/clear?status=completed",{method:"DELETE"});Me(`${A.count} completed job(s) cleared`,"success"),await r()}catch(A){Me(`Failed: ${A.message}`,"error")}finally{b(a,!1)}}async function l(){b(i,!0);try{const A=await ke("/api/jobs/clear?status=failed",{method:"DELETE"});Me(`${A.count} failed job(s) cleared`,"success"),await r()}catch(A){Me(`Failed: ${A.message}`,"error")}finally{b(i,!1)}}var u=lp(),_=h(u),p=f(h(_),2);{var v=A=>{var X=rp(),L=h(X);V(()=>M(L,`${c(s).total??""} total`)),k(A,X)};O(p,A=>{c(s)&&A(v)})}var x=f(_,2),y=h(x);{var w=A=>{var X=op(),L=h(X),se=h(L),oe=h(se),de=f(L,2),$=h(de),H=h($),ne=f(de,2),ae=h(ne),xe=h(ae),ge=f(ne,2),he=h(ge),Fe=h(he);V(()=>{M(oe,c(s).pending),M(H,c(s).running),M(xe,c(s).completed),M(Fe,c(s).failed)}),k(A,X)};O(y,A=>{c(s)&&A(w)})}var S=f(y,2),C=h(S),K=h(C),E=f(C,2),U=h(E),te=f(E,2),T=h(te);V(()=>{C.disabled=c(n)||(c(s)?.failed??0)===0,M(K,c(n)?"Retrying...":"Retry Failed"),E.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(T,c(i)?"Clearing...":"Clear Failed")}),G("click",C,o),G("click",E,d),G("click",te,l),k(t,u),nt()}_t(["click"]);var dp=F('<div class="row"><span class="dim">No system birds registered</span></div>'),up=F('<span class="bird-last-run svelte-12folcn"> <!></span>'),hp=F('<button class="btn btn-outline btn-sm">Flights</button>'),fp=F('<div class="flight-empty svelte-12folcn"><span class="dim">No flights recorded</span></div>'),_p=F('<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>'),vp=F('<div class="flight-list svelte-12folcn"><!></div>'),pp=F('<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>'),gp=F('<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 xp(t,e){st(e,!0);let s=W(Ne({}));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=gp(),r=h(i),o=f(h(r),2),d=h(o),l=f(r,2),u=h(l);{var _=v=>{var x=dp();k(v,x)},p=v=>{var x=yt(),y=me(x);Mt(y,19,()=>e.birds,w=>w.uid,(w,S,C)=>{var K=pp();let E;var U=h(K),te=h(U),T=h(te),A=h(T),X=f(T,2),L=h(X),se=f(te,2),oe=h(se);{var de=ge=>{var he=up(),Fe=h(he),Be=f(Fe);{var Xe=q=>{xn(q,{get status(){return c(S).last_status}})};O(Be,q=>{c(S).last_status&&q(Xe)})}V(q=>M(Fe,`${q??""} `),[()=>fs(c(S).last_run)]),k(ge,he)};O(oe,ge=>{c(S).last_run&&ge(de)})}var $=f(oe,2);{var H=ge=>{var he=hp();G("click",he,()=>n(c(S).uid)),k(ge,he)};O($,ge=>{c(s)[c(S).uid]||ge(H)})}var ne=f($,2),ae=f(U,2);{var xe=ge=>{var he=vp(),Fe=h(he);{var Be=q=>{var re=fp();k(q,re)},Xe=q=>{var re=yt(),fe=me(re);Mt(fe,17,()=>c(s)[c(S).uid],we=>we.uid,(we,le)=>{var _e=_p(),Z=h(_e),be=h(Z),z=f(Z,2);xn(z,{get status(){return c(le).status}});var J=f(z,2),ue=h(J),Se=f(J,2),Ie=h(Se);V((et,je,bt)=>{M(be,et),M(ue,je),M(Ie,bt)},[()=>Tt(c(le).uid),()=>pi(c(le).started_at,c(le).finished_at),()=>fs(c(le).started_at)]),k(we,_e)}),k(q,re)};O(Fe,q=>{c(s)[c(S).uid].length===0?q(Be):q(Xe,!1)})}k(ge,he)};O(ae,ge=>{c(s)[c(S).uid]!=null&&ge(xe)})}V(()=>{E=pe(K,1,"bird-entry svelte-12folcn",null,E,{"bird-entry-border":c(C)<e.birds.length-1}),M(A,c(S).name),M(L,c(S).schedule)}),G("click",ne,()=>a(c(S).uid,c(S).name)),k(w,K)}),k(v,x)};O(u,v=>{e.birds.length===0?v(_):v(p,!1)})}V(()=>M(d,e.birds.length)),k(t,i),nt()}_t(["click"]);var bp=F('<span class="error-count svelte-ht9bxs"> </span>'),mp=F('<div class="row"><span class="dim">No errors recorded</span></div>'),wp=F('<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>'),yp=F('<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 kp(t,e){st(e,!0);var s=yp(),n=me(s),a=h(n);cp(a,{get initialStats(){return e.jobStats}});var i=f(a,2),r=h(i),o=f(h(r),2);{var d=x=>{var y=bp(),w=h(y);V(()=>M(w,e.recentErrors.length)),k(x,y)};O(o,x=>{e.recentErrors.length>0&&x(d)})}var l=f(r,2),u=h(l);{var _=x=>{var y=mp();k(x,y)},p=x=>{var y=yt(),w=me(y);Mt(w,17,()=>e.recentErrors,S=>S.id,(S,C)=>{var K=wp(),E=h(K),U=h(E),te=h(U),T=f(U,2),A=h(T),X=f(E,2),L=h(X);V(se=>{M(te,c(C).source),M(A,se),M(L,c(C).message)},[()=>fs(c(C).created_at)]),k(S,K)}),k(x,y)};O(u,x=>{e.recentErrors.length===0?x(_):x(p,!1)})}var v=f(n,2);xp(v,{get birds(){return e.systemBirds}}),k(t,s),nt()}var Sp=F('<div class="loading">Loading...</div>'),Cp=F('<div class="tabs svelte-1ozf5k3"><button>Config</button> <button>Database</button></div> <!> <!>',1);function Ep(t,e){st(e,!0);let s=W(null),n=W(null),a=W(null),i=W(!0),r=W(Ne([])),o=W(null),d=W(Ne([])),l=W(!0),u=W("config"),_=W(null),p=W(!1);xt(()=>{const X=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,se,oe,de,$])=>{X.signal.aborted||(b(s,L,!0),b(r,se.items,!0),b(o,oe,!0),b(d,de.items.filter(H=>H.name.startsWith("__bb_")),!0),b(n,$,!0))}).finally(()=>{X.signal.aborted||b(l,!1)}),()=>X.abort()}),xt(()=>{const X=new AbortController;return ke("/api/doctor").then(L=>{X.signal.aborted||b(a,L,!0)}).finally(()=>{X.signal.aborted||b(i,!1)}),()=>X.abort()}),xt(()=>Mi(X=>{X.resource==="config"&&ke("/api/config").then(L=>{b(s,L,!0)}).catch(()=>{}),X.resource==="secrets"&&v()}));function v(){ke("/api/secrets").then(X=>{b(n,X,!0)}).catch(()=>{})}function x(X,L){const se=X.split(".");let oe={};const de=oe;for(let $=0;$<se.length-1;$++){const H={};oe[se[$]]=H,oe=H}return oe[se[se.length-1]]=L,de}async function y(X){try{const L=await ke("/api/config",{method:"PATCH",body:X});return b(s,L,!0),Me("Config saved","success"),!0}catch(L){return Me(`Failed: ${L.message}`,"error"),!1}}function w(X,L){b(_,X,!0),b(p,!1)}function S(){b(_,null),b(p,!1)}async function C(X,L,se){b(p,!0);const oe=se?se(L):L;await y(x(X,oe))?S():b(p,!1)}async function K(X,L){await y(x(X,!L))}const E=Ae(()=>({editingField:c(_),editingSaving:c(p),startEdit:w,cancelEdit:S,saveField:C,toggleField:K,saveConfigPatch:y}));var U=yt(),te=me(U);{var T=X=>{var L=Sp();k(X,L)},A=X=>{var L=Cp(),se=me(L),oe=h(se);let de;var $=f(oe,2);let H;var ne=f(se,2);{var ae=he=>{ip(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(E)},get secrets(){return c(n)},onsecretsupdate:v})};O(ne,he=>{c(u)==="config"&&he(ae)})}var xe=f(ne,2);{var ge=he=>{kp(he,{get jobStats(){return c(o)},get systemBirds(){return c(d)},get recentErrors(){return c(r)}})};O(xe,he=>{c(u)==="database"&&he(ge)})}V(()=>{de=pe(oe,1,"tab svelte-1ozf5k3",null,de,{"tab-active":c(u)==="config"}),H=pe($,1,"tab svelte-1ozf5k3",null,H,{"tab-active":c(u)==="database"})}),G("click",oe,()=>{b(u,"config")}),G("click",$,()=>{b(u,"database")}),k(X,L)};O(te,X=>{c(l)?X(T):c(s)&&X(A,1)})}k(t,U),nt()}_t(["click"]);var Ap=F('<div class="card-sub svelte-1tf674w"> </div>'),Kp=F('<div><div class="card-label svelte-1tf674w"> </div> <div class="card-value svelte-1tf674w"> </div> <!></div>');function dr(t,e){var s=Kp();let n;var a=h(s),i=h(a),r=f(a,2),o=h(r),d=f(r,2);{var l=u=>{var _=Ap(),p=h(_);V(()=>M(p,e.sub)),k(u,_)};O(d,u=>{e.sub&&u(l)})}V(()=>{n=pe(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(o,e.value)}),k(t,s)}var Fp=F('<div class="error-state svelte-1lyclyh"><p> </p> <button class="btn btn-outline btn-sm">Back to Sessions</button></div>'),Tp=F('<div class="loading">Loading...</div>'),Mp=F('<div class="filter-spacer svelte-1lyclyh"></div> <span class="last-updated svelte-1lyclyh"> </span>',1),Xp=F('<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>'),Lp=F('<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 Pp(t,e){st(e,!0);const s=Ti().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(Ne(wn())),i=W(null),r=W(null),o=W("");const d=s?Vr({endpoint:`/api/sessions/${s}`,columns:n,defaultSort:"created_at",invalidateOn:"sessions",transformResponse:y=>y.messages,onResponse:y=>{b(a,wn(),!0),b(i,y.session,!0),b(r,y.stats,!0)}}):null;d||b(o,"Invalid session ID");function l(){window.location.hash="#/sessions"}var u=yt(),_=me(u);{var p=y=>{var w=Fp(),S=h(w),C=h(S),K=f(S,2);V(()=>M(C,c(o))),G("click",K,l),k(y,w)},v=y=>{var w=Tp();k(y,w)},x=y=>{var w=Lp(),S=me(w),C=h(S),K=f(C,2),E=h(K),U=f(K,2),te=h(U),T=h(te),A=f(te,3),X=f(A,2),L=f(S,2),se=h(L);dr(se,{label:"Messages",get value(){return c(i).message_count}});var oe=f(se,2);{let H=Ae(()=>c(r).totalTokensIn.toLocaleString());dr(oe,{label:"Tokens In",get value(){return c(H)}})}var de=f(oe,2);{let H=Ae(()=>c(r).totalTokensOut.toLocaleString());dr(de,{label:"Tokens Out",get value(){return c(H)}})}var $=f(L,2);{const H=ae=>{var xe=Mp(),ge=f(me(xe),2),he=h(ge);V(()=>M(he,`Updated ${c(a)??""}`)),k(ae,xe)};let ne=Ae(()=>d.items.length===0);dn($,{get columns(){return n},get isEmpty(){return c(ne)},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:H,children:(ae,xe)=>{var ge=yt(),he=me(ge);Mt(he,17,()=>d.items,Fe=>Fe.id,(Fe,Be)=>{var Xe=Xp(),q=h(Xe),re=h(q);{let Ie=Ae(()=>c(Be).direction==="in"?"info":"success");xn(re,{get status(){return c(Ie)}})}var fe=f(q),we=h(fe),le=f(fe),_e=h(le),Z=f(le),be=h(Z),z=f(Z),J=h(z),ue=f(z),Se=h(ue);V(Ie=>{M(we,c(Be).user_id),M(_e,c(Be).content??"-"),M(be,c(Be).tokens_in??"-"),M(J,c(Be).tokens_out??"-"),M(Se,Ie)},[()=>fs(c(Be).created_at)]),k(Fe,Xe)}),k(ae,ge)},$$slots:{toolbar:!0,default:!0}})}V((H,ne)=>{M(E,`Session ${H??""}`),M(T,c(i).channel_id),M(A,` ${c(i).agent_id??""} `),M(X,` ${ne??""}`)},[()=>Tt(c(i).uid),()=>fs(c(i).last_active)]),G("click",C,l),k(y,w)};O(_,y=>{c(o)?y(p):d?.loading?y(v,1):c(i)&&c(r)&&d&&y(x,2)})}k(t,u),nt()}_t(["click"]);var Bp=F("<div></div>"),Dp=F('<div><span class="step-number svelte-dm5b3b"></span></div> <!>',1),Rp=F('<div class="step-indicator svelte-dm5b3b"></div>'),Ip=F(`<span class="form-hint svelte-dm5b3b">Already configured. Leave blank to keep current key, or enter a new one to replace
7
7
  it.</span>`),Qp=F('<span class="form-hint svelte-dm5b3b">API key from platform.claude.com/settings/keys</span>'),Np=F('<div class="login-error svelte-dm5b3b"> </div>'),Up=F('<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">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" autocomplete="off"/> <!></label> <!> <button type="submit" class="btn btn-primary onboarding-submit svelte-dm5b3b"> </button></form>',1),Hp=F('<a target="_blank" rel="noopener" class="onboarding-link svelte-dm5b3b">Create a Slack app from the manifest</a>. You can skip this and add Slack later from Settings.',1),zp=F('<div class="login-error svelte-dm5b3b"> </div>'),Op=F(`<p class="onboarding-desc svelte-dm5b3b"><!></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
8
- the token</span></label> <!> <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">Skip</button> <button type="submit" class="btn btn-primary"> </button></div></div></form>`,1),Vp=F('<div class="probe-result probe-ok svelte-dm5b3b">Connected</div>'),Gp=F('<div class="probe-result probe-fail svelte-dm5b3b">Not reachable. Make sure the VM container is running.</div>'),qp=F('<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),Wp=F('<div class="login-error svelte-dm5b3b"> </div>'),jp=F('<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),Yp=F('<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>',1),Zp=F('<div class="done-tip svelte-dm5b3b"><span class="done-tip-label svelte-dm5b3b">Create birds</span> <span class="done-tip-detail svelte-dm5b3b">Schedule tasks from the Birds page or the CLI</span></div> <div class="done-tip svelte-dm5b3b"><span class="done-tip-label svelte-dm5b3b">Add Slack later</span> <span class="done-tip-detail svelte-dm5b3b">Go to Settings to connect Slack whenever you are ready</span></div>',1),Jp=F('<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> <button type="button" class="btn btn-primary onboarding-submit svelte-dm5b3b">Go to Dashboard</button>',1),$p=F('<div class="login-error svelte-dm5b3b"> </div>'),eg=F('<!> <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),tg=F('<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 sg(t,e){st(e,!0);const s=["Agent","Slack","Browser"],n="https://api.slack.com/apps?new_app=1&manifest_json=%7B%22display_information%22%3A%7B%22name%22%3A%22BrowserBird%22%2C%22description%22%3A%22A%20self-hosted%20AI%20assistant%20in%20Slack%2C%20with%20a%20real%20browser%20and%20a%20scheduler.%22%2C%22background_color%22%3A%22%231a1a2e%22%7D%2C%22features%22%3A%7B%22assistant_view%22%3A%7B%22assistant_description%22%3A%22A%20self-hosted%20AI%20assistant%20in%20Slack%2C%20with%20a%20real%20browser%20and%20a%20scheduler.%22%7D%2C%22app_home%22%3A%7B%22home_tab_enabled%22%3Atrue%2C%22messages_tab_enabled%22%3Atrue%2C%22messages_tab_read_only_enabled%22%3Afalse%7D%2C%22bot_user%22%3A%7B%22display_name%22%3A%22BrowserBird%22%2C%22always_online%22%3Atrue%7D%2C%22slash_commands%22%3A%5B%7B%22command%22%3A%22%2Fbird%22%2C%22description%22%3A%22Manage%20BrowserBird%20birds%22%2C%22usage_hint%22%3A%22list%20%7C%20fly%20%7C%20stop%20%7C%20logs%20%7C%20enable%20%7C%20disable%20%7C%20create%20%7C%20status%22%2C%22should_escape%22%3Afalse%7D%5D%7D%2C%22oauth_config%22%3A%7B%22scopes%22%3A%7B%22bot%22%3A%5B%22app_mentions%3Aread%22%2C%22assistant%3Awrite%22%2C%22channels%3Ahistory%22%2C%22channels%3Aread%22%2C%22chat%3Awrite%22%2C%22files%3Aread%22%2C%22files%3Awrite%22%2C%22groups%3Ahistory%22%2C%22groups%3Aread%22%2C%22im%3Ahistory%22%2C%22im%3Aread%22%2C%22im%3Awrite%22%2C%22mpim%3Ahistory%22%2C%22mpim%3Aread%22%2C%22reactions%3Aread%22%2C%22reactions%3Awrite%22%2C%22users%3Aread%22%2C%22commands%22%5D%7D%7D%2C%22settings%22%3A%7B%22event_subscriptions%22%3A%7B%22bot_events%22%3A%5B%22app_mention%22%2C%22assistant_thread_context_changed%22%2C%22assistant_thread_started%22%2C%22message.channels%22%2C%22message.groups%22%2C%22message.im%22%2C%22message.mpim%22%5D%7D%2C%22interactivity%22%3A%7B%22is_enabled%22%3Atrue%7D%2C%22org_deploy_enabled%22%3Afalse%2C%22socket_mode_enabled%22%3Atrue%2C%22token_rotation_enabled%22%3Afalse%7D%7D";let a=W(0),i=W(!1),r=W(""),o=Ne({botToken:"",appToken:"",team:"",botUser:""}),d=Ne({name:"BrowserBird",model:"sonnet",systemPrompt:"You are a helpful AI assistant. Be concise and direct.",maxTurns:50,channels:["*"],apiKey:""}),l=Ne({enabled:!1,novncHost:"localhost",novncPort:6080}),u=W("idle"),_=W(null),p=W(""),v=W(!1);xt(()=>{dh().then(q=>{b(_,q,!0),d.name=q.agent.name,d.model=q.agent.model,d.systemPrompt=q.agent.systemPrompt,d.maxTurns=q.agent.maxTurns,d.channels=q.agent.channels,l.enabled=q.browser.enabled,l.novncHost=q.browser.novncHost,l.novncPort=q.browser.novncPort,q.secrets.anthropic.set&&b(p,q.secrets.anthropic.hint,!0),q.secrets.slack.botToken.set&&q.secrets.slack.appToken.set&&b(v,!0)}).catch(()=>{})});async function x(q){if(q.preventDefault(),!(!o.botToken.trim()||!o.appToken.trim())){b(i,!0),b(r,"");try{const re=await uh(o.botToken.trim(),o.appToken.trim());o.team=re.team,o.botUser=re.botUser,b(a,2)}catch(re){b(r,re.message,!0)}finally{b(i,!1)}}}async function y(q){if(q.preventDefault(),!(!d.name.trim()||!d.model.trim())){if(!d.apiKey.trim()&&!c(p)){b(r,"API key is required");return}b(i,!0),b(r,"");try{await hh({name:d.name.trim(),model:d.model.trim(),systemPrompt:d.systemPrompt.trim(),maxTurns:d.maxTurns,channels:d.channels}),d.apiKey.trim()&&await fh({apiKey:d.apiKey.trim()}),b(a,1)}catch(re){b(r,re.message,!0)}finally{b(i,!1)}}}function w(){b(a,2)}async function S(q){q.preventDefault(),b(i,!0),b(r,"");try{await _h({enabled:l.enabled,novncHost:l.enabled?l.novncHost.trim():void 0}),await E()}catch(re){b(r,re.message,!0)}finally{b(i,!1)}}async function C(){b(i,!0),b(r,"");try{await E()}catch(q){b(r,q.message,!0)}finally{b(i,!1)}}let K=W(!1);async function E(){await ph(),b(K,!0),b(a,3)}async function U(){b(i,!0),b(r,"");try{await E()}catch(q){b(r,q.message,!0)}finally{b(i,!1)}}async function te(){const q=l.novncHost.trim();if(q){b(u,"checking");try{const re=await vh(q,l.novncPort);b(u,re.reachable?"reachable":"unreachable",!0)}catch{b(u,"unreachable")}}}function T(){b(r,""),c(a)===3&&!c(K)?b(a,2):br(a,-1)}var A=tg(),X=h(A),L=f(h(X),2);{var se=q=>{var re=Rp();Mt(re,21,()=>s,Pc,(fe,we,le)=>{var _e=Dp(),Z=me(_e);let be;var z=h(Z);z.textContent=le+1;var J=f(Z,2);{var ue=Se=>{var Ie=Bp();let et;V(()=>et=pe(Ie,1,"step-line svelte-dm5b3b",null,et,{completed:le<c(a)})),k(Se,Ie)};O(J,Se=>{le<s.length-1&&Se(ue)})}V(()=>be=pe(Z,1,"step-dot svelte-dm5b3b",null,be,{active:le===c(a),completed:le<c(a)})),k(fe,_e)}),k(q,re)};O(L,q=>{c(a)<s.length&&q(se)})}var oe=f(L,2),de=h(oe);{var $=q=>{var re=Ss("Configure Agent");k(q,re)},H=q=>{var re=Ss("Connect Slack");k(q,re)},ne=q=>{var re=Ss("Browser");k(q,re)},ae=q=>{var re=Ss();V(()=>M(re,c(K)?"You're all set":"Launching...")),k(q,re)};O(de,q=>{c(a)===0?q($):c(a)===1?q(H,1):c(a)===2?q(ne,2):q(ae,!1)})}var xe=f(oe,2);{var ge=q=>{var re=Up(),fe=f(me(re),2),we=h(fe),le=f(h(we)),_e=f(we,2),Z=h(_e),be=f(h(Z)),z=f(_e,2),J=f(h(z)),ue=f(z,2),Se=f(h(ue)),Ie=f(Se,2);{var et=ye=>{var Oe=Ip();k(ye,Oe)},je=ye=>{var Oe=Qp();k(ye,Oe)};O(Ie,ye=>{c(p)?ye(et):ye(je,!1)})}var bt=f(ue,2);{var tt=ye=>{var Oe=Np(),lt=h(Oe);V(()=>M(lt,c(r))),k(ye,Oe)};O(bt,ye=>{c(r)&&ye(tt)})}var Ye=f(bt,2),mt=h(Ye);V(()=>{jt(Se,"placeholder",c(p)?`Configured (${c(p)})`:"sk-ant-..."),Ye.disabled=c(i),M(mt,c(i)?"Saving...":"Save & Continue")}),Rn("submit",fe,y),He(le,()=>d.name,ye=>d.name=ye),He(be,()=>d.model,ye=>d.model=ye),He(J,()=>d.systemPrompt,ye=>d.systemPrompt=ye),He(Se,()=>d.apiKey,ye=>d.apiKey=ye),k(q,re)},he=q=>{var re=Op(),fe=me(re),we=h(fe);{var le=ye=>{var Oe=Ss("Slack tokens are already configured. You can skip this step or re-enter them to update.");k(ye,Oe)},_e=ye=>{var Oe=Hp(),lt=me(Oe);jt(lt,"href",n),k(ye,Oe)};O(we,ye=>{c(v)?ye(le):ye(_e,!1)})}var Z=f(fe,2),be=h(Z),z=f(h(be)),J=f(be,2),ue=f(h(J)),Se=f(J,2);{var Ie=ye=>{var Oe=zp(),lt=h(Oe);V(()=>M(lt,c(r))),k(ye,Oe)};O(Se,ye=>{c(r)&&ye(Ie)})}var et=f(Se,2),je=h(et),bt=f(je,2),tt=h(bt),Ye=f(tt,2),mt=h(Ye);V(()=>{tt.disabled=c(i),Ye.disabled=c(i),M(mt,c(i)?"Validating...":"Validate & Save")}),Rn("submit",Z,x),He(z,()=>o.botToken,ye=>o.botToken=ye),He(ue,()=>o.appToken,ye=>o.appToken=ye),G("click",je,T),G("click",tt,w),k(q,re)},Fe=q=>{var re=jp(),fe=f(me(re),2),we=h(fe),le=f(h(we),2);Xn(le,{get active(){return l.enabled},onToggle:()=>{l.enabled=!l.enabled,b(u,"idle")}});var _e=f(we,2);{var Z=tt=>{var Ye=qp(),mt=me(Ye),ye=f(h(mt)),Oe=h(ye),lt=f(Oe,2),ls=h(lt),ss=f(mt,2);{var gs=Ct=>{var xs=Vp();k(Ct,xs)},Ts=Ct=>{var xs=Gp();k(Ct,xs)};O(ss,Ct=>{c(u)==="reachable"?Ct(gs):c(u)==="unreachable"&&Ct(Ts,1)})}V(Ct=>{lt.disabled=Ct,M(ls,c(u)==="checking"?"Checking...":"Test Connection")},[()=>c(u)==="checking"||!l.novncHost.trim()]),G("input",Oe,()=>{b(u,"idle")}),He(Oe,()=>l.novncHost,Ct=>l.novncHost=Ct),G("click",lt,te),k(tt,Ye)};O(_e,tt=>{l.enabled&&tt(Z)})}var be=f(_e,2);{var z=tt=>{var Ye=Wp(),mt=h(Ye);V(()=>M(mt,c(r))),k(tt,Ye)};O(be,tt=>{c(r)&&tt(z)})}var J=f(be,2),ue=h(J),Se=f(ue,2),Ie=h(Se),et=h(Ie),je=f(Ie,2),bt=h(je);V(()=>{Ie.disabled=c(i),M(et,c(i)?"Launching...":"Skip"),je.disabled=c(i),M(bt,c(i)?"Launching...":"Save & Launch")}),Rn("submit",fe,S),G("click",ue,T),G("click",Ie,C),k(q,re)},Be=q=>{var re=Jp(),fe=me(re),we=h(fe),le=f(h(we),2),_e=h(le),Z=f(we,2),be=f(h(Z),2),z=h(be),J=f(Z,2),ue=f(h(J),2),Se=h(ue),Ie=f(fe,2),et=h(Ie);{var je=Ye=>{var mt=Yp(),ye=me(mt),Oe=f(h(ye),2),lt=h(Oe);V(()=>M(lt,`@${d.name??""} in any channel`)),k(Ye,mt)},bt=Ye=>{var mt=Zp();k(Ye,mt)};O(et,Ye=>{o.team?Ye(je):Ye(bt,!1)})}var tt=f(Ie,2);V(()=>{M(_e,o.team||"Not configured"),M(z,`${d.name??""} (${d.model??""})`),M(Se,l.enabled?"Enabled":"Disabled")}),G("click",tt,function(...Ye){e.oncomplete?.apply(this,Ye)}),k(q,re)},Xe=q=>{var re=eg(),fe=me(re);{var we=z=>{var J=$p(),ue=h(J);V(()=>M(ue,c(r))),k(z,J)};O(fe,z=>{c(r)&&z(we)})}var le=f(fe,2),_e=h(le),Z=f(_e,2),be=h(Z);V(()=>{Z.disabled=c(i),M(be,c(i)?"Launching...":"Retry")}),G("click",_e,T),G("click",Z,U),k(q,re)};O(xe,q=>{c(a)===0?q(ge):c(a)===1?q(he,1):c(a)===2?q(Fe,2):c(K)?q(Be,3):q(Xe,!1)})}k(t,A),nt()}_t(["click","input"]);var ng=F('<div class="loading">Loading...</div>'),ag=F('<div class="login-error svelte-1n46o8q"> </div>'),ig=F('<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>'),rg=F('<div class="login-error svelte-1n46o8q"> </div>'),og=F('<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>'),lg=F('<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>'),cg=F("<!> <!> <!>",1);function dg(t,e){st(e,!0);const s={status:"Mission Control",sessions:"Sessions","session-detail":"Session Detail",birds:"Birds",computer:"Computer",settings:"Settings"};let n=W(Ne(xo())),a=W("checking"),i=W(null),r=W("connecting"),o=W(localStorage.getItem("sidebar-collapsed")==="true"),d=W(!1),l=W(""),u=W(""),_=W(""),p=W(""),v=W(""),x=W(""),y=W("");const w=Ae(()=>s[c(n)]??"Mission Control");xt(()=>{document.title=`${c(w)} - BrowserBird`});function S(){b(o,!c(o)),localStorage.setItem("sidebar-collapsed",String(c(o)))}rh(()=>{b(a,"login")}),xt(()=>{const $=()=>{b(n,xo(),!0),b(d,!1)};return window.addEventListener("hashchange",$),()=>window.removeEventListener("hashchange",$)}),xt(()=>{if(c(n)!=="flights")return;const $=Ti().get("birdUid");window.location.hash=$?`#/birds?expand=${$}`:"#/birds"}),xt(()=>{go().then(async $=>{$.setupRequired?b(a,"setup"):$.authRequired?Fi()?await ch()?$.onboardingRequired?b(a,"onboarding"):b(a,"authenticated"):b(a,"login"):b(a,($.onboardingRequired,"login"),!0):b(a,"authenticated")})}),xt(()=>{if(c(a)!=="authenticated")return;bo(H=>{b(i,H,!0),b(r,"connected")},H=>mo(H),H=>{b(r,H,!0)});const $=setInterval(()=>{gh()||ke("/api/status").then(()=>{b(r,"connected"),bo(H=>{b(i,H,!0),b(r,"connected")},H=>mo(H),H=>{b(r,H,!0)})}).catch(()=>{b(r,"disconnected")})},3e4);return()=>{Nc(),clearInterval($)}});function C(){zr(),b(a,"login")}async function K($){$.preventDefault();const H=c(l).trim(),ne=c(u);if(!(!H||!ne))try{const ae=await oh(H,ne);po(ae.token),b(_,""),b(l,""),b(u,""),b(a,"authenticated")}catch(ae){b(_,ae.message,!0)}}async function E($){$.preventDefault();const H=c(p).trim(),ne=c(v),ae=c(x);if(!(!H||!ne)){if(ne!==ae){b(y,"Passwords do not match");return}if(ne.length<8){b(y,"Password must be at least 8 characters");return}try{const xe=await lh(H,ne);po(xe.token),b(y,""),b(p,""),b(v,""),b(x,"");const ge=await go();b(a,ge.onboardingRequired?"onboarding":"authenticated",!0)}catch(xe){b(y,xe.message,!0)}}}var U=cg(),te=me(U);Mh(te,{});var T=f(te,2);Lh(T,{});var A=f(T,2);{var X=$=>{var H=ng();k($,H)},L=$=>{var H=ig(),ne=h(H),ae=f(h(ne),4),xe=h(ae),ge=f(h(xe)),he=f(xe,2),Fe=f(h(he)),Be=f(he,2),Xe=f(h(Be)),q=f(Be,2);{var re=fe=>{var we=ag(),le=h(we);V(()=>M(le,c(y))),k(fe,we)};O(q,fe=>{c(y)&&fe(re)})}Rn("submit",ae,E),He(ge,()=>c(p),fe=>b(p,fe)),He(Fe,()=>c(v),fe=>b(v,fe)),He(Xe,()=>c(x),fe=>b(x,fe)),k($,H)},se=$=>{var H=og(),ne=h(H),ae=f(h(ne),2),xe=h(ae),ge=f(h(xe)),he=f(xe,2),Fe=f(h(he)),Be=f(he,2);{var Xe=q=>{var re=rg(),fe=h(re);V(()=>M(fe,c(_))),k(q,re)};O(Be,q=>{c(_)&&q(Xe)})}Rn("submit",ae,K),He(ge,()=>c(l),q=>b(l,q)),He(Fe,()=>c(u),q=>b(u,q)),k($,H)},oe=$=>{sg($,{oncomplete:()=>{b(a,"authenticated")}})},de=$=>{var H=lg(),ne=h(H);kh(ne,{get currentPage(){return c(n)},get collapsed(){return c(o)},get mobileOpen(){return c(d)},ontoggle:S,onmobileclose:()=>{b(d,!1)},onsignout:C});var ae=f(ne,2),xe=h(ae),ge=h(xe),he=f(ge,2),Fe=h(he),Be=f(he,2),Xe=h(Be);Ah(Xe,{get status(){return c(i)}});var q=f(xe,2),re=h(q);{var fe=z=>{c0(z,{})},we=z=>{Pp(z,{})},le=z=>{W0(z,{})},_e=z=>{fv(z,{get status(){return c(i)}})},Z=z=>{Ep(z,{get status(){return c(i)}})},be=z=>{n0(z,{get status(){return c(i)}})};O(re,z=>{c(n)==="sessions"?z(fe):c(n)==="session-detail"?z(we,1):c(n)==="birds"?z(le,2):c(n)==="computer"?z(_e,3):c(n)==="settings"?z(Z,4):z(be,!1)})}V(()=>M(Fe,c(w))),G("click",ge,()=>{b(d,!0)}),k($,H)};O(A,$=>{c(a)==="checking"?$(X):c(a)==="setup"?$(L,1):c(a)==="login"?$(se,2):c(a)==="onboarding"?$(oe,3):$(de,!1)})}k(t,U),nt()}_t(["click"]);zu(dg,{target:document.getElementById("app")});
8
+ the token</span></label> <!> <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">Skip</button> <button type="submit" class="btn btn-primary"> </button></div></div></form>`,1),Vp=F('<div class="probe-result probe-ok svelte-dm5b3b">Connected</div>'),Gp=F('<div class="probe-result probe-fail svelte-dm5b3b">Not reachable. Make sure the VM container is running.</div>'),qp=F('<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),Wp=F('<div class="login-error svelte-dm5b3b"> </div>'),jp=F('<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),Yp=F('<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>',1),Zp=F('<div class="done-tip svelte-dm5b3b"><span class="done-tip-label svelte-dm5b3b">Create birds</span> <span class="done-tip-detail svelte-dm5b3b">Schedule tasks from the Birds page or the CLI</span></div> <div class="done-tip svelte-dm5b3b"><span class="done-tip-label svelte-dm5b3b">Add Slack later</span> <span class="done-tip-detail svelte-dm5b3b">Go to Settings to connect Slack whenever you are ready</span></div>',1),Jp=F('<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> <button type="button" class="btn btn-primary onboarding-submit svelte-dm5b3b">Go to Dashboard</button>',1),$p=F('<div class="login-error svelte-dm5b3b"> </div>'),eg=F('<!> <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),tg=F('<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 sg(t,e){st(e,!0);const s=["Agent","Slack","Browser"],n="https://api.slack.com/apps?new_app=1&manifest_json=%7B%22display_information%22%3A%7B%22name%22%3A%22BrowserBird%22%2C%22description%22%3A%22A%20self-hosted%20AI%20assistant%20in%20Slack%2C%20with%20a%20real%20browser%20and%20a%20scheduler.%22%2C%22background_color%22%3A%22%231a1a2e%22%7D%2C%22features%22%3A%7B%22assistant_view%22%3A%7B%22assistant_description%22%3A%22A%20self-hosted%20AI%20assistant%20in%20Slack%2C%20with%20a%20real%20browser%20and%20a%20scheduler.%22%7D%2C%22app_home%22%3A%7B%22home_tab_enabled%22%3Atrue%2C%22messages_tab_enabled%22%3Atrue%2C%22messages_tab_read_only_enabled%22%3Afalse%7D%2C%22bot_user%22%3A%7B%22display_name%22%3A%22BrowserBird%22%2C%22always_online%22%3Atrue%7D%2C%22slash_commands%22%3A%5B%7B%22command%22%3A%22%2Fbird%22%2C%22description%22%3A%22Manage%20BrowserBird%20birds%22%2C%22usage_hint%22%3A%22list%20%7C%20fly%20%7C%20stop%20%7C%20logs%20%7C%20enable%20%7C%20disable%20%7C%20create%20%7C%20status%22%2C%22should_escape%22%3Afalse%7D%5D%7D%2C%22oauth_config%22%3A%7B%22scopes%22%3A%7B%22bot%22%3A%5B%22app_mentions%3Aread%22%2C%22assistant%3Awrite%22%2C%22channels%3Ahistory%22%2C%22channels%3Aread%22%2C%22chat%3Awrite%22%2C%22files%3Aread%22%2C%22files%3Awrite%22%2C%22groups%3Ahistory%22%2C%22groups%3Aread%22%2C%22im%3Ahistory%22%2C%22im%3Aread%22%2C%22im%3Awrite%22%2C%22mpim%3Ahistory%22%2C%22mpim%3Aread%22%2C%22reactions%3Aread%22%2C%22reactions%3Awrite%22%2C%22users%3Aread%22%2C%22commands%22%5D%7D%7D%2C%22settings%22%3A%7B%22event_subscriptions%22%3A%7B%22bot_events%22%3A%5B%22app_mention%22%2C%22assistant_thread_context_changed%22%2C%22assistant_thread_started%22%2C%22message.channels%22%2C%22message.groups%22%2C%22message.im%22%2C%22message.mpim%22%2C%22app_home_opened%22%5D%7D%2C%22interactivity%22%3A%7B%22is_enabled%22%3Atrue%7D%2C%22org_deploy_enabled%22%3Afalse%2C%22socket_mode_enabled%22%3Atrue%2C%22token_rotation_enabled%22%3Afalse%7D%7D";let a=W(0),i=W(!1),r=W(""),o=Ne({botToken:"",appToken:"",team:"",botUser:""}),d=Ne({name:"BrowserBird",model:"sonnet",systemPrompt:"You are a helpful AI assistant. Be concise and direct.",maxTurns:50,channels:["*"],apiKey:""}),l=Ne({enabled:!1,novncHost:"localhost",novncPort:6080}),u=W("idle"),_=W(null),p=W(""),v=W(!1);xt(()=>{dh().then(q=>{b(_,q,!0),d.name=q.agent.name,d.model=q.agent.model,d.systemPrompt=q.agent.systemPrompt,d.maxTurns=q.agent.maxTurns,d.channels=q.agent.channels,l.enabled=q.browser.enabled,l.novncHost=q.browser.novncHost,l.novncPort=q.browser.novncPort,q.secrets.anthropic.set&&b(p,q.secrets.anthropic.hint,!0),q.secrets.slack.botToken.set&&q.secrets.slack.appToken.set&&b(v,!0)}).catch(()=>{})});async function x(q){if(q.preventDefault(),!(!o.botToken.trim()||!o.appToken.trim())){b(i,!0),b(r,"");try{const re=await uh(o.botToken.trim(),o.appToken.trim());o.team=re.team,o.botUser=re.botUser,b(a,2)}catch(re){b(r,re.message,!0)}finally{b(i,!1)}}}async function y(q){if(q.preventDefault(),!(!d.name.trim()||!d.model.trim())){if(!d.apiKey.trim()&&!c(p)){b(r,"API key is required");return}b(i,!0),b(r,"");try{await hh({name:d.name.trim(),model:d.model.trim(),systemPrompt:d.systemPrompt.trim(),maxTurns:d.maxTurns,channels:d.channels}),d.apiKey.trim()&&await fh({apiKey:d.apiKey.trim()}),b(a,1)}catch(re){b(r,re.message,!0)}finally{b(i,!1)}}}function w(){b(a,2)}async function S(q){q.preventDefault(),b(i,!0),b(r,"");try{await _h({enabled:l.enabled,novncHost:l.enabled?l.novncHost.trim():void 0}),await E()}catch(re){b(r,re.message,!0)}finally{b(i,!1)}}async function C(){b(i,!0),b(r,"");try{await E()}catch(q){b(r,q.message,!0)}finally{b(i,!1)}}let K=W(!1);async function E(){await ph(),b(K,!0),b(a,3)}async function U(){b(i,!0),b(r,"");try{await E()}catch(q){b(r,q.message,!0)}finally{b(i,!1)}}async function te(){const q=l.novncHost.trim();if(q){b(u,"checking");try{const re=await vh(q,l.novncPort);b(u,re.reachable?"reachable":"unreachable",!0)}catch{b(u,"unreachable")}}}function T(){b(r,""),c(a)===3&&!c(K)?b(a,2):br(a,-1)}var A=tg(),X=h(A),L=f(h(X),2);{var se=q=>{var re=Rp();Mt(re,21,()=>s,Pc,(fe,we,le)=>{var _e=Dp(),Z=me(_e);let be;var z=h(Z);z.textContent=le+1;var J=f(Z,2);{var ue=Se=>{var Ie=Bp();let et;V(()=>et=pe(Ie,1,"step-line svelte-dm5b3b",null,et,{completed:le<c(a)})),k(Se,Ie)};O(J,Se=>{le<s.length-1&&Se(ue)})}V(()=>be=pe(Z,1,"step-dot svelte-dm5b3b",null,be,{active:le===c(a),completed:le<c(a)})),k(fe,_e)}),k(q,re)};O(L,q=>{c(a)<s.length&&q(se)})}var oe=f(L,2),de=h(oe);{var $=q=>{var re=Ss("Configure Agent");k(q,re)},H=q=>{var re=Ss("Connect Slack");k(q,re)},ne=q=>{var re=Ss("Browser");k(q,re)},ae=q=>{var re=Ss();V(()=>M(re,c(K)?"You're all set":"Launching...")),k(q,re)};O(de,q=>{c(a)===0?q($):c(a)===1?q(H,1):c(a)===2?q(ne,2):q(ae,!1)})}var xe=f(oe,2);{var ge=q=>{var re=Up(),fe=f(me(re),2),we=h(fe),le=f(h(we)),_e=f(we,2),Z=h(_e),be=f(h(Z)),z=f(_e,2),J=f(h(z)),ue=f(z,2),Se=f(h(ue)),Ie=f(Se,2);{var et=ye=>{var Oe=Ip();k(ye,Oe)},je=ye=>{var Oe=Qp();k(ye,Oe)};O(Ie,ye=>{c(p)?ye(et):ye(je,!1)})}var bt=f(ue,2);{var tt=ye=>{var Oe=Np(),lt=h(Oe);V(()=>M(lt,c(r))),k(ye,Oe)};O(bt,ye=>{c(r)&&ye(tt)})}var Ye=f(bt,2),mt=h(Ye);V(()=>{jt(Se,"placeholder",c(p)?`Configured (${c(p)})`:"sk-ant-..."),Ye.disabled=c(i),M(mt,c(i)?"Saving...":"Save & Continue")}),Rn("submit",fe,y),He(le,()=>d.name,ye=>d.name=ye),He(be,()=>d.model,ye=>d.model=ye),He(J,()=>d.systemPrompt,ye=>d.systemPrompt=ye),He(Se,()=>d.apiKey,ye=>d.apiKey=ye),k(q,re)},he=q=>{var re=Op(),fe=me(re),we=h(fe);{var le=ye=>{var Oe=Ss("Slack tokens are already configured. You can skip this step or re-enter them to update.");k(ye,Oe)},_e=ye=>{var Oe=Hp(),lt=me(Oe);jt(lt,"href",n),k(ye,Oe)};O(we,ye=>{c(v)?ye(le):ye(_e,!1)})}var Z=f(fe,2),be=h(Z),z=f(h(be)),J=f(be,2),ue=f(h(J)),Se=f(J,2);{var Ie=ye=>{var Oe=zp(),lt=h(Oe);V(()=>M(lt,c(r))),k(ye,Oe)};O(Se,ye=>{c(r)&&ye(Ie)})}var et=f(Se,2),je=h(et),bt=f(je,2),tt=h(bt),Ye=f(tt,2),mt=h(Ye);V(()=>{tt.disabled=c(i),Ye.disabled=c(i),M(mt,c(i)?"Validating...":"Validate & Save")}),Rn("submit",Z,x),He(z,()=>o.botToken,ye=>o.botToken=ye),He(ue,()=>o.appToken,ye=>o.appToken=ye),G("click",je,T),G("click",tt,w),k(q,re)},Fe=q=>{var re=jp(),fe=f(me(re),2),we=h(fe),le=f(h(we),2);Xn(le,{get active(){return l.enabled},onToggle:()=>{l.enabled=!l.enabled,b(u,"idle")}});var _e=f(we,2);{var Z=tt=>{var Ye=qp(),mt=me(Ye),ye=f(h(mt)),Oe=h(ye),lt=f(Oe,2),ls=h(lt),ss=f(mt,2);{var gs=Ct=>{var xs=Vp();k(Ct,xs)},Ts=Ct=>{var xs=Gp();k(Ct,xs)};O(ss,Ct=>{c(u)==="reachable"?Ct(gs):c(u)==="unreachable"&&Ct(Ts,1)})}V(Ct=>{lt.disabled=Ct,M(ls,c(u)==="checking"?"Checking...":"Test Connection")},[()=>c(u)==="checking"||!l.novncHost.trim()]),G("input",Oe,()=>{b(u,"idle")}),He(Oe,()=>l.novncHost,Ct=>l.novncHost=Ct),G("click",lt,te),k(tt,Ye)};O(_e,tt=>{l.enabled&&tt(Z)})}var be=f(_e,2);{var z=tt=>{var Ye=Wp(),mt=h(Ye);V(()=>M(mt,c(r))),k(tt,Ye)};O(be,tt=>{c(r)&&tt(z)})}var J=f(be,2),ue=h(J),Se=f(ue,2),Ie=h(Se),et=h(Ie),je=f(Ie,2),bt=h(je);V(()=>{Ie.disabled=c(i),M(et,c(i)?"Launching...":"Skip"),je.disabled=c(i),M(bt,c(i)?"Launching...":"Save & Launch")}),Rn("submit",fe,S),G("click",ue,T),G("click",Ie,C),k(q,re)},Be=q=>{var re=Jp(),fe=me(re),we=h(fe),le=f(h(we),2),_e=h(le),Z=f(we,2),be=f(h(Z),2),z=h(be),J=f(Z,2),ue=f(h(J),2),Se=h(ue),Ie=f(fe,2),et=h(Ie);{var je=Ye=>{var mt=Yp(),ye=me(mt),Oe=f(h(ye),2),lt=h(Oe);V(()=>M(lt,`@${d.name??""} in any channel`)),k(Ye,mt)},bt=Ye=>{var mt=Zp();k(Ye,mt)};O(et,Ye=>{o.team?Ye(je):Ye(bt,!1)})}var tt=f(Ie,2);V(()=>{M(_e,o.team||"Not configured"),M(z,`${d.name??""} (${d.model??""})`),M(Se,l.enabled?"Enabled":"Disabled")}),G("click",tt,function(...Ye){e.oncomplete?.apply(this,Ye)}),k(q,re)},Xe=q=>{var re=eg(),fe=me(re);{var we=z=>{var J=$p(),ue=h(J);V(()=>M(ue,c(r))),k(z,J)};O(fe,z=>{c(r)&&z(we)})}var le=f(fe,2),_e=h(le),Z=f(_e,2),be=h(Z);V(()=>{Z.disabled=c(i),M(be,c(i)?"Launching...":"Retry")}),G("click",_e,T),G("click",Z,U),k(q,re)};O(xe,q=>{c(a)===0?q(ge):c(a)===1?q(he,1):c(a)===2?q(Fe,2):c(K)?q(Be,3):q(Xe,!1)})}k(t,A),nt()}_t(["click","input"]);var ng=F('<div class="loading">Loading...</div>'),ag=F('<div class="login-error svelte-1n46o8q"> </div>'),ig=F('<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>'),rg=F('<div class="login-error svelte-1n46o8q"> </div>'),og=F('<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>'),lg=F('<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>'),cg=F("<!> <!> <!>",1);function dg(t,e){st(e,!0);const s={status:"Mission Control",sessions:"Sessions","session-detail":"Session Detail",birds:"Birds",computer:"Computer",settings:"Settings"};let n=W(Ne(xo())),a=W("checking"),i=W(null),r=W("connecting"),o=W(localStorage.getItem("sidebar-collapsed")==="true"),d=W(!1),l=W(""),u=W(""),_=W(""),p=W(""),v=W(""),x=W(""),y=W("");const w=Ae(()=>s[c(n)]??"Mission Control");xt(()=>{document.title=`${c(w)} - BrowserBird`});function S(){b(o,!c(o)),localStorage.setItem("sidebar-collapsed",String(c(o)))}rh(()=>{b(a,"login")}),xt(()=>{const $=()=>{b(n,xo(),!0),b(d,!1)};return window.addEventListener("hashchange",$),()=>window.removeEventListener("hashchange",$)}),xt(()=>{if(c(n)!=="flights")return;const $=Ti().get("birdUid");window.location.hash=$?`#/birds?expand=${$}`:"#/birds"}),xt(()=>{go().then(async $=>{$.setupRequired?b(a,"setup"):$.authRequired?Fi()?await ch()?$.onboardingRequired?b(a,"onboarding"):b(a,"authenticated"):b(a,"login"):b(a,($.onboardingRequired,"login"),!0):b(a,"authenticated")})}),xt(()=>{if(c(a)!=="authenticated")return;bo(H=>{b(i,H,!0),b(r,"connected")},H=>mo(H),H=>{b(r,H,!0)});const $=setInterval(()=>{gh()||ke("/api/status").then(()=>{b(r,"connected"),bo(H=>{b(i,H,!0),b(r,"connected")},H=>mo(H),H=>{b(r,H,!0)})}).catch(()=>{b(r,"disconnected")})},3e4);return()=>{Nc(),clearInterval($)}});function C(){zr(),b(a,"login")}async function K($){$.preventDefault();const H=c(l).trim(),ne=c(u);if(!(!H||!ne))try{const ae=await oh(H,ne);po(ae.token),b(_,""),b(l,""),b(u,""),b(a,"authenticated")}catch(ae){b(_,ae.message,!0)}}async function E($){$.preventDefault();const H=c(p).trim(),ne=c(v),ae=c(x);if(!(!H||!ne)){if(ne!==ae){b(y,"Passwords do not match");return}if(ne.length<8){b(y,"Password must be at least 8 characters");return}try{const xe=await lh(H,ne);po(xe.token),b(y,""),b(p,""),b(v,""),b(x,"");const ge=await go();b(a,ge.onboardingRequired?"onboarding":"authenticated",!0)}catch(xe){b(y,xe.message,!0)}}}var U=cg(),te=me(U);Mh(te,{});var T=f(te,2);Lh(T,{});var A=f(T,2);{var X=$=>{var H=ng();k($,H)},L=$=>{var H=ig(),ne=h(H),ae=f(h(ne),4),xe=h(ae),ge=f(h(xe)),he=f(xe,2),Fe=f(h(he)),Be=f(he,2),Xe=f(h(Be)),q=f(Be,2);{var re=fe=>{var we=ag(),le=h(we);V(()=>M(le,c(y))),k(fe,we)};O(q,fe=>{c(y)&&fe(re)})}Rn("submit",ae,E),He(ge,()=>c(p),fe=>b(p,fe)),He(Fe,()=>c(v),fe=>b(v,fe)),He(Xe,()=>c(x),fe=>b(x,fe)),k($,H)},se=$=>{var H=og(),ne=h(H),ae=f(h(ne),2),xe=h(ae),ge=f(h(xe)),he=f(xe,2),Fe=f(h(he)),Be=f(he,2);{var Xe=q=>{var re=rg(),fe=h(re);V(()=>M(fe,c(_))),k(q,re)};O(Be,q=>{c(_)&&q(Xe)})}Rn("submit",ae,K),He(ge,()=>c(l),q=>b(l,q)),He(Fe,()=>c(u),q=>b(u,q)),k($,H)},oe=$=>{sg($,{oncomplete:()=>{b(a,"authenticated")}})},de=$=>{var H=lg(),ne=h(H);kh(ne,{get currentPage(){return c(n)},get collapsed(){return c(o)},get mobileOpen(){return c(d)},ontoggle:S,onmobileclose:()=>{b(d,!1)},onsignout:C});var ae=f(ne,2),xe=h(ae),ge=h(xe),he=f(ge,2),Fe=h(he),Be=f(he,2),Xe=h(Be);Ah(Xe,{get status(){return c(i)}});var q=f(xe,2),re=h(q);{var fe=z=>{c0(z,{})},we=z=>{Pp(z,{})},le=z=>{W0(z,{})},_e=z=>{fv(z,{get status(){return c(i)}})},Z=z=>{Ep(z,{get status(){return c(i)}})},be=z=>{n0(z,{get status(){return c(i)}})};O(re,z=>{c(n)==="sessions"?z(fe):c(n)==="session-detail"?z(we,1):c(n)==="birds"?z(le,2):c(n)==="computer"?z(_e,3):c(n)==="settings"?z(Z,4):z(be,!1)})}V(()=>M(Fe,c(w))),G("click",ge,()=>{b(d,!0)}),k($,H)};O(A,$=>{c(a)==="checking"?$(X):c(a)==="setup"?$(L,1):c(a)==="login"?$(se,2):c(a)==="onboarding"?$(oe,3):$(de,!1)})}k(t,U),nt()}_t(["click"]);zu(dg,{target:document.getElementById("app")});
@@ -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-BqvBoiDc.js"></script>
14
+ <script type="module" crossorigin src="/assets/index-rMAhMQyM.js"></script>
15
15
  <link rel="stylesheet" crossorigin href="/assets/index-C4T4JGQp.css">
16
16
  </head>
17
17
  <body>