@a5c-ai/agent-runtime 5.0.1-staging.016f0b0e8119

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 (170) hide show
  1. package/README.md +23 -0
  2. package/dist/apiResult.d.ts +19 -0
  3. package/dist/apiResult.d.ts.map +1 -0
  4. package/dist/apiResult.js +16 -0
  5. package/dist/background/state.d.ts +14 -0
  6. package/dist/background/state.d.ts.map +1 -0
  7. package/dist/background/state.js +25 -0
  8. package/dist/backgroundProcessRegistry.d.ts +66 -0
  9. package/dist/backgroundProcessRegistry.d.ts.map +1 -0
  10. package/dist/backgroundProcessRegistry.js +202 -0
  11. package/dist/cost/claudeCodeParser.d.ts +81 -0
  12. package/dist/cost/claudeCodeParser.d.ts.map +1 -0
  13. package/dist/cost/claudeCodeParser.js +232 -0
  14. package/dist/cost/collector.d.ts +42 -0
  15. package/dist/cost/collector.d.ts.map +1 -0
  16. package/dist/cost/collector.js +105 -0
  17. package/dist/cost/effectCost.d.ts +23 -0
  18. package/dist/cost/effectCost.d.ts.map +1 -0
  19. package/dist/cost/effectCost.js +26 -0
  20. package/dist/cost/index.d.ts +19 -0
  21. package/dist/cost/index.d.ts.map +1 -0
  22. package/dist/cost/index.js +39 -0
  23. package/dist/cost/journal.d.ts +40 -0
  24. package/dist/cost/journal.d.ts.map +1 -0
  25. package/dist/cost/journal.js +137 -0
  26. package/dist/cost/types.d.ts +164 -0
  27. package/dist/cost/types.d.ts.map +1 -0
  28. package/dist/cost/types.js +228 -0
  29. package/dist/daemon/automationExecutor.d.ts +16 -0
  30. package/dist/daemon/automationExecutor.d.ts.map +1 -0
  31. package/dist/daemon/automationExecutor.js +222 -0
  32. package/dist/daemon/config.d.ts +8 -0
  33. package/dist/daemon/config.d.ts.map +1 -0
  34. package/dist/daemon/config.js +209 -0
  35. package/dist/daemon/daemonLog.d.ts +13 -0
  36. package/dist/daemon/daemonLog.d.ts.map +1 -0
  37. package/dist/daemon/daemonLog.js +64 -0
  38. package/dist/daemon/fileWatcher.d.ts +9 -0
  39. package/dist/daemon/fileWatcher.d.ts.map +1 -0
  40. package/dist/daemon/fileWatcher.js +141 -0
  41. package/dist/daemon/index.d.ts +13 -0
  42. package/dist/daemon/index.d.ts.map +1 -0
  43. package/dist/daemon/index.js +22 -0
  44. package/dist/daemon/lifecycle.d.ts +12 -0
  45. package/dist/daemon/lifecycle.d.ts.map +1 -0
  46. package/dist/daemon/lifecycle.js +257 -0
  47. package/dist/daemon/loop.d.ts +21 -0
  48. package/dist/daemon/loop.d.ts.map +1 -0
  49. package/dist/daemon/loop.js +196 -0
  50. package/dist/daemon/timerScheduler.d.ts +13 -0
  51. package/dist/daemon/timerScheduler.d.ts.map +1 -0
  52. package/dist/daemon/timerScheduler.js +122 -0
  53. package/dist/daemon/types.d.ts +93 -0
  54. package/dist/daemon/types.d.ts.map +1 -0
  55. package/dist/daemon/types.js +25 -0
  56. package/dist/daemon/webhookListener.d.ts +6 -0
  57. package/dist/daemon/webhookListener.d.ts.map +1 -0
  58. package/dist/daemon/webhookListener.js +110 -0
  59. package/dist/execution/index.d.ts +8 -0
  60. package/dist/execution/index.d.ts.map +1 -0
  61. package/dist/execution/index.js +12 -0
  62. package/dist/execution/modes/docker.d.ts +21 -0
  63. package/dist/execution/modes/docker.d.ts.map +1 -0
  64. package/dist/execution/modes/docker.js +125 -0
  65. package/dist/execution/modes/index.d.ts +10 -0
  66. package/dist/execution/modes/index.d.ts.map +1 -0
  67. package/dist/execution/modes/index.js +14 -0
  68. package/dist/execution/modes/kubernetes.d.ts +29 -0
  69. package/dist/execution/modes/kubernetes.d.ts.map +1 -0
  70. package/dist/execution/modes/kubernetes.js +121 -0
  71. package/dist/execution/modes/local.d.ts +23 -0
  72. package/dist/execution/modes/local.d.ts.map +1 -0
  73. package/dist/execution/modes/local.js +102 -0
  74. package/dist/execution/modes/ssh.d.ts +23 -0
  75. package/dist/execution/modes/ssh.d.ts.map +1 -0
  76. package/dist/execution/modes/ssh.js +134 -0
  77. package/dist/execution/provider.d.ts +32 -0
  78. package/dist/execution/provider.d.ts.map +1 -0
  79. package/dist/execution/provider.js +90 -0
  80. package/dist/execution/types.d.ts +105 -0
  81. package/dist/execution/types.d.ts.map +1 -0
  82. package/dist/execution/types.js +9 -0
  83. package/dist/index.d.ts +11 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +42 -0
  86. package/dist/observability/health.d.ts +19 -0
  87. package/dist/observability/health.d.ts.map +1 -0
  88. package/dist/observability/health.js +129 -0
  89. package/dist/observability/index.d.ts +6 -0
  90. package/dist/observability/index.d.ts.map +1 -0
  91. package/dist/observability/index.js +20 -0
  92. package/dist/observability/runStatus.d.ts +44 -0
  93. package/dist/observability/runStatus.d.ts.map +1 -0
  94. package/dist/observability/runStatus.js +169 -0
  95. package/dist/observability/timeline.d.ts +11 -0
  96. package/dist/observability/timeline.d.ts.map +1 -0
  97. package/dist/observability/timeline.js +176 -0
  98. package/dist/observability/types.d.ts +62 -0
  99. package/dist/observability/types.d.ts.map +1 -0
  100. package/dist/observability/types.js +8 -0
  101. package/dist/observability/webhooks.d.ts +68 -0
  102. package/dist/observability/webhooks.d.ts.map +1 -0
  103. package/dist/observability/webhooks.js +132 -0
  104. package/dist/resources/budget-tracker.d.ts +56 -0
  105. package/dist/resources/budget-tracker.d.ts.map +1 -0
  106. package/dist/resources/budget-tracker.js +131 -0
  107. package/dist/resources/concurrency-guard.d.ts +55 -0
  108. package/dist/resources/concurrency-guard.d.ts.map +1 -0
  109. package/dist/resources/concurrency-guard.js +132 -0
  110. package/dist/resources/index.d.ts +12 -0
  111. package/dist/resources/index.d.ts.map +1 -0
  112. package/dist/resources/index.js +20 -0
  113. package/dist/resources/manager.d.ts +49 -0
  114. package/dist/resources/manager.d.ts.map +1 -0
  115. package/dist/resources/manager.js +111 -0
  116. package/dist/resources/timeout-cascade.d.ts +56 -0
  117. package/dist/resources/timeout-cascade.d.ts.map +1 -0
  118. package/dist/resources/timeout-cascade.js +145 -0
  119. package/dist/resources/types.d.ts +108 -0
  120. package/dist/resources/types.d.ts.map +1 -0
  121. package/dist/resources/types.js +9 -0
  122. package/dist/session/context.d.ts +22 -0
  123. package/dist/session/context.d.ts.map +1 -0
  124. package/dist/session/context.js +113 -0
  125. package/dist/session/continuityState.d.ts +39 -0
  126. package/dist/session/continuityState.d.ts.map +1 -0
  127. package/dist/session/continuityState.js +164 -0
  128. package/dist/session/cost.d.ts +63 -0
  129. package/dist/session/cost.d.ts.map +1 -0
  130. package/dist/session/cost.js +194 -0
  131. package/dist/session/discovery.d.ts +22 -0
  132. package/dist/session/discovery.d.ts.map +1 -0
  133. package/dist/session/discovery.js +35 -0
  134. package/dist/session/history.d.ts +30 -0
  135. package/dist/session/history.d.ts.map +1 -0
  136. package/dist/session/history.js +143 -0
  137. package/dist/session/index.d.ts +20 -0
  138. package/dist/session/index.d.ts.map +1 -0
  139. package/dist/session/index.js +78 -0
  140. package/dist/session/memoryExtraction.d.ts +65 -0
  141. package/dist/session/memoryExtraction.d.ts.map +1 -0
  142. package/dist/session/memoryExtraction.js +201 -0
  143. package/dist/session/parse.d.ts +45 -0
  144. package/dist/session/parse.d.ts.map +1 -0
  145. package/dist/session/parse.js +170 -0
  146. package/dist/session/persistence.d.ts +46 -0
  147. package/dist/session/persistence.d.ts.map +1 -0
  148. package/dist/session/persistence.js +180 -0
  149. package/dist/session/types.d.ts +267 -0
  150. package/dist/session/types.d.ts.map +1 -0
  151. package/dist/session/types.js +45 -0
  152. package/dist/session/write.d.ts +61 -0
  153. package/dist/session/write.d.ts.map +1 -0
  154. package/dist/session/write.js +213 -0
  155. package/dist/telemetry/audit-log.d.ts +56 -0
  156. package/dist/telemetry/audit-log.d.ts.map +1 -0
  157. package/dist/telemetry/audit-log.js +59 -0
  158. package/dist/telemetry/index.d.ts +9 -0
  159. package/dist/telemetry/index.d.ts.map +1 -0
  160. package/dist/telemetry/index.js +15 -0
  161. package/dist/telemetry/provider.d.ts +39 -0
  162. package/dist/telemetry/provider.d.ts.map +1 -0
  163. package/dist/telemetry/provider.js +91 -0
  164. package/dist/telemetry/span-tree.d.ts +46 -0
  165. package/dist/telemetry/span-tree.d.ts.map +1 -0
  166. package/dist/telemetry/span-tree.js +93 -0
  167. package/dist/telemetry/types.d.ts +85 -0
  168. package/dist/telemetry/types.d.ts.map +1 -0
  169. package/dist/telemetry/types.js +21 -0
  170. package/package.json +90 -0
