@gtkx/mcp 2.0.0-beta.10 → 2.0.0-beta.11

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.
@@ -1 +1 @@
1
- {"version":3,"file":"reference.js","sourceRoot":"","sources":["../src/reference.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ApiReference, type ApiSymbol, loadApiReference, resolveGirPath, resolveLibraries } from \"@gtkx/codegen\";\nimport { loadConfig } from \"@gtkx/config\";\nimport { type McpServer, ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { type CallToolResult, ErrorCode, McpError, type ReadResourceResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { existsSync, statSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport { defineTool, textContent, textError, type Tool, type ToolArgs } from \"./tool.js\";\n\ntype ReferenceApi = Pick<\n ApiReference,\n \"lookup\" | \"namespaceOverview\" | \"namespaces\" | \"overview\" | \"search\" | \"symbolNames\"\n>;\n\ntype ProjectSource = \"argument\" | \"workingDirectory\" | \"app\";\n\ntype ResolvedProject = {\n root: string;\n source: ProjectSource;\n};\n\ntype ScopedReference = ResolvedProject & {\n reference: ReferenceApi;\n};\n\ntype ReferenceProviderOptions = {\n getAppRoot: () => string | undefined;\n getWorkingDirectory?: () => string;\n};\n\ntype ReferenceProvider = {\n get(projectRoot?: string): Promise<ScopedReference>;\n load(project: ResolvedProject): Promise<ScopedReference>;\n resolve(projectRoot?: string): ResolvedProject;\n};\n\ntype WatchedFile = {\n path: string;\n mtimeMs: number;\n size: number;\n};\n\ntype LoadedReference = {\n reference: ApiReference;\n root: string;\n watched: WatchedFile[];\n};\n\ntype CacheEntry = {\n pending: Promise<LoadedReference>;\n verifiedAt: number;\n failedAt: number | undefined;\n};\n\ntype ReferenceCache = Map<string, CacheEntry>;\ntype SearchOptions = Parameters<ReferenceApi[\"search\"]>[0];\ntype ResourceServer = Pick<McpServer, \"registerResource\">;\n\nconst FRESHNESS_INTERVAL_MS = 2000;\nconst FAILURE_RETRY_MS = 5000;\nconst CONFIG_EXTENSIONS = [\"ts\", \"mts\", \"js\", \"mjs\", \"json\"];\n\nconst PROJECT_SOURCE_LABELS: Record<ProjectSource, string> = {\n argument: \"requested with `projectRoot`\",\n workingDirectory: \"found from the working directory\",\n app: \"taken from a connected app; pass `projectRoot` to document another project\",\n};\n\nconst SYMBOL_KIND = z.enum([\n \"element\",\n \"class\",\n \"interface\",\n \"record\",\n \"enum\",\n \"callback\",\n \"alias\",\n \"function\",\n \"constant\",\n]);\n\nconst SYMBOL_DESCRIPTION =\n \"Qualified symbol name (`Adw.Toast`, `Gtk.Orientation`, `GLib.idleAdd`), JSX element name (`AdwToast`), \" +\n \"or bare symbol name when unambiguous (`Toast`).\";\n\nconst PROJECT_ROOT_DESCRIPTION =\n \"Directory of the GTKX project whose bindings to document, absolute or relative to the working directory. \" +\n \"Any directory inside the project works; its `gtkx.config.ts` decides the documented libraries. Omit to use \" +\n \"the project containing the working directory, falling back to a connected app's project.\";\n\nconst projectRootShape = {\n projectRoot: z.string().optional().describe(PROJECT_ROOT_DESCRIPTION),\n};\n\nconst listApiShape = {\n ...projectRootShape,\n namespace: z\n .string()\n .optional()\n .describe(\"Namespace to list (e.g. `Adw`, `Gtk`, `Gio`). Omit for an overview of all namespaces.\"),\n};\n\nconst searchApiShape = {\n ...projectRootShape,\n query: z.string().describe(\"Case-insensitive substring of a symbol name, e.g. `headerbar` or `orientation`.\"),\n namespace: z.string().optional().describe(\"Restrict matches to one namespace (e.g. `Adw`).\"),\n kind: SYMBOL_KIND.optional().describe(\"Restrict matches to one symbol kind.\"),\n limit: z.number().int().min(1).optional().describe(\"Maximum number of results (default: 20).\"),\n};\n\nconst apiDocsShape = {\n ...projectRootShape,\n symbol: z.string().describe(SYMBOL_DESCRIPTION),\n kind: SYMBOL_KIND.optional().describe(\"Disambiguate when several kinds share the symbol name.\"),\n};\n\nconst watchFile = (path: string): WatchedFile => {\n try {\n const stats = statSync(path);\n\n return { path, mtimeMs: stats.mtimeMs, size: stats.size };\n } catch {\n return { path, mtimeMs: -1, size: -1 };\n }\n};\n\nconst isFresh = (loaded: LoadedReference): boolean =>\n loaded.watched.every((file) => {\n const current = watchFile(file.path);\n\n return current.mtimeMs === file.mtimeMs && current.size === file.size;\n });\n\nconst hasConfigFile = (directory: string): boolean =>\n CONFIG_EXTENSIONS.some((extension) => existsSync(join(directory, `gtkx.config.${extension}`)));\n\nconst findProjectRoot = (start: string): string | undefined => {\n const current = resolve(start);\n const parent = dirname(current);\n\n if (hasConfigFile(current)) {\n return current;\n }\n\n return parent === current ? undefined : findProjectRoot(parent);\n};\n\nconst projectAt = (candidate: string, source: ProjectSource): ResolvedProject => ({\n root: findProjectRoot(candidate) ?? resolve(candidate),\n source,\n});\n\nconst resolveProject = (\n workingDirectory: string,\n getAppRoot: () => string | undefined,\n projectRoot: string | undefined,\n): ResolvedProject => {\n if (projectRoot !== undefined) {\n return projectAt(projectRoot, \"argument\");\n }\n\n const discovered = findProjectRoot(workingDirectory);\n\n if (discovered !== undefined) {\n return { root: discovered, source: \"workingDirectory\" };\n }\n\n const appRoot = getAppRoot();\n\n return appRoot === undefined\n ? { root: resolve(workingDirectory), source: \"workingDirectory\" }\n : projectAt(appRoot, \"app\");\n};\n\nconst loadReference = async (requestedRoot: string): Promise<LoadedReference> => {\n const { config, configFile, root } = await loadConfig(requestedRoot);\n\n if (config.codegen === false) {\n throw new Error(\n `codegen is disabled for the project at ${root}, so there are no generated bindings to document. ` +\n \"Remove `codegen: false` from gtkx.config.ts to use the API reference, or point the `projectRoot` \" +\n \"argument at another project.\",\n );\n }\n\n const girPath = resolveGirPath(config.girPath);\n\n if (girPath.length === 0) {\n throw new Error(\n \"No GIR search paths available. Install gobject-introspection \" +\n \"(Linux: `sudo dnf install gobject-introspection-devel` or `sudo apt install libgirepository1.0-dev`), \" +\n \"or set `girPath` in gtkx.config.ts.\",\n );\n }\n\n const libraries = resolveLibraries(config.libraries);\n\n const reference = loadApiReference({\n libraries,\n girPath,\n });\n\n const watched = [watchFile(resolve(root, configFile)), ...reference.girFiles.map((file) => watchFile(file))];\n\n return { reference, root, watched };\n};\n\nconst startLoad = (cache: ReferenceCache, root: string): CacheEntry => {\n const entry: CacheEntry = { pending: loadReference(root), verifiedAt: Date.now(), failedAt: undefined };\n\n void entry.pending.catch(() => {\n entry.failedAt = Date.now();\n });\n\n cache.set(root, entry);\n\n return entry;\n};\n\nconst isRetryDue = (entry: CacheEntry): boolean =>\n entry.failedAt !== undefined && Date.now() - entry.failedAt >= FAILURE_RETRY_MS;\n\nconst resolveEntry = (cache: ReferenceCache, root: string): CacheEntry => {\n const entry = cache.get(root) ?? startLoad(cache, root);\n\n return isRetryDue(entry) ? startLoad(cache, root) : entry;\n};\n\nconst revalidate = (cache: ReferenceCache, root: string, entry: CacheEntry): CacheEntry => {\n const current = cache.get(root);\n\n return current === undefined || current === entry ? startLoad(cache, root) : current;\n};\n\nconst currentReference = async (cache: ReferenceCache, root: string): Promise<LoadedReference> => {\n const entry = resolveEntry(cache, root);\n const loaded = await entry.pending;\n\n if (Date.now() - entry.verifiedAt < FRESHNESS_INTERVAL_MS) {\n return loaded;\n }\n\n if (isFresh(loaded)) {\n entry.verifiedAt = Date.now();\n\n return loaded;\n }\n\n return revalidate(cache, root, entry).pending;\n};\n\nconst createReferenceProvider = (options: ReferenceProviderOptions): ReferenceProvider => {\n const cache: ReferenceCache = new Map();\n const getWorkingDirectory = options.getWorkingDirectory ?? (() => process.cwd());\n\n const resolve = (projectRoot?: string): ResolvedProject =>\n resolveProject(getWorkingDirectory(), options.getAppRoot, projectRoot);\n\n const load = async (project: ResolvedProject): Promise<ScopedReference> => {\n const loaded = await currentReference(cache, project.root);\n\n return { reference: loaded.reference, root: loaded.root, source: project.source };\n };\n\n const get = (projectRoot?: string): Promise<ScopedReference> => load(resolve(projectRoot));\n\n return { get, load, resolve };\n};\n\nconst projectNote = (project: ResolvedProject): string =>\n `Project: ${project.root} (${PROJECT_SOURCE_LABELS[project.source]})`;\n\nconst withProjectNote = (result: CallToolResult, note: string): CallToolResult => ({\n ...result,\n content: [...result.content, { type: \"text\", text: note }],\n});\n\nconst scopedResult = async (\n provider: ReferenceProvider,\n projectRoot: string | undefined,\n render: (reference: ReferenceApi) => CallToolResult,\n): Promise<CallToolResult> => {\n const resolved = provider.resolve(projectRoot);\n\n try {\n const scoped = await provider.load(resolved);\n\n return withProjectNote(render(scoped.reference), projectNote(scoped));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n return withProjectNote(textError(message), projectNote(resolved));\n }\n};\n\nconst formatCandidates = (candidates: ApiSymbol[]): string =>\n candidates.map((candidate) => `- ${candidate.namespace}.${candidate.name} (${candidate.kind})`).join(\"\\n\");\n\nconst buildSearchOptions = (args: ToolArgs<typeof searchApiShape>): SearchOptions => ({\n query: args.query,\n ...(args.namespace !== undefined && { namespace: args.namespace }),\n ...(args.kind !== undefined && { kinds: [args.kind] }),\n ...(args.limit !== undefined && { limit: args.limit }),\n});\n\nconst listApiResult = (reference: ReferenceApi, namespace: string | undefined): CallToolResult => {\n if (namespace === undefined) {\n return textContent(reference.overview());\n }\n\n const overview = reference.namespaceOverview(namespace);\n\n if (overview === undefined) {\n const names = reference\n .namespaces()\n .map((summary) => summary.name)\n .join(\", \");\n\n return textError(`Unknown namespace \"${namespace}\". Available namespaces: ${names}`);\n }\n\n return textContent(overview);\n};\n\nconst searchApiResult = (reference: ReferenceApi, args: ToolArgs<typeof searchApiShape>): CallToolResult => {\n const results = reference.search(buildSearchOptions(args));\n\n if (results.length === 0) {\n return textContent(`No symbols matched \"${args.query}\". Try a shorter substring or \\`gtkx_list_api\\`.`);\n }\n\n return textContent(JSON.stringify(results, null, 2));\n};\n\nconst apiDocsResult = (reference: ReferenceApi, args: ToolArgs<typeof apiDocsShape>): CallToolResult => {\n const result = reference.lookup(args.symbol, args.kind);\n\n if (result.outcome === \"notFound\") {\n return textError(`No symbol named \"${args.symbol}\". Use \\`gtkx_search_api\\` to find the right name.`);\n }\n\n if (result.outcome === \"ambiguous\") {\n return textError(\n `\"${args.symbol}\" matches several symbols. Pass a qualified name or a kind:\\n` +\n formatCandidates(result.candidates),\n );\n }\n\n return textContent(result.markdown);\n};\n\nconst listApiTool = (provider: ReferenceProvider): Tool =>\n defineTool({\n name: \"gtkx_list_api\",\n title: \"List API reference\",\n kind: \"readOnly\",\n description:\n \"List the project's generated bindings API (`@gtkx/gi` and `@gtkx/jsx`), including Adwaita, \" +\n \"GTK4, and its declared GIR libraries. Without a namespace, returns every namespace with symbol counts; \" +\n \"with a namespace, lists all of its symbols grouped by kind.\",\n inputSchema: listApiShape,\n handler: ({ namespace, projectRoot }) =>\n scopedResult(provider, projectRoot, (reference) => listApiResult(reference, namespace)),\n });\n\nconst searchApiTool = (provider: ReferenceProvider): Tool =>\n defineTool({\n name: \"gtkx_search_api\",\n title: \"Search API reference\",\n kind: \"readOnly\",\n description:\n \"Search the project's generated bindings API by symbol name. Returns matching symbols with \" +\n \"their namespace, kind, and a one-line summary; fetch full pages with `gtkx_get_api_docs`.\",\n inputSchema: searchApiShape,\n handler: (args) => scopedResult(provider, args.projectRoot, (reference) => searchApiResult(reference, args)),\n });\n\nconst getApiDocsTool = (provider: ReferenceProvider): Tool =>\n defineTool({\n name: \"gtkx_get_api_docs\",\n title: \"Get API docs\",\n kind: \"readOnly\",\n description:\n \"Get the full reference page for one symbol of the project's generated bindings: JSX elements \" +\n \"(props, signals, methods) or `@gtkx/gi` classes, interfaces, records, enums, callbacks, aliases, \" +\n \"functions, and constants.\",\n inputSchema: apiDocsShape,\n handler: (args) => scopedResult(provider, args.projectRoot, (reference) => apiDocsResult(reference, args)),\n });\n\nconst buildReferenceTools = (provider: ReferenceProvider): Tool[] => [\n listApiTool(provider),\n searchApiTool(provider),\n getApiDocsTool(provider),\n];\n\nconst markdownResource = (uri: URL, text: string): ReadResourceResult => ({\n contents: [{ uri: uri.href, mimeType: \"text/markdown\", text }],\n});\n\nconst variableValue = (value: string | string[] | undefined): string =>\n Array.isArray(value) ? (value[0] ?? \"\") : (value ?? \"\");\n\nconst withLoadFallback = async <T>(load: () => Promise<T>, fallback: T): Promise<T> => {\n try {\n return await load();\n } catch {\n return fallback;\n }\n};\n\nconst completeNames = (\n provider: ReferenceProvider,\n value: string,\n collect: (reference: ReferenceApi) => string[],\n): Promise<string[]> =>\n withLoadFallback(async () => {\n const { reference } = await provider.get();\n\n return collect(reference).filter((name) => name.toLowerCase().startsWith(value.toLowerCase()));\n }, []);\n\nconst namespaceCompleter =\n (provider: ReferenceProvider) =>\n (value: string): Promise<string[]> =>\n completeNames(provider, value, (reference) => reference.namespaces().map((summary) => summary.name));\n\nconst completeSymbol = (provider: ReferenceProvider, namespace: string, value: string): Promise<string[]> => {\n if (namespace.length === 0) {\n return Promise.resolve([]);\n }\n\n return completeNames(provider, value, (reference) => reference.symbolNames(namespace));\n};\n\nconst resourceNotFound = (message: string): McpError => new McpError(ErrorCode.InvalidParams, message);\n\nconst symbolPage = async (\n uri: URL,\n provider: ReferenceProvider,\n namespace: string,\n symbol: string,\n): Promise<ReadResourceResult> => {\n const { reference } = await provider.get();\n const result = reference.lookup(`${namespace}.${symbol}`);\n\n if (result.outcome === \"page\") {\n return markdownResource(uri, result.markdown);\n }\n\n if (result.outcome === \"ambiguous\") {\n throw resourceNotFound(\n `\"${namespace}.${symbol}\" matches several symbols:\\n${formatCandidates(result.candidates)}`,\n );\n }\n\n throw resourceNotFound(`No symbol named \"${namespace}.${symbol}\"`);\n};\n\nconst registerIndexResource = (server: ResourceServer, provider: ReferenceProvider): void => {\n server.registerResource(\n \"gtkx-api-reference\",\n \"gtkx://reference/index\",\n {\n title: \"GTKX API reference index\",\n description: \"Namespaces of the project's generated bindings, with symbol and JSX element counts.\",\n mimeType: \"text/markdown\",\n },\n async (uri) => {\n const { reference } = await provider.get();\n\n return markdownResource(uri, reference.overview());\n },\n );\n};\n\nconst registerNamespaceResource = (server: ResourceServer, provider: ReferenceProvider): void => {\n server.registerResource(\n \"gtkx-api-namespace\",\n new ResourceTemplate(\"gtkx://reference/{namespace}\", {\n list: () =>\n withLoadFallback(\n async () => {\n const { reference } = await provider.get();\n\n return {\n resources: reference.namespaces().map((summary) => ({\n uri: `gtkx://reference/${summary.name}`,\n name: `${summary.name} namespace reference`,\n mimeType: \"text/markdown\",\n })),\n };\n },\n { resources: [] },\n ),\n complete: {\n namespace: namespaceCompleter(provider),\n },\n }),\n {\n title: \"GTKX namespace reference\",\n description: \"All symbols of one namespace of the project's generated bindings, grouped by kind.\",\n mimeType: \"text/markdown\",\n },\n async (uri, variables) => {\n const namespace = variableValue(variables.namespace);\n const { reference } = await provider.get();\n const overview = reference.namespaceOverview(namespace);\n\n if (overview === undefined) {\n throw resourceNotFound(`Unknown namespace \"${namespace}\"`);\n }\n\n return markdownResource(uri, overview);\n },\n );\n};\n\nconst registerSymbolResource = (server: ResourceServer, provider: ReferenceProvider): void => {\n server.registerResource(\n \"gtkx-api-symbol\",\n new ResourceTemplate(\"gtkx://reference/{namespace}/{symbol}\", {\n list: undefined,\n complete: {\n namespace: namespaceCompleter(provider),\n symbol: (value, context) =>\n completeSymbol(provider, variableValue(context?.arguments?.namespace), value),\n },\n }),\n {\n title: \"GTKX symbol reference\",\n description:\n \"Reference page for one symbol of the project's generated bindings: a JSX element or a \" +\n \"class, interface, record, enum, callback, alias, function, or constant.\",\n mimeType: \"text/markdown\",\n },\n (uri, variables) =>\n symbolPage(uri, provider, variableValue(variables.namespace), variableValue(variables.symbol)),\n );\n};\n\nconst registerReferenceResources = (server: ResourceServer, provider: ReferenceProvider): void => {\n registerIndexResource(server, provider);\n registerNamespaceResource(server, provider);\n registerSymbolResource(server, provider);\n};\n\nexport {\n createReferenceProvider,\n buildReferenceTools,\n registerReferenceResources,\n type ReferenceProvider,\n};\n"]}
1
+ {"version":3,"file":"reference.js","sourceRoot":"","sources":["../src/reference.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type ApiReference,\n type ApiSymbol,\n loadApiReference,\n mergeOmittedProps,\n resolveGirPath,\n resolveLibraries,\n} from \"@gtkx/codegen\";\nimport { readBuiltinElementsForDocs } from \"@gtkx/codegen/internal\";\nimport { loadConfig } from \"@gtkx/config\";\nimport {\n CONFIG_EXTENSIONS,\n configDependenciesFor,\n resolveAcceptedChildTypes,\n resolveElementProps,\n resolveOmittedProps,\n} from \"@gtkx/config/internal\";\nimport { type McpServer, ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { type CallToolResult, ErrorCode, McpError, type ReadResourceResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { existsSync, statSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport { defineTool, textContent, textError, type Tool, type ToolArgs } from \"./tool.js\";\n\ntype ReferenceApi = Pick<\n ApiReference,\n \"lookup\" | \"namespaceOverview\" | \"namespaces\" | \"overview\" | \"search\" | \"symbolNames\"\n>;\n\ntype ProjectSource = \"argument\" | \"workingDirectory\" | \"app\";\n\ntype ResolvedProject = {\n root: string;\n source: ProjectSource;\n};\n\ntype ScopedReference = ResolvedProject & {\n reference: ReferenceApi;\n};\n\ntype ReferenceProviderOptions = {\n getAppRoot: () => string | undefined;\n getWorkingDirectory?: () => string;\n};\n\ntype ReferenceProvider = {\n get(projectRoot?: string): Promise<ScopedReference>;\n load(project: ResolvedProject): Promise<ScopedReference>;\n resolve(projectRoot?: string): ResolvedProject;\n};\n\ntype WatchedFile = {\n path: string;\n mtimeMs: number;\n size: number;\n};\n\ntype LoadedReference = {\n reference: ApiReference;\n root: string;\n watched: WatchedFile[];\n};\n\ntype CacheEntry = {\n pending: Promise<LoadedReference>;\n verifiedAt: number;\n failedAt: number | undefined;\n};\n\ntype ReferenceCache = Map<string, CacheEntry>;\ntype SearchOptions = Parameters<ReferenceApi[\"search\"]>[0];\ntype ResourceServer = Pick<McpServer, \"registerResource\">;\n\nconst FRESHNESS_INTERVAL_MS = 2000;\nconst FAILURE_RETRY_MS = 5000;\nconst CONFIG_LOCATIONS = [\"gtkx.config\", \".config/gtkx\", \".config/gtkx.config\"];\n\nconst PROJECT_SOURCE_LABELS: Record<ProjectSource, string> = {\n argument: \"requested with `projectRoot`\",\n workingDirectory: \"found from the working directory\",\n app: \"taken from a connected app; pass `projectRoot` to document another project\",\n};\n\nconst SYMBOL_KIND = z.enum([\n \"element\",\n \"class\",\n \"interface\",\n \"record\",\n \"enum\",\n \"callback\",\n \"alias\",\n \"function\",\n \"constant\",\n]);\n\nconst SYMBOL_DESCRIPTION =\n \"Qualified symbol name (`Adw.Toast`, `Gtk.Orientation`, `GLib.idleAdd`), JSX element name (`AdwToast`), \" +\n \"or bare symbol name when unambiguous (`Toast`).\";\n\nconst PROJECT_ROOT_DESCRIPTION =\n \"Directory of the GTKX project whose bindings to document, absolute or relative to the working directory. \" +\n \"Any directory inside the project works; its `gtkx.config.ts` decides the documented libraries. Omit to use \" +\n \"the project containing the working directory, falling back to a connected app's project.\";\n\nconst projectRootShape = {\n projectRoot: z.string().optional().describe(PROJECT_ROOT_DESCRIPTION),\n};\n\nconst listApiShape = {\n ...projectRootShape,\n namespace: z\n .string()\n .optional()\n .describe(\"Namespace to list (e.g. `Adw`, `Gtk`, `Gio`). Omit for an overview of all namespaces.\"),\n};\n\nconst searchApiShape = {\n ...projectRootShape,\n query: z.string().describe(\"Case-insensitive substring of a symbol name, e.g. `headerbar` or `orientation`.\"),\n namespace: z.string().optional().describe(\"Restrict matches to one namespace (e.g. `Adw`).\"),\n kind: SYMBOL_KIND.optional().describe(\"Restrict matches to one symbol kind.\"),\n limit: z.number().int().min(1).optional().describe(\"Maximum number of results (default: 20).\"),\n};\n\nconst apiDocsShape = {\n ...projectRootShape,\n symbol: z.string().describe(SYMBOL_DESCRIPTION),\n kind: SYMBOL_KIND.optional().describe(\"Disambiguate when several kinds share the symbol name.\"),\n};\n\nconst watchFile = (path: string): WatchedFile => {\n try {\n const stats = statSync(path);\n\n return { path, mtimeMs: stats.mtimeMs, size: stats.size };\n } catch {\n return { path, mtimeMs: -1, size: -1 };\n }\n};\n\nconst isFresh = (loaded: LoadedReference): boolean =>\n loaded.watched.every((file) => {\n const current = watchFile(file.path);\n\n return current.mtimeMs === file.mtimeMs && current.size === file.size;\n }) && loaded.reference.hasFreshInputs();\n\nconst configCandidatePaths = (directory: string): string[] =>\n CONFIG_LOCATIONS.flatMap((location) =>\n CONFIG_EXTENSIONS.map((extension) => join(directory, `${location}${extension}`)));\n\nconst hasConfigFile = (directory: string): boolean => configCandidatePaths(directory).some((path) => existsSync(path));\n\nconst findProjectRoot = (start: string): string | undefined => {\n const current = resolve(start);\n const parent = dirname(current);\n\n if (hasConfigFile(current)) {\n return current;\n }\n\n return parent === current ? undefined : findProjectRoot(parent);\n};\n\nconst projectAt = (candidate: string, source: ProjectSource): ResolvedProject => ({\n root: findProjectRoot(candidate) ?? resolve(candidate),\n source,\n});\n\nconst resolveProject = (\n workingDirectory: string,\n getAppRoot: () => string | undefined,\n projectRoot: string | undefined,\n): ResolvedProject => {\n if (projectRoot !== undefined) {\n return projectAt(projectRoot, \"argument\");\n }\n\n const discovered = findProjectRoot(workingDirectory);\n\n if (discovered !== undefined) {\n return { root: discovered, source: \"workingDirectory\" };\n }\n\n const appRoot = getAppRoot();\n\n return appRoot === undefined\n ? { root: resolve(workingDirectory), source: \"workingDirectory\" }\n : projectAt(appRoot, \"app\");\n};\n\nconst loadReference = async (requestedRoot: string): Promise<LoadedReference> => {\n const loaded = await loadConfig(requestedRoot);\n const { config, root } = loaded;\n\n if (config.codegen === false) {\n throw new Error(\n `codegen is disabled for the project at ${root}, so there are no generated bindings to document. ` +\n \"Remove `codegen: false` from gtkx.config.ts to use the API reference, or point the `projectRoot` \" +\n \"argument at another project.\",\n );\n }\n\n const girPath = resolveGirPath(config.girPath, root);\n\n if (girPath.length === 0) {\n throw new Error(\n \"No GIR search paths available. Install gobject-introspection \" +\n \"(Linux: `sudo dnf install gobject-introspection-devel` or `sudo apt install libgirepository1.0-dev`), \" +\n \"or set `girPath` in gtkx.config.ts.\",\n );\n }\n\n const libraries = resolveLibraries(config.libraries);\n const builtin = await readBuiltinElementsForDocs();\n\n const reference = loadApiReference({\n libraries,\n girPath,\n resolveFrom: root,\n props: { ...builtin.props, ...resolveElementProps(config.elements) },\n omittedProps: mergeOmittedProps(builtin.omittedProps, resolveOmittedProps(config.elements)),\n acceptedChildTypes: { ...builtin.acceptedChildTypes, ...resolveAcceptedChildTypes(config.elements) },\n });\n\n const watched = [...new Set([\n ...configDependenciesFor(loaded),\n ...configCandidatePaths(root),\n ...reference.inputFiles,\n ])].map((file) => watchFile(file));\n\n return { reference, root, watched };\n};\n\nconst startLoad = (cache: ReferenceCache, root: string): CacheEntry => {\n const entry: CacheEntry = { pending: loadReference(root), verifiedAt: Date.now(), failedAt: undefined };\n\n void entry.pending.catch(() => {\n entry.failedAt = Date.now();\n });\n\n cache.set(root, entry);\n\n return entry;\n};\n\nconst isRetryDue = (entry: CacheEntry): boolean =>\n entry.failedAt !== undefined && Date.now() - entry.failedAt >= FAILURE_RETRY_MS;\n\nconst resolveEntry = (cache: ReferenceCache, root: string): CacheEntry => {\n const entry = cache.get(root) ?? startLoad(cache, root);\n\n return isRetryDue(entry) ? startLoad(cache, root) : entry;\n};\n\nconst revalidate = (cache: ReferenceCache, root: string, entry: CacheEntry): CacheEntry => {\n const current = cache.get(root);\n\n return current === undefined || current === entry ? startLoad(cache, root) : current;\n};\n\nconst currentReference = async (cache: ReferenceCache, root: string): Promise<LoadedReference> => {\n const entry = resolveEntry(cache, root);\n const loaded = await entry.pending;\n\n if (Date.now() - entry.verifiedAt < FRESHNESS_INTERVAL_MS) {\n return loaded;\n }\n\n if (isFresh(loaded)) {\n entry.verifiedAt = Date.now();\n\n return loaded;\n }\n\n return revalidate(cache, root, entry).pending;\n};\n\nconst createReferenceProvider = (options: ReferenceProviderOptions): ReferenceProvider => {\n const cache: ReferenceCache = new Map();\n const getWorkingDirectory = options.getWorkingDirectory ?? (() => process.cwd());\n\n const resolve = (projectRoot?: string): ResolvedProject =>\n resolveProject(getWorkingDirectory(), options.getAppRoot, projectRoot);\n\n const load = async (project: ResolvedProject): Promise<ScopedReference> => {\n const loaded = await currentReference(cache, project.root);\n\n return { reference: loaded.reference, root: loaded.root, source: project.source };\n };\n\n const get = (projectRoot?: string): Promise<ScopedReference> => load(resolve(projectRoot));\n\n return { get, load, resolve };\n};\n\nconst projectNote = (project: ResolvedProject): string =>\n `Project: ${project.root} (${PROJECT_SOURCE_LABELS[project.source]})`;\n\nconst withProjectNote = (result: CallToolResult, note: string): CallToolResult => ({\n ...result,\n content: [...result.content, { type: \"text\", text: note }],\n});\n\nconst scopedResult = async (\n provider: ReferenceProvider,\n projectRoot: string | undefined,\n render: (reference: ReferenceApi) => CallToolResult,\n): Promise<CallToolResult> => {\n const resolved = provider.resolve(projectRoot);\n\n try {\n const scoped = await provider.load(resolved);\n\n return withProjectNote(render(scoped.reference), projectNote(scoped));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n return withProjectNote(textError(message), projectNote(resolved));\n }\n};\n\nconst formatCandidates = (candidates: ApiSymbol[]): string =>\n candidates.map((candidate) => `- ${candidate.namespace}.${candidate.name} (${candidate.kind})`).join(\"\\n\");\n\nconst buildSearchOptions = (args: ToolArgs<typeof searchApiShape>): SearchOptions => ({\n query: args.query,\n ...(args.namespace !== undefined && { namespace: args.namespace }),\n ...(args.kind !== undefined && { kinds: [args.kind] }),\n ...(args.limit !== undefined && { limit: args.limit }),\n});\n\nconst listApiResult = (reference: ReferenceApi, namespace: string | undefined): CallToolResult => {\n if (namespace === undefined) {\n return textContent(reference.overview());\n }\n\n const overview = reference.namespaceOverview(namespace);\n\n if (overview === undefined) {\n const names = reference\n .namespaces()\n .map((summary) => summary.name)\n .join(\", \");\n\n return textError(`Unknown namespace \"${namespace}\". Available namespaces: ${names}`);\n }\n\n return textContent(overview);\n};\n\nconst searchApiResult = (reference: ReferenceApi, args: ToolArgs<typeof searchApiShape>): CallToolResult => {\n const results = reference.search(buildSearchOptions(args));\n\n if (results.length === 0) {\n return textContent(`No symbols matched \"${args.query}\". Try a shorter substring or \\`gtkx_list_api\\`.`);\n }\n\n return textContent(JSON.stringify(results, null, 2));\n};\n\nconst apiDocsResult = (reference: ReferenceApi, args: ToolArgs<typeof apiDocsShape>): CallToolResult => {\n const result = reference.lookup(args.symbol, args.kind);\n\n if (result.outcome === \"notFound\") {\n return textError(`No symbol named \"${args.symbol}\". Use \\`gtkx_search_api\\` to find the right name.`);\n }\n\n if (result.outcome === \"ambiguous\") {\n return textError(\n `\"${args.symbol}\" matches several symbols. Pass a qualified name or a kind:\\n` +\n formatCandidates(result.candidates),\n );\n }\n\n return textContent(result.markdown);\n};\n\nconst listApiTool = (provider: ReferenceProvider): Tool =>\n defineTool({\n name: \"gtkx_list_api\",\n title: \"List API reference\",\n kind: \"readOnly\",\n description:\n \"List the project's generated bindings API (`@gtkx/gi` and `@gtkx/jsx`), including Adwaita, \" +\n \"GTK4, and its declared GIR libraries. Without a namespace, returns every namespace with symbol counts; \" +\n \"with a namespace, lists all of its symbols grouped by kind.\",\n inputSchema: listApiShape,\n handler: ({ namespace, projectRoot }) =>\n scopedResult(provider, projectRoot, (reference) => listApiResult(reference, namespace)),\n });\n\nconst searchApiTool = (provider: ReferenceProvider): Tool =>\n defineTool({\n name: \"gtkx_search_api\",\n title: \"Search API reference\",\n kind: \"readOnly\",\n description:\n \"Search the project's generated bindings API by symbol name. Returns matching symbols with \" +\n \"their namespace, kind, and a one-line summary; fetch full pages with `gtkx_get_api_docs`.\",\n inputSchema: searchApiShape,\n handler: (args) => scopedResult(provider, args.projectRoot, (reference) => searchApiResult(reference, args)),\n });\n\nconst getApiDocsTool = (provider: ReferenceProvider): Tool =>\n defineTool({\n name: \"gtkx_get_api_docs\",\n title: \"Get API docs\",\n kind: \"readOnly\",\n description:\n \"Get the full reference page for one symbol of the project's generated bindings: JSX elements \" +\n \"(props, signals, methods) or `@gtkx/gi` classes, interfaces, records, enums, callbacks, aliases, \" +\n \"functions, and constants.\",\n inputSchema: apiDocsShape,\n handler: (args) => scopedResult(provider, args.projectRoot, (reference) => apiDocsResult(reference, args)),\n });\n\nconst buildReferenceTools = (provider: ReferenceProvider): Tool[] => [\n listApiTool(provider),\n searchApiTool(provider),\n getApiDocsTool(provider),\n];\n\nconst markdownResource = (uri: URL, text: string): ReadResourceResult => ({\n contents: [{ uri: uri.href, mimeType: \"text/markdown\", text }],\n});\n\nconst variableValue = (value: string | string[] | undefined): string =>\n Array.isArray(value) ? (value[0] ?? \"\") : (value ?? \"\");\n\nconst withLoadFallback = async <T>(load: () => Promise<T>, fallback: T): Promise<T> => {\n try {\n return await load();\n } catch {\n return fallback;\n }\n};\n\nconst completeNames = (\n provider: ReferenceProvider,\n value: string,\n collect: (reference: ReferenceApi) => string[],\n): Promise<string[]> =>\n withLoadFallback(async () => {\n const { reference } = await provider.get();\n\n return collect(reference).filter((name) => name.toLowerCase().startsWith(value.toLowerCase()));\n }, []);\n\nconst namespaceCompleter =\n (provider: ReferenceProvider) =>\n (value: string): Promise<string[]> =>\n completeNames(provider, value, (reference) => reference.namespaces().map((summary) => summary.name));\n\nconst completeSymbol = (provider: ReferenceProvider, namespace: string, value: string): Promise<string[]> => {\n if (namespace.length === 0) {\n return Promise.resolve([]);\n }\n\n return completeNames(provider, value, (reference) => reference.symbolNames(namespace));\n};\n\nconst resourceNotFound = (message: string): McpError => new McpError(ErrorCode.InvalidParams, message);\n\nconst symbolPage = async (\n uri: URL,\n provider: ReferenceProvider,\n namespace: string,\n symbol: string,\n): Promise<ReadResourceResult> => {\n const { reference } = await provider.get();\n const result = reference.lookup(`${namespace}.${symbol}`);\n\n if (result.outcome === \"page\") {\n return markdownResource(uri, result.markdown);\n }\n\n if (result.outcome === \"ambiguous\") {\n throw resourceNotFound(\n `\"${namespace}.${symbol}\" matches several symbols:\\n${formatCandidates(result.candidates)}`,\n );\n }\n\n throw resourceNotFound(`No symbol named \"${namespace}.${symbol}\"`);\n};\n\nconst registerIndexResource = (server: ResourceServer, provider: ReferenceProvider): void => {\n server.registerResource(\n \"gtkx-api-reference\",\n \"gtkx://reference/index\",\n {\n title: \"GTKX API reference index\",\n description: \"Namespaces of the project's generated bindings, with symbol and JSX element counts.\",\n mimeType: \"text/markdown\",\n },\n async (uri) => {\n const { reference } = await provider.get();\n\n return markdownResource(uri, reference.overview());\n },\n );\n};\n\nconst registerNamespaceResource = (server: ResourceServer, provider: ReferenceProvider): void => {\n server.registerResource(\n \"gtkx-api-namespace\",\n new ResourceTemplate(\"gtkx://reference/{namespace}\", {\n list: () =>\n withLoadFallback(\n async () => {\n const { reference } = await provider.get();\n\n return {\n resources: reference.namespaces().map((summary) => ({\n uri: `gtkx://reference/${summary.name}`,\n name: `${summary.name} namespace reference`,\n mimeType: \"text/markdown\",\n })),\n };\n },\n { resources: [] },\n ),\n complete: {\n namespace: namespaceCompleter(provider),\n },\n }),\n {\n title: \"GTKX namespace reference\",\n description: \"All symbols of one namespace of the project's generated bindings, grouped by kind.\",\n mimeType: \"text/markdown\",\n },\n async (uri, variables) => {\n const namespace = variableValue(variables.namespace);\n const { reference } = await provider.get();\n const overview = reference.namespaceOverview(namespace);\n\n if (overview === undefined) {\n throw resourceNotFound(`Unknown namespace \"${namespace}\"`);\n }\n\n return markdownResource(uri, overview);\n },\n );\n};\n\nconst registerSymbolResource = (server: ResourceServer, provider: ReferenceProvider): void => {\n server.registerResource(\n \"gtkx-api-symbol\",\n new ResourceTemplate(\"gtkx://reference/{namespace}/{symbol}\", {\n list: undefined,\n complete: {\n namespace: namespaceCompleter(provider),\n symbol: (value, context) =>\n completeSymbol(provider, variableValue(context?.arguments?.namespace), value),\n },\n }),\n {\n title: \"GTKX symbol reference\",\n description:\n \"Reference page for one symbol of the project's generated bindings: a JSX element or a \" +\n \"class, interface, record, enum, callback, alias, function, or constant.\",\n mimeType: \"text/markdown\",\n },\n (uri, variables) =>\n symbolPage(uri, provider, variableValue(variables.namespace), variableValue(variables.symbol)),\n );\n};\n\nconst registerReferenceResources = (server: ResourceServer, provider: ReferenceProvider): void => {\n registerIndexResource(server, provider);\n registerNamespaceResource(server, provider);\n registerSymbolResource(server, provider);\n};\n\nexport {\n createReferenceProvider,\n buildReferenceTools,\n registerReferenceResources,\n type ReferenceProvider,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyC,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAsCjF,KAAK,aAAa,GAAG;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAqBF,QAAA,MAAM,GAAG,EAAE,MAA4B,CAAC;AA4exC,QAAA,MAAM,eAAe,GAAI,MAAM,MAAM,EAAE,KAAG,aAgBzC,CAAC;AAEF,iBAAe,IAAI,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAS9D;AAED,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,YAAY,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyC,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAwCjF,KAAK,aAAa,GAAG;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAqBF,QAAA,MAAM,GAAG,EAAE,MAA4B,CAAC;AA2exC,QAAA,MAAM,eAAe,GAAI,MAAM,MAAM,EAAE,KAAG,aAgBzC,CAAC;AAEF,iBAAe,IAAI,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAS9D;AAED,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,YAAY,EAAE,eAAe,EAAE,CAAC"}
package/dist/server.js CHANGED
@@ -1,8 +1,10 @@
1
1
  import { loadConfig } from "@gtkx/config";
2
- import { resolveMcpSettings } from "@gtkx/config/internal";
2
+ import { configDependenciesFor, resolveMcpSettings } from "@gtkx/config/internal";
3
3
  import { createLogger, installGracefulShutdown } from "@gtkx/utils";
4
4
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
5
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
6
+ import { existsSync } from "node:fs";
7
+ import { resolve } from "node:path";
6
8
  import { parseArgs } from "node:util";
7
9
  import { z } from "zod";
8
10
  import packageManifest from "../package.json" with { type: "json" };
@@ -102,9 +104,8 @@ const screenshotShape = {
102
104
  returnImage: z
103
105
  .boolean()
104
106
  .optional()
105
- .describe("Whether to return the PNG as image content, true by default. Pass false together with `path` " +
106
- "to save the screenshot and get back only where it landed, which keeps the image out of the " +
107
- "conversation until something actually needs to look at it."),
107
+ .describe("Return the PNG as image content (default: true). Set false with `path` to save the image " +
108
+ "and return only its file location."),
108
109
  };
109
110
  function describeParams(shape, descriptions) {
110
111
  const described = Object.entries(shape).map(([key, schema]) => [
@@ -182,18 +183,14 @@ const widgetPropsTool = (appRouter) => defineTool({
182
183
  name: "gtkx_get_widget_props",
183
184
  title: "Get widget properties",
184
185
  kind: "readOnly",
185
- description: "Get a fixed summary of one widget by ID: type, accessible role, name, text, sensitivity, " +
186
- "visibility, CSS classes, and the same summary for its descendants. The subtree is bounded " +
187
- `twice: ${String(DEFAULT_SUBTREE_DEPTH)} levels deep unless \`maxDepth\` says otherwise, and ` +
188
- `${String(MAX_SUBTREE_WIDGETS)} widgets in all, filled breadth first. Wherever either bound ` +
189
- "cut a branch, that widget carries `hiddenChildren`, the count of its own direct children left " +
190
- "out rather than of everything below them; call again with that widget's ID to drill in, or " +
191
- "use `gtkx_get_widget_tree` for a wider map. Pass `properties` to read GObject properties too; " +
192
- "they come back first in the payload, each under its canonical kebab-case name as " +
193
- "`{type, value}`, where an enum or flags value is its GType value name, a 64-bit integer a " +
194
- "decimal string, and an object its GType name plus `widgetId` when it is a widget. Asking for " +
195
- "a property the widget does not have fails; a value that cannot be marshalled carries a `note` " +
196
- "instead.",
186
+ description: "Read a widget's type, accessible role, name, text, sensitivity, visibility, CSS classes, " +
187
+ `and descendants. Defaults to ${String(DEFAULT_SUBTREE_DEPTH)} levels; \`maxDepth\` changes ` +
188
+ `the depth. Results contain at most ${String(MAX_SUBTREE_WIDGETS)} widgets, in breadth-first ` +
189
+ "order. `hiddenChildren` counts omitted direct children; query that widget's ID to expand it. " +
190
+ "Use `gtkx_get_widget_tree` for an overview. Requested GObject `properties` appear first, " +
191
+ "keyed by canonical kebab-case name with `{type, value}`. Enum/flags values use GType value " +
192
+ "names, 64-bit integers use decimal strings, and objects use their GType name plus `widgetId` " +
193
+ "for widgets. Unknown properties fail; values that cannot be converted include a `note`.",
197
194
  inputSchema: widgetPropsShape,
198
195
  handler: async ({ applicationId, appTimeout, ...params }) => {
199
196
  const result = await appRouter.sendToApp(applicationId, "widget.getProps", params, appTimeout);
@@ -243,7 +240,7 @@ function buildInteractionTools(appRouter) {
243
240
  name: "gtkx_click",
244
241
  title: "Click widget",
245
242
  kind: "action",
246
- description: "Click a widget through userEvent.click, with no special case per widget. Works with " +
243
+ description: "Click a widget through userEvent.click. Works with " +
247
244
  "buttons, checkboxes, switches, list and grid rows, tree expanders, and column headers: a " +
248
245
  "row is selected, an expander toggles its row's expansion, and a header sorts its column.",
249
246
  inputSchema: widgetIdShape,
@@ -376,7 +373,10 @@ const configuredSettings = async (cwd) => {
376
373
  const { config } = await loadConfig(cwd);
377
374
  return resolveMcpSettings(config);
378
375
  }
379
- catch {
376
+ catch (error) {
377
+ if (configDependenciesFor(error).some((path) => existsSync(resolve(cwd, path)))) {
378
+ throw error;
379
+ }
380
380
  return DEFAULT_SETTINGS;
381
381
  }
382
382
  };
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { loadConfig } from \"@gtkx/config\";\nimport { type McpSettings, resolveMcpSettings } from \"@gtkx/config/internal\";\nimport { createLogger, installGracefulShutdown, type Logger } from \"@gtkx/utils\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { parseArgs } from \"node:util\";\nimport { z } from \"zod\";\nimport type { ConnectionErrorEvent } from \"./transport.js\";\nimport packageManifest from \"../package.json\" with { type: \"json\" };\nimport { type AppRegisteredEvent, AppRouter, type AppUnregisteredEvent } from \"./app-router.js\";\nimport { ConnectionRegistry } from \"./connection-registry.js\";\nimport {\n type AppInfo,\n DEFAULT_SUBTREE_DEPTH,\n fireEventParams,\n MAX_SUBTREE_WIDGETS,\n queryParams,\n screenshotParams,\n treeParams,\n typeParams,\n widgetIdParams,\n widgetPropsParams,\n} from \"./protocol/schemas.js\";\nimport {\n buildReferenceTools,\n createReferenceProvider,\n type ReferenceProvider,\n registerReferenceResources,\n} from \"./reference.js\";\nimport { resolveMcpSocketAddress } from \"./socket-path.js\";\nimport { SocketServer } from \"./socket-server.js\";\nimport { selectTools } from \"./tool-filter.js\";\nimport { defineTool, imageContent, registerTool, textContent, textError, type Tool } from \"./tool.js\";\n\ntype CreateMcpServerOptions = {\n socketPath?: string;\n version: string;\n settings?: McpSettings;\n};\n\ntype ServerOptions = {\n cwd?: string;\n tools?: string[];\n isReadOnly?: boolean;\n};\n\ntype McpServerHandle = {\n start(): Promise<void>;\n stop(): Promise<void>;\n};\n\ntype ServerLifecycle = {\n socketServer: SocketServer;\n mcpServer: McpServer;\n appRouter: AppRouter;\n socketPath: string;\n isStopRequested: boolean;\n startup: Promise<void> | null;\n shutdown: Promise<void> | null;\n};\n\ntype AppWindow = { id: string; title: string | null };\ntype AppWithWindows = AppInfo & { windows?: AppWindow[] };\n\nconst { version } = packageManifest;\nconst log: Logger = createLogger(\"mcp\");\nconst DEFAULT_SETTINGS: McpSettings = { tools: [], isReadOnly: false };\n\nconst INSTRUCTIONS =\n \"The widget tools drive a GTKX app running under `gtkx dev`: they read \" +\n \"its live widget tree, query it by accessible role and name, click and type, and capture screenshots. \" +\n \"They wait briefly for a starting app, so start `gtkx dev` before or alongside a widget request. \" +\n \"The reference tools answer from the \" +\n \"bindings generated for a specific project, so they describe that project's GIR libraries rather than \" +\n \"the GNOME platform in general; prefer them over recalled Adwaita or GTK knowledge, which is usually C, \" +\n \"PyGObject or GJS and does not apply here.\\n\\n\" +\n \"Widget IDs are valid only while the widget is mounted. After a dialog closes, a list re-renders, or \" +\n \"fast refresh patches a component, re-read the tree or re-run the query instead of reusing an ID.\";\n\nconst APPLICATION_ID_DESCRIPTION =\n \"Application ID to query. If not specified, uses the first connected app. The tool waits briefly for the \" +\n \"requested app to register.\";\n\nconst APP_TIMEOUT_DESCRIPTION = \"Milliseconds to wait for the requested app to register (default: 10000).\";\n\nconst WIDGET_ID_DESCRIPTION =\n \"Widget ID obtained from `gtkx_get_widget_tree`, `gtkx_query_widgets`, or `gtkx_get_widget_props`. \" +\n \"IDs are scoped to a single app. An ID stays valid for as long as its widget is mounted and stops \" +\n \"resolving once the widget is unmounted.\";\n\nconst applicationIdShape = {\n applicationId: z.string().optional().describe(APPLICATION_ID_DESCRIPTION),\n appTimeout: z.number().int().nonnegative().optional().describe(APP_TIMEOUT_DESCRIPTION),\n};\n\nconst widgetIdShape = {\n ...applicationIdShape,\n ...describeParams(widgetIdParams.shape, { widgetId: WIDGET_ID_DESCRIPTION }),\n};\n\nconst widgetPropsShape = {\n ...applicationIdShape,\n ...describeParams(widgetPropsParams.shape, {\n widgetId: WIDGET_ID_DESCRIPTION,\n properties:\n \"GObject property names to read as well, in kebab-case or camelCase (\\\"current-breakpoint\\\" or \" +\n \"\\\"currentBreakpoint\\\"). Omit for the summary alone.\",\n maxDepth:\n `How many levels of descendants to include: ${String(DEFAULT_SUBTREE_DEPTH)} by default, and 0 ` +\n `for the widget on its own. At most ${String(MAX_SUBTREE_WIDGETS)} widgets come back whatever ` +\n \"the depth, and any widget whose own direct children were left out carries a `hiddenChildren` count.\",\n }),\n};\n\nconst treeShape = {\n ...applicationIdShape,\n ...describeParams(treeParams.shape, {\n rootId:\n \"Render only the subtree rooted at this widget ID (from a prior tree or query). Omit for the \" +\n \"whole app.\",\n maxDepth:\n \"Limit how many levels deep to render, and 0 for the root widget on its own; deeper \" +\n \"descendants are summarized with a count. Combine with rootId to drill in without dumping \" +\n \"the whole tree.\",\n }),\n};\n\nconst listAppsShape = {\n waitForApps: z\n .boolean()\n .optional()\n .describe(\n \"If true, wait for at least one app to register before returning. Useful when app is still starting.\",\n ),\n timeout: z.number().optional().describe(\"Timeout in milliseconds when waitForApps is true (default: 10000)\"),\n};\n\nconst queryWidgetsShape = {\n ...applicationIdShape,\n ...describeParams(queryParams.shape, {\n by: \"Query type\",\n value: \"Value to search for\",\n options: \"Additional query options\",\n }),\n};\n\nconst typeShape = {\n ...applicationIdShape,\n ...describeParams(typeParams.shape, {\n widgetId: WIDGET_ID_DESCRIPTION,\n text: \"Text to type\",\n clear: \"Clear existing text before typing\",\n }),\n};\n\nconst fireEventShape = {\n ...applicationIdShape,\n ...describeParams(fireEventParams.shape, {\n widgetId: WIDGET_ID_DESCRIPTION,\n signal: \"GObject signal name to emit\",\n args: \"Arguments to pass to the signal\",\n }),\n};\n\nconst screenshotShape = {\n ...applicationIdShape,\n ...describeParams(screenshotParams.shape, {\n windowId: \"Window ID to capture. If not specified, captures the first window.\",\n path:\n \"Absolute path to write the PNG to on the app's machine. If set, the screenshot is saved there \" +\n \"in addition to being returned.\",\n }),\n returnImage: z\n .boolean()\n .optional()\n .describe(\n \"Whether to return the PNG as image content, true by default. Pass false together with `path` \" +\n \"to save the screenshot and get back only where it landed, which keeps the image out of the \" +\n \"conversation until something actually needs to look at it.\",\n ),\n};\n\nfunction describeParams<Shape extends Record<string, z.ZodType>>(\n shape: Shape,\n descriptions: { [Key in keyof Shape]: string },\n): Shape {\n const described: [string, z.ZodType][] = Object.entries(shape).map(([key, schema]) => [\n key,\n schema.describe(descriptions[key as keyof Shape]),\n ]);\n\n return Object.fromEntries(described) as Shape;\n}\n\nconst connectStdio = async (mcpServer: McpServer, stop: () => Promise<void>): Promise<void> => {\n const transport = new StdioServerTransport();\n process.stdin.on(\"end\", () => void stop());\n process.stdin.on(\"close\", () => void stop());\n await mcpServer.connect(transport);\n};\n\nconst logSocketError = (event: Event): void => {\n const error = (event as ConnectionErrorEvent).detail;\n const code = (error as NodeJS.ErrnoException).code;\n\n if (code === \"EPIPE\" || code === \"ECONNRESET\") {\n return;\n }\n\n log.error(`socket error: ${error.message}`);\n};\n\nconst appWithWindows = async (appRouter: AppRouter, app: AppInfo): Promise<AppWithWindows> => {\n try {\n const result = await appRouter.sendToApp<{ windows: AppWindow[] }>(\n app.applicationId,\n \"app.getWindows\",\n {},\n );\n\n return { ...app, windows: result.windows };\n } catch {\n return app;\n }\n};\n\nconst listAppsTool = (appRouter: AppRouter): Tool =>\n defineTool({\n name: \"gtkx_list_apps\",\n title: \"List apps\",\n kind: \"readOnly\",\n description:\n \"List connected GTKX applications and their open windows. \" +\n \"Returns the current snapshot immediately unless waitForApps is true.\",\n inputSchema: listAppsShape,\n handler: async ({ waitForApps, timeout }) => {\n if (waitForApps && !appRouter.hasConnectedApps()) {\n await appRouter.waitForApp(undefined, timeout);\n }\n\n const apps = appRouter.getApps();\n const appsWithWindows = await Promise.all(apps.map((app) => appWithWindows(appRouter, app)));\n\n return textContent(JSON.stringify(appsWithWindows, null, 2));\n },\n });\n\nconst screenshotResult = (\n result: { data: string; mimeType: string; savedPath?: string },\n shouldReturnImage: boolean,\n): CallToolResult => {\n if (result.savedPath === undefined) {\n return shouldReturnImage\n ? imageContent(result.data, result.mimeType)\n : textError(\n \"Nothing to return: `returnImage` was false and no `path` was given, so the screenshot was \" +\n \"neither saved nor returned. Pass `path` to save it, or leave `returnImage` unset.\",\n );\n }\n\n const saved = { type: \"text\", text: `Screenshot saved to ${result.savedPath}` } as const;\n\n if (!shouldReturnImage) {\n return { content: [saved] };\n }\n\n return { content: [saved, { type: \"image\", data: result.data, mimeType: result.mimeType }] };\n};\n\nconst screenshotTool = (appRouter: AppRouter): Tool =>\n defineTool({\n name: \"gtkx_take_screenshot\",\n title: \"Take screenshot\",\n kind: \"readOnly\",\n description:\n \"Capture a screenshot of a window. Returns base64-encoded PNG image data, and optionally writes \" +\n \"the PNG to `path` on the app's machine. You can't target widgets from a screenshot; use \" +\n \"`gtkx_get_widget_tree` to find widget IDs for interaction.\",\n inputSchema: screenshotShape,\n handler: async ({ applicationId, appTimeout, returnImage, ...params }) => {\n const result = await appRouter.sendToApp<{ data: string; mimeType: string; savedPath?: string }>(\n applicationId,\n \"widget.screenshot\",\n params,\n appTimeout,\n );\n\n return screenshotResult(result, returnImage !== false);\n },\n });\n\nconst widgetPropsTool = (appRouter: AppRouter): Tool =>\n defineTool({\n name: \"gtkx_get_widget_props\",\n title: \"Get widget properties\",\n kind: \"readOnly\",\n description:\n \"Get a fixed summary of one widget by ID: type, accessible role, name, text, sensitivity, \" +\n \"visibility, CSS classes, and the same summary for its descendants. The subtree is bounded \" +\n `twice: ${String(DEFAULT_SUBTREE_DEPTH)} levels deep unless \\`maxDepth\\` says otherwise, and ` +\n `${String(MAX_SUBTREE_WIDGETS)} widgets in all, filled breadth first. Wherever either bound ` +\n \"cut a branch, that widget carries `hiddenChildren`, the count of its own direct children left \" +\n \"out rather than of everything below them; call again with that widget's ID to drill in, or \" +\n \"use `gtkx_get_widget_tree` for a wider map. Pass `properties` to read GObject properties too; \" +\n \"they come back first in the payload, each under its canonical kebab-case name as \" +\n \"`{type, value}`, where an enum or flags value is its GType value name, a 64-bit integer a \" +\n \"decimal string, and an object its GType name plus `widgetId` when it is a widget. Asking for \" +\n \"a property the widget does not have fails; a value that cannot be marshalled carries a `note` \" +\n \"instead.\",\n inputSchema: widgetPropsShape,\n handler: async ({ applicationId, appTimeout, ...params }) => {\n const result = await appRouter.sendToApp(applicationId, \"widget.getProps\", params, appTimeout);\n\n return textContent(JSON.stringify(result, null, 2));\n },\n });\n\nfunction buildInspectionTools(appRouter: AppRouter): Tool[] {\n return [\n listAppsTool(appRouter),\n defineTool({\n name: \"gtkx_get_widget_tree\",\n title: \"Widget tree\",\n kind: \"readOnly\",\n description:\n \"Get the widget hierarchy for a connected GTKX app. Returns a tree of widgets with their IDs, \" +\n \"types, roles, and properties. For large apps, pass `maxDepth` for a shallow overview and/or \" +\n \"`rootId` to render just one subtree instead of the whole (possibly truncated) tree.\",\n inputSchema: treeShape,\n handler: async ({ applicationId, appTimeout, rootId, maxDepth }) => {\n const result = await appRouter.sendToApp<{ tree: string }>(applicationId, \"widget.getTree\", {\n rootId,\n maxDepth,\n }, appTimeout);\n\n return textContent(result.tree);\n },\n }),\n defineTool({\n name: \"gtkx_query_widgets\",\n title: \"Query widgets\",\n kind: \"readOnly\",\n description:\n \"Find widgets by role, text, name, or label. Returns each match with its ID and the same \" +\n \"fixed summary `gtkx_get_widget_props` returns, with no descendants: a match that has \" +\n \"children carries `hiddenChildren`, the count of its direct children left out. Read a \" +\n \"match's subtree with `gtkx_get_widget_props` or `gtkx_get_widget_tree`.\",\n inputSchema: queryWidgetsShape,\n handler: async ({ applicationId, appTimeout, ...params }) => {\n const result = await appRouter.sendToApp(applicationId, \"widget.query\", params, appTimeout);\n\n return textContent(JSON.stringify(result, null, 2));\n },\n }),\n widgetPropsTool(appRouter),\n screenshotTool(appRouter),\n ];\n}\n\nfunction buildInteractionTools(appRouter: AppRouter): Tool[] {\n return [\n defineTool({\n name: \"gtkx_click\",\n title: \"Click widget\",\n kind: \"action\",\n description:\n \"Click a widget through userEvent.click, with no special case per widget. Works with \" +\n \"buttons, checkboxes, switches, list and grid rows, tree expanders, and column headers: a \" +\n \"row is selected, an expander toggles its row's expansion, and a header sorts its column.\",\n inputSchema: widgetIdShape,\n handler: async ({ applicationId, appTimeout, ...params }) => {\n await appRouter.sendToApp(applicationId, \"widget.click\", params, appTimeout);\n\n return textContent(\"Clicked\");\n },\n }),\n defineTool({\n name: \"gtkx_type\",\n title: \"Type text\",\n kind: \"action\",\n description: \"Type text into an editable widget like Entry or TextView\",\n inputSchema: typeShape,\n handler: async ({ applicationId, appTimeout, ...params }) => {\n await appRouter.sendToApp(applicationId, \"widget.type\", params, appTimeout);\n\n return textContent(\"Typed text\");\n },\n }),\n defineTool({\n name: \"gtkx_fire_event\",\n title: \"Fire event\",\n kind: \"action\",\n description: \"Emit a GObject signal on a widget. Use this for custom interactions.\",\n inputSchema: fireEventShape,\n handler: async ({ applicationId, appTimeout, ...params }) => {\n const result = await appRouter.sendToApp(applicationId, \"widget.fireEvent\", params, appTimeout);\n\n return textContent(JSON.stringify(result, null, 2));\n },\n }),\n ];\n}\n\nfunction buildTools(appRouter: AppRouter): Tool[] {\n return [...buildInspectionTools(appRouter), ...buildInteractionTools(appRouter)];\n}\n\nconst registerTools = (\n mcpServer: McpServer,\n appRouter: AppRouter,\n provider: ReferenceProvider,\n settings: McpSettings,\n): void => {\n const tools = selectTools([...buildTools(appRouter), ...buildReferenceTools(provider)], settings);\n\n if (tools.length === 0) {\n log.warn(\"no tools matched the configured filter; the server is registering none\");\n }\n\n for (const tool of tools) {\n registerTool(mcpServer, tool);\n }\n};\n\nconst stoppedServerError = (): Error => new Error(\"createMcpServer: a stopped server cannot be started again\");\n\nconst wasStopRequested = (state: ServerLifecycle): boolean => state.isStopRequested;\n\nfunction stopServer(state: ServerLifecycle): Promise<void> {\n if (state.shutdown !== null) {\n return state.shutdown;\n }\n\n state.isStopRequested = true;\n state.appRouter.dispose();\n const startup = state.startup;\n const shutdown = (async (): Promise<void> => {\n if (startup !== null) {\n await Promise.allSettled([startup]);\n }\n\n await state.socketServer.stop();\n await state.mcpServer.close();\n })();\n\n state.shutdown = shutdown;\n\n return shutdown;\n}\n\nfunction startServer(state: ServerLifecycle): Promise<void> {\n if (wasStopRequested(state)) {\n return Promise.reject(stoppedServerError());\n }\n\n if (state.startup !== null) {\n return state.startup;\n }\n\n const startup = (async (): Promise<void> => {\n try {\n await state.socketServer.start();\n\n if (wasStopRequested(state)) {\n return;\n }\n\n log.info(`socket server listening on ${state.socketPath}`);\n await connectStdio(state.mcpServer, () => stopServer(state));\n } catch (error) {\n if (!wasStopRequested(state)) {\n state.isStopRequested = true;\n state.appRouter.dispose();\n await state.socketServer.stop();\n await state.mcpServer.close();\n }\n\n throw error;\n }\n })();\n\n state.startup = startup;\n\n return startup;\n}\n\nconst createServerHandle = (\n socketServer: SocketServer,\n mcpServer: McpServer,\n appRouter: AppRouter,\n socketPath: string,\n): McpServerHandle => {\n const state: ServerLifecycle = {\n socketServer,\n mcpServer,\n appRouter,\n socketPath,\n isStopRequested: false,\n startup: null,\n shutdown: null,\n };\n\n return { start: () => startServer(state), stop: () => stopServer(state) };\n};\n\nconst createMcpServer = (options: CreateMcpServerOptions): McpServerHandle => {\n const socketAddress = resolveMcpSocketAddress(options.socketPath);\n const socketPath = socketAddress.path;\n\n if (socketAddress.fallbackDirectory !== null) {\n log.warn(`MCP socket path exceeds the safe Unix byte budget; using private fallback ${socketPath}`);\n }\n\n const registry = new ConnectionRegistry();\n const socketServer = new SocketServer(registry, socketAddress);\n const appRouter = new AppRouter(registry);\n registry.addEventListener(\"error\", logSocketError);\n\n appRouter.addEventListener(\"appRegistered\", (event) => {\n const appInfo = (event as AppRegisteredEvent).detail;\n log.info(`app registered: ${appInfo.applicationId} (PID: ${String(appInfo.pid)})`);\n });\n\n appRouter.addEventListener(\"appUnregistered\", (event) => {\n log.info(`app unregistered: ${(event as AppUnregisteredEvent).detail}`);\n });\n\n const mcpServer = new McpServer({ name: \"gtkx-mcp\", version: options.version }, { instructions: INSTRUCTIONS });\n const referenceProvider = createReferenceProvider({ getAppRoot: () => appRouter.getProjectRoot() });\n registerTools(mcpServer, appRouter, referenceProvider, options.settings ?? DEFAULT_SETTINGS);\n registerReferenceResources(mcpServer, referenceProvider);\n\n return createServerHandle(socketServer, mcpServer, appRouter, socketPath);\n};\n\nconst configuredSettings = async (cwd: string): Promise<McpSettings> => {\n try {\n const { config } = await loadConfig(cwd);\n\n return resolveMcpSettings(config);\n } catch {\n return DEFAULT_SETTINGS;\n }\n};\n\nconst resolveSettings = async (options: ServerOptions): Promise<McpSettings> => {\n const configured = await configuredSettings(options.cwd ?? process.cwd());\n\n return {\n tools: options.tools ?? configured.tools,\n isReadOnly: options.isReadOnly ?? configured.isReadOnly,\n };\n};\n\nconst splitPatterns = (values: string[]): string[] =>\n values.flatMap((value) => value.split(\",\")).map((value) => value.trim()).filter((value) => value.length > 0);\n\nconst parseServerArgs = (argv: string[]): ServerOptions => {\n const { values } = parseArgs({\n args: argv,\n options: {\n tools: { type: \"string\", multiple: true },\n \"read-only\": { type: \"boolean\" },\n },\n allowPositionals: false,\n });\n\n const tools = values.tools === undefined ? undefined : splitPatterns(values.tools);\n\n return {\n ...(tools !== undefined && { tools }),\n ...(values[\"read-only\"] !== undefined && { isReadOnly: values[\"read-only\"] }),\n };\n};\n\nasync function main(options: ServerOptions = {}): Promise<void> {\n const settings = await resolveSettings(options);\n const server = createMcpServer({ version, settings });\n\n installGracefulShutdown({\n onSignal: () => server.stop(),\n });\n\n await server.start();\n}\n\nexport { log, main, main as runMcpServer, parseServerArgs };\n"]}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { loadConfig } from \"@gtkx/config\";\nimport { configDependenciesFor, type McpSettings, resolveMcpSettings } from \"@gtkx/config/internal\";\nimport { createLogger, installGracefulShutdown, type Logger } from \"@gtkx/utils\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport { z } from \"zod\";\nimport type { ConnectionErrorEvent } from \"./transport.js\";\nimport packageManifest from \"../package.json\" with { type: \"json\" };\nimport { type AppRegisteredEvent, AppRouter, type AppUnregisteredEvent } from \"./app-router.js\";\nimport { ConnectionRegistry } from \"./connection-registry.js\";\nimport {\n type AppInfo,\n DEFAULT_SUBTREE_DEPTH,\n fireEventParams,\n MAX_SUBTREE_WIDGETS,\n queryParams,\n screenshotParams,\n treeParams,\n typeParams,\n widgetIdParams,\n widgetPropsParams,\n} from \"./protocol/schemas.js\";\nimport {\n buildReferenceTools,\n createReferenceProvider,\n type ReferenceProvider,\n registerReferenceResources,\n} from \"./reference.js\";\nimport { resolveMcpSocketAddress } from \"./socket-path.js\";\nimport { SocketServer } from \"./socket-server.js\";\nimport { selectTools } from \"./tool-filter.js\";\nimport { defineTool, imageContent, registerTool, textContent, textError, type Tool } from \"./tool.js\";\n\ntype CreateMcpServerOptions = {\n socketPath?: string;\n version: string;\n settings?: McpSettings;\n};\n\ntype ServerOptions = {\n cwd?: string;\n tools?: string[];\n isReadOnly?: boolean;\n};\n\ntype McpServerHandle = {\n start(): Promise<void>;\n stop(): Promise<void>;\n};\n\ntype ServerLifecycle = {\n socketServer: SocketServer;\n mcpServer: McpServer;\n appRouter: AppRouter;\n socketPath: string;\n isStopRequested: boolean;\n startup: Promise<void> | null;\n shutdown: Promise<void> | null;\n};\n\ntype AppWindow = { id: string; title: string | null };\ntype AppWithWindows = AppInfo & { windows?: AppWindow[] };\n\nconst { version } = packageManifest;\nconst log: Logger = createLogger(\"mcp\");\nconst DEFAULT_SETTINGS: McpSettings = { tools: [], isReadOnly: false };\n\nconst INSTRUCTIONS =\n \"The widget tools drive a GTKX app running under `gtkx dev`: they read \" +\n \"its live widget tree, query it by accessible role and name, click and type, and capture screenshots. \" +\n \"They wait briefly for a starting app, so start `gtkx dev` before or alongside a widget request. \" +\n \"The reference tools answer from the \" +\n \"bindings generated for a specific project, so they describe that project's GIR libraries rather than \" +\n \"the GNOME platform in general; prefer them over recalled Adwaita or GTK knowledge, which is usually C, \" +\n \"PyGObject or GJS and does not apply here.\\n\\n\" +\n \"Widget IDs are valid only while the widget is mounted. After a dialog closes, a list re-renders, or \" +\n \"fast refresh patches a component, re-read the tree or re-run the query instead of reusing an ID.\";\n\nconst APPLICATION_ID_DESCRIPTION =\n \"Application ID to query. If not specified, uses the first connected app. The tool waits briefly for the \" +\n \"requested app to register.\";\n\nconst APP_TIMEOUT_DESCRIPTION = \"Milliseconds to wait for the requested app to register (default: 10000).\";\n\nconst WIDGET_ID_DESCRIPTION =\n \"Widget ID obtained from `gtkx_get_widget_tree`, `gtkx_query_widgets`, or `gtkx_get_widget_props`. \" +\n \"IDs are scoped to a single app. An ID stays valid for as long as its widget is mounted and stops \" +\n \"resolving once the widget is unmounted.\";\n\nconst applicationIdShape = {\n applicationId: z.string().optional().describe(APPLICATION_ID_DESCRIPTION),\n appTimeout: z.number().int().nonnegative().optional().describe(APP_TIMEOUT_DESCRIPTION),\n};\n\nconst widgetIdShape = {\n ...applicationIdShape,\n ...describeParams(widgetIdParams.shape, { widgetId: WIDGET_ID_DESCRIPTION }),\n};\n\nconst widgetPropsShape = {\n ...applicationIdShape,\n ...describeParams(widgetPropsParams.shape, {\n widgetId: WIDGET_ID_DESCRIPTION,\n properties:\n \"GObject property names to read as well, in kebab-case or camelCase (\\\"current-breakpoint\\\" or \" +\n \"\\\"currentBreakpoint\\\"). Omit for the summary alone.\",\n maxDepth:\n `How many levels of descendants to include: ${String(DEFAULT_SUBTREE_DEPTH)} by default, and 0 ` +\n `for the widget on its own. At most ${String(MAX_SUBTREE_WIDGETS)} widgets come back whatever ` +\n \"the depth, and any widget whose own direct children were left out carries a `hiddenChildren` count.\",\n }),\n};\n\nconst treeShape = {\n ...applicationIdShape,\n ...describeParams(treeParams.shape, {\n rootId:\n \"Render only the subtree rooted at this widget ID (from a prior tree or query). Omit for the \" +\n \"whole app.\",\n maxDepth:\n \"Limit how many levels deep to render, and 0 for the root widget on its own; deeper \" +\n \"descendants are summarized with a count. Combine with rootId to drill in without dumping \" +\n \"the whole tree.\",\n }),\n};\n\nconst listAppsShape = {\n waitForApps: z\n .boolean()\n .optional()\n .describe(\n \"If true, wait for at least one app to register before returning. Useful when app is still starting.\",\n ),\n timeout: z.number().optional().describe(\"Timeout in milliseconds when waitForApps is true (default: 10000)\"),\n};\n\nconst queryWidgetsShape = {\n ...applicationIdShape,\n ...describeParams(queryParams.shape, {\n by: \"Query type\",\n value: \"Value to search for\",\n options: \"Additional query options\",\n }),\n};\n\nconst typeShape = {\n ...applicationIdShape,\n ...describeParams(typeParams.shape, {\n widgetId: WIDGET_ID_DESCRIPTION,\n text: \"Text to type\",\n clear: \"Clear existing text before typing\",\n }),\n};\n\nconst fireEventShape = {\n ...applicationIdShape,\n ...describeParams(fireEventParams.shape, {\n widgetId: WIDGET_ID_DESCRIPTION,\n signal: \"GObject signal name to emit\",\n args: \"Arguments to pass to the signal\",\n }),\n};\n\nconst screenshotShape = {\n ...applicationIdShape,\n ...describeParams(screenshotParams.shape, {\n windowId: \"Window ID to capture. If not specified, captures the first window.\",\n path:\n \"Absolute path to write the PNG to on the app's machine. If set, the screenshot is saved there \" +\n \"in addition to being returned.\",\n }),\n returnImage: z\n .boolean()\n .optional()\n .describe(\n \"Return the PNG as image content (default: true). Set false with `path` to save the image \" +\n \"and return only its file location.\",\n ),\n};\n\nfunction describeParams<Shape extends Record<string, z.ZodType>>(\n shape: Shape,\n descriptions: { [Key in keyof Shape]: string },\n): Shape {\n const described: [string, z.ZodType][] = Object.entries(shape).map(([key, schema]) => [\n key,\n schema.describe(descriptions[key as keyof Shape]),\n ]);\n\n return Object.fromEntries(described) as Shape;\n}\n\nconst connectStdio = async (mcpServer: McpServer, stop: () => Promise<void>): Promise<void> => {\n const transport = new StdioServerTransport();\n process.stdin.on(\"end\", () => void stop());\n process.stdin.on(\"close\", () => void stop());\n await mcpServer.connect(transport);\n};\n\nconst logSocketError = (event: Event): void => {\n const error = (event as ConnectionErrorEvent).detail;\n const code = (error as NodeJS.ErrnoException).code;\n\n if (code === \"EPIPE\" || code === \"ECONNRESET\") {\n return;\n }\n\n log.error(`socket error: ${error.message}`);\n};\n\nconst appWithWindows = async (appRouter: AppRouter, app: AppInfo): Promise<AppWithWindows> => {\n try {\n const result = await appRouter.sendToApp<{ windows: AppWindow[] }>(\n app.applicationId,\n \"app.getWindows\",\n {},\n );\n\n return { ...app, windows: result.windows };\n } catch {\n return app;\n }\n};\n\nconst listAppsTool = (appRouter: AppRouter): Tool =>\n defineTool({\n name: \"gtkx_list_apps\",\n title: \"List apps\",\n kind: \"readOnly\",\n description:\n \"List connected GTKX applications and their open windows. \" +\n \"Returns the current snapshot immediately unless waitForApps is true.\",\n inputSchema: listAppsShape,\n handler: async ({ waitForApps, timeout }) => {\n if (waitForApps && !appRouter.hasConnectedApps()) {\n await appRouter.waitForApp(undefined, timeout);\n }\n\n const apps = appRouter.getApps();\n const appsWithWindows = await Promise.all(apps.map((app) => appWithWindows(appRouter, app)));\n\n return textContent(JSON.stringify(appsWithWindows, null, 2));\n },\n });\n\nconst screenshotResult = (\n result: { data: string; mimeType: string; savedPath?: string },\n shouldReturnImage: boolean,\n): CallToolResult => {\n if (result.savedPath === undefined) {\n return shouldReturnImage\n ? imageContent(result.data, result.mimeType)\n : textError(\n \"Nothing to return: `returnImage` was false and no `path` was given, so the screenshot was \" +\n \"neither saved nor returned. Pass `path` to save it, or leave `returnImage` unset.\",\n );\n }\n\n const saved = { type: \"text\", text: `Screenshot saved to ${result.savedPath}` } as const;\n\n if (!shouldReturnImage) {\n return { content: [saved] };\n }\n\n return { content: [saved, { type: \"image\", data: result.data, mimeType: result.mimeType }] };\n};\n\nconst screenshotTool = (appRouter: AppRouter): Tool =>\n defineTool({\n name: \"gtkx_take_screenshot\",\n title: \"Take screenshot\",\n kind: \"readOnly\",\n description:\n \"Capture a screenshot of a window. Returns base64-encoded PNG image data, and optionally writes \" +\n \"the PNG to `path` on the app's machine. You can't target widgets from a screenshot; use \" +\n \"`gtkx_get_widget_tree` to find widget IDs for interaction.\",\n inputSchema: screenshotShape,\n handler: async ({ applicationId, appTimeout, returnImage, ...params }) => {\n const result = await appRouter.sendToApp<{ data: string; mimeType: string; savedPath?: string }>(\n applicationId,\n \"widget.screenshot\",\n params,\n appTimeout,\n );\n\n return screenshotResult(result, returnImage !== false);\n },\n });\n\nconst widgetPropsTool = (appRouter: AppRouter): Tool =>\n defineTool({\n name: \"gtkx_get_widget_props\",\n title: \"Get widget properties\",\n kind: \"readOnly\",\n description:\n \"Read a widget's type, accessible role, name, text, sensitivity, visibility, CSS classes, \" +\n `and descendants. Defaults to ${String(DEFAULT_SUBTREE_DEPTH)} levels; \\`maxDepth\\` changes ` +\n `the depth. Results contain at most ${String(MAX_SUBTREE_WIDGETS)} widgets, in breadth-first ` +\n \"order. `hiddenChildren` counts omitted direct children; query that widget's ID to expand it. \" +\n \"Use `gtkx_get_widget_tree` for an overview. Requested GObject `properties` appear first, \" +\n \"keyed by canonical kebab-case name with `{type, value}`. Enum/flags values use GType value \" +\n \"names, 64-bit integers use decimal strings, and objects use their GType name plus `widgetId` \" +\n \"for widgets. Unknown properties fail; values that cannot be converted include a `note`.\",\n inputSchema: widgetPropsShape,\n handler: async ({ applicationId, appTimeout, ...params }) => {\n const result = await appRouter.sendToApp(applicationId, \"widget.getProps\", params, appTimeout);\n\n return textContent(JSON.stringify(result, null, 2));\n },\n });\n\nfunction buildInspectionTools(appRouter: AppRouter): Tool[] {\n return [\n listAppsTool(appRouter),\n defineTool({\n name: \"gtkx_get_widget_tree\",\n title: \"Widget tree\",\n kind: \"readOnly\",\n description:\n \"Get the widget hierarchy for a connected GTKX app. Returns a tree of widgets with their IDs, \" +\n \"types, roles, and properties. For large apps, pass `maxDepth` for a shallow overview and/or \" +\n \"`rootId` to render just one subtree instead of the whole (possibly truncated) tree.\",\n inputSchema: treeShape,\n handler: async ({ applicationId, appTimeout, rootId, maxDepth }) => {\n const result = await appRouter.sendToApp<{ tree: string }>(applicationId, \"widget.getTree\", {\n rootId,\n maxDepth,\n }, appTimeout);\n\n return textContent(result.tree);\n },\n }),\n defineTool({\n name: \"gtkx_query_widgets\",\n title: \"Query widgets\",\n kind: \"readOnly\",\n description:\n \"Find widgets by role, text, name, or label. Returns each match with its ID and the same \" +\n \"fixed summary `gtkx_get_widget_props` returns, with no descendants: a match that has \" +\n \"children carries `hiddenChildren`, the count of its direct children left out. Read a \" +\n \"match's subtree with `gtkx_get_widget_props` or `gtkx_get_widget_tree`.\",\n inputSchema: queryWidgetsShape,\n handler: async ({ applicationId, appTimeout, ...params }) => {\n const result = await appRouter.sendToApp(applicationId, \"widget.query\", params, appTimeout);\n\n return textContent(JSON.stringify(result, null, 2));\n },\n }),\n widgetPropsTool(appRouter),\n screenshotTool(appRouter),\n ];\n}\n\nfunction buildInteractionTools(appRouter: AppRouter): Tool[] {\n return [\n defineTool({\n name: \"gtkx_click\",\n title: \"Click widget\",\n kind: \"action\",\n description:\n \"Click a widget through userEvent.click. Works with \" +\n \"buttons, checkboxes, switches, list and grid rows, tree expanders, and column headers: a \" +\n \"row is selected, an expander toggles its row's expansion, and a header sorts its column.\",\n inputSchema: widgetIdShape,\n handler: async ({ applicationId, appTimeout, ...params }) => {\n await appRouter.sendToApp(applicationId, \"widget.click\", params, appTimeout);\n\n return textContent(\"Clicked\");\n },\n }),\n defineTool({\n name: \"gtkx_type\",\n title: \"Type text\",\n kind: \"action\",\n description: \"Type text into an editable widget like Entry or TextView\",\n inputSchema: typeShape,\n handler: async ({ applicationId, appTimeout, ...params }) => {\n await appRouter.sendToApp(applicationId, \"widget.type\", params, appTimeout);\n\n return textContent(\"Typed text\");\n },\n }),\n defineTool({\n name: \"gtkx_fire_event\",\n title: \"Fire event\",\n kind: \"action\",\n description: \"Emit a GObject signal on a widget. Use this for custom interactions.\",\n inputSchema: fireEventShape,\n handler: async ({ applicationId, appTimeout, ...params }) => {\n const result = await appRouter.sendToApp(applicationId, \"widget.fireEvent\", params, appTimeout);\n\n return textContent(JSON.stringify(result, null, 2));\n },\n }),\n ];\n}\n\nfunction buildTools(appRouter: AppRouter): Tool[] {\n return [...buildInspectionTools(appRouter), ...buildInteractionTools(appRouter)];\n}\n\nconst registerTools = (\n mcpServer: McpServer,\n appRouter: AppRouter,\n provider: ReferenceProvider,\n settings: McpSettings,\n): void => {\n const tools = selectTools([...buildTools(appRouter), ...buildReferenceTools(provider)], settings);\n\n if (tools.length === 0) {\n log.warn(\"no tools matched the configured filter; the server is registering none\");\n }\n\n for (const tool of tools) {\n registerTool(mcpServer, tool);\n }\n};\n\nconst stoppedServerError = (): Error => new Error(\"createMcpServer: a stopped server cannot be started again\");\n\nconst wasStopRequested = (state: ServerLifecycle): boolean => state.isStopRequested;\n\nfunction stopServer(state: ServerLifecycle): Promise<void> {\n if (state.shutdown !== null) {\n return state.shutdown;\n }\n\n state.isStopRequested = true;\n state.appRouter.dispose();\n const startup = state.startup;\n const shutdown = (async (): Promise<void> => {\n if (startup !== null) {\n await Promise.allSettled([startup]);\n }\n\n await state.socketServer.stop();\n await state.mcpServer.close();\n })();\n\n state.shutdown = shutdown;\n\n return shutdown;\n}\n\nfunction startServer(state: ServerLifecycle): Promise<void> {\n if (wasStopRequested(state)) {\n return Promise.reject(stoppedServerError());\n }\n\n if (state.startup !== null) {\n return state.startup;\n }\n\n const startup = (async (): Promise<void> => {\n try {\n await state.socketServer.start();\n\n if (wasStopRequested(state)) {\n return;\n }\n\n log.info(`socket server listening on ${state.socketPath}`);\n await connectStdio(state.mcpServer, () => stopServer(state));\n } catch (error) {\n if (!wasStopRequested(state)) {\n state.isStopRequested = true;\n state.appRouter.dispose();\n await state.socketServer.stop();\n await state.mcpServer.close();\n }\n\n throw error;\n }\n })();\n\n state.startup = startup;\n\n return startup;\n}\n\nconst createServerHandle = (\n socketServer: SocketServer,\n mcpServer: McpServer,\n appRouter: AppRouter,\n socketPath: string,\n): McpServerHandle => {\n const state: ServerLifecycle = {\n socketServer,\n mcpServer,\n appRouter,\n socketPath,\n isStopRequested: false,\n startup: null,\n shutdown: null,\n };\n\n return { start: () => startServer(state), stop: () => stopServer(state) };\n};\n\nconst createMcpServer = (options: CreateMcpServerOptions): McpServerHandle => {\n const socketAddress = resolveMcpSocketAddress(options.socketPath);\n const socketPath = socketAddress.path;\n\n if (socketAddress.fallbackDirectory !== null) {\n log.warn(`MCP socket path exceeds the safe Unix byte budget; using private fallback ${socketPath}`);\n }\n\n const registry = new ConnectionRegistry();\n const socketServer = new SocketServer(registry, socketAddress);\n const appRouter = new AppRouter(registry);\n registry.addEventListener(\"error\", logSocketError);\n\n appRouter.addEventListener(\"appRegistered\", (event) => {\n const appInfo = (event as AppRegisteredEvent).detail;\n log.info(`app registered: ${appInfo.applicationId} (PID: ${String(appInfo.pid)})`);\n });\n\n appRouter.addEventListener(\"appUnregistered\", (event) => {\n log.info(`app unregistered: ${(event as AppUnregisteredEvent).detail}`);\n });\n\n const mcpServer = new McpServer({ name: \"gtkx-mcp\", version: options.version }, { instructions: INSTRUCTIONS });\n const referenceProvider = createReferenceProvider({ getAppRoot: () => appRouter.getProjectRoot() });\n registerTools(mcpServer, appRouter, referenceProvider, options.settings ?? DEFAULT_SETTINGS);\n registerReferenceResources(mcpServer, referenceProvider);\n\n return createServerHandle(socketServer, mcpServer, appRouter, socketPath);\n};\n\nconst configuredSettings = async (cwd: string): Promise<McpSettings> => {\n try {\n const { config } = await loadConfig(cwd);\n\n return resolveMcpSettings(config);\n } catch (error) {\n if (configDependenciesFor(error).some((path) => existsSync(resolve(cwd, path)))) {\n throw error;\n }\n\n return DEFAULT_SETTINGS;\n }\n};\n\nconst resolveSettings = async (options: ServerOptions): Promise<McpSettings> => {\n const configured = await configuredSettings(options.cwd ?? process.cwd());\n\n return {\n tools: options.tools ?? configured.tools,\n isReadOnly: options.isReadOnly ?? configured.isReadOnly,\n };\n};\n\nconst splitPatterns = (values: string[]): string[] =>\n values.flatMap((value) => value.split(\",\")).map((value) => value.trim()).filter((value) => value.length > 0);\n\nconst parseServerArgs = (argv: string[]): ServerOptions => {\n const { values } = parseArgs({\n args: argv,\n options: {\n tools: { type: \"string\", multiple: true },\n \"read-only\": { type: \"boolean\" },\n },\n allowPositionals: false,\n });\n\n const tools = values.tools === undefined ? undefined : splitPatterns(values.tools);\n\n return {\n ...(tools !== undefined && { tools }),\n ...(values[\"read-only\"] !== undefined && { isReadOnly: values[\"read-only\"] }),\n };\n};\n\nasync function main(options: ServerOptions = {}): Promise<void> {\n const settings = await resolveSettings(options);\n const server = createMcpServer({ version, settings });\n\n installGracefulShutdown({\n onSignal: () => server.stop(),\n });\n\n await server.start();\n}\n\nexport { log, main, main as runMcpServer, parseServerArgs };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tool-filter.d.ts","sourceRoot":"","sources":["../src/tool-filter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAwCtC,QAAA,MAAM,WAAW,GAAI,OAAO,IAAI,EAAE,EAAE,UAAU,WAAW,KAAG,IAAI,EAU/D,CAAC;AAEF,OAAO,EAAE,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"tool-filter.d.ts","sourceRoot":"","sources":["../src/tool-filter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAqCtC,QAAA,MAAM,WAAW,GAAI,OAAO,IAAI,EAAE,EAAE,UAAU,WAAW,KAAG,IAAI,EAU/D,CAAC;AAEF,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -1,7 +1,5 @@
1
1
  const NEGATION_PREFIX = "!";
2
- const SPECIAL_CHARACTERS = /[.+?^${}()|[\]\\]/g;
3
- const escapeLiteral = (value) => value.replaceAll(SPECIAL_CHARACTERS, String.raw `\$&`);
4
- const patternToRegExp = (pattern) => new RegExp(`^${pattern.split("*").map((part) => escapeLiteral(part)).join(".*")}$`);
2
+ const patternToRegExp = (pattern) => new RegExp(`^${pattern.split("*").map((part) => RegExp.escape(part)).join(".*")}$`);
5
3
  const matchingNames = (tools, pattern) => {
6
4
  const expression = patternToRegExp(pattern);
7
5
  return tools.filter((tool) => expression.test(tool.name)).map((tool) => tool.name);
@@ -1 +1 @@
1
- {"version":3,"file":"tool-filter.js","sourceRoot":"","sources":["../src/tool-filter.ts"],"names":[],"mappings":"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","sourcesContent":["import type { McpSettings } from \"@gtkx/config/internal\";\nimport type { Tool } from \"./tool.js\";\n\nconst NEGATION_PREFIX = \"!\";\nconst SPECIAL_CHARACTERS = /[.+?^${}()|[\\]\\\\]/g;\n\nconst escapeLiteral = (value: string): string => value.replaceAll(SPECIAL_CHARACTERS, String.raw`\\$&`);\n\nconst patternToRegExp = (pattern: string): RegExp =>\n new RegExp(`^${pattern.split(\"*\").map((part) => escapeLiteral(part)).join(\".*\")}$`);\n\nconst matchingNames = (tools: Tool[], pattern: string): string[] => {\n const expression = patternToRegExp(pattern);\n\n return tools.filter((tool) => expression.test(tool.name)).map((tool) => tool.name);\n};\n\nconst applyPattern = (selected: Set<string>, tools: Tool[], pattern: string): void => {\n const isNegated = pattern.startsWith(NEGATION_PREFIX);\n const names = matchingNames(tools, isNegated ? pattern.slice(NEGATION_PREFIX.length) : pattern);\n\n for (const name of names) {\n if (isNegated) {\n selected.delete(name);\n } else {\n selected.add(name);\n }\n }\n};\n\nconst selectNames = (tools: Tool[], patterns: string[]): Set<string> => {\n const isSubtractive = patterns.every((pattern) => pattern.startsWith(NEGATION_PREFIX));\n const selected: Set<string> = new Set(isSubtractive ? tools.map((tool) => tool.name) : []);\n\n for (const pattern of patterns) {\n applyPattern(selected, tools, pattern);\n }\n\n return selected;\n};\n\nconst selectTools = (tools: Tool[], settings: McpSettings): Tool[] => {\n const allowed = settings.isReadOnly ? tools.filter((tool) => tool.kind === \"readOnly\") : tools;\n\n if (settings.tools.length === 0) {\n return allowed;\n }\n\n const selected = selectNames(allowed, settings.tools);\n\n return allowed.filter((tool) => selected.has(tool.name));\n};\n\nexport { selectTools };\n"]}
1
+ {"version":3,"file":"tool-filter.js","sourceRoot":"","sources":["../src/tool-filter.ts"],"names":[],"mappings":"AAGA,MAAM,eAAe,GAAG,GAAG,CAAC;AAE5B,MAAM,eAAe,GAAG,CAAC,OAAe,EAAU,EAAE,CAChD,IAAI,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAExF,MAAM,aAAa,GAAG,CAAC,KAAa,EAAE,OAAe,EAAY,EAAE;IAC/D,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAE5C,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvF,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,QAAqB,EAAE,KAAa,EAAE,OAAe,EAAQ,EAAE;IACjF,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAEhG,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,SAAS,EAAE,CAAC;YACZ,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACJ,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACL,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,QAAkB,EAAe,EAAE;IACnE,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAgB,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAE3F,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC7B,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,QAAqB,EAAU,EAAE;IACjE,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAE/F,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7D,CAAC,CAAC;AAEF,OAAO,EAAE,WAAW,EAAE,CAAC","sourcesContent":["import type { McpSettings } from \"@gtkx/config/internal\";\nimport type { Tool } from \"./tool.js\";\n\nconst NEGATION_PREFIX = \"!\";\n\nconst patternToRegExp = (pattern: string): RegExp =>\n new RegExp(`^${pattern.split(\"*\").map((part) => RegExp.escape(part)).join(\".*\")}$`);\n\nconst matchingNames = (tools: Tool[], pattern: string): string[] => {\n const expression = patternToRegExp(pattern);\n\n return tools.filter((tool) => expression.test(tool.name)).map((tool) => tool.name);\n};\n\nconst applyPattern = (selected: Set<string>, tools: Tool[], pattern: string): void => {\n const isNegated = pattern.startsWith(NEGATION_PREFIX);\n const names = matchingNames(tools, isNegated ? pattern.slice(NEGATION_PREFIX.length) : pattern);\n\n for (const name of names) {\n if (isNegated) {\n selected.delete(name);\n } else {\n selected.add(name);\n }\n }\n};\n\nconst selectNames = (tools: Tool[], patterns: string[]): Set<string> => {\n const isSubtractive = patterns.every((pattern) => pattern.startsWith(NEGATION_PREFIX));\n const selected: Set<string> = new Set(isSubtractive ? tools.map((tool) => tool.name) : []);\n\n for (const pattern of patterns) {\n applyPattern(selected, tools, pattern);\n }\n\n return selected;\n};\n\nconst selectTools = (tools: Tool[], settings: McpSettings): Tool[] => {\n const allowed = settings.isReadOnly ? tools.filter((tool) => tool.kind === \"readOnly\") : tools;\n\n if (settings.tools.length === 0) {\n return allowed;\n }\n\n const selected = selectNames(allowed, settings.tools);\n\n return allowed.filter((tool) => selected.has(tool.name));\n};\n\nexport { selectTools };\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gtkx/mcp",
3
- "version": "2.0.0-beta.10",
4
- "description": "MCP server for GTKX GNOME references and live Adwaita apps.",
3
+ "version": "2.0.0-beta.11",
4
+ "description": "MCP tools for GTKX documentation and running applications.",
5
5
  "keywords": [
6
6
  "gtkx",
7
7
  "gtk",
@@ -58,6 +58,18 @@
58
58
  "cwd": ".",
59
59
  "command": "eslint {projectRoot}"
60
60
  }
61
+ },
62
+ "test": {
63
+ "dependsOn": [
64
+ "^build",
65
+ "gtkx:codegen",
66
+ "@gtkx/cli:build",
67
+ "@gtkx/components:build"
68
+ ],
69
+ "inputs": [
70
+ "...",
71
+ "{workspaceRoot}/packages/cli/tests/fixtures/**/*"
72
+ ]
61
73
  }
62
74
  }
63
75
  },
@@ -65,15 +77,15 @@
65
77
  "node": ">=26.7.0"
66
78
  },
67
79
  "dependencies": {
68
- "@gtkx/codegen": "2.0.0-beta.10",
69
- "@gtkx/config": "2.0.0-beta.10",
70
- "@gtkx/utils": "2.0.0-beta.10",
80
+ "@gtkx/codegen": "2.0.0-beta.11",
81
+ "@gtkx/config": "2.0.0-beta.11",
82
+ "@gtkx/utils": "2.0.0-beta.11",
71
83
  "@modelcontextprotocol/sdk": "^1.30.0",
72
- "zod": "^4.5.4"
84
+ "zod": "^4.6.5"
73
85
  },
74
86
  "devDependencies": {
75
- "@gtkx/vitest": "2.0.0-beta.10",
76
- "vitest": "^5.0.0"
87
+ "@gtkx/vitest": "2.0.0-beta.11",
88
+ "vitest": "^5.0.1"
77
89
  },
78
90
  "scripts": {
79
91
  "release": "tsx ../../scripts/release-package.ts"
package/src/app-router.ts CHANGED
@@ -24,6 +24,7 @@ type RegisteredApp = {
24
24
  };
25
25
 
26
26
  const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
27
+ const DEFAULT_APP_TIMEOUT_MS = 10_000;
27
28
 
28
29
  const routerStoppedError = (): Error => new Error("GTKX MCP server stopped while waiting for an application");
29
30
 
@@ -42,24 +43,19 @@ function appUnregisteredEvent(applicationId: string): AppUnregisteredEvent {
42
43
  }
43
44
 
44
45
  class AppRouter extends EventTarget {
45
- private static defaultWaitTimeout = 10_000;
46
-
47
46
  private apps: Map<string, RegisteredApp> = new Map();
48
47
 
49
48
  private connectionToApp: Map<string, string> = new Map();
50
49
 
51
- private requestTimeout: number;
52
-
53
50
  private connections: AppConnections;
54
51
 
55
52
  private pendingAppWaits: Set<PendingAppWait> = new Set();
56
53
 
57
54
  private isDisposed = false;
58
55
 
59
- constructor(connections: AppConnections, options: { requestTimeout?: number } = {}) {
56
+ constructor(connections: AppConnections) {
60
57
  super();
61
58
  this.connections = connections;
62
- this.requestTimeout = options.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT_MS;
63
59
  this.connections.onRequest = (connection, request) => this.handleRequest(connection, request);
64
60
 
65
61
  this.connections.addEventListener("disconnection", (event) => {
@@ -107,16 +103,10 @@ class AppRouter extends EventTarget {
107
103
  }
108
104
 
109
105
  const params = parseResult.data;
110
-
111
- const appInfo: AppInfo = {
112
- applicationId: params.applicationId,
113
- pid: params.pid,
114
- ...(params.projectRoot !== undefined && { projectRoot: params.projectRoot }),
115
- };
116
-
117
- this.apps.set(params.applicationId, { info: appInfo, connection });
106
+ this.removeApp(connection);
107
+ this.apps.set(params.applicationId, { info: params, connection });
118
108
  this.connectionToApp.set(connection.id, params.applicationId);
119
- this.dispatchEvent(appRegisteredEvent(appInfo));
109
+ this.dispatchEvent(appRegisteredEvent(params));
120
110
 
121
111
  return { success: true };
122
112
  }
@@ -129,7 +119,7 @@ class AppRouter extends EventTarget {
129
119
  }
130
120
 
131
121
  if (error.code === REQUEST_TIMEOUT_CODE) {
132
- return requestTimeoutError(this.requestTimeout);
122
+ return requestTimeoutError(DEFAULT_REQUEST_TIMEOUT_MS);
133
123
  }
134
124
 
135
125
  return protocolErrorFrom(error);
@@ -216,7 +206,7 @@ class AppRouter extends EventTarget {
216
206
  }
217
207
  }
218
208
 
219
- waitForApp(applicationId?: string, timeout: number = AppRouter.defaultWaitTimeout): Promise<AppInfo> {
209
+ waitForApp(applicationId?: string, timeout: number = DEFAULT_APP_TIMEOUT_MS): Promise<AppInfo> {
220
210
  if (this.isDisposed) {
221
211
  return Promise.reject(routerStoppedError());
222
212
  }
@@ -240,7 +230,7 @@ class AppRouter extends EventTarget {
240
230
  const app = this.resolveTargetApp(applicationId);
241
231
 
242
232
  try {
243
- return await app.connection.send<T>(method, params, this.requestTimeout);
233
+ return await app.connection.send<T>(method, params, DEFAULT_REQUEST_TIMEOUT_MS);
244
234
  } catch (error) {
245
235
  if (error instanceof McpError) {
246
236
  throw this.toAppError(app, error);