agent-comms 1.13.0 → 1.14.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 (122) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +1 -1
  3. package/dist/bridges/pi/index.d.ts +5 -2
  4. package/dist/bridges/pi/index.d.ts.map +1 -1
  5. package/dist/bridges/pi/index.js +89 -6
  6. package/dist/bridges/pi/index.js.map +1 -1
  7. package/dist/bridges/user/controller.d.ts +1 -0
  8. package/dist/bridges/user/controller.d.ts.map +1 -1
  9. package/dist/bridges/user/controller.js +12 -0
  10. package/dist/bridges/user/controller.js.map +1 -1
  11. package/dist/bridges/user/tui.js +2 -0
  12. package/dist/bridges/user/tui.js.map +1 -1
  13. package/dist/bridges/user/web/build.d.ts +3 -5
  14. package/dist/bridges/user/web/build.d.ts.map +1 -1
  15. package/dist/bridges/user/web/build.js +11 -36
  16. package/dist/bridges/user/web/build.js.map +1 -1
  17. package/dist/bridges/user/web/frontend/components/App.d.ts +23 -0
  18. package/dist/bridges/user/web/frontend/components/App.d.ts.map +1 -0
  19. package/dist/bridges/user/web/frontend/components/App.js +7 -0
  20. package/dist/bridges/user/web/frontend/components/App.js.map +1 -0
  21. package/dist/bridges/user/web/frontend/components/ChatArea.d.ts +14 -0
  22. package/dist/bridges/user/web/frontend/components/ChatArea.d.ts.map +1 -0
  23. package/dist/bridges/user/web/frontend/components/ChatArea.js +38 -0
  24. package/dist/bridges/user/web/frontend/components/ChatArea.js.map +1 -0
  25. package/dist/bridges/user/web/frontend/components/CreateRoomForm.d.ts +11 -0
  26. package/dist/bridges/user/web/frontend/components/CreateRoomForm.d.ts.map +1 -0
  27. package/dist/bridges/user/web/frontend/components/CreateRoomForm.js +33 -0
  28. package/dist/bridges/user/web/frontend/components/CreateRoomForm.js.map +1 -0
  29. package/dist/bridges/user/web/frontend/components/JoinForm.d.ts +11 -0
  30. package/dist/bridges/user/web/frontend/components/JoinForm.d.ts.map +1 -0
  31. package/dist/bridges/user/web/frontend/components/JoinForm.js +28 -0
  32. package/dist/bridges/user/web/frontend/components/JoinForm.js.map +1 -0
  33. package/dist/bridges/user/web/frontend/components/Message.d.ts +8 -0
  34. package/dist/bridges/user/web/frontend/components/Message.d.ts.map +1 -0
  35. package/dist/bridges/user/web/frontend/components/Message.js +15 -0
  36. package/dist/bridges/user/web/frontend/components/Message.js.map +1 -0
  37. package/dist/bridges/user/web/frontend/components/MessageList.d.ts +8 -0
  38. package/dist/bridges/user/web/frontend/components/MessageList.d.ts.map +1 -0
  39. package/dist/bridges/user/web/frontend/components/MessageList.js +16 -0
  40. package/dist/bridges/user/web/frontend/components/MessageList.js.map +1 -0
  41. package/dist/bridges/user/web/frontend/components/ProjectTree.d.ts +17 -0
  42. package/dist/bridges/user/web/frontend/components/ProjectTree.d.ts.map +1 -0
  43. package/dist/bridges/user/web/frontend/components/ProjectTree.js +59 -0
  44. package/dist/bridges/user/web/frontend/components/ProjectTree.js.map +1 -0
  45. package/dist/bridges/user/web/frontend/components/Sidebar.d.ts +16 -0
  46. package/dist/bridges/user/web/frontend/components/Sidebar.d.ts.map +1 -0
  47. package/dist/bridges/user/web/frontend/components/Sidebar.js +31 -0
  48. package/dist/bridges/user/web/frontend/components/Sidebar.js.map +1 -0
  49. package/dist/bridges/user/web/frontend/dom.d.ts +12 -22
  50. package/dist/bridges/user/web/frontend/dom.d.ts.map +1 -1
  51. package/dist/bridges/user/web/frontend/dom.js +24 -49
  52. package/dist/bridges/user/web/frontend/dom.js.map +1 -1
  53. package/dist/bridges/user/web/frontend/input.d.ts +15 -0
  54. package/dist/bridges/user/web/frontend/input.d.ts.map +1 -1
  55. package/dist/bridges/user/web/frontend/input.js +38 -0
  56. package/dist/bridges/user/web/frontend/input.js.map +1 -1
  57. package/dist/bridges/user/web/frontend/main.d.ts +3 -3
  58. package/dist/bridges/user/web/frontend/main.d.ts.map +1 -1
  59. package/dist/bridges/user/web/frontend/main.js +65 -50
  60. package/dist/bridges/user/web/frontend/main.js.map +1 -1
  61. package/dist/bridges/user/web/frontend/messages.d.ts +17 -0
  62. package/dist/bridges/user/web/frontend/messages.d.ts.map +1 -0
  63. package/dist/bridges/user/web/frontend/messages.js +82 -0
  64. package/dist/bridges/user/web/frontend/messages.js.map +1 -0
  65. package/dist/bridges/user/web/frontend/project-tree.d.ts +9 -0
  66. package/dist/bridges/user/web/frontend/project-tree.d.ts.map +1 -0
  67. package/dist/bridges/user/web/frontend/project-tree.js +173 -0
  68. package/dist/bridges/user/web/frontend/project-tree.js.map +1 -0
  69. package/dist/bridges/user/web/frontend/state.d.ts +8 -1
  70. package/dist/bridges/user/web/frontend/state.d.ts.map +1 -1
  71. package/dist/bridges/user/web/frontend/state.js +17 -1
  72. package/dist/bridges/user/web/frontend/state.js.map +1 -1
  73. package/dist/bridges/user/web/frontend/types.d.ts +52 -0
  74. package/dist/bridges/user/web/frontend/types.d.ts.map +1 -1
  75. package/dist/bridges/user/web/server.d.ts.map +1 -1
  76. package/dist/bridges/user/web/server.js +26 -3
  77. package/dist/bridges/user/web/server.js.map +1 -1
  78. package/dist/bridges/user/web/test/web-server.integration.test.d.ts +7 -0
  79. package/dist/bridges/user/web/test/web-server.integration.test.d.ts.map +1 -0
  80. package/dist/bridges/user/web/test/web-server.integration.test.js +187 -0
  81. package/dist/bridges/user/web/test/web-server.integration.test.js.map +1 -0
  82. package/dist/core/bridge.d.ts +15 -0
  83. package/dist/core/bridge.d.ts.map +1 -1
  84. package/dist/core/bridge.js +60 -0
  85. package/dist/core/bridge.js.map +1 -1
  86. package/dist/core/index.d.ts +1 -1
  87. package/dist/core/index.d.ts.map +1 -1
  88. package/dist/core/index.js +1 -1
  89. package/dist/core/index.js.map +1 -1
  90. package/dist/core/mesh-store.d.ts +3 -0
  91. package/dist/core/mesh-store.d.ts.map +1 -1
  92. package/dist/core/mesh-store.js +107 -7
  93. package/dist/core/mesh-store.js.map +1 -1
  94. package/dist/core/test/bridge.unit.test.d.ts +5 -0
  95. package/dist/core/test/bridge.unit.test.d.ts.map +1 -0
  96. package/dist/core/test/bridge.unit.test.js +120 -0
  97. package/dist/core/test/bridge.unit.test.js.map +1 -0
  98. package/dist/core/types.d.ts +10 -0
  99. package/dist/core/types.d.ts.map +1 -1
  100. package/dist/core/types.js +6 -0
  101. package/dist/core/types.js.map +1 -1
  102. package/package.json +4 -3
  103. package/dist/bridges/user/web/frontend/render.d.ts +0 -30
  104. package/dist/bridges/user/web/frontend/render.d.ts.map +0 -1
  105. package/dist/bridges/user/web/frontend/render.js +0 -129
  106. package/dist/bridges/user/web/frontend/render.js.map +0 -1
  107. package/dist/bridges/user/web/frontend/test/dom.unit.test.d.ts +0 -5
  108. package/dist/bridges/user/web/frontend/test/dom.unit.test.d.ts.map +0 -1
  109. package/dist/bridges/user/web/frontend/test/dom.unit.test.js +0 -149
  110. package/dist/bridges/user/web/frontend/test/dom.unit.test.js.map +0 -1
  111. package/dist/bridges/user/web/frontend/test/input.unit.test.d.ts +0 -5
  112. package/dist/bridges/user/web/frontend/test/input.unit.test.d.ts.map +0 -1
  113. package/dist/bridges/user/web/frontend/test/input.unit.test.js +0 -131
  114. package/dist/bridges/user/web/frontend/test/input.unit.test.js.map +0 -1
  115. package/dist/bridges/user/web/frontend/test/render.unit.test.d.ts +0 -5
  116. package/dist/bridges/user/web/frontend/test/render.unit.test.d.ts.map +0 -1
  117. package/dist/bridges/user/web/frontend/test/render.unit.test.js +0 -436
  118. package/dist/bridges/user/web/frontend/test/render.unit.test.js.map +0 -1
  119. package/dist/bridges/user/web/frontend/test/state.unit.test.d.ts +0 -5
  120. package/dist/bridges/user/web/frontend/test/state.unit.test.d.ts.map +0 -1
  121. package/dist/bridges/user/web/frontend/test/state.unit.test.js +0 -119
  122. package/dist/bridges/user/web/frontend/test/state.unit.test.js.map +0 -1
