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