@hypercli.com/sdk 2026.4.13-3 → 2026.4.13-4
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/dist/agent.d.ts +350 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +620 -0
- package/dist/agent.js.map +1 -0
- package/dist/agents.d.ts +433 -0
- package/dist/agents.d.ts.map +1 -0
- package/dist/agents.js +1140 -0
- package/dist/agents.js.map +1 -0
- package/dist/billing.d.ts +72 -0
- package/dist/billing.d.ts.map +1 -0
- package/dist/billing.js +93 -0
- package/dist/billing.js.map +1 -0
- package/dist/browser.d.ts +25 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +33 -0
- package/dist/browser.js.map +1 -0
- package/dist/client.d.ts +67 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +100 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +46 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +235 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +9 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +15 -0
- package/dist/errors.js.map +1 -0
- package/dist/files.d.ts +60 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +128 -0
- package/dist/files.js.map +1 -0
- package/dist/gateway.d.ts +2 -0
- package/dist/gateway.d.ts.map +1 -0
- package/dist/gateway.js +2 -0
- package/dist/gateway.js.map +1 -0
- package/dist/http.d.ts +42 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +238 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/instances.d.ts +94 -0
- package/dist/instances.d.ts.map +1 -0
- package/dist/instances.js +197 -0
- package/dist/instances.js.map +1 -0
- package/dist/job/base.d.ts +80 -0
- package/dist/job/base.d.ts.map +1 -0
- package/dist/job/base.js +200 -0
- package/dist/job/base.js.map +1 -0
- package/dist/job/comfyui.d.ts +75 -0
- package/dist/job/comfyui.d.ts.map +1 -0
- package/dist/job/comfyui.js +454 -0
- package/dist/job/comfyui.js.map +1 -0
- package/dist/job/gradio.d.ts +48 -0
- package/dist/job/gradio.d.ts.map +1 -0
- package/dist/job/gradio.js +90 -0
- package/dist/job/gradio.js.map +1 -0
- package/dist/jobs.d.ts +153 -0
- package/dist/jobs.d.ts.map +1 -0
- package/dist/jobs.js +352 -0
- package/dist/jobs.js.map +1 -0
- package/dist/keys.d.ts +83 -0
- package/dist/keys.d.ts.map +1 -0
- package/dist/keys.js +69 -0
- package/dist/keys.js.map +1 -0
- package/dist/logs.d.ts +54 -0
- package/dist/logs.d.ts.map +1 -0
- package/dist/logs.js +256 -0
- package/dist/logs.js.map +1 -0
- package/dist/models.d.ts +15 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +19 -0
- package/dist/models.js.map +1 -0
- package/dist/openclaw/gateway.d.ts +269 -0
- package/dist/openclaw/gateway.d.ts.map +1 -0
- package/dist/openclaw/gateway.js +2021 -0
- package/dist/openclaw/gateway.js.map +1 -0
- package/dist/renders.d.ts +187 -0
- package/dist/renders.d.ts.map +1 -0
- package/dist/renders.js +360 -0
- package/dist/renders.js.map +1 -0
- package/dist/user.d.ts +49 -0
- package/dist/user.d.ts.map +1 -0
- package/dist/user.js +57 -0
- package/dist/user.js.map +1 -0
- package/dist/voice.d.ts +31 -0
- package/dist/voice.d.ts.map +1 -0
- package/dist/voice.js +36 -0
- package/dist/voice.js.map +1 -0
- package/dist/x402.d.ts +79 -0
- package/dist/x402.d.ts.map +1 -0
- package/dist/x402.js +295 -0
- package/dist/x402.js.map +1 -0
- package/package.json +2 -1
package/dist/jobs.d.ts
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jobs API - GPU job management
|
|
3
|
+
*/
|
|
4
|
+
import type { HTTPClient } from './http.js';
|
|
5
|
+
import WebSocket from 'ws';
|
|
6
|
+
export interface Job {
|
|
7
|
+
jobId: string;
|
|
8
|
+
jobKey: string;
|
|
9
|
+
state: string;
|
|
10
|
+
gpuType: string;
|
|
11
|
+
gpuCount: number;
|
|
12
|
+
region: string;
|
|
13
|
+
constraints: Record<string, string> | null;
|
|
14
|
+
interruptible: boolean;
|
|
15
|
+
pricePerHour: number;
|
|
16
|
+
pricePerSecond: number;
|
|
17
|
+
dockerImage: string;
|
|
18
|
+
runtime: number;
|
|
19
|
+
elapsed: number;
|
|
20
|
+
timeLeft: number;
|
|
21
|
+
hostname: string | null;
|
|
22
|
+
coldBoot: boolean;
|
|
23
|
+
createdAt: number | null;
|
|
24
|
+
startedAt: number | null;
|
|
25
|
+
completedAt: number | null;
|
|
26
|
+
tags?: string[] | null;
|
|
27
|
+
}
|
|
28
|
+
export interface ExecResult {
|
|
29
|
+
jobId: string;
|
|
30
|
+
stdout: string;
|
|
31
|
+
stderr: string;
|
|
32
|
+
exitCode: number;
|
|
33
|
+
}
|
|
34
|
+
export interface GPUMetrics {
|
|
35
|
+
index: number;
|
|
36
|
+
name: string;
|
|
37
|
+
utilization: number;
|
|
38
|
+
memoryUsed: number;
|
|
39
|
+
memoryTotal: number;
|
|
40
|
+
temperature: number;
|
|
41
|
+
powerDraw: number;
|
|
42
|
+
}
|
|
43
|
+
export interface SystemMetrics {
|
|
44
|
+
cpuPercent: number;
|
|
45
|
+
cpuCores: number;
|
|
46
|
+
cpuUnixPercent: number;
|
|
47
|
+
memoryUsed: number;
|
|
48
|
+
memoryLimit: number;
|
|
49
|
+
}
|
|
50
|
+
export interface JobMetrics {
|
|
51
|
+
gpus: GPUMetrics[];
|
|
52
|
+
system: SystemMetrics | null;
|
|
53
|
+
}
|
|
54
|
+
export interface CreateJobOptions {
|
|
55
|
+
image: string;
|
|
56
|
+
command?: string;
|
|
57
|
+
gpuType?: string;
|
|
58
|
+
gpuCount?: number;
|
|
59
|
+
region?: string;
|
|
60
|
+
constraints?: Record<string, string>;
|
|
61
|
+
runtime?: number;
|
|
62
|
+
interruptible?: boolean;
|
|
63
|
+
env?: Record<string, string>;
|
|
64
|
+
ports?: Record<string, number>;
|
|
65
|
+
auth?: boolean;
|
|
66
|
+
registryAuth?: {
|
|
67
|
+
username: string;
|
|
68
|
+
password: string;
|
|
69
|
+
};
|
|
70
|
+
tags?: Record<string, string> | string[];
|
|
71
|
+
dockerfile?: string;
|
|
72
|
+
dryRun?: boolean;
|
|
73
|
+
}
|
|
74
|
+
export interface ListJobsOptions {
|
|
75
|
+
state?: string;
|
|
76
|
+
tags?: Record<string, string> | string[];
|
|
77
|
+
page?: number;
|
|
78
|
+
pageSize?: number;
|
|
79
|
+
}
|
|
80
|
+
export interface JobListPage {
|
|
81
|
+
jobs: Job[];
|
|
82
|
+
totalCount: number;
|
|
83
|
+
page: number;
|
|
84
|
+
pageSize: number;
|
|
85
|
+
}
|
|
86
|
+
export declare class Jobs {
|
|
87
|
+
private http;
|
|
88
|
+
constructor(http: HTTPClient);
|
|
89
|
+
private buildListParams;
|
|
90
|
+
/**
|
|
91
|
+
* List all jobs
|
|
92
|
+
*/
|
|
93
|
+
list(state?: string, tags?: Record<string, string> | string[]): Promise<Job[]>;
|
|
94
|
+
list(options?: ListJobsOptions): Promise<Job[]>;
|
|
95
|
+
listPage(options?: ListJobsOptions): Promise<JobListPage>;
|
|
96
|
+
/**
|
|
97
|
+
* Get job details
|
|
98
|
+
*/
|
|
99
|
+
get(jobId: string): Promise<Job>;
|
|
100
|
+
/**
|
|
101
|
+
* Create a new job
|
|
102
|
+
*/
|
|
103
|
+
create(options: CreateJobOptions): Promise<Job>;
|
|
104
|
+
/**
|
|
105
|
+
* Cancel a job
|
|
106
|
+
*/
|
|
107
|
+
cancel(jobId: string): Promise<any>;
|
|
108
|
+
/**
|
|
109
|
+
* Extend job runtime
|
|
110
|
+
*/
|
|
111
|
+
extend(jobId: string, runtime: number): Promise<Job>;
|
|
112
|
+
/**
|
|
113
|
+
* Get job logs
|
|
114
|
+
*/
|
|
115
|
+
logs(jobId: string): Promise<string>;
|
|
116
|
+
/**
|
|
117
|
+
* Get job GPU metrics
|
|
118
|
+
*/
|
|
119
|
+
metrics(jobId: string): Promise<JobMetrics>;
|
|
120
|
+
/**
|
|
121
|
+
* Get job auth token
|
|
122
|
+
*/
|
|
123
|
+
token(jobId: string): Promise<string>;
|
|
124
|
+
/**
|
|
125
|
+
* Execute a command non-interactively on a running job container.
|
|
126
|
+
*/
|
|
127
|
+
exec(jobId: string, command: string, timeout?: number): Promise<ExecResult>;
|
|
128
|
+
/**
|
|
129
|
+
* Connect to a job shell via director WebSocket proxy.
|
|
130
|
+
*/
|
|
131
|
+
shellConnect(jobId: string, shell?: string): Promise<WebSocket>;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Check if string looks like a UUID (job ID)
|
|
135
|
+
*/
|
|
136
|
+
export declare function isUuid(s: string): boolean;
|
|
137
|
+
/**
|
|
138
|
+
* Find job by UUID via direct API call
|
|
139
|
+
*/
|
|
140
|
+
export declare function findById(jobs: Jobs, jobId: string): Promise<Job | null>;
|
|
141
|
+
/**
|
|
142
|
+
* Find job by hostname (exact or prefix match)
|
|
143
|
+
*/
|
|
144
|
+
export declare function findByHostname(jobList: Job[], hostname: string): Job | null;
|
|
145
|
+
/**
|
|
146
|
+
* Find job by IP address (extracted from hostname)
|
|
147
|
+
*/
|
|
148
|
+
export declare function findByIp(jobList: Job[], ip: string): Promise<Job | null>;
|
|
149
|
+
/**
|
|
150
|
+
* Find a job by UUID, hostname, or IP address
|
|
151
|
+
*/
|
|
152
|
+
export declare function findJob(jobs: Jobs, identifier: string, state?: string): Promise<Job | null>;
|
|
153
|
+
//# sourceMappingURL=jobs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"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"}
|
package/dist/jobs.js
ADDED
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
import WebSocket from 'ws';
|
|
2
|
+
const TERMINAL_JOB_STATES = new Set(['succeeded', 'failed', 'terminated', 'canceled', 'cancelled']);
|
|
3
|
+
function parseRuntimeSeconds(value) {
|
|
4
|
+
const parsed = Number(value);
|
|
5
|
+
if (!Number.isFinite(parsed))
|
|
6
|
+
return null;
|
|
7
|
+
return Math.max(Math.trunc(parsed), 0);
|
|
8
|
+
}
|
|
9
|
+
function parseTimestampSeconds(value) {
|
|
10
|
+
if (value === null || value === undefined)
|
|
11
|
+
return null;
|
|
12
|
+
if (typeof value === 'number') {
|
|
13
|
+
return Number.isFinite(value) ? value : null;
|
|
14
|
+
}
|
|
15
|
+
if (value instanceof Date) {
|
|
16
|
+
return Number.isFinite(value.getTime()) ? value.getTime() / 1000 : null;
|
|
17
|
+
}
|
|
18
|
+
if (typeof value === 'string') {
|
|
19
|
+
const direct = Number(value);
|
|
20
|
+
if (Number.isFinite(direct)) {
|
|
21
|
+
return direct;
|
|
22
|
+
}
|
|
23
|
+
const parsed = Date.parse(value);
|
|
24
|
+
return Number.isFinite(parsed) ? parsed / 1000 : null;
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
function deriveRuntimeFields(data) {
|
|
29
|
+
const runtimeSeconds = parseRuntimeSeconds(data?.runtime);
|
|
30
|
+
if (runtimeSeconds === null) {
|
|
31
|
+
return { elapsed: 0, timeLeft: 0 };
|
|
32
|
+
}
|
|
33
|
+
const state = String(data?.state ?? '').trim().toLowerCase();
|
|
34
|
+
if (state === 'dry_run') {
|
|
35
|
+
return { elapsed: 0, timeLeft: runtimeSeconds };
|
|
36
|
+
}
|
|
37
|
+
const startedAt = parseTimestampSeconds(data?.started_at);
|
|
38
|
+
const createdAt = parseTimestampSeconds(data?.created_at);
|
|
39
|
+
const completedAt = parseTimestampSeconds(data?.completed_at);
|
|
40
|
+
let anchor = startedAt;
|
|
41
|
+
if (anchor === null && (state === 'running' || completedAt !== null || TERMINAL_JOB_STATES.has(state))) {
|
|
42
|
+
anchor = createdAt;
|
|
43
|
+
}
|
|
44
|
+
if (anchor === null) {
|
|
45
|
+
return { elapsed: 0, timeLeft: runtimeSeconds };
|
|
46
|
+
}
|
|
47
|
+
const endTime = completedAt ?? (Date.now() / 1000);
|
|
48
|
+
const elapsed = Math.max(Math.trunc(endTime - anchor), 0);
|
|
49
|
+
if (completedAt !== null || TERMINAL_JOB_STATES.has(state)) {
|
|
50
|
+
return { elapsed, timeLeft: 0 };
|
|
51
|
+
}
|
|
52
|
+
return { elapsed, timeLeft: Math.max(runtimeSeconds - elapsed, 0) };
|
|
53
|
+
}
|
|
54
|
+
function jobFromDict(data) {
|
|
55
|
+
const { elapsed, timeLeft } = deriveRuntimeFields(data);
|
|
56
|
+
return {
|
|
57
|
+
jobId: data.job_id || '',
|
|
58
|
+
jobKey: data.job_key || '',
|
|
59
|
+
state: data.state || '',
|
|
60
|
+
gpuType: data.gpu_type || '',
|
|
61
|
+
gpuCount: data.gpu_count || 1,
|
|
62
|
+
region: data.region || '',
|
|
63
|
+
constraints: data.constraints || null,
|
|
64
|
+
interruptible: data.interruptible !== false,
|
|
65
|
+
pricePerHour: data.price_per_hour || 0,
|
|
66
|
+
pricePerSecond: data.price_per_second || 0,
|
|
67
|
+
dockerImage: data.docker_image || '',
|
|
68
|
+
runtime: data.runtime || 0,
|
|
69
|
+
elapsed,
|
|
70
|
+
timeLeft,
|
|
71
|
+
hostname: data.hostname || null,
|
|
72
|
+
coldBoot: data.cold_boot ?? true,
|
|
73
|
+
createdAt: data.created_at || null,
|
|
74
|
+
startedAt: data.started_at || null,
|
|
75
|
+
completedAt: data.completed_at || null,
|
|
76
|
+
tags: data.tags || null,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function normalizeTags(tags) {
|
|
80
|
+
if (!tags)
|
|
81
|
+
return undefined;
|
|
82
|
+
if (Array.isArray(tags))
|
|
83
|
+
return [...tags];
|
|
84
|
+
return Object.entries(tags).map(([key, value]) => `${key}=${value}`);
|
|
85
|
+
}
|
|
86
|
+
function jobListPageFromDict(data) {
|
|
87
|
+
const jobs = Array.isArray(data?.jobs) ? data.jobs.map(jobFromDict) : [];
|
|
88
|
+
return {
|
|
89
|
+
jobs,
|
|
90
|
+
totalCount: Number(data?.total_count ?? jobs.length),
|
|
91
|
+
page: Number(data?.page ?? 1),
|
|
92
|
+
pageSize: Number(data?.page_size ?? (jobs.length || 50)),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function execResultFromDict(data) {
|
|
96
|
+
return {
|
|
97
|
+
jobId: data.job_id || '',
|
|
98
|
+
stdout: data.stdout || '',
|
|
99
|
+
stderr: data.stderr || '',
|
|
100
|
+
exitCode: data.exit_code ?? -1,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function gpuMetricsFromDict(data) {
|
|
104
|
+
return {
|
|
105
|
+
index: data.index || 0,
|
|
106
|
+
name: data.name || '',
|
|
107
|
+
utilization: data.utilization_gpu_percent || 0,
|
|
108
|
+
memoryUsed: data.memory_used_mb || 0,
|
|
109
|
+
memoryTotal: data.memory_total_mb || 0,
|
|
110
|
+
temperature: data.temperature_c || 0,
|
|
111
|
+
powerDraw: data.power_draw_w || 0,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function systemMetricsFromDict(data) {
|
|
115
|
+
return {
|
|
116
|
+
cpuPercent: data.cpu_percent || 0,
|
|
117
|
+
cpuCores: data.cpu_cores || 1,
|
|
118
|
+
cpuUnixPercent: data.cpu_unix_percent || data.cpu_percent || 0,
|
|
119
|
+
memoryUsed: data.memory_used_mb || 0,
|
|
120
|
+
memoryLimit: data.memory_limit_mb || 0,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function jobMetricsFromDict(data) {
|
|
124
|
+
return {
|
|
125
|
+
gpus: (data.gpus || []).map(gpuMetricsFromDict),
|
|
126
|
+
system: data.system ? systemMetricsFromDict(data.system) : null,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
export class Jobs {
|
|
130
|
+
http;
|
|
131
|
+
constructor(http) {
|
|
132
|
+
this.http = http;
|
|
133
|
+
}
|
|
134
|
+
buildListParams(options = {}) {
|
|
135
|
+
const params = {};
|
|
136
|
+
if (options.state) {
|
|
137
|
+
params.state = options.state;
|
|
138
|
+
}
|
|
139
|
+
const normalizedTags = normalizeTags(options.tags);
|
|
140
|
+
if (normalizedTags && normalizedTags.length > 0) {
|
|
141
|
+
params.tag = normalizedTags;
|
|
142
|
+
}
|
|
143
|
+
if (options.page !== undefined) {
|
|
144
|
+
params.page = options.page;
|
|
145
|
+
}
|
|
146
|
+
if (options.pageSize !== undefined) {
|
|
147
|
+
params.page_size = options.pageSize;
|
|
148
|
+
}
|
|
149
|
+
return params;
|
|
150
|
+
}
|
|
151
|
+
async list(stateOrOptions, tags) {
|
|
152
|
+
let options;
|
|
153
|
+
if (typeof stateOrOptions === 'string') {
|
|
154
|
+
options = { state: stateOrOptions, tags };
|
|
155
|
+
}
|
|
156
|
+
else if (stateOrOptions) {
|
|
157
|
+
options = stateOrOptions;
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
options = tags ? { tags } : {};
|
|
161
|
+
}
|
|
162
|
+
return (await this.listPage(options)).jobs;
|
|
163
|
+
}
|
|
164
|
+
async listPage(options = {}) {
|
|
165
|
+
const data = await this.http.get('/api/jobs', this.buildListParams(options));
|
|
166
|
+
if (typeof data === 'object' && data && Array.isArray(data.jobs)) {
|
|
167
|
+
return jobListPageFromDict(data);
|
|
168
|
+
}
|
|
169
|
+
const jobs = (data || []).map(jobFromDict);
|
|
170
|
+
return {
|
|
171
|
+
jobs,
|
|
172
|
+
totalCount: jobs.length,
|
|
173
|
+
page: options.page ?? 1,
|
|
174
|
+
pageSize: options.pageSize ?? (jobs.length || 50),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get job details
|
|
179
|
+
*/
|
|
180
|
+
async get(jobId) {
|
|
181
|
+
const data = await this.http.get(`/api/jobs/${jobId}`);
|
|
182
|
+
return jobFromDict(data);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Create a new job
|
|
186
|
+
*/
|
|
187
|
+
async create(options) {
|
|
188
|
+
const { image, command, gpuType = 'l40s', gpuCount = 1, region, constraints, runtime, interruptible = true, env, ports, auth, registryAuth, tags, dockerfile, dryRun = false, } = options;
|
|
189
|
+
const payload = {
|
|
190
|
+
docker_image: image,
|
|
191
|
+
gpu_type: gpuType,
|
|
192
|
+
gpu_count: gpuCount,
|
|
193
|
+
interruptible,
|
|
194
|
+
command: command ? Buffer.from(command).toString('base64') : '',
|
|
195
|
+
};
|
|
196
|
+
if (region)
|
|
197
|
+
payload.region = region;
|
|
198
|
+
if (constraints)
|
|
199
|
+
payload.constraints = constraints;
|
|
200
|
+
if (runtime)
|
|
201
|
+
payload.runtime = runtime;
|
|
202
|
+
if (env)
|
|
203
|
+
payload.env_vars = env;
|
|
204
|
+
if (ports)
|
|
205
|
+
payload.ports = ports;
|
|
206
|
+
if (auth)
|
|
207
|
+
payload.auth = auth;
|
|
208
|
+
if (registryAuth)
|
|
209
|
+
payload.registry_auth = registryAuth;
|
|
210
|
+
const normalizedTags = normalizeTags(tags);
|
|
211
|
+
if (normalizedTags)
|
|
212
|
+
payload.tags = normalizedTags;
|
|
213
|
+
if (dockerfile)
|
|
214
|
+
payload.dockerfile = dockerfile;
|
|
215
|
+
if (dryRun)
|
|
216
|
+
payload.dry_run = true;
|
|
217
|
+
const data = await this.http.post('/api/jobs', payload);
|
|
218
|
+
return jobFromDict(data);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Cancel a job
|
|
222
|
+
*/
|
|
223
|
+
async cancel(jobId) {
|
|
224
|
+
return await this.http.delete(`/api/jobs/${jobId}`);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Extend job runtime
|
|
228
|
+
*/
|
|
229
|
+
async extend(jobId, runtime) {
|
|
230
|
+
const data = await this.http.patch(`/api/jobs/${jobId}`, { runtime });
|
|
231
|
+
return jobFromDict(data);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Get job logs
|
|
235
|
+
*/
|
|
236
|
+
async logs(jobId) {
|
|
237
|
+
const data = await this.http.get(`/api/jobs/${jobId}/logs`);
|
|
238
|
+
return data.logs || '';
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Get job GPU metrics
|
|
242
|
+
*/
|
|
243
|
+
async metrics(jobId) {
|
|
244
|
+
const data = await this.http.get(`/api/jobs/${jobId}/metrics`);
|
|
245
|
+
return jobMetricsFromDict(data);
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Get job auth token
|
|
249
|
+
*/
|
|
250
|
+
async token(jobId) {
|
|
251
|
+
const data = await this.http.get(`/api/jobs/${jobId}/token`);
|
|
252
|
+
return data.token || '';
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Execute a command non-interactively on a running job container.
|
|
256
|
+
*/
|
|
257
|
+
async exec(jobId, command, timeout = 30) {
|
|
258
|
+
const data = await this.http.post(`/api/jobs/${jobId}/exec`, {
|
|
259
|
+
command,
|
|
260
|
+
timeout,
|
|
261
|
+
});
|
|
262
|
+
return execResultFromDict(data);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Connect to a job shell via director WebSocket proxy.
|
|
266
|
+
*/
|
|
267
|
+
async shellConnect(jobId, shell = '/bin/bash') {
|
|
268
|
+
const job = await this.get(jobId);
|
|
269
|
+
const wsBase = this.http.baseUrl
|
|
270
|
+
.replace('https://', 'wss://')
|
|
271
|
+
.replace('http://', 'ws://')
|
|
272
|
+
.replace(/\/api$/, '');
|
|
273
|
+
const url = `${wsBase}/orchestra/ws/shell/${jobId}?token=${encodeURIComponent(job.jobKey)}&shell=${encodeURIComponent(shell)}`;
|
|
274
|
+
return await new Promise((resolve, reject) => {
|
|
275
|
+
const ws = new WebSocket(url);
|
|
276
|
+
const onError = (err) => reject(err);
|
|
277
|
+
ws.once('error', onError);
|
|
278
|
+
ws.once('open', () => {
|
|
279
|
+
ws.off('error', onError);
|
|
280
|
+
resolve(ws);
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// Utility functions for finding jobs
|
|
286
|
+
/**
|
|
287
|
+
* Check if string looks like a UUID (job ID)
|
|
288
|
+
*/
|
|
289
|
+
export function isUuid(s) {
|
|
290
|
+
return s.includes('-') && s.length > 30;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Find job by UUID via direct API call
|
|
294
|
+
*/
|
|
295
|
+
export async function findById(jobs, jobId) {
|
|
296
|
+
try {
|
|
297
|
+
return await jobs.get(jobId);
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
return null;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Find job by hostname (exact or prefix match)
|
|
305
|
+
*/
|
|
306
|
+
export function findByHostname(jobList, hostname) {
|
|
307
|
+
for (const job of jobList) {
|
|
308
|
+
if (job.hostname && (job.hostname === hostname || job.hostname.startsWith(hostname))) {
|
|
309
|
+
return job;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
return null;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Find job by IP address (extracted from hostname)
|
|
316
|
+
*/
|
|
317
|
+
export async function findByIp(jobList, ip) {
|
|
318
|
+
const dns = await import('dns').then(m => m.promises);
|
|
319
|
+
for (const job of jobList) {
|
|
320
|
+
if (!job.hostname)
|
|
321
|
+
continue;
|
|
322
|
+
try {
|
|
323
|
+
const addresses = await dns.resolve4(job.hostname);
|
|
324
|
+
if (addresses.includes(ip)) {
|
|
325
|
+
return job;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
catch {
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return null;
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Find a job by UUID, hostname, or IP address
|
|
336
|
+
*/
|
|
337
|
+
export async function findJob(jobs, identifier, state) {
|
|
338
|
+
// Try UUID first (direct API call)
|
|
339
|
+
if (isUuid(identifier)) {
|
|
340
|
+
return await findById(jobs, identifier);
|
|
341
|
+
}
|
|
342
|
+
// Get job list for hostname/IP search
|
|
343
|
+
const jobList = await jobs.list(state);
|
|
344
|
+
// Try hostname match
|
|
345
|
+
const byHostname = findByHostname(jobList, identifier);
|
|
346
|
+
if (byHostname) {
|
|
347
|
+
return byHostname;
|
|
348
|
+
}
|
|
349
|
+
// Try IP match (slower, requires DNS lookup)
|
|
350
|
+
return await findByIp(jobList, identifier);
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=jobs.js.map
|
package/dist/jobs.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"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"}
|
package/dist/keys.d.ts
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Keys management
|
|
3
|
+
*/
|
|
4
|
+
import type { HTTPClient } from './http.js';
|
|
5
|
+
export type ApiKeyBaselineValue = 'none' | 'self' | '*';
|
|
6
|
+
export interface ApiKeyBaselineFamily {
|
|
7
|
+
key: string;
|
|
8
|
+
label: string;
|
|
9
|
+
allowed: readonly ApiKeyBaselineValue[];
|
|
10
|
+
}
|
|
11
|
+
export declare const API_KEY_BASELINE_FAMILIES: readonly [{
|
|
12
|
+
readonly key: "api";
|
|
13
|
+
readonly label: "API Keys";
|
|
14
|
+
readonly allowed: readonly ["none", "self", "*"];
|
|
15
|
+
}, {
|
|
16
|
+
readonly key: "user";
|
|
17
|
+
readonly label: "Profile";
|
|
18
|
+
readonly allowed: readonly ["none", "self", "*"];
|
|
19
|
+
}, {
|
|
20
|
+
readonly key: "jobs";
|
|
21
|
+
readonly label: "Jobs";
|
|
22
|
+
readonly allowed: readonly ["none", "self", "*"];
|
|
23
|
+
}, {
|
|
24
|
+
readonly key: "renders";
|
|
25
|
+
readonly label: "Renders";
|
|
26
|
+
readonly allowed: readonly ["none", "self", "*"];
|
|
27
|
+
}, {
|
|
28
|
+
readonly key: "files";
|
|
29
|
+
readonly label: "Files";
|
|
30
|
+
readonly allowed: readonly ["none", "self", "*"];
|
|
31
|
+
}, {
|
|
32
|
+
readonly key: "agents";
|
|
33
|
+
readonly label: "Agents";
|
|
34
|
+
readonly allowed: readonly ["none", "self", "*"];
|
|
35
|
+
}, {
|
|
36
|
+
readonly key: "models";
|
|
37
|
+
readonly label: "Models";
|
|
38
|
+
readonly allowed: readonly ["none", "*"];
|
|
39
|
+
}, {
|
|
40
|
+
readonly key: "voice";
|
|
41
|
+
readonly label: "Voice";
|
|
42
|
+
readonly allowed: readonly ["none", "*"];
|
|
43
|
+
}, {
|
|
44
|
+
readonly key: "flow";
|
|
45
|
+
readonly label: "Flows";
|
|
46
|
+
readonly allowed: readonly ["none", "*"];
|
|
47
|
+
}];
|
|
48
|
+
export interface ApiKey {
|
|
49
|
+
keyId: string;
|
|
50
|
+
name: string;
|
|
51
|
+
tags: string[];
|
|
52
|
+
apiKey: string | null;
|
|
53
|
+
apiKeyPreview: string | null;
|
|
54
|
+
last4: string | null;
|
|
55
|
+
isActive: boolean;
|
|
56
|
+
createdAt: string;
|
|
57
|
+
lastUsedAt: string | null;
|
|
58
|
+
}
|
|
59
|
+
export declare class KeysAPI {
|
|
60
|
+
private http;
|
|
61
|
+
constructor(http: HTTPClient);
|
|
62
|
+
/**
|
|
63
|
+
* Create a new API key
|
|
64
|
+
*/
|
|
65
|
+
create(name?: string, tags?: string[]): Promise<ApiKey>;
|
|
66
|
+
/**
|
|
67
|
+
* List all API keys (masked)
|
|
68
|
+
*/
|
|
69
|
+
list(): Promise<ApiKey[]>;
|
|
70
|
+
/**
|
|
71
|
+
* Get a specific API key (masked)
|
|
72
|
+
*/
|
|
73
|
+
get(keyId: string): Promise<ApiKey>;
|
|
74
|
+
/**
|
|
75
|
+
* Deactivate an API key (irreversible)
|
|
76
|
+
*/
|
|
77
|
+
disable(keyId: string): Promise<any>;
|
|
78
|
+
/**
|
|
79
|
+
* Rename an API key
|
|
80
|
+
*/
|
|
81
|
+
rename(keyId: string, name: string): Promise<ApiKey>;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC;AAExD,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACzC;AAED,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUc,CAAC;AAErD,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAgBD,qBAAa,OAAO;IACN,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,UAAU;IAEpC;;OAEG;IACG,MAAM,CAAC,IAAI,GAAE,MAAkB,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IASxE;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAK/B;;OAEG;IACG,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKzC;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAI1C;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAI3D"}
|