import { cesiumBrowserToolContracts, cesiumBrowserToolsetDefinitions, cesiumBrowserToolsetNames, cesiumSharedToolNames, cesiumResourceToolContracts, getCesiumToolAction, } from 'cesium-mcp-contracts' import type { CesiumBrowserToolsetName, CesiumToolLocale, JsonSchema, } from 'cesium-mcp-contracts' export const cesiumRuntimeOnlyToolNames = ['setIonToken'] as const export const cesiumRuntimeResourceToolNames = [ 'storeResource', 'listResources', 'deleteResource', ] as const export const cesiumRuntimeMetaToolNames = ['list_toolsets', 'enable_toolset'] as const export interface CesiumRuntimeToolMetadata { action: string description: string inputSchema: JsonSchema outputSchema: JsonSchema parameterDescriptions: Readonly> annotations: { title: string readOnlyHint: boolean destructiveHint: boolean idempotentHint: boolean openWorldHint: boolean } } const sharedContractByName = new Map( [...cesiumBrowserToolContracts, ...cesiumResourceToolContracts] .map(contract => [contract.name, contract]), ) export function getCesiumRuntimeToolMetadata( name: string, locale: CesiumToolLocale, ): CesiumRuntimeToolMetadata | undefined { const contract = sharedContractByName.get(name) if (!contract) return undefined const localized = contract.localizations[locale] return { action: getCesiumToolAction(contract), description: localized.description, inputSchema: contract.inputSchema, outputSchema: contract.outputSchema, parameterDescriptions: localized.parameters, annotations: { title: contract.title, readOnlyHint: contract.annotations.readOnlyHint ?? false, destructiveHint: contract.annotations.destructiveHint ?? false, idempotentHint: contract.annotations.idempotentHint ?? false, openWorldHint: contract.annotations.openWorldHint ?? false, }, } } export function getCesiumRuntimeToolAction(name: string): string { const contract = sharedContractByName.get(name) return contract ? getCesiumToolAction(contract) : name } export const cesiumRuntimeToolsets: Readonly< Record > = Object.fromEntries(cesiumBrowserToolsetNames.map(name => [ name, name === 'scene' ? [...cesiumBrowserToolsetDefinitions[name].names, ...cesiumRuntimeOnlyToolNames] : [...cesiumBrowserToolsetDefinitions[name].names], ])) as unknown as Readonly> export const cesiumRuntimeToolsetDescriptions: Readonly> = Object.fromEntries(cesiumBrowserToolsetNames.map(name => [ name, cesiumBrowserToolsetDefinitions[name].description, ])) as unknown as Readonly> export const cesiumRuntimeCommandToolNames: readonly string[] = [ ...cesiumSharedToolNames, ...cesiumRuntimeOnlyToolNames, ...cesiumRuntimeResourceToolNames, ]