agent-comms 3.19.0 → 3.21.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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +1 -1
- package/dist/bridges/cc-peer/front-runtime.d.ts.map +1 -1
- package/dist/bridges/cc-peer/front-runtime.js +2 -1
- package/dist/bridges/cc-peer/front-runtime.js.map +1 -1
- package/dist/bridges/cc-peer/run.d.ts.map +1 -1
- package/dist/bridges/cc-peer/run.js +2 -1
- package/dist/bridges/cc-peer/run.js.map +1 -1
- package/dist/bridges/user/web/contract.d.ts +1796 -0
- package/dist/bridges/user/web/contract.d.ts.map +1 -0
- package/dist/bridges/user/web/contract.js +120 -0
- package/dist/bridges/user/web/contract.js.map +1 -0
- package/dist/bridges/user/web/dist/bundle.js +49 -565
- package/dist/bridges/user/web/{frontend → dist}/index.html +1 -1
- package/dist/bridges/user/web/dist/mesh-worker.js +1 -1
- package/dist/bridges/user/web/dist/sw.js +1 -1
- package/dist/bridges/user/web/frontend/components/App.d.ts +3 -4
- package/dist/bridges/user/web/frontend/components/App.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/App.js +11 -9
- package/dist/bridges/user/web/frontend/components/App.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/ChatArea.d.ts +5 -2
- package/dist/bridges/user/web/frontend/components/ChatArea.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/ChatArea.js +12 -8
- package/dist/bridges/user/web/frontend/components/ChatArea.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/CreateRoomForm.d.ts +1 -1
- package/dist/bridges/user/web/frontend/components/CreateRoomForm.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/CreateRoomForm.js +19 -13
- package/dist/bridges/user/web/frontend/components/CreateRoomForm.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/JoinForm.d.ts +1 -1
- package/dist/bridges/user/web/frontend/components/JoinForm.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/JoinForm.js +7 -7
- package/dist/bridges/user/web/frontend/components/JoinForm.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/Message.d.ts +1 -1
- package/dist/bridges/user/web/frontend/components/Message.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/Message.js +10 -6
- package/dist/bridges/user/web/frontend/components/Message.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/MessageList.d.ts +1 -1
- package/dist/bridges/user/web/frontend/components/MessageList.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/MessageList.js +8 -6
- package/dist/bridges/user/web/frontend/components/MessageList.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/ProjectTree.d.ts +2 -3
- package/dist/bridges/user/web/frontend/components/ProjectTree.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/ProjectTree.js +38 -22
- package/dist/bridges/user/web/frontend/components/ProjectTree.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/Sidebar.d.ts +3 -2
- package/dist/bridges/user/web/frontend/components/Sidebar.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/Sidebar.js +9 -6
- package/dist/bridges/user/web/frontend/components/Sidebar.js.map +1 -1
- package/dist/bridges/user/web/frontend/main.d.ts +3 -4
- package/dist/bridges/user/web/frontend/main.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/main.js +40 -37
- package/dist/bridges/user/web/frontend/main.js.map +1 -1
- package/dist/bridges/user/web/frontend/messages.d.ts +1 -0
- package/dist/bridges/user/web/frontend/messages.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/messages.js +6 -0
- package/dist/bridges/user/web/frontend/messages.js.map +1 -1
- package/dist/bridges/user/web/frontend/sw.js +2 -9
- package/dist/bridges/user/web/frontend/sw.js.map +1 -1
- package/dist/bridges/user/web/frontend/theme.d.ts +154 -0
- package/dist/bridges/user/web/frontend/theme.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/theme.js +36 -0
- package/dist/bridges/user/web/frontend/theme.js.map +1 -0
- package/dist/bridges/user/web/frontend/use-client-state.d.ts +6 -0
- package/dist/bridges/user/web/frontend/use-client-state.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/use-client-state.js +8 -0
- package/dist/bridges/user/web/frontend/use-client-state.js.map +1 -0
- package/dist/bridges/user/web/server.js +9 -3
- package/dist/bridges/user/web/server.js.map +1 -1
- package/dist/bridges/user/web/test/contract.unit.test.d.ts +2 -0
- package/dist/bridges/user/web/test/contract.unit.test.d.ts.map +1 -0
- package/dist/bridges/user/web/test/contract.unit.test.js +56 -0
- package/dist/bridges/user/web/test/contract.unit.test.js.map +1 -0
- package/dist/bridges/user/web/vite.config.d.ts +10 -0
- package/dist/bridges/user/web/vite.config.d.ts.map +1 -0
- package/dist/bridges/user/web/vite.config.js +66 -0
- package/dist/bridges/user/web/vite.config.js.map +1 -0
- package/dist/core/bridge-mesh.d.ts +2 -0
- package/dist/core/bridge-mesh.d.ts.map +1 -1
- package/dist/core/bridge-mesh.js +5 -1
- package/dist/core/bridge-mesh.js.map +1 -1
- package/dist/core/bridge.d.ts +1 -0
- package/dist/core/bridge.d.ts.map +1 -1
- package/dist/core/bridge.js +5 -0
- package/dist/core/bridge.js.map +1 -1
- package/dist/core/gossip-directory.d.ts +6 -2
- package/dist/core/gossip-directory.d.ts.map +1 -1
- package/dist/core/gossip-directory.js +25 -4
- package/dist/core/gossip-directory.js.map +1 -1
- package/dist/core/mesh-store.d.ts +14 -0
- package/dist/core/mesh-store.d.ts.map +1 -1
- package/dist/core/mesh-store.js +40 -0
- package/dist/core/mesh-store.js.map +1 -1
- package/dist/core/package-version.d.ts +4 -0
- package/dist/core/package-version.d.ts.map +1 -1
- package/dist/core/package-version.js +2 -1
- package/dist/core/package-version.js.map +1 -1
- package/dist/core/peer-versions.d.ts +16 -0
- package/dist/core/peer-versions.d.ts.map +1 -0
- package/dist/core/peer-versions.js +42 -0
- package/dist/core/peer-versions.js.map +1 -0
- package/dist/core/room-lifecycle.d.ts +5 -5
- package/dist/core/room-lifecycle.d.ts.map +1 -1
- package/dist/core/room-lifecycle.js +11 -5
- package/dist/core/room-lifecycle.js.map +1 -1
- package/dist/core/room-lookup.d.ts +9 -0
- package/dist/core/room-lookup.d.ts.map +1 -0
- package/dist/core/room-lookup.js +26 -0
- package/dist/core/room-lookup.js.map +1 -0
- package/dist/core/room-messaging.d.ts +2 -2
- package/dist/core/room-messaging.d.ts.map +1 -1
- package/dist/core/room-messaging.js +5 -2
- package/dist/core/room-messaging.js.map +1 -1
- package/dist/core/tool.d.ts +16 -0
- package/dist/core/tool.d.ts.map +1 -1
- package/dist/core/tool.js +10 -4
- package/dist/core/tool.js.map +1 -1
- package/dist/core/transport.d.ts +4 -0
- package/dist/core/transport.d.ts.map +1 -1
- package/dist/core/types.d.ts +6 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +4 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/version-report-actions.d.ts +18 -0
- package/dist/core/version-report-actions.d.ts.map +1 -0
- package/dist/core/version-report-actions.js +51 -0
- package/dist/core/version-report-actions.js.map +1 -0
- package/dist/core/wire-mesh-core-version.d.ts +6 -0
- package/dist/core/wire-mesh-core-version.d.ts.map +1 -0
- package/dist/core/wire-mesh-core-version.js +20 -0
- package/dist/core/wire-mesh-core-version.js.map +1 -0
- package/dist/core/wire-mesh-transport.d.ts +4 -0
- package/dist/core/wire-mesh-transport.d.ts.map +1 -1
- package/dist/core/wire-mesh-transport.js +8 -9
- package/dist/core/wire-mesh-transport.js.map +1 -1
- package/dist/test/agent-comms-version-gossip.integration.test.d.ts +5 -0
- package/dist/test/agent-comms-version-gossip.integration.test.d.ts.map +1 -0
- package/dist/test/agent-comms-version-gossip.integration.test.js +103 -0
- package/dist/test/agent-comms-version-gossip.integration.test.js.map +1 -0
- package/dist/test/peer-versions.test.d.ts +5 -0
- package/dist/test/peer-versions.test.d.ts.map +1 -0
- package/dist/test/peer-versions.test.js +68 -0
- package/dist/test/peer-versions.test.js.map +1 -0
- package/dist/test/query-version.integration.test.d.ts +5 -0
- package/dist/test/query-version.integration.test.d.ts.map +1 -0
- package/dist/test/query-version.integration.test.js +64 -0
- package/dist/test/query-version.integration.test.js.map +1 -0
- package/dist/test/send-by-room-name.test.d.ts +5 -0
- package/dist/test/send-by-room-name.test.d.ts.map +1 -0
- package/dist/test/send-by-room-name.test.js +77 -0
- package/dist/test/send-by-room-name.test.js.map +1 -0
- package/dist/test/tool-version-reporting.test.js +38 -0
- package/dist/test/tool-version-reporting.test.js.map +1 -1
- package/dist/test/version-report-actions.test.d.ts +5 -0
- package/dist/test/version-report-actions.test.d.ts.map +1 -0
- package/dist/test/version-report-actions.test.js +88 -0
- package/dist/test/version-report-actions.test.js.map +1 -0
- package/dist/test/wire-mesh-core-version.test.d.ts +5 -0
- package/dist/test/wire-mesh-core-version.test.d.ts.map +1 -0
- package/dist/test/wire-mesh-core-version.test.js +14 -0
- package/dist/test/wire-mesh-core-version.test.js.map +1 -0
- package/package.json +23 -7
- package/dist/bridges/user/web/build.d.ts +0 -12
- package/dist/bridges/user/web/build.d.ts.map +0 -1
- package/dist/bridges/user/web/build.js +0 -95
- package/dist/bridges/user/web/build.js.map +0 -1
- package/dist/bridges/user/web/frontend/dom.d.ts +0 -25
- package/dist/bridges/user/web/frontend/dom.d.ts.map +0 -1
- package/dist/bridges/user/web/frontend/dom.js +0 -48
- package/dist/bridges/user/web/frontend/dom.js.map +0 -1
- package/dist/bridges/user/web/generated-html.d.ts +0 -6
- package/dist/bridges/user/web/generated-html.d.ts.map +0 -1
- package/dist/bridges/user/web/generated-html.js +0 -179
- package/dist/bridges/user/web/generated-html.js.map +0 -1
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
<title>Agent Comms</title>
|
|
7
7
|
<meta name="theme-color" content="#16213e">
|
|
8
8
|
<link rel="manifest" href="./manifest.json">
|
|
9
|
+
<script type="module" crossorigin src="/bundle.js"></script>
|
|
9
10
|
</head>
|
|
10
11
|
<body>
|
|
11
12
|
<div id="root"></div>
|
|
12
|
-
<script src="./bundle.js"></script>
|
|
13
13
|
<script>
|
|
14
14
|
if ("serviceWorker" in navigator) {
|
|
15
15
|
window.addEventListener("load", function () {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
var AgentCommsMeshWorker=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=new Map,n=new Map,r=new Map,i=new Map;function a(e){for(let[n,r]of Object.entries(e.agents))t.set(n,r);for(let[t,r]of Object.entries(e.rooms))n.set(t,r);for(let[t,n]of Object.entries(e.messages))r.set(t,n);for(let[t,n]of Object.entries(e.dms))i.set(t,n)}function o(e){switch(e.type){case`agent_upsert`:t.set(e.agent.id,e.agent);break;case`agent_offline`:{let n=t.get(e.agentId);n&&(n.status=`offline`,t.set(e.agentId,n));break}case`room_upsert`:n.set(e.room.id,e.room);break;case`room_delete`:n.delete(e.roomId);break;case`message_add`:{let t=r.get(e.roomId)??[];t.push(e.message),r.set(e.roomId,t);break}case`dm_add`:{let t=i.get(e.key)??[];t.push(e.message),i.set(e.key,t);break}case`delivery`:break;case`message_read`:if(e.room!==void 0){let t=r.get(e.room);if(t){let n=t.find(t=>t.id===e.messageId);n&&!n.readBy.includes(e.readBy)&&n.readBy.push(e.readBy)}}else for(let[,t]of i){let n=t.find(t=>t.id===e.messageId);n&&!n.readBy.includes(e.readBy)&&n.readBy.push(e.readBy)}}}function s(){return{agents:[...t.values()],rooms:[...n.values()]}}var c,l,u;function d(e){u=e,l!==void 0&&(clearTimeout(l),l=void 0);let t=new WebSocket(e);c=t,t.onopen=()=>{_({type:`connected`})},t.onclose=()=>{c=void 0,_({type:`disconnected`}),p()},t.onerror=()=>{},t.onmessage=e=>{m(JSON.parse(typeof e.data==`string`?e.data:String(e.data)))}}var f=3e3;function p(){u!==void 0&&(l=setTimeout(()=>{u!==void 0&&d(u)},f))}function m(e){if(h(e)){e.method===`state_sync`?(a(e.state),_({type:`state`,state:s()})):(o(e.patch),_({type:`patch`,patch:e.patch}));return}typeof e==`object`&&e&&`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`?_({type:`actionResult`,id:``,result:{content:e.result.content,isError:e.result.isError}}):e.type===`error`&&`message`in e&&typeof e.message==`string`&&_({type:`actionError`,id:``,message:e.message}))}function h(e){if(typeof e!=`object`||!e||!(`method`in e))return!1;let t=e.method;return typeof t==`string`&&(t===`state_sync`||t===`state_update`)}var g=new Set;function _(e){let t=JSON.stringify(e);for(let e of g)try{e.postMessage(t)}catch{}}function v(e){switch(e.type){case`init`:d(e.url);break;case`action`:c?.readyState===WebSocket.OPEN&&c.send(JSON.stringify(e.action));break;case`getState`:_({type:`state`,state:s()})}}function y(e){if(typeof e!=`object`||!e||!(`type`in e))return!1;let t=e.type;return typeof t==`string`&&(t===`init`||t===`action`||t===`getState`)}return typeof self<`u`&&self.addEventListener(`connect`,e=>{let t=e.ports[0];if(t!==void 0){g.add(t);try{t.postMessage(JSON.stringify({type:`state`,state:s()}))}catch{}t.onmessage=e=>{let t=JSON.parse(typeof e.data==`string`?e.data:String(e.data));y(t)&&v(t)}}}),e.agents=t,e.applyPatch=o,e.applyStateSync=a,e.dms=i,e.getStateSnapshot=s,e.messages=r,e.rooms=n,e})({});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
var e=`agent-comms-v1`,t=[{"revision":"7efa9980ba0b02137565a56208e14f7b","url":"mesh-worker.js"},{"revision":"f1ee3afb8c9e8f0d7315fd93d6457316","url":"index.html"},{"revision":"c8581eb68732d5f03e4c7af10080357a","url":"bundle.js"}].map(e=>e.url);self.addEventListener(`install`,n=>{n.waitUntil(self.caches.open(e).then(async e=>e.addAll(t)).then(async()=>self.skipWaiting()))}),self.addEventListener(`activate`,t=>{t.waitUntil(self.caches.keys().then(async t=>Promise.all(t.filter(t=>t!==e).map(async e=>self.caches.delete(e)))))});var n=200,r=300;function i(e,t){return e.method===`GET`&&t.status>=n&&t.status<r}self.addEventListener(`fetch`,t=>{if(new URL(t.request.url).pathname.startsWith(`/api/`)){t.respondWith(fetch(t.request).then(n=>{if(i(t.request,n)){let r=n.clone();self.caches.open(e).then(async e=>e.put(t.request,r))}return n}).catch(async()=>self.caches.open(e).then(async e=>e.match(t.request)).then(e=>e??new Response(`Offline`,{status:503}))));return}t.respondWith(self.caches.open(e).then(async e=>e.match(t.request)).then(async n=>n||fetch(t.request).then(n=>{if(i(t.request,n)){let r=n.clone();self.caches.open(e).then(async e=>e.put(t.request,r))}return n})))}),self.addEventListener(`push`,e=>{let t=`Agent Comms`,n=`New message`;if(e.data)try{let r=e.data.json();typeof r.title==`string`&&(t=r.title),typeof r.body==`string`&&(n=r.body)}catch{let t=e.data.text();t&&(n=t)}e.waitUntil(self.registration.showNotification(t,{body:n,data:{url:self.location.origin}}))}),self.addEventListener(`notificationclick`,e=>{e.notification.close();let t=e.notification.data,n=typeof t==`object`&&t&&`url`in t&&typeof t.url==`string`?t.url:self.location.origin;e.waitUntil(self.clients.matchAll({type:`window`,includeUncontrolled:!0}).then(async e=>{for(let t of e)if(t.url===n&&`focus`in t)return t.focus();return self.clients.openWindow(n)}))});
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* App — root
|
|
2
|
+
* App — root React component.
|
|
3
3
|
*
|
|
4
|
-
* Renders sidebar + chat area. Receives state and action callbacks
|
|
5
|
-
* from the imperative shell in main.tsx.
|
|
4
|
+
* Renders sidebar + chat area inside an AppShell. Receives state and action callbacks from the imperative shell in main.tsx.
|
|
6
5
|
*/
|
|
7
6
|
import type { Agent, DisplayMessage, Room } from "../types.js";
|
|
8
7
|
export interface AppProps {
|
|
@@ -21,5 +20,5 @@ export interface AppProps {
|
|
|
21
20
|
onJoinRoomInput: (roomName: string) => void;
|
|
22
21
|
onConnectToMesh: () => void;
|
|
23
22
|
}
|
|
24
|
-
export declare function App(props: AppProps): import("
|
|
23
|
+
export declare function App(props: AppProps): import("react").JSX.Element;
|
|
25
24
|
//# sourceMappingURL=App.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/App.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/App.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAI/D,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IACvB,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,YAAY,EAAE,CACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,EACrC,WAAW,EAAE,MAAM,KAChB,IAAI,CAAC;IACV,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,eAAe,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,+BAuClC"}
|
|
@@ -1,17 +1,19 @@
|
|
|
1
|
-
import { jsx as _jsx,
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
|
-
* App — root
|
|
3
|
+
* App — root React component.
|
|
4
4
|
*
|
|
5
|
-
* Renders sidebar + chat area. Receives state and action callbacks
|
|
6
|
-
* from the imperative shell in main.tsx.
|
|
5
|
+
* Renders sidebar + chat area inside an AppShell. Receives state and action callbacks from the imperative shell in main.tsx.
|
|
7
6
|
*/
|
|
8
|
-
import {
|
|
7
|
+
import { AppShell } from "@mantine/core";
|
|
8
|
+
import { useDisclosure } from "@mantine/hooks";
|
|
9
9
|
import { ChatArea } from "./ChatArea.js";
|
|
10
10
|
import { Sidebar } from "./Sidebar.js";
|
|
11
11
|
export function App(props) {
|
|
12
|
-
const [
|
|
13
|
-
return (_jsxs(
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
const [navOpened, { toggle: toggleNav }] = useDisclosure(true);
|
|
13
|
+
return (_jsxs(AppShell, { navbar: {
|
|
14
|
+
width: 260,
|
|
15
|
+
breakpoint: "sm",
|
|
16
|
+
collapsed: { desktop: !navOpened, mobile: !navOpened },
|
|
17
|
+
}, children: [_jsx(AppShell.Navbar, { children: _jsx(Sidebar, { rooms: props.rooms, agents: props.agents, currentRoom: props.currentRoom, onJoinRoom: props.onJoinRoom, onSelectAgent: props.onSelectAgent, onRenameAgent: props.onRenameAgent, onCreateRoom: props.onCreateRoom, onJoinRoomInput: props.onJoinRoomInput }) }), _jsx(AppShell.Main, { h: "100vh", children: _jsx(ChatArea, { messages: props.messages, rooms: props.rooms, currentRoom: props.currentRoom, dmTarget: props.dmTarget, connected: props.connected, sidebarOpened: navOpened, onToggleSidebar: toggleNav, onSendAction: props.onSendAction, onLeaveRoom: props.onLeaveRoom, onConnectToMesh: props.onConnectToMesh }) })] }));
|
|
16
18
|
}
|
|
17
19
|
//# sourceMappingURL=App.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/App.tsx"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/App.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAuBvC,MAAM,UAAU,GAAG,CAAC,KAAe;IACjC,MAAM,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAE/D,OAAO,CACL,MAAC,QAAQ,IACP,MAAM,EAAE;YACN,KAAK,EAAE,GAAG;YACV,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE;SACvD,aAED,KAAC,QAAQ,CAAC,MAAM,cACd,KAAC,OAAO,IACN,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,UAAU,EAAE,KAAK,CAAC,UAAU,EAC5B,aAAa,EAAE,KAAK,CAAC,aAAa,EAClC,aAAa,EAAE,KAAK,CAAC,aAAa,EAClC,YAAY,EAAE,KAAK,CAAC,YAAY,EAChC,eAAe,EAAE,KAAK,CAAC,eAAe,GACtC,GACc,EAClB,KAAC,QAAQ,CAAC,IAAI,IAAC,CAAC,EAAC,OAAO,YACtB,KAAC,QAAQ,IACP,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,SAAS,EAAE,KAAK,CAAC,SAAS,EAC1B,aAAa,EAAE,SAAS,EACxB,eAAe,EAAE,SAAS,EAC1B,YAAY,EAAE,KAAK,CAAC,YAAY,EAChC,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,eAAe,EAAE,KAAK,CAAC,eAAe,GACtC,GACY,IACP,CACZ,CAAC;AACJ,CAAC"}
|
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ChatArea — main chat panel with header, messages, and input.
|
|
3
3
|
*/
|
|
4
|
-
import type { DisplayMessage } from "../types.js";
|
|
4
|
+
import type { DisplayMessage, Room } from "../types.js";
|
|
5
5
|
interface ChatAreaProps {
|
|
6
6
|
messages: readonly DisplayMessage[];
|
|
7
|
+
rooms: readonly Room[];
|
|
7
8
|
currentRoom: string | undefined;
|
|
8
9
|
dmTarget: string | undefined;
|
|
9
10
|
connected: boolean;
|
|
11
|
+
sidebarOpened: boolean;
|
|
12
|
+
onToggleSidebar: () => void;
|
|
10
13
|
onSendAction: (text: string) => void;
|
|
11
14
|
onLeaveRoom: () => void;
|
|
12
15
|
onConnectToMesh: () => void;
|
|
13
16
|
}
|
|
14
|
-
export declare function ChatArea({ messages, currentRoom, dmTarget, connected, onSendAction, onLeaveRoom, onConnectToMesh, }: ChatAreaProps): import("
|
|
17
|
+
export declare function ChatArea({ messages, rooms, currentRoom, dmTarget, connected, sidebarOpened, onToggleSidebar, onSendAction, onLeaveRoom, onConnectToMesh, }: ChatAreaProps): import("react").JSX.Element;
|
|
15
18
|
export {};
|
|
16
19
|
//# sourceMappingURL=ChatArea.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatArea.d.ts","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/ChatArea.tsx"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"ChatArea.d.ts","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/ChatArea.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAIxD,UAAU,aAAa;IACrB,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;IACpC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,eAAe,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,wBAAgB,QAAQ,CAAC,EACvB,QAAQ,EACR,KAAK,EACL,WAAW,EACX,QAAQ,EACR,SAAS,EACT,aAAa,EACb,eAAe,EACf,YAAY,EACZ,WAAW,EACX,eAAe,GAChB,EAAE,aAAa,+BAsFf"}
|
|
@@ -1,14 +1,18 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
3
|
* ChatArea — main chat panel with header, messages, and input.
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { Burger, Button, Group, Stack, Text, TextInput } from "@mantine/core";
|
|
6
|
+
import { useState } from "react";
|
|
7
7
|
import { parseInput } from "../input.js";
|
|
8
8
|
import { MessageList } from "./MessageList.js";
|
|
9
|
-
export function ChatArea({ messages, currentRoom, dmTarget, connected, onSendAction, onLeaveRoom, onConnectToMesh, }) {
|
|
9
|
+
export function ChatArea({ messages, rooms, currentRoom, dmTarget, connected, sidebarOpened, onToggleSidebar, onSendAction, onLeaveRoom, onConnectToMesh, }) {
|
|
10
10
|
const [inputText, setInputText] = useState("");
|
|
11
|
-
|
|
11
|
+
// currentRoom is the room's real owner-qualified id (`<owner-hex>/<local-name>`), not something meant for display -- resolve it back to the plain name the room was created with, the same name the sidebar list already shows, rather than surfacing the internal id verbatim.
|
|
12
|
+
const currentRoomName = currentRoom === undefined
|
|
13
|
+
? undefined
|
|
14
|
+
: (rooms.find((room) => room.id === currentRoom)?.name ?? currentRoom);
|
|
15
|
+
const headerText = currentRoomName ??
|
|
12
16
|
(dmTarget !== undefined ? `DM with ${dmTarget}` : "Select a room");
|
|
13
17
|
const handleSend = () => {
|
|
14
18
|
const trimmed = inputText.trim();
|
|
@@ -32,8 +36,8 @@ export function ChatArea({ messages, currentRoom, dmTarget, connected, onSendAct
|
|
|
32
36
|
if (e.key === "Enter")
|
|
33
37
|
handleSend();
|
|
34
38
|
};
|
|
35
|
-
return (_jsxs("
|
|
36
|
-
setInputText(
|
|
37
|
-
}, onKeyDown: handleKeyDown }), _jsx(
|
|
39
|
+
return (_jsxs(Stack, { h: "100%", gap: 0, children: [_jsxs(Group, { component: "header", justify: "space-between", px: "md", py: "sm", bg: "dark.6", children: [_jsxs(Group, { gap: "sm", children: [_jsx(Burger, { opened: sidebarOpened, onClick: onToggleSidebar, size: "sm", "aria-label": "Toggle sidebar" }), _jsx(Text, { fw: 600, children: headerText })] }), currentRoom !== undefined && (_jsx(Button, { size: "xs", variant: "subtle", onClick: onLeaveRoom, children: "Leave" }))] }), _jsx(MessageList, { messages: messages }), !connected && messages.length === 0 && (_jsxs(Stack, { align: "center", justify: "center", gap: "md", p: "xl", children: [_jsx(Text, { c: "dimmed", children: "Connect to a local mesh to discover agents and rooms." }), _jsx(Button, { variant: "outline", onClick: onConnectToMesh, children: "Connect to local mesh" })] })), _jsxs(Group, { px: "md", py: "sm", gap: "xs", bg: "dark.6", children: [_jsx(TextInput, { flex: 1, placeholder: "Type a message or /command...", "aria-label": "Message", autoComplete: "off", value: inputText, onChange: (e) => {
|
|
40
|
+
setInputText(e.target.value);
|
|
41
|
+
}, onKeyDown: handleKeyDown }), _jsx(Button, { onClick: handleSend, children: "Send" })] })] }));
|
|
38
42
|
}
|
|
39
43
|
//# sourceMappingURL=ChatArea.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatArea.js","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/ChatArea.tsx"],"names":[],"mappings":";AAAA;;GAEG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"ChatArea.js","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/ChatArea.tsx"],"names":[],"mappings":";AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAe/C,MAAM,UAAU,QAAQ,CAAC,EACvB,QAAQ,EACR,KAAK,EACL,WAAW,EACX,QAAQ,EACR,SAAS,EACT,aAAa,EACb,eAAe,EACf,YAAY,EACZ,WAAW,EACX,eAAe,GACD;IACd,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAE/C,gRAAgR;IAChR,MAAM,eAAe,GACnB,WAAW,KAAK,SAAS;QACvB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,WAAW,CAAC,EAAE,IAAI,IAAI,WAAW,CAAC,CAAC;IAE3E,MAAM,UAAU,GACd,eAAe;QACf,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,QAAQ,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IAErE,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC1D,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,QAAQ;gBACX,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM;YACR,KAAK,OAAO;gBACV,wDAAwD;gBACxD,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM;YACR,KAAK,SAAS;gBACZ,MAAM;QACV,CAAC;QACD,YAAY,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,CAAwC,EAAE,EAAE;QACjE,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO;YAAE,UAAU,EAAE,CAAC;IACtC,CAAC,CAAC;IAEF,OAAO,CACL,MAAC,KAAK,IAAC,CAAC,EAAC,MAAM,EAAC,GAAG,EAAE,CAAC,aACpB,MAAC,KAAK,IACJ,SAAS,EAAC,QAAQ,EAClB,OAAO,EAAC,eAAe,EACvB,EAAE,EAAC,IAAI,EACP,EAAE,EAAC,IAAI,EACP,EAAE,EAAC,QAAQ,aAEX,MAAC,KAAK,IAAC,GAAG,EAAC,IAAI,aACb,KAAC,MAAM,IACL,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,eAAe,EACxB,IAAI,EAAC,IAAI,gBACE,gBAAgB,GAC3B,EACF,KAAC,IAAI,IAAC,EAAE,EAAE,GAAG,YAAG,UAAU,GAAQ,IAC5B,EACP,WAAW,KAAK,SAAS,IAAI,CAC5B,KAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAE,WAAW,sBAE9C,CACV,IACK,EACR,KAAC,WAAW,IAAC,QAAQ,EAAE,QAAQ,GAAI,EAClC,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CACtC,MAAC,KAAK,IAAC,KAAK,EAAC,QAAQ,EAAC,OAAO,EAAC,QAAQ,EAAC,GAAG,EAAC,IAAI,EAAC,CAAC,EAAC,IAAI,aACpD,KAAC,IAAI,IAAC,CAAC,EAAC,QAAQ,sEAET,EACP,KAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAE,eAAe,sCAEzC,IACH,CACT,EACD,MAAC,KAAK,IAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,EAAE,EAAC,QAAQ,aACzC,KAAC,SAAS,IACR,IAAI,EAAE,CAAC,EACP,WAAW,EAAC,+BAA+B,gBAChC,SAAS,EACpB,YAAY,EAAC,KAAK,EAClB,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;4BACd,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wBAC/B,CAAC,EACD,SAAS,EAAE,aAAa,GACxB,EACF,KAAC,MAAM,IAAC,OAAO,EAAE,UAAU,qBAAe,IACpC,IACF,CACT,CAAC;AACJ,CAAC"}
|
|
@@ -6,6 +6,6 @@ interface CreateRoomFormProps {
|
|
|
6
6
|
onSubmit: (name: string, type: "public" | "private" | "secret", description: string) => void;
|
|
7
7
|
onCancel: () => void;
|
|
8
8
|
}
|
|
9
|
-
export declare function CreateRoomForm({ visible, onSubmit, onCancel, }: CreateRoomFormProps): import("
|
|
9
|
+
export declare function CreateRoomForm({ visible, onSubmit, onCancel, }: CreateRoomFormProps): import("react").JSX.Element | null;
|
|
10
10
|
export {};
|
|
11
11
|
//# sourceMappingURL=CreateRoomForm.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateRoomForm.d.ts","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/CreateRoomForm.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAKH,UAAU,mBAAmB;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,CACR,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,EACrC,WAAW,EAAE,MAAM,KAChB,IAAI,CAAC;IACV,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;
|
|
1
|
+
{"version":3,"file":"CreateRoomForm.d.ts","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/CreateRoomForm.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAKH,UAAU,mBAAmB;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,CACR,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,EACrC,WAAW,EAAE,MAAM,KAChB,IAAI,CAAC;IACV,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAcD,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,QAAQ,EACR,QAAQ,GACT,EAAE,mBAAmB,sCAsErB"}
|
|
@@ -1,9 +1,17 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
3
|
* CreateRoomForm — inline form for creating a new room.
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { Button, Group, Select, Stack, TextInput } from "@mantine/core";
|
|
6
|
+
import { useState } from "react";
|
|
7
|
+
const ROOM_TYPE_OPTIONS = [
|
|
8
|
+
{ value: "public", label: "Public" },
|
|
9
|
+
{ value: "private", label: "Private" },
|
|
10
|
+
{ value: "secret", label: "Secret" },
|
|
11
|
+
];
|
|
12
|
+
function isRoomType(value) {
|
|
13
|
+
return value === "public" || value === "private" || value === "secret";
|
|
14
|
+
}
|
|
7
15
|
export function CreateRoomForm({ visible, onSubmit, onCancel, }) {
|
|
8
16
|
const [name, setName] = useState("");
|
|
9
17
|
const [roomType, setRoomType] = useState("public");
|
|
@@ -19,15 +27,13 @@ export function CreateRoomForm({ visible, onSubmit, onCancel, }) {
|
|
|
19
27
|
setRoomType("public");
|
|
20
28
|
setDescription("");
|
|
21
29
|
};
|
|
22
|
-
return (_jsx("
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
setDescription(inputFromEvent(e).value);
|
|
31
|
-
} })] }), _jsxs("div", { class: "create-room-btns", children: [_jsx("button", { type: "submit", class: "create-room-submit", children: "Create" }), _jsx("button", { type: "button", class: "create-room-cancel", onClick: onCancel, children: "Cancel" })] })] }) }));
|
|
30
|
+
return (_jsx("form", { onSubmit: handleSubmit, children: _jsxs(Stack, { gap: "xs", p: "xs", children: [_jsx(TextInput, { label: "Room name", name: "room-name", required: true, placeholder: "e.g. project-alpha", size: "xs", value: name, onChange: (e) => {
|
|
31
|
+
setName(e.target.value);
|
|
32
|
+
} }), _jsx(Select, { label: "Type", name: "room-type", size: "xs", data: ROOM_TYPE_OPTIONS, value: roomType, allowDeselect: false, onChange: (value) => {
|
|
33
|
+
if (isRoomType(value))
|
|
34
|
+
setRoomType(value);
|
|
35
|
+
} }), _jsx(TextInput, { label: "Description (optional)", name: "room-description", placeholder: "What is this room about?", size: "xs", value: description, onChange: (e) => {
|
|
36
|
+
setDescription(e.target.value);
|
|
37
|
+
} }), _jsxs(Group, { gap: "xs", children: [_jsx(Button, { type: "submit", size: "xs", flex: 1, children: "Create" }), _jsx(Button, { type: "button", size: "xs", flex: 1, variant: "default", onClick: onCancel, children: "Cancel" })] })] }) }));
|
|
32
38
|
}
|
|
33
39
|
//# sourceMappingURL=CreateRoomForm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateRoomForm.js","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/CreateRoomForm.tsx"],"names":[],"mappings":";AAAA;;GAEG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"CreateRoomForm.js","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/CreateRoomForm.tsx"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,6 @@ interface JoinFormProps {
|
|
|
6
6
|
onSubmit: (roomName: string) => void;
|
|
7
7
|
onCancel: () => void;
|
|
8
8
|
}
|
|
9
|
-
export declare function JoinForm({ visible, onSubmit, onCancel }: JoinFormProps): import("
|
|
9
|
+
export declare function JoinForm({ visible, onSubmit, onCancel }: JoinFormProps): import("react").JSX.Element | null;
|
|
10
10
|
export {};
|
|
11
11
|
//# sourceMappingURL=JoinForm.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JoinForm.d.ts","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/JoinForm.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAKH,UAAU,aAAa;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,QAAQ,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"JoinForm.d.ts","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/JoinForm.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAKH,UAAU,aAAa;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,QAAQ,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,aAAa,sCAqCtE"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
3
|
* JoinForm — inline form for joining a room by name.
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { Button, Group, TextInput } from "@mantine/core";
|
|
6
|
+
import { useState } from "react";
|
|
7
7
|
export function JoinForm({ visible, onSubmit, onCancel }) {
|
|
8
8
|
const [roomName, setRoomName] = useState("");
|
|
9
9
|
if (!visible)
|
|
10
|
-
return
|
|
10
|
+
return null;
|
|
11
11
|
const handleSubmit = () => {
|
|
12
12
|
const trimmed = roomName.trim();
|
|
13
13
|
if (trimmed) {
|
|
@@ -21,8 +21,8 @@ export function JoinForm({ visible, onSubmit, onCancel }) {
|
|
|
21
21
|
if (e.key === "Escape")
|
|
22
22
|
onCancel();
|
|
23
23
|
};
|
|
24
|
-
return (_jsxs(
|
|
25
|
-
setRoomName(
|
|
26
|
-
}, onKeyDown: handleKeyDown }), _jsx(
|
|
24
|
+
return (_jsxs(Group, { gap: "xs", py: 4, children: [_jsx(TextInput, { flex: 1, size: "xs", placeholder: "Room name...", "aria-label": "Room name", autoComplete: "off", value: roomName, onChange: (e) => {
|
|
25
|
+
setRoomName(e.target.value);
|
|
26
|
+
}, onKeyDown: handleKeyDown }), _jsx(Button, { size: "xs", onClick: handleSubmit, children: "Join" })] }));
|
|
27
27
|
}
|
|
28
28
|
//# sourceMappingURL=JoinForm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JoinForm.js","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/JoinForm.tsx"],"names":[],"mappings":";AAAA;;GAEG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"JoinForm.js","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/JoinForm.tsx"],"names":[],"mappings":";AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAQjC,MAAM,UAAU,QAAQ,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAiB;IACrE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAE7C,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,OAAO,EAAE,CAAC;YACZ,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClB,WAAW,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,CAAwC,EAAE,EAAE;QACjE,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO;YAAE,YAAY,EAAE,CAAC;QACtC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;YAAE,QAAQ,EAAE,CAAC;IACrC,CAAC,CAAC;IAEF,OAAO,CACL,MAAC,KAAK,IAAC,GAAG,EAAC,IAAI,EAAC,EAAE,EAAE,CAAC,aACnB,KAAC,SAAS,IACR,IAAI,EAAE,CAAC,EACP,IAAI,EAAC,IAAI,EACT,WAAW,EAAC,cAAc,gBACf,WAAW,EACtB,YAAY,EAAC,KAAK,EAClB,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;oBACd,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC9B,CAAC,EACD,SAAS,EAAE,aAAa,GACxB,EACF,KAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAE,YAAY,qBAE9B,IACH,CACT,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Message.d.ts","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/Message.tsx"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"Message.d.ts","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/Message.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,wBAAgB,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,cAAc,CAAA;CAAE,+BA0C/D"}
|
|
@@ -1,15 +1,19 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "
|
|
2
|
-
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Message — renders a single display message.
|
|
4
|
+
*/
|
|
5
|
+
import { Badge, Group, Text } from "@mantine/core";
|
|
6
|
+
import { formatTime } from "../messages.js";
|
|
3
7
|
export function Message({ message }) {
|
|
4
8
|
switch (message.type) {
|
|
5
9
|
case "chat":
|
|
6
|
-
return (_jsxs("
|
|
10
|
+
return (_jsxs(Group, { gap: "xs", wrap: "wrap", align: "baseline", children: [_jsx(Text, { fw: 600, c: "accent", span: true, children: message.sender }), _jsx(Text, { c: "dimmed", size: "xs", span: true, children: formatTime(message.timestamp) }), _jsxs(Text, { span: true, children: [": ", message.content] })] }));
|
|
7
11
|
case "dm":
|
|
8
|
-
return (_jsxs(
|
|
12
|
+
return (_jsxs(Group, { gap: "xs", wrap: "wrap", align: "baseline", children: [_jsx(Badge, { color: "grape", size: "xs", children: "DM" }), _jsx(Text, { fw: 600, c: "accent", span: true, children: message.sender }), _jsx(Text, { c: "dimmed", size: "xs", span: true, children: formatTime(message.timestamp) }), _jsxs(Text, { span: true, children: [": ", message.content] })] }));
|
|
9
13
|
case "system":
|
|
10
|
-
return _jsx(
|
|
14
|
+
return (_jsx(Text, { c: "dimmed", fs: "italic", size: "sm", children: message.text }));
|
|
11
15
|
case "status":
|
|
12
|
-
return _jsx(
|
|
16
|
+
return (_jsx(Text, { c: "yellow", size: "xs", children: message.text }));
|
|
13
17
|
}
|
|
14
18
|
}
|
|
15
19
|
//# sourceMappingURL=Message.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Message.js","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/Message.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"Message.js","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/Message.tsx"],"names":[],"mappings":";AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,MAAM,UAAU,OAAO,CAAC,EAAE,OAAO,EAA+B;IAC9D,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,MAAM;YACT,OAAO,CACL,MAAC,KAAK,IAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,MAAM,EAAC,KAAK,EAAC,UAAU,aAC1C,KAAC,IAAI,IAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAC,QAAQ,EAAC,IAAI,kBAC3B,OAAO,CAAC,MAAM,GACV,EACP,KAAC,IAAI,IAAC,CAAC,EAAC,QAAQ,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,kBAC5B,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,GACzB,EACP,MAAC,IAAI,IAAC,IAAI,yBAAI,OAAO,CAAC,OAAO,IAAQ,IAC/B,CACT,CAAC;QACJ,KAAK,IAAI;YACP,OAAO,CACL,MAAC,KAAK,IAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,MAAM,EAAC,KAAK,EAAC,UAAU,aAC1C,KAAC,KAAK,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,mBAEtB,EACR,KAAC,IAAI,IAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAC,QAAQ,EAAC,IAAI,kBAC3B,OAAO,CAAC,MAAM,GACV,EACP,KAAC,IAAI,IAAC,CAAC,EAAC,QAAQ,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,kBAC5B,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,GACzB,EACP,MAAC,IAAI,IAAC,IAAI,yBAAI,OAAO,CAAC,OAAO,IAAQ,IAC/B,CACT,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO,CACL,KAAC,IAAI,IAAC,CAAC,EAAC,QAAQ,EAAC,EAAE,EAAC,QAAQ,EAAC,IAAI,EAAC,IAAI,YACnC,OAAO,CAAC,IAAI,GACR,CACR,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO,CACL,KAAC,IAAI,IAAC,CAAC,EAAC,QAAQ,EAAC,IAAI,EAAC,IAAI,YACvB,OAAO,CAAC,IAAI,GACR,CACR,CAAC;IACN,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/MessageList.tsx"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/MessageList.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;CACrC,+BAwBA"}
|
|
@@ -1,16 +1,18 @@
|
|
|
1
|
-
import { jsx as _jsx } from "
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
3
|
* MessageList — scrollable message area with auto-scroll.
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
5
|
+
import { ScrollArea, Stack } from "@mantine/core";
|
|
6
|
+
import { useEffect, useRef } from "react";
|
|
6
7
|
import { Message } from "./Message.js";
|
|
7
8
|
export function MessageList({ messages, }) {
|
|
8
|
-
const
|
|
9
|
+
const viewportRef = useRef(null);
|
|
9
10
|
useEffect(() => {
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
const viewport = viewportRef.current;
|
|
12
|
+
if (viewport) {
|
|
13
|
+
viewport.scrollTop = viewport.scrollHeight;
|
|
12
14
|
}
|
|
13
15
|
}, [messages.length]);
|
|
14
|
-
return (_jsx("
|
|
16
|
+
return (_jsx(ScrollArea, { flex: 1, p: "md", viewportRef: viewportRef, "aria-label": "Conversation", children: _jsx(Stack, { gap: 4, children: messages.map((msg, i) => (_jsx(Message, { message: msg }, i))) }) }));
|
|
15
17
|
}
|
|
16
18
|
//# sourceMappingURL=MessageList.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageList.js","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/MessageList.tsx"],"names":[],"mappings":";AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"MessageList.js","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/MessageList.tsx"],"names":[],"mappings":";AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,UAAU,WAAW,CAAC,EAC1B,QAAQ,GAGT;IACC,MAAM,WAAW,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAEjD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC;QACrC,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,SAAS,GAAG,QAAQ,CAAC,YAAY,CAAC;QAC7C,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAEtB,OAAO,CACL,KAAC,UAAU,IACT,IAAI,EAAE,CAAC,EACP,CAAC,EAAC,IAAI,EACN,WAAW,EAAE,WAAW,gBACb,cAAc,YAEzB,KAAC,KAAK,IAAC,GAAG,EAAE,CAAC,YACV,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CACxB,KAAC,OAAO,IAAS,OAAO,EAAE,GAAG,IAAf,CAAC,CAAkB,CAClC,CAAC,GACI,GACG,CACd,CAAC;AACJ,CAAC"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ProjectTree — recursive tree view of agents grouped by working directory.
|
|
3
3
|
*
|
|
4
|
-
* Shows directories as expandable/collapsible nodes with agents nested inside.
|
|
5
|
-
* Manual rooms appear in a separate flat list below the tree.
|
|
4
|
+
* Shows directories as expandable/collapsible nodes with agents nested inside. Manual rooms appear in a separate flat list below the tree.
|
|
6
5
|
*/
|
|
7
6
|
import type { ProjectTree as ProjectTreeData } from "../types.js";
|
|
8
7
|
interface ProjectTreeProps {
|
|
@@ -12,6 +11,6 @@ interface ProjectTreeProps {
|
|
|
12
11
|
onRenameAgent: (agentId: string, newName: string) => void;
|
|
13
12
|
currentRoom: string | undefined;
|
|
14
13
|
}
|
|
15
|
-
export declare function ProjectTree({ tree, onJoinRoom, onSelectAgent, onRenameAgent, currentRoom, }: ProjectTreeProps): import("
|
|
14
|
+
export declare function ProjectTree({ tree, onJoinRoom, onSelectAgent, onRenameAgent, currentRoom, }: ProjectTreeProps): import("react").JSX.Element;
|
|
16
15
|
export {};
|
|
17
16
|
//# sourceMappingURL=ProjectTree.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectTree.d.ts","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/ProjectTree.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ProjectTree.d.ts","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/ProjectTree.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAGV,WAAW,IAAI,eAAe,EAE/B,MAAM,aAAa,CAAC;AAErB,UAAU,gBAAgB;IACxB,IAAI,EAAE,eAAe,CAAC;IACtB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAsBD,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,UAAU,EACV,aAAa,EACb,aAAa,EACb,WAAW,GACZ,EAAE,gBAAgB,+BAgClB"}
|
|
@@ -1,16 +1,27 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
3
|
* ProjectTree — recursive tree view of agents grouped by working directory.
|
|
4
4
|
*
|
|
5
|
-
* Shows directories as expandable/collapsible nodes with agents nested inside.
|
|
6
|
-
* Manual rooms appear in a separate flat list below the tree.
|
|
5
|
+
* Shows directories as expandable/collapsible nodes with agents nested inside. Manual rooms appear in a separate flat list below the tree.
|
|
7
6
|
*/
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
7
|
+
import { Box, NavLink, Text, TextInput } from "@mantine/core";
|
|
8
|
+
import { useEffect, useRef, useState } from "react";
|
|
9
|
+
const STATUS_DOT_COLORS = {
|
|
10
|
+
active: "green",
|
|
11
|
+
idle: "yellow",
|
|
12
|
+
busy: "red",
|
|
13
|
+
offline: "gray",
|
|
14
|
+
};
|
|
15
|
+
function StatusDot({ status }) {
|
|
16
|
+
return (_jsx(Box, { w: 8, h: 8, style: {
|
|
17
|
+
borderRadius: "50%",
|
|
18
|
+
backgroundColor: `var(--mantine-color-${STATUS_DOT_COLORS[status]}-6)`,
|
|
19
|
+
} }));
|
|
20
|
+
}
|
|
10
21
|
export function ProjectTree({ tree, onJoinRoom, onSelectAgent, onRenameAgent, currentRoom, }) {
|
|
11
|
-
return (_jsxs(
|
|
22
|
+
return (_jsxs(Box, { mb: "xs", children: [tree.roots.map((node) => (_jsx(TreeNodeView, { node: node, onJoinRoom: onJoinRoom, onSelectAgent: onSelectAgent, onRenameAgent: onRenameAgent, currentRoom: currentRoom }, node.type === "agent" ? node.agentId : node.path))), tree.manualRooms.length > 0 && (_jsxs(Box, { py: 4, children: [_jsx(Text, { size: "xs", c: "dimmed", fw: 700, tt: "uppercase", px: "xs", py: 4, children: "Rooms" }), tree.manualRooms.map((room) => (_jsx(NavLink, { label: `${room.name} (${String(room.members.length)})`, active: currentRoom === room.id, onClick: () => {
|
|
12
23
|
onJoinRoom(room.id);
|
|
13
|
-
}
|
|
24
|
+
} }, room.id)))] }))] }));
|
|
14
25
|
}
|
|
15
26
|
function TreeNodeView({ node, onJoinRoom, onSelectAgent, onRenameAgent, currentRoom, }) {
|
|
16
27
|
if (node.type === "agent") {
|
|
@@ -19,20 +30,25 @@ function TreeNodeView({ node, onJoinRoom, onSelectAgent, onRenameAgent, currentR
|
|
|
19
30
|
return (_jsx(DirectoryView, { node: node, onJoinRoom: onJoinRoom, onSelectAgent: onSelectAgent, onRenameAgent: onRenameAgent, currentRoom: currentRoom }));
|
|
20
31
|
}
|
|
21
32
|
function DirectoryView({ node, onJoinRoom, onSelectAgent, onRenameAgent, currentRoom, }) {
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
33
|
+
const roomId = node.roomId;
|
|
34
|
+
const isCurrentRoom = currentRoom === roomId;
|
|
35
|
+
const clickProps = roomId === undefined
|
|
36
|
+
? {}
|
|
37
|
+
: {
|
|
38
|
+
onClick: () => {
|
|
39
|
+
onJoinRoom(roomId);
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
return (_jsx(NavLink, { label: node.name, leftSection: _jsx("span", { "aria-hidden": "true", children: "\uD83D\uDCC1" }), defaultOpened: true, active: isCurrentRoom, ...clickProps, children: node.children.map((child) => (_jsx(TreeNodeView, { node: child, onJoinRoom: onJoinRoom, onSelectAgent: onSelectAgent, onRenameAgent: onRenameAgent, currentRoom: currentRoom }, child.type === "agent" ? child.agentId : child.path))) }));
|
|
32
43
|
}
|
|
33
44
|
function AgentView({ node, onSelectAgent, onRenameAgent }) {
|
|
34
45
|
const [editing, setEditing] = useState(false);
|
|
35
46
|
const [editName, setEditName] = useState("");
|
|
47
|
+
const renameInputRef = useRef(null);
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
if (editing)
|
|
50
|
+
renameInputRef.current?.focus();
|
|
51
|
+
}, [editing]);
|
|
36
52
|
const handleDoubleClick = () => {
|
|
37
53
|
setEditName(node.name);
|
|
38
54
|
setEditing(true);
|
|
@@ -51,12 +67,12 @@ function AgentView({ node, onSelectAgent, onRenameAgent }) {
|
|
|
51
67
|
setEditing(false);
|
|
52
68
|
};
|
|
53
69
|
if (editing) {
|
|
54
|
-
return (
|
|
55
|
-
|
|
56
|
-
|
|
70
|
+
return (_jsx(TextInput, { ref: renameInputRef, size: "xs", ml: "md", "aria-label": `Rename ${node.name}`, value: editName, onChange: (e) => {
|
|
71
|
+
setEditName(e.target.value);
|
|
72
|
+
}, onKeyDown: handleKeyDown, onBlur: handleSubmit }));
|
|
57
73
|
}
|
|
58
|
-
return (
|
|
74
|
+
return (_jsx(NavLink, { label: node.name, leftSection: _jsx(StatusDot, { status: node.status }), onClick: () => {
|
|
59
75
|
onSelectAgent(node.agentId);
|
|
60
|
-
},
|
|
76
|
+
}, onDoubleClick: handleDoubleClick }));
|
|
61
77
|
}
|
|
62
78
|
//# sourceMappingURL=ProjectTree.js.map
|