@action-llama/action-llama 0.4.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/README.md +8 -12
  2. package/dist/agents/container-entry.js +9 -7
  3. package/dist/agents/container-entry.js.map +1 -1
  4. package/dist/agents/container-runner.d.ts +4 -1
  5. package/dist/agents/container-runner.d.ts.map +1 -1
  6. package/dist/agents/container-runner.js +10 -2
  7. package/dist/agents/container-runner.js.map +1 -1
  8. package/dist/agents/runner.d.ts +4 -1
  9. package/dist/agents/runner.d.ts.map +1 -1
  10. package/dist/agents/runner.js +41 -18
  11. package/dist/agents/runner.js.map +1 -1
  12. package/dist/cli/commands/creds.d.ts +2 -0
  13. package/dist/cli/commands/creds.d.ts.map +1 -1
  14. package/dist/cli/commands/creds.js +54 -2
  15. package/dist/cli/commands/creds.js.map +1 -1
  16. package/dist/cli/commands/doctor.d.ts.map +1 -1
  17. package/dist/cli/commands/doctor.js +9 -5
  18. package/dist/cli/commands/doctor.js.map +1 -1
  19. package/dist/cli/commands/new.d.ts.map +1 -1
  20. package/dist/cli/commands/new.js +63 -14
  21. package/dist/cli/commands/new.js.map +1 -1
  22. package/dist/cli/commands/start.d.ts +1 -0
  23. package/dist/cli/commands/start.d.ts.map +1 -1
  24. package/dist/cli/commands/start.js +2 -1
  25. package/dist/cli/commands/start.js.map +1 -1
  26. package/dist/cli/main.js +16 -1
  27. package/dist/cli/main.js.map +1 -1
  28. package/dist/credentials/builtins/custom-key.d.ts +4 -0
  29. package/dist/credentials/builtins/custom-key.d.ts.map +1 -0
  30. package/dist/credentials/builtins/custom-key.js +35 -0
  31. package/dist/credentials/builtins/custom-key.js.map +1 -0
  32. package/dist/credentials/builtins/google-key.d.ts +4 -0
  33. package/dist/credentials/builtins/google-key.d.ts.map +1 -0
  34. package/dist/credentials/builtins/google-key.js +35 -0
  35. package/dist/credentials/builtins/google-key.js.map +1 -0
  36. package/dist/credentials/builtins/groq-key.d.ts +4 -0
  37. package/dist/credentials/builtins/groq-key.d.ts.map +1 -0
  38. package/dist/credentials/builtins/groq-key.js +37 -0
  39. package/dist/credentials/builtins/groq-key.js.map +1 -0
  40. package/dist/credentials/builtins/index.d.ts.map +1 -1
  41. package/dist/credentials/builtins/index.js +12 -0
  42. package/dist/credentials/builtins/index.js.map +1 -1
  43. package/dist/credentials/builtins/mistral-key.d.ts +4 -0
  44. package/dist/credentials/builtins/mistral-key.d.ts.map +1 -0
  45. package/dist/credentials/builtins/mistral-key.js +35 -0
  46. package/dist/credentials/builtins/mistral-key.js.map +1 -0
  47. package/dist/credentials/builtins/openrouter-key.d.ts +4 -0
  48. package/dist/credentials/builtins/openrouter-key.d.ts.map +1 -0
  49. package/dist/credentials/builtins/openrouter-key.js +37 -0
  50. package/dist/credentials/builtins/openrouter-key.js.map +1 -0
  51. package/dist/credentials/builtins/xai-key.d.ts +4 -0
  52. package/dist/credentials/builtins/xai-key.d.ts.map +1 -0
  53. package/dist/credentials/builtins/xai-key.js +37 -0
  54. package/dist/credentials/builtins/xai-key.js.map +1 -0
  55. package/dist/gateway/index.d.ts +2 -0
  56. package/dist/gateway/index.d.ts.map +1 -1
  57. package/dist/gateway/index.js +20 -34
  58. package/dist/gateway/index.js.map +1 -1
  59. package/dist/gateway/routes/credentials.d.ts +2 -2
  60. package/dist/gateway/routes/credentials.d.ts.map +1 -1
  61. package/dist/gateway/routes/credentials.js +7 -9
  62. package/dist/gateway/routes/credentials.js.map +1 -1
  63. package/dist/gateway/routes/dashboard.d.ts +4 -0
  64. package/dist/gateway/routes/dashboard.d.ts.map +1 -0
  65. package/dist/gateway/routes/dashboard.js +151 -0
  66. package/dist/gateway/routes/dashboard.js.map +1 -0
  67. package/dist/gateway/routes/logs.d.ts +2 -2
  68. package/dist/gateway/routes/logs.d.ts.map +1 -1
  69. package/dist/gateway/routes/logs.js +9 -12
  70. package/dist/gateway/routes/logs.js.map +1 -1
  71. package/dist/gateway/routes/shutdown.d.ts +2 -2
  72. package/dist/gateway/routes/shutdown.d.ts.map +1 -1
  73. package/dist/gateway/routes/shutdown.js +7 -11
  74. package/dist/gateway/routes/shutdown.js.map +1 -1
  75. package/dist/gateway/routes/webhooks.d.ts +2 -2
  76. package/dist/gateway/routes/webhooks.d.ts.map +1 -1
  77. package/dist/gateway/routes/webhooks.js +10 -14
  78. package/dist/gateway/routes/webhooks.js.map +1 -1
  79. package/dist/gateway/views/dashboard-page.d.ts +3 -0
  80. package/dist/gateway/views/dashboard-page.d.ts.map +1 -0
  81. package/dist/gateway/views/dashboard-page.js +246 -0
  82. package/dist/gateway/views/dashboard-page.js.map +1 -0
  83. package/dist/gateway/views/logs-page.d.ts +2 -0
  84. package/dist/gateway/views/logs-page.d.ts.map +1 -0
  85. package/dist/gateway/views/logs-page.js +180 -0
  86. package/dist/gateway/views/logs-page.js.map +1 -0
  87. package/dist/scheduler/event-queue.d.ts +18 -0
  88. package/dist/scheduler/event-queue.d.ts.map +1 -1
  89. package/dist/scheduler/event-queue.js +35 -0
  90. package/dist/scheduler/event-queue.js.map +1 -1
  91. package/dist/scheduler/index.d.ts +5 -2
  92. package/dist/scheduler/index.d.ts.map +1 -1
  93. package/dist/scheduler/index.js +132 -66
  94. package/dist/scheduler/index.js.map +1 -1
  95. package/dist/setup/prompts.d.ts.map +1 -1
  96. package/dist/setup/prompts.js +89 -19
  97. package/dist/setup/prompts.js.map +1 -1
  98. package/dist/setup/scaffold.d.ts.map +1 -1
  99. package/dist/setup/scaffold.js +87 -51
  100. package/dist/setup/scaffold.js.map +1 -1
  101. package/dist/shared/config.d.ts +6 -4
  102. package/dist/shared/config.d.ts.map +1 -1
  103. package/dist/shared/config.js.map +1 -1
  104. package/dist/tui/App.d.ts.map +1 -1
  105. package/dist/tui/App.js +1 -1
  106. package/dist/tui/App.js.map +1 -1
  107. package/dist/tui/plain-logger.d.ts.map +1 -1
  108. package/dist/tui/plain-logger.js +16 -6
  109. package/dist/tui/plain-logger.js.map +1 -1
  110. package/dist/tui/status-tracker.d.ts +3 -0
  111. package/dist/tui/status-tracker.d.ts.map +1 -1
  112. package/dist/tui/status-tracker.js +8 -0
  113. package/dist/tui/status-tracker.js.map +1 -1
  114. package/dist/webhooks/definitions/github.d.ts.map +1 -1
  115. package/dist/webhooks/definitions/github.js +2 -0
  116. package/dist/webhooks/definitions/github.js.map +1 -1
  117. package/dist/webhooks/providers/github.d.ts.map +1 -1
  118. package/dist/webhooks/providers/github.js +7 -0
  119. package/dist/webhooks/providers/github.js.map +1 -1
  120. package/dist/webhooks/types.d.ts +3 -2
  121. package/dist/webhooks/types.d.ts.map +1 -1
  122. package/package.json +10 -4
  123. package/dist/gateway/router.d.ts +0 -13
  124. package/dist/gateway/router.d.ts.map +0 -1
  125. package/dist/gateway/router.js +0 -71
  126. package/dist/gateway/router.js.map +0 -1
