@grackle-ai/adapter-docker 0.72.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,25 @@
1
+ # @grackle-ai/adapter-docker
2
+
3
+ Grackle environment adapter for managing Docker container environments.
4
+
5
+ ## Overview
6
+
7
+ The Docker adapter creates and manages Docker containers running PowerLine. It handles image pulling/building, container lifecycle, git repo cloning, and GPU passthrough. Supports Docker-outside-of-Docker (DooD) via `GRACKLE_DOCKER_NETWORK`.
8
+
9
+ ## Configuration
10
+
11
+ | Field | Type | Default | Description |
12
+ |-------|------|---------|-------------|
13
+ | `image` | `string` | `"grackle-powerline:latest"` | Docker image |
14
+ | `containerName` | `string` | `"grackle-<envId>"` | Container name |
15
+ | `localPort` | `number` | auto | Host port mapping |
16
+ | `volumes` | `string[]` | — | Volume mounts |
17
+ | `env` | `Record<string, string>` | — | Extra env vars |
18
+ | `repo` | `string` | — | Git repo to clone into `/workspace` |
19
+ | `gpus` | `string` | — | GPU passthrough (e.g. `"all"`) |
20
+
21
+ ## Prerequisites
22
+
23
+ - Docker installed and running
24
+ - `docker` CLI available on PATH
25
+ - Optional: `gh` CLI for private repo cloning
@@ -0,0 +1,41 @@
1
+ import type { EnvironmentAdapter, BaseEnvironmentConfig, PowerLineConnection, ProvisionEvent, AdapterDependencies } from "@grackle-ai/adapter-sdk";
2
+ /** Docker-specific environment configuration. */
3
+ export interface DockerEnvironmentConfig extends BaseEnvironmentConfig {
4
+ image: string;
5
+ containerName?: string;
6
+ localPort?: number;
7
+ volumes?: string[];
8
+ env?: Record<string, string>;
9
+ /** Git repo URL to clone into the container workspace. */
10
+ repo?: string;
11
+ /** Enable GPU passthrough (e.g. "all" for --gpus all). */
12
+ gpus?: string;
13
+ }
14
+ /** @internal Abstraction over command execution used by {@link DockerAdapter}. */
15
+ export interface DockerExecFactory {
16
+ /** Execute a command and return its trimmed output. */
17
+ exec(command: string, args: string[], options?: {
18
+ timeout?: number;
19
+ }): Promise<{
20
+ stdout: string;
21
+ stderr: string;
22
+ }>;
23
+ }
24
+ /** Environment adapter that provisions and manages Docker containers running the PowerLine. */
25
+ export declare class DockerAdapter implements EnvironmentAdapter {
26
+ type: string;
27
+ private readonly execFn;
28
+ private readonly sleepFn;
29
+ private readonly logger;
30
+ private readonly isGitHubProviderEnabled;
31
+ constructor(deps?: AdapterDependencies);
32
+ provision(environmentId: string, config: Record<string, unknown>, powerlineToken: string): AsyncGenerator<ProvisionEvent>;
33
+ connect(environmentId: string, config: Record<string, unknown>, powerlineToken: string): Promise<PowerLineConnection>;
34
+ disconnect(environmentId: string): Promise<void>;
35
+ stop(environmentId: string, config: Record<string, unknown>): Promise<void>;
36
+ destroy(environmentId: string, config: Record<string, unknown>): Promise<void>;
37
+ healthCheck(connection: PowerLineConnection): Promise<boolean>;
38
+ /** Build the `docker run` argument array from config and token. */
39
+ buildRunArgs(containerName: string, localPort: number, image: string, cfg: DockerEnvironmentConfig, powerlineToken: string): string[];
40
+ }
41
+ //# sourceMappingURL=docker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,cAAc,EAAE,mBAAmB,EAA2C,MAAM,yBAAyB,CAAC;AAsC5L,iDAAiD;AACjD,MAAM,WAAW,uBAAwB,SAAQ,qBAAqB;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,kFAAkF;AAClF,MAAM,WAAW,iBAAiB;IAChC,uDAAuD;IACvD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpH;AA2LD,+FAA+F;AAC/F,qBAAa,aAAc,YAAW,kBAAkB;IAC/C,IAAI,EAAE,MAAM,CAAY;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAgB;gBAErC,IAAI,GAAE,mBAAwB;IAOnC,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,MAAM,GAAG,cAAc,CAAC,cAAc,CAAC;IA+D1H,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA0BrH,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAW3E,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9E,WAAW,CAAC,UAAU,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IAS3E,mEAAmE;IAC5D,YAAY,CACjB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,uBAAuB,EAC5B,cAAc,EAAE,MAAM,GACrB,MAAM,EAAE;CA4CZ"}
package/dist/docker.js ADDED
@@ -0,0 +1,362 @@
1
+ import { DEFAULT_POWERLINE_PORT } from "@grackle-ai/common";
2
+ import { createPowerLineClient, isDevMode, bootstrapPowerLine, startRemotePowerLine, findFreePort, exec as defaultExec, sleep as defaultSleep, defaultLogger, } from "@grackle-ai/adapter-sdk";
3
+ import { existsSync } from "node:fs";
4
+ import { resolve } from "node:path";
5
+ const DOCKER_PULL_TIMEOUT_MS = 120_000;
6
+ /** Timeout for `docker build` when building the base image. */
7
+ const DOCKER_BUILD_TIMEOUT_MS = 300_000;
8
+ const GIT_CLONE_TIMEOUT_MS = 120_000;
9
+ const GIT_PULL_TIMEOUT_MS = 60_000;
10
+ const CONTAINER_POLL_DELAY_MS = 1_000;
11
+ const CONTAINER_POLL_MAX_ATTEMPTS = 30;
12
+ const CONNECT_RETRY_DELAY_MS = 1_500;
13
+ const CONNECT_MAX_RETRIES = 10;
14
+ const WORKSPACE_PATH = "/workspace";
15
+ /** Default image name used when no custom image is specified. */
16
+ const DEFAULT_IMAGE = "grackle-powerline:latest";
17
+ /** Timeout for commands executed inside the container. */
18
+ const DOCKER_EXEC_TIMEOUT_MS = 60_000;
19
+ /**
20
+ * Docker network name for sibling containers. When set (typically via compose),
21
+ * sibling containers join this network so the server can reach them directly
22
+ * by container name instead of via host port mapping. Required for DooD setups
23
+ * where the server itself runs in a container.
24
+ */
25
+ const DOCKER_NETWORK = process.env.GRACKLE_DOCKER_NETWORK || undefined;
26
+ const containerPorts = new Map();
27
+ // ─── Docker CLI Helpers ────────────────────────────────────
28
+ /** Pull a Docker image, suppressing errors if the image exists locally. */
29
+ async function pullImage(execFn, image, logger) {
30
+ try {
31
+ await execFn("docker", ["pull", image], { timeout: DOCKER_PULL_TIMEOUT_MS });
32
+ }
33
+ catch {
34
+ logger.debug({ image }, "Docker pull failed, trying local image");
35
+ }
36
+ }
37
+ /** Start a new Docker container with the given arguments. Returns true if created; false if it already existed. */
38
+ async function createOrStartContainer(execFn, containerName, runArgs) {
39
+ try {
40
+ await execFn("docker", ["inspect", containerName]);
41
+ // Container exists — just start it
42
+ await execFn("docker", ["start", containerName]);
43
+ return false;
44
+ }
45
+ catch {
46
+ // Container doesn't exist — create it
47
+ await execFn("docker", runArgs);
48
+ return true;
49
+ }
50
+ }
51
+ /** Discover the host-mapped port of an existing container. */
52
+ async function discoverHostPort(execFn, containerName, containerPort, fallback, logger) {
53
+ try {
54
+ const { stdout } = await execFn("docker", [
55
+ "inspect", "-f",
56
+ `{{(index (index .NetworkSettings.Ports "${containerPort}/tcp") 0).HostPort}}`,
57
+ containerName,
58
+ ]);
59
+ const parsed = parseInt(stdout, 10);
60
+ if (!isNaN(parsed)) {
61
+ return parsed;
62
+ }
63
+ }
64
+ catch {
65
+ logger.debug({ containerName }, "Could not discover host port, using fallback");
66
+ }
67
+ return fallback;
68
+ }
69
+ /** Poll until a Docker container reaches the Running state. */
70
+ async function waitForContainerRunning(execFn, sleepFn, containerName, logger) {
71
+ for (let i = 0; i < CONTAINER_POLL_MAX_ATTEMPTS; i++) {
72
+ try {
73
+ const { stdout } = await execFn("docker", ["inspect", "-f", "{{.State.Running}}", containerName]);
74
+ if (stdout === "true") {
75
+ return;
76
+ }
77
+ }
78
+ catch {
79
+ logger.debug({ containerName, attempt: i }, "Container not yet running");
80
+ }
81
+ await sleepFn(CONTAINER_POLL_DELAY_MS);
82
+ }
83
+ throw new Error(`Container ${containerName} did not reach Running state after ${CONTAINER_POLL_MAX_ATTEMPTS} attempts`);
84
+ }
85
+ /** Clone or pull a git repo inside a container's workspace. */
86
+ async function ensureRepoInContainer(execFn, containerName, repo, logger) {
87
+ // Check if already cloned
88
+ try {
89
+ const { stdout } = await execFn("docker", [
90
+ "exec", containerName, "bash", "-c", `ls ${WORKSPACE_PATH}/.git 2>/dev/null && echo exists`,
91
+ ]);
92
+ if (stdout.includes("exists")) {
93
+ await execFn("docker", [
94
+ "exec", "-w", WORKSPACE_PATH, containerName, "git", "pull", "--ff-only",
95
+ ], { timeout: GIT_PULL_TIMEOUT_MS }).catch((err) => {
96
+ logger.warn({ containerName, err }, "Git pull failed (may be detached HEAD)");
97
+ });
98
+ return;
99
+ }
100
+ }
101
+ catch {
102
+ // Not cloned — proceed to clone below
103
+ }
104
+ const ghToken = await getGitHubToken(execFn, logger);
105
+ const cloneUrl = repo.startsWith("https://") ? repo : `https://github.com/${repo}.git`;
106
+ if (ghToken) {
107
+ await execFn("docker", [
108
+ "exec", containerName, "git", "config", "--global",
109
+ "credential.helper", `!f() { echo "username=x-access-token"; echo "password=${ghToken}"; }; f`,
110
+ ]);
111
+ await execFn("docker", [
112
+ "exec", containerName, "git", "clone", cloneUrl, WORKSPACE_PATH,
113
+ ], { timeout: GIT_CLONE_TIMEOUT_MS });
114
+ await execFn("docker", [
115
+ "exec", containerName, "git", "config", "--global", "--unset", "credential.helper",
116
+ ]).catch((err) => {
117
+ logger.warn({ err }, "Failed to unset credential helper");
118
+ });
119
+ }
120
+ else {
121
+ await execFn("docker", [
122
+ "exec", containerName, "git", "clone", cloneUrl, WORKSPACE_PATH,
123
+ ], { timeout: GIT_CLONE_TIMEOUT_MS });
124
+ }
125
+ }
126
+ /** Validate that a token contains only safe characters (alphanumeric, underscore, hyphen). */
127
+ const SAFE_TOKEN_PATTERN = /^[a-zA-Z0-9_\-]+$/;
128
+ /** Get a GitHub token from the local `gh` CLI for private repo cloning. */
129
+ async function getGitHubToken(execFn, logger) {
130
+ try {
131
+ const { stdout } = await execFn("gh", ["auth", "token"]);
132
+ if (!stdout) {
133
+ return undefined;
134
+ }
135
+ if (!SAFE_TOKEN_PATTERN.test(stdout)) {
136
+ logger.warn({}, "GitHub token contains unexpected characters, skipping credential setup");
137
+ return undefined;
138
+ }
139
+ return stdout;
140
+ }
141
+ catch {
142
+ return undefined;
143
+ }
144
+ }
145
+ /**
146
+ * Build the base Docker image from the docker/Dockerfile.powerline.
147
+ * Resolves the monorepo root from import.meta.dirname (dist/adapters → 4 levels up).
148
+ */
149
+ async function buildBaseImage(execFn, tag, logger) {
150
+ const monorepoRoot = resolve(import.meta.dirname, "../../../../");
151
+ logger.info({ tag, monorepoRoot }, "Building base PowerLine image");
152
+ await execFn("docker", [
153
+ "build",
154
+ "-f", resolve(monorepoRoot, "docker/Dockerfile.powerline"),
155
+ "-t", tag,
156
+ monorepoRoot,
157
+ ], { timeout: DOCKER_BUILD_TIMEOUT_MS });
158
+ }
159
+ // ─── Docker Executor ───────────────────────────────────────
160
+ /** Remote executor that runs commands inside a Docker container. */
161
+ class DockerExecutor {
162
+ containerName;
163
+ execFn;
164
+ /** Cached resolved $HOME path. */
165
+ resolvedHome;
166
+ constructor(containerName, execFn) {
167
+ this.containerName = containerName;
168
+ this.execFn = execFn;
169
+ }
170
+ /** Execute a shell command inside the container and return stdout. */
171
+ async exec(command, opts) {
172
+ const { stdout } = await this.execFn("docker", [
173
+ "exec", this.containerName, "bash", "-c", command,
174
+ ], { timeout: opts?.timeout || DOCKER_EXEC_TIMEOUT_MS });
175
+ return stdout;
176
+ }
177
+ /** Copy a local file or directory into the container. */
178
+ async copyTo(localPath, remotePath) {
179
+ // Resolve $HOME since docker cp doesn't expand shell variables
180
+ let resolvedPath = remotePath;
181
+ if (resolvedPath.includes("$HOME")) {
182
+ if (!this.resolvedHome) {
183
+ this.resolvedHome = (await this.exec("echo $HOME")).trim();
184
+ }
185
+ resolvedPath = resolvedPath.replace(/\$HOME/g, this.resolvedHome);
186
+ }
187
+ await this.execFn("docker", [
188
+ "cp", localPath, `${this.containerName}:${resolvedPath}`,
189
+ ], { timeout: DOCKER_EXEC_TIMEOUT_MS });
190
+ // docker cp creates files owned by root; fix ownership so the container user can write
191
+ await this.execFn("docker", [
192
+ "exec", "-u", "root", this.containerName, "chown", "-R", "grackle:grackle", resolvedPath,
193
+ ], { timeout: DOCKER_EXEC_TIMEOUT_MS });
194
+ }
195
+ }
196
+ // ─── Docker Adapter ────────────────────────────────────────
197
+ /** Environment adapter that provisions and manages Docker containers running the PowerLine. */
198
+ export class DockerAdapter {
199
+ type = "docker";
200
+ execFn;
201
+ sleepFn;
202
+ logger;
203
+ isGitHubProviderEnabled;
204
+ constructor(deps = {}) {
205
+ this.execFn = deps.exec ?? defaultExec;
206
+ this.sleepFn = deps.sleep ?? defaultSleep;
207
+ this.logger = deps.logger ?? defaultLogger;
208
+ this.isGitHubProviderEnabled = deps.isGitHubProviderEnabled ?? (() => false);
209
+ }
210
+ async *provision(environmentId, config, powerlineToken) {
211
+ const cfg = config;
212
+ const image = cfg.image || DEFAULT_IMAGE;
213
+ const containerName = cfg.containerName || `grackle-${environmentId}`;
214
+ const localPort = cfg.localPort || await findFreePort();
215
+ // Build or pull the base image
216
+ const isDefault = image === DEFAULT_IMAGE;
217
+ const dockerfilePath = resolve(import.meta.dirname, "../../../../docker/Dockerfile.powerline");
218
+ if (isDevMode() && isDefault && existsSync(dockerfilePath)) {
219
+ yield { stage: "creating", message: "Building base image...", progress: 0.05 };
220
+ await buildBaseImage(this.execFn, image, this.logger);
221
+ }
222
+ else {
223
+ yield { stage: "creating", message: `Pulling image ${image}...`, progress: 0.05 };
224
+ await pullImage(this.execFn, image, this.logger);
225
+ }
226
+ yield { stage: "creating", message: `Creating container ${containerName}...`, progress: 0.10 };
227
+ const runArgs = this.buildRunArgs(containerName, localPort, image, cfg, powerlineToken);
228
+ const isNew = await createOrStartContainer(this.execFn, containerName, runArgs);
229
+ let actualPort = localPort;
230
+ if (!isNew) {
231
+ yield { stage: "starting", message: "Container exists, starting...", progress: 0.12 };
232
+ actualPort = await discoverHostPort(this.execFn, containerName, DEFAULT_POWERLINE_PORT, localPort, this.logger);
233
+ }
234
+ containerPorts.set(environmentId, actualPort);
235
+ yield { stage: "starting", message: "Waiting for container...", progress: 0.15 };
236
+ await waitForContainerRunning(this.execFn, this.sleepFn, containerName, this.logger);
237
+ // Bootstrap PowerLine inside the container (same flow as SSH/Codespace).
238
+ // Docker containers need host=0.0.0.0 because port mapping can't reach 127.0.0.1.
239
+ const executor = new DockerExecutor(containerName, this.execFn);
240
+ if (isNew) {
241
+ yield* bootstrapPowerLine(executor, powerlineToken, {
242
+ extraEnv: cfg.env,
243
+ workingDirectory: WORKSPACE_PATH,
244
+ host: "0.0.0.0",
245
+ isGitHubProviderEnabled: this.isGitHubProviderEnabled,
246
+ defaultRuntime: config.defaultRuntime || undefined,
247
+ });
248
+ }
249
+ else {
250
+ // Container already exists — just restart PowerLine with fresh token
251
+ yield { stage: "reconnecting", message: "Restarting PowerLine...", progress: 0.60 };
252
+ await startRemotePowerLine(executor, powerlineToken, {
253
+ extraEnv: cfg.env,
254
+ host: "0.0.0.0",
255
+ probeFirst: true,
256
+ });
257
+ }
258
+ if (cfg.repo) {
259
+ yield { stage: "cloning", message: `Cloning ${cfg.repo}...`, progress: 0.80 };
260
+ await ensureRepoInContainer(this.execFn, containerName, cfg.repo, this.logger);
261
+ yield { stage: "cloning", message: "Repo ready", progress: 0.85 };
262
+ }
263
+ yield { stage: "connecting", message: `Connecting on port ${actualPort}...`, progress: 0.90 };
264
+ }
265
+ async connect(environmentId, config, powerlineToken) {
266
+ const cfg = config;
267
+ const containerName = cfg.containerName || `grackle-${environmentId}`;
268
+ const localPort = containerPorts.get(environmentId) || cfg.localPort || DEFAULT_POWERLINE_PORT;
269
+ // When on a shared Docker network, connect directly to the sibling container
270
+ // by name on the default PowerLine port. Otherwise, use the mapped host port.
271
+ const connectUrl = DOCKER_NETWORK
272
+ ? `http://${containerName}:${DEFAULT_POWERLINE_PORT}`
273
+ : `http://127.0.0.1:${localPort}`;
274
+ const client = createPowerLineClient(connectUrl, powerlineToken);
275
+ let lastErr;
276
+ for (let attempt = 0; attempt < CONNECT_MAX_RETRIES; attempt++) {
277
+ try {
278
+ await client.ping({});
279
+ return { client, environmentId, port: localPort };
280
+ }
281
+ catch (err) {
282
+ lastErr = err;
283
+ await this.sleepFn(CONNECT_RETRY_DELAY_MS);
284
+ }
285
+ }
286
+ throw new Error(`Could not reach PowerLine after ${CONNECT_MAX_RETRIES} attempts: ${lastErr instanceof Error ? lastErr.message : String(lastErr)}`);
287
+ }
288
+ async disconnect(environmentId) {
289
+ containerPorts.delete(environmentId);
290
+ }
291
+ async stop(environmentId, config) {
292
+ const cfg = config;
293
+ const containerName = cfg.containerName || `grackle-${environmentId}`;
294
+ try {
295
+ await this.execFn("docker", ["stop", containerName]);
296
+ }
297
+ catch (err) {
298
+ this.logger.debug({ environmentId, err }, "Container may already be stopped");
299
+ }
300
+ containerPorts.delete(environmentId);
301
+ }
302
+ async destroy(environmentId, config) {
303
+ const cfg = config;
304
+ const containerName = cfg.containerName || `grackle-${environmentId}`;
305
+ try {
306
+ await this.execFn("docker", ["rm", "-f", containerName]);
307
+ }
308
+ catch (err) {
309
+ this.logger.debug({ environmentId, err }, "Container may not exist");
310
+ }
311
+ containerPorts.delete(environmentId);
312
+ }
313
+ async healthCheck(connection) {
314
+ try {
315
+ await connection.client.ping({});
316
+ return true;
317
+ }
318
+ catch {
319
+ return false;
320
+ }
321
+ }
322
+ /** Build the `docker run` argument array from config and token. */
323
+ buildRunArgs(containerName, localPort, image, cfg, powerlineToken) {
324
+ const args = [
325
+ "run", "-d",
326
+ "--name", containerName,
327
+ ];
328
+ // When running inside a container (DooD), join the shared network so the
329
+ // server can reach the sibling by container name. Otherwise, map the port
330
+ // to the host for bare-metal setups.
331
+ if (DOCKER_NETWORK) {
332
+ args.push("--network", DOCKER_NETWORK);
333
+ }
334
+ else {
335
+ args.push("-p", `127.0.0.1:${localPort}:${DEFAULT_POWERLINE_PORT}`);
336
+ }
337
+ if (cfg.volumes) {
338
+ for (const vol of cfg.volumes) {
339
+ args.push("-v", vol);
340
+ }
341
+ }
342
+ if (cfg.env) {
343
+ for (const [key, val] of Object.entries(cfg.env)) {
344
+ args.push("-e", `${key}=${val}`);
345
+ }
346
+ }
347
+ // Pass PowerLine token for gRPC authentication (connectivity, not a credential).
348
+ // All provider credentials are delivered via pushTokens() at task start.
349
+ if (powerlineToken) {
350
+ args.push("-e", `GRACKLE_POWERLINE_TOKEN=${powerlineToken}`);
351
+ }
352
+ // Chromium needs >64MB shared memory for rendering
353
+ args.push("--shm-size=1gb");
354
+ // GPU passthrough for accelerated inference (e.g. TTS, ML models)
355
+ if (cfg.gpus) {
356
+ args.push("--gpus", cfg.gpus);
357
+ }
358
+ args.push(image);
359
+ return args;
360
+ }
361
+ }
362
+ //# sourceMappingURL=docker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { DockerAdapter } from "./docker.js";
2
+ export type { DockerEnvironmentConfig } from "./docker.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { DockerAdapter } from "./docker.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,11 @@
1
+ // This file is read by tools that parse documentation comments conforming to the TSDoc standard.
2
+ // It should be published with your NPM package. It should not be tracked by Git.
3
+ {
4
+ "tsdocVersion": "0.12",
5
+ "toolPackages": [
6
+ {
7
+ "packageName": "@microsoft/api-extractor",
8
+ "packageVersion": "7.57.7"
9
+ }
10
+ ]
11
+ }
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@grackle-ai/adapter-docker",
3
+ "version": "0.72.2",
4
+ "description": "Grackle Docker environment adapter",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/nick-pape/grackle.git",
9
+ "directory": "packages/adapter-docker"
10
+ },
11
+ "keywords": [
12
+ "grackle",
13
+ "adapter",
14
+ "docker",
15
+ "environment"
16
+ ],
17
+ "engines": {
18
+ "node": ">=22.0.0"
19
+ },
20
+ "type": "module",
21
+ "main": "dist/index.js",
22
+ "types": "dist/index.d.ts",
23
+ "files": [
24
+ "dist/"
25
+ ],
26
+ "dependencies": {
27
+ "@grackle-ai/adapter-sdk": "0.72.2",
28
+ "@grackle-ai/common": "0.72.2"
29
+ },
30
+ "devDependencies": {
31
+ "@rushstack/heft": "1.2.7",
32
+ "@types/node": "^22.0.0",
33
+ "vitest": "^3.1.1",
34
+ "@grackle-ai/heft-rig": "0.0.1"
35
+ },
36
+ "scripts": {
37
+ "build": "heft build --clean",
38
+ "test": "vitest run",
39
+ "clean": "heft clean",
40
+ "_phase:build": "heft run --only build -- --clean",
41
+ "_phase:test": "vitest run"
42
+ }
43
+ }