@@ -0,0 +1,93 @@
1
+ /**
2
+ * GAP-REMOTE-001: Daemon Mode — Type definitions.
3
+ */
4
+ import type { AutomationRule, TimerAutomationRule, WebhookAutomationRule } from "@a5c-ai/agent-comm-mux";
5
+ export interface DaemonConfig {
6
+ workspace: string;
7
+ triggers: TriggerConfig[];
8
+ maxConcurrentRuns?: number;
9
+ }
10
+ export interface FileTriggerConfig {
11
+ type: "file";
12
+ pattern: string;
13
+ processId: string;
14
+ entrypoint: string;
15
+ debounceMs?: number;
16
+ }
17
+ export type TriggerConfig = FileTriggerConfig | AutomationRule;
18
+ export interface FileTriggerEvent {
19
+ type: "file";
20
+ processId: string;
21
+ entrypoint: string;
22
+ inputs?: Record<string, unknown>;
23
+ }
24
+ export interface AutomationTriggerEvent {
25
+ type: "automation";
26
+ rule: AutomationRule;
27
+ inputs?: Record<string, unknown>;
28
+ }
29
+ export type TriggerEvent = FileTriggerEvent | AutomationTriggerEvent;
30
+ export declare function isFileTriggerConfig(trigger: TriggerConfig): trigger is FileTriggerConfig;
31
+ export declare function isTimerAutomationRule(trigger: TriggerConfig): trigger is TimerAutomationRule;
32
+ export declare function isWebhookAutomationRule(trigger: TriggerConfig): trigger is WebhookAutomationRule;
33
+ export declare function isFileTriggerEvent(event: TriggerEvent): event is FileTriggerEvent;
34
+ export declare function isAutomationTriggerEvent(event: TriggerEvent): event is AutomationTriggerEvent;
35
+ export interface LegacyTriggerConfig {
36
+ type: "file" | "webhook" | "timer";
37
+ processId: string;
38
+ entrypoint: string;
39
+ pattern?: string;
40
+ port?: number;
41
+ cron?: string;
42
+ debounceMs?: number;
43
+ }
44
+ export interface DaemonStartOptions {
45
+ daemonDir: string;
46
+ workspace: string;
47
+ foreground?: boolean;
48
+ config?: DaemonConfig;
49
+ }
50
+ export interface DaemonStartOutput {
51
+ pid: number;
52
+ daemonDir: string;
53
+ startedAt: string;
54
+ }
55
+ export interface DaemonStopOptions {
56
+ daemonDir: string;
57
+ gracePeriodMs?: number;
58
+ }
59
+ export interface DaemonStopOutput {
60
+ pid: number;
61
+ stoppedAt: string;
62
+ }
63
+ export interface DaemonStatusOptions {
64
+ daemonDir: string;
65
+ }
66
+ export interface DaemonStatusOutput {
67
+ running: boolean;
68
+ pid?: number;
69
+ uptime?: number;
70
+ startedAt?: string;
71
+ activeTriggers?: number;
72
+ pendingRuns?: number;
73
+ }
74
+ export interface FileWatcherHandle {
75
+ dispose(): void;
76
+ }
77
+ export interface WebhookListenerOptions {
78
+ rule: WebhookAutomationRule;
79
+ onTrigger: TriggerCallback;
80
+ }
81
+ export interface WebhookListenerHandle {
82
+ close(): Promise<void>;
83
+ port: number;
84
+ }
85
+ export type TriggerCallback = (trigger: TriggerEvent) => void | Promise<void>;
86
+ export interface DaemonMetadata {
87
+ workspace: string;
88
+ startedAt: string;
89
+ triggers: TriggerConfig[];
90
+ maxConcurrentRuns: number;
91
+ pid: number;
92
+ }
93
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/daemon/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ /**
3
+ * GAP-REMOTE-001: Daemon Mode — Type definitions.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.isFileTriggerConfig = isFileTriggerConfig;
7
+ exports.isTimerAutomationRule = isTimerAutomationRule;
8
+ exports.isWebhookAutomationRule = isWebhookAutomationRule;
9
+ exports.isFileTriggerEvent = isFileTriggerEvent;
10
+ exports.isAutomationTriggerEvent = isAutomationTriggerEvent;
11
+ function isFileTriggerConfig(trigger) {
12
+ return "type" in trigger && trigger.type === "file";
13
+ }
14
+ function isTimerAutomationRule(trigger) {
15
+ return "trigger" in trigger && trigger.trigger.type === "timer";
16
+ }
17
+ function isWebhookAutomationRule(trigger) {
18
+ return "trigger" in trigger && trigger.trigger.type === "webhook";
19
+ }
20
+ function isFileTriggerEvent(event) {
21
+ return event.type !== "automation";
22
+ }
23
+ function isAutomationTriggerEvent(event) {
24
+ return event.type === "automation";
25
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * GAP-REMOTE-001: Webhook Listener — HTTP trigger endpoint.
3
+ */
4
+ import type { WebhookListenerOptions, WebhookListenerHandle } from "./types";
5
+ export declare function createWebhookListener(options: WebhookListenerOptions): Promise<WebhookListenerHandle>;
6
+ //# sourceMappingURL=webhookListener.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhookListener.d.ts","sourceRoot":"","sources":["../../src/daemon/webhookListener.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAI7E,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CA0EhC"}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ /**
3
+ * GAP-REMOTE-001: Webhook Listener — HTTP trigger endpoint.
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.createWebhookListener = createWebhookListener;
40
+ const http = __importStar(require("node:http"));
41
+ const MAX_BODY_BYTES = 1024 * 1024; // 1 MiB
42
+ async function createWebhookListener(options) {
43
+ const { rule, onTrigger } = options;
44
+ const port = rule.trigger.port;
45
+ const path = rule.trigger.path ?? "/trigger";
46
+ const method = rule.trigger.method ?? "POST";
47
+ const authToken = rule.trigger.auth?.type === "bearer" ? rule.trigger.auth.token : undefined;
48
+ const server = http.createServer((req, res) => {
49
+ if (req.method !== method || req.url !== path) {
50
+ res.writeHead(404, { "Content-Type": "application/json" });
51
+ res.end(JSON.stringify({ error: "Not found" }));
52
+ return;
53
+ }
54
+ // Auth check
55
+ if (authToken) {
56
+ const authHeader = req.headers.authorization;
57
+ if (!authHeader || authHeader !== `Bearer ${authToken}`) {
58
+ res.writeHead(401, { "Content-Type": "application/json" });
59
+ res.end(JSON.stringify({ error: "Unauthorized" }));
60
+ return;
61
+ }
62
+ }
63
+ let body = "";
64
+ let bodySize = 0;
65
+ req.on("data", (chunk) => {
66
+ bodySize += chunk.length;
67
+ if (bodySize > MAX_BODY_BYTES) {
68
+ res.writeHead(413, { "Content-Type": "application/json" });
69
+ res.end(JSON.stringify({ error: "Payload too large" }));
70
+ req.destroy();
71
+ return;
72
+ }
73
+ body += chunk.toString();
74
+ });
75
+ req.on("end", () => {
76
+ try {
77
+ const payload = JSON.parse(body);
78
+ const inputs = typeof payload.inputs === "object" && payload.inputs !== null && !Array.isArray(payload.inputs)
79
+ ? payload.inputs
80
+ : undefined;
81
+ void onTrigger({
82
+ type: "automation",
83
+ rule,
84
+ inputs,
85
+ });
86
+ res.writeHead(200, { "Content-Type": "application/json" });
87
+ res.end(JSON.stringify({ ok: true }));
88
+ }
89
+ catch {
90
+ res.writeHead(400, { "Content-Type": "application/json" });
91
+ res.end(JSON.stringify({ error: "Invalid JSON body" }));
92
+ }
93
+ });
94
+ });
95
+ return new Promise((resolve, reject) => {
96
+ server.on("error", reject);
97
+ server.listen(port, () => {
98
+ const addr = server.address();
99
+ const actualPort = typeof addr === "object" && addr ? addr.port : port;
100
+ resolve({
101
+ port: actualPort,
102
+ async close() {
103
+ return new Promise((res, rej) => {
104
+ server.close((err) => (err ? rej(err) : res()));
105
+ });
106
+ },
107
+ });
108
+ });
109
+ });
110
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Execution module — execution mode abstraction interfaces and implementations.
3
+ */
4
+ export type { ExecutionMode, LocalExecutionConfig, DockerExecutionConfig, SshExecutionConfig, KubernetesExecutionConfig, ExecutionConfig, ExecutionHandle, ExecutionProvider, } from "./types";
5
+ export { LocalExecutor, DockerExecutor, SshExecutor, KubernetesExecutor, } from "./modes";
6
+ export type { Executor, KubernetesExecutionHandle } from "./modes";
7
+ export { ExecutionProviderImpl } from "./provider";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/execution/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,YAAY,EACV,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,yBAAyB,EACzB,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,aAAa,EACb,cAAc,EACd,WAAW,EACX,kBAAkB,GACnB,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,QAAQ,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AAGnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ExecutionProviderImpl = exports.KubernetesExecutor = exports.SshExecutor = exports.DockerExecutor = exports.LocalExecutor = void 0;
4
+ // Mode executors
5
+ var modes_1 = require("./modes");
6
+ Object.defineProperty(exports, "LocalExecutor", { enumerable: true, get: function () { return modes_1.LocalExecutor; } });
7
+ Object.defineProperty(exports, "DockerExecutor", { enumerable: true, get: function () { return modes_1.DockerExecutor; } });
8
+ Object.defineProperty(exports, "SshExecutor", { enumerable: true, get: function () { return modes_1.SshExecutor; } });
9
+ Object.defineProperty(exports, "KubernetesExecutor", { enumerable: true, get: function () { return modes_1.KubernetesExecutor; } });
10
+ // Provider
11
+ var provider_1 = require("./provider");
12
+ Object.defineProperty(exports, "ExecutionProviderImpl", { enumerable: true, get: function () { return provider_1.ExecutionProviderImpl; } });
@@ -0,0 +1,21 @@
1
+ /**
2
+ * DockerExecutor — constructs `docker run` commands and spawns them
3
+ * via child_process.
4
+ *
5
+ * This is a structural stub: it correctly assembles the Docker CLI
6
+ * invocation from DockerExecutionConfig, but the host must have Docker
7
+ * installed and the daemon running for it to work at runtime.
8
+ */
9
+ import type { ExecutionHandle, DockerExecutionConfig } from "../types";
10
+ import type { Executor } from "./local";
11
+ export declare class DockerExecutor implements Executor<DockerExecutionConfig> {
12
+ private readonly processes;
13
+ spawn(command: string, args: string[], config: DockerExecutionConfig): Promise<ExecutionHandle>;
14
+ attach(id: string): Promise<ExecutionHandle | undefined>;
15
+ list(): ExecutionHandle[];
16
+ destroy(id: string): Promise<void>;
17
+ /** Build the full `docker run` argument list. */
18
+ _buildDockerArgs(id: string, command: string, args: string[], config: DockerExecutionConfig): string[];
19
+ private _toPublicHandle;
20
+ }
21
+ //# sourceMappingURL=docker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../../src/execution/modes/docker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EACtB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAsBxC,qBAAa,cAAe,YAAW,QAAQ,CAAC,qBAAqB,CAAC;IACpE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoC;IAExD,KAAK,CACT,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,eAAe,CAAC;IA2BrB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IAM9D,IAAI,IAAI,eAAe,EAAE;IAInB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BxC,iDAAiD;IACjD,gBAAgB,CACd,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,qBAAqB,GAC5B,MAAM,EAAE;IA+BX,OAAO,CAAC,eAAe;CAyBxB"}
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ /**
3
+ * DockerExecutor — constructs `docker run` commands and spawns them
4
+ * via child_process.
5
+ *
6
+ * This is a structural stub: it correctly assembles the Docker CLI
7
+ * invocation from DockerExecutionConfig, but the host must have Docker
8
+ * installed and the daemon running for it to work at runtime.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.DockerExecutor = void 0;
12
+ const node_child_process_1 = require("node:child_process");
13
+ const node_crypto_1 = require("node:crypto");
14
+ // ---------------------------------------------------------------------------
15
+ // DockerExecutor
16
+ // ---------------------------------------------------------------------------
17
+ class DockerExecutor {
18
+ processes = new Map();
19
+ async spawn(command, args, config) {
20
+ const id = (0, node_crypto_1.randomUUID)();
21
+ const dockerArgs = this._buildDockerArgs(id, command, args, config);
22
+ const child = (0, node_child_process_1.spawn)("docker", dockerArgs, {
23
+ stdio: ["pipe", "pipe", "pipe"],
24
+ });
25
+ const handle = {
26
+ id,
27
+ mode: "docker",
28
+ status: "running",
29
+ };
30
+ const entry = { handle, process: child, config };
31
+ this.processes.set(id, entry);
32
+ child.on("exit", (code) => {
33
+ handle.status = code === 0 ? "stopped" : "failed";
34
+ });
35
+ child.on("error", () => {
36
+ handle.status = "failed";
37
+ });
38
+ return this._toPublicHandle(entry);
39
+ }
40
+ async attach(id) {
41
+ const entry = this.processes.get(id);
42
+ if (!entry)
43
+ return undefined;
44
+ return this._toPublicHandle(entry);
45
+ }
46
+ list() {
47
+ return [...this.processes.values()].map((e) => this._toPublicHandle(e));
48
+ }
49
+ async destroy(id) {
50
+ const entry = this.processes.get(id);
51
+ if (!entry)
52
+ return;
53
+ // Attempt `docker stop` on the container (uses the handle id as name).
54
+ const child = entry.process;
55
+ if (!child.killed && child.exitCode === null) {
56
+ child.kill("SIGTERM");
57
+ await new Promise((resolve) => {
58
+ const timeout = setTimeout(() => {
59
+ if (!child.killed && child.exitCode === null) {
60
+ child.kill("SIGKILL");
61
+ }
62
+ resolve();
63
+ }, 5_000);
64
+ child.on("exit", () => {
65
+ clearTimeout(timeout);
66
+ resolve();
67
+ });
68
+ });
69
+ }
70
+ entry.handle.status = "stopped";
71
+ this.processes.delete(id);
72
+ }
73
+ // ---------- Helpers -------------------------------------------------------
74
+ /** Build the full `docker run` argument list. */
75
+ _buildDockerArgs(id, command, args, config) {
76
+ const dockerArgs = ["run", "--rm", "--name", `babysitter-${id.slice(0, 8)}`];
77
+ // Volume mounts.
78
+ if (config.volumes) {
79
+ for (const vol of config.volumes) {
80
+ dockerArgs.push("-v", vol);
81
+ }
82
+ }
83
+ // Network.
84
+ if (config.network) {
85
+ dockerArgs.push("--network", config.network);
86
+ }
87
+ // Environment variables.
88
+ if (config.env) {
89
+ for (const [key, value] of Object.entries(config.env)) {
90
+ dockerArgs.push("-e", `${key}=${value}`);
91
+ }
92
+ }
93
+ // Image.
94
+ dockerArgs.push(config.image);
95
+ // Command and arguments.
96
+ dockerArgs.push(command, ...args);
97
+ return dockerArgs;
98
+ }
99
+ _toPublicHandle(entry) {
100
+ const self = this;
101
+ return {
102
+ get id() {
103
+ return entry.handle.id;
104
+ },
105
+ get mode() {
106
+ return entry.handle.mode;
107
+ },
108
+ get status() {
109
+ return entry.handle.status;
110
+ },
111
+ async attach() {
112
+ if (entry.process.stdout) {
113
+ entry.process.stdout.pipe(process.stdout, { end: false });
114
+ }
115
+ if (entry.process.stderr) {
116
+ entry.process.stderr.pipe(process.stderr, { end: false });
117
+ }
118
+ },
119
+ async destroy() {
120
+ await self.destroy(entry.handle.id);
121
+ },
122
+ };
123
+ }
124
+ }
125
+ exports.DockerExecutor = DockerExecutor;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Execution mode implementations — barrel export.
3
+ */
4
+ export { LocalExecutor } from "./local";
5
+ export type { Executor } from "./local";
6
+ export { DockerExecutor } from "./docker";
7
+ export { SshExecutor } from "./ssh";
8
+ export { KubernetesExecutor } from "./kubernetes";
9
+ export type { KubernetesExecutionHandle } from "./kubernetes";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/execution/modes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,YAAY,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ /**
3
+ * Execution mode implementations — barrel export.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.KubernetesExecutor = exports.SshExecutor = exports.DockerExecutor = exports.LocalExecutor = void 0;
7
+ var local_1 = require("./local");
8
+ Object.defineProperty(exports, "LocalExecutor", { enumerable: true, get: function () { return local_1.LocalExecutor; } });
9
+ var docker_1 = require("./docker");
10
+ Object.defineProperty(exports, "DockerExecutor", { enumerable: true, get: function () { return docker_1.DockerExecutor; } });
11
+ var ssh_1 = require("./ssh");
12
+ Object.defineProperty(exports, "SshExecutor", { enumerable: true, get: function () { return ssh_1.SshExecutor; } });
13
+ var kubernetes_1 = require("./kubernetes");
14
+ Object.defineProperty(exports, "KubernetesExecutor", { enumerable: true, get: function () { return kubernetes_1.KubernetesExecutor; } });
@@ -0,0 +1,29 @@
1
+ /**
2
+ * KubernetesExecutor — generates Kubernetes Job manifests from
3
+ * KubernetesExecutionConfig.
4
+ *
5
+ * This is a structural stub: it generates a valid Job YAML manifest and
6
+ * stores it on the handle. In production this would `kubectl apply` the
7
+ * manifest and poll for completion; here it creates a placeholder process
8
+ * to satisfy the handle contract.
9
+ */
10
+ import type { ExecutionHandle, KubernetesExecutionConfig } from "../types";
11
+ import type { Executor } from "./local";
12
+ export interface KubernetesExecutionHandle extends ExecutionHandle {
13
+ readonly mode: "kubernetes";
14
+ /** The generated Kubernetes Job manifest (YAML string). */
15
+ readonly manifest: string;
16
+ }
17
+ export declare class KubernetesExecutor implements Executor<KubernetesExecutionConfig> {
18
+ private readonly entries;
19
+ spawn(command: string, args: string[], config: KubernetesExecutionConfig): Promise<KubernetesExecutionHandle>;
20
+ attach(id: string): Promise<KubernetesExecutionHandle | undefined>;
21
+ list(): KubernetesExecutionHandle[];
22
+ destroy(id: string): Promise<void>;
23
+ /** Build a Kubernetes Job manifest YAML. */
24
+ _buildManifest(jobName: string, command: string, args: string[], config: KubernetesExecutionConfig): string;
25
+ /** Render a resources block for the container spec. */
26
+ private _resourcesYaml;
27
+ private _toPublicHandle;
28
+ }
29
+ //# sourceMappingURL=kubernetes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kubernetes.d.ts","sourceRoot":"","sources":["../../../src/execution/modes/kubernetes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EACV,eAAe,EACf,yBAAyB,EAC1B,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAuBxC,MAAM,WAAW,yBAA0B,SAAQ,eAAe;IAChE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,2DAA2D;IAC3D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAMD,qBAAa,kBAAmB,YAAW,QAAQ,CAAC,yBAAyB,CAAC;IAC5E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IAEjD,KAAK,CACT,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,yBAAyB,CAAC;IAqB/B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC;IAMxE,IAAI,IAAI,yBAAyB,EAAE;IAI7B,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWxC,4CAA4C;IAC5C,cAAc,CACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,yBAAyB,GAChC,MAAM;IAmCT,uDAAuD;IACvD,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,eAAe;CAwBxB"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ /**
3
+ * KubernetesExecutor — generates Kubernetes Job manifests from
4
+ * KubernetesExecutionConfig.
5
+ *
6
+ * This is a structural stub: it generates a valid Job YAML manifest and
7
+ * stores it on the handle. In production this would `kubectl apply` the
8
+ * manifest and poll for completion; here it creates a placeholder process
9
+ * to satisfy the handle contract.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.KubernetesExecutor = void 0;
13
+ const node_crypto_1 = require("node:crypto");
14
+ // ---------------------------------------------------------------------------
15
+ // KubernetesExecutor
16
+ // ---------------------------------------------------------------------------
17
+ class KubernetesExecutor {
18
+ entries = new Map();
19
+ async spawn(command, args, config) {
20
+ const id = (0, node_crypto_1.randomUUID)();
21
+ const jobName = `babysitter-${id.slice(0, 8)}`;
22
+ const manifest = this._buildManifest(jobName, command, args, config);
23
+ const handle = {
24
+ id,
25
+ mode: "kubernetes",
26
+ status: "running",
27
+ };
28
+ const entry = { handle, config, manifest };
29
+ this.entries.set(id, entry);
30
+ // In production: kubectl apply -f - <<< manifest
31
+ // Stub: mark as running immediately.
32
+ return this._toPublicHandle(entry);
33
+ }
34
+ async attach(id) {
35
+ const entry = this.entries.get(id);
36
+ if (!entry)
37
+ return undefined;
38
+ return this._toPublicHandle(entry);
39
+ }
40
+ list() {
41
+ return [...this.entries.values()].map((e) => this._toPublicHandle(e));
42
+ }
43
+ async destroy(id) {
44
+ const entry = this.entries.get(id);
45
+ if (!entry)
46
+ return;
47
+ // In production: kubectl delete job <name> -n <namespace>
48
+ entry.handle.status = "stopped";
49
+ this.entries.delete(id);
50
+ }
51
+ // ---------- Manifest generation -------------------------------------------
52
+ /** Build a Kubernetes Job manifest YAML. */
53
+ _buildManifest(jobName, command, args, config) {
54
+ const resourceBlock = config.resources
55
+ ? this._resourcesYaml(config.resources)
56
+ : "";
57
+ const serviceAccountLine = config.serviceAccount
58
+ ? ` serviceAccountName: ${config.serviceAccount}\n`
59
+ : "";
60
+ const commandYaml = ` command: ${JSON.stringify([command, ...args])}`;
61
+ return [
62
+ `apiVersion: batch/v1`,
63
+ `kind: Job`,
64
+ `metadata:`,
65
+ ` name: ${jobName}`,
66
+ ` namespace: ${config.namespace}`,
67
+ ` labels:`,
68
+ ` app.kubernetes.io/managed-by: babysitter`,
69
+ `spec:`,
70
+ ` backoffLimit: 0`,
71
+ ` template:`,
72
+ ` spec:`,
73
+ serviceAccountLine ? serviceAccountLine.trimEnd() : null,
74
+ ` restartPolicy: Never`,
75
+ ` containers:`,
76
+ ` - name: main`,
77
+ ` image: ${config.image}`,
78
+ commandYaml,
79
+ resourceBlock || null,
80
+ ]
81
+ .filter((line) => line !== null)
82
+ .join("\n");
83
+ }
84
+ /** Render a resources block for the container spec. */
85
+ _resourcesYaml(resources) {
86
+ const lines = Object.entries(resources).map(([key, value]) => ` ${key}: "${value}"`);
87
+ return [
88
+ ` resources:`,
89
+ ` requests:`,
90
+ ...lines,
91
+ ` limits:`,
92
+ ...lines,
93
+ ].join("\n");
94
+ }
95
+ // ---------- Handle --------------------------------------------------------
96
+ _toPublicHandle(entry) {
97
+ const self = this;
98
+ return {
99
+ get id() {
100
+ return entry.handle.id;
101
+ },
102
+ get mode() {
103
+ return entry.handle.mode;
104
+ },
105
+ get status() {
106
+ return entry.handle.status;
107
+ },
108
+ get manifest() {
109
+ return entry.manifest;
110
+ },
111
+ async attach() {
112
+ // In production: kubectl logs -f job/<name> -n <namespace>
113
+ // Stub: no-op.
114
+ },
115
+ async destroy() {
116
+ await self.destroy(entry.handle.id);
117
+ },
118
+ };
119
+ }
120
+ }
121
+ exports.KubernetesExecutor = KubernetesExecutor;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * LocalExecutor — spawns processes on the host machine via child_process.
3
+ *
4
+ * This is the fully-functional executor: it creates real child processes,
5
+ * tracks them by handle ID, and supports attach (reconnect to streams)
6
+ * and destroy (kill process) operations.
7
+ */
8
+ import type { ExecutionHandle, LocalExecutionConfig } from "../types";
9
+ export interface Executor<C> {
10
+ spawn(command: string, args: string[], config: C): Promise<ExecutionHandle>;
11
+ attach(id: string): Promise<ExecutionHandle | undefined>;
12
+ list(): ExecutionHandle[];
13
+ destroy(id: string): Promise<void>;
14
+ }
15
+ export declare class LocalExecutor implements Executor<LocalExecutionConfig> {
16
+ private readonly processes;
17
+ spawn(command: string, args: string[], config: LocalExecutionConfig): Promise<ExecutionHandle>;
18
+ attach(id: string): Promise<ExecutionHandle | undefined>;
19
+ list(): ExecutionHandle[];
20
+ destroy(id: string): Promise<void>;
21
+ private _toPublicHandle;
22
+ }
23
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../src/execution/modes/local.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACrB,MAAM,UAAU,CAAC;AAsBlB,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5E,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;IACzD,IAAI,IAAI,eAAe,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAMD,qBAAa,aAAc,YAAW,QAAQ,CAAC,oBAAoB,CAAC;IAClE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmC;IAEvD,KAAK,CACT,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,eAAe,CAAC;IA6BrB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IAM9D,IAAI,IAAI,eAAe,EAAE;IAInB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BxC,OAAO,CAAC,eAAe;CA0BxB"}