@action-llama/action-llama 0.8.1 → 0.9.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 (46) hide show
  1. package/dist/agents/lambda-handler.js +16 -0
  2. package/dist/agents/lambda-handler.js.map +1 -1
  3. package/dist/cli/commands/cloud-deploy.d.ts +15 -0
  4. package/dist/cli/commands/cloud-deploy.d.ts.map +1 -0
  5. package/dist/cli/commands/cloud-deploy.js +128 -0
  6. package/dist/cli/commands/cloud-deploy.js.map +1 -0
  7. package/dist/cli/commands/cloud-teardown.js +12 -2
  8. package/dist/cli/commands/cloud-teardown.js.map +1 -1
  9. package/dist/cli/commands/logs.d.ts.map +1 -1
  10. package/dist/cli/commands/logs.js +31 -0
  11. package/dist/cli/commands/logs.js.map +1 -1
  12. package/dist/cli/commands/status.d.ts.map +1 -1
  13. package/dist/cli/commands/status.js +25 -0
  14. package/dist/cli/commands/status.js.map +1 -1
  15. package/dist/cli/main.js +8 -0
  16. package/dist/cli/main.js.map +1 -1
  17. package/dist/cloud/deploy-apprunner.d.ts +37 -0
  18. package/dist/cloud/deploy-apprunner.d.ts.map +1 -0
  19. package/dist/cloud/deploy-apprunner.js +201 -0
  20. package/dist/cloud/deploy-apprunner.js.map +1 -0
  21. package/dist/cloud/deploy-cloudrun.d.ts +36 -0
  22. package/dist/cloud/deploy-cloudrun.d.ts.map +1 -0
  23. package/dist/cloud/deploy-cloudrun.js +154 -0
  24. package/dist/cloud/deploy-cloudrun.js.map +1 -0
  25. package/dist/cloud/image-builder.d.ts +33 -0
  26. package/dist/cloud/image-builder.d.ts.map +1 -0
  27. package/dist/cloud/image-builder.js +108 -0
  28. package/dist/cloud/image-builder.js.map +1 -0
  29. package/dist/cloud/scheduler-image.d.ts +27 -0
  30. package/dist/cloud/scheduler-image.d.ts.map +1 -0
  31. package/dist/cloud/scheduler-image.js +107 -0
  32. package/dist/cloud/scheduler-image.js.map +1 -0
  33. package/dist/docker/lambda-runtime.d.ts.map +1 -1
  34. package/dist/docker/lambda-runtime.js +12 -4
  35. package/dist/docker/lambda-runtime.js.map +1 -1
  36. package/dist/scheduler/index.d.ts.map +1 -1
  37. package/dist/scheduler/index.js +21 -107
  38. package/dist/scheduler/index.js.map +1 -1
  39. package/dist/shared/aws-constants.d.ts +12 -0
  40. package/dist/shared/aws-constants.d.ts.map +1 -1
  41. package/dist/shared/aws-constants.js +12 -0
  42. package/dist/shared/aws-constants.js.map +1 -1
  43. package/dist/shared/config.d.ts +4 -0
  44. package/dist/shared/config.d.ts.map +1 -1
  45. package/dist/shared/config.js.map +1 -1
  46. package/package.json +2 -1
