@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.
Files changed (205) hide show
  1. package/dist/lib/types.d.ts +3 -2
  2. package/dist/lib/types.d.ts.map +1 -1
  3. package/dist/lib/utils.d.ts +5 -0
  4. package/dist/lib/utils.d.ts.map +1 -1
  5. package/dist/lib/utils.js +16 -0
  6. package/dist/lib/utils.js.map +1 -1
  7. package/dist/proxy-server.d.ts.map +1 -1
  8. package/dist/proxy-server.js +32 -19
  9. package/dist/proxy-server.js.map +1 -1
  10. package/dist/relaycast-provider-helpers.d.ts +6 -0
  11. package/dist/relaycast-provider-helpers.d.ts.map +1 -1
  12. package/dist/relaycast-provider-helpers.js +10 -9
  13. package/dist/relaycast-provider-helpers.js.map +1 -1
  14. package/dist/relaycast-provider.d.ts +3 -7
  15. package/dist/relaycast-provider.d.ts.map +1 -1
  16. package/dist/relaycast-provider.js +5 -28
  17. package/dist/relaycast-provider.js.map +1 -1
  18. package/dist/routes/channels.d.ts.map +1 -1
  19. package/dist/routes/channels.js +7 -8
  20. package/dist/routes/channels.js.map +1 -1
  21. package/dist/routes/health.d.ts.map +1 -1
  22. package/dist/routes/health.js +2 -3
  23. package/dist/routes/health.js.map +1 -1
  24. package/dist/routes/models.d.ts.map +1 -1
  25. package/dist/routes/models.js +39 -3
  26. package/dist/routes/models.js.map +1 -1
  27. package/dist/routes/relay-config.d.ts.map +1 -1
  28. package/dist/routes/relay-config.js +19 -6
  29. package/dist/routes/relay-config.js.map +1 -1
  30. package/dist/routes/thread-replies.d.ts.map +1 -1
  31. package/dist/routes/thread-replies.js +4 -4
  32. package/dist/routes/thread-replies.js.map +1 -1
  33. package/dist/services/index.d.ts +0 -1
  34. package/dist/services/index.d.ts.map +1 -1
  35. package/dist/services/index.js +0 -1
  36. package/dist/services/index.js.map +1 -1
  37. package/dist/types/index.d.ts +0 -75
  38. package/dist/types/index.d.ts.map +1 -1
  39. package/dist/websocket/logs.d.ts +1 -25
  40. package/dist/websocket/logs.d.ts.map +1 -1
  41. package/dist/websocket/logs.js +0 -397
  42. package/dist/websocket/logs.js.map +1 -1
  43. package/out/404.html +1 -1
  44. package/out/_next/static/chunks/{3663-47290254b8f6f5dd.js → 3663-191a9aa9104061af.js} +1 -1
  45. package/out/_next/static/chunks/4201-d11188cf35739bff.js +1 -0
  46. package/out/_next/static/chunks/5787-f6fd7a3fbfe5eae6.js +73 -0
  47. package/out/_next/static/chunks/app/app/[[...slug]]/{page-c1376e695ba19e38.js → page-2b872f60e3d64014.js} +1 -1
  48. package/out/_next/static/chunks/app/{page-f2ebc7d0bc08e395.js → page-ca5511e5d65100a5.js} +1 -1
  49. package/out/about.html +1 -1
  50. package/out/about.txt +1 -1
  51. package/out/app/onboarding.html +1 -1
  52. package/out/app/onboarding.txt +1 -1
  53. package/out/app.html +1 -1
  54. package/out/app.txt +2 -2
  55. package/out/blog/go-to-bed-wake-up-to-a-finished-product.html +1 -1
  56. package/out/blog/go-to-bed-wake-up-to-a-finished-product.txt +1 -1
  57. package/out/blog/let-them-cook-multi-agent-orchestration.html +1 -1
  58. package/out/blog/let-them-cook-multi-agent-orchestration.txt +1 -1
  59. package/out/blog.html +1 -1
  60. package/out/blog.txt +1 -1
  61. package/out/careers.html +1 -1
  62. package/out/careers.txt +1 -1
  63. package/out/changelog.html +1 -1
  64. package/out/changelog.txt +1 -1
  65. package/out/cloud/link.html +1 -1
  66. package/out/cloud/link.txt +1 -1
  67. package/out/complete-profile.html +1 -1
  68. package/out/complete-profile.txt +1 -1
  69. package/out/connect-repos.html +1 -1
  70. package/out/connect-repos.txt +1 -1
  71. package/out/contact.html +1 -1
  72. package/out/contact.txt +1 -1
  73. package/out/dev/cli-tools.html +1 -1
  74. package/out/dev/cli-tools.txt +1 -1
  75. package/out/dev/log-viewer.html +1 -1
  76. package/out/dev/log-viewer.txt +1 -1
  77. package/out/docs.html +1 -1
  78. package/out/docs.txt +1 -1
  79. package/out/history.html +1 -1
  80. package/out/history.txt +2 -2
  81. package/out/index.html +1 -1
  82. package/out/index.txt +2 -2
  83. package/out/login.html +1 -1
  84. package/out/login.txt +1 -1
  85. package/out/metrics.html +1 -1
  86. package/out/metrics.txt +2 -2
  87. package/out/pricing.html +1 -1
  88. package/out/pricing.txt +1 -1
  89. package/out/privacy.html +1 -1
  90. package/out/privacy.txt +1 -1
  91. package/out/providers/setup/claude.html +1 -1
  92. package/out/providers/setup/claude.txt +1 -1
  93. package/out/providers/setup/codex.html +1 -1
  94. package/out/providers/setup/codex.txt +1 -1
  95. package/out/providers/setup/cursor.html +1 -1
  96. package/out/providers/setup/cursor.txt +1 -1
  97. package/out/providers.html +1 -1
  98. package/out/providers.txt +1 -1
  99. package/out/security.html +1 -1
  100. package/out/security.txt +1 -1
  101. package/out/signup.html +1 -1
  102. package/out/signup.txt +1 -1
  103. package/out/terms.html +1 -1
  104. package/out/terms.txt +1 -1
  105. package/package.json +6 -9
  106. package/dist/lib/attachment-storage.d.ts +0 -10
  107. package/dist/lib/attachment-storage.d.ts.map +0 -1
  108. package/dist/lib/attachment-storage.js +0 -53
  109. package/dist/lib/attachment-storage.js.map +0 -1
  110. package/dist/lib/broadcast.d.ts +0 -18
  111. package/dist/lib/broadcast.d.ts.map +0 -1
  112. package/dist/lib/broadcast.js +0 -118
  113. package/dist/lib/broadcast.js.map +0 -1
  114. package/dist/lib/channel-state.d.ts +0 -32
  115. package/dist/lib/channel-state.d.ts.map +0 -1
  116. package/dist/lib/channel-state.js +0 -146
  117. package/dist/lib/channel-state.js.map +0 -1
  118. package/dist/lib/cli-auth.d.ts +0 -40
  119. package/dist/lib/cli-auth.d.ts.map +0 -1
  120. package/dist/lib/cli-auth.js +0 -144
  121. package/dist/lib/cli-auth.js.map +0 -1
  122. package/dist/lib/data-assembly.d.ts +0 -136
  123. package/dist/lib/data-assembly.d.ts.map +0 -1
  124. package/dist/lib/data-assembly.js +0 -550
  125. package/dist/lib/data-assembly.js.map +0 -1
  126. package/dist/lib/server-state.d.ts +0 -115
  127. package/dist/lib/server-state.d.ts.map +0 -1
  128. package/dist/lib/server-state.js +0 -138
  129. package/dist/lib/server-state.js.map +0 -1
  130. package/dist/lib/websocket-runtime.d.ts +0 -17
  131. package/dist/lib/websocket-runtime.d.ts.map +0 -1
  132. package/dist/lib/websocket-runtime.js +0 -76
  133. package/dist/lib/websocket-runtime.js.map +0 -1
  134. package/dist/routes/auth.d.ts +0 -45
  135. package/dist/routes/auth.d.ts.map +0 -1
  136. package/dist/routes/auth.js +0 -261
  137. package/dist/routes/auth.js.map +0 -1
  138. package/dist/routes/channels-integrated.d.ts +0 -84
  139. package/dist/routes/channels-integrated.d.ts.map +0 -1
  140. package/dist/routes/channels-integrated.js +0 -644
  141. package/dist/routes/channels-integrated.js.map +0 -1
  142. package/dist/routes/decisions.d.ts +0 -31
  143. package/dist/routes/decisions.d.ts.map +0 -1
  144. package/dist/routes/decisions.js +0 -109
  145. package/dist/routes/decisions.js.map +0 -1
  146. package/dist/routes/fleet.d.ts +0 -24
  147. package/dist/routes/fleet.d.ts.map +0 -1
  148. package/dist/routes/fleet.js +0 -131
  149. package/dist/routes/fleet.js.map +0 -1
  150. package/dist/routes/history.d.ts +0 -13
  151. package/dist/routes/history.d.ts.map +0 -1
  152. package/dist/routes/history.js +0 -205
  153. package/dist/routes/history.js.map +0 -1
  154. package/dist/routes/messaging.d.ts +0 -34
  155. package/dist/routes/messaging.d.ts.map +0 -1
  156. package/dist/routes/messaging.js +0 -306
  157. package/dist/routes/messaging.js.map +0 -1
  158. package/dist/routes/settings.d.ts +0 -6
  159. package/dist/routes/settings.d.ts.map +0 -1
  160. package/dist/routes/settings.js +0 -119
  161. package/dist/routes/settings.js.map +0 -1
  162. package/dist/routes/spawn.d.ts +0 -75
  163. package/dist/routes/spawn.d.ts.map +0 -1
  164. package/dist/routes/spawn.js +0 -521
  165. package/dist/routes/spawn.js.map +0 -1
  166. package/dist/routes/system.d.ts +0 -21
  167. package/dist/routes/system.d.ts.map +0 -1
  168. package/dist/routes/system.js +0 -186
  169. package/dist/routes/system.js.map +0 -1
  170. package/dist/routes/tasks.d.ts +0 -27
  171. package/dist/routes/tasks.d.ts.map +0 -1
  172. package/dist/routes/tasks.js +0 -103
  173. package/dist/routes/tasks.js.map +0 -1
  174. package/dist/routes/ui.d.ts +0 -6
  175. package/dist/routes/ui.d.ts.map +0 -1
  176. package/dist/routes/ui.js +0 -114
  177. package/dist/routes/ui.js.map +0 -1
  178. package/dist/server.d.ts +0 -4
  179. package/dist/server.d.ts.map +0 -1
  180. package/dist/server.js +0 -481
  181. package/dist/server.js.map +0 -1
  182. package/dist/services/broker-spawn-reader.d.ts +0 -40
  183. package/dist/services/broker-spawn-reader.d.ts.map +0 -1
  184. package/dist/services/broker-spawn-reader.js +0 -155
  185. package/dist/services/broker-spawn-reader.js.map +0 -1
  186. package/dist/services/user-bridge.d.ts +0 -155
  187. package/dist/services/user-bridge.d.ts.map +0 -1
  188. package/dist/services/user-bridge.js +0 -385
  189. package/dist/services/user-bridge.js.map +0 -1
  190. package/dist/websocket/bridge.d.ts +0 -12
  191. package/dist/websocket/bridge.d.ts.map +0 -1
  192. package/dist/websocket/bridge.js +0 -33
  193. package/dist/websocket/bridge.js.map +0 -1
  194. package/dist/websocket/main.d.ts +0 -15
  195. package/dist/websocket/main.d.ts.map +0 -1
  196. package/dist/websocket/main.js +0 -84
  197. package/dist/websocket/main.js.map +0 -1
  198. package/dist/websocket/presence.d.ts +0 -74
  199. package/dist/websocket/presence.d.ts.map +0 -1
  200. package/dist/websocket/presence.js +0 -330
  201. package/dist/websocket/presence.js.map +0 -1
  202. package/out/_next/static/chunks/270-8c0b8109123a0c5f.js +0 -73
  203. package/out/_next/static/chunks/5518-6d77237eefc8d5ae.js +0 -1
  204. /package/out/_next/static/{5cqIVzlh9DbJT28EbNrcC → wgSCX8AQnjVl_Rnx1gUp5}/_buildManifest.js +0 -0
  205. /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":"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"}
@@ -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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"}