@agent-relay/dashboard-server 2.0.93 → 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/routes/models.d.ts.map +1 -1
- package/dist/routes/models.js +39 -3
- package/dist/routes/models.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-3b96a248632a79c0.js +0 -1
- /package/out/_next/static/{9CykW6n4dJn75_XoFVN_X → wgSCX8AQnjVl_Rnx1gUp5}/_buildManifest.js +0 -0
- /package/out/_next/static/{9CykW6n4dJn75_XoFVN_X → wgSCX8AQnjVl_Rnx1gUp5}/_ssgManifest.js +0 -0
package/dist/server.js
DELETED
|
@@ -1,481 +0,0 @@
|
|
|
1
|
-
import express from 'express';
|
|
2
|
-
import { WebSocketServer } from 'ws';
|
|
3
|
-
import http from 'http';
|
|
4
|
-
import path from 'path';
|
|
5
|
-
import fs from 'fs';
|
|
6
|
-
import { createStorageAdapter } from '@agent-relay/storage/adapter';
|
|
7
|
-
import { UserBridge } from './services/user-bridge.js';
|
|
8
|
-
import { detectWorkspacePath } from '@agent-relay/config';
|
|
9
|
-
import { BrokerSpawnReader } from './services/broker-spawn-reader.js';
|
|
10
|
-
import { startCLIAuth, getAuthSession, cancelAuthSession, submitAuthCode, completeAuthSession, getSupportedProviders, } from './lib/cli-auth.js';
|
|
11
|
-
import { createServerState } from './lib/server-state.js';
|
|
12
|
-
import { createBroadcasters } from './lib/broadcast.js';
|
|
13
|
-
import { createDataAssembly } from './lib/data-assembly.js';
|
|
14
|
-
import { createChannelPersistence } from './lib/channel-state.js';
|
|
15
|
-
import { setupWebSocketRuntime } from './lib/websocket-runtime.js';
|
|
16
|
-
import { initializeAttachmentStorage } from './lib/attachment-storage.js';
|
|
17
|
-
import { setupMainWebSocket } from './websocket/main.js';
|
|
18
|
-
import { setupBridgeWebSocket } from './websocket/bridge.js';
|
|
19
|
-
import { setupLogsWebSocket } from './websocket/logs.js';
|
|
20
|
-
import { setupPresenceWebSocket } from './websocket/presence.js';
|
|
21
|
-
import { registerMessagingRoutes } from './routes/messaging.js';
|
|
22
|
-
import { registerHistoryRoutes } from './routes/history.js';
|
|
23
|
-
import { registerAuthRoutes } from './routes/auth.js';
|
|
24
|
-
import { registerSettingsRoutes } from './routes/settings.js';
|
|
25
|
-
import { registerDecisionsRoutes } from './routes/decisions.js';
|
|
26
|
-
import { registerTasksRoutes } from './routes/tasks.js';
|
|
27
|
-
import { registerFleetRoutes } from './routes/fleet.js';
|
|
28
|
-
import { registerSpawnRoutes } from './routes/spawn.js';
|
|
29
|
-
import { registerMetricsRoutes } from './routes/metrics.js';
|
|
30
|
-
import { registerChannelsIntegratedRoutes } from './routes/channels-integrated.js';
|
|
31
|
-
import { registerSystemRoutes } from './routes/system.js';
|
|
32
|
-
import { registerUiRoutes } from './routes/ui.js';
|
|
33
|
-
import { registerModelsRoutes } from './routes/models.js';
|
|
34
|
-
import { getBindHost, isAgentOnline as checkAgentOnline, isRecipientOnline as checkRecipientOnline, getTeamMembers as resolveTeamMembers, isValidUsername, isValidAvatarUrl, } from './lib/utils.js';
|
|
35
|
-
export async function startDashboard(portOrOptions, dataDirArg, teamDirArg, dbPathArg) {
|
|
36
|
-
// Handle overloaded signatures
|
|
37
|
-
const options = typeof portOrOptions === 'number'
|
|
38
|
-
? { port: portOrOptions, dataDir: dataDirArg, teamDir: teamDirArg, dbPath: dbPathArg }
|
|
39
|
-
: portOrOptions;
|
|
40
|
-
const { port, dataDir, teamDir, dbPath, enableSpawner, projectRoot, tmuxSession, onMarkSpawning, onClearSpawning, verbose } = options;
|
|
41
|
-
let { relayAdapter } = options;
|
|
42
|
-
// Auto-create a RelayAdapter when projectRoot is available and no adapter is passed.
|
|
43
|
-
// This makes the dashboard self-contained — `relay-dashboard-server --integrated --project-root .`
|
|
44
|
-
// works without the CLI.
|
|
45
|
-
if (!relayAdapter && enableSpawner && projectRoot) {
|
|
46
|
-
try {
|
|
47
|
-
const brokerSdk = await import('@agent-relay/sdk');
|
|
48
|
-
relayAdapter = new brokerSdk.RelayAdapter({
|
|
49
|
-
cwd: projectRoot,
|
|
50
|
-
clientName: 'dashboard',
|
|
51
|
-
});
|
|
52
|
-
console.log('[dashboard] Auto-created RelayAdapter for broker mode');
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
// Ignore import failures here and throw a clear error below.
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
if (!relayAdapter) {
|
|
59
|
-
throw new Error('[dashboard] RelayAdapter is required (legacy daemon relay-client mode has been removed)');
|
|
60
|
-
}
|
|
61
|
-
// Debug logging helper - only logs when verbose is true or VERBOSE env var is set
|
|
62
|
-
const isVerbose = verbose || process.env.VERBOSE === 'true';
|
|
63
|
-
const debug = (message) => {
|
|
64
|
-
if (isVerbose) {
|
|
65
|
-
console.log(message);
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
console.log('[dashboard] Starting dashboard...');
|
|
69
|
-
const disableStorage = process.env.RELAY_DISABLE_STORAGE === 'true';
|
|
70
|
-
// Use createStorageAdapter to match daemon's storage type (JSONL by default)
|
|
71
|
-
// This ensures dashboard reads from the same storage as daemon writes to
|
|
72
|
-
// Enable watchForChanges so JSONL adapter auto-reloads when daemon writes new messages
|
|
73
|
-
const storagePath = dbPath ?? path.join(dataDir, 'messages.sqlite');
|
|
74
|
-
const storage = disableStorage
|
|
75
|
-
? undefined
|
|
76
|
-
: await createStorageAdapter(storagePath, { watchForChanges: true });
|
|
77
|
-
const defaultWorkspaceId = process.env.RELAY_WORKSPACE_ID ?? process.env.AGENT_RELAY_WORKSPACE_ID;
|
|
78
|
-
const { loadChannelRecords, loadPersistedChannelsForUser, persistChannelMembershipEvent, } = createChannelPersistence({
|
|
79
|
-
storage,
|
|
80
|
-
defaultWorkspaceId,
|
|
81
|
-
});
|
|
82
|
-
// Initialize spawner if enabled
|
|
83
|
-
// When projectRoot is explicitly provided (e.g., via --project-root), use it directly.
|
|
84
|
-
// Only use detectWorkspacePath for cloud workspace auto-detection when no explicit root is given.
|
|
85
|
-
// This fixes #380: detectWorkspacePath could re-resolve projectRoot incorrectly when
|
|
86
|
-
// tool directories like ~/.nvm contain package.json markers.
|
|
87
|
-
const workspacePath = projectRoot || detectWorkspacePath(dataDir);
|
|
88
|
-
console.log(`[dashboard] Workspace path: ${workspacePath}`);
|
|
89
|
-
// SpawnReader is now always broker-backed.
|
|
90
|
-
const brokerSpawnReader = new BrokerSpawnReader(relayAdapter);
|
|
91
|
-
await relayAdapter.start();
|
|
92
|
-
await brokerSpawnReader.initialize();
|
|
93
|
-
const spawnReader = brokerSpawnReader;
|
|
94
|
-
console.log('[dashboard] Using broker adapter for spawn operations');
|
|
95
|
-
process.on('uncaughtException', (err) => {
|
|
96
|
-
console.error('Uncaught Exception:', err);
|
|
97
|
-
});
|
|
98
|
-
process.on('unhandledRejection', (reason, promise) => {
|
|
99
|
-
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
|
|
100
|
-
});
|
|
101
|
-
const app = express();
|
|
102
|
-
const server = http.createServer(app);
|
|
103
|
-
// Use noServer mode to manually route upgrade requests
|
|
104
|
-
// This prevents the bug where multiple WebSocketServers attached to the same
|
|
105
|
-
// HTTP server cause conflicts - each one's upgrade handler fires and the ones
|
|
106
|
-
// that don't match the path call abortHandshake(400), writing raw HTTP to the socket
|
|
107
|
-
const wss = new WebSocketServer({
|
|
108
|
-
noServer: true,
|
|
109
|
-
perMessageDeflate: false,
|
|
110
|
-
skipUTF8Validation: true,
|
|
111
|
-
maxPayload: 100 * 1024 * 1024 // 100MB
|
|
112
|
-
});
|
|
113
|
-
const wssBridge = new WebSocketServer({
|
|
114
|
-
noServer: true,
|
|
115
|
-
perMessageDeflate: false,
|
|
116
|
-
skipUTF8Validation: true,
|
|
117
|
-
maxPayload: 100 * 1024 * 1024
|
|
118
|
-
});
|
|
119
|
-
const wssLogs = new WebSocketServer({
|
|
120
|
-
noServer: true,
|
|
121
|
-
perMessageDeflate: false,
|
|
122
|
-
skipUTF8Validation: true,
|
|
123
|
-
maxPayload: 100 * 1024 * 1024
|
|
124
|
-
});
|
|
125
|
-
const wssPresence = new WebSocketServer({
|
|
126
|
-
noServer: true,
|
|
127
|
-
perMessageDeflate: false,
|
|
128
|
-
skipUTF8Validation: true,
|
|
129
|
-
maxPayload: 1024 * 1024 // 1MB - presence messages are small
|
|
130
|
-
});
|
|
131
|
-
const state = createServerState({
|
|
132
|
-
dataDir,
|
|
133
|
-
teamDir,
|
|
134
|
-
projectRoot,
|
|
135
|
-
verbose: isVerbose,
|
|
136
|
-
defaultWorkspaceId,
|
|
137
|
-
storage,
|
|
138
|
-
relayAdapter,
|
|
139
|
-
spawnReader,
|
|
140
|
-
wss,
|
|
141
|
-
wssBridge,
|
|
142
|
-
wssLogs,
|
|
143
|
-
wssPresence,
|
|
144
|
-
});
|
|
145
|
-
const logSubscriptions = state.logSubscriptions;
|
|
146
|
-
const fileWatchers = state.fileWatchers;
|
|
147
|
-
const fileLastSize = state.fileLastSize;
|
|
148
|
-
const mainMessageBuffer = state.mainMessageBuffer;
|
|
149
|
-
const agentLogBuffers = state.agentLogBuffers;
|
|
150
|
-
const getAgentLogBuffer = state.getAgentLogBuffer;
|
|
151
|
-
const mainClientAlive = state.mainClientAlive;
|
|
152
|
-
const bridgeClientAlive = state.bridgeClientAlive;
|
|
153
|
-
const onlineUsers = state.onlineUsers;
|
|
154
|
-
const agentCwdMap = state.agentCwdMap;
|
|
155
|
-
const resolveWorkspaceId = state.resolveWorkspaceId;
|
|
156
|
-
setupWebSocketRuntime({
|
|
157
|
-
server,
|
|
158
|
-
wss,
|
|
159
|
-
wssBridge,
|
|
160
|
-
wssLogs,
|
|
161
|
-
wssPresence,
|
|
162
|
-
mainClientAlive,
|
|
163
|
-
bridgeClientAlive,
|
|
164
|
-
debug,
|
|
165
|
-
});
|
|
166
|
-
if (storage) {
|
|
167
|
-
await storage.init();
|
|
168
|
-
}
|
|
169
|
-
// Request logger for debugging
|
|
170
|
-
app.use((req, res, next) => {
|
|
171
|
-
if (req.path.startsWith('/api/channels')) {
|
|
172
|
-
console.log(`[dashboard] ${req.method} ${req.path} - incoming request`);
|
|
173
|
-
}
|
|
174
|
-
next();
|
|
175
|
-
});
|
|
176
|
-
// Increase JSON body limit for base64 image uploads (10MB)
|
|
177
|
-
app.use(express.json({ limit: '10mb' }));
|
|
178
|
-
const { attachmentsDir, uploadsDir, stopEviction } = initializeAttachmentStorage(dataDir);
|
|
179
|
-
process.on('beforeExit', stopEviction);
|
|
180
|
-
// Serve uploaded files statically
|
|
181
|
-
app.use('/uploads', express.static(uploadsDir));
|
|
182
|
-
// Serve attachments from ~/.relay/attachments
|
|
183
|
-
app.use('/attachments', express.static(attachmentsDir));
|
|
184
|
-
// In-memory attachment registry (for current session)
|
|
185
|
-
// Attachments are also stored on disk, so this is just for quick lookups
|
|
186
|
-
const attachmentRegistry = state.attachmentRegistry;
|
|
187
|
-
registerUiRoutes(app);
|
|
188
|
-
// Relay clients for sending messages from dashboard are broker-backed shims.
|
|
189
|
-
// Forward declaration - initialized after helper factories.
|
|
190
|
-
let userBridge;
|
|
191
|
-
const getRelayClient = async (senderName = 'Dashboard', _entityType) => {
|
|
192
|
-
return state.getBrokerClientShim(senderName);
|
|
193
|
-
};
|
|
194
|
-
userBridge = new UserBridge({
|
|
195
|
-
createRelayClient: async (options) => {
|
|
196
|
-
return getRelayClient(options.agentName, options.entityType);
|
|
197
|
-
},
|
|
198
|
-
loadPersistedChannels: (username) => loadPersistedChannelsForUser(username, defaultWorkspaceId),
|
|
199
|
-
lookupUserInfo: (username) => {
|
|
200
|
-
const presence = onlineUsers.get(username);
|
|
201
|
-
if (presence) {
|
|
202
|
-
return { avatarUrl: presence.info.avatarUrl };
|
|
203
|
-
}
|
|
204
|
-
return undefined;
|
|
205
|
-
},
|
|
206
|
-
});
|
|
207
|
-
const isAgentOnline = (agentName) => checkAgentOnline(teamDir, agentName);
|
|
208
|
-
const isRecipientOnline = (name) => checkRecipientOnline(teamDir, name, onlineUsers, userBridge);
|
|
209
|
-
const getTeamMembers = (teamName) => resolveTeamMembers(teamName, projectRoot, dataDir, teamDir, spawnReader);
|
|
210
|
-
const { getAllData, getBridgeData, isInternalAgent, remapAgentName, buildThreadSummaryMap, formatDuration, } = createDataAssembly({
|
|
211
|
-
dataDir,
|
|
212
|
-
teamDir,
|
|
213
|
-
projectRoot,
|
|
214
|
-
defaultWorkspaceId,
|
|
215
|
-
storage,
|
|
216
|
-
spawnReader,
|
|
217
|
-
onlineUsers,
|
|
218
|
-
agentCwdMap,
|
|
219
|
-
debug,
|
|
220
|
-
});
|
|
221
|
-
registerHistoryRoutes(app, {
|
|
222
|
-
storage,
|
|
223
|
-
formatDuration,
|
|
224
|
-
isInternalAgent,
|
|
225
|
-
remapAgentName,
|
|
226
|
-
});
|
|
227
|
-
// Track clients that are still initializing (haven't received first data yet)
|
|
228
|
-
// This prevents race conditions where broadcastData sends before initial data is sent
|
|
229
|
-
const initializingClients = state.initializingClients;
|
|
230
|
-
const { broadcastData, broadcastBridgeData, broadcastPresence, broadcastLogOutput } = createBroadcasters(state, { getAllData, getBridgeData, debug });
|
|
231
|
-
registerMessagingRoutes(app, {
|
|
232
|
-
getTeamMembers,
|
|
233
|
-
isAgentOnline,
|
|
234
|
-
isRecipientOnline,
|
|
235
|
-
getRelayClient,
|
|
236
|
-
attachmentRegistry,
|
|
237
|
-
attachmentsDir,
|
|
238
|
-
broadcastData,
|
|
239
|
-
storage,
|
|
240
|
-
remapAgentName,
|
|
241
|
-
});
|
|
242
|
-
// Expose broadcastLogOutput for PTY wrappers to call.
|
|
243
|
-
global.__broadcastLogOutput = broadcastLogOutput;
|
|
244
|
-
// Handle new WebSocket connections - send initial data immediately.
|
|
245
|
-
setupMainWebSocket({
|
|
246
|
-
wss,
|
|
247
|
-
mainClientAlive,
|
|
248
|
-
mainMessageBuffer,
|
|
249
|
-
initializingClients,
|
|
250
|
-
getAllData,
|
|
251
|
-
debug,
|
|
252
|
-
});
|
|
253
|
-
// Handle bridge WebSocket connections.
|
|
254
|
-
setupBridgeWebSocket({
|
|
255
|
-
wssBridge,
|
|
256
|
-
bridgeClientAlive,
|
|
257
|
-
getBridgeData,
|
|
258
|
-
debug,
|
|
259
|
-
});
|
|
260
|
-
setupLogsWebSocket({
|
|
261
|
-
wssLogs,
|
|
262
|
-
teamDir,
|
|
263
|
-
debug,
|
|
264
|
-
logSubscriptions,
|
|
265
|
-
fileWatchers,
|
|
266
|
-
fileLastSize,
|
|
267
|
-
agentLogBuffers,
|
|
268
|
-
getAgentLogBuffer,
|
|
269
|
-
spawnReader,
|
|
270
|
-
});
|
|
271
|
-
// ===== Presence WebSocket Handler =====
|
|
272
|
-
const { broadcastChannelMessage, broadcastDirectMessage } = setupPresenceWebSocket({
|
|
273
|
-
wss,
|
|
274
|
-
wssPresence,
|
|
275
|
-
mainMessageBuffer,
|
|
276
|
-
onlineUsers,
|
|
277
|
-
presenceHealth: state.presenceHealth,
|
|
278
|
-
broadcastPresence,
|
|
279
|
-
isValidUsername,
|
|
280
|
-
isValidAvatarUrl,
|
|
281
|
-
getUserBridge: () => userBridge,
|
|
282
|
-
debug,
|
|
283
|
-
});
|
|
284
|
-
relayAdapter.onEvent((event) => {
|
|
285
|
-
if (event.kind === 'relay_inbound') {
|
|
286
|
-
const senderPresence = onlineUsers.get(event.from);
|
|
287
|
-
const fromAvatarUrl = senderPresence?.info.avatarUrl;
|
|
288
|
-
const fromEntityType = senderPresence ? 'user' : 'agent';
|
|
289
|
-
const timestamp = new Date().toISOString();
|
|
290
|
-
// Route to channel or direct message based on target.
|
|
291
|
-
if (event.target.startsWith('#')) {
|
|
292
|
-
broadcastChannelMessage({
|
|
293
|
-
type: 'channel_message',
|
|
294
|
-
targetUser: event.target,
|
|
295
|
-
channel: event.target,
|
|
296
|
-
from: event.from,
|
|
297
|
-
fromAvatarUrl,
|
|
298
|
-
fromEntityType,
|
|
299
|
-
body: event.body,
|
|
300
|
-
thread: event.thread_id,
|
|
301
|
-
timestamp,
|
|
302
|
-
});
|
|
303
|
-
}
|
|
304
|
-
else {
|
|
305
|
-
broadcastDirectMessage({
|
|
306
|
-
type: 'direct_message',
|
|
307
|
-
targetUser: event.target,
|
|
308
|
-
from: event.from,
|
|
309
|
-
fromAvatarUrl,
|
|
310
|
-
fromEntityType,
|
|
311
|
-
body: event.body,
|
|
312
|
-
id: event.event_id,
|
|
313
|
-
messageId: event.event_id,
|
|
314
|
-
timestamp,
|
|
315
|
-
});
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
});
|
|
319
|
-
console.log('[dashboard] Broker event subscription active for message forwarding');
|
|
320
|
-
registerChannelsIntegratedRoutes(app, {
|
|
321
|
-
storage,
|
|
322
|
-
teamDir,
|
|
323
|
-
attachmentRegistry,
|
|
324
|
-
onlineUsers,
|
|
325
|
-
userBridge,
|
|
326
|
-
spawnReader,
|
|
327
|
-
resolveWorkspaceId,
|
|
328
|
-
loadChannelRecords,
|
|
329
|
-
persistChannelMembershipEvent,
|
|
330
|
-
getRelayClient,
|
|
331
|
-
buildThreadSummaryMap,
|
|
332
|
-
isInternalAgent,
|
|
333
|
-
getAllData,
|
|
334
|
-
});
|
|
335
|
-
registerAuthRoutes(app, {
|
|
336
|
-
startCLIAuth,
|
|
337
|
-
getAuthSession,
|
|
338
|
-
cancelAuthSession,
|
|
339
|
-
submitAuthCode,
|
|
340
|
-
completeAuthSession,
|
|
341
|
-
getSupportedProviders,
|
|
342
|
-
});
|
|
343
|
-
registerMetricsRoutes(app, {
|
|
344
|
-
teamDir,
|
|
345
|
-
spawnReader,
|
|
346
|
-
resolveWorkspaceId,
|
|
347
|
-
});
|
|
348
|
-
registerSystemRoutes(app, {
|
|
349
|
-
dataDir,
|
|
350
|
-
teamDir,
|
|
351
|
-
projectRoot,
|
|
352
|
-
resolveWorkspaceId,
|
|
353
|
-
getRelayClient,
|
|
354
|
-
});
|
|
355
|
-
registerSpawnRoutes(app, {
|
|
356
|
-
dataDir,
|
|
357
|
-
projectRoot,
|
|
358
|
-
relayAdapter,
|
|
359
|
-
spawnReader,
|
|
360
|
-
agentCwdMap,
|
|
361
|
-
isAgentOnline,
|
|
362
|
-
resolveWorkspaceId,
|
|
363
|
-
broadcastData,
|
|
364
|
-
broadcastPresence,
|
|
365
|
-
});
|
|
366
|
-
registerSettingsRoutes(app);
|
|
367
|
-
registerModelsRoutes(app);
|
|
368
|
-
const decisions = state.decisions;
|
|
369
|
-
registerDecisionsRoutes(app, {
|
|
370
|
-
decisions,
|
|
371
|
-
getRelayClient,
|
|
372
|
-
broadcastData,
|
|
373
|
-
});
|
|
374
|
-
const tasks = state.tasks;
|
|
375
|
-
registerTasksRoutes(app, {
|
|
376
|
-
tasks,
|
|
377
|
-
getRelayClient,
|
|
378
|
-
broadcastData,
|
|
379
|
-
});
|
|
380
|
-
registerFleetRoutes(app, {
|
|
381
|
-
dataDir,
|
|
382
|
-
spawnReader,
|
|
383
|
-
wss,
|
|
384
|
-
decisions,
|
|
385
|
-
tasks,
|
|
386
|
-
});
|
|
387
|
-
// Watch for changes - poll as a safety net for DB-backed storage mode.
|
|
388
|
-
// Real-time updates are already handled by explicit broadcastData() calls
|
|
389
|
-
// at every data mutation point (message send, spawn, release, cwd update, etc.).
|
|
390
|
-
// This interval only catches external/indirect changes (presence, DB edits).
|
|
391
|
-
if (storage) {
|
|
392
|
-
setInterval(() => {
|
|
393
|
-
broadcastData().catch((err) => console.error('Broadcast failed', err));
|
|
394
|
-
broadcastBridgeData().catch((err) => console.error('Bridge broadcast failed', err));
|
|
395
|
-
}, 5000);
|
|
396
|
-
}
|
|
397
|
-
else {
|
|
398
|
-
let fsWait = null;
|
|
399
|
-
let bridgeFsWait = null;
|
|
400
|
-
try {
|
|
401
|
-
if (fs.existsSync(dataDir)) {
|
|
402
|
-
console.log(`Watching ${dataDir} for changes...`);
|
|
403
|
-
fs.watch(dataDir, { recursive: true }, (eventType, filename) => {
|
|
404
|
-
if (filename && (filename.endsWith('inbox.md') || filename.endsWith('team.json') || filename.endsWith('agents.json') || filename.endsWith('processing-state.json'))) {
|
|
405
|
-
// Debounce
|
|
406
|
-
if (fsWait)
|
|
407
|
-
return;
|
|
408
|
-
fsWait = setTimeout(() => {
|
|
409
|
-
fsWait = null;
|
|
410
|
-
broadcastData().catch((err) => {
|
|
411
|
-
console.error('Broadcast failed', err);
|
|
412
|
-
});
|
|
413
|
-
}, 100);
|
|
414
|
-
}
|
|
415
|
-
// Watch for bridge state changes
|
|
416
|
-
if (filename && filename.endsWith('bridge-state.json')) {
|
|
417
|
-
if (bridgeFsWait)
|
|
418
|
-
return;
|
|
419
|
-
bridgeFsWait = setTimeout(() => {
|
|
420
|
-
bridgeFsWait = null;
|
|
421
|
-
broadcastBridgeData().catch((err) => {
|
|
422
|
-
console.error('Bridge broadcast failed', err);
|
|
423
|
-
});
|
|
424
|
-
}, 100);
|
|
425
|
-
}
|
|
426
|
-
});
|
|
427
|
-
}
|
|
428
|
-
else {
|
|
429
|
-
console.warn(`Data directory ${dataDir} does not exist yet.`);
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
catch (e) {
|
|
433
|
-
console.error('Watch failed:', e);
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
// Try to find an available port, starting from the requested port
|
|
437
|
-
const findAvailablePort = async (startPort, maxAttempts = 10) => {
|
|
438
|
-
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
439
|
-
const portToTry = startPort + attempt;
|
|
440
|
-
const isAvailable = await new Promise((resolve) => {
|
|
441
|
-
const testServer = http.createServer();
|
|
442
|
-
testServer.once('error', () => resolve(false));
|
|
443
|
-
testServer.once('listening', () => {
|
|
444
|
-
testServer.close();
|
|
445
|
-
resolve(true);
|
|
446
|
-
});
|
|
447
|
-
testServer.listen(portToTry);
|
|
448
|
-
});
|
|
449
|
-
if (isAvailable) {
|
|
450
|
-
return portToTry;
|
|
451
|
-
}
|
|
452
|
-
console.log(`Port ${portToTry} in use, trying ${portToTry + 1}...`);
|
|
453
|
-
}
|
|
454
|
-
throw new Error(`Could not find available port after trying ${startPort}-${startPort + maxAttempts - 1}`);
|
|
455
|
-
};
|
|
456
|
-
const availablePort = await findAvailablePort(port);
|
|
457
|
-
if (availablePort !== port) {
|
|
458
|
-
console.log(`Requested dashboard port ${port} is busy; switching to ${availablePort}.`);
|
|
459
|
-
}
|
|
460
|
-
return new Promise((resolve, reject) => {
|
|
461
|
-
const host = getBindHost();
|
|
462
|
-
const listenCallback = async () => {
|
|
463
|
-
console.log(`Dashboard running at http://${host || 'localhost'}:${availablePort} (build: cloud-channels-v2)`);
|
|
464
|
-
console.log(`Monitoring: ${dataDir}`);
|
|
465
|
-
// Health and spawned status are now pass-through broker/cloud proxies.
|
|
466
|
-
resolve(availablePort);
|
|
467
|
-
};
|
|
468
|
-
// Bind to specified host in cloud environments, or let Node.js default for local
|
|
469
|
-
if (host) {
|
|
470
|
-
server.listen(availablePort, host, listenCallback);
|
|
471
|
-
}
|
|
472
|
-
else {
|
|
473
|
-
server.listen(availablePort, listenCallback);
|
|
474
|
-
}
|
|
475
|
-
server.on('error', (err) => {
|
|
476
|
-
console.error('Server error:', err);
|
|
477
|
-
reject(err);
|
|
478
|
-
});
|
|
479
|
-
});
|
|
480
|
-
}
|
|
481
|
-
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,40 +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
|
-
import type { RelayAdapter } from '@agent-relay/sdk';
|
|
9
|
-
import type { SpawnManagerLike } from '../types/index.js';
|
|
10
|
-
export declare class BrokerSpawnReader implements SpawnManagerLike {
|
|
11
|
-
private adapter;
|
|
12
|
-
private agentCache;
|
|
13
|
-
private outputBuffers;
|
|
14
|
-
private rawOutputBuffers;
|
|
15
|
-
private unsubscribe?;
|
|
16
|
-
constructor(adapter: RelayAdapter);
|
|
17
|
-
/**
|
|
18
|
-
* Start listening to broker events.
|
|
19
|
-
* Must be called once after adapter.start() to seed state and begin tracking.
|
|
20
|
-
*/
|
|
21
|
-
initialize(): Promise<void>;
|
|
22
|
-
hasWorker(name: string): boolean;
|
|
23
|
-
getActiveWorkers(): Array<{
|
|
24
|
-
name: string;
|
|
25
|
-
cli: string;
|
|
26
|
-
task: string;
|
|
27
|
-
team?: string;
|
|
28
|
-
spawnerName?: string;
|
|
29
|
-
spawnedAt: number;
|
|
30
|
-
pid?: number;
|
|
31
|
-
}>;
|
|
32
|
-
getWorkerOutput(name: string, limit?: number): string[] | undefined;
|
|
33
|
-
getWorkerRawOutput(name: string): string | undefined;
|
|
34
|
-
sendWorkerInput(name: string, data: string): Promise<boolean>;
|
|
35
|
-
/** Refresh the agent cache from the broker. */
|
|
36
|
-
refresh(): Promise<void>;
|
|
37
|
-
/** Clean up event subscriptions. */
|
|
38
|
-
destroy(): void;
|
|
39
|
-
}
|
|
40
|
-
//# sourceMappingURL=broker-spawn-reader.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"broker-spawn-reader.d.ts","sourceRoot":"","sources":["../../src/services/broker-spawn-reader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,kBAAkB,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAkB1D,qBAAa,iBAAkB,YAAW,gBAAgB;IAM5C,OAAO,CAAC,OAAO;IAL3B,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,WAAW,CAAC,CAAa;gBAEb,OAAO,EAAE,YAAY;IAEzC;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoEjC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhC,gBAAgB,IAAI,KAAK,CAAC;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IAIF,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IAMhE,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI9C,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUnE,+CAA+C;IACzC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC9B,oCAAoC;IACpC,OAAO,IAAI,IAAI;CAMhB"}
|