@action-llama/action-llama 0.10.1 → 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.
- package/AGENTS.md +17 -6
- package/README.md +8 -4
- package/dist/agents/container-entry.d.ts.map +1 -1
- package/dist/agents/container-entry.js +37 -0
- package/dist/agents/container-entry.js.map +1 -1
- package/dist/agents/container-runner.d.ts +4 -0
- package/dist/agents/container-runner.d.ts.map +1 -1
- package/dist/agents/container-runner.js +82 -5
- package/dist/agents/container-runner.js.map +1 -1
- package/dist/agents/execution-engine.d.ts +2 -0
- package/dist/agents/execution-engine.d.ts.map +1 -1
- package/dist/agents/execution-engine.js +7 -16
- package/dist/agents/execution-engine.js.map +1 -1
- package/dist/agents/runner.d.ts +3 -0
- package/dist/agents/runner.d.ts.map +1 -1
- package/dist/agents/runner.js +47 -17
- package/dist/agents/runner.js.map +1 -1
- package/dist/cli/commands/chat.d.ts +5 -2
- package/dist/cli/commands/chat.d.ts.map +1 -1
- package/dist/cli/commands/chat.js +240 -23
- package/dist/cli/commands/chat.js.map +1 -1
- package/dist/cli/commands/cloud-deploy.d.ts.map +1 -1
- package/dist/cli/commands/cloud-deploy.js +5 -47
- package/dist/cli/commands/cloud-deploy.js.map +1 -1
- package/dist/cli/commands/cloud-setup.d.ts.map +1 -1
- package/dist/cli/commands/cloud-setup.js +20 -858
- package/dist/cli/commands/cloud-setup.js.map +1 -1
- package/dist/cli/commands/cloud-teardown.d.ts.map +1 -1
- package/dist/cli/commands/cloud-teardown.js +6 -126
- package/dist/cli/commands/cloud-teardown.js.map +1 -1
- package/dist/cli/commands/creds.d.ts.map +1 -1
- package/dist/cli/commands/creds.js +2 -4
- package/dist/cli/commands/creds.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +0 -3
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +76 -646
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/kill.d.ts +1 -1
- package/dist/cli/commands/kill.d.ts.map +1 -1
- package/dist/cli/commands/kill.js +26 -18
- package/dist/cli/commands/kill.js.map +1 -1
- package/dist/cli/commands/logs.d.ts.map +1 -1
- package/dist/cli/commands/logs.js +104 -58
- package/dist/cli/commands/logs.js.map +1 -1
- package/dist/cli/commands/pause.d.ts +1 -1
- package/dist/cli/commands/pause.d.ts.map +1 -1
- package/dist/cli/commands/pause.js +19 -19
- package/dist/cli/commands/pause.js.map +1 -1
- package/dist/cli/commands/resume.d.ts +1 -1
- package/dist/cli/commands/resume.d.ts.map +1 -1
- package/dist/cli/commands/resume.js +19 -19
- package/dist/cli/commands/resume.js.map +1 -1
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +12 -54
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +22 -39
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/gateway-client.d.ts +12 -0
- package/dist/cli/gateway-client.d.ts.map +1 -0
- package/dist/cli/gateway-client.js +27 -0
- package/dist/cli/gateway-client.js.map +1 -0
- package/dist/cli/main.js +79 -42
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/with-command.d.ts +13 -0
- package/dist/cli/with-command.d.ts.map +1 -0
- package/dist/cli/with-command.js +45 -0
- package/dist/cli/with-command.js.map +1 -0
- package/dist/{shared/aws-constants.d.ts → cloud/aws/constants.d.ts} +3 -34
- package/dist/cloud/aws/constants.d.ts.map +1 -0
- package/dist/{shared/aws-constants.js → cloud/aws/constants.js} +3 -34
- package/dist/cloud/aws/constants.js.map +1 -0
- package/dist/cloud/{deploy-apprunner.d.ts → aws/deploy.d.ts} +6 -6
- package/dist/cloud/aws/deploy.d.ts.map +1 -0
- package/dist/cloud/{deploy-apprunner.js → aws/deploy.js} +2 -2
- package/dist/cloud/aws/deploy.js.map +1 -0
- package/dist/cloud/aws/iam.d.ts +37 -0
- package/dist/cloud/aws/iam.d.ts.map +1 -0
- package/dist/cloud/aws/iam.js +442 -0
- package/dist/cloud/aws/iam.js.map +1 -0
- package/dist/cloud/aws/provider.d.ts +69 -0
- package/dist/cloud/aws/provider.d.ts.map +1 -0
- package/dist/cloud/aws/provider.js +173 -0
- package/dist/cloud/aws/provider.js.map +1 -0
- package/dist/cloud/aws/provision.d.ts +9 -0
- package/dist/cloud/aws/provision.d.ts.map +1 -0
- package/dist/cloud/aws/provision.js +698 -0
- package/dist/cloud/aws/provision.js.map +1 -0
- package/dist/cloud/aws/teardown.d.ts +15 -0
- package/dist/cloud/aws/teardown.d.ts.map +1 -0
- package/dist/cloud/aws/teardown.js +74 -0
- package/dist/cloud/aws/teardown.js.map +1 -0
- package/dist/cloud/gcp/constants.d.ts +16 -0
- package/dist/cloud/gcp/constants.d.ts.map +1 -0
- package/dist/cloud/gcp/constants.js +16 -0
- package/dist/cloud/gcp/constants.js.map +1 -0
- package/dist/cloud/{deploy-cloudrun.d.ts → gcp/deploy.d.ts} +6 -6
- package/dist/cloud/gcp/deploy.d.ts.map +1 -0
- package/dist/cloud/{deploy-cloudrun.js → gcp/deploy.js} +7 -7
- package/dist/cloud/gcp/deploy.js.map +1 -0
- package/dist/cloud/gcp/iam.d.ts +20 -0
- package/dist/cloud/gcp/iam.d.ts.map +1 -0
- package/dist/cloud/gcp/iam.js +179 -0
- package/dist/cloud/gcp/iam.js.map +1 -0
- package/dist/cloud/gcp/provider.d.ts +28 -0
- package/dist/cloud/gcp/provider.d.ts.map +1 -0
- package/dist/cloud/gcp/provider.js +84 -0
- package/dist/cloud/gcp/provider.js.map +1 -0
- package/dist/cloud/gcp/provision.d.ts +14 -0
- package/dist/cloud/gcp/provision.d.ts.map +1 -0
- package/dist/cloud/gcp/provision.js +37 -0
- package/dist/cloud/gcp/provision.js.map +1 -0
- package/dist/cloud/gcp/teardown.d.ts +12 -0
- package/dist/cloud/gcp/teardown.d.ts.map +1 -0
- package/dist/cloud/gcp/teardown.js +67 -0
- package/dist/cloud/gcp/teardown.js.map +1 -0
- package/dist/cloud/image-builder.d.ts.map +1 -1
- package/dist/cloud/image-builder.js +115 -18
- package/dist/cloud/image-builder.js.map +1 -1
- package/dist/cloud/provider.d.ts +57 -0
- package/dist/cloud/provider.d.ts.map +1 -0
- package/dist/cloud/provider.js +21 -0
- package/dist/cloud/provider.js.map +1 -0
- package/dist/cloud/scheduler-image.d.ts.map +1 -1
- package/dist/cloud/scheduler-image.js +16 -3
- package/dist/cloud/scheduler-image.js.map +1 -1
- package/dist/cloud/state.d.ts +17 -0
- package/dist/cloud/state.d.ts.map +1 -0
- package/dist/cloud/state.js +48 -0
- package/dist/cloud/state.js.map +1 -0
- package/dist/docker/aws-shared.d.ts +6 -4
- package/dist/docker/aws-shared.d.ts.map +1 -1
- package/dist/docker/aws-shared.js +405 -23
- package/dist/docker/aws-shared.js.map +1 -1
- package/dist/docker/cloud-run-runtime.d.ts.map +1 -1
- package/dist/docker/cloud-run-runtime.js +10 -9
- package/dist/docker/cloud-run-runtime.js.map +1 -1
- package/dist/docker/ecs-runtime.d.ts +3 -1
- package/dist/docker/ecs-runtime.d.ts.map +1 -1
- package/dist/docker/ecs-runtime.js +78 -29
- package/dist/docker/ecs-runtime.js.map +1 -1
- package/dist/docker/image.d.ts +7 -0
- package/dist/docker/image.d.ts.map +1 -1
- package/dist/docker/image.js +31 -4
- package/dist/docker/image.js.map +1 -1
- package/dist/docker/lambda-runtime.js +1 -1
- package/dist/docker/lambda-runtime.js.map +1 -1
- package/dist/docker/local-runtime.js +4 -4
- package/dist/docker/local-runtime.js.map +1 -1
- package/dist/docker/network.d.ts.map +1 -1
- package/dist/docker/network.js +2 -2
- package/dist/docker/network.js.map +1 -1
- package/dist/docker/runtime.d.ts +23 -0
- package/dist/docker/runtime.d.ts.map +1 -1
- package/dist/gateway/api-key.d.ts +10 -0
- package/dist/gateway/api-key.d.ts.map +1 -0
- package/dist/gateway/api-key.js +19 -0
- package/dist/gateway/api-key.js.map +1 -0
- package/dist/gateway/auth.d.ts +16 -0
- package/dist/gateway/auth.d.ts.map +1 -0
- package/dist/gateway/auth.js +60 -0
- package/dist/gateway/auth.js.map +1 -0
- package/dist/gateway/index.d.ts +2 -0
- package/dist/gateway/index.d.ts.map +1 -1
- package/dist/gateway/index.js +38 -4
- package/dist/gateway/index.js.map +1 -1
- package/dist/gateway/rate-limiter.d.ts +16 -0
- package/dist/gateway/rate-limiter.d.ts.map +1 -0
- package/dist/gateway/rate-limiter.js +38 -0
- package/dist/gateway/rate-limiter.js.map +1 -0
- package/dist/gateway/routes/control.d.ts +6 -0
- package/dist/gateway/routes/control.d.ts.map +1 -1
- package/dist/gateway/routes/control.js +117 -0
- package/dist/gateway/routes/control.js.map +1 -1
- package/dist/gateway/routes/dashboard.d.ts +1 -1
- package/dist/gateway/routes/dashboard.d.ts.map +1 -1
- package/dist/gateway/routes/dashboard.js +148 -49
- package/dist/gateway/routes/dashboard.js.map +1 -1
- package/dist/gateway/routes/locks.d.ts +3 -1
- package/dist/gateway/routes/locks.d.ts.map +1 -1
- package/dist/gateway/routes/locks.js +18 -13
- package/dist/gateway/routes/locks.js.map +1 -1
- package/dist/gateway/routes/webhooks.d.ts.map +1 -1
- package/dist/gateway/routes/webhooks.js +14 -0
- package/dist/gateway/routes/webhooks.js.map +1 -1
- package/dist/gateway/views/dashboard-page.d.ts.map +1 -1
- package/dist/gateway/views/dashboard-page.js +93 -20
- package/dist/gateway/views/dashboard-page.js.map +1 -1
- package/dist/gateway/views/login-page.d.ts +2 -0
- package/dist/gateway/views/login-page.d.ts.map +1 -0
- package/dist/gateway/views/login-page.js +54 -0
- package/dist/gateway/views/login-page.js.map +1 -0
- package/dist/scheduler/index.d.ts +1 -2
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +176 -216
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/runner-pool.d.ts +5 -0
- package/dist/scheduler/runner-pool.d.ts.map +1 -1
- package/dist/scheduler/runner-pool.js +14 -0
- package/dist/scheduler/runner-pool.js.map +1 -1
- package/dist/scheduler/runtime-factory.d.ts +26 -4
- package/dist/scheduler/runtime-factory.d.ts.map +1 -1
- package/dist/scheduler/runtime-factory.js +43 -77
- package/dist/scheduler/runtime-factory.js.map +1 -1
- package/dist/scheduler/webhook-setup.d.ts +11 -20
- package/dist/scheduler/webhook-setup.d.ts.map +1 -1
- package/dist/scheduler/webhook-setup.js +22 -68
- package/dist/scheduler/webhook-setup.js.map +1 -1
- package/dist/setup/scaffold.d.ts.map +1 -1
- package/dist/setup/scaffold.js +25 -0
- package/dist/setup/scaffold.js.map +1 -1
- package/dist/shared/asm-backend.d.ts.map +1 -1
- package/dist/shared/asm-backend.js +2 -2
- package/dist/shared/asm-backend.js.map +1 -1
- package/dist/shared/config.d.ts +29 -13
- package/dist/shared/config.d.ts.map +1 -1
- package/dist/shared/config.js +53 -6
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/constants.d.ts +34 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +34 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/credential-backend.d.ts +1 -1
- package/dist/shared/credentials.d.ts.map +1 -1
- package/dist/shared/credentials.js +2 -1
- package/dist/shared/credentials.js.map +1 -1
- package/dist/shared/errors.d.ts +34 -0
- package/dist/shared/errors.d.ts.map +1 -0
- package/dist/shared/errors.js +47 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/filesystem-backend.d.ts +1 -1
- package/dist/shared/filesystem-backend.js +1 -1
- package/dist/shared/git.d.ts.map +1 -1
- package/dist/shared/git.js +3 -2
- package/dist/shared/git.js.map +1 -1
- package/dist/shared/gsm-backend.d.ts.map +1 -1
- package/dist/shared/gsm-backend.js +2 -2
- package/dist/shared/gsm-backend.js.map +1 -1
- package/dist/shared/paths.d.ts +2 -0
- package/dist/shared/paths.d.ts.map +1 -1
- package/dist/shared/paths.js +3 -1
- package/dist/shared/paths.js.map +1 -1
- package/dist/shared/remote.d.ts +1 -0
- package/dist/shared/remote.d.ts.map +1 -1
- package/dist/shared/remote.js +4 -16
- package/dist/shared/remote.js.map +1 -1
- package/dist/shared/usage.d.ts +22 -0
- package/dist/shared/usage.d.ts.map +1 -0
- package/dist/shared/usage.js +43 -0
- package/dist/shared/usage.js.map +1 -0
- package/dist/telemetry/index.d.ts +57 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +189 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/providers/otel.d.ts +15 -0
- package/dist/telemetry/providers/otel.d.ts.map +1 -0
- package/dist/telemetry/providers/otel.js +77 -0
- package/dist/telemetry/providers/otel.js.map +1 -0
- package/dist/telemetry/providers/xray.d.ts +13 -0
- package/dist/telemetry/providers/xray.d.ts.map +1 -0
- package/dist/telemetry/providers/xray.js +33 -0
- package/dist/telemetry/providers/xray.js.map +1 -0
- package/dist/telemetry/types.d.ts +59 -0
- package/dist/telemetry/types.d.ts.map +1 -0
- package/dist/telemetry/types.js +2 -0
- package/dist/telemetry/types.js.map +1 -0
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +2 -0
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/plain-logger.d.ts.map +1 -1
- package/dist/tui/plain-logger.js +8 -2
- package/dist/tui/plain-logger.js.map +1 -1
- package/dist/tui/status-tracker.d.ts +4 -1
- package/dist/tui/status-tracker.d.ts.map +1 -1
- package/dist/tui/status-tracker.js +11 -1
- package/dist/tui/status-tracker.js.map +1 -1
- package/dist/webhooks/providers/github.d.ts.map +1 -1
- package/dist/webhooks/providers/github.js +2 -21
- package/dist/webhooks/providers/github.js.map +1 -1
- package/dist/webhooks/providers/linear.d.ts.map +1 -1
- package/dist/webhooks/providers/linear.js +2 -21
- package/dist/webhooks/providers/linear.js.map +1 -1
- package/dist/webhooks/providers/sentry.d.ts.map +1 -1
- package/dist/webhooks/providers/sentry.js +2 -20
- package/dist/webhooks/providers/sentry.js.map +1 -1
- package/dist/webhooks/validation.d.ts +17 -0
- package/dist/webhooks/validation.d.ts.map +1 -0
- package/dist/webhooks/validation.js +37 -0
- package/dist/webhooks/validation.js.map +1 -0
- package/docker/adot-collector-config.yaml +57 -0
- package/package.json +9 -1
- package/dist/cloud/deploy-apprunner.d.ts.map +0 -1
- package/dist/cloud/deploy-apprunner.js.map +0 -1
- package/dist/cloud/deploy-cloudrun.d.ts.map +0 -1
- package/dist/cloud/deploy-cloudrun.js.map +0 -1
- package/dist/scheduler/config-validator.d.ts +0 -18
- package/dist/scheduler/config-validator.d.ts.map +0 -1
- package/dist/scheduler/config-validator.js +0 -53
- package/dist/scheduler/config-validator.js.map +0 -1
- package/dist/scheduler/cron-manager.d.ts +0 -14
- package/dist/scheduler/cron-manager.d.ts.map +0 -1
- package/dist/scheduler/cron-manager.js +0 -75
- package/dist/scheduler/cron-manager.js.map +0 -1
- package/dist/scheduler/shutdown-handler.d.ts +0 -16
- package/dist/scheduler/shutdown-handler.d.ts.map +0 -1
- package/dist/scheduler/shutdown-handler.js +0 -44
- package/dist/scheduler/shutdown-handler.js.map +0 -1
- package/dist/scheduler/trigger-dispatcher.d.ts +0 -12
- package/dist/scheduler/trigger-dispatcher.d.ts.map +0 -1
- package/dist/scheduler/trigger-dispatcher.js +0 -46
- package/dist/scheduler/trigger-dispatcher.js.map +0 -1
- package/dist/shared/aws-constants.d.ts.map +0 -1
- package/dist/shared/aws-constants.js.map +0 -1
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AWS IAM reconciliation for ECS cloud agents.
|
|
3
|
+
*
|
|
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
|
+
*/
|
|
7
|
+
import { STSClient, GetCallerIdentityCommand } from "@aws-sdk/client-sts";
|
|
8
|
+
import { IAMClient, CreateRoleCommand, PutRolePolicyCommand, PutUserPolicyCommand, GetRoleCommand, } from "@aws-sdk/client-iam";
|
|
9
|
+
import { ECRClient, SetRepositoryPolicyCommand } from "@aws-sdk/client-ecr";
|
|
10
|
+
import { discoverAgents, loadAgentConfig, loadGlobalConfig } from "../../shared/config.js";
|
|
11
|
+
import { parseCredentialRef } from "../../shared/credentials.js";
|
|
12
|
+
import { AWS_CONSTANTS } from "./constants.js";
|
|
13
|
+
import { CONSTANTS } from "../../shared/constants.js";
|
|
14
|
+
import { ConfigError, CloudProviderError } from "../../shared/errors.js";
|
|
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) {
|
|
23
|
+
const { awsRegion, ecrRepository, awsSecretPrefix } = cloud;
|
|
24
|
+
if (!awsRegion) {
|
|
25
|
+
throw new ConfigError("cloud.awsRegion is required in config.toml");
|
|
26
|
+
}
|
|
27
|
+
if (!ecrRepository) {
|
|
28
|
+
throw new ConfigError("cloud.ecrRepository is required in config.toml");
|
|
29
|
+
}
|
|
30
|
+
const secretPrefix = awsSecretPrefix || CONSTANTS.DEFAULT_SECRET_PREFIX;
|
|
31
|
+
// Extract account ID from ECR repo URI
|
|
32
|
+
const accountMatch = ecrRepository.match(/^(\d+)\.dkr\.ecr\./);
|
|
33
|
+
if (!accountMatch) {
|
|
34
|
+
throw new ConfigError(`Cannot extract AWS account ID from cloud.ecrRepository: "${ecrRepository}". ` +
|
|
35
|
+
`Expected format: 123456789012.dkr.ecr.<region>.amazonaws.com/<repo>`);
|
|
36
|
+
}
|
|
37
|
+
const accountId = accountMatch[1];
|
|
38
|
+
// Verify AWS credentials are valid
|
|
39
|
+
const stsClient = new STSClient({ region: awsRegion });
|
|
40
|
+
try {
|
|
41
|
+
await stsClient.send(new GetCallerIdentityCommand({}));
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
throw new CloudProviderError("AWS CLI is not authenticated. Run 'aws configure' or set AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY.\n" +
|
|
45
|
+
`Original error: ${err.message}`);
|
|
46
|
+
}
|
|
47
|
+
const agents = discoverAgents(projectPath);
|
|
48
|
+
if (agents.length === 0) {
|
|
49
|
+
console.log("No agents found. Create agents first.");
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
// Trust policy for ECS tasks
|
|
53
|
+
const trustPolicy = JSON.stringify({
|
|
54
|
+
Version: "2012-10-17",
|
|
55
|
+
Statement: [{
|
|
56
|
+
Effect: "Allow",
|
|
57
|
+
Principal: { Service: "ecs-tasks.amazonaws.com" },
|
|
58
|
+
Action: "sts:AssumeRole",
|
|
59
|
+
}],
|
|
60
|
+
});
|
|
61
|
+
const iamClient = new IAMClient({ region: awsRegion });
|
|
62
|
+
// Ensure execution role has Secrets Manager access (ECS uses this role to inject secrets)
|
|
63
|
+
if (cloud.executionRoleArn) {
|
|
64
|
+
const executionRoleName = cloud.executionRoleArn.split("/").pop();
|
|
65
|
+
try {
|
|
66
|
+
await iamClient.send(new PutRolePolicyCommand({
|
|
67
|
+
RoleName: executionRoleName,
|
|
68
|
+
PolicyName: "ActionLlamaExecution",
|
|
69
|
+
PolicyDocument: JSON.stringify({
|
|
70
|
+
Version: "2012-10-17",
|
|
71
|
+
Statement: [
|
|
72
|
+
{
|
|
73
|
+
Effect: "Allow",
|
|
74
|
+
Action: "secretsmanager:GetSecretValue",
|
|
75
|
+
Resource: `arn:aws:secretsmanager:${awsRegion}:${accountId}:secret:${secretPrefix}/*`,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
Effect: "Allow",
|
|
79
|
+
Action: "logs:CreateLogGroup",
|
|
80
|
+
Resource: `arn:aws:logs:${awsRegion}:${accountId}:log-group:${AWS_CONSTANTS.LOG_GROUP}*`,
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
}),
|
|
84
|
+
}));
|
|
85
|
+
console.log(`Execution role (${executionRoleName}): Secrets Manager + CloudWatch policy applied`);
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
throw new CloudProviderError(`Failed to attach ActionLlamaExecution policy to ${executionRoleName}: ${err.message}\n` +
|
|
89
|
+
`The execution role needs secretsmanager:GetSecretValue and logs:CreateLogGroup permissions.\n` +
|
|
90
|
+
`Either grant your IAM user iam:PutRolePolicy on this role, or attach the policy manually in the AWS Console.`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Ensure ECR repository policy grants Lambda pull access
|
|
94
|
+
await ensureLambdaEcrPolicy(awsRegion, ecrRepository);
|
|
95
|
+
console.log(`\nSetting up ECS task roles for ${agents.length} agent(s)...\n`);
|
|
96
|
+
for (const name of agents) {
|
|
97
|
+
const config = loadAgentConfig(projectPath, name);
|
|
98
|
+
const roleName = AWS_CONSTANTS.taskRoleName(name);
|
|
99
|
+
console.log(` Agent: ${name}`);
|
|
100
|
+
console.log(` Role: ${roleName}`);
|
|
101
|
+
// 1. Create IAM role (idempotent)
|
|
102
|
+
try {
|
|
103
|
+
await iamClient.send(new CreateRoleCommand({
|
|
104
|
+
RoleName: roleName,
|
|
105
|
+
AssumeRolePolicyDocument: trustPolicy,
|
|
106
|
+
}));
|
|
107
|
+
console.log(` Created IAM role`);
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
if (err.name === "EntityAlreadyExistsException") {
|
|
111
|
+
console.log(` IAM role already exists`);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
throw err;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// 2. Collect secret ARNs this agent needs
|
|
118
|
+
const credRefs = [...new Set(config.credentials)];
|
|
119
|
+
if (config.model.authType !== "pi_auth" && !credRefs.includes("anthropic_key:default")) {
|
|
120
|
+
credRefs.push("anthropic_key:default");
|
|
121
|
+
}
|
|
122
|
+
const secretArns = [];
|
|
123
|
+
for (const ref of credRefs) {
|
|
124
|
+
const { type, instance } = parseCredentialRef(ref);
|
|
125
|
+
secretArns.push(`arn:aws:secretsmanager:${awsRegion}:${accountId}:secret:${secretPrefix}/${type}/${instance}/*`);
|
|
126
|
+
}
|
|
127
|
+
// 3. Put inline policy for Secrets Manager access
|
|
128
|
+
if (secretArns.length > 0) {
|
|
129
|
+
const policy = JSON.stringify({
|
|
130
|
+
Version: "2012-10-17",
|
|
131
|
+
Statement: [{
|
|
132
|
+
Effect: "Allow",
|
|
133
|
+
Action: "secretsmanager:GetSecretValue",
|
|
134
|
+
Resource: secretArns,
|
|
135
|
+
}],
|
|
136
|
+
});
|
|
137
|
+
try {
|
|
138
|
+
await iamClient.send(new PutRolePolicyCommand({
|
|
139
|
+
RoleName: roleName,
|
|
140
|
+
PolicyName: "SecretsAccess",
|
|
141
|
+
PolicyDocument: policy,
|
|
142
|
+
}));
|
|
143
|
+
console.log(` Bound ${secretArns.length} secret path(s)`);
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
console.log(` Warning: failed to put policy: ${err.message}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
console.log(` No secrets to bind`);
|
|
151
|
+
}
|
|
152
|
+
console.log("");
|
|
153
|
+
}
|
|
154
|
+
// Grant iam:PassRole on ECS task roles + execution role to the calling identity
|
|
155
|
+
const taskRoleArns = agents.map((name) => `arn:aws:iam::${accountId}:role/${AWS_CONSTANTS.taskRoleName(name)}`);
|
|
156
|
+
if (cloud.executionRoleArn) {
|
|
157
|
+
taskRoleArns.push(cloud.executionRoleArn);
|
|
158
|
+
}
|
|
159
|
+
if (taskRoleArns.length > 0) {
|
|
160
|
+
await grantPassRole(awsRegion, iamClient, taskRoleArns, "ActionLlamaEcsPassRole");
|
|
161
|
+
}
|
|
162
|
+
console.log("Done. Each agent now has an isolated IAM task role with access to only its declared secrets.");
|
|
163
|
+
console.log(`\nTask roles follow the convention: al-{agentName}-task-role`);
|
|
164
|
+
console.log("The ECS runtime will use them automatically at launch time.");
|
|
165
|
+
}
|
|
166
|
+
// --- Helpers ---
|
|
167
|
+
/**
|
|
168
|
+
* Grant iam:PassRole on the given role ARNs to the calling IAM user.
|
|
169
|
+
* Required so the CLI can assign roles to ECS tasks and Lambda functions.
|
|
170
|
+
*/
|
|
171
|
+
export async function grantPassRole(awsRegion, iamClient, roleArns, policyName) {
|
|
172
|
+
const stsClient = new STSClient({ region: awsRegion });
|
|
173
|
+
const identity = await stsClient.send(new GetCallerIdentityCommand({}));
|
|
174
|
+
const callerArn = identity.Arn;
|
|
175
|
+
// Extract user name from ARN (arn:aws:iam::ACCOUNT:user/USERNAME)
|
|
176
|
+
const userMatch = callerArn.match(/:user\/(.+)$/);
|
|
177
|
+
if (!userMatch) {
|
|
178
|
+
console.log(`\n Note: Caller ${callerArn} is not an IAM user — skipping iam:PassRole auto-grant.`);
|
|
179
|
+
console.log(` If you get PassRole errors, add this policy to your IAM identity:`);
|
|
180
|
+
console.log(JSON.stringify({
|
|
181
|
+
Version: "2012-10-17",
|
|
182
|
+
Statement: [{
|
|
183
|
+
Effect: "Allow",
|
|
184
|
+
Action: "iam:PassRole",
|
|
185
|
+
Resource: roleArns,
|
|
186
|
+
}],
|
|
187
|
+
}, null, 2));
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
const userName = userMatch[1];
|
|
191
|
+
const policy = JSON.stringify({
|
|
192
|
+
Version: "2012-10-17",
|
|
193
|
+
Statement: [{
|
|
194
|
+
Effect: "Allow",
|
|
195
|
+
Action: "iam:PassRole",
|
|
196
|
+
Resource: roleArns,
|
|
197
|
+
}],
|
|
198
|
+
});
|
|
199
|
+
try {
|
|
200
|
+
await iamClient.send(new PutUserPolicyCommand({
|
|
201
|
+
UserName: userName,
|
|
202
|
+
PolicyName: policyName,
|
|
203
|
+
PolicyDocument: policy,
|
|
204
|
+
}));
|
|
205
|
+
console.log(` Granted iam:PassRole on ${roleArns.length} role(s) to user ${userName}`);
|
|
206
|
+
}
|
|
207
|
+
catch (err) {
|
|
208
|
+
console.log(` Warning: could not grant iam:PassRole to user ${userName}: ${err.message}`);
|
|
209
|
+
console.log(` You may need to manually add iam:PassRole permission for these roles:`);
|
|
210
|
+
for (const arn of roleArns) {
|
|
211
|
+
console.log(` - ${arn}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Validate that per-agent ECS task roles exist and have correct trust policies.
|
|
217
|
+
*/
|
|
218
|
+
export async function validateEcsRoles(projectPath, cloud) {
|
|
219
|
+
const { awsRegion } = cloud;
|
|
220
|
+
if (!awsRegion) {
|
|
221
|
+
throw new ConfigError("cloud.awsRegion is required for ECS validation");
|
|
222
|
+
}
|
|
223
|
+
const agents = discoverAgents(projectPath);
|
|
224
|
+
if (agents.length === 0)
|
|
225
|
+
return;
|
|
226
|
+
const iamClient = new IAMClient({ region: awsRegion });
|
|
227
|
+
const missing = [];
|
|
228
|
+
const hasIncorrectTrust = [];
|
|
229
|
+
for (const name of agents) {
|
|
230
|
+
const roleName = AWS_CONSTANTS.taskRoleName(name);
|
|
231
|
+
try {
|
|
232
|
+
const role = await iamClient.send(new GetRoleCommand({ RoleName: roleName }));
|
|
233
|
+
// Check if the role has the correct trust policy for ECS tasks
|
|
234
|
+
const trustPolicy = JSON.parse(decodeURIComponent(role.Role.AssumeRolePolicyDocument));
|
|
235
|
+
const hasEcsTrust = trustPolicy.Statement?.some((stmt) => stmt.Effect === "Allow" &&
|
|
236
|
+
stmt.Principal?.Service === "ecs-tasks.amazonaws.com" &&
|
|
237
|
+
(stmt.Action === "sts:AssumeRole" || stmt.Action?.includes("sts:AssumeRole")));
|
|
238
|
+
if (!hasEcsTrust) {
|
|
239
|
+
hasIncorrectTrust.push(roleName);
|
|
240
|
+
console.log(` [TRUST ISSUE] ${roleName} - missing ECS task trust policy`);
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
console.log(` [ok] ${roleName}`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
if (err.name === "NoSuchEntityException") {
|
|
248
|
+
missing.push(roleName);
|
|
249
|
+
console.log(` [MISSING] ${roleName}`);
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
console.log(` [ERROR] ${roleName}: ${err.message}`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if (missing.length > 0 || hasIncorrectTrust.length > 0) {
|
|
257
|
+
console.log(`\nFound IAM role issues that will cause ECS task failures:`);
|
|
258
|
+
if (missing.length > 0) {
|
|
259
|
+
console.log(`\n${missing.length} IAM task role(s) are missing:`);
|
|
260
|
+
missing.forEach(role => console.log(` - ${role}`));
|
|
261
|
+
console.log(`\nFix: Run 'al doctor -c' to create missing roles automatically.`);
|
|
262
|
+
}
|
|
263
|
+
if (hasIncorrectTrust.length > 0) {
|
|
264
|
+
console.log(`\n${hasIncorrectTrust.length} IAM role(s) have incorrect trust policies:`);
|
|
265
|
+
hasIncorrectTrust.forEach(role => console.log(` - ${role}`));
|
|
266
|
+
console.log(`\nFix: Update trust policy to allow ECS tasks to assume the role:`);
|
|
267
|
+
console.log(`For each role above, run:`);
|
|
268
|
+
console.log(` aws iam update-assume-role-policy --role-name ROLE_NAME --policy-document file://ecs-trust.json`);
|
|
269
|
+
}
|
|
270
|
+
console.log(`\nECS task trust policy (save as ecs-trust.json):`);
|
|
271
|
+
console.log(JSON.stringify({
|
|
272
|
+
Version: "2012-10-17",
|
|
273
|
+
Statement: [{
|
|
274
|
+
Effect: "Allow",
|
|
275
|
+
Principal: { Service: "ecs-tasks.amazonaws.com" },
|
|
276
|
+
Action: "sts:AssumeRole",
|
|
277
|
+
}],
|
|
278
|
+
}, null, 2));
|
|
279
|
+
console.log(`\nAlternatively, re-run the cloud setup to fix all issues:`);
|
|
280
|
+
console.log(` al cloud setup`);
|
|
281
|
+
// Throw error to prevent proceeding with invalid configuration
|
|
282
|
+
throw new CloudProviderError(`${missing.length + hasIncorrectTrust.length} IAM task role(s) have issues that will prevent ECS tasks from starting. Fix the roles above before proceeding.`);
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
console.log(`All ${agents.length} IAM task role(s) exist and have correct trust policies.`);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Ensure the ECR repository policy grants Lambda pull access.
|
|
290
|
+
*/
|
|
291
|
+
export async function ensureLambdaEcrPolicy(awsRegion, ecrRepoUri) {
|
|
292
|
+
const repoName = ecrRepoUri.split("/").pop();
|
|
293
|
+
if (!repoName)
|
|
294
|
+
return;
|
|
295
|
+
const ecrClient = new ECRClient({ region: awsRegion });
|
|
296
|
+
const policy = JSON.stringify({
|
|
297
|
+
Version: "2012-10-17",
|
|
298
|
+
Statement: [{
|
|
299
|
+
Sid: "LambdaECRImageRetrievalPolicy",
|
|
300
|
+
Effect: "Allow",
|
|
301
|
+
Principal: { Service: "lambda.amazonaws.com" },
|
|
302
|
+
Action: [
|
|
303
|
+
"ecr:BatchGetImage",
|
|
304
|
+
"ecr:GetDownloadUrlForLayer",
|
|
305
|
+
],
|
|
306
|
+
}],
|
|
307
|
+
});
|
|
308
|
+
try {
|
|
309
|
+
await ecrClient.send(new SetRepositoryPolicyCommand({
|
|
310
|
+
repositoryName: repoName,
|
|
311
|
+
policyText: policy,
|
|
312
|
+
}));
|
|
313
|
+
console.log(`ECR repository policy: granted Lambda pull access`);
|
|
314
|
+
}
|
|
315
|
+
catch (err) {
|
|
316
|
+
console.log(`Warning: could not set ECR repository policy for Lambda: ${err.message}`);
|
|
317
|
+
}
|
|
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
|
+
*/
|
|
325
|
+
export async function reconcileLambdaRoles(projectPath, cloud) {
|
|
326
|
+
const { awsRegion, ecrRepository, awsSecretPrefix } = cloud;
|
|
327
|
+
if (!awsRegion || !ecrRepository)
|
|
328
|
+
return;
|
|
329
|
+
const secretPrefix = awsSecretPrefix || CONSTANTS.DEFAULT_SECRET_PREFIX;
|
|
330
|
+
const accountMatch = ecrRepository.match(/^(\d+)\.dkr\.ecr\./);
|
|
331
|
+
if (!accountMatch)
|
|
332
|
+
return;
|
|
333
|
+
const accountId = accountMatch[1];
|
|
334
|
+
const globalConfig = loadGlobalConfig(projectPath);
|
|
335
|
+
const agents = discoverAgents(projectPath);
|
|
336
|
+
const iamClient = new IAMClient({ region: awsRegion });
|
|
337
|
+
// Trust policy for Lambda
|
|
338
|
+
const trustPolicy = JSON.stringify({
|
|
339
|
+
Version: "2012-10-17",
|
|
340
|
+
Statement: [{
|
|
341
|
+
Effect: "Allow",
|
|
342
|
+
Principal: { Service: "lambda.amazonaws.com" },
|
|
343
|
+
Action: "sts:AssumeRole",
|
|
344
|
+
}],
|
|
345
|
+
});
|
|
346
|
+
let created = 0;
|
|
347
|
+
for (const name of agents) {
|
|
348
|
+
const config = loadAgentConfig(projectPath, name);
|
|
349
|
+
const effectiveTimeout = config.timeout ?? globalConfig.local?.timeout ?? 900;
|
|
350
|
+
// Only create Lambda roles for agents that will route to Lambda
|
|
351
|
+
if (effectiveTimeout > AWS_CONSTANTS.LAMBDA_MAX_TIMEOUT)
|
|
352
|
+
continue;
|
|
353
|
+
const roleName = AWS_CONSTANTS.lambdaRoleName(name);
|
|
354
|
+
// Create role
|
|
355
|
+
try {
|
|
356
|
+
await iamClient.send(new CreateRoleCommand({
|
|
357
|
+
RoleName: roleName,
|
|
358
|
+
AssumeRolePolicyDocument: trustPolicy,
|
|
359
|
+
}));
|
|
360
|
+
console.log(` Created Lambda role: ${roleName}`);
|
|
361
|
+
created++;
|
|
362
|
+
}
|
|
363
|
+
catch (err) {
|
|
364
|
+
if (err.name === "EntityAlreadyExistsException") {
|
|
365
|
+
console.log(` [ok] ${roleName}`);
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
console.log(` [ERROR] ${roleName}: ${err.message}`);
|
|
369
|
+
continue;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
// Add secrets + ECR + logs policy
|
|
373
|
+
const credRefs = [...new Set(config.credentials)];
|
|
374
|
+
if (config.model.authType !== "pi_auth" && !credRefs.includes("anthropic_key:default")) {
|
|
375
|
+
credRefs.push("anthropic_key:default");
|
|
376
|
+
}
|
|
377
|
+
const secretArns = credRefs.map((ref) => {
|
|
378
|
+
const { type, instance } = parseCredentialRef(ref);
|
|
379
|
+
return `arn:aws:secretsmanager:${awsRegion}:${accountId}:secret:${secretPrefix}/${type}/${instance}/*`;
|
|
380
|
+
});
|
|
381
|
+
const policy = JSON.stringify({
|
|
382
|
+
Version: "2012-10-17",
|
|
383
|
+
Statement: [
|
|
384
|
+
{
|
|
385
|
+
Effect: "Allow",
|
|
386
|
+
Action: "secretsmanager:GetSecretValue",
|
|
387
|
+
Resource: secretArns,
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
Effect: "Allow",
|
|
391
|
+
Action: [
|
|
392
|
+
"logs:CreateLogGroup",
|
|
393
|
+
"logs:CreateLogStream",
|
|
394
|
+
"logs:PutLogEvents",
|
|
395
|
+
],
|
|
396
|
+
Resource: `arn:aws:logs:${awsRegion}:${accountId}:*`,
|
|
397
|
+
},
|
|
398
|
+
{
|
|
399
|
+
Effect: "Allow",
|
|
400
|
+
Action: "ecr:GetAuthorizationToken",
|
|
401
|
+
Resource: "*",
|
|
402
|
+
},
|
|
403
|
+
{
|
|
404
|
+
Effect: "Allow",
|
|
405
|
+
Action: [
|
|
406
|
+
"ecr:BatchGetImage",
|
|
407
|
+
"ecr:GetDownloadUrlForLayer",
|
|
408
|
+
],
|
|
409
|
+
Resource: `arn:aws:ecr:${awsRegion}:${accountId}:repository/*`,
|
|
410
|
+
},
|
|
411
|
+
],
|
|
412
|
+
});
|
|
413
|
+
try {
|
|
414
|
+
await iamClient.send(new PutRolePolicyCommand({
|
|
415
|
+
RoleName: roleName,
|
|
416
|
+
PolicyName: "LambdaExecution",
|
|
417
|
+
PolicyDocument: policy,
|
|
418
|
+
}));
|
|
419
|
+
}
|
|
420
|
+
catch (err) {
|
|
421
|
+
console.log(` Warning: failed to put policy on ${roleName}: ${err.message}`);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
if (created > 0) {
|
|
425
|
+
console.log(`Created ${created} Lambda execution role(s).`);
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
console.log(`All Lambda roles up to date.`);
|
|
429
|
+
}
|
|
430
|
+
// Grant iam:PassRole on Lambda roles to the calling identity
|
|
431
|
+
const lambdaRoleArns = agents
|
|
432
|
+
.filter((name) => {
|
|
433
|
+
const config = loadAgentConfig(projectPath, name);
|
|
434
|
+
const effectiveTimeout = config.timeout ?? globalConfig.local?.timeout ?? 900;
|
|
435
|
+
return effectiveTimeout <= AWS_CONSTANTS.LAMBDA_MAX_TIMEOUT;
|
|
436
|
+
})
|
|
437
|
+
.map((name) => `arn:aws:iam::${accountId}:role/${AWS_CONSTANTS.lambdaRoleName(name)}`);
|
|
438
|
+
if (lambdaRoleArns.length > 0) {
|
|
439
|
+
await grantPassRole(awsRegion, iamClient, lambdaRoleArns, "ActionLlamaLambdaPassRole");
|
|
440
|
+
}
|
|
441
|
+
}
|
|
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"}
|