@agent-relay/dashboard-server 2.0.92 → 2.0.94
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/dist/lib/types.d.ts +3 -2
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/utils.d.ts +5 -0
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +16 -0
- package/dist/lib/utils.js.map +1 -1
- package/dist/proxy-server.d.ts.map +1 -1
- package/dist/proxy-server.js +32 -19
- package/dist/proxy-server.js.map +1 -1
- package/dist/relaycast-provider-helpers.d.ts +6 -0
- package/dist/relaycast-provider-helpers.d.ts.map +1 -1
- package/dist/relaycast-provider-helpers.js +10 -9
- package/dist/relaycast-provider-helpers.js.map +1 -1
- package/dist/relaycast-provider.d.ts +3 -7
- package/dist/relaycast-provider.d.ts.map +1 -1
- package/dist/relaycast-provider.js +5 -28
- package/dist/relaycast-provider.js.map +1 -1
- package/dist/routes/channels.d.ts.map +1 -1
- package/dist/routes/channels.js +7 -8
- package/dist/routes/channels.js.map +1 -1
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +2 -3
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/models.d.ts.map +1 -1
- package/dist/routes/models.js +39 -3
- package/dist/routes/models.js.map +1 -1
- package/dist/routes/relay-config.d.ts.map +1 -1
- package/dist/routes/relay-config.js +19 -6
- package/dist/routes/relay-config.js.map +1 -1
- package/dist/routes/thread-replies.d.ts.map +1 -1
- package/dist/routes/thread-replies.js +4 -4
- package/dist/routes/thread-replies.js.map +1 -1
- package/dist/services/index.d.ts +0 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +0 -1
- package/dist/services/index.js.map +1 -1
- package/dist/types/index.d.ts +0 -75
- package/dist/types/index.d.ts.map +1 -1
- package/dist/websocket/logs.d.ts +1 -25
- package/dist/websocket/logs.d.ts.map +1 -1
- package/dist/websocket/logs.js +0 -397
- package/dist/websocket/logs.js.map +1 -1
- package/out/404.html +1 -1
- package/out/_next/static/chunks/{3663-47290254b8f6f5dd.js → 3663-191a9aa9104061af.js} +1 -1
- package/out/_next/static/chunks/4201-d11188cf35739bff.js +1 -0
- package/out/_next/static/chunks/5787-f6fd7a3fbfe5eae6.js +73 -0
- package/out/_next/static/chunks/app/app/[[...slug]]/{page-c1376e695ba19e38.js → page-2b872f60e3d64014.js} +1 -1
- package/out/_next/static/chunks/app/{page-f2ebc7d0bc08e395.js → page-ca5511e5d65100a5.js} +1 -1
- package/out/about.html +1 -1
- package/out/about.txt +1 -1
- package/out/app/onboarding.html +1 -1
- package/out/app/onboarding.txt +1 -1
- package/out/app.html +1 -1
- package/out/app.txt +2 -2
- package/out/blog/go-to-bed-wake-up-to-a-finished-product.html +1 -1
- package/out/blog/go-to-bed-wake-up-to-a-finished-product.txt +1 -1
- package/out/blog/let-them-cook-multi-agent-orchestration.html +1 -1
- package/out/blog/let-them-cook-multi-agent-orchestration.txt +1 -1
- package/out/blog.html +1 -1
- package/out/blog.txt +1 -1
- package/out/careers.html +1 -1
- package/out/careers.txt +1 -1
- package/out/changelog.html +1 -1
- package/out/changelog.txt +1 -1
- package/out/cloud/link.html +1 -1
- package/out/cloud/link.txt +1 -1
- package/out/complete-profile.html +1 -1
- package/out/complete-profile.txt +1 -1
- package/out/connect-repos.html +1 -1
- package/out/connect-repos.txt +1 -1
- package/out/contact.html +1 -1
- package/out/contact.txt +1 -1
- package/out/dev/cli-tools.html +1 -1
- package/out/dev/cli-tools.txt +1 -1
- package/out/dev/log-viewer.html +1 -1
- package/out/dev/log-viewer.txt +1 -1
- package/out/docs.html +1 -1
- package/out/docs.txt +1 -1
- package/out/history.html +1 -1
- package/out/history.txt +2 -2
- package/out/index.html +1 -1
- package/out/index.txt +2 -2
- package/out/login.html +1 -1
- package/out/login.txt +1 -1
- package/out/metrics.html +1 -1
- package/out/metrics.txt +2 -2
- package/out/pricing.html +1 -1
- package/out/pricing.txt +1 -1
- package/out/privacy.html +1 -1
- package/out/privacy.txt +1 -1
- package/out/providers/setup/claude.html +1 -1
- package/out/providers/setup/claude.txt +1 -1
- package/out/providers/setup/codex.html +1 -1
- package/out/providers/setup/codex.txt +1 -1
- package/out/providers/setup/cursor.html +1 -1
- package/out/providers/setup/cursor.txt +1 -1
- package/out/providers.html +1 -1
- package/out/providers.txt +1 -1
- package/out/security.html +1 -1
- package/out/security.txt +1 -1
- package/out/signup.html +1 -1
- package/out/signup.txt +1 -1
- package/out/terms.html +1 -1
- package/out/terms.txt +1 -1
- package/package.json +6 -9
- package/dist/lib/attachment-storage.d.ts +0 -10
- package/dist/lib/attachment-storage.d.ts.map +0 -1
- package/dist/lib/attachment-storage.js +0 -53
- package/dist/lib/attachment-storage.js.map +0 -1
- package/dist/lib/broadcast.d.ts +0 -18
- package/dist/lib/broadcast.d.ts.map +0 -1
- package/dist/lib/broadcast.js +0 -118
- package/dist/lib/broadcast.js.map +0 -1
- package/dist/lib/channel-state.d.ts +0 -32
- package/dist/lib/channel-state.d.ts.map +0 -1
- package/dist/lib/channel-state.js +0 -146
- package/dist/lib/channel-state.js.map +0 -1
- package/dist/lib/cli-auth.d.ts +0 -40
- package/dist/lib/cli-auth.d.ts.map +0 -1
- package/dist/lib/cli-auth.js +0 -144
- package/dist/lib/cli-auth.js.map +0 -1
- package/dist/lib/data-assembly.d.ts +0 -136
- package/dist/lib/data-assembly.d.ts.map +0 -1
- package/dist/lib/data-assembly.js +0 -550
- package/dist/lib/data-assembly.js.map +0 -1
- package/dist/lib/server-state.d.ts +0 -115
- package/dist/lib/server-state.d.ts.map +0 -1
- package/dist/lib/server-state.js +0 -138
- package/dist/lib/server-state.js.map +0 -1
- package/dist/lib/websocket-runtime.d.ts +0 -17
- package/dist/lib/websocket-runtime.d.ts.map +0 -1
- package/dist/lib/websocket-runtime.js +0 -76
- package/dist/lib/websocket-runtime.js.map +0 -1
- package/dist/routes/auth.d.ts +0 -45
- package/dist/routes/auth.d.ts.map +0 -1
- package/dist/routes/auth.js +0 -261
- package/dist/routes/auth.js.map +0 -1
- package/dist/routes/channels-integrated.d.ts +0 -84
- package/dist/routes/channels-integrated.d.ts.map +0 -1
- package/dist/routes/channels-integrated.js +0 -644
- package/dist/routes/channels-integrated.js.map +0 -1
- package/dist/routes/decisions.d.ts +0 -31
- package/dist/routes/decisions.d.ts.map +0 -1
- package/dist/routes/decisions.js +0 -109
- package/dist/routes/decisions.js.map +0 -1
- package/dist/routes/fleet.d.ts +0 -24
- package/dist/routes/fleet.d.ts.map +0 -1
- package/dist/routes/fleet.js +0 -131
- package/dist/routes/fleet.js.map +0 -1
- package/dist/routes/history.d.ts +0 -13
- package/dist/routes/history.d.ts.map +0 -1
- package/dist/routes/history.js +0 -205
- package/dist/routes/history.js.map +0 -1
- package/dist/routes/messaging.d.ts +0 -34
- package/dist/routes/messaging.d.ts.map +0 -1
- package/dist/routes/messaging.js +0 -306
- package/dist/routes/messaging.js.map +0 -1
- package/dist/routes/settings.d.ts +0 -6
- package/dist/routes/settings.d.ts.map +0 -1
- package/dist/routes/settings.js +0 -119
- package/dist/routes/settings.js.map +0 -1
- package/dist/routes/spawn.d.ts +0 -75
- package/dist/routes/spawn.d.ts.map +0 -1
- package/dist/routes/spawn.js +0 -521
- package/dist/routes/spawn.js.map +0 -1
- package/dist/routes/system.d.ts +0 -21
- package/dist/routes/system.d.ts.map +0 -1
- package/dist/routes/system.js +0 -186
- package/dist/routes/system.js.map +0 -1
- package/dist/routes/tasks.d.ts +0 -27
- package/dist/routes/tasks.d.ts.map +0 -1
- package/dist/routes/tasks.js +0 -103
- package/dist/routes/tasks.js.map +0 -1
- package/dist/routes/ui.d.ts +0 -6
- package/dist/routes/ui.d.ts.map +0 -1
- package/dist/routes/ui.js +0 -114
- package/dist/routes/ui.js.map +0 -1
- package/dist/server.d.ts +0 -4
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -481
- package/dist/server.js.map +0 -1
- package/dist/services/broker-spawn-reader.d.ts +0 -40
- package/dist/services/broker-spawn-reader.d.ts.map +0 -1
- package/dist/services/broker-spawn-reader.js +0 -155
- package/dist/services/broker-spawn-reader.js.map +0 -1
- package/dist/services/user-bridge.d.ts +0 -155
- package/dist/services/user-bridge.d.ts.map +0 -1
- package/dist/services/user-bridge.js +0 -385
- package/dist/services/user-bridge.js.map +0 -1
- package/dist/websocket/bridge.d.ts +0 -12
- package/dist/websocket/bridge.d.ts.map +0 -1
- package/dist/websocket/bridge.js +0 -33
- package/dist/websocket/bridge.js.map +0 -1
- package/dist/websocket/main.d.ts +0 -15
- package/dist/websocket/main.d.ts.map +0 -1
- package/dist/websocket/main.js +0 -84
- package/dist/websocket/main.js.map +0 -1
- package/dist/websocket/presence.d.ts +0 -74
- package/dist/websocket/presence.d.ts.map +0 -1
- package/dist/websocket/presence.js +0 -330
- package/dist/websocket/presence.js.map +0 -1
- package/out/_next/static/chunks/270-8c0b8109123a0c5f.js +0 -73
- package/out/_next/static/chunks/5518-6d77237eefc8d5ae.js +0 -1
- /package/out/_next/static/{5cqIVzlh9DbJT28EbNrcC → wgSCX8AQnjVl_Rnx1gUp5}/_buildManifest.js +0 -0
- /package/out/_next/static/{5cqIVzlh9DbJT28EbNrcC → wgSCX8AQnjVl_Rnx1gUp5}/_ssgManifest.js +0 -0
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* BrokerSpawnReader — Implements SpawnManagerLike using RelayAdapter.
|
|
3
|
-
*
|
|
4
|
-
* Bridges the dashboard's sync SpawnManagerLike interface with the
|
|
5
|
-
* async broker SDK by maintaining an internal cache of agents and
|
|
6
|
-
* worker output, updated via broker event subscription.
|
|
7
|
-
*/
|
|
8
|
-
/** Max lines of output to buffer per agent (matches xterm scrollback). */
|
|
9
|
-
const MAX_OUTPUT_LINES = 10_000;
|
|
10
|
-
/** Max bytes for the raw output buffer per agent (5 MB). */
|
|
11
|
-
const MAX_RAW_BYTES = 5_000_000;
|
|
12
|
-
export class BrokerSpawnReader {
|
|
13
|
-
adapter;
|
|
14
|
-
agentCache = new Map();
|
|
15
|
-
outputBuffers = new Map();
|
|
16
|
-
rawOutputBuffers = new Map();
|
|
17
|
-
unsubscribe;
|
|
18
|
-
constructor(adapter) {
|
|
19
|
-
this.adapter = adapter;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Start listening to broker events.
|
|
23
|
-
* Must be called once after adapter.start() to seed state and begin tracking.
|
|
24
|
-
*/
|
|
25
|
-
async initialize() {
|
|
26
|
-
// Seed cache from current agent list
|
|
27
|
-
try {
|
|
28
|
-
const agents = await this.adapter.listAgents();
|
|
29
|
-
for (const a of agents) {
|
|
30
|
-
this.agentCache.set(a.name, {
|
|
31
|
-
name: a.name,
|
|
32
|
-
cli: a.cli || 'unknown',
|
|
33
|
-
task: '',
|
|
34
|
-
spawnedAt: Date.now(),
|
|
35
|
-
pid: a.pid,
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
// Non-fatal — broker may not have agents yet
|
|
41
|
-
}
|
|
42
|
-
// Subscribe to events for live updates
|
|
43
|
-
this.unsubscribe = this.adapter.onEvent((event) => {
|
|
44
|
-
switch (event.kind) {
|
|
45
|
-
case 'agent_spawned': {
|
|
46
|
-
this.agentCache.set(event.name, {
|
|
47
|
-
name: event.name,
|
|
48
|
-
cli: 'unknown',
|
|
49
|
-
task: '',
|
|
50
|
-
spawnedAt: Date.now(),
|
|
51
|
-
});
|
|
52
|
-
// Initialize output buffers
|
|
53
|
-
this.outputBuffers.set(event.name, []);
|
|
54
|
-
this.rawOutputBuffers.set(event.name, '');
|
|
55
|
-
break;
|
|
56
|
-
}
|
|
57
|
-
case 'agent_released':
|
|
58
|
-
case 'agent_exited': {
|
|
59
|
-
this.agentCache.delete(event.name);
|
|
60
|
-
// Keep output buffers so logs are still accessible after exit
|
|
61
|
-
break;
|
|
62
|
-
}
|
|
63
|
-
case 'worker_stream': {
|
|
64
|
-
const lines = this.outputBuffers.get(event.name);
|
|
65
|
-
if (lines) {
|
|
66
|
-
lines.push(event.chunk);
|
|
67
|
-
// Trim to max buffer size
|
|
68
|
-
if (lines.length > MAX_OUTPUT_LINES) {
|
|
69
|
-
lines.splice(0, lines.length - MAX_OUTPUT_LINES);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
this.outputBuffers.set(event.name, [event.chunk]);
|
|
74
|
-
}
|
|
75
|
-
// Append raw chunk as-is (no newline synthesis) so TUI repaint
|
|
76
|
-
// control sequences remain faithful for xterm rendering.
|
|
77
|
-
let raw = (this.rawOutputBuffers.get(event.name) ?? '') + event.chunk;
|
|
78
|
-
if (raw.length > MAX_RAW_BYTES) {
|
|
79
|
-
// Trim from the front, keeping from the first newline after the cut point
|
|
80
|
-
const trimPoint = raw.length - MAX_RAW_BYTES;
|
|
81
|
-
const newlineIdx = raw.indexOf('\n', trimPoint);
|
|
82
|
-
raw = newlineIdx !== -1 ? raw.slice(newlineIdx + 1) : raw.slice(trimPoint);
|
|
83
|
-
}
|
|
84
|
-
this.rawOutputBuffers.set(event.name, raw);
|
|
85
|
-
break;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
hasWorker(name) {
|
|
91
|
-
return this.agentCache.has(name);
|
|
92
|
-
}
|
|
93
|
-
getActiveWorkers() {
|
|
94
|
-
return Array.from(this.agentCache.values());
|
|
95
|
-
}
|
|
96
|
-
getWorkerOutput(name, limit = 500) {
|
|
97
|
-
const lines = this.outputBuffers.get(name);
|
|
98
|
-
if (!lines)
|
|
99
|
-
return undefined;
|
|
100
|
-
return lines.slice(-limit);
|
|
101
|
-
}
|
|
102
|
-
getWorkerRawOutput(name) {
|
|
103
|
-
return this.rawOutputBuffers.get(name);
|
|
104
|
-
}
|
|
105
|
-
async sendWorkerInput(name, data) {
|
|
106
|
-
try {
|
|
107
|
-
await this.adapter.sendInput(name, data);
|
|
108
|
-
return true;
|
|
109
|
-
}
|
|
110
|
-
catch (err) {
|
|
111
|
-
console.error(`[broker-spawn-reader] Failed to send input to ${name}:`, err);
|
|
112
|
-
return false;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
/** Refresh the agent cache from the broker. */
|
|
116
|
-
async refresh() {
|
|
117
|
-
try {
|
|
118
|
-
const agents = await this.adapter.listAgents();
|
|
119
|
-
const currentNames = new Set(agents.map((a) => a.name));
|
|
120
|
-
// Remove agents no longer present
|
|
121
|
-
for (const name of this.agentCache.keys()) {
|
|
122
|
-
if (!currentNames.has(name)) {
|
|
123
|
-
this.agentCache.delete(name);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
// Add/update agents
|
|
127
|
-
for (const a of agents) {
|
|
128
|
-
const existing = this.agentCache.get(a.name);
|
|
129
|
-
if (existing) {
|
|
130
|
-
existing.pid = a.pid;
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
this.agentCache.set(a.name, {
|
|
134
|
-
name: a.name,
|
|
135
|
-
cli: a.cli || 'unknown',
|
|
136
|
-
task: '',
|
|
137
|
-
spawnedAt: Date.now(),
|
|
138
|
-
pid: a.pid,
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
catch {
|
|
144
|
-
// Non-fatal
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
/** Clean up event subscriptions. */
|
|
148
|
-
destroy() {
|
|
149
|
-
this.unsubscribe?.();
|
|
150
|
-
this.agentCache.clear();
|
|
151
|
-
this.outputBuffers.clear();
|
|
152
|
-
this.rawOutputBuffers.clear();
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
//# sourceMappingURL=broker-spawn-reader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"broker-spawn-reader.js","sourceRoot":"","sources":["../../src/services/broker-spawn-reader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,0EAA0E;AAC1E,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEhC,4DAA4D;AAC5D,MAAM,aAAa,GAAG,SAAS,CAAC;AAYhC,MAAM,OAAO,iBAAiB;IAMR;IALZ,UAAU,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC5C,aAAa,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC5C,gBAAgB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,WAAW,CAAc;IAEjC,YAAoB,OAAqB;QAArB,YAAO,GAAP,OAAO,CAAc;IAAG,CAAC;IAE7C;;;OAGG;IACH,KAAK,CAAC,UAAU;QACd,qCAAqC;QACrC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC/C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;oBAC1B,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,SAAS;oBACvB,IAAI,EAAE,EAAE;oBACR,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;oBACrB,GAAG,EAAE,CAAC,CAAC,GAAG;iBACX,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,6CAA6C;QAC/C,CAAC;QAED,uCAAuC;QACvC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAU,EAAE,EAAE;YACrD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;gBACnB,KAAK,eAAe,CAAC,CAAC,CAAC;oBACrB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE;wBAC9B,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,GAAG,EAAE,SAAS;wBACd,IAAI,EAAE,EAAE;wBACR,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;qBACtB,CAAC,CAAC;oBACH,4BAA4B;oBAC5B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBACvC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAC1C,MAAM;gBACR,CAAC;gBAED,KAAK,gBAAgB,CAAC;gBACtB,KAAK,cAAc,CAAC,CAAC,CAAC;oBACpB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACnC,8DAA8D;oBAC9D,MAAM;gBACR,CAAC;gBAED,KAAK,eAAe,CAAC,CAAC,CAAC;oBACrB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACjD,IAAI,KAAK,EAAE,CAAC;wBACV,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;wBACxB,0BAA0B;wBAC1B,IAAI,KAAK,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;4BACpC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,gBAAgB,CAAC,CAAC;wBACnD,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;oBACpD,CAAC;oBAED,+DAA+D;oBAC/D,yDAAyD;oBACzD,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;oBACtE,IAAI,GAAG,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;wBAC/B,0EAA0E;wBAC1E,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,GAAG,aAAa,CAAC;wBAC7C,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;wBAChD,GAAG,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;oBAC7E,CAAC;oBACD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;oBAC3C,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,gBAAgB;QASd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,eAAe,CAAC,IAAY,EAAE,KAAK,GAAG,GAAG;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,kBAAkB,CAAC,IAAY;QAC7B,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IAAY,EAAE,IAAY;QAC9C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACzC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,iDAAiD,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;YAC7E,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC/C,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAE7D,kCAAkC;YAClC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC1C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;YAED,oBAAoB;YACpB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC7C,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;gBACvB,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;wBAC1B,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,SAAS;wBACvB,IAAI,EAAE,EAAE;wBACR,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;wBACrB,GAAG,EAAE,CAAC,CAAC,GAAG;qBACX,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,OAAO;QACL,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACrB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* User Bridge - Bridges dashboard WebSocket users to the relay daemon.
|
|
3
|
-
*
|
|
4
|
-
* This module allows human users connected via WebSocket to:
|
|
5
|
-
* - Register as "user" entities in the relay daemon
|
|
6
|
-
* - Join/leave channels
|
|
7
|
-
* - Send/receive messages through the relay daemon
|
|
8
|
-
* - Communicate with agents and other users
|
|
9
|
-
*/
|
|
10
|
-
import type { WebSocket } from 'ws';
|
|
11
|
-
/**
|
|
12
|
-
* Relay client interface (subset of RelayClient for dependency injection)
|
|
13
|
-
*/
|
|
14
|
-
export interface IRelayClient {
|
|
15
|
-
connect(): Promise<void>;
|
|
16
|
-
disconnect(): void;
|
|
17
|
-
state: string;
|
|
18
|
-
sendMessage(to: string, body: string, kind?: string, data?: unknown, thread?: string): boolean;
|
|
19
|
-
joinChannel(channel: string, displayName?: string): boolean;
|
|
20
|
-
leaveChannel(channel: string, reason?: string): boolean;
|
|
21
|
-
sendChannelMessage(channel: string, body: string, options?: {
|
|
22
|
-
thread?: string;
|
|
23
|
-
mentions?: string[];
|
|
24
|
-
attachments?: unknown[];
|
|
25
|
-
data?: Record<string, unknown>;
|
|
26
|
-
}): boolean;
|
|
27
|
-
adminJoinChannel?(channel: string, member: string): boolean;
|
|
28
|
-
adminRemoveMember?(channel: string, member: string): boolean;
|
|
29
|
-
onMessage?: (from: string, payload: any, messageId: string, meta?: any, originalTo?: string) => void;
|
|
30
|
-
onChannelMessage?: (from: string, channel: string, body: string, envelope: any) => void;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Factory function type for creating relay clients
|
|
34
|
-
*/
|
|
35
|
-
export type RelayClientFactory = (options: {
|
|
36
|
-
agentName: string;
|
|
37
|
-
entityType: 'user';
|
|
38
|
-
displayName?: string;
|
|
39
|
-
avatarUrl?: string;
|
|
40
|
-
}) => Promise<IRelayClient>;
|
|
41
|
-
/**
|
|
42
|
-
* User info for avatar lookups
|
|
43
|
-
*/
|
|
44
|
-
export interface UserInfo {
|
|
45
|
-
avatarUrl?: string;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Options for creating a UserBridge
|
|
49
|
-
*/
|
|
50
|
-
export interface UserBridgeOptions {
|
|
51
|
-
createRelayClient: RelayClientFactory;
|
|
52
|
-
loadPersistedChannels?: (username: string) => Promise<string[]>;
|
|
53
|
-
/** Optional callback to look up user info (avatar URL) by username */
|
|
54
|
-
lookupUserInfo?: (username: string) => UserInfo | undefined;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Message options for sending
|
|
58
|
-
*/
|
|
59
|
-
export interface SendMessageOptions {
|
|
60
|
-
thread?: string;
|
|
61
|
-
data?: Record<string, unknown>;
|
|
62
|
-
attachments?: unknown[];
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* UserBridge manages the connection between dashboard WebSocket users
|
|
66
|
-
* and the relay daemon.
|
|
67
|
-
*/
|
|
68
|
-
export declare class UserBridge {
|
|
69
|
-
private readonly createRelayClient;
|
|
70
|
-
private readonly loadPersistedChannels?;
|
|
71
|
-
private readonly lookupUserInfo?;
|
|
72
|
-
private readonly users;
|
|
73
|
-
constructor(options: UserBridgeOptions);
|
|
74
|
-
/**
|
|
75
|
-
* Get the relay client for a user if they are registered.
|
|
76
|
-
* This allows external code to reuse the userBridge's relay client
|
|
77
|
-
* instead of creating a duplicate connection.
|
|
78
|
-
*/
|
|
79
|
-
getRelayClient(username: string): IRelayClient | undefined;
|
|
80
|
-
/**
|
|
81
|
-
* Register a user with the relay daemon.
|
|
82
|
-
* Creates a relay client connection for the user.
|
|
83
|
-
*/
|
|
84
|
-
registerUser(username: string, webSocket: WebSocket, options?: {
|
|
85
|
-
avatarUrl?: string;
|
|
86
|
-
displayName?: string;
|
|
87
|
-
}): Promise<void>;
|
|
88
|
-
/**
|
|
89
|
-
* Remove a specific WebSocket connection from a user's session.
|
|
90
|
-
* If this was the last connection, unregister the user entirely.
|
|
91
|
-
*/
|
|
92
|
-
private removeWebSocket;
|
|
93
|
-
/**
|
|
94
|
-
* Unregister a user and disconnect their relay client.
|
|
95
|
-
*/
|
|
96
|
-
unregisterUser(username: string): void;
|
|
97
|
-
/**
|
|
98
|
-
* Check if a user is registered.
|
|
99
|
-
*/
|
|
100
|
-
isUserRegistered(username: string): boolean;
|
|
101
|
-
/**
|
|
102
|
-
* Add a new WebSocket connection for an existing user session.
|
|
103
|
-
* This is needed when a user opens a new tab.
|
|
104
|
-
*/
|
|
105
|
-
updateWebSocket(username: string, newWebSocket: WebSocket): boolean;
|
|
106
|
-
/**
|
|
107
|
-
* Get list of all registered users.
|
|
108
|
-
*/
|
|
109
|
-
getRegisteredUsers(): string[];
|
|
110
|
-
/**
|
|
111
|
-
* Join a channel.
|
|
112
|
-
*/
|
|
113
|
-
joinChannel(username: string, channel: string): Promise<boolean>;
|
|
114
|
-
/**
|
|
115
|
-
* Leave a channel.
|
|
116
|
-
*/
|
|
117
|
-
leaveChannel(username: string, channel: string): Promise<boolean>;
|
|
118
|
-
/**
|
|
119
|
-
* Get channels a user has joined.
|
|
120
|
-
*/
|
|
121
|
-
getUserChannels(username: string): string[];
|
|
122
|
-
/**
|
|
123
|
-
* Send a message to a channel.
|
|
124
|
-
*/
|
|
125
|
-
sendChannelMessage(username: string, channel: string, body: string, options?: SendMessageOptions): Promise<boolean>;
|
|
126
|
-
/**
|
|
127
|
-
* Send a direct message to another user or agent.
|
|
128
|
-
*/
|
|
129
|
-
sendDirectMessage(fromUsername: string, toName: string, body: string, options?: SendMessageOptions): Promise<boolean>;
|
|
130
|
-
/**
|
|
131
|
-
* Handle incoming direct message from relay daemon.
|
|
132
|
-
*/
|
|
133
|
-
private handleIncomingDirectMessage;
|
|
134
|
-
/**
|
|
135
|
-
* Handle incoming channel message from relay daemon.
|
|
136
|
-
*/
|
|
137
|
-
private handleIncomingChannelMessage;
|
|
138
|
-
/**
|
|
139
|
-
* Admin: Add a member to a channel (does not require member to be connected).
|
|
140
|
-
* Used to sync channel memberships from database.
|
|
141
|
-
* Uses the first available user session or creates a temporary one.
|
|
142
|
-
*/
|
|
143
|
-
adminJoinChannel(channel: string, member: string): Promise<boolean>;
|
|
144
|
-
/**
|
|
145
|
-
* Admin: Remove a member from a channel (does not require member to be connected).
|
|
146
|
-
* Used to remove channel members from dashboard.
|
|
147
|
-
* Uses the first available user session or creates a temporary one.
|
|
148
|
-
*/
|
|
149
|
-
adminRemoveMember(channel: string, member: string): Promise<boolean>;
|
|
150
|
-
/**
|
|
151
|
-
* Dispose of all user sessions.
|
|
152
|
-
*/
|
|
153
|
-
dispose(): void;
|
|
154
|
-
}
|
|
155
|
-
//# sourceMappingURL=user-bridge.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"user-bridge.d.ts","sourceRoot":"","sources":["../../src/services/user-bridge.ts"],"names":[],"mappings":"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"}
|