@@ -1,75 +1,75 @@
1
+ import { jsx as _jsx } from "preact/jsx-runtime";
1
2
  /**
2
- * Entry point — bootstraps the web UI.
3
+ * Entry point — bootstraps the web UI with Preact.
3
4
  *
4
- * Imports all modules, binds DOM events, connects WebSocket,
5
- * and wires up the render loop.
5
+ * Owns the state store, WebSocket connection, and action handlers.
6
+ * Renders the App component on every state change.
6
7
  */
8
+ import { render } from "preact";
7
9
  import "./styles.css";
10
+ import { App } from "./components/App.js";
8
11
  import { CommsWs, fetchAgents, fetchRoomMessages, fetchRooms } from "./api.js";
9
12
  import { requireElement } from "./dom.js";
10
13
  import { parseInput } from "./input.js";
11
- import { clearMessages, renderDeliveryEvent, renderHeader, renderMessageHistory, renderRoomList, renderAgentList, renderSystemMessage, renderStatusMessage, } from "./render.js";
12
14
  import { State } from "./state.js";
15
+ import { deliveryEventToMessage, roomMessageToDisplay } from "./messages.js";
13
16
  // ---------------------------------------------------------------------------
14
- // DOM elements
17
+ // Mount point
15
18
  // ---------------------------------------------------------------------------
