@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.
Files changed (98) hide show
  1. package/README.md +28 -7
  2. package/dist/cli/copied.d.ts +19 -36
  3. package/dist/cli/copied.d.ts.map +1 -1
  4. package/dist/cli/copied.js +159 -283
  5. package/dist/cli/copied.js.map +1 -1
  6. package/dist/cli/index.d.ts.map +1 -1
  7. package/dist/cli/index.js +86 -136
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/cli/render.d.ts +11 -0
  10. package/dist/cli/render.d.ts.map +1 -0
  11. package/dist/cli/render.js +35 -0
  12. package/dist/cli/render.js.map +1 -0
  13. package/dist/core/atomic-config-file.d.ts +21 -2
  14. package/dist/core/atomic-config-file.d.ts.map +1 -1
  15. package/dist/core/atomic-config-file.js +66 -10
  16. package/dist/core/atomic-config-file.js.map +1 -1
  17. package/dist/core/chat.d.ts +13 -0
  18. package/dist/core/chat.d.ts.map +1 -0
  19. package/dist/core/chat.js +31 -0
  20. package/dist/core/chat.js.map +1 -0
  21. package/dist/core/client.d.ts +19 -1
  22. package/dist/core/client.d.ts.map +1 -1
  23. package/dist/core/client.js +50 -11
  24. package/dist/core/client.js.map +1 -1
  25. package/dist/core/config-dir.d.ts.map +1 -1
  26. package/dist/core/config-dir.js +3 -4
  27. package/dist/core/config-dir.js.map +1 -1
  28. package/dist/core/config-error.d.ts +14 -0
  29. package/dist/core/config-error.d.ts.map +1 -0
  30. package/dist/core/config-error.js +20 -0
  31. package/dist/core/config-error.js.map +1 -0
  32. package/dist/core/config.d.ts +1 -5
  33. package/dist/core/config.d.ts.map +1 -1
  34. package/dist/core/config.js +8 -39
  35. package/dist/core/config.js.map +1 -1
  36. package/dist/core/credit-cap.d.ts +5 -0
  37. package/dist/core/credit-cap.d.ts.map +1 -0
  38. package/dist/core/credit-cap.js +15 -0
  39. package/dist/core/credit-cap.js.map +1 -0
  40. package/dist/core/download.d.ts.map +1 -1
  41. package/dist/core/download.js +105 -16
  42. package/dist/core/download.js.map +1 -1
  43. package/dist/core/error-result.d.ts +4 -13
  44. package/dist/core/error-result.d.ts.map +1 -1
  45. package/dist/core/error-result.js +4 -24
  46. package/dist/core/error-result.js.map +1 -1
  47. package/dist/core/generation-input.d.ts +33 -0
  48. package/dist/core/generation-input.d.ts.map +1 -0
  49. package/dist/core/generation-input.js +145 -0
  50. package/dist/core/generation-input.js.map +1 -0
  51. package/dist/core/generation-result.d.ts +17 -14
  52. package/dist/core/generation-result.d.ts.map +1 -1
  53. package/dist/core/generation-result.js +3 -4
  54. package/dist/core/generation-result.js.map +1 -1
  55. package/dist/core/generation.d.ts +124 -0
  56. package/dist/core/generation.d.ts.map +1 -0
  57. package/dist/core/generation.js +316 -0
  58. package/dist/core/generation.js.map +1 -0
  59. package/dist/core/locale.d.ts +19 -0
  60. package/dist/core/locale.d.ts.map +1 -1
  61. package/dist/core/locale.js +69 -4
  62. package/dist/core/locale.js.map +1 -1
  63. package/dist/core/outcome.d.ts +128 -0
  64. package/dist/core/outcome.d.ts.map +1 -0
  65. package/dist/core/outcome.js +101 -0
  66. package/dist/core/outcome.js.map +1 -0
  67. package/dist/core/output-path.d.ts +10 -0
  68. package/dist/core/output-path.d.ts.map +1 -0
  69. package/dist/core/output-path.js +15 -0
  70. package/dist/core/output-path.js.map +1 -0
  71. package/dist/core/params.d.ts +68 -0
  72. package/dist/core/params.d.ts.map +1 -0
  73. package/dist/core/params.js +227 -0
  74. package/dist/core/params.js.map +1 -0
  75. package/dist/core/poller.d.ts +6 -1
  76. package/dist/core/poller.d.ts.map +1 -1
  77. package/dist/core/poller.js +17 -8
  78. package/dist/core/poller.js.map +1 -1
  79. package/dist/core/profiles.d.ts +4 -2
  80. package/dist/core/profiles.d.ts.map +1 -1
  81. package/dist/core/profiles.js +20 -9
  82. package/dist/core/profiles.js.map +1 -1
  83. package/dist/core/submission-journal.d.ts +106 -0
  84. package/dist/core/submission-journal.d.ts.map +1 -0
  85. package/dist/core/submission-journal.js +329 -0
  86. package/dist/core/submission-journal.js.map +1 -0
  87. package/dist/index.d.ts +3 -0
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +3 -0
  90. package/dist/index.js.map +1 -1
  91. package/dist/mcp/render.d.ts +11 -0
  92. package/dist/mcp/render.d.ts.map +1 -0
  93. package/dist/mcp/render.js +17 -0
  94. package/dist/mcp/render.js.map +1 -0
  95. package/dist/mcp/server.d.ts.map +1 -1
  96. package/dist/mcp/server.js +95 -337
  97. package/dist/mcp/server.js.map +1 -1
  98. package/package.json +2 -1
