@lumenkey/cli 0.2.3 → 0.3.0
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 +28 -7
- package/dist/cli/copied.d.ts +19 -36
- package/dist/cli/copied.d.ts.map +1 -1
- package/dist/cli/copied.js +159 -283
- package/dist/cli/copied.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +86 -136
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/render.d.ts +11 -0
- package/dist/cli/render.d.ts.map +1 -0
- package/dist/cli/render.js +35 -0
- package/dist/cli/render.js.map +1 -0
- package/dist/core/atomic-config-file.d.ts +21 -2
- package/dist/core/atomic-config-file.d.ts.map +1 -1
- package/dist/core/atomic-config-file.js +66 -10
- package/dist/core/atomic-config-file.js.map +1 -1
- package/dist/core/chat.d.ts +13 -0
- package/dist/core/chat.d.ts.map +1 -0
- package/dist/core/chat.js +31 -0
- package/dist/core/chat.js.map +1 -0
- package/dist/core/client.d.ts +19 -1
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +50 -11
- package/dist/core/client.js.map +1 -1
- package/dist/core/config-dir.d.ts.map +1 -1
- package/dist/core/config-dir.js +3 -4
- package/dist/core/config-dir.js.map +1 -1
- package/dist/core/config-error.d.ts +14 -0
- package/dist/core/config-error.d.ts.map +1 -0
- package/dist/core/config-error.js +20 -0
- package/dist/core/config-error.js.map +1 -0
- package/dist/core/config.d.ts +1 -5
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +8 -39
- package/dist/core/config.js.map +1 -1
- package/dist/core/credit-cap.d.ts +5 -0
- package/dist/core/credit-cap.d.ts.map +1 -0
- package/dist/core/credit-cap.js +15 -0
- package/dist/core/credit-cap.js.map +1 -0
- package/dist/core/download.d.ts.map +1 -1
- package/dist/core/download.js +105 -16
- package/dist/core/download.js.map +1 -1
- package/dist/core/error-result.d.ts +4 -13
- package/dist/core/error-result.d.ts.map +1 -1
- package/dist/core/error-result.js +4 -24
- package/dist/core/error-result.js.map +1 -1
- package/dist/core/generation-input.d.ts +33 -0
- package/dist/core/generation-input.d.ts.map +1 -0
- package/dist/core/generation-input.js +145 -0
- package/dist/core/generation-input.js.map +1 -0
- package/dist/core/generation-result.d.ts +17 -14
- package/dist/core/generation-result.d.ts.map +1 -1
- package/dist/core/generation-result.js +3 -4
- package/dist/core/generation-result.js.map +1 -1
- package/dist/core/generation.d.ts +124 -0
- package/dist/core/generation.d.ts.map +1 -0
- package/dist/core/generation.js +316 -0
- package/dist/core/generation.js.map +1 -0
- package/dist/core/locale.d.ts +19 -0
- package/dist/core/locale.d.ts.map +1 -1
- package/dist/core/locale.js +69 -4
- package/dist/core/locale.js.map +1 -1
- package/dist/core/outcome.d.ts +128 -0
- package/dist/core/outcome.d.ts.map +1 -0
- package/dist/core/outcome.js +101 -0
- package/dist/core/outcome.js.map +1 -0
- package/dist/core/output-path.d.ts +10 -0
- package/dist/core/output-path.d.ts.map +1 -0
- package/dist/core/output-path.js +15 -0
- package/dist/core/output-path.js.map +1 -0
- package/dist/core/params.d.ts +68 -0
- package/dist/core/params.d.ts.map +1 -0
- package/dist/core/params.js +227 -0
- package/dist/core/params.js.map +1 -0
- package/dist/core/poller.d.ts +6 -1
- package/dist/core/poller.d.ts.map +1 -1
- package/dist/core/poller.js +17 -8
- package/dist/core/poller.js.map +1 -1
- package/dist/core/profiles.d.ts +4 -2
- package/dist/core/profiles.d.ts.map +1 -1
- package/dist/core/profiles.js +20 -9
- package/dist/core/profiles.js.map +1 -1
- package/dist/core/submission-journal.d.ts +106 -0
- package/dist/core/submission-journal.d.ts.map +1 -0
- package/dist/core/submission-journal.js +329 -0
- package/dist/core/submission-journal.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/render.d.ts +11 -0
- package/dist/mcp/render.d.ts.map +1 -0
- package/dist/mcp/render.js +17 -0
- package/dist/mcp/render.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +95 -337
- package/dist/mcp/server.js.map +1 -1
- package/package.json +2 -1
package/dist/core/config.js
CHANGED
|
@@ -4,9 +4,11 @@ import os from 'node:os';
|
|
|
4
4
|
import crypto from 'node:crypto';
|
|
5
5
|
import { currentProfile } from './profiles.js';
|
|
6
6
|
import { normalizeGatewayOrigin } from './origin.js';
|
|
7
|
-
import {
|
|
7
|
+
import { ui } from './locale.js';
|
|
8
8
|
import { assertConfigDirReadable } from './config-dir.js';
|
|
9
|
-
import { assertSafeConfigFile,
|
|
9
|
+
import { assertSafeConfigFile, classifyConfigFailure, writeAtomicConfigFile } from './atomic-config-file.js';
|
|
10
|
+
import { ConfigError } from './config-error.js';
|
|
11
|
+
export { ConfigError } from './config-error.js';
|
|
10
12
|
// Official live gateway default: 华语站默认 https://123outlets.com
|
|
11
13
|
const DEFAULT_BASE_URL = 'https://123outlets.com';
|
|
12
14
|
// Must cover the gateway's 180s FunCloud first-token open. A shorter client
|
|
@@ -18,25 +20,9 @@ function getConfigDir() {
|
|
|
18
20
|
function getConfigPath() {
|
|
19
21
|
return path.join(getConfigDir(), 'config.json');
|
|
20
22
|
}
|
|
21
|
-
export class ConfigError extends Error {
|
|
22
|
-
code;
|
|
23
|
-
configPath;
|
|
24
|
-
constructor(code, configPath, reason) {
|
|
25
|
-
super(`${errorSentence(code)} (${code}) ${configPath}: ${reason}`);
|
|
26
|
-
this.code = code;
|
|
27
|
-
this.configPath = configPath;
|
|
28
|
-
this.name = 'LumenKeyError';
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
23
|
function configFailure(error, configPath) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
const sys = error;
|
|
36
|
-
if (sys?.code === 'EACCES' || sys?.code === 'EPERM' || sys?.code === 'ENOTDIR' || sys?.code === 'EISDIR') {
|
|
37
|
-
return new ConfigError('CONFIG_UNREADABLE', configPath, ui('The directory is not writable; config.json must be a file.', '目录不可写;config.json 必须是文件。'));
|
|
38
|
-
}
|
|
39
|
-
return new ConfigError('CONFIG_INVALID', configPath, ui('The config file could not be read.', '配置文件无法读取。'));
|
|
24
|
+
const { code, reason } = classifyConfigFailure(error);
|
|
25
|
+
return new ConfigError(code, configPath, reason);
|
|
40
26
|
}
|
|
41
27
|
function nonemptyTrim(value) {
|
|
42
28
|
if (typeof value !== 'string')
|
|
@@ -52,18 +38,9 @@ function readStoredConfig(configPath) {
|
|
|
52
38
|
catch (error) {
|
|
53
39
|
throw configFailure(error, configPath);
|
|
54
40
|
}
|
|
41
|
+
// assertSafeConfigFile has already refused links and non-regular files; only absence remains to check.
|
|
55
42
|
if (!fs.existsSync(configPath))
|
|
56
43
|
return {};
|
|
57
|
-
let stat;
|
|
58
|
-
try {
|
|
59
|
-
stat = fs.statSync(configPath);
|
|
60
|
-
}
|
|
61
|
-
catch (error) {
|
|
62
|
-
throw configFailure(error, configPath);
|
|
63
|
-
}
|
|
64
|
-
if (!stat.isFile()) {
|
|
65
|
-
throw new ConfigError('CONFIG_INVALID', configPath, ui('config.json must be a file.', 'config.json 必须是文件。'));
|
|
66
|
-
}
|
|
67
44
|
let text;
|
|
68
45
|
try {
|
|
69
46
|
text = fs.readFileSync(configPath, 'utf8');
|
|
@@ -134,15 +111,7 @@ export function loadConfig() {
|
|
|
134
111
|
};
|
|
135
112
|
}
|
|
136
113
|
export function saveConfig(updates) {
|
|
137
|
-
|
|
138
|
-
try {
|
|
139
|
-
if (!fs.existsSync(configDir)) {
|
|
140
|
-
fs.mkdirSync(configDir, { recursive: true });
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
catch (error) {
|
|
144
|
-
throw configFailure(error, configDir);
|
|
145
|
-
}
|
|
114
|
+
// The directory is created 0700 (or tightened) by writeAtomicConfigFile, the one path shared with profiles and the journal.
|
|
146
115
|
const current = readStoredConfig(getConfigPath());
|
|
147
116
|
const nextConfig = {
|
|
148
117
|
apiKey: updates.apiKey !== undefined ? updates.apiKey : current.apiKey,
|
package/dist/core/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { LumenKeyError } from './client.js';
|
|
2
|
+
/** One spending-cap parser for every surface: non-negative safe integer, no sign, exponent or fraction. */
|
|
3
|
+
export declare function parseCreditCap(value: unknown, label?: string, code?: string): number | undefined;
|
|
4
|
+
export declare function quoteCreditLimitError(label?: string): LumenKeyError;
|
|
5
|
+
//# sourceMappingURL=credit-cap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credit-cap.d.ts","sourceRoot":"","sources":["../../src/core/credit-cap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,2GAA2G;AAC3G,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,SAAkB,EAAE,IAAI,SAAyB,GAAG,MAAM,GAAG,SAAS,CAMzH;AAED,wBAAgB,qBAAqB,CAAC,KAAK,SAAkB,GAAG,aAAa,CAE5E"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { LumenKeyError } from './client.js';
|
|
2
|
+
import { quoteCapSentence, spendingCapSentence } from './locale.js';
|
|
3
|
+
/** One spending-cap parser for every surface: non-negative safe integer, no sign, exponent or fraction. */
|
|
4
|
+
export function parseCreditCap(value, label = '--max-credits', code = 'CREDIT_LIMIT_INVALID') {
|
|
5
|
+
if (value === undefined)
|
|
6
|
+
return undefined;
|
|
7
|
+
if ((typeof value !== 'string' && typeof value !== 'number') || !/^\d+$/.test(String(value)) || !Number.isSafeInteger(Number(value))) {
|
|
8
|
+
throw new LumenKeyError(code, undefined, undefined, spendingCapSentence(label));
|
|
9
|
+
}
|
|
10
|
+
return Number(value);
|
|
11
|
+
}
|
|
12
|
+
export function quoteCreditLimitError(label = '--max-credits') {
|
|
13
|
+
return new LumenKeyError('QUOTE_CREDIT_LIMIT', undefined, undefined, quoteCapSentence(label));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=credit-cap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credit-cap.js","sourceRoot":"","sources":["../../src/core/credit-cap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEpE,2GAA2G;AAC3G,MAAM,UAAU,cAAc,CAAC,KAAc,EAAE,KAAK,GAAG,eAAe,EAAE,IAAI,GAAG,sBAAsB;IACnG,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACrI,MAAM,IAAI,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAK,GAAG,eAAe;IAC3D,OAAO,IAAI,aAAa,CAAC,oBAAoB,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;AAChG,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/core/download.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/core/download.ts"],"names":[],"mappings":"AAyEA,oFAAoF;AACpF,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,UAAQ,EAAE,YAAY,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAuElI"}
|
package/dist/core/download.js
CHANGED
|
@@ -4,6 +4,93 @@ import crypto from 'node:crypto';
|
|
|
4
4
|
import { Readable, Transform } from 'node:stream';
|
|
5
5
|
import { pipeline } from 'node:stream/promises';
|
|
6
6
|
import { assetFetch, LumenKeyError } from './client.js';
|
|
7
|
+
/**
|
|
8
|
+
* What currently sits at the destination. A link is followed only to classify it (a link to a
|
|
9
|
+
* directory is a directory, a link to a file or a dangling link is an occupied path); publishing
|
|
10
|
+
* below never writes through a link, because link()/copyFile(EXCL) refuse an existing path and
|
|
11
|
+
* rename() replaces the link itself.
|
|
12
|
+
*/
|
|
13
|
+
async function destinationKind(resolved) {
|
|
14
|
+
let entry;
|
|
15
|
+
try {
|
|
16
|
+
entry = await fs.promises.lstat(resolved);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
if (error.code === 'ENOENT')
|
|
20
|
+
return 'missing';
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
const target = entry.isSymbolicLink() ? await fs.promises.stat(resolved).catch(() => undefined) : entry;
|
|
24
|
+
return target?.isDirectory() ? 'directory' : 'occupied';
|
|
25
|
+
}
|
|
26
|
+
/** Create the missing part of the directory chain and report what this call created, so a failure can remove exactly that. */
|
|
27
|
+
async function ensureParentDirectories(dir) {
|
|
28
|
+
const missing = [];
|
|
29
|
+
let current = dir;
|
|
30
|
+
for (;;) {
|
|
31
|
+
try {
|
|
32
|
+
const stat = await fs.promises.stat(current);
|
|
33
|
+
if (!stat.isDirectory())
|
|
34
|
+
throw Object.assign(new Error(`Not a directory: ${current}`), { code: 'ENOTDIR' });
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
if (error.code !== 'ENOENT')
|
|
39
|
+
throw error;
|
|
40
|
+
missing.unshift(current);
|
|
41
|
+
const parent = path.dirname(current);
|
|
42
|
+
if (parent === current)
|
|
43
|
+
throw error;
|
|
44
|
+
current = parent;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const created = [];
|
|
48
|
+
for (const directory of missing) {
|
|
49
|
+
try {
|
|
50
|
+
await fs.promises.mkdir(directory);
|
|
51
|
+
created.push(directory);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
if (error.code !== 'EEXIST')
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return created;
|
|
59
|
+
}
|
|
60
|
+
/** A hard kill between creating `<file>.<uuid>.part` and its removal leaves the part behind; sweep old ones in the directory being written to, nowhere else. */
|
|
61
|
+
const STALE_PART_MS = 60 * 60 * 1000;
|
|
62
|
+
async function sweepStaleParts(dir) {
|
|
63
|
+
let names;
|
|
64
|
+
try {
|
|
65
|
+
names = await fs.promises.readdir(dir);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
for (const name of names) {
|
|
71
|
+
if (!/\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\.part$/.test(name))
|
|
72
|
+
continue;
|
|
73
|
+
const file = path.join(dir, name);
|
|
74
|
+
try {
|
|
75
|
+
const stat = await fs.promises.lstat(file);
|
|
76
|
+
if (stat.isFile() && Date.now() - stat.mtimeMs >= STALE_PART_MS)
|
|
77
|
+
await fs.promises.unlink(file);
|
|
78
|
+
}
|
|
79
|
+
catch { /* best effort */ }
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/** Filesystems without hard links (exFAT, some SMB mounts) answer EPERM/ENOTSUP/EXDEV; an exclusive copy still refuses to overwrite. */
|
|
83
|
+
const LINK_UNSUPPORTED = new Set(['EPERM', 'ENOTSUP', 'EOPNOTSUPP', 'EXDEV']);
|
|
84
|
+
async function publishExclusive(temporary, resolved) {
|
|
85
|
+
try {
|
|
86
|
+
await fs.promises.link(temporary, resolved);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (!LINK_UNSUPPORTED.has(error.code ?? ''))
|
|
90
|
+
throw error;
|
|
91
|
+
await fs.promises.copyFile(temporary, resolved, fs.constants.COPYFILE_EXCL);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
7
94
|
/** Download is independent of API authentication, and never exposes signed URLs. */
|
|
8
95
|
export async function downloadFile(url, outputPath, overwrite = false, callerSignal) {
|
|
9
96
|
let target;
|
|
@@ -29,22 +116,17 @@ export async function downloadFile(url, outputPath, overwrite = false, callerSig
|
|
|
29
116
|
let responseBody;
|
|
30
117
|
let stage = 'write';
|
|
31
118
|
let ownedTemporary = false;
|
|
119
|
+
let createdDirectories = [];
|
|
32
120
|
let publishing = false;
|
|
121
|
+
let succeeded = false;
|
|
33
122
|
try {
|
|
34
123
|
if (callerSignal?.aborted)
|
|
35
124
|
throw new LumenKeyError('DOWNLOAD_INTERRUPTED');
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
throw new LumenKeyError('DOWNLOAD_EXISTS');
|
|
42
|
-
}
|
|
43
|
-
catch (error) {
|
|
44
|
-
if (error.code !== 'ENOENT')
|
|
45
|
-
throw error;
|
|
46
|
-
}
|
|
47
|
-
await fs.promises.mkdir(path.dirname(resolved), { recursive: true });
|
|
125
|
+
const existing = await destinationKind(resolved);
|
|
126
|
+
if (existing === 'directory')
|
|
127
|
+
throw new LumenKeyError('DOWNLOAD_IS_DIRECTORY');
|
|
128
|
+
if (existing === 'occupied' && !overwrite)
|
|
129
|
+
throw new LumenKeyError('DOWNLOAD_EXISTS');
|
|
48
130
|
stage = 'network';
|
|
49
131
|
const fetched = await assetFetch(url, { redirect: 'error', signal });
|
|
50
132
|
dispose = fetched.dispose;
|
|
@@ -57,6 +139,9 @@ export async function downloadFile(url, outputPath, overwrite = false, callerSig
|
|
|
57
139
|
if (Number.isFinite(declared) && declared > limit)
|
|
58
140
|
throw new LumenKeyError('DOWNLOAD_TOO_LARGE');
|
|
59
141
|
stage = 'write';
|
|
142
|
+
// Only now is a directory needed; anything created here is removed again if the save fails.
|
|
143
|
+
createdDirectories = await ensureParentDirectories(path.dirname(resolved));
|
|
144
|
+
await sweepStaleParts(path.dirname(resolved));
|
|
60
145
|
const handle = await fs.promises.open(temporary, 'wx', 0o600);
|
|
61
146
|
ownedTemporary = true;
|
|
62
147
|
let bytes = 0;
|
|
@@ -74,7 +159,8 @@ export async function downloadFile(url, outputPath, overwrite = false, callerSig
|
|
|
74
159
|
if (overwrite)
|
|
75
160
|
await fs.promises.rename(temporary, resolved);
|
|
76
161
|
else
|
|
77
|
-
await
|
|
162
|
+
await publishExclusive(temporary, resolved);
|
|
163
|
+
succeeded = true;
|
|
78
164
|
return resolved;
|
|
79
165
|
}
|
|
80
166
|
catch (error) {
|
|
@@ -86,13 +172,12 @@ export async function downloadFile(url, outputPath, overwrite = false, callerSig
|
|
|
86
172
|
throw new LumenKeyError('DOWNLOAD_TIMEOUT');
|
|
87
173
|
if (publishing) {
|
|
88
174
|
// The destination can change after preflight. Never replace a directory.
|
|
89
|
-
|
|
90
|
-
if (destination?.isDirectory())
|
|
175
|
+
if (await destinationKind(resolved) === 'directory')
|
|
91
176
|
throw new LumenKeyError('DOWNLOAD_IS_DIRECTORY');
|
|
92
177
|
}
|
|
93
178
|
if (publishing && error.code === 'EEXIST')
|
|
94
179
|
throw new LumenKeyError('DOWNLOAD_EXISTS');
|
|
95
|
-
if (['EACCES', 'EPERM', 'ENOSPC', 'EIO', 'ENOENT', 'ENOTDIR', 'EISDIR', 'EMFILE', 'ENFILE', 'EROFS'].includes(error.code ?? ''))
|
|
180
|
+
if (['EACCES', 'EPERM', 'ENOSPC', 'EIO', 'ENOENT', 'ENOTDIR', 'EISDIR', 'EMFILE', 'ENFILE', 'EROFS', 'ENOTSUP', 'EXDEV'].includes(error.code ?? ''))
|
|
96
181
|
throw new LumenKeyError('DOWNLOAD_WRITE_ERROR');
|
|
97
182
|
throw new LumenKeyError(stage === 'network' ? 'DOWNLOAD_NETWORK_ERROR' : 'DOWNLOAD_WRITE_ERROR');
|
|
98
183
|
}
|
|
@@ -101,6 +186,10 @@ export async function downloadFile(url, outputPath, overwrite = false, callerSig
|
|
|
101
186
|
await responseBody.cancel().catch(() => { });
|
|
102
187
|
if (ownedTemporary)
|
|
103
188
|
await fs.promises.rm(temporary, { force: true }).catch(() => { });
|
|
189
|
+
// Leave no empty directory chain behind a failed save; rmdir refuses non-empty directories, so nothing else is touched.
|
|
190
|
+
if (!succeeded)
|
|
191
|
+
for (const directory of createdDirectories.reverse())
|
|
192
|
+
await fs.promises.rmdir(directory).catch(() => { });
|
|
104
193
|
await dispose?.().catch(() => { });
|
|
105
194
|
}
|
|
106
195
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/core/download.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAExD,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,UAAkB,EAAE,SAAS,GAAG,KAAK,EAAE,YAA0B;IAC/G,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QAAC,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;IAC9B,MAAM,CAAC;QAAC,MAAM,IAAI,aAAa,CAAC,sBAAsB,CAAC,CAAC;IAAC,CAAC;IAC1D,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,aAAa,CAAC,sBAAsB,CAAC,CAAC;IAC1I,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAAC,CAAC;IAC5C,MAAM,CAAC;QAAC,MAAM,IAAI,aAAa,CAAC,sBAAsB,CAAC,CAAC;IAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,GAAG,QAAQ,IAAI,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC;IAC5D,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACnF,IAAI,OAA0C,CAAC;IAC/C,IAAI,YAA2D,CAAC;IAChE,IAAI,KAAK,GAAwB,OAAO,CAAC;IACzC,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,CAAC;QACH,IAAI,YAAY,EAAE,OAAO;YAAE,MAAM,IAAI,aAAa,CAAC,sBAAsB,CAAC,CAAC;QAC3E,
|
|
1
|
+
{"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/core/download.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAExD;;;;;GAKG;AACH,KAAK,UAAU,eAAe,CAAC,QAAgB;IAC7C,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QAAC,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAAC,CAAC;IAClD,OAAO,KAAK,EAAE,CAAC;QAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC;IACxG,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACxG,OAAO,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;AAC1D,CAAC;AAED,8HAA8H;AAC9H,KAAK,UAAU,uBAAuB,CAAC,GAAW;IAChD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,SAAS,CAAC;QACR,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAC5G,MAAM;QACR,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAC;YACpE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,MAAM,KAAK,OAAO;gBAAE,MAAM,KAAK,CAAC;YACpC,OAAO,GAAG,MAAM,CAAC;QACnB,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;QAChC,IAAI,CAAC;YAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAAC,CAAC;QACpE,OAAO,KAAK,EAAE,CAAC;YAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAC;QAAC,CAAC;IACxF,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,gKAAgK;AAChK,MAAM,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACrC,KAAK,UAAU,eAAe,CAAC,GAAW;IACxC,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QAAC,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO;IAAC,CAAC;IACjE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,uEAAuE,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAClG,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,aAAa;gBAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClG,CAAC;QAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,wIAAwI;AACxI,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;AAE9E,KAAK,UAAU,gBAAgB,CAAC,SAAiB,EAAE,QAAgB;IACjE,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAE,KAA+B,CAAC,IAAI,IAAI,EAAE,CAAC;YAAE,MAAM,KAAK,CAAC;QACpF,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,UAAkB,EAAE,SAAS,GAAG,KAAK,EAAE,YAA0B;IAC/G,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QAAC,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;IAC9B,MAAM,CAAC;QAAC,MAAM,IAAI,aAAa,CAAC,sBAAsB,CAAC,CAAC;IAAC,CAAC;IAC1D,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,aAAa,CAAC,sBAAsB,CAAC,CAAC;IAC1I,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAAC,CAAC;IAC5C,MAAM,CAAC;QAAC,MAAM,IAAI,aAAa,CAAC,sBAAsB,CAAC,CAAC;IAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,GAAG,QAAQ,IAAI,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC;IAC5D,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACnF,IAAI,OAA0C,CAAC;IAC/C,IAAI,YAA2D,CAAC;IAChE,IAAI,KAAK,GAAwB,OAAO,CAAC;IACzC,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,kBAAkB,GAAa,EAAE,CAAC;IACtC,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,CAAC;QACH,IAAI,YAAY,EAAE,OAAO;YAAE,MAAM,IAAI,aAAa,CAAC,sBAAsB,CAAC,CAAC;QAC3E,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,QAAQ,KAAK,WAAW;YAAE,MAAM,IAAI,aAAa,CAAC,uBAAuB,CAAC,CAAC;QAC/E,IAAI,QAAQ,KAAK,UAAU,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,aAAa,CAAC,iBAAiB,CAAC,CAAC;QACtF,KAAK,GAAG,SAAS,CAAC;QAClB,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACrE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;YAAE,MAAM,IAAI,aAAa,CAAC,qBAAqB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QACpG,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;QAChC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAChE,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,KAAK;YAAE,MAAM,IAAI,aAAa,CAAC,oBAAoB,CAAC,CAAC;QACjG,KAAK,GAAG,OAAO,CAAC;QAChB,4FAA4F;QAC5F,kBAAkB,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3E,MAAM,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC9D,cAAc,GAAG,IAAI,CAAC;QACtB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAW,CAAC,CAAC;QACtD,gEAAgE;QAChE,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,QAAQ,CAAC,MAAM,EAAE,IAAI,SAAS,CAAC,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ;gBACzE,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;gBACtB,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAClF,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,iBAAiB,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9C,KAAK,GAAG,OAAO,CAAC;QAChB,IAAI,YAAY,EAAE,OAAO;YAAE,MAAM,IAAI,aAAa,CAAC,sBAAsB,CAAC,CAAC;QAC3E,UAAU,GAAG,IAAI,CAAC;QAClB,IAAI,SAAS;YAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;;YACxD,MAAM,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACjD,SAAS,GAAG,IAAI,CAAC;QACjB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,aAAa,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,MAAM,KAAK,CAAC;QACtF,IAAI,YAAY,EAAE,OAAO;YAAE,MAAM,IAAI,aAAa,CAAC,sBAAsB,CAAC,CAAC;QAC3E,IAAI,MAAM,CAAC,OAAO;YAAE,MAAM,IAAI,aAAa,CAAC,kBAAkB,CAAC,CAAC;QAChE,IAAI,UAAU,EAAE,CAAC;YACf,yEAAyE;YACzE,IAAI,MAAM,eAAe,CAAC,QAAQ,CAAC,KAAK,WAAW;gBAAE,MAAM,IAAI,aAAa,CAAC,uBAAuB,CAAC,CAAC;QACxG,CAAC;QACD,IAAI,UAAU,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,IAAI,aAAa,CAAC,iBAAiB,CAAC,CAAC;QACjH,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAE,KAA+B,CAAC,IAAI,IAAI,EAAE,CAAC;YAAE,MAAM,IAAI,aAAa,CAAC,sBAAsB,CAAC,CAAC;QAChO,MAAM,IAAI,aAAa,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC;IACnG,CAAC;YAAS,CAAC;QACT,IAAI,YAAY,IAAI,CAAC,YAAY,CAAC,MAAM;YAAE,MAAM,YAAY,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACtF,IAAI,cAAc;YAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrF,wHAAwH;QACxH,IAAI,CAAC,SAAS;YAAE,KAAK,MAAM,SAAS,IAAI,kBAAkB,CAAC,OAAO,EAAE;gBAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACzH,MAAM,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACpC,CAAC;AACH,CAAC"}
|
|
@@ -1,14 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export declare function chatText(response: {
|
|
6
|
-
choices?: Array<{
|
|
7
|
-
message?: {
|
|
8
|
-
content?: unknown;
|
|
9
|
-
refusal?: unknown;
|
|
10
|
-
tool_calls?: unknown;
|
|
11
|
-
};
|
|
12
|
-
}>;
|
|
13
|
-
}): string;
|
|
1
|
+
import { type Failure } from './outcome.js';
|
|
2
|
+
export { chatText } from './outcome.js';
|
|
3
|
+
/** @deprecated Use `failure()` from `./outcome.js`; kept for 0.2.x callers. */
|
|
4
|
+
export declare function errorResult(error: unknown): Failure;
|
|
14
5
|
//# sourceMappingURL=error-result.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-result.d.ts","sourceRoot":"","sources":["../../src/core/error-result.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"error-result.d.ts","sourceRoot":"","sources":["../../src/core/error-result.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEnD"}
|
|
@@ -1,27 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { failure } from './outcome.js';
|
|
2
|
+
export { chatText } from './outcome.js';
|
|
3
|
+
/** @deprecated Use `failure()` from `./outcome.js`; kept for 0.2.x callers. */
|
|
3
4
|
export function errorResult(error) {
|
|
4
|
-
|
|
5
|
-
const code = typeof e?.code === 'string' && /^(?:[A-Z][A-Z0-9_]{0,79}|[a-z][a-z0-9_]{0,63})$/.test(e.code) ? e.code : 'CLI_COMMAND_FAILED';
|
|
6
|
-
return { error: error instanceof Error ? error.message : errorSentence(code), code,
|
|
7
|
-
ok: false, message: error instanceof LumenKeyError ? error.publicMessage : error instanceof Error ? error.message : errorSentence(code),
|
|
8
|
-
type: error instanceof Error ? error.name : 'Error',
|
|
9
|
-
...(typeof e?.status === 'number' ? { httpStatus: e.status } : {}),
|
|
10
|
-
...(typeof e?.jobId === 'string' ? { jobId: e.jobId } : {}),
|
|
11
|
-
...(typeof e?.jobStatus === 'string' ? { jobStatus: e.jobStatus } : {}),
|
|
12
|
-
...(typeof e?.idempotencyKey === 'string' ? { idempotencyKey: e.idempotencyKey } : {}),
|
|
13
|
-
...(e?.timedOut === true ? { status: 'TIMEOUT', waitStatus: 'TIMEOUT', timedOut: true } : {}),
|
|
14
|
-
...(error instanceof LumenKeyError && error.billing ? { billing: error.billing } : {}),
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
export function chatText(response) {
|
|
18
|
-
const message = response.choices?.[0]?.message;
|
|
19
|
-
if (typeof message?.content === 'string' && message.content.trim())
|
|
20
|
-
return message.content;
|
|
21
|
-
if (typeof message?.refusal === 'string' && message.refusal.trim())
|
|
22
|
-
return message.refusal;
|
|
23
|
-
if (Array.isArray(message?.tool_calls) && message.tool_calls.length)
|
|
24
|
-
return JSON.stringify({ tool_calls: message.tool_calls });
|
|
25
|
-
throw new LumenKeyError('CHAT_EMPTY_RESPONSE');
|
|
5
|
+
return failure(error);
|
|
26
6
|
}
|
|
27
7
|
//# sourceMappingURL=error-result.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-result.js","sourceRoot":"","sources":["../../src/core/error-result.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"error-result.js","sourceRoot":"","sources":["../../src/core/error-result.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAgB,MAAM,cAAc,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,+EAA+E;AAC/E,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { LumenKeyClient, LumenKeyError } from './client.js';
|
|
2
|
+
import type { ModelItem } from './types.js';
|
|
3
|
+
/** Run before catalog access, including option + set and two differently named set fields. */
|
|
4
|
+
export declare function assertNoParameterAliasConflict(names: Iterable<string>): void;
|
|
5
|
+
/** Only literal JSON scalar defaults are materialized. Never invent compound input or coerce catalog values. */
|
|
6
|
+
export declare function scalarDefaults(properties: Record<string, unknown>): Record<string, unknown>;
|
|
7
|
+
export declare function propertiesOf(model: ModelItem): Record<string, unknown>;
|
|
8
|
+
/** Surface-neutral: the same sentence whichever surface collected the prompt. */
|
|
9
|
+
export declare function blankPromptError(_kind?: 'flag' | 'field' | 'user'): LumenKeyError;
|
|
10
|
+
export interface BuiltGenerationInput {
|
|
11
|
+
input: Record<string, unknown>;
|
|
12
|
+
/** Before default expansion, for safe matching across client/catalog upgrades; never sent as a separate wire field. */
|
|
13
|
+
callerInput: Record<string, unknown>;
|
|
14
|
+
/** Baseline 3b240de projection, solely to recognize pending records from before null/ratio normalization fixes. */
|
|
15
|
+
legacyCallerInput?: Record<string, unknown>;
|
|
16
|
+
defaults: Record<string, unknown>;
|
|
17
|
+
properties: Record<string, unknown>;
|
|
18
|
+
model: ModelItem;
|
|
19
|
+
}
|
|
20
|
+
/** Single CLI/MCP entry: project declared caller fields, then explicitly materialize catalog scalar defaults. */
|
|
21
|
+
export declare function buildGenerationInput(client: LumenKeyClient, modelId: string, fields: Record<string, unknown>, pairs: string[], known?: ModelItem): Promise<BuiltGenerationInput>;
|
|
22
|
+
export interface DryRunPreview {
|
|
23
|
+
dryRun: true;
|
|
24
|
+
defaultsApplied: true;
|
|
25
|
+
modelId: string;
|
|
26
|
+
input: Record<string, unknown>;
|
|
27
|
+
schemaDefaults: Record<string, unknown>;
|
|
28
|
+
required: unknown;
|
|
29
|
+
confirmIgnored?: true;
|
|
30
|
+
notice?: string;
|
|
31
|
+
}
|
|
32
|
+
export declare function dryRunPreview(modelId: string, input: Record<string, unknown>, model: ModelItem, confirm?: unknown): DryRunPreview;
|
|
33
|
+
//# sourceMappingURL=generation-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generation-input.d.ts","sourceRoot":"","sources":["../../src/core/generation-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAY5C,8FAA8F;AAC9F,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAK5E;AAED,gHAAgH;AAChH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAM3F;AAcD,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAItE;AAoDD,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,aAAa,CAEjF;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,uHAAuH;IACvH,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,mHAAmH;IACnH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,iHAAiH;AACjH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAwBtL;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,IAAI,CAAC;IACb,eAAe,EAAE,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,aAAa,CAKjI"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { LumenKeyError } from './client.js';
|
|
2
|
+
import { isBlankPrompt, promptRequiredSentence, ui } from './locale.js';
|
|
3
|
+
import { applyKeyValues, modelParameterError, validateKnownEnums } from './set-values.js';
|
|
4
|
+
/** Gateway parameter identities, not conversions: durationMs is never converted to duration here. */
|
|
5
|
+
const PARAMETER_ALIASES = [
|
|
6
|
+
['durationMs', 'duration', 'duration_seconds', 'duration_ms'],
|
|
7
|
+
['imageSize', 'resolution', 'image_size', 'size'],
|
|
8
|
+
['aspectRatio', 'aspect_ratio', 'aspectratio', 'ratio'],
|
|
9
|
+
['outputCount', 'num_images', 'output_count', 'n'],
|
|
10
|
+
['seed', 'seed_value'], ['guidanceScale', 'guidance_scale', 'cfg_scale'],
|
|
11
|
+
['negativePrompt', 'negative_prompt'], ['prompt', 'text'],
|
|
12
|
+
];
|
|
13
|
+
/** Run before catalog access, including option + set and two differently named set fields. */
|
|
14
|
+
export function assertNoParameterAliasConflict(names) {
|
|
15
|
+
const supplied = new Set(names);
|
|
16
|
+
for (const group of PARAMETER_ALIASES) {
|
|
17
|
+
if (group.filter(name => supplied.has(name)).length > 1)
|
|
18
|
+
throw new LumenKeyError('MODEL_PARAM_ALIAS_CONFLICT');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/** Only literal JSON scalar defaults are materialized. Never invent compound input or coerce catalog values. */
|
|
22
|
+
export function scalarDefaults(properties) {
|
|
23
|
+
return Object.fromEntries(Object.entries(properties).flatMap(([name, raw]) => {
|
|
24
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw) || !Object.prototype.hasOwnProperty.call(raw, 'default'))
|
|
25
|
+
return [];
|
|
26
|
+
const value = raw.default;
|
|
27
|
+
return (typeof value === 'string' && value !== '') || typeof value === 'boolean' || (typeof value === 'number' && Number.isFinite(value)) ? [[name, value]] : [];
|
|
28
|
+
}));
|
|
29
|
+
}
|
|
30
|
+
function withDefaults(callerInput, defaults) {
|
|
31
|
+
const applicable = Object.entries(defaults).filter(([name]) => {
|
|
32
|
+
if (Object.prototype.hasOwnProperty.call(callerInput, name))
|
|
33
|
+
return false;
|
|
34
|
+
const group = PARAMETER_ALIASES.find(aliases => aliases.includes(name));
|
|
35
|
+
// A caller spelling wins over all default spellings of the same parameter.
|
|
36
|
+
if (group?.some(alias => Object.prototype.hasOwnProperty.call(callerInput, alias)))
|
|
37
|
+
return false;
|
|
38
|
+
if (group && group.filter(alias => Object.prototype.hasOwnProperty.call(defaults, alias)).length > 1)
|
|
39
|
+
throw new LumenKeyError('MODEL_INPUT_SCHEMA_INVALID');
|
|
40
|
+
return true;
|
|
41
|
+
});
|
|
42
|
+
return { ...callerInput, ...Object.fromEntries(applicable) };
|
|
43
|
+
}
|
|
44
|
+
export function propertiesOf(model) {
|
|
45
|
+
const properties = model.inputSchema?.properties;
|
|
46
|
+
if (!properties || typeof properties !== 'object' || Array.isArray(properties))
|
|
47
|
+
throw new LumenKeyError('MODEL_INPUT_SCHEMA_INVALID');
|
|
48
|
+
return properties;
|
|
49
|
+
}
|
|
50
|
+
function hasDeclared(properties, key) {
|
|
51
|
+
return Object.prototype.hasOwnProperty.call(properties, key);
|
|
52
|
+
}
|
|
53
|
+
function coerceDeclared(spec, value, key, legacy = false) {
|
|
54
|
+
if (!legacy && value === null)
|
|
55
|
+
return null; // Explicit JSON null is a value, not omission or numeric zero.
|
|
56
|
+
const type = spec && typeof spec === 'object' && !Array.isArray(spec) ? spec.type : undefined;
|
|
57
|
+
if (type === 'integer' || type === 'number') {
|
|
58
|
+
const parsed = Number(value);
|
|
59
|
+
if (!Number.isFinite(parsed))
|
|
60
|
+
throw modelParameterError('MODEL_PARAM_INVALID', key);
|
|
61
|
+
return type === 'integer' ? Math.trunc(parsed) : parsed;
|
|
62
|
+
}
|
|
63
|
+
if (type === 'string')
|
|
64
|
+
return String(value);
|
|
65
|
+
return value;
|
|
66
|
+
}
|
|
67
|
+
/** One caller value for the aspect ratio lands in exactly one catalog field: aspect_ratio when declared, else ratio. Both surfaces send the same body. */
|
|
68
|
+
function assignAspect(properties, input, fields, legacy = false) {
|
|
69
|
+
const value = fields.ratio !== undefined ? fields.ratio : fields.aspect_ratio;
|
|
70
|
+
if (value === undefined)
|
|
71
|
+
return;
|
|
72
|
+
const name = hasDeclared(properties, 'aspect_ratio') ? 'aspect_ratio' : hasDeclared(properties, 'ratio') ? 'ratio' : undefined;
|
|
73
|
+
if (!name)
|
|
74
|
+
throw modelParameterError('MODEL_PARAM_UNKNOWN', 'aspect_ratio');
|
|
75
|
+
input[name] = coerceDeclared(properties[name], value, name, legacy);
|
|
76
|
+
}
|
|
77
|
+
function assignDeclared(properties, input, key, value, legacy = false) {
|
|
78
|
+
if (!hasDeclared(properties, key))
|
|
79
|
+
throw modelParameterError('MODEL_PARAM_UNKNOWN', key);
|
|
80
|
+
const spec = properties[key];
|
|
81
|
+
const type = spec && typeof spec === 'object' && !Array.isArray(spec) ? spec.type : undefined;
|
|
82
|
+
const scalar = value === null || value === undefined || typeof value !== 'object';
|
|
83
|
+
input[key] = scalar && (type === 'integer' || type === 'number' || type === 'string') ? coerceDeclared(spec, value, key, legacy) : value;
|
|
84
|
+
}
|
|
85
|
+
/** legacy=true is a comparison-only migration projection; it is NEVER quoted, submitted or persisted as new input. */
|
|
86
|
+
function projectCallerInput(properties, defined, extra, legacy = false) {
|
|
87
|
+
const input = {};
|
|
88
|
+
assignAspect(properties, input, defined, legacy);
|
|
89
|
+
for (const [key, value] of Object.entries(defined)) {
|
|
90
|
+
if (key === 'aspect_ratio' || key === 'ratio')
|
|
91
|
+
continue;
|
|
92
|
+
assignDeclared(properties, input, key, value, legacy);
|
|
93
|
+
}
|
|
94
|
+
for (const [key, value] of Object.entries(extra)) {
|
|
95
|
+
// A repeated same spelling now replaces its projected option. The old client instead added
|
|
96
|
+
// a literal ratio field; keep that old shape for journal matching, never for a new request.
|
|
97
|
+
if (!legacy && (key === 'ratio' || key === 'aspect_ratio') && Object.prototype.hasOwnProperty.call(defined, key))
|
|
98
|
+
assignAspect(properties, input, { [key]: value });
|
|
99
|
+
else
|
|
100
|
+
assignDeclared(properties, input, key, value, legacy);
|
|
101
|
+
}
|
|
102
|
+
return input;
|
|
103
|
+
}
|
|
104
|
+
/** Surface-neutral: the same sentence whichever surface collected the prompt. */
|
|
105
|
+
export function blankPromptError(_kind) {
|
|
106
|
+
return new LumenKeyError('INPUT_INVALID', undefined, undefined, promptRequiredSentence());
|
|
107
|
+
}
|
|
108
|
+
/** Single CLI/MCP entry: project declared caller fields, then explicitly materialize catalog scalar defaults. */
|
|
109
|
+
export async function buildGenerationInput(client, modelId, fields, pairs, known) {
|
|
110
|
+
client.requireKey();
|
|
111
|
+
if (typeof fields.prompt === 'string' && isBlankPrompt(fields.prompt))
|
|
112
|
+
throw blankPromptError();
|
|
113
|
+
const defined = Object.fromEntries(Object.entries(fields).filter(([, value]) => value !== undefined));
|
|
114
|
+
const extra = applyKeyValues({}, pairs);
|
|
115
|
+
for (const [key, value] of [...Object.entries(defined), ...Object.entries(extra)]) {
|
|
116
|
+
if (value === null)
|
|
117
|
+
throw new LumenKeyError('MODEL_PARAM_INVALID', undefined, undefined, `${modelParameterError('MODEL_PARAM_INVALID', key).publicMessage} ${ui('To use the default, omit this field.', '要用默认值就省略该字段。')}`);
|
|
118
|
+
}
|
|
119
|
+
assertNoParameterAliasConflict([...Object.keys(defined), ...Object.keys(extra)]);
|
|
120
|
+
const model = known?.id === modelId ? known : (await client.listModels()).find((item) => item.id === modelId);
|
|
121
|
+
if (!model)
|
|
122
|
+
throw new LumenKeyError('MODEL_NOT_IN_CATALOG');
|
|
123
|
+
const properties = propertiesOf(model);
|
|
124
|
+
const input = projectCallerInput(properties, defined, extra);
|
|
125
|
+
let legacyCallerInput;
|
|
126
|
+
try {
|
|
127
|
+
legacyCallerInput = projectCallerInput(properties, defined, extra, true);
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
// An input the baseline could not project could not have been submitted by that baseline.
|
|
131
|
+
if (!(error instanceof LumenKeyError))
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
const defaults = scalarDefaults(properties);
|
|
135
|
+
const effectiveInput = withDefaults(input, defaults);
|
|
136
|
+
validateKnownEnums(properties, effectiveInput);
|
|
137
|
+
return { input: effectiveInput, callerInput: input, legacyCallerInput, defaults, properties, model };
|
|
138
|
+
}
|
|
139
|
+
export function dryRunPreview(modelId, input, model, confirm) {
|
|
140
|
+
const properties = propertiesOf(model);
|
|
141
|
+
const defaults = scalarDefaults(properties);
|
|
142
|
+
return { dryRun: true, defaultsApplied: true, modelId, input, schemaDefaults: defaults, required: model.inputSchema?.required ?? [],
|
|
143
|
+
...(confirm ? { confirmIgnored: true, notice: ui('--confirm has no effect with --dry-run. No job submitted.', '--confirm 在 --dry-run 下不会生效。没有提交任务。') } : {}) };
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=generation-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generation-input.js","sourceRoot":"","sources":["../../src/core/generation-input.ts"],"names":[],"mappings":"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"}
|