@chrysb/alphaclaw 0.7.0 → 0.7.1

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 (31) hide show
  1. package/lib/public/css/cron.css +26 -17
  2. package/lib/public/css/theme.css +14 -0
  3. package/lib/public/js/components/cron-tab/cron-calendar.js +17 -12
  4. package/lib/public/js/components/cron-tab/cron-job-list.js +11 -1
  5. package/lib/public/js/components/cron-tab/index.js +16 -2
  6. package/lib/public/js/components/icons.js +11 -0
  7. package/lib/public/js/components/routes/watchdog-route.js +1 -1
  8. package/lib/public/js/components/watchdog-tab/console/index.js +115 -0
  9. package/lib/public/js/components/watchdog-tab/console/use-console.js +137 -0
  10. package/lib/public/js/components/watchdog-tab/helpers.js +106 -0
  11. package/lib/public/js/components/watchdog-tab/incidents/index.js +56 -0
  12. package/lib/public/js/components/watchdog-tab/incidents/use-incidents.js +33 -0
  13. package/lib/public/js/components/watchdog-tab/index.js +84 -0
  14. package/lib/public/js/components/watchdog-tab/resource-bar.js +76 -0
  15. package/lib/public/js/components/watchdog-tab/resources/index.js +85 -0
  16. package/lib/public/js/components/watchdog-tab/resources/use-resources.js +13 -0
  17. package/lib/public/js/components/watchdog-tab/settings/index.js +44 -0
  18. package/lib/public/js/components/watchdog-tab/settings/use-settings.js +117 -0
  19. package/lib/public/js/components/watchdog-tab/terminal/index.js +20 -0
  20. package/lib/public/js/components/watchdog-tab/terminal/use-terminal.js +263 -0
  21. package/lib/public/js/components/watchdog-tab/use-watchdog-tab.js +55 -0
  22. package/lib/public/js/lib/api.js +39 -0
  23. package/lib/server/init/register-server-routes.js +239 -0
  24. package/lib/server/init/runtime-init.js +44 -0
  25. package/lib/server/init/server-lifecycle.js +55 -0
  26. package/lib/server/routes/watchdog.js +62 -0
  27. package/lib/server/watchdog-terminal-ws.js +114 -0
  28. package/lib/server/watchdog-terminal.js +262 -0
  29. package/lib/server.js +89 -215
  30. package/package.json +3 -2
  31. package/lib/public/js/components/watchdog-tab.js +0 -535
package/lib/server.js CHANGED
@@ -107,39 +107,36 @@ const { createDiscordApi } = require("./server/discord-api");
107
107
  const { createSlackApi } = require("./server/slack-api");
108
108
  const { createWatchdogNotifier } = require("./server/watchdog-notify");
109
109
  const { createWatchdog } = require("./server/watchdog");
110
+ const { createWatchdogTerminalService } = require("./server/watchdog-terminal");
111
+ const {
112
+ createWatchdogTerminalWsBridge,
113
+ } = require("./server/watchdog-terminal-ws");
110
114
  const { createDoctorService } = require("./server/doctor/service");
111
115
  const { createAgentsService } = require("./server/agents/service");
112
116
  const { createOperationEventsService } = require("./server/operation-events");
113
117
  const { runOnboardedBootSequence } = require("./server/startup");
114
118
  const { createCronService } = require("./server/cron-service");