@@ -0,0 +1,4 @@
1
+ import type { CredentialDefinition } from "../schema.js";
2
+ declare const xaiKey: CredentialDefinition;
3
+ export default xaiKey;
4
+ //# sourceMappingURL=xai-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xai-key.d.ts","sourceRoot":"","sources":["../../../src/credentials/builtins/xai-key.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAIzD,QAAA,MAAM,MAAM,EAAE,oBAiCb,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { input, confirm } from "@inquirer/prompts";
2
+ import { CREDENTIALS_DIR } from "../../shared/paths.js";
3
+ const xaiKey = {
4
+ id: "xai_key",
5
+ label: "xAI API Credential",
6
+ description: "API key for xAI Grok models",
7
+ fields: [
8
+ { name: "token", label: "API Key", description: "xAI API key", secret: true },
9
+ ],
10
+ async prompt(existing) {
11
+ if (existing?.token) {
12
+ const reuse = await confirm({
13
+ message: `Found existing xAI credential in ${CREDENTIALS_DIR}/xai_key/. Use it?`,
14
+ default: true,
15
+ });
16
+ if (reuse) {
17
+ console.log(`Using existing xAI API key.\n`);
18
+ return { values: existing, params: { authType: "api_key" } };
19
+ }
20
+ }
21
+ const token = (await input({
22
+ message: "xAI API key:",
23
+ validate: (v) => {
24
+ v = v.trim();
25
+ if (v.length === 0)
26
+ return "API key is required";
27
+ if (!v.startsWith("xai-"))
28
+ return "API key should start with 'xai-'";
29
+ return true;
30
+ },
31
+ })).trim();
32
+ console.log("xAI API key saved. It will be verified on first agent run.\n");
33
+ return { values: { token }, params: { authType: "api_key" } };
34
+ },
35
+ };
36
+ export default xaiKey;
37
+ //# sourceMappingURL=xai-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xai-key.js","sourceRoot":"","sources":["../../../src/credentials/builtins/xai-key.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,MAAM,GAAyB;IACnC,EAAE,EAAE,SAAS;IACb,KAAK,EAAE,oBAAoB;IAC3B,WAAW,EAAE,6BAA6B;IAC1C,MAAM,EAAE;QACN,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE;KAC9E;IAED,KAAK,CAAC,MAAM,CAAC,QAAQ;QACnB,IAAI,QAAQ,EAAE,KAAK,EAAE,CAAC;YACpB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC;gBAC1B,OAAO,EAAE,oCAAoC,eAAe,oBAAoB;gBAChF,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YACH,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;gBAC7C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC;YAC/D,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,MAAM,KAAK,CAAC;YACzB,OAAO,EAAE,cAAc;YACvB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gBACd,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBACb,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,qBAAqB,CAAC;gBACjD,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;oBAAE,OAAO,kCAAkC,CAAC;gBACrE,OAAO,IAAI,CAAC;YACd,CAAC;SACF,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEX,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;QAC5E,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC;IAChE,CAAC;CACF,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -11,6 +11,8 @@ export interface GatewayOptions {
11
11
  webhookRegistry?: WebhookRegistry;
