@action-llama/action-llama 0.9.1 → 0.10.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 +56 -28
- package/README.md +2 -2
- package/dist/agents/container-entry.d.ts.map +1 -1
- package/dist/agents/container-entry.js +66 -4
- package/dist/agents/container-entry.js.map +1 -1
- package/dist/agents/container-runner.d.ts +3 -4
- package/dist/agents/container-runner.d.ts.map +1 -1
- package/dist/agents/container-runner.js +21 -33
- package/dist/agents/container-runner.js.map +1 -1
- package/dist/agents/execution-engine.d.ts +17 -0
- package/dist/agents/execution-engine.d.ts.map +1 -0
- package/dist/agents/execution-engine.js +196 -0
- package/dist/agents/execution-engine.js.map +1 -0
- package/dist/agents/git-environment.d.ts +18 -0
- package/dist/agents/git-environment.d.ts.map +1 -0
- package/dist/agents/git-environment.js +63 -0
- package/dist/agents/git-environment.js.map +1 -0
- package/dist/agents/lambda-handler.js +1 -1
- package/dist/agents/lambda-handler.js.map +1 -1
- package/dist/agents/prompt.d.ts +4 -2
- package/dist/agents/prompt.d.ts.map +1 -1
- package/dist/agents/prompt.js +57 -5
- package/dist/agents/prompt.js.map +1 -1
- package/dist/agents/runner.d.ts +7 -1
- package/dist/agents/runner.d.ts.map +1 -1
- package/dist/agents/runner.js +54 -25
- package/dist/agents/runner.js.map +1 -1
- package/dist/agents/signals.d.ts +25 -0
- package/dist/agents/signals.d.ts.map +1 -0
- package/dist/agents/signals.js +105 -0
- package/dist/agents/signals.js.map +1 -0
- package/dist/agents/status-reporter.d.ts +34 -0
- package/dist/agents/status-reporter.d.ts.map +1 -0
- package/dist/agents/status-reporter.js +64 -0
- package/dist/agents/status-reporter.js.map +1 -0
- package/dist/cli/commands/chat.js +2 -2
- package/dist/cli/commands/chat.js.map +1 -1
- package/dist/cli/commands/cloud-setup.js +1 -0
- package/dist/cli/commands/cloud-setup.js.map +1 -1
- package/dist/cli/commands/creds.js +3 -3
- package/dist/cli/commands/creds.js.map +1 -1
- package/dist/cli/commands/doctor.js +3 -3
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/kill.d.ts +4 -0
- package/dist/cli/commands/kill.d.ts.map +1 -0
- package/dist/cli/commands/kill.js +30 -0
- package/dist/cli/commands/kill.js.map +1 -0
- package/dist/cli/commands/logs.d.ts.map +1 -1
- package/dist/cli/commands/logs.js +2 -31
- package/dist/cli/commands/logs.js.map +1 -1
- package/dist/cli/commands/new.js +2 -2
- package/dist/cli/commands/new.js.map +1 -1
- package/dist/cli/commands/pause.d.ts +4 -0
- package/dist/cli/commands/pause.d.ts.map +1 -0
- package/dist/cli/commands/pause.js +30 -0
- package/dist/cli/commands/pause.js.map +1 -0
- package/dist/cli/commands/resume.d.ts +4 -0
- package/dist/cli/commands/resume.d.ts.map +1 -0
- package/dist/cli/commands/resume.js +30 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/run.d.ts +0 -1
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +7 -18
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/start.d.ts +0 -1
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +7 -8
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +74 -0
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/main.js +25 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/credentials/prompter.js +3 -3
- package/dist/credentials/prompter.js.map +1 -1
- package/dist/docker/cloud-run-runtime.d.ts +3 -0
- package/dist/docker/cloud-run-runtime.d.ts.map +1 -1
- package/dist/docker/cloud-run-runtime.js +54 -0
- package/dist/docker/cloud-run-runtime.js.map +1 -1
- package/dist/docker/ecs-runtime.d.ts +3 -0
- package/dist/docker/ecs-runtime.d.ts.map +1 -1
- package/dist/docker/ecs-runtime.js +29 -0
- package/dist/docker/ecs-runtime.js.map +1 -1
- package/dist/docker/lambda-runtime.d.ts +3 -0
- package/dist/docker/lambda-runtime.d.ts.map +1 -1
- package/dist/docker/lambda-runtime.js +41 -4
- package/dist/docker/lambda-runtime.js.map +1 -1
- package/dist/docker/local-runtime.d.ts +5 -0
- package/dist/docker/local-runtime.d.ts.map +1 -1
- package/dist/docker/local-runtime.js +35 -0
- package/dist/docker/local-runtime.js.map +1 -1
- package/dist/docker/runtime.d.ts +13 -0
- package/dist/docker/runtime.d.ts.map +1 -1
- package/dist/gateway/call-store.d.ts +39 -0
- package/dist/gateway/call-store.d.ts.map +1 -0
- package/dist/gateway/call-store.js +101 -0
- package/dist/gateway/call-store.js.map +1 -0
- package/dist/gateway/index.d.ts +8 -0
- package/dist/gateway/index.d.ts.map +1 -1
- package/dist/gateway/index.js +23 -2
- package/dist/gateway/index.js.map +1 -1
- package/dist/gateway/routes/calls.d.ts +17 -0
- package/dist/gateway/routes/calls.d.ts.map +1 -0
- package/dist/gateway/routes/calls.js +63 -0
- package/dist/gateway/routes/calls.js.map +1 -0
- package/dist/gateway/routes/control.d.ts +10 -0
- package/dist/gateway/routes/control.d.ts.map +1 -0
- package/dist/gateway/routes/control.js +64 -0
- package/dist/gateway/routes/control.js.map +1 -0
- package/dist/gateway/routes/locks.d.ts.map +1 -1
- package/dist/gateway/routes/locks.js +12 -0
- package/dist/gateway/routes/locks.js.map +1 -1
- package/dist/gateway/routes/signals.d.ts +11 -0
- package/dist/gateway/routes/signals.d.ts.map +1 -0
- package/dist/gateway/routes/signals.js +103 -0
- package/dist/gateway/routes/signals.js.map +1 -0
- package/dist/gateway/types.d.ts +16 -0
- package/dist/gateway/types.d.ts.map +1 -1
- package/dist/scheduler/config-validator.d.ts +18 -0
- package/dist/scheduler/config-validator.d.ts.map +1 -0
- package/dist/scheduler/config-validator.js +53 -0
- package/dist/scheduler/config-validator.js.map +1 -0
- package/dist/scheduler/cron-manager.d.ts +14 -0
- package/dist/scheduler/cron-manager.d.ts.map +1 -0
- package/dist/scheduler/cron-manager.js +75 -0
- package/dist/scheduler/cron-manager.js.map +1 -0
- package/dist/scheduler/event-queue.d.ts +7 -4
- package/dist/scheduler/event-queue.d.ts.map +1 -1
- package/dist/scheduler/event-queue.js +4 -2
- package/dist/scheduler/event-queue.js.map +1 -1
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +126 -115
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/runner-pool.d.ts +20 -0
- package/dist/scheduler/runner-pool.d.ts.map +1 -1
- package/dist/scheduler/runner-pool.js +32 -4
- package/dist/scheduler/runner-pool.js.map +1 -1
- package/dist/scheduler/runtime-factory.d.ts +11 -0
- package/dist/scheduler/runtime-factory.d.ts.map +1 -0
- package/dist/scheduler/runtime-factory.js +98 -0
- package/dist/scheduler/runtime-factory.js.map +1 -0
- package/dist/scheduler/shutdown-handler.d.ts +16 -0
- package/dist/scheduler/shutdown-handler.d.ts.map +1 -0
- package/dist/scheduler/shutdown-handler.js +44 -0
- package/dist/scheduler/shutdown-handler.js.map +1 -0
- package/dist/scheduler/trigger-dispatcher.d.ts +12 -0
- package/dist/scheduler/trigger-dispatcher.d.ts.map +1 -0
- package/dist/scheduler/trigger-dispatcher.js +46 -0
- package/dist/scheduler/trigger-dispatcher.js.map +1 -0
- package/dist/scheduler/types.d.ts +8 -0
- package/dist/scheduler/types.d.ts.map +1 -1
- package/dist/scheduler/webhook-setup.d.ts +28 -0
- package/dist/scheduler/webhook-setup.d.ts.map +1 -0
- package/dist/scheduler/webhook-setup.js +146 -0
- package/dist/scheduler/webhook-setup.js.map +1 -0
- package/dist/setup/prompts.js +4 -4
- package/dist/setup/prompts.js.map +1 -1
- package/dist/shared/config.d.ts +4 -0
- package/dist/shared/config.d.ts.map +1 -1
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/credentials.d.ts +11 -31
- package/dist/shared/credentials.d.ts.map +1 -1
- package/dist/shared/credentials.js +22 -87
- package/dist/shared/credentials.js.map +1 -1
- package/dist/shared/exit-codes.d.ts +18 -0
- package/dist/shared/exit-codes.d.ts.map +1 -0
- package/dist/shared/exit-codes.js +40 -0
- package/dist/shared/exit-codes.js.map +1 -0
- package/dist/shared/filesystem-backend.d.ts +4 -0
- package/dist/shared/filesystem-backend.d.ts.map +1 -1
- package/dist/shared/filesystem-backend.js +35 -0
- package/dist/shared/filesystem-backend.js.map +1 -1
- package/dist/tui/status-tracker.d.ts +23 -0
- package/dist/tui/status-tracker.d.ts.map +1 -1
- package/dist/tui/status-tracker.js +36 -0
- package/dist/tui/status-tracker.js.map +1 -1
- package/docker/Dockerfile +1 -0
- package/package.json +1 -1
- package/skills/environment.md +1 -1
- package/skills/resource-locks.md +1 -1
- package/skills/signals.md +67 -25
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import type { AgentInstance } from "./types.js";
|
|
1
2
|
/**
|
|
2
3
|
* RunnerPool manages multiple instances of the same agent for parallel execution.
|
|
3
4
|
* It provides load balancing across available runners and handles queuing when all are busy.
|
|
4
5
|
*/
|
|
5
6
|
export interface PoolRunner {
|
|
6
7
|
isRunning: boolean;
|
|
8
|
+
instanceId?: string;
|
|
9
|
+
abort?(): void;
|
|
7
10
|
run(prompt: string, triggerInfo?: {
|
|
8
11
|
type: 'schedule' | 'webhook' | 'agent';
|
|
9
12
|
source?: string;
|
|
@@ -12,6 +15,7 @@ export interface PoolRunner {
|
|
|
12
15
|
export declare class RunnerPool {
|
|
13
16
|
private runners;
|
|
14
17
|
private roundRobinIndex;
|
|
18
|
+
private instances;
|
|
15
19
|
constructor(runners: PoolRunner[]);
|
|
16
20
|
/**
|
|
17
21
|
* Get the next available runner, or null if all are busy
|
|
@@ -38,5 +42,21 @@ export declare class RunnerPool {
|
|
|
38
42
|
* Get all runners (for debugging/introspection)
|
|
39
43
|
*/
|
|
40
44
|
get allRunners(): PoolRunner[];
|
|
45
|
+
/**
|
|
46
|
+
* Register a running agent instance
|
|
47
|
+
*/
|
|
48
|
+
registerInstance(instance: AgentInstance): void;
|
|
49
|
+
/**
|
|
50
|
+
* Unregister an agent instance
|
|
51
|
+
*/
|
|
52
|
+
unregisterInstance(id: string): void;
|
|
53
|
+
/**
|
|
54
|
+
* Get all running instances
|
|
55
|
+
*/
|
|
56
|
+
getInstances(): AgentInstance[];
|
|
57
|
+
/**
|
|
58
|
+
* Kill a specific instance by ID
|
|
59
|
+
*/
|
|
60
|
+
killInstance(id: string): boolean;
|
|
41
61
|
}
|
|
42
62
|
//# sourceMappingURL=runner-pool.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner-pool.d.ts","sourceRoot":"","sources":["../../src/scheduler/runner-pool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CAC9G;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,eAAe,CAAK;
|
|
1
|
+
{"version":3,"file":"runner-pool.d.ts","sourceRoot":"","sources":["../../src/scheduler/runner-pool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;GAGG;AAEH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,IAAI,IAAI,CAAC;IACf,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CAC9G;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,SAAS,CAAyC;gBAE9C,OAAO,EAAE,UAAU,EAAE;IAIjC;;OAEG;IACH,kBAAkB,IAAI,UAAU,GAAG,IAAI;IASvC;;;OAGG;IACH,aAAa,IAAI,UAAU,GAAG,IAAI;IAOlC;;OAEG;IACH,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED;;OAEG;IACH,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,UAAU,EAAE,CAE7B;IAED;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAI/C;;OAEG;IACH,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIpC;;OAEG;IACH,YAAY,IAAI,aAAa,EAAE;IAI/B;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;CAWlC"}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* RunnerPool manages multiple instances of the same agent for parallel execution.
|
|
3
|
-
* It provides load balancing across available runners and handles queuing when all are busy.
|
|
4
|
-
*/
|
|
5
1
|
export class RunnerPool {
|
|
6
2
|
runners = [];
|
|
7
3
|
roundRobinIndex = 0;
|
|
4
|
+
instances = new Map();
|
|
8
5
|
constructor(runners) {
|
|
9
6
|
this.runners = runners;
|
|
10
7
|
}
|
|
@@ -54,5 +51,36 @@ export class RunnerPool {
|
|
|
54
51
|
get allRunners() {
|
|
55
52
|
return [...this.runners];
|
|
56
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Register a running agent instance
|
|
56
|
+
*/
|
|
57
|
+
registerInstance(instance) {
|
|
58
|
+
this.instances.set(instance.id, instance);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Unregister an agent instance
|
|
62
|
+
*/
|
|
63
|
+
unregisterInstance(id) {
|
|
64
|
+
this.instances.delete(id);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get all running instances
|
|
68
|
+
*/
|
|
69
|
+
getInstances() {
|
|
70
|
+
return Array.from(this.instances.values());
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Kill a specific instance by ID
|
|
74
|
+
*/
|
|
75
|
+
killInstance(id) {
|
|
76
|
+
const instance = this.instances.get(id);
|
|
77
|
+
if (!instance)
|
|
78
|
+
return false;
|
|
79
|
+
if (instance.runner && typeof instance.runner.abort === 'function') {
|
|
80
|
+
instance.runner.abort();
|
|
81
|
+
}
|
|
82
|
+
instance.status = 'killed';
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
57
85
|
}
|
|
58
86
|
//# sourceMappingURL=runner-pool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner-pool.js","sourceRoot":"","sources":["../../src/scheduler/runner-pool.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runner-pool.js","sourceRoot":"","sources":["../../src/scheduler/runner-pool.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,UAAU;IACb,OAAO,GAAiB,EAAE,CAAC;IAC3B,eAAe,GAAG,CAAC,CAAC;IACpB,SAAS,GAA+B,IAAI,GAAG,EAAE,CAAC;IAE1D,YAAY,OAAqB;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,gCAAgC;QAChC,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC7D,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,eAAe,CAAC;QACzB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,aAAa;QACX,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAClD,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACxE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,IAAI,UAAU;QACZ,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,QAAuB;QACtC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,EAAU;QAC3B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,EAAU;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAE5B,IAAI,QAAQ,CAAC,MAAM,IAAI,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YACnE,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC;QAED,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { GlobalConfig, AgentConfig } from "../shared/config.js";
|
|
2
|
+
import type { ContainerRuntime } from "../docker/runtime.js";
|
|
3
|
+
import type { Logger } from "../shared/logger.js";
|
|
4
|
+
import type { StatusTracker } from "../tui/status-tracker.js";
|
|
5
|
+
export declare function createRuntime(globalConfig: GlobalConfig, cloudMode: boolean, logger: Logger): Promise<ContainerRuntime | undefined>;
|
|
6
|
+
export declare function buildAgentImages(runtime: ContainerRuntime, projectPath: string, globalConfig: GlobalConfig, activeAgentConfigs: AgentConfig[], cloudMode: boolean, statusTracker?: StatusTracker, logger?: Logger): Promise<{
|
|
7
|
+
baseImage: string;
|
|
8
|
+
agentImages: Record<string, string>;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function selectAgentRuntimes(globalConfig: GlobalConfig, activeAgentConfigs: AgentConfig[], runtime: ContainerRuntime, cloudMode: boolean, logger: Logger): Record<string, ContainerRuntime>;
|
|
11
|
+
//# sourceMappingURL=runtime-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-factory.d.ts","sourceRoot":"","sources":["../../src/scheduler/runtime-factory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAI7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,wBAAsB,aAAa,CACjC,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,OAAO,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CA6DvC;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,gBAAgB,EACzB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,YAAY,EAC1B,kBAAkB,EAAE,WAAW,EAAE,EACjC,SAAS,EAAE,OAAO,EAClB,aAAa,CAAC,EAAE,aAAa,EAC7B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAC,CAAC,CAsBnE;AAED,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,YAAY,EAC1B,kBAAkB,EAAE,WAAW,EAAE,EACjC,OAAO,EAAE,gBAAgB,EACzB,SAAS,EAAE,OAAO,EAClB,MAAM,EAAE,MAAM,GACb,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CA2BlC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { execFileSync } from "child_process";
|
|
2
|
+
import { buildAllImages } from "../cloud/image-builder.js";
|
|
3
|
+
import { ensureNetwork } from "../docker/network.js";
|
|
4
|
+
export async function createRuntime(globalConfig, cloudMode, logger) {
|
|
5
|
+
const useCloudRuntime = cloudMode && globalConfig.cloud;
|
|
6
|
+
const runtimeType = useCloudRuntime ? globalConfig.cloud.provider : "local";
|
|
7
|
+
logger.info({ runtime: runtimeType }, "Docker mode enabled — initializing infrastructure");
|
|
8
|
+
if (useCloudRuntime && globalConfig.cloud.provider === "cloud-run") {
|
|
9
|
+
const { CloudRunJobRuntime } = await import("../docker/cloud-run-runtime.js");
|
|
10
|
+
const { gcpProject, region, artifactRegistry, serviceAccount, secretPrefix } = globalConfig.cloud;
|
|
11
|
+
if (!gcpProject || !region || !artifactRegistry || !serviceAccount) {
|
|
12
|
+
throw new Error("Cloud Run runtime requires cloud.gcpProject, cloud.region, " +
|
|
13
|
+
"cloud.artifactRegistry, and cloud.serviceAccount in config.toml");
|
|
14
|
+
}
|
|
15
|
+
const runtime = new CloudRunJobRuntime({ gcpProject, region, artifactRegistry, serviceAccount, secretPrefix });
|
|
16
|
+
logger.info({ gcpProject, region }, "Using Cloud Run Jobs runtime");
|
|
17
|
+
return runtime;
|
|
18
|
+
}
|
|
19
|
+
if (useCloudRuntime && globalConfig.cloud.provider === "ecs") {
|
|
20
|
+
const { ECSFargateRuntime } = await import("../docker/ecs-runtime.js");
|
|
21
|
+
const cc = globalConfig.cloud;
|
|
22
|
+
if (!cc.awsRegion || !cc.ecsCluster || !cc.ecrRepository || !cc.executionRoleArn || !cc.taskRoleArn || !cc.subnets?.length) {
|
|
23
|
+
throw new Error("ECS runtime requires cloud.awsRegion, cloud.ecsCluster, cloud.ecrRepository, " +
|
|
24
|
+
"cloud.executionRoleArn, cloud.taskRoleArn, and cloud.subnets in config.toml");
|
|
25
|
+
}
|
|
26
|
+
const runtime = new ECSFargateRuntime({
|
|
27
|
+
awsRegion: cc.awsRegion,
|
|
28
|
+
ecsCluster: cc.ecsCluster,
|
|
29
|
+
ecrRepository: cc.ecrRepository,
|
|
30
|
+
executionRoleArn: cc.executionRoleArn,
|
|
31
|
+
taskRoleArn: cc.taskRoleArn,
|
|
32
|
+
subnets: cc.subnets,
|
|
33
|
+
securityGroups: cc.securityGroups,
|
|
34
|
+
secretPrefix: cc.awsSecretPrefix,
|
|
35
|
+
buildBucket: cc.buildBucket,
|
|
36
|
+
});
|
|
37
|
+
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
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
throw new Error("Docker is not running. Start Docker Desktop (or the Docker daemon) and try again.");
|
|
46
|
+
}
|
|
47
|
+
const { LocalDockerRuntime } = await import("../docker/local-runtime.js");
|
|
48
|
+
const runtime = new LocalDockerRuntime();
|
|
49
|
+
// Local-only: ensure Docker network
|
|
50
|
+
logger.info("Ensuring Docker network...");
|
|
51
|
+
ensureNetwork();
|
|
52
|
+
return runtime;
|
|
53
|
+
}
|
|
54
|
+
export async function buildAgentImages(runtime, projectPath, globalConfig, activeAgentConfigs, cloudMode, statusTracker, logger) {
|
|
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 };
|
|
59
|
+
const buildResult = await buildAllImages({
|
|
60
|
+
projectPath,
|
|
61
|
+
globalConfig,
|
|
62
|
+
activeAgentConfigs,
|
|
63
|
+
runtime,
|
|
64
|
+
runtimeType,
|
|
65
|
+
statusTracker,
|
|
66
|
+
logger: logger, // We'll ensure it's provided when called
|
|
67
|
+
skills: buildSkills,
|
|
68
|
+
});
|
|
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;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=runtime-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-factory.js","sourceRoot":"","sources":["../../src/scheduler/runtime-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Cron } from "croner";
|
|
2
|
+
import type { Logger } from "../shared/logger.js";
|
|
3
|
+
import type { GatewayServer } from "../gateway/index.js";
|
|
4
|
+
import type { WorkQueue } from "./event-queue.js";
|
|
5
|
+
export declare class ShutdownHandler {
|
|
6
|
+
private cronJobs;
|
|
7
|
+
private gateway?;
|
|
8
|
+
private webhookQueue?;
|
|
9
|
+
private logger;
|
|
10
|
+
private registered;
|
|
11
|
+
constructor(logger: Logger);
|
|
12
|
+
register(cronJobs: Cron[], gateway?: GatewayServer, webhookQueue?: WorkQueue<any>): void;
|
|
13
|
+
private shutdown;
|
|
14
|
+
triggerShutdown(): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=shutdown-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shutdown-handler.d.ts","sourceRoot":"","sources":["../../src/scheduler/shutdown-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,OAAO,CAAC,CAAgB;IAChC,OAAO,CAAC,YAAY,CAAC,CAAiB;IACtC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,EAAE,MAAM;IAI1B,QAAQ,CACN,QAAQ,EAAE,IAAI,EAAE,EAChB,OAAO,CAAC,EAAE,aAAa,EACvB,YAAY,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,GAC5B,IAAI;YAYO,QAAQ;IAyBhB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;CAGvC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export class ShutdownHandler {
|
|
2
|
+
cronJobs = [];
|
|
3
|
+
gateway;
|
|
4
|
+
webhookQueue;
|
|
5
|
+
logger;
|
|
6
|
+
registered = false;
|
|
7
|
+
constructor(logger) {
|
|
8
|
+
this.logger = logger;
|
|
9
|
+
}
|
|
10
|
+
register(cronJobs, gateway, webhookQueue) {
|
|
11
|
+
this.cronJobs = cronJobs;
|
|
12
|
+
this.gateway = gateway;
|
|
13
|
+
this.webhookQueue = webhookQueue;
|
|
14
|
+
if (!this.registered) {
|
|
15
|
+
process.on("SIGINT", this.shutdown.bind(this));
|
|
16
|
+
process.on("SIGTERM", this.shutdown.bind(this));
|
|
17
|
+
this.registered = true;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async shutdown() {
|
|
21
|
+
this.logger.info("Shutting down scheduler...");
|
|
22
|
+
// Mark as shutting down and clear webhook queue
|
|
23
|
+
if (this.webhookQueue) {
|
|
24
|
+
this.webhookQueue.clearAll();
|
|
25
|
+
}
|
|
26
|
+
// Stop all cron jobs
|
|
27
|
+
for (const job of this.cronJobs) {
|
|
28
|
+
job.stop();
|
|
29
|
+
}
|
|
30
|
+
this.logger.info("All cron jobs stopped");
|
|
31
|
+
// Close gateway server
|
|
32
|
+
if (this.gateway) {
|
|
33
|
+
await this.gateway.close();
|
|
34
|
+
this.logger.info("Gateway server stopped");
|
|
35
|
+
}
|
|
36
|
+
this.logger.info("Shutdown complete");
|
|
37
|
+
process.exit(0);
|
|
38
|
+
}
|
|
39
|
+
// Method to trigger shutdown programmatically (for testing or manual shutdown)
|
|
40
|
+
async triggerShutdown() {
|
|
41
|
+
await this.shutdown();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=shutdown-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shutdown-handler.js","sourceRoot":"","sources":["../../src/scheduler/shutdown-handler.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,eAAe;IAClB,QAAQ,GAAW,EAAE,CAAC;IACtB,OAAO,CAAiB;IACxB,YAAY,CAAkB;IAC9B,MAAM,CAAS;IACf,UAAU,GAAG,KAAK,CAAC;IAE3B,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,QAAQ,CACN,QAAgB,EAChB,OAAuB,EACvB,YAA6B;QAE7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QAEjC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAChD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ;QACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAE/C,gDAAgD;QAChD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;QAC/B,CAAC;QAED,qBAAqB;QACrB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChC,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAE1C,uBAAuB;QACvB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,+EAA+E;IAC/E,KAAK,CAAC,eAAe;QACnB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AgentConfig } from "../shared/config.js";
|
|
2
|
+
import type { SchedulerContext } from "./webhook-setup.js";
|
|
3
|
+
export interface TriggerRequest {
|
|
4
|
+
agent: string;
|
|
5
|
+
context: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class TriggerDispatcher {
|
|
8
|
+
constructor();
|
|
9
|
+
dispatchTriggers(triggers: TriggerRequest[], sourceAgent: string, depth: number, ctx: SchedulerContext, makeTriggeredPrompt: (agentConfig: AgentConfig, sourceAgent: string, context: string, ctx: SchedulerContext) => string): void;
|
|
10
|
+
private runTriggered;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=trigger-dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-dispatcher.d.ts","sourceRoot":"","sources":["../../src/scheduler/trigger-dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,iBAAiB;;IAG5B,gBAAgB,CACd,QAAQ,EAAE,cAAc,EAAE,EAC1B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,gBAAgB,EACrB,mBAAmB,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,KAAK,MAAM,GACrH,IAAI;YAiCO,YAAY;CAoB3B"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export class TriggerDispatcher {
|
|
2
|
+
constructor() { }
|
|
3
|
+
dispatchTriggers(triggers, sourceAgent, depth, ctx, makeTriggeredPrompt) {
|
|
4
|
+
for (const { agent, context } of triggers) {
|
|
5
|
+
if (agent === sourceAgent) {
|
|
6
|
+
ctx.logger.warn({ source: sourceAgent }, "agent cannot trigger itself, skipping");
|
|
7
|
+
continue;
|
|
8
|
+
}
|
|
9
|
+
if (depth >= ctx.maxTriggerDepth) {
|
|
10
|
+
ctx.logger.warn({ source: sourceAgent, target: agent, depth, maxTriggerDepth: ctx.maxTriggerDepth }, "trigger depth limit reached, skipping");
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
const targetConfig = ctx.agentConfigs.find((a) => a.name === agent);
|
|
14
|
+
if (!targetConfig) {
|
|
15
|
+
ctx.logger.warn({ source: sourceAgent, target: agent }, "trigger target agent not found, skipping");
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
const pool = ctx.runnerPools[agent];
|
|
19
|
+
if (pool.size === 0) {
|
|
20
|
+
ctx.logger.info({ source: sourceAgent, target: agent }, "agent is disabled (scale=0), skipping trigger");
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
const availableRunner = pool.getAvailableRunner();
|
|
24
|
+
if (!availableRunner) {
|
|
25
|
+
ctx.logger.warn({ source: sourceAgent, target: agent, running: pool.runningJobCount, scale: pool.size }, "all agent runners busy, skipping trigger");
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
ctx.logger.info({ source: sourceAgent, target: agent, depth, running: pool.runningJobCount, scale: pool.size }, "agent trigger firing");
|
|
29
|
+
const prompt = makeTriggeredPrompt(targetConfig, sourceAgent, context, ctx);
|
|
30
|
+
this.runTriggered(availableRunner, targetConfig, prompt, sourceAgent, depth + 1, ctx, makeTriggeredPrompt).catch((err) => {
|
|
31
|
+
ctx.logger.error({ err, target: agent }, "triggered run failed");
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async runTriggered(runner, agentConfig, prompt, sourceAgent, depth, ctx, makeTriggeredPrompt) {
|
|
36
|
+
const { result, triggers } = await runner.run(prompt, { type: 'agent', source: sourceAgent });
|
|
37
|
+
if (triggers.length > 0) {
|
|
38
|
+
this.dispatchTriggers(triggers, agentConfig.name, depth, ctx, makeTriggeredPrompt);
|
|
39
|
+
}
|
|
40
|
+
// No reruns for triggered runs — they respond to a specific event
|
|
41
|
+
if (result === "completed") {
|
|
42
|
+
ctx.logger.info(`${agentConfig.name} triggered run completed`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=trigger-dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-dispatcher.js","sourceRoot":"","sources":["../../src/scheduler/trigger-dispatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,4 +11,12 @@ export interface WebhookEvent {
|
|
|
11
11
|
text: string;
|
|
12
12
|
source: string;
|
|
13
13
|
}
|
|
14
|
+
export interface AgentInstance {
|
|
15
|
+
id: string;
|
|
16
|
+
agentName: string;
|
|
17
|
+
status: 'running' | 'completed' | 'error' | 'killed';
|
|
18
|
+
startedAt: Date;
|
|
19
|
+
trigger: string;
|
|
20
|
+
runner?: any;
|
|
21
|
+
}
|
|
14
22
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scheduler/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scheduler/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAC;IACrD,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,GAAG,CAAC;CACd"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { GlobalConfig, AgentConfig, WebhookSourceConfig } from "../shared/config.js";
|
|
2
|
+
import type { Logger } from "../shared/logger.js";
|
|
3
|
+
import { WebhookRegistry } from "../webhooks/registry.js";
|
|
4
|
+
import type { WebhookContext, WebhookFilter, WebhookTrigger } from "../webhooks/types.js";
|
|
5
|
+
import type { RunnerPool } from "./runner-pool.js";
|
|
6
|
+
export declare function resolveWebhookSource(sourceName: string, agentName: string, webhookSources: Record<string, WebhookSourceConfig>): WebhookSourceConfig;
|
|
7
|
+
export declare function buildFilterFromTrigger(trigger: WebhookTrigger, providerType: string): WebhookFilter | undefined;
|
|
8
|
+
export declare function setupWebhookRegistry(globalConfig: GlobalConfig, activeAgentConfigs: AgentConfig[], logger: Logger): Promise<{
|
|
9
|
+
registry?: WebhookRegistry;
|
|
10
|
+
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
|
+
}
|
|
24
|
+
export declare function bindWebhooksToAgents(registry: WebhookRegistry, agentConfigs: AgentConfig[], runnerPools: Record<string, RunnerPool>, webhookSources: Record<string, WebhookSourceConfig>, ctx: SchedulerContext, makeWebhookPrompt: (agentConfig: AgentConfig, context: WebhookContext, ctx: SchedulerContext) => string, dispatchTriggers: (triggers: Array<{
|
|
25
|
+
agent: string;
|
|
26
|
+
context: string;
|
|
27
|
+
}>, sourceAgent: string, depth: number, ctx: SchedulerContext) => void, drainWebhookQueue: (agentConfig: AgentConfig, ctx: SchedulerContext) => Promise<void>, statusTracker?: any): void;
|
|
28
|
+
//# sourceMappingURL=webhook-setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-setup.d.ts","sourceRoot":"","sources":["../../src/scheduler/webhook-setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAI1D,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAiE,MAAM,sBAAsB,CAAC;AACzJ,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AASnD,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,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,YAAY,EAC1B,kBAAkB,EAAE,WAAW,EAAE,EACjC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAC,CAAC,CAsCxF;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACxC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,GAAG,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,cAAc,EAAE,OAAO,CAAC;IACxB,iBAAiB,EAAE,GAAG,CAAC;CACxB;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,EACzB,YAAY,EAAE,WAAW,EAAE,EAC3B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EACvC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EACnD,GAAG,EAAE,gBAAgB,EACrB,iBAAiB,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,gBAAgB,KAAK,MAAM,EACvG,gBAAgB,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,KAAK,IAAI,EAC1I,iBAAiB,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,EACrF,aAAa,CAAC,EAAE,GAAG,GAClB,IAAI,CA4DN"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { listCredentialInstances, loadCredentialField } from "../shared/credentials.js";
|
|
2
|
+
import { WebhookRegistry } from "../webhooks/registry.js";
|
|
3
|
+
import { GitHubWebhookProvider } from "../webhooks/providers/github.js";
|
|
4
|
+
import { SentryWebhookProvider } from "../webhooks/providers/sentry.js";
|
|
5
|
+
import { LinearWebhookProvider } from "../webhooks/providers/linear.js";
|
|
6
|
+
// Provider type → credential type for loading secrets
|
|
7
|
+
const PROVIDER_TO_CREDENTIAL = {
|
|
8
|
+
github: "github_webhook_secret",
|
|
9
|
+
sentry: "sentry_client_secret",
|
|
10
|
+
linear: "linear_webhook_secret",
|
|
11
|
+
};
|
|
12
|
+
export function resolveWebhookSource(sourceName, agentName, webhookSources) {
|
|
13
|
+
const source = webhookSources[sourceName];
|
|
14
|
+
if (!source) {
|
|
15
|
+
const available = Object.keys(webhookSources).join(", ") || "(none)";
|
|
16
|
+
throw new Error(`Agent "${agentName}" references webhook source "${sourceName}" ` +
|
|
17
|
+
`which is not defined in config.toml [webhooks]. Available: ${available}`);
|
|
18
|
+
}
|
|
19
|
+
return source;
|
|
20
|
+
}
|
|
21
|
+
export function buildFilterFromTrigger(trigger, providerType) {
|
|
22
|
+
if (providerType === "github") {
|
|
23
|
+
const f = {};
|
|
24
|
+
if (trigger.events)
|
|
25
|
+
f.events = trigger.events;
|
|
26
|
+
if (trigger.actions)
|
|
27
|
+
f.actions = trigger.actions;
|
|
28
|
+
if (trigger.repos)
|
|
29
|
+
f.repos = trigger.repos;
|
|
30
|
+
if (trigger.labels)
|
|
31
|
+
f.labels = trigger.labels;
|
|
32
|
+
if (trigger.assignee)
|
|
33
|
+
f.assignee = trigger.assignee;
|
|
34
|
+
if (trigger.author)
|
|
35
|
+
f.author = trigger.author;
|
|
36
|
+
if (trigger.branches)
|
|
37
|
+
f.branches = trigger.branches;
|
|
38
|
+
return Object.keys(f).length > 0 ? f : undefined;
|
|
39
|
+
}
|
|
40
|
+
if (providerType === "sentry") {
|
|
41
|
+
const f = {};
|
|
42
|
+
if (trigger.resources)
|
|
43
|
+
f.resources = trigger.resources;
|
|
44
|
+
return Object.keys(f).length > 0 ? f : undefined;
|
|
45
|
+
}
|
|
46
|
+
if (providerType === "linear") {
|
|
47
|
+
const f = {};
|
|
48
|
+
if (trigger.events)
|
|
49
|
+
f.events = trigger.events;
|
|
50
|
+
if (trigger.actions)
|
|
51
|
+
f.actions = trigger.actions;
|
|
52
|
+
if (trigger.organizations)
|
|
53
|
+
f.organizations = trigger.organizations;
|
|
54
|
+
if (trigger.labels)
|
|
55
|
+
f.labels = trigger.labels;
|
|
56
|
+
if (trigger.assignee)
|
|
57
|
+
f.assignee = trigger.assignee;
|
|
58
|
+
if (trigger.author)
|
|
59
|
+
f.author = trigger.author;
|
|
60
|
+
return Object.keys(f).length > 0 ? f : undefined;
|
|
61
|
+
}
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
export async function setupWebhookRegistry(globalConfig, activeAgentConfigs, logger) {
|
|
65
|
+
const anyWebhooks = activeAgentConfigs.some((a) => a.webhooks?.length);
|
|
66
|
+
if (!anyWebhooks) {
|
|
67
|
+
return { secrets: {} };
|
|
68
|
+
}
|
|
69
|
+
const webhookRegistry = new WebhookRegistry(logger);
|
|
70
|
+
// Register providers
|
|
71
|
+
webhookRegistry.registerProvider(new GitHubWebhookProvider());
|
|
72
|
+
webhookRegistry.registerProvider(new SentryWebhookProvider());
|
|
73
|
+
webhookRegistry.registerProvider(new LinearWebhookProvider());
|
|
74
|
+
// Resolve webhook sources from global config
|
|
75
|
+
const webhookSources = globalConfig.webhooks ?? {};
|
|
76
|
+
// Load secrets for each provider type referenced by webhook sources
|
|
77
|
+
const providerTypes = new Set(Object.values(webhookSources).map(s => s.type));
|
|
78
|
+
const webhookSecrets = {};
|
|
79
|
+
for (const providerType of providerTypes) {
|
|
80
|
+
const credType = PROVIDER_TO_CREDENTIAL[providerType];
|
|
81
|
+
if (!credType)
|
|
82
|
+
continue;
|
|
83
|
+
const instances = await listCredentialInstances(credType);
|
|
84
|
+
const secrets = {};
|
|
85
|
+
for (const inst of instances) {
|
|
86
|
+
const secret = await loadCredentialField(credType, inst, "secret");
|
|
87
|
+
if (secret)
|
|
88
|
+
secrets[inst] = secret;
|
|
89
|
+
}
|
|
90
|
+
if (Object.keys(secrets).length > 0) {
|
|
91
|
+
webhookSecrets[providerType] = secrets;
|
|
92
|
+
logger.info({ providerType, count: Object.keys(secrets).length }, "loaded webhook secrets");
|
|
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
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=webhook-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-setup.js","sourceRoot":"","sources":["../../src/scheduler/webhook-setup.ts"],"names":[],"mappings":"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"}
|
package/dist/setup/prompts.js
CHANGED
|
@@ -6,10 +6,10 @@ import { promptCredential } from "../credentials/prompter.js";
|
|
|
6
6
|
/**
|
|
7
7
|
* Write credential values to disk using the directory-based layout.
|
|
8
8
|
*/
|
|
9
|
-
function writeCredentialValues(def, values, instance = "default") {
|
|
9
|
+
async function writeCredentialValues(def, values, instance = "default") {
|
|
10
10
|
if (Object.keys(values).length === 0)
|
|
11
11
|
return; // e.g. pi_auth
|
|
12
|
-
writeCredentialFields(def.id, instance, values);
|
|
12
|
+
await writeCredentialFields(def.id, instance, values);
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
15
|
* Prompt for a credential and write it to disk.
|
|
@@ -18,7 +18,7 @@ function writeCredentialValues(def, values, instance = "default") {
|
|
|
18
18
|
async function promptAndStoreCredential(def, instance = "default") {
|
|
19
19
|
const result = await promptCredential(def, instance);
|
|
20
20
|
if (result && Object.keys(result.values).length > 0) {
|
|
21
|
-
writeCredentialValues(def, result.values, instance);
|
|
21
|
+
await writeCredentialValues(def, result.values, instance);
|
|
22
22
|
}
|
|
23
23
|
return result;
|
|
24
24
|
}
|
|
@@ -132,7 +132,7 @@ export async function runSetup() {
|
|
|
132
132
|
message: `Enter ${provider} API key:`,
|
|
133
133
|
});
|
|
134
134
|
if (apiKey) {
|
|
135
|
-
writeCredentialFields(credentialType, "default", { token: apiKey });
|
|
135
|
+
await writeCredentialFields(credentialType, "default", { token: apiKey });
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
138
|
}
|