@glbgpt/cli 0.1.0-test.4 → 0.1.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 +79 -6
- package/dist/src/auth/authClient.d.ts +21 -2
- package/dist/src/auth/authClient.js +67 -3
- package/dist/src/auth/authClient.js.map +1 -1
- package/dist/src/auth/loginFlow.js +5 -2
- package/dist/src/auth/loginFlow.js.map +1 -1
- package/dist/src/auth/loopbackServer.d.ts +2 -1
- package/dist/src/auth/loopbackServer.js +6 -3
- package/dist/src/auth/loopbackServer.js.map +1 -1
- package/dist/src/commands/accountCommand.js +10 -4
- package/dist/src/commands/accountCommand.js.map +1 -1
- package/dist/src/commands/configCommand.d.ts +5 -0
- package/dist/src/commands/configCommand.js +15 -2
- package/dist/src/commands/configCommand.js.map +1 -1
- package/dist/src/commands/execCommand.d.ts +6 -0
- package/dist/src/commands/execCommand.js +61 -9
- package/dist/src/commands/execCommand.js.map +1 -1
- package/dist/src/commands/loginCommand.js +9 -6
- package/dist/src/commands/loginCommand.js.map +1 -1
- package/dist/src/commands/mediaCommand.js +3 -2
- package/dist/src/commands/mediaCommand.js.map +1 -1
- package/dist/src/commands/skillCommand.d.ts +30 -0
- package/dist/src/commands/skillCommand.js +160 -0
- package/dist/src/commands/skillCommand.js.map +1 -0
- package/dist/src/config/configFile.d.ts +12 -0
- package/dist/src/config/configFile.js +12 -0
- package/dist/src/config/configFile.js.map +1 -1
- package/dist/src/config/env.d.ts +18 -0
- package/dist/src/config/env.js +57 -7
- package/dist/src/config/env.js.map +1 -1
- package/dist/src/core/catalog.d.ts +8 -1
- package/dist/src/core/catalog.js +13 -2
- package/dist/src/core/catalog.js.map +1 -1
- package/dist/src/core/contextPrune.d.ts +13 -0
- package/dist/src/core/contextPrune.js +61 -0
- package/dist/src/core/contextPrune.js.map +1 -0
- package/dist/src/core/httpChatBackend.js +22 -5
- package/dist/src/core/httpChatBackend.js.map +1 -1
- package/dist/src/core/runChat.d.ts +9 -5
- package/dist/src/core/runChat.js +10 -7
- package/dist/src/core/runChat.js.map +1 -1
- package/dist/src/core/session.d.ts +15 -0
- package/dist/src/core/session.js +29 -1
- package/dist/src/core/session.js.map +1 -1
- package/dist/src/core/toolRegistry.d.ts +14 -3
- package/dist/src/core/toolRegistry.js +24 -15
- package/dist/src/core/toolRegistry.js.map +1 -1
- package/dist/src/core/turnLoop.d.ts +4 -0
- package/dist/src/core/turnLoop.js +62 -13
- package/dist/src/core/turnLoop.js.map +1 -1
- package/dist/src/core/types.d.ts +6 -0
- package/dist/src/core/updateCheck.d.ts +46 -0
- package/dist/src/core/updateCheck.js +139 -0
- package/dist/src/core/updateCheck.js.map +1 -0
- package/dist/src/exec/media.d.ts +32 -0
- package/dist/src/exec/media.js +70 -0
- package/dist/src/exec/media.js.map +1 -0
- package/dist/src/exec/output.d.ts +16 -0
- package/dist/src/exec/output.js +41 -0
- package/dist/src/exec/output.js.map +1 -1
- package/dist/src/fs/globTool.d.ts +8 -0
- package/dist/src/fs/globTool.js +117 -0
- package/dist/src/fs/globTool.js.map +1 -0
- package/dist/src/fs/grepTool.d.ts +4 -0
- package/dist/src/fs/grepTool.js +146 -0
- package/dist/src/fs/grepTool.js.map +1 -0
- package/dist/src/fs/index.d.ts +8 -0
- package/dist/src/fs/index.js +13 -0
- package/dist/src/fs/index.js.map +1 -0
- package/dist/src/fs/limits.d.ts +34 -0
- package/dist/src/fs/limits.js +74 -0
- package/dist/src/fs/limits.js.map +1 -0
- package/dist/src/fs/listDirTool.d.ts +2 -0
- package/dist/src/fs/listDirTool.js +68 -0
- package/dist/src/fs/listDirTool.js.map +1 -0
- package/dist/src/fs/readFileTool.d.ts +2 -0
- package/dist/src/fs/readFileTool.js +102 -0
- package/dist/src/fs/readFileTool.js.map +1 -0
- package/dist/src/fs/walk.d.ts +11 -0
- package/dist/src/fs/walk.js +38 -0
- package/dist/src/fs/walk.js.map +1 -0
- package/dist/src/fs/workspaceGuard.d.ts +27 -0
- package/dist/src/fs/workspaceGuard.js +96 -0
- package/dist/src/fs/workspaceGuard.js.map +1 -0
- package/dist/src/index.js +47 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/mediaTools.d.ts +63 -0
- package/dist/src/mcp/mediaTools.js +385 -0
- package/dist/src/mcp/mediaTools.js.map +1 -0
- package/dist/src/mcp/server.d.ts +6 -2
- package/dist/src/mcp/server.js +19 -9
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/media/aiApiClient.d.ts +5 -0
- package/dist/src/media/aiApiClient.js +12 -1
- package/dist/src/media/aiApiClient.js.map +1 -1
- package/dist/src/media/budget.d.ts +42 -0
- package/dist/src/media/budget.js +95 -0
- package/dist/src/media/budget.js.map +1 -0
- package/dist/src/media/executor.d.ts +9 -0
- package/dist/src/media/executor.js +1 -1
- package/dist/src/media/executor.js.map +1 -1
- package/dist/src/media/generateImageTool.d.ts +20 -2
- package/dist/src/media/generateImageTool.js +102 -2
- package/dist/src/media/generateImageTool.js.map +1 -1
- package/dist/src/media/promptSanitizer.d.ts +11 -0
- package/dist/src/media/promptSanitizer.js +33 -0
- package/dist/src/media/promptSanitizer.js.map +1 -0
- package/dist/src/media/taskManager.d.ts +8 -1
- package/dist/src/media/taskManager.js +1 -1
- package/dist/src/media/taskManager.js.map +1 -1
- package/dist/src/tui/App.js +38 -8
- package/dist/src/tui/App.js.map +1 -1
- package/dist/src/tui/ParamEditor.d.ts +11 -2
- package/dist/src/tui/ParamEditor.js +48 -3
- package/dist/src/tui/ParamEditor.js.map +1 -1
- package/dist/src/tui/atPopup.d.ts +8 -0
- package/dist/src/tui/atPopup.js +1 -1
- package/dist/src/tui/atPopup.js.map +1 -1
- package/dist/src/tui/attachments.d.ts +12 -0
- package/dist/src/tui/attachments.js +12 -1
- package/dist/src/tui/attachments.js.map +1 -1
- package/dist/src/tui/chatController.d.ts +73 -2
- package/dist/src/tui/chatController.js +272 -43
- package/dist/src/tui/chatController.js.map +1 -1
- package/dist/src/tui/models.d.ts +6 -0
- package/dist/src/tui/models.js +14 -6
- package/dist/src/tui/models.js.map +1 -1
- package/dist/src/tui/run.js +55 -16
- package/dist/src/tui/run.js.map +1 -1
- package/dist/src/util/brokenPipe.d.ts +10 -0
- package/dist/src/util/brokenPipe.js +19 -0
- package/dist/src/util/brokenPipe.js.map +1 -0
- package/package.json +3 -2
- package/skills/globalgpt/SKILL.md +94 -0
- package/skills/globalgpt/references/troubleshooting.md +34 -0
- package/skills/globalgpt-coding/SKILL.md +65 -0
- package/skills/globalgpt-coding/references/troubleshooting.md +34 -0
- package/skills/globalgpt-image/SKILL.md +109 -0
- package/skills/globalgpt-image/references/recipes.md +52 -0
- package/skills/globalgpt-image/references/troubleshooting.md +49 -0
- package/skills/globalgpt-video/SKILL.md +109 -0
- package/skills/globalgpt-video/references/recipes.md +50 -0
- package/skills/globalgpt-video/references/troubleshooting.md +49 -0
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { AiApiClient, PaymentRequiredError, TaskNotFoundError } from '../media/aiApiClient.js';
|
|
4
|
+
import { TaskManager } from '../media/taskManager.js';
|
|
5
|
+
import { TaskLedger } from '../media/taskLedger.js';
|
|
6
|
+
import { budgetedExecutor } from '../media/budget.js';
|
|
7
|
+
import { DEFAULT_IMAGE_MODEL, DEFAULT_VIDEO_MODEL, availableModels } from '../media/manifest.js';
|
|
8
|
+
import { getChatModels, getDefaultChatModel, modelDescription } from '../tui/models.js';
|
|
9
|
+
import { describePaymentRequired, describeNotSellable, describeTaskFailure } from '../media/errors.js';
|
|
10
|
+
import { resolveToken as defaultResolveToken } from '../auth/token.js';
|
|
11
|
+
import { apiBaseUrl } from '../config/env.js';
|
|
12
|
+
import { ensureCatalog } from '../core/catalog.js';
|
|
13
|
+
import { MEDIA_GRACE_WAIT_MS, MEDIA_POLL_HINT_SECONDS } from '../fs/limits.js';
|
|
14
|
+
const NOT_SIGNED_IN = 'Not signed in. Run `glbgpt login` first (or set GLBGPT_TOKEN).';
|
|
15
|
+
function textResult(text, isError = false) {
|
|
16
|
+
return { content: [{ type: 'text', text }], isError: isError || undefined };
|
|
17
|
+
}
|
|
18
|
+
function jsonResult(obj) {
|
|
19
|
+
return textResult(JSON.stringify(obj, null, 2));
|
|
20
|
+
}
|
|
21
|
+
/** Listing entry for a media model: capability keys mirror the generate tools' params (spec §1). */
|
|
22
|
+
function mediaModelEntry(spec) {
|
|
23
|
+
const s = spec.support;
|
|
24
|
+
const e = { id: spec.id, name: spec.displayName };
|
|
25
|
+
if (spec.id === (spec.type === 'video' ? DEFAULT_VIDEO_MODEL : DEFAULT_IMAGE_MODEL))
|
|
26
|
+
e.default = true;
|
|
27
|
+
if (s.aspectRatios?.length)
|
|
28
|
+
e.aspect_ratios = s.aspectRatios;
|
|
29
|
+
if (s.resolutions?.length)
|
|
30
|
+
e.resolutions = s.resolutions;
|
|
31
|
+
if (spec.type === 'image') {
|
|
32
|
+
if ((s.maxImages ?? 0) >= 1)
|
|
33
|
+
e.reference_images = true;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
if (s.durations?.length)
|
|
37
|
+
e.durations_seconds = s.durations;
|
|
38
|
+
if (s.supportsAudio)
|
|
39
|
+
e.audio = true;
|
|
40
|
+
if (s.supportsStartEndFrame) {
|
|
41
|
+
e.start_image = true;
|
|
42
|
+
e.end_image = true;
|
|
43
|
+
}
|
|
44
|
+
if (s.requiresImage)
|
|
45
|
+
e.requires_image = true;
|
|
46
|
+
}
|
|
47
|
+
if (s.supportsSeed)
|
|
48
|
+
e.seed = true;
|
|
49
|
+
if (s.supportsNegativePrompt)
|
|
50
|
+
e.negative_prompt = true;
|
|
51
|
+
return e;
|
|
52
|
+
}
|
|
53
|
+
/** Listing entry for a chat model. */
|
|
54
|
+
function chatModelEntry(m, defaultId) {
|
|
55
|
+
const desc = modelDescription(m);
|
|
56
|
+
const e = { id: m.id };
|
|
57
|
+
if (desc)
|
|
58
|
+
e.description = desc;
|
|
59
|
+
if (m.toolUse === true)
|
|
60
|
+
e.tool_use = true;
|
|
61
|
+
if (m.id === defaultId)
|
|
62
|
+
e.default = true;
|
|
63
|
+
return e;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Per-process runtime behind the MCP media tools (spec §3): one shared budget,
|
|
67
|
+
* task manager, and completed-task cache across all calls on this connection.
|
|
68
|
+
*/
|
|
69
|
+
export class MediaRuntime {
|
|
70
|
+
deps;
|
|
71
|
+
ctx;
|
|
72
|
+
completed = new Map();
|
|
73
|
+
/**
|
|
74
|
+
* In-flight register() promises, keyed by taskId. runCheckTask taps into these instead of
|
|
75
|
+
* calling register() again for a task this process is already polling — a second concurrent
|
|
76
|
+
* poll+download loop can interleave writeFile/rename with the first and falsely cache a
|
|
77
|
+
* task_failed event for a task that actually succeeded (see F1 in the 2026-07-19 review).
|
|
78
|
+
*/
|
|
79
|
+
pending = new Map();
|
|
80
|
+
constructor(deps) {
|
|
81
|
+
this.deps = deps;
|
|
82
|
+
}
|
|
83
|
+
async ensure() {
|
|
84
|
+
const token = await (this.deps.resolveToken ?? defaultResolveToken)();
|
|
85
|
+
await ensureCatalog({ baseUrl: apiBaseUrl(), token });
|
|
86
|
+
if (!token)
|
|
87
|
+
return null;
|
|
88
|
+
if (!this.ctx) {
|
|
89
|
+
const client = this.deps.clientFor?.(token) ?? new AiApiClient({ baseUrl: apiBaseUrl(), token });
|
|
90
|
+
const outputDir = this.deps.outputDir ?? path.join(process.cwd(), 'glbgpt-output');
|
|
91
|
+
const taskManager = this.deps.taskManagerFor?.(client) ?? new TaskManager(client, { outputDir });
|
|
92
|
+
this.ctx = {
|
|
93
|
+
client,
|
|
94
|
+
taskManager,
|
|
95
|
+
executor: budgetedExecutor(client, this.deps.budget),
|
|
96
|
+
ledger: this.deps.ledger ?? new TaskLedger(),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
return this.ctx;
|
|
100
|
+
}
|
|
101
|
+
async runGenerate(kind, args) {
|
|
102
|
+
const ctx = await this.ensure();
|
|
103
|
+
if (!ctx)
|
|
104
|
+
return textResult(NOT_SIGNED_IN, true);
|
|
105
|
+
const prompt = typeof args.prompt === 'string' ? args.prompt.trim() : '';
|
|
106
|
+
if (!prompt)
|
|
107
|
+
return textResult('prompt is required', true);
|
|
108
|
+
const modelId = typeof args.model === 'string' && args.model
|
|
109
|
+
? args.model
|
|
110
|
+
: kind === 'video'
|
|
111
|
+
? DEFAULT_VIDEO_MODEL
|
|
112
|
+
: DEFAULT_IMAGE_MODEL;
|
|
113
|
+
const params = { prompt };
|
|
114
|
+
if (typeof args.aspect_ratio === 'string' && args.aspect_ratio)
|
|
115
|
+
params.aspectRatio = args.aspect_ratio;
|
|
116
|
+
if (typeof args.resolution === 'string' && args.resolution)
|
|
117
|
+
params.resolution = args.resolution;
|
|
118
|
+
if (typeof args.seed === 'number')
|
|
119
|
+
params.seed = args.seed;
|
|
120
|
+
if (typeof args.negative_prompt === 'string' && args.negative_prompt)
|
|
121
|
+
params.negativePrompt = args.negative_prompt;
|
|
122
|
+
if (kind === 'video') {
|
|
123
|
+
if (typeof args.duration === 'number')
|
|
124
|
+
params.duration = args.duration;
|
|
125
|
+
if (typeof args.generate_audio === 'boolean')
|
|
126
|
+
params.generateAudio = args.generate_audio;
|
|
127
|
+
if (typeof args.start_image === 'string' && args.start_image)
|
|
128
|
+
params.startImage = args.start_image;
|
|
129
|
+
if (typeof args.end_image === 'string' && args.end_image)
|
|
130
|
+
params.endImage = args.end_image;
|
|
131
|
+
}
|
|
132
|
+
else if (Array.isArray(args.reference_images) && args.reference_images.length > 0) {
|
|
133
|
+
const refs = args.reference_images.filter((r) => typeof r === 'string' && r.length > 0);
|
|
134
|
+
if (refs.length > 0)
|
|
135
|
+
params.images = refs;
|
|
136
|
+
}
|
|
137
|
+
let outcome;
|
|
138
|
+
try {
|
|
139
|
+
outcome = await ctx.executor.execute(modelId, params);
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
const msg = err instanceof PaymentRequiredError
|
|
143
|
+
? describePaymentRequired(err)
|
|
144
|
+
: err instanceof Error
|
|
145
|
+
? err.message
|
|
146
|
+
: String(err);
|
|
147
|
+
return textResult(msg, true);
|
|
148
|
+
}
|
|
149
|
+
if (outcome.status === 'cancelled')
|
|
150
|
+
return textResult(outcome.reason ?? 'Generation cancelled.', true);
|
|
151
|
+
if (outcome.status === 'not_sellable')
|
|
152
|
+
return textResult(describeNotSellable(outcome.reasonCode), true);
|
|
153
|
+
void ctx.ledger
|
|
154
|
+
.append({ taskId: outcome.taskId, model: outcome.model, prompt, createdAt: Date.now() })
|
|
155
|
+
.catch(() => { });
|
|
156
|
+
// Grace wait: give fast (image) tasks a chance to finish inside this call.
|
|
157
|
+
// register() keeps polling and downloads in the background either way.
|
|
158
|
+
const settle = this.track(outcome.taskId, () => ctx.taskManager.register(outcome.taskId, { model: outcome.model, prompt }));
|
|
159
|
+
const ev = await this.raceGrace(settle);
|
|
160
|
+
if (ev && ev.type === 'task_done') {
|
|
161
|
+
return jsonResult({
|
|
162
|
+
status: 'succeeded',
|
|
163
|
+
task_id: outcome.taskId,
|
|
164
|
+
model: outcome.model,
|
|
165
|
+
credits_charged: outcome.credits,
|
|
166
|
+
url: ev.outputUrl,
|
|
167
|
+
local_path: ev.localPath,
|
|
168
|
+
budget: { spent: this.deps.budget.spent, cap: this.deps.budget.cap },
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
if (ev && ev.type === 'task_failed')
|
|
172
|
+
return textResult(ev.reason, true);
|
|
173
|
+
return jsonResult({
|
|
174
|
+
status: 'generating',
|
|
175
|
+
task_id: outcome.taskId,
|
|
176
|
+
model: outcome.model,
|
|
177
|
+
estimated_credits: outcome.credits,
|
|
178
|
+
check_after_seconds: MEDIA_POLL_HINT_SECONDS,
|
|
179
|
+
note: 'Generation continues in the background. Call glbgpt_check_task with this task_id — ' +
|
|
180
|
+
'you may call it again IMMEDIATELY and repeatedly; the server itself waits for progress ' +
|
|
181
|
+
'inside each check (no client-side sleeping needed). Do not tell the user the media is done yet.',
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Start (or join) THE single background register() loop for a task and cache its terminal
|
|
186
|
+
* event. One loop per task per process — a second concurrent poll+download loop can
|
|
187
|
+
* interleave writeFile/rename with the first and falsely cache a task_failed event for a
|
|
188
|
+
* task that actually succeeded (F1, 2026-07-19 review). The pending entry survives grace
|
|
189
|
+
* timeouts, so successive check_task calls keep joining the same loop.
|
|
190
|
+
*/
|
|
191
|
+
track(taskId, start) {
|
|
192
|
+
const existing = this.pending.get(taskId);
|
|
193
|
+
if (existing)
|
|
194
|
+
return existing;
|
|
195
|
+
const settle = start();
|
|
196
|
+
this.pending.set(taskId, settle);
|
|
197
|
+
void settle
|
|
198
|
+
.then((ev) => {
|
|
199
|
+
// A poll-loop timeout is OUR loop giving up, not a backend verdict — caching it
|
|
200
|
+
// would make every later check_task lie "failed" about a task that may still
|
|
201
|
+
// succeed. Leave it uncached; the next check re-consults the backend fresh.
|
|
202
|
+
if (!(ev.type === 'task_failed' && ev.timedOut))
|
|
203
|
+
this.completed.set(taskId, ev);
|
|
204
|
+
})
|
|
205
|
+
.catch(() => { })
|
|
206
|
+
.finally(() => this.pending.delete(taskId));
|
|
207
|
+
return settle;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Race a settle promise against the grace window; null = still running. Server-side
|
|
211
|
+
* waiting is the load-bearing design choice (verified 2026-07-20 in a real Claude Code
|
|
212
|
+
* client): agents without a sleep capability end their turn when told to wait, orphaning
|
|
213
|
+
* the task — so each call absorbs up to graceMs of waiting instead. 45s slices stay
|
|
214
|
+
* inside the most conservative client timeouts (Claude Code's own default is ~27.8h).
|
|
215
|
+
* The default grace timer must not keep the event loop alive once the race is decided; a
|
|
216
|
+
* caller-injected deps.sleep (tests) is left as-is — its leak is bounded by the test.
|
|
217
|
+
*/
|
|
218
|
+
async raceGrace(settle) {
|
|
219
|
+
let timeoutId;
|
|
220
|
+
const graceMs = this.deps.graceMs ?? MEDIA_GRACE_WAIT_MS;
|
|
221
|
+
const grace = this.deps.sleep
|
|
222
|
+
? this.deps.sleep(graceMs).then(() => null)
|
|
223
|
+
: new Promise((resolve) => {
|
|
224
|
+
timeoutId = setTimeout(() => resolve(null), graceMs);
|
|
225
|
+
});
|
|
226
|
+
const ev = await Promise.race([settle, grace]);
|
|
227
|
+
if (timeoutId)
|
|
228
|
+
clearTimeout(timeoutId);
|
|
229
|
+
return ev;
|
|
230
|
+
}
|
|
231
|
+
async runCheckTask(args) {
|
|
232
|
+
const taskId = typeof args.task_id === 'string' ? args.task_id.trim() : '';
|
|
233
|
+
if (!taskId)
|
|
234
|
+
return textResult('task_id is required', true);
|
|
235
|
+
// Fast path: this process already saw the task finish (no backend round-trip,
|
|
236
|
+
// no duplicate download).
|
|
237
|
+
const done = this.completed.get(taskId);
|
|
238
|
+
if (done?.type === 'task_done') {
|
|
239
|
+
return jsonResult({ status: 'succeeded', task_id: taskId, url: done.outputUrl, local_path: done.localPath });
|
|
240
|
+
}
|
|
241
|
+
if (done?.type === 'task_failed')
|
|
242
|
+
return textResult(done.reason, true);
|
|
243
|
+
// A register() loop already running in this process (from runGenerate or an earlier
|
|
244
|
+
// check) — join it for one grace slice.
|
|
245
|
+
let settle = this.pending.get(taskId);
|
|
246
|
+
if (!settle) {
|
|
247
|
+
const ctx = await this.ensure();
|
|
248
|
+
if (!ctx)
|
|
249
|
+
return textResult(NOT_SIGNED_IN, true);
|
|
250
|
+
let info;
|
|
251
|
+
try {
|
|
252
|
+
info = await ctx.client.getTask(taskId);
|
|
253
|
+
}
|
|
254
|
+
catch (err) {
|
|
255
|
+
if (err instanceof TaskNotFoundError) {
|
|
256
|
+
return textResult(`${err.message} Use a task_id returned by glbgpt_generate_image or glbgpt_generate_video.`, true);
|
|
257
|
+
}
|
|
258
|
+
return textResult(err instanceof Error ? err.message : String(err), true);
|
|
259
|
+
}
|
|
260
|
+
if (info.status === 'failed') {
|
|
261
|
+
return textResult(describeTaskFailure(info.errorCode, info.failedReason), true);
|
|
262
|
+
}
|
|
263
|
+
// Success-unseen (e.g. a previous server process submitted it): one register() round
|
|
264
|
+
// downloads it and resolves almost immediately — the deterministic file name
|
|
265
|
+
// (glbgpt-<model>-<id8>.<ext>) makes any re-download land on the same path.
|
|
266
|
+
// Still-processing: start OUR poll loop so this call (and every later one) can absorb
|
|
267
|
+
// the waiting server-side instead of asking the client's agent to sleep.
|
|
268
|
+
const rec = await ctx.ledger.resolve(taskId);
|
|
269
|
+
settle = this.track(taskId, () => ctx.taskManager.register(taskId, { model: rec?.model, prompt: rec?.prompt }));
|
|
270
|
+
}
|
|
271
|
+
const ev = await this.raceGrace(settle);
|
|
272
|
+
if (!ev) {
|
|
273
|
+
return jsonResult({
|
|
274
|
+
status: 'generating',
|
|
275
|
+
task_id: taskId,
|
|
276
|
+
check_after_seconds: MEDIA_POLL_HINT_SECONDS,
|
|
277
|
+
note: 'Still generating. Call glbgpt_check_task again immediately — the server waits internally.',
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
if (ev.type === 'task_done') {
|
|
281
|
+
return jsonResult({ status: 'succeeded', task_id: taskId, url: ev.outputUrl, local_path: ev.localPath });
|
|
282
|
+
}
|
|
283
|
+
if (ev.type === 'task_failed' && ev.timedOut) {
|
|
284
|
+
// Our loop's own timeout — not authoritative. The task may still finish; keep checking.
|
|
285
|
+
return jsonResult({
|
|
286
|
+
status: 'generating',
|
|
287
|
+
task_id: taskId,
|
|
288
|
+
check_after_seconds: MEDIA_POLL_HINT_SECONDS,
|
|
289
|
+
note: 'Still generating (long-running task). Call glbgpt_check_task again immediately — the server waits internally.',
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
return textResult(ev.type === 'task_failed' ? ev.reason : 'Unexpected task state.', true);
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Model discovery (spec 2026-07-20-mcp-list-models-design.md): harmless
|
|
296
|
+
* metadata, so no auth gate — a null token still serves the baked/cached
|
|
297
|
+
* catalog. Media groups honor the catalog disabled list via availableModels().
|
|
298
|
+
*/
|
|
299
|
+
async runListModels(args) {
|
|
300
|
+
const type = typeof args.type === 'string' ? args.type : undefined;
|
|
301
|
+
const token = await (this.deps.resolveToken ?? defaultResolveToken)();
|
|
302
|
+
await ensureCatalog({ baseUrl: apiBaseUrl(), token });
|
|
303
|
+
const out = {};
|
|
304
|
+
if (!type || type === 'image' || type === 'video') {
|
|
305
|
+
for (const spec of availableModels()) {
|
|
306
|
+
if (type && spec.type !== type)
|
|
307
|
+
continue;
|
|
308
|
+
(out[spec.type] ??= []).push(mediaModelEntry(spec));
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
if (!type || type === 'chat') {
|
|
312
|
+
const defaultChat = getDefaultChatModel();
|
|
313
|
+
out.chat = getChatModels().map((m) => chatModelEntry(m, defaultChat));
|
|
314
|
+
}
|
|
315
|
+
return jsonResult(out);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
/** Register the media tools (and model discovery) on an MCP server, bound to one runtime. */
|
|
319
|
+
export function registerMediaTools(server, runtime) {
|
|
320
|
+
const common = {
|
|
321
|
+
prompt: z.string().describe('What to generate.'),
|
|
322
|
+
model: z
|
|
323
|
+
.string()
|
|
324
|
+
.optional()
|
|
325
|
+
.describe(`Model id (image default ${DEFAULT_IMAGE_MODEL}, video default ${DEFAULT_VIDEO_MODEL}). ` +
|
|
326
|
+
'Omit unless the user asked for a specific model. ' +
|
|
327
|
+
'Call glbgpt_list_models to see all available models and their capabilities.'),
|
|
328
|
+
aspect_ratio: z.string().optional().describe('e.g. 1:1, 16:9, 9:16 — set only if the user asks.'),
|
|
329
|
+
resolution: z
|
|
330
|
+
.string()
|
|
331
|
+
.optional()
|
|
332
|
+
.describe('Images: e.g. 1K, 2K, 4K; videos: e.g. 480p, 720p, 1080p — set only if the user asks.'),
|
|
333
|
+
seed: z.number().int().optional().describe('Set only if the user gives a seed.'),
|
|
334
|
+
negative_prompt: z.string().optional().describe('Set only if the user says what to avoid.'),
|
|
335
|
+
};
|
|
336
|
+
const refHint = 'Local file paths or http(s) URLs.';
|
|
337
|
+
const spendNote = 'Generation spends credits from the signed-in GlobalGPT account under a session budget; ' +
|
|
338
|
+
'a rejected call explains how the user can raise the budget. ' +
|
|
339
|
+
'Returns either the finished result (url + local_path) or a task_id to poll with glbgpt_check_task.';
|
|
340
|
+
server.registerTool('glbgpt_generate_image', {
|
|
341
|
+
title: 'GlobalGPT image generation',
|
|
342
|
+
description: `Generate an image from a text prompt (optionally editing reference images). ${spendNote}`,
|
|
343
|
+
inputSchema: {
|
|
344
|
+
...common,
|
|
345
|
+
reference_images: z.array(z.string()).optional().describe(`Images to build on (image-to-image). ${refHint}`),
|
|
346
|
+
},
|
|
347
|
+
}, (args) => runtime.runGenerate('image', args));
|
|
348
|
+
server.registerTool('glbgpt_generate_video', {
|
|
349
|
+
title: 'GlobalGPT video generation',
|
|
350
|
+
description: `Generate a video from a text prompt (optionally from a start/end frame). Videos typically take minutes. ${spendNote}`,
|
|
351
|
+
inputSchema: {
|
|
352
|
+
...common,
|
|
353
|
+
duration: z.number().int().optional().describe('Video length in seconds — set only if the user asks.'),
|
|
354
|
+
generate_audio: z
|
|
355
|
+
.boolean()
|
|
356
|
+
.optional()
|
|
357
|
+
.describe('Sound on/off. Set ONLY if the user explicitly asks; models have their own defaults.'),
|
|
358
|
+
start_image: z.string().optional().describe(`First frame for image-to-video. ${refHint}`),
|
|
359
|
+
end_image: z.string().optional().describe(`Last frame (used with start_image). ${refHint}`),
|
|
360
|
+
},
|
|
361
|
+
}, (args) => runtime.runGenerate('video', args));
|
|
362
|
+
server.registerTool('glbgpt_check_task', {
|
|
363
|
+
title: 'Check a GlobalGPT generation task',
|
|
364
|
+
description: 'Check a media generation task by task_id. The server waits internally for up to 45s ' +
|
|
365
|
+
'per call, so if it returns generating just call this again immediately (no sleeping ' +
|
|
366
|
+
'needed) until you get the finished result (url + local_path) or a failure reason.',
|
|
367
|
+
inputSchema: {
|
|
368
|
+
task_id: z.string().describe('The task_id returned by glbgpt_generate_image / glbgpt_generate_video.'),
|
|
369
|
+
},
|
|
370
|
+
}, (args) => runtime.runCheckTask(args));
|
|
371
|
+
server.registerTool('glbgpt_list_models', {
|
|
372
|
+
title: 'List GlobalGPT models',
|
|
373
|
+
description: 'List the available GlobalGPT models and their capabilities, grouped as chat / image / ' +
|
|
374
|
+
"video (use type to filter). Capability keys mirror the generate tools' parameter names: " +
|
|
375
|
+
'aspect_ratios and resolutions list the valid values for aspect_ratio/resolution, ' +
|
|
376
|
+
'durations_seconds the valid duration values; audio marks generate_audio support, ' +
|
|
377
|
+
'start_image/end_image frame-reference support, reference_images image-to-image support; ' +
|
|
378
|
+
'requires_image means the video model cannot run from text alone. Costs are estimated at ' +
|
|
379
|
+
'generation time under the session budget — this listing carries no prices.',
|
|
380
|
+
inputSchema: {
|
|
381
|
+
type: z.enum(['chat', 'image', 'video']).optional().describe('Only list this kind of model.'),
|
|
382
|
+
},
|
|
383
|
+
}, (args) => runtime.runListModels(args));
|
|
384
|
+
}
|
|
385
|
+
//# sourceMappingURL=mediaTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mediaTools.js","sourceRoot":"","sources":["../../../src/mcp/mediaTools.ts"],"names":[],"mappings":"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"}
|
package/dist/src/mcp/server.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import type { ChatBackend } from '../core/types.js';
|
|
3
|
+
import { MediaRuntime } from './mediaTools.js';
|
|
3
4
|
/** Arguments for the `glbgpt_chat` tool. */
|
|
4
5
|
export interface ChatToolArgs {
|
|
5
6
|
prompt: string;
|
|
@@ -23,6 +24,7 @@ export interface ChatToolDeps {
|
|
|
23
24
|
resolveToken?: () => Promise<string | null>;
|
|
24
25
|
backendFor?: (token: string) => ChatBackend;
|
|
25
26
|
}
|
|
27
|
+
export declare const CHAT_TOOL_DESCRIPTION: string;
|
|
26
28
|
/**
|
|
27
29
|
* The `glbgpt_chat` tool: one chat-only turn through the shared core. Never throws — every failure
|
|
28
30
|
* (not signed in, unknown model, network/turn error) becomes an `isError` tool result so the MCP
|
|
@@ -30,9 +32,11 @@ export interface ChatToolDeps {
|
|
|
30
32
|
*/
|
|
31
33
|
export declare function runChatTool(args: ChatToolArgs, deps?: ChatToolDeps): Promise<ToolResult>;
|
|
32
34
|
/** Build the MCP server exposing the glbgpt tools. */
|
|
33
|
-
export declare function buildMcpServer(deps?: ChatToolDeps): McpServer;
|
|
35
|
+
export declare function buildMcpServer(deps?: ChatToolDeps, mediaRuntime?: MediaRuntime): McpServer;
|
|
34
36
|
/**
|
|
35
37
|
* Run the MCP server over stdio. Protocol travels on stdout, so nothing else may write there;
|
|
36
38
|
* diagnostics go to stderr. Runs until stdin closes.
|
|
37
39
|
*/
|
|
38
|
-
export declare function runMcpServer(
|
|
40
|
+
export declare function runMcpServer(opts?: {
|
|
41
|
+
maxCredits?: number;
|
|
42
|
+
}): Promise<void>;
|
package/dist/src/mcp/server.js
CHANGED
|
@@ -4,14 +4,21 @@ import { z } from 'zod';
|
|
|
4
4
|
import { HttpChatBackend } from '../core/httpChatBackend.js';
|
|
5
5
|
import { runChatTurn } from '../core/runChat.js';
|
|
6
6
|
import { resolveToken as defaultResolveToken } from '../auth/token.js';
|
|
7
|
-
import { apiBaseUrl } from '../config/env.js';
|
|
7
|
+
import { apiBaseUrl, baseUrlOverrideWarnings } from '../config/env.js';
|
|
8
8
|
import { ensureCatalog } from '../core/catalog.js';
|
|
9
9
|
import { getDefaultChatModel, resolveChatModel } from '../tui/models.js';
|
|
10
10
|
import { resolveImageRef } from '../util/imageRef.js';
|
|
11
|
+
import { MediaRuntime, registerMediaTools } from './mediaTools.js';
|
|
12
|
+
import { SessionBudget, resolveMaxCredits } from '../media/budget.js';
|
|
11
13
|
import { VERSION as SERVER_VERSION } from '../version.js';
|
|
12
14
|
function textResult(text, isError = false) {
|
|
13
15
|
return { content: [{ type: 'text', text }], isError: isError || undefined };
|
|
14
16
|
}
|
|
17
|
+
export const CHAT_TOOL_DESCRIPTION = "Ask GlobalGPT's chat models a single question and get the answer. Optionally " +
|
|
18
|
+
'set a system prompt, choose a model, attach images for the model to see (local paths or ' +
|
|
19
|
+
'URLs), or pass a JSON Schema (response_schema) to get structured JSON back. Requires a ' +
|
|
20
|
+
'prior `glbgpt login` (or the GLBGPT_TOKEN env var). ' +
|
|
21
|
+
'Call glbgpt_list_models to see the available chat models.';
|
|
15
22
|
/**
|
|
16
23
|
* The `glbgpt_chat` tool: one chat-only turn through the shared core. Never throws — every failure
|
|
17
24
|
* (not signed in, unknown model, network/turn error) becomes an `isError` tool result so the MCP
|
|
@@ -59,14 +66,11 @@ export async function runChatTool(args, deps = {}) {
|
|
|
59
66
|
}
|
|
60
67
|
}
|
|
61
68
|
/** Build the MCP server exposing the glbgpt tools. */
|
|
62
|
-
export function buildMcpServer(deps = {}) {
|
|
69
|
+
export function buildMcpServer(deps = {}, mediaRuntime) {
|
|
63
70
|
const server = new McpServer({ name: 'glbgpt', version: SERVER_VERSION });
|
|
64
71
|
server.registerTool('glbgpt_chat', {
|
|
65
72
|
title: 'GlobalGPT chat',
|
|
66
|
-
description:
|
|
67
|
-
'set a system prompt, choose a model, attach images for the model to see (local paths or ' +
|
|
68
|
-
'URLs), or pass a JSON Schema (response_schema) to get structured JSON back. Requires a ' +
|
|
69
|
-
'prior `glbgpt login` (or the GLBGPT_TOKEN env var).',
|
|
73
|
+
description: CHAT_TOOL_DESCRIPTION,
|
|
70
74
|
inputSchema: {
|
|
71
75
|
prompt: z.string().describe('The question or instruction for the model.'),
|
|
72
76
|
system: z.string().optional().describe('Optional system prompt to steer the model.'),
|
|
@@ -81,17 +85,23 @@ export function buildMcpServer(deps = {}) {
|
|
|
81
85
|
.describe('Optional JSON Schema; when set, the model returns matching structured JSON.'),
|
|
82
86
|
},
|
|
83
87
|
}, (args) => runChatTool(args, deps));
|
|
88
|
+
const runtime = mediaRuntime ?? new MediaRuntime({ budget: new SessionBudget(resolveMaxCredits()) });
|
|
89
|
+
registerMediaTools(server, runtime);
|
|
84
90
|
return server;
|
|
85
91
|
}
|
|
86
92
|
/**
|
|
87
93
|
* Run the MCP server over stdio. Protocol travels on stdout, so nothing else may write there;
|
|
88
94
|
* diagnostics go to stderr. Runs until stdin closes.
|
|
89
95
|
*/
|
|
90
|
-
export async function runMcpServer() {
|
|
91
|
-
const
|
|
96
|
+
export async function runMcpServer(opts = {}) {
|
|
97
|
+
const runtime = new MediaRuntime({ budget: new SessionBudget(resolveMaxCredits(opts.maxCredits)) });
|
|
98
|
+
const server = buildMcpServer({}, runtime);
|
|
92
99
|
const transport = new StdioServerTransport();
|
|
93
100
|
await server.connect(transport);
|
|
94
|
-
|
|
101
|
+
// stderr goes to the MCP client's server logs — the only place an operator would look.
|
|
102
|
+
for (const warning of baseUrlOverrideWarnings())
|
|
103
|
+
process.stderr.write(`${warning}\n`);
|
|
104
|
+
process.stderr.write('glbgpt MCP server ready (stdio). Tools: glbgpt_chat, glbgpt_generate_image, glbgpt_generate_video, glbgpt_check_task, glbgpt_list_models.\n');
|
|
95
105
|
}
|
|
96
106
|
function errText(err) {
|
|
97
107
|
return err instanceof Error ? err.message : String(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,11 @@ export declare class PaymentRequiredError extends Error {
|
|
|
28
28
|
readonly subCode?: number | undefined;
|
|
29
29
|
constructor(message: string, subCode?: number | undefined);
|
|
30
30
|
}
|
|
31
|
+
/** The backend has no task under this id (or the id is malformed). */
|
|
32
|
+
export declare class TaskNotFoundError extends Error {
|
|
33
|
+
readonly taskId: string;
|
|
34
|
+
constructor(taskId: string);
|
|
35
|
+
}
|
|
31
36
|
export interface AiApiClientOptions {
|
|
32
37
|
baseUrl: string;
|
|
33
38
|
token: string;
|
|
@@ -10,6 +10,15 @@ export class PaymentRequiredError extends Error {
|
|
|
10
10
|
this.name = 'PaymentRequiredError';
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
|
+
/** The backend has no task under this id (or the id is malformed). */
|
|
14
|
+
export class TaskNotFoundError extends Error {
|
|
15
|
+
taskId;
|
|
16
|
+
constructor(taskId) {
|
|
17
|
+
super(`No task found with id ${taskId}.`);
|
|
18
|
+
this.taskId = taskId;
|
|
19
|
+
this.name = 'TaskNotFoundError';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
13
22
|
export class AiApiClient {
|
|
14
23
|
baseUrl;
|
|
15
24
|
token;
|
|
@@ -52,7 +61,9 @@ export class AiApiClient {
|
|
|
52
61
|
const json = await this.postJson('/ai-api/ai/task/get', { taskId });
|
|
53
62
|
const t = json.task;
|
|
54
63
|
if (!t) {
|
|
55
|
-
|
|
64
|
+
// Deliberately NOT json.message: for a malformed id the backend leaks its raw
|
|
65
|
+
// parser error ("For input string: …"), which reads as gibberish to agents.
|
|
66
|
+
throw new TaskNotFoundError(taskId);
|
|
56
67
|
}
|
|
57
68
|
return {
|
|
58
69
|
taskId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aiApiClient.js","sourceRoot":"","sources":["../../../src/media/aiApiClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AA8B3D,uGAAuG;AACvG,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACP;IAAtC,YAAY,OAAe,EAAW,OAAgB;QACpD,KAAK,CAAC,OAAO,CAAC,CAAC;QADqB,YAAO,GAAP,OAAO,CAAS;QAEpD,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAQD,MAAM,OAAO,WAAW;IACL,OAAO,CAAS;IACzB,KAAK,CAAS;IACL,SAAS,CAAe;IACxB,IAAI,CAAS;IAE9B,YAAY,IAAwB;QAClC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,6DAA6D;IAC7D,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,aAAa,CAAC,KAAa,EAAE,MAA+B;QAChE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,+BAA+B,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1G,OAAO;YACL,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;YAChC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;YAClC,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;YACnC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,eAAe,EAAE,IAAI,CAAC,eAAe;SACtC,CAAC;IACJ,CAAC;IAED,gGAAgG;IAChG,KAAK,CAAC,MAAM,CAAC,UAAkB,EAAE,IAA6B;QAC5D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3G,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YACtB,MAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,IAAI,mBAAmB,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1F,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,qCAAqC,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,4BAA4B;IAC5B,KAAK,CAAC,OAAO,CAAC,MAAc;QAC1B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACpE,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;QACpB,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"aiApiClient.js","sourceRoot":"","sources":["../../../src/media/aiApiClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type Confirmer, type ConfirmDecision, type ConfirmInfo, type MediaExecutor } from './executor.js';
|
|
2
|
+
import type { AiApiClient } from './aiApiClient.js';
|
|
3
|
+
/**
|
|
4
|
+
* Session-cumulative credit budget for the unattended surfaces (MCP server, exec).
|
|
5
|
+
* One instance per process; TUI generations are human-confirmed and do not use it.
|
|
6
|
+
* Reservations happen at the confirm gate (authoritative backend estimate in hand)
|
|
7
|
+
* and are released if the submit then fails — see BudgetConfirmer (added in Task 2).
|
|
8
|
+
*/
|
|
9
|
+
export declare class SessionBudget {
|
|
10
|
+
readonly cap: number;
|
|
11
|
+
private spentCredits;
|
|
12
|
+
constructor(cap: number);
|
|
13
|
+
get spent(): number;
|
|
14
|
+
/** Atomically check-and-add. False (and no change) when the cap would be crossed. */
|
|
15
|
+
tryReserve(credits: number): boolean;
|
|
16
|
+
release(credits: number): void;
|
|
17
|
+
describe(): string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Cap precedence: explicit flag > GLBGPT_MAX_CREDITS env > config 'max-credits' > default.
|
|
21
|
+
*
|
|
22
|
+
* `0` is a valid flag value meaning "no media spending this session" (a SessionBudget with
|
|
23
|
+
* cap 0 rejects every reserve); the CLI rejects NaN/negative flag values before they ever
|
|
24
|
+
* reach here (usage error, not a silent fallback). Garbage from env/config still falls back
|
|
25
|
+
* to the default — those aren't user-typed-right-now input, so failing soft is preferable.
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveMaxCredits(flag?: number): number;
|
|
28
|
+
/**
|
|
29
|
+
* The unattended confirm gate: reserve the estimated credits or reject with an
|
|
30
|
+
* actionable message. One instance per execute() call (budgetedExecutor) so a
|
|
31
|
+
* failed submit can roll back exactly its own reservation.
|
|
32
|
+
*/
|
|
33
|
+
export declare class BudgetConfirmer implements Confirmer {
|
|
34
|
+
private readonly budget;
|
|
35
|
+
private reserved;
|
|
36
|
+
constructor(budget: SessionBudget);
|
|
37
|
+
confirm(info: ConfirmInfo): Promise<ConfirmDecision>;
|
|
38
|
+
/** Undo the reservation after a failed submit (the money was never spent). */
|
|
39
|
+
rollback(): void;
|
|
40
|
+
}
|
|
41
|
+
/** Budget-gated executor for unattended surfaces: fresh gate per call, rolled back on a thrown submit. */
|
|
42
|
+
export declare function budgetedExecutor(client: AiApiClient, budget: SessionBudget): MediaExecutor;
|