@kolbo/mcp 1.113.0 → 1.113.2
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/package.json +2 -2
- package/src/apps/html.js +8 -2
- package/src/apps/index.js +11 -2
- package/src/apps/widgets/generation.js +1 -1
- package/src/tools/generate.js +11 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kolbo/mcp",
|
|
3
|
-
"version": "1.113.
|
|
3
|
+
"version": "1.113.2",
|
|
4
4
|
"description": "Kolbo AI MCP Server - Generate images, videos, music, speech, and sound effects from Claude Code",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"smoke": "node scripts/smoke.js",
|
|
12
12
|
"check-skill-bundle": "node scripts/check-skill-bundle.js",
|
|
13
13
|
"check-parity": "node scripts/check-parity.js",
|
|
14
|
-
"prepublishOnly": "node --test test/flow-tools.test.js && node --test test/widget-resource-versions.test.js && node scripts/smoke.js && node scripts/check-tool-contract.js && node --test test/blender-tools.test.js && node scripts/check-skill-bundle.js && node scripts/check-parity.js && node scripts/check-widget-fields.js && node scripts/check-widget-render.js && node scripts/check-model-catalog.js && node scripts/check-skill-tools.js && node scripts/check-doctrine-parity.js && node scripts/check-submission-contract.js && node scripts/check-install.js",
|
|
14
|
+
"prepublishOnly": "node --test test/flow-tools.test.js && node --test test/widget-resource-versions.test.js test/reference-preview-inline.test.js && node scripts/smoke.js && node scripts/check-tool-contract.js && node --test test/blender-tools.test.js && node scripts/check-skill-bundle.js && node scripts/check-parity.js && node scripts/check-widget-fields.js && node scripts/check-widget-render.js && node scripts/check-model-catalog.js && node scripts/check-skill-tools.js && node scripts/check-doctrine-parity.js && node scripts/check-submission-contract.js && node scripts/check-install.js",
|
|
15
15
|
"check-model-catalog": "node scripts/check-model-catalog.js",
|
|
16
16
|
"check-widget-fields": "node scripts/check-widget-fields.js",
|
|
17
17
|
"check-widget-render": "node scripts/check-widget-render.js",
|
package/src/apps/html.js
CHANGED
|
@@ -225,7 +225,11 @@ document.addEventListener('click', function (e) {
|
|
|
225
225
|
list.push(it);
|
|
226
226
|
});
|
|
227
227
|
var at = peekItem(node);
|
|
228
|
-
openPeek(at.url, at.kind, at.cap, {
|
|
228
|
+
openPeek(at.url, at.kind, at.cap, {
|
|
229
|
+
list: list,
|
|
230
|
+
time: +node.getAttribute('data-peek-time') || 0,
|
|
231
|
+
inline: node.getAttribute('data-peek-inline') === 'true'
|
|
232
|
+
});
|
|
229
233
|
}, true);
|
|
230
234
|
var peekList = [];
|
|
231
235
|
var peekIndex = 0;
|
|
@@ -298,7 +302,9 @@ function openPeek(url, kind, cap, opts) {
|
|
|
298
302
|
box.hidden = false;
|
|
299
303
|
document.documentElement.classList.add('k-peek-open');
|
|
300
304
|
if (window.kolbo && window.kolbo.notifySize) window.kolbo.notifySize();
|
|
301
|
-
|
|
305
|
+
// Reference previews stay in the chat card instead of handing placement to
|
|
306
|
+
// the host's fullscreen surface. Result previews keep their existing expand.
|
|
307
|
+
if (opts.inline || peekWentFullscreen || !window.kolbo || !window.kolbo.requestDisplayMode) return;
|
|
302
308
|
try {
|
|
303
309
|
window.kolbo.requestDisplayMode('fullscreen').then(function (res) {
|
|
304
310
|
if (!(res && res.mode === 'fullscreen')) return;
|
package/src/apps/index.js
CHANGED
|
@@ -366,6 +366,9 @@ async function modelInfoMap(client) {
|
|
|
366
366
|
const DISPLAY_ALIASES = {
|
|
367
367
|
'flux-3-draft-enhance': { base: 'seedance-2-5', name: 'Seedance 2.5 Draft Enhance' },
|
|
368
368
|
'video-draft-enhance': { base: 'seedance-2-5', name: 'Seedance 2.5 Draft Enhance' },
|
|
369
|
+
// Billing SKU every ElevenLabs CLONED voice reports; its version shows in the
|
|
370
|
+
// separate "Model V4/V3/V2" chip, so the model chip is just the provider.
|
|
371
|
+
'fal_elevenlabs_tts': { base: 'eleven_v4', name: 'ElevenLabs' },
|
|
369
372
|
};
|
|
370
373
|
// Operations whose engine is picked server-side when no model is passed.
|
|
371
374
|
const OPERATION_ENGINES = { draft_enhance: 'flux-3-draft-enhance' };
|
|
@@ -530,10 +533,16 @@ async function resolveCatalogAspectRatio(client, modelId, requested, type) {
|
|
|
530
533
|
|
|
531
534
|
// Same shape and TTL as the model catalog above: the voice catalog is stable,
|
|
532
535
|
// and a per-generation /v1/voices round trip would be paid on every speech card.
|
|
533
|
-
|
|
536
|
+
// Keyed per caller, not per server: /v1/voices includes the caller's own cloned
|
|
537
|
+
// voices, so one shared entry (the remote connector serves every user from one
|
|
538
|
+
// process) left everyone else's clones unresolved for the whole TTL.
|
|
539
|
+
const voiceCache = new Map(); // apiBase + key hash → { at, byKey }
|
|
534
540
|
|
|
535
541
|
async function voiceInfoMap(client) {
|
|
536
|
-
const
|
|
542
|
+
const keyHash = client.apiKey
|
|
543
|
+
? crypto.createHash('sha256').update(String(client.apiKey)).digest('hex').slice(0, 16)
|
|
544
|
+
: 'anon';
|
|
545
|
+
const cacheKey = `${client.apiBase || 'default'}|${keyHash}`;
|
|
537
546
|
const hit = voiceCache.get(cacheKey);
|
|
538
547
|
if (hit && Date.now() - hit.at < ICON_TTL_MS) return hit.byKey;
|
|
539
548
|
const byKey = new Map();
|
|
@@ -423,7 +423,7 @@ function referenceHTML(sc) {
|
|
|
423
423
|
for (var i = 0; i < refs.length; i++) {
|
|
424
424
|
var url = esc(refs[i].url);
|
|
425
425
|
var title = 'Reference ' + refs[i].kind + ' ' + (i + 1) + ' of ' + refs.length;
|
|
426
|
-
var peek = ' data-peek="' + url + '" data-peek-kind="' + refs[i].kind + '" data-peek-cap="' + title + '"';
|
|
426
|
+
var peek = ' data-peek="' + url + '" data-peek-kind="' + refs[i].kind + '" data-peek-cap="' + title + '" data-peek-inline="true"';
|
|
427
427
|
if (refs[i].kind === 'video') {
|
|
428
428
|
// #t=0.1 so the poster is a real frame, not a black canvas.
|
|
429
429
|
h += '<video class="k-ref-thumb k-peek-hit" src="' + url + '#t=0.1" muted playsinline preload="metadata" title="'
|
package/src/tools/generate.js
CHANGED
|
@@ -1201,7 +1201,8 @@ function registerGenerateTools(server, client, options = {}) {
|
|
|
1201
1201
|
// the card was labelling those "Smart Select", which is not even a text-to-
|
|
1202
1202
|
// speech option, and naming the voice the caller typed rather than the one
|
|
1203
1203
|
// that spoke. Same resolution addDisplayNames does for the polling path.
|
|
1204
|
-
const ranVoice = (
|
|
1204
|
+
const ranVoice = statusVoice(result.result)
|
|
1205
|
+
|| (await voiceInfo(client, result.result?.voice).catch(() => null)) || voiceRecord;
|
|
1205
1206
|
return uiCompleted({
|
|
1206
1207
|
tool: 'generate_speech', kind: 'audio', gen, client, prompt: text,
|
|
1207
1208
|
model: result.result?.model || model,
|
|
@@ -1314,13 +1315,21 @@ function registerGenerateTools(server, client, options = {}) {
|
|
|
1314
1315
|
r.model_name = (info && info.name) || r.model;
|
|
1315
1316
|
r.model_icon = (info && info.icon) || null;
|
|
1316
1317
|
}
|
|
1317
|
-
|
|
1318
|
+
// The API names a cloned voice itself (voice_name/voice_thumbnail): clones
|
|
1319
|
+
// are not reliably in the cached catalog, so keep the API's answer.
|
|
1320
|
+
if (r.voice && !statusVoice(r)) {
|
|
1318
1321
|
const v = await voiceInfo(client, r.voice).catch(() => null);
|
|
1319
1322
|
r.voice_name = (v && v.name) || r.voice;
|
|
1320
1323
|
r.voice_thumbnail = (v && v.thumbnail) || null;
|
|
1321
1324
|
}
|
|
1322
1325
|
}
|
|
1323
1326
|
|
|
1327
|
+
function statusVoice(r) {
|
|
1328
|
+
if (!r || !r.voice_name) return null;
|
|
1329
|
+
const id = /^custom_/i.test(String(r.requested_voice_id || '')) ? r.requested_voice_id : r.voice;
|
|
1330
|
+
return { id, name: r.voice_name, thumbnail: r.voice_thumbnail || null };
|
|
1331
|
+
}
|
|
1332
|
+
|
|
1324
1333
|
// ─── get_generation_status ─────────────────────────────────
|
|
1325
1334
|
server.tool(
|
|
1326
1335
|
'get_generation_status',
|