@llmindset/hf-mcp-server 0.2.38 → 0.2.39
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/dist/server/mcp-proxy.d.ts.map +1 -1
- package/dist/server/mcp-proxy.js +2 -24
- package/dist/server/mcp-proxy.js.map +1 -1
- package/dist/server/resources/gradio-widget-content.d.ts +1 -1
- package/dist/server/resources/gradio-widget-content.d.ts.map +1 -1
- package/dist/server/resources/gradio-widget-content.js +1 -1
- package/dist/server/utils/gradio-utils.d.ts +7 -0
- package/dist/server/utils/gradio-utils.d.ts.map +1 -1
- package/dist/server/utils/gradio-utils.js +66 -0
- package/dist/server/utils/gradio-utils.js.map +1 -1
- package/dist/server/utils/tool-selection-strategy.d.ts +0 -1
- package/dist/server/utils/tool-selection-strategy.d.ts.map +1 -1
- package/dist/server/utils/tool-selection-strategy.js +12 -70
- package/dist/server/utils/tool-selection-strategy.js.map +1 -1
- package/dist/shared/bouquet-presets.d.ts +28 -0
- package/dist/shared/bouquet-presets.d.ts.map +1 -0
- package/dist/shared/bouquet-presets.js +209 -0
- package/dist/shared/bouquet-presets.js.map +1 -0
- package/dist/web/assets/{gradioWidgetDev-CHFFzaiX.js → gradioWidgetDev-D_tjyTMr.js} +1 -1
- package/dist/web/assets/index-BIlcsSB0.css +1 -0
- package/dist/web/assets/{main-DQBI27w1.js → main-CdwI1Qp8.js} +1 -1
- package/dist/web/gradio-widget-dev.html +3 -3
- package/dist/web/gradio-widget.html +1 -1
- package/dist/web/index.html +3 -3
- package/dist/web/mcp-welcome.html +44 -44
- package/package.json +2 -2
- package/dist/web/assets/index-BJ0b-DVy.css +0 -1
- /package/dist/web/assets/{index-DuDDhJyu.js → index-BBRBgpfp.js} +0 -0
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
import type { SpaceTool } from '../../shared/settings.js';
|
|
1
2
|
export declare function isGradioTool(toolName: string): boolean;
|
|
2
3
|
export declare function createGradioToolName(toolName: string, index: number, isPrivate: boolean | undefined, toolIndex?: number): string;
|
|
4
|
+
export interface ParsedGradioSpace {
|
|
5
|
+
name: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function parseGradioSpaceIds(gradioParam: string): ParsedGradioSpace[];
|
|
8
|
+
export declare function fetchGradioSubdomains(spaceIds: ParsedGradioSpace[], hfToken?: string, hubUrl?: string): Promise<SpaceTool[]>;
|
|
9
|
+
export declare function parseAndFetchGradioEndpoints(gradioParam: string, hfToken?: string, hubUrl?: string): Promise<SpaceTool[]>;
|
|
3
10
|
//# sourceMappingURL=gradio-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gradio-utils.d.ts","sourceRoot":"","sources":["../../../src/server/utils/gradio-utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gradio-utils.d.ts","sourceRoot":"","sources":["../../../src/server/utils/gradio-utils.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAiB1D,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGtD;AAiBD,wBAAgB,oBAAoB,CACnC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,OAAO,GAAG,SAAS,EAC9B,SAAS,CAAC,EAAE,MAAM,GAChB,MAAM,CAoCR;AAKD,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;CACb;AAcD,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAqC5E;AAeD,wBAAsB,qBAAqB,CAC1C,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,EAAE,CAAC,CA0CtB;AAeD,wBAAsB,4BAA4B,CACjD,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,EAAE,CAAC,CAQtB"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { spaceInfo } from '@huggingface/hub';
|
|
1
2
|
import { GRADIO_FILES_TOOL_CONFIG } from '@llmindset/hf-mcp';
|
|
2
3
|
import { GRADIO_PREFIX, GRADIO_PRIVATE_PREFIX } from '../../shared/constants.js';
|
|
4
|
+
import { logger } from './logger.js';
|
|
3
5
|
export function isGradioTool(toolName) {
|
|
4
6
|
return /^grp?\d+_/.test(toolName) || toolName === GRADIO_FILES_TOOL_CONFIG.name;
|
|
5
7
|
}
|
|
@@ -26,4 +28,68 @@ export function createGradioToolName(toolName, index, isPrivate, toolIndex) {
|
|
|
26
28
|
}
|
|
27
29
|
return `${prefix}${indexStr}_${sanitizedName}`;
|
|
28
30
|
}
|
|
31
|
+
export function parseGradioSpaceIds(gradioParam) {
|
|
32
|
+
const spaces = [];
|
|
33
|
+
const trimmed = gradioParam.trim();
|
|
34
|
+
if (trimmed.toLowerCase() === 'none') {
|
|
35
|
+
return spaces;
|
|
36
|
+
}
|
|
37
|
+
const entries = gradioParam
|
|
38
|
+
.split(',')
|
|
39
|
+
.map((s) => s.trim())
|
|
40
|
+
.filter((s) => s.length > 0);
|
|
41
|
+
for (const entry of entries) {
|
|
42
|
+
if (entry.toLowerCase() === 'none') {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const slashCount = (entry.match(/\//g) || []).length;
|
|
46
|
+
const slashIndex = entry.indexOf('/');
|
|
47
|
+
const isValidFormat = slashCount === 1 && slashIndex > 0 && slashIndex < entry.length - 1;
|
|
48
|
+
if (!isValidFormat) {
|
|
49
|
+
logger.warn(`Skipping invalid gradio entry "${entry}": must contain exactly one slash with content on both sides (format: username/space-name)`);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
spaces.push({ name: entry });
|
|
53
|
+
logger.debug(`Parsed gradio space ID: ${entry}`);
|
|
54
|
+
}
|
|
55
|
+
return spaces;
|
|
56
|
+
}
|
|
57
|
+
export async function fetchGradioSubdomains(spaceIds, hfToken, hubUrl) {
|
|
58
|
+
const spaceTools = [];
|
|
59
|
+
for (const space of spaceIds) {
|
|
60
|
+
try {
|
|
61
|
+
logger.debug(`Fetching subdomain for space: ${space.name}`);
|
|
62
|
+
const info = (await spaceInfo({
|
|
63
|
+
name: space.name,
|
|
64
|
+
additionalFields: ['subdomain'],
|
|
65
|
+
...(hubUrl && { hubUrl }),
|
|
66
|
+
...(hfToken && { credentials: { accessToken: hfToken } }),
|
|
67
|
+
}));
|
|
68
|
+
const subdomain = info.subdomain;
|
|
69
|
+
if (!subdomain) {
|
|
70
|
+
logger.warn(`Space "${space.name}" does not have a subdomain - skipping`);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
const toolId = `gradio_${subdomain}`;
|
|
74
|
+
spaceTools.push({
|
|
75
|
+
_id: toolId,
|
|
76
|
+
name: space.name,
|
|
77
|
+
subdomain: subdomain,
|
|
78
|
+
emoji: '🔧',
|
|
79
|
+
});
|
|
80
|
+
logger.info(`Successfully fetched subdomain for ${space.name}: ${subdomain}`);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
logger.error({ error, spaceName: space.name }, `Failed to fetch subdomain for space "${space.name}" - skipping`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return spaceTools;
|
|
87
|
+
}
|
|
88
|
+
export async function parseAndFetchGradioEndpoints(gradioParam, hfToken, hubUrl) {
|
|
89
|
+
const parsedSpaces = parseGradioSpaceIds(gradioParam);
|
|
90
|
+
if (parsedSpaces.length === 0) {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
return fetchGradioSubdomains(parsedSpaces, hfToken, hubUrl);
|
|
94
|
+
}
|
|
29
95
|
//# sourceMappingURL=gradio-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gradio-utils.js","sourceRoot":"","sources":["../../../src/server/utils/gradio-utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"gradio-utils.js","sourceRoot":"","sources":["../../../src/server/utils/gradio-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,6 @@ export interface ToolSelectionResult {
|
|
|
20
20
|
mixedBouquet?: string;
|
|
21
21
|
gradioSpaceTools?: SpaceTool[];
|
|
22
22
|
}
|
|
23
|
-
export declare const BOUQUETS: Record<string, AppSettings>;
|
|
24
23
|
export declare class ToolSelectionStrategy {
|
|
25
24
|
private apiClient;
|
|
26
25
|
constructor(apiClient: McpApiClient);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-selection-strategy.d.ts","sourceRoot":"","sources":["../../../src/server/utils/tool-selection-strategy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAEvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-selection-strategy.d.ts","sourceRoot":"","sources":["../../../src/server/utils/tool-selection-strategy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAEvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMxD,oBAAY,iBAAiB;IAC5B,gBAAgB,qBAAqB;IACrC,GAAG,QAAQ;IACX,YAAY,iBAAiB;IAC7B,YAAY,iBAAiB;IAC7B,QAAQ,aAAa;CACrB;AAED,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,iBAAiB,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,SAAS,EAAE,CAAC;CAC/B;AAKD,qBAAa,qBAAqB;IACjC,OAAO,CAAC,SAAS,CAAe;gBAEpB,SAAS,EAAE,YAAY;IAYnC,OAAO,CAAC,oBAAoB;IAuB5B,OAAO,CAAC,uBAAuB;IAiBzB,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC;YAgGhE,eAAe;CAiC7B"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { logger } from './logger.js';
|
|
2
|
-
import { ALL_BUILTIN_TOOL_IDS
|
|
2
|
+
import { ALL_BUILTIN_TOOL_IDS } from '@llmindset/hf-mcp';
|
|
3
3
|
import { extractAuthBouquetAndMix } from '../utils/auth-utils.js';
|
|
4
|
-
import { GRADIO_IMAGE_FILTER_FLAG, README_INCLUDE_FLAG } from '../../shared/behavior-flags.js';
|
|
5
4
|
import { normalizeBuiltInTools } from '../../shared/tool-normalizer.js';
|
|
5
|
+
import { BOUQUETS } from '../../shared/bouquet-presets.js';
|
|
6
|
+
import { parseGradioSpaceIds } from './gradio-utils.js';
|
|
6
7
|
export var ToolSelectionMode;
|
|
7
8
|
(function (ToolSelectionMode) {
|
|
8
9
|
ToolSelectionMode["BOUQUET_OVERRIDE"] = "bouquet_override";
|
|
@@ -11,81 +12,22 @@ export var ToolSelectionMode;
|
|
|
11
12
|
ToolSelectionMode["INTERNAL_API"] = "internal_api";
|
|
12
13
|
ToolSelectionMode["FALLBACK"] = "fallback";
|
|
13
14
|
})(ToolSelectionMode || (ToolSelectionMode = {}));
|
|
14
|
-
export const BOUQUETS = {
|
|
15
|
-
hf_api: {
|
|
16
|
-
builtInTools: [...TOOL_ID_GROUPS.hf_api],
|
|
17
|
-
spaceTools: [],
|
|
18
|
-
},
|
|
19
|
-
spaces: {
|
|
20
|
-
builtInTools: [...TOOL_ID_GROUPS.spaces],
|
|
21
|
-
spaceTools: [],
|
|
22
|
-
},
|
|
23
|
-
search: {
|
|
24
|
-
builtInTools: [...TOOL_ID_GROUPS.search],
|
|
25
|
-
spaceTools: [],
|
|
26
|
-
},
|
|
27
|
-
docs: {
|
|
28
|
-
builtInTools: [...TOOL_ID_GROUPS.docs],
|
|
29
|
-
spaceTools: [],
|
|
30
|
-
},
|
|
31
|
-
all: {
|
|
32
|
-
builtInTools: [...ALL_BUILTIN_TOOL_IDS],
|
|
33
|
-
spaceTools: [],
|
|
34
|
-
},
|
|
35
|
-
hub_repo_details_readme: {
|
|
36
|
-
builtInTools: [HUB_INSPECT_TOOL_ID, README_INCLUDE_FLAG],
|
|
37
|
-
spaceTools: [],
|
|
38
|
-
},
|
|
39
|
-
hub_repo_details: {
|
|
40
|
-
builtInTools: [HUB_INSPECT_TOOL_ID],
|
|
41
|
-
spaceTools: [],
|
|
42
|
-
},
|
|
43
|
-
no_gradio_images: {
|
|
44
|
-
builtInTools: [GRADIO_IMAGE_FILTER_FLAG],
|
|
45
|
-
spaceTools: [],
|
|
46
|
-
},
|
|
47
|
-
mcp_ui: {
|
|
48
|
-
builtInTools: [USE_SPACE_TOOL_ID],
|
|
49
|
-
spaceTools: [],
|
|
50
|
-
},
|
|
51
|
-
jobs: {
|
|
52
|
-
builtInTools: [HF_JOBS_TOOL_ID],
|
|
53
|
-
spaceTools: [],
|
|
54
|
-
},
|
|
55
|
-
};
|
|
56
15
|
export class ToolSelectionStrategy {
|
|
57
16
|
apiClient;
|
|
58
17
|
constructor(apiClient) {
|
|
59
18
|
this.apiClient = apiClient;
|
|
60
19
|
}
|
|
61
20
|
parseGradioEndpoints(gradioParam) {
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
return
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
.map((s) => s.trim())
|
|
70
|
-
.filter((s) => s.length > 0);
|
|
71
|
-
for (const entry of entries) {
|
|
72
|
-
if (entry.toLowerCase() === 'none')
|
|
73
|
-
continue;
|
|
74
|
-
const slashCount = (entry.match(/\//g) || []).length;
|
|
75
|
-
if (slashCount !== 1) {
|
|
76
|
-
logger.warn(`Skipping invalid gradio entry "${entry}": must contain exactly one slash`);
|
|
77
|
-
continue;
|
|
78
|
-
}
|
|
79
|
-
const subdomain = entry.replace(/[/._]/g, '-');
|
|
80
|
-
spaceTools.push({
|
|
81
|
-
_id: `gradio_${subdomain}`,
|
|
82
|
-
name: entry,
|
|
83
|
-
subdomain: subdomain,
|
|
21
|
+
const parsedSpaces = parseGradioSpaceIds(gradioParam);
|
|
22
|
+
return parsedSpaces.map((space) => {
|
|
23
|
+
const placeholderSubdomain = space.name.replace(/[/]/g, '-');
|
|
24
|
+
return {
|
|
25
|
+
_id: `gradio_metadata_${placeholderSubdomain}`,
|
|
26
|
+
name: space.name,
|
|
27
|
+
subdomain: placeholderSubdomain,
|
|
84
28
|
emoji: '🔧',
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
return spaceTools;
|
|
29
|
+
};
|
|
30
|
+
});
|
|
89
31
|
}
|
|
90
32
|
applySearchEnablesFetch(enabledToolIds) {
|
|
91
33
|
if (process.env.SEARCH_ENABLES_FETCH === 'true') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-selection-strategy.js","sourceRoot":"","sources":["../../../src/server/utils/tool-selection-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,
|
|
1
|
+
{"version":3,"file":"tool-selection-strategy.js","sourceRoot":"","sources":["../../../src/server/utils/tool-selection-strategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { AppSettings } from './settings.js';
|
|
2
|
+
export declare const BOUQUETS: Record<string, AppSettings>;
|
|
3
|
+
export type BouquetKey = keyof typeof BOUQUETS;
|
|
4
|
+
export interface DirectParamOption {
|
|
5
|
+
label: string;
|
|
6
|
+
param: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface BouquetPreset {
|
|
10
|
+
key: BouquetKey;
|
|
11
|
+
label: string;
|
|
12
|
+
description: string;
|
|
13
|
+
category: 'core' | 'advanced';
|
|
14
|
+
supportsBouquet: boolean;
|
|
15
|
+
supportsMix: boolean;
|
|
16
|
+
builtInTools: readonly string[];
|
|
17
|
+
directParams?: DirectParamOption[];
|
|
18
|
+
}
|
|
19
|
+
export declare const BOUQUET_PRESETS: BouquetPreset[];
|
|
20
|
+
export type ConfigEntryKind = 'tool' | 'behavior-flag';
|
|
21
|
+
export interface ConfigEntryDescription {
|
|
22
|
+
id: string;
|
|
23
|
+
label: string;
|
|
24
|
+
description?: string;
|
|
25
|
+
kind: ConfigEntryKind;
|
|
26
|
+
}
|
|
27
|
+
export declare function describeConfigEntry(id: string): ConfigEntryDescription;
|
|
28
|
+
//# sourceMappingURL=bouquet-presets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bouquet-presets.d.ts","sourceRoot":"","sources":["../../src/shared/bouquet-presets.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGjD,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CA0ChD,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,QAAQ,CAAC;AAE/C,MAAM,WAAW,iBAAiB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC7B,GAAG,EAAE,UAAU,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,UAAU,CAAC;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACnC;AA8FD,eAAO,MAAM,eAAe,EAAE,aAAa,EAOzC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,eAAe,CAAC;AAEvD,MAAM,WAAW,sBAAsB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,eAAe,CAAC;CACtB;AAwED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,sBAAsB,CAsBtE"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { ALL_BUILTIN_TOOL_IDS, TOOL_ID_GROUPS, HUB_INSPECT_TOOL_ID, USE_SPACE_TOOL_ID, HF_JOBS_TOOL_ID, } from '@llmindset/hf-mcp';
|
|
2
|
+
import { README_INCLUDE_FLAG, GRADIO_IMAGE_FILTER_FLAG } from './behavior-flags.js';
|
|
3
|
+
export const BOUQUETS = {
|
|
4
|
+
hf_api: {
|
|
5
|
+
builtInTools: [...TOOL_ID_GROUPS.hf_api],
|
|
6
|
+
spaceTools: [],
|
|
7
|
+
},
|
|
8
|
+
spaces: {
|
|
9
|
+
builtInTools: [...TOOL_ID_GROUPS.spaces],
|
|
10
|
+
spaceTools: [],
|
|
11
|
+
},
|
|
12
|
+
search: {
|
|
13
|
+
builtInTools: [...TOOL_ID_GROUPS.search],
|
|
14
|
+
spaceTools: [],
|
|
15
|
+
},
|
|
16
|
+
docs: {
|
|
17
|
+
builtInTools: [...TOOL_ID_GROUPS.docs],
|
|
18
|
+
spaceTools: [],
|
|
19
|
+
},
|
|
20
|
+
all: {
|
|
21
|
+
builtInTools: [...ALL_BUILTIN_TOOL_IDS],
|
|
22
|
+
spaceTools: [],
|
|
23
|
+
},
|
|
24
|
+
hub_repo_details_readme: {
|
|
25
|
+
builtInTools: [HUB_INSPECT_TOOL_ID, README_INCLUDE_FLAG],
|
|
26
|
+
spaceTools: [],
|
|
27
|
+
},
|
|
28
|
+
hub_repo_details: {
|
|
29
|
+
builtInTools: [HUB_INSPECT_TOOL_ID],
|
|
30
|
+
spaceTools: [],
|
|
31
|
+
},
|
|
32
|
+
no_gradio_images: {
|
|
33
|
+
builtInTools: [GRADIO_IMAGE_FILTER_FLAG],
|
|
34
|
+
spaceTools: [],
|
|
35
|
+
},
|
|
36
|
+
mcp_ui: {
|
|
37
|
+
builtInTools: [USE_SPACE_TOOL_ID],
|
|
38
|
+
spaceTools: [],
|
|
39
|
+
},
|
|
40
|
+
jobs: {
|
|
41
|
+
builtInTools: [HF_JOBS_TOOL_ID],
|
|
42
|
+
spaceTools: [],
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
const PRESET_META = [
|
|
46
|
+
{
|
|
47
|
+
key: 'spaces',
|
|
48
|
+
label: 'Spaces Toolkit',
|
|
49
|
+
description: 'Launch, inspect, and manage Spaces from your assistant.',
|
|
50
|
+
category: 'core',
|
|
51
|
+
supportsBouquet: true,
|
|
52
|
+
supportsMix: true,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
key: 'search',
|
|
56
|
+
label: 'Search Tools',
|
|
57
|
+
description: 'Semantic search across models, datasets, papers, and docs.',
|
|
58
|
+
category: 'core',
|
|
59
|
+
supportsBouquet: true,
|
|
60
|
+
supportsMix: true,
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
key: 'docs',
|
|
64
|
+
label: 'Hugging Face Documentation',
|
|
65
|
+
description: 'Documentation Search and Fetch tools.',
|
|
66
|
+
category: 'core',
|
|
67
|
+
supportsBouquet: true,
|
|
68
|
+
supportsMix: true,
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
key: 'hf_api',
|
|
72
|
+
label: 'Hugging Face MCP Defaults',
|
|
73
|
+
description: 'Balanced search plus repository details for models, datasets, and Spaces.',
|
|
74
|
+
category: 'core',
|
|
75
|
+
supportsBouquet: true,
|
|
76
|
+
supportsMix: true,
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
key: 'no_gradio_images',
|
|
80
|
+
label: 'No Gradio Images',
|
|
81
|
+
description: 'Disable image fetching when interacting with Gradio Spaces.',
|
|
82
|
+
category: 'advanced',
|
|
83
|
+
supportsBouquet: false,
|
|
84
|
+
supportsMix: false,
|
|
85
|
+
directParams: [
|
|
86
|
+
{
|
|
87
|
+
label: 'Disable Gradio images',
|
|
88
|
+
param: 'no_image_content=true',
|
|
89
|
+
description: 'Strip image content returned by Gradio endpoints.',
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
key: 'mcp_ui',
|
|
95
|
+
label: 'MCP UI Preview',
|
|
96
|
+
description: "Enable the MCP UI 'use_space' tool (Use with an MCP-UI client - see https://mcpui.dev/guide/supported-hosts).",
|
|
97
|
+
category: 'advanced',
|
|
98
|
+
supportsBouquet: true,
|
|
99
|
+
supportsMix: true,
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
key: 'jobs',
|
|
103
|
+
label: 'Run and Manage Jobs',
|
|
104
|
+
description: 'Run, monitor and schedule jobs on Hugging Face infrastructure.',
|
|
105
|
+
category: 'advanced',
|
|
106
|
+
supportsBouquet: true,
|
|
107
|
+
supportsMix: true,
|
|
108
|
+
},
|
|
109
|
+
];
|
|
110
|
+
export const BOUQUET_PRESETS = PRESET_META.map((preset) => {
|
|
111
|
+
const config = BOUQUETS[preset.key];
|
|
112
|
+
return {
|
|
113
|
+
...preset,
|
|
114
|
+
builtInTools: config ? [...config.builtInTools] : [],
|
|
115
|
+
directParams: preset.directParams ? preset.directParams.map((option) => ({ ...option })) : undefined,
|
|
116
|
+
};
|
|
117
|
+
});
|
|
118
|
+
const TOOL_DESCRIPTIONS = {
|
|
119
|
+
space_search: {
|
|
120
|
+
label: 'Space Search',
|
|
121
|
+
description: 'Semantic search across public Spaces on the Hugging Face Hub.',
|
|
122
|
+
},
|
|
123
|
+
model_search: {
|
|
124
|
+
label: 'Model Search',
|
|
125
|
+
description: 'Find models on the Hub by keyword or capability.',
|
|
126
|
+
},
|
|
127
|
+
model_details: {
|
|
128
|
+
label: 'Model Details',
|
|
129
|
+
description: 'Retrieve detailed metadata for a specific model repository.',
|
|
130
|
+
},
|
|
131
|
+
paper_search: {
|
|
132
|
+
label: 'Paper Search',
|
|
133
|
+
description: 'Discover research papers relevant to your query.',
|
|
134
|
+
},
|
|
135
|
+
dataset_search: {
|
|
136
|
+
label: 'Dataset Search',
|
|
137
|
+
description: 'Explore datasets published on the Hub.',
|
|
138
|
+
},
|
|
139
|
+
dataset_details: {
|
|
140
|
+
label: 'Dataset Details',
|
|
141
|
+
description: 'Inspect dataset metadata and card information.',
|
|
142
|
+
},
|
|
143
|
+
duplicate_space: {
|
|
144
|
+
label: 'Duplicate Space',
|
|
145
|
+
description: 'Clone a Space into your namespace for customization.',
|
|
146
|
+
},
|
|
147
|
+
space_info: {
|
|
148
|
+
label: 'Space Info',
|
|
149
|
+
description: 'List Spaces for a username or organization.',
|
|
150
|
+
},
|
|
151
|
+
space_files: {
|
|
152
|
+
label: 'Space Files',
|
|
153
|
+
description: 'Browse the file structure of a Space repository.',
|
|
154
|
+
},
|
|
155
|
+
use_space: {
|
|
156
|
+
label: 'Use Space',
|
|
157
|
+
description: 'Launch or interact with a Space through the MCP UI.',
|
|
158
|
+
},
|
|
159
|
+
hf_doc_search: {
|
|
160
|
+
label: 'Docs Search',
|
|
161
|
+
description: 'Search the Hugging Face documentation site.',
|
|
162
|
+
},
|
|
163
|
+
hf_doc_fetch: {
|
|
164
|
+
label: 'Docs Fetch',
|
|
165
|
+
description: 'Retrieve full documentation pages for follow-up analysis.',
|
|
166
|
+
},
|
|
167
|
+
hub_repo_details: {
|
|
168
|
+
label: 'Hub Repo Details',
|
|
169
|
+
description: 'Inspect metadata for models, datasets, or Spaces on the Hub.',
|
|
170
|
+
},
|
|
171
|
+
hf_jobs: {
|
|
172
|
+
label: 'HF Jobs',
|
|
173
|
+
description: 'Run, monitor and schedule jobs on Hugging Face infrastructure.',
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
const BEHAVIOR_FLAG_DESCRIPTIONS = {
|
|
177
|
+
[README_INCLUDE_FLAG]: {
|
|
178
|
+
label: 'Allow README Include',
|
|
179
|
+
description: 'Permit README sections to be returned in responses (advanced).',
|
|
180
|
+
},
|
|
181
|
+
[GRADIO_IMAGE_FILTER_FLAG]: {
|
|
182
|
+
label: 'Skip Gradio Images',
|
|
183
|
+
description: 'Prevent image downloads from Gradio endpoints (advanced).',
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
export function describeConfigEntry(id) {
|
|
187
|
+
const tool = TOOL_DESCRIPTIONS[id];
|
|
188
|
+
if (tool) {
|
|
189
|
+
return {
|
|
190
|
+
id,
|
|
191
|
+
kind: 'tool',
|
|
192
|
+
...tool,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
const flag = BEHAVIOR_FLAG_DESCRIPTIONS[id];
|
|
196
|
+
if (flag) {
|
|
197
|
+
return {
|
|
198
|
+
id,
|
|
199
|
+
kind: 'behavior-flag',
|
|
200
|
+
...flag,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
id,
|
|
205
|
+
label: id,
|
|
206
|
+
kind: 'tool',
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=bouquet-presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bouquet-presets.js","sourceRoot":"","sources":["../../src/shared/bouquet-presets.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,oBAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,GACf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAEpF,MAAM,CAAC,MAAM,QAAQ,GAAgC;IACpD,MAAM,EAAE;QACP,YAAY,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC;QACxC,UAAU,EAAE,EAAE;KACd;IACD,MAAM,EAAE;QACP,YAAY,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC;QACxC,UAAU,EAAE,EAAE;KACd;IACD,MAAM,EAAE;QACP,YAAY,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC;QACxC,UAAU,EAAE,EAAE;KACd;IACD,IAAI,EAAE;QACL,YAAY,EAAE,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC;QACtC,UAAU,EAAE,EAAE;KACd;IACD,GAAG,EAAE;QACJ,YAAY,EAAE,CAAC,GAAG,oBAAoB,CAAC;QACvC,UAAU,EAAE,EAAE;KACd;IAED,uBAAuB,EAAE;QACxB,YAAY,EAAE,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;QACxD,UAAU,EAAE,EAAE;KACd;IACD,gBAAgB,EAAE;QACjB,YAAY,EAAE,CAAC,mBAAmB,CAAC;QACnC,UAAU,EAAE,EAAE;KACd;IACD,gBAAgB,EAAE;QACjB,YAAY,EAAE,CAAC,wBAAwB,CAAC;QACxC,UAAU,EAAE,EAAE;KACd;IACD,MAAM,EAAE;QACP,YAAY,EAAE,CAAC,iBAAiB,CAAC;QACjC,UAAU,EAAE,EAAE;KACd;IACD,IAAI,EAAE;QACL,YAAY,EAAE,CAAC,eAAe,CAAC;QAC/B,UAAU,EAAE,EAAE;KACd;CACD,CAAC;AAqBF,MAAM,WAAW,GAA+C;IAC/D;QACC,GAAG,EAAE,QAAQ;QACb,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,yDAAyD;QACtE,QAAQ,EAAE,MAAM;QAChB,eAAe,EAAE,IAAI;QACrB,WAAW,EAAE,IAAI;KACjB;IACD;QACC,GAAG,EAAE,QAAQ;QACb,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,4DAA4D;QACzE,QAAQ,EAAE,MAAM;QAChB,eAAe,EAAE,IAAI;QACrB,WAAW,EAAE,IAAI;KACjB;IACD;QACC,GAAG,EAAE,MAAM;QACX,KAAK,EAAE,4BAA4B;QACnC,WAAW,EAAE,uCAAuC;QACpD,QAAQ,EAAE,MAAM;QAChB,eAAe,EAAE,IAAI;QACrB,WAAW,EAAE,IAAI;KACjB;IACD;QACC,GAAG,EAAE,QAAQ;QACb,KAAK,EAAE,2BAA2B;QAClC,WAAW,EAAE,2EAA2E;QACxF,QAAQ,EAAE,MAAM;QAChB,eAAe,EAAE,IAAI;QACrB,WAAW,EAAE,IAAI;KACjB;IA0BD;QACC,GAAG,EAAE,kBAAkB;QACvB,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,6DAA6D;QAC1E,QAAQ,EAAE,UAAU;QACpB,eAAe,EAAE,KAAK;QACtB,WAAW,EAAE,KAAK;QAClB,YAAY,EAAE;YACb;gBACC,KAAK,EAAE,uBAAuB;gBAC9B,KAAK,EAAE,uBAAuB;gBAC9B,WAAW,EAAE,mDAAmD;aAChE;SACD;KACD;IACD;QACC,GAAG,EAAE,QAAQ;QACb,KAAK,EAAE,gBAAgB;QACvB,WAAW,EACV,+GAA+G;QAChH,QAAQ,EAAE,UAAU;QACpB,eAAe,EAAE,IAAI;QACrB,WAAW,EAAE,IAAI;KACjB;IACD;QACC,GAAG,EAAE,MAAM;QACX,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,gEAAgE;QAC7E,QAAQ,EAAE,UAAU;QACpB,eAAe,EAAE,IAAI;QACrB,WAAW,EAAE,IAAI;KACjB;CACD,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAoB,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;IAC1E,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO;QACN,GAAG,MAAM;QACT,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE;QACpD,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;KACpG,CAAC;AACH,CAAC,CAAC,CAAC;AAWH,MAAM,iBAAiB,GAAgE;IACtF,YAAY,EAAE;QACb,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,+DAA+D;KAC5E;IACD,YAAY,EAAE;QACb,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,kDAAkD;KAC/D;IACD,aAAa,EAAE;QACd,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,6DAA6D;KAC1E;IACD,YAAY,EAAE;QACb,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,kDAAkD;KAC/D;IACD,cAAc,EAAE;QACf,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,wCAAwC;KACrD;IACD,eAAe,EAAE;QAChB,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,gDAAgD;KAC7D;IACD,eAAe,EAAE;QAChB,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,sDAAsD;KACnE;IACD,UAAU,EAAE;QACX,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,6CAA6C;KAC1D;IACD,WAAW,EAAE;QACZ,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,kDAAkD;KAC/D;IACD,SAAS,EAAE;QACV,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,qDAAqD;KAClE;IACD,aAAa,EAAE;QACd,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,6CAA6C;KAC1D;IACD,YAAY,EAAE;QACb,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,2DAA2D;KACxE;IACD,gBAAgB,EAAE;QACjB,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,8DAA8D;KAC3E;IACD,OAAO,EAAE;QACR,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,gEAAgE;KAC7E;CACD,CAAC;AAEF,MAAM,0BAA0B,GAAgE;IAC/F,CAAC,mBAAmB,CAAC,EAAE;QACtB,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,gEAAgE;KAC7E;IACD,CAAC,wBAAwB,CAAC,EAAE;QAC3B,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,2DAA2D;KACxE;CACD,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,EAAU;IAC7C,MAAM,IAAI,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACnC,IAAI,IAAI,EAAE,CAAC;QACV,OAAO;YACN,EAAE;YACF,IAAI,EAAE,MAAM;YACZ,GAAG,IAAI;SACP,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,0BAA0B,CAAC,EAAE,CAAC,CAAC;IAC5C,IAAI,IAAI,EAAE,CAAC;QACV,OAAO;YACN,EAAE;YACF,IAAI,EAAE,eAAe;YACrB,GAAG,IAAI;SACP,CAAC;IACH,CAAC;IACD,OAAO;QACN,EAAE;QACF,KAAK,EAAE,EAAE;QACT,IAAI,EAAE,MAAM;KACZ,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a,j as t,d as j}from"./index-
|
|
1
|
+
import{a,j as t,d as j}from"./index-BBRBgpfp.js";const O={url:"https://example.com/audio.wav"},E={lastPlayed:null};function J(){const p=a.useRef(null),[h,m]=a.useState(JSON.stringify(O,null,2)),[c,f]=a.useState(JSON.stringify(E,null,2)),[i,w]=a.useState("inline"),[n,y]=a.useState(800),[r,S]=a.useState("light"),[N,b]=a.useState(null);a.useEffect(()=>{const e=localStorage.getItem("gradio-widget-dev-state");if(e)try{const o=JSON.parse(e);o.toolOutputJson&&m(o.toolOutputJson),o.widgetStateJson&&f(o.widgetStateJson),o.displayMode&&w(o.displayMode),o.maxHeight&&y(o.maxHeight),o.theme&&S(o.theme)}catch(o){console.error("Failed to load saved state:",o)}},[]),a.useEffect(()=>{const e={toolOutputJson:h,widgetStateJson:c,displayMode:i,maxHeight:n,theme:r};localStorage.setItem("gradio-widget-dev-state",JSON.stringify(e))},[h,c,i,n,r]),a.useEffect(()=>{const e=p.current;if(!(e!=null&&e.contentWindow))return;const o=e.contentWindow,l=o.openai;if(!l)return;l.displayMode=i,l.maxHeight=n,l.theme=r;const u=new CustomEvent("openai:set_globals",{detail:{globals:{displayMode:i,maxHeight:n,theme:r}}});o.dispatchEvent(u),console.log("[Shim] Auto-updated displayMode, maxHeight, theme")},[i,n,r]),a.useEffect(()=>{const e=p.current;if(!e)return;const o=()=>{const l=e.contentWindow;if(!l)return;const u=s=>{const g=new CustomEvent("openai:set_globals",{detail:{globals:s}});l.dispatchEvent(g)},d={theme:r,locale:"en-US",displayMode:i,maxHeight:n,toolInput:{},toolOutput:null,toolResponseMetadata:null,widgetState:null,userAgent:{device:{type:"desktop"},capabilities:{hover:!0,touch:!1}},safeArea:{insets:{top:0,bottom:0,left:0,right:0}},setWidgetState:async s=>{console.log("[Shim] setWidgetState called:",s),f(JSON.stringify(s,null,2)),d.widgetState=s,u({widgetState:s})},callTool:async(s,g)=>(console.log("[Shim] callTool called:",s,g),{result:"Mock tool response"}),sendFollowUpMessage:async s=>{console.log("[Shim] sendFollowUpMessage called:",s)},openExternal:s=>{console.log("[Shim] openExternal called:",s),window.open(s.href,"_blank")},requestDisplayMode:async s=>(console.log("[Shim] requestDisplayMode called:",s),w(s.mode),{mode:s.mode})},v=l;v.openai=d,console.log("[Shim] window.openai initialized in iframe"),setTimeout(()=>{try{const s=JSON.parse(h),g=c.trim()?JSON.parse(c):null;d.toolOutput=s,d.widgetState=g,u({toolOutput:s,widgetState:g,displayMode:i,maxHeight:n,theme:r}),console.log("[Shim] Initial data sent to widget")}catch(s){console.error("[Shim] Failed to send initial data:",s)}},100)};return e.addEventListener("load",o),()=>e.removeEventListener("load",o)},[]);const x=()=>{b(null);const e=p.current;if(!(e!=null&&e.contentWindow)){b("Iframe not loaded");return}try{const o=JSON.parse(h),l=c.trim()?JSON.parse(c):null,u=e.contentWindow,d=u.openai;if(!d){b("window.openai not initialized");return}d.toolOutput=o,d.widgetState=l,d.displayMode=i,d.maxHeight=n,d.theme=r;const v=new CustomEvent("openai:set_globals",{detail:{globals:{toolOutput:o,widgetState:l,displayMode:i,maxHeight:n,theme:r}}});u.dispatchEvent(v),console.log("[Shim] Update sent to widget")}catch(o){b(`Invalid JSON: ${o instanceof Error?o.message:String(o)}`)}};return t.jsxs("div",{className:"flex h-screen bg-gray-100",children:[t.jsx("div",{className:"flex-1 p-4 overflow-hidden",children:t.jsx("div",{className:"h-full bg-white rounded-lg shadow-lg overflow-hidden",children:t.jsx("iframe",{ref:p,src:"/gradio-widget.html",className:"w-full h-full border-0",title:"Gradio Widget"})})}),t.jsxs("div",{className:"w-96 p-4 overflow-y-auto bg-white border-l border-gray-200",children:[t.jsxs("div",{className:"flex items-center gap-2 mb-4",children:[t.jsx("h1",{className:"text-2xl font-bold",children:"Widget Dev"}),t.jsx("span",{className:"px-2 py-1 text-xs font-semibold bg-blue-100 text-blue-800 rounded",children:"IFRAME"})]}),t.jsxs("div",{className:"mb-4 p-3 bg-blue-50 border border-blue-200 rounded-lg text-blue-700 text-sm",children:[t.jsx("strong",{children:"Iframe Mode:"})," Widget loads in isolated context. Check browser console for [Shim] logs."]}),N&&t.jsx("div",{className:"mb-4 p-3 bg-red-50 border border-red-200 rounded-lg text-red-700 text-sm",children:N}),t.jsxs("div",{className:"mb-6",children:[t.jsx("label",{className:"block text-sm font-medium mb-2",children:"Tool Output (JSON)"}),t.jsx("textarea",{value:h,onChange:e=>m(e.target.value),className:"w-full h-32 p-2 border border-gray-300 rounded font-mono text-sm",spellCheck:!1})]}),t.jsxs("div",{className:"mb-6",children:[t.jsx("label",{className:"block text-sm font-medium mb-2",children:"Widget State (JSON)"}),t.jsx("textarea",{value:c,onChange:e=>f(e.target.value),className:"w-full h-32 p-2 border border-gray-300 rounded font-mono text-sm",spellCheck:!1})]}),t.jsxs("div",{className:"mb-6",children:[t.jsx("label",{className:"block text-sm font-medium mb-2",children:"Display Mode"}),t.jsx("div",{className:"flex gap-2",children:["inline","fullscreen","pip"].map(e=>t.jsx("button",{onClick:()=>w(e),className:`px-4 py-2 rounded font-medium ${i===e?"bg-blue-500 text-white":"bg-gray-200 text-gray-700 hover:bg-gray-300"}`,children:e},e))})]}),t.jsxs("div",{className:"mb-6",children:[t.jsxs("label",{className:"block text-sm font-medium mb-2",children:["Max Height: ",n,"px"]}),t.jsx("input",{type:"range",min:"400",max:"1200",step:"50",value:n,onChange:e=>y(Number(e.target.value)),className:"w-full"})]}),t.jsxs("div",{className:"mb-6",children:[t.jsx("label",{className:"block text-sm font-medium mb-2",children:"Theme"}),t.jsx("div",{className:"flex gap-2",children:["light","dark"].map(e=>t.jsx("button",{onClick:()=>S(e),className:`px-4 py-2 rounded font-medium ${r===e?"bg-blue-500 text-white":"bg-gray-200 text-gray-700 hover:bg-gray-300"}`,children:e},e))})]}),t.jsx("button",{onClick:x,className:"w-full py-3 bg-green-600 text-white rounded-lg font-semibold hover:bg-green-700 transition-colors",children:"Send Update"}),t.jsxs("div",{className:"mt-8 pt-6 border-t border-gray-200",children:[t.jsx("h2",{className:"text-lg font-semibold mb-3",children:"Quick Presets"}),t.jsxs("div",{className:"space-y-2",children:[t.jsx("button",{onClick:()=>{m(JSON.stringify({url:"https://example.com/audio.wav"},null,2)),x()},className:"w-full px-3 py-2 text-sm bg-gray-100 hover:bg-gray-200 rounded text-left",children:"Audio WAV"}),t.jsx("button",{onClick:()=>{m(JSON.stringify({url:"https://huggingface.co/datasets/huggingface/brand-assets/resolve/main/hf-logo.png"},null,2)),x()},className:"w-full px-3 py-2 text-sm bg-gray-100 hover:bg-gray-200 rounded text-left",children:"Image PNG"}),t.jsx("button",{onClick:()=>{m(JSON.stringify({url:"https://example.com/video.mp4"},null,2)),x()},className:"w-full px-3 py-2 text-sm bg-gray-100 hover:bg-gray-200 rounded text-left",children:"Video MP4"}),t.jsx("button",{onClick:()=>{m(JSON.stringify({},null,2)),x()},className:"w-full px-3 py-2 text-sm bg-gray-100 hover:bg-gray-200 rounded text-left",children:"Empty (no content)"}),t.jsx("button",{onClick:()=>{m("");const e=p.current;if(e!=null&&e.contentWindow){const o=e.contentWindow,l=o.openai;if(l){l.toolOutput=null;const u=new CustomEvent("openai:set_globals",{detail:{globals:{toolOutput:null,widgetState:c.trim()?JSON.parse(c):null,displayMode:i,maxHeight:n,theme:r}}});o.dispatchEvent(u),console.log("[Shim] Loading state activated")}}},className:"w-full px-3 py-2 text-sm bg-purple-100 hover:bg-purple-200 rounded text-left",children:"Show Loading"})]})]})]})]})}j.createRoot(document.getElementById("root")).render(t.jsx(a.StrictMode,{children:t.jsx(J,{})}));
|