@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
@@ -1,138 +1,25 @@
1
1
  /**
2
- * Cloud IAM reconciliation for doctor and cloud-setup commands.
2
+ * AWS IAM reconciliation for ECS cloud agents.
3
3
  *
4
- * Extracted from doctor.ts to keep the credential validation logic
5
- * separate from cloud infrastructure provisioning.
4
+ * Extracted from cli/commands/cloud-iam.ts into the cloud provider module.
5
+ * Handles per-agent IAM task roles, Lambda roles, and ECR policies.
6
6
  */
7
- import { execFileSync } from "child_process";
8
- import { confirm } from "@inquirer/prompts";
9
7
  import { STSClient, GetCallerIdentityCommand } from "@aws-sdk/client-sts";
10
- import { IAMClient, CreateRoleCommand, PutRolePolicyCommand, PutUserPolicyCommand, GetRoleCommand } from "@aws-sdk/client-iam";
8
+ import { IAMClient, CreateRoleCommand, PutRolePolicyCommand, PutUserPolicyCommand, GetRoleCommand, } from "@aws-sdk/client-iam";
11
9
  import { ECRClient, SetRepositoryPolicyCommand } from "@aws-sdk/client-ecr";
12
10
  import { discoverAgents, loadAgentConfig, loadGlobalConfig } from "../../shared/config.js";
13
11
  import { parseCredentialRef } from "../../shared/credentials.js";
14
- import { AWS_CONSTANTS } from "../../shared/aws-constants.js";
12
+ import { AWS_CONSTANTS } from "./constants.js";
13
+ import { CONSTANTS } from "../../shared/constants.js";
15
14
  import { ConfigError, CloudProviderError } from "../../shared/errors.js";
