@nodetool-ai/compute 0.8.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * RunPod Pod management over the REST API (https://rest.runpod.io/v1).
3
+ *
4
+ * The serverless helpers in `runpod-api.ts` create templates/endpoints (the
5
+ * job/queue model) and read the API key from `process.env`. This module manages
6
+ * **persistent Pods** — the right shape for a long-lived NodeTool WebSocket
7
+ * worker the server/CLI attaches to — and takes the API key **explicitly** so it
8
+ * can be sourced from the per-user secret store (`getSecret`), never the
9
+ * environment.
10
+ *
11
+ * REST surface used: POST /v1/pods, GET /v1/pods/{id}, POST /v1/pods/{id}/stop,
12
+ * DELETE /v1/pods/{id}, GET /v1/pods.
13
+ */
14
+ /** Request body for POST /v1/pods (subset we use; see the REST reference). */
15
+ export interface RunpodPodSpec {
16
+ name: string;
17
+ imageName: string;
18
+ computeType?: "CPU" | "GPU";
19
+ vcpuCount?: number;
20
+ cpuFlavorIds?: string[];
21
+ cpuFlavorPriority?: "availability" | "custom";
22
+ gpuTypeIds?: string[];
23
+ gpuCount?: number;
24
+ ports?: string[];
25
+ env?: Record<string, string>;
26
+ containerDiskInGb?: number;
27
+ volumeInGb?: number;
28
+ volumeMountPath?: string;
29
+ networkVolumeId?: string;
30
+ dockerEntrypoint?: string[];
31
+ dockerStartCmd?: string[];
32
+ supportPublicIp?: boolean;
33
+ globalNetworking?: boolean;
34
+ dataCenterIds?: string[];
35
+ }
36
+ /** Pod as returned by GET /v1/pods/{id} (fields we read). */
37
+ export interface RunpodPod {
38
+ id: string;
39
+ name?: string;
40
+ desiredStatus?: "RUNNING" | "READYT" | "EXITED" | "TERMINATED" | string;
41
+ image?: string;
42
+ /** Public IPv4; empty/null while the Pod is initializing. */
43
+ publicIp?: string | null;
44
+ /** Internal→external port map, e.g. {"7777": 41021}. */
45
+ portMappings?: Record<string, number> | null;
46
+ ports?: string[];
47
+ /** Hourly cost (USD) RunPod bills for this pod's compute. */
48
+ costPerHr?: number;
49
+ [k: string]: unknown;
50
+ }
51
+ /** Create (and deploy) a Pod. POST /v1/pods. */
52
+ export declare function createPod(apiKey: string, spec: RunpodPodSpec): Promise<RunpodPod>;
53
+ /** Get a Pod by id. GET /v1/pods/{id}. */
54
+ export declare function getPod(apiKey: string, id: string): Promise<RunpodPod>;
55
+ /** List Pods. GET /v1/pods. */
56
+ export declare function listPods(apiKey: string): Promise<RunpodPod[]>;
57
+ /** Stop a Pod (releases compute, keeps the volume). POST /v1/pods/{id}/stop. */
58
+ export declare function stopPod(apiKey: string, id: string): Promise<void>;
59
+ /**
60
+ * Resume a stopped Pod (re-allocates compute, keeps the volume).
61
+ * POST /v1/pods/{id}/start. May fail or return zero GPUs if RunPod capacity has
62
+ * changed since the Pod was stopped.
63
+ */
64
+ export declare function startPod(apiKey: string, id: string): Promise<void>;
65
+ /** Terminate a Pod (deletes it). DELETE /v1/pods/{id}. */
66
+ export declare function deletePod(apiKey: string, id: string): Promise<void>;
67
+ /**
68
+ * Direct TCP WebSocket URL for an exposed `/tcp` port, or null while the Pod
69
+ * lacks a public IP / port mapping. Preferred for large frames (no HTTP proxy).
70
+ */
71
+ export declare function podDirectWsUrl(pod: RunpodPod, internalPort: number): string | null;
72
+ /**
73
+ * RunPod HTTP-proxy WebSocket URL for an exposed `/http` port. TLS-terminated
74
+ * by RunPod; subject to the proxy's size/timeout limits (fine for small frames).
75
+ */
76
+ export declare function podProxyWsUrl(podId: string, internalPort: number): string;
77
+ /**
78
+ * Default GPUs requested for a GPU pod. RunPod's REST API does not document a
79
+ * default for `gpuCount`, so we set it explicitly to avoid a "running" pod that
80
+ * was allocated zero GPUs. One GPU is the right default for a single worker.
81
+ */
82
+ export declare const DEFAULT_GPU_COUNT = 1;
83
+ /**
84
+ * Default vCPUs for a GPU pod. RunPod pairs vCPUs with the GPU on GPU pods, but
85
+ * leaving `vcpuCount` undefined relies on undocumented defaults; pin a sane
86
+ * value so the worker has CPU headroom for I/O and the bridge process.
87
+ */
88
+ export declare const DEFAULT_GPU_VCPU_COUNT = 8;
89
+ /** Default vCPUs for a CPU pod. */
90
+ export declare const DEFAULT_CPU_VCPU_COUNT = 4;
91
+ export interface DeployWorkerPodOptions {
92
+ /** Pod name. */
93
+ name: string;
94
+ /** Registry image RunPod pulls (must be reachable by RunPod). */
95
+ image: string;
96
+ /** Shared-secret passed as NODETOOL_WORKER_TOKEN (gates the ws handshake). */
97
+ workerToken?: string;
98
+ /** Internal port the worker serves on. Default 7777. */
99
+ internalPort?: number;
100
+ /** Expose via RunPod HTTP proxy ("http" → wss proxy) or direct TCP. */
101
+ exposure?: "http" | "tcp";
102
+ computeType?: "CPU" | "GPU";
103
+ vcpuCount?: number;
104
+ gpuTypeIds?: string[];
105
+ /** GPUs per pod (GPU pods only). Defaults to {@link DEFAULT_GPU_COUNT}. */
106
+ gpuCount?: number;
107
+ containerDiskInGb?: number;
108
+ /** Persistent volume size in GB (mounted at `volumeMountPath`). */
109
+ volumeInGb?: number;
110
+ /** Mount path for the persistent volume. Defaults to "/workspace". */
111
+ volumeMountPath?: string;
112
+ /** Extra env merged into the container. */
113
+ env?: Record<string, string>;
114
+ /**
115
+ * OpenSSH public key. When set, 22/tcp is exposed and the key is passed as
116
+ * PUBLIC_KEY, which the worker entrypoint installs before starting sshd.
117
+ *
118
+ * A rented worker is otherwise reachable only through the node-execution
119
+ * bridge, so diagnosing one means inferring its state from pass/fail of whole
120
+ * model loads. A shell turns that into reading the state directly.
121
+ */
122
+ sshPublicKey?: string;
123
+ /** Poll budget for the Pod to reach RUNNING + expose its endpoint. */
124
+ timeoutMs?: number;
125
+ }
126
+ export interface DeployedWorkerPod {
127
+ podId: string;
128
+ /** ws/wss URL to set as NODETOOL_WORKER_URL. */
129
+ wsUrl: string;
130
+ pod: RunpodPod;
131
+ }
132
+ /**
133
+ * Deploy a NodeTool worker image as a persistent RunPod Pod and wait until it is
134
+ * RUNNING with a resolvable WebSocket endpoint. Does NOT read process.env — pass
135
+ * `apiKey` (from the secret store) and `workerToken` explicitly.
136
+ *
137
+ * Reaching RUNNING + having an endpoint does not guarantee the worker process
138
+ * has finished loading nodes; the caller should connect with retry.
139
+ */
140
+ export declare function deployWorkerPod(apiKey: string, opts: DeployWorkerPodOptions): Promise<DeployedWorkerPod>;
141
+ /** Poll GET /v1/pods/{id} until RUNNING with a resolvable endpoint. */
142
+ export declare function waitForPodEndpoint(apiKey: string, id: string, opts: {
143
+ internalPort: number;
144
+ exposure: "http" | "tcp";
145
+ timeoutMs?: number;
146
+ intervalMs?: number;
147
+ }): Promise<{
148
+ pod: RunpodPod;
149
+ wsUrl: string;
150
+ }>;
151
+ //# sourceMappingURL=runpod-rest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runpod-rest.d.ts","sourceRoot":"","sources":["../../src/providers/runpod-rest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * RunPod Pod management over the REST API (https://rest.runpod.io/v1).
3
+ *
4
+ * The serverless helpers in `runpod-api.ts` create templates/endpoints (the
5
+ * job/queue model) and read the API key from `process.env`. This module manages
6
+ * **persistent Pods** — the right shape for a long-lived NodeTool WebSocket
7
+ * worker the server/CLI attaches to — and takes the API key **explicitly** so it
8
+ * can be sourced from the per-user secret store (`getSecret`), never the
9
+ * environment.
10
+ *
11
+ * REST surface used: POST /v1/pods, GET /v1/pods/{id}, POST /v1/pods/{id}/stop,
12
+ * DELETE /v1/pods/{id}, GET /v1/pods.
13
+ */
14
+ const RUNPOD_REST_BASE_URL = "https://rest.runpod.io/v1";
15
+ /**
16
+ * Call the RunPod REST API with an explicitly-supplied key.
17
+ *
18
+ * @param apiKey RunPod API key (from the per-user secret store).
19
+ * @param endpoint Path under /v1, e.g. "pods" or "pods/<id>".
20
+ */
21
+ async function runpodRest(apiKey, endpoint, method = "GET", data) {
22
+ if (!apiKey)
23
+ throw new Error("RunPod API key is required");
24
+ const init = {
25
+ method,
26
+ headers: {
27
+ Authorization: `Bearer ${apiKey}`,
28
+ "Content-Type": "application/json",
29
+ Accept: "application/json"
30
+ },
31
+ signal: AbortSignal.timeout(60_000)
32
+ };
33
+ if (data && method === "POST")
34
+ init.body = JSON.stringify(data);
35
+ const response = await fetch(`${RUNPOD_REST_BASE_URL}/${endpoint}`, init);
36
+ if (!response.ok) {
37
+ const body = await response.text().catch(() => "");
38
+ throw new Error(`RunPod REST ${method} /${endpoint} failed (${response.status}): ${body}`);
39
+ }
40
+ if (method === "DELETE" && response.status === 204)
41
+ return {};
42
+ const text = await response.text();
43
+ return text ? JSON.parse(text) : {};
44
+ }
45
+ // ---------------------------------------------------------------------------
46
+ // Pod operations
47
+ // ---------------------------------------------------------------------------
48
+ /** Create (and deploy) a Pod. POST /v1/pods. */
49
+ export async function createPod(apiKey, spec) {
50
+ const pod = (await runpodRest(apiKey, "pods", "POST", spec));
51
+ if (!pod?.id)
52
+ throw new Error("RunPod createPod returned no pod id");
53
+ return pod;
54
+ }
55
+ /** Get a Pod by id. GET /v1/pods/{id}. */
56
+ export async function getPod(apiKey, id) {
57
+ return (await runpodRest(apiKey, `pods/${id}`));
58
+ }
59
+ /** List Pods. GET /v1/pods. */
60
+ export async function listPods(apiKey) {
61
+ const res = await runpodRest(apiKey, "pods");
62
+ if (Array.isArray(res))
63
+ return res;
64
+ const arr = res.pods;
65
+ return Array.isArray(arr) ? arr : [];
66
+ }
67
+ /** Stop a Pod (releases compute, keeps the volume). POST /v1/pods/{id}/stop. */
68
+ export async function stopPod(apiKey, id) {
69
+ await runpodRest(apiKey, `pods/${id}/stop`, "POST");
70
+ }
71
+ /**
72
+ * Resume a stopped Pod (re-allocates compute, keeps the volume).
73
+ * POST /v1/pods/{id}/start. May fail or return zero GPUs if RunPod capacity has
74
+ * changed since the Pod was stopped.
75
+ */
76
+ export async function startPod(apiKey, id) {
77
+ await runpodRest(apiKey, `pods/${id}/start`, "POST");
78
+ }
79
+ /** Terminate a Pod (deletes it). DELETE /v1/pods/{id}. */
80
+ export async function deletePod(apiKey, id) {
81
+ await runpodRest(apiKey, `pods/${id}`, "DELETE");
82
+ }
83
+ // ---------------------------------------------------------------------------
84
+ // Endpoint helpers
85
+ // ---------------------------------------------------------------------------
86
+ /**
87
+ * Direct TCP WebSocket URL for an exposed `/tcp` port, or null while the Pod
88
+ * lacks a public IP / port mapping. Preferred for large frames (no HTTP proxy).
89
+ */
90
+ export function podDirectWsUrl(pod, internalPort) {
91
+ const ext = pod.portMappings?.[String(internalPort)];
92
+ if (!pod.publicIp || !ext)
93
+ return null;
94
+ return `ws://${pod.publicIp}:${ext}`;
95
+ }
96
+ /**
97
+ * RunPod HTTP-proxy WebSocket URL for an exposed `/http` port. TLS-terminated
98
+ * by RunPod; subject to the proxy's size/timeout limits (fine for small frames).
99
+ */
100
+ export function podProxyWsUrl(podId, internalPort) {
101
+ return `wss://${podId}-${internalPort}.proxy.runpod.net`;
102
+ }
103
+ // ---------------------------------------------------------------------------
104
+ // High-level worker deploy
105
+ // ---------------------------------------------------------------------------
106
+ /**
107
+ * Default GPUs requested for a GPU pod. RunPod's REST API does not document a
108
+ * default for `gpuCount`, so we set it explicitly to avoid a "running" pod that
109
+ * was allocated zero GPUs. One GPU is the right default for a single worker.
110
+ */
111
+ export const DEFAULT_GPU_COUNT = 1;
112
+ /**
113
+ * Default vCPUs for a GPU pod. RunPod pairs vCPUs with the GPU on GPU pods, but
114
+ * leaving `vcpuCount` undefined relies on undocumented defaults; pin a sane
115
+ * value so the worker has CPU headroom for I/O and the bridge process.
116
+ */
117
+ export const DEFAULT_GPU_VCPU_COUNT = 8;
118
+ /** Default vCPUs for a CPU pod. */
119
+ export const DEFAULT_CPU_VCPU_COUNT = 4;
120
+ /**
121
+ * Deploy a NodeTool worker image as a persistent RunPod Pod and wait until it is
122
+ * RUNNING with a resolvable WebSocket endpoint. Does NOT read process.env — pass
123
+ * `apiKey` (from the secret store) and `workerToken` explicitly.
124
+ *
125
+ * Reaching RUNNING + having an endpoint does not guarantee the worker process
126
+ * has finished loading nodes; the caller should connect with retry.
127
+ */
128
+ export async function deployWorkerPod(apiKey, opts) {
129
+ const internalPort = opts.internalPort ?? 7777;
130
+ const exposure = opts.exposure ?? "http";
131
+ const env = { ...(opts.env ?? {}) };
132
+ if (opts.workerToken)
133
+ env.NODETOOL_WORKER_TOKEN = opts.workerToken;
134
+ const sshKey = opts.sshPublicKey?.trim();
135
+ if (sshKey)
136
+ env.PUBLIC_KEY = sshKey;
137
+ const isGpu = opts.computeType === "GPU";
138
+ const spec = {
139
+ name: opts.name,
140
+ imageName: opts.image,
141
+ computeType: opts.computeType ?? "CPU",
142
+ // Always pin vcpuCount explicitly rather than relying on RunPod defaults.
143
+ vcpuCount: opts.vcpuCount ??
144
+ (isGpu ? DEFAULT_GPU_VCPU_COUNT : DEFAULT_CPU_VCPU_COUNT),
145
+ gpuTypeIds: opts.gpuTypeIds,
146
+ ports: sshKey
147
+ ? [`${internalPort}/${exposure}`, "22/tcp"]
148
+ : [`${internalPort}/${exposure}`],
149
+ env,
150
+ containerDiskInGb: opts.containerDiskInGb ?? 20
151
+ };
152
+ // GPU pods must request an explicit gpuCount; without it RunPod may allocate
153
+ // zero GPUs while still reporting the pod as running.
154
+ if (isGpu) {
155
+ spec.gpuCount = opts.gpuCount ?? DEFAULT_GPU_COUNT;
156
+ }
157
+ // Persistent volume — survives stop/resume, holds the HF model cache.
158
+ if (opts.volumeInGb) {
159
+ spec.volumeInGb = opts.volumeInGb;
160
+ spec.volumeMountPath = opts.volumeMountPath ?? "/workspace";
161
+ }
162
+ const created = await createPod(apiKey, spec);
163
+ try {
164
+ const { pod, wsUrl } = await waitForPodEndpoint(apiKey, created.id, {
165
+ internalPort,
166
+ exposure,
167
+ timeoutMs: opts.timeoutMs ?? 240_000
168
+ });
169
+ return { podId: created.id, wsUrl, pod };
170
+ }
171
+ catch (err) {
172
+ // The pod exists and is billing, but polling never reached a usable
173
+ // endpoint. Tear it down so we don't leak a billing orphan, then surface
174
+ // the original failure. Cleanup errors must not mask the root cause.
175
+ await deletePod(apiKey, created.id).catch(() => { });
176
+ throw err;
177
+ }
178
+ }
179
+ /** Poll GET /v1/pods/{id} until RUNNING with a resolvable endpoint. */
180
+ export async function waitForPodEndpoint(apiKey, id, opts) {
181
+ const deadline = Date.now() + (opts.timeoutMs ?? 240_000);
182
+ const intervalMs = opts.intervalMs ?? 5_000;
183
+ let last;
184
+ while (Date.now() < deadline) {
185
+ const pod = await getPod(apiKey, id);
186
+ last = pod;
187
+ if (pod.desiredStatus === "TERMINATED" || pod.desiredStatus === "EXITED") {
188
+ throw new Error(`Pod ${id} reached terminal status ${pod.desiredStatus}`);
189
+ }
190
+ if (pod.desiredStatus === "RUNNING" || pod.desiredStatus === "READYT") {
191
+ if (opts.exposure === "http") {
192
+ return { pod, wsUrl: podProxyWsUrl(id, opts.internalPort) };
193
+ }
194
+ const direct = podDirectWsUrl(pod, opts.internalPort);
195
+ if (direct)
196
+ return { pod, wsUrl: direct };
197
+ }
198
+ await new Promise((r) => setTimeout(r, intervalMs));
199
+ }
200
+ throw new Error(`Pod ${id} did not become reachable within the timeout (last status: ${last?.desiredStatus ?? "unknown"})`);
201
+ }
202
+ //# sourceMappingURL=runpod-rest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runpod-rest.js","sourceRoot":"","sources":["../../src/providers/runpod-rest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type ProviderInstance, type ProvisionResult, type WorkerProvider, type WorkerSpec, type WorkerStatus } from "./types.js";
2
+ export declare class RunpodPodProvider implements WorkerProvider {
3
+ private readonly apiKey;
4
+ constructor(apiKey: string);
5
+ provision(spec: WorkerSpec): Promise<ProvisionResult>;
6
+ status(ref: string): Promise<WorkerStatus>;
7
+ /** Pause: release the GPU, keep the volume (and its model cache). */
8
+ stop(ref: string): Promise<void>;
9
+ /** Resume a paused pod and re-derive its (possibly new) attach endpoint. */
10
+ resume(ref: string): Promise<ProvisionResult>;
11
+ /** Destroy the pod and its volume — real teardown, stops all billing. */
12
+ terminate(ref: string): Promise<void>;
13
+ list(): Promise<ProviderInstance[]>;
14
+ }
15
+ //# sourceMappingURL=runpod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runpod.d.ts","sourceRoot":"","sources":["../../src/providers/runpod.ts"],"names":[],"mappings":"AAuBA,OAAO,EAKL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,YAAY,EAClB,MAAM,YAAY,CAAC;AAqBpB,qBAAa,iBAAkB,YAAW,cAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAnC,YAA6B,MAAM,EAAE,MAAM,EAAI;IAEzC,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,CA4B1D;IAEK,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAG/C;IAED,qEAAqE;IAC/D,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAErC;IAED,4EAA4E;IACtE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAYlD;IAED,yEAAyE;IACnE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1C;IAEK,IAAI,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAMxC;CACF"}
@@ -0,0 +1,100 @@
1
+ // RunPod pod-backed `WorkerProvider`.
2
+ //
3
+ // Delegates to the RunPod REST transport (`runpod-rest.ts`) to create a
4
+ // persistent pod running the NodeTool worker image, poll it to RUNNING, and
5
+ // derive the `wss://` proxy URL the bridge attaches to.
6
+ //
7
+ // Lifecycle: `stop` PAUSES the pod (releases the GPU, keeps the volume so the
8
+ // HF model cache survives) and `resume` brings it back; `terminate` DELETES the
9
+ // pod and its volume — that's the real teardown that stops all billing.
10
+ //
11
+ // The API key is injected via the constructor (sourced from the secret store /
12
+ // env by the `WorkerManager`); this provider never reads `process.env`.
13
+ import { deletePod, deployWorkerPod, getPod, listPods, startPod, stopPod, waitForPodEndpoint, } from "./runpod-rest.js";
14
+ import { DEFAULT_VOLUME_GB, DEFAULT_CONTAINER_DISK_GB, WORKER_HF_HOME, WORKER_VOLUME_MOUNT, } from "./types.js";
15
+ /** Internal port the worker serves on. */
16
+ const WORKER_PORT = 7777;
17
+ /** Worker is exposed via the RunPod HTTP proxy as a wss:// endpoint. */
18
+ const EXPOSURE = "http";
19
+ /** Map a RunPod pod's `desiredStatus` to the shared `WorkerStatus`. */
20
+ function mapPodStatus(pod) {
21
+ switch (pod.desiredStatus) {
22
+ case "RUNNING":
23
+ case "READYT": // RunPod's "ready to run" transitional state
24
+ return "running";
25
+ case "EXITED":
26
+ case "TERMINATED":
27
+ return "stopped";
28
+ default:
29
+ return "provisioning";
30
+ }
31
+ }
32
+ export class RunpodPodProvider {
33
+ apiKey;
34
+ constructor(apiKey) {
35
+ this.apiKey = apiKey;
36
+ }
37
+ async provision(spec) {
38
+ const useGpu = Boolean(spec.gpu);
39
+ const { podId, wsUrl, pod } = await deployWorkerPod(this.apiKey, {
40
+ name: spec.name,
41
+ image: spec.image,
42
+ workerToken: spec.token,
43
+ internalPort: WORKER_PORT,
44
+ exposure: EXPOSURE,
45
+ computeType: useGpu ? "GPU" : "CPU",
46
+ gpuTypeIds: spec.gpu ? [spec.gpu] : undefined,
47
+ gpuCount: spec.gpuCount,
48
+ vcpuCount: spec.vcpu,
49
+ // Point HF model downloads at the persistent volume so they survive a
50
+ // stop/resume; merge over any caller env (caller wins on conflict? no —
51
+ // we own HF_HOME, so it goes last).
52
+ env: { ...spec.env, HF_HOME: WORKER_HF_HOME },
53
+ sshPublicKey: spec.sshPublicKey,
54
+ containerDiskInGb: DEFAULT_CONTAINER_DISK_GB,
55
+ volumeInGb: spec.disk ?? DEFAULT_VOLUME_GB,
56
+ volumeMountPath: WORKER_VOLUME_MOUNT,
57
+ });
58
+ return {
59
+ providerRef: podId,
60
+ wsUrl,
61
+ token: spec.token,
62
+ status: "running",
63
+ costUsd: pod.costPerHr,
64
+ };
65
+ }
66
+ async status(ref) {
67
+ const pod = await getPod(this.apiKey, ref);
68
+ return mapPodStatus(pod);
69
+ }
70
+ /** Pause: release the GPU, keep the volume (and its model cache). */
71
+ async stop(ref) {
72
+ await stopPod(this.apiKey, ref);
73
+ }
74
+ /** Resume a paused pod and re-derive its (possibly new) attach endpoint. */
75
+ async resume(ref) {
76
+ await startPod(this.apiKey, ref);
77
+ const { pod, wsUrl } = await waitForPodEndpoint(this.apiKey, ref, {
78
+ internalPort: WORKER_PORT,
79
+ exposure: EXPOSURE,
80
+ });
81
+ return {
82
+ providerRef: ref,
83
+ wsUrl,
84
+ status: "running",
85
+ costUsd: pod.costPerHr,
86
+ };
87
+ }
88
+ /** Destroy the pod and its volume — real teardown, stops all billing. */
89
+ async terminate(ref) {
90
+ await deletePod(this.apiKey, ref);
91
+ }
92
+ async list() {
93
+ const pods = await listPods(this.apiKey);
94
+ return pods.map((pod) => ({
95
+ providerRef: pod.id,
96
+ status: mapPodStatus(pod),
97
+ }));
98
+ }
99
+ }
100
+ //# sourceMappingURL=runpod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runpod.js","sourceRoot":"","sources":["../../src/providers/runpod.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ /** Provisioning target a profile/spec runs on. */
2
+ export type WorkerTarget = "runpod" | "vast";
3
+ /**
4
+ * Lifecycle status of a worker, shared by instances and provider results.
5
+ * `provisioning` → `running` → `attached`, with `stopping`/`stopped` on
6
+ * teardown and `error` on failure.
7
+ */
8
+ export type WorkerStatus = "provisioning" | "running" | "attached" | "stopping" | "stopped" | "terminated" | "error";
9
+ /**
10
+ * Persistent-volume conventions shared by all providers. The volume survives a
11
+ * stop/resume (only a terminate deletes it), so HF model downloads cached under
12
+ * `WORKER_HF_HOME` persist across pauses — that's the whole point of feature.
13
+ */
14
+ export declare const WORKER_VOLUME_MOUNT = "/workspace";
15
+ export declare const WORKER_HF_HOME = "/workspace/huggingface";
16
+ /** Default persistent volume size — big enough for several HF image models. */
17
+ export declare const DEFAULT_VOLUME_GB = 100;
18
+ /** Default ephemeral container disk (image + temp); not persisted. */
19
+ export declare const DEFAULT_CONTAINER_DISK_GB = 30;
20
+ /**
21
+ * Declarative description of a worker to provision. Derived from a
22
+ * `WorkerProfile` at provision time, with a per-instance `token` mixed in.
23
+ */
24
+ export interface WorkerSpec {
25
+ /** Profile/worker name, used for human-readable provider tagging. */
26
+ name: string;
27
+ /** Container image to run (`python -m nodetool.worker`, port 7777). */
28
+ image: string;
29
+ /** Provisioning target. */
30
+ target: WorkerTarget;
31
+ /** Provider-shaped GPU selector (e.g. "A40"). */
32
+ gpu?: string;
33
+ /** Number of GPUs to request (GPU targets only). Defaults to 1. */
34
+ gpuCount?: number;
35
+ /** vCPU count. */
36
+ vcpu?: number;
37
+ /**
38
+ * Persistent volume size in GB, mounted at `WORKER_VOLUME_MOUNT`. Holds the
39
+ * HF model cache and survives stop/resume. Defaults to `DEFAULT_VOLUME_GB`.
40
+ */
41
+ disk?: number;
42
+ /** Extra environment variables for the worker container. */
43
+ env?: Record<string, string>;
44
+ /** Bearer token the worker authenticates with, when generated/fixed. */
45
+ token?: string;
46
+ /**
47
+ * OpenSSH public key. When set, the provider exposes 22/tcp and passes the
48
+ * key as PUBLIC_KEY so the worker entrypoint starts sshd. Without it a
49
+ * rented worker can only be reached through the node-execution bridge.
50
+ */
51
+ sshPublicKey?: string;
52
+ }
53
+ /** Result of a successful `provision` — the attach handoff for an instance. */
54
+ export interface ProvisionResult {
55
+ /** Provider-native handle (RunPod podId / Vast instance id). */
56
+ providerRef: string;
57
+ /** WebSocket URL the bridge re-points at to attach. */
58
+ wsUrl: string;
59
+ /** Bearer token for the worker, if one was set. */
60
+ token?: string;
61
+ /** Status at the moment provisioning returned (typically `running`). */
62
+ status: WorkerStatus;
63
+ /**
64
+ * Estimated hourly cost (USD) of the provisioned worker, when the provider
65
+ * reports it (RunPod `costPerHr`, Vast `dph_total`). Drives the cost guard's
66
+ * reconcile aggregation and the workers-panel display; `undefined` when the
67
+ * provider exposes no price.
68
+ */
69
+ costUsd?: number;
70
+ }
71
+ /** A live worker as reported by the provider, for orphan reconciliation. */
72
+ export interface ProviderInstance {
73
+ /** Provider-native handle. */
74
+ providerRef: string;
75
+ /** Current status as mapped from the provider's native state. */
76
+ status: WorkerStatus;
77
+ }
78
+ /**
79
+ * Per-target driver the `WorkerManager` delegates to. Implementations do REAL
80
+ * provider work — `terminate` MUST destroy billed GPU + volume resources.
81
+ */
82
+ export interface WorkerProvider {
83
+ /** Create the worker and return its attach handoff once running. */
84
+ provision(spec: WorkerSpec): Promise<ProvisionResult>;
85
+ /** Current status of the worker identified by `ref`. */
86
+ status(ref: string): Promise<WorkerStatus>;
87
+ /**
88
+ * Pause the worker: release the GPU compute but KEEP its volume (and its
89
+ * cached models) so it can be `resume`d. The provider still bills a small
90
+ * amount for retained volume storage while paused.
91
+ */
92
+ stop(ref: string): Promise<void>;
93
+ /**
94
+ * Resume a previously-stopped worker: bring it back to running and return its
95
+ * fresh attach handoff (the URL/cost may differ). May fail if the provider
96
+ * cannot re-allocate a GPU (e.g. RunPod capacity changed).
97
+ */
98
+ resume(ref: string): Promise<ProvisionResult>;
99
+ /**
100
+ * Destroy the worker AND its volume (real teardown — non-negotiable). Stops
101
+ * all billing; the cached models are gone for good.
102
+ */
103
+ terminate(ref: string): Promise<void>;
104
+ /** List the provider's live workers, for orphan reconciliation. */
105
+ list(): Promise<ProviderInstance[]>;
106
+ }
107
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAOA,kDAAkD;AAClD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE7C;;;;GAIG;AACH,MAAM,MAAM,YAAY,GACpB,cAAc,GACd,SAAS,GACT,UAAU,GACV,UAAU,GAEV,SAAS,GAET,YAAY,GACZ,OAAO,CAAC;AAEZ;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAChD,eAAO,MAAM,cAAc,2BAAuC,CAAC;AACnE,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,sEAAsE;AACtE,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,iDAAiD;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,+EAA+E;AAC/E,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,MAAM,EAAE,YAAY,CAAC;IACrB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,4EAA4E;AAC5E,MAAM,WAAW,gBAAgB;IAC/B,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,MAAM,EAAE,YAAY,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,oEAAoE;IACpE,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACtD,wDAAwD;IACxD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3C;;;;OAIG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC;;;;OAIG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9C;;;OAGG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,mEAAmE;IACnE,IAAI,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;CACrC"}