@lumenkey/cli 0.2.0 → 0.2.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 +21 -3
- package/dist/cli/copied.d.ts +12 -0
- package/dist/cli/copied.d.ts.map +1 -1
- package/dist/cli/copied.js +143 -93
- package/dist/cli/copied.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +23 -27
- package/dist/cli/index.js.map +1 -1
- package/dist/core/atomic-config-file.d.ts +5 -0
- package/dist/core/atomic-config-file.d.ts.map +1 -0
- package/dist/core/atomic-config-file.js +54 -0
- package/dist/core/atomic-config-file.js.map +1 -0
- package/dist/core/client.d.ts +9 -1
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +32 -8
- package/dist/core/client.js.map +1 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +19 -4
- package/dist/core/config.js.map +1 -1
- package/dist/core/download.d.ts +3 -0
- package/dist/core/download.d.ts.map +1 -0
- package/dist/core/download.js +100 -0
- package/dist/core/download.js.map +1 -0
- package/dist/core/error-result.d.ts +14 -0
- package/dist/core/error-result.d.ts.map +1 -0
- package/dist/core/error-result.js +25 -0
- package/dist/core/error-result.js.map +1 -0
- package/dist/core/generation-result.d.ts +18 -0
- package/dist/core/generation-result.d.ts.map +1 -0
- package/dist/core/generation-result.js +22 -0
- package/dist/core/generation-result.js.map +1 -0
- package/dist/core/locale.d.ts +1 -0
- package/dist/core/locale.d.ts.map +1 -1
- package/dist/core/locale.js +41 -0
- package/dist/core/locale.js.map +1 -1
- package/dist/core/poller.d.ts +13 -4
- package/dist/core/poller.d.ts.map +1 -1
- package/dist/core/poller.js +46 -53
- package/dist/core/poller.js.map +1 -1
- package/dist/core/profiles.d.ts +5 -1
- package/dist/core/profiles.d.ts.map +1 -1
- package/dist/core/profiles.js +59 -12
- package/dist/core/profiles.js.map +1 -1
- package/dist/core/set-values.d.ts +3 -0
- package/dist/core/set-values.d.ts.map +1 -1
- package/dist/core/set-values.js +40 -14
- package/dist/core/set-values.js.map +1 -1
- package/dist/core/version.d.ts +2 -0
- package/dist/core/version.d.ts.map +1 -0
- package/dist/core/version.js +3 -0
- package/dist/core/version.js.map +1 -0
- package/dist/core/wait.d.ts +1 -0
- package/dist/core/wait.d.ts.map +1 -1
- package/dist/core/wait.js +2 -33
- package/dist/core/wait.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +96 -94
- package/dist/mcp/server.js.map +1 -1
- package/package.json +10 -2
package/dist/core/poller.js
CHANGED
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { pipeline } from 'node:stream/promises';
|
|
4
|
-
import { Readable } from 'node:stream';
|
|
5
|
-
import { Transform } from 'node:stream';
|
|
6
|
-
import crypto from 'node:crypto';
|
|
7
1
|
import { LumenKeyError, redactPublicDetail } from './client.js';
|
|
8
2
|
import { hasErrorSentence, waitTimeoutDetail } from './locale.js';
|
|
9
3
|
const TERMINAL_STATES = new Set(['succeeded', 'rejected', 'failed', 'cancelled', 'expired']);
|
|
@@ -29,74 +23,73 @@ export function assertJobResult(detail, requireOutput = false) {
|
|
|
29
23
|
}
|
|
30
24
|
}
|
|
31
25
|
export async function pollJob(client, jobId, options = {}) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
26
|
+
if (options.maxIntervalMs !== undefined && (!Number.isFinite(options.maxIntervalMs) || options.maxIntervalMs <= 0 || options.maxIntervalMs > 2_147_483_647))
|
|
27
|
+
throw new LumenKeyError('WAIT_OPTIONS_INVALID');
|
|
28
|
+
return runPolling(client, jobId, { intervalMs: options.initialIntervalMs, timeoutMs: options.timeoutMs, onProgress: options.onProgress, signal: options.signal });
|
|
29
|
+
}
|
|
30
|
+
export class WaitInterruptedError extends LumenKeyError {
|
|
31
|
+
jobId;
|
|
32
|
+
constructor(jobId) {
|
|
33
|
+
super('WAIT_INTERRUPTED');
|
|
34
|
+
this.jobId = jobId;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export async function runPolling(client, jobId, options = {}) {
|
|
38
|
+
const { intervalMs = 5000, timeoutMs = 1_800_000, signal, onProgress } = options;
|
|
39
|
+
if (!Number.isFinite(intervalMs) || intervalMs <= 0 || intervalMs > 2_147_483_647
|
|
40
|
+
|| !Number.isFinite(timeoutMs) || timeoutMs < 0 || timeoutMs > Number.MAX_SAFE_INTEGER - Date.now())
|
|
41
|
+
throw new LumenKeyError('WAIT_OPTIONS_INVALID');
|
|
42
|
+
const interrupted = () => new WaitInterruptedError(jobId);
|
|
43
|
+
const sleep = (ms) => new Promise((resolve, reject) => {
|
|
44
|
+
if (signal?.aborted) {
|
|
45
|
+
reject(interrupted());
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const abort = () => { clearTimeout(timer); reject(interrupted()); };
|
|
49
|
+
const timer = setTimeout(() => { signal?.removeEventListener('abort', abort); resolve(); }, ms);
|
|
50
|
+
signal?.addEventListener('abort', abort, { once: true });
|
|
51
|
+
});
|
|
52
|
+
let interval = intervalMs;
|
|
35
53
|
const startTime = Date.now();
|
|
54
|
+
let first = true;
|
|
36
55
|
while (true) {
|
|
37
|
-
if (
|
|
56
|
+
if (signal?.aborted)
|
|
57
|
+
throw interrupted();
|
|
58
|
+
if (!first && Date.now() - startTime >= timeoutMs) {
|
|
38
59
|
throw new LumenKeyError('WAIT_TIMEOUT', undefined, undefined, waitTimeoutDetail(jobId, timeoutMs));
|
|
39
60
|
}
|
|
61
|
+
first = false;
|
|
40
62
|
let detail;
|
|
41
63
|
try {
|
|
42
|
-
detail = await client.getJob(jobId);
|
|
64
|
+
detail = await client.getJob(jobId, { signal });
|
|
43
65
|
}
|
|
44
66
|
catch (error) {
|
|
67
|
+
if (signal?.aborted)
|
|
68
|
+
throw interrupted();
|
|
45
69
|
if (!(error instanceof LumenKeyError) || !(error.status === 429 || error.status === 502 || error.status === 503 || error.status === 504))
|
|
46
70
|
throw error;
|
|
47
71
|
const remaining = timeoutMs - (Date.now() - startTime);
|
|
48
72
|
if (remaining <= 0)
|
|
49
73
|
continue;
|
|
50
|
-
await
|
|
51
|
-
interval = Math.min(interval * 1.5,
|
|
74
|
+
await sleep(Math.min(remaining, Math.max(interval, error.retryAfterMs ?? 0)));
|
|
75
|
+
interval = Math.min(interval * 1.5, Math.max(intervalMs, 10_000));
|
|
52
76
|
continue;
|
|
53
77
|
}
|
|
54
78
|
if (onProgress) {
|
|
55
79
|
onProgress(detail);
|
|
56
80
|
}
|
|
57
|
-
|
|
81
|
+
if (signal?.aborted)
|
|
82
|
+
throw interrupted();
|
|
83
|
+
assertJobResult(detail, options.requireOutput && detail.status === 'succeeded');
|
|
58
84
|
if (TERMINAL_STATES.has(detail.status)) {
|
|
59
85
|
return detail; // succeeded
|
|
60
86
|
}
|
|
61
|
-
//
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Downloads a remote URL to an explicit local file path
|
|
68
|
-
*/
|
|
69
|
-
export async function downloadFile(url, outputPath, overwrite = false) {
|
|
70
|
-
const resolvedPath = path.resolve(outputPath);
|
|
71
|
-
if (fs.existsSync(resolvedPath) && !overwrite) {
|
|
72
|
-
throw new Error(`Output file already exists at ${resolvedPath}. Pass overwrite: true or specify a different filename.`);
|
|
73
|
-
}
|
|
74
|
-
const parentDir = path.dirname(resolvedPath);
|
|
75
|
-
if (!fs.existsSync(parentDir)) {
|
|
76
|
-
fs.mkdirSync(parentDir, { recursive: true });
|
|
77
|
-
}
|
|
78
|
-
const target = new URL(url);
|
|
79
|
-
if (target.username || target.password || !['https:', 'http:'].includes(target.protocol))
|
|
80
|
-
throw new LumenKeyError('DOWNLOAD_URL_INVALID');
|
|
81
|
-
const response = await fetch(url, { redirect: 'error', signal: AbortSignal.timeout(120000) });
|
|
82
|
-
if (!response.ok || !response.body) {
|
|
83
|
-
throw new Error(`DOWNLOAD_HTTP_ERROR_${response.status}`);
|
|
84
|
-
}
|
|
85
|
-
const temporary = `${resolvedPath}.${crypto.randomUUID()}.part`;
|
|
86
|
-
const limit = 128 * 1024 * 1024;
|
|
87
|
-
let bytes = 0;
|
|
88
|
-
try {
|
|
89
|
-
await pipeline(Readable.fromWeb(response.body), new Transform({ transform(chunk, _encoding, callback) { bytes += chunk.length; callback(bytes > limit ? new LumenKeyError('DOWNLOAD_TOO_LARGE') : null, chunk); } }), fs.createWriteStream(temporary, { flags: 'wx', mode: 0o600 }));
|
|
90
|
-
if (overwrite)
|
|
91
|
-
await fs.promises.rename(temporary, resolvedPath);
|
|
92
|
-
else {
|
|
93
|
-
await fs.promises.link(temporary, resolvedPath);
|
|
94
|
-
await fs.promises.unlink(temporary);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
finally {
|
|
98
|
-
await fs.promises.rm(temporary, { force: true });
|
|
87
|
+
// A user-selected interval is never reduced; only transient errors back off.
|
|
88
|
+
const remaining = timeoutMs - (Date.now() - startTime);
|
|
89
|
+
if (remaining <= 0)
|
|
90
|
+
continue;
|
|
91
|
+
await sleep(Math.min(remaining, intervalMs));
|
|
99
92
|
}
|
|
100
|
-
return resolvedPath;
|
|
101
93
|
}
|
|
94
|
+
export { downloadFile } from './download.js';
|
|
102
95
|
//# sourceMappingURL=poller.js.map
|
package/dist/core/poller.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poller.js","sourceRoot":"","sources":["../../src/core/poller.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"poller.js","sourceRoot":"","sources":["../../src/core/poller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAWlE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;AAE7F,MAAM,OAAO,eAAgB,SAAQ,aAAa;IAChD,YAAY,IAAY,EAAE,OAAiB;QACzC,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,CAAC,OAAO,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACvD,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,MAA2B,EAAE,aAAa,GAAG,KAAK;IAChF,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACnG,MAAM,KAAK,GAAG,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,sBAAsB,CAAC;QACxI,MAAM,IAAI,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,aAAa,IAAI,CAAC,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QACrG,MAAM,IAAI,eAAe,CAAC,oBAAoB,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAsB,EACtB,KAAa,EACb,UAAuB,EAAE;IAEzB,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,aAAa,IAAI,CAAC,IAAI,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC;QAAE,MAAM,IAAI,aAAa,CAAC,sBAAsB,CAAC,CAAC;IAC7M,OAAO,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,iBAAiB,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AACpK,CAAC;AAED,MAAM,OAAO,oBAAqB,SAAQ,aAAa;IACzB;IAA5B,YAA4B,KAAa;QAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAA3C,UAAK,GAAL,KAAK,CAAQ;IAA+B,CAAC;CAC1E;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAsB,EAAE,KAAa,EAAE,UAGpE,EAAE;IACJ,MAAM,EAAE,UAAU,GAAG,IAAI,EAAE,SAAS,GAAG,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAEjF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC,IAAI,UAAU,GAAG,aAAa;WAC5E,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE;QAAE,MAAM,IAAI,aAAa,CAAC,sBAAsB,CAAC,CAAC;IAEvJ,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,IAAI,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClE,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACvD,MAAM,KAAK,GAAG,GAAG,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChG,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IACH,IAAI,QAAQ,GAAG,UAAU,CAAC;IAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,KAAK,GAAG,IAAI,CAAC;IAEjB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,MAAM,EAAE,OAAO;YAAE,MAAM,WAAW,EAAE,CAAC;QACzC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,SAAS,EAAE,CAAC;YAClD,MAAM,IAAI,aAAa,CAAC,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;QACrG,CAAC;QACD,KAAK,GAAG,KAAK,CAAC;QAEd,IAAI,MAA2B,CAAC;QAChC,IAAI,CAAC;YAAC,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAAC,CAAC;QACxD,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,MAAM,EAAE,OAAO;gBAAE,MAAM,WAAW,EAAE,CAAC;YACzC,IAAI,CAAC,CAAC,KAAK,YAAY,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC;gBAAE,MAAM,KAAK,CAAC;YACtJ,MAAM,SAAS,GAAG,SAAS,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;YACvD,IAAI,SAAS,IAAI,CAAC;gBAAE,SAAS;YAC7B,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9E,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YAClE,SAAS;QACX,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;QAED,IAAI,MAAM,EAAE,OAAO;YAAE,MAAM,WAAW,EAAE,CAAC;QACzC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;QAChF,IAAI,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACvC,OAAO,MAAM,CAAC,CAAC,YAAY;QAC7B,CAAC;QAED,6EAA6E;QAC7E,MAAM,SAAS,GAAG,SAAS,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;QACvD,IAAI,SAAS,IAAI,CAAC;YAAE,SAAS;QAC7B,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/core/profiles.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
export declare class
|
|
1
|
+
export declare class ProfileError extends Error {
|
|
2
|
+
readonly code: 'PROFILE_INVALID' | 'PROFILE_UNREADABLE' | 'PROFILE_MISSING';
|
|
3
|
+
constructor(code: 'PROFILE_INVALID' | 'PROFILE_UNREADABLE' | 'PROFILE_MISSING', reason: string);
|
|
4
|
+
}
|
|
5
|
+
export declare class ProfileMissingError extends ProfileError {
|
|
2
6
|
constructor(name: string);
|
|
3
7
|
}
|
|
4
8
|
export interface ProfileRecord {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/core/profiles.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/core/profiles.ts"],"names":[],"mappings":"AAOA,qBAAa,YAAa,SAAQ,KAAK;IACzB,QAAQ,CAAC,IAAI,EAAE,iBAAiB,GAAG,oBAAoB,GAAG,iBAAiB;gBAAlE,IAAI,EAAE,iBAAiB,GAAG,oBAAoB,GAAG,iBAAiB,EAAE,MAAM,EAAE,MAAM;CAIxG;AAED,qBAAa,mBAAoB,SAAQ,YAAY;gBACvC,IAAI,EAAE,MAAM;CAGzB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA4DD,wBAAgB,cAAc,CAAC,IAAI,SAAe,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,aAAa,CAAA;CAAE,CAI7F;AAED,wBAAgB,YAAY,CAAC,IAAI,SAAe,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;CAAE,CAUhJ;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKxF;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,SAAe,EAAE,QAAQ,UAAO,GAAG,SAAS,GAAG,QAAQ,CAQtG;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,SAAe,GAAG,IAAI,CAMlE;AAED,wBAAgB,YAAY,CAAC,IAAI,SAAe,GAAG,IAAI,CAItD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,SAAe,GAAG,OAAO,CAQxE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,SAAe,GAAG,IAAI,CAMpG;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,SAAe,GAAG,MAAM,CAOnF"}
|
package/dist/core/profiles.js
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import os from 'node:os';
|
|
4
|
-
import { ui } from './locale.js';
|
|
4
|
+
import { errorSentence, ui } from './locale.js';
|
|
5
5
|
import { assertConfigDirReadable } from './config-dir.js';
|
|
6
|
-
|
|
6
|
+
import { assertSafeConfigFile, writeAtomicConfigFile } from './atomic-config-file.js';
|
|
7
|
+
export class ProfileError extends Error {
|
|
8
|
+
code;
|
|
9
|
+
constructor(code, reason) {
|
|
10
|
+
super(`${errorSentence(code)} (${code}) ${reason}`);
|
|
11
|
+
this.code = code;
|
|
12
|
+
this.name = 'LumenKeyError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export class ProfileMissingError extends ProfileError {
|
|
7
16
|
constructor(name) {
|
|
8
|
-
super(ui(`Profile ${name} does not exist.`, `档案 ${name} 不存在。`));
|
|
9
|
-
this.name = 'ProfileMissingError';
|
|
17
|
+
super('PROFILE_MISSING', ui(`Profile ${name} does not exist.`, `档案 ${name} 不存在。`));
|
|
10
18
|
}
|
|
11
19
|
}
|
|
12
20
|
function filePath(home = os.homedir()) {
|
|
@@ -15,20 +23,55 @@ function filePath(home = os.homedir()) {
|
|
|
15
23
|
function read(home = os.homedir()) {
|
|
16
24
|
const target = filePath(home);
|
|
17
25
|
assertConfigDirReadable(target);
|
|
18
|
-
if (!fs.existsSync(target))
|
|
19
|
-
return { profiles: {} };
|
|
20
26
|
try {
|
|
27
|
+
assertSafeConfigFile(target);
|
|
28
|
+
if (!fs.existsSync(target))
|
|
29
|
+
return { profiles: Object.create(null) };
|
|
21
30
|
const parsed = JSON.parse(fs.readFileSync(target, 'utf8'));
|
|
22
|
-
return
|
|
31
|
+
return validate(parsed);
|
|
23
32
|
}
|
|
24
|
-
catch {
|
|
25
|
-
|
|
33
|
+
catch (error) {
|
|
34
|
+
if (error instanceof ProfileError)
|
|
35
|
+
throw error;
|
|
36
|
+
throw new ProfileError(error instanceof SyntaxError ? 'PROFILE_INVALID' : 'PROFILE_UNREADABLE', target);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function object(value) {
|
|
40
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
41
|
+
}
|
|
42
|
+
function validName(name) {
|
|
43
|
+
if (!name.trim() || Object.prototype.hasOwnProperty.call(Object.prototype, name)) {
|
|
44
|
+
throw new ProfileError('PROFILE_INVALID', ui('Invalid profile name.', '档案名称无效。'));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function validate(value) {
|
|
48
|
+
if (!object(value) || !object(value.profiles) || (value.current !== undefined && typeof value.current !== 'string')) {
|
|
49
|
+
throw new ProfileError('PROFILE_INVALID', ui('profiles.json must contain a profiles object.', 'profiles.json 必须包含 profiles 对象。'));
|
|
50
|
+
}
|
|
51
|
+
const profiles = Object.create(null);
|
|
52
|
+
for (const [name, record] of Object.entries(value.profiles)) {
|
|
53
|
+
validName(name);
|
|
54
|
+
if (!object(record) || ['key', 'host', 'projectId'].some(key => record[key] !== undefined && typeof record[key] !== 'string')) {
|
|
55
|
+
throw new ProfileError('PROFILE_INVALID', ui('Profile records must be objects with string fields.', '档案记录必须是包含字符串字段的对象。'));
|
|
56
|
+
}
|
|
57
|
+
profiles[name] = Object.fromEntries(['key', 'host', 'projectId'].filter(key => record[key] !== undefined).map(key => [key, record[key]]));
|
|
26
58
|
}
|
|
59
|
+
if (value.current !== undefined) {
|
|
60
|
+
validName(value.current);
|
|
61
|
+
if (!Object.hasOwn(profiles, value.current))
|
|
62
|
+
throw new ProfileMissingError(value.current);
|
|
63
|
+
}
|
|
64
|
+
return { current: value.current, profiles };
|
|
27
65
|
}
|
|
28
66
|
function write(data, home = os.homedir()) {
|
|
29
67
|
const target = filePath(home);
|
|
30
|
-
|
|
31
|
-
|
|
68
|
+
validate(data);
|
|
69
|
+
try {
|
|
70
|
+
writeAtomicConfigFile(target, data);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
throw new ProfileError('PROFILE_UNREADABLE', target);
|
|
74
|
+
}
|
|
32
75
|
}
|
|
33
76
|
export function currentProfile(home = os.homedir()) {
|
|
34
77
|
const data = read(home);
|
|
@@ -55,6 +98,7 @@ export function publicProfile(record) {
|
|
|
55
98
|
return copy;
|
|
56
99
|
}
|
|
57
100
|
export function createProfile(name, home = os.homedir(), activate = true) {
|
|
101
|
+
validName(name);
|
|
58
102
|
const data = read(home);
|
|
59
103
|
if (data.profiles[name])
|
|
60
104
|
return 'exists';
|
|
@@ -65,6 +109,7 @@ export function createProfile(name, home = os.homedir(), activate = true) {
|
|
|
65
109
|
return 'created';
|
|
66
110
|
}
|
|
67
111
|
export function setProfile(name, home = os.homedir()) {
|
|
112
|
+
validName(name);
|
|
68
113
|
const data = read(home);
|
|
69
114
|
if (!data.profiles[name])
|
|
70
115
|
throw new ProfileMissingError(name);
|
|
@@ -77,6 +122,7 @@ export function unsetProfile(home = os.homedir()) {
|
|
|
77
122
|
write(data, home);
|
|
78
123
|
}
|
|
79
124
|
export function deleteProfile(name, home = os.homedir()) {
|
|
125
|
+
validName(name);
|
|
80
126
|
const data = read(home);
|
|
81
127
|
if (!data.profiles[name])
|
|
82
128
|
return false;
|
|
@@ -87,6 +133,7 @@ export function deleteProfile(name, home = os.homedir()) {
|
|
|
87
133
|
return true;
|
|
88
134
|
}
|
|
89
135
|
export function setNamedProfileFields(name, fields, home = os.homedir()) {
|
|
136
|
+
validName(name);
|
|
90
137
|
const data = read(home);
|
|
91
138
|
if (!data.profiles[name])
|
|
92
139
|
throw new ProfileMissingError(name);
|
|
@@ -97,7 +144,7 @@ export function setProfileFields(fields, home = os.homedir()) {
|
|
|
97
144
|
const data = read(home);
|
|
98
145
|
const name = data.current;
|
|
99
146
|
if (!name || !data.profiles[name])
|
|
100
|
-
throw new
|
|
147
|
+
throw new ProfileMissingError(name ?? '');
|
|
101
148
|
data.profiles[name] = { ...data.profiles[name], ...fields };
|
|
102
149
|
write(data, home);
|
|
103
150
|
return name;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/core/profiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/core/profiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
/** Pixmax `_parse_value` plus fal's first `=` / `:=` split and `[index]` / `[]` paths. */
|
|
2
|
+
import { LumenKeyError } from './client.js';
|
|
3
|
+
/** Identify a parameter without echoing its value, a whole pair, or a payload. */
|
|
4
|
+
export declare function modelParameterError(code: 'MODEL_PARAM_INVALID' | 'MODEL_PARAM_UNKNOWN', key: string): LumenKeyError;
|
|
2
5
|
export declare function parseValue(value: string): unknown;
|
|
3
6
|
type PathStep = {
|
|
4
7
|
kind: 'key';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-values.d.ts","sourceRoot":"","sources":["../../src/core/set-values.ts"],"names":[],"mappings":"AAAA,0FAA0F;
|
|
1
|
+
{"version":3,"file":"set-values.d.ts","sourceRoot":"","sources":["../../src/core/set-values.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,kFAAkF;AAClF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,qBAAqB,GAAG,qBAAqB,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,CAanH;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAUjD;AAED,KAAK,QAAQ,GACT;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAIvB,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAQpE;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,EAAE,CAmCjD;AA0CD,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAK7F;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAOzG;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAS5G;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAGhD"}
|
package/dist/core/set-values.js
CHANGED
|
@@ -1,4 +1,21 @@
|
|
|
1
1
|
/** Pixmax `_parse_value` plus fal's first `=` / `:=` split and `[index]` / `[]` paths. */
|
|
2
|
+
import { LumenKeyError } from './client.js';
|
|
3
|
+
import { ui } from './locale.js';
|
|
4
|
+
/** Identify a parameter without echoing its value, a whole pair, or a payload. */
|
|
5
|
+
export function modelParameterError(code, key) {
|
|
6
|
+
if (!/^[a-zA-Z][a-zA-Z0-9_]{0,63}$/.test(key)) {
|
|
7
|
+
return new LumenKeyError(code, undefined, undefined, code === 'MODEL_PARAM_UNKNOWN'
|
|
8
|
+
? ui('This model does not support the supplied parameter.', '该模型不支持所提供的参数。')
|
|
9
|
+
: ui('The supplied parameter is invalid. Check lumenkey model explain.', '所提供的参数值无效。请运行 lumenkey model explain 查看允许的参数。'));
|
|
10
|
+
}
|
|
11
|
+
const label = key === 'aspect_ratio' || key === 'ratio'
|
|
12
|
+
? ui('aspect ratio', '宽高比')
|
|
13
|
+
: key;
|
|
14
|
+
const detail = code === 'MODEL_PARAM_UNKNOWN'
|
|
15
|
+
? ui(`This model has no ${label} parameter.`, `该模型不支持 ${label} 参数。`)
|
|
16
|
+
: ui(`Invalid value for ${label}. Check this model's allowed parameters with lumenkey model explain.`, `${label} 参数值无效。请运行 lumenkey model explain 查看该模型允许的参数。`);
|
|
17
|
+
return new LumenKeyError(code, undefined, undefined, detail);
|
|
18
|
+
}
|
|
2
19
|
export function parseValue(value) {
|
|
3
20
|
const text = value.trim();
|
|
4
21
|
if (text.toLowerCase() === 'true')
|
|
@@ -14,11 +31,12 @@ export function parseValue(value) {
|
|
|
14
31
|
return value;
|
|
15
32
|
}
|
|
16
33
|
}
|
|
34
|
+
const MAX_ARRAY_ITEMS = 10_000;
|
|
17
35
|
export function splitPair(pair) {
|
|
18
36
|
const equalsAt = pair.indexOf('=');
|
|
19
37
|
const colonAt = pair.indexOf(':=');
|
|
20
38
|
if (equalsAt < 0 && colonAt < 0)
|
|
21
|
-
throw new
|
|
39
|
+
throw new LumenKeyError('MODEL_PARAM_SYNTAX_INVALID');
|
|
22
40
|
if (colonAt >= 0 && (equalsAt < 0 || colonAt < equalsAt)) {
|
|
23
41
|
return { key: pair.slice(0, colonAt), raw: pair.slice(colonAt + 2) };
|
|
24
42
|
}
|
|
@@ -29,9 +47,9 @@ export function parsePath(key) {
|
|
|
29
47
|
let i = 0;
|
|
30
48
|
const pushKey = (name) => {
|
|
31
49
|
if (!name)
|
|
32
|
-
throw new
|
|
50
|
+
throw new LumenKeyError('MODEL_PARAM_SYNTAX_INVALID');
|
|
33
51
|
if (name === '__proto__' || name === 'constructor' || name === 'prototype')
|
|
34
|
-
throw new
|
|
52
|
+
throw new LumenKeyError('MODEL_PARAM_SYNTAX_INVALID', undefined, undefined, ui('Unsafe key in key=value option.', 'key=value 参数不能使用不安全的字段名。'));
|
|
35
53
|
steps.push({ kind: 'key', name });
|
|
36
54
|
};
|
|
37
55
|
while (i < key.length) {
|
|
@@ -42,12 +60,16 @@ export function parsePath(key) {
|
|
|
42
60
|
if (key[i] === '[') {
|
|
43
61
|
const end = key.indexOf(']', i);
|
|
44
62
|
if (end < 0)
|
|
45
|
-
throw new
|
|
63
|
+
throw new LumenKeyError('MODEL_PARAM_SYNTAX_INVALID');
|
|
46
64
|
const inside = key.slice(i + 1, end);
|
|
47
65
|
if (inside === '')
|
|
48
66
|
steps.push({ kind: 'append' });
|
|
49
|
-
else if (/^\d+$/.test(inside))
|
|
50
|
-
|
|
67
|
+
else if (/^\d+$/.test(inside)) {
|
|
68
|
+
const index = Number(inside);
|
|
69
|
+
if (!Number.isSafeInteger(index) || index >= MAX_ARRAY_ITEMS)
|
|
70
|
+
throw new LumenKeyError('MODEL_PARAM_SYNTAX_INVALID');
|
|
71
|
+
steps.push({ kind: 'index', index });
|
|
72
|
+
}
|
|
51
73
|
else
|
|
52
74
|
pushKey(inside);
|
|
53
75
|
i = end + 1;
|
|
@@ -59,7 +81,7 @@ export function parsePath(key) {
|
|
|
59
81
|
i += name.length;
|
|
60
82
|
}
|
|
61
83
|
if (steps.length === 0)
|
|
62
|
-
throw new
|
|
84
|
+
throw new LumenKeyError('MODEL_PARAM_SYNTAX_INVALID');
|
|
63
85
|
return steps;
|
|
64
86
|
}
|
|
65
87
|
function containerFor(step) {
|
|
@@ -68,18 +90,20 @@ function containerFor(step) {
|
|
|
68
90
|
function writeAt(cursor, step, value) {
|
|
69
91
|
if (step.kind === 'key') {
|
|
70
92
|
if (cursor === null || typeof cursor !== 'object' || Array.isArray(cursor))
|
|
71
|
-
throw new
|
|
93
|
+
throw new LumenKeyError('MODEL_PARAM_SYNTAX_INVALID');
|
|
72
94
|
cursor[step.name] = value;
|
|
73
95
|
return;
|
|
74
96
|
}
|
|
75
97
|
if (!Array.isArray(cursor))
|
|
76
|
-
throw new
|
|
98
|
+
throw new LumenKeyError('MODEL_PARAM_SYNTAX_INVALID');
|
|
77
99
|
if (step.kind === 'append') {
|
|
100
|
+
if (cursor.length >= MAX_ARRAY_ITEMS)
|
|
101
|
+
throw new LumenKeyError('MODEL_PARAM_SYNTAX_INVALID');
|
|
78
102
|
cursor.push(value);
|
|
79
103
|
return;
|
|
80
104
|
}
|
|
81
105
|
if (step.index < 0)
|
|
82
|
-
throw new
|
|
106
|
+
throw new LumenKeyError('MODEL_PARAM_SYNTAX_INVALID');
|
|
83
107
|
while (cursor.length <= step.index)
|
|
84
108
|
cursor.push(null);
|
|
85
109
|
cursor[step.index] = value;
|
|
@@ -87,20 +111,22 @@ function writeAt(cursor, step, value) {
|
|
|
87
111
|
function descend(cursor, step, next) {
|
|
88
112
|
if (step.kind === 'key') {
|
|
89
113
|
if (cursor === null || typeof cursor !== 'object' || Array.isArray(cursor))
|
|
90
|
-
throw new
|
|
114
|
+
throw new LumenKeyError('MODEL_PARAM_SYNTAX_INVALID');
|
|
91
115
|
const record = cursor;
|
|
92
116
|
if (record[step.name] == null || typeof record[step.name] !== 'object')
|
|
93
117
|
record[step.name] = containerFor(next);
|
|
94
118
|
return record[step.name];
|
|
95
119
|
}
|
|
96
120
|
if (!Array.isArray(cursor))
|
|
97
|
-
throw new
|
|
121
|
+
throw new LumenKeyError('MODEL_PARAM_SYNTAX_INVALID');
|
|
98
122
|
if (step.kind === 'append') {
|
|
123
|
+
if (cursor.length >= MAX_ARRAY_ITEMS)
|
|
124
|
+
throw new LumenKeyError('MODEL_PARAM_SYNTAX_INVALID');
|
|
99
125
|
cursor.push(containerFor(next));
|
|
100
126
|
return cursor[cursor.length - 1];
|
|
101
127
|
}
|
|
102
128
|
if (step.index < 0)
|
|
103
|
-
throw new
|
|
129
|
+
throw new LumenKeyError('MODEL_PARAM_SYNTAX_INVALID');
|
|
104
130
|
while (cursor.length <= step.index)
|
|
105
131
|
cursor.push(null);
|
|
106
132
|
if (cursor[step.index] == null || typeof cursor[step.index] !== 'object')
|
|
@@ -129,7 +155,7 @@ export function validateKnownEnums(properties, input) {
|
|
|
129
155
|
continue;
|
|
130
156
|
const options = spec.enum;
|
|
131
157
|
if (Array.isArray(options) && options.length > 0 && !options.includes(value)) {
|
|
132
|
-
throw
|
|
158
|
+
throw modelParameterError('MODEL_PARAM_INVALID', key);
|
|
133
159
|
}
|
|
134
160
|
}
|
|
135
161
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-values.js","sourceRoot":"","sources":["../../src/core/set-values.ts"],"names":[],"mappings":"AAAA,0FAA0F;
|
|
1
|
+
{"version":3,"file":"set-values.js","sourceRoot":"","sources":["../../src/core/set-values.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/core/version.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,EAAE,MAAoG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/core/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,CAAC,MAAM,cAAc,GAAW,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC"}
|
package/dist/core/wait.d.ts
CHANGED
|
@@ -3,5 +3,6 @@ import type { GenerationJobDetail } from './types.js';
|
|
|
3
3
|
export declare function waitForJob(client: LumenKeyClient, jobId: string, options?: {
|
|
4
4
|
intervalMs?: number;
|
|
5
5
|
timeoutMs?: number;
|
|
6
|
+
signal?: AbortSignal;
|
|
6
7
|
}): Promise<GenerationJobDetail>;
|
|
7
8
|
//# sourceMappingURL=wait.d.ts.map
|
package/dist/core/wait.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../src/core/wait.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../src/core/wait.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD,wBAAsB,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EACpE,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GAC9E,OAAO,CAAC,mBAAmB,CAAC,CAE9B"}
|
package/dist/core/wait.js
CHANGED
|
@@ -1,36 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { assertJobResult } from './poller.js';
|
|
3
|
-
const TERMINAL = new Set(['succeeded', 'failed', 'rejected', 'cancelled', 'expired']);
|
|
4
|
-
const MAX_TIMER_MS = 2_147_483_647;
|
|
1
|
+
import { runPolling } from './poller.js';
|
|
5
2
|
export async function waitForJob(client, jobId, options = {}) {
|
|
6
|
-
|
|
7
|
-
const timeoutMs = options.timeoutMs ?? 1_800_000;
|
|
8
|
-
if (!Number.isFinite(intervalMs) || intervalMs < 0 || intervalMs > MAX_TIMER_MS || !Number.isFinite(timeoutMs) || timeoutMs < 0)
|
|
9
|
-
throw new LumenKeyError('WAIT_OPTIONS_INVALID');
|
|
10
|
-
const deadline = Date.now() + timeoutMs;
|
|
11
|
-
let delay = intervalMs;
|
|
12
|
-
for (;;) {
|
|
13
|
-
let detail;
|
|
14
|
-
try {
|
|
15
|
-
detail = await client.getJob(jobId);
|
|
16
|
-
}
|
|
17
|
-
catch (error) {
|
|
18
|
-
if (!(error instanceof LumenKeyError) || !(error.status === 429 || error.status === 502 || error.status === 503 || error.status === 504))
|
|
19
|
-
throw error;
|
|
20
|
-
const remaining = deadline - Date.now();
|
|
21
|
-
if (remaining <= 0)
|
|
22
|
-
throw error;
|
|
23
|
-
await new Promise((resolve) => setTimeout(resolve, Math.min(remaining, Math.max(delay, error.retryAfterMs ?? 0))));
|
|
24
|
-
delay = Math.min(delay * 1.5, Math.max(intervalMs, 10_000));
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
if (TERMINAL.has(detail.status)) {
|
|
28
|
-
assertJobResult(detail, detail.status === 'succeeded');
|
|
29
|
-
return detail;
|
|
30
|
-
}
|
|
31
|
-
if (Date.now() >= deadline)
|
|
32
|
-
throw new LumenKeyError('WAIT_TIMEOUT');
|
|
33
|
-
await new Promise((resolve) => setTimeout(resolve, Math.max(0, intervalMs)));
|
|
34
|
-
}
|
|
3
|
+
return runPolling(client, jobId, { ...options, requireOutput: true });
|
|
35
4
|
}
|
|
36
5
|
//# sourceMappingURL=wait.js.map
|
package/dist/core/wait.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait.js","sourceRoot":"","sources":["../../src/core/wait.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"wait.js","sourceRoot":"","sources":["../../src/core/wait.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAsB,EAAE,KAAa,EACpE,UAA6E,EAAE;IAE/E,OAAO,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;AACxE,CAAC"}
|
package/dist/mcp/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAyDpE,wBAAgB,eAAe,IAAI,SAAS,CA+W3C;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAKjD"}
|