@gtkx/mcp 1.6.0 → 2.0.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -44
- package/dist/app-router.d.ts +6 -2
- package/dist/app-router.d.ts.map +1 -1
- package/dist/app-router.js +56 -19
- package/dist/app-router.js.map +1 -1
- package/dist/internal.d.ts +2 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +2 -1
- package/dist/internal.js.map +1 -1
- package/dist/protocol/schemas.d.ts +1 -2
- package/dist/protocol/schemas.d.ts.map +1 -1
- package/dist/protocol/schemas.js +1 -7
- package/dist/protocol/schemas.js.map +1 -1
- package/dist/reference.d.ts.map +1 -1
- package/dist/reference.js +25 -46
- package/dist/reference.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +92 -44
- package/dist/server.js.map +1 -1
- package/dist/socket-path.d.ts +11 -0
- package/dist/socket-path.d.ts.map +1 -0
- package/dist/socket-path.js +74 -0
- package/dist/socket-path.js.map +1 -0
- package/dist/socket-server.d.ts +3 -1
- package/dist/socket-server.d.ts.map +1 -1
- package/dist/socket-server.js +48 -32
- package/dist/socket-server.js.map +1 -1
- package/package.json +15 -9
- package/src/app-router.ts +77 -22
- package/src/internal.ts +4 -1
- package/src/protocol/schemas.ts +0 -9
- package/src/reference.ts +27 -53
- package/src/server.ts +114 -46
- package/src/socket-path.ts +103 -0
- package/src/socket-server.ts +61 -37
package/dist/reference.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { loadApiReference, resolveGirPath, resolveLibraries } from "@gtkx/codegen";
|
|
2
2
|
import { loadConfig } from "@gtkx/config";
|
|
3
|
-
import { resolveFuture } from "@gtkx/config/internal";
|
|
4
3
|
import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
4
|
import { ErrorCode, McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
6
5
|
import { existsSync, statSync } from "node:fs";
|
|
@@ -9,7 +8,7 @@ import { z } from "zod";
|
|
|
9
8
|
import { defineTool, textContent, textError } from "./tool.js";
|
|
10
9
|
const FRESHNESS_INTERVAL_MS = 2000;
|
|
11
10
|
const FAILURE_RETRY_MS = 5000;
|
|
12
|
-
const CONFIG_EXTENSIONS = ["ts", "mts", "
|
|
11
|
+
const CONFIG_EXTENSIONS = ["ts", "mts", "js", "mjs", "json"];
|
|
13
12
|
const PROJECT_SOURCE_LABELS = {
|
|
14
13
|
argument: "requested with `projectRoot`",
|
|
15
14
|
workingDirectory: "found from the working directory",
|
|
@@ -26,8 +25,8 @@ const SYMBOL_KIND = z.enum([
|
|
|
26
25
|
"function",
|
|
27
26
|
"constant",
|
|
28
27
|
]);
|
|
29
|
-
const SYMBOL_DESCRIPTION = "Qualified symbol name (`
|
|
30
|
-
"or bare symbol name when unambiguous (`
|
|
28
|
+
const SYMBOL_DESCRIPTION = "Qualified symbol name (`Adw.Toast`, `Gtk.Orientation`, `GLib.idleAdd`), JSX element name (`AdwToast`), " +
|
|
29
|
+
"or bare symbol name when unambiguous (`Toast`).";
|
|
31
30
|
const PROJECT_ROOT_DESCRIPTION = "Directory of the GTKX project whose bindings to document, absolute or relative to the working directory. " +
|
|
32
31
|
"Any directory inside the project works; its `gtkx.config.ts` decides the documented libraries. Omit to use " +
|
|
33
32
|
"the project containing the working directory, falling back to a connected app's project.";
|
|
@@ -39,12 +38,12 @@ const listApiShape = {
|
|
|
39
38
|
namespace: z
|
|
40
39
|
.string()
|
|
41
40
|
.optional()
|
|
42
|
-
.describe("Namespace to list (e.g. `
|
|
41
|
+
.describe("Namespace to list (e.g. `Adw`, `Gtk`, `Gio`). Omit for an overview of all namespaces."),
|
|
43
42
|
};
|
|
44
43
|
const searchApiShape = {
|
|
45
44
|
...projectRootShape,
|
|
46
45
|
query: z.string().describe("Case-insensitive substring of a symbol name, e.g. `headerbar` or `orientation`."),
|
|
47
|
-
namespace: z.string().optional().describe("Restrict matches to one namespace (e.g. `
|
|
46
|
+
namespace: z.string().optional().describe("Restrict matches to one namespace (e.g. `Adw`)."),
|
|
48
47
|
kind: SYMBOL_KIND.optional().describe("Restrict matches to one symbol kind."),
|
|
49
48
|
limit: z.number().int().min(1).optional().describe("Maximum number of results (default: 20)."),
|
|
50
49
|
};
|
|
@@ -105,31 +104,19 @@ const loadReference = async (requestedRoot) => {
|
|
|
105
104
|
"(Linux: `sudo dnf install gobject-introspection-devel` or `sudo apt install libgirepository1.0-dev`), " +
|
|
106
105
|
"or set `girPath` in gtkx.config.ts.");
|
|
107
106
|
}
|
|
108
|
-
const
|
|
109
|
-
const libraries = resolveLibraries(config.libraries, girPath, future.isAdwaitaDefault);
|
|
107
|
+
const libraries = resolveLibraries(config.libraries);
|
|
110
108
|
const reference = loadApiReference({
|
|
111
109
|
libraries,
|
|
112
110
|
girPath,
|
|
113
|
-
isByteArrayTyped: future.isByteArrayTyped,
|
|
114
|
-
isValueUnwrapped: future.isValueUnwrapped,
|
|
115
|
-
isFinishTrimmed: future.isFinishTrimmed,
|
|
116
|
-
isInoutInPlace: future.isInoutInPlace,
|
|
117
|
-
isTreeShaken: future.isTreeShaken,
|
|
118
111
|
});
|
|
119
112
|
const watched = [watchFile(resolve(root, configFile)), ...reference.girFiles.map((file) => watchFile(file))];
|
|
120
113
|
return { reference, root, watched };
|
|
121
114
|
};
|
|
122
|
-
const markFailed = async (entry) => {
|
|
123
|
-
try {
|
|
124
|
-
await entry.pending;
|
|
125
|
-
}
|
|
126
|
-
catch {
|
|
127
|
-
entry.failedAt = Date.now();
|
|
128
|
-
}
|
|
129
|
-
};
|
|
130
115
|
const startLoad = (cache, root) => {
|
|
131
116
|
const entry = { pending: loadReference(root), verifiedAt: Date.now(), failedAt: undefined };
|
|
132
|
-
void
|
|
117
|
+
void entry.pending.catch(() => {
|
|
118
|
+
entry.failedAt = Date.now();
|
|
119
|
+
});
|
|
133
120
|
cache.set(root, entry);
|
|
134
121
|
return entry;
|
|
135
122
|
};
|
|
@@ -154,10 +141,9 @@ const currentReference = async (cache, root) => {
|
|
|
154
141
|
}
|
|
155
142
|
return revalidate(cache, root, entry).pending;
|
|
156
143
|
};
|
|
157
|
-
const defaultWorkingDirectory = () => process.cwd();
|
|
158
144
|
const createReferenceProvider = (options) => {
|
|
159
145
|
const cache = new Map();
|
|
160
|
-
const getWorkingDirectory = options.getWorkingDirectory ??
|
|
146
|
+
const getWorkingDirectory = options.getWorkingDirectory ?? (() => process.cwd());
|
|
161
147
|
const resolve = (projectRoot) => resolveProject(getWorkingDirectory(), options.getAppRoot, projectRoot);
|
|
162
148
|
const load = async (project) => {
|
|
163
149
|
const loaded = await currentReference(cache, project.root);
|
|
@@ -183,19 +169,12 @@ const scopedResult = async (provider, projectRoot, render) => {
|
|
|
183
169
|
}
|
|
184
170
|
};
|
|
185
171
|
const formatCandidates = (candidates) => candidates.map((candidate) => `- ${candidate.namespace}.${candidate.name} (${candidate.kind})`).join("\n");
|
|
186
|
-
const buildSearchOptions = (args) => {
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
options.kinds = [args.kind];
|
|
193
|
-
}
|
|
194
|
-
if (args.limit !== undefined) {
|
|
195
|
-
options.limit = args.limit;
|
|
196
|
-
}
|
|
197
|
-
return options;
|
|
198
|
-
};
|
|
172
|
+
const buildSearchOptions = (args) => ({
|
|
173
|
+
query: args.query,
|
|
174
|
+
...(args.namespace !== undefined && { namespace: args.namespace }),
|
|
175
|
+
...(args.kind !== undefined && { kinds: [args.kind] }),
|
|
176
|
+
...(args.limit !== undefined && { limit: args.limit }),
|
|
177
|
+
});
|
|
199
178
|
const listApiResult = (reference, namespace) => {
|
|
200
179
|
if (namespace === undefined) {
|
|
201
180
|
return textContent(reference.overview());
|
|
@@ -232,8 +211,9 @@ const listApiTool = (provider) => defineTool({
|
|
|
232
211
|
name: "gtkx_list_api",
|
|
233
212
|
title: "List API reference",
|
|
234
213
|
kind: "readOnly",
|
|
235
|
-
description: "List the project's generated
|
|
236
|
-
"
|
|
214
|
+
description: "List the project's generated bindings API (`@gtkx/gi` and `@gtkx/jsx`), including Adwaita, " +
|
|
215
|
+
"GTK4, and its declared GIR libraries. Without a namespace, returns every namespace with symbol counts; " +
|
|
216
|
+
"with a namespace, lists all of its symbols grouped by kind.",
|
|
237
217
|
inputSchema: listApiShape,
|
|
238
218
|
handler: ({ namespace, projectRoot }) => scopedResult(provider, projectRoot, (reference) => listApiResult(reference, namespace)),
|
|
239
219
|
});
|
|
@@ -241,7 +221,7 @@ const searchApiTool = (provider) => defineTool({
|
|
|
241
221
|
name: "gtkx_search_api",
|
|
242
222
|
title: "Search API reference",
|
|
243
223
|
kind: "readOnly",
|
|
244
|
-
description: "Search the project's generated
|
|
224
|
+
description: "Search the project's generated bindings API by symbol name. Returns matching symbols with " +
|
|
245
225
|
"their namespace, kind, and a one-line summary; fetch full pages with `gtkx_get_api_docs`.",
|
|
246
226
|
inputSchema: searchApiShape,
|
|
247
227
|
handler: (args) => scopedResult(provider, args.projectRoot, (reference) => searchApiResult(reference, args)),
|
|
@@ -250,7 +230,7 @@ const getApiDocsTool = (provider) => defineTool({
|
|
|
250
230
|
name: "gtkx_get_api_docs",
|
|
251
231
|
title: "Get API docs",
|
|
252
232
|
kind: "readOnly",
|
|
253
|
-
description: "Get the full reference page for one symbol of the project's generated
|
|
233
|
+
description: "Get the full reference page for one symbol of the project's generated bindings: JSX elements " +
|
|
254
234
|
"(props, signals, methods) or `@gtkx/gi` classes, interfaces, records, enums, callbacks, aliases, " +
|
|
255
235
|
"functions, and constants.",
|
|
256
236
|
inputSchema: apiDocsShape,
|
|
@@ -273,10 +253,9 @@ const withLoadFallback = async (load, fallback) => {
|
|
|
273
253
|
return fallback;
|
|
274
254
|
}
|
|
275
255
|
};
|
|
276
|
-
const namesStartingWith = (names, value) => names.filter((name) => name.toLowerCase().startsWith(value.toLowerCase()));
|
|
277
256
|
const completeNames = (provider, value, collect) => withLoadFallback(async () => {
|
|
278
257
|
const { reference } = await provider.get();
|
|
279
|
-
return
|
|
258
|
+
return collect(reference).filter((name) => name.toLowerCase().startsWith(value.toLowerCase()));
|
|
280
259
|
}, []);
|
|
281
260
|
const namespaceCompleter = (provider) => (value) => completeNames(provider, value, (reference) => reference.namespaces().map((summary) => summary.name));
|
|
282
261
|
const completeSymbol = (provider, namespace, value) => {
|
|
@@ -300,7 +279,7 @@ const symbolPage = async (uri, provider, namespace, symbol) => {
|
|
|
300
279
|
const registerIndexResource = (server, provider) => {
|
|
301
280
|
server.registerResource("gtkx-api-reference", "gtkx://reference/index", {
|
|
302
281
|
title: "GTKX API reference index",
|
|
303
|
-
description: "Namespaces of the project's generated
|
|
282
|
+
description: "Namespaces of the project's generated bindings, with symbol and JSX element counts.",
|
|
304
283
|
mimeType: "text/markdown",
|
|
305
284
|
}, async (uri) => {
|
|
306
285
|
const { reference } = await provider.get();
|
|
@@ -324,7 +303,7 @@ const registerNamespaceResource = (server, provider) => {
|
|
|
324
303
|
},
|
|
325
304
|
}), {
|
|
326
305
|
title: "GTKX namespace reference",
|
|
327
|
-
description: "All symbols of one namespace of the project's generated
|
|
306
|
+
description: "All symbols of one namespace of the project's generated bindings, grouped by kind.",
|
|
328
307
|
mimeType: "text/markdown",
|
|
329
308
|
}, async (uri, variables) => {
|
|
330
309
|
const namespace = variableValue(variables.namespace);
|
|
@@ -345,7 +324,7 @@ const registerSymbolResource = (server, provider) => {
|
|
|
345
324
|
},
|
|
346
325
|
}), {
|
|
347
326
|
title: "GTKX symbol reference",
|
|
348
|
-
description: "Reference page for one symbol of the project's generated
|
|
327
|
+
description: "Reference page for one symbol of the project's generated bindings: a JSX element or a " +
|
|
349
328
|
"class, interface, record, enum, callback, alias, function, or constant.",
|
|
350
329
|
mimeType: "text/markdown",
|
|
351
330
|
}, (uri, variables) => symbolPage(uri, provider, variableValue(variables.namespace), variableValue(variables.symbol)));
|
package/dist/reference.js.map
CHANGED
|
@@ -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 { resolveFuture } 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_EXTENSIONS = [\"ts\", \"mts\", \"cts\", \"js\", \"mjs\", \"cjs\", \"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 (`Gtk.Button`, `Gtk.Orientation`, `GLib.idleAdd`), JSX element name (`GtkButton`), \" +\n \"or bare symbol name when unambiguous (`Button`).\";\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. `Gtk`, `Adw`, `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. `Gtk`).\"),\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 future = resolveFuture(config.future);\n const libraries = resolveLibraries(config.libraries, girPath, future.isAdwaitaDefault);\n\n const reference = loadApiReference({\n libraries,\n girPath,\n isByteArrayTyped: future.isByteArrayTyped,\n isValueUnwrapped: future.isValueUnwrapped,\n isFinishTrimmed: future.isFinishTrimmed,\n isInoutInPlace: future.isInoutInPlace,\n isTreeShaken: future.isTreeShaken,\n });\n\n const watched = [watchFile(resolve(root, configFile)), ...reference.girFiles.map((file) => watchFile(file))];\n\n return { reference, root, watched };\n};\n\nconst markFailed = async (entry: CacheEntry): Promise<void> => {\n try {\n await entry.pending;\n } catch {\n entry.failedAt = Date.now();\n }\n};\n\nconst startLoad = (cache: ReferenceCache, root: string): CacheEntry => {\n const entry: CacheEntry = { pending: loadReference(root), verifiedAt: Date.now(), failedAt: undefined };\n void markFailed(entry);\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 defaultWorkingDirectory = (): string => process.cwd();\n\nconst createReferenceProvider = (options: ReferenceProviderOptions): ReferenceProvider => {\n const cache: ReferenceCache = new Map();\n const getWorkingDirectory = options.getWorkingDirectory ?? defaultWorkingDirectory;\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 const options: SearchOptions = { query: args.query };\n\n if (args.namespace !== undefined) {\n options.namespace = args.namespace;\n }\n\n if (args.kind !== undefined) {\n options.kinds = [args.kind];\n }\n\n if (args.limit !== undefined) {\n options.limit = args.limit;\n }\n\n return options;\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 GTK4 bindings API (`@gtkx/gi` and `@gtkx/jsx`). Without a namespace, \" +\n \"returns every namespace with symbol counts; 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 GTK4 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 GTK4 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 namesStartingWith = (names: string[], value: string): string[] =>\n names.filter((name) => name.toLowerCase().startsWith(value.toLowerCase()));\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 namesStartingWith(collect(reference), value);\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 GTK4 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 GTK4 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 GTK4 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 { 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"]}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/server.js
CHANGED
|
@@ -8,8 +8,9 @@ import { z } from "zod";
|
|
|
8
8
|
import packageManifest from "../package.json" with { type: "json" };
|
|
9
9
|
import { AppRouter } from "./app-router.js";
|
|
10
10
|
import { ConnectionRegistry } from "./connection-registry.js";
|
|
11
|
-
import {
|
|
11
|
+
import { DEFAULT_SUBTREE_DEPTH, fireEventParams, MAX_SUBTREE_WIDGETS, queryParams, screenshotParams, treeParams, typeParams, widgetIdParams, widgetPropsParams, } from "./protocol/schemas.js";
|
|
12
12
|
import { buildReferenceTools, createReferenceProvider, registerReferenceResources, } from "./reference.js";
|
|
13
|
+
import { resolveMcpSocketAddress } from "./socket-path.js";
|
|
13
14
|
import { SocketServer } from "./socket-server.js";
|
|
14
15
|
import { selectTools } from "./tool-filter.js";
|
|
15
16
|
import { defineTool, imageContent, registerTool, textContent, textError } from "./tool.js";
|
|
@@ -18,17 +19,23 @@ const log = createLogger("mcp");
|
|
|
18
19
|
const DEFAULT_SETTINGS = { tools: [], isReadOnly: false };
|
|
19
20
|
const INSTRUCTIONS = "The widget tools drive a GTKX app running under `gtkx dev`: they read " +
|
|
20
21
|
"its live widget tree, query it by accessible role and name, click and type, and capture screenshots. " +
|
|
21
|
-
"They
|
|
22
|
+
"They wait briefly for a starting app, so start `gtkx dev` before or alongside a widget request. " +
|
|
23
|
+
"The reference tools answer from the " +
|
|
22
24
|
"bindings generated for a specific project, so they describe that project's GIR libraries rather than " +
|
|
23
|
-
"
|
|
24
|
-
"does not apply here.\n\n" +
|
|
25
|
+
"the GNOME platform in general; prefer them over recalled Adwaita or GTK knowledge, which is usually C, " +
|
|
26
|
+
"PyGObject or GJS and does not apply here.\n\n" +
|
|
25
27
|
"Widget IDs are valid only while the widget is mounted. After a dialog closes, a list re-renders, or " +
|
|
26
28
|
"fast refresh patches a component, re-read the tree or re-run the query instead of reusing an ID.";
|
|
27
|
-
const APPLICATION_ID_DESCRIPTION = "Application ID to query. If not specified, uses the first connected app."
|
|
29
|
+
const APPLICATION_ID_DESCRIPTION = "Application ID to query. If not specified, uses the first connected app. The tool waits briefly for the " +
|
|
30
|
+
"requested app to register.";
|
|
31
|
+
const APP_TIMEOUT_DESCRIPTION = "Milliseconds to wait for the requested app to register (default: 10000).";
|
|
28
32
|
const WIDGET_ID_DESCRIPTION = "Widget ID obtained from `gtkx_get_widget_tree`, `gtkx_query_widgets`, or `gtkx_get_widget_props`. " +
|
|
29
33
|
"IDs are scoped to a single app. An ID stays valid for as long as its widget is mounted and stops " +
|
|
30
34
|
"resolving once the widget is unmounted.";
|
|
31
|
-
const applicationIdShape = {
|
|
35
|
+
const applicationIdShape = {
|
|
36
|
+
applicationId: z.string().optional().describe(APPLICATION_ID_DESCRIPTION),
|
|
37
|
+
appTimeout: z.number().int().nonnegative().optional().describe(APP_TIMEOUT_DESCRIPTION),
|
|
38
|
+
};
|
|
32
39
|
const widgetIdShape = {
|
|
33
40
|
...applicationIdShape,
|
|
34
41
|
...describeParams(widgetIdParams.shape, { widgetId: WIDGET_ID_DESCRIPTION }),
|
|
@@ -81,7 +88,7 @@ const fireEventShape = {
|
|
|
81
88
|
...applicationIdShape,
|
|
82
89
|
...describeParams(fireEventParams.shape, {
|
|
83
90
|
widgetId: WIDGET_ID_DESCRIPTION,
|
|
84
|
-
signal: "
|
|
91
|
+
signal: "GObject signal name to emit",
|
|
85
92
|
args: "Arguments to pass to the signal",
|
|
86
93
|
}),
|
|
87
94
|
};
|
|
@@ -133,11 +140,12 @@ const listAppsTool = (appRouter) => defineTool({
|
|
|
133
140
|
name: "gtkx_list_apps",
|
|
134
141
|
title: "List apps",
|
|
135
142
|
kind: "readOnly",
|
|
136
|
-
description: "List
|
|
143
|
+
description: "List connected GTKX applications and their open windows. " +
|
|
144
|
+
"Returns the current snapshot immediately unless waitForApps is true.",
|
|
137
145
|
inputSchema: listAppsShape,
|
|
138
146
|
handler: async ({ waitForApps, timeout }) => {
|
|
139
147
|
if (waitForApps && !appRouter.hasConnectedApps()) {
|
|
140
|
-
await appRouter.waitForApp(timeout);
|
|
148
|
+
await appRouter.waitForApp(undefined, timeout);
|
|
141
149
|
}
|
|
142
150
|
const apps = appRouter.getApps();
|
|
143
151
|
const appsWithWindows = await Promise.all(apps.map((app) => appWithWindows(appRouter, app)));
|
|
@@ -165,8 +173,8 @@ const screenshotTool = (appRouter) => defineTool({
|
|
|
165
173
|
"the PNG to `path` on the app's machine. You can't target widgets from a screenshot; use " +
|
|
166
174
|
"`gtkx_get_widget_tree` to find widget IDs for interaction.",
|
|
167
175
|
inputSchema: screenshotShape,
|
|
168
|
-
handler: async ({ applicationId, returnImage, ...params }) => {
|
|
169
|
-
const result = await appRouter.sendToApp(applicationId, "widget.screenshot", params);
|
|
176
|
+
handler: async ({ applicationId, appTimeout, returnImage, ...params }) => {
|
|
177
|
+
const result = await appRouter.sendToApp(applicationId, "widget.screenshot", params, appTimeout);
|
|
170
178
|
return screenshotResult(result, returnImage !== false);
|
|
171
179
|
},
|
|
172
180
|
});
|
|
@@ -187,8 +195,8 @@ const widgetPropsTool = (appRouter) => defineTool({
|
|
|
187
195
|
"a property the widget does not have fails; a value that cannot be marshalled carries a `note` " +
|
|
188
196
|
"instead.",
|
|
189
197
|
inputSchema: widgetPropsShape,
|
|
190
|
-
handler: async ({ applicationId, ...params }) => {
|
|
191
|
-
const result = await appRouter.sendToApp(applicationId, "widget.getProps", params);
|
|
198
|
+
handler: async ({ applicationId, appTimeout, ...params }) => {
|
|
199
|
+
const result = await appRouter.sendToApp(applicationId, "widget.getProps", params, appTimeout);
|
|
192
200
|
return textContent(JSON.stringify(result, null, 2));
|
|
193
201
|
},
|
|
194
202
|
});
|
|
@@ -203,11 +211,11 @@ function buildInspectionTools(appRouter) {
|
|
|
203
211
|
"types, roles, and properties. For large apps, pass `maxDepth` for a shallow overview and/or " +
|
|
204
212
|
"`rootId` to render just one subtree instead of the whole (possibly truncated) tree.",
|
|
205
213
|
inputSchema: treeShape,
|
|
206
|
-
handler: async ({ applicationId, rootId, maxDepth }) => {
|
|
214
|
+
handler: async ({ applicationId, appTimeout, rootId, maxDepth }) => {
|
|
207
215
|
const result = await appRouter.sendToApp(applicationId, "widget.getTree", {
|
|
208
216
|
rootId,
|
|
209
217
|
maxDepth,
|
|
210
|
-
});
|
|
218
|
+
}, appTimeout);
|
|
211
219
|
return textContent(result.tree);
|
|
212
220
|
},
|
|
213
221
|
}),
|
|
@@ -220,8 +228,8 @@ function buildInspectionTools(appRouter) {
|
|
|
220
228
|
"children carries `hiddenChildren`, the count of its direct children left out. Read a " +
|
|
221
229
|
"match's subtree with `gtkx_get_widget_props` or `gtkx_get_widget_tree`.",
|
|
222
230
|
inputSchema: queryWidgetsShape,
|
|
223
|
-
handler: async ({ applicationId, ...params }) => {
|
|
224
|
-
const result = await appRouter.sendToApp(applicationId, "widget.query", params);
|
|
231
|
+
handler: async ({ applicationId, appTimeout, ...params }) => {
|
|
232
|
+
const result = await appRouter.sendToApp(applicationId, "widget.query", params, appTimeout);
|
|
225
233
|
return textContent(JSON.stringify(result, null, 2));
|
|
226
234
|
},
|
|
227
235
|
}),
|
|
@@ -239,8 +247,8 @@ function buildInteractionTools(appRouter) {
|
|
|
239
247
|
"buttons, checkboxes, switches, list and grid rows, tree expanders, and column headers: a " +
|
|
240
248
|
"row is selected, an expander toggles its row's expansion, and a header sorts its column.",
|
|
241
249
|
inputSchema: widgetIdShape,
|
|
242
|
-
handler: async ({ applicationId, ...params }) => {
|
|
243
|
-
await appRouter.sendToApp(applicationId, "widget.click", params);
|
|
250
|
+
handler: async ({ applicationId, appTimeout, ...params }) => {
|
|
251
|
+
await appRouter.sendToApp(applicationId, "widget.click", params, appTimeout);
|
|
244
252
|
return textContent("Clicked");
|
|
245
253
|
},
|
|
246
254
|
}),
|
|
@@ -250,8 +258,8 @@ function buildInteractionTools(appRouter) {
|
|
|
250
258
|
kind: "action",
|
|
251
259
|
description: "Type text into an editable widget like Entry or TextView",
|
|
252
260
|
inputSchema: typeShape,
|
|
253
|
-
handler: async ({ applicationId, ...params }) => {
|
|
254
|
-
await appRouter.sendToApp(applicationId, "widget.type", params);
|
|
261
|
+
handler: async ({ applicationId, appTimeout, ...params }) => {
|
|
262
|
+
await appRouter.sendToApp(applicationId, "widget.type", params, appTimeout);
|
|
255
263
|
return textContent("Typed text");
|
|
256
264
|
},
|
|
257
265
|
}),
|
|
@@ -259,10 +267,10 @@ function buildInteractionTools(appRouter) {
|
|
|
259
267
|
name: "gtkx_fire_event",
|
|
260
268
|
title: "Fire event",
|
|
261
269
|
kind: "action",
|
|
262
|
-
description: "Emit a
|
|
270
|
+
description: "Emit a GObject signal on a widget. Use this for custom interactions.",
|
|
263
271
|
inputSchema: fireEventShape,
|
|
264
|
-
handler: async ({ applicationId, ...params }) => {
|
|
265
|
-
const result = await appRouter.sendToApp(applicationId, "widget.fireEvent", params);
|
|
272
|
+
handler: async ({ applicationId, appTimeout, ...params }) => {
|
|
273
|
+
const result = await appRouter.sendToApp(applicationId, "widget.fireEvent", params, appTimeout);
|
|
266
274
|
return textContent(JSON.stringify(result, null, 2));
|
|
267
275
|
},
|
|
268
276
|
}),
|
|
@@ -280,34 +288,74 @@ const registerTools = (mcpServer, appRouter, provider, settings) => {
|
|
|
280
288
|
registerTool(mcpServer, tool);
|
|
281
289
|
}
|
|
282
290
|
};
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
291
|
+
const stoppedServerError = () => new Error("createMcpServer: a stopped server cannot be started again");
|
|
292
|
+
const wasStopRequested = (state) => state.isStopRequested;
|
|
293
|
+
function stopServer(state) {
|
|
294
|
+
if (state.shutdown !== null) {
|
|
295
|
+
return state.shutdown;
|
|
286
296
|
}
|
|
287
|
-
state.
|
|
288
|
-
|
|
289
|
-
|
|
297
|
+
state.isStopRequested = true;
|
|
298
|
+
state.appRouter.dispose();
|
|
299
|
+
const startup = state.startup;
|
|
300
|
+
const shutdown = (async () => {
|
|
301
|
+
if (startup !== null) {
|
|
302
|
+
await Promise.allSettled([startup]);
|
|
303
|
+
}
|
|
304
|
+
await state.socketServer.stop();
|
|
305
|
+
await state.mcpServer.close();
|
|
306
|
+
})();
|
|
307
|
+
state.shutdown = shutdown;
|
|
308
|
+
return shutdown;
|
|
290
309
|
}
|
|
291
|
-
|
|
292
|
-
if (state
|
|
293
|
-
|
|
310
|
+
function startServer(state) {
|
|
311
|
+
if (wasStopRequested(state)) {
|
|
312
|
+
return Promise.reject(stoppedServerError());
|
|
294
313
|
}
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
return;
|
|
314
|
+
if (state.startup !== null) {
|
|
315
|
+
return state.startup;
|
|
298
316
|
}
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
317
|
+
const startup = (async () => {
|
|
318
|
+
try {
|
|
319
|
+
await state.socketServer.start();
|
|
320
|
+
if (wasStopRequested(state)) {
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
log.info(`socket server listening on ${state.socketPath}`);
|
|
324
|
+
await connectStdio(state.mcpServer, () => stopServer(state));
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
if (!wasStopRequested(state)) {
|
|
328
|
+
state.isStopRequested = true;
|
|
329
|
+
state.appRouter.dispose();
|
|
330
|
+
await state.socketServer.stop();
|
|
331
|
+
await state.mcpServer.close();
|
|
332
|
+
}
|
|
333
|
+
throw error;
|
|
334
|
+
}
|
|
335
|
+
})();
|
|
336
|
+
state.startup = startup;
|
|
337
|
+
return startup;
|
|
302
338
|
}
|
|
303
|
-
const createServerHandle = (socketServer, mcpServer, socketPath) => {
|
|
304
|
-
const state = {
|
|
339
|
+
const createServerHandle = (socketServer, mcpServer, appRouter, socketPath) => {
|
|
340
|
+
const state = {
|
|
341
|
+
socketServer,
|
|
342
|
+
mcpServer,
|
|
343
|
+
appRouter,
|
|
344
|
+
socketPath,
|
|
345
|
+
isStopRequested: false,
|
|
346
|
+
startup: null,
|
|
347
|
+
shutdown: null,
|
|
348
|
+
};
|
|
305
349
|
return { start: () => startServer(state), stop: () => stopServer(state) };
|
|
306
350
|
};
|
|
307
351
|
const createMcpServer = (options) => {
|
|
308
|
-
const
|
|
352
|
+
const socketAddress = resolveMcpSocketAddress(options.socketPath);
|
|
353
|
+
const socketPath = socketAddress.path;
|
|
354
|
+
if (socketAddress.fallbackDirectory !== null) {
|
|
355
|
+
log.warn(`MCP socket path exceeds the safe Unix byte budget; using private fallback ${socketPath}`);
|
|
356
|
+
}
|
|
309
357
|
const registry = new ConnectionRegistry();
|
|
310
|
-
const socketServer = new SocketServer(registry,
|
|
358
|
+
const socketServer = new SocketServer(registry, socketAddress);
|
|
311
359
|
const appRouter = new AppRouter(registry);
|
|
312
360
|
registry.addEventListener("error", logSocketError);
|
|
313
361
|
appRouter.addEventListener("appRegistered", (event) => {
|
|
@@ -321,7 +369,7 @@ const createMcpServer = (options) => {
|
|
|
321
369
|
const referenceProvider = createReferenceProvider({ getAppRoot: () => appRouter.getProjectRoot() });
|
|
322
370
|
registerTools(mcpServer, appRouter, referenceProvider, options.settings ?? DEFAULT_SETTINGS);
|
|
323
371
|
registerReferenceResources(mcpServer, referenceProvider);
|
|
324
|
-
return createServerHandle(socketServer, mcpServer, socketPath);
|
|
372
|
+
return createServerHandle(socketServer, mcpServer, appRouter, socketPath);
|
|
325
373
|
};
|
|
326
374
|
const configuredSettings = async (cwd) => {
|
|
327
375
|
try {
|