115
-
116
- const { registerAuthRoutes } = require("./server/routes/auth");
117
- const { registerPageRoutes } = require("./server/routes/pages");
118
- const { registerModelRoutes } = require("./server/routes/models");
119
- const { registerOnboardingRoutes } = require("./server/routes/onboarding");
120
- const { registerSystemRoutes } = require("./server/routes/system");
121
- const { registerPairingRoutes } = require("./server/routes/pairings");
122
- const { registerCodexRoutes } = require("./server/routes/codex");
123
- const { registerGoogleRoutes } = require("./server/routes/google");
124
- const { registerBrowseRoutes } = require("./server/routes/browse");
125
- const { registerProxyRoutes } = require("./server/routes/proxy");
126
- const { registerTelegramRoutes } = require("./server/routes/telegram");
127
- const { registerWebhookRoutes } = require("./server/routes/webhooks");
128
- const { registerWatchdogRoutes } = require("./server/routes/watchdog");
129
- const { registerUsageRoutes } = require("./server/routes/usage");
130
- const { registerGmailRoutes } = require("./server/routes/gmail");
131
- const { registerDoctorRoutes } = require("./server/routes/doctor");
132
- const { registerAgentRoutes } = require("./server/routes/agents");
133
- const { registerCronRoutes } = require("./server/routes/cron");
119
+ const {
120
+ initializeServerRuntime,
121
+ initializeServerDatabases,
122
+ } = require("./server/init/runtime-init");
123
+ const {
124
+ registerServerRoutes,
125
+ } = require("./server/init/register-server-routes");
126
+ const {
127
+ startServerLifecycle,
128
+ registerServerShutdown,
129
+ } = require("./server/init/server-lifecycle");
134
130
 
135
131
  const { PORT, kTrustProxyHops, SETUP_API_PREFIXES } = constants;
136
132
 
