@action-llama/action-llama 0.18.10 → 0.19.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 (227) hide show
  1. package/dist/agents/bash-prefix.d.ts +6 -5
  2. package/dist/agents/bash-prefix.d.ts.map +1 -1
  3. package/dist/agents/bash-prefix.js +26 -10
  4. package/dist/agents/bash-prefix.js.map +1 -1
  5. package/dist/agents/container-entry.d.ts.map +1 -1
  6. package/dist/agents/container-entry.js +16 -158
  7. package/dist/agents/container-entry.js.map +1 -1
  8. package/dist/agents/container-runner.d.ts +19 -1
  9. package/dist/agents/container-runner.d.ts.map +1 -1
  10. package/dist/agents/container-runner.js +176 -85
  11. package/dist/agents/container-runner.js.map +1 -1
  12. package/dist/agents/session-loop.d.ts +22 -0
  13. package/dist/agents/session-loop.d.ts.map +1 -0
  14. package/dist/agents/session-loop.js +159 -0
  15. package/dist/agents/session-loop.js.map +1 -0
  16. package/dist/agents/signals.d.ts.map +1 -1
  17. package/dist/agents/signals.js +7 -1
  18. package/dist/agents/signals.js.map +1 -1
  19. package/dist/agents/types.d.ts +17 -0
  20. package/dist/agents/types.d.ts.map +1 -0
  21. package/dist/agents/types.js +2 -0
  22. package/dist/agents/types.js.map +1 -0
  23. package/dist/build-info.json +1 -1
  24. package/dist/cli/commands/chat.d.ts.map +1 -1
  25. package/dist/cli/commands/chat.js +3 -1
  26. package/dist/cli/commands/chat.js.map +1 -1
  27. package/dist/cli/commands/logs.d.ts +3 -0
  28. package/dist/cli/commands/logs.d.ts.map +1 -1
  29. package/dist/cli/commands/logs.js +100 -19
  30. package/dist/cli/commands/logs.js.map +1 -1
  31. package/dist/cli/commands/run-agent.d.ts.map +1 -1
  32. package/dist/cli/commands/run-agent.js +18 -118
  33. package/dist/cli/commands/run-agent.js.map +1 -1
  34. package/dist/cli/main.js +3 -0
  35. package/dist/cli/main.js.map +1 -1
  36. package/dist/control/routes/dashboard-api.d.ts.map +1 -1
  37. package/dist/control/routes/dashboard-api.js +43 -0
  38. package/dist/control/routes/dashboard-api.js.map +1 -1
  39. package/dist/control/routes/logs.d.ts.map +1 -1
  40. package/dist/control/routes/logs.js +46 -13
  41. package/dist/control/routes/logs.js.map +1 -1
  42. package/dist/control/routes/stats.d.ts.map +1 -1
  43. package/dist/control/routes/stats.js +54 -0
  44. package/dist/control/routes/stats.js.map +1 -1
  45. package/dist/db/connection.d.ts +20 -0
  46. package/dist/db/connection.d.ts.map +1 -0
  47. package/dist/db/connection.js +34 -0
  48. package/dist/db/connection.js.map +1 -0
  49. package/dist/db/index.d.ts +8 -0
  50. package/dist/db/index.d.ts.map +1 -0
  51. package/dist/db/index.js +7 -0
  52. package/dist/db/index.js.map +1 -0
  53. package/dist/db/migrate.d.ts +27 -0
  54. package/dist/db/migrate.d.ts.map +1 -0
  55. package/dist/db/migrate.js +180 -0
  56. package/dist/db/migrate.js.map +1 -0
  57. package/dist/db/schema.d.ts +1383 -0
  58. package/dist/db/schema.d.ts.map +1 -0
  59. package/dist/db/schema.js +158 -0
  60. package/dist/db/schema.js.map +1 -0
  61. package/dist/docker/host-user-runtime.d.ts +1 -0
  62. package/dist/docker/host-user-runtime.d.ts.map +1 -1
  63. package/dist/docker/host-user-runtime.js +3 -0
  64. package/dist/docker/host-user-runtime.js.map +1 -1
  65. package/dist/docker/local-runtime.d.ts +3 -0
  66. package/dist/docker/local-runtime.d.ts.map +1 -1
  67. package/dist/docker/local-runtime.js +18 -1
  68. package/dist/docker/local-runtime.js.map +1 -1
  69. package/dist/docker/runtime.d.ts +8 -0
  70. package/dist/docker/runtime.d.ts.map +1 -1
  71. package/dist/docker/runtime.js.map +1 -1
  72. package/dist/docker/ssh-docker-runtime.d.ts +1 -0
  73. package/dist/docker/ssh-docker-runtime.d.ts.map +1 -1
  74. package/dist/docker/ssh-docker-runtime.js +4 -1
  75. package/dist/docker/ssh-docker-runtime.js.map +1 -1
  76. package/dist/events/event-queue-sqlite.d.ts +8 -3
  77. package/dist/events/event-queue-sqlite.d.ts.map +1 -1
  78. package/dist/events/event-queue-sqlite.js +42 -41
  79. package/dist/events/event-queue-sqlite.js.map +1 -1
  80. package/dist/execution/container-registry.d.ts +8 -0
  81. package/dist/execution/container-registry.d.ts.map +1 -1
  82. package/dist/execution/container-registry.js +11 -0
  83. package/dist/execution/container-registry.js.map +1 -1
  84. package/dist/execution/execution.d.ts +4 -0
  85. package/dist/execution/execution.d.ts.map +1 -1
  86. package/dist/execution/execution.js +13 -3
  87. package/dist/execution/execution.js.map +1 -1
  88. package/dist/execution/image-builder.js +2 -2
  89. package/dist/execution/image-builder.js.map +1 -1
  90. package/dist/frontend/assets/index-BO_q8PRQ.css +2 -0
  91. package/dist/frontend/assets/index-DKQX_6iM.js +13 -0
  92. package/dist/frontend/index.html +2 -2
  93. package/dist/gateway/frontend.d.ts +20 -0
  94. package/dist/gateway/frontend.d.ts.map +1 -0
  95. package/dist/gateway/frontend.js +80 -0
  96. package/dist/gateway/frontend.js.map +1 -0
  97. package/dist/gateway/index.d.ts +3 -70
  98. package/dist/gateway/index.d.ts.map +1 -1
  99. package/dist/gateway/index.js +109 -213
  100. package/dist/gateway/index.js.map +1 -1
  101. package/dist/gateway/middleware/auth.d.ts +12 -0
  102. package/dist/gateway/middleware/auth.d.ts.map +1 -0
  103. package/dist/gateway/middleware/auth.js +25 -0
  104. package/dist/gateway/middleware/auth.js.map +1 -0
  105. package/dist/gateway/middleware/request-logging.d.ts +9 -0
  106. package/dist/gateway/middleware/request-logging.d.ts.map +1 -0
  107. package/dist/gateway/middleware/request-logging.js +26 -0
  108. package/dist/gateway/middleware/request-logging.js.map +1 -0
  109. package/dist/gateway/middleware/telemetry.d.ts +7 -0
  110. package/dist/gateway/middleware/telemetry.d.ts.map +1 -0
  111. package/dist/gateway/middleware/telemetry.js +28 -0
  112. package/dist/gateway/middleware/telemetry.js.map +1 -0
  113. package/dist/gateway/routes/chat.d.ts +32 -0
  114. package/dist/gateway/routes/chat.d.ts.map +1 -0
  115. package/dist/gateway/routes/chat.js +24 -0
  116. package/dist/gateway/routes/chat.js.map +1 -0
  117. package/dist/gateway/routes/dashboard.d.ts +19 -0
  118. package/dist/gateway/routes/dashboard.d.ts.map +1 -0
  119. package/dist/gateway/routes/dashboard.js +26 -0
  120. package/dist/gateway/routes/dashboard.js.map +1 -0
  121. package/dist/gateway/routes/execution.d.ts +24 -0
  122. package/dist/gateway/routes/execution.d.ts.map +1 -0
  123. package/dist/gateway/routes/execution.js +13 -0
  124. package/dist/gateway/routes/execution.js.map +1 -0
  125. package/dist/gateway/routes/system.d.ts +14 -0
  126. package/dist/gateway/routes/system.d.ts.map +1 -0
  127. package/dist/gateway/routes/system.js +18 -0
  128. package/dist/gateway/routes/system.js.map +1 -0
  129. package/dist/gateway/routes/webhooks.d.ts +20 -0
  130. package/dist/gateway/routes/webhooks.d.ts.map +1 -0
  131. package/dist/gateway/routes/webhooks.js +11 -0
  132. package/dist/gateway/routes/webhooks.js.map +1 -0
  133. package/dist/gateway/stores.d.ts +21 -0
  134. package/dist/gateway/stores.d.ts.map +1 -0
  135. package/dist/gateway/stores.js +24 -0
  136. package/dist/gateway/stores.js.map +1 -0
  137. package/dist/gateway/types.d.ts +65 -0
  138. package/dist/gateway/types.d.ts.map +1 -0
  139. package/dist/gateway/types.js +2 -0
  140. package/dist/gateway/types.js.map +1 -0
  141. package/dist/scheduler/dependencies.d.ts +11 -0
  142. package/dist/scheduler/dependencies.d.ts.map +1 -0
  143. package/dist/scheduler/dependencies.js +34 -0
  144. package/dist/scheduler/dependencies.js.map +1 -0
  145. package/dist/scheduler/gateway-setup.d.ts.map +1 -1
  146. package/dist/scheduler/gateway-setup.js +22 -10
  147. package/dist/scheduler/gateway-setup.js.map +1 -1
  148. package/dist/scheduler/index.d.ts +1 -1
  149. package/dist/scheduler/index.d.ts.map +1 -1
  150. package/dist/scheduler/index.js +66 -132
  151. package/dist/scheduler/index.js.map +1 -1
  152. package/dist/scheduler/orphan-recovery.d.ts +25 -0
  153. package/dist/scheduler/orphan-recovery.d.ts.map +1 -0
  154. package/dist/scheduler/orphan-recovery.js +130 -0
  155. package/dist/scheduler/orphan-recovery.js.map +1 -0
  156. package/dist/scheduler/persistence.d.ts +18 -0
  157. package/dist/scheduler/persistence.d.ts.map +1 -0
  158. package/dist/scheduler/persistence.js +42 -0
  159. package/dist/scheduler/persistence.js.map +1 -0
  160. package/dist/scheduler/shutdown.d.ts +2 -0
  161. package/dist/scheduler/shutdown.d.ts.map +1 -1
  162. package/dist/scheduler/shutdown.js +8 -2
  163. package/dist/scheduler/shutdown.js.map +1 -1
  164. package/dist/scheduler/state.d.ts +3 -1
  165. package/dist/scheduler/state.d.ts.map +1 -1
  166. package/dist/shared/config/index.d.ts +5 -0
  167. package/dist/shared/config/index.d.ts.map +1 -0
  168. package/dist/shared/config/index.js +5 -0
  169. package/dist/shared/config/index.js.map +1 -0
  170. package/dist/shared/config/load-agent.d.ts +27 -0
  171. package/dist/shared/config/load-agent.d.ts.map +1 -0
  172. package/dist/shared/config/load-agent.js +169 -0
  173. package/dist/shared/config/load-agent.js.map +1 -0
  174. package/dist/shared/config/load-project.d.ts +22 -0
  175. package/dist/shared/config/load-project.d.ts.map +1 -0
  176. package/dist/shared/config/load-project.js +84 -0
  177. package/dist/shared/config/load-project.js.map +1 -0
  178. package/dist/shared/config/types.d.ts +115 -0
  179. package/dist/shared/config/types.d.ts.map +1 -0
  180. package/dist/shared/config/types.js +2 -0
  181. package/dist/shared/config/types.js.map +1 -0
  182. package/dist/shared/config/validate.d.ts +4 -0
  183. package/dist/shared/config/validate.d.ts.map +1 -0
  184. package/dist/shared/config/validate.js +23 -0
  185. package/dist/shared/config/validate.js.map +1 -0
  186. package/dist/shared/config.d.ts +4 -161
  187. package/dist/shared/config.d.ts.map +1 -1
  188. package/dist/shared/config.js +5 -269
  189. package/dist/shared/config.js.map +1 -1
  190. package/dist/shared/constants.d.ts +4 -0
  191. package/dist/shared/constants.d.ts.map +1 -1
  192. package/dist/shared/constants.js +4 -0
  193. package/dist/shared/constants.js.map +1 -1
  194. package/dist/shared/errors.js +1 -1
  195. package/dist/shared/errors.js.map +1 -1
  196. package/dist/shared/paths.d.ts +6 -0
  197. package/dist/shared/paths.d.ts.map +1 -1
  198. package/dist/shared/paths.js +12 -0
  199. package/dist/shared/paths.js.map +1 -1
  200. package/dist/shared/persistence/backends/sqlite.d.ts +9 -5
  201. package/dist/shared/persistence/backends/sqlite.d.ts.map +1 -1
  202. package/dist/shared/persistence/backends/sqlite.js +107 -135
  203. package/dist/shared/persistence/backends/sqlite.js.map +1 -1
  204. package/dist/shared/queue-sqlite.d.ts +9 -4
  205. package/dist/shared/queue-sqlite.d.ts.map +1 -1
  206. package/dist/shared/queue-sqlite.js +41 -36
  207. package/dist/shared/queue-sqlite.js.map +1 -1
  208. package/dist/shared/state-store-sqlite.d.ts +8 -3
  209. package/dist/shared/state-store-sqlite.d.ts.map +1 -1
  210. package/dist/shared/state-store-sqlite.js +55 -37
  211. package/dist/shared/state-store-sqlite.js.map +1 -1
  212. package/dist/stats/store.d.ts +11 -2
  213. package/dist/stats/store.d.ts.map +1 -1
  214. package/dist/stats/store.js +200 -291
  215. package/dist/stats/store.js.map +1 -1
  216. package/docker/bin/al-bash-init.sh +44 -0
  217. package/package.json +4 -1
  218. package/dist/agents/execution-engine.d.ts +0 -19
  219. package/dist/agents/execution-engine.d.ts.map +0 -1
  220. package/dist/agents/execution-engine.js +0 -179
  221. package/dist/agents/execution-engine.js.map +0 -1
  222. package/dist/agents/runner.d.ts +0 -38
  223. package/dist/agents/runner.d.ts.map +0 -1
  224. package/dist/agents/runner.js +0 -375
  225. package/dist/agents/runner.js.map +0 -1
  226. package/dist/frontend/assets/index-CSIS2n0j.css +0 -2
  227. package/dist/frontend/assets/index-W_Sfmu8j.js +0 -13
