@kolbo/mcp 1.75.1 → 1.75.3

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolbo/mcp",
3
- "version": "1.75.1",
3
+ "version": "1.75.3",
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": {
@@ -54,6 +54,16 @@ function boot(sc) {
54
54
  if (audioItems.length) {
55
55
  h += audioItems.slice(0, 12).map(audioRowHTML).join('');
56
56
  }
57
+ // Only a fixed page ever renders here (24 visual + 12 audio) — with a library
58
+ // in the thousands there was no way to reach the rest short of asking in
59
+ // chat. A visible "Load more" turns that into one click; it sends a message
60
+ // rather than calling the tool directly, since the widget has no host API
61
+ // to invoke a tool itself — same mechanism every other "Use" action here uses.
62
+ var shown = visualItems.length + audioItems.length;
63
+ if (sc.total != null && sc.total > shown) {
64
+ h += '<button class="k-btn" id="load-more" style="width:100%;margin-top:10px">Load more (' +
65
+ shown + ' of ' + sc.total + ' shown)</button>';
66
+ }
57
67
  el('stage').innerHTML = h;
58
68
  el('stage').classList.remove('k-empty');
59
69
  wire();
@@ -78,6 +88,11 @@ function cellHTML(item, i) {
78
88
  '</div>' +
79
89
  '<div class="k-cell-label">' + esc(item.title || '') + '</div>' +
80
90
  (item.subtitle ? '<div class="k-cell-sub">' + esc(item.subtitle) + '</div>' : '') +
91
+ // Clicking the cell itself already sends the use_hint (see wire()), but that
92
+ // wasn't discoverable — nothing on the tile signalled it was clickable. A
93
+ // visible button makes the affordance obvious, same reasoning as the audio
94
+ // rows' explicit "Use" button.
95
+ '<button class="k-btn" data-use="' + idx + '" style="margin:0 8px 8px;width:calc(100% - 16px)">Use</button>' +
81
96
  '</div>';
82
97
  }
83
98
 
@@ -121,6 +136,13 @@ function wire() {
121
136
  holder.querySelector('video').onclick = function (ev) { ev.stopPropagation(); };
122
137
  };
123
138
  });
139
+ var loadMore = el('load-more');
140
+ if (loadMore) {
141
+ loadMore.onclick = function () {
142
+ window.kolbo.sendMessage('Show me the next page of this same media search (already saw ' +
143
+ (state.items.length) + ' of ' + state.total + ' results).');
144
+ };
145
+ }
124
146
  }
125
147
 
126
148
  function useItem(i) {
@@ -998,26 +998,29 @@ function registerGenerateTools(server, client, options = {}) {
998
998
  // renderStatusGrid, the one path here that mixes independent
999
999
  // pending/completed/failed items in one grid instead of assuming they all
1000
1000
  // finished together.
1001
- if (ui()) {
1002
- return uiCompleted({
1003
- tool: 'get_generation_status', kind: 'status', client,
1004
- model: 'Generations', gen: { generation_id: ids[0] },
1005
- settings: {},
1006
- items: results.map(r => {
1007
- const res = r.result || {};
1008
- return {
1009
- id: r.generation_id,
1010
- state: r.state,
1011
- title: res.prompt_used || res.prompt || undefined,
1012
- url: Array.isArray(res.urls) ? res.urls[0] : undefined,
1013
- };
1014
- }),
1015
- }, text);
1016
- }
1017
-
1018
- return {
1019
- content: [{ type: 'text', text }]
1020
- };
1001
+ //
1002
+ // Always ship structuredContent, unconditionally — Kolbo Code does NOT
1003
+ // advertise MCP Apps, so gating this behind ui()/appsEnabled() (as this
1004
+ // used to) left that host with text only, and its own generic fallback
1005
+ // renderer built a plain status list with no thumbnails, exactly the
1006
+ // "black tile" class of bug already fixed the same way in media.js /
1007
+ // moodboards.js / visual_dna.js / listResult(). uiResult always embeds
1008
+ // both text and structuredContent, so hosts without a UI-app renderer
1009
+ // are unaffected — only the fallback quality changes.
1010
+ return uiCompleted({
1011
+ tool: 'get_generation_status', kind: 'status', client,
1012
+ model: 'Generations', gen: { generation_id: ids[0] },
1013
+ settings: {},
1014
+ items: results.map(r => {
1015
+ const res = r.result || {};
1016
+ return {
1017
+ id: r.generation_id,
1018
+ state: r.state,
1019
+ title: res.prompt_used || res.prompt || undefined,
1020
+ url: Array.isArray(res.urls) ? res.urls[0] : undefined,
1021
+ };
1022
+ }),
1023
+ }, text);
1021
1024
  }
1022
1025
  );
1023
1026