@action-llama/action-llama 0.19.1 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/build-info.json +1 -1
  2. package/dist/cli/commands/start.d.ts.map +1 -1
  3. package/dist/cli/commands/start.js +3 -0
  4. package/dist/cli/commands/start.js.map +1 -1
  5. package/dist/docker/host-user-runtime.d.ts +5 -1
  6. package/dist/docker/host-user-runtime.d.ts.map +1 -1
  7. package/dist/docker/host-user-runtime.js +138 -5
  8. package/dist/docker/host-user-runtime.js.map +1 -1
  9. package/dist/execution/call-dispatcher.d.ts.map +1 -1
  10. package/dist/execution/call-dispatcher.js +24 -14
  11. package/dist/execution/call-dispatcher.js.map +1 -1
  12. package/dist/execution/dispatch-policy.d.ts +53 -0
  13. package/dist/execution/dispatch-policy.d.ts.map +1 -0
  14. package/dist/execution/dispatch-policy.js +53 -0
  15. package/dist/execution/dispatch-policy.js.map +1 -0
  16. package/dist/execution/execution.d.ts.map +1 -1
  17. package/dist/execution/execution.js +26 -15
  18. package/dist/execution/execution.js.map +1 -1
  19. package/dist/execution/index.d.ts +2 -0
  20. package/dist/execution/index.d.ts.map +1 -1
  21. package/dist/execution/index.js +1 -0
  22. package/dist/execution/index.js.map +1 -1
  23. package/dist/execution/runner-setup.d.ts.map +1 -1
  24. package/dist/execution/runner-setup.js +3 -47
  25. package/dist/execution/runner-setup.js.map +1 -1
  26. package/dist/scheduler/gateway-setup.d.ts.map +1 -1
  27. package/dist/scheduler/gateway-setup.js +24 -16
  28. package/dist/scheduler/gateway-setup.js.map +1 -1
  29. package/dist/scheduler/index.d.ts.map +1 -1
  30. package/dist/scheduler/index.js +41 -38
  31. package/dist/scheduler/index.js.map +1 -1
  32. package/dist/scheduler/policies/index.d.ts +11 -0
  33. package/dist/scheduler/policies/index.d.ts.map +1 -0
  34. package/dist/scheduler/policies/index.js +10 -0
  35. package/dist/scheduler/policies/index.js.map +1 -0
  36. package/dist/scheduler/policies/scale-reconciliation.d.ts +32 -0
  37. package/dist/scheduler/policies/scale-reconciliation.d.ts.map +1 -0
  38. package/dist/scheduler/policies/scale-reconciliation.js +88 -0
  39. package/dist/scheduler/policies/scale-reconciliation.js.map +1 -0
  40. package/dist/scheduler/policies/try-run-or-enqueue.d.ts +34 -0
  41. package/dist/scheduler/policies/try-run-or-enqueue.d.ts.map +1 -0
  42. package/dist/scheduler/policies/try-run-or-enqueue.js +50 -0
  43. package/dist/scheduler/policies/try-run-or-enqueue.js.map +1 -0
  44. package/dist/scheduler/shutdown.d.ts +2 -0
  45. package/dist/scheduler/shutdown.d.ts.map +1 -1
  46. package/dist/scheduler/shutdown.js +8 -1
  47. package/dist/scheduler/shutdown.js.map +1 -1
  48. package/package.json +9 -2
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Named policy modules for the scheduler.
3
+ *
4
+ * Each policy encapsulates a specific operational decision that was previously
5
+ * buried inline in orchestration code. Exporting them from a single barrel
6
+ * makes it easy to find and change any policy in one place.
7
+ */
8
+ export { enforceProjectScaleCap, syncTrackerScales } from "./scale-reconciliation.js";
9
+ export { tryRunOrEnqueue } from "./try-run-or-enqueue.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scheduler/policies/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Scale reconciliation policies.
3
+ *
4
+ * Centralises the project-wide scale cap enforcement and the status-tracker
5
+ * sync that follows pool creation. Both rules were previously inline in
6
+ * runner-setup.ts / scheduler/index.ts — moving them here gives maintainers
7
+ * one obvious place to look when scale behaviour changes.
8
+ */
9
+ import type { GlobalConfig, AgentConfig } from "../../shared/config.js";
10
+ import type { StatusTracker } from "../../tui/status-tracker.js";
11
+ import type { Logger } from "../../shared/logger.js";
12
+ /**
13
+ * Enforce the project-wide scale limit across all agent configs.
14
+ *
15
+ * Walks the list in order, granting each agent as much of the remaining
16
+ * capacity as it requested. Agents whose requested scale exceeds what
17
+ * remains are throttled; agents that are reached with zero capacity are
18
+ * pinned to 1 (minimum viable runner).
19
+ *
20
+ * Returns a new array of agent configs with adjusted `scale` fields.
21
+ * The original objects are not mutated.
22
+ */
23
+ export declare function enforceProjectScaleCap(agentConfigs: AgentConfig[], globalConfig: GlobalConfig, logger: Logger): AgentConfig[];
24
+ /**
25
+ * Sync the status tracker with actual pool sizes after scale cap enforcement.
26
+ *
27
+ * The status tracker is seeded with the configured scale at agent-registration
28
+ * time; if the project-wide cap reduced any pool, we update the tracker so the
29
+ * TUI shows the real runner count.
30
+ */
31
+ export declare function syncTrackerScales(actualScales: Record<string, number>, statusTracker: StatusTracker | undefined, logger: Logger): void;
32
+ //# sourceMappingURL=scale-reconciliation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scale-reconciliation.d.ts","sourceRoot":"","sources":["../../../src/scheduler/policies/scale-reconciliation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAErD;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,WAAW,EAAE,EAC3B,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,MAAM,GACb,WAAW,EAAE,CAuDf;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,aAAa,EAAE,aAAa,GAAG,SAAS,EACxC,MAAM,EAAE,MAAM,GACb,IAAI,CAYN"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Scale reconciliation policies.
3
+ *
4
+ * Centralises the project-wide scale cap enforcement and the status-tracker
5
+ * sync that follows pool creation. Both rules were previously inline in
6
+ * runner-setup.ts / scheduler/index.ts — moving them here gives maintainers
7
+ * one obvious place to look when scale behaviour changes.
8
+ */
9
+ /**
10
+ * Enforce the project-wide scale limit across all agent configs.
11
+ *
12
+ * Walks the list in order, granting each agent as much of the remaining
13
+ * capacity as it requested. Agents whose requested scale exceeds what
14
+ * remains are throttled; agents that are reached with zero capacity are
15
+ * pinned to 1 (minimum viable runner).
16
+ *
17
+ * Returns a new array of agent configs with adjusted `scale` fields.
18
+ * The original objects are not mutated.
19
+ */
20
+ export function enforceProjectScaleCap(agentConfigs, globalConfig, logger) {
21
+ const defaultScale = globalConfig.defaultAgentScale ?? 1;
22
+ const adjustedConfigs = agentConfigs.map(config => ({ ...config }));
23
+ if (globalConfig.scale === undefined) {
24
+ return adjustedConfigs;
25
+ }
26
+ // Warn up-front when the total requested scale exceeds the cap.
27
+ if (globalConfig.defaultAgentScale !== undefined) {
28
+ const totalRequested = agentConfigs.reduce((sum, c) => sum + (c.scale ?? defaultScale), 0);
29
+ if (totalRequested > globalConfig.scale) {
30
+ logger.warn({
31
+ defaultAgentScale: globalConfig.defaultAgentScale,
32
+ agentCount: agentConfigs.length,
33
+ totalRequested,
34
+ projectScale: globalConfig.scale,
35
+ }, "Total requested agent scale (%d) exceeds project scale cap (%d) — agents will be throttled", totalRequested, globalConfig.scale);
36
+ }
37
+ }
38
+ let totalScale = 0;
39
+ for (const config of adjustedConfigs) {
40
+ const requestedScale = config.scale ?? defaultScale;
41
+ const remainingCapacity = globalConfig.scale - totalScale;
42
+ if (remainingCapacity <= 0) {
43
+ config.scale = 1; // Ensure at least 1 runner per agent
44
+ if (requestedScale > 1) {
45
+ logger.warn({
46
+ agent: config.name,
47
+ requested: requestedScale,
48
+ reduced: 1,
49
+ projectLimit: globalConfig.scale,
50
+ }, "Agent scale reduced due to project scale limit");
51
+ }
52
+ totalScale += 1;
53
+ }
54
+ else if (requestedScale > remainingCapacity) {
55
+ config.scale = remainingCapacity;
56
+ logger.warn({
57
+ agent: config.name,
58
+ requested: requestedScale,
59
+ reduced: remainingCapacity,
60
+ projectLimit: globalConfig.scale,
61
+ }, "Agent scale reduced due to project scale limit");
62
+ totalScale += remainingCapacity;
63
+ }
64
+ else {
65
+ totalScale += requestedScale;
66
+ }
67
+ }
68
+ return adjustedConfigs;
69
+ }
70
+ /**
71
+ * Sync the status tracker with actual pool sizes after scale cap enforcement.
72
+ *
73
+ * The status tracker is seeded with the configured scale at agent-registration
74
+ * time; if the project-wide cap reduced any pool, we update the tracker so the
75
+ * TUI shows the real runner count.
76
+ */
77
+ export function syncTrackerScales(actualScales, statusTracker, logger) {
78
+ if (!statusTracker)
79
+ return;
80
+ for (const [agentName, actualScale] of Object.entries(actualScales)) {
81
+ const registeredScale = statusTracker.getAgentScale(agentName);
82
+ if (registeredScale !== actualScale) {
83
+ statusTracker.updateAgentScale(agentName, actualScale);
84
+ logger.info({ agent: agentName, registeredScale, actualScale }, "synced status tracker scale with actual pool size");
85
+ }
86
+ }
87
+ }
88
+ //# sourceMappingURL=scale-reconciliation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scale-reconciliation.js","sourceRoot":"","sources":["../../../src/scheduler/policies/scale-reconciliation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * try-run-or-enqueue policy
3
+ *
4
+ * The "get an available runner or enqueue with drop-oldest" pattern appears at
5
+ * four call sites:
6
+ * - scheduler/index.ts — webhook handler (two branches: building & no-runner)
7
+ * - scheduler/index.ts — cron handler
8
+ * - scheduler/gateway-setup.ts — triggerAgent control-API handler
9
+ *
10
+ * Centralising the logic here gives one place to change backpressure behaviour.
11
+ */
12
+ import type { RunnerPool, PoolRunner } from "../../execution/runner-pool.js";
13
+ import type { WorkQueue, EnqueueResult } from "../../shared/work-queue.js";
14
+ import type { Logger } from "../../shared/logger.js";
15
+ export interface TryRunOrEnqueueResult<T> {
16
+ /** Available runner ready to accept work, when one was free. */
17
+ runner?: PoolRunner;
18
+ /** Enqueue result when no runner was available (or pool not yet ready). */
19
+ enqueued?: EnqueueResult<T>;
20
+ }
21
+ /**
22
+ * Try to acquire an available runner from `pool`.
23
+ *
24
+ * - If `pool` is undefined (agents still building), the item is queued
25
+ * immediately without attempting runner acquisition.
26
+ * - If all runners are busy, the item is enqueued instead.
27
+ * - If the queue is at capacity the oldest item is silently dropped and a
28
+ * warning is logged.
29
+ *
30
+ * Callers must check whether the returned value has a `runner` or `enqueued`
31
+ * field to know which path was taken.
32
+ */
33
+ export declare function tryRunOrEnqueue<T>(pool: RunnerPool | undefined, queue: WorkQueue<T>, agentName: string, workItem: T, logger: Logger, logContext?: Record<string, unknown>): TryRunOrEnqueueResult<T>;
34
+ //# sourceMappingURL=try-run-or-enqueue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"try-run-or-enqueue.d.ts","sourceRoot":"","sources":["../../../src/scheduler/policies/try-run-or-enqueue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,gEAAgE;IAChE,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;CAC7B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAC/B,IAAI,EAAE,UAAU,GAAG,SAAS,EAC5B,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EACnB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,EACX,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACnC,qBAAqB,CAAC,CAAC,CAAC,CA+B1B"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * try-run-or-enqueue policy
3
+ *
4
+ * The "get an available runner or enqueue with drop-oldest" pattern appears at
5
+ * four call sites:
6
+ * - scheduler/index.ts — webhook handler (two branches: building & no-runner)
7
+ * - scheduler/index.ts — cron handler
8
+ * - scheduler/gateway-setup.ts — triggerAgent control-API handler
9
+ *
10
+ * Centralising the logic here gives one place to change backpressure behaviour.
11
+ */
12
+ /**
13
+ * Try to acquire an available runner from `pool`.
14
+ *
15
+ * - If `pool` is undefined (agents still building), the item is queued
16
+ * immediately without attempting runner acquisition.
17
+ * - If all runners are busy, the item is enqueued instead.
18
+ * - If the queue is at capacity the oldest item is silently dropped and a
19
+ * warning is logged.
20
+ *
21
+ * Callers must check whether the returned value has a `runner` or `enqueued`
22
+ * field to know which path was taken.
23
+ */
24
+ export function tryRunOrEnqueue(pool, queue, agentName, workItem, logger, logContext) {
25
+ const ctx = logContext ?? {};
26
+ if (!pool) {
27
+ const enqueued = queue.enqueue(agentName, workItem);
28
+ if (enqueued.dropped) {
29
+ logger.warn({ agent: agentName, ...ctx }, "queue full, oldest event dropped");
30
+ }
31
+ return { enqueued };
32
+ }
33
+ const runner = pool.getAvailableRunner();
34
+ if (!runner) {
35
+ const enqueued = queue.enqueue(agentName, workItem);
36
+ logger.info({
37
+ agent: agentName,
38
+ running: pool.runningJobCount,
39
+ scale: pool.size,
40
+ queueSize: queue.size(agentName),
41
+ ...ctx,
42
+ }, "all runners busy, work queued");
43
+ if (enqueued.dropped) {
44
+ logger.warn({ agent: agentName, ...ctx }, "queue full, oldest event dropped");
45
+ }
46
+ return { enqueued };
47
+ }
48
+ return { runner };
49
+ }
50
+ //# sourceMappingURL=try-run-or-enqueue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"try-run-or-enqueue.js","sourceRoot":"","sources":["../../../src/scheduler/policies/try-run-or-enqueue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAaH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAC7B,IAA4B,EAC5B,KAAmB,EACnB,SAAiB,EACjB,QAAW,EACX,MAAc,EACd,UAAoC;IAEpC,MAAM,GAAG,GAAG,UAAU,IAAI,EAAE,CAAC;IAE7B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACpD,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,GAAG,EAAE,EAAE,kCAAkC,CAAC,CAAC;QAChF,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACpD,MAAM,CAAC,IAAI,CACT;YACE,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,IAAI,CAAC,eAAe;YAC7B,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YAChC,GAAG,GAAG;SACP,EACD,+BAA+B,CAChC,CAAC;QACF,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,GAAG,EAAE,EAAE,kCAAkC,CAAC,CAAC;QAChF,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC"}
@@ -8,6 +8,7 @@ import type { Logger } from "../shared/logger.js";
8
8
  import type { SchedulerContext } from "../execution/execution.js";