@@ -4,8 +4,8 @@
4
4
  <meta charset="utf-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
6
  <title>Action Llama</title>
7
- <script type="module" crossorigin src="/assets/index-W_Sfmu8j.js"></script>
8
- <link rel="stylesheet" crossorigin href="/assets/index-CSIS2n0j.css">
7
+ <script type="module" crossorigin src="/assets/index-DKQX_6iM.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-BO_q8PRQ.css">
9
9
  </head>
10
10
  <body class="bg-white dark:bg-slate-950 text-slate-800 dark:text-slate-200 min-h-screen">
11
11
  <div id="root"></div>
@@ -0,0 +1,20 @@
1
+ import type { Hono } from "hono";
2
+ import type { Logger } from "../shared/logger.js";
3
+ export declare const MIME_TYPES: Record<string, string>;
4
+ /**
5
+ * Attempt to resolve the @action-llama/frontend dist directory.
6
+ * Checks (in order):
7
+ * 1. Bundled frontend at dist/frontend/ (works after npm install)
8
+ * 2. Workspace-linked @action-llama/frontend package (works in monorepo)
9
+ */
10
+ export declare function resolveFrontendDist(): string | null;
11
+ /**
12
+ * Register all frontend SPA serving routes:
13
+ * - /assets/* — Vite-built assets with long-term caching headers
14
+ * - SPA fallback routes for /login, /dashboard, /triggers, /chat
15
+ *
16
+ * Reads index.html once and reuses it for all SPA routes, eliminating
17
+ * the previous duplication where it was read separately for dashboard and chat.
18
+ */
19
+ export declare function registerSpaRoutes(app: Hono, frontendDist: string, logger: Logger): void;
20
+ //# sourceMappingURL=frontend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontend.d.ts","sourceRoot":"","sources":["../../src/gateway/frontend.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAY7C,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAkBnD;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA4BvF"}
@@ -0,0 +1,80 @@
1
+ import { createRequire } from "module";
2
+ import { dirname, resolve, extname } from "path";
3
+ import { fileURLToPath } from "url";
4
+ import { existsSync, readFileSync } from "fs";
5
+ export const MIME_TYPES = {
6
+ ".html": "text/html; charset=utf-8",
7
+ ".js": "text/javascript; charset=utf-8",
8
+ ".css": "text/css; charset=utf-8",
9
+ ".json": "application/json",
10
+ ".svg": "image/svg+xml",
11
+ ".png": "image/png",
12
+ ".ico": "image/x-icon",
13
+ ".woff2": "font/woff2",
14
+ ".woff": "font/woff",
15
+ ".ttf": "font/ttf",
16
+ ".map": "application/json",
17
+ };
18
+ /**
19
+ * Attempt to resolve the @action-llama/frontend dist directory.
20
+ * Checks (in order):
21
+ * 1. Bundled frontend at dist/frontend/ (works after npm install)
22
+ * 2. Workspace-linked @action-llama/frontend package (works in monorepo)
23
+ */
24
+ export function resolveFrontendDist() {
25
+ // Check bundled frontend (copied during build:assets)
26
+ const bundled = resolve(dirname(fileURLToPath(import.meta.url)), "..", "frontend");
27
+ if (existsSync(resolve(bundled, "index.html"))) {
28
+ return bundled;
29
+ }
30
+ // Fall back to workspace-linked package
31
+ try {
32
+ const require = createRequire(import.meta.url);
33
+ const pkgPath = require.resolve("@action-llama/frontend/package.json");
34
+ const distDir = resolve(dirname(pkgPath), "dist");
35
+ if (existsSync(resolve(distDir, "index.html"))) {
36
+ return distDir;
37
+ }
38
+ }
39
+ catch {
40
+ // Package not available
41
+ }
42
+ return null;
43
+ }
44
+ /**
45
+ * Register all frontend SPA serving routes:
46
+ * - /assets/* — Vite-built assets with long-term caching headers
47
+ * - SPA fallback routes for /login, /dashboard, /triggers, /chat
48
+ *
49
+ * Reads index.html once and reuses it for all SPA routes, eliminating
50
+ * the previous duplication where it was read separately for dashboard and chat.
51
+ */
52
+ export function registerSpaRoutes(app, frontendDist, logger) {
53
+ const indexHtml = readFileSync(resolve(frontendDist, "index.html"), "utf-8");
54
+ logger.info({ path: frontendDist }, "Serving frontend from @action-llama/frontend");
55
+ // Serve Vite-built assets (JS, CSS, images) with long-term caching
56
+ app.get("/assets/*", (c) => {
57
+ const filePath = resolve(frontendDist, c.req.path.slice(1));
58
+ if (!filePath.startsWith(frontendDist + "/"))
59
+ return c.notFound();
60
+ try {
61
+ const content = readFileSync(filePath);
62
+ const mime = MIME_TYPES[extname(filePath)] || "application/octet-stream";
63
+ return new Response(content, {
64
+ headers: { "Content-Type": mime, "Cache-Control": "public, max-age=31536000, immutable" },
65
+ });
66
+ }
67
+ catch {
68
+ return c.notFound();
69
+ }
70
+ });
71
+ // SPA fallback routes — all serve index.html for client-side routing
72
+ app.get("/login", (c) => c.html(indexHtml));
73
+ app.get("/dashboard", (c) => c.html(indexHtml));
74
+ app.get("/dashboard/*", (c) => c.html(indexHtml));
75
+ app.get("/triggers", (c) => c.html(indexHtml));
76
+ app.get("/jobs", (c) => c.html(indexHtml));
77
+ app.get("/chat", (c) => c.html(indexHtml));
78
+ app.get("/chat/*", (c) => c.html(indexHtml));
79
+ }
80
+ //# sourceMappingURL=frontend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontend.js","sourceRoot":"","sources":["../../src/gateway/frontend.ts"],"names":[],"mappings":"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"}
@@ -1,72 +1,5 @@
1
- import type { Server } from "http";
2
- import { type CallDispatcher } from "../execution/routes/calls.js";
3
- import { type SignalContext } from "../execution/routes/signals.js";
4
- import { LockStore } from "../execution/lock-store.js";
5
- import { CallStore } from "../execution/call-store.js";
6
- import { ContainerRegistry } from "../execution/container-registry.js";
7
- import type { ContainerRegistration } from "../execution/types.js";
8
- import type { StateStore } from "../shared/state-store.js";
9
- import type { WebhookRegistry } from "../webhooks/registry.js";
10
- import type { Logger } from "../shared/logger.js";
11
- import type { StatusTracker } from "../tui/status-tracker.js";
12
- import type { WebhookSourceConfig } from "../shared/config.js";
13
- import type { ControlRoutesDeps } from "../control/routes/control.js";
14
- import { type ApiKeySource } from "../control/auth.js";
15
- import type { SchedulerEventBus } from "../scheduler/events.js";
16
- import type { StatsStore } from "../stats/store.js";
17
- import { ChatSessionManager } from "../chat/session-manager.js";
18
- import { type ChatWebSocketState } from "../chat/ws-handler.js";
19
- import { type LaunchChatCallback, type StopChatCallback } from "../chat/routes.js";
20
- /**
21
- * Attempt to resolve the @action-llama/frontend dist directory.
22
- * Checks (in order):
23
- * 1. Bundled frontend at dist/frontend/ (works after npm install)
24
- * 2. Workspace-linked @action-llama/frontend package (works in monorepo)
25
- */
26
- export declare function resolveFrontendDist(): string | null;
27
- export type { ContainerRegistration } from "../execution/types.js";
28
- export interface GatewayOptions {
29
- port: number;
30
- hostname?: string;
31
- logger: Logger;
32
- killContainer?: (name: string) => Promise<void>;
33
- webhookRegistry?: WebhookRegistry;
34
- webhookSecrets?: Record<string, Record<string, string>>;
35
- webhookConfigs?: Record<string, WebhookSourceConfig>;
36
- statusTracker?: StatusTracker;
37
- projectPath?: string;
38
- webUI?: boolean;
39
- lockTimeout?: number;
40
- signalContext?: SignalContext;
41
- controlDeps?: ControlRoutesDeps;
42
- /** Static API key string or an async provider that re-reads the key from disk on every auth check, enabling hot-reload of rotated credentials. */
43
- apiKey?: ApiKeySource;
44
- stateStore?: StateStore;
45
- skipStatusEndpoint?: boolean;
46
- /** Optional path to the pre-built frontend dist directory (overrides resolveFrontendDist; useful for testing). */
47
- frontendDistPath?: string;
48
- /** Optional event bus for lifecycle instrumentation. */
49
- events?: SchedulerEventBus;
50
- /** Optional stats store for dashboard aggregate stats. */
51
- statsStore?: StatsStore;
52
- /** Max concurrent chat sessions (default: 5). */
53
- maxChatSessions?: number;
54
- /** Callback to launch a chat container for a session. */
55
- launchChatContainer?: LaunchChatCallback;
56
- /** Callback to stop a chat container for a session. */
57
- stopChatContainer?: StopChatCallback;
58
- }
59
- export interface GatewayServer {
60
- server: Server;
61
- containerRegistry: ContainerRegistry;
62
- registerContainer: (secret: string, reg: ContainerRegistration) => Promise<void>;
63
- unregisterContainer: (secret: string) => Promise<void>;
64
- lockStore: LockStore;
65
- callStore: CallStore;
66
- setCallDispatcher: (dispatcher: CallDispatcher) => void;
67
- close: () => Promise<void>;
68
- chatSessionManager?: ChatSessionManager;
69
- chatWebSocketState?: ChatWebSocketState;
70
- }
1
+ export type { GatewayOptions, GatewayServer, ContainerRegistration } from "./types.js";
2
+ export { resolveFrontendDist } from "./frontend.js";
3
+ import type { GatewayOptions, GatewayServer } from "./types.js";
71
4
  export declare function startGateway(opts: GatewayOptions): Promise<GatewayServer>;