12
12
  webhookSecrets?: Record<string, Record<string, string>>;
13
13
  statusTracker?: StatusTracker;
14
+ projectPath?: string;
15
+ webUI?: boolean;
14
16
  }
15
17
  export interface GatewayServer {
16
18
  server: Server;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gateway/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAMnC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,YAAY,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACxD,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACxE,mBAAmB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAiE/E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gateway/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAMnC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,YAAY,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACxD,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACxE,mBAAmB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAkD/E"}
@@ -1,52 +1,38 @@
1
- import { createServer } from "http";
2
- import { Router, sendJson, sendError } from "./router.js";
1
+ import { Hono } from "hono";
2
+ import { serve } from "@hono/node-server";
3
3
  import { registerShutdownRoute } from "./routes/shutdown.js";
4
4
  import { registerCredentialRoute } from "./routes/credentials.js";
5
5
  import { registerLogRoute } from "./routes/logs.js";
6
6
  import { registerWebhookRoutes } from "./routes/webhooks.js";
7
+ import { registerDashboardRoutes } from "./routes/dashboard.js";
7
8
  export async function startGateway(opts) {
8
- const { port, logger, killContainer, webhookRegistry, webhookSecrets, statusTracker } = opts;
9
- const router = new Router();
9
+ const { port, logger, killContainer, webhookRegistry, webhookSecrets, statusTracker, projectPath, webUI } = opts;
10
+ const app = new Hono();
10
11
  const containerRegistry = new Map();
11
12
  // Health check
12
- router.get("/health", async (_req, res) => {
13
- sendJson(res, 200, { status: "ok" });
14
- });
13
+ app.get("/health", (c) => c.json({ status: "ok" }));
15
14
  // Container management routes
16
15
  const killFn = killContainer || (async () => { });
17
- registerShutdownRoute(router, containerRegistry, killFn, logger);
18
- registerCredentialRoute(router, containerRegistry, logger);
19
- registerLogRoute(router, containerRegistry, logger);
16
+ registerShutdownRoute(app, containerRegistry, killFn, logger);
17
+ registerCredentialRoute(app, containerRegistry, logger);
18
+ registerLogRoute(app, containerRegistry, logger);
20
19
  // Webhook routes
21
20
  if (webhookRegistry) {
22
- registerWebhookRoutes(router, webhookRegistry, webhookSecrets || {}, logger, statusTracker);
21
+ registerWebhookRoutes(app, webhookRegistry, webhookSecrets || {}, logger, statusTracker);
22
+ }
23
+ // Dashboard routes
24
+ if (webUI && statusTracker) {
25
+ registerDashboardRoutes(app, statusTracker, projectPath);
23
26
  }
24
- const server = createServer(async (req, res) => {
25
- const startTime = Date.now();
26
- try {
27
- logger.info({ method: req.method, url: req.url }, "gateway req");
28
- const handled = await router.handle(req, res);
29
- if (!handled) {
30
- sendError(res, 404, "Not found");
31
- }
32
- }
33
- catch (err) {
34
- logger.error({ err, url: req.url }, "gateway request error");
35
- if (!res.headersSent) {
36
- sendError(res, 500, "Internal server error");
37
- }
38
- }
39
- finally {
40
- const elapsed = Date.now() - startTime;
41
- logger.info({ method: req.method, url: req.url, status: res.statusCode, ms: elapsed }, "gateway res");
42
- }
27
+ const server = serve({
28
+ fetch: app.fetch,
29
+ port,
30
+ hostname: "0.0.0.0",
43
31
  });
44
32
  await new Promise((resolve) => {
45
- server.listen(port, "0.0.0.0", () => {
46
- logger.info({ port }, "Gateway server listening");
47
- resolve();
48
- });
33
+ server.on("listening", resolve);
49
34
  });
35
+ logger.info({ port }, "Gateway server listening");
50
36
  const registerContainer = (secret, reg) => {
51
37
  containerRegistry.set(secret, reg);
52
38
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gateway/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gateway/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AA0BhE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAoB;IACrD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACjH,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAiC,CAAC;IAEnE,eAAe;IACf,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEpD,8BAA8B;IAC9B,MAAM,MAAM,GAAG,aAAa,IAAI,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAC;IACjD,qBAAqB,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9D,uBAAuB,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,CAAC,CAAC;IACxD,gBAAgB,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,CAAC,CAAC;IAEjD,iBAAiB;IACjB,IAAI,eAAe,EAAE,CAAC;QACpB,qBAAqB,CAAC,GAAG,EAAE,eAAe,EAAE,cAAc,IAAI,EAAE,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IAC3F,CAAC;IAED,mBAAmB;IACnB,IAAI,KAAK,IAAI,aAAa,EAAE,CAAC;QAC3B,uBAAuB,CAAC,GAAG,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC;QACnB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,IAAI;QACJ,QAAQ,EAAE,SAAS;KACpB,CAAW,CAAC;IAEb,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,0BAA0B,CAAC,CAAC;IAElD,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAE,GAA0B,EAAE,EAAE;QACvE,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,CAAC,MAAc,EAAE,EAAE;QAC7C,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,GAAG,EAAE,CACjB,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEL,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC;AACnE,CAAC"}
@@ -1,5 +1,5 @@
1
- import type { Router } from "../router.js";
1
+ import type { Hono } from "hono";
2
2
  import type { ContainerRegistration } from "../types.js";
3
3
  import type { Logger } from "../../shared/logger.js";
4
- export declare function registerCredentialRoute(router: Router, containerRegistry: Map<string, ContainerRegistration>, logger: Logger): void;
4
+ export declare function registerCredentialRoute(app: Hono, containerRegistry: Map<string, ContainerRegistration>, logger: Logger): void;
5
5
  //# sourceMappingURL=credentials.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/gateway/routes/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAErD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,EACrD,MAAM,EAAE,MAAM,GACb,IAAI,CAgBN"}
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/gateway/routes/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAErD,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,IAAI,EACT,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,EACrD,MAAM,EAAE,MAAM,GACb,IAAI,CAeN"}
@@ -1,17 +1,15 @@
1
- import { sendJson, sendError } from "../router.js";
2
- export function registerCredentialRoute(router, containerRegistry, logger) {
3
- router.get("/credentials/:secret", async (_req, res, params) => {
4
- const reg = containerRegistry.get(params.secret);
1
+ export function registerCredentialRoute(app, containerRegistry, logger) {
2
+ app.get("/credentials/:secret", (c) => {
3
+ const secret = c.req.param("secret");
4
+ const reg = containerRegistry.get(secret);
5
5
  if (!reg) {
6
- sendError(res, 403, "invalid secret");
7
- return;
6
+ return c.json({ error: "invalid secret" }, 403);
8
7
  }
9
8
  if (!reg.credentials) {
10
- sendError(res, 404, "no credentials registered for this container");
11
- return;
9
+ return c.json({ error: "no credentials registered for this container" }, 404);
12
10
  }
13
11
  logger.debug({ container: reg.containerName }, "serving credentials");
14
- sendJson(res, 200, reg.credentials);
12
+ return c.json(reg.credentials);
15
13
  });
16
14
  }
17
15
  //# sourceMappingURL=credentials.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../src/gateway/routes/credentials.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAInD,MAAM,UAAU,uBAAuB,CACrC,MAAc,EACd,iBAAqD,EACrD,MAAc;IAEd,MAAM,CAAC,GAAG,CAAC,sBAAsB,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QAC7D,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,8CAA8C,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,EAAE,EAAE,qBAAqB,CAAC,CAAC;QACtE,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../src/gateway/routes/credentials.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,uBAAuB,CACrC,GAAS,EACT,iBAAqD,EACrD,MAAc;IAEd,GAAG,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE,EAAE;QACpC,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,8CAA8C,EAAE,EAAE,GAAG,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,EAAE,EAAE,qBAAqB,CAAC,CAAC;QACtE,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Hono } from "hono";
2
+ import type { StatusTracker } from "../../tui/status-tracker.js";
3
+ export declare function registerDashboardRoutes(app: Hono, statusTracker: StatusTracker, projectPath?: string): void;
4
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/gateway/routes/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAIjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AA8BjE,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,IAAI,EACT,aAAa,EAAE,aAAa,EAC5B,WAAW,CAAC,EAAE,MAAM,GACnB,IAAI,CAqIN"}
@@ -0,0 +1,151 @@
1
+ import { streamSSE } from "hono/streaming";
2
+ import { renderDashboardPage } from "../views/dashboard-page.js";
3
+ import { renderLogsPage } from "../views/logs-page.js";
4
+ import { readFileSync, readdirSync, statSync } from "fs";
5
+ import { resolve } from "path";
6
+ function logsDir(projectPath) {
7
+ return resolve(projectPath, ".al", "logs");
8
+ }
9
+ function findLogFiles(projectPath, agentName) {
10
+ const dir = logsDir(projectPath);
11
+ try {
12
+ return readdirSync(dir)
13
+ .filter((f) => f.startsWith(`${agentName}-`) && f.endsWith(".log"))
14
+ .sort()
15
+ .map((f) => resolve(dir, f));
16
+ }
17
+ catch {
18
+ return [];
19
+ }
20
+ }
21
+ function readLastNLines(filePath, n) {
22
+ try {
23
+ const content = readFileSync(filePath, "utf-8");
24
+ const lines = content.split("\n").filter((l) => l.trim());
25
+ return lines.slice(-n);
26
+ }
27
+ catch {
28
+ return [];
29
+ }
30
+ }
31
+ export function registerDashboardRoutes(app, statusTracker, projectPath) {
32
+ // Main dashboard page
33
+ app.get("/dashboard", (c) => {
34
+ const agents = statusTracker.getAllAgents();
35
+ const info = statusTracker.getSchedulerInfo();
36
+ const logs = statusTracker.getRecentLogs(20);
37
+ const html = renderDashboardPage(agents, info, logs);
38
+ return c.html(html);
39
+ });
40
+ // Agent logs page
41
+ app.get("/dashboard/agents/:name/logs", (c) => {
42
+ const name = c.req.param("name");
43
+ const html = renderLogsPage(name);
44
+ return c.html(html);
45
+ });
46
+ // SSE: status stream
47
+ app.get("/dashboard/api/status-stream", (c) => {
48
+ return streamSSE(c, async (stream) => {
49
+ const send = () => {
50
+ const agents = statusTracker.getAllAgents();
51
+ const info = statusTracker.getSchedulerInfo();
52
+ const recentLogs = statusTracker.getRecentLogs(20);
53
+ stream.writeSSE({
54
+ data: JSON.stringify({ agents, schedulerInfo: info, recentLogs }),
55
+ });
56
+ };
57
+ // Send initial state
58
+ send();
59
+ // Listen for updates
60
+ statusTracker.on("update", send);
61
+ // Keep connection alive with periodic heartbeats
62
+ const heartbeat = setInterval(() => {
63
+ stream.writeSSE({ event: "heartbeat", data: "" });
64
+ }, 15000);
65
+ // Cleanup on disconnect
66
+ stream.onAbort(() => {
67
+ statusTracker.removeListener("update", send);
68
+ clearInterval(heartbeat);
69
+ });
70
+ // Keep the stream open
71
+ await new Promise(() => { });
72
+ });
73
+ });
74
+ // SSE: log stream for a specific agent
75
+ app.get("/dashboard/api/logs/:agent/stream", (c) => {
76
+ const agentName = c.req.param("agent");
77
+ return streamSSE(c, async (stream) => {
78
+ // Send historical log entries from file
79
+ if (projectPath) {
80
+ const logFiles = findLogFiles(projectPath, agentName);
81
+ if (logFiles.length > 0) {
82
+ const lastFile = logFiles[logFiles.length - 1];
83
+ const lines = readLastNLines(lastFile, 100);
84
+ if (lines.length > 0) {
85
+ stream.writeSSE({ data: JSON.stringify({ lines }) });
86
+ }
87
+ }
88
+ }
89
+ // Track file position for tailing
90
+ let fileSize = 0;
91
+ let currentFile = "";
92
+ if (projectPath) {
93
+ const logFiles = findLogFiles(projectPath, agentName);
94
+ if (logFiles.length > 0) {
95
+ currentFile = logFiles[logFiles.length - 1];
96
+ try {
97
+ fileSize = statSync(currentFile).size;
98
+ }
99
+ catch {
100
+ // File may not exist yet
101
+ }
102
+ }
103
+ }
104
+ // Poll for new file data
105
+ const filePoll = setInterval(() => {
106
+ if (!projectPath)
107
+ return;
108
+ // Check if a new log file appeared
109
+ const logFiles = findLogFiles(projectPath, agentName);
110
+ if (logFiles.length === 0)
111
+ return;
112
+ const latestFile = logFiles[logFiles.length - 1];
113
+ if (latestFile !== currentFile) {
114
+ currentFile = latestFile;
115
+ fileSize = 0;
116
+ }
117
+ try {
118
+ const stat = statSync(currentFile);
119
+ if (stat.size > fileSize) {
120
+ const fd = readFileSync(currentFile, "utf-8");
121
+ const newContent = fd.slice(fileSize);
122
+ fileSize = stat.size;
123
+ const newLines = newContent.split("\n").filter((l) => l.trim());
124
+ for (const line of newLines) {
125
+ stream.writeSSE({ data: JSON.stringify({ line }) });
126
+ }
127
+ }
128
+ }
129
+ catch {
130
+ // File read error, skip
131
+ }
132
+ }, 500);
133
+ // Also forward StatusTracker log lines for this agent
134
+ const onUpdate = () => {
135
+ // StatusTracker log lines are already sent via the file poll,
136
+ // but for non-Docker mode where logs go directly through StatusTracker,
137
+ // we listen here as well. The client handles deduplication by display.
138
+ };
139
+ const heartbeat = setInterval(() => {
140
+ stream.writeSSE({ event: "heartbeat", data: "" });
141
+ }, 15000);
142
+ stream.onAbort(() => {
143
+ clearInterval(filePoll);
144
+ clearInterval(heartbeat);
145
+ });
146
+ // Keep stream open
147
+ await new Promise(() => { });
148
+ });
149
+ });
150
+ }
151
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../src/gateway/routes/dashboard.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import type { Router } from "../router.js";
1
+ import type { Hono } from "hono";
2
2
  import type { ContainerRegistration } from "../types.js";
3
3
  import type { Logger } from "../../shared/logger.js";
4
- export declare function registerLogRoute(router: Router, containerRegistry: Map<string, ContainerRegistration>, logger: Logger): void;
4
+ export declare function registerLogRoute(app: Hono, containerRegistry: Map<string, ContainerRegistration>, logger: Logger): void;
5
5
  //# sourceMappingURL=logs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../../src/gateway/routes/logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAErD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,EACrD,MAAM,EAAE,MAAM,GACb,IAAI,CA+BN"}
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../../src/gateway/routes/logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAErD,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,IAAI,EACT,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,EACrD,MAAM,EAAE,MAAM,GACb,IAAI,CA6BN"}
@@ -1,22 +1,19 @@
1
- import { readBody, sendJson, sendError } from "../router.js";
2
- export function registerLogRoute(router, containerRegistry, logger) {
3
- router.post("/logs/:secret", async (req, res, params) => {
4
- const reg = containerRegistry.get(params.secret);
1
+ export function registerLogRoute(app, containerRegistry, logger) {
2
+ app.post("/logs/:secret", async (c) => {
3
+ const secret = c.req.param("secret");
4
+ const reg = containerRegistry.get(secret);
5
5
  if (!reg) {
6
- sendError(res, 403, "invalid secret");
7
- return;
6
+ return c.json({ error: "invalid secret" }, 403);
8
7
  }
9
8
  if (!reg.onLogLine) {
10
- sendJson(res, 200, { ok: true, forwarded: 0 });
11
- return;
9
+ return c.json({ ok: true, forwarded: 0 });
12
10
  }
13
11
  let body;
14
12
  try {
15
- body = await readBody(req);
13
+ body = await c.req.text();
16
14
  }
17
15
  catch {
18
- sendError(res, 400, "failed to read request body");
19
- return;
16
+ return c.json({ error: "failed to read request body" }, 400);
20
17
  }
21
18
  let forwarded = 0;
22
19
  for (const line of body.split("\n")) {
@@ -25,7 +22,7 @@ export function registerLogRoute(router, containerRegistry, logger) {
25
22
  forwarded++;
26
23
  }
27
24
  }
28
- sendJson(res, 200, { ok: true, forwarded });
25
+ return c.json({ ok: true, forwarded });
29
26
  });
30
27
  }
31
28
  //# sourceMappingURL=logs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../src/gateway/routes/logs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAI7D,MAAM,UAAU,gBAAgB,CAC9B,MAAc,EACd,iBAAqD,EACrD,MAAc;IAEd,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QACtD,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YACnB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,6BAA6B,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChB,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBACpB,SAAS,EAAE,CAAC;YACd,CAAC;QACH,CAAC;QAED,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../src/gateway/routes/logs.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,gBAAgB,CAC9B,GAAS,EACT,iBAAqD,EACrD,MAAc;IAEd,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,6BAA6B,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChB,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBACpB,SAAS,EAAE,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,5 +1,5 @@
1
- import type { Router } from "../router.js";
1
+ import type { Hono } from "hono";
2
2
  import type { ContainerRegistration } from "../types.js";
3
3
  import type { Logger } from "../../shared/logger.js";
4
- export declare function registerShutdownRoute(router: Router, containerRegistry: Map<string, ContainerRegistration>, killContainer: (name: string) => Promise<void>, logger: Logger): void;
4
+ export declare function registerShutdownRoute(app: Hono, containerRegistry: Map<string, ContainerRegistration>, killContainer: (name: string) => Promise<void>, logger: Logger): void;
5
5
  //# sourceMappingURL=shutdown.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shutdown.d.ts","sourceRoot":"","sources":["../../../src/gateway/routes/shutdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAErD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,EACrD,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EAC9C,MAAM,EAAE,MAAM,GACb,IAAI,CAgCN"}
1
+ {"version":3,"file":"shutdown.d.ts","sourceRoot":"","sources":["../../../src/gateway/routes/shutdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAErD,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,IAAI,EACT,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,EACrD,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EAC9C,MAAM,EAAE,MAAM,GACb,IAAI,CA6BN"}
@@ -1,28 +1,24 @@
1
- import { readBody, sendJson, sendError } from "../router.js";
2
- export function registerShutdownRoute(router, containerRegistry, killContainer, logger) {
3
- router.post("/shutdown", async (req, res) => {
1
+ export function registerShutdownRoute(app, containerRegistry, killContainer, logger) {
2
+ app.post("/shutdown", async (c) => {
4
3
  let body;
5
4
  try {
6
- body = JSON.parse(await readBody(req));
5
+ body = await c.req.json();
7
6
  }
8
7
  catch {
9
- sendError(res, 400, "invalid JSON body");
10
- return;
8
+ return c.json({ error: "invalid JSON body" }, 400);
11
9
  }
12
10
  const { secret, reason, details } = body;
13
11
  if (!secret || typeof secret !== "string") {
14
- sendError(res, 400, "missing secret");
15
- return;
12
+ return c.json({ error: "missing secret" }, 400);
16
13
  }
17
14
  const reg = containerRegistry.get(secret);
18
15
  if (!reg) {
19
- sendError(res, 403, "invalid secret");
20
- return;
16
+ return c.json({ error: "invalid secret" }, 403);
21
17
  }
22
18
  logger.error({ container: reg.containerName, reason, details }, "shutdown requested — killing container");
23
19
  await killContainer(reg.containerName);
24
20
  containerRegistry.delete(secret);
25
- sendJson(res, 200, { killed: true, container: reg.containerName });
21
+ return c.json({ killed: true, container: reg.containerName });
26
22
  });
27
23
  }
28
24
  //# sourceMappingURL=shutdown.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shutdown.js","sourceRoot":"","sources":["../../../src/gateway/routes/shutdown.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAI7D,MAAM,UAAU,qBAAqB,CACnC,MAAc,EACd,iBAAqD,EACrD,aAA8C,EAC9C,MAAc;IAEd,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC1C,IAAI,IAA4D,CAAC;QACjE,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QAED,MAAM,CAAC,KAAK,CACV,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,EACjD,wCAAwC,CACzC,CAAC;QAEF,MAAM,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAEvC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"shutdown.js","sourceRoot":"","sources":["../../../src/gateway/routes/shutdown.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,qBAAqB,CACnC,GAAS,EACT,iBAAqD,EACrD,aAA8C,EAC9C,MAAc;IAEd,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAChC,IAAI,IAA4D,CAAC;QACjE,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,CAAC,KAAK,CACV,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,EACjD,wCAAwC,CACzC,CAAC;QAEF,MAAM,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAEvC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,6 +1,6 @@
1
- import type { Router } from "../router.js";
1
+ import type { Hono } from "hono";
2
2
  import type { WebhookRegistry } from "../../webhooks/registry.js";
3
3
  import type { Logger } from "../../shared/logger.js";
4
4
  import type { StatusTracker } from "../../tui/status-tracker.js";
5
- export declare function registerWebhookRoutes(router: Router, registry: WebhookRegistry, webhookSecrets: Record<string, Record<string, string>>, logger: Logger, statusTracker?: StatusTracker): void;
5
+ export declare function registerWebhookRoutes(app: Hono, registry: WebhookRegistry, webhookSecrets: Record<string, Record<string, string>>, logger: Logger, statusTracker?: StatusTracker): void;
6
6
  //# sourceMappingURL=webhooks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../../src/gateway/routes/webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,eAAe,EACzB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACtD,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,aAAa,GAC5B,IAAI,CAsEN"}
1
+ {"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../../src/gateway/routes/webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,IAAI,EACT,QAAQ,EAAE,eAAe,EACzB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACtD,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,aAAa,GAC5B,IAAI,CAmEN"}
@@ -1,30 +1,27 @@
1
- import { readBody, sendJson, sendError } from "../router.js";
2
- export function registerWebhookRoutes(router, registry, webhookSecrets, logger, statusTracker) {
3
- router.post("/webhooks/:source", async (req, res, params) => {
4
- const source = params.source;
1
+ export function registerWebhookRoutes(app, registry, webhookSecrets, logger, statusTracker) {
2
+ app.post("/webhooks/:source", async (c) => {
3
+ const source = c.req.param("source");
5
4
  logger.debug({ source }, "webhook request received");
6
5
  const provider = registry.getProvider(source);
7
6
  if (!provider) {
8
7
  logger.warn({ source }, "webhook rejected: unknown source");
9
8
  statusTracker?.addLogLine("webhook", `Rejected: unknown source "${source}"`);
10
- sendError(res, 404, `unknown webhook source: ${source}`);
11
- return;
9
+ return c.json({ error: `unknown webhook source: ${source}` }, 404);
12
10
  }
13
11
  let rawBody;
14
12
  try {
15
- rawBody = await readBody(req);
13
+ rawBody = await c.req.text();
16
14
  }
17
15
  catch (err) {
18
16
  logger.error({ err, source }, "webhook body read failed");
19
17
  statusTracker?.addLogLine("webhook", `Failed to read body from ${source}: ${err.message}`);
20
- sendError(res, 400, "failed to read request body");
21
- return;
18
+ return c.json({ error: "failed to read request body" }, 400);
22
19
  }
23
20
  logger.debug({ source, bodyLength: rawBody.length }, "webhook body read ok");
24
21
  // Extract headers as a flat map
25
22
  const headers = {};
26
- for (const [key, value] of Object.entries(req.headers)) {
27
- headers[key] = Array.isArray(value) ? value[0] : value;
23
+ for (const [key, value] of c.req.raw.headers.entries()) {
24
+ headers[key] = value;
28
25
  }
29
26
  logger.debug({
30
27
  source,
@@ -40,14 +37,13 @@ export function registerWebhookRoutes(router, registry, webhookSecrets, logger,
40
37
  const errorMsg = result.errors?.[0] || "dispatch failed";
41
38
  logger.warn({ source, status, errors: result.errors }, "webhook dispatch failed");
42
39
  statusTracker?.addLogLine("webhook", `${source}: ${errorMsg}`);
43
- sendError(res, status, errorMsg);
44
- return;
40
+ return c.json({ error: errorMsg }, status);
45
41
  }
46
42
  logger.info({ source, matched: result.matched, skipped: result.skipped }, "webhook dispatched");
47
43
  if (result.matched > 0) {
48
44
  statusTracker?.addLogLine("webhook", `${source}: dispatched to ${result.matched} agent${result.matched !== 1 ? "s" : ""}`);
49
45
  }
50
- sendJson(res, 200, {
46
+ return c.json({
51
47
  ok: true,
52
48
  matched: result.matched,
53
49
  skipped: result.skipped,
@@ -1 +1 @@
1
- {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../../src/gateway/routes/webhooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../../src/gateway/routes/webhooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AgentStatus, SchedulerInfo, LogLine } from "../../tui/status-tracker.js";
2
+ export declare function renderDashboardPage(agents: AgentStatus[], schedulerInfo: SchedulerInfo | null, recentLogs: LogLine[]): string;
3
+ //# sourceMappingURL=dashboard-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-page.d.ts","sourceRoot":"","sources":["../../../src/gateway/views/dashboard-page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAmEvF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,aAAa,EAAE,aAAa,GAAG,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,MAAM,CAwL7H"}