16
- const messagesEl = requireElement(document, "#messages");
17
- const inputRaw = requireElement(document, "#input", "input");
18
- const headerEl = requireElement(document, "#header");
19
- const roomListEl = requireElement(document, "#room-list");
20
- const agentListEl = requireElement(document, "#agent-list");
21
- const messageTarget = { messagesEl };
22
- const sidebarTarget = { roomListEl, agentListEl };
19
+ const rootEl = requireElement(document, "#root");
23
20
  // ---------------------------------------------------------------------------
24
21
  // State
25
22
  // ---------------------------------------------------------------------------
26
23
  const state = new State();
27
- // Re-render sidebar on state changes
28
- state.subscribe((s) => {
29
- renderRoomList(document, sidebarTarget, s.rooms, s.currentRoom, onJoinRoom);
30
- renderAgentList(document, sidebarTarget, s.agents, onSelectAgent);
31
- });
24
+ // ---------------------------------------------------------------------------
25
+ // Helpers
26
+ // ---------------------------------------------------------------------------
27
+ function addMessage(msg) {
28
+ state.addMessage(msg);
29
+ }
32
30
  // ---------------------------------------------------------------------------
33
31
  // WebSocket
34
32
  // ---------------------------------------------------------------------------
33
+ let pendingAction;
35
34
  const ws = new CommsWs({
36
35
  onOpen: () => {
37
36
  state.setConnected(true);
38
- renderSystemMessage(document, messageTarget, "Connected to mesh");
37
+ addMessage({ type: "system", text: "Connected to mesh" });
39
38
  },
40
39
  onClose: () => {
41
40
  state.setConnected(false);
42
- renderSystemMessage(document, messageTarget, "Disconnected — reconnecting...");
41
+ addMessage({ type: "system", text: "Disconnected — reconnecting..." });
43
42
  },
44
43
  onFrame: handleFrame,
45
44
  });
