agent-comms 1.4.3 → 1.5.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/plugin.json +1 -1
- package/dist/bridges/user/cli.d.ts +12 -0
- package/dist/bridges/user/cli.d.ts.map +1 -0
- package/dist/bridges/user/cli.js +77 -0
- package/dist/bridges/user/cli.js.map +1 -0
- package/dist/bridges/user/controller.d.ts +39 -0
- package/dist/bridges/user/controller.d.ts.map +1 -0
- package/dist/bridges/user/controller.js +185 -0
- package/dist/bridges/user/controller.js.map +1 -0
- package/dist/bridges/user/tui.d.ts +21 -0
- package/dist/bridges/user/tui.d.ts.map +1 -0
- package/dist/bridges/user/tui.js +237 -0
- package/dist/bridges/user/tui.js.map +1 -0
- package/dist/bridges/user/web/index.html.d.ts +8 -0
- package/dist/bridges/user/web/index.html.d.ts.map +1 -0
- package/dist/bridges/user/web/index.html.js +386 -0
- package/dist/bridges/user/web/index.html.js.map +1 -0
- package/dist/bridges/user/web/server.d.ts +19 -0
- package/dist/bridges/user/web/server.d.ts.map +1 -0
- package/dist/bridges/user/web/server.js +277 -0
- package/dist/bridges/user/web/server.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +63 -1
- package/dist/cli.js.map +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Non-interactive CLI — one-shot commands that register, execute, print, and exit.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* agent-comms send <room> <message>
|
|
6
|
+
* agent-comms dm <agent> <message>
|
|
7
|
+
* agent-comms rooms
|
|
8
|
+
* agent-comms agents
|
|
9
|
+
* agent-comms read <room> [--since <iso>]
|
|
10
|
+
*/
|
|
11
|
+
export declare function runCli(command: string, args: string[], userName: string): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/bridges/user/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,wBAAsB,MAAM,CAC1B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAiBf"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Non-interactive CLI — one-shot commands that register, execute, print, and exit.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* agent-comms send <room> <message>
|
|
6
|
+
* agent-comms dm <agent> <message>
|
|
7
|
+
* agent-comms rooms
|
|
8
|
+
* agent-comms agents
|
|
9
|
+
* agent-comms read <room> [--since <iso>]
|
|
10
|
+
*/
|
|
11
|
+
import { ChatController } from "./controller.js";
|
|
12
|
+
export async function runCli(command, args, userName) {
|
|
13
|
+
const controller = new ChatController(userName);
|
|
14
|
+
try {
|
|
15
|
+
await controller.init();
|
|
16
|
+
const result = await dispatch(controller, command, args);
|
|
17
|
+
if (result.isError) {
|
|
18
|
+
console.error(result.content);
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
console.log(result.content);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
await controller.shutdown();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async function dispatch(controller, command, args) {
|
|
30
|
+
switch (command) {
|
|
31
|
+
case "send": {
|
|
32
|
+
const room = args[0];
|
|
33
|
+
const content = args.slice(1).join(" ");
|
|
34
|
+
if (!room || !content) {
|
|
35
|
+
return {
|
|
36
|
+
content: "Usage: agent-comms send <room> <message>",
|
|
37
|
+
isError: true,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
// Ensure we're in the room
|
|
41
|
+
const joinResult = await controller.switchRoom(room);
|
|
42
|
+
if (joinResult.isError)
|
|
43
|
+
return joinResult;
|
|
44
|
+
return controller.send(room, content);
|
|
45
|
+
}
|
|
46
|
+
case "dm": {
|
|
47
|
+
const agent = args[0];
|
|
48
|
+
const content = args.slice(1).join(" ");
|
|
49
|
+
if (!agent || !content) {
|
|
50
|
+
return {
|
|
51
|
+
content: "Usage: agent-comms dm <agent-id> <message>",
|
|
52
|
+
isError: true,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return controller.dm(agent, content);
|
|
56
|
+
}
|
|
57
|
+
case "rooms":
|
|
58
|
+
return controller.listRooms();
|
|
59
|
+
case "agents":
|
|
60
|
+
return controller.listAgents();
|
|
61
|
+
case "read": {
|
|
62
|
+
const room = args[0];
|
|
63
|
+
if (!room) {
|
|
64
|
+
return {
|
|
65
|
+
content: "Usage: agent-comms read <room> [--since <iso>]",
|
|
66
|
+
isError: true,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const sinceIdx = args.indexOf("--since");
|
|
70
|
+
const since = sinceIdx !== -1 ? args[sinceIdx + 1] : undefined;
|
|
71
|
+
return controller.readRoom(room, since);
|
|
72
|
+
}
|
|
73
|
+
default:
|
|
74
|
+
return { content: `Unknown command: ${command}`, isError: true };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/bridges/user/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChatController — shared logic for user-facing UIs (TUI, web, CLI).
|
|
3
|
+
*
|
|
4
|
+
* Wraps MeshStore + CommsTool with an EventEmitter interface.
|
|
5
|
+
* UIs subscribe to events and call methods — no direct MeshStore access needed.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from "node:events";
|
|
8
|
+
import type { CommsResult } from "../../core/tool.js";
|
|
9
|
+
import type { AgentIdentity, DeliveryEvent, Room, RoomMessage } from "../../core/types.js";
|
|
10
|
+
export declare class ChatController extends EventEmitter {
|
|
11
|
+
private userName;
|
|
12
|
+
private store;
|
|
13
|
+
private tool;
|
|
14
|
+
private ctx;
|
|
15
|
+
private currentRoom;
|
|
16
|
+
constructor(userName: string);
|
|
17
|
+
init(): Promise<void>;
|
|
18
|
+
get agentId(): string;
|
|
19
|
+
get activeRoom(): string | undefined;
|
|
20
|
+
listAgents(): Promise<CommsResult>;
|
|
21
|
+
listRooms(): Promise<CommsResult>;
|
|
22
|
+
createRoom(name: string, type?: "public" | "private" | "secret", description?: string): Promise<CommsResult>;
|
|
23
|
+
joinRoom(roomId: string): Promise<CommsResult>;
|
|
24
|
+
leaveRoom(roomId?: string): Promise<CommsResult>;
|
|
25
|
+
send(target: string, content: string): Promise<CommsResult>;
|
|
26
|
+
sendToCurrentRoom(content: string): Promise<CommsResult>;
|
|
27
|
+
dm(targetAgentId: string, content: string): Promise<CommsResult>;
|
|
28
|
+
readRoom(roomId?: string, since?: string): Promise<CommsResult>;
|
|
29
|
+
invite(roomId: string, agentId: string): Promise<CommsResult>;
|
|
30
|
+
kick(roomId: string, agentId: string): Promise<CommsResult>;
|
|
31
|
+
destroyRoom(roomId: string): Promise<CommsResult>;
|
|
32
|
+
switchRoom(roomId: string): Promise<CommsResult>;
|
|
33
|
+
getAgents(): Promise<AgentIdentity[]>;
|
|
34
|
+
getRooms(): Promise<Room[]>;
|
|
35
|
+
getRoomMessages(roomId: string, since?: string): Promise<RoomMessage[]>;
|
|
36
|
+
formatEvent(event: DeliveryEvent): string;
|
|
37
|
+
shutdown(): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../src/bridges/user/controller.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAO3C,OAAO,KAAK,EAAgB,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,IAAI,EACJ,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAM7B,qBAAa,cAAe,SAAQ,YAAY;IAMlC,OAAO,CAAC,QAAQ;IAL5B,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,IAAI,CAAY;IACxB,OAAO,CAAC,GAAG,CAAgB;IAC3B,OAAO,CAAC,WAAW,CAAqB;gBAEpB,QAAQ,EAAE,MAAM;IAW9B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB3B,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAEnC;IAMK,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IAIlC,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC;IAIjC,UAAU,CACd,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,QAAQ,GAAG,SAAS,GAAG,QAAmB,EAChD,WAAW,SAAK,GACf,OAAO,CAAC,WAAW,CAAC;IAYjB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAS9C,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAehD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAI3D,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAOxD,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAQhE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAY/D,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAQ7D,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAQ3D,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAWjD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAwBhD,SAAS,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAIrC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAI3B,eAAe,CACnB,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,EAAE,CAAC;IAIzB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM;IAQnC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAIhC"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChatController — shared logic for user-facing UIs (TUI, web, CLI).
|
|
3
|
+
*
|
|
4
|
+
* Wraps MeshStore + CommsTool with an EventEmitter interface.
|
|
5
|
+
* UIs subscribe to events and call methods — no direct MeshStore access needed.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from "node:events";
|
|
8
|
+
import { MeshStore, CommsTool, ensureRegistered, formatDeliveryEvent, } from "../../core/index.js";
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Event types
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
export class ChatController extends EventEmitter {
|
|
13
|
+
userName;
|
|
14
|
+
store;
|
|
15
|
+
tool;
|
|
16
|
+
ctx;
|
|
17
|
+
currentRoom;
|
|
18
|
+
constructor(userName) {
|
|
19
|
+
super();
|
|
20
|
+
this.userName = userName;
|
|
21
|
+
this.store = new MeshStore();
|
|
22
|
+
this.tool = new CommsTool(this.store);
|
|
23
|
+
// Push delivery events to UIs
|
|
24
|
+
this.store.onDelivery = (_agentId, event) => {
|
|
25
|
+
this.emit("message", event);
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
async init() {
|
|
29
|
+
await this.store.init();
|
|
30
|
+
const reg = await ensureRegistered({
|
|
31
|
+
store: this.store,
|
|
32
|
+
cwd: process.cwd(),
|
|
33
|
+
harness: "user",
|
|
34
|
+
defaultName: `${this.userName} (user)`,
|
|
35
|
+
visibility: "visible",
|
|
36
|
+
tags: ["user"],
|
|
37
|
+
});
|
|
38
|
+
this.ctx = {
|
|
39
|
+
agentId: reg.agentId,
|
|
40
|
+
harness: "user",
|
|
41
|
+
cwd: process.cwd(),
|
|
42
|
+
pid: process.pid,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
get agentId() {
|
|
46
|
+
return this.ctx.agentId;
|
|
47
|
+
}
|
|
48
|
+
get activeRoom() {
|
|
49
|
+
return this.currentRoom;
|
|
50
|
+
}
|
|
51
|
+
// -----------------------------------------------------------------------
|
|
52
|
+
// Actions
|
|
53
|
+
// -----------------------------------------------------------------------
|
|
54
|
+
async listAgents() {
|
|
55
|
+
return this.tool.handle(this.ctx, { action: "list_agents" });
|
|
56
|
+
}
|
|
57
|
+
async listRooms() {
|
|
58
|
+
return this.tool.handle(this.ctx, { action: "list_rooms" });
|
|
59
|
+
}
|
|
60
|
+
async createRoom(name, type = "public", description = "") {
|
|
61
|
+
const result = await this.tool.handle(this.ctx, {
|
|
62
|
+
action: "create_room",
|
|
63
|
+
name,
|
|
64
|
+
type,
|
|
65
|
+
description,
|
|
66
|
+
});
|
|
67
|
+
// Auto-switch to the created room
|
|
68
|
+
this.currentRoom = name;
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
async joinRoom(roomId) {
|
|
72
|
+
const result = await this.tool.handle(this.ctx, {
|
|
73
|
+
action: "join_room",
|
|
74
|
+
room: roomId,
|
|
75
|
+
});
|
|
76
|
+
this.currentRoom = roomId;
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
async leaveRoom(roomId) {
|
|
80
|
+
const target = roomId ?? this.currentRoom;
|
|
81
|
+
if (!target) {
|
|
82
|
+
return { content: "No room to leave. Join a room first.", isError: true };
|
|
83
|
+
}
|
|
84
|
+
const result = await this.tool.handle(this.ctx, {
|
|
85
|
+
action: "leave_room",
|
|
86
|
+
room: target,
|
|
87
|
+
});
|
|
88
|
+
if (this.currentRoom === target) {
|
|
89
|
+
this.currentRoom = undefined;
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
async send(target, content) {
|
|
94
|
+
return this.tool.handle(this.ctx, { action: "send", target, content });
|
|
95
|
+
}
|
|
96
|
+
async sendToCurrentRoom(content) {
|
|
97
|
+
if (!this.currentRoom) {
|
|
98
|
+
return { content: "No active room. Join a room first.", isError: true };
|
|
99
|
+
}
|
|
100
|
+
return this.send(this.currentRoom, content);
|
|
101
|
+
}
|
|
102
|
+
async dm(targetAgentId, content) {
|
|
103
|
+
return this.tool.handle(this.ctx, {
|
|
104
|
+
action: "dm",
|
|
105
|
+
target: targetAgentId,
|
|
106
|
+
content,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
async readRoom(roomId, since) {
|
|
110
|
+
const target = roomId ?? this.currentRoom;
|
|
111
|
+
if (!target) {
|
|
112
|
+
return { content: "No room to read. Join a room first.", isError: true };
|
|
113
|
+
}
|
|
114
|
+
return this.tool.handle(this.ctx, {
|
|
115
|
+
action: "read_room",
|
|
116
|
+
room: target,
|
|
117
|
+
...(since && { since }),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
async invite(roomId, agentId) {
|
|
121
|
+
return this.tool.handle(this.ctx, {
|
|
122
|
+
action: "invite",
|
|
123
|
+
room: roomId,
|
|
124
|
+
agent: agentId,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
async kick(roomId, agentId) {
|
|
128
|
+
return this.tool.handle(this.ctx, {
|
|
129
|
+
action: "kick",
|
|
130
|
+
room: roomId,
|
|
131
|
+
agent: agentId,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
async destroyRoom(roomId) {
|
|
135
|
+
const result = await this.tool.handle(this.ctx, {
|
|
136
|
+
action: "destroy_room",
|
|
137
|
+
room: roomId,
|
|
138
|
+
});
|
|
139
|
+
if (this.currentRoom === roomId) {
|
|
140
|
+
this.currentRoom = undefined;
|
|
141
|
+
}
|
|
142
|
+
return result;
|
|
143
|
+
}
|
|
144
|
+
async switchRoom(roomId) {
|
|
145
|
+
// Check if already a member — if not, join first
|
|
146
|
+
const rooms = await this.store.listRooms(this.ctx.agentId);
|
|
147
|
+
const room = rooms.find((r) => r.id === roomId || r.name === roomId);
|
|
148
|
+
if (!room) {
|
|
149
|
+
return { content: `Room "${roomId}" not found.`, isError: true };
|
|
150
|
+
}
|
|
151
|
+
if (!room.members.includes(this.ctx.agentId)) {
|
|
152
|
+
const result = await this.joinRoom(room.id);
|
|
153
|
+
if (result.isError)
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
this.currentRoom = room.id;
|
|
157
|
+
return {
|
|
158
|
+
content: `Switched to ${room.name}.`,
|
|
159
|
+
isError: false,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
// -----------------------------------------------------------------------
|
|
163
|
+
// Raw access for web API
|
|
164
|
+
// -----------------------------------------------------------------------
|
|
165
|
+
async getAgents() {
|
|
166
|
+
return this.store.listAgents(this.ctx.agentId);
|
|
167
|
+
}
|
|
168
|
+
async getRooms() {
|
|
169
|
+
return this.store.listRooms(this.ctx.agentId);
|
|
170
|
+
}
|
|
171
|
+
async getRoomMessages(roomId, since) {
|
|
172
|
+
return this.store.readRoomMessages(roomId, since);
|
|
173
|
+
}
|
|
174
|
+
formatEvent(event) {
|
|
175
|
+
return formatDeliveryEvent(event);
|
|
176
|
+
}
|
|
177
|
+
// -----------------------------------------------------------------------
|
|
178
|
+
// Lifecycle
|
|
179
|
+
// -----------------------------------------------------------------------
|
|
180
|
+
async shutdown() {
|
|
181
|
+
await this.store.setAgentOffline(this.ctx.agentId);
|
|
182
|
+
await this.store.shutdown();
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../src/bridges/user/controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI — terminal chat interface using readline + ANSI escape codes.
|
|
3
|
+
*
|
|
4
|
+
* Commands:
|
|
5
|
+
* /join <room> Join or switch to a room
|
|
6
|
+
* /leave [room] Leave the current (or specified) room
|
|
7
|
+
* /rooms List all rooms
|
|
8
|
+
* /agents List all agents
|
|
9
|
+
* /read [room] Read messages in current (or specified) room
|
|
10
|
+
* /dm <agent> <msg> Send a direct message
|
|
11
|
+
* /create <name> Create a public room
|
|
12
|
+
* /invite <room> <agent> Invite an agent to a room
|
|
13
|
+
* /kick <room> <agent> Kick an agent from a room
|
|
14
|
+
* /destroy <room> Destroy a room
|
|
15
|
+
* /help Show commands
|
|
16
|
+
* /quit Exit
|
|
17
|
+
*
|
|
18
|
+
* Anything without / is sent to the current room.
|
|
19
|
+
*/
|
|
20
|
+
export declare function runTui(userName: string): Promise<void>;
|
|
21
|
+
//# sourceMappingURL=tui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../../src/bridges/user/tui.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAsBH,wBAAsB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiE5D"}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI — terminal chat interface using readline + ANSI escape codes.
|
|
3
|
+
*
|
|
4
|
+
* Commands:
|
|
5
|
+
* /join <room> Join or switch to a room
|
|
6
|
+
* /leave [room] Leave the current (or specified) room
|
|
7
|
+
* /rooms List all rooms
|
|
8
|
+
* /agents List all agents
|
|
9
|
+
* /read [room] Read messages in current (or specified) room
|
|
10
|
+
* /dm <agent> <msg> Send a direct message
|
|
11
|
+
* /create <name> Create a public room
|
|
12
|
+
* /invite <room> <agent> Invite an agent to a room
|
|
13
|
+
* /kick <room> <agent> Kick an agent from a room
|
|
14
|
+
* /destroy <room> Destroy a room
|
|
15
|
+
* /help Show commands
|
|
16
|
+
* /quit Exit
|
|
17
|
+
*
|
|
18
|
+
* Anything without / is sent to the current room.
|
|
19
|
+
*/
|
|
20
|
+
import * as readline from "node:readline";
|
|
21
|
+
import { ChatController } from "./controller.js";
|
|
22
|
+
// ANSI helpers
|
|
23
|
+
const BOLD = "\x1b[1m";
|
|
24
|
+
const DIM = "\x1b[2m";
|
|
25
|
+
const CYAN = "\x1b[36m";
|
|
26
|
+
const GREEN = "\x1b[32m";
|
|
27
|
+
const YELLOW = "\x1b[33m";
|
|
28
|
+
const RED = "\x1b[31m";
|
|
29
|
+
const MAGENTA = "\x1b[35m";
|
|
30
|
+
const RESET = "\x1b[0m";
|
|
31
|
+
const CLEAR_LINE = "\r\x1b[2K";
|
|
32
|
+
function prompt(controller) {
|
|
33
|
+
const room = controller.activeRoom;
|
|
34
|
+
return room ? `${GREEN}${room}${RESET} > ` : `${DIM}>${RESET} `;
|
|
35
|
+
}
|
|
36
|
+
export async function runTui(userName) {
|
|
37
|
+
const controller = new ChatController(userName);
|
|
38
|
+
await controller.init();
|
|
39
|
+
console.log(`${CYAN}Connected as ${BOLD}${userName} (user)${RESET} [${controller.agentId}]`);
|
|
40
|
+
console.log(`${DIM}Type /help for commands. Anything else goes to the current room.${RESET}\n`);
|
|
41
|
+
const rl = readline.createInterface({
|
|
42
|
+
input: process.stdin,
|
|
43
|
+
output: process.stdout,
|
|
44
|
+
});
|
|
45
|
+
// Delivery event handler — print above the prompt
|
|
46
|
+
function onMessage(event) {
|
|
47
|
+
const line = formatForTerminal(event);
|
|
48
|
+
process.stdout.write(`${CLEAR_LINE}${line}\n${prompt(controller)}`);
|
|
49
|
+
}
|
|
50
|
+
controller.on("message", onMessage);
|
|
51
|
+
function onError(err) {
|
|
52
|
+
process.stdout.write(`${CLEAR_LINE}${RED}Error: ${err.message}${RESET}\n${prompt(controller)}`);
|
|
53
|
+
}
|
|
54
|
+
controller.on("error", onError);
|
|
55
|
+
// Input loop
|
|
56
|
+
async function handleInput(input) {
|
|
57
|
+
const trimmed = input.trim();
|
|
58
|
+
if (trimmed.length === 0)
|
|
59
|
+
return;
|
|
60
|
+
if (trimmed.startsWith("/")) {
|
|
61
|
+
await handleCommand(trimmed, controller);
|
|
62
|
+
}
|
|
63
|
+
else if (controller.activeRoom) {
|
|
64
|
+
const result = await controller.sendToCurrentRoom(trimmed);
|
|
65
|
+
if (result.isError) {
|
|
66
|
+
process.stdout.write(`${RED}${result.content}${RESET}\n`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
process.stdout.write(`${YELLOW}No active room. /join a room first or use /dm.${RESET}\n`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function ask() {
|
|
74
|
+
rl.question(prompt(controller), (input) => {
|
|
75
|
+
void handleInput(input).then(() => {
|
|
76
|
+
ask();
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
ask();
|
|
81
|
+
// Graceful shutdown
|
|
82
|
+
rl.on("close", () => {
|
|
83
|
+
controller.off("message", onMessage);
|
|
84
|
+
controller.off("error", onError);
|
|
85
|
+
void controller.shutdown().then(() => process.exit(0));
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
// Command handler
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
async function handleCommand(input, c) {
|
|
92
|
+
const parts = input.slice(1).split(/\s+/);
|
|
93
|
+
const cmd = parts[0]?.toLowerCase();
|
|
94
|
+
const arg1 = parts[1];
|
|
95
|
+
const arg2 = parts.slice(2).join(" ");
|
|
96
|
+
switch (cmd) {
|
|
97
|
+
case "join": {
|
|
98
|
+
if (!arg1) {
|
|
99
|
+
process.stdout.write(`${YELLOW}Usage: /join <room>${RESET}\n`);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const result = await c.switchRoom(arg1);
|
|
103
|
+
printResult(result);
|
|
104
|
+
if (!result.isError) {
|
|
105
|
+
const read = await c.readRoom();
|
|
106
|
+
if (!read.isError && read.content !== "No messages.") {
|
|
107
|
+
process.stdout.write(`${DIM}${read.content}${RESET}\n`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
case "leave": {
|
|
113
|
+
const result = await c.leaveRoom(arg1);
|
|
114
|
+
printResult(result);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
case "rooms": {
|
|
118
|
+
const result = await c.listRooms();
|
|
119
|
+
printResult(result);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
case "agents": {
|
|
123
|
+
const result = await c.listAgents();
|
|
124
|
+
printResult(result);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
case "read": {
|
|
128
|
+
const result = await c.readRoom(arg1);
|
|
129
|
+
printResult(result);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
case "dm": {
|
|
133
|
+
if (!arg1 || !arg2) {
|
|
134
|
+
process.stdout.write(`${YELLOW}Usage: /dm <agent> <message>${RESET}\n`);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const result = await c.dm(arg1, arg2);
|
|
138
|
+
printResult(result);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
case "create": {
|
|
142
|
+
if (!arg1) {
|
|
143
|
+
process.stdout.write(`${YELLOW}Usage: /create <name>${RESET}\n`);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const result = await c.createRoom(arg1, "public", arg2);
|
|
147
|
+
printResult(result);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
case "invite": {
|
|
151
|
+
const agentId = parts[2];
|
|
152
|
+
if (!arg1 || !agentId) {
|
|
153
|
+
process.stdout.write(`${YELLOW}Usage: /invite <room> <agent>${RESET}\n`);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const result = await c.invite(arg1, agentId);
|
|
157
|
+
printResult(result);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
case "kick": {
|
|
161
|
+
const agentId = parts[2];
|
|
162
|
+
if (!arg1 || !agentId) {
|
|
163
|
+
process.stdout.write(`${YELLOW}Usage: /kick <room> <agent>${RESET}\n`);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const result = await c.kick(arg1, agentId);
|
|
167
|
+
printResult(result);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
case "destroy": {
|
|
171
|
+
if (!arg1) {
|
|
172
|
+
process.stdout.write(`${YELLOW}Usage: /destroy <room>${RESET}\n`);
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
const result = await c.destroyRoom(arg1);
|
|
176
|
+
printResult(result);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
case "help":
|
|
180
|
+
process.stdout.write(`${CYAN}Commands:${RESET}
|
|
181
|
+
${GREEN}/join${RESET} <room> Join or switch to a room
|
|
182
|
+
${GREEN}/leave${RESET} [room] Leave current (or specified) room
|
|
183
|
+
${GREEN}/rooms${RESET} List all rooms
|
|
184
|
+
${GREEN}/agents${RESET} List all agents
|
|
185
|
+
${GREEN}/read${RESET} [room] Read messages in room
|
|
186
|
+
${GREEN}/dm${RESET} <agent> <msg> Send a direct message
|
|
187
|
+
${GREEN}/create${RESET} <name> Create a public room
|
|
188
|
+
${GREEN}/invite${RESET} <room> <id> Invite agent to room
|
|
189
|
+
${GREEN}/kick${RESET} <room> <id> Kick agent from room
|
|
190
|
+
${GREEN}/destroy${RESET} <room> Destroy a room
|
|
191
|
+
${GREEN}/help${RESET} Show this help
|
|
192
|
+
${GREEN}/quit${RESET} Exit
|
|
193
|
+
\n${DIM}Anything without / is sent to the current room.${RESET}\n`);
|
|
194
|
+
return;
|
|
195
|
+
case "quit":
|
|
196
|
+
process.stdout.write(`${DIM}Goodbye!${RESET}\n`);
|
|
197
|
+
process.exit(0);
|
|
198
|
+
default:
|
|
199
|
+
process.stdout.write(`${YELLOW}Unknown command: /${String(cmd)}. Type /help for commands.${RESET}\n`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// ---------------------------------------------------------------------------
|
|
203
|
+
// Formatting
|
|
204
|
+
// ---------------------------------------------------------------------------
|
|
205
|
+
function printResult(result) {
|
|
206
|
+
if (result.isError) {
|
|
207
|
+
process.stdout.write(`${RED}${result.content}${RESET}\n`);
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
process.stdout.write(`${result.content}\n`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
function formatForTerminal(event) {
|
|
214
|
+
switch (event.type) {
|
|
215
|
+
case "room_message":
|
|
216
|
+
return `${BOLD}[${event.message.room}] ${event.message.from}:${RESET} ${event.message.content}`;
|
|
217
|
+
case "dm":
|
|
218
|
+
return `${MAGENTA}DM from ${event.message.from}:${RESET} ${event.message.content}`;
|
|
219
|
+
case "member_joined":
|
|
220
|
+
return `${GREEN}→ ${event.agent} joined ${event.room}${RESET}`;
|
|
221
|
+
case "member_left":
|
|
222
|
+
return `${YELLOW}← ${event.agent} left ${event.room}${RESET}`;
|
|
223
|
+
case "member_status":
|
|
224
|
+
return `${CYAN}● ${event.agent} is now ${event.status} in ${event.room}${RESET}`;
|
|
225
|
+
case "delivery_status":
|
|
226
|
+
return `${DIM}✓ Message ${event.messageId} ${event.status} by ${event.agent}${RESET}`;
|
|
227
|
+
case "room_invite":
|
|
228
|
+
return `${CYAN}_invite to ${event.room} from ${event.from}${RESET}`;
|
|
229
|
+
case "room_members": {
|
|
230
|
+
const names = event.members
|
|
231
|
+
.map((m) => `${m.name} (${m.status})`)
|
|
232
|
+
.join(", ");
|
|
233
|
+
return `${DIM}Members of ${event.room}: ${names}${RESET}`;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=tui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../../../src/bridges/user/tui.ts"],"names":[],"mappings":"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"}
|