@lumenkey/cli 0.2.3 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -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 +38 -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 +21 -0
- package/dist/core/locale.d.ts.map +1 -1
- package/dist/core/locale.js +84 -4
- package/dist/core/locale.js.map +1 -1
- package/dist/core/outcome.d.ts +134 -0
- package/dist/core/outcome.d.ts.map +1 -0
- package/dist/core/outcome.js +112 -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 +340 -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
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { LumenKeyError } from './client.js';
|
|
3
|
+
import { parseCreditCap } from './credit-cap.js';
|
|
4
|
+
import { asPairs, modelParameterError } from './set-values.js';
|
|
5
|
+
import { isBlankPrompt, promptRequiredSentence, ui } from './locale.js';
|
|
6
|
+
const text = (en, zh) => ({ en, zh });
|
|
7
|
+
const modelId = { name: 'modelId', kind: 'string', required: true, flag: '--model', aliases: ['-m'], placeholder: '<modelId>', describe: text('Model ID', '模型 ID') };
|
|
8
|
+
const prompt = { name: 'prompt', kind: 'string', required: true, flag: '--prompt', aliases: ['-p'], placeholder: '<prompt>', describe: text('Prompt for the model', '发给模型的提示词') };
|
|
9
|
+
const confirm = { name: 'confirm', kind: 'boolean', flag: '--confirm', describe: text('Explicitly submit this billable generation; otherwise quote only', '确认提交这次计费生成;否则只报价') };
|
|
10
|
+
const dryRun = { name: 'dryRun', kind: 'boolean', flag: '--dry-run', only: 'cli', describe: text('Print the projected input and do not quote', '只打印将提交的输入,不报价') };
|
|
11
|
+
const idempotencyKey = { name: 'idempotencyKey', kind: 'string', flag: '--idempotency-key', placeholder: '<key>', describe: text('Optional. Generated when omitted. Reuse it only to recover a submission whose outcome was unknown; the recorded body is re-sent unchanged', '可选,省略时自动生成。只在提交结果未知时复用,记录的请求体会原样重发') };
|
|
12
|
+
const maxCredits = { name: 'maxCredits', kind: 'number', constraint: 'integer-nonnegative', flag: '--max-credits', placeholder: '<credits>', describe: text('Reject quotes above this spending cap (non-negative integer)', '报价超过该花费上限时拒绝(非负整数)') };
|
|
13
|
+
const projectId = { name: 'projectId', kind: 'string', only: 'mcp', describe: text('Leave empty. The client fills this.', '请留空,由客户端填入。') };
|
|
14
|
+
const downloadPath = { name: 'downloadPath', kind: 'string', flag: '--output', aliases: ['-o'], placeholder: '<path>', describe: text('Save the first result to this file path (absolute or ~/...). Omit it to receive the URLs only', '把第一个结果保存到该文件路径(绝对路径或 ~/ 开头);省略则只返回地址') };
|
|
15
|
+
const set = { name: 'set', kind: 'string[]', flag: '--set', aliases: ['-s'], placeholder: '<pair>', describe: text('Extra key=value declared by the model schema. Repeatable', '模型参数结构声明的额外 key=value,可重复') };
|
|
16
|
+
const intervalMs = { name: 'intervalMs', kind: 'number', constraint: 'positive', flag: '--interval', placeholder: '<seconds>', default: 5000, describe: text('Polling interval; defaults to 5 seconds', '轮询间隔;默认 5 秒') };
|
|
17
|
+
const timeoutMs = { name: 'timeoutMs', kind: 'number', constraint: 'nonnegative', flag: '--timeout', placeholder: '<seconds>', default: 1_800_000, describe: text('Wait timeout; defaults to 1800 seconds. Does not cancel the task', '等待超时;默认 1800 秒,超时不取消任务') };
|
|
18
|
+
const resolution = { name: 'resolution', kind: 'string', flag: '--resolution', aliases: ['-r'], placeholder: '<res>', describe: text('Resolution, only if the catalog declares it', '分辨率,仅当目录声明了该字段') };
|
|
19
|
+
const ratio = { name: 'ratio', kind: 'string', flag: '--aspect-ratio', aliases: ['--ratio'], placeholder: '<ratio>', describe: text('Aspect ratio, only if the catalog declares aspect_ratio or ratio', '宽高比,仅当目录声明了 aspect_ratio 或 ratio') };
|
|
20
|
+
const count = { name: 'count', kind: 'numeric', flag: '--count', placeholder: '<count>', describe: text('Count, only if the catalog declares it; validated against the catalog type', '数量,仅当目录声明了该字段;按目录类型校验') };
|
|
21
|
+
export const videoParams = [
|
|
22
|
+
modelId, prompt,
|
|
23
|
+
{ name: 'imageUrl', kind: 'string', flag: '--image', aliases: ['-i'], placeholder: '<imageUrl>', describe: text('Source image URL for image-to-video, only if the catalog declares it', '图生视频的源图地址,仅当目录声明了该字段') },
|
|
24
|
+
// No numeric constraint on duration: the catalog decides what a valid duration is (an explicit 0 is passed through, as in 0.2.3).
|
|
25
|
+
{ name: 'duration', kind: 'number', flag: '--duration', aliases: ['-d'], placeholder: '<seconds>', describe: text('Video duration in seconds; omitted scalar catalog defaults are explicitly sent', '视频时长(秒);省略时会显式发送目录中的标量默认值') },
|
|
26
|
+
resolution, ratio, count, set, dryRun, confirm, idempotencyKey, maxCredits, projectId, downloadPath, intervalMs, timeoutMs,
|
|
27
|
+
];
|
|
28
|
+
export const imageParams = [
|
|
29
|
+
modelId, prompt,
|
|
30
|
+
{ name: 'imageUrl', kind: 'string', flag: '--image', placeholder: '<imageUrl>', describe: text('Reference image URL, only if the catalog declares it', '参考图地址,仅当目录声明了该字段') },
|
|
31
|
+
{ ...resolution, aliases: undefined }, ratio,
|
|
32
|
+
{ name: 'size', kind: 'string', flag: '--size', placeholder: '<size>', describe: text('Legacy size, only for models whose catalog schema declares size', '旧版尺寸参数,仅用于目录声明了 size 的模型') },
|
|
33
|
+
count, set, dryRun, confirm, idempotencyKey, maxCredits, projectId, downloadPath, intervalMs, timeoutMs,
|
|
34
|
+
];
|
|
35
|
+
export const chatParams = [
|
|
36
|
+
{ ...modelId, required: false, default: 'qwen3.7-flash', describe: text('Model ID (e.g. qwen3.7-flash, qwen3.8-max, grok-4.6)', '模型 ID(例如 qwen3.7-flash、qwen3.8-max、grok-4.6)') },
|
|
37
|
+
{ ...prompt, describe: text('User message to send to the model', '发送给模型的用户消息') },
|
|
38
|
+
{ name: 'systemPrompt', kind: 'string', flag: '--system-prompt', placeholder: '<prompt>', describe: text('Optional system instruction; a blank one is not sent', '可选的系统指令;空白时不发送') },
|
|
39
|
+
{ ...maxCredits, describe: text('Reject before inference if the required reservation exceeds this spending cap (non-negative integer)', '所需预授权超过该花费上限时在推理前拒绝(非负整数)') },
|
|
40
|
+
{ ...idempotencyKey, describe: text('Reuse only for an identical request; after a timeout, retry the identical request with the key that was reported', '仅为同一次相同请求复用;超时后用结果里报告的键原样重试') },
|
|
41
|
+
];
|
|
42
|
+
export const waitParams = [intervalMs, timeoutMs];
|
|
43
|
+
/** `tasks resume <key>` / `lumenkey_resume_submission`: the key plus wait and output options; no generation argument. */
|
|
44
|
+
export const resumeParams = [
|
|
45
|
+
{ ...idempotencyKey, required: true, only: 'mcp', describe: text('The idempotency key of the recorded submission to re-send verbatim', '要原样重发的已记录提交的幂等键') },
|
|
46
|
+
downloadPath, intervalMs, timeoutMs,
|
|
47
|
+
];
|
|
48
|
+
export function forSurface(spec, surface) {
|
|
49
|
+
return spec.filter(param => param.only === undefined || param.only === surface);
|
|
50
|
+
}
|
|
51
|
+
/** CAC option key for a flag: `--aspect-ratio` → `aspectRatio`. */
|
|
52
|
+
export function cacKey(flag) {
|
|
53
|
+
return flag.replace(/^-+/, '').replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
|
|
54
|
+
}
|
|
55
|
+
/** `[flags, description, config]` triples for `cli.option(...)`. */
|
|
56
|
+
export function cacOptions(spec) {
|
|
57
|
+
return forSurface(spec, 'cli').filter(param => param.flag).map(param => {
|
|
58
|
+
const names = [...(param.aliases ?? []).filter(alias => alias.startsWith('-') && !alias.startsWith('--')), param.flag, ...(param.aliases ?? []).filter(alias => alias.startsWith('--'))];
|
|
59
|
+
const flags = param.kind === 'boolean' ? names.join(', ') : `${names.join(', ')} ${param.placeholder ?? '<value>'}`;
|
|
60
|
+
// CLI wait options are entered in seconds; the canonical unit is milliseconds.
|
|
61
|
+
const defaultValue = param.default === undefined ? undefined : param.name === 'intervalMs' || param.name === 'timeoutMs' ? param.default / 1000 : param.default;
|
|
62
|
+
return [flags, ui(param.describe.en, param.describe.zh), defaultValue === undefined ? undefined : { default: defaultValue }];
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/** CLI spellings of a parameter, for raw-argv reads (`--aspect-ratio`, `--ratio`, `-m`...). */
|
|
66
|
+
export function cliSpellings(param) {
|
|
67
|
+
return [param.flag, ...(param.aliases ?? [])];
|
|
68
|
+
}
|
|
69
|
+
function numberField(constraint) {
|
|
70
|
+
if (constraint === 'integer-nonnegative')
|
|
71
|
+
return z.number().int().nonnegative();
|
|
72
|
+
if (constraint === 'positive')
|
|
73
|
+
return z.number().positive();
|
|
74
|
+
if (constraint === 'nonnegative')
|
|
75
|
+
return z.number().nonnegative();
|
|
76
|
+
return z.number();
|
|
77
|
+
}
|
|
78
|
+
/** Zod shape for an MCP tool from the same specification: required fields stay required, numeric constraints are advertised. */
|
|
79
|
+
export function zodShape(spec) {
|
|
80
|
+
const shape = {};
|
|
81
|
+
for (const param of forSurface(spec, 'mcp')) {
|
|
82
|
+
let field = param.kind === 'string' ? z.string()
|
|
83
|
+
: param.kind === 'number' ? numberField(param.constraint)
|
|
84
|
+
: param.kind === 'numeric' ? z.union([z.number(), z.string()])
|
|
85
|
+
: param.kind === 'boolean' ? z.boolean()
|
|
86
|
+
: z.union([z.string(), z.array(z.string())]);
|
|
87
|
+
if (param.default !== undefined)
|
|
88
|
+
field = field.default(param.default);
|
|
89
|
+
else if (!param.required)
|
|
90
|
+
field = field.optional();
|
|
91
|
+
shape[param.name] = field.describe(ui(param.describe.en, param.describe.zh));
|
|
92
|
+
}
|
|
93
|
+
return shape;
|
|
94
|
+
}
|
|
95
|
+
/** Collect canonical arguments from CAC's parsed options (camelCase of every CLI spelling). */
|
|
96
|
+
export function argsFromCac(spec, options) {
|
|
97
|
+
const args = {};
|
|
98
|
+
for (const param of forSurface(spec, 'cli')) {
|
|
99
|
+
if (!param.flag)
|
|
100
|
+
continue;
|
|
101
|
+
for (const spelling of cliSpellings(param).filter(s => s.startsWith('--'))) {
|
|
102
|
+
const value = options[cacKey(spelling)];
|
|
103
|
+
if (value !== undefined && args[param.name] === undefined)
|
|
104
|
+
args[param.name] = value;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return args;
|
|
108
|
+
}
|
|
109
|
+
// --- validation in core: one code per condition, both surfaces -------------------------------------------------------
|
|
110
|
+
function str(value) {
|
|
111
|
+
return value === undefined || value === null ? undefined : String(value);
|
|
112
|
+
}
|
|
113
|
+
function requiredPrompt(value) {
|
|
114
|
+
if (typeof value !== 'string' || isBlankPrompt(value))
|
|
115
|
+
throw new LumenKeyError('INPUT_INVALID', undefined, undefined, promptRequiredSentence());
|
|
116
|
+
return value;
|
|
117
|
+
}
|
|
118
|
+
/** Wait options: the CLI counts seconds, MCP milliseconds; both end as milliseconds and the same code. */
|
|
119
|
+
export function waitMs(value, surface, fallbackMs) {
|
|
120
|
+
if (value === undefined || value === null || value === '')
|
|
121
|
+
return fallbackMs;
|
|
122
|
+
const number = typeof value === 'number' ? value : typeof value === 'string' && value.trim() !== '' ? Number(value) : Number.NaN;
|
|
123
|
+
if (!Number.isFinite(number))
|
|
124
|
+
throw new LumenKeyError('WAIT_OPTIONS_INVALID');
|
|
125
|
+
return surface === 'cli' ? number * 1000 : number;
|
|
126
|
+
}
|
|
127
|
+
function shortIntervalWarning(intervalMs, surface) {
|
|
128
|
+
if (surface === 'cli' && intervalMs > 0 && intervalMs < 1000) {
|
|
129
|
+
process.stderr.write(ui('Warning [POLL_INTERVAL_SHORT]: --interval uses seconds. Values below 1 second may cause excessive polling; consider --interval 5.\n', '警告 [POLL_INTERVAL_SHORT]:--interval 单位为秒。小于 1 秒可能导致过于频繁的查询;建议使用 --interval 5。\n'));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function countValue(value) {
|
|
133
|
+
if (value === undefined || value === null || value === '')
|
|
134
|
+
return undefined;
|
|
135
|
+
const number = typeof value === 'number' ? value : typeof value === 'string' && value.trim() !== '' ? Number(value) : Number.NaN;
|
|
136
|
+
if (Number.isFinite(number) && number < 1)
|
|
137
|
+
throw modelParameterError('MODEL_PARAM_INVALID', 'count');
|
|
138
|
+
return value;
|
|
139
|
+
}
|
|
140
|
+
function capLabel(surface) {
|
|
141
|
+
return surface === 'cli' ? '--max-credits' : 'maxCredits';
|
|
142
|
+
}
|
|
143
|
+
/** From raw per-surface values to one validated request; wording never names the other surface's option. */
|
|
144
|
+
export function generationArgs(kind, raw, surface) {
|
|
145
|
+
try {
|
|
146
|
+
return normalizeGeneration(kind, raw, surface);
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
throw nothingSentIfConfirmed(error, raw);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/** A confirm was requested, so the outcome must still say what happened to the submission: nothing was sent. Used by both surfaces' argument paths. */
|
|
153
|
+
export function nothingSentIfConfirmed(error, raw) {
|
|
154
|
+
if (raw && typeof raw === 'object' && raw.confirm && error instanceof Error)
|
|
155
|
+
Object.assign(error, { submission: 'none' });
|
|
156
|
+
return error;
|
|
157
|
+
}
|
|
158
|
+
function normalizeGeneration(kind, raw, surface) {
|
|
159
|
+
const model = str(raw.modelId)?.trim();
|
|
160
|
+
if (!model)
|
|
161
|
+
throw new LumenKeyError('MODEL_REQUIRED');
|
|
162
|
+
const promptText = requiredPrompt(raw.prompt);
|
|
163
|
+
let duration;
|
|
164
|
+
if (raw.duration !== undefined && raw.duration !== null && raw.duration !== '') {
|
|
165
|
+
duration = typeof raw.duration === 'number' ? raw.duration : Number(raw.duration);
|
|
166
|
+
if (!Number.isFinite(duration))
|
|
167
|
+
throw new LumenKeyError('VIDEO_DURATION_INVALID');
|
|
168
|
+
}
|
|
169
|
+
const intervalMs = waitMs(raw.intervalMs, surface, 5000);
|
|
170
|
+
const timeoutMs = waitMs(raw.timeoutMs, surface, 1_800_000);
|
|
171
|
+
shortIntervalWarning(intervalMs, surface);
|
|
172
|
+
const fields = {
|
|
173
|
+
prompt: promptText,
|
|
174
|
+
...(kind === 'video' ? { duration } : {}),
|
|
175
|
+
resolution: str(raw.resolution),
|
|
176
|
+
ratio: str(raw.ratio),
|
|
177
|
+
image: str(raw.imageUrl),
|
|
178
|
+
// `count` reaches the catalog coercion as given (number or string) so both surfaces get the catalog's verdict;
|
|
179
|
+
// a count below one is never a valid number of outputs, whatever the catalog says.
|
|
180
|
+
count: countValue(raw.count),
|
|
181
|
+
...(kind === 'image' ? { size: str(raw.size) } : {}),
|
|
182
|
+
};
|
|
183
|
+
return {
|
|
184
|
+
kind, modelId: model, fields, pairs: asPairs(raw.set),
|
|
185
|
+
dryRun: Boolean(raw.dryRun), confirm: Boolean(raw.confirm),
|
|
186
|
+
idempotencyKey: raw.idempotencyKey === undefined ? undefined : String(raw.idempotencyKey),
|
|
187
|
+
maxCredits: parseCreditCap(raw.maxCredits, capLabel(surface)), capLabel: capLabel(surface),
|
|
188
|
+
projectId: str(raw.projectId) || undefined,
|
|
189
|
+
outputPath: str(raw.downloadPath), outputPathPolicy: (surface === 'cli' ? 'resolve-cwd' : 'absolute-only'),
|
|
190
|
+
intervalMs, timeoutMs,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
export function chatArgs(raw, surface) {
|
|
194
|
+
// An absent model falls back to the default; a model that was given but is blank is a mistake, not a request for the default.
|
|
195
|
+
let model;
|
|
196
|
+
if (raw.modelId === undefined || raw.modelId === null)
|
|
197
|
+
model = 'qwen3.7-flash';
|
|
198
|
+
else {
|
|
199
|
+
model = String(raw.modelId).trim();
|
|
200
|
+
if (!model)
|
|
201
|
+
throw new LumenKeyError('MODEL_REQUIRED');
|
|
202
|
+
}
|
|
203
|
+
const promptText = requiredPrompt(raw.prompt);
|
|
204
|
+
// A blank system prompt is not a system message; neither surface sends one.
|
|
205
|
+
const system = typeof raw.systemPrompt === 'string' && !isBlankPrompt(raw.systemPrompt) ? raw.systemPrompt : undefined;
|
|
206
|
+
return {
|
|
207
|
+
modelId: model, prompt: promptText, systemPrompt: system,
|
|
208
|
+
maxCredits: parseCreditCap(raw.maxCredits, capLabel(surface), 'CHAT_CREDIT_LIMIT_INVALID'),
|
|
209
|
+
idempotencyKey: raw.idempotencyKey === undefined ? undefined : String(raw.idempotencyKey),
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
export function waitArgs(raw, surface) {
|
|
213
|
+
const intervalMs = waitMs(raw.intervalMs, surface, 5000);
|
|
214
|
+
shortIntervalWarning(intervalMs, surface);
|
|
215
|
+
return { intervalMs, timeoutMs: waitMs(raw.timeoutMs, surface, 1_800_000) };
|
|
216
|
+
}
|
|
217
|
+
export function resumeArgs(raw, surface) {
|
|
218
|
+
const key = str(raw.idempotencyKey);
|
|
219
|
+
if (!key)
|
|
220
|
+
throw new LumenKeyError('IDEMPOTENCY_KEY_REQUIRED');
|
|
221
|
+
return {
|
|
222
|
+
idempotencyKey: key,
|
|
223
|
+
...waitArgs(raw, surface),
|
|
224
|
+
outputPath: str(raw.downloadPath), outputPathPolicy: (surface === 'cli' ? 'resolve-cwd' : 'absolute-only'),
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=params.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"params.js","sourceRoot":"","sources":["../../src/core/params.ts"],"names":[],"mappings":"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"}
|
package/dist/core/poller.d.ts
CHANGED
|
@@ -8,9 +8,12 @@ export interface PollOptions {
|
|
|
8
8
|
onProgress?: (detail: GenerationJobDetail) => void;
|
|
9
9
|
signal?: AbortSignal;
|
|
10
10
|
}
|
|
11
|
+
/** A terminal job without a usable result. Carries the job detail so every surface can show the same task record. */
|
|
11
12
|
export declare class JobFailureError extends LumenKeyError {
|
|
12
13
|
readonly jobStatus?: string | undefined;
|
|
13
|
-
|
|
14
|
+
readonly job?: GenerationJobDetail | undefined;
|
|
15
|
+
readonly jobId?: string;
|
|
16
|
+
constructor(code: string, message?: unknown, jobStatus?: string | undefined, job?: GenerationJobDetail | undefined);
|
|
14
17
|
}
|
|
15
18
|
export declare function assertJobResult(detail: GenerationJobDetail, requireOutput?: boolean): void;
|
|
16
19
|
export declare function pollJob(client: LumenKeyClient, jobId: string, options?: PollOptions): Promise<GenerationJobDetail>;
|
|
@@ -18,6 +21,8 @@ export declare class WaitInterruptedError extends LumenKeyError {
|
|
|
18
21
|
readonly jobId: string;
|
|
19
22
|
constructor(jobId: string);
|
|
20
23
|
}
|
|
24
|
+
/** Validate waiting parameters before anything billable happens; runPolling applies the same rule. */
|
|
25
|
+
export declare function assertWaitOptions(intervalMs?: number, timeoutMs?: number): void;
|
|
21
26
|
export declare function runPolling(client: LumenKeyClient, jobId: string, options?: {
|
|
22
27
|
intervalMs?: number;
|
|
23
28
|
timeoutMs?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poller.d.ts","sourceRoot":"","sources":["../../src/core/poller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,aAAa,EAAsB,MAAM,aAAa,CAAC;AAEhE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,WAAW,WAAW;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACnD,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAID,qBAAa,eAAgB,SAAQ,aAAa;
|
|
1
|
+
{"version":3,"file":"poller.d.ts","sourceRoot":"","sources":["../../src/core/poller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,aAAa,EAAsB,MAAM,aAAa,CAAC;AAEhE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,WAAW,WAAW;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACnD,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAID,qHAAqH;AACrH,qBAAa,eAAgB,SAAQ,aAAa;aAEa,SAAS,CAAC,EAAE,MAAM;aAAkB,GAAG,CAAC,EAAE,mBAAmB;IAD1H,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;gBACZ,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAkB,SAAS,CAAC,EAAE,MAAM,YAAA,EAAkB,GAAG,CAAC,EAAE,mBAAmB,YAAA;CAU3H;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,mBAAmB,EAAE,aAAa,UAAQ,GAAG,IAAI,CAUxF;AAED,wBAAsB,OAAO,CAC3B,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,mBAAmB,CAAC,CAG9B;AAED,qBAAa,oBAAqB,SAAQ,aAAa;aACzB,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM;CAC1C;AAED,sGAAsG;AACtG,wBAAgB,iBAAiB,CAAC,UAAU,SAAO,EAAE,SAAS,SAAY,GAAG,IAAI,CAGhF;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9D,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CACxE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAiDpC;AAED,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/core/poller.js
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import { LumenKeyError, redactPublicDetail } from './client.js';
|
|
2
|
-
import { errorSentence, hasErrorSentence, waitTimeoutDetail } from './locale.js';
|
|
2
|
+
import { errorSentence, hasErrorSentence, waitInterruptedDetail, waitTimeoutDetail } from './locale.js';
|
|
3
3
|
const TERMINAL_STATES = new Set(['succeeded', 'rejected', 'failed', 'cancelled', 'expired']);
|
|
4
|
+
/** A terminal job without a usable result. Carries the job detail so every surface can show the same task record. */
|
|
4
5
|
export class JobFailureError extends LumenKeyError {
|
|
5
6
|
jobStatus;
|
|
6
|
-
|
|
7
|
+
job;
|
|
8
|
+
jobId;
|
|
9
|
+
constructor(code, message, jobStatus, job) {
|
|
7
10
|
super(code);
|
|
8
11
|
this.jobStatus = jobStatus;
|
|
12
|
+
this.job = job;
|
|
9
13
|
this.name = 'JobFailureError';
|
|
14
|
+
this.jobId = job?.jobId;
|
|
10
15
|
if (!hasErrorSentence(code)) {
|
|
11
16
|
const short = redactPublicDetail(message);
|
|
12
17
|
this.publicMessage = short || errorSentence('JOB_TERMINAL_FAILURE');
|
|
@@ -19,10 +24,10 @@ export function assertJobResult(detail, requireOutput = false) {
|
|
|
19
24
|
const error = typeof detail.error === 'object' && detail.error ? detail.error : {};
|
|
20
25
|
const code = typeof error.code === 'string' && (/^[a-z][a-z0-9_]{0,63}$/.test(error.code) || /^[A-Z][A-Z0-9_]{0,79}$/.test(error.code))
|
|
21
26
|
? error.code : detail.status === 'cancelled' ? 'JOB_CANCELLED' : detail.status === 'expired' ? 'JOB_EXPIRED' : 'JOB_TERMINAL_FAILURE';
|
|
22
|
-
throw new JobFailureError(code, error.message, detail.status);
|
|
27
|
+
throw new JobFailureError(code, error.message, detail.status, detail);
|
|
23
28
|
}
|
|
24
29
|
if (requireOutput && (typeof detail.outputs?.[0]?.url !== 'string' || !detail.outputs[0].url.trim())) {
|
|
25
|
-
throw new JobFailureError('JOB_OUTPUT_MISSING', undefined, detail.status);
|
|
30
|
+
throw new JobFailureError('JOB_OUTPUT_MISSING', undefined, detail.status, detail);
|
|
26
31
|
}
|
|
27
32
|
}
|
|
28
33
|
export async function pollJob(client, jobId, options = {}) {
|
|
@@ -33,15 +38,19 @@ export async function pollJob(client, jobId, options = {}) {
|
|
|
33
38
|
export class WaitInterruptedError extends LumenKeyError {
|
|
34
39
|
jobId;
|
|
35
40
|
constructor(jobId) {
|
|
36
|
-
super('WAIT_INTERRUPTED');
|
|
41
|
+
super('WAIT_INTERRUPTED', undefined, undefined, waitInterruptedDetail(jobId));
|
|
37
42
|
this.jobId = jobId;
|
|
38
43
|
}
|
|
39
44
|
}
|
|
40
|
-
|
|
41
|
-
|
|
45
|
+
/** Validate waiting parameters before anything billable happens; runPolling applies the same rule. */
|
|
46
|
+
export function assertWaitOptions(intervalMs = 5000, timeoutMs = 1_800_000) {
|
|
42
47
|
if (!Number.isFinite(intervalMs) || intervalMs <= 0 || intervalMs > 2_147_483_647
|
|
43
48
|
|| !Number.isFinite(timeoutMs) || timeoutMs < 0 || timeoutMs > Number.MAX_SAFE_INTEGER - Date.now())
|
|
44
49
|
throw new LumenKeyError('WAIT_OPTIONS_INVALID');
|
|
50
|
+
}
|
|
51
|
+
export async function runPolling(client, jobId, options = {}) {
|
|
52
|
+
const { intervalMs = 5000, timeoutMs = 1_800_000, signal, onProgress } = options;
|
|
53
|
+
assertWaitOptions(intervalMs, timeoutMs);
|
|
45
54
|
const interrupted = () => new WaitInterruptedError(jobId);
|
|
46
55
|
const sleep = (ms) => new Promise((resolve, reject) => {
|
|
47
56
|
if (signal?.aborted) {
|
|
@@ -59,7 +68,7 @@ export async function runPolling(client, jobId, options = {}) {
|
|
|
59
68
|
if (signal?.aborted)
|
|
60
69
|
throw interrupted();
|
|
61
70
|
if (!first && Date.now() - startTime >= timeoutMs) {
|
|
62
|
-
throw new LumenKeyError('WAIT_TIMEOUT', undefined, undefined, waitTimeoutDetail(jobId, timeoutMs));
|
|
71
|
+
throw Object.assign(new LumenKeyError('WAIT_TIMEOUT', undefined, undefined, waitTimeoutDetail(jobId, timeoutMs)), { jobId });
|
|
63
72
|
}
|
|
64
73
|
first = false;
|
|
65
74
|
let detail;
|
package/dist/core/poller.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"poller.js","sourceRoot":"","sources":["../../src/core/poller.ts"],"names":[],"mappings":"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"}
|
package/dist/core/profiles.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { LumenKeyError } from './client.js';
|
|
2
|
+
/** Profiles failure on the shared error root: `message` stays the stable sentence, `detail` carries the path or reason. */
|
|
3
|
+
export declare class ProfileError extends LumenKeyError {
|
|
4
|
+
readonly detail: string;
|
|
3
5
|
constructor(code: 'PROFILE_INVALID' | 'PROFILE_UNREADABLE' | 'PROFILE_MISSING', reason: string);
|
|
4
6
|
}
|
|
5
7
|
export declare class ProfileMissingError extends ProfileError {
|
|
@@ -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":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAY5C,2HAA2H;AAC3H,qBAAa,YAAa,SAAQ,aAAa;IAC7C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBACZ,IAAI,EAAE,iBAAiB,GAAG,oBAAoB,GAAG,iBAAiB,EAAE,MAAM,EAAE,MAAM;CAM/F;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
|
@@ -2,14 +2,25 @@ import fs from 'node:fs';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import os from 'node:os';
|
|
4
4
|
import { errorSentence, ui } from './locale.js';
|
|
5
|
+
import { LumenKeyError } from './client.js';
|
|
5
6
|
import { assertConfigDirReadable } from './config-dir.js';
|
|
6
|
-
import { assertSafeConfigFile, writeAtomicConfigFile } from './atomic-config-file.js';
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
import { assertSafeConfigFile, classifyConfigFailure, UnsafeConfigPathError, writeAtomicConfigFile } from './atomic-config-file.js';
|
|
8
|
+
import { ConfigError } from './config-error.js';
|
|
9
|
+
/** Links and non-regular files get the same stable codes as config.json; other read/write faults keep the profiles codes. */
|
|
10
|
+
function pathFailure(error, target) {
|
|
11
|
+
if (!(error instanceof UnsafeConfigPathError))
|
|
12
|
+
return undefined;
|
|
13
|
+
const { code, reason } = classifyConfigFailure(error);
|
|
14
|
+
return new ConfigError(code, target, reason);
|
|
15
|
+
}
|
|
16
|
+
/** Profiles failure on the shared error root: `message` stays the stable sentence, `detail` carries the path or reason. */
|
|
17
|
+
export class ProfileError extends LumenKeyError {
|
|
18
|
+
detail;
|
|
9
19
|
constructor(code, reason) {
|
|
10
|
-
super(
|
|
11
|
-
this.
|
|
12
|
-
this.
|
|
20
|
+
super(code);
|
|
21
|
+
this.name = 'ProfileError';
|
|
22
|
+
this.detail = reason;
|
|
23
|
+
this.message = `${errorSentence(code)} (${code}) ${reason}`;
|
|
13
24
|
}
|
|
14
25
|
}
|
|
15
26
|
export class ProfileMissingError extends ProfileError {
|
|
@@ -33,7 +44,7 @@ function read(home = os.homedir()) {
|
|
|
33
44
|
catch (error) {
|
|
34
45
|
if (error instanceof ProfileError)
|
|
35
46
|
throw error;
|
|
36
|
-
throw new ProfileError(error instanceof SyntaxError ? 'PROFILE_INVALID' : 'PROFILE_UNREADABLE', target);
|
|
47
|
+
throw pathFailure(error, target) ?? new ProfileError(error instanceof SyntaxError ? 'PROFILE_INVALID' : 'PROFILE_UNREADABLE', target);
|
|
37
48
|
}
|
|
38
49
|
}
|
|
39
50
|
function object(value) {
|
|
@@ -69,8 +80,8 @@ function write(data, home = os.homedir()) {
|
|
|
69
80
|
try {
|
|
70
81
|
writeAtomicConfigFile(target, data);
|
|
71
82
|
}
|
|
72
|
-
catch {
|
|
73
|
-
throw new ProfileError('PROFILE_UNREADABLE', target);
|
|
83
|
+
catch (error) {
|
|
84
|
+
throw pathFailure(error, target) ?? new ProfileError('PROFILE_UNREADABLE', target);
|
|
74
85
|
}
|
|
75
86
|
}
|
|
76
87
|
export function currentProfile(home = os.homedir()) {
|
|
@@ -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,aAAa,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/core/profiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { type SenderIdentity } from './client.js';
|
|
2
|
+
/**
|
|
3
|
+
* Lifecycle of a recorded submission. `in-flight`: written just before the POST by the process
|
|
4
|
+
* that owns it; it may still be running, or it may have been killed. `unknown`: that process saw
|
|
5
|
+
* the POST end without a well-formed answer. Keyless resume takes `unknown` records, and
|
|
6
|
+
* `in-flight` records from this host whose owner process no longer exists; an `in-flight` record
|
|
7
|
+
* with a live owner is a concurrent, legitimate parallel run and is left alone (with a notice).
|
|
8
|
+
*/
|
|
9
|
+
export type PendingState = 'in-flight' | 'unknown';
|
|
10
|
+
/**
|
|
11
|
+
* The exact job submission that is about to be POSTed. The gateway fingerprints
|
|
12
|
+
* { quoteId, projectId, input } under the Idempotency-Key for 24 hours, so a same-key
|
|
13
|
+
* retry only replays when this body is re-sent unchanged. The sender identity binds the record to
|
|
14
|
+
* the account and gateway that created it. `pid`/`hostname` identify the owning process so a
|
|
15
|
+
* killed owner can be told apart from a concurrent one. `kind` lets a verbatim resume render the
|
|
16
|
+
* result like the original command did. Never contains the API key — only its SHA-256, which adds
|
|
17
|
+
* no exposure next to the config file holding the key. The stored fields are trusted at the level
|
|
18
|
+
* of config.json (same directory, same permissions); a hand-edited record can only redirect the
|
|
19
|
+
* editor's own next identical confirm.
|
|
20
|
+
*/
|
|
21
|
+
export interface PendingSubmission {
|
|
22
|
+
origin: string;
|
|
23
|
+
keyFingerprint: string;
|
|
24
|
+
idempotencyKey: string;
|
|
25
|
+
quoteId: string;
|
|
26
|
+
projectId: string;
|
|
27
|
+
kind: 'video' | 'image';
|
|
28
|
+
modelId: string;
|
|
29
|
+
input: Record<string, unknown>;
|
|
30
|
+
/** Local-only pre-default projection. Absent on pre-expansion records; wire input above remains authoritative. */
|
|
31
|
+
callerInput?: Record<string, unknown>;
|
|
32
|
+
credits: number;
|
|
33
|
+
createdAt: string;
|
|
34
|
+
state: PendingState;
|
|
35
|
+
pid: number;
|
|
36
|
+
hostname: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Local windows versus the gateway's 24-hour idempotency record. A record is resumable for 23 h:
|
|
40
|
+
* past that, the gateway may already have dropped its record, so a replay could fall through to
|
|
41
|
+
* the create step and be misread as "never created". Expired records are kept until 48 h so they
|
|
42
|
+
* can still be reported, then swept.
|
|
43
|
+
*/
|
|
44
|
+
export declare const RESUMABLE_WINDOW_MS: number;
|
|
45
|
+
export declare const RETENTION_MS: number;
|
|
46
|
+
/** Key-order-independent JSON; the server compares the parsed body, not the bytes. */
|
|
47
|
+
export declare function canonical(value: unknown): string;
|
|
48
|
+
/** `LUMENKEY_JOURNAL_DIR` relocates the records (locked-down HOME); the default is ~/.lumenkey/pending-submissions. */
|
|
49
|
+
export declare function journalDir(home?: string): string;
|
|
50
|
+
export declare function ageMs(entry: PendingSubmission, now?: number): number;
|
|
51
|
+
/** Past the resumable window: never re-sent, never settled; reported until retention ends. */
|
|
52
|
+
export declare function isExpired(entry: PendingSubmission, now?: number): boolean;
|
|
53
|
+
export declare function ageText(entry: PendingSubmission): string;
|
|
54
|
+
/**
|
|
55
|
+
* Prove the journal can be written before anything billable happens, so a refused submission
|
|
56
|
+
* never leaves an orphaned quote behind. The sentence may say "no job was submitted" because
|
|
57
|
+
* nothing has been sent yet. A directory supplied through LUMENKEY_JOURNAL_DIR is created 0700
|
|
58
|
+
* when absent and otherwise left exactly as it is.
|
|
59
|
+
*/
|
|
60
|
+
export declare function assertJournalWritable(home?: string): void;
|
|
61
|
+
/** Write before the POST. Any failure here must stop the submission: a job without a record cannot be recovered. */
|
|
62
|
+
export declare function rememberPendingSubmission(entry: Omit<PendingSubmission, 'state' | 'pid' | 'hostname'>, home?: string): void;
|
|
63
|
+
/**
|
|
64
|
+
* The owning process saw the POST end without a well-formed answer: the record becomes resumable.
|
|
65
|
+
* Never routes through expiry: the owner's own mark must not delete its record. Returns the record
|
|
66
|
+
* as marked (so the caller can judge its age), or undefined when it is gone.
|
|
67
|
+
*/
|
|
68
|
+
export declare function markPendingSubmissionUnknown(idempotencyKey: string, home?: string): PendingSubmission | undefined;
|
|
69
|
+
/**
|
|
70
|
+
* A definite outcome ends the record — but only the record of the quote this process sent.
|
|
71
|
+
* Another process may own a record under the same explicit key (its own quote); compare, then unlink.
|
|
72
|
+
*/
|
|
73
|
+
export declare function forgetPendingSubmission(idempotencyKey: string, quoteId: string, home?: string): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* The record for a key. Past retention the record is removed and `discarded` says so, so the caller
|
|
76
|
+
* can tell the user an earlier submission under this key can no longer be verified.
|
|
77
|
+
*/
|
|
78
|
+
export declare function takePendingSubmission(idempotencyKey: string, home?: string): {
|
|
79
|
+
record?: PendingSubmission;
|
|
80
|
+
discarded?: PendingSubmission;
|
|
81
|
+
};
|
|
82
|
+
/** The record for a key, or undefined when none exists or it is past retention (then it is removed). */
|
|
83
|
+
export declare function readPendingSubmission(idempotencyKey: string, home?: string): PendingSubmission | undefined;
|
|
84
|
+
/** Same account and same gateway as the record was created with. */
|
|
85
|
+
export declare function sameSender(entry: PendingSubmission, identity: SenderIdentity): boolean;
|
|
86
|
+
/** A body changed by client/catalog default expansion must not become a second paid submission. */
|
|
87
|
+
export declare function isInputPolicyConflict(entry: PendingSubmission, input: Record<string, unknown>, callerInput: Record<string, unknown>, defaults: Record<string, unknown>, legacyCallerInput?: Record<string, unknown>): boolean;
|
|
88
|
+
/** Before lookup: retain the replay guard for 23h, then report expiry; sweep after 48h. */
|
|
89
|
+
export declare function findInputPolicyConflict(identity: SenderIdentity, modelId: string, input: Record<string, unknown>, callerInput: Record<string, unknown>, defaults: Record<string, unknown>, home?: string, legacyCallerInput?: Record<string, unknown>): PendingSubmission | undefined;
|
|
90
|
+
export declare function processAlive(pid: number): boolean;
|
|
91
|
+
export interface ResumeLookup {
|
|
92
|
+
record?: PendingSubmission;
|
|
93
|
+
/** Human-readable facts about records that were seen but not resumed; shown on both surfaces. */
|
|
94
|
+
notices: string[];
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* The oldest resumable record for exactly this sender, model and input. Resumable: state `unknown`,
|
|
98
|
+
* or `in-flight` from this host whose owner process no longer exists (killed before it could mark
|
|
99
|
+
* the record). Everything else that is pending for this sender and model is reported, never
|
|
100
|
+
* silently skipped: an in-flight record with a live owner on this host (a concurrent run), one from
|
|
101
|
+
* another host, an expired record, an `unknown` record for the same model with a *different* input
|
|
102
|
+
* (catalog drift or a changed argument), and damaged files. Records of other accounts or gateways
|
|
103
|
+
* are invisible here.
|
|
104
|
+
*/
|
|
105
|
+
export declare function findResumablePendingSubmission(identity: SenderIdentity, modelId: string, canonicalInput: string, home?: string): ResumeLookup;
|
|
106
|
+
//# sourceMappingURL=submission-journal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submission-journal.d.ts","sourceRoot":"","sources":["../../src/core/submission-journal.ts"],"names":[],"mappings":"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"}
|