@action-llama/action-llama 0.10.2 → 0.11.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 (257) hide show
  1. package/AGENTS.md +17 -6
  2. package/README.md +8 -4
  3. package/dist/agents/container-entry.d.ts.map +1 -1
  4. package/dist/agents/container-entry.js +37 -0
  5. package/dist/agents/container-entry.js.map +1 -1
  6. package/dist/agents/container-runner.d.ts +4 -0
  7. package/dist/agents/container-runner.d.ts.map +1 -1
  8. package/dist/agents/container-runner.js +82 -5
  9. package/dist/agents/container-runner.js.map +1 -1
  10. package/dist/agents/execution-engine.d.ts +2 -0
  11. package/dist/agents/execution-engine.d.ts.map +1 -1
  12. package/dist/agents/execution-engine.js +5 -1
  13. package/dist/agents/execution-engine.js.map +1 -1
  14. package/dist/agents/runner.d.ts +3 -0
  15. package/dist/agents/runner.d.ts.map +1 -1
  16. package/dist/agents/runner.js +45 -2
  17. package/dist/agents/runner.js.map +1 -1
  18. package/dist/cli/commands/chat.d.ts +5 -2
  19. package/dist/cli/commands/chat.d.ts.map +1 -1
  20. package/dist/cli/commands/chat.js +240 -23
  21. package/dist/cli/commands/chat.js.map +1 -1
  22. package/dist/cli/commands/cloud-deploy.d.ts.map +1 -1
  23. package/dist/cli/commands/cloud-deploy.js +5 -47
  24. package/dist/cli/commands/cloud-deploy.js.map +1 -1
  25. package/dist/cli/commands/cloud-setup.d.ts.map +1 -1
  26. package/dist/cli/commands/cloud-setup.js +20 -33
  27. package/dist/cli/commands/cloud-setup.js.map +1 -1
  28. package/dist/cli/commands/cloud-teardown.d.ts.map +1 -1
  29. package/dist/cli/commands/cloud-teardown.js +6 -126
  30. package/dist/cli/commands/cloud-teardown.js.map +1 -1
  31. package/dist/cli/commands/doctor.d.ts +0 -1
  32. package/dist/cli/commands/doctor.d.ts.map +1 -1
  33. package/dist/cli/commands/doctor.js +19 -14
  34. package/dist/cli/commands/doctor.js.map +1 -1
  35. package/dist/cli/commands/kill.d.ts +1 -1
  36. package/dist/cli/commands/kill.d.ts.map +1 -1
  37. package/dist/cli/commands/kill.js +17 -6
  38. package/dist/cli/commands/kill.js.map +1 -1
  39. package/dist/cli/commands/logs.d.ts.map +1 -1
  40. package/dist/cli/commands/logs.js +104 -58
  41. package/dist/cli/commands/logs.js.map +1 -1
  42. package/dist/cli/commands/pause.d.ts +1 -1
  43. package/dist/cli/commands/pause.d.ts.map +1 -1
  44. package/dist/cli/commands/pause.js +9 -6
  45. package/dist/cli/commands/pause.js.map +1 -1
  46. package/dist/cli/commands/resume.d.ts +1 -1
  47. package/dist/cli/commands/resume.d.ts.map +1 -1
  48. package/dist/cli/commands/resume.js +9 -6
  49. package/dist/cli/commands/resume.js.map +1 -1
  50. package/dist/cli/commands/run.d.ts.map +1 -1
  51. package/dist/cli/commands/run.js +12 -54
  52. package/dist/cli/commands/run.js.map +1 -1
  53. package/dist/cli/commands/status.d.ts.map +1 -1
  54. package/dist/cli/commands/status.js +22 -39
  55. package/dist/cli/commands/status.js.map +1 -1
  56. package/dist/cli/gateway-client.d.ts +12 -0
  57. package/dist/cli/gateway-client.d.ts.map +1 -0
  58. package/dist/cli/gateway-client.js +27 -0
  59. package/dist/cli/gateway-client.js.map +1 -0
  60. package/dist/cli/main.js +49 -14
  61. package/dist/cli/main.js.map +1 -1
  62. package/dist/{shared/aws-constants.d.ts → cloud/aws/constants.d.ts} +3 -34
  63. package/dist/cloud/aws/constants.d.ts.map +1 -0
  64. package/dist/{shared/aws-constants.js → cloud/aws/constants.js} +3 -34
  65. package/dist/cloud/aws/constants.js.map +1 -0
  66. package/dist/cloud/{deploy-apprunner.d.ts → aws/deploy.d.ts} +6 -6
  67. package/dist/cloud/aws/deploy.d.ts.map +1 -0
  68. package/dist/cloud/{deploy-apprunner.js → aws/deploy.js} +2 -2
  69. package/dist/cloud/aws/deploy.js.map +1 -0
  70. package/dist/cloud/aws/iam.d.ts +37 -0
  71. package/dist/cloud/aws/iam.d.ts.map +1 -0
  72. package/dist/{cli/commands/cloud-iam.js → cloud/aws/iam.js} +30 -179
  73. package/dist/cloud/aws/iam.js.map +1 -0
  74. package/dist/cloud/aws/provider.d.ts +69 -0
  75. package/dist/cloud/aws/provider.d.ts.map +1 -0
  76. package/dist/cloud/aws/provider.js +173 -0
  77. package/dist/cloud/aws/provider.js.map +1 -0
  78. package/dist/cloud/aws/provision.d.ts +9 -0
  79. package/dist/cloud/aws/provision.d.ts.map +1 -0
  80. package/dist/{cli/commands/cloud-setup-ecs.js → cloud/aws/provision.js} +10 -9
  81. package/dist/cloud/aws/provision.js.map +1 -0
  82. package/dist/cloud/aws/teardown.d.ts +15 -0
  83. package/dist/cloud/aws/teardown.d.ts.map +1 -0
  84. package/dist/cloud/aws/teardown.js +74 -0
  85. package/dist/cloud/aws/teardown.js.map +1 -0
  86. package/dist/cloud/gcp/constants.d.ts +16 -0
  87. package/dist/cloud/gcp/constants.d.ts.map +1 -0
  88. package/dist/cloud/gcp/constants.js +16 -0
  89. package/dist/cloud/gcp/constants.js.map +1 -0
  90. package/dist/cloud/{deploy-cloudrun.d.ts → gcp/deploy.d.ts} +6 -6
  91. package/dist/cloud/gcp/deploy.d.ts.map +1 -0
  92. package/dist/cloud/{deploy-cloudrun.js → gcp/deploy.js} +7 -7
  93. package/dist/cloud/gcp/deploy.js.map +1 -0
  94. package/dist/cloud/gcp/iam.d.ts +20 -0
  95. package/dist/cloud/gcp/iam.d.ts.map +1 -0
  96. package/dist/cloud/gcp/iam.js +179 -0
  97. package/dist/cloud/gcp/iam.js.map +1 -0
  98. package/dist/cloud/gcp/provider.d.ts +28 -0
  99. package/dist/cloud/gcp/provider.d.ts.map +1 -0
  100. package/dist/cloud/gcp/provider.js +84 -0
  101. package/dist/cloud/gcp/provider.js.map +1 -0
  102. package/dist/cloud/gcp/provision.d.ts +14 -0
  103. package/dist/cloud/gcp/provision.d.ts.map +1 -0
  104. package/dist/cloud/gcp/provision.js +37 -0
  105. package/dist/cloud/gcp/provision.js.map +1 -0
  106. package/dist/cloud/gcp/teardown.d.ts +12 -0
  107. package/dist/cloud/gcp/teardown.d.ts.map +1 -0
  108. package/dist/cloud/gcp/teardown.js +67 -0
  109. package/dist/cloud/gcp/teardown.js.map +1 -0
  110. package/dist/cloud/image-builder.d.ts.map +1 -1
  111. package/dist/cloud/image-builder.js +115 -18
  112. package/dist/cloud/image-builder.js.map +1 -1
  113. package/dist/cloud/provider.d.ts +57 -0
  114. package/dist/cloud/provider.d.ts.map +1 -0
  115. package/dist/cloud/provider.js +21 -0
  116. package/dist/cloud/provider.js.map +1 -0
  117. package/dist/cloud/scheduler-image.d.ts.map +1 -1
  118. package/dist/cloud/scheduler-image.js +16 -3
  119. package/dist/cloud/scheduler-image.js.map +1 -1
  120. package/dist/cloud/state.d.ts +17 -0
  121. package/dist/cloud/state.d.ts.map +1 -0
  122. package/dist/cloud/state.js +48 -0
  123. package/dist/cloud/state.js.map +1 -0
  124. package/dist/docker/aws-shared.d.ts +6 -4
  125. package/dist/docker/aws-shared.d.ts.map +1 -1
  126. package/dist/docker/aws-shared.js +405 -23
  127. package/dist/docker/aws-shared.js.map +1 -1
  128. package/dist/docker/cloud-run-runtime.d.ts.map +1 -1
  129. package/dist/docker/cloud-run-runtime.js +10 -9
  130. package/dist/docker/cloud-run-runtime.js.map +1 -1
  131. package/dist/docker/ecs-runtime.d.ts +3 -1
  132. package/dist/docker/ecs-runtime.d.ts.map +1 -1
  133. package/dist/docker/ecs-runtime.js +78 -29
  134. package/dist/docker/ecs-runtime.js.map +1 -1
  135. package/dist/docker/image.d.ts +7 -0
  136. package/dist/docker/image.d.ts.map +1 -1
  137. package/dist/docker/image.js +31 -4
  138. package/dist/docker/image.js.map +1 -1
  139. package/dist/docker/lambda-runtime.js +1 -1
  140. package/dist/docker/lambda-runtime.js.map +1 -1
  141. package/dist/docker/local-runtime.js +4 -4
  142. package/dist/docker/local-runtime.js.map +1 -1
  143. package/dist/docker/network.d.ts.map +1 -1
  144. package/dist/docker/network.js +2 -2
  145. package/dist/docker/network.js.map +1 -1
  146. package/dist/docker/runtime.d.ts +23 -0
  147. package/dist/docker/runtime.d.ts.map +1 -1
  148. package/dist/gateway/api-key.d.ts +10 -0
  149. package/dist/gateway/api-key.d.ts.map +1 -0
  150. package/dist/gateway/api-key.js +19 -0
  151. package/dist/gateway/api-key.js.map +1 -0
  152. package/dist/gateway/auth.d.ts +16 -0
  153. package/dist/gateway/auth.d.ts.map +1 -0
  154. package/dist/gateway/auth.js +60 -0
  155. package/dist/gateway/auth.js.map +1 -0
  156. package/dist/gateway/index.d.ts +1 -0
  157. package/dist/gateway/index.d.ts.map +1 -1
  158. package/dist/gateway/index.js +33 -2
  159. package/dist/gateway/index.js.map +1 -1
  160. package/dist/gateway/routes/control.d.ts +6 -0
  161. package/dist/gateway/routes/control.d.ts.map +1 -1
  162. package/dist/gateway/routes/control.js +117 -0
  163. package/dist/gateway/routes/control.js.map +1 -1
  164. package/dist/gateway/routes/dashboard.d.ts +1 -1
  165. package/dist/gateway/routes/dashboard.d.ts.map +1 -1
  166. package/dist/gateway/routes/dashboard.js +144 -53
  167. package/dist/gateway/routes/dashboard.js.map +1 -1
  168. package/dist/gateway/views/dashboard-page.d.ts.map +1 -1
  169. package/dist/gateway/views/dashboard-page.js +93 -20
  170. package/dist/gateway/views/dashboard-page.js.map +1 -1
  171. package/dist/gateway/views/login-page.d.ts +2 -0
  172. package/dist/gateway/views/login-page.d.ts.map +1 -0
  173. package/dist/gateway/views/login-page.js +54 -0
  174. package/dist/gateway/views/login-page.js.map +1 -0
  175. package/dist/scheduler/index.d.ts.map +1 -1
  176. package/dist/scheduler/index.js +154 -36
  177. package/dist/scheduler/index.js.map +1 -1
  178. package/dist/scheduler/runner-pool.d.ts +5 -0
  179. package/dist/scheduler/runner-pool.d.ts.map +1 -1
  180. package/dist/scheduler/runner-pool.js +14 -0
  181. package/dist/scheduler/runner-pool.js.map +1 -1
  182. package/dist/scheduler/runtime-factory.d.ts +2 -0
  183. package/dist/scheduler/runtime-factory.d.ts.map +1 -1
  184. package/dist/scheduler/runtime-factory.js +35 -65
  185. package/dist/scheduler/runtime-factory.js.map +1 -1
  186. package/dist/setup/scaffold.d.ts.map +1 -1
  187. package/dist/setup/scaffold.js +25 -0
  188. package/dist/setup/scaffold.js.map +1 -1
  189. package/dist/shared/asm-backend.d.ts.map +1 -1
  190. package/dist/shared/asm-backend.js +2 -2
  191. package/dist/shared/asm-backend.js.map +1 -1
  192. package/dist/shared/config.d.ts +28 -13
  193. package/dist/shared/config.d.ts.map +1 -1
  194. package/dist/shared/config.js +40 -4
  195. package/dist/shared/config.js.map +1 -1
  196. package/dist/shared/constants.d.ts +34 -0
  197. package/dist/shared/constants.d.ts.map +1 -0
  198. package/dist/shared/constants.js +34 -0
  199. package/dist/shared/constants.js.map +1 -0
  200. package/dist/shared/credential-backend.d.ts +1 -1
  201. package/dist/shared/filesystem-backend.d.ts +1 -1
  202. package/dist/shared/filesystem-backend.js +1 -1
  203. package/dist/shared/gsm-backend.d.ts.map +1 -1
  204. package/dist/shared/gsm-backend.js +2 -2
  205. package/dist/shared/gsm-backend.js.map +1 -1
  206. package/dist/shared/paths.d.ts +2 -0
  207. package/dist/shared/paths.d.ts.map +1 -1
  208. package/dist/shared/paths.js +3 -1
  209. package/dist/shared/paths.js.map +1 -1
  210. package/dist/shared/remote.d.ts +1 -0
  211. package/dist/shared/remote.d.ts.map +1 -1
  212. package/dist/shared/remote.js +4 -16
  213. package/dist/shared/remote.js.map +1 -1
  214. package/dist/shared/usage.d.ts +22 -0
  215. package/dist/shared/usage.d.ts.map +1 -0
  216. package/dist/shared/usage.js +43 -0
  217. package/dist/shared/usage.js.map +1 -0
  218. package/dist/telemetry/index.d.ts +57 -0
  219. package/dist/telemetry/index.d.ts.map +1 -0
  220. package/dist/telemetry/index.js +189 -0
  221. package/dist/telemetry/index.js.map +1 -0
  222. package/dist/telemetry/providers/otel.d.ts +15 -0
  223. package/dist/telemetry/providers/otel.d.ts.map +1 -0
  224. package/dist/telemetry/providers/otel.js +77 -0
  225. package/dist/telemetry/providers/otel.js.map +1 -0
  226. package/dist/telemetry/providers/xray.d.ts +13 -0
  227. package/dist/telemetry/providers/xray.d.ts.map +1 -0
  228. package/dist/telemetry/providers/xray.js +33 -0
  229. package/dist/telemetry/providers/xray.js.map +1 -0
  230. package/dist/telemetry/types.d.ts +59 -0
  231. package/dist/telemetry/types.d.ts.map +1 -0
  232. package/dist/telemetry/types.js +2 -0
  233. package/dist/telemetry/types.js.map +1 -0
  234. package/dist/tui/App.d.ts.map +1 -1
  235. package/dist/tui/App.js +2 -0
  236. package/dist/tui/App.js.map +1 -1
  237. package/dist/tui/plain-logger.d.ts.map +1 -1
  238. package/dist/tui/plain-logger.js +8 -2
  239. package/dist/tui/plain-logger.js.map +1 -1
  240. package/dist/tui/status-tracker.d.ts +4 -1
  241. package/dist/tui/status-tracker.d.ts.map +1 -1
  242. package/dist/tui/status-tracker.js +11 -1
  243. package/dist/tui/status-tracker.js.map +1 -1
  244. package/docker/adot-collector-config.yaml +57 -0
  245. package/package.json +9 -1
  246. package/dist/cli/commands/cloud-iam.d.ts +0 -17
  247. package/dist/cli/commands/cloud-iam.d.ts.map +0 -1
  248. package/dist/cli/commands/cloud-iam.js.map +0 -1
  249. package/dist/cli/commands/cloud-setup-ecs.d.ts +0 -9
  250. package/dist/cli/commands/cloud-setup-ecs.d.ts.map +0 -1
  251. package/dist/cli/commands/cloud-setup-ecs.js.map +0 -1
  252. package/dist/cloud/deploy-apprunner.d.ts.map +0 -1
  253. package/dist/cloud/deploy-apprunner.js.map +0 -1
  254. package/dist/cloud/deploy-cloudrun.d.ts.map +0 -1
  255. package/dist/cloud/deploy-cloudrun.js.map +0 -1
  256. package/dist/shared/aws-constants.d.ts.map +0 -1
  257. package/dist/shared/aws-constants.js.map +0 -1