72
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gateway/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gateway/index.ts"],"names":[],"mappings":"AAKA,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAgBhE,wBAAsB,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA2K/E"}
@@ -1,241 +1,126 @@
1
1
  import { Hono } from "hono";
2
2
  import { serve } from "@hono/node-server";
3
- import { createRequire } from "module";
4
- import { dirname, resolve, extname } from "path";
5
- import { fileURLToPath } from "url";
6
- import { existsSync, readFileSync } from "fs";
7
- import { registerShutdownRoute } from "../execution/routes/shutdown.js";
8
- import { registerLockRoutes } from "../execution/routes/locks.js";
9
- import { registerCallRoutes } from "../execution/routes/calls.js";
10
- import { registerWebhookRoutes } from "../events/routes/webhooks.js";
11
- import { registerDashboardDataRoutes } from "../control/routes/dashboard.js";
12
- import { registerAuthApiRoutes, registerDashboardApiRoutes } from "../control/routes/dashboard-api.js";
13
- import { registerSignalRoutes } from "../execution/routes/signals.js";
14
- import { LockStore } from "../execution/lock-store.js";
15
- import { CallStore } from "../execution/call-store.js";
16
- import { ContainerRegistry } from "../execution/container-registry.js";
17
- import { SessionStore } from "../control/session-store.js";
18
- import { withSpan, getTelemetry } from "../telemetry/index.js";
19
- import { SpanKind } from "@opentelemetry/api";
20
- import { authMiddleware } from "../control/auth.js";
21
- import { ChatSessionManager } from "../chat/session-manager.js";
22
- import { attachChatWebSocket } from "../chat/ws-handler.js";
23
- import { registerChatApiRoutes } from "../chat/routes.js";
24
- const MIME_TYPES = {
25
- ".html": "text/html; charset=utf-8",
26
- ".js": "text/javascript; charset=utf-8",
27
- ".css": "text/css; charset=utf-8",
28
- ".json": "application/json",
29
- ".svg": "image/svg+xml",
30
- ".png": "image/png",
31
- ".ico": "image/x-icon",
32
- ".woff2": "font/woff2",
33
- ".woff": "font/woff",
34
- ".ttf": "font/ttf",
35
- ".map": "application/json",
36
- };
37
- /**
38
- * Attempt to resolve the @action-llama/frontend dist directory.
39
- * Checks (in order):
40
- * 1. Bundled frontend at dist/frontend/ (works after npm install)
41
- * 2. Workspace-linked @action-llama/frontend package (works in monorepo)
42
- */
43
- export function resolveFrontendDist() {
44
- // Check bundled frontend (copied during build:assets)
45
- const bundled = resolve(dirname(fileURLToPath(import.meta.url)), "..", "frontend");
46
- if (existsSync(resolve(bundled, "index.html"))) {
47
- return bundled;
48
- }
49
- // Fall back to workspace-linked package
50
- try {
51
- const require = createRequire(import.meta.url);
52
- const pkgPath = require.resolve("@action-llama/frontend/package.json");
53
- const distDir = resolve(dirname(pkgPath), "dist");
54
- if (existsSync(resolve(distDir, "index.html"))) {
55
- return distDir;
56
- }
57
- }
58
- catch {
59
- // Package not available
60
- }
61
- return null;
62
- }
3
+ export { resolveFrontendDist } from "./frontend.js";
4
+ import { createGatewayStores } from "./stores.js";
5
+ import { applyTelemetryMiddleware } from "./middleware/telemetry.js";
6
+ import { applyRequestLoggingMiddleware } from "./middleware/request-logging.js";
7
+ import { applyAuthMiddleware } from "./middleware/auth.js";
8
+ import { registerSystemRoutes } from "./routes/system.js";
9
+ import { registerExecutionRoutes } from "./routes/execution.js";
10
+ import { registerGatewayWebhookRoutes } from "./routes/webhooks.js";
11
+ import { registerDashboardRoutes } from "./routes/dashboard.js";
12
+ import { registerChatRoutes, attachChatWebSocketToServer } from "./routes/chat.js";
13
+ import { resolveFrontendDist, registerSpaRoutes } from "./frontend.js";
63
14
  export async function startGateway(opts) {
64
- const { port, logger, killContainer, webhookRegistry, webhookSecrets, statusTracker, projectPath, webUI, lockTimeout, signalContext, stateStore } = opts;
65
15
  const app = new Hono();
66
- // Create stores backed by the persistent StateStore (if provided).
67
- const containerRegistry = new ContainerRegistry(stateStore);
68
- const lockStore = new LockStore(lockTimeout, undefined, stateStore, {
69
- isHolderAlive: (holder) => containerRegistry.hasInstance(holder),
70
- });
71
- const callStore = new CallStore(undefined, stateStore);
72
16
  let callDispatcher;
73
- // Hydrate in-memory caches from the persistent store.
74
- await containerRegistry.init();
75
- await lockStore.init();
76
- await callStore.init();
77
- // Add telemetry middleware for HTTP requests
78
- const telemetry = getTelemetry();
79
- if (telemetry) {
80
- app.use("*", async (c, next) => {
81
- const spanName = `gateway.${c.req.method.toLowerCase()}_${c.req.path.replace(/\/+/g, "_").replace(/^_|_$/g, "") || "root"}`;
82
- await withSpan(spanName, async (span) => {
83
- span.setAttributes({
84
- "http.method": c.req.method,
85
- "http.url": c.req.url,
86
- "http.path": c.req.path,
87
- "http.user_agent": c.req.header("user-agent") || "",
88
- "gateway.component": "http_server",
89
- });
90
- await next();
91
- span.setAttributes({
92
- "http.status_code": c.res.status,
93
- });
94
- }, {}, SpanKind.SERVER);
95
- });
96
- }
97
- // Request/response logging middleware for command routes.
98
- // Skips /health to avoid noise; logs method, path, status, and duration.
99
- app.use("*", async (c, next) => {
100
- if (c.req.path === "/health") {
101
- await next();
102
- return;
103
- }
104
- const start = Date.now();
105
- logger.debug({ method: c.req.method, path: c.req.path }, "request received");
106
- await next();
107
- const duration = Date.now() - start;
108
- const status = c.res.status;
109
- const logData = { method: c.req.method, path: c.req.path, status, duration };
110
- if (status >= 400) {
111
- logger.warn(logData, "request completed with error");
112
- }
113
- else {
114
- logger.debug(logData, "request completed");
115
- }
17
+ // 1. Create and hydrate stores
18
+ const { containerRegistry, lockStore, callStore, sessionStore } = await createGatewayStores({
19
+ lockTimeout: opts.lockTimeout,
20
+ stateStore: opts.stateStore,
116
21
  });
117
- // Health check
118
- app.get("/health", (c) => c.json({ status: "ok" }));
119
- // Container management routes
120
- const killFn = killContainer || (async () => { });
121
- registerShutdownRoute(app, containerRegistry, killFn, logger);
122
- // Apply auth middleware to protected routes when an API key is configured
22
+ // 2. Apply middleware (order matters: telemetry → logging)
23
+ applyTelemetryMiddleware(app);
24
+ applyRequestLoggingMiddleware(app, opts.logger);
25
+ // 3. Apply auth (if API key configured)
123
26
  if (opts.apiKey) {
124
- const sessionStore = stateStore ? new SessionStore(stateStore) : undefined;
125
- const auth = authMiddleware(opts.apiKey, sessionStore);
126
- app.use("/control/*", auth);
127
- app.use("/dashboard/api/*", auth);
128
- app.use("/locks/status", auth);
129
- app.use("/api/logs/*", auth);
130
- app.use("/api/stats/*", auth);
131
- app.use("/api/dashboard/*", auth);
132
- app.use("/api/auth/check", auth);
133
- app.use("/api/webhooks/*", auth);
134
- // JSON auth endpoints for the SPA (login is unprotected, check is protected)
135
- registerAuthApiRoutes(app, opts.apiKey, sessionStore, opts.hostname);
27
+ applyAuthMiddleware(app, opts.apiKey, sessionStore, opts.hostname);
136
28
  }
137
- registerLockRoutes(app, containerRegistry, lockStore, logger, { skipStatusEndpoint: opts.skipStatusEndpoint, events: opts.events });
138
- registerCallRoutes(app, containerRegistry, callStore, () => callDispatcher, logger, opts.events);
139
- // Signal routes
140
- registerSignalRoutes(app, containerRegistry, logger, statusTracker, signalContext, opts.events);
141
- // Webhook routes
142
- if (webhookRegistry) {
143
- registerWebhookRoutes(app, webhookRegistry, webhookSecrets || {}, opts.webhookConfigs || {}, logger, statusTracker, opts.statsStore);
29
+ // 4. Register system routes (health, shutdown, control)
30
+ registerSystemRoutes(app, {
31
+ containerRegistry,
32
+ killContainer: opts.killContainer,
33
+ logger: opts.logger,
34
+ controlDeps: opts.controlDeps,
35
+ });
36
+ // 5. Register execution routes (locks, calls, signals)
37
+ registerExecutionRoutes(app, {
38
+ containerRegistry,
39
+ lockStore,
40
+ callStore,
41
+ callDispatcherProvider: () => callDispatcher,
42
+ logger: opts.logger,
43
+ statusTracker: opts.statusTracker,
44
+ signalContext: opts.signalContext,
45
+ skipStatusEndpoint: opts.skipStatusEndpoint,
46
+ events: opts.events,
47
+ });
48
+ // 6. Register webhook routes
49
+ if (opts.webhookRegistry) {
50
+ registerGatewayWebhookRoutes(app, {
51
+ webhookRegistry: opts.webhookRegistry,
52
+ webhookSecrets: opts.webhookSecrets || {},
53
+ webhookConfigs: opts.webhookConfigs || {},
54
+ logger: opts.logger,
55
+ statusTracker: opts.statusTracker,
56
+ statsStore: opts.statsStore,
57
+ });
144
58
  }
145
- // Dashboard routes
146
- if (webUI && statusTracker) {
59
+ // 7. Dashboard routes (requires webUI + statusTracker + apiKey)
60
+ if (opts.webUI && opts.statusTracker) {
147
61
  if (!opts.apiKey) {
148
- logger.error("Dashboard UI requested but no API key configured. Dashboard will not be enabled for security.");
62
+ opts.logger.error("Dashboard UI requested but no API key configured. Dashboard will not be enabled for security.");
149
63
  }
150
64
  else {
151
- // Data routes (SSE stream, locks)
152
- registerDashboardDataRoutes(app, statusTracker);
153
- // JSON API routes for the React SPA
154
- registerDashboardApiRoutes(app, statusTracker, projectPath, opts.statsStore);
155
- // Serve the React SPA frontend
156
- const frontendDist = opts.frontendDistPath ?? resolveFrontendDist();
157
- if (frontendDist) {
158
- logger.info({ path: frontendDist }, "Serving frontend from @action-llama/frontend");
159
- const indexHtml = readFileSync(resolve(frontendDist, "index.html"), "utf-8");
160
- // Serve Vite-built assets (JS, CSS, images) with long-term caching
161
- app.get("/assets/*", (c) => {
162
- const filePath = resolve(frontendDist, c.req.path.slice(1));
163
- if (!filePath.startsWith(frontendDist + "/"))
164
- return c.notFound();
165
- try {
166
- const content = readFileSync(filePath);
167
- const mime = MIME_TYPES[extname(filePath)] || "application/octet-stream";
168
- return new Response(content, {
169
- headers: { "Content-Type": mime, "Cache-Control": "public, max-age=31536000, immutable" },
170
- });
171
- }
172
- catch {
173
- return c.notFound();
174
- }
175
- });
176
- // SPA fallback: serve index.html for all frontend routes
177
- app.get("/login", (c) => c.html(indexHtml));
178
- app.get("/dashboard", (c) => c.html(indexHtml));
179
- app.get("/dashboard/*", (c) => c.html(indexHtml));
180
- }
181
- else {
182
- logger.warn("@action-llama/frontend not found — dashboard UI will not be served. API routes are still available.");
183
- }
184
- app.get("/", (c) => c.redirect("/dashboard"));
185
- }
186
- }
187
- // Chat WebSocket and API routes
188
- let chatSessionManager;
189
- let chatWsState;
190
- if (webUI && opts.apiKey) {
191
- chatSessionManager = new ChatSessionManager(opts.maxChatSessions);
192
- const noopLaunch = async () => { };
193
- const noopStop = async () => { };
194
- // Apply auth middleware to chat API routes
195
- const sessionStore = stateStore ? new SessionStore(stateStore) : undefined;
196
- const chatAuth = authMiddleware(opts.apiKey, sessionStore);
197
- app.use("/api/chat/*", chatAuth);
198
- registerChatApiRoutes(app, chatSessionManager, opts.launchChatContainer || noopLaunch, opts.stopChatContainer || noopStop, logger);
199
- // SPA fallback for /chat/* routes
200
- const frontendDist2 = opts.frontendDistPath ?? resolveFrontendDist();
201
- if (frontendDist2) {
202
- const indexHtml2 = readFileSync(resolve(frontendDist2, "index.html"), "utf-8");
203
- app.get("/chat", (c) => c.html(indexHtml2));
204
- app.get("/chat/*", (c) => c.html(indexHtml2));
65
+ await registerDashboardRoutes(app, {
66
+ statusTracker: opts.statusTracker,
67
+ projectPath: opts.projectPath,
68
+ apiKey: opts.apiKey,
69
+ statsStore: opts.statsStore,
70
+ logger: opts.logger,
71
+ });
205
72
  }
206
73
  }
207
- // Log API routes — only register if auth is configured for security
208
- if (projectPath && opts.apiKey) {
74
+ else if (opts.projectPath && opts.apiKey) {
75
+ // Log + stats routes without dashboard UI (edge case: apiKey but no webUI)
209
76
  const { registerLogRoutes } = await import("../control/routes/logs.js");
210
- registerLogRoutes(app, projectPath);
211
- }
212
- else if (projectPath && !opts.apiKey) {
213
- logger.warn("Log API routes disabled — gateway API key required for security.");
214
- }
215
- // Stats API routes — only register if auth is configured for security
216
- if (opts.apiKey) {
77
+ registerLogRoutes(app, opts.projectPath);
217
78
  const { registerStatsRoutes } = await import("../control/routes/stats.js");
218
79
  registerStatsRoutes(app, opts.statsStore, opts.statusTracker);
219
80
  }
220
- // Control routes (for kill, pause, resume commands)
221
- if (opts.controlDeps) {
222
- const { registerControlRoutes } = await import("../control/routes/control.js");
223
- registerControlRoutes(app, opts.controlDeps);
81
+ else if (opts.projectPath && !opts.apiKey) {
82
+ opts.logger.warn("Log API routes disabled — gateway API key required for security.");
224
83
  }
84
+ // 8. Chat routes (requires webUI + apiKey)
85
+ let chatSessionManager;
86
+ if (opts.webUI && opts.apiKey) {
87
+ const chatSetup = registerChatRoutes(app, {
88
+ maxChatSessions: opts.maxChatSessions,
89
+ launchChatContainer: opts.launchChatContainer,
90
+ stopChatContainer: opts.stopChatContainer,
91
+ logger: opts.logger,
92
+ });
93
+ chatSessionManager = chatSetup.chatSessionManager;
94
+ }
95
+ // 9. Frontend SPA serving (resolve once, serve everywhere)
96
+ const frontendDist = opts.frontendDistPath ?? resolveFrontendDist();
97
+ if (frontendDist && opts.webUI && opts.apiKey) {
98
+ registerSpaRoutes(app, frontendDist, opts.logger);
99
+ }
100
+ else if (opts.webUI && opts.apiKey && !frontendDist) {
101
+ opts.logger.warn("@action-llama/frontend not found — dashboard UI will not be served. API routes are still available.");
102
+ }
103
+ // 10. Start HTTP server
225
104
  const server = serve({
226
105
  fetch: app.fetch,
227
- port,
106
+ port: opts.port,
228
107
  hostname: opts.hostname || "127.0.0.1",
229
108
  });
230
109
  await new Promise((resolve) => {
231
110
  server.on("listening", resolve);
232
111
  });
233
- // Attach chat WebSocket handler to the raw HTTP server
112
+ // 11. Attach chat WebSocket to the raw HTTP server (needs live server)
113
+ let chatWsState;
234
114
  if (chatSessionManager && opts.apiKey) {
235
- const sessionStoreForWs = stateStore ? new SessionStore(stateStore) : undefined;
236
- chatWsState = attachChatWebSocket(server, chatSessionManager, opts.apiKey, sessionStoreForWs, logger);
115
+ chatWsState = attachChatWebSocketToServer(server, {
116
+ chatSessionManager,
117
+ apiKey: opts.apiKey,
118
+ sessionStore,
119
+ logger: opts.logger,
120
+ });
237
121
  }
238
- logger.info({ port }, "Gateway server listening");
122
+ opts.logger.info({ port: opts.port }, "Gateway server listening");
123
+ // Closures over local state for container/call management
239
124
  const registerContainer = async (secret, reg) => {
240
125
  await containerRegistry.register(secret, reg);
241
126
  };
@@ -244,11 +129,11 @@ export async function startGateway(opts) {
244
129
  if (reg) {
245
130
  const released = lockStore.releaseAll(reg.instanceId);
246
131
  if (released > 0) {
247
- logger.info({ agent: reg.agentName, instance: reg.instanceId, released }, "released locks on container cleanup");
132
+ opts.logger.info({ agent: reg.agentName, instance: reg.instanceId, released }, "released locks on container cleanup");
248
133
  }
249
134
  const failedCalls = callStore.failAllByCaller(reg.instanceId);
250
135
  if (failedCalls > 0) {
251
- logger.info({ agent: reg.agentName, instance: reg.instanceId, failedCalls }, "failed pending calls on container cleanup");
136
+ opts.logger.info({ agent: reg.agentName, instance: reg.instanceId, failedCalls }, "failed pending calls on container cleanup");
252
137
  }
253
138
  }
254
139
  await containerRegistry.unregister(secret);
@@ -264,6 +149,17 @@ export async function startGateway(opts) {
264
149
  callStore.dispose();
265
150
  server.close(() => resolve());
266
151
  });
267
- return { server, containerRegistry, registerContainer, unregisterContainer, lockStore, callStore, setCallDispatcher, close, chatSessionManager, chatWebSocketState: chatWsState };
152
+ return {
153
+ server,
154
+ containerRegistry,
155
+ registerContainer,
156
+ unregisterContainer,
157
+ lockStore,
158
+ callStore,
159
+ setCallDispatcher,
160
+ close,
161
+ chatSessionManager,
162
+ chatWebSocketState: chatWsState,
163
+ };
268
164
  }
269
165
  //# sourceMappingURL=index.js.map
@@ -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":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Hono } from "hono";
2
+ import { type ApiKeySource } from "../../control/auth.js";
3
+ import type { SessionStore } from "../../control/session-store.js";
4
+ /**
5
+ * Apply authentication middleware to all protected routes and register
6
+ * the auth API endpoints (login/logout/check).
7
+ *
8
+ * The SessionStore is passed in (created once in stores.ts) and shared
9
+ * between the auth middleware, chat auth, and chat WebSocket handler.
10
+ */
11
+ export declare function applyAuthMiddleware(app: Hono, apiKey: ApiKeySource, sessionStore: SessionStore | undefined, hostname?: string): void;
12
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/gateway/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAEnE;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,YAAY,GAAG,SAAS,EACtC,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI,CAgBN"}