agent-comms 1.24.1 → 1.24.3
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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +1 -1
- package/dist/bridges/user/web/build.js +4 -0
- package/dist/bridges/user/web/build.js.map +1 -1
- package/dist/bridges/user/web/dist/bundle.js +565 -0
- package/dist/bridges/user/web/dist/icons/icon-192x192.svg +9 -0
- package/dist/bridges/user/web/dist/icons/icon-512x512.svg +9 -0
- package/dist/bridges/user/web/dist/icons/icon-96x96.svg +9 -0
- package/dist/bridges/user/web/dist/manifest.json +26 -0
- package/dist/bridges/user/web/dist/mesh-worker.js +1 -0
- package/dist/bridges/user/web/dist/relay-worker.js +1 -0
- package/dist/bridges/user/web/dist/sw.js +1 -0
- package/dist/bridges/user/web/frontend/index.html +21 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://github.com/ExaDev/agent-comms)
|
|
4
4
|
[](https://www.npmjs.com/package/agent-comms)
|
|
5
|
-
[](https://github.com/ExaDev/agent-comms/releases/tag/v1.24.3)
|
|
6
6
|
[](https://github.com/ExaDev/agent-comms/actions)
|
|
7
7
|
|
|
8
8
|
Cross-harness communication mesh for LLM agents: rooms, DMs, presence, and visibility over TCP with zero filesystem dependencies.
|
|
@@ -39,6 +39,10 @@ const inlineCssPlugin = {
|
|
|
39
39
|
},
|
|
40
40
|
};
|
|
41
41
|
async function main() {
|
|
42
|
+
// Start from a clean output dir so stale artifacts (e.g. renamed bundles,
|
|
43
|
+
// leftover sourcemaps) can't linger and get swept into the published
|
|
44
|
+
// package by the copy-web-assets step.
|
|
45
|
+
fs.rmSync(DIST_DIR, { recursive: true, force: true });
|
|
42
46
|
fs.mkdirSync(DIST_DIR, { recursive: true });
|
|
43
47
|
await esbuild.build({
|
|
44
48
|
entryPoints: [path.join(FRONTEND_DIR, "main.tsx")],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../../src/bridges/user/web/build.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../../src/bridges/user/web/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,565 @@
|
|
|
1
|
+
"use strict";(()=>{var Ln=Object.defineProperty;var $n=(e,n,t)=>n in e?Ln(e,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[n]=t;var C=(e,n,t)=>$n(e,typeof n!="symbol"?n+"":n,t);var Q,g,je,Fn,E,Se,Pe,Ee,pe,O,F,Ie,fe,ue,me,Hn,K={},X=[],Wn=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,Y=Array.isArray;function P(e,n){for(var t in n)e[t]=n[t];return e}function _e(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function zn(e,n,t){var o,s,r,c={};for(r in n)r=="key"?o=n[r]:r=="ref"?s=n[r]:c[r]=n[r];if(arguments.length>2&&(c.children=arguments.length>3?Q.call(arguments,2):t),typeof e=="function"&&e.defaultProps!=null)for(r in e.defaultProps)c[r]===void 0&&(c[r]=e.defaultProps[r]);return V(e,c,o,s,null)}function V(e,n,t,o,s){var r={type:e,props:n,key:t,ref:o,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:s??++je,__i:-1,__u:0};return s==null&&g.vnode!=null&&g.vnode(r),r}function I(e){return e.children}function q(e,n){this.props=e,this.context=n}function $(e,n){if(n==null)return e.__?$(e.__,e.__i+1):null;for(var t;n<e.__k.length;n++)if((t=e.__k[n])!=null&&t.__e!=null)return t.__e;return typeof e.type=="function"?$(e):null}function Un(e){if(e.__P&&e.__d){var n=e.__v,t=n.__e,o=[],s=[],r=P({},n);r.__v=n.__v+1,g.vnode&&g.vnode(r),ge(e.__P,r,n,e.__n,e.__P.namespaceURI,32&n.__u?[t]:null,o,t??$(n),!!(32&n.__u),s),r.__v=n.__v,r.__.__k[r.__i]=r,Fe(o,r,s),n.__e=n.__=null,r.__e!=t&&De(r)}}function De(e){if((e=e.__)!=null&&e.__c!=null)return e.__e=e.__c.base=null,e.__k.some(function(n){if(n!=null&&n.__e!=null)return e.__e=e.__c.base=n.__e}),De(e)}function Ae(e){(!e.__d&&(e.__d=!0)&&E.push(e)&&!G.__r++||Se!=g.debounceRendering)&&((Se=g.debounceRendering)||Pe)(G)}function G(){try{for(var e,n=1;E.length;)E.length>n&&E.sort(Ee),e=E.shift(),n=E.length,Un(e)}finally{E.length=G.__r=0}}function Ne(e,n,t,o,s,r,c,d,u,l,p){var f,i,m,y,S,v,x,_=o&&o.__k||X,A=n.length;for(u=Bn(t,n,_,u,A),f=0;f<A;f++)(m=t.__k[f])!=null&&(i=m.__i!=-1&&_[m.__i]||K,m.__i=f,v=ge(e,m,i,s,r,c,d,u,l,p),y=m.__e,m.ref&&i.ref!=m.ref&&(i.ref&&he(i.ref,null,m),p.push(m.ref,m.__c||y,m)),S==null&&y!=null&&(S=y),(x=!!(4&m.__u))||i.__k===m.__k?(u=Le(m,u,e,x),x&&i.__e&&(i.__e=null)):typeof m.type=="function"&&v!==void 0?u=v:y&&(u=y.nextSibling),m.__u&=-7);return t.__e=S,u}function Bn(e,n,t,o,s){var r,c,d,u,l,p=t.length,f=p,i=0;for(e.__k=new Array(s),r=0;r<s;r++)(c=n[r])!=null&&typeof c!="boolean"&&typeof c!="function"?(typeof c=="string"||typeof c=="number"||typeof c=="bigint"||c.constructor==String?c=e.__k[r]=V(null,c,null,null,null):Y(c)?c=e.__k[r]=V(I,{children:c},null,null,null):c.constructor===void 0&&c.__b>0?c=e.__k[r]=V(c.type,c.props,c.key,c.ref?c.ref:null,c.__v):e.__k[r]=c,u=r+i,c.__=e,c.__b=e.__b+1,d=null,(l=c.__i=Jn(c,t,u,f))!=-1&&(f--,(d=t[l])&&(d.__u|=2)),d==null||d.__v==null?(l==-1&&(s>p?i--:s<p&&i++),typeof c.type!="function"&&(c.__u|=4)):l!=u&&(l==u-1?i--:l==u+1?i++:(l>u?i--:i++,c.__u|=4))):e.__k[r]=null;if(f)for(r=0;r<p;r++)(d=t[r])!=null&&(2&d.__u)==0&&(d.__e==o&&(o=$(d)),We(d,d));return o}function Le(e,n,t,o){var s,r;if(typeof e.type=="function"){for(s=e.__k,r=0;s&&r<s.length;r++)s[r]&&(s[r].__=e,n=Le(s[r],n,t,o));return n}e.__e!=n&&(o&&(n&&e.type&&!n.parentNode&&(n=$(e)),t.insertBefore(e.__e,n||null)),n=e.__e);do n=n&&n.nextSibling;while(n!=null&&n.nodeType==8);return n}function Jn(e,n,t,o){var s,r,c,d=e.key,u=e.type,l=n[t],p=l!=null&&(2&l.__u)==0;if(l===null&&d==null||p&&d==l.key&&u==l.type)return t;if(o>(p?1:0)){for(s=t-1,r=t+1;s>=0||r<n.length;)if((l=n[c=s>=0?s--:r++])!=null&&(2&l.__u)==0&&d==l.key&&u==l.type)return c}return-1}function Te(e,n,t){n[0]=="-"?e.setProperty(n,t??""):e[n]=t==null?"":typeof t!="number"||Wn.test(n)?t:t+"px"}function J(e,n,t,o,s){var r,c;e:if(n=="style")if(typeof t=="string")e.style.cssText=t;else{if(typeof o=="string"&&(e.style.cssText=o=""),o)for(n in o)t&&n in t||Te(e.style,n,"");if(t)for(n in t)o&&t[n]==o[n]||Te(e.style,n,t[n])}else if(n[0]=="o"&&n[1]=="n")r=n!=(n=n.replace(Ie,"$1")),c=n.toLowerCase(),n=c in e||n=="onFocusOut"||n=="onFocusIn"?c.slice(2):n.slice(2),e.l||(e.l={}),e.l[n+r]=t,t?o?t[F]=o[F]:(t[F]=fe,e.addEventListener(n,r?me:ue,r)):e.removeEventListener(n,r?me:ue,r);else{if(s=="http://www.w3.org/2000/svg")n=n.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(n!="width"&&n!="height"&&n!="href"&&n!="list"&&n!="form"&&n!="tabIndex"&&n!="download"&&n!="rowSpan"&&n!="colSpan"&&n!="role"&&n!="popover"&&n in e)try{e[n]=t??"";break e}catch{}typeof t=="function"||(t==null||t===!1&&n[4]!="-"?e.removeAttribute(n):e.setAttribute(n,n=="popover"&&t==1?"":t))}}function Me(e){return function(n){if(this.l){var t=this.l[n.type+e];if(n[O]==null)n[O]=fe++;else if(n[O]<t[F])return;return t(g.event?g.event(n):n)}}}function ge(e,n,t,o,s,r,c,d,u,l){var p,f,i,m,y,S,v,x,_,A,R,j,N,Ce,B,de,T=n.type;if(n.constructor!==void 0)return null;128&t.__u&&(u=!!(32&t.__u),r=[d=n.__e=t.__e]),(p=g.__b)&&p(n);e:if(typeof T=="function"){f=c.length;try{if(_=n.props,A=T.prototype&&T.prototype.render,R=(p=T.contextType)&&o[p.__c],j=p?R?R.props.value:p.__:o,t.__c?x=(i=n.__c=t.__c).__=i.__E:(A?n.__c=i=new T(_,j):(n.__c=i=new q(_,j),i.constructor=T,i.render=Vn),R&&R.sub(i),i.state||(i.state={}),i.__n=o,m=i.__d=!0,i.__h=[],i._sb=[]),A&&i.__s==null&&(i.__s=i.state),A&&T.getDerivedStateFromProps!=null&&(i.__s==i.state&&(i.__s=P({},i.__s)),P(i.__s,T.getDerivedStateFromProps(_,i.__s))),y=i.props,S=i.state,i.__v=n,m)A&&T.getDerivedStateFromProps==null&&i.componentWillMount!=null&&i.componentWillMount(),A&&i.componentDidMount!=null&&i.__h.push(i.componentDidMount);else{if(A&&T.getDerivedStateFromProps==null&&_!==y&&i.componentWillReceiveProps!=null&&i.componentWillReceiveProps(_,j),n.__v==t.__v||!i.__e&&i.shouldComponentUpdate!=null&&i.shouldComponentUpdate(_,i.__s,j)===!1){n.__v!=t.__v&&(i.props=_,i.state=i.__s,i.__d=!1),n.__e=t.__e,n.__k=t.__k,n.__k.some(function(L){L&&(L.__=n)}),X.push.apply(i.__h,i._sb),i._sb=[],i.__h.length&&c.push(i);break e}i.componentWillUpdate!=null&&i.componentWillUpdate(_,i.__s,j),A&&i.componentDidUpdate!=null&&i.__h.push(function(){i.componentDidUpdate(y,S,v)})}if(i.context=j,i.props=_,i.__P=e,i.__e=!1,N=g.__r,Ce=0,A)i.state=i.__s,i.__d=!1,N&&N(n),p=i.render(i.props,i.state,i.context),X.push.apply(i.__h,i._sb),i._sb=[];else do i.__d=!1,N&&N(n),p=i.render(i.props,i.state,i.context),i.state=i.__s;while(i.__d&&++Ce<25);i.state=i.__s,i.getChildContext!=null&&(o=P(P({},o),i.getChildContext())),A&&!m&&i.getSnapshotBeforeUpdate!=null&&(v=i.getSnapshotBeforeUpdate(y,S)),B=p!=null&&p.type===I&&p.key==null?He(p.props.children):p,d=Ne(e,Y(B)?B:[B],n,t,o,s,r,c,d,u,l),i.base=n.__e,n.__u&=-161,i.__h.length&&c.push(i),x&&(i.__E=i.__=null)}catch(L){if(c.length=f,n.__v=null,u||r!=null){if(L.then){for(n.__u|=u?160:128;d&&d.nodeType==8&&d.nextSibling;)d=d.nextSibling;r!=null&&(r[r.indexOf(d)]=null),n.__e=d}else if(r!=null)for(de=r.length;de--;)_e(r[de])}else n.__e=t.__e;n.__k==null&&(n.__k=t.__k||[]),L.then||$e(n),g.__e(L,n,t)}}else r==null&&n.__v==t.__v?(n.__k=t.__k,n.__e=t.__e):d=n.__e=On(t.__e,n,t,o,s,r,c,u,l);return(p=g.diffed)&&p(n),128&n.__u?void 0:d}function $e(e){e&&(e.__c&&(e.__c.__e=!0),e.__k&&e.__k.some($e))}function Fe(e,n,t){for(var o=0;o<t.length;o++)he(t[o],t[++o],t[++o]);g.__c&&g.__c(n,e),e.some(function(s){try{e=s.__h,s.__h=[],e.some(function(r){r.call(s)})}catch(r){g.__e(r,s.__v)}})}function He(e){return typeof e!="object"||e==null||e.__b>0?e:Y(e)?e.map(He):e.constructor!==void 0?null:P({},e)}function On(e,n,t,o,s,r,c,d,u){var l,p,f,i,m,y,S,v=t.props||K,x=n.props,_=n.type;if(_=="svg"?s="http://www.w3.org/2000/svg":_=="math"?s="http://www.w3.org/1998/Math/MathML":s||(s="http://www.w3.org/1999/xhtml"),r!=null){for(l=0;l<r.length;l++)if((m=r[l])&&"setAttribute"in m==!!_&&(_?m.localName==_:m.nodeType==3)){e=m,r[l]=null;break}}if(e==null){if(_==null)return document.createTextNode(x);e=document.createElementNS(s,_,x.is&&x),d&&(g.__m&&g.__m(n,r),d=!1),r=null}if(_==null)v===x||d&&e.data==x||(e.data=x);else{if(r=_=="textarea"&&x.defaultValue!=null?null:r&&Q.call(e.childNodes),!d&&r!=null)for(v={},l=0;l<e.attributes.length;l++)v[(m=e.attributes[l]).name]=m.value;for(l in v)m=v[l],l=="dangerouslySetInnerHTML"?f=m:l=="children"||l in x||l=="value"&&"defaultValue"in x||l=="checked"&&"defaultChecked"in x||J(e,l,null,m,s);for(l in x)m=x[l],l=="children"?i=m:l=="dangerouslySetInnerHTML"?p=m:l=="value"?y=m:l=="checked"?S=m:d&&typeof m!="function"||v[l]===m||J(e,l,m,v[l],s);if(p)d||f&&(p.__html==f.__html||p.__html==e.innerHTML)||(e.innerHTML=p.__html),n.__k=[];else if(f&&(e.innerHTML=""),Ne(n.type=="template"?e.content:e,Y(i)?i:[i],n,t,o,_=="foreignObject"?"http://www.w3.org/1999/xhtml":s,r,c,r?r[0]:t.__k&&$(t,0),d,u),r!=null)for(l=r.length;l--;)_e(r[l]);d&&_!="textarea"||(l="value",_=="progress"&&y==null?e.removeAttribute("value"):y!=null&&(y!==e[l]||_=="progress"&&!y||_=="option"&&y!=v[l])&&J(e,l,y,v[l],s),l="checked",S!=null&&S!=e[l]&&J(e,l,S,v[l],s))}return e}function he(e,n,t){try{if(typeof e=="function"){var o=typeof e.__u=="function";o&&e.__u(),o&&n==null||(e.__u=e(n))}else e.current=n}catch(s){g.__e(s,t)}}function We(e,n,t){var o,s;if(g.unmount&&g.unmount(e),(o=e.ref)&&(o.current&&o.current!=e.__e||he(o,null,n)),(o=e.__c)!=null){if(o.componentWillUnmount)try{o.componentWillUnmount()}catch(r){g.__e(r,n)}o.base=o.__P=o.__n=null}if(o=e.__k)for(s=0;s<o.length;s++)o[s]&&We(o[s],n,t||typeof e.type!="function");t||_e(e.__e),e.__c=e.__=e.__e=void 0}function Vn(e,n,t){return this.constructor(e,t)}function ze(e,n,t){var o,s,r,c;n==document&&(n=document.documentElement),g.__&&g.__(e,n),s=(o=typeof t=="function")?null:t&&t.__k||n.__k,r=[],c=[],ge(n,e=(!o&&t||n).__k=zn(I,null,[e]),s||K,K,n.namespaceURI,!o&&t?[t]:s?null:n.firstChild?Q.call(n.childNodes):null,r,!o&&t?t:s?s.__e:n.firstChild,o,c),Fe(r,e,c),e.props.children=null}Q=X.slice,g={__e:function(e,n,t,o){for(var s,r,c;n=n.__;)if((s=n.__c)&&!s.__)try{if((r=s.constructor)&&r.getDerivedStateFromError!=null&&(s.setState(r.getDerivedStateFromError(e)),c=s.__d),s.componentDidCatch!=null&&(s.componentDidCatch(e,o||{}),c=s.__d),c)return s.__E=s}catch(d){e=d}throw e}},je=0,Fn=function(e){return e!=null&&e.constructor===void 0},q.prototype.setState=function(e,n){var t;t=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=P({},this.state),typeof e=="function"&&(e=e(P({},t),this.props)),e&&P(t,e),e!=null&&this.__v&&(n&&this._sb.push(n),Ae(this))},q.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),Ae(this))},q.prototype.render=I,E=[],Pe=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Ee=function(e,n){return e.__v.__b-n.__v.__b},G.__r=0,pe=Math.random().toString(8),O="__d"+pe,F="__a"+pe,Ie=/(PointerCapture)$|Capture$/i,fe=0,ue=Me(!1),me=Me(!0),Hn=0;document.head.appendChild(Object.assign(document.createElement("style"),{textContent:`:root {
|
|
2
|
+
--bg: #1a1a2e;
|
|
3
|
+
--surface: #16213e;
|
|
4
|
+
--border: #0f3460;
|
|
5
|
+
--text: #e4e4e4;
|
|
6
|
+
--dim: #888;
|
|
7
|
+
--accent: #00b4d8;
|
|
8
|
+
--green: #06d6a0;
|
|
9
|
+
--red: #ef476f;
|
|
10
|
+
--yellow: #ffd166;
|
|
11
|
+
--purple: #b5838d;
|
|
12
|
+
}
|
|
13
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
14
|
+
body {
|
|
15
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
|
16
|
+
background: var(--bg);
|
|
17
|
+
color: var(--text);
|
|
18
|
+
height: 100vh;
|
|
19
|
+
}
|
|
20
|
+
#root {
|
|
21
|
+
display: flex;
|
|
22
|
+
height: 100vh;
|
|
23
|
+
}
|
|
24
|
+
#sidebar {
|
|
25
|
+
width: 260px;
|
|
26
|
+
background: var(--surface);
|
|
27
|
+
border-right: 1px solid var(--border);
|
|
28
|
+
display: flex;
|
|
29
|
+
flex-direction: column;
|
|
30
|
+
overflow: hidden;
|
|
31
|
+
transition: width 0.2s ease, opacity 0.2s ease;
|
|
32
|
+
}
|
|
33
|
+
#sidebar.sidebar-collapsed {
|
|
34
|
+
width: 0;
|
|
35
|
+
opacity: 0;
|
|
36
|
+
pointer-events: none;
|
|
37
|
+
}
|
|
38
|
+
.sidebar-toggle-btn {
|
|
39
|
+
position: absolute;
|
|
40
|
+
top: 10px;
|
|
41
|
+
left: 268px;
|
|
42
|
+
z-index: 10;
|
|
43
|
+
background: var(--surface);
|
|
44
|
+
border: 1px solid var(--border);
|
|
45
|
+
border-radius: 4px;
|
|
46
|
+
color: var(--dim);
|
|
47
|
+
cursor: pointer;
|
|
48
|
+
font-size: 14px;
|
|
49
|
+
padding: 4px 8px;
|
|
50
|
+
line-height: 1;
|
|
51
|
+
}
|
|
52
|
+
.sidebar-toggle-btn:hover {
|
|
53
|
+
background: rgba(255,255,255,0.05);
|
|
54
|
+
color: var(--text);
|
|
55
|
+
}#sidebar.sidebar-collapsed + .sidebar-toggle-btn,
|
|
56
|
+
.sidebar-toggle-btn {
|
|
57
|
+
transition: left 0.2s ease;
|
|
58
|
+
}
|
|
59
|
+
#sidebar h2 {
|
|
60
|
+
padding: 12px 16px;
|
|
61
|
+
font-size: 14px;
|
|
62
|
+
color: var(--accent);
|
|
63
|
+
border-bottom: 1px solid var(--border);
|
|
64
|
+
display: flex;
|
|
65
|
+
align-items: center;
|
|
66
|
+
justify-content: space-between;
|
|
67
|
+
}
|
|
68
|
+
.icon-btn {
|
|
69
|
+
background: none;
|
|
70
|
+
border: 1px solid var(--border);
|
|
71
|
+
border-radius: 4px;
|
|
72
|
+
color: var(--dim);
|
|
73
|
+
cursor: pointer;
|
|
74
|
+
font-size: 12px;
|
|
75
|
+
padding: 2px 8px;
|
|
76
|
+
line-height: 1;
|
|
77
|
+
}
|
|
78
|
+
.icon-btn:hover {
|
|
79
|
+
background: rgba(255,255,255,0.05);
|
|
80
|
+
color: var(--text);
|
|
81
|
+
}
|
|
82
|
+
#toggle-offline-btn.active {
|
|
83
|
+
color: var(--accent);
|
|
84
|
+
border-color: var(--accent);
|
|
85
|
+
}
|
|
86
|
+
.section-heading {
|
|
87
|
+
display: flex;
|
|
88
|
+
align-items: center;
|
|
89
|
+
justify-content: space-between;
|
|
90
|
+
padding: 8px 8px 4px;
|
|
91
|
+
}
|
|
92
|
+
.section-heading h3 {
|
|
93
|
+
margin: 0;
|
|
94
|
+
}
|
|
95
|
+
.join-toggle-btn {
|
|
96
|
+
width: 100%;
|
|
97
|
+
background: none;
|
|
98
|
+
border: 1px dashed var(--border);
|
|
99
|
+
border-radius: 6px;
|
|
100
|
+
color: var(--dim);
|
|
101
|
+
cursor: pointer;
|
|
102
|
+
font-size: 12px;
|
|
103
|
+
padding: 6px;
|
|
104
|
+
text-align: center;
|
|
105
|
+
}
|
|
106
|
+
.join-toggle-btn:hover {
|
|
107
|
+
background: rgba(255,255,255,0.03);
|
|
108
|
+
color: var(--text);
|
|
109
|
+
}
|
|
110
|
+
.sidebar-section {
|
|
111
|
+
flex: 1;
|
|
112
|
+
overflow-y: auto;
|
|
113
|
+
padding: 8px;
|
|
114
|
+
}
|
|
115
|
+
.sidebar-section h3 {
|
|
116
|
+
font-size: 11px;
|
|
117
|
+
text-transform: uppercase;
|
|
118
|
+
color: var(--dim);
|
|
119
|
+
padding: 8px 8px 4px;
|
|
120
|
+
}
|
|
121
|
+
.room-item, .agent-item {
|
|
122
|
+
padding: 6px 10px;
|
|
123
|
+
border-radius: 6px;
|
|
124
|
+
cursor: pointer;
|
|
125
|
+
font-size: 13px;
|
|
126
|
+
display: flex;
|
|
127
|
+
align-items: center;
|
|
128
|
+
gap: 6px;
|
|
129
|
+
}
|
|
130
|
+
.room-item:hover, .agent-item:hover { background: rgba(255,255,255,0.05); }
|
|
131
|
+
.room-item.active { background: var(--border); }
|
|
132
|
+
.status-dot {
|
|
133
|
+
width: 8px; height: 8px;
|
|
134
|
+
border-radius: 50%;
|
|
135
|
+
display: inline-block;
|
|
136
|
+
}
|
|
137
|
+
.status-dot.active { background: var(--green); }
|
|
138
|
+
.status-dot.idle { background: var(--yellow); }
|
|
139
|
+
.status-dot.busy { background: var(--red); }
|
|
140
|
+
.status-dot.offline { background: var(--dim); }
|
|
141
|
+
#main {
|
|
142
|
+
flex: 1;
|
|
143
|
+
display: flex;
|
|
144
|
+
flex-direction: column;
|
|
145
|
+
overflow: hidden;
|
|
146
|
+
}
|
|
147
|
+
#header {
|
|
148
|
+
padding: 12px 20px;
|
|
149
|
+
border-bottom: 1px solid var(--border);
|
|
150
|
+
font-size: 15px;
|
|
151
|
+
font-weight: 600;
|
|
152
|
+
background: var(--surface);
|
|
153
|
+
}
|
|
154
|
+
#messages {
|
|
155
|
+
flex: 1;
|
|
156
|
+
overflow-y: auto;
|
|
157
|
+
padding: 16px 20px;
|
|
158
|
+
display: flex;
|
|
159
|
+
flex-direction: column;
|
|
160
|
+
gap: 4px;
|
|
161
|
+
}
|
|
162
|
+
.msg {
|
|
163
|
+
font-size: 13px;
|
|
164
|
+
line-height: 1.5;
|
|
165
|
+
}
|
|
166
|
+
.msg .sender { font-weight: 600; color: var(--accent); }
|
|
167
|
+
.msg .time { color: var(--dim); font-size: 11px; margin-left: 8px; }
|
|
168
|
+
.msg.system { color: var(--dim); font-style: italic; }
|
|
169
|
+
.msg.status { color: var(--yellow); font-size: 12px; }
|
|
170
|
+
.msg.dm { color: var(--purple); }
|
|
171
|
+
.msg .dm-badge {
|
|
172
|
+
background: var(--purple);
|
|
173
|
+
color: #fff;
|
|
174
|
+
font-size: 10px;
|
|
175
|
+
padding: 1px 5px;
|
|
176
|
+
border-radius: 3px;
|
|
177
|
+
font-weight: 600;
|
|
178
|
+
}
|
|
179
|
+
#input-bar {
|
|
180
|
+
display: flex;
|
|
181
|
+
padding: 12px 20px;
|
|
182
|
+
gap: 8px;
|
|
183
|
+
background: var(--surface);
|
|
184
|
+
border-top: 1px solid var(--border);
|
|
185
|
+
}
|
|
186
|
+
#input {
|
|
187
|
+
flex: 1;
|
|
188
|
+
background: var(--bg);
|
|
189
|
+
border: 1px solid var(--border);
|
|
190
|
+
border-radius: 6px;
|
|
191
|
+
padding: 8px 12px;
|
|
192
|
+
color: var(--text);
|
|
193
|
+
font-size: 13px;
|
|
194
|
+
outline: none;
|
|
195
|
+
}
|
|
196
|
+
#input:focus { border-color: var(--accent); }
|
|
197
|
+
#send-btn {
|
|
198
|
+
background: var(--accent);
|
|
199
|
+
border: none;
|
|
200
|
+
border-radius: 6px;
|
|
201
|
+
padding: 8px 16px;
|
|
202
|
+
color: #fff;
|
|
203
|
+
font-weight: 600;
|
|
204
|
+
cursor: pointer;
|
|
205
|
+
}
|
|
206
|
+
#send-btn:hover { opacity: 0.9; }
|
|
207
|
+
.leave-btn {
|
|
208
|
+
background: none;
|
|
209
|
+
border: 1px solid var(--border);
|
|
210
|
+
border-radius: 4px;
|
|
211
|
+
color: var(--dim);
|
|
212
|
+
cursor: pointer;
|
|
213
|
+
font-size: 12px;
|
|
214
|
+
padding: 4px 10px;
|
|
215
|
+
}
|
|
216
|
+
.leave-btn:hover {
|
|
217
|
+
background: rgba(255,255,255,0.05);
|
|
218
|
+
color: var(--text);
|
|
219
|
+
}
|
|
220
|
+
.create-room-form {
|
|
221
|
+
display: flex;
|
|
222
|
+
flex-direction: column;
|
|
223
|
+
gap: 6px;
|
|
224
|
+
padding: 8px;
|
|
225
|
+
}
|
|
226
|
+
.create-room-form label {
|
|
227
|
+
display: flex;
|
|
228
|
+
flex-direction: column;
|
|
229
|
+
gap: 2px;
|
|
230
|
+
font-size: 11px;
|
|
231
|
+
color: var(--dim);
|
|
232
|
+
}
|
|
233
|
+
.create-room-form input,
|
|
234
|
+
.create-room-form select {
|
|
235
|
+
background: var(--bg);
|
|
236
|
+
border: 1px solid var(--border);
|
|
237
|
+
border-radius: 4px;
|
|
238
|
+
color: var(--text);
|
|
239
|
+
font-size: 13px;
|
|
240
|
+
padding: 4px 8px;
|
|
241
|
+
outline: none;
|
|
242
|
+
}
|
|
243
|
+
.create-room-form input:focus,
|
|
244
|
+
.create-room-form select:focus {
|
|
245
|
+
border-color: var(--accent);
|
|
246
|
+
}
|
|
247
|
+
.create-room-btns {
|
|
248
|
+
display: flex;
|
|
249
|
+
gap: 6px;
|
|
250
|
+
}
|
|
251
|
+
.create-room-submit,
|
|
252
|
+
.create-room-cancel,
|
|
253
|
+
.join-submit {
|
|
254
|
+
flex: 1;
|
|
255
|
+
border: none;
|
|
256
|
+
border-radius: 4px;
|
|
257
|
+
cursor: pointer;
|
|
258
|
+
font-size: 12px;
|
|
259
|
+
padding: 6px;
|
|
260
|
+
}
|
|
261
|
+
.create-room-submit,
|
|
262
|
+
.join-submit {
|
|
263
|
+
background: var(--accent);
|
|
264
|
+
color: #fff;
|
|
265
|
+
font-weight: 600;
|
|
266
|
+
}
|
|
267
|
+
.create-room-submit:hover,
|
|
268
|
+
.join-submit:hover {
|
|
269
|
+
opacity: 0.9;
|
|
270
|
+
}
|
|
271
|
+
.create-room-cancel {
|
|
272
|
+
background: none;
|
|
273
|
+
border: 1px solid var(--border);
|
|
274
|
+
color: var(--dim);
|
|
275
|
+
}
|
|
276
|
+
.create-room-cancel:hover {
|
|
277
|
+
color: var(--text);
|
|
278
|
+
background: rgba(255,255,255,0.05);
|
|
279
|
+
}
|
|
280
|
+
.join-form {
|
|
281
|
+
display: flex;
|
|
282
|
+
gap: 6px;
|
|
283
|
+
padding: 4px 0;
|
|
284
|
+
}
|
|
285
|
+
.join-form.hidden {
|
|
286
|
+
display: none;
|
|
287
|
+
}
|
|
288
|
+
.join-input {
|
|
289
|
+
flex: 1;
|
|
290
|
+
background: var(--bg);
|
|
291
|
+
border: 1px solid var(--border);
|
|
292
|
+
border-radius: 4px;
|
|
293
|
+
color: var(--text);
|
|
294
|
+
font-size: 13px;
|
|
295
|
+
padding: 4px 8px;
|
|
296
|
+
outline: none;
|
|
297
|
+
}
|
|
298
|
+
.join-input:focus {
|
|
299
|
+
border-color: var(--accent);
|
|
300
|
+
}
|
|
301
|
+
#empty-state {
|
|
302
|
+
flex: 1;
|
|
303
|
+
display: flex;
|
|
304
|
+
align-items: center;
|
|
305
|
+
justify-content: center;
|
|
306
|
+
color: var(--dim);
|
|
307
|
+
font-size: 14px;
|
|
308
|
+
}
|
|
309
|
+
.project-tree {
|
|
310
|
+
margin-bottom: 8px;
|
|
311
|
+
}
|
|
312
|
+
.tree-directory {
|
|
313
|
+
margin-left: 4px;
|
|
314
|
+
}
|
|
315
|
+
.tree-directory-name {
|
|
316
|
+
display: flex;
|
|
317
|
+
align-items: center;
|
|
318
|
+
padding: 4px 8px;
|
|
319
|
+
font-size: 13px;
|
|
320
|
+
color: var(--dim);
|
|
321
|
+
}
|
|
322
|
+
.tree-folder-toggle {
|
|
323
|
+
cursor: pointer;
|
|
324
|
+
display: flex;
|
|
325
|
+
align-items: center;
|
|
326
|
+
padding: 2px;
|
|
327
|
+
flex-shrink: 0;
|
|
328
|
+
}
|
|
329
|
+
.tree-folder-icon {
|
|
330
|
+
font-size: 12px;
|
|
331
|
+
}
|
|
332
|
+
.tree-directory-label {
|
|
333
|
+
padding: 2px 6px;
|
|
334
|
+
border-radius: 4px;
|
|
335
|
+
margin-left: 2px;
|
|
336
|
+
}
|
|
337
|
+
.tree-directory-label.clickable {
|
|
338
|
+
cursor: pointer;
|
|
339
|
+
}
|
|
340
|
+
.tree-directory-label.clickable:hover {
|
|
341
|
+
background: rgba(255,255,255,0.08);
|
|
342
|
+
color: var(--text);
|
|
343
|
+
}
|
|
344
|
+
.tree-directory-label.active {
|
|
345
|
+
color: var(--accent);
|
|
346
|
+
}
|
|
347
|
+
.tree-children {
|
|
348
|
+
margin-left: 12px;
|
|
349
|
+
}
|
|
350
|
+
.tree-agent {
|
|
351
|
+
margin-left: 8px;
|
|
352
|
+
}
|
|
353
|
+
.tree-section {
|
|
354
|
+
padding: 4px 0;
|
|
355
|
+
}
|
|
356
|
+
.tree-section-heading {
|
|
357
|
+
font-size: 11px;
|
|
358
|
+
text-transform: uppercase;
|
|
359
|
+
color: var(--dim);
|
|
360
|
+
padding: 4px 8px;
|
|
361
|
+
}
|
|
362
|
+
.agent-rename-input {
|
|
363
|
+
background: var(--bg);
|
|
364
|
+
border: 1px solid var(--border);
|
|
365
|
+
border-radius: 4px;
|
|
366
|
+
color: var(--text);
|
|
367
|
+
font-size: 13px;
|
|
368
|
+
padding: 2px 6px;
|
|
369
|
+
outline: none;
|
|
370
|
+
width: 100%;
|
|
371
|
+
}
|
|
372
|
+
.agent-rename-input:focus {
|
|
373
|
+
border-color: var(--accent);
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
/* Relay panel */
|
|
377
|
+
.relay-panel {
|
|
378
|
+
margin-top: 8px;
|
|
379
|
+
border: 1px solid var(--border);
|
|
380
|
+
border-radius: 6px;
|
|
381
|
+
overflow: hidden;
|
|
382
|
+
}
|
|
383
|
+
.relay-collapsed {
|
|
384
|
+
border: none;
|
|
385
|
+
}
|
|
386
|
+
.relay-toggle-btn {
|
|
387
|
+
width: 100%;
|
|
388
|
+
background: none;
|
|
389
|
+
border: 1px dashed var(--border);
|
|
390
|
+
border-radius: 6px;
|
|
391
|
+
color: var(--dim);
|
|
392
|
+
cursor: pointer;
|
|
393
|
+
font-size: 12px;
|
|
394
|
+
padding: 6px;
|
|
395
|
+
text-align: center;
|
|
396
|
+
display: flex;
|
|
397
|
+
align-items: center;
|
|
398
|
+
justify-content: center;
|
|
399
|
+
gap: 6px;
|
|
400
|
+
}
|
|
401
|
+
.relay-toggle-btn:hover {
|
|
402
|
+
background: rgba(255,255,255,0.03);
|
|
403
|
+
color: var(--text);
|
|
404
|
+
}
|
|
405
|
+
.relay-badge {
|
|
406
|
+
font-size: 10px;
|
|
407
|
+
}
|
|
408
|
+
.relay-badge-green { color: var(--green); }
|
|
409
|
+
.relay-badge-yellow { color: var(--yellow); }
|
|
410
|
+
.relay-count {
|
|
411
|
+
background: var(--accent);
|
|
412
|
+
color: #fff;
|
|
413
|
+
font-size: 10px;
|
|
414
|
+
padding: 1px 5px;
|
|
415
|
+
border-radius: 3px;
|
|
416
|
+
font-weight: 600;
|
|
417
|
+
}
|
|
418
|
+
.relay-header {
|
|
419
|
+
display: flex;
|
|
420
|
+
align-items: center;
|
|
421
|
+
justify-content: space-between;
|
|
422
|
+
padding: 6px 8px;
|
|
423
|
+
background: rgba(255,255,255,0.03);
|
|
424
|
+
border-bottom: 1px solid var(--border);
|
|
425
|
+
}
|
|
426
|
+
.relay-title {
|
|
427
|
+
font-size: 11px;
|
|
428
|
+
text-transform: uppercase;
|
|
429
|
+
color: var(--dim);
|
|
430
|
+
}
|
|
431
|
+
.relay-collapse-btn {
|
|
432
|
+
background: none;
|
|
433
|
+
border: none;
|
|
434
|
+
color: var(--dim);
|
|
435
|
+
cursor: pointer;
|
|
436
|
+
font-size: 12px;
|
|
437
|
+
padding: 0 2px;
|
|
438
|
+
}
|
|
439
|
+
.relay-collapse-btn:hover {
|
|
440
|
+
color: var(--text);
|
|
441
|
+
}
|
|
442
|
+
.relay-form {
|
|
443
|
+
display: flex;
|
|
444
|
+
flex-direction: column;
|
|
445
|
+
gap: 6px;
|
|
446
|
+
padding: 8px;
|
|
447
|
+
}
|
|
448
|
+
.relay-label {
|
|
449
|
+
display: flex;
|
|
450
|
+
flex-direction: column;
|
|
451
|
+
gap: 2px;
|
|
452
|
+
font-size: 11px;
|
|
453
|
+
color: var(--dim);
|
|
454
|
+
position: relative;
|
|
455
|
+
}
|
|
456
|
+
.relay-input {
|
|
457
|
+
background: var(--bg);
|
|
458
|
+
border: 1px solid var(--border);
|
|
459
|
+
border-radius: 4px;
|
|
460
|
+
color: var(--text);
|
|
461
|
+
font-size: 12px;
|
|
462
|
+
padding: 4px 8px;
|
|
463
|
+
outline: none;
|
|
464
|
+
font-family: monospace;
|
|
465
|
+
}
|
|
466
|
+
.relay-input:focus {
|
|
467
|
+
border-color: var(--accent);
|
|
468
|
+
}
|
|
469
|
+
.relay-input:disabled {
|
|
470
|
+
opacity: 0.5;
|
|
471
|
+
}
|
|
472
|
+
.relay-status-dot {
|
|
473
|
+
position: absolute;
|
|
474
|
+
right: 8px;
|
|
475
|
+
top: 50%;
|
|
476
|
+
transform: translateY(25%);
|
|
477
|
+
width: 8px;
|
|
478
|
+
height: 8px;
|
|
479
|
+
border-radius: 50%;
|
|
480
|
+
background: var(--dim);
|
|
481
|
+
}
|
|
482
|
+
.relay-status-dot.active {
|
|
483
|
+
background: var(--green);
|
|
484
|
+
}
|
|
485
|
+
.relay-actions {
|
|
486
|
+
display: flex;
|
|
487
|
+
gap: 6px;
|
|
488
|
+
}
|
|
489
|
+
.relay-connect-btn,
|
|
490
|
+
.relay-disconnect-btn {
|
|
491
|
+
flex: 1;
|
|
492
|
+
border: none;
|
|
493
|
+
border-radius: 4px;
|
|
494
|
+
cursor: pointer;
|
|
495
|
+
font-size: 12px;
|
|
496
|
+
padding: 6px;
|
|
497
|
+
font-weight: 600;
|
|
498
|
+
}
|
|
499
|
+
.relay-connect-btn {
|
|
500
|
+
background: var(--accent);
|
|
501
|
+
color: #fff;
|
|
502
|
+
}
|
|
503
|
+
.relay-connect-btn:disabled {
|
|
504
|
+
opacity: 0.5;
|
|
505
|
+
cursor: not-allowed;
|
|
506
|
+
}
|
|
507
|
+
.relay-connect-btn:hover:not(:disabled) {
|
|
508
|
+
opacity: 0.9;
|
|
509
|
+
}
|
|
510
|
+
.relay-disconnect-btn {
|
|
511
|
+
background: var(--red);
|
|
512
|
+
color: #fff;
|
|
513
|
+
}
|
|
514
|
+
.relay-disconnect-btn:hover {
|
|
515
|
+
opacity: 0.9;
|
|
516
|
+
}
|
|
517
|
+
.relay-stats {
|
|
518
|
+
display: flex;
|
|
519
|
+
flex-wrap: wrap;
|
|
520
|
+
gap: 8px;
|
|
521
|
+
padding: 6px 8px;
|
|
522
|
+
border-top: 1px solid var(--border);
|
|
523
|
+
}
|
|
524
|
+
.relay-stat {
|
|
525
|
+
font-size: 10px;
|
|
526
|
+
color: var(--dim);
|
|
527
|
+
}
|
|
528
|
+
.relay-errors {
|
|
529
|
+
padding: 6px 8px;
|
|
530
|
+
border-top: 1px solid var(--border);
|
|
531
|
+
}
|
|
532
|
+
.relay-error {
|
|
533
|
+
font-size: 10px;
|
|
534
|
+
color: var(--red);
|
|
535
|
+
line-height: 1.4;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
/* Connect prompt */
|
|
539
|
+
.connect-prompt {
|
|
540
|
+
display: flex;
|
|
541
|
+
flex-direction: column;
|
|
542
|
+
align-items: center;
|
|
543
|
+
justify-content: center;
|
|
544
|
+
gap: 12px;
|
|
545
|
+
padding: 32px;
|
|
546
|
+
text-align: center;
|
|
547
|
+
color: var(--dim);
|
|
548
|
+
}
|
|
549
|
+
.connect-prompt p {
|
|
550
|
+
margin: 0;
|
|
551
|
+
}
|
|
552
|
+
.connect-btn {
|
|
553
|
+
padding: 8px 20px;
|
|
554
|
+
border: 1px solid var(--accent);
|
|
555
|
+
background: transparent;
|
|
556
|
+
color: var(--accent);
|
|
557
|
+
border-radius: 4px;
|
|
558
|
+
cursor: pointer;
|
|
559
|
+
font-size: 14px;
|
|
560
|
+
}
|
|
561
|
+
.connect-btn:hover {
|
|
562
|
+
background: var(--accent);
|
|
563
|
+
color: var(--bg);
|
|
564
|
+
}
|
|
565
|
+
`}));var H,k,ye,Ue,ee=0,Ge=[],w=g,Be=w.__b,Je=w.__r,Oe=w.diffed,Ve=w.__c,qe=w.unmount,Ke=w.__;function be(e,n){w.__h&&w.__h(k,e,ee||n),ee=0;var t=k.__H||(k.__H={__:[],__h:[]});return e>=t.__.length&&t.__.push({}),t.__[e]}function b(e){return ee=1,qn(Ze,e)}function qn(e,n,t){var o=be(H++,2);if(o.t=e,!o.__c&&(o.__=[t?t(n):Ze(void 0,n),function(d){var u=o.__N?o.__N[0]:o.__[0],l=o.t(u,d);u!==l&&(o.__N=[l,o.__[1]],o.__c.setState({}))}],o.__c=k,!k.__f)){var s=function(d,u,l){if(!o.__c.__H)return!0;var p=!1,f=o.__c.props!==d;if(o.__c.__H.__.some(function(m){if(m.__N){p=!0;var y=m.__[0];m.__=m.__N,m.__N=void 0,y!==m.__[0]&&(f=!0)}}),r){var i=r.call(this,d,u,l);return p?i||f:i}return!p||f};k.__f=!0;var r=k.shouldComponentUpdate,c=k.componentWillUpdate;k.componentWillUpdate=function(d,u,l){if(this.__e){var p=r;r=void 0,s(d,u,l),r=p}c&&c.call(this,d,u,l)},k.shouldComponentUpdate=s}return o.__N||o.__}function ne(e,n){var t=be(H++,3);!w.__s&&Ye(t.__H,n)&&(t.__=e,t.u=n,k.__H.__h.push(t))}function Qe(e){return ee=5,Kn(function(){return{current:e}},[])}function Kn(e,n){var t=be(H++,7);return Ye(t.__H,n)&&(t.__=e(),t.__H=n,t.__h=e),t.__}function Xn(){for(var e;e=Ge.shift();){var n=e.__H;if(e.__P&&n)try{n.__h.some(Z),n.__h.some(ve),n.__h=[]}catch(t){n.__h=[],w.__e(t,e.__v)}}}w.__b=function(e){k=null,Be&&Be(e)},w.__=function(e,n){e&&n.__k&&n.__k.__m&&(e.__m=n.__k.__m),Ke&&Ke(e,n)},w.__r=function(e){Je&&Je(e),H=0;var n=(k=e.__c).__H;n&&(ye===k?(n.__h=[],k.__h=[],n.__.some(function(t){t.__N&&(t.__=t.__N),t.u=t.__N=void 0})):(n.__h.some(Z),n.__h.some(ve),n.__h=[],H=0)),ye=k},w.diffed=function(e){Oe&&Oe(e);var n=e.__c;n&&n.__H&&(n.__H.__h.length&&(Ge.push(n)!==1&&Ue===w.requestAnimationFrame||((Ue=w.requestAnimationFrame)||Gn)(Xn)),n.__H.__.some(function(t){t.u&&(t.__H=t.u,t.u=void 0)})),ye=k=null},w.__c=function(e,n){n.some(function(t){try{t.__h.some(Z),t.__h=t.__h.filter(function(o){return!o.__||ve(o)})}catch(o){n.some(function(s){s.__h&&(s.__h=[])}),n=[],w.__e(o,t.__v)}}),Ve&&Ve(e,n)},w.unmount=function(e){qe&&qe(e);var n,t=e.__c;t&&t.__H&&(t.__H.__.some(function(o){try{Z(o)}catch(s){n=s}}),t.__H=void 0,n&&w.__e(n,t.__v))};var Xe=typeof requestAnimationFrame=="function";function Gn(e){var n,t=function(){clearTimeout(o),Xe&&cancelAnimationFrame(n),setTimeout(e)},o=setTimeout(t,35);Xe&&(n=requestAnimationFrame(t))}function Z(e){var n=k,t=e.__c;typeof t=="function"&&(e.__c=void 0,t()),k=n}function ve(e){var n=k;e.__c=e.__(),k=n}function Ye(e,n){return!e||e.length!==n.length||n.some(function(t,o){return t!==e[o]})}function Ze(e,n){return typeof n=="function"?n(e):n}function en(e,n,t){let o=e.querySelector(n);if(!o)throw new Error(`Required element not found: ${n}`);if(t&&o.tagName.toLowerCase()!==t)throw new Error(`Element ${n} must be <${t}>, got <${o.tagName.toLowerCase()}>`);return o}function xe(e){return e.slice(11,19)}function M(e){let n=e.target;if(n instanceof HTMLInputElement||n instanceof HTMLSelectElement)return n;throw new Error("Event target is not an input element")}function nn(e){if(e.kind!=="action")return null;let n=e.action;return n.action==="join_room"?{kind:"join_room",room:n.room}:n.action==="leave_room"?{kind:"leave_room"}:null}function te(e,n,t){let o=e.trim();return o.length===0?{kind:"ignored"}:o.startsWith("/")?Qn(o,n):n?{kind:"action",action:{action:"send",target:n,content:o}}:t?{kind:"action",action:{action:"dm",target:t,content:o}}:{kind:"local",result:{type:"error",text:"Join a room or select an agent first"}}}function Qn(e,n){let t=e.slice(1).split(/\s+/),o=(t[0]??"").toLowerCase();switch(o){case"join":return t[1]?{kind:"action",action:{action:"join_room",room:t[1]}}:{kind:"local",result:{type:"error",text:"Usage: /join <room>"}};case"leave":return{kind:"action",action:{action:"leave_room",room:t[1]??n??""}};case"rooms":return{kind:"action",action:{action:"list_rooms"}};case"agents":return{kind:"action",action:{action:"list_agents"}};case"dm":return!t[1]||!t[2]?{kind:"local",result:{type:"error",text:"Usage: /dm <agent> <message>"}}:{kind:"action",action:{action:"dm",target:t[1],content:t.slice(2).join(" ")}};case"create":return t[1]?{kind:"action",action:{action:"create_room",name:t[1],type:"public"}}:{kind:"local",result:{type:"error",text:"Usage: /create <name>"}};case"destroy":return t[1]?{kind:"action",action:{action:"destroy_room",room:t[1]}}:{kind:"local",result:{type:"error",text:"Usage: /destroy <room>"}};case"rename":return!t[1]||!t[2]?{kind:"local",result:{type:"error",text:"Usage: /rename <agent> <new-name>"}}:{kind:"action",action:{action:"rename_agent",agent:t[1],name:t.slice(2).join(" ")}};case"help":return{kind:"local",result:{type:"help",text:"Commands: /join, /leave, /rooms, /agents, /dm, /create, /destroy, /rename, /help"}};default:return{kind:"local",result:{type:"unknown",text:`Unknown command: /${o}`}}}}var Yn=0;function a(e,n,t,o,s,r){n||(n={});var c,d,u=n;if("ref"in u)for(d in u={},n)d=="ref"?c=n[d]:u[d]=n[d];var l={type:e,props:u,key:t,ref:c,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--Yn,__i:-1,__u:0,__source:s,__self:r};if(typeof e=="function"&&(c=e.defaultProps))for(d in c)u[d]===void 0&&(u[d]=c[d]);return g.vnode&&g.vnode(l),l}function tn({message:e}){switch(e.type){case"chat":return a("div",{class:"msg",children:[a("span",{class:"sender",children:e.sender}),a("span",{class:"time",children:xe(e.timestamp)}),":"," ",e.content]});case"dm":return a("div",{class:"msg dm",children:[a("span",{class:"dm-badge",children:"DM"})," ",a("span",{class:"sender",children:e.sender}),a("span",{class:"time",children:xe(e.timestamp)}),":"," ",e.content]});case"system":return a("div",{class:"msg system",children:e.text});case"status":return a("div",{class:"msg status",children:e.text})}}function on({messages:e}){let n=Qe(null);return ne(()=>{n.current&&(n.current.scrollTop=n.current.scrollHeight)},[e.length]),a("div",{id:"messages",ref:n,children:e.map((t,o)=>a(tn,{message:t},o))})}function rn({messages:e,currentRoom:n,dmTarget:t,connected:o,onSendAction:s,onLeaveRoom:r,onConnectToMesh:c}){let[d,u]=b(""),l=n??(t?`DM with ${t}`:"Select a room"),p=()=>{let i=d.trim();if(!i)return;switch(te(i,n,t).kind){case"action":s(i);break;case"local":s(i);break;case"ignored":break}u("")},f=i=>{i.key==="Enter"&&p()};return a("div",{id:"main",children:[a("div",{id:"header",children:[l,n&&a("button",{class:"leave-btn",onClick:r,children:"Leave"})]}),a(on,{messages:e}),!o&&e.length===0&&a("div",{class:"connect-prompt",children:[a("p",{children:"Connect to a local mesh to discover agents and rooms."}),a("button",{class:"connect-btn",onClick:c,children:"Connect to local mesh"})]}),a("div",{id:"input-bar",children:[a("input",{id:"input",type:"text",placeholder:"Type a message or /command...",autocomplete:"off",value:d,onInput:i=>{u(M(i).value)},onKeyDown:f}),a("button",{id:"send-btn",onClick:p,children:"Send"})]})]})}function an(e,n,t){let[o,...s]=n;if(o===void 0){e.agents.push(t);return}let r=e.children.get(o);r||(r={children:new Map,agents:[]},e.children.set(o,r)),an(r,s,t)}function cn(e,n){let[t,...o]=n;if(t===void 0)return;let s=e.children.get(t);s||(s={children:new Map,agents:[]},e.children.set(t,s)),cn(s,o)}var ln="Project room for ";function sn(e){return e.description.startsWith(ln)}function Zn(e){return e.description.slice(ln.length)}function dn(e,n){let t=n.filter(p=>!sn(p)),o=new Map;for(let p of n)sn(p)&&o.set(Zn(p),p);let s=new Set;for(let p of e)s.add(p.cwd);for(let p of o.keys())s.add(p);if(s.size===0)return{roots:[],manualRooms:t};let r=Array.from(s),c=nt(r),d=c==="/"?[]:oe(c),u={children:new Map,agents:[]};for(let p of e){let f=oe(p.cwd).slice(d.length);an(u,f,p)}for(let p of o.keys()){let f=oe(p).slice(d.length);cn(u,f)}let l=pn(u,c,"",o);return{roots:un(l),manualRooms:t}}function oe(e){return e.split("/").filter(n=>n.length>0)}function et(...e){return"/"+e.join("/")}function nt(e){if(e.length===0)return"/";let n=e.map(oe),t=Math.min(...n.map(s=>s.length)),o=0;for(let s=0;s<t;s++){let r=n[0]?.[s];if(r===void 0)break;if(n.every(c=>c[s]===r))o++;else break}return o>0&&o--,o===0?"/":et(...n[0]?.slice(0,o)??[])}function pn(e,n,t,o){let s=[];for(let[r,c]of e.children){let d=t===""&&n==="/"?"/"+r:t===""?n+"/"+r:t+"/"+r,u=pn(c,n,d,o);if(u.length>0){let l=o.get(d);s.push({type:"directory",name:r,path:d,...l?{roomId:l.id}:{},children:un(u)})}}for(let r of e.agents)s.push({type:"agent",name:r.name,agentId:r.id,status:r.status,cwd:r.cwd});return s}function un(e){return[...e].sort((n,t)=>n.type!==t.type?n.type==="directory"?-1:1:n.name.localeCompare(t.name))}function mn({visible:e,onSubmit:n,onCancel:t}){let[o,s]=b(""),[r,c]=b("public"),[d,u]=b("");return e?a("div",{id:"create-room-form",class:"visible",children:a("form",{class:"create-room-form",onSubmit:p=>{p.preventDefault(),o.trim()&&(n(o.trim(),r,d.trim()),s(""),c("public"),u(""))},children:[a("label",{children:["Room name",a("input",{type:"text",name:"room-name",required:!0,placeholder:"e.g. project-alpha",value:o,onInput:p=>{s(M(p).value)}})]}),a("label",{children:["Type",a("select",{name:"room-type",value:r,onChange:p=>{let f=M(p).value;(f==="public"||f==="private"||f==="secret")&&c(f)},children:[a("option",{value:"public",children:"Public"}),a("option",{value:"private",children:"Private"}),a("option",{value:"secret",children:"Secret"})]})]}),a("label",{children:["Description (optional)",a("input",{type:"text",name:"room-description",placeholder:"What is this room about?",value:d,onInput:p=>{u(M(p).value)}})]}),a("div",{class:"create-room-btns",children:[a("button",{type:"submit",class:"create-room-submit",children:"Create"}),a("button",{type:"button",class:"create-room-cancel",onClick:t,children:"Cancel"})]})]})}):null}function fn({visible:e,onSubmit:n,onCancel:t}){let[o,s]=b("");if(!e)return a("div",{id:"join-form",class:"join-form hidden"});let r=()=>{let d=o.trim();d&&(n(d),s(""))};return a("div",{id:"join-form",class:"join-form",children:[a("input",{class:"join-input",type:"text",placeholder:"Room name...",autocomplete:"off",value:o,onInput:d=>{s(M(d).value)},onKeyDown:d=>{d.key==="Enter"&&r(),d.key==="Escape"&&t()}}),a("button",{class:"join-submit",onClick:r,children:"Join"})]})}function _n({tree:e,onJoinRoom:n,onSelectAgent:t,onRenameAgent:o,currentRoom:s}){return a("div",{id:"room-list",class:"project-tree",children:[e.roots.map(r=>a(gn,{node:r,onJoinRoom:n,onSelectAgent:t,onRenameAgent:o,currentRoom:s})),e.manualRooms.length>0&&a("div",{class:"tree-section",children:[a("h3",{class:"tree-section-heading",children:"Rooms"}),e.manualRooms.map(r=>a("div",{class:"room-item"+(s===r.id?" active":""),onClick:()=>{n(r.id)},children:[a("span",{children:r.name}),a("span",{children:["(",String(r.members.length),")"]})]},r.id))]})]})}function gn({node:e,onJoinRoom:n,onSelectAgent:t,onRenameAgent:o,currentRoom:s}){return e.type==="agent"?a(ot,{node:e,onSelectAgent:t,onRenameAgent:o}):a(tt,{node:e,onJoinRoom:n,onSelectAgent:t,onRenameAgent:o,currentRoom:s})}function tt({node:e,onJoinRoom:n,onSelectAgent:t,onRenameAgent:o,currentRoom:s}){let[r,c]=b(!0),d=e.roomId!==void 0,u=s===e.roomId;return a("div",{class:"tree-directory",children:[a("div",{class:"tree-directory-name",children:[a("span",{class:"tree-folder-toggle",title:"Expand/collapse",onClick:l=>{l.stopPropagation(),c(!r)},children:a("span",{class:"tree-folder-icon",children:r?"\u{1F4C2}":"\u{1F4C1}"})}),a("span",{class:`tree-directory-label${u?" active":""}${d?" clickable":""}`,onClick:()=>{e.roomId&&n(e.roomId)},children:e.name})]}),r&&a("div",{class:"tree-children",children:e.children.map(l=>a(gn,{node:l,onJoinRoom:n,onSelectAgent:t,onRenameAgent:o,currentRoom:s},l.type==="agent"?l.agentId:l.path))})]})}function ot({node:e,onSelectAgent:n,onRenameAgent:t}){let[o,s]=b(!1),[r,c]=b(""),d=()=>{c(e.name),s(!0)},u=()=>{let p=r.trim();p&&p!==e.name&&t(e.agentId,p),s(!1)},l=p=>{p.key==="Enter"&&u(),p.key==="Escape"&&s(!1)};return o?a("div",{class:"tree-agent agent-item editing",children:[a("span",{class:`status-dot ${e.status}`}),a("input",{class:"agent-rename-input",type:"text",value:r,autofocus:!0,onInput:p=>{c(M(p).value)},onKeyDown:l,onBlur:u})]}):a("div",{class:"tree-agent agent-item",onClick:()=>{n(e.agentId)},onDblClick:d,children:[a("span",{class:`status-dot ${e.status}`}),a("span",{children:e.name})]})}function hn({status:e,onConnect:n,onDisconnect:t}){let[o,s]=b(e.urlA??"ws://localhost:8080/ws/mesh"),[r,c]=b(e.urlB??"ws://localhost:8081/ws/mesh"),[d,u]=b(!1),l=e.connectedA&&e.connectedB,p=e.connectedA||e.connectedB;return ne(()=>{e.urlA&&s(e.urlA),e.urlB&&c(e.urlB)},[e.urlA,e.urlB]),d?a("div",{class:"relay-panel",children:[a("div",{class:"relay-header",children:[a("span",{class:"relay-title",children:"Mesh Relay"}),a("button",{class:"relay-collapse-btn",onClick:()=>{u(!1)},title:"Collapse relay panel",children:"\u2715"})]}),a("form",{class:"relay-form",onSubmit:i=>{i.preventDefault(),o.trim()&&r.trim()&&n(o.trim(),r.trim())},children:[a("label",{class:"relay-label",children:["Mesh A",a("input",{type:"url",class:"relay-input",placeholder:"ws://machine-a:8080/ws/mesh",value:o,onInput:i=>{let m=i.target;m instanceof HTMLInputElement&&s(m.value)},disabled:p}),a("span",{class:`relay-status-dot ${e.connectedA?"active":""}`})]}),a("label",{class:"relay-label",children:["Mesh B",a("input",{type:"url",class:"relay-input",placeholder:"ws://machine-b:8080/ws/mesh",value:r,onInput:i=>{let m=i.target;m instanceof HTMLInputElement&&c(m.value)},disabled:p}),a("span",{class:`relay-status-dot ${e.connectedB?"active":""}`})]}),a("div",{class:"relay-actions",children:p?a("button",{type:"button",class:"relay-disconnect-btn",onClick:t,children:"Disconnect"}):a("button",{type:"submit",class:"relay-connect-btn",disabled:!o.trim()||!r.trim(),children:"Connect"})})]}),p&&a("div",{class:"relay-stats",children:[a("span",{class:"relay-stat",children:["Forwarded: ",e.forwardedCount]}),a("span",{class:"relay-stat",children:["A: ",e.connectedA?"connected":"disconnected"]}),a("span",{class:"relay-stat",children:["B: ",e.connectedB?"connected":"disconnected"]})]}),e.errors.length>0&&a("div",{class:"relay-errors",children:e.errors.slice(-3).map((i,m)=>a("div",{class:"relay-error",children:i},m))})]}):a("div",{class:"relay-panel relay-collapsed",children:a("button",{class:"relay-toggle-btn",onClick:()=>{u(!0)},children:["\u293A Relay",l&&a("span",{class:"relay-badge relay-badge-green",children:"\u25CF"}),p&&!l&&a("span",{class:"relay-badge relay-badge-yellow",children:"\u25CF"}),e.forwardedCount>0&&a("span",{class:"relay-count",children:e.forwardedCount})]})})}function yn({rooms:e,agents:n,currentRoom:t,relayStatus:o,collapsed:s,onJoinRoom:r,onSelectAgent:c,onRenameAgent:d,onCreateRoom:u,onJoinRoomInput:l,onRelayConnect:p,onRelayDisconnect:f}){let[i,m]=b(!1),[y,S]=b(!1),[v,x]=b(!1),_=v?n:n.filter(R=>R.status!=="offline"),A=dn(_,e);return a("div",{id:"sidebar",class:s?"sidebar-collapsed":"",children:[a("h2",{children:["Agent Comms",a("button",{id:"toggle-offline-btn",class:`icon-btn${v?" active":""}`,title:`${v?"Hide":"Show"} offline agents`,onClick:()=>{x(R=>!R)},children:v?"\u25C9":"\u25CE"})]}),a("div",{class:"sidebar-section",children:[a(_n,{tree:A,onJoinRoom:r,onSelectAgent:c,onRenameAgent:d,currentRoom:t}),a("div",{class:"section-heading",children:[a("h3",{children:"Create"}),a("button",{id:"create-room-toggle",class:"icon-btn",title:"Create room",onClick:()=>{m(R=>!R)},children:"+"})]}),a(mn,{visible:i,onSubmit:(R,j,N)=>{u(R,j,N),m(!1)},onCancel:()=>{m(!1)}}),a("button",{id:"join-toggle-btn",class:"join-toggle-btn",onClick:()=>{S(R=>!R)},children:"+ Join Room"}),a(fn,{visible:y,onSubmit:R=>{l(R),S(!1)},onCancel:()=>{S(!1)}}),a(hn,{status:o,onConnect:p,onDisconnect:f})]})]})}function vn(e){let[n,t]=b(!1);return a(I,{children:[a("button",{id:"sidebar-toggle",class:"sidebar-toggle-btn",title:n?"Expand sidebar":"Collapse sidebar",onClick:()=>{t(o=>!o)},children:n?"\u2630":"\u2715"}),a(yn,{rooms:e.rooms,agents:e.agents,currentRoom:e.currentRoom,relayStatus:e.relayStatus,collapsed:n,onJoinRoom:e.onJoinRoom,onSelectAgent:e.onSelectAgent,onRenameAgent:e.onRenameAgent,onCreateRoom:e.onCreateRoom,onJoinRoomInput:e.onJoinRoomInput,onRelayConnect:e.onRelayConnect,onRelayDisconnect:e.onRelayDisconnect}),a(rn,{messages:e.messages,currentRoom:e.currentRoom,dmTarget:e.dmTarget,connected:e.connected,onSendAction:e.onSendAction,onLeaveRoom:e.onLeaveRoom,onConnectToMesh:e.onConnectToMesh})]})}function rt(e){return typeof e=="object"&&e!==null}function st(e){return Array.isArray(e)}function it(e){return Array.isArray(e)}function at(e){return Array.isArray(e)}function ct(e){return rt(e)&&typeof e.type=="string"}async function bn(){let n=await(await fetch("/api/agents")).json();if(!st(n))throw new Error("Invalid agents response");return n}async function xn(){let n=await(await fetch("/api/rooms")).json();if(!it(n))throw new Error("Invalid rooms response");return n}async function kn(e,n){let t=n?`/api/rooms/${encodeURIComponent(e)}/messages?since=${encodeURIComponent(n)}`:`/api/rooms/${encodeURIComponent(e)}/messages`,s=await(await fetch(t)).json();if(!at(s))throw new Error("Invalid messages response");return s}var re=class{constructor(n){C(this,"ws");C(this,"reconnectTimer");C(this,"handler");this.handler=n}connect(){let n=location.protocol==="https:"?"wss:":"ws:",t=new WebSocket(`${n}//${location.host}`);this.ws=t,t.onopen=()=>{this.handler.onOpen?.()},t.onclose=()=>{this.handler.onClose?.(),this.scheduleReconnect()},t.onerror=()=>{},t.onmessage=o=>{let s=JSON.parse(typeof o.data=="string"?o.data:String(o.data));ct(s)&&this.handler.onFrame?.(s)}}sendAction(n){let t=this.ws;t?.readyState===WebSocket.OPEN&&t.send(JSON.stringify(n))}disconnect(){this.reconnectTimer!==void 0&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0);let n=this.ws;n&&n.close(),this.ws=void 0}scheduleReconnect(){this.reconnectTimer=setTimeout(()=>{this.connect()},3e3)}};var wn={currentRoom:void 0,dmTarget:void 0,agents:[],rooms:[],messages:[],connected:!1},se=class{constructor(){C(this,"state",{...wn});C(this,"listeners",new Set)}subscribe(n){return this.listeners.add(n),()=>{this.listeners.delete(n)}}get(){return this.state}setCurrentRoom(n){this.state={...this.state,currentRoom:n},this.notify()}setDmTarget(n){this.state={...this.state,dmTarget:n},this.notify()}setAgents(n){this.state={...this.state,agents:n},this.notify()}setRooms(n){this.state={...this.state,rooms:n},this.notify()}setConnected(n){this.state={...this.state,connected:n},this.notify()}addMessage(n){this.state={...this.state,messages:[...this.state.messages,n]},this.notify()}setMessages(n){this.state={...this.state,messages:n},this.notify()}clearMessages(){this.state={...this.state,messages:[]},this.notify()}applyState(n,t){this.state={...this.state,agents:n,rooms:t},this.notify()}reset(){this.state={...wn,messages:[]},this.notify()}notify(){let n=this.state;for(let t of this.listeners)t(n)}};var ie=class{constructor(){C(this,"worker");C(this,"state",{agents:[],rooms:[],connected:!1});C(this,"listeners",new Set);C(this,"actionCounter",0);C(this,"pendingActions",new Map)}connect(){if(this.worker)return;let n=new SharedWorker("./mesh-worker.js");if(this.worker=n,n.port.onmessage=s=>{let r=JSON.parse(typeof s.data=="string"?s.data:String(s.data));if(lt(r))switch(r.type){case"state":{if(!("state"in r)||typeof r.state!="object"||r.state===null||!("agents"in r.state)||!("rooms"in r.state))break;let c=r.state,d=typeof c.agents=="object"&&c.agents!==null?Object.values(c.agents):[],u=typeof c.rooms=="object"&&c.rooms!==null?Object.values(c.rooms):[];this.state={...this.state,agents:d,rooms:u},this.notify();break}case"connected":this.state={...this.state,connected:!0},this.notify();break;case"disconnected":this.state={...this.state,connected:!1},this.notify();break;case"patch":this.postToWorker({type:"getState"});break;case"actionResult":break;case"actionError":break}},n.port.start(),/^(localhost|127\.\d+\.\d+\.\d+)(:\d+)?$/.test(location.host)){let r=`${location.protocol==="https:"?"wss:":"ws:"}//${location.host}/ws/mesh`;this.postToWorker({type:"init",url:r})}else this.probeLocalMesh(19877,10)}get(){return this.state}subscribe(n){return this.listeners.add(n),()=>{this.listeners.delete(n)}}sendAction(n){let t=String(++this.actionCounter);this.postToWorker({type:"action",id:t,action:n})}disconnect(){this.worker&&(this.worker.port.close(),this.worker=void 0),this.pendingActions.clear()}probeLocalMesh(n,t){let o=0,s=r=>{if(o>=t)return;o++;let c=`ws://127.0.0.1:${String(r)}/ws/mesh`;fetch(`http://127.0.0.1:${String(r)}/`,{mode:"no-cors"}).then(()=>{this.postToWorker({type:"init",url:c})}).catch(()=>{s(r+1)})};s(n)}postToWorker(n){this.worker&&this.worker.port.postMessage(JSON.stringify(n))}notify(){let n=this.state;for(let t of this.listeners)t(n)}};function lt(e){return typeof e=="object"&&e!==null&&"type"in e}var ae=class{constructor(){C(this,"worker");C(this,"status",{connectedA:!1,connectedB:!1,urlA:void 0,urlB:void 0,forwardedCount:0,errors:[]});C(this,"listeners",new Set)}connect(){if(this.worker)return;let n=new SharedWorker("./relay-worker.js");this.worker=n,n.port.onmessage=t=>{let o=JSON.parse(typeof t.data=="string"?t.data:String(t.data));dt(o)?(this.status=o.status,this.notify()):pt(o)&&console.error("[RelayClient]",o.message)},n.port.start()}connectRelay(n,t){this.postToWorker({type:"connect",urlA:n,urlB:t})}disconnect(){this.postToWorker({type:"disconnect"})}get(){return this.status}subscribe(n){return this.listeners.add(n),()=>{this.listeners.delete(n)}}destroy(){this.worker&&(this.worker.port.close(),this.worker=void 0)}postToWorker(n){this.worker&&this.worker.port.postMessage(JSON.stringify(n))}notify(){let n=this.status;for(let t of this.listeners)t(n)}};function dt(e){return typeof e=="object"&&e!==null&&"type"in e&&typeof e.type=="string"&&e.type==="status"&&"status"in e}function pt(e){return typeof e=="object"&&e!==null&&"type"in e&&typeof e.type=="string"&&e.type==="error"}var ut=/^(localhost|127\.\d+\.\d+\.\d+)(:\d+)?$/;function Rn(e){return ut.test(e)}function Cn(e){return e.getItem("agent-comms-connected")==="true"}function Sn(e,n){switch(e.type){case"room_message":return n===e.message.room?{type:"chat",sender:e.message.from,content:e.message.content,timestamp:e.message.timestamp}:void 0;case"dm":return{type:"dm",sender:e.message.from,content:e.message.content,timestamp:e.message.timestamp};case"member_joined":return{type:"system",text:`${e.agent} joined ${e.room}`};case"member_left":return{type:"system",text:`${e.agent} left ${e.room}`};case"member_status":return{type:"status",text:`${e.agent} is now ${e.status} in ${e.room}`};case"delivery_status":return{type:"status",text:`Message ${e.messageId} ${e.status} by ${e.agent}`};case"room_members":return n===e.room?{type:"system",text:`Members: ${e.members.map(o=>`${o.name} (${o.status})`).join(", ")}`}:void 0;case"room_invite":{let t=e.roomDescription?` \u2014 ${e.roomDescription}`:"";return{type:"system",text:`${e.fromName} invited you to "${e.room}"${t}`}}case"invite_declined":return{type:"system",text:`${e.agentName} declined invite to ${e.room}: "${e.reason}"`};case"name_changed":return{type:"system",text:`${e.oldName} is now known as ${e.newName}`}}}function An(e){return{type:"chat",sender:e.from,content:e.content,timestamp:e.timestamp}}var mt="Project room for ";function Tn(e){let n=new URLSearchParams(e),t=n.get("room");if(t)return{kind:"room",roomId:t};let o=n.get("dm");if(o)return{kind:"dm",agentId:o};let s=n.get("cwd");if(s)return{kind:"cwd",path:s}}function Mn(e,n){switch(e.kind){case"room":return n.some(t=>t.id===e.roomId)?{kind:"room",targetId:e.roomId}:void 0;case"dm":return{kind:"dm",targetId:e.agentId};case"cwd":{let t=n.find(o=>o.description===`${mt}${e.path}`);return t?{kind:"room",targetId:t.id}:void 0}}}function jn(e){let n=new URL(location.href);n.searchParams.delete("room"),n.searchParams.delete("dm"),n.searchParams.delete("cwd"),e.currentRoom?n.searchParams.set("room",e.currentRoom):e.dmTarget&&n.searchParams.set("dm",e.dmTarget);let t=n.pathname+n.search+n.hash;history.replaceState(null,"",t)}var W=Rn(location.host),ft=en(document,"#root"),h=new se,we=new ie;we.subscribe(e=>{e.agents.length>0&&h.setAgents(e.agents),e.rooms.length>0&&h.setRooms(e.rooms),h.setConnected(e.connected)});var z=new ae,En=z.get();z.connect();z.subscribe(e=>{En=e});function D(e){h.addMessage(e)}var ce,Re=new re({onOpen:()=>{h.setConnected(!0),D({type:"system",text:"Connected to mesh"})},onClose:()=>{h.setConnected(!1),D({type:"system",text:"Disconnected \u2014 reconnecting..."})},onFrame:_t});function _t(e){let n=h.get();switch(e.type){case"delivery":{let t=Sn(e.event,n.currentRoom);t&&D(t),(e.event.type==="member_joined"||e.event.type==="member_left"||e.event.type==="member_status"||e.event.type==="name_changed")&&ke();break}case"result":if(D({type:"system",text:e.result.content}),!e.result.isError){if(ce?.action==="join_room"&&!h.get().currentRoom){let t=ce.room;h.setDmTarget(void 0),h.setCurrentRoom(t)}ke()}ce=void 0;break;case"error":D({type:"status",text:`Error: ${e.message}`});break;case"state":h.applyState(e.agents,e.rooms);break}}function U(e){ce=e,Re.sendAction(e)}async function ke(){if(!W)return;let[e,n]=await Promise.all([bn(),xn()]);h.setAgents(e),h.setRooms(n)}async function le(e){if(h.setDmTarget(void 0),h.setCurrentRoom(e),h.clearMessages(),U({action:"join_room",room:e}),W){let n=await kn(e);h.setMessages(n.map(An))}D({type:"system",text:`Joined ${e}`})}function In(e){h.setCurrentRoom(void 0),h.setDmTarget(e),h.clearMessages()}function Dn(){let e=h.get().currentRoom;e&&(U({action:"leave_room",room:e}),h.setCurrentRoom(void 0),h.clearMessages(),D({type:"system",text:`Left room "${e}"`}))}function gt(e){let n=h.get(),t=te(e,n.currentRoom,n.dmTarget),o=nn(t);if(o)switch(o.kind){case"join_room":le(o.room);return;case"leave_room":Dn();return}switch(t.kind){case"action":U(t.action);break;case"local":D({type:"system",text:t.result.text});break;case"ignored":break}}function ht(e,n,t){let o={action:"create_room",name:e,type:n,...t?{description:t}:{}};U(o)}function yt(e){le(e)}function vt(e,n){U({action:"rename_agent",agent:e,name:n})}function Nn(){let e=h.get();jn({currentRoom:e.currentRoom,dmTarget:e.dmTarget}),ze(a(vn,{rooms:e.rooms,agents:e.agents,currentRoom:e.currentRoom,dmTarget:e.dmTarget,messages:e.messages,connected:e.connected,relayStatus:En,onJoinRoom:n=>{le(n)},onSelectAgent:In,onRenameAgent:vt,onLeaveRoom:Dn,onSendAction:gt,onCreateRoom:ht,onJoinRoomInput:yt,onRelayConnect:(n,t)=>{z.connectRelay(n,t)},onRelayDisconnect:()=>{z.disconnect()},onConnectToMesh:()=>{localStorage.setItem("agent-comms-connected","true"),we.connect(),W&&Re.connect()}}),ft)}h.subscribe(Nn);var Pn=Tn(location.search);Nn();var bt=Cn(localStorage);(W||bt)&&(we.connect(),W&&Re.connect());ke().then(()=>{if(!Pn)return;let e=h.get(),n=Mn(Pn,e.rooms);if(n)switch(n.kind){case"room":le(n.targetId);break;case"dm":In(n.targetId);break}});})();
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 192 192" width="192" height="192">
|
|
2
|
+
<rect width="192" height="192" rx="32" fill="#16213e"/>
|
|
3
|
+
<circle cx="96" cy="68" r="16" fill="#e94560"/>
|
|
4
|
+
<circle cx="52" cy="112" r="16" fill="#0f3460"/>
|
|
5
|
+
<circle cx="140" cy="112" r="16" fill="#0f3460"/>
|
|
6
|
+
<line x1="96" y1="84" x2="52" y2="96" stroke="#e94560" stroke-width="3" stroke-linecap="round"/>
|
|
7
|
+
<line x1="96" y1="84" x2="140" y2="96" stroke="#e94560" stroke-width="3" stroke-linecap="round"/>
|
|
8
|
+
<line x1="52" y1="112" x2="140" y2="112" stroke="#533483" stroke-width="3" stroke-linecap="round"/>
|
|
9
|
+
</svg>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
|
|
2
|
+
<rect width="512" height="512" rx="80" fill="#16213e"/>
|
|
3
|
+
<circle cx="256" cy="180" r="40" fill="#e94560"/>
|
|
4
|
+
<circle cx="140" cy="300" r="40" fill="#0f3460"/>
|
|
5
|
+
<circle cx="372" cy="300" r="40" fill="#0f3460"/>
|
|
6
|
+
<line x1="256" y1="220" x2="140" y2="260" stroke="#e94560" stroke-width="6" stroke-linecap="round"/>
|
|
7
|
+
<line x1="256" y1="220" x2="372" y2="260" stroke="#e94560" stroke-width="6" stroke-linecap="round"/>
|
|
8
|
+
<line x1="140" y1="300" x2="372" y2="300" stroke="#533483" stroke-width="6" stroke-linecap="round"/>
|
|
9
|
+
</svg>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" width="96" height="96">
|
|
2
|
+
<rect width="96" height="96" rx="16" fill="#16213e"/>
|
|
3
|
+
<circle cx="48" cy="36" r="8" fill="#e94560"/>
|
|
4
|
+
<circle cx="28" cy="56" r="8" fill="#0f3460"/>
|
|
5
|
+
<circle cx="68" cy="56" r="8" fill="#0f3460"/>
|
|
6
|
+
<line x1="48" y1="44" x2="28" y2="48" stroke="#e94560" stroke-width="2" stroke-linecap="round"/>
|
|
7
|
+
<line x1="48" y1="44" x2="68" y2="48" stroke="#e94560" stroke-width="2" stroke-linecap="round"/>
|
|
8
|
+
<line x1="28" y1="56" x2="68" y2="56" stroke="#533483" stroke-width="2" stroke-linecap="round"/>
|
|
9
|
+
</svg>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Agent Comms",
|
|
3
|
+
"short_name": "Comms",
|
|
4
|
+
"description": "Cross-harness LLM agent communication mesh",
|
|
5
|
+
"start_url": "./",
|
|
6
|
+
"display": "standalone",
|
|
7
|
+
"background_color": "#1a1a2e",
|
|
8
|
+
"theme_color": "#16213e",
|
|
9
|
+
"icons": [
|
|
10
|
+
{
|
|
11
|
+
"src": "./icons/icon-96x96.svg",
|
|
12
|
+
"sizes": "96x96",
|
|
13
|
+
"type": "image/svg+xml"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"src": "./icons/icon-192x192.svg",
|
|
17
|
+
"sizes": "192x192",
|
|
18
|
+
"type": "image/svg+xml"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"src": "./icons/icon-512x512.svg",
|
|
22
|
+
"sizes": "512x512",
|
|
23
|
+
"type": "image/svg+xml"
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(()=>{var o=new Map,i=new Map,a=new Map,d=new Map;function l(e){for(let[t,s]of Object.entries(e.agents))o.set(t,s);for(let[t,s]of Object.entries(e.rooms))i.set(t,s);for(let[t,s]of Object.entries(e.messages))a.set(t,s);for(let[t,s]of Object.entries(e.dms))d.set(t,s)}function p(e){switch(e.type){case"agent_upsert":{let t=o.get(e.agent.id);if(t){let s=e.agent;for(let n of t.subscribedRooms)s.subscribedRooms.includes(n)||s.subscribedRooms.push(n);o.set(s.id,s)}else o.set(e.agent.id,e.agent);break}case"agent_offline":{let t=o.get(e.agentId);t&&(t.status="offline",o.set(e.agentId,t));break}case"room_upsert":{let t=i.get(e.room.id);if(t){let s=e.room;for(let n of t.members)s.members.includes(n)||s.members.push(n);i.set(s.id,s)}else i.set(e.room.id,e.room);break}case"room_delete":i.delete(e.roomId);break;case"message_add":{let t=a.get(e.roomId)??[];t.push(e.message),a.set(e.roomId,t);break}case"dm_add":{let t=d.get(e.key)??[];t.push(e.message),d.set(e.key,t);break}case"delivery":break;case"message_read":{if(e.room){let t=a.get(e.room);if(t){let s=t.find(n=>n.id===e.messageId);s&&!s.readBy.includes(e.readBy)&&s.readBy.push(e.readBy)}}else for(let[,t]of d){let s=t.find(n=>n.id===e.messageId);s&&!s.readBy.includes(e.readBy)&&s.readBy.push(e.readBy)}break}}}function f(){return{agents:[...o.values()],rooms:[...i.values()]}}var m,g,c;function u(e){c=e,g!==void 0&&(clearTimeout(g),g=void 0);let t=new WebSocket(e);m=t,t.onopen=()=>{r({type:"connected"})},t.onclose=()=>{m=void 0,r({type:"disconnected"}),b()},t.onerror=()=>{},t.onmessage=s=>{let n=JSON.parse(typeof s.data=="string"?s.data:String(s.data));S(n)}}function b(){c&&(g=setTimeout(()=>{c&&u(c)},3e3))}function S(e){if(k(e)){e.method==="state_sync"?(l(e.state),r({type:"state",state:f()})):(p(e.patch),r({type:"patch",patch:e.patch}));return}typeof e=="object"&&e!==null&&"type"in e&&(e.type==="result"&&"result"in e&&typeof e.result=="object"&&e.result!==null&&"content"in e.result&&typeof e.result.content=="string"&&"isError"in e.result&&typeof e.result.isError=="boolean"?r({type:"actionResult",id:"",result:{content:e.result.content,isError:e.result.isError}}):e.type==="error"&&"message"in e&&typeof e.message=="string"&&r({type:"actionError",id:"",message:e.message}))}function k(e){if(typeof e!="object"||e===null||!("method"in e))return!1;let t=e.method;return typeof t=="string"&&(t==="state_sync"||t==="state_update")}var y=new Set;function r(e){let t=JSON.stringify(e);for(let s of y)try{s.postMessage(t)}catch{}}function M(e){switch(e.type){case"init":u(e.url);break;case"action":{m?.readyState===WebSocket.OPEN&&m.send(JSON.stringify(e.action));break}case"getState":r({type:"state",state:f()});break}}function v(e){if(typeof e!="object"||e===null||!("type"in e))return!1;let t=e.type;return typeof t=="string"&&(t==="init"||t==="action"||t==="getState")}self.addEventListener("connect",e=>{let t=e.ports[0];if(t!==void 0){y.add(t);try{t.postMessage(JSON.stringify({type:"state",state:f()}))}catch{}t.onmessage=s=>{let n=JSON.parse(typeof s.data=="string"?s.data:String(s.data));v(n)&&M(n)}}});})();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(()=>{var l=new Set(["agent_upsert","agent_offline","room_upsert","room_delete","message_add","dm_add","delivery","message_read"]);function _(t){return typeof t!="object"||t===null||!("type"in t)||typeof t.type!="string"?!1:l.has(t.type)}var M=new Set(["state_update","peer_joined","peer_left"]),h=new Set(["state_sync","introduce","connect_request","connect_accepted","connect_rejected","peer_list","become_coordinator","pong","fed_handshake","fed_ack","fed_agent_visible","fed_agent_gone","fed_room_message","fed_room_join","fed_room_leave","fed_ping","fed_pong"]),o={label:"a",url:"",ws:void 0,connected:!1,reconnectTimer:void 0},i={label:"b",url:"",ws:void 0,connected:!1,reconnectTimer:void 0},g=0,a=[],b=50,y=new Set;function r(t,e){return`${t}:${e}`}function S(t,e){return{...e,id:r(t,e.id),name:`${e.name} (via ${t.toUpperCase()})`,subscribedRooms:e.subscribedRooms.map(n=>r(t,n))}}function v(t,e){return{...e,id:r(t,e.id),owner:r(t,e.owner),members:e.members.map(n=>r(t,n)),invited:e.invited.map(n=>r(t,n))}}function R(t,e){let n={...e,from:r(t,e.from),room:r(t,e.room),readBy:e.readBy.map(s=>r(t,s))};return e.replyTo!==void 0&&(n.replyTo=r(t,e.replyTo)),n}function w(t,e){return{...e,from:r(t,e.from),to:r(t,e.to),readBy:e.readBy.map(n=>r(t,n))}}function k(t,e){return e.split("--").map(s=>r(t,s)).join("--")}function I(t,e){switch(e.type){case"agent_upsert":return{...e,agent:S(t,e.agent)};case"agent_offline":return{...e,agentId:r(t,e.agentId)};case"room_upsert":return{...e,room:v(t,e.room)};case"room_delete":return{...e,roomId:r(t,e.roomId)};case"message_add":return{...e,roomId:r(t,e.roomId),message:R(t,e.message)};case"dm_add":return{...e,key:k(t,e.key),message:w(t,e.message)};case"delivery":return{...e,agentId:r(t,e.agentId)};case"message_read":return{...e,readBy:r(t,e.readBy),...e.room?{room:r(t,e.room)}:{}}}}function T(t){return typeof t!="object"||t===null||!("method"in t)||typeof t.method!="string"?void 0:{...t,method:t.method}}function A(t){return h.has(t.method)?!1:!!M.has(t.method)}function B(t,e){return e.method==="state_update"&&"patch"in e&&_(e.patch)?{...e,patch:I(t,e.patch)}:e.method==="peer_joined"&&"peer"in e&&typeof e.peer=="object"&&e.peer!==null&&"id"in e.peer&&typeof e.peer.id=="string"&&"port"in e.peer&&typeof e.peer.port=="number"&&"startedAt"in e.peer&&typeof e.peer.startedAt=="string"?{...e,peer:{...e.peer,id:r(t,e.peer.id)}}:e.method==="peer_left"&&"peerId"in e&&typeof e.peerId=="string"?{...e,peerId:r(t,e.peerId)}:e}function E(t,e,n){let s=T(n);if(s===void 0||!A(s))return;let u=B(t.label,s),p=e.ws;p?.readyState===WebSocket.OPEN&&(p.send(JSON.stringify(u)),g++,d())}function f(t,e){t.reconnectTimer!==void 0&&(clearTimeout(t.reconnectTimer),t.reconnectTimer=void 0);let n=new WebSocket(t.url);t.ws=n,n.onopen=()=>{t.connected=!0,d()},n.onclose=()=>{t.ws=void 0,t.connected=!1,d(),C(t,e)},n.onerror=()=>{},n.onmessage=s=>{let u=JSON.parse(typeof s.data=="string"?s.data:String(s.data));E(t,e,u)}}function C(t,e){t.url&&(t.reconnectTimer=setTimeout(()=>{t.url&&f(t,e)},3e3))}function c(t){t.reconnectTimer!==void 0&&(clearTimeout(t.reconnectTimer),t.reconnectTimer=void 0),t.ws?.close(),t.ws=void 0,t.connected=!1,t.url=""}function W(t){let e=JSON.stringify(t);for(let n of y)try{n.postMessage(e)}catch{}}function d(){W({type:"status",status:m()})}function m(){return{connectedA:o.connected,connectedB:i.connected,urlA:o.url||void 0,urlB:i.url||void 0,forwardedCount:g,errors:[...a]}}function O(t){a.push(t),a.length>b&&a.shift()}function P(t){switch(t.type){case"connect":{c(o),c(i),g=0,a.length=0,o.url=t.urlA,i.url=t.urlB;try{f(o,i),f(i,o)}catch(e){O(e instanceof Error?e.message:String(e))}d();break}case"disconnect":{c(o),c(i),d();break}case"status":d();break}}function D(t){if(typeof t!="object"||t===null||!("type"in t))return!1;let e=t.type;return typeof e=="string"&&(e==="connect"||e==="disconnect"||e==="status")}self.addEventListener("connect",t=>{let e=t.ports[0];if(e!==void 0){y.add(e);try{e.postMessage(JSON.stringify({type:"status",status:m()}))}catch{}e.onmessage=n=>{let s=JSON.parse(typeof n.data=="string"?n.data:String(n.data));D(s)&&P(s)}}});})();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(()=>{var o="agent-comms-v1",r=["./","./bundle.js","./sw.js","./manifest.json","./icons/icon-96x96.svg","./icons/icon-192x192.svg","./icons/icon-512x512.svg"];self.addEventListener("install",e=>{e.waitUntil(self.caches.open(o).then(i=>i.addAll(r)).then(()=>self.skipWaiting()))});self.addEventListener("activate",e=>{e.waitUntil(self.caches.keys().then(i=>Promise.all(i.filter(t=>t!==o).map(t=>self.caches.delete(t)))))});self.addEventListener("fetch",e=>{if(new URL(e.request.url).pathname.startsWith("/api/")){e.respondWith(fetch(e.request).then(t=>{if(e.request.method==="GET"&&t.status>=200&&t.status<300){let n=t.clone();self.caches.open(o).then(s=>s.put(e.request,n))}return t}).catch(()=>self.caches.open(o).then(t=>t.match(e.request)).then(t=>t??new Response("Offline",{status:503}))));return}e.respondWith(self.caches.open(o).then(t=>t.match(e.request)).then(t=>t||fetch(e.request).then(n=>{if(e.request.method==="GET"&&n.status>=200&&n.status<300){let s=n.clone();self.caches.open(o).then(a=>a.put(e.request,s))}return n})))});self.addEventListener("push",e=>{let i="Agent Comms",t="New message";if(e.data)try{let n=e.data.json();typeof n.title=="string"&&(i=n.title),typeof n.body=="string"&&(t=n.body)}catch{let n=e.data.text();n&&(t=n)}e.waitUntil(self.registration.showNotification(i,{body:t,data:{url:self.location.origin}}))});self.addEventListener("notificationclick",e=>{e.notification.close();let i=e.notification.data,t=typeof i=="object"&&i!==null&&"url"in i&&typeof i.url=="string"?i.url:self.location.origin;e.waitUntil(self.clients.matchAll({type:"window",includeUncontrolled:!0}).then(n=>{for(let s of n)if(s.url===t&&"focus"in s)return s.focus();return self.clients.openWindow(t)}))});})();
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>Agent Comms</title>
|
|
7
|
+
<meta name="theme-color" content="#16213e">
|
|
8
|
+
<link rel="manifest" href="./manifest.json">
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
<div id="root"></div>
|
|
12
|
+
<script src="./bundle.js"></script>
|
|
13
|
+
<script>
|
|
14
|
+
if ("serviceWorker" in navigator) {
|
|
15
|
+
window.addEventListener("load", function () {
|
|
16
|
+
navigator.serviceWorker.register("./sw.js");
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
</script>
|
|
20
|
+
</body>
|
|
21
|
+
</html>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-comms",
|
|
3
|
-
"version": "1.24.
|
|
3
|
+
"version": "1.24.3",
|
|
4
4
|
"description": "Cross-harness communication mesh for LLM agents — rooms, DMs, presence, and real-time push delivery over TCP",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "pnpm@10.33.0",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"scripts": {
|
|
49
49
|
"prepare": "husky",
|
|
50
50
|
"build:frontend": "tsx src/bridges/user/web/build.ts",
|
|
51
|
-
"build": "pnpm build:frontend && tsc && printf '#!/usr/bin/env node\n' | cat - dist/cli.js > dist/cli.tmp && mv dist/cli.tmp dist/cli.js",
|
|
51
|
+
"build": "pnpm build:frontend && tsc && tsx scripts/copy-web-assets.ts && printf '#!/usr/bin/env node\n' | cat - dist/cli.js > dist/cli.tmp && mv dist/cli.tmp dist/cli.js",
|
|
52
52
|
"generate:server-json": "tsx scripts/sync-release-metadata.ts",
|
|
53
53
|
"publish:mcp-registry": "tsx scripts/publish-mcp-registry.ts",
|
|
54
54
|
"lint": "eslint .",
|