46
45
  function handleFrame(frame) {
46
+ const s = state.get();
47
47
  switch (frame.type) {
48
- case "delivery":
49
- renderDeliveryEvent(document, messageTarget, frame.event, state.get().currentRoom);
50
- // Some events require a state refresh
48
+ case "delivery": {
49
+ const msg = deliveryEventToMessage(frame.event, s.currentRoom);
50
+ if (msg)
51
+ addMessage(msg);
51
52
  if (frame.event.type === "member_joined" ||
52
53
  frame.event.type === "member_left" ||
53
54
  frame.event.type === "member_status") {
54
55
  void refreshState();
55
56
  }
56
57
  break;
58
+ }
57
59
  case "result":
58
- renderSystemMessage(document, messageTarget, frame.result.content);
60
+ addMessage({ type: "system", text: frame.result.content });
59
61
  if (!frame.result.isError) {
60
- // Auto-switch current room after successful join_room via command
61
62
  if (pendingAction?.action === "join_room" && !state.get().currentRoom) {
62
63
  const roomId = pendingAction.room;
63
64
  state.setDmTarget(undefined);
64
65
  state.setCurrentRoom(roomId);
65
- renderHeader({ headerEl }, roomId);
66
66
  }
67
67
  void refreshState();
68
68
  }
69
69
  pendingAction = undefined;
70
70
  break;
71
71
  case "error":
72
- renderStatusMessage(document, messageTarget, `Error: ${frame.message}`);
72
+ addMessage({ type: "status", text: `Error: ${frame.message}` });
73
73
  break;
74
74
  case "state":
75
75
  state.applyState(frame.agents, frame.rooms);
@@ -79,7 +79,6 @@ function handleFrame(frame) {
79
79
  // ---------------------------------------------------------------------------
80
80
  // Actions
81
81
  // ---------------------------------------------------------------------------
82
- let pendingAction;
83
82
  function sendAction(action) {
84
83
  pendingAction = action;
85
84
  ws.sendAction(action);
@@ -92,50 +91,66 @@ async function refreshState() {
92
91
  async function onJoinRoom(roomId) {
93
92
  state.setDmTarget(undefined);
94
93
  state.setCurrentRoom(roomId);
95
- renderHeader({ headerEl }, roomId);
96
- clearMessages(messageTarget);
94
+ state.clearMessages();
97
95
  sendAction({ action: "join_room", room: roomId });
98
96
  // Load history
99
97
  const messages = await fetchRoomMessages(roomId);
100
- renderMessageHistory(document, messageTarget, messages);
101
- renderSystemMessage(document, messageTarget, `Joined ${roomId}`);
102
- inputRaw.focus();
98
+ state.setMessages(messages.map(roomMessageToDisplay));
99
+ addMessage({ type: "system", text: `Joined ${roomId}` });
103
100
  }
104
101
  function onSelectAgent(agentId) {
105
102
  state.setCurrentRoom(undefined);
106
103
  state.setDmTarget(agentId);
107
- clearMessages(messageTarget);
108
- renderHeader({ headerEl }, `DM with ${agentId}`);
109
- inputRaw.focus();
104
+ state.clearMessages();
110
105
  }
111
- // ---------------------------------------------------------------------------
112
- // Input handling
113
- // ---------------------------------------------------------------------------
114
- function handleInput() {
115
- const text = inputRaw.value;
116
- inputRaw.value = "";
117
- const result = parseInput(text, state.get().currentRoom, state.get().dmTarget);
106
+ function onLeaveRoom() {
107
+ const currentRoom = state.get().currentRoom;
108
+ if (currentRoom) {
109
+ sendAction({ action: "leave_room", room: currentRoom });
110
+ state.setCurrentRoom(undefined);
111
+ state.clearMessages();
112
+ addMessage({ type: "system", text: `Left room "${currentRoom}"` });
113
+ }
114
+ }
115
+ function handleSendAction(text) {
116
+ const s = state.get();
117
+ const result = parseInput(text, s.currentRoom, s.dmTarget);
118
118
  switch (result.kind) {
119
119
  case "action":
120
120
  sendAction(result.action);
121
121
  break;
122
122
  case "local":
123
- renderSystemMessage(document, messageTarget, result.result.text);
123
+ addMessage({ type: "system", text: result.result.text });
124
124
  break;
125
125
  case "ignored":
126
126
  break;
127
127
  }
128
128
  }
129
- const sendBtn = requireElement(document, "#send-btn");
130
- sendBtn.onclick = handleInput;
131
- inputRaw.addEventListener("keydown", (e) => {
132
- if (e.key === "Enter")
133
- handleInput();
134
- });
129
+ function onCreateRoom(name, type, description) {
130
+ const action = {
131
+ action: "create_room",
132
+ name,
133
+ type,
134
+ ...(description ? { description } : {}),
135
+ };
136
+ sendAction(action);
137
+ }
138
+ function onJoinRoomInput(roomName) {
139
+ void onJoinRoom(roomName);
140
+ }
141
+ // ---------------------------------------------------------------------------
142
+ // Render loop
143
+ // ---------------------------------------------------------------------------
144
+ function rerender() {
145
+ const s = state.get();
146
+ render(_jsx(App, { rooms: s.rooms, agents: s.agents, currentRoom: s.currentRoom, dmTarget: s.dmTarget, messages: s.messages, connected: s.connected, onJoinRoom: (roomId) => {
147
+ void onJoinRoom(roomId);
148
+ }, onSelectAgent: onSelectAgent, onLeaveRoom: onLeaveRoom, onSendAction: handleSendAction, onCreateRoom: onCreateRoom, onJoinRoomInput: onJoinRoomInput }), rootEl);
149
+ }
150
+ state.subscribe(rerender);
135
151
  // ---------------------------------------------------------------------------
136
152
  // Boot
137
153
  // ---------------------------------------------------------------------------
138
154
  ws.connect();
139
155
  void refreshState();
140
- inputRaw.focus();
141
156
  //# sourceMappingURL=main.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/main.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/main.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Message conversion — transforms wire-format events into display messages.
3
+ *
4
+ * Pure functions, no DOM or state dependency. Testable in isolation.
5
+ */
6
+ import type { DeliveryEvent, DisplayMessage, RoomMessage } from "./types.js";
7
+ /**
8
+ * Convert a delivery event to a display message for the UI.
9
+ * Returns undefined if the event should not be displayed
10
+ * (e.g. room_message for a room that isn't currently active).
11
+ */
12
+ export declare function deliveryEventToMessage(event: DeliveryEvent, currentRoom: string | undefined): DisplayMessage | undefined;
13
+ /**
14
+ * Convert a room message (from REST API history) to a display message.
15
+ */
16
+ export declare function roomMessageToDisplay(m: RoomMessage): DisplayMessage;
17
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/messages.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE7E;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,cAAc,GAAG,SAAS,CAoE5B;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,WAAW,GAAG,cAAc,CAOnE"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Message conversion — transforms wire-format events into display messages.
3
+ *
4
+ * Pure functions, no DOM or state dependency. Testable in isolation.
5
+ */
6
+ /**
7
+ * Convert a delivery event to a display message for the UI.
8
+ * Returns undefined if the event should not be displayed
9
+ * (e.g. room_message for a room that isn't currently active).
10
+ */
11
+ export function deliveryEventToMessage(event, currentRoom) {
12
+ switch (event.type) {
13
+ case "room_message":
14
+ if (currentRoom === event.message.room) {
15
+ return {
16
+ type: "chat",
17
+ sender: event.message.from,
18
+ content: event.message.content,
19
+ timestamp: event.message.timestamp,
20
+ };
21
+ }
22
+ return undefined;
23
+ case "dm":
24
+ return {
25
+ type: "dm",
26
+ sender: event.message.from,
27
+ content: event.message.content,
28
+ timestamp: event.message.timestamp,
29
+ };
30
+ case "member_joined":
31
+ return { type: "system", text: `${event.agent} joined ${event.room}` };
32
+ case "member_left":
33
+ return { type: "system", text: `${event.agent} left ${event.room}` };
34
+ case "member_status":
35
+ return {
36
+ type: "status",
37
+ text: `${event.agent} is now ${event.status} in ${event.room}`,
38
+ };
39
+ case "delivery_status":
40
+ return {
41
+ type: "status",
42
+ text: `Message ${event.messageId} ${event.status} by ${event.agent}`,
43
+ };
44
+ case "room_members":
45
+ if (currentRoom === event.room) {
46
+ const memberList = event.members
47
+ .map((m) => `${m.name} (${m.status})`)
48
+ .join(", ");
49
+ return { type: "system", text: `Members: ${memberList}` };
50
+ }
51
+ return undefined;
52
+ case "room_invite": {
53
+ const desc = event.roomDescription ? ` — ${event.roomDescription}` : "";
54
+ return {
55
+ type: "system",
56
+ text: `${event.fromName} invited you to "${event.room}"${desc}`,
57
+ };
58
+ }
59
+ case "invite_declined":
60
+ return {
61
+ type: "system",
62
+ text: `${event.agentName} declined invite to ${event.room}: "${event.reason}"`,
63
+ };
64
+ case "name_changed":
65
+ return {
66
+ type: "system",
67
+ text: `${event.oldName} is now known as ${event.newName}`,
68
+ };
69
+ }
70
+ }
71
+ /**
72
+ * Convert a room message (from REST API history) to a display message.
73
+ */
74
+ export function roomMessageToDisplay(m) {
75
+ return {
76
+ type: "chat",
77
+ sender: m.from,
78
+ content: m.content,
79
+ timestamp: m.timestamp,
80
+ };
81
+ }
82
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Project tree — builds a nested directory tree from agent working directories.
3
+ *
4
+ * Pure function: agents + rooms → ProjectTree. No side effects.
5
+ * Project rooms (auto-created per cwd) are embedded in their directory nodes.
6
+ */
7
+ import type { Agent, ProjectTree, Room } from "./types.js";
8
+ export declare function buildProjectTree(agents: Agent[], rooms: Room[]): ProjectTree;
9
+ //# sourceMappingURL=project-tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-tree.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/project-tree.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAY,MAAM,YAAY,CAAC;AA0DrE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,WAAW,CA8C5E"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Project tree — builds a nested directory tree from agent working directories.
3
+ *
4
+ * Pure function: agents + rooms → ProjectTree. No side effects.
5
+ * Project rooms (auto-created per cwd) are embedded in their directory nodes.
6
+ */
7
+ function insertIntoTrie(node, segments, agent) {
8
+ const [seg, ...rest] = segments;
9
+ if (seg === undefined) {
10
+ node.agents.push(agent);
11
+ return;
12
+ }
13
+ let target = node.children.get(seg);
14
+ if (!target) {
15
+ target = { children: new Map(), agents: [] };
16
+ node.children.set(seg, target);
17
+ }
18
+ insertIntoTrie(target, rest, agent);
19
+ }
20
+ /** Ensure a branch path exists in the trie (creates intermediate nodes). */
21
+ function ensureBranch(node, segments) {
22
+ const [seg, ...rest] = segments;
23
+ if (seg === undefined)
24
+ return;
25
+ let child = node.children.get(seg);
26
+ if (!child) {
27
+ child = { children: new Map(), agents: [] };
28
+ node.children.set(seg, child);
29
+ }
30
+ ensureBranch(child, rest);
31
+ }
32
+ /**
33
+ * Build a nested project tree from agent cwd paths.
34
+ *
35
+ * - Trims the longest common prefix shared by ALL agent paths.
36
+ * - Agents in parent directories appear alongside child directories.
37
+ * - Empty branches are pruned.
38
+ * - Manual rooms (not auto-created per cwd) are separated out.
39
+ * - Children sorted: directories first (alphabetical), then agents (alphabetical).
40
+ */
41
+ const PROJECT_ROOM_PREFIX = "Project room for ";
42
+ /** Check if a room is an auto-created project room. */
43
+ function isProjectRoom(room) {
44
+ return room.description.startsWith(PROJECT_ROOM_PREFIX);
45
+ }
46
+ /** Extract the cwd path from a project room's description. */
47
+ function projectRoomCwd(room) {
48
+ return room.description.slice(PROJECT_ROOM_PREFIX.length);
49
+ }
50
+ export function buildProjectTree(agents, rooms) {
51
+ const manualRooms = rooms.filter((r) => !isProjectRoom(r));
52
+ // Index project rooms by their cwd path
53
+ const projectRoomsByPath = new Map();
54
+ for (const room of rooms) {
55
+ if (isProjectRoom(room)) {
56
+ projectRoomsByPath.set(projectRoomCwd(room), room);
57
+ }
58
+ }
59
+ // Use all project rooms as tree nodes even if no agents are in that directory
60
+ const allPaths = new Set();
61
+ for (const agent of agents) {
62
+ allPaths.add(agent.cwd);
63
+ }
64
+ for (const cwd of projectRoomsByPath.keys()) {
65
+ allPaths.add(cwd);
66
+ }
67
+ if (allPaths.size === 0) {
68
+ return { roots: [], manualRooms };
69
+ }
70
+ const paths = Array.from(allPaths);
71
+ const prefix = commonPathPrefix(paths);
72
+ const prefixSegments = prefix === "/" ? [] : splitPath(prefix);
73
+ // Group agents by their trimmed path
74
+ const root = { children: new Map(), agents: [] };
75
+ for (const agent of agents) {
76
+ const segments = splitPath(agent.cwd).slice(prefixSegments.length);
77
+ insertIntoTrie(root, segments, agent);
78
+ }
79
+ // Ensure directory branches exist for project room paths that have no agents
80
+ for (const cwd of projectRoomsByPath.keys()) {
81
+ const segments = splitPath(cwd).slice(prefixSegments.length);
82
+ ensureBranch(root, segments);
83
+ }
84
+ // Convert branch tree to TreeNode tree, embedding project rooms
85
+ const roots = branchToNodesWithRooms(root, prefix, "", projectRoomsByPath);
86
+ return { roots: sortChildren(roots), manualRooms };
87
+ }
88
+ // ---------------------------------------------------------------------------
89
+ // Internal helpers
90
+ // ---------------------------------------------------------------------------
91
+ function splitPath(p) {
92
+ // "/Users/joe/Developer" → ["Users", "joe", "Developer"]
93
+ return p.split("/").filter((s) => s.length > 0);
94
+ }
95
+ function joinPath(...segments) {
96
+ return "/" + segments.join("/");
97
+ }
98
+ /**
99
+ * Find the longest common parent directory among all paths.
100
+ * Returns "/" if there's no common prefix beyond root.
101
+ */
102
+ function commonPathPrefix(paths) {
103
+ if (paths.length === 0)
104
+ return "/";
105
+ const split = paths.map(splitPath);
106
+ const minLength = Math.min(...split.map((s) => s.length));
107
+ let commonLen = 0;
108
+ for (let i = 0; i < minLength; i++) {
109
+ const segment = split[0]?.[i];
110
+ if (segment === undefined)
111
+ break;
112
+ if (split.every((s) => s[i] === segment)) {
113
+ commonLen++;
114
+ }
115
+ else {
116
+ break;
117
+ }
118
+ }
119
+ // Use parent of the common prefix so the last shared segment
120
+ // appears as a directory in the tree
121
+ if (commonLen > 0)
122
+ commonLen--;
123
+ if (commonLen === 0)
124
+ return "/";
125
+ return joinPath(...(split[0]?.slice(0, commonLen) ?? []));
126
+ }
127
+ /**
128
+ * Convert the internal branch tree into TreeNode[], embedding project rooms.
129
+ */
130
+ function branchToNodesWithRooms(branch, prefix, currentPath, projectRoomsByPath) {
131
+ const nodes = [];
132
+ // Subdirectories
133
+ for (const [name, child] of branch.children) {
134
+ const childPath = currentPath === "" && prefix === "/"
135
+ ? "/" + name
136
+ : currentPath === ""
137
+ ? prefix + "/" + name
138
+ : currentPath + "/" + name;
139
+ const childNodes = branchToNodesWithRooms(child, prefix, childPath, projectRoomsByPath);
140
+ if (childNodes.length > 0) {
141
+ // Check if this directory has a project room
142
+ const room = projectRoomsByPath.get(childPath);
143
+ nodes.push({
144
+ type: "directory",
145
+ name,
146
+ path: childPath,
147
+ ...(room ? { roomId: room.id } : {}),
148
+ children: sortChildren(childNodes),
149
+ });
150
+ }
151
+ }
152
+ // Agents in this directory
153
+ for (const agent of branch.agents) {
154
+ nodes.push({
155
+ type: "agent",
156
+ name: agent.name,
157
+ agentId: agent.id,
158
+ status: agent.status,
159
+ cwd: agent.cwd,
160
+ });
161
+ }
162
+ return nodes;
163
+ }
164
+ function sortChildren(nodes) {
165
+ return [...nodes].sort((a, b) => {
166
+ // Directories first, then agents
167
+ if (a.type !== b.type) {
168
+ return a.type === "directory" ? -1 : 1;
169
+ }
170
+ return a.name.localeCompare(b.name);
171
+ });
172
+ }
173
+ //# sourceMappingURL=project-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-tree.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/project-tree.ts"],"names":[],"mappings":"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"}
@@ -4,13 +4,14 @@
4
4
  * No DOM dependency. Testable in isolation.
5
5
  * Consumers subscribe to changes and re-render as needed.
6
6
  */
7
- import type { Agent, Room } from "./types.js";
7
+ import type { Agent, DisplayMessage, Room } from "./types.js";
8
8
  export type StateChangeListener = (state: Readonly<ClientState>) => void;
9
9
  export interface ClientState {
10
10
  currentRoom: string | undefined;
11
11
  dmTarget: string | undefined;
12
12
  agents: Agent[];
13
13
  rooms: Room[];
14
+ messages: DisplayMessage[];
14
15
  connected: boolean;
15
16
  }
16
17
  export declare class State {
@@ -25,6 +26,12 @@ export declare class State {
25
26
  setAgents(agents: Agent[]): void;
26
27
  setRooms(rooms: Room[]): void;
27
28
  setConnected(connected: boolean): void;
29
+ /** Add a display message to the message list. */
30
+ addMessage(message: DisplayMessage): void;
31
+ /** Replace all messages (e.g. when loading history). */
32
+ setMessages(messages: DisplayMessage[]): void;
33
+ /** Clear all messages. */
34
+ clearMessages(): void;
28
35
  /** Bulk update from a state frame (initial WS connection). */
29
36
  applyState(agents: Agent[], rooms: Room[]): void;
30
37
  /** Reset to initial state. */
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;AAEzE,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;CACpB;AAUD,qBAAa,KAAK;IAChB,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;IAE5D,mEAAmE;IACnE,SAAS,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,IAAI;IAOpD,6CAA6C;IAC7C,GAAG,IAAI,QAAQ,CAAC,WAAW,CAAC;IAQ5B,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAKhD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAK9C,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;IAKhC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAK7B,YAAY,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAKtC,8DAA8D;IAC9D,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAKhD,8BAA8B;IAC9B,KAAK,IAAI,IAAI;IASb,OAAO,CAAC,MAAM;CAMf"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;AAEzE,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;CACpB;AAWD,qBAAa,KAAK;IAChB,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;IAE5D,mEAAmE;IACnE,SAAS,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,IAAI;IAOpD,6CAA6C;IAC7C,GAAG,IAAI,QAAQ,CAAC,WAAW,CAAC;IAQ5B,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAKhD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAK9C,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;IAKhC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAK7B,YAAY,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAKtC,iDAAiD;IACjD,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAKzC,wDAAwD;IACxD,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,IAAI;IAK7C,0BAA0B;IAC1B,aAAa,IAAI,IAAI;IAKrB,8DAA8D;IAC9D,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAKhD,8BAA8B;IAC9B,KAAK,IAAI,IAAI;IASb,OAAO,CAAC,MAAM;CAMf"}
@@ -9,6 +9,7 @@ const INITIAL_STATE = {
9
9
  dmTarget: undefined,
10
10
  agents: [],
11
11
  rooms: [],
12
+ messages: [],
12
13
  connected: false,
13
14
  };
14
15
  export class State {
@@ -48,6 +49,21 @@ export class State {
48
49
  this.state = { ...this.state, connected };
49
50
  this.notify();
50
51
  }
52
+ /** Add a display message to the message list. */
53
+ addMessage(message) {
54
+ this.state = { ...this.state, messages: [...this.state.messages, message] };
55
+ this.notify();
56
+ }
57
+ /** Replace all messages (e.g. when loading history). */
58
+ setMessages(messages) {
59
+ this.state = { ...this.state, messages };
60
+ this.notify();
61
+ }
62
+ /** Clear all messages. */
63
+ clearMessages() {
64
+ this.state = { ...this.state, messages: [] };
65
+ this.notify();
66
+ }
51
67
  /** Bulk update from a state frame (initial WS connection). */
52
68
  applyState(agents, rooms) {
53
69
  this.state = { ...this.state, agents, rooms };
@@ -55,7 +71,7 @@ export class State {
55
71
  }
56
72
  /** Reset to initial state. */
57
73
  reset() {
58
- this.state = { ...INITIAL_STATE };
74
+ this.state = { ...INITIAL_STATE, messages: [] };
59
75
  this.notify();
60
76
  }
61
77
  // -----------------------------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,MAAM,aAAa,GAAgB;IACjC,WAAW,EAAE,SAAS;IACtB,QAAQ,EAAE,SAAS;IACnB,MAAM,EAAE,EAAE;IACV,KAAK,EAAE,EAAE;IACT,SAAS,EAAE,KAAK;CACjB,CAAC;AAEF,MAAM,OAAO,KAAK;IACR,KAAK,GAAgB,EAAE,GAAG,aAAa,EAAE,CAAC;IACjC,SAAS,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE5D,mEAAmE;IACnE,SAAS,CAAC,QAA6B;QACrC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC;IAED,6CAA6C;IAC7C,GAAG;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,0EAA0E;IAC1E,sCAAsC;IACtC,0EAA0E;IAE1E,cAAc,CAAC,MAA0B;QACvC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,WAAW,CAAC,OAA2B;QACrC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QAClD,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,SAAS,CAAC,MAAe;QACvB,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACvC,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;QACtC,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,YAAY,CAAC,SAAkB;QAC7B,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC;QAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,8DAA8D;IAC9D,UAAU,CAAC,MAAe,EAAE,KAAa;QACvC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,8BAA8B;IAC9B,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,aAAa,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,0EAA0E;IAC1E,WAAW;IACX,0EAA0E;IAElE,MAAM;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/state.ts"],"names":[],"mappings":"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"}