137
- startEnvWatcher();
138
- attachGatewaySignalHandlers();
139
- cleanupStaleImportTempDirs();
140
- migrateManagedInternalFiles({
133
+ initializeServerRuntime({
141
134
  fs,
142
- openclawDir: constants.OPENCLAW_DIR,
135
+ constants,
136
+ startEnvWatcher,
137
+ attachGatewaySignalHandlers,
138
+ cleanupStaleImportTempDirs,
139
+ migrateManagedInternalFiles,
143
140
  });
144
141
 
145
142
  const app = express();
@@ -194,118 +191,19 @@ const cronService = createCronService({
194
191
  getSessionUsageByKeyPattern,
195
192
  });
196
193
 
197
- const { requireAuth, isAuthorizedRequest } = registerAuthRoutes({
198
- app,
199
- loginThrottle,
200
- });
201
194
  app.use(express.static(path.join(__dirname, "public")));
202
- initWebhooksDb({
203
- rootDir: constants.kRootDir,
204
- pruneDays: constants.kWebhookPruneDays,
205
- });
206
- initWatchdogDb({
207
- rootDir: constants.kRootDir,
208
- pruneDays: constants.kWatchdogLogRetentionDays,
209
- });
210
- initUsageDb({
211
- rootDir: constants.kRootDir,
212
- });
213
- initDoctorDb({
214
- rootDir: constants.kRootDir,
195
+ initializeServerDatabases({
196
+ constants,
197
+ initWebhooksDb,
198
+ initWatchdogDb,
199
+ initUsageDb,
200
+ initDoctorDb,
215
201
  });
216
202
  const webhookMiddleware = createWebhookMiddleware({
217
203
  getGatewayUrl,
218
204
  insertRequest,
219
205
  maxPayloadBytes: constants.kMaxPayloadBytes,
220
206
  });
221
-
222
- registerPageRoutes({ app, requireAuth, isGatewayRunning });
223
- registerModelRoutes({
224
- app,
225
- shellCmd,
226
- gatewayEnv,
227
- parseJsonFromNoisyOutput,
228
- normalizeOnboardingModels,
229
- authProfiles,
230
- readEnvFile,
231
- writeEnvFile,
232
- reloadEnv,
233
- });
234
- registerOnboardingRoutes({
235
- app,
236
- fs,
237
- constants,
238
- shellCmd,
239
- gatewayEnv,
240
- readEnvFile,
241
- writeEnvFile,
242
- reloadEnv,
243
- isOnboarded,
244
- resolveGithubRepoUrl,
245
- resolveModelProvider,
246
- hasCodexOauthProfile: authProfiles.hasCodexOauthProfile,
247
- authProfiles,
248
- ensureGatewayProxyConfig,
249
- getBaseUrl,
250
- startGateway,
251
- });
252
- registerSystemRoutes({
253
- app,
254
- fs,
255
- readEnvFile,
256
- writeEnvFile,
257
- reloadEnv,
258
- kKnownVars: constants.kKnownVars,
259
- kKnownKeys: constants.kKnownKeys,
260
- kSystemVars: constants.kSystemVars,
261
- syncChannelConfig,
262
- isGatewayRunning,
263
- isOnboarded,
264
- getChannelStatus,
265
- openclawVersionService,
266
- alphaclawVersionService,
267
- clawCmd,
268
- restartGateway,
269
- OPENCLAW_DIR: constants.OPENCLAW_DIR,
270
- restartRequiredState,
271
- topicRegistry,
272
- authProfiles,
273
- });
274
- registerBrowseRoutes({
275
- app,
276
- fs,
277
- kRootDir: constants.OPENCLAW_DIR,
278
- });
279
- registerPairingRoutes({ app, clawCmd, isOnboarded });
280
- registerCodexRoutes({
281
- app,
282
- createPkcePair,
283
- parseCodexAuthorizationInput,
284
- getCodexAccountId,
285
- authProfiles,
286
- });
287
- registerGoogleRoutes({
288
- app,
289
- fs,
290
- isGatewayRunning,
291
- gogCmd,
292
- getBaseUrl,
293
- readGoogleCredentials,
294
- getApiEnableUrl,
295
- constants,
296
- });
297
- const gmailWatchService = registerGmailRoutes({
298
- app,
299
- fs,
300
- constants,
301
- gogCmd,
302
- getBaseUrl,
303
- readGoogleCredentials,
304
- readEnvFile,
305
- writeEnvFile,
306
- reloadEnv,
307
- restartRequiredState,
308
- });
309
207
  const telegramApi = createTelegramApi(() => process.env.TELEGRAM_BOT_TOKEN);
310
208
  const discordApi = createDiscordApi(() => process.env.DISCORD_BOT_TOKEN);
311
209
  const slackApi = createSlackApi(() => process.env.SLACK_BOT_TOKEN);
@@ -320,6 +218,9 @@ const watchdog = createWatchdog({
320
218
  reloadEnv,
321
219
  resolveSetupUrl,
322
220
  });
221
+ const watchdogTerminal = createWatchdogTerminalService({
222
+ cwd: constants.OPENCLAW_DIR,
223
+ });
323
224
  const doctorService = createDoctorService({
324
225
  clawCmd,
325
226
  listDoctorRuns,
@@ -353,116 +254,89 @@ const doSyncPromptFiles = () => {
353
254
  });
354
255
  installGogCliSkill({ fs, openclawDir: constants.OPENCLAW_DIR });
355
256
  };
356
- registerTelegramRoutes({
357
- app,
358
- telegramApi,
359
- syncPromptFiles: doSyncPromptFiles,
360
- shellCmd,
361
- });
362
- registerWebhookRoutes({
257
+ const { isAuthorizedRequest, gmailWatchService } = registerServerRoutes({
363
258
  app,
364
259
  fs,
365
260
  constants,
366
- getBaseUrl,
261
+ loginThrottle,
367
262
  shellCmd,
368
- webhooksDb: {
369
- getRequests,
370
- getRequestById,
371
- getHookSummaries,
372
- deleteRequestsByHook,
373
- },
263
+ clawCmd,
264
+ gogCmd,
265
+ gatewayEnv,
266
+ parseJsonFromNoisyOutput,
267
+ normalizeOnboardingModels,
268
+ authProfiles,
269
+ readEnvFile,
270
+ writeEnvFile,
271
+ reloadEnv,
272
+ isOnboarded,
273
+ isGatewayRunning,
274
+ resolveGithubRepoUrl,
275
+ resolveModelProvider,
276
+ ensureGatewayProxyConfig,
277
+ getBaseUrl,
278
+ startGateway,
279
+ syncChannelConfig,
280
+ getChannelStatus,
281
+ openclawVersionService,
282
+ alphaclawVersionService,
283
+ restartGateway,
374
284
  restartRequiredState,
375
- });
376
- registerWatchdogRoutes({
377
- app,
378
- requireAuth,
285
+ topicRegistry,
286
+ createPkcePair,
287
+ parseCodexAuthorizationInput,
288
+ getCodexAccountId,
289
+ readGoogleCredentials,
290
+ getApiEnableUrl,
291
+ telegramApi,
292
+ doSyncPromptFiles,
293
+ getRequests,
294
+ getRequestById,
295
+ getHookSummaries,
296
+ deleteRequestsByHook,
379
297
  watchdog,
380
298
  getRecentEvents,
381
299
  readLogTail,
382
- });
383
- registerUsageRoutes({
384
- app,
385
- requireAuth,
300
+ watchdogTerminal,
386
301
  getDailySummary,
387
302
  getSessionsList,
388
303
  getSessionDetail,
389
304
  getSessionTimeSeries,
390
- });
391
- registerCronRoutes({
392
- app,
393
- requireAuth,
394
305
  cronService,
395
- });
396
- registerDoctorRoutes({
397
- app,
398
- requireAuth,
399
306
  doctorService,
400
- });
401
- registerAgentRoutes({
402
- app,
403
307
  agentsService,
404
- restartRequiredState,
405
308
  operationEvents,
406
- });
407
- registerProxyRoutes({
408
- app,
409
309
  proxy,
410
310
  getGatewayUrl,
411
311
  SETUP_API_PREFIXES,
412
- requireAuth,
413
312
  webhookMiddleware,
414
313
  });
415
314
 
416
315
  const server = http.createServer(app);
417
- server.on("upgrade", (req, socket, head) => {
418
- const requestUrl = new URL(
419
- req.url || "/",
420
- `http://${req.headers.host || "localhost"}`,
421
- );
422
- if (requestUrl.pathname.startsWith("/openclaw")) {
423
- const upgradeReq = {
424
- headers: req.headers,
425
- path: requestUrl.pathname,
426
- query: Object.fromEntries(requestUrl.searchParams.entries()),
427
- };
428
- if (!isAuthorizedRequest(upgradeReq)) {
429
- socket.write(
430
- "HTTP/1.1 401 Unauthorized\r\nContent-Type: text/plain\r\nConnection: close\r\n\r\nUnauthorized",
431
- );
432
- socket.destroy();
433
- return;
434
- }
435
- }
436
- proxy.ws(req, socket, head, { target: getGatewayUrl() });
437
- });
438
-
439
- server.listen(PORT, "0.0.0.0", () => {
440
- console.log(`[alphaclaw] Express listening on :${PORT}`);
441
- if (isOnboarded()) {
442
- runOnboardedBootSequence({
443
- doSyncPromptFiles,
444
- reloadEnv,
445
- syncChannelConfig,
446
- readEnvFile,
447
- ensureGatewayProxyConfig,
448
- resolveSetupUrl,
449
- startGateway,
450
- watchdog,
451
- gmailWatchService,
452
- });
453
- } else {
454
- console.log("[alphaclaw] Awaiting onboarding via Setup UI");
455
- }
316
+ createWatchdogTerminalWsBridge({
317
+ server,
318
+ proxy,
319
+ getGatewayUrl,
320
+ isAuthorizedRequest,
321
+ watchdogTerminal,
456
322
  });
457
323
 
458
- const shutdownGmailWatchService = async () => {
459
- try {
460
- await gmailWatchService.stop();
461
- } catch {}
462
- };
463
- process.on("SIGTERM", () => {
464
- shutdownGmailWatchService();
324
+ startServerLifecycle({
325
+ server,
326
+ PORT,
327
+ isOnboarded,
328
+ runOnboardedBootSequence,
329
+ doSyncPromptFiles,
330
+ reloadEnv,
331
+ syncChannelConfig,
332
+ readEnvFile,
333
+ ensureGatewayProxyConfig,
334
+ resolveSetupUrl,
335
+ startGateway,
336
+ watchdog,
337
+ gmailWatchService,
465
338
  });
466
- process.on("SIGINT", () => {
467
- shutdownGmailWatchService();
339
+ registerServerShutdown({
340
+ gmailWatchService,
341
+ watchdogTerminal,
468
342
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chrysb/alphaclaw",
3
- "version": "0.7.0",
3
+ "version": "0.7.1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -31,7 +31,8 @@
31
31
  "dependencies": {
32
32
  "express": "^4.21.0",
33
33
  "http-proxy": "^1.18.1",
34
- "openclaw": "2026.3.11"
34
+ "openclaw": "2026.3.11",
35
+ "ws": "^8.19.0"
35
36
  },
36
37
  "devDependencies": {
37
38
  "@vitest/coverage-v8": "^4.0.18",