@creatorem/mcp-server 0.1.0

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.
Files changed (54) hide show
  1. package/README.md +29 -0
  2. package/dist/src/cache.d.ts +8 -0
  3. package/dist/src/cache.d.ts.map +1 -0
  4. package/dist/src/cache.js +28 -0
  5. package/dist/src/cache.js.map +1 -0
  6. package/dist/src/capability-search.d.ts +7 -0
  7. package/dist/src/capability-search.d.ts.map +1 -0
  8. package/dist/src/capability-search.js +50 -0
  9. package/dist/src/capability-search.js.map +1 -0
  10. package/dist/src/cli.d.ts +3 -0
  11. package/dist/src/cli.d.ts.map +1 -0
  12. package/dist/src/cli.js +37 -0
  13. package/dist/src/cli.js.map +1 -0
  14. package/dist/src/docs-client.d.ts +17 -0
  15. package/dist/src/docs-client.d.ts.map +1 -0
  16. package/dist/src/docs-client.js +164 -0
  17. package/dist/src/docs-client.js.map +1 -0
  18. package/dist/src/env.d.ts +3 -0
  19. package/dist/src/env.d.ts.map +1 -0
  20. package/dist/src/env.js +36 -0
  21. package/dist/src/env.js.map +1 -0
  22. package/dist/src/errors.d.ts +11 -0
  23. package/dist/src/errors.d.ts.map +1 -0
  24. package/dist/src/errors.js +21 -0
  25. package/dist/src/errors.js.map +1 -0
  26. package/dist/src/index.d.ts +8 -0
  27. package/dist/src/index.d.ts.map +1 -0
  28. package/dist/src/index.js +7 -0
  29. package/dist/src/index.js.map +1 -0
  30. package/dist/src/rpc-server.d.ts +15 -0
  31. package/dist/src/rpc-server.d.ts.map +1 -0
  32. package/dist/src/rpc-server.js +189 -0
  33. package/dist/src/rpc-server.js.map +1 -0
  34. package/dist/src/tools.d.ts +8 -0
  35. package/dist/src/tools.d.ts.map +1 -0
  36. package/dist/src/tools.js +268 -0
  37. package/dist/src/tools.js.map +1 -0
  38. package/dist/src/types.d.ts +53 -0
  39. package/dist/src/types.d.ts.map +1 -0
  40. package/dist/src/types.js +2 -0
  41. package/dist/src/types.js.map +1 -0
  42. package/dist/src/url-utils.d.ts +3 -0
  43. package/dist/src/url-utils.d.ts.map +1 -0
  44. package/dist/src/url-utils.js +31 -0
  45. package/dist/src/url-utils.js.map +1 -0
  46. package/dist/tests/capability-search.test.d.ts +2 -0
  47. package/dist/tests/capability-search.test.d.ts.map +1 -0
  48. package/dist/tests/capability-search.test.js +40 -0
  49. package/dist/tests/capability-search.test.js.map +1 -0
  50. package/dist/tests/url-utils.test.d.ts +2 -0
  51. package/dist/tests/url-utils.test.d.ts.map +1 -0
  52. package/dist/tests/url-utils.test.js +22 -0
  53. package/dist/tests/url-utils.test.js.map +1 -0
  54. package/package.json +40 -0
