@action-llama/action-llama 0.10.0 → 0.10.2
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/dist/agents/container-entry.d.ts +31 -0
- package/dist/agents/container-entry.d.ts.map +1 -1
- package/dist/agents/container-entry.js +67 -108
- package/dist/agents/container-entry.js.map +1 -1
- package/dist/agents/execution-engine.d.ts.map +1 -1
- package/dist/agents/execution-engine.js +2 -15
- package/dist/agents/execution-engine.js.map +1 -1
- package/dist/agents/lambda-handler.d.ts +2 -5
- package/dist/agents/lambda-handler.d.ts.map +1 -1
- package/dist/agents/lambda-handler.js +8 -9
- package/dist/agents/lambda-handler.js.map +1 -1
- package/dist/agents/runner.d.ts.map +1 -1
- package/dist/agents/runner.js +2 -15
- package/dist/agents/runner.js.map +1 -1
- package/dist/agents/signals.d.ts +9 -0
- package/dist/agents/signals.d.ts.map +1 -1
- package/dist/agents/signals.js +11 -0
- package/dist/agents/signals.js.map +1 -1
- package/dist/cli/commands/cloud-iam.d.ts +17 -0
- package/dist/cli/commands/cloud-iam.d.ts.map +1 -0
- package/dist/cli/commands/cloud-iam.js +591 -0
- package/dist/cli/commands/cloud-iam.js.map +1 -0
- package/dist/cli/commands/cloud-setup-ecs.d.ts +9 -0
- package/dist/cli/commands/cloud-setup-ecs.d.ts.map +1 -0
- package/dist/cli/commands/cloud-setup-ecs.js +697 -0
- package/dist/cli/commands/cloud-setup-ecs.js.map +1 -0
- package/dist/cli/commands/cloud-setup.d.ts.map +1 -1
- package/dist/cli/commands/cloud-setup.js +2 -827
- package/dist/cli/commands/cloud-setup.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 +1 -3
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +60 -635
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/kill.d.ts.map +1 -1
- package/dist/cli/commands/kill.js +11 -14
- package/dist/cli/commands/kill.js.map +1 -1
- package/dist/cli/commands/pause.d.ts.map +1 -1
- package/dist/cli/commands/pause.js +11 -14
- package/dist/cli/commands/pause.js.map +1 -1
- package/dist/cli/commands/resume.d.ts.map +1 -1
- package/dist/cli/commands/resume.js +11 -14
- package/dist/cli/commands/resume.js.map +1 -1
- package/dist/cli/main.js +36 -34
- 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/cloud/scheduler-image.d.ts.map +1 -1
- package/dist/cloud/scheduler-image.js +9 -3
- package/dist/cloud/scheduler-image.js.map +1 -1
- package/dist/docker/aws-shared.d.ts.map +1 -1
- package/dist/docker/aws-shared.js +42 -19
- package/dist/docker/aws-shared.js.map +1 -1
- package/dist/docker/lambda-runtime.d.ts +2 -0
- package/dist/docker/lambda-runtime.d.ts.map +1 -1
- package/dist/docker/lambda-runtime.js +28 -10
- package/dist/docker/lambda-runtime.js.map +1 -1
- package/dist/gateway/index.d.ts +1 -0
- package/dist/gateway/index.d.ts.map +1 -1
- package/dist/gateway/index.js +5 -2
- 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/dashboard.d.ts.map +1 -1
- package/dist/gateway/routes/dashboard.js +8 -0
- 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/scheduler/index.d.ts +1 -2
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +22 -180
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/runtime-factory.d.ts +24 -4
- package/dist/scheduler/runtime-factory.d.ts.map +1 -1
- package/dist/scheduler/runtime-factory.js +60 -64
- 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/shared/config.d.ts +1 -0
- package/dist/shared/config.d.ts.map +1 -1
- package/dist/shared/config.js +13 -2
- package/dist/shared/config.js.map +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/git.d.ts.map +1 -1
- package/dist/shared/git.js +3 -2
- package/dist/shared/git.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/Dockerfile +6 -9
- package/docker/bin/al-call +8 -0
- package/docker/bin/al-check +4 -0
- package/docker/bin/al-exit +4 -0
- package/docker/bin/al-rerun +8 -0
- package/docker/bin/al-return +14 -0
- package/docker/bin/al-shutdown +5 -0
- package/docker/bin/al-status +9 -0
- package/docker/bin/al-wait +29 -0
- package/docker/bin/rlock +5 -0
- package/docker/bin/rlock-heartbeat +5 -0
- package/docker/bin/runlock +5 -0
- package/package.json +1 -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
|
@@ -1,29 +1,35 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Container runtime factory.
|
|
3
|
+
*
|
|
4
|
+
* Creates the appropriate ContainerRuntime (local Docker, Cloud Run, ECS/Lambda)
|
|
5
|
+
* based on the project's global config and cloud mode flag.
|
|
6
|
+
*/
|
|
7
|
+
import { ConfigError, AgentError } from "../shared/errors.js";
|
|
8
|
+
import { AWS_CONSTANTS } from "../shared/aws-constants.js";
|
|
2
9
|
import { buildAllImages } from "../cloud/image-builder.js";
|
|
3
|
-
|
|
4
|
-
export async function createRuntime(globalConfig, cloudMode, logger) {
|
|
10
|
+
export async function createContainerRuntime(globalConfig, activeAgentConfigs, cloudMode, logger) {
|
|
5
11
|
const useCloudRuntime = cloudMode && globalConfig.cloud;
|
|
6
12
|
const runtimeType = useCloudRuntime ? globalConfig.cloud.provider : "local";
|
|
7
|
-
|
|
13
|
+
let runtime;
|
|
14
|
+
const agentRuntimeOverrides = {};
|
|
8
15
|
if (useCloudRuntime && globalConfig.cloud.provider === "cloud-run") {
|
|
9
16
|
const { CloudRunJobRuntime } = await import("../docker/cloud-run-runtime.js");
|
|
10
17
|
const { gcpProject, region, artifactRegistry, serviceAccount, secretPrefix } = globalConfig.cloud;
|
|
11
18
|
if (!gcpProject || !region || !artifactRegistry || !serviceAccount) {
|
|
12
|
-
throw new
|
|
19
|
+
throw new ConfigError("Cloud Run runtime requires cloud.gcpProject, cloud.region, " +
|
|
13
20
|
"cloud.artifactRegistry, and cloud.serviceAccount in config.toml");
|
|
14
21
|
}
|
|
15
|
-
|
|
22
|
+
runtime = new CloudRunJobRuntime({ gcpProject, region, artifactRegistry, serviceAccount, secretPrefix });
|
|
16
23
|
logger.info({ gcpProject, region }, "Using Cloud Run Jobs runtime");
|
|
17
|
-
return runtime;
|
|
18
24
|
}
|
|
19
|
-
if (useCloudRuntime && globalConfig.cloud.provider === "ecs") {
|
|
25
|
+
else if (useCloudRuntime && globalConfig.cloud.provider === "ecs") {
|
|
20
26
|
const { ECSFargateRuntime } = await import("../docker/ecs-runtime.js");
|
|
21
27
|
const cc = globalConfig.cloud;
|
|
22
28
|
if (!cc.awsRegion || !cc.ecsCluster || !cc.ecrRepository || !cc.executionRoleArn || !cc.taskRoleArn || !cc.subnets?.length) {
|
|
23
|
-
throw new
|
|
29
|
+
throw new ConfigError("ECS runtime requires cloud.awsRegion, cloud.ecsCluster, cloud.ecrRepository, " +
|
|
24
30
|
"cloud.executionRoleArn, cloud.taskRoleArn, and cloud.subnets in config.toml");
|
|
25
31
|
}
|
|
26
|
-
|
|
32
|
+
runtime = new ECSFargateRuntime({
|
|
27
33
|
awsRegion: cc.awsRegion,
|
|
28
34
|
ecsCluster: cc.ecsCluster,
|
|
29
35
|
ecrRepository: cc.ecrRepository,
|
|
@@ -34,65 +40,55 @@ export async function createRuntime(globalConfig, cloudMode, logger) {
|
|
|
34
40
|
secretPrefix: cc.awsSecretPrefix,
|
|
35
41
|
buildBucket: cc.buildBucket,
|
|
36
42
|
});
|
|
43
|
+
// Create Lambda runtime for short-running agents (timeout <= 900s)
|
|
44
|
+
const { LambdaRuntime } = await import("../docker/lambda-runtime.js");
|
|
45
|
+
const lambdaRuntime = new LambdaRuntime({
|
|
46
|
+
awsRegion: cc.awsRegion,
|
|
47
|
+
ecrRepository: cc.ecrRepository,
|
|
48
|
+
secretPrefix: cc.awsSecretPrefix,
|
|
49
|
+
buildBucket: cc.buildBucket,
|
|
50
|
+
lambdaRoleArn: cc.lambdaRoleArn,
|
|
51
|
+
lambdaSubnets: cc.lambdaSubnets,
|
|
52
|
+
lambdaSecurityGroups: cc.lambdaSecurityGroups,
|
|
53
|
+
});
|
|
54
|
+
for (const ac of activeAgentConfigs) {
|
|
55
|
+
const effectiveTimeout = ac.timeout ?? globalConfig.local?.timeout ?? 900;
|
|
56
|
+
if (effectiveTimeout <= AWS_CONSTANTS.LAMBDA_MAX_TIMEOUT) {
|
|
57
|
+
agentRuntimeOverrides[ac.name] = lambdaRuntime;
|
|
58
|
+
logger.info({ agent: ac.name, timeout: effectiveTimeout }, "Routing to Lambda (timeout <= 900s)");
|
|
59
|
+
}
|
|
60
|
+
}
|
|
37
61
|
logger.info({ region: cc.awsRegion, cluster: cc.ecsCluster }, "Using ECS Fargate runtime");
|
|
38
|
-
return runtime;
|
|
39
|
-
}
|
|
40
|
-
// Local runtime needs Docker running
|
|
41
|
-
try {
|
|
42
|
-
execFileSync("docker", ["info"], { stdio: "pipe", timeout: 10000 });
|
|
43
62
|
}
|
|
44
|
-
|
|
45
|
-
|
|
63
|
+
else {
|
|
64
|
+
// Local runtime needs Docker running
|
|
65
|
+
const { execFileSync } = await import("child_process");
|
|
66
|
+
try {
|
|
67
|
+
execFileSync("docker", ["info"], { stdio: "pipe", timeout: 10000 });
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
throw new AgentError("Docker is not running. Start Docker Desktop (or the Docker daemon) and try again.");
|
|
71
|
+
}
|
|
72
|
+
const { LocalDockerRuntime } = await import("../docker/local-runtime.js");
|
|
73
|
+
runtime = new LocalDockerRuntime();
|
|
74
|
+
// Local-only: ensure Docker network
|
|
75
|
+
logger.info("Ensuring Docker network...");
|
|
76
|
+
const { ensureNetwork } = await import("../docker/network.js");
|
|
77
|
+
ensureNetwork();
|
|
46
78
|
}
|
|
47
|
-
|
|
48
|
-
const runtime = new LocalDockerRuntime();
|
|
49
|
-
// Local-only: ensure Docker network
|
|
50
|
-
logger.info("Ensuring Docker network...");
|
|
51
|
-
ensureNetwork();
|
|
52
|
-
return runtime;
|
|
79
|
+
return { runtime: runtime, agentRuntimeOverrides, runtimeType };
|
|
53
80
|
}
|
|
54
|
-
export async function buildAgentImages(
|
|
55
|
-
const useCloudRuntime = cloudMode && globalConfig.cloud;
|
|
56
|
-
const runtimeType = useCloudRuntime ? globalConfig.cloud.provider : "local";
|
|
57
|
-
// Build base + per-agent images via shared image builder
|
|
58
|
-
const buildSkills = { locking: true };
|
|
81
|
+
export async function buildAgentImages(opts) {
|
|
59
82
|
const buildResult = await buildAllImages({
|
|
60
|
-
projectPath,
|
|
61
|
-
globalConfig,
|
|
62
|
-
activeAgentConfigs,
|
|
63
|
-
runtime,
|
|
64
|
-
runtimeType,
|
|
65
|
-
statusTracker,
|
|
66
|
-
logger: logger,
|
|
67
|
-
skills:
|
|
83
|
+
projectPath: opts.projectPath,
|
|
84
|
+
globalConfig: opts.globalConfig,
|
|
85
|
+
activeAgentConfigs: opts.activeAgentConfigs,
|
|
86
|
+
runtime: opts.runtime,
|
|
87
|
+
runtimeType: opts.runtimeType,
|
|
88
|
+
statusTracker: opts.statusTracker,
|
|
89
|
+
logger: opts.logger,
|
|
90
|
+
skills: opts.skills,
|
|
68
91
|
});
|
|
69
|
-
return {
|
|
70
|
-
baseImage: buildResult.baseImage,
|
|
71
|
-
agentImages: buildResult.agentImages
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
export function selectAgentRuntimes(globalConfig, activeAgentConfigs, runtime, cloudMode, logger) {
|
|
75
|
-
const agentRuntimeOverrides = {};
|
|
76
|
-
// Only for ECS cloud mode - create Lambda runtime for short-running agents
|
|
77
|
-
if (cloudMode && globalConfig.cloud?.provider === "ecs") {
|
|
78
|
-
const cc = globalConfig.cloud;
|
|
79
|
-
// Import and create Lambda runtime (async import handled by caller)
|
|
80
|
-
const createLambdaRuntime = async () => {
|
|
81
|
-
const { LambdaRuntime } = await import("../docker/lambda-runtime.js");
|
|
82
|
-
return new LambdaRuntime({
|
|
83
|
-
awsRegion: cc.awsRegion,
|
|
84
|
-
ecrRepository: cc.ecrRepository,
|
|
85
|
-
secretPrefix: cc.awsSecretPrefix,
|
|
86
|
-
buildBucket: cc.buildBucket,
|
|
87
|
-
lambdaRoleArn: cc.lambdaRoleArn,
|
|
88
|
-
lambdaSubnets: cc.lambdaSubnets,
|
|
89
|
-
lambdaSecurityGroups: cc.lambdaSecurityGroups,
|
|
90
|
-
});
|
|
91
|
-
};
|
|
92
|
-
// This function can't be async, so we'll return a promise to be handled by caller
|
|
93
|
-
// For now, return empty overrides and handle Lambda runtime setup in scheduler
|
|
94
|
-
return {};
|
|
95
|
-
}
|
|
96
|
-
return agentRuntimeOverrides;
|
|
92
|
+
return { baseImage: buildResult.baseImage, agentImages: buildResult.agentImages };
|
|
97
93
|
}
|
|
98
94
|
//# sourceMappingURL=runtime-factory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-factory.js","sourceRoot":"","sources":["../../src/scheduler/runtime-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"runtime-factory.js","sourceRoot":"","sources":["../../src/scheduler/runtime-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,28 +1,19 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Webhook registry setup and helper functions.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from scheduler/index.ts to keep webhook-specific logic separate
|
|
5
|
+
* from the main scheduling orchestrator.
|
|
6
|
+
*/
|
|
7
|
+
import type { GlobalConfig, WebhookSourceConfig } from "../shared/config.js";
|
|
2
8
|
import type { Logger } from "../shared/logger.js";
|
|
3
9
|
import { WebhookRegistry } from "../webhooks/registry.js";
|
|
4
|
-
import type {
|
|
5
|
-
|
|
10
|
+
import type { WebhookFilter, WebhookTrigger } from "../webhooks/types.js";
|
|
11
|
+
export declare const PROVIDER_TO_CREDENTIAL: Record<string, string>;
|
|
6
12
|
export declare function resolveWebhookSource(sourceName: string, agentName: string, webhookSources: Record<string, WebhookSourceConfig>): WebhookSourceConfig;
|
|
7
13
|
export declare function buildFilterFromTrigger(trigger: WebhookTrigger, providerType: string): WebhookFilter | undefined;
|
|
8
|
-
export
|
|
14
|
+
export interface WebhookSetupResult {
|
|
9
15
|
registry?: WebhookRegistry;
|
|
10
16
|
secrets: Record<string, Record<string, string>>;
|
|
11
|
-
}>;
|
|
12
|
-
export interface SchedulerContext {
|
|
13
|
-
runnerPools: Record<string, RunnerPool>;
|
|
14
|
-
agentConfigs: AgentConfig[];
|
|
15
|
-
maxReruns: number;
|
|
16
|
-
maxTriggerDepth: number;
|
|
17
|
-
logger: Logger;
|
|
18
|
-
webhookQueue: any;
|
|
19
|
-
shuttingDown: boolean;
|
|
20
|
-
skills?: any;
|
|
21
|
-
useBakedImages: boolean;
|
|
22
|
-
triggerDispatcher: any;
|
|
23
17
|
}
|
|
24
|
-
export declare function
|
|
25
|
-
agent: string;
|
|
26
|
-
context: string;
|
|
27
|
-
}>, sourceAgent: string, depth: number, ctx: SchedulerContext) => void, drainWebhookQueue: (agentConfig: AgentConfig, ctx: SchedulerContext) => Promise<void>, statusTracker?: any): void;
|
|
18
|
+
export declare function setupWebhookRegistry(globalConfig: GlobalConfig, logger: Logger): Promise<WebhookSetupResult>;
|
|
28
19
|
//# sourceMappingURL=webhook-setup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-setup.d.ts","sourceRoot":"","sources":["../../src/scheduler/webhook-setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"webhook-setup.d.ts","sourceRoot":"","sources":["../../src/scheduler/webhook-setup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAI1D,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAiE,MAAM,sBAAsB,CAAC;AAGzI,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIzD,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,GAClD,mBAAmB,CAUrB;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CA4B/G;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACjD;AAED,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,kBAAkB,CAAC,CAiC7B"}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Webhook registry setup and helper functions.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from scheduler/index.ts to keep webhook-specific logic separate
|
|
5
|
+
* from the main scheduling orchestrator.
|
|
6
|
+
*/
|
|
1
7
|
import { listCredentialInstances, loadCredentialField } from "../shared/credentials.js";
|
|
2
8
|
import { WebhookRegistry } from "../webhooks/registry.js";
|
|
3
9
|
import { GitHubWebhookProvider } from "../webhooks/providers/github.js";
|
|
4
10
|
import { SentryWebhookProvider } from "../webhooks/providers/sentry.js";
|
|
5
11
|
import { LinearWebhookProvider } from "../webhooks/providers/linear.js";
|
|
6
12
|
// Provider type → credential type for loading secrets
|
|
7
|
-
const PROVIDER_TO_CREDENTIAL = {
|
|
13
|
+
export const PROVIDER_TO_CREDENTIAL = {
|
|
8
14
|
github: "github_webhook_secret",
|
|
9
15
|
sentry: "sentry_client_secret",
|
|
10
16
|
linear: "linear_webhook_secret",
|
|
@@ -61,86 +67,34 @@ export function buildFilterFromTrigger(trigger, providerType) {
|
|
|
61
67
|
}
|
|
62
68
|
return undefined;
|
|
63
69
|
}
|
|
64
|
-
export async function setupWebhookRegistry(globalConfig,
|
|
65
|
-
const
|
|
66
|
-
|
|
70
|
+
export async function setupWebhookRegistry(globalConfig, logger) {
|
|
71
|
+
const webhookSources = globalConfig.webhooks ?? {};
|
|
72
|
+
const providerTypes = new Set(Object.values(webhookSources).map(s => s.type));
|
|
73
|
+
if (providerTypes.size === 0) {
|
|
67
74
|
return { secrets: {} };
|
|
68
75
|
}
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
webhookRegistry.registerProvider(new LinearWebhookProvider());
|
|
74
|
-
// Resolve webhook sources from global config
|
|
75
|
-
const webhookSources = globalConfig.webhooks ?? {};
|
|
76
|
+
const registry = new WebhookRegistry(logger);
|
|
77
|
+
registry.registerProvider(new GitHubWebhookProvider());
|
|
78
|
+
registry.registerProvider(new SentryWebhookProvider());
|
|
79
|
+
registry.registerProvider(new LinearWebhookProvider());
|
|
76
80
|
// Load secrets for each provider type referenced by webhook sources
|
|
77
|
-
const
|
|
78
|
-
const webhookSecrets = {};
|
|
81
|
+
const secrets = {};
|
|
79
82
|
for (const providerType of providerTypes) {
|
|
80
83
|
const credType = PROVIDER_TO_CREDENTIAL[providerType];
|
|
81
84
|
if (!credType)
|
|
82
85
|
continue;
|
|
83
86
|
const instances = await listCredentialInstances(credType);
|
|
84
|
-
const
|
|
87
|
+
const providerSecrets = {};
|
|
85
88
|
for (const inst of instances) {
|
|
86
89
|
const secret = await loadCredentialField(credType, inst, "secret");
|
|
87
90
|
if (secret)
|
|
88
|
-
|
|
91
|
+
providerSecrets[inst] = secret;
|
|
89
92
|
}
|
|
90
|
-
if (Object.keys(
|
|
91
|
-
|
|
92
|
-
logger.info({ providerType, count: Object.keys(
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
return { registry: webhookRegistry, secrets: webhookSecrets };
|
|
96
|
-
}
|
|
97
|
-
export function bindWebhooksToAgents(registry, agentConfigs, runnerPools, webhookSources, ctx, makeWebhookPrompt, dispatchTriggers, drainWebhookQueue, statusTracker // StatusTracker
|
|
98
|
-
) {
|
|
99
|
-
const activeAgentConfigs = agentConfigs.filter((a) => (a.scale ?? 1) > 0);
|
|
100
|
-
for (const agentConfig of activeAgentConfigs) {
|
|
101
|
-
if (!agentConfig.webhooks?.length)
|
|
102
|
-
continue;
|
|
103
|
-
const pool = runnerPools[agentConfig.name];
|
|
104
|
-
for (const trigger of agentConfig.webhooks) {
|
|
105
|
-
const sourceConfig = resolveWebhookSource(trigger.source, agentConfig.name, webhookSources);
|
|
106
|
-
const providerType = sourceConfig.type;
|
|
107
|
-
const filter = buildFilterFromTrigger(trigger, providerType);
|
|
108
|
-
registry.addBinding({
|
|
109
|
-
agentName: agentConfig.name,
|
|
110
|
-
source: sourceConfig.credential,
|
|
111
|
-
type: providerType,
|
|
112
|
-
filter,
|
|
113
|
-
trigger: (context) => {
|
|
114
|
-
// Skip if agent is disabled
|
|
115
|
-
if (statusTracker && !statusTracker.isAgentEnabled(agentConfig.name)) {
|
|
116
|
-
ctx.logger.info({ agent: agentConfig.name, event: context.event }, "agent is disabled, ignoring webhook event");
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
const availableRunner = pool.getAvailableRunner();
|
|
120
|
-
if (!availableRunner) {
|
|
121
|
-
const { accepted, dropped } = ctx.webhookQueue.enqueue(agentConfig.name, context);
|
|
122
|
-
if (accepted) {
|
|
123
|
-
ctx.logger.info({ agent: agentConfig.name, event: context.event, queueSize: ctx.webhookQueue.size(agentConfig.name), running: pool.runningJobCount, scale: pool.size }, "all agent runners busy, webhook event queued");
|
|
124
|
-
}
|
|
125
|
-
if (dropped) {
|
|
126
|
-
ctx.logger.warn({ agent: agentConfig.name, droppedEvent: dropped.context.event }, "webhook queue full, oldest event dropped");
|
|
127
|
-
}
|
|
128
|
-
return;
|
|
129
|
-
}
|
|
130
|
-
ctx.logger.info({ agent: agentConfig.name, event: context.event, action: context.action, running: pool.runningJobCount, scale: pool.size }, "webhook triggering agent");
|
|
131
|
-
const prompt = makeWebhookPrompt(agentConfig, context, ctx);
|
|
132
|
-
availableRunner.run(prompt, { type: 'webhook', source: context.event }).then(({ triggers }) => {
|
|
133
|
-
if (triggers.length > 0) {
|
|
134
|
-
dispatchTriggers(triggers, agentConfig.name, 0, ctx);
|
|
135
|
-
}
|
|
136
|
-
// Drain any events that queued while this webhook run was executing
|
|
137
|
-
return drainWebhookQueue(agentConfig, ctx);
|
|
138
|
-
}).catch((err) => {
|
|
139
|
-
ctx.logger.error({ err }, `${agentConfig.name} webhook run failed`);
|
|
140
|
-
});
|
|
141
|
-
},
|
|
142
|
-
});
|
|
93
|
+
if (Object.keys(providerSecrets).length > 0) {
|
|
94
|
+
secrets[providerType] = providerSecrets;
|
|
95
|
+
logger.info({ providerType, count: Object.keys(providerSecrets).length }, "loaded webhook secrets");
|
|
143
96
|
}
|
|
144
97
|
}
|
|
98
|
+
return { registry, secrets };
|
|
145
99
|
}
|
|
146
100
|
//# sourceMappingURL=webhook-setup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-setup.js","sourceRoot":"","sources":["../../src/scheduler/webhook-setup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webhook-setup.js","sourceRoot":"","sources":["../../src/scheduler/webhook-setup.ts"],"names":[],"mappings":"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"}
|
package/dist/shared/config.d.ts
CHANGED
|
@@ -71,6 +71,7 @@ export interface AgentConfig {
|
|
|
71
71
|
}
|
|
72
72
|
export declare function loadGlobalConfig(projectPath: string): GlobalConfig;
|
|
73
73
|
export declare function loadAgentConfig(projectPath: string, agentName: string): AgentConfig;
|
|
74
|
+
export declare function validateAgentName(name: string): void;
|
|
74
75
|
export declare function validateAgentConfig(config: AgentConfig): void;
|
|
75
76
|
export declare function discoverAgents(projectPath: string): string[];
|
|
76
77
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/shared/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/shared/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAK3D,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IACxE,QAAQ,EAAE,SAAS,GAAG,aAAa,GAAG,SAAS,CAAC;CACjD;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,WAAW,GAAG,KAAK,CAAC;IAE9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,CAOlE;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,CAqBnF;AAID,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAWpD;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAW7D;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAiB5D"}
|
package/dist/shared/config.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { readFileSync, existsSync, readdirSync, statSync } from "fs";
|
|
2
2
|
import { resolve } from "path";
|
|
3
3
|
import { parse as parseTOML } from "smol-toml";
|
|
4
|
+
import { ConfigError } from "./errors.js";
|
|
4
5
|
// --- Loaders ---
|
|
5
6
|
export function loadGlobalConfig(projectPath) {
|
|
6
7
|
const configPath = resolve(projectPath, "config.toml");
|
|
@@ -14,7 +15,7 @@ export function loadAgentConfig(projectPath, agentName) {
|
|
|
14
15
|
const agentDir = resolve(projectPath, agentName);
|
|
15
16
|
const tomlPath = resolve(agentDir, "agent-config.toml");
|
|
16
17
|
if (!existsSync(tomlPath)) {
|
|
17
|
-
throw new
|
|
18
|
+
throw new ConfigError(`Agent config not found at ${tomlPath}.`);
|
|
18
19
|
}
|
|
19
20
|
const raw = readFileSync(tomlPath, "utf-8");
|
|
20
21
|
const parsed = parseTOML(raw);
|
|
@@ -28,12 +29,22 @@ export function loadAgentConfig(projectPath, agentName) {
|
|
|
28
29
|
}
|
|
29
30
|
return parsed;
|
|
30
31
|
}
|
|
32
|
+
const AGENT_NAME_PATTERN = /^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/;
|
|
33
|
+
export function validateAgentName(name) {
|
|
34
|
+
if (!name || name.length > 63) {
|
|
35
|
+
throw new ConfigError(`Agent name "${name}" is invalid: must be 1-63 characters.`);
|
|
36
|
+
}
|
|
37
|
+
if (!AGENT_NAME_PATTERN.test(name)) {
|
|
38
|
+
throw new ConfigError(`Agent name "${name}" is invalid: must contain only lowercase letters, numbers, and hyphens (cannot start or end with a hyphen).`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
31
41
|
export function validateAgentConfig(config) {
|
|
42
|
+
validateAgentName(config.name);
|
|
32
43
|
// scale = 0 disables the agent — skip schedule/webhook requirement
|
|
33
44
|
if (config.scale === 0)
|
|
34
45
|
return;
|
|
35
46
|
if (!config.schedule && (!config.webhooks || config.webhooks.length === 0)) {
|
|
36
|
-
throw new
|
|
47
|
+
throw new ConfigError(`Agent "${config.name}" must have a schedule, webhooks, or both.`);
|
|
37
48
|
}
|
|
38
49
|
}
|
|
39
50
|
export function discoverAgents(projectPath) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/shared/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/shared/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/shared/credentials.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/shared/credentials.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAOjE;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,iBAAiB,CAErD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAElE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAIlF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEpE;AAKD;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAEpH;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,CAEtH;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtH;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzH;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEvF;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAE7E;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQrE;AAMD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIpD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIzD"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { resolve } from "path";
|
|
2
2
|
import { CREDENTIALS_DIR } from "./paths.js";
|
|
3
3
|
import { FilesystemBackend } from "./filesystem-backend.js";
|
|
4
|
+
import { CredentialError } from "./errors.js";
|
|
4
5
|
// Default backend instance (local filesystem)
|
|
5
6
|
let _defaultBackend = new FilesystemBackend();
|
|
6
7
|
/**
|
|
@@ -84,7 +85,7 @@ export async function requireCredentialRef(ref) {
|
|
|
84
85
|
const { type, instance } = parseCredentialRef(ref);
|
|
85
86
|
const exists = await _defaultBackend.exists(type, instance);
|
|
86
87
|
if (!exists) {
|
|
87
|
-
throw new
|
|
88
|
+
throw new CredentialError(`Credential "${ref}" not found. Run 'al doctor' to configure it.`);
|
|
88
89
|
}
|
|
89
90
|
}
|
|
90
91
|
// --- Env-var-safe encoding for credential parts ---
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/shared/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/shared/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom error classes for Action Llama.
|
|
3
|
+
*
|
|
4
|
+
* Using typed errors instead of generic Error enables the CLI wrapper
|
|
5
|
+
* to provide context-aware error messages and recovery hints.
|
|
6
|
+
*/
|
|
7
|
+
export declare class ConfigError extends Error {
|
|
8
|
+
name: string;
|
|
9
|
+
constructor(message: string, options?: {
|
|
10
|
+
cause?: unknown;
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
export declare class CredentialError extends Error {
|
|
14
|
+
name: string;
|
|
15
|
+
constructor(message: string, options?: {
|
|
16
|
+
cause?: unknown;
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export declare class CloudProviderError extends Error {
|
|
20
|
+
name: string;
|
|
21
|
+
constructor(message: string, options?: {
|
|
22
|
+
cause?: unknown;
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
export declare class AgentError extends Error {
|
|
26
|
+
name: string;
|
|
27
|
+
constructor(message: string, options?: {
|
|
28
|
+
cause?: unknown;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
export declare const UNRECOVERABLE_PATTERNS: string[];
|
|
32
|
+
export declare function isUnrecoverableError(text: string): boolean;
|
|
33
|
+
export declare const UNRECOVERABLE_THRESHOLD = 3;
|
|
34
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/shared/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qBAAa,WAAY,SAAQ,KAAK;IAC3B,IAAI,SAAiB;gBAElB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAG3D;AAED,qBAAa,eAAgB,SAAQ,KAAK;IAC/B,IAAI,SAAqB;gBAEtB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAG3D;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAClC,IAAI,SAAwB;gBAEzB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAG3D;AAED,qBAAa,UAAW,SAAQ,KAAK;IAC1B,IAAI,SAAgB;gBAEjB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAG3D;AAKD,eAAO,MAAM,sBAAsB,UAQlC,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG1D;AAED,eAAO,MAAM,uBAAuB,IAAI,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom error classes for Action Llama.
|
|
3
|
+
*
|
|
4
|
+
* Using typed errors instead of generic Error enables the CLI wrapper
|
|
5
|
+
* to provide context-aware error messages and recovery hints.
|
|
6
|
+
*/
|
|
7
|
+
export class ConfigError extends Error {
|
|
8
|
+
name = "ConfigError";
|
|
9
|
+
constructor(message, options) {
|
|
10
|
+
super(message, options);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class CredentialError extends Error {
|
|
14
|
+
name = "CredentialError";
|
|
15
|
+
constructor(message, options) {
|
|
16
|
+
super(message, options);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class CloudProviderError extends Error {
|
|
20
|
+
name = "CloudProviderError";
|
|
21
|
+
constructor(message, options) {
|
|
22
|
+
super(message, options);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export class AgentError extends Error {
|
|
26
|
+
name = "AgentError";
|
|
27
|
+
constructor(message, options) {
|
|
28
|
+
super(message, options);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// --- Unrecoverable error detection ---
|
|
32
|
+
// Consolidated from agents/runner.ts and agents/execution-engine.ts.
|
|
33
|
+
export const UNRECOVERABLE_PATTERNS = [
|
|
34
|
+
"permission denied",
|
|
35
|
+
"could not read from remote repository",
|
|
36
|
+
"resource not accessible by personal access token",
|
|
37
|
+
"bad credentials",
|
|
38
|
+
"authentication failed",
|
|
39
|
+
"the requested url returned error: 403",
|
|
40
|
+
"denied to ",
|
|
41
|
+
];
|
|
42
|
+
export function isUnrecoverableError(text) {
|
|
43
|
+
const lower = text.toLowerCase();
|
|
44
|
+
return UNRECOVERABLE_PATTERNS.some((p) => lower.includes(p));
|
|
45
|
+
}
|
|
46
|
+
export const UNRECOVERABLE_THRESHOLD = 3;
|
|
47
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/shared/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,IAAI,GAAG,aAAa,CAAC;IAE9B,YAAY,OAAe,EAAE,OAA6B;QACxD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAC/B,IAAI,GAAG,iBAAiB,CAAC;IAElC,YAAY,OAAe,EAAE,OAA6B;QACxD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,GAAG,oBAAoB,CAAC;IAErC,YAAY,OAAe,EAAE,OAA6B;QACxD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,OAAO,UAAW,SAAQ,KAAK;IAC1B,IAAI,GAAG,YAAY,CAAC;IAE7B,YAAY,OAAe,EAAE,OAA6B;QACxD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1B,CAAC;CACF;AAED,wCAAwC;AACxC,qEAAqE;AAErE,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,mBAAmB;IACnB,uCAAuC;IACvC,kDAAkD;IAClD,iBAAiB;IACjB,uBAAuB;IACvB,uCAAuC;IACvC,YAAY;CACb,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC"}
|
package/dist/shared/git.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/shared/git.ts"],"names":[],"mappings":"AAOA,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAUD,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/shared/git.ts"],"names":[],"mappings":"AAOA,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAUD,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAQzD"}
|
package/dist/shared/git.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { execFileSync } from "child_process";
|
|
2
2
|
import { existsSync } from "fs";
|
|
3
3
|
import { resolve } from "path";
|
|
4
4
|
import { CREDENTIALS_DIR } from "./paths.js";
|
|
@@ -14,7 +14,8 @@ function gitSshEnv() {
|
|
|
14
14
|
return env;
|
|
15
15
|
}
|
|
16
16
|
export function gitExec(cmd, cwd) {
|
|
17
|
-
|
|
17
|
+
const args = cmd.split(/\s+/);
|
|
18
|
+
return execFileSync(args[0], args.slice(1), {
|
|
18
19
|
cwd,
|
|
19
20
|
encoding: "utf-8",
|
|
20
21
|
timeout: 120000,
|