@@ -0,0 +1,84 @@
1
+ /**
2
+ * GcpCloudProvider — CloudProvider implementation for GCP Cloud Run.
3
+ *
4
+ * Wraps CloudRunCloudConfig and delegates to the extracted GCP modules
5
+ * (iam, provision, teardown, deploy) and the CloudRunJobRuntime.
6
+ */
7
+ import { CloudRunJobRuntime } from "../../docker/cloud-run-runtime.js";
8
+ import { CONSTANTS } from "../../shared/constants.js";
9
+ export class GcpCloudProvider {
10
+ providerName = "cloud-run";
11
+ config;
12
+ constructor(config) {
13
+ this.config = config;
14
+ }
15
+ async provision() {
16
+ const { setupGcpCloud } = await import("./provision.js");
17
+ return setupGcpCloud();
18
+ }
19
+ async teardown(projectPath) {
20
+ const { teardownGcp } = await import("./teardown.js");
21
+ await teardownGcp(projectPath, this.config);
22
+ }
23
+ async reconcileAgents(projectPath) {
24
+ const { reconcileGcpAgents } = await import("./iam.js");
25
+ await reconcileGcpAgents(projectPath, this.config);
26
+ }
27
+ async validateRoles(_projectPath) {
28
+ // No-op for GCP — no equivalent to ECS role validation.
29
+ // GCP service accounts are validated implicitly at execution time.
30
+ }
31
+ createRuntime() {
32
+ return new CloudRunJobRuntime({
33
+ gcpProject: this.config.gcpProject,
34
+ region: this.config.region,
35
+ artifactRegistry: this.config.artifactRegistry,
36
+ serviceAccount: this.config.serviceAccount,
37
+ secretPrefix: this.config.secretPrefix ?? CONSTANTS.DEFAULT_SECRET_PREFIX,
38
+ });
39
+ }
40
+ createAgentRuntime(_agentConfig, _globalConfig) {
41
+ // GCP has no Lambda-style routing — always use Cloud Run Jobs
42
+ return this.createRuntime();
43
+ }
44
+ createRuntimes(_activeAgentConfigs, _globalConfig) {
45
+ return {
46
+ runtime: this.createRuntime(),
47
+ agentRuntimeOverrides: {},
48
+ };
49
+ }
50
+ async createCredentialBackend() {
51
+ const { GoogleSecretManagerBackend } = await import("../../shared/gsm-backend.js");
52
+ return new GoogleSecretManagerBackend(this.config.gcpProject, this.config.secretPrefix ?? CONSTANTS.DEFAULT_SECRET_PREFIX);
53
+ }
54
+ async deployScheduler(imageUri) {
55
+ const { deployCloudRun } = await import("./deploy.js");
56
+ const result = await deployCloudRun({
57
+ imageUri,
58
+ cloudConfig: this.config,
59
+ });
60
+ return {
61
+ serviceUrl: result.serviceUrl,
62
+ status: result.status,
63
+ };
64
+ }
65
+ async getSchedulerStatus() {
66
+ const { getCloudRunStatus } = await import("./deploy.js");
67
+ const result = await getCloudRunStatus(this.config);
68
+ if (!result)
69
+ return null;
70
+ return {
71
+ serviceUrl: result.serviceUrl,
72
+ status: result.status,
73
+ };
74
+ }
75
+ async getSchedulerLogs(limit) {
76
+ const { getCloudRunLogs } = await import("./deploy.js");
77
+ return getCloudRunLogs(this.config, limit);
78
+ }
79
+ async teardownScheduler() {
80
+ const { teardownCloudRunService } = await import("./deploy.js");
81
+ await teardownCloudRunService(this.config);
82
+ }
83
+ }
84
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/cloud/gcp/provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * GCP Cloud Run interactive provisioning wizard.
3
+ *
4
+ * Prompts for GCP-specific configuration fields and returns them
5
+ * as a record to be written into config.toml's [cloud] section.
6
+ */
7
+ /**
8
+ * Prompt for GCP Cloud Run configuration fields.
9
+ *
10
+ * Returns the populated config fields as a Record to be merged
11
+ * into the [cloud] section of config.toml.
12
+ */
13
+ export declare function setupGcpCloud(partial?: Record<string, unknown>): Promise<Record<string, unknown>>;
14
+ //# sourceMappingURL=provision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provision.d.ts","sourceRoot":"","sources":["../../../src/cloud/gcp/provision.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACpC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA0BlC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * GCP Cloud Run interactive provisioning wizard.
3
+ *
4
+ * Prompts for GCP-specific configuration fields and returns them
5
+ * as a record to be written into config.toml's [cloud] section.
6
+ */
7
+ import { input } from "@inquirer/prompts";
8
+ import { GCP_CONSTANTS } from "./constants.js";
9
+ import { CONSTANTS } from "../../shared/constants.js";
10
+ /**
11
+ * Prompt for GCP Cloud Run configuration fields.
12
+ *
13
+ * Returns the populated config fields as a Record to be merged
14
+ * into the [cloud] section of config.toml.
15
+ */
16
+ export async function setupGcpCloud(partial = {}) {
17
+ const config = { ...partial, provider: "cloud-run" };
18
+ config.gcpProject = await input({ message: "GCP project ID:" });
19
+ config.region = await input({ message: "Region:", default: "us-central1" });
20
+ config.artifactRegistry = await input({
21
+ message: "Artifact Registry repo:",
22
+ default: `${config.region}-docker.pkg.dev/${config.gcpProject}/al-images`,
23
+ });
24
+ config.serviceAccount = await input({
25
+ message: "Service account email (for job creation):",
26
+ default: GCP_CONSTANTS.defaultGcpRunner(config.gcpProject),
27
+ });
28
+ const prefix = await input({
29
+ message: "Secret prefix:",
30
+ default: CONSTANTS.DEFAULT_SECRET_PREFIX,
31
+ });
32
+ if (prefix !== CONSTANTS.DEFAULT_SECRET_PREFIX) {
33
+ config.secretPrefix = prefix;
34
+ }
35
+ return config;
36
+ }
37
+ //# sourceMappingURL=provision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provision.js","sourceRoot":"","sources":["../../../src/cloud/gcp/provision.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAmC,EAAE;IAErC,MAAM,MAAM,GAA4B,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IAE9E,MAAM,CAAC,UAAU,GAAG,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAEhE,MAAM,CAAC,MAAM,GAAG,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;IAE5E,MAAM,CAAC,gBAAgB,GAAG,MAAM,KAAK,CAAC;QACpC,OAAO,EAAE,yBAAyB;QAClC,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,mBAAmB,MAAM,CAAC,UAAU,YAAY;KAC1E,CAAC,CAAC;IAEH,MAAM,CAAC,cAAc,GAAG,MAAM,KAAK,CAAC;QAClC,OAAO,EAAE,2CAA2C;QACpD,OAAO,EAAE,aAAa,CAAC,gBAAgB,CAAC,MAAM,CAAC,UAAoB,CAAC;KACrE,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC;QACzB,OAAO,EAAE,gBAAgB;QACzB,OAAO,EAAE,SAAS,CAAC,qBAAqB;KACzC,CAAC,CAAC;IACH,IAAI,MAAM,KAAK,SAAS,CAAC,qBAAqB,EAAE,CAAC;QAC/C,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC;IAC/B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * GCP Cloud Run teardown — removes per-agent service accounts
3
+ * and the scheduler Cloud Run service.
4
+ */
5
+ import type { CloudRunCloudConfig } from "../../shared/config.js";
6
+ /**
7
+ * Tear down all GCP resources provisioned for this project:
8
+ * 1. Scheduler Cloud Run service
9
+ * 2. Per-agent GCP service accounts
10
+ */
11
+ export declare function teardownGcp(projectPath: string, cloud: CloudRunCloudConfig): Promise<void>;
12
+ //# sourceMappingURL=teardown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teardown.d.ts","sourceRoot":"","sources":["../../../src/cloud/gcp/teardown.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAIlE;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDhG"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * GCP Cloud Run teardown — removes per-agent service accounts
3
+ * and the scheduler Cloud Run service.
4
+ */
5
+ import { execFileSync } from "child_process";
6
+ import { discoverAgents } from "../../shared/config.js";
7
+ import { GCP_CONSTANTS } from "./constants.js";
8
+ import { teardownCloudRunService } from "./deploy.js";
9
+ /**
10
+ * Tear down all GCP resources provisioned for this project:
11
+ * 1. Scheduler Cloud Run service
12
+ * 2. Per-agent GCP service accounts
13
+ */
14
+ export async function teardownGcp(projectPath, cloud) {
15
+ const { gcpProject } = cloud;
16
+ if (!gcpProject) {
17
+ console.log("Incomplete GCP config (no project). Skipping teardown.");
18
+ return;
19
+ }
20
+ try {
21
+ gcloud(["auth", "print-access-token"], gcpProject);
22
+ }
23
+ catch (err) {
24
+ throw new Error("gcloud CLI is not authenticated. Run 'gcloud auth login' first.\n" +
25
+ `Original error: ${err.message}`);
26
+ }
27
+ // Tear down scheduler Cloud Run service
28
+ console.log("Removing Cloud Run scheduler service...");
29
+ await teardownCloudRunService(cloud);
30
+ console.log("");
31
+ const agents = discoverAgents(projectPath);
32
+ if (agents.length === 0) {
33
+ console.log("No agents found. Skipping IAM teardown.");
34
+ return;
35
+ }
36
+ console.log(`Removing Cloud Run service accounts for ${agents.length} agent(s)...\n`);
37
+ for (const name of agents) {
38
+ const saEmail = GCP_CONSTANTS.serviceAccountEmail(name, gcpProject);
39
+ console.log(` Agent: ${name}`);
40
+ console.log(` Deleting SA: ${saEmail}`);
41
+ try {
42
+ gcloud([
43
+ "iam", "service-accounts", "delete", saEmail,
44
+ "--quiet",
45
+ "--project", gcpProject,
46
+ ], gcpProject);
47
+ console.log(` Deleted`);
48
+ }
49
+ catch (err) {
50
+ if (err.message?.includes("NOT_FOUND") || err.message?.includes("not found")) {
51
+ console.log(` Not found (already deleted)`);
52
+ }
53
+ else {
54
+ console.log(` Warning: ${err.message}`);
55
+ }
56
+ }
57
+ console.log("");
58
+ }
59
+ }
60
+ function gcloud(args, _project) {
61
+ return execFileSync("gcloud", args, {
62
+ encoding: "utf-8",
63
+ timeout: 30_000,
64
+ stdio: ["pipe", "pipe", "pipe"],
65
+ }).trim();
66
+ }
67
+ //# sourceMappingURL=teardown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teardown.js","sourceRoot":"","sources":["../../../src/cloud/gcp/teardown.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB,EAAE,KAA0B;IAC/E,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IAC7B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,CAAC,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAAE,UAAU,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,mEAAmE;YACnE,mBAAmB,GAAG,CAAC,OAAO,EAAE,CACjC,CAAC;IACJ,CAAC;IAED,wCAAwC;IACxC,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACvD,MAAM,uBAAuB,CAAC,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,2CAA2C,MAAM,CAAC,MAAM,gBAAgB,CAAC,CAAC;IAEtF,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,aAAa,CAAC,mBAAmB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAEpE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;QAE3C,IAAI,CAAC;YACH,MAAM,CAAC;gBACL,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,OAAO;gBAC5C,SAAS;gBACT,WAAW,EAAE,UAAU;aACxB,EAAE,UAAU,CAAC,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC7E,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,IAAc,EAAE,QAAgB;IAC9C,OAAO,YAAY,CAAC,QAAQ,EAAE,IAAI,EAAE;QAClC,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;KAChC,CAAC,CAAC,IAAI,EAAE,CAAC;AACZ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"image-builder.d.ts","sourceRoot":"","sources":["../../src/cloud/image-builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAKlD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,YAAY,CAAC;IAC3B,kBAAkB,EAAE,WAAW,EAAE,CAAC;IAClC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvD;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAyGpF"}
1
+ {"version":3,"file":"image-builder.d.ts","sourceRoot":"","sources":["../../src/cloud/image-builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAKlD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,YAAY,CAAC;IAC3B,kBAAkB,EAAE,WAAW,EAAE,CAAC;IAClC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvD;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAmBD;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiMpF"}
@@ -7,10 +7,26 @@
7
7
  import { existsSync, readFileSync } from "fs";
8
8
  import { resolve as resolvePath, dirname } from "path";
9
9
  import { fileURLToPath } from "url";
10
- import { AWS_CONSTANTS } from "../shared/aws-constants.js";
10
+ import { CONSTANTS } from "../shared/constants.js";
11
11
  import { buildPromptSkeleton } from "../agents/prompt.js";
12
12
  /** Resolve to the package root (two levels up from src/cloud/) */
13
13
  const packageRoot = resolvePath(dirname(fileURLToPath(import.meta.url)), "..", "..");
14
+ /**
15
+ * Check whether the project Dockerfile has user customizations beyond a bare FROM.
16
+ */
17
+ function isProjectDockerfileCustomized(projectPath) {
18
+ const dockerfilePath = resolvePath(projectPath, "Dockerfile");
19
+ if (!existsSync(dockerfilePath))
20
+ return false;
21
+ const instructions = readFileSync(dockerfilePath, "utf-8")
22
+ .split("\n")
23
+ .map(l => l.trim())
24
+ .filter(l => l && !l.startsWith("#"));
25
+ // Unmodified = empty or a single FROM line
26
+ if (instructions.length <= 1)
27
+ return false;
28
+ return true;
29
+ }
14
30
  /**
15
31
  * Build the base image, per-agent images, and push to remote registry.
16
32
  *
@@ -19,7 +35,7 @@ const packageRoot = resolvePath(dirname(fileURLToPath(import.meta.url)), "..", "
19
35
  export async function buildAllImages(opts) {
20
36
  const { projectPath, globalConfig, activeAgentConfigs, runtime, runtimeType, statusTracker, logger, skills, onProgress } = opts;
21
37
  // 1. Build base image
22
- let baseImage = globalConfig.local?.image || AWS_CONSTANTS.DEFAULT_IMAGE;
38
+ let baseImage = globalConfig.local?.image || CONSTANTS.DEFAULT_IMAGE;
23
39
  logger.info({ image: baseImage }, "Building base image (this may take a few minutes on first run)...");
24
40
  const setBaseImageProgress = (msg) => {
25
41
  statusTracker?.setBaseImageStatus(msg);
@@ -42,12 +58,42 @@ export async function buildAllImages(opts) {
42
58
  });
43
59
  }
44
60
  statusTracker?.setBaseImageStatus(null);
45
- // 2. Build per-agent images in parallel
61
+ // 1.5. Build project base image (if project has a customized Dockerfile)
62
+ let effectiveBaseImage = baseImage;
63
+ const projectDockerfile = resolvePath(projectPath, "Dockerfile");
64
+ if (isProjectDockerfileCustomized(projectPath)) {
65
+ const projectBaseTag = CONSTANTS.PROJECT_BASE_IMAGE;
66
+ logger.info("Building project base image...");
67
+ const setProjectBaseProgress = (msg) => {
68
+ statusTracker?.setBaseImageStatus(msg);
69
+ onProgress?.("project-base", msg);
70
+ };
71
+ if (runtimeType === "local") {
72
+ setProjectBaseProgress("Building project base image");
73
+ effectiveBaseImage = await runtime.buildImage({
74
+ tag: projectBaseTag,
75
+ dockerfile: projectDockerfile,
76
+ contextDir: packageRoot,
77
+ baseImage,
78
+ onProgress: setProjectBaseProgress,
79
+ });
80
+ }
81
+ else {
82
+ setProjectBaseProgress("Building project base image");
83
+ effectiveBaseImage = await runtime.buildImage({
84
+ tag: projectBaseTag,
85
+ dockerfile: projectDockerfile,
86
+ contextDir: packageRoot,
87
+ baseImage,
88
+ onProgress: setProjectBaseProgress,
89
+ });
90
+ }
91
+ statusTracker?.setBaseImageStatus(null);
92
+ logger.info({ image: effectiveBaseImage }, "Project base image built");
93
+ }
94
+ // 2. Build per-agent images — partition into thin (no Dockerfile) vs heavy
46
95
  const agentImages = {};
47
- await Promise.all(activeAgentConfigs.map(async (agentConfig) => {
48
- statusTracker?.setAgentState(agentConfig.name, "building");
49
- statusTracker?.setAgentStatusText(agentConfig.name, "Building agent image");
50
- onProgress?.(agentConfig.name, "Building agent image");
96
+ const agentMeta = activeAgentConfigs.map((agentConfig) => {
51
97
  const hasCustomDockerfile = existsSync(resolvePath(projectPath, agentConfig.name, "Dockerfile"));
52
98
  const actionsPath = resolvePath(projectPath, agentConfig.name, "ACTIONS.md");
53
99
  const actionsMd = existsSync(actionsPath) ? readFileSync(actionsPath, "utf-8") : "";
@@ -58,16 +104,26 @@ export async function buildAllImages(opts) {
58
104
  "prompt-static.txt": buildPromptSkeleton(agentConfig, skills),
59
105
  "timeout": timeout,
60
106
  };
61
- const agentImageTag = AWS_CONSTANTS.agentImage(agentConfig.name);
107
+ return { agentConfig, hasCustomDockerfile, extraFiles };
108
+ });
109
+ const thinAgents = agentMeta.filter(a => !a.hasCustomDockerfile);
110
+ const heavyAgents = agentMeta.filter(a => a.hasCustomDockerfile);
111
+ for (const a of agentMeta) {
112
+ statusTracker?.setAgentState(a.agentConfig.name, "building");
113
+ statusTracker?.setAgentStatusText(a.agentConfig.name, "Building agent image");
114
+ onProgress?.(a.agentConfig.name, "Building agent image");
115
+ }
116
+ // Thin agents: use assembleImageDirect if available (bypasses CodeBuild)
117
+ const thinPromises = thinAgents.map(async ({ agentConfig, extraFiles }) => {
118
+ const agentImageTag = CONSTANTS.agentImage(agentConfig.name);
119
+ const progressCb = (msg) => { statusTracker?.setAgentStatusText(agentConfig.name, msg); onProgress?.(agentConfig.name, msg); };
62
120
  let image;
63
- if (hasCustomDockerfile) {
64
- image = await runtime.buildImage({
121
+ if (runtime.assembleImageDirect && runtimeType !== "local") {
122
+ image = await runtime.assembleImageDirect({
65
123
  tag: agentImageTag,
66
- dockerfile: resolvePath(projectPath, agentConfig.name, "Dockerfile"),
67
- contextDir: packageRoot,
68
- baseImage,
124
+ baseImage: effectiveBaseImage,
69
125
  extraFiles,
70
- onProgress: (msg) => { statusTracker?.setAgentStatusText(agentConfig.name, msg); onProgress?.(agentConfig.name, msg); },
126
+ onProgress: progressCb,
71
127
  });
72
128
  }
73
129
  else {
@@ -75,14 +131,55 @@ export async function buildAllImages(opts) {
75
131
  tag: agentImageTag,
76
132
  dockerfile: "Dockerfile",
77
133
  contextDir: packageRoot,
78
- dockerfileContent: `FROM ${baseImage}\nCOPY static/ /app/static/\n`,
134
+ dockerfileContent: `FROM ${effectiveBaseImage}\nCOPY static/ /app/static/\n`,
79
135
  extraFiles,
80
- onProgress: (msg) => { statusTracker?.setAgentStatusText(agentConfig.name, msg); onProgress?.(agentConfig.name, msg); },
136
+ onProgress: progressCb,
81
137
  });
82
138
  }
83
139
  agentImages[agentConfig.name] = image;
84
140
  logger.info({ agent: agentConfig.name, image }, "Built agent image");
85
- }));
141
+ });
142
+ // Heavy agents: batch into one CodeBuild job if supported, else build individually
143
+ let heavyPromise;
144
+ if (heavyAgents.length > 0 && runtime.buildMultipleImages && runtimeType !== "local") {
145
+ const heavyBuilds = heavyAgents.map(({ agentConfig, extraFiles }) => ({
146
+ tag: CONSTANTS.agentImage(agentConfig.name),
147
+ dockerfile: resolvePath(projectPath, agentConfig.name, "Dockerfile"),
148
+ contextDir: packageRoot,
149
+ baseImage: effectiveBaseImage,
150
+ extraFiles,
151
+ onProgress: (msg) => { statusTracker?.setAgentStatusText(agentConfig.name, msg); onProgress?.(agentConfig.name, msg); },
152
+ }));
153
+ heavyPromise = runtime.buildMultipleImages(heavyBuilds, (msg) => {
154
+ for (const a of heavyAgents) {
155
+ statusTracker?.setAgentStatusText(a.agentConfig.name, msg);
156
+ onProgress?.(a.agentConfig.name, msg);
157
+ }
158
+ }).then((images) => {
159
+ for (let i = 0; i < heavyAgents.length; i++) {
160
+ const name = heavyAgents[i].agentConfig.name;
161
+ agentImages[name] = images[i];
162
+ logger.info({ agent: name, image: images[i] }, "Built agent image");
163
+ }
164
+ });
165
+ }
166
+ else {
167
+ heavyPromise = Promise.all(heavyAgents.map(async ({ agentConfig, extraFiles }) => {
168
+ const agentImageTag = CONSTANTS.agentImage(agentConfig.name);
169
+ const progressCb = (msg) => { statusTracker?.setAgentStatusText(agentConfig.name, msg); onProgress?.(agentConfig.name, msg); };
170
+ const image = await runtime.buildImage({
171
+ tag: agentImageTag,
172
+ dockerfile: resolvePath(projectPath, agentConfig.name, "Dockerfile"),
173
+ contextDir: packageRoot,
174
+ baseImage: effectiveBaseImage,
175
+ extraFiles,
176
+ onProgress: progressCb,
177
+ });
178
+ agentImages[agentConfig.name] = image;
179
+ logger.info({ agent: agentConfig.name, image }, "Built agent image");
180
+ })).then(() => { });
181
+ }
182
+ await Promise.all([...thinPromises, heavyPromise]);
86
183
  // 3. Push images to remote registry (no-op for local)
87
184
  if (runtimeType !== "local") {
88
185
  const imagesToPush = activeAgentConfigs.filter(ac => {
@@ -106,6 +203,6 @@ export async function buildAllImages(opts) {
106
203
  statusTracker?.setAgentState(ac.name, "idle");
107
204
  }
108
205
  logger.info("Docker infrastructure ready");
109
- return { baseImage, agentImages };
206
+ return { baseImage: effectiveBaseImage, agentImages };
110
207
  }
111
208
  //# sourceMappingURL=image-builder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"image-builder.js","sourceRoot":"","sources":["../../src/cloud/image-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"image-builder.js","sourceRoot":"","sources":["../../src/cloud/image-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * CloudProvider interface — abstracts per-provider cloud operations.
3
+ *
4
+ * Each cloud provider (AWS ECS, GCP Cloud Run) implements this interface,
5
+ * allowing CLI commands and the scheduler to be provider-agnostic.
6
+ */
7
+ import type { ContainerRuntime } from "../docker/runtime.js";
8
+ import type { CredentialBackend } from "../shared/credential-backend.js";
9
+ import type { AgentConfig, GlobalConfig } from "../shared/config.js";
10
+ export interface ProvisionedResource {
11
+ type: string;
12
+ id: string;
13
+ region?: string;
14
+ arn?: string;
15
+ }
16
+ export interface SchedulerServiceInfo {
17
+ serviceUrl: string;
18
+ status: string;
19
+ createdAt?: Date;
20
+ updatedAt?: Date;
21
+ }
22
+ export interface RuntimeResult {
23
+ runtime: ContainerRuntime;
24
+ agentRuntimeOverrides: Record<string, ContainerRuntime>;
25
+ }
26
+ export interface CloudProvider {
27
+ readonly providerName: "ecs" | "cloud-run";
28
+ /** Interactive provisioning wizard. Returns config fields to write to config.toml, or null if aborted. */
29
+ provision(): Promise<Record<string, unknown> | null>;
30
+ /** Tear down all provisioned cloud resources for this project. */
31
+ teardown(projectPath: string): Promise<void>;
32
+ /** Reconcile per-agent IAM resources (roles, service accounts, secret bindings). */
33
+ reconcileAgents(projectPath: string): Promise<void>;
34
+ /** Validate that IAM roles/service accounts exist and are correctly configured. */
35
+ validateRoles(projectPath: string): Promise<void>;
36
+ /** Create the primary container runtime for this provider. */
37
+ createRuntime(): ContainerRuntime;
38
+ /** Create a runtime for a specific agent. Handles Lambda routing for ECS short-timeout agents. */
39
+ createAgentRuntime(agentConfig: AgentConfig, globalConfig: GlobalConfig): ContainerRuntime;
40
+ /** Create primary runtime + per-agent overrides for the scheduler. */
41
+ createRuntimes(activeAgentConfigs: AgentConfig[], globalConfig: GlobalConfig): RuntimeResult;
42
+ /** Create a credential backend for this provider. */
43
+ createCredentialBackend(): Promise<CredentialBackend>;
44
+ /** Deploy the scheduler service. Returns service info with URL. */
45
+ deployScheduler(imageUri: string): Promise<SchedulerServiceInfo>;
46
+ /** Get the current scheduler service status. */
47
+ getSchedulerStatus(): Promise<SchedulerServiceInfo | null>;
48
+ /** Fetch recent scheduler logs. */
49
+ getSchedulerLogs(limit: number): Promise<string[]>;
50
+ /** Tear down the scheduler service only. */
51
+ teardownScheduler(): Promise<void>;
52
+ }
53
+ /**
54
+ * Factory: create a CloudProvider from validated cloud config.
55
+ */
56
+ export declare function createCloudProvider(cloudConfig: import("../shared/config.js").CloudConfig): Promise<CloudProvider>;
57
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/cloud/provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAErE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,YAAY,EAAE,KAAK,GAAG,WAAW,CAAC;IAE3C,0GAA0G;IAC1G,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IAErD,kEAAkE;IAClE,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C,oFAAoF;IACpF,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpD,mFAAmF;IACnF,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAElD,8DAA8D;IAC9D,aAAa,IAAI,gBAAgB,CAAC;IAElC,kGAAkG;IAClG,kBAAkB,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,GAAG,gBAAgB,CAAC;IAE3F,sEAAsE;IACtE,cAAc,CAAC,kBAAkB,EAAE,WAAW,EAAE,EAAE,YAAY,EAAE,YAAY,GAAG,aAAa,CAAC;IAE7F,qDAAqD;IACrD,uBAAuB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAEtD,mEAAmE;IACnE,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAEjE,gDAAgD;IAChD,kBAAkB,IAAI,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IAE3D,mCAAmC;IACnC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEnD,4CAA4C;IAC5C,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,OAAO,qBAAqB,EAAE,WAAW,GACrD,OAAO,CAAC,aAAa,CAAC,CAYxB"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * CloudProvider interface — abstracts per-provider cloud operations.
3
+ *
4
+ * Each cloud provider (AWS ECS, GCP Cloud Run) implements this interface,
5
+ * allowing CLI commands and the scheduler to be provider-agnostic.
6
+ */
7
+ /**
8
+ * Factory: create a CloudProvider from validated cloud config.
9
+ */
10
+ export async function createCloudProvider(cloudConfig) {
11
+ if (cloudConfig.provider === "ecs") {
12
+ const { AwsCloudProvider } = await import("./aws/provider.js");
13
+ return new AwsCloudProvider(cloudConfig);
14
+ }
15
+ if (cloudConfig.provider === "cloud-run") {
16
+ const { GcpCloudProvider } = await import("./gcp/provider.js");
17
+ return new GcpCloudProvider(cloudConfig);
18
+ }
19
+ throw new Error(`Unknown cloud provider: "${cloudConfig.provider}"`);
20
+ }
21
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/cloud/provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiEH;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,WAAsD;IAEtD,IAAI,WAAW,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QACnC,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC/D,OAAO,IAAI,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,WAAW,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;QACzC,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC/D,OAAO,IAAI,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,4BAA6B,WAAmB,CAAC,QAAQ,GAAG,CAAC,CAAC;AAChF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler-image.d.ts","sourceRoot":"","sources":["../../src/cloud/scheduler-image.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAIlD,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAqED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwDnF"}
1
+ {"version":3,"file":"scheduler-image.d.ts","sourceRoot":"","sources":["../../src/cloud/scheduler-image.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAIlD,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAmFD;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwDnF"}
@@ -11,7 +11,7 @@
11
11
  import { existsSync, readFileSync, readdirSync, statSync, writeFileSync, mkdirSync } from "fs";
12
12
  import { resolve as resolvePath, dirname, join } from "path";
13
13
  import { fileURLToPath } from "url";
14
- import { AWS_CONSTANTS } from "../shared/aws-constants.js";
14
+ import { CONSTANTS } from "../shared/constants.js";
15
15
  const packageRoot = resolvePath(dirname(fileURLToPath(import.meta.url)), "..", "..");
16
16
  /**
17
17
  * Collect all project files that should be baked into the scheduler image.
@@ -25,6 +25,11 @@ function collectProjectFiles(projectPath) {
25
25
  if (existsSync(configPath)) {
26
26
  files["config.toml"] = readFileSync(configPath, "utf-8");
27
27
  }
28
+ // Project Dockerfile (project base image)
29
+ const projectDockerfilePath = resolvePath(projectPath, "Dockerfile");
30
+ if (existsSync(projectDockerfilePath)) {
31
+ files["Dockerfile"] = readFileSync(projectDockerfilePath, "utf-8");
32
+ }
28
33
  // Walk agent directories
29
34
  for (const entry of readdirSync(projectPath)) {
30
35
  if (entry.startsWith(".") || entry === "node_modules")
@@ -51,6 +56,14 @@ function collectProjectFiles(projectPath) {
51
56
  */
52
57
  function generateDockerfile() {
53
58
  return [
59
+ "# Stage 1: install production dependencies (cached unless package.json changes)",
60
+ "FROM public.ecr.aws/docker/library/node:20-slim AS deps",
61
+ "",
62
+ "WORKDIR /app",
63
+ "COPY package.json ./",
64
+ "RUN npm install --production",
65
+ "",
66
+ "# Stage 2: final image with deps + application code",
54
67
  "FROM public.ecr.aws/docker/library/node:20-slim",
55
68
  "",
56
69
  "RUN apt-get update && apt-get install -y --no-install-recommends \\",
@@ -58,8 +71,8 @@ function generateDockerfile() {
58
71
  " && rm -rf /var/lib/apt/lists/*",
59
72
  "",
60
73
  "WORKDIR /app",
74
+ "COPY --from=deps /app/node_modules ./node_modules",
61
75
  "COPY package.json ./",
62
- "RUN npm install --production",
63
76
  "COPY dist/ ./dist/",
64
77
  "",
65
78
  "# Extra files (project config, agent dirs, base Dockerfile) are placed in",
@@ -116,7 +129,7 @@ export async function buildSchedulerImage(opts) {
116
129
  const tmpDockerfile = join(tmpdir(), `al-scheduler-dockerfile-${randomUUID().slice(0, 8)}`);
117
130
  mkdirSync(dirname(tmpDockerfile), { recursive: true });
118
131
  writeFileSync(tmpDockerfile, dockerfileContent);
119
- const tag = AWS_CONSTANTS.SCHEDULER_IMAGE;
132
+ const tag = CONSTANTS.SCHEDULER_IMAGE;
120
133
  const image = await runtime.buildImage({
121
134
  tag,
122
135
  dockerfile: tmpDockerfile,