@@ -0,0 +1,201 @@
1
+ /**
2
+ * AWS App Runner deployment for the cloud scheduler.
3
+ *
4
+ * Creates or updates an App Runner service that runs the scheduler as a
5
+ * long-running container with an HTTPS endpoint for webhooks.
6
+ */
7
+ import { AppRunnerClient, CreateServiceCommand, UpdateServiceCommand, DescribeServiceCommand, DeleteServiceCommand, ListServicesCommand, } from "@aws-sdk/client-apprunner";
8
+ import { CloudWatchLogsClient, FilterLogEventsCommand, } from "@aws-sdk/client-cloudwatch-logs";
9
+ import { AWS_CONSTANTS } from "../shared/aws-constants.js";
10
+ /**
11
+ * Deploy (create or update) the scheduler as an App Runner service.
12
+ */
13
+ export async function deployAppRunner(opts) {
14
+ const { imageUri, cloudConfig, port = 8080, envVars = {} } = opts;
15
+ const region = cloudConfig.awsRegion;
16
+ const client = new AppRunnerClient({ region });
17
+ const serviceName = AWS_CONSTANTS.SCHEDULER_SERVICE;
18
+ const cpu = cloudConfig.schedulerCpu || "256"; // 0.25 vCPU
19
+ const memory = cloudConfig.schedulerMemory || "512"; // 512 MB
20
+ const instanceRoleArn = cloudConfig.appRunnerInstanceRoleArn;
21
+ const accessRoleArn = cloudConfig.appRunnerAccessRoleArn;
22
+ if (!accessRoleArn) {
23
+ throw new Error("cloud.appRunnerAccessRoleArn is required for App Runner deployment. " +
24
+ "This IAM role allows App Runner to pull images from ECR.");
25
+ }
26
+ const existing = await findService(client, serviceName);
27
+ const runtimeEnvVars = Object.entries(envVars).map(([name, value]) => ({ Name: name, Value: value }));
28
+ if (existing) {
29
+ // Update existing service
30
+ const res = await client.send(new UpdateServiceCommand({
31
+ ServiceArn: existing.serviceArn,
32
+ SourceConfiguration: {
33
+ ImageRepository: {
34
+ ImageIdentifier: imageUri,
35
+ ImageRepositoryType: "ECR",
36
+ ImageConfiguration: {
37
+ Port: String(port),
38
+ RuntimeEnvironmentVariables: Object.fromEntries(runtimeEnvVars.map(e => [e.Name, e.Value])),
39
+ },
40
+ },
41
+ AuthenticationConfiguration: {
42
+ AccessRoleArn: accessRoleArn,
43
+ },
44
+ },
45
+ InstanceConfiguration: {
46
+ Cpu: cpu,
47
+ Memory: memory,
48
+ ...(instanceRoleArn ? { InstanceRoleArn: instanceRoleArn } : {}),
49
+ },
50
+ HealthCheckConfiguration: {
51
+ Protocol: "HTTP",
52
+ Path: "/health",
53
+ Interval: 10,
54
+ Timeout: 5,
55
+ HealthyThreshold: 1,
56
+ UnhealthyThreshold: 5,
57
+ },
58
+ }));
59
+ return await waitForService(client, res.Service.ServiceArn);
60
+ }
61
+ // Create new service
62
+ const res = await client.send(new CreateServiceCommand({
63
+ ServiceName: serviceName,
64
+ SourceConfiguration: {
65
+ ImageRepository: {
66
+ ImageIdentifier: imageUri,
67
+ ImageRepositoryType: "ECR",
68
+ ImageConfiguration: {
69
+ Port: String(port),
70
+ RuntimeEnvironmentVariables: Object.fromEntries(runtimeEnvVars.map(e => [e.Name, e.Value])),
71
+ },
72
+ },
73
+ AuthenticationConfiguration: {
74
+ AccessRoleArn: accessRoleArn,
75
+ },
76
+ AutoDeploymentsEnabled: false,
77
+ },
78
+ InstanceConfiguration: {
79
+ Cpu: cpu,
80
+ Memory: memory,
81
+ ...(instanceRoleArn ? { InstanceRoleArn: instanceRoleArn } : {}),
82
+ },
83
+ HealthCheckConfiguration: {
84
+ Protocol: "HTTP",
85
+ Path: "/health",
86
+ Interval: 10,
87
+ Timeout: 5,
88
+ HealthyThreshold: 1,
89
+ UnhealthyThreshold: 5,
90
+ },
91
+ }));
92
+ return await waitForService(client, res.Service.ServiceArn);
93
+ }
94
+ /**
95
+ * Get the current status of the scheduler App Runner service.
96
+ */
97
+ export async function getAppRunnerStatus(cloudConfig) {
98
+ const client = new AppRunnerClient({ region: cloudConfig.awsRegion });
99
+ return findService(client, AWS_CONSTANTS.SCHEDULER_SERVICE);
100
+ }
101
+ /**
102
+ * Fetch recent scheduler logs from CloudWatch.
103
+ */
104
+ export async function getAppRunnerLogs(cloudConfig, limit) {
105
+ const logsClient = new CloudWatchLogsClient({ region: cloudConfig.awsRegion });
106
+ const logGroup = AWS_CONSTANTS.APPRUNNER_LOG_GROUP;
107
+ try {
108
+ const allEvents = [];
109
+ let nextToken;
110
+ do {
111
+ const res = await logsClient.send(new FilterLogEventsCommand({
112
+ logGroupName: logGroup,
113
+ startTime: Date.now() - 24 * 3600_000,
114
+ ...(nextToken ? { nextToken } : {}),
115
+ }));
116
+ for (const e of res.events ?? []) {
117
+ const msg = e.message?.trimEnd();
118
+ if (msg)
119
+ allEvents.push(msg);
120
+ }
121
+ nextToken = res.nextToken;
122
+ } while (nextToken);
123
+ return allEvents.slice(-limit);
124
+ }
125
+ catch (err) {
126
+ if (err.name === "ResourceNotFoundException") {
127
+ return [];
128
+ }
129
+ throw err;
130
+ }
131
+ }
132
+ /**
133
+ * Delete the scheduler App Runner service.
134
+ */
135
+ export async function teardownAppRunner(cloudConfig) {
136
+ const client = new AppRunnerClient({ region: cloudConfig.awsRegion });
137
+ const existing = await findService(client, AWS_CONSTANTS.SCHEDULER_SERVICE);
138
+ if (!existing) {
139
+ console.log(" App Runner service not found (already deleted)");
140
+ return;
141
+ }
142
+ console.log(` Deleting App Runner service: ${existing.serviceArn}`);
143
+ await client.send(new DeleteServiceCommand({
144
+ ServiceArn: existing.serviceArn,
145
+ }));
146
+ console.log(" App Runner service deletion initiated");
147
+ }
148
+ // --- Internal helpers ---
149
+ async function findService(client, serviceName) {
150
+ let nextToken;
151
+ do {
152
+ const res = await client.send(new ListServicesCommand({
153
+ ...(nextToken ? { NextToken: nextToken } : {}),
154
+ }));
155
+ for (const svc of res.ServiceSummaryList ?? []) {
156
+ if (svc.ServiceName === serviceName) {
157
+ // Get full details
158
+ const detail = await client.send(new DescribeServiceCommand({
159
+ ServiceArn: svc.ServiceArn,
160
+ }));
161
+ const s = detail.Service;
162
+ return {
163
+ serviceArn: s.ServiceArn,
164
+ serviceUrl: `https://${s.ServiceUrl}`,
165
+ status: s.Status,
166
+ createdAt: s.CreatedAt,
167
+ updatedAt: s.UpdatedAt,
168
+ };
169
+ }
170
+ }
171
+ nextToken = res.NextToken;
172
+ } while (nextToken);
173
+ return null;
174
+ }
175
+ async function waitForService(client, serviceArn) {
176
+ const maxWait = 10 * 60_000; // 10 minutes
177
+ const start = Date.now();
178
+ while (Date.now() - start < maxWait) {
179
+ const res = await client.send(new DescribeServiceCommand({ ServiceArn: serviceArn }));
180
+ const s = res.Service;
181
+ const status = s.Status;
182
+ if (status === "RUNNING") {
183
+ return {
184
+ serviceArn: s.ServiceArn,
185
+ serviceUrl: `https://${s.ServiceUrl}`,
186
+ status,
187
+ createdAt: s.CreatedAt,
188
+ updatedAt: s.UpdatedAt,
189
+ };
190
+ }
191
+ if (status === "CREATE_FAILED" || status === "DELETE_FAILED") {
192
+ throw new Error(`App Runner service entered ${status} state`);
193
+ }
194
+ await sleep(10_000);
195
+ }
196
+ throw new Error("Timed out waiting for App Runner service to become RUNNING");
197
+ }
198
+ function sleep(ms) {
199
+ return new Promise((r) => setTimeout(r, ms));
200
+ }
201
+ //# sourceMappingURL=deploy-apprunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-apprunner.js","sourceRoot":"","sources":["../../src/cloud/deploy-apprunner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * GCP Cloud Run service deployment for the cloud scheduler.
3
+ *
4
+ * Creates or updates a Cloud Run service that runs the scheduler as a
5
+ * long-running container with an HTTPS endpoint for webhooks.
6
+ */
7
+ import type { CloudConfig } from "../shared/config.js";
8
+ export interface CloudRunDeployOpts {
9
+ imageUri: string;
10
+ cloudConfig: CloudConfig;
11
+ port?: number;
12
+ envVars?: Record<string, string>;
13
+ }
14
+ export interface CloudRunServiceInfo {
15
+ serviceName: string;
16
+ serviceUrl: string;
17
+ status: string;
18
+ region: string;
19
+ }
20
+ /**
21
+ * Deploy (create or update) the scheduler as a Cloud Run service.
22
+ */
23
+ export declare function deployCloudRun(opts: CloudRunDeployOpts): Promise<CloudRunServiceInfo>;
24
+ /**
25
+ * Get the current status of the scheduler Cloud Run service.
26
+ */
27
+ export declare function getCloudRunStatus(cloudConfig: CloudConfig): Promise<CloudRunServiceInfo | null>;
28
+ /**
29
+ * Fetch recent scheduler logs from Cloud Logging.
30
+ */
31
+ export declare function getCloudRunLogs(cloudConfig: CloudConfig, limit: number): Promise<string[]>;
32
+ /**
33
+ * Delete the scheduler Cloud Run service.
34
+ */
35
+ export declare function teardownCloudRunService(cloudConfig: CloudConfig): Promise<void>;
36
+ //# sourceMappingURL=deploy-cloudrun.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-cloudrun.d.ts","sourceRoot":"","sources":["../../src/cloud/deploy-cloudrun.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAyD3F;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAiCrG;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAoBhG;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBrF"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * GCP Cloud Run service deployment for the cloud scheduler.
3
+ *
4
+ * Creates or updates a Cloud Run service that runs the scheduler as a
5
+ * long-running container with an HTTPS endpoint for webhooks.
6
+ */
7
+ import { execFileSync } from "child_process";
8
+ import { AWS_CONSTANTS } from "../shared/aws-constants.js";
9
+ /**
10
+ * Deploy (create or update) the scheduler as a Cloud Run service.
11
+ */
12
+ export async function deployCloudRun(opts) {
13
+ const { imageUri, cloudConfig, port = 8080, envVars = {} } = opts;
14
+ const { gcpProject, region, serviceAccount } = cloudConfig;
15
+ if (!gcpProject || !region) {
16
+ throw new Error("cloud.gcpProject and cloud.region are required for Cloud Run deployment.");
17
+ }
18
+ const serviceName = AWS_CONSTANTS.SCHEDULER_CLOUD_RUN_SERVICE;
19
+ const cpu = cloudConfig.schedulerCpu || "1";
20
+ const memory = cloudConfig.schedulerMemory || "512Mi";
21
+ // Build env var flags
22
+ const envParts = [];
23
+ for (const [key, value] of Object.entries(envVars)) {
24
+ envParts.push(`${key}=${value}`);
25
+ }
26
+ const envFlag = envParts.length > 0 ? envParts.join(",") : undefined;
27
+ const args = [
28
+ "run", "deploy", serviceName,
29
+ "--image", imageUri,
30
+ "--project", gcpProject,
31
+ "--region", region,
32
+ "--port", String(port),
33
+ "--cpu", cpu,
34
+ "--memory", memory,
35
+ "--min-instances", "1",
36
+ "--max-instances", "1",
37
+ "--allow-unauthenticated",
38
+ "--quiet",
39
+ ];
40
+ if (serviceAccount) {
41
+ args.push("--service-account", serviceAccount);
42
+ }
43
+ if (envFlag) {
44
+ args.push("--set-env-vars", envFlag);
45
+ }
46
+ gcloud(args);
47
+ // Get the service URL
48
+ const url = gcloud([
49
+ "run", "services", "describe", serviceName,
50
+ "--project", gcpProject,
51
+ "--region", region,
52
+ "--format", "value(status.url)",
53
+ ]);
54
+ return {
55
+ serviceName,
56
+ serviceUrl: url,
57
+ status: "RUNNING",
58
+ region: region,
59
+ };
60
+ }
61
+ /**
62
+ * Get the current status of the scheduler Cloud Run service.
63
+ */
64
+ export async function getCloudRunStatus(cloudConfig) {
65
+ const { gcpProject, region } = cloudConfig;
66
+ if (!gcpProject || !region)
67
+ return null;
68
+ const serviceName = AWS_CONSTANTS.SCHEDULER_CLOUD_RUN_SERVICE;
69
+ try {
70
+ const url = gcloud([
71
+ "run", "services", "describe", serviceName,
72
+ "--project", gcpProject,
73
+ "--region", region,
74
+ "--format", "value(status.url)",
75
+ ]);
76
+ const conditions = gcloud([
77
+ "run", "services", "describe", serviceName,
78
+ "--project", gcpProject,
79
+ "--region", region,
80
+ "--format", "value(status.conditions[0].type)",
81
+ ]);
82
+ return {
83
+ serviceName,
84
+ serviceUrl: url,
85
+ status: conditions || "UNKNOWN",
86
+ region,
87
+ };
88
+ }
89
+ catch (err) {
90
+ if (err.message?.includes("NOT_FOUND") || err.message?.includes("could not be found")) {
91
+ return null;
92
+ }
93
+ throw err;
94
+ }
95
+ }
96
+ /**
97
+ * Fetch recent scheduler logs from Cloud Logging.
98
+ */
99
+ export async function getCloudRunLogs(cloudConfig, limit) {
100
+ const { gcpProject, region } = cloudConfig;
101
+ if (!gcpProject || !region)
102
+ return [];
103
+ const serviceName = AWS_CONSTANTS.SCHEDULER_CLOUD_RUN_SERVICE;
104
+ try {
105
+ const output = gcloud([
106
+ "logging", "read",
107
+ `resource.type="cloud_run_revision" AND resource.labels.service_name="${serviceName}"`,
108
+ "--project", gcpProject,
109
+ "--limit", String(limit),
110
+ "--format", "value(textPayload)",
111
+ "--freshness", "1d",
112
+ ]);
113
+ return output.split("\n").filter(Boolean).reverse();
114
+ }
115
+ catch {
116
+ return [];
117
+ }
118
+ }
119
+ /**
120
+ * Delete the scheduler Cloud Run service.
121
+ */
122
+ export async function teardownCloudRunService(cloudConfig) {
123
+ const { gcpProject, region } = cloudConfig;
124
+ if (!gcpProject || !region) {
125
+ console.log(" Incomplete GCP config. Skipping Cloud Run service teardown.");
126
+ return;
127
+ }
128
+ const serviceName = AWS_CONSTANTS.SCHEDULER_CLOUD_RUN_SERVICE;
129
+ try {
130
+ gcloud([
131
+ "run", "services", "delete", serviceName,
132
+ "--project", gcpProject,
133
+ "--region", region,
134
+ "--quiet",
135
+ ]);
136
+ console.log(` Deleted Cloud Run service: ${serviceName}`);
137
+ }
138
+ catch (err) {
139
+ if (err.message?.includes("NOT_FOUND") || err.message?.includes("could not be found")) {
140
+ console.log(` Cloud Run service not found (already deleted)`);
141
+ }
142
+ else {
143
+ console.log(` Warning: ${err.message}`);
144
+ }
145
+ }
146
+ }
147
+ function gcloud(args) {
148
+ return execFileSync("gcloud", args, {
149
+ encoding: "utf-8",
150
+ timeout: 120_000,
151
+ stdio: ["pipe", "pipe", "pipe"],
152
+ }).trim();
153
+ }
154
+ //# sourceMappingURL=deploy-cloudrun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-cloudrun.js","sourceRoot":"","sources":["../../src/cloud/deploy-cloudrun.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Shared image build logic used by both `al start` (scheduler) and `al cloud deploy`.
3
+ *
4
+ * Extracted from src/scheduler/index.ts to avoid duplicating the base-image +
5
+ * per-agent image build pipeline.
6
+ */
7
+ import type { AgentConfig, GlobalConfig } from "../shared/config.js";
8
+ import type { ContainerRuntime } from "../docker/runtime.js";
9
+ import { type PromptSkills } from "../agents/prompt.js";
10
+ import type { StatusTracker } from "../tui/status-tracker.js";
11
+ import type { Logger } from "../shared/logger.js";
12
+ export interface ImageBuildOpts {
13
+ projectPath: string;
14
+ globalConfig: GlobalConfig;
15
+ activeAgentConfigs: AgentConfig[];
16
+ runtime: ContainerRuntime;
17
+ /** "local" | "cloud-run" | "ecs" */
18
+ runtimeType: string;
19
+ statusTracker?: StatusTracker;
20
+ logger: Logger;
21
+ skills?: PromptSkills;
22
+ }
23
+ export interface ImageBuildResult {
24
+ baseImage: string;
25
+ agentImages: Record<string, string>;
26
+ }
27
+ /**
28
+ * Build the base image, per-agent images, and push to remote registry.
29
+ *
30
+ * Returns the resolved base image URI and a map of agent name → image URI.
31
+ */
32
+ export declare function buildAllImages(opts: ImageBuildOpts): Promise<ImageBuildResult>;
33
+ //# sourceMappingURL=image-builder.d.ts.map
@@ -0,0 +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;CACvB;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,CAsGpF"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Shared image build logic used by both `al start` (scheduler) and `al cloud deploy`.
3
+ *
4
+ * Extracted from src/scheduler/index.ts to avoid duplicating the base-image +
5
+ * per-agent image build pipeline.
6
+ */
7
+ import { existsSync, readFileSync } from "fs";
8
+ import { resolve as resolvePath, dirname } from "path";
9
+ import { fileURLToPath } from "url";
10
+ import { AWS_CONSTANTS } from "../shared/aws-constants.js";
11
+ import { buildPromptSkeleton } from "../agents/prompt.js";
12
+ /** Resolve to the package root (two levels up from src/cloud/) */
13
+ const packageRoot = resolvePath(dirname(fileURLToPath(import.meta.url)), "..", "..");
14
+ /**
15
+ * Build the base image, per-agent images, and push to remote registry.
16
+ *
17
+ * Returns the resolved base image URI and a map of agent name → image URI.
18
+ */
19
+ export async function buildAllImages(opts) {
20
+ const { projectPath, globalConfig, activeAgentConfigs, runtime, runtimeType, statusTracker, logger, skills } = opts;
21
+ // 1. Build base image
22
+ let baseImage = globalConfig.local?.image || AWS_CONSTANTS.DEFAULT_IMAGE;
23
+ logger.info({ image: baseImage }, "Building base image (this may take a few minutes on first run)...");
24
+ const setBaseImageProgress = (msg) => {
25
+ statusTracker?.setBaseImageStatus(msg);
26
+ };
27
+ if (runtimeType === "local") {
28
+ const { imageExists } = await import("../docker/image.js");
29
+ if (!imageExists(baseImage)) {
30
+ setBaseImageProgress("Building");
31
+ await runtime.buildImage({
32
+ tag: baseImage, dockerfile: "docker/Dockerfile", contextDir: packageRoot,
33
+ onProgress: setBaseImageProgress,
34
+ });
35
+ }
36
+ }
37
+ else {
38
+ baseImage = await runtime.buildImage({
39
+ tag: baseImage, dockerfile: "docker/Dockerfile", contextDir: packageRoot,
40
+ onProgress: setBaseImageProgress,
41
+ });
42
+ }
43
+ statusTracker?.setBaseImageStatus(null);
44
+ // 2. Build per-agent images in parallel
45
+ const agentImages = {};
46
+ await Promise.all(activeAgentConfigs.map(async (agentConfig) => {
47
+ statusTracker?.setAgentState(agentConfig.name, "building");
48
+ statusTracker?.setAgentStatusText(agentConfig.name, "Building agent image");
49
+ const hasCustomDockerfile = existsSync(resolvePath(projectPath, agentConfig.name, "Dockerfile"));
50
+ const actionsPath = resolvePath(projectPath, agentConfig.name, "ACTIONS.md");
51
+ const actionsMd = existsSync(actionsPath) ? readFileSync(actionsPath, "utf-8") : "";
52
+ const timeout = String(agentConfig.timeout ?? globalConfig.local?.timeout ?? 900);
53
+ const extraFiles = {
54
+ "agent-config.json": JSON.stringify(agentConfig),
55
+ "ACTIONS.md": actionsMd,
56
+ "prompt-static.txt": buildPromptSkeleton(agentConfig, skills),
57
+ "timeout": timeout,
58
+ };
59
+ const agentImageTag = AWS_CONSTANTS.agentImage(agentConfig.name);
60
+ let image;
61
+ if (hasCustomDockerfile) {
62
+ image = await runtime.buildImage({
63
+ tag: agentImageTag,
64
+ dockerfile: resolvePath(projectPath, agentConfig.name, "Dockerfile"),
65
+ contextDir: packageRoot,
66
+ baseImage,
67
+ extraFiles,
68
+ onProgress: (msg) => statusTracker?.setAgentStatusText(agentConfig.name, msg),
69
+ });
70
+ }
71
+ else {
72
+ image = await runtime.buildImage({
73
+ tag: agentImageTag,
74
+ dockerfile: "Dockerfile",
75
+ contextDir: packageRoot,
76
+ dockerfileContent: `FROM ${baseImage}\nCOPY static/ /app/static/\n`,
77
+ extraFiles,
78
+ onProgress: (msg) => statusTracker?.setAgentStatusText(agentConfig.name, msg),
79
+ });
80
+ }
81
+ agentImages[agentConfig.name] = image;
82
+ logger.info({ agent: agentConfig.name, image }, "Built agent image");
83
+ }));
84
+ // 3. Push images to remote registry (no-op for local)
85
+ if (runtimeType !== "local") {
86
+ const imagesToPush = activeAgentConfigs.filter(ac => {
87
+ const currentImage = agentImages[ac.name] || baseImage;
88
+ return !currentImage.includes("/");
89
+ });
90
+ if (imagesToPush.length > 0) {
91
+ await Promise.all(imagesToPush.map(async (agentConfig, idx) => {
92
+ const currentImage = agentImages[agentConfig.name] || baseImage;
93
+ const progressIndicator = imagesToPush.length > 1 ? ` (${idx + 1}/${imagesToPush.length})` : "";
94
+ statusTracker?.setAgentStatusText(agentConfig.name, `Pushing image to registry${progressIndicator}`);
95
+ const remoteImage = await runtime.pushImage(currentImage);
96
+ agentImages[agentConfig.name] = remoteImage;
97
+ logger.info({ agent: agentConfig.name, image: remoteImage, progress: `${idx + 1}/${imagesToPush.length}` }, "Pushed image to registry");
98
+ }));
99
+ }
100
+ }
101
+ // Reset all agents back to idle after builds complete
102
+ for (const ac of activeAgentConfigs) {
103
+ statusTracker?.setAgentState(ac.name, "idle");
104
+ }
105
+ logger.info("Docker infrastructure ready");
106
+ return { baseImage, agentImages };
107
+ }
108
+ //# sourceMappingURL=image-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-builder.js","sourceRoot":"","sources":["../../src/cloud/image-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Build a container image for the cloud scheduler.
3
+ *
4
+ * The scheduler image contains:
5
+ * - The AL CLI (npm package dist + node_modules)
6
+ * - Project config.toml
7
+ * - All agent directories (agent-config.toml, ACTIONS.md, prompt files, Dockerfiles)
8
+ *
9
+ * Entrypoint: `node dist/cli/main.js start -p /app/project -c --headless --gateway`
10
+ */
11
+ import type { GlobalConfig } from "../shared/config.js";
12
+ import type { ContainerRuntime } from "../docker/runtime.js";
13
+ import type { Logger } from "../shared/logger.js";
14
+ export interface SchedulerImageOpts {
15
+ projectPath: string;
16
+ globalConfig: GlobalConfig;
17
+ runtime: ContainerRuntime;
18
+ logger: Logger;
19
+ onProgress?: (msg: string) => void;
20
+ }
21
+ /**
22
+ * Build and push the scheduler container image.
23
+ *
24
+ * Returns the remote image URI (e.g. ECR or Artifact Registry URI).
25
+ */
26
+ export declare function buildSchedulerImage(opts: SchedulerImageOpts): Promise<string>;
27
+ //# sourceMappingURL=scheduler-image.d.ts.map
@@ -0,0 +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;AAgED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiCnF"}