agent-comms 3.19.0 → 3.20.0

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.
Files changed (76) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +1 -1
  4. package/dist/bridges/user/web/dist/bundle.js +49 -565
  5. package/dist/bridges/user/web/{frontend → dist}/index.html +1 -1
  6. package/dist/bridges/user/web/dist/mesh-worker.js +1 -1
  7. package/dist/bridges/user/web/dist/sw.js +1 -1
  8. package/dist/bridges/user/web/frontend/components/App.d.ts +3 -4
  9. package/dist/bridges/user/web/frontend/components/App.d.ts.map +1 -1
  10. package/dist/bridges/user/web/frontend/components/App.js +11 -9
  11. package/dist/bridges/user/web/frontend/components/App.js.map +1 -1
  12. package/dist/bridges/user/web/frontend/components/ChatArea.d.ts +3 -1
  13. package/dist/bridges/user/web/frontend/components/ChatArea.d.ts.map +1 -1
  14. package/dist/bridges/user/web/frontend/components/ChatArea.js +7 -7
  15. package/dist/bridges/user/web/frontend/components/ChatArea.js.map +1 -1
  16. package/dist/bridges/user/web/frontend/components/CreateRoomForm.d.ts +1 -1
  17. package/dist/bridges/user/web/frontend/components/CreateRoomForm.d.ts.map +1 -1
  18. package/dist/bridges/user/web/frontend/components/CreateRoomForm.js +19 -13
  19. package/dist/bridges/user/web/frontend/components/CreateRoomForm.js.map +1 -1
  20. package/dist/bridges/user/web/frontend/components/JoinForm.d.ts +1 -1
  21. package/dist/bridges/user/web/frontend/components/JoinForm.d.ts.map +1 -1
  22. package/dist/bridges/user/web/frontend/components/JoinForm.js +7 -7
  23. package/dist/bridges/user/web/frontend/components/JoinForm.js.map +1 -1
  24. package/dist/bridges/user/web/frontend/components/Message.d.ts +1 -1
  25. package/dist/bridges/user/web/frontend/components/Message.d.ts.map +1 -1
  26. package/dist/bridges/user/web/frontend/components/Message.js +10 -6
  27. package/dist/bridges/user/web/frontend/components/Message.js.map +1 -1
  28. package/dist/bridges/user/web/frontend/components/MessageList.d.ts +1 -1
  29. package/dist/bridges/user/web/frontend/components/MessageList.d.ts.map +1 -1
  30. package/dist/bridges/user/web/frontend/components/MessageList.js +8 -6
  31. package/dist/bridges/user/web/frontend/components/MessageList.js.map +1 -1
  32. package/dist/bridges/user/web/frontend/components/ProjectTree.d.ts +2 -3
  33. package/dist/bridges/user/web/frontend/components/ProjectTree.d.ts.map +1 -1
  34. package/dist/bridges/user/web/frontend/components/ProjectTree.js +38 -22
  35. package/dist/bridges/user/web/frontend/components/ProjectTree.js.map +1 -1
  36. package/dist/bridges/user/web/frontend/components/Sidebar.d.ts +3 -2
  37. package/dist/bridges/user/web/frontend/components/Sidebar.d.ts.map +1 -1
  38. package/dist/bridges/user/web/frontend/components/Sidebar.js +9 -6
  39. package/dist/bridges/user/web/frontend/components/Sidebar.js.map +1 -1
  40. package/dist/bridges/user/web/frontend/main.d.ts +3 -4
  41. package/dist/bridges/user/web/frontend/main.d.ts.map +1 -1
  42. package/dist/bridges/user/web/frontend/main.js +35 -35
  43. package/dist/bridges/user/web/frontend/main.js.map +1 -1
  44. package/dist/bridges/user/web/frontend/messages.d.ts +1 -0
  45. package/dist/bridges/user/web/frontend/messages.d.ts.map +1 -1
  46. package/dist/bridges/user/web/frontend/messages.js +6 -0
  47. package/dist/bridges/user/web/frontend/messages.js.map +1 -1
  48. package/dist/bridges/user/web/frontend/sw.js +2 -9
  49. package/dist/bridges/user/web/frontend/sw.js.map +1 -1
  50. package/dist/bridges/user/web/frontend/theme.d.ts +154 -0
  51. package/dist/bridges/user/web/frontend/theme.d.ts.map +1 -0
  52. package/dist/bridges/user/web/frontend/theme.js +36 -0
  53. package/dist/bridges/user/web/frontend/theme.js.map +1 -0
  54. package/dist/bridges/user/web/frontend/use-client-state.d.ts +6 -0
  55. package/dist/bridges/user/web/frontend/use-client-state.d.ts.map +1 -0
  56. package/dist/bridges/user/web/frontend/use-client-state.js +8 -0
  57. package/dist/bridges/user/web/frontend/use-client-state.js.map +1 -0
  58. package/dist/bridges/user/web/server.js +9 -3
  59. package/dist/bridges/user/web/server.js.map +1 -1
  60. package/dist/bridges/user/web/vite.config.d.ts +10 -0
  61. package/dist/bridges/user/web/vite.config.d.ts.map +1 -0
  62. package/dist/bridges/user/web/vite.config.js +66 -0
  63. package/dist/bridges/user/web/vite.config.js.map +1 -0
  64. package/package.json +18 -5
  65. package/dist/bridges/user/web/build.d.ts +0 -12
  66. package/dist/bridges/user/web/build.d.ts.map +0 -1
  67. package/dist/bridges/user/web/build.js +0 -95
  68. package/dist/bridges/user/web/build.js.map +0 -1
  69. package/dist/bridges/user/web/frontend/dom.d.ts +0 -25
  70. package/dist/bridges/user/web/frontend/dom.d.ts.map +0 -1
  71. package/dist/bridges/user/web/frontend/dom.js +0 -48
  72. package/dist/bridges/user/web/frontend/dom.js.map +0 -1
  73. package/dist/bridges/user/web/generated-html.d.ts +0 -6
  74. package/dist/bridges/user/web/generated-html.d.ts.map +0 -1
  75. package/dist/bridges/user/web/generated-html.js +0 -179
  76. package/dist/bridges/user/web/generated-html.js.map +0 -1