@@ -0,0 +1,189 @@
1
+ function isRecord(value) {
2
+ return typeof value === 'object' && value !== null;
3
+ }
4
+ export class RpcServer {
5
+ #serverName;
6
+ #serverVersion;
7
+ #tools;
8
+ #callTool;
9
+ #defaultProtocolVersion;
10
+ #buffer = Buffer.alloc(0);
11
+ #started = false;
12
+ constructor(options) {
13
+ this.#serverName = options.serverName;
14
+ this.#serverVersion = options.serverVersion;
15
+ this.#tools = options.tools;
16
+ this.#callTool = options.callTool;
17
+ this.#defaultProtocolVersion = options.defaultProtocolVersion ?? '2025-03-26';
18
+ }
19
+ start() {
20
+ if (this.#started) {
21
+ return;
22
+ }
23
+ this.#started = true;
24
+ process.stdin.on('data', (chunk) => {
25
+ this.#onData(chunk);
26
+ });
27
+ process.stdin.on('error', (error) => {
28
+ this.#log(`stdin error: ${error instanceof Error ? error.message : String(error)}`);
29
+ });
30
+ process.stdin.resume();
31
+ }
32
+ #onData(chunk) {
33
+ const data = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
34
+ this.#buffer = Buffer.concat([this.#buffer, data]);
35
+ while (true) {
36
+ const headerEnd = this.#buffer.indexOf('\r\n\r\n');
37
+ if (headerEnd === -1) {
38
+ return;
39
+ }
40
+ const headerBlock = this.#buffer.subarray(0, headerEnd).toString('utf8');
41
+ const contentLength = this.#readContentLength(headerBlock);
42
+ if (contentLength === null) {
43
+ this.#log(`invalid message headers: ${headerBlock}`);
44
+ this.#buffer = this.#buffer.subarray(headerEnd + 4);
45
+ continue;
46
+ }
47
+ const bodyStart = headerEnd + 4;
48
+ const bodyEnd = bodyStart + contentLength;
49
+ if (this.#buffer.length < bodyEnd) {
50
+ return;
51
+ }
52
+ const body = this.#buffer.subarray(bodyStart, bodyEnd).toString('utf8');
53
+ this.#buffer = this.#buffer.subarray(bodyEnd);
54
+ let parsed;
55
+ try {
56
+ parsed = JSON.parse(body);
57
+ }
58
+ catch {
59
+ this.#sendError(null, -32700, 'Parse error');
60
+ continue;
61
+ }
62
+ void this.#handleMessage(parsed);
63
+ }
64
+ }
65
+ #readContentLength(headers) {
66
+ const lines = headers.split('\r\n');
67
+ for (const line of lines) {
68
+ const match = /^content-length\s*:\s*(\d+)$/i.exec(line.trim());
69
+ if (!match || !match[1]) {
70
+ continue;
71
+ }
72
+ const parsed = Number.parseInt(match[1], 10);
73
+ return Number.isFinite(parsed) ? parsed : null;
74
+ }
75
+ return null;
76
+ }
77
+ async #handleMessage(raw) {
78
+ if (!isRecord(raw) || raw.jsonrpc !== '2.0' || typeof raw.method !== 'string') {
79
+ this.#sendError(null, -32600, 'Invalid Request');
80
+ return;
81
+ }
82
+ const request = raw;
83
+ const id = request.id ?? null;
84
+ const isNotification = request.id === undefined;
85
+ switch (request.method) {
86
+ case 'initialize': {
87
+ if (isNotification) {
88
+ return;
89
+ }
90
+ const protocolVersion = this.#extractProtocolVersion(request.params);
91
+ this.#sendResult(id, {
92
+ protocolVersion,
93
+ capabilities: {
94
+ tools: {
95
+ listChanged: false,
96
+ },
97
+ },
98
+ serverInfo: {
99
+ name: this.#serverName,
100
+ version: this.#serverVersion,
101
+ },
102
+ });
103
+ return;
104
+ }
105
+ case 'notifications/initialized':
106
+ return;
107
+ case 'tools/list': {
108
+ if (isNotification) {
109
+ return;
110
+ }
111
+ this.#sendResult(id, {
112
+ tools: this.#tools,
113
+ });
114
+ return;
115
+ }
116
+ case 'tools/call': {
117
+ if (isNotification) {
118
+ return;
119
+ }
120
+ if (!isRecord(request.params)) {
121
+ this.#sendError(id, -32602, 'Invalid params: expected object');
122
+ return;
123
+ }
124
+ const name = request.params.name;
125
+ const args = request.params.arguments;
126
+ if (typeof name !== 'string' || name.trim().length === 0) {
127
+ this.#sendError(id, -32602, 'Invalid params: "name" must be a non-empty string');
128
+ return;
129
+ }
130
+ const result = await this.#callTool(name, args);
131
+ this.#sendResult(id, result);
132
+ return;
133
+ }
134
+ case 'ping': {
135
+ if (isNotification) {
136
+ return;
137
+ }
138
+ this.#sendResult(id, {});
139
+ return;
140
+ }
141
+ case 'shutdown': {
142
+ if (isNotification) {
143
+ return;
144
+ }
145
+ this.#sendResult(id, {});
146
+ return;
147
+ }
148
+ default:
149
+ if (!isNotification) {
150
+ this.#sendError(id, -32601, `Method not found: ${request.method}`);
151
+ }
152
+ }
153
+ }
154
+ #extractProtocolVersion(params) {
155
+ if (isRecord(params) && typeof params.protocolVersion === 'string') {
156
+ return params.protocolVersion;
157
+ }
158
+ return this.#defaultProtocolVersion;
159
+ }
160
+ #sendResult(id, result) {
161
+ const payload = {
162
+ jsonrpc: '2.0',
163
+ id,
164
+ result,
165
+ };
166
+ this.#write(payload);
167
+ }
168
+ #sendError(id, code, message, data) {
169
+ const payload = {
170
+ jsonrpc: '2.0',
171
+ id,
172
+ error: {
173
+ code,
174
+ message,
175
+ ...(data === undefined ? {} : { data }),
176
+ },
177
+ };
178
+ this.#write(payload);
179
+ }
180
+ #write(payload) {
181
+ const body = JSON.stringify(payload);
182
+ const header = `Content-Length: ${Buffer.byteLength(body, 'utf8')}\r\n\r\n`;
183
+ process.stdout.write(header + body);
184
+ }
185
+ #log(message) {
186
+ process.stderr.write(`[mcp-server] ${message}\n`);
187
+ }
188
+ }
189
+ //# sourceMappingURL=rpc-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-server.js","sourceRoot":"","sources":["../../src/rpc-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { DocsClient } from './docs-client.js';
2
+ import type { ToolDefinition, ToolResult } from './types.js';
3
+ type ToolHandler = (args: unknown) => Promise<ToolResult>;
4
+ export declare const TOOL_DEFINITIONS: ToolDefinition[];
5
+ export declare function createToolHandlers(client: DocsClient): Record<string, ToolHandler>;
6
+ export declare function callTool(handlers: Record<string, ToolHandler>, name: string, args: unknown): Promise<ToolResult>;
7
+ export {};
8
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,KAAK,EAA6B,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExF,KAAK,WAAW,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;AAkI1D,eAAO,MAAM,gBAAgB,EAAE,cAAc,EAoD5C,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CA2GlF;AAED,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,uBAWhG"}
@@ -0,0 +1,268 @@
1
+ import { searchCapabilities } from './capability-search.js';
2
+ import { NotFoundError, UpstreamUnavailableError, ValidationError } from './errors.js';
3
+ import { normalizeDocsUrl } from './url-utils.js';
4
+ const MAX_LIMIT = 100;
5
+ function isRecord(value) {
6
+ return typeof value === 'object' && value !== null;
7
+ }
8
+ function asObject(value) {
9
+ if (!isRecord(value)) {
10
+ return {};
11
+ }
12
+ return value;
13
+ }
14
+ function readOptionalString(record, key) {
15
+ const value = record[key];
16
+ if (value === undefined || value === null) {
17
+ return undefined;
18
+ }
19
+ if (typeof value !== 'string') {
20
+ throw new ValidationError(`"${key}" must be a string.`);
21
+ }
22
+ const trimmed = value.trim();
23
+ return trimmed.length > 0 ? trimmed : undefined;
24
+ }
25
+ function readRequiredString(record, key) {
26
+ const value = readOptionalString(record, key);
27
+ if (!value) {
28
+ throw new ValidationError(`"${key}" is required.`);
29
+ }
30
+ return value;
31
+ }
32
+ function readOptionalStringArray(record, key) {
33
+ const value = record[key];
34
+ if (value === undefined || value === null) {
35
+ return undefined;
36
+ }
37
+ if (!Array.isArray(value) || value.some((item) => typeof item !== 'string')) {
38
+ throw new ValidationError(`"${key}" must be an array of strings.`);
39
+ }
40
+ return value.map((item) => item.trim()).filter(Boolean);
41
+ }
42
+ function readOptionalInt(record, key, fallback) {
43
+ const value = record[key];
44
+ if (value === undefined || value === null) {
45
+ return fallback;
46
+ }
47
+ if (typeof value !== 'number' || !Number.isInteger(value)) {
48
+ throw new ValidationError(`"${key}" must be an integer.`);
49
+ }
50
+ return Math.min(Math.max(1, value), MAX_LIMIT);
51
+ }
52
+ function capabilitySummary(capability) {
53
+ return {
54
+ id: capability.id,
55
+ title: capability.title,
56
+ description: capability.description,
57
+ pageUrl: capability.pageUrl,
58
+ llmUrl: capability.llmUrl,
59
+ tags: capability.tags ?? [],
60
+ aliases: capability.aliases ?? [],
61
+ status: capability.status,
62
+ };
63
+ }
64
+ function textResult(data) {
65
+ return {
66
+ content: [
67
+ {
68
+ type: 'text',
69
+ text: JSON.stringify(data, null, 2),
70
+ },
71
+ ],
72
+ structuredContent: data,
73
+ };
74
+ }
75
+ function errorResult(code, message, details) {
76
+ const payload = {
77
+ ok: false,
78
+ error: {
79
+ code,
80
+ message,
81
+ ...(details ? { details } : {}),
82
+ },
83
+ };
84
+ return {
85
+ content: [
86
+ {
87
+ type: 'text',
88
+ text: JSON.stringify(payload, null, 2),
89
+ },
90
+ ],
91
+ structuredContent: payload,
92
+ isError: true,
93
+ };
94
+ }
95
+ function mapToolError(error) {
96
+ if (error instanceof ValidationError) {
97
+ return errorResult('INVALID_INPUT', error.message);
98
+ }
99
+ if (error instanceof NotFoundError) {
100
+ return errorResult('NOT_FOUND', error.message);
101
+ }
102
+ if (error instanceof UpstreamUnavailableError) {
103
+ const details = error.status ? { status: error.status } : undefined;
104
+ return errorResult('UPSTREAM_UNAVAILABLE', error.message, details);
105
+ }
106
+ const message = error instanceof Error ? error.message : 'Unknown tool error';
107
+ return errorResult('UNKNOWN_ERROR', message);
108
+ }
109
+ export const TOOL_DEFINITIONS = [
110
+ {
111
+ name: 'creatorem.list_capabilities',
112
+ description: 'List Creatorem documentation capabilities from mcp-index.json.',
113
+ inputSchema: {
114
+ type: 'object',
115
+ additionalProperties: false,
116
+ properties: {
117
+ query: { type: 'string', description: 'Optional free-text query for ranking/filtering.' },
118
+ tags: { type: 'array', items: { type: 'string' }, description: 'Optional tags filter (any match).' },
119
+ status: { type: 'string', description: 'Optional status filter.' },
120
+ limit: { type: 'integer', minimum: 1, maximum: MAX_LIMIT, description: 'Max rows to return.' },
121
+ },
122
+ },
123
+ },
124
+ {
125
+ name: 'creatorem.get_capability',
126
+ description: 'Get a single capability by ID with related page metadata.',
127
+ inputSchema: {
128
+ type: 'object',
129
+ additionalProperties: false,
130
+ required: ['capabilityId'],
131
+ properties: {
132
+ capabilityId: { type: 'string', description: 'Capability identifier from mcp-index.json.' },
133
+ },
134
+ },
135
+ },
136
+ {
137
+ name: 'creatorem.get_page_content',
138
+ description: 'Fetch LLM-ready page content for a given /docs URL.',
139
+ inputSchema: {
140
+ type: 'object',
141
+ additionalProperties: false,
142
+ required: ['pageUrl'],
143
+ properties: {
144
+ pageUrl: { type: 'string', description: 'Docs page URL such as /docs/web/features/settings.' },
145
+ },
146
+ },
147
+ },
148
+ {
149
+ name: 'creatorem.search_capabilities',
150
+ description: 'Search capabilities by ID/title/description/tags/aliases with scoring.',
151
+ inputSchema: {
152
+ type: 'object',
153
+ additionalProperties: false,
154
+ required: ['query'],
155
+ properties: {
156
+ query: { type: 'string', description: 'Search query.' },
157
+ limit: { type: 'integer', minimum: 1, maximum: MAX_LIMIT, description: 'Max rows to return.' },
158
+ },
159
+ },
160
+ },
161
+ ];
162
+ export function createToolHandlers(client) {
163
+ return {
164
+ 'creatorem.list_capabilities': async (args) => {
165
+ const input = asObject(args);
166
+ const query = readOptionalString(input, 'query');
167
+ const tags = readOptionalStringArray(input, 'tags')?.map((item) => item.toLowerCase());
168
+ const status = readOptionalString(input, 'status')?.toLowerCase();
169
+ const limit = readOptionalInt(input, 'limit', 50);
170
+ const index = await client.getIndex();
171
+ let capabilities = [...index.capabilities];
172
+ if (tags && tags.length > 0) {
173
+ capabilities = capabilities.filter((capability) => {
174
+ const capabilityTags = (capability.tags ?? []).map((tag) => tag.toLowerCase());
175
+ return tags.some((tag) => capabilityTags.includes(tag));
176
+ });
177
+ }
178
+ if (status) {
179
+ capabilities = capabilities.filter((capability) => capability.status && capability.status.toLowerCase() === status);
180
+ }
181
+ if (query) {
182
+ const ranked = searchCapabilities(capabilities, query).slice(0, limit);
183
+ return textResult({
184
+ ok: true,
185
+ query,
186
+ total: capabilities.length,
187
+ count: ranked.length,
188
+ generatedAt: index.generatedAt,
189
+ capabilities: ranked.map((entry) => ({
190
+ ...capabilitySummary(entry.capability),
191
+ score: entry.score,
192
+ })),
193
+ });
194
+ }
195
+ const rows = capabilities
196
+ .sort((left, right) => left.id.localeCompare(right.id))
197
+ .slice(0, limit)
198
+ .map(capabilitySummary);
199
+ return textResult({
200
+ ok: true,
201
+ total: capabilities.length,
202
+ count: rows.length,
203
+ generatedAt: index.generatedAt,
204
+ capabilities: rows,
205
+ });
206
+ },
207
+ 'creatorem.get_capability': async (args) => {
208
+ const input = asObject(args);
209
+ const capabilityId = readRequiredString(input, 'capabilityId');
210
+ const capability = await client.getCapability(capabilityId);
211
+ const index = await client.getIndex();
212
+ const relatedPages = index.pages.filter((page) => capability.relatedPageUrls.includes(page.pageUrl));
213
+ return textResult({
214
+ ok: true,
215
+ capability,
216
+ relatedPages,
217
+ });
218
+ },
219
+ 'creatorem.get_page_content': async (args) => {
220
+ const input = asObject(args);
221
+ const pageUrl = normalizeDocsUrl(readRequiredString(input, 'pageUrl'));
222
+ const payload = await client.getLlmByDocsUrl(pageUrl);
223
+ return textResult({
224
+ ok: true,
225
+ pageUrl,
226
+ llmUrl: payload.llmUrl,
227
+ page: payload.page
228
+ ? {
229
+ title: payload.page.title,
230
+ description: payload.page.description,
231
+ sourcePath: payload.page.sourcePath,
232
+ capability: payload.page.capability,
233
+ }
234
+ : undefined,
235
+ content: payload.text,
236
+ });
237
+ },
238
+ 'creatorem.search_capabilities': async (args) => {
239
+ const input = asObject(args);
240
+ const query = readRequiredString(input, 'query');
241
+ const limit = readOptionalInt(input, 'limit', 10);
242
+ const index = await client.getIndex();
243
+ const matches = searchCapabilities(index.capabilities, query).slice(0, limit);
244
+ return textResult({
245
+ ok: true,
246
+ query,
247
+ count: matches.length,
248
+ capabilities: matches.map((entry) => ({
249
+ ...capabilitySummary(entry.capability),
250
+ score: entry.score,
251
+ })),
252
+ });
253
+ },
254
+ };
255
+ }
256
+ export async function callTool(handlers, name, args) {
257
+ const handler = handlers[name];
258
+ if (!handler) {
259
+ return errorResult('NOT_FOUND', `Tool not found: ${name}`);
260
+ }
261
+ try {
262
+ return await handler(args);
263
+ }
264
+ catch (error) {
265
+ return mapToolError(error);
266
+ }
267
+ }
268
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ export type JsonObject = Record<string, unknown>;
2
+ export type McpCapability = {
3
+ id: string;
4
+ title: string;
5
+ description?: string;
6
+ pageUrl: string;
7
+ llmUrl: string;
8
+ sourcePath: string;
9
+ relatedPageUrls: string[];
10
+ entrypoints: string[];
11
+ inputs: string[];
12
+ outputs: string[];
13
+ constraints: string[];
14
+ sideEffects: string[];
15
+ aliases?: string[];
16
+ tags?: string[];
17
+ status?: string;
18
+ };
19
+ export type McpPage = {
20
+ title: string;
21
+ description?: string;
22
+ pageUrl: string;
23
+ llmUrl: string;
24
+ sourcePath: string;
25
+ capability: string;
26
+ };
27
+ export type McpIndex = {
28
+ version: number;
29
+ generatedAt: string;
30
+ scope: string[];
31
+ capabilities: McpCapability[];
32
+ pages: McpPage[];
33
+ };
34
+ export type McpTextContent = {
35
+ type: 'text';
36
+ text: string;
37
+ };
38
+ export type ToolResult = {
39
+ content: McpTextContent[];
40
+ structuredContent?: JsonObject;
41
+ isError?: boolean;
42
+ };
43
+ export type ToolDefinition = {
44
+ name: string;
45
+ description: string;
46
+ inputSchema: JsonObject;
47
+ };
48
+ export type ServerConfig = {
49
+ baseUrl: string;
50
+ timeoutMs: number;
51
+ cacheTtlMs: number;
52
+ };
53
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,MAAM,MAAM,aAAa,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,aAAa,EAAE,CAAC;IAC9B,KAAK,EAAE,OAAO,EAAE,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACrB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,UAAU,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACtB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export declare function normalizeDocsUrl(input: string): string;
2
+ export declare function toLlmUrlFromDocs(docsUrl: string): string;
3
+ //# sourceMappingURL=url-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-utils.d.ts","sourceRoot":"","sources":["../../src/url-utils.ts"],"names":[],"mappings":"AAEA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,UAuB7C;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,UAQ/C"}
@@ -0,0 +1,31 @@
1
+ import { ValidationError } from './errors.js';
2
+ export function normalizeDocsUrl(input) {
3
+ const raw = input.trim();
4
+ if (raw.length === 0) {
5
+ throw new ValidationError('"pageUrl" cannot be empty.');
6
+ }
7
+ let pathname = raw;
8
+ if (/^https?:\/\//i.test(raw)) {
9
+ let parsed;
10
+ try {
11
+ parsed = new URL(raw);
12
+ }
13
+ catch {
14
+ throw new ValidationError('"pageUrl" must be a valid /docs URL or absolute HTTP(S) URL.');
15
+ }
16
+ pathname = parsed.pathname;
17
+ }
18
+ if (!pathname.startsWith('/docs')) {
19
+ throw new ValidationError('"pageUrl" must start with "/docs".');
20
+ }
21
+ const normalized = pathname.replace(/\/$/, '');
22
+ return normalized === '' ? '/docs' : normalized;
23
+ }
24
+ export function toLlmUrlFromDocs(docsUrl) {
25
+ const normalizedDocsUrl = normalizeDocsUrl(docsUrl);
26
+ if (normalizedDocsUrl === '/docs') {
27
+ return '/llms.mdx';
28
+ }
29
+ return `/llms.mdx${normalizedDocsUrl.slice('/docs'.length)}`;
30
+ }
31
+ //# sourceMappingURL=url-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-utils.js","sourceRoot":"","sources":["../../src/url-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC1C,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,eAAe,CAAC,4BAA4B,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,QAAQ,GAAG,GAAG,CAAC;IACnB,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,MAAW,CAAC;QAChB,IAAI,CAAC;YACD,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACL,MAAM,IAAI,eAAe,CAAC,8DAA8D,CAAC,CAAC;QAC9F,CAAC;QACD,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,eAAe,CAAC,oCAAoC,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/C,OAAO,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC5C,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAEpD,IAAI,iBAAiB,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,WAAW,CAAC;IACvB,CAAC;IAED,OAAO,YAAY,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;AACjE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=capability-search.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-search.test.d.ts","sourceRoot":"","sources":["../../tests/capability-search.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { scoreCapabilityForQuery, searchCapabilities } from '../src/capability-search.js';
4
+ const capability = {
5
+ id: 'settings_api',
6
+ title: 'Settings API',
7
+ description: 'Read and update user or organization settings',
8
+ pageUrl: '/docs/web/features/settings',
9
+ llmUrl: '/llms.mdx/web/features/settings',
10
+ sourcePath: 'web/features/settings/index.mdx',
11
+ relatedPageUrls: [],
12
+ entrypoints: ['kit/settings'],
13
+ inputs: ['setting_keys'],
14
+ outputs: ['setting_values'],
15
+ constraints: ['requires auth'],
16
+ sideEffects: ['updates db'],
17
+ aliases: ['settings', 'user_settings'],
18
+ tags: ['settings', 'config'],
19
+ status: 'stable',
20
+ };
21
+ test('exact id match scores higher than generic match', () => {
22
+ const exactScore = scoreCapabilityForQuery(capability, 'settings_api');
23
+ const genericScore = scoreCapabilityForQuery(capability, 'settings');
24
+ assert.ok(exactScore > genericScore);
25
+ });
26
+ test('searchCapabilities returns sorted matches with positive scores', () => {
27
+ const other = {
28
+ ...capability,
29
+ id: 'billing',
30
+ title: 'Billing',
31
+ description: 'Billing plans and subscriptions',
32
+ aliases: ['payments'],
33
+ tags: ['billing'],
34
+ };
35
+ const results = searchCapabilities([other, capability], 'settings');
36
+ assert.equal(results.length, 1);
37
+ assert.equal(results[0]?.capability.id, 'settings_api');
38
+ assert.ok(results[0]?.score && results[0].score > 0);
39
+ });
40
+ //# sourceMappingURL=capability-search.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-search.test.js","sourceRoot":"","sources":["../../tests/capability-search.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAG1F,MAAM,UAAU,GAAkB;IAC9B,EAAE,EAAE,cAAc;IAClB,KAAK,EAAE,cAAc;IACrB,WAAW,EAAE,+CAA+C;IAC5D,OAAO,EAAE,6BAA6B;IACtC,MAAM,EAAE,iCAAiC;IACzC,UAAU,EAAE,iCAAiC;IAC7C,eAAe,EAAE,EAAE;IACnB,WAAW,EAAE,CAAC,cAAc,CAAC;IAC7B,MAAM,EAAE,CAAC,cAAc,CAAC;IACxB,OAAO,EAAE,CAAC,gBAAgB,CAAC;IAC3B,WAAW,EAAE,CAAC,eAAe,CAAC;IAC9B,WAAW,EAAE,CAAC,YAAY,CAAC;IAC3B,OAAO,EAAE,CAAC,UAAU,EAAE,eAAe,CAAC;IACtC,IAAI,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC;IAC5B,MAAM,EAAE,QAAQ;CACnB,CAAC;AAEF,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;IACzD,MAAM,UAAU,GAAG,uBAAuB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IACvE,MAAM,YAAY,GAAG,uBAAuB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAErE,MAAM,CAAC,EAAE,CAAC,UAAU,GAAG,YAAY,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gEAAgE,EAAE,GAAG,EAAE;IACxE,MAAM,KAAK,GAAkB;QACzB,GAAG,UAAU;QACb,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,iCAAiC;QAC9C,OAAO,EAAE,CAAC,UAAU,CAAC;QACrB,IAAI,EAAE,CAAC,SAAS,CAAC;KACpB,CAAC;IAEF,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;IAEpE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAChC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;IACxD,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC"}