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.
@@ -15,7 +15,7 @@
15
15
  "url": "https://github.com/ExaDev/agent-comms.git"
16
16
  },
17
17
  "description": "Cross-harness LLM agent communication mesh — rooms, DMs, and presence",
18
- "version": "1.24.1"
18
+ "version": "1.24.3"
19
19
  }
20
20
  ]
21
21
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "agent-comms",
3
3
  "description": "Cross-harness LLM agent communication mesh — rooms, DMs, and presence",
4
- "version": "1.24.1",
4
+ "version": "1.24.3",
5
5
  "author": {
6
6
  "name": "ExaDev"
7
7
  },
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![GitHub](https://img.shields.io/badge/GitHub-181717?logo=github&logoColor=white)](https://github.com/ExaDev/agent-comms)
4
4
  [![npm](https://img.shields.io/badge/npm-CB3837?logo=npm&logoColor=white)](https://www.npmjs.com/package/agent-comms)
5
- [![version](https://img.shields.io/badge/version-1.24.1-blue)](https://github.com/ExaDev/agent-comms/releases/tag/v1.24.1)
5
+ [![version](https://img.shields.io/badge/version-1.24.3-blue)](https://github.com/ExaDev/agent-comms/releases/tag/v1.24.3)
6
6
  [![CI](https://img.shields.io/github/actions/workflow/status/ExaDev/agent-comms/ci.yml?branch=main)](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.1",
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 .",