@@ -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 { errorSentence, ui } from './locale.js';
7
+ import { ui } from './locale.js';
8
8
  import { assertConfigDirReadable } from './config-dir.js';
9
- import { assertSafeConfigFile, writeAtomicConfigFile, UnsafeConfigPathError } from './atomic-config-file.js';
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
- if (error instanceof UnsafeConfigPathError) {
33
- return new ConfigError('CONFIG_UNSAFE_PATH', configPath, ui('Symbolic links and hard links are not supported for configuration; use a regular private file and directory.', '配置不支持符号链接或硬链接;请使用独立的普通文件和目录。'));
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
- const configDir = getConfigDir();
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,
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
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":"AAOA,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,CAmElI"}
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"}
@@ -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
- try {
37
- const destination = await fs.promises.lstat(resolved);
38
- if (destination.isDirectory())
39
- throw new LumenKeyError('DOWNLOAD_IS_DIRECTORY');
40
- if (!overwrite)
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 fs.promises.link(temporary, resolved);
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
- const destination = await fs.promises.lstat(resolved).catch(() => undefined);
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":"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"}
1
+ {"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/core/download.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,5 @@
1
- export declare function errorResult(error: unknown): Record<string, unknown> & {
2
- error: string;
3
- code: string;
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":"AAGA,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAarG;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE;IAAE,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,OAAO,CAAC;YAAC,OAAO,CAAC,EAAE,OAAO,CAAC;YAAC,UAAU,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE,CAAC,CAAA;CAAE,GAAG,MAAM,CAM5I"}
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 { LumenKeyError } from './client.js';
2
- import { errorSentence } from './locale.js';
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
- const e = error;
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,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,MAAM,CAAC,GAAG,KAA2J,CAAC;IACtK,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,IAAI,KAAK,QAAQ,IAAI,iDAAiD,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAC3I,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI;QAChF,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,YAAY,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC;QACvI,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;QACnD,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,OAAO,CAAC,EAAE,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,GAAG,CAAC,OAAO,CAAC,EAAE,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,GAAG,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,GAAG,CAAC,KAAK,YAAY,aAAa,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,QAA2G;IAClI,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;IAC/C,IAAI,OAAO,OAAO,EAAE,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC;IAC3F,IAAI,OAAO,OAAO,EAAE,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC;IAC3F,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/H,MAAM,IAAI,aAAa,CAAC,qBAAqB,CAAC,CAAC;AACjD,CAAC"}
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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"}