@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
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import crypto from 'node:crypto';
|
|
5
|
+
import { assertIdempotencyKey, LumenKeyError } from './client.js';
|
|
6
|
+
import { errorSentence, ui } from './locale.js';
|
|
7
|
+
import { assertConfigDirReadable } from './config-dir.js';
|
|
8
|
+
import { assertSafeConfigFile, ensurePrivateConfigDirectory, writeAtomicConfigFile } from './atomic-config-file.js';
|
|
9
|
+
/**
|
|
10
|
+
* Local windows versus the gateway's 24-hour idempotency record. A record is resumable for 23 h:
|
|
11
|
+
* past that, the gateway may already have dropped its record, so a replay could fall through to
|
|
12
|
+
* the create step and be misread as "never created". Expired records are kept until 48 h so they
|
|
13
|
+
* can still be reported, then swept.
|
|
14
|
+
*/
|
|
15
|
+
export const RESUMABLE_WINDOW_MS = 23 * 60 * 60 * 1000;
|
|
16
|
+
export const RETENTION_MS = 48 * 60 * 60 * 1000;
|
|
17
|
+
const ORPHAN_TEMP_MS = 60 * 60 * 1000;
|
|
18
|
+
/** Key-order-independent JSON; the server compares the parsed body, not the bytes. */
|
|
19
|
+
export function canonical(value) {
|
|
20
|
+
if (Array.isArray(value))
|
|
21
|
+
return `[${value.map(canonical).join(',')}]`;
|
|
22
|
+
if (value && typeof value === 'object') {
|
|
23
|
+
return `{${Object.keys(value).sort().map(key => `${JSON.stringify(key)}:${canonical(value[key])}`).join(',')}}`;
|
|
24
|
+
}
|
|
25
|
+
return JSON.stringify(value);
|
|
26
|
+
}
|
|
27
|
+
/** `LUMENKEY_JOURNAL_DIR` relocates the records (locked-down HOME); the default is ~/.lumenkey/pending-submissions. */
|
|
28
|
+
export function journalDir(home = os.homedir()) {
|
|
29
|
+
const override = process.env.LUMENKEY_JOURNAL_DIR?.trim();
|
|
30
|
+
return override ? path.resolve(override) : path.join(home, '.lumenkey', 'pending-submissions');
|
|
31
|
+
}
|
|
32
|
+
function journalDirOverridden() {
|
|
33
|
+
return Boolean(process.env.LUMENKEY_JOURNAL_DIR?.trim());
|
|
34
|
+
}
|
|
35
|
+
function entryPath(idempotencyKey, home) {
|
|
36
|
+
// Keys are arbitrary visible ASCII; hash them so the file name is always safe.
|
|
37
|
+
return path.join(journalDir(home), `${crypto.createHash('sha256').update(idempotencyKey).digest('hex')}.json`);
|
|
38
|
+
}
|
|
39
|
+
function isRecord(value) {
|
|
40
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
41
|
+
}
|
|
42
|
+
function validate(value) {
|
|
43
|
+
if (!isRecord(value) || typeof value.origin !== 'string' || typeof value.keyFingerprint !== 'string' || typeof value.idempotencyKey !== 'string' || typeof value.quoteId !== 'string' || typeof value.projectId !== 'string'
|
|
44
|
+
|| (value.kind !== 'video' && value.kind !== 'image') || typeof value.modelId !== 'string' || !isRecord(value.input)
|
|
45
|
+
|| (value.callerInput !== undefined && !isRecord(value.callerInput)) || typeof value.credits !== 'number' || !Number.isSafeInteger(value.credits)
|
|
46
|
+
|| typeof value.createdAt !== 'string' || !Number.isFinite(Date.parse(value.createdAt)) || (value.state !== 'in-flight' && value.state !== 'unknown')
|
|
47
|
+
|| typeof value.pid !== 'number' || !Number.isSafeInteger(value.pid) || typeof value.hostname !== 'string') {
|
|
48
|
+
throw new LumenKeyError('SUBMISSION_JOURNAL_INVALID');
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
assertIdempotencyKey(value.idempotencyKey);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
throw new LumenKeyError('SUBMISSION_JOURNAL_INVALID');
|
|
55
|
+
}
|
|
56
|
+
return { origin: value.origin, keyFingerprint: value.keyFingerprint, idempotencyKey: value.idempotencyKey, quoteId: value.quoteId, projectId: value.projectId, kind: value.kind, modelId: value.modelId,
|
|
57
|
+
input: value.input, ...(value.callerInput !== undefined ? { callerInput: value.callerInput } : {}), credits: value.credits, createdAt: value.createdAt, state: value.state, pid: value.pid, hostname: value.hostname };
|
|
58
|
+
}
|
|
59
|
+
export function ageMs(entry, now = Date.now()) {
|
|
60
|
+
return now - Date.parse(entry.createdAt);
|
|
61
|
+
}
|
|
62
|
+
/** Past the resumable window: never re-sent, never settled; reported until retention ends. */
|
|
63
|
+
export function isExpired(entry, now = Date.now()) {
|
|
64
|
+
return ageMs(entry, now) >= RESUMABLE_WINDOW_MS;
|
|
65
|
+
}
|
|
66
|
+
function pastRetention(entry, now = Date.now()) {
|
|
67
|
+
return ageMs(entry, now) >= RETENTION_MS;
|
|
68
|
+
}
|
|
69
|
+
export function ageText(entry) {
|
|
70
|
+
const hours = Math.floor(ageMs(entry) / 3600000);
|
|
71
|
+
return hours >= 1 ? ui(`${hours} hours ago`, `${hours} 小时前`) : ui(`${Math.max(1, Math.floor(ageMs(entry) / 60000))} minutes ago`, `${Math.max(1, Math.floor(ageMs(entry) / 60000))} 分钟前`);
|
|
72
|
+
}
|
|
73
|
+
function journalError(code, file, error, detail) {
|
|
74
|
+
return Object.assign(new LumenKeyError(code, undefined, undefined, detail), { path: file, cause: error });
|
|
75
|
+
}
|
|
76
|
+
function reasonOf(error) {
|
|
77
|
+
return error?.code ?? (error instanceof Error ? error.message : String(error));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Prove the journal can be written before anything billable happens, so a refused submission
|
|
81
|
+
* never leaves an orphaned quote behind. The sentence may say "no job was submitted" because
|
|
82
|
+
* nothing has been sent yet. A directory supplied through LUMENKEY_JOURNAL_DIR is created 0700
|
|
83
|
+
* when absent and otherwise left exactly as it is.
|
|
84
|
+
*/
|
|
85
|
+
export function assertJournalWritable(home) {
|
|
86
|
+
const dir = journalDir(home);
|
|
87
|
+
const probe = path.join(dir, `.probe.${crypto.randomUUID()}.tmp`);
|
|
88
|
+
try {
|
|
89
|
+
ensurePrivateConfigDirectory(dir, { tightenExisting: !journalDirOverridden() });
|
|
90
|
+
fs.writeFileSync(probe, '', { flag: 'wx', mode: 0o600 });
|
|
91
|
+
fs.unlinkSync(probe);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
throw journalError('SUBMISSION_JOURNAL_UNWRITABLE', dir, error, `${errorSentence('SUBMISSION_JOURNAL_UNWRITABLE')} ${ui(`No job was submitted. Directory: ${dir} (${reasonOf(error)}). Set LUMENKEY_JOURNAL_DIR to a writable directory to keep pending records elsewhere.`, `没有提交任务。目录:${dir}(${reasonOf(error)})。可设置 LUMENKEY_JOURNAL_DIR 把待确认记录放到可写目录。`)}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function write(entry, home) {
|
|
98
|
+
const file = entryPath(entry.idempotencyKey, home);
|
|
99
|
+
try {
|
|
100
|
+
ensurePrivateConfigDirectory(path.dirname(file), { tightenExisting: !journalDirOverridden() });
|
|
101
|
+
writeAtomicConfigFile(file, entry);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
throw journalError('SUBMISSION_JOURNAL_UNWRITABLE', file, error, `${errorSentence('SUBMISSION_JOURNAL_UNWRITABLE')} ${ui(`Directory: ${path.dirname(file)} (${reasonOf(error)}).`, `目录:${path.dirname(file)}(${reasonOf(error)})。`)}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** Write before the POST. Any failure here must stop the submission: a job without a record cannot be recovered. */
|
|
108
|
+
export function rememberPendingSubmission(entry, home) {
|
|
109
|
+
try {
|
|
110
|
+
write({ ...entry, state: 'in-flight', pid: process.pid, hostname: os.hostname() }, home);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
if (error instanceof LumenKeyError)
|
|
114
|
+
error.publicMessage = `${error.publicMessage} ${ui('No job was submitted.', '没有提交任务。')}`;
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
sweep(home);
|
|
118
|
+
}
|
|
119
|
+
/** Read a record by key without any expiry side effect. */
|
|
120
|
+
function readRaw(idempotencyKey, home) {
|
|
121
|
+
const file = entryPath(idempotencyKey, home);
|
|
122
|
+
assertConfigDirReadable(file);
|
|
123
|
+
let entry;
|
|
124
|
+
try {
|
|
125
|
+
assertSafeConfigFile(file);
|
|
126
|
+
if (!fs.existsSync(file))
|
|
127
|
+
return undefined;
|
|
128
|
+
entry = validate(JSON.parse(fs.readFileSync(file, 'utf8')));
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
if (error instanceof LumenKeyError)
|
|
132
|
+
throw Object.assign(error, { path: file });
|
|
133
|
+
throw journalError('SUBMISSION_JOURNAL_INVALID', file, error, errorSentence('SUBMISSION_JOURNAL_INVALID'));
|
|
134
|
+
}
|
|
135
|
+
if (entry.idempotencyKey !== idempotencyKey)
|
|
136
|
+
throw journalError('SUBMISSION_JOURNAL_INVALID', file, undefined, errorSentence('SUBMISSION_JOURNAL_INVALID'));
|
|
137
|
+
return entry;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* The owning process saw the POST end without a well-formed answer: the record becomes resumable.
|
|
141
|
+
* Never routes through expiry: the owner's own mark must not delete its record. Returns the record
|
|
142
|
+
* as marked (so the caller can judge its age), or undefined when it is gone.
|
|
143
|
+
*/
|
|
144
|
+
export function markPendingSubmissionUnknown(idempotencyKey, home) {
|
|
145
|
+
const entry = readRaw(idempotencyKey, home);
|
|
146
|
+
if (!entry)
|
|
147
|
+
return undefined;
|
|
148
|
+
const marked = { ...entry, state: 'unknown' };
|
|
149
|
+
write(marked, home);
|
|
150
|
+
return marked;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* A definite outcome ends the record — but only the record of the quote this process sent.
|
|
154
|
+
* Another process may own a record under the same explicit key (its own quote); compare, then unlink.
|
|
155
|
+
*/
|
|
156
|
+
export function forgetPendingSubmission(idempotencyKey, quoteId, home) {
|
|
157
|
+
const file = entryPath(idempotencyKey, home);
|
|
158
|
+
const entry = readRaw(idempotencyKey, home);
|
|
159
|
+
if (!entry || entry.quoteId !== quoteId)
|
|
160
|
+
return false;
|
|
161
|
+
try {
|
|
162
|
+
fs.unlinkSync(file);
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
if (error.code === 'ENOENT')
|
|
167
|
+
return false;
|
|
168
|
+
throw journalError('SUBMISSION_JOURNAL_UNWRITABLE', file, error, ui(`The pending record ${file} could not be removed (${reasonOf(error)}); it will be swept after 48 hours.`, `待确认记录 ${file} 无法删除(${reasonOf(error)}),将在 48 小时后清理。`));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* The record for a key. Past retention the record is removed and `discarded` says so, so the caller
|
|
173
|
+
* can tell the user an earlier submission under this key can no longer be verified.
|
|
174
|
+
*/
|
|
175
|
+
export function takePendingSubmission(idempotencyKey, home) {
|
|
176
|
+
const entry = readRaw(idempotencyKey, home);
|
|
177
|
+
if (!entry)
|
|
178
|
+
return {};
|
|
179
|
+
if (pastRetention(entry)) {
|
|
180
|
+
try {
|
|
181
|
+
fs.unlinkSync(entryPath(idempotencyKey, home));
|
|
182
|
+
}
|
|
183
|
+
catch { /* best effort */ }
|
|
184
|
+
return { discarded: entry };
|
|
185
|
+
}
|
|
186
|
+
return { record: entry };
|
|
187
|
+
}
|
|
188
|
+
/** The record for a key, or undefined when none exists or it is past retention (then it is removed). */
|
|
189
|
+
export function readPendingSubmission(idempotencyKey, home) {
|
|
190
|
+
return takePendingSubmission(idempotencyKey, home).record;
|
|
191
|
+
}
|
|
192
|
+
function readAll(home) {
|
|
193
|
+
let names;
|
|
194
|
+
try {
|
|
195
|
+
names = fs.readdirSync(journalDir(home));
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
return { entries: [], damaged: [] };
|
|
199
|
+
}
|
|
200
|
+
const entries = [];
|
|
201
|
+
const damaged = [];
|
|
202
|
+
for (const name of names) {
|
|
203
|
+
if (!/^[0-9a-f]{64}\.json$/.test(name))
|
|
204
|
+
continue;
|
|
205
|
+
const file = path.join(journalDir(home), name);
|
|
206
|
+
try {
|
|
207
|
+
entries.push(validate(JSON.parse(fs.readFileSync(file, 'utf8'))));
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
damaged.push(file);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return { entries, damaged };
|
|
214
|
+
}
|
|
215
|
+
/** Same account and same gateway as the record was created with. */
|
|
216
|
+
export function sameSender(entry, identity) {
|
|
217
|
+
return entry.origin === identity.origin && entry.keyFingerprint === identity.keyFingerprint;
|
|
218
|
+
}
|
|
219
|
+
/** A body changed by client/catalog default expansion must not become a second paid submission. */
|
|
220
|
+
export function isInputPolicyConflict(entry, input, callerInput, defaults, legacyCallerInput) {
|
|
221
|
+
if (canonical(entry.input) === canonical(input))
|
|
222
|
+
return false;
|
|
223
|
+
const has = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
224
|
+
if (entry.callerInput !== undefined) {
|
|
225
|
+
const recordedCaller = entry.callerInput;
|
|
226
|
+
// Spelling out an omitted default is not a new intent. Accept either today's default or
|
|
227
|
+
// the value materialized in the recorded body, but never infer an explicit old field as a default.
|
|
228
|
+
return Object.entries(recordedCaller).every(([key, value]) => has(callerInput, key) && canonical(callerInput[key]) === canonical(value))
|
|
229
|
+
&& Object.entries(callerInput).every(([key, value]) => has(recordedCaller, key)
|
|
230
|
+
|| (has(defaults, key) && canonical(defaults[key]) === canonical(value))
|
|
231
|
+
|| (has(entry.input, key) && canonical(entry.input[key]) === canonical(value)));
|
|
232
|
+
}
|
|
233
|
+
// Legacy records have only the projected caller input. Also refuse when the caller now spells
|
|
234
|
+
// out a default that used to be omitted; changing a real argument is not inferred to be a retry.
|
|
235
|
+
if (canonical(entry.input) === canonical(callerInput) || (legacyCallerInput !== undefined && canonical(entry.input) === canonical(legacyCallerInput)))
|
|
236
|
+
return true;
|
|
237
|
+
return Object.entries(entry.input).every(([key, value]) => has(input, key) && canonical(input[key]) === canonical(value))
|
|
238
|
+
&& Object.entries(input).every(([key, value]) => has(entry.input, key) || (has(defaults, key) && canonical(defaults[key]) === canonical(value)));
|
|
239
|
+
}
|
|
240
|
+
/** Before lookup: retain the replay guard for 23h, then report expiry; sweep after 48h. */
|
|
241
|
+
export function findInputPolicyConflict(identity, modelId, input, callerInput, defaults, home, legacyCallerInput) {
|
|
242
|
+
assertConfigDirReadable(path.join(journalDir(home), 'probe'));
|
|
243
|
+
sweep(home);
|
|
244
|
+
return readAll(home).entries
|
|
245
|
+
.filter(entry => sameSender(entry, identity) && entry.modelId === modelId && !isExpired(entry) && isInputPolicyConflict(entry, input, callerInput, defaults, legacyCallerInput))
|
|
246
|
+
.sort((a, b) => Date.parse(a.createdAt) - Date.parse(b.createdAt))[0];
|
|
247
|
+
}
|
|
248
|
+
export function processAlive(pid) {
|
|
249
|
+
try {
|
|
250
|
+
process.kill(pid, 0);
|
|
251
|
+
return true;
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
return error.code === 'EPERM';
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* The oldest resumable record for exactly this sender, model and input. Resumable: state `unknown`,
|
|
259
|
+
* or `in-flight` from this host whose owner process no longer exists (killed before it could mark
|
|
260
|
+
* the record). Everything else that is pending for this sender and model is reported, never
|
|
261
|
+
* silently skipped: an in-flight record with a live owner on this host (a concurrent run), one from
|
|
262
|
+
* another host, an expired record, an `unknown` record for the same model with a *different* input
|
|
263
|
+
* (catalog drift or a changed argument), and damaged files. Records of other accounts or gateways
|
|
264
|
+
* are invisible here.
|
|
265
|
+
*/
|
|
266
|
+
export function findResumablePendingSubmission(identity, modelId, canonicalInput, home) {
|
|
267
|
+
assertConfigDirReadable(path.join(journalDir(home), 'probe'));
|
|
268
|
+
const { entries, damaged } = readAll(home);
|
|
269
|
+
const notices = damaged.map(file => ui(`${errorSentence('SUBMISSION_JOURNAL_INVALID')} (SUBMISSION_JOURNAL_INVALID) ${file}`, `${errorSentence('SUBMISSION_JOURNAL_INVALID')}(SUBMISSION_JOURNAL_INVALID)${file}`));
|
|
270
|
+
const candidates = [];
|
|
271
|
+
for (const entry of entries) {
|
|
272
|
+
if (!sameSender(entry, identity) || entry.modelId !== modelId || pastRetention(entry))
|
|
273
|
+
continue;
|
|
274
|
+
if (isExpired(entry)) {
|
|
275
|
+
notices.push(ui(`An unconfirmed submission recorded ${ageText(entry)} (idempotency key ${entry.idempotencyKey}, quote ${entry.quoteId}) has expired past its replay window; check job history before continuing. It was not re-sent.`, `有一条未确认的旧请求已过可续传时限,请先查任务历史(幂等键 ${entry.idempotencyKey},报价 ${entry.quoteId},记录于${ageText(entry)})。没有重发旧请求。`));
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
const sameInput = canonical(entry.input) === canonicalInput;
|
|
279
|
+
if (!sameInput) {
|
|
280
|
+
if (entry.state === 'unknown' || (entry.hostname === os.hostname() && !processAlive(entry.pid)))
|
|
281
|
+
notices.push(ui(`A submission for this model with a different input was recorded ${ageText(entry)} (idempotency key ${entry.idempotencyKey}, quote ${entry.quoteId}) and is still unconfirmed; it was not resumed because the input differs. If it is the one you meant (for example after a catalog change), run lumenkey tasks resume ${entry.idempotencyKey} (MCP: lumenkey_resume_submission).`, `有一次同模型但输入不同的提交记录于${ageText(entry)}(幂等键 ${entry.idempotencyKey},报价 ${entry.quoteId}),结果仍未确认;因输入不同没有接续。若那正是你要的(例如目录变更后),请运行 lumenkey tasks resume ${entry.idempotencyKey}(MCP:lumenkey_resume_submission)。`));
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
if (entry.state === 'unknown') {
|
|
285
|
+
candidates.push(entry);
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
if (entry.hostname !== os.hostname()) {
|
|
289
|
+
notices.push(ui(`An identical submission is still in flight from host ${entry.hostname} (idempotency key ${entry.idempotencyKey}); it was not resumed from here.`, `主机 ${entry.hostname} 上有一次相同的提交仍在进行(幂等键 ${entry.idempotencyKey}),没有从这里接续。`));
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
if (processAlive(entry.pid)) {
|
|
293
|
+
notices.push(ui(`An identical submission is still in flight in process ${entry.pid} on this host (idempotency key ${entry.idempotencyKey}); it was not resumed. If that process is gone, run lumenkey tasks resume ${entry.idempotencyKey} (MCP: lumenkey_resume_submission).`, `本机进程 ${entry.pid} 中有一次相同的提交仍在进行(幂等键 ${entry.idempotencyKey}),没有接续。若该进程已不存在,请运行 lumenkey tasks resume ${entry.idempotencyKey}(MCP:lumenkey_resume_submission)。`));
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
candidates.push(entry);
|
|
297
|
+
}
|
|
298
|
+
candidates.sort((a, b) => Date.parse(a.createdAt) - Date.parse(b.createdAt));
|
|
299
|
+
return { record: candidates[0], notices };
|
|
300
|
+
}
|
|
301
|
+
function sweep(home) {
|
|
302
|
+
const dir = journalDir(home);
|
|
303
|
+
for (const entry of readAll(home).entries) {
|
|
304
|
+
if (pastRetention(entry)) {
|
|
305
|
+
try {
|
|
306
|
+
fs.unlinkSync(entryPath(entry.idempotencyKey, home));
|
|
307
|
+
}
|
|
308
|
+
catch { /* best effort */ }
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
let names;
|
|
312
|
+
try {
|
|
313
|
+
names = fs.readdirSync(dir);
|
|
314
|
+
}
|
|
315
|
+
catch {
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
for (const name of names) {
|
|
319
|
+
if (!/\.tmp$/.test(name))
|
|
320
|
+
continue;
|
|
321
|
+
const file = path.join(dir, name);
|
|
322
|
+
try {
|
|
323
|
+
if (Date.now() - fs.statSync(file).mtimeMs >= ORPHAN_TEMP_MS)
|
|
324
|
+
fs.unlinkSync(file);
|
|
325
|
+
}
|
|
326
|
+
catch { /* best effort */ }
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=submission-journal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submission-journal.js","sourceRoot":"","sources":["../../src/core/submission-journal.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,9 @@ export * from './core/types.js';
|
|
|
2
2
|
export * from './core/config.js';
|
|
3
3
|
export * from './core/client.js';
|
|
4
4
|
export * from './core/poller.js';
|
|
5
|
+
export * from './core/outcome.js';
|
|
6
|
+
export * from './core/generation.js';
|
|
7
|
+
export * from './core/chat.js';
|
|
5
8
|
export * from './mcp/server.js';
|
|
6
9
|
export * from './cli/index.js';
|
|
7
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,9 @@ export * from './core/types.js';
|
|
|
2
2
|
export * from './core/config.js';
|
|
3
3
|
export * from './core/client.js';
|
|
4
4
|
export * from './core/poller.js';
|
|
5
|
+
export * from './core/outcome.js';
|
|
6
|
+
export * from './core/generation.js';
|
|
7
|
+
export * from './core/chat.js';
|
|
5
8
|
export * from './mcp/server.js';
|
|
6
9
|
export * from './cli/index.js';
|
|
7
10
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import type { Outcome } from '../core/outcome.js';
|
|
3
|
+
/**
|
|
4
|
+
* The MCP server's only outcome renderer: the same object the CLI prints, as one compact JSON
|
|
5
|
+
* text item, with `isError` mirroring `ok`. A tool may put a plain-text lead first (chat answers)
|
|
6
|
+
* so agents can read it directly; the envelope is then the last text item.
|
|
7
|
+
*/
|
|
8
|
+
export declare function toolResult(outcome: Outcome<unknown>, lead?: string): CallToolResult;
|
|
9
|
+
/** Catalog, balance and other plain reads keep their payload shape; only failures become envelopes. */
|
|
10
|
+
export declare function dataResult(data: unknown): CallToolResult;
|
|
11
|
+
//# sourceMappingURL=render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/mcp/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,cAAc,CAMnF;AAED,uGAAuG;AACvG,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,CAExD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The MCP server's only outcome renderer: the same object the CLI prints, as one compact JSON
|
|
3
|
+
* text item, with `isError` mirroring `ok`. A tool may put a plain-text lead first (chat answers)
|
|
4
|
+
* so agents can read it directly; the envelope is then the last text item.
|
|
5
|
+
*/
|
|
6
|
+
export function toolResult(outcome, lead) {
|
|
7
|
+
const envelope = { type: 'text', text: JSON.stringify(outcome) };
|
|
8
|
+
return {
|
|
9
|
+
...(outcome.ok ? {} : { isError: true }),
|
|
10
|
+
content: lead === undefined ? [envelope] : [{ type: 'text', text: lead }, envelope],
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/** Catalog, balance and other plain reads keep their payload shape; only failures become envelopes. */
|
|
14
|
+
export function dataResult(data) {
|
|
15
|
+
return { content: [{ type: 'text', text: JSON.stringify(data) }] };
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/mcp/render.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,OAAyB,EAAE,IAAa;IACjE,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;IAC1E,OAAO;QACL,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACxC,OAAO,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC;KACpF,CAAC;AACJ,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AACrE,CAAC"}
|
package/dist/mcp/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0DpE,wBAAgB,eAAe,IAAI,SAAS,CAsH3C;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAKjD"}
|