hermes-web-ui 0.3.8 → 0.4.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/README.md +7 -10
- package/dist/client/assets/{Add-s316k4Av.js → Add-BChxDDdy.js} +1 -1
- package/dist/client/assets/{Button-BkA_RI8a.js → Button-uvjCWO-i.js} +1 -1
- package/dist/client/assets/{ChannelsView-DPmPn8DW.js → ChannelsView-D3a0g0rb.js} +1 -1
- package/dist/client/assets/{ChatView-DEtziOPB.js → ChatView-T8LH7dwU.js} +1 -1
- package/dist/client/assets/{Close-CrLD0IXG.js → Close-DbXijZpL.js} +1 -1
- package/dist/client/assets/{FormItem-CQLdFrl9.js → FormItem-BRiLD3TC.js} +1 -1
- package/dist/client/assets/{GatewaysView-CC1Y0tZZ.js → GatewaysView-rfzh1nqy.js} +1 -1
- package/dist/client/assets/{Input-nXKlujwJ.js → Input-CjlUbV0M.js} +1 -1
- package/dist/client/assets/{InputNumber-DLZwwIyX.js → InputNumber-CPEjoOAv.js} +1 -1
- package/dist/client/assets/{JobsView-BC0bBrJO.js → JobsView-D6AFr9Xe.js} +2 -2
- package/dist/client/assets/{LoginView-PqpFR9bV.js → LoginView-DJB_TSHN.js} +1 -1
- package/dist/client/assets/{LogsView-DtR88N0b.js → LogsView-Ul8pAp42.js} +1 -1
- package/dist/client/assets/{MarkdownRenderer-BSLfTurm.js → MarkdownRenderer-CY7d2L7Z.js} +1 -1
- package/dist/client/assets/{MemoryView-CJRWnePL.js → MemoryView-BR5Dl_fa.js} +1 -1
- package/dist/client/assets/{Modal-Bp9RK8LZ.js → Modal-DDUFP8vh.js} +1 -1
- package/dist/client/assets/{ModelsView-7Obe34Cz.js → ModelsView-DAi9Jdmk.js} +1 -1
- package/dist/client/assets/{Popconfirm-DTdUi7r_.js → Popconfirm-Cnb_uQVo.js} +1 -1
- package/dist/client/assets/{Popover-_M3o0B7L.js → Popover-DiVI0l6E.js} +1 -1
- package/dist/client/assets/{ProfilesView-1_GmRx-S.js → ProfilesView-BB0Zrfhi.js} +1 -1
- package/dist/client/assets/{Select-aHPR3urY.js → Select-BqUA1wxE.js} +1 -1
- package/dist/client/assets/{SettingRow-DKasLuS5.js → SettingRow-CK0bHtaz.js} +1 -1
- package/dist/client/assets/{SettingsView-DZCA7_CM.js → SettingsView-BKKk44FG.js} +1 -1
- package/dist/client/assets/{SkillsView-Dk7O05cK.js → SkillsView-whSlyc23.js} +1 -1
- package/dist/client/assets/{Spin-Bt_9cTiO.js → Spin-DwHJdgNz.js} +1 -1
- package/dist/client/assets/{Suffix-XaH8SDbR.js → Suffix-D6x-7akR.js} +1 -1
- package/dist/client/assets/{Switch-D1_psmjT.js → Switch-BvHRSSqt.js} +1 -1
- package/dist/client/assets/{Tag-3FaOhoJN.js → Tag-BMMlXaEi.js} +1 -1
- package/dist/client/assets/{TerminalView-DNU7oQxK.js → TerminalView-el6o2Q0a.js} +1 -1
- package/dist/client/assets/{Tooltip-YHrHWGPa.js → Tooltip-BM4wl764.js} +1 -1
- package/dist/client/assets/{UsageView-COCrOiiV.js → UsageView-DQ_YKoEV.js} +1 -1
- package/dist/client/assets/{Warning-B6CM9aBl.js → Warning-CEC7rgvY.js} +1 -1
- package/dist/client/assets/{_plugin-vue_export-helper-BGG8ORDx.js → _plugin-vue_export-helper-DgUZPfuZ.js} +1 -1
- package/dist/client/assets/app-DPUhLGXq.js +1 -0
- package/dist/client/assets/{app-B7ktf7Fh.js → app-DUt8TNq3.js} +1 -1
- package/dist/client/assets/{browser-f5W8abIG.js → browser-vxCOMmsq.js} +1 -1
- package/dist/client/assets/{chat-6q6pkzEW.js → chat-i_Ge_Lfr.js} +2 -2
- package/dist/client/assets/composables-jrQPIjcq.js +1 -0
- package/dist/client/assets/{fade-in.cssr-ifHK7yH1.js → fade-in.cssr-DVg2CkO3.js} +1 -1
- package/dist/client/assets/{index-CSCYx7ux.js → index-COwJ2oY0.js} +1 -1
- package/dist/client/assets/{jobs-DObWfhbO.js → jobs-Czr1RcSG.js} +1 -1
- package/dist/client/assets/{light-DgLcPjgU.js → light-3rSjNeC-.js} +1 -1
- package/dist/client/assets/{light-CxjyoF0s.js → light-CKDlpgGU.js} +1 -1
- package/dist/client/assets/{light-D1yfed_s.js → light-CiIDFs7y.js} +1 -1
- package/dist/client/assets/{light-TGFKT-UB.js → light-CoJqT8Vu.js} +1 -1
- package/dist/client/assets/{light-D_3MwJj1.js → light-DPRJ1OEN.js} +1 -1
- package/dist/client/assets/{light-DWy-mwyK.js → light-vTpJevRf.js} +1 -1
- package/dist/client/assets/{models-DQ4CT-vv.js → models-BzEeJuoO.js} +1 -1
- package/dist/client/assets/{pinia-DcAkZ8vx.js → pinia-BoNLlsLy.js} +1 -1
- package/dist/client/assets/{profiles-DzkigJwq.js → profiles-B-DFTmc2.js} +1 -1
- package/dist/client/assets/{router-D8sJ39Io.js → router-HHMeDEaP.js} +2 -2
- package/dist/client/assets/{sessions-Dg8n9PBo.js → sessions-BmxS_BoH.js} +1 -1
- package/dist/client/assets/{skills-BehzdECn.js → skills-Be8Mzr1r.js} +1 -1
- package/dist/client/assets/{use-message-DBz2JSTt.js → use-message-DBTY4945.js} +1 -1
- package/dist/client/assets/{useTheme-UdVT814n.js → useTheme-D58Cg7k2.js} +1 -1
- package/dist/client/index.html +27 -27
- package/dist/server/index.js +19 -199
- package/dist/server/routes/health.d.ts +4 -0
- package/dist/server/routes/health.js +109 -0
- package/dist/server/routes/hermes/group-chat.d.ts +2 -0
- package/dist/server/routes/hermes/group-chat.js +112 -101
- package/dist/server/routes/update.d.ts +2 -0
- package/dist/server/routes/update.js +69 -0
- package/dist/server/services/auth.js +1 -1
- package/dist/server/services/gateway-bootstrap.d.ts +2 -0
- package/dist/server/services/gateway-bootstrap.js +51 -0
- package/dist/server/services/hermes/group-chat/agent-clients.d.ts +133 -0
- package/dist/server/services/hermes/group-chat/agent-clients.js +364 -0
- package/dist/server/services/hermes/group-chat/index.d.ts +72 -0
- package/dist/server/services/hermes/group-chat/index.js +307 -0
- package/dist/server/services/shutdown.d.ts +1 -0
- package/dist/server/services/shutdown.js +37 -0
- package/package.json +1 -1
- package/dist/client/assets/app-BPvTl2-V.js +0 -1
- package/dist/client/assets/composables-xV7dhNpf.js +0 -1
|
@@ -1,135 +1,146 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
4
|
};
|
|
38
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
6
|
exports.groupChatRoutes = void 0;
|
|
7
|
+
exports.setGroupChatServer = setGroupChatServer;
|
|
40
8
|
const router_1 = __importDefault(require("@koa/router"));
|
|
41
|
-
const roomsDb = __importStar(require("../../services/group-chat/rooms-db"));
|
|
42
9
|
exports.groupChatRoutes = new router_1.default();
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
10
|
+
let chatServer = null;
|
|
11
|
+
function setGroupChatServer(server) {
|
|
12
|
+
chatServer = server;
|
|
13
|
+
}
|
|
14
|
+
function generateId() {
|
|
15
|
+
return Date.now().toString(36) + Math.random().toString(36).slice(2, 8);
|
|
16
|
+
}
|
|
17
|
+
// Create room
|
|
50
18
|
exports.groupChatRoutes.post('/api/hermes/group-chat/rooms', async (ctx) => {
|
|
51
|
-
|
|
52
|
-
|
|
19
|
+
if (!chatServer) {
|
|
20
|
+
ctx.status = 503;
|
|
21
|
+
ctx.body = { error: 'Group chat not initialized' };
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const { name, inviteCode, agents } = ctx.request.body;
|
|
25
|
+
if (!name || !inviteCode) {
|
|
53
26
|
ctx.status = 400;
|
|
54
|
-
ctx.body = { error: 'name
|
|
27
|
+
ctx.body = { error: 'name and inviteCode are required' };
|
|
55
28
|
return;
|
|
56
29
|
}
|
|
57
|
-
const
|
|
58
|
-
|
|
30
|
+
const roomId = generateId();
|
|
31
|
+
const storage = chatServer.getStorage();
|
|
32
|
+
storage.saveRoom(roomId, name, inviteCode);
|
|
33
|
+
// Save agents to DB and auto-connect via Socket.IO
|
|
34
|
+
const addedAgents = [];
|
|
35
|
+
for (const a of agents || []) {
|
|
36
|
+
const agentId = generateId();
|
|
37
|
+
const agent = storage.addRoomAgent(roomId, agentId, a.profile, a.name || a.profile, a.description || '', a.invited ? 1 : 0);
|
|
38
|
+
addedAgents.push(agent);
|
|
39
|
+
try {
|
|
40
|
+
const client = await chatServer.agentClients.createAgent({
|
|
41
|
+
profile: agent.profile,
|
|
42
|
+
name: agent.name,
|
|
43
|
+
description: agent.description,
|
|
44
|
+
invited: agent.invited,
|
|
45
|
+
});
|
|
46
|
+
await chatServer.agentClients.addAgentToRoom(roomId, client);
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
console.error(`[GroupChat] Failed to connect agent ${a.profile} to room ${roomId}: ${err.message}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const room = storage.getRoom(roomId);
|
|
53
|
+
ctx.body = { room, agents: addedAgents };
|
|
59
54
|
});
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
ctx.
|
|
65
|
-
ctx.body = { error: 'Room not found' };
|
|
55
|
+
// List rooms
|
|
56
|
+
exports.groupChatRoutes.get('/api/hermes/group-chat/rooms', async (ctx) => {
|
|
57
|
+
if (!chatServer) {
|
|
58
|
+
ctx.status = 503;
|
|
59
|
+
ctx.body = { error: 'Group chat not initialized' };
|
|
66
60
|
return;
|
|
67
61
|
}
|
|
68
|
-
const
|
|
69
|
-
ctx.body = {
|
|
62
|
+
const rooms = chatServer.getStorage().getAllRooms();
|
|
63
|
+
ctx.body = { rooms };
|
|
70
64
|
});
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
65
|
+
// Get room by invite code
|
|
66
|
+
exports.groupChatRoutes.get('/api/hermes/group-chat/rooms/join/:code', async (ctx) => {
|
|
67
|
+
if (!chatServer) {
|
|
68
|
+
ctx.status = 503;
|
|
69
|
+
ctx.body = { error: 'Group chat not initialized' };
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const room = chatServer.getStorage().getRoomByInviteCode(ctx.params.code);
|
|
73
|
+
if (!room) {
|
|
76
74
|
ctx.status = 404;
|
|
77
75
|
ctx.body = { error: 'Room not found' };
|
|
78
76
|
return;
|
|
79
77
|
}
|
|
80
|
-
ctx.body = {
|
|
78
|
+
ctx.body = { room };
|
|
81
79
|
});
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
80
|
+
// Update room invite code
|
|
81
|
+
exports.groupChatRoutes.put('/api/hermes/group-chat/rooms/:roomId/invite-code', async (ctx) => {
|
|
82
|
+
if (!chatServer) {
|
|
83
|
+
ctx.status = 503;
|
|
84
|
+
ctx.body = { error: 'Group chat not initialized' };
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const { inviteCode } = ctx.request.body;
|
|
88
|
+
if (!inviteCode) {
|
|
89
|
+
ctx.status = 400;
|
|
90
|
+
ctx.body = { error: 'inviteCode is required' };
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
chatServer.getStorage().updateRoomInviteCode(ctx.params.roomId, inviteCode);
|
|
85
94
|
ctx.body = { success: true };
|
|
86
95
|
});
|
|
87
|
-
//
|
|
88
|
-
// Agents
|
|
89
|
-
// ---------------------------------------------------------------------------
|
|
90
|
-
exports.groupChatRoutes.get('/api/hermes/group-chat/rooms/:roomId/agents', async (ctx) => {
|
|
91
|
-
const { roomId } = ctx.params;
|
|
92
|
-
const agents = roomsDb.getRoomAgents(roomId);
|
|
93
|
-
ctx.body = { agents };
|
|
94
|
-
});
|
|
96
|
+
// Add agent to room
|
|
95
97
|
exports.groupChatRoutes.post('/api/hermes/group-chat/rooms/:roomId/agents', async (ctx) => {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
ctx.status = 400;
|
|
100
|
-
ctx.body = { error: 'agent_name and profile are required' };
|
|
98
|
+
if (!chatServer) {
|
|
99
|
+
ctx.status = 503;
|
|
100
|
+
ctx.body = { error: 'Group chat not initialized' };
|
|
101
101
|
return;
|
|
102
102
|
}
|
|
103
|
-
|
|
104
|
-
if (
|
|
103
|
+
const { profile, name, description, invited } = ctx.request.body;
|
|
104
|
+
if (!profile) {
|
|
105
105
|
ctx.status = 400;
|
|
106
|
-
ctx.body = { error: '
|
|
106
|
+
ctx.body = { error: 'profile is required' };
|
|
107
107
|
return;
|
|
108
108
|
}
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
109
|
+
const agentId = generateId();
|
|
110
|
+
const agent = chatServer.getStorage().addRoomAgent(ctx.params.roomId, agentId, profile, name || profile, description || '', invited ? 1 : 0);
|
|
111
|
+
// Auto-connect agent via Socket.IO
|
|
112
|
+
try {
|
|
113
|
+
const client = await chatServer.agentClients.createAgent({
|
|
114
|
+
profile: agent.profile,
|
|
115
|
+
name: agent.name,
|
|
116
|
+
description: agent.description,
|
|
117
|
+
invited: agent.invited,
|
|
118
|
+
});
|
|
119
|
+
await chatServer.agentClients.addAgentToRoom(ctx.params.roomId, client);
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
console.error(`[GroupChat] Failed to connect agent ${profile} to room ${ctx.params.roomId}: ${err.message}`);
|
|
118
123
|
}
|
|
119
124
|
ctx.body = { agent };
|
|
120
125
|
});
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
126
|
+
// List agents in room
|
|
127
|
+
exports.groupChatRoutes.get('/api/hermes/group-chat/rooms/:roomId/agents', async (ctx) => {
|
|
128
|
+
if (!chatServer) {
|
|
129
|
+
ctx.status = 503;
|
|
130
|
+
ctx.body = { error: 'Group chat not initialized' };
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const agents = chatServer.getStorage().getRoomAgents(ctx.params.roomId);
|
|
134
|
+
ctx.body = { agents };
|
|
125
135
|
});
|
|
126
|
-
//
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
ctx.
|
|
136
|
+
// Remove agent from room
|
|
137
|
+
exports.groupChatRoutes.delete('/api/hermes/group-chat/rooms/:roomId/agents/:agentId', async (ctx) => {
|
|
138
|
+
if (!chatServer) {
|
|
139
|
+
ctx.status = 503;
|
|
140
|
+
ctx.body = { error: 'Group chat not initialized' };
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
chatServer.getStorage().removeRoomAgent(ctx.params.agentId);
|
|
144
|
+
chatServer.agentClients.removeAgentFromRoom(ctx.params.roomId, ctx.params.agentId);
|
|
145
|
+
ctx.body = { success: true };
|
|
135
146
|
});
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.updateRoutes = void 0;
|
|
40
|
+
const router_1 = __importDefault(require("@koa/router"));
|
|
41
|
+
exports.updateRoutes = new router_1.default();
|
|
42
|
+
exports.updateRoutes.post('/api/hermes/update', async (ctx) => {
|
|
43
|
+
const isWin = process.platform === 'win32';
|
|
44
|
+
const cmd = isWin
|
|
45
|
+
? 'cmd /c npm install -g hermes-web-ui@latest'
|
|
46
|
+
: 'npm install -g hermes-web-ui@latest';
|
|
47
|
+
try {
|
|
48
|
+
const { execSync } = await Promise.resolve().then(() => __importStar(require('child_process')));
|
|
49
|
+
const output = execSync(cmd, {
|
|
50
|
+
encoding: 'utf-8',
|
|
51
|
+
timeout: 120000,
|
|
52
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
53
|
+
});
|
|
54
|
+
ctx.body = { success: true, message: output.trim() };
|
|
55
|
+
setTimeout(() => {
|
|
56
|
+
const { spawn } = require('child_process');
|
|
57
|
+
spawn(isWin ? 'cmd' : 'sh', isWin ? ['/c', 'hermes-web-ui restart'] : ['-c', 'hermes-web-ui restart'], {
|
|
58
|
+
detached: true,
|
|
59
|
+
stdio: 'ignore',
|
|
60
|
+
windowsHide: true,
|
|
61
|
+
}).unref();
|
|
62
|
+
process.exit(0);
|
|
63
|
+
}, 2000);
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
ctx.status = 500;
|
|
67
|
+
ctx.body = { success: false, message: err.stderr || err.message };
|
|
68
|
+
}
|
|
69
|
+
});
|
|
@@ -46,7 +46,7 @@ async function authMiddleware(token) {
|
|
|
46
46
|
return;
|
|
47
47
|
}
|
|
48
48
|
// Skip non-API paths (static files, health check, SPA)
|
|
49
|
-
const path = ctx.path;
|
|
49
|
+
const path = ctx.path.toLowerCase();
|
|
50
50
|
if (path === '/health' ||
|
|
51
51
|
(!path.startsWith('/api') && !path.startsWith('/v1') && path !== '/webhook')) {
|
|
52
52
|
await next();
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getGatewayManagerInstance = getGatewayManagerInstance;
|
|
37
|
+
exports.initGatewayManager = initGatewayManager;
|
|
38
|
+
let gatewayManager = null;
|
|
39
|
+
function getGatewayManagerInstance() {
|
|
40
|
+
return gatewayManager;
|
|
41
|
+
}
|
|
42
|
+
async function initGatewayManager() {
|
|
43
|
+
const { GatewayManager } = await Promise.resolve().then(() => __importStar(require('./hermes/gateway-manager')));
|
|
44
|
+
const { getActiveProfileName } = await Promise.resolve().then(() => __importStar(require('./hermes/hermes-profile')));
|
|
45
|
+
const { setGatewayManager } = await Promise.resolve().then(() => __importStar(require('../routes/hermes/gateways')));
|
|
46
|
+
const activeProfile = getActiveProfileName();
|
|
47
|
+
gatewayManager = new GatewayManager(activeProfile);
|
|
48
|
+
setGatewayManager(gatewayManager);
|
|
49
|
+
await gatewayManager.detectAllOnStartup();
|
|
50
|
+
await gatewayManager.startAll();
|
|
51
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import type { GatewayManager } from '../gateway-manager';
|
|
2
|
+
interface AgentConfig {
|
|
3
|
+
profile: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
invited: number;
|
|
7
|
+
}
|
|
8
|
+
interface MessageData {
|
|
9
|
+
id: string;
|
|
10
|
+
roomId: string;
|
|
11
|
+
senderId: string;
|
|
12
|
+
senderName: string;
|
|
13
|
+
content: string;
|
|
14
|
+
timestamp: number;
|
|
15
|
+
}
|
|
16
|
+
interface MemberData {
|
|
17
|
+
id: string;
|
|
18
|
+
name: string;
|
|
19
|
+
joinedAt: number;
|
|
20
|
+
}
|
|
21
|
+
interface JoinResult {
|
|
22
|
+
roomId: string;
|
|
23
|
+
roomName: string;
|
|
24
|
+
members: MemberData[];
|
|
25
|
+
messages: MessageData[];
|
|
26
|
+
rooms: string[];
|
|
27
|
+
}
|
|
28
|
+
export interface AgentEventHandler {
|
|
29
|
+
onMessage?: (data: {
|
|
30
|
+
roomId: string;
|
|
31
|
+
msg: MessageData;
|
|
32
|
+
}) => void;
|
|
33
|
+
onTyping?: (data: {
|
|
34
|
+
roomId: string;
|
|
35
|
+
userId: string;
|
|
36
|
+
userName: string;
|
|
37
|
+
}) => void;
|
|
38
|
+
onStopTyping?: (data: {
|
|
39
|
+
roomId: string;
|
|
40
|
+
userId: string;
|
|
41
|
+
userName: string;
|
|
42
|
+
}) => void;
|
|
43
|
+
onMemberJoined?: (data: {
|
|
44
|
+
roomId: string;
|
|
45
|
+
memberId: string;
|
|
46
|
+
memberName: string;
|
|
47
|
+
members: MemberData[];
|
|
48
|
+
}) => void;
|
|
49
|
+
onMemberLeft?: (data: {
|
|
50
|
+
roomId: string;
|
|
51
|
+
memberId: string;
|
|
52
|
+
memberName: string;
|
|
53
|
+
members: MemberData[];
|
|
54
|
+
}) => void;
|
|
55
|
+
}
|
|
56
|
+
declare class AgentClient {
|
|
57
|
+
readonly agentId: string;
|
|
58
|
+
readonly profile: string;
|
|
59
|
+
readonly name: string;
|
|
60
|
+
private socket;
|
|
61
|
+
private joinedRooms;
|
|
62
|
+
private handlers;
|
|
63
|
+
private port;
|
|
64
|
+
private _reconnecting;
|
|
65
|
+
private gatewayManager;
|
|
66
|
+
constructor(config: AgentConfig, handlers?: AgentEventHandler);
|
|
67
|
+
get connected(): boolean;
|
|
68
|
+
get id(): string | undefined;
|
|
69
|
+
setGatewayManager(manager: GatewayManager): void;
|
|
70
|
+
connect(port?: number): Promise<void>;
|
|
71
|
+
disconnect(): void;
|
|
72
|
+
joinRoom(roomId: string): Promise<JoinResult>;
|
|
73
|
+
sendMessage(roomId: string, content: string): Promise<string>;
|
|
74
|
+
startTyping(roomId: string): void;
|
|
75
|
+
stopTyping(roomId: string): void;
|
|
76
|
+
getJoinedRooms(): string[];
|
|
77
|
+
private deleteSession;
|
|
78
|
+
private ensureConnected;
|
|
79
|
+
/**
|
|
80
|
+
* Forward a user message to Hermes gateway and stream the reply back to the room.
|
|
81
|
+
*/
|
|
82
|
+
private handleUserMessage;
|
|
83
|
+
private bindEvents;
|
|
84
|
+
}
|
|
85
|
+
export declare class AgentClients {
|
|
86
|
+
private rooms;
|
|
87
|
+
/**
|
|
88
|
+
* Create an agent client and connect it to the server.
|
|
89
|
+
* The agent will NOT auto-join any room — call addAgentToRoom separately.
|
|
90
|
+
*/
|
|
91
|
+
createAgent(config: AgentConfig, handlers?: AgentEventHandler, port?: number): Promise<AgentClient>;
|
|
92
|
+
/**
|
|
93
|
+
* Connect an agent to a room.
|
|
94
|
+
*/
|
|
95
|
+
addAgentToRoom(roomId: string, client: AgentClient): Promise<JoinResult>;
|
|
96
|
+
/**
|
|
97
|
+
* Remove an agent from a room and disconnect it.
|
|
98
|
+
*/
|
|
99
|
+
removeAgentFromRoom(roomId: string, agentId: string): void;
|
|
100
|
+
/**
|
|
101
|
+
* Get all agents in a room.
|
|
102
|
+
*/
|
|
103
|
+
getAgents(roomId: string): AgentClient[];
|
|
104
|
+
/**
|
|
105
|
+
* Get a specific agent in a room.
|
|
106
|
+
*/
|
|
107
|
+
getAgent(roomId: string, agentId: string): AgentClient | undefined;
|
|
108
|
+
/**
|
|
109
|
+
* Get all room IDs that have agents.
|
|
110
|
+
*/
|
|
111
|
+
getRoomIds(): string[];
|
|
112
|
+
/**
|
|
113
|
+
* Send a message from a specific agent in a room.
|
|
114
|
+
*/
|
|
115
|
+
sendMessage(roomId: string, agentId: string, content: string): Promise<string>;
|
|
116
|
+
/**
|
|
117
|
+
* Broadcast a message from all agents in a room.
|
|
118
|
+
*/
|
|
119
|
+
broadcastFromRoom(roomId: string, content: string): Promise<string[]>;
|
|
120
|
+
/**
|
|
121
|
+
* Disconnect all agents in a room.
|
|
122
|
+
*/
|
|
123
|
+
disconnectRoom(roomId: string): void;
|
|
124
|
+
/**
|
|
125
|
+
* Disconnect all agents in all rooms.
|
|
126
|
+
*/
|
|
127
|
+
disconnectAll(): void;
|
|
128
|
+
/**
|
|
129
|
+
* Set gateway manager for all existing and future agents.
|
|
130
|
+
*/
|
|
131
|
+
setGatewayManager(manager: GatewayManager): void;
|
|
132
|
+
}
|
|
133
|
+
export {};
|