@@ -1,179 +0,0 @@
1
- /**
2
- * GENERATED FILE — do not edit.
3
- * Rebuild with: pnpm build:frontend
4
- */
5
- export const FRONTEND_HTML = `<!DOCTYPE html>
6
- <html lang="en">
7
- <head>
8
- <meta charset="utf-8">
9
- <meta name="viewport" content="width=device-width, initial-scale=1">
10
- <title>Agent Comms</title>
11
- </head>
12
- <body>
13
-
14
- <div id="sidebar">
15
- <h2>Agent Comms</h2>
16
- <div class="sidebar-section">
17
- <h3>Rooms</h3>
18
- <div id="room-list"></div>
19
- <h3>Agents</h3>
20
- <div id="agent-list"></div>
21
- </div>
22
- </div>
23
-
24
- <div id="main">
25
- <div id="header">Select a room</div>
26
- <div id="messages"></div>
27
- <div id="input-bar">
28
- <input id="input" type="text" placeholder="Type a message or /command..." autocomplete="off" />
29
- <button id="send-btn">Send</button>
30
- </div>
31
- </div>
32
-
33
- <script>
34
- "use strict";(()=>{var O=Object.defineProperty;var U=(e,n,t)=>n in e?O(e,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[n]=t;var m=(e,n,t)=>U(e,typeof n!="symbol"?n+"":n,t);document.head.appendChild(Object.assign(document.createElement("style"),{textContent:\`:root {
35
- --bg: #1a1a2e;
36
- --surface: #16213e;
37
- --border: #0f3460;
38
- --text: #e4e4e4;
39
- --dim: #888;
40
- --accent: #00b4d8;
41
- --green: #06d6a0;
42
- --red: #ef476f;
43
- --yellow: #ffd166;
44
- --purple: #b5838d;
45
- }
46
- * { margin: 0; padding: 0; box-sizing: border-box; }
47
- body {
48
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
49
- background: var(--bg);
50
- color: var(--text);
51
- height: 100vh;
52
- display: flex;
53
- }
54
- #sidebar {
55
- width: 260px;
56
- background: var(--surface);
57
- border-right: 1px solid var(--border);
58
- display: flex;
59
- flex-direction: column;
60
- overflow: hidden;
61
- }
62
- #sidebar h2 {
63
- padding: 12px 16px;
64
- font-size: 14px;
65
- color: var(--accent);
66
- border-bottom: 1px solid var(--border);
67
- }
68
- .sidebar-section {
69
- flex: 1;
70
- overflow-y: auto;
71
- padding: 8px;
72
- }
73
- .sidebar-section h3 {
74
- font-size: 11px;
75
- text-transform: uppercase;
76
- color: var(--dim);
77
- padding: 8px 8px 4px;
78
- }
79
- .room-item, .agent-item {
80
- padding: 6px 10px;
81
- border-radius: 6px;
82
- cursor: pointer;
83
- font-size: 13px;
84
- display: flex;
85
- align-items: center;
86
- gap: 6px;
87
- }
88
- .room-item:hover, .agent-item:hover { background: rgba(255,255,255,0.05); }
89
- .room-item.active { background: var(--border); }
90
- .status-dot {
91
- width: 8px; height: 8px;
92
- border-radius: 50%;
93
- display: inline-block;
94
- }
95
- .status-dot.active { background: var(--green); }
96
- .status-dot.idle { background: var(--yellow); }
97
- .status-dot.busy { background: var(--red); }
98
- .status-dot.offline { background: var(--dim); }
99
- #main {
100
- flex: 1;
101
- display: flex;
102
- flex-direction: column;
103
- overflow: hidden;
104
- }
105
- #header {
106
- padding: 12px 20px;
107
- border-bottom: 1px solid var(--border);
108
- font-size: 15px;
109
- font-weight: 600;
110
- background: var(--surface);
111
- }
112
- #messages {
113
- flex: 1;
114
- overflow-y: auto;
115
- padding: 16px 20px;
116
- display: flex;
117
- flex-direction: column;
118
- gap: 4px;
119
- }
120
- .msg {
121
- font-size: 13px;
122
- line-height: 1.5;
123
- }
124
- .msg .sender { font-weight: 600; color: var(--accent); }
125
- .msg .time { color: var(--dim); font-size: 11px; margin-left: 8px; }
126
- .msg.system { color: var(--dim); font-style: italic; }
127
- .msg.status { color: var(--yellow); font-size: 12px; }
128
- .msg.dm { color: var(--purple); }
129
- .msg .dm-badge {
130
- background: var(--purple);
131
- color: #fff;
132
- font-size: 10px;
133
- padding: 1px 5px;
134
- border-radius: 3px;
135
- font-weight: 600;
136
- }
137
- #input-bar {
138
- display: flex;
139
- padding: 12px 20px;
140
- gap: 8px;
141
- background: var(--surface);
142
- border-top: 1px solid var(--border);
143
- }
144
- #input {
145
- flex: 1;
146
- background: var(--bg);
147
- border: 1px solid var(--border);
148
- border-radius: 6px;
149
- padding: 8px 12px;
150
- color: var(--text);
151
- font-size: 13px;
152
- outline: none;
153
- }
154
- #input:focus { border-color: var(--accent); }
155
- #send-btn {
156
- background: var(--accent);
157
- border: none;
158
- border-radius: 6px;
159
- padding: 8px 16px;
160
- color: #fff;
161
- font-weight: 600;
162
- cursor: pointer;
163
- }
164
- #send-btn:hover { opacity: 0.9; }
165
- #empty-state {
166
- flex: 1;
167
- display: flex;
168
- align-items: center;
169
- justify-content: center;
170
- color: var(--dim);
171
- font-size: 14px;
172
- }
173
- \`}));function q(e){return typeof e=="object"&&e!==null}function K(e){return Array.isArray(e)}function J(e){return Array.isArray(e)}function B(e){return Array.isArray(e)}function G(e){return q(e)&&typeof e.type=="string"}async function M(){let n=await(await fetch("/api/agents")).json();if(!K(n))throw new Error("Invalid agents response");return n}async function A(){let n=await(await fetch("/api/rooms")).json();if(!J(n))throw new Error("Invalid rooms response");return n}async function C(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(!B(s))throw new Error("Invalid messages response");return s}var f=class{constructor(n){m(this,"ws");m(this,"reconnectTimer");m(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));G(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)}};function l(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 p(e,n){let t=e.createElement("div");return t.textContent=n,t.innerHTML}function $(e,n,t,...o){let s=e.createElement(n);if(t)for(let[r,a]of Object.entries(t))s.setAttribute(r,a);for(let r of o)typeof r=="string"?s.appendChild(e.createTextNode(r)):s.appendChild(r);return s}function h(e){e.innerHTML=""}function k(e){return e.slice(11,19)}function L(e,n,t){let o=e.trim();return o.length===0?{kind:"ignored"}:o.startsWith("/")?Q(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 Q(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"help":return{kind:"local",result:{type:"help",text:"Commands: /join, /leave, /rooms, /agents, /dm, /create, /destroy, /help"}};default:return{kind:"local",result:{type:"unknown",text:\`Unknown command: /\${o}\`}}}}function S(e,n,t,o,s){let r=k(s),a=e.createElement("div");a.className="msg",a.innerHTML=\`<span class="sender">\${p(e,t)}</span><span class="time">\${r}</span>: \${p(e,o)}\`,n.messagesEl.appendChild(a),n.messagesEl.scrollTop=n.messagesEl.scrollHeight}function V(e,n,t,o,s){let r=k(s),a=e.createElement("div");a.className="msg dm",a.innerHTML=\`<span class="dm-badge">DM</span> <span class="sender">\${p(e,t)}</span><span class="time">\${r}</span>: \${p(e,o)}\`,n.messagesEl.appendChild(a),n.messagesEl.scrollTop=n.messagesEl.scrollHeight}function c(e,n,t){let o=e.createElement("div");o.className="msg system",o.textContent=t,n.messagesEl.appendChild(o),n.messagesEl.scrollTop=n.messagesEl.scrollHeight}function y(e,n,t){let o=e.createElement("div");o.className="msg status",o.textContent=t,n.messagesEl.appendChild(o),n.messagesEl.scrollTop=n.messagesEl.scrollHeight}function w(e){h(e.messagesEl)}function H(e,n,t,o){switch(t.type){case"room_message":o===t.message.room&&S(e,n,t.message.from,t.message.content,t.message.timestamp);break;case"dm":V(e,n,t.message.from,t.message.content,t.message.timestamp);break;case"member_joined":c(e,n,\`\${t.agent} joined \${t.room}\`);break;case"member_left":c(e,n,\`\${t.agent} left \${t.room}\`);break;case"member_status":y(e,n,\`\${t.agent} is now \${t.status} in \${t.room}\`);break;case"delivery_status":y(e,n,\`Message \${t.messageId} \${t.status} by \${t.agent}\`);break;case"room_members":if(o===t.room){let s=t.members.map(r=>\`\${r.name} (\${r.status})\`).join(", ");c(e,n,\`Members: \${s}\`)}break;case"room_invite":{let s=t.roomDescription?\` \\u2014 \${t.roomDescription}\`:"";c(e,n,\`\${t.fromName} invited you to "\${t.room}"\${s}\`);break}case"invite_declined":c(e,n,\`\${t.agentName} declined invite to \${t.room}: "\${t.reason}"\`);break}}function N(e,n,t,o,s){h(n.roomListEl);for(let r of t){let a=o===r.id,E=r.type.charAt(0).toUpperCase(),F=r.members.length,g=e.createElement("div");g.className=\`room-item\${a?" active":""}\`,g.innerHTML=\`\${E} \${p(e,r.name)} <span style="color:var(--dim)">(\${String(F)})</span>\`,g.onclick=()=>{s(r.id)},n.roomListEl.appendChild(g)}}function j(e,n,t,o){h(n.agentListEl);for(let s of t){let r=e.createElement("div");r.className="agent-item";let a=$(e,"span",{class:\`status-dot \${s.status}\`}),E=e.createTextNode(\` \${s.name}\`);r.appendChild(a),r.appendChild(E),o&&(r.onclick=()=>{o(s.id)}),n.agentListEl.appendChild(r)}}function x(e,n){e.headerEl.textContent=n}function D(e,n,t){for(let o of t)S(e,n,o.from,o.content,o.timestamp)}var _={currentRoom:void 0,dmTarget:void 0,agents:[],rooms:[],connected:!1},b=class{constructor(){m(this,"state",{..._});m(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()}applyState(n,t){this.state={...this.state,agents:n,rooms:t},this.notify()}reset(){this.state={..._},this.notify()}notify(){let n=this.state;for(let t of this.listeners)t(n)}};var X=l(document,"#messages"),u=l(document,"#input","input"),R=l(document,"#header"),Y=l(document,"#room-list"),Z=l(document,"#agent-list"),d={messagesEl:X},I={roomListEl:Y,agentListEl:Z},i=new b;i.subscribe(e=>{N(document,I,e.rooms,e.currentRoom,ne),j(document,I,e.agents,te)});var P=new f({onOpen:()=>{i.setConnected(!0),c(document,d,"Connected to mesh")},onClose:()=>{i.setConnected(!1),c(document,d,"Disconnected \\u2014 reconnecting...")},onFrame:ee});function ee(e){switch(e.type){case"delivery":H(document,d,e.event,i.get().currentRoom),(e.event.type==="member_joined"||e.event.type==="member_left"||e.event.type==="member_status")&&T();break;case"result":if(c(document,d,e.result.content),!e.result.isError){if(v?.action==="join_room"&&!i.get().currentRoom){let n=v.room;i.setDmTarget(void 0),i.setCurrentRoom(n),x({headerEl:R},n)}T()}v=void 0;break;case"error":y(document,d,\`Error: \${e.message}\`);break;case"state":i.applyState(e.agents,e.rooms);break}}var v;function W(e){v=e,P.sendAction(e)}async function T(){let[e,n]=await Promise.all([M(),A()]);i.setAgents(e),i.setRooms(n)}async function ne(e){i.setDmTarget(void 0),i.setCurrentRoom(e),x({headerEl:R},e),w(d),W({action:"join_room",room:e});let n=await C(e);D(document,d,n),c(document,d,\`Joined \${e}\`),u.focus()}function te(e){i.setCurrentRoom(void 0),i.setDmTarget(e),w(d),x({headerEl:R},\`DM with \${e}\`),u.focus()}function z(){let e=u.value;u.value="";let n=L(e,i.get().currentRoom,i.get().dmTarget);switch(n.kind){case"action":W(n.action);break;case"local":c(document,d,n.result.text);break;case"ignored":break}}var oe=l(document,"#send-btn");oe.onclick=z;u.addEventListener("keydown",e=>{e.key==="Enter"&&z()});P.connect();T();u.focus();})();
174
-
175
- </script>
176
- </body>
177
- </html>
178
- `;
179
- //# sourceMappingURL=generated-html.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generated-html.js","sourceRoot":"","sources":["../../../../src/bridges/user/web/generated-html.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6K5B,CAAC"}