16
- export async function reconcileCloudIam(projectPath, cloud) {
17
- if (cloud.provider === "cloud-run") {
18
- await reconcileGcp(projectPath, cloud);
19
- }
20
- else if (cloud.provider === "ecs") {
21
- await reconcileAws(projectPath, cloud);
22
- }
23
- else {
24
- throw new CloudProviderError(`Unknown cloud provider: "${cloud.provider}"`);
25
- }
26
- }
27
- async function reconcileGcp(projectPath, cloud) {
28
- const { gcpProject, secretPrefix: configPrefix } = cloud;
29
- if (!gcpProject) {
30
- throw new ConfigError("cloud.gcpProject is required in config.toml");
31
- }
32
- const secretPrefix = configPrefix || AWS_CONSTANTS.DEFAULT_SECRET_PREFIX;
33
- // Verify gcloud is available and authenticated
34
- try {
35
- gcloud(["auth", "print-access-token"], gcpProject);
36
- }
37
- catch (err) {
38
- throw new CloudProviderError("gcloud CLI is not authenticated. Run 'gcloud auth login' first.\n" +
39
- `Original error: ${err.message}`);
40
- }
41
- const agents = discoverAgents(projectPath);
42
- if (agents.length === 0) {
43
- console.log("No agents found. Create agents first.");
44
- return;
45
- }
46
- // Pre-flight: check if any secrets exist in GSM with this prefix
47
- const preflight = listGsmSecretCount(gcpProject, secretPrefix);
48
- if (preflight === 0) {
49
- console.log(`\nWarning: No secrets found in GSM with prefix "${secretPrefix}".\n` +
50
- `IAM bindings are created against existing secrets, so you should push credentials first.\n`);
51
- const proceed = await confirm({
52
- message: "Continue anyway? (Service accounts will be created but no secrets will be bound)",
53
- default: false,
54
- });
55
- if (!proceed) {
56
- console.log("Aborted. Push credentials first, then re-run.");
57
- return;
58
- }
59
- }
60
- console.log(`\nSetting up Cloud Run service accounts for ${agents.length} agent(s)...\n`);
61
- for (const name of agents) {
62
- const config = loadAgentConfig(projectPath, name);
63
- const saName = AWS_CONSTANTS.serviceAccountName(name);
64
- const saEmail = AWS_CONSTANTS.serviceAccountEmail(name, gcpProject);
65
- console.log(` Agent: ${name}`);
66
- console.log(` SA: ${saEmail}`);
67
- // 1. Create service account (idempotent)
68
- try {
69
- gcloud([
70
- "iam", "service-accounts", "create", saName,
71
- "--display-name", `Action Llama agent: ${name}`,
72
- "--project", gcpProject,
73
- ], gcpProject);
74
- console.log(` Created service account`);
75
- }
76
- catch (err) {
77
- if (err.message?.includes("already exists")) {
78
- console.log(` Service account already exists`);
79
- }
80
- else {
81
- throw err;
82
- }
83
- }
84
- // 2. Collect all secret names this agent needs
85
- const credRefs = [...new Set(config.credentials)];
86
- if (config.model.authType !== "pi_auth" && !credRefs.includes("anthropic_key:default")) {
87
- credRefs.push("anthropic_key:default");
88
- }
89
- const secretNames = [];
90
- for (const ref of credRefs) {
91
- const { type, instance } = parseCredentialRef(ref);
92
- const fields = listGsmFields(gcpProject, secretPrefix, type, instance);
93
- for (const field of fields) {
94
- secretNames.push(`${secretPrefix}--${type}--${instance}--${field}`);
95
- }
96
- }
97
- // 3. Grant secretmanager.secretAccessor on each secret
98
- let boundCount = 0;
99
- for (const secretName of secretNames) {
100
- try {
101
- gcloud([
102
- "secrets", "add-iam-policy-binding", secretName,
103
- "--member", `serviceAccount:${saEmail}`,
104
- "--role", "roles/secretmanager.secretAccessor",
105
- "--project", gcpProject,
106
- ], gcpProject);
107
- boundCount++;
108
- }
109
- catch (err) {
110
- if (err.message?.includes("already exists") || err.message?.includes("already has")) {
111
- boundCount++;
112
- }
113
- else {
114
- console.log(` Warning: failed to bind ${secretName}: ${err.message}`);
115
- }
116
- }
117
- }
118
- console.log(` Bound ${boundCount} secret(s)`);
119
- // 4. Grant the SA permission to act as itself (for Cloud Run job execution)
120
- try {
121
- gcloud([
122
- "iam", "service-accounts", "add-iam-policy-binding", saEmail,
123
- "--member", `serviceAccount:${saEmail}`,
124
- "--role", "roles/iam.serviceAccountUser",
125
- "--project", gcpProject,
126
- ], gcpProject);
127
- }
128
- catch {
129
- // May already be bound
130
- }
131
- console.log("");
132
- }
133
- console.log("Done. Each agent now has an isolated service account with access to only its declared secrets.");
134
- }
135
- async function reconcileAws(projectPath, cloud) {
15
+ /**
16
+ * Reconcile per-agent ECS task roles and Secrets Manager policies.
17
+ *
18
+ * Creates an IAM task role for each agent with a trust policy for
19
+ * ecs-tasks.amazonaws.com, then attaches an inline policy granting
20
+ * secretsmanager:GetSecretValue on each agent's declared credentials.
21
+ */
22
+ export async function reconcileAwsAgents(projectPath, cloud) {
136
23
  const { awsRegion, ecrRepository, awsSecretPrefix } = cloud;
137
24
  if (!awsRegion) {
138
25
  throw new ConfigError("cloud.awsRegion is required in config.toml");
@@ -140,7 +27,7 @@ async function reconcileAws(projectPath, cloud) {
140
27
  if (!ecrRepository) {
141
28
  throw new ConfigError("cloud.ecrRepository is required in config.toml");
142
29
  }
143
- const secretPrefix = awsSecretPrefix || AWS_CONSTANTS.DEFAULT_SECRET_PREFIX;
30
+ const secretPrefix = awsSecretPrefix || CONSTANTS.DEFAULT_SECRET_PREFIX;
144
31
  // Extract account ID from ECR repo URI
145
32
  const accountMatch = ecrRepository.match(/^(\d+)\.dkr\.ecr\./);
146
33
  if (!accountMatch) {
@@ -325,54 +212,9 @@ export async function grantPassRole(awsRegion, iamClient, roleArns, policyName)
325
212
  }
326
213
  }
327
214
  }
328
- function gcloud(args, _project) {
329
- return execFileSync("gcloud", args, {
330
- encoding: "utf-8",
331
- timeout: 30_000,
332
- stdio: ["pipe", "pipe", "pipe"],
333
- }).trim();
334
- }
335
- function listGsmSecretCount(gcpProject, prefix) {
336
- try {
337
- const output = gcloud([
338
- "secrets", "list",
339
- "--filter", `name:${prefix}--`,
340
- "--format", "value(name)",
341
- "--project", gcpProject,
342
- ], gcpProject);
343
- if (!output.trim())
344
- return 0;
345
- return output.trim().split("\n").length;
346
- }
347
- catch {
348
- return 0;
349
- }
350
- }
351
- function listGsmFields(gcpProject, prefix, type, instance) {
352
- const filter = `name:${prefix}--${type}--${instance}--`;
353
- try {
354
- const output = gcloud([
355
- "secrets", "list",
356
- "--filter", filter,
357
- "--format", "value(name)",
358
- "--project", gcpProject,
359
- ], gcpProject);
360
- if (!output.trim())
361
- return [];
362
- const fields = [];
363
- for (const line of output.split("\n")) {
364
- const secretId = line.trim().split("/").pop();
365
- const parts = secretId.split("--");
366
- if (parts.length === 4 && parts[0] === prefix && parts[1] === type && parts[2] === instance) {
367
- fields.push(parts[3]);
368
- }
369
- }
370
- return fields;
371
- }
372
- catch {
373
- return [];
374
- }
375
- }
215
+ /**
216
+ * Validate that per-agent ECS task roles exist and have correct trust policies.
217
+ */
376
218
  export async function validateEcsRoles(projectPath, cloud) {
377
219
  const { awsRegion } = cloud;
378
220
  if (!awsRegion) {
@@ -443,7 +285,10 @@ export async function validateEcsRoles(projectPath, cloud) {
443
285
  console.log(`All ${agents.length} IAM task role(s) exist and have correct trust policies.`);
444
286
  }
445
287
  }
446
- async function ensureLambdaEcrPolicy(awsRegion, ecrRepoUri) {
288
+ /**
289
+ * Ensure the ECR repository policy grants Lambda pull access.
290
+ */
291
+ export async function ensureLambdaEcrPolicy(awsRegion, ecrRepoUri) {
447
292
  const repoName = ecrRepoUri.split("/").pop();
448
293
  if (!repoName)
449
294
  return;
@@ -471,11 +316,17 @@ async function ensureLambdaEcrPolicy(awsRegion, ecrRepoUri) {
471
316
  console.log(`Warning: could not set ECR repository policy for Lambda: ${err.message}`);
472
317
  }
473
318
  }
319
+ /**
320
+ * Reconcile per-agent Lambda execution roles for agents with short timeouts.
321
+ *
322
+ * Agents with timeout <= LAMBDA_MAX_TIMEOUT are automatically routed to Lambda.
323
+ * Each gets an IAM role with Secrets Manager, ECR, and CloudWatch Logs access.
324
+ */
474
325
  export async function reconcileLambdaRoles(projectPath, cloud) {
475
326
  const { awsRegion, ecrRepository, awsSecretPrefix } = cloud;
476
327
  if (!awsRegion || !ecrRepository)
477
328
  return;
478
- const secretPrefix = awsSecretPrefix || AWS_CONSTANTS.DEFAULT_SECRET_PREFIX;
329
+ const secretPrefix = awsSecretPrefix || CONSTANTS.DEFAULT_SECRET_PREFIX;
479
330
  const accountMatch = ecrRepository.match(/^(\d+)\.dkr\.ecr\./);
480
331
  if (!accountMatch)
481
332
  return;
@@ -588,4 +439,4 @@ export async function reconcileLambdaRoles(projectPath, cloud) {
588
439
  await grantPassRole(awsRegion, iamClient, lambdaRoleArns, "ActionLlamaLambdaPassRole");
589
440
  }
590
441
  }
591
- //# sourceMappingURL=cloud-iam.js.map
442
+ //# sourceMappingURL=iam.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iam.js","sourceRoot":"","sources":["../../../src/cloud/aws/iam.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * AWS (ECS) cloud provider implementation.
3
+ *
4
+ * Wraps EcsCloudConfig and delegates to the extracted AWS modules
5
+ * (provision, teardown, iam, deploy) via the CloudProvider interface.
6
+ */
7
+ import type { EcsCloudConfig, AgentConfig, GlobalConfig } from "../../shared/config.js";
8
+ import type { ContainerRuntime } from "../../docker/runtime.js";
9
+ import type { CredentialBackend } from "../../shared/credential-backend.js";
10
+ import type { CloudProvider, SchedulerServiceInfo, RuntimeResult } from "../provider.js";
11
+ export declare class AwsCloudProvider implements CloudProvider {
12
+ readonly providerName: "ecs";
13
+ private config;
14
+ constructor(config: EcsCloudConfig);
15
+ /**
16
+ * Interactive provisioning wizard. Runs the ECS setup flow and
17
+ * returns config fields to write to config.toml.
18
+ */
19
+ provision(): Promise<Record<string, unknown> | null>;
20
+ /**
21
+ * Tear down all provisioned AWS cloud resources for this project.
22
+ */
23
+ teardown(projectPath: string): Promise<void>;
24
+ /**
25
+ * Reconcile per-agent IAM resources (ECS task roles + Lambda roles).
26
+ */
27
+ reconcileAgents(projectPath: string): Promise<void>;
28
+ /**
29
+ * Validate that per-agent IAM task roles exist and are correctly configured.
30
+ */
31
+ validateRoles(projectPath: string): Promise<void>;
32
+ /**
33
+ * Create the primary ECS Fargate container runtime.
34
+ */
35
+ createRuntime(): ContainerRuntime;
36
+ /**
37
+ * Create a runtime for a specific agent.
38
+ *
39
+ * Agents with timeout <= LAMBDA_MAX_TIMEOUT are routed to Lambda
40
+ * for faster cold starts and lower cost. All others use ECS Fargate.
41
+ */
42
+ createAgentRuntime(agentConfig: AgentConfig, globalConfig: GlobalConfig): ContainerRuntime;
43
+ /**
44
+ * Create primary ECS runtime + per-agent Lambda overrides for
45
+ * agents with short timeouts.
46
+ */
47
+ createRuntimes(activeAgentConfigs: AgentConfig[], globalConfig: GlobalConfig): RuntimeResult;
48
+ /**
49
+ * Create an AWS Secrets Manager credential backend.
50
+ */
51
+ createCredentialBackend(): Promise<CredentialBackend>;
52
+ /**
53
+ * Deploy the scheduler as an App Runner service.
54
+ */
55
+ deployScheduler(imageUri: string): Promise<SchedulerServiceInfo>;
56
+ /**
57
+ * Get the current scheduler App Runner service status.
58
+ */
59
+ getSchedulerStatus(): Promise<SchedulerServiceInfo | null>;
60
+ /**
61
+ * Fetch recent scheduler logs from CloudWatch.
62
+ */
63
+ getSchedulerLogs(limit: number): Promise<string[]>;
64
+ /**
65
+ * Tear down the scheduler App Runner service only.
66
+ */
67
+ teardownScheduler(): Promise<void>;
68
+ }
69
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/cloud/aws/provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,aAAa,EACd,MAAM,gBAAgB,CAAC;AAMxB,qBAAa,gBAAiB,YAAW,aAAa;IACpD,QAAQ,CAAC,YAAY,EAAG,KAAK,CAAU;IACvC,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,cAAc;IAIlC;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAY1D;;OAEG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlD;;OAEG;IACG,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzD;;OAEG;IACG,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD;;OAEG;IACH,aAAa,IAAI,gBAAgB;IAcjC;;;;;OAKG;IACH,kBAAkB,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,GAAG,gBAAgB;IAkB1F;;;OAGG;IACH,cAAc,CAAC,kBAAkB,EAAE,WAAW,EAAE,EAAE,YAAY,EAAE,YAAY,GAAG,aAAa;IA8B5F;;OAEG;IACG,uBAAuB,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAQ3D;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IActE;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAYhE;;OAEG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKxD;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;CAIzC"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * AWS (ECS) cloud provider implementation.
3
+ *
4
+ * Wraps EcsCloudConfig and delegates to the extracted AWS modules
5
+ * (provision, teardown, iam, deploy) via the CloudProvider interface.
6
+ */
7
+ import { ECSFargateRuntime } from "../../docker/ecs-runtime.js";
8
+ import { LambdaRuntime } from "../../docker/lambda-runtime.js";
9
+ import { AWS_CONSTANTS } from "./constants.js";
10
+ import { CONSTANTS } from "../../shared/constants.js";
11
+ export class AwsCloudProvider {
12
+ providerName = "ecs";
13
+ config;
14
+ constructor(config) {
15
+ this.config = config;
16
+ }
17
+ /**
18
+ * Interactive provisioning wizard. Runs the ECS setup flow and
19
+ * returns config fields to write to config.toml.
20
+ */
21
+ async provision() {
22
+ const { setupEcsCloud } = await import("./provision.js");
23
+ // setupEcsCloud mutates the config object in place and returns success/failure
24
+ const configCopy = { ...this.config };
25
+ const success = await setupEcsCloud(configCopy);
26
+ if (!success) {
27
+ return null;
28
+ }
29
+ // Return the full mutated config as a flat record
30
+ return configCopy;
31
+ }
32
+ /**
33
+ * Tear down all provisioned AWS cloud resources for this project.
34
+ */
35
+ async teardown(projectPath) {
36
+ const { teardownAws } = await import("./teardown.js");
37
+ await teardownAws(projectPath, this.config);
38
+ }
39
+ /**
40
+ * Reconcile per-agent IAM resources (ECS task roles + Lambda roles).
41
+ */
42
+ async reconcileAgents(projectPath) {
43
+ const { reconcileAwsAgents, reconcileLambdaRoles } = await import("./iam.js");
44
+ await reconcileAwsAgents(projectPath, this.config);
45
+ await reconcileLambdaRoles(projectPath, this.config);
46
+ }
47
+ /**
48
+ * Validate that per-agent IAM task roles exist and are correctly configured.
49
+ */
50
+ async validateRoles(projectPath) {
51
+ const { validateEcsRoles } = await import("./iam.js");
52
+ await validateEcsRoles(projectPath, this.config);
53
+ }
54
+ /**
55
+ * Create the primary ECS Fargate container runtime.
56
+ */
57
+ createRuntime() {
58
+ return new ECSFargateRuntime({
59
+ awsRegion: this.config.awsRegion,
60
+ ecsCluster: this.config.ecsCluster,
61
+ ecrRepository: this.config.ecrRepository,
62
+ executionRoleArn: this.config.executionRoleArn,
63
+ taskRoleArn: this.config.taskRoleArn,
64
+ subnets: this.config.subnets,
65
+ securityGroups: this.config.securityGroups,
66
+ secretPrefix: this.config.awsSecretPrefix || CONSTANTS.DEFAULT_SECRET_PREFIX,
67
+ buildBucket: this.config.buildBucket,
68
+ });
69
+ }
70
+ /**
71
+ * Create a runtime for a specific agent.
72
+ *
73
+ * Agents with timeout <= LAMBDA_MAX_TIMEOUT are routed to Lambda
74
+ * for faster cold starts and lower cost. All others use ECS Fargate.
75
+ */
76
+ createAgentRuntime(agentConfig, globalConfig) {
77
+ const effectiveTimeout = agentConfig.timeout ?? globalConfig.local?.timeout ?? 900;
78
+ if (effectiveTimeout <= AWS_CONSTANTS.LAMBDA_MAX_TIMEOUT) {
79
+ return new LambdaRuntime({
80
+ awsRegion: this.config.awsRegion,
81
+ ecrRepository: this.config.ecrRepository,
82
+ secretPrefix: this.config.awsSecretPrefix || CONSTANTS.DEFAULT_SECRET_PREFIX,
83
+ buildBucket: this.config.buildBucket,
84
+ lambdaRoleArn: this.config.lambdaRoleArn,
85
+ lambdaSubnets: this.config.lambdaSubnets,
86
+ lambdaSecurityGroups: this.config.lambdaSecurityGroups,
87
+ });
88
+ }
89
+ return this.createRuntime();
90
+ }
91
+ /**
92
+ * Create primary ECS runtime + per-agent Lambda overrides for
93
+ * agents with short timeouts.
94
+ */
95
+ createRuntimes(activeAgentConfigs, globalConfig) {
96
+ const runtime = this.createRuntime();
97
+ const agentRuntimeOverrides = {};
98
+ // Check which agents should be routed to Lambda
99
+ let lambdaRuntime = null;
100
+ for (const agentConfig of activeAgentConfigs) {
101
+ const effectiveTimeout = agentConfig.timeout ?? globalConfig.local?.timeout ?? 900;
102
+ if (effectiveTimeout <= AWS_CONSTANTS.LAMBDA_MAX_TIMEOUT) {
103
+ // Lazily create a single shared Lambda runtime
104
+ if (!lambdaRuntime) {
105
+ lambdaRuntime = new LambdaRuntime({
106
+ awsRegion: this.config.awsRegion,
107
+ ecrRepository: this.config.ecrRepository,
108
+ secretPrefix: this.config.awsSecretPrefix || CONSTANTS.DEFAULT_SECRET_PREFIX,
109
+ buildBucket: this.config.buildBucket,
110
+ lambdaRoleArn: this.config.lambdaRoleArn,
111
+ lambdaSubnets: this.config.lambdaSubnets,
112
+ lambdaSecurityGroups: this.config.lambdaSecurityGroups,
113
+ });
114
+ }
115
+ agentRuntimeOverrides[agentConfig.name] = lambdaRuntime;
116
+ }
117
+ }
118
+ return { runtime, agentRuntimeOverrides };
119
+ }
120
+ /**
121
+ * Create an AWS Secrets Manager credential backend.
122
+ */
123
+ async createCredentialBackend() {
124
+ const { AwsSecretsManagerBackend } = await import("../../shared/asm-backend.js");
125
+ return new AwsSecretsManagerBackend(this.config.awsRegion, this.config.awsSecretPrefix || CONSTANTS.DEFAULT_SECRET_PREFIX);
126
+ }
127
+ /**
128
+ * Deploy the scheduler as an App Runner service.
129
+ */
130
+ async deployScheduler(imageUri) {
131
+ const { deployAppRunner } = await import("./deploy.js");
132
+ const result = await deployAppRunner({
133
+ imageUri,
134
+ cloudConfig: this.config,
135
+ });
136
+ return {
137
+ serviceUrl: result.serviceUrl,
138
+ status: result.status,
139
+ createdAt: result.createdAt,
140
+ updatedAt: result.updatedAt,
141
+ };
142
+ }
143
+ /**
144
+ * Get the current scheduler App Runner service status.
145
+ */
146
+ async getSchedulerStatus() {
147
+ const { getAppRunnerStatus } = await import("./deploy.js");
148
+ const result = await getAppRunnerStatus(this.config);
149
+ if (!result)
150
+ return null;
151
+ return {
152
+ serviceUrl: result.serviceUrl,
153
+ status: result.status,
154
+ createdAt: result.createdAt,
155
+ updatedAt: result.updatedAt,
156
+ };
157
+ }
158
+ /**
159
+ * Fetch recent scheduler logs from CloudWatch.
160
+ */
161
+ async getSchedulerLogs(limit) {
162
+ const { getAppRunnerLogs } = await import("./deploy.js");
163
+ return getAppRunnerLogs(this.config, limit);
164
+ }
165
+ /**
166
+ * Tear down the scheduler App Runner service only.
167
+ */
168
+ async teardownScheduler() {
169
+ const { teardownAppRunner } = await import("./deploy.js");
170
+ await teardownAppRunner(this.config);
171
+ }
172
+ }
173
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/cloud/aws/provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD,MAAM,OAAO,gBAAgB;IAClB,YAAY,GAAG,KAAc,CAAC;IAC/B,MAAM,CAAiB;IAE/B,YAAY,MAAsB;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS;QACb,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACzD,+EAA+E;QAC/E,MAAM,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QACD,kDAAkD;QAClD,OAAO,UAAgD,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,WAAmB;QAChC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QACtD,MAAM,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,WAAmB;QACvC,MAAM,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QAC9E,MAAM,kBAAkB,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,oBAAoB,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,WAAmB;QACrC,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACtD,MAAM,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,iBAAiB,CAAC;YAC3B,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;YAChC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAClC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa;YACxC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB;YAC9C,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACpC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;YAC5B,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;YAC1C,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,SAAS,CAAC,qBAAqB;YAC5E,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;SACrC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,kBAAkB,CAAC,WAAwB,EAAE,YAA0B;QACrE,MAAM,gBAAgB,GAAG,WAAW,CAAC,OAAO,IAAI,YAAY,CAAC,KAAK,EAAE,OAAO,IAAI,GAAG,CAAC;QAEnF,IAAI,gBAAgB,IAAI,aAAa,CAAC,kBAAkB,EAAE,CAAC;YACzD,OAAO,IAAI,aAAa,CAAC;gBACvB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;gBAChC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa;gBACxC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,SAAS,CAAC,qBAAqB;gBAC5E,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;gBACpC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa;gBACxC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa;gBACxC,oBAAoB,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB;aACvD,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,kBAAiC,EAAE,YAA0B;QAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACrC,MAAM,qBAAqB,GAAqC,EAAE,CAAC;QAEnE,gDAAgD;QAChD,IAAI,aAAa,GAA4B,IAAI,CAAC;QAElD,KAAK,MAAM,WAAW,IAAI,kBAAkB,EAAE,CAAC;YAC7C,MAAM,gBAAgB,GAAG,WAAW,CAAC,OAAO,IAAI,YAAY,CAAC,KAAK,EAAE,OAAO,IAAI,GAAG,CAAC;YAEnF,IAAI,gBAAgB,IAAI,aAAa,CAAC,kBAAkB,EAAE,CAAC;gBACzD,+CAA+C;gBAC/C,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnB,aAAa,GAAG,IAAI,aAAa,CAAC;wBAChC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;wBAChC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa;wBACxC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,SAAS,CAAC,qBAAqB;wBAC5E,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;wBACpC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa;wBACxC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa;wBACxC,oBAAoB,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB;qBACvD,CAAC,CAAC;gBACL,CAAC;gBACD,qBAAqB,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,uBAAuB;QAC3B,MAAM,EAAE,wBAAwB,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QACjF,OAAO,IAAI,wBAAwB,CACjC,IAAI,CAAC,MAAM,CAAC,SAAS,EACrB,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,SAAS,CAAC,qBAAqB,CAC/D,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,QAAgB;QACpC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACnC,QAAQ;YACR,WAAW,EAAE,IAAI,CAAC,MAAM;SACzB,CAAC,CAAC;QACH,OAAO;YACL,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB;QACtB,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,OAAO;YACL,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,KAAa;QAClC,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACzD,OAAO,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB;QACrB,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAC1D,MAAM,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * ECS-specific cloud provisioning logic.
3
+ *
4
+ * Extracted from cli/commands/cloud-setup-ecs.ts into the cloud provider module.
5
+ * Contains all AWS resource creation/discovery for ECS Fargate setup.
6
+ */
7
+ import type { EcsCloudConfig } from "../../shared/config.js";
8
+ export declare function setupEcsCloud(cloud: EcsCloudConfig): Promise<boolean>;
9
+ //# sourceMappingURL=provision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provision.d.ts","sourceRoot":"","sources":["../../../src/cloud/aws/provision.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsCH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAO7D,wBAAsB,aAAa,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CA2L3E"}
@@ -1,7 +1,7 @@
1
1
  /**
2
- * ECS-specific cloud setup logic.
2
+ * ECS-specific cloud provisioning logic.
3
3
  *
4
- * Extracted from cloud-setup.ts to keep the main orchestrator slim.
4
+ * Extracted from cli/commands/cloud-setup-ecs.ts into the cloud provider module.
5
5
  * Contains all AWS resource creation/discovery for ECS Fargate setup.
6
6
  */
7
7
  import { select, input, confirm } from "@inquirer/prompts";
@@ -11,7 +11,8 @@ import { ECSClient, ListClustersCommand, DescribeClustersCommand, CreateClusterC
11
11
  import { IAMClient, ListRolesCommand, CreateRoleCommand, GetRoleCommand, AttachRolePolicyCommand, PutRolePolicyCommand, PutUserPolicyCommand, CreateServiceLinkedRoleCommand, } from "@aws-sdk/client-iam";
12
12
  import { EC2Client, DescribeVpcsCommand, DescribeSubnetsCommand, DescribeSecurityGroupsCommand, } from "@aws-sdk/client-ec2";
13
13
  import { CloudWatchLogsClient, CreateLogGroupCommand, } from "@aws-sdk/client-cloudwatch-logs";
14
- import { AWS_CONSTANTS } from "../../shared/aws-constants.js";
14
+ import { AWS_CONSTANTS } from "./constants.js";
15
+ import { CONSTANTS } from "../../shared/constants.js";
15
16
  const CREATE_NEW = "__create_new__";
16
17
  const MANUAL_INPUT = "__manual_input__";
17
18
  export async function setupEcsCloud(cloud) {
@@ -51,7 +52,7 @@ export async function setupEcsCloud(cloud) {
51
52
  cloud.taskRoleArn = await pickOrCreateEcsRole(iamClient, "Default task role (Secrets Manager access)", AWS_CONSTANTS.DEFAULT_TASK_ROLE, [], [cloud.executionRoleArn]);
52
53
  // Add Secrets Manager + CloudWatch Logs inline policy to execution role
53
54
  const executionRoleName = cloud.executionRoleArn.split("/").pop();
54
- const secretPrefix = AWS_CONSTANTS.DEFAULT_SECRET_PREFIX;
55
+ const secretPrefix = CONSTANTS.DEFAULT_SECRET_PREFIX;
55
56
  try {
56
57
  await iamClient.send(new PutRolePolicyCommand({
57
58
  RoleName: executionRoleName,
@@ -103,8 +104,8 @@ export async function setupEcsCloud(cloud) {
103
104
  const sgs = await pickSecurityGroups(ec2Client, result.vpcId);
104
105
  if (sgs.length > 0)
105
106
  cloud.securityGroups = sgs;
106
- const prefix = await input({ message: "Secret prefix:", default: AWS_CONSTANTS.DEFAULT_SECRET_PREFIX });
107
- if (prefix !== AWS_CONSTANTS.DEFAULT_SECRET_PREFIX)
107
+ const prefix = await input({ message: "Secret prefix:", default: CONSTANTS.DEFAULT_SECRET_PREFIX });
108
+ if (prefix !== CONSTANTS.DEFAULT_SECRET_PREFIX)
108
109
  cloud.awsSecretPrefix = prefix;
109
110
  // Grant iam:PassRole, logs read, and iam:PutUserPolicy to the calling
110
111
  // IAM user so that al start/run can assign roles, al logs can read
@@ -648,8 +649,8 @@ async function ensureAppRunnerInstanceRole(iamClient, accountId, region, ecrRepo
648
649
  { Sid: "PassRole", Effect: "Allow", Action: "iam:PassRole", Resource: `arn:aws:iam::${accountId}:role/al-*`, Condition: { StringEquals: { "iam:PassedToService": ["ecs-tasks.amazonaws.com", "codebuild.amazonaws.com", "lambda.amazonaws.com", "apprunner.amazonaws.com"] } } },
649
650
  { Sid: "IAMAgentRoles", Effect: "Allow", Action: ["iam:CreateRole", "iam:GetRole", "iam:GetRolePolicy", "iam:PutRolePolicy", "iam:DeleteRole", "iam:DeleteRolePolicy", "iam:AttachRolePolicy"], Resource: `arn:aws:iam::${accountId}:role/al-*` },
650
651
  { Sid: "IAMListRoles", Effect: "Allow", Action: "iam:ListRoles", Resource: "*" },
651
- { Sid: "ECR", Effect: "Allow", Action: ["ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer", "ecr:BatchCheckLayerAvailability", "ecr:GetAuthorizationToken", "ecr:SetRepositoryPolicy"], Resource: "*" },
652
- { Sid: "CodeBuild", Effect: "Allow", Action: ["codebuild:StartBuild", "codebuild:BatchGetBuilds", "codebuild:CreateProject"], Resource: `arn:aws:codebuild:${region}:${accountId}:project/al-image-builder` },
652
+ { Sid: "ECR", Effect: "Allow", Action: ["ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer", "ecr:BatchCheckLayerAvailability", "ecr:GetAuthorizationToken", "ecr:SetRepositoryPolicy", "ecr:PutImage", "ecr:InitiateLayerUpload", "ecr:UploadLayerPart", "ecr:CompleteLayerUpload"], Resource: "*" },
653
+ { Sid: "CodeBuild", Effect: "Allow", Action: ["codebuild:StartBuild", "codebuild:BatchGetBuilds", "codebuild:CreateProject", "codebuild:UpdateProject"], Resource: `arn:aws:codebuild:${region}:${accountId}:project/al-image-builder` },
653
654
  { Sid: "Lambda", Effect: "Allow", Action: ["lambda:GetFunction", "lambda:CreateFunction", "lambda:UpdateFunctionCode", "lambda:UpdateFunctionConfiguration", "lambda:PutFunctionEventInvokeConfig", "lambda:InvokeFunction"], Resource: `arn:aws:lambda:${region}:${accountId}:function:al-*` },
654
655
  { Sid: "S3", Effect: "Allow", Action: ["s3:CreateBucket", "s3:PutObject", "s3:GetObject", "s3:ListBucket"], Resource: [`arn:aws:s3:::${bucketName}`, `arn:aws:s3:::${bucketName}/*`] },
655
656
  { Sid: "AppRunner", Effect: "Allow", Action: ["apprunner:CreateService", "apprunner:UpdateService", "apprunner:DescribeService", "apprunner:DeleteService"], Resource: `arn:aws:apprunner:${region}:${accountId}:service/al-scheduler/*` },
@@ -694,4 +695,4 @@ async function pickSecurityGroups(ec2Client, vpcId) {
694
695
  const raw = await input({ message: "Security group IDs (comma-separated, optional):" });
695
696
  return raw.trim() ? raw.split(",").map(s => s.trim()).filter(Boolean) : [];
696
697
  }
697
- //# sourceMappingURL=cloud-setup-ecs.js.map
698
+ //# sourceMappingURL=provision.js.map