9
9
  import type { StatsStore } from "../stats/index.js";
10
10
  import type { AppDb } from "../db/connection.js";
11
+ import type { Runtime } from "../docker/runtime.js";
11
12
  export declare function registerShutdownHandlers(deps: {
12
13
  logger: Logger;
13
14
  schedulerCtx: SchedulerContext;
@@ -20,5 +21,6 @@ export declare function registerShutdownHandlers(deps: {
20
21
  watcherHandle: {
21
22
  stop: () => void;
22
23
  };
24
+ runtime?: Runtime;
23
25
  }): void;
24
26
  //# sourceMappingURL=shutdown.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shutdown.d.ts","sourceRoot":"","sources":["../../src/scheduler/shutdown.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,aAAa,EAAE;QAAE,IAAI,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;CACrC,GAAG,IAAI,CA4CP"}
1
+ {"version":3,"file":"shutdown.d.ts","sourceRoot":"","sources":["../../src/scheduler/shutdown.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,aAAa,EAAE;QAAE,IAAI,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,IAAI,CAmDP"}
@@ -2,7 +2,7 @@
2
2
  * Graceful shutdown handler for the scheduler.
3
3
  */
4
4
  export function registerShutdownHandlers(deps) {
5
- const { logger, schedulerCtx, cronJobs, gateway, stateStore, statsStore, sharedDb, telemetry, watcherHandle } = deps;
5
+ const { logger, schedulerCtx, cronJobs, gateway, stateStore, statsStore, sharedDb, telemetry, watcherHandle, runtime } = deps;
6
6
  const shutdown = async () => {
7
7
  logger.info("Shutting down scheduler...");
8
8
  watcherHandle.stop();
@@ -38,6 +38,13 @@ export function registerShutdownHandlers(deps) {
38
38
  logger.warn({ error: error.message }, "Error during telemetry shutdown");
39
39
  }
40
40
  }
41
+ // Terminate running agent processes (HostUserRuntime child processes)
42
+ if (runtime && typeof runtime.shutdown === "function") {
43
+ try {
44
+ await runtime.shutdown();
45
+ }
46
+ catch { /* best effort */ }
47
+ }
41
48
  logger.info("All cron jobs stopped");
42
49
  process.exit(0);
43
50
  };
@@ -1 +1 @@
1
- {"version":3,"file":"shutdown.js","sourceRoot":"","sources":["../../src/scheduler/shutdown.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,MAAM,UAAU,wBAAwB,CAAC,IAUxC;IACC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAErH,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC1C,aAAa,CAAC,IAAI,EAAE,CAAC;QACrB,YAAY,CAAC,YAAY,GAAG,IAAI,CAAC;QACjC,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAC/B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QACD,iEAAiE;QACjE,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC;gBACF,QAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACpC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;QAED,qBAAqB;QACrB,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,iCAAiC,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"shutdown.js","sourceRoot":"","sources":["../../src/scheduler/shutdown.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,MAAM,UAAU,wBAAwB,CAAC,IAWxC;IACC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAE9H,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC1C,aAAa,CAAC,IAAI,EAAE,CAAC;QACrB,YAAY,CAAC,YAAY,GAAG,IAAI,CAAC;QACjC,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAC/B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QACD,iEAAiE;QACjE,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC;gBACF,QAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACpC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;QAED,qBAAqB;QACrB,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,iCAAiC,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAED,sEAAsE;QACtE,IAAI,OAAO,IAAI,OAAQ,OAAe,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;YAC/D,IAAI,CAAC;gBACH,MAAO,OAAe,CAAC,QAAQ,EAAE,CAAC;YACpC,CAAC;YAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@action-llama/action-llama",
3
- "version": "0.19.1",
3
+ "version": "0.20.0",
4
4
  "description": "Automated development agents triggered by cron or webhooks. BYOM — bring your own model.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -27,7 +27,14 @@
27
27
  },
28
28
  "main": "./dist/cli/main.js",
29
29
  "exports": {
30
- ".": "./dist/cli/main.js"
30
+ ".": "./dist/cli/main.js",
31
+ "./internals/credentials": "./dist/shared/credentials.js",
32
+ "./internals/filesystem-backend": "./dist/shared/filesystem-backend.js",
33
+ "./internals/scheduler": "./dist/scheduler/index.js",
34
+ "./internals/config": "./dist/shared/config.js",
35
+ "./internals/webhook-types": "./dist/webhooks/types.js",
36
+ "./internals/execution": "./dist/execution/execution.js",
37
+ "./internals/scheduler-events": "./dist/scheduler/events.js"
31
38
  },
32
39
  "files": [
33
40
  "dist",