@mcpmake/core 0.2.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.
- package/dist/analyzer/auth-detector.d.ts +13 -0
- package/dist/analyzer/auth-detector.d.ts.map +1 -0
- package/dist/analyzer/auth-detector.js +143 -0
- package/dist/analyzer/auth-detector.js.map +1 -0
- package/dist/analyzer/dom-parser.d.ts +11 -0
- package/dist/analyzer/dom-parser.d.ts.map +1 -0
- package/dist/analyzer/dom-parser.js +260 -0
- package/dist/analyzer/dom-parser.js.map +1 -0
- package/dist/analyzer/goal-crawler.d.ts +26 -0
- package/dist/analyzer/goal-crawler.d.ts.map +1 -0
- package/dist/analyzer/goal-crawler.js +178 -0
- package/dist/analyzer/goal-crawler.js.map +1 -0
- package/dist/analyzer/hybrid-detector.d.ts +29 -0
- package/dist/analyzer/hybrid-detector.d.ts.map +1 -0
- package/dist/analyzer/hybrid-detector.js +97 -0
- package/dist/analyzer/hybrid-detector.js.map +1 -0
- package/dist/analyzer/index.d.ts +13 -0
- package/dist/analyzer/index.d.ts.map +1 -0
- package/dist/analyzer/index.js +9 -0
- package/dist/analyzer/index.js.map +1 -0
- package/dist/analyzer/screenshot-capture.d.ts +30 -0
- package/dist/analyzer/screenshot-capture.d.ts.map +1 -0
- package/dist/analyzer/screenshot-capture.js +43 -0
- package/dist/analyzer/screenshot-capture.js.map +1 -0
- package/dist/analyzer/selector-builder.d.ts +20 -0
- package/dist/analyzer/selector-builder.d.ts.map +1 -0
- package/dist/analyzer/selector-builder.js +200 -0
- package/dist/analyzer/selector-builder.js.map +1 -0
- package/dist/analyzer/semantic-analyzer.d.ts +14 -0
- package/dist/analyzer/semantic-analyzer.d.ts.map +1 -0
- package/dist/analyzer/semantic-analyzer.js +146 -0
- package/dist/analyzer/semantic-analyzer.js.map +1 -0
- package/dist/analyzer/site-crawler.d.ts +39 -0
- package/dist/analyzer/site-crawler.d.ts.map +1 -0
- package/dist/analyzer/site-crawler.js +236 -0
- package/dist/analyzer/site-crawler.js.map +1 -0
- package/dist/config/configurable-command.d.ts +14 -0
- package/dist/config/configurable-command.d.ts.map +1 -0
- package/dist/config/configurable-command.js +71 -0
- package/dist/config/configurable-command.js.map +1 -0
- package/dist/config/mcpmake-config.d.ts +69 -0
- package/dist/config/mcpmake-config.d.ts.map +1 -0
- package/dist/config/mcpmake-config.js +209 -0
- package/dist/config/mcpmake-config.js.map +1 -0
- package/dist/emitter/code-writer.d.ts +9 -0
- package/dist/emitter/code-writer.d.ts.map +1 -0
- package/dist/emitter/code-writer.js +26 -0
- package/dist/emitter/code-writer.js.map +1 -0
- package/dist/emitter/index.d.ts +33 -0
- package/dist/emitter/index.d.ts.map +1 -0
- package/dist/emitter/index.js +297 -0
- package/dist/emitter/index.js.map +1 -0
- package/dist/emitter/mcpb-bundler.d.ts +32 -0
- package/dist/emitter/mcpb-bundler.d.ts.map +1 -0
- package/dist/emitter/mcpb-bundler.js +173 -0
- package/dist/emitter/mcpb-bundler.js.map +1 -0
- package/dist/emitter/project-scaffolder.d.ts +5 -0
- package/dist/emitter/project-scaffolder.d.ts.map +1 -0
- package/dist/emitter/project-scaffolder.js +101 -0
- package/dist/emitter/project-scaffolder.js.map +1 -0
- package/dist/emitter/python-template-loader.d.ts +5 -0
- package/dist/emitter/python-template-loader.d.ts.map +1 -0
- package/dist/emitter/python-template-loader.js +31 -0
- package/dist/emitter/python-template-loader.js.map +1 -0
- package/dist/emitter/python-templates/dockerfile.hbs +14 -0
- package/dist/emitter/python-templates/env.example.hbs +12 -0
- package/dist/emitter/python-templates/requirements.txt.hbs +4 -0
- package/dist/emitter/python-templates/server.py.hbs +93 -0
- package/dist/emitter/site-scaffolder.d.ts +14 -0
- package/dist/emitter/site-scaffolder.d.ts.map +1 -0
- package/dist/emitter/site-scaffolder.js +71 -0
- package/dist/emitter/site-scaffolder.js.map +1 -0
- package/dist/emitter/site-template-loader.d.ts +6 -0
- package/dist/emitter/site-template-loader.d.ts.map +1 -0
- package/dist/emitter/site-template-loader.js +48 -0
- package/dist/emitter/site-template-loader.js.map +1 -0
- package/dist/emitter/site-templates/browser-manager.ts.hbs +233 -0
- package/dist/emitter/site-templates/config.ts.hbs +28 -0
- package/dist/emitter/site-templates/dockerfile.hbs +31 -0
- package/dist/emitter/site-templates/env.example.hbs +19 -0
- package/dist/emitter/site-templates/package.json.hbs +26 -0
- package/dist/emitter/site-templates/server-main-http.ts.hbs +108 -0
- package/dist/emitter/site-templates/server-main.ts.hbs +23 -0
- package/dist/emitter/site-templates/tool-handler-action.ts.hbs +86 -0
- package/dist/emitter/site-templates/tool-handler-form.ts.hbs +116 -0
- package/dist/emitter/site-templates/tool-handler-lifecycle.ts.hbs +146 -0
- package/dist/emitter/site-templates/tool-index.ts.hbs +11 -0
- package/dist/emitter/template-loader.d.ts +2 -0
- package/dist/emitter/template-loader.d.ts.map +1 -0
- package/dist/emitter/template-loader.js +28 -0
- package/dist/emitter/template-loader.js.map +1 -0
- package/dist/emitter/templates/auth-provider.ts.hbs +57 -0
- package/dist/emitter/templates/config.ts.hbs +110 -0
- package/dist/emitter/templates/discovery.ts.hbs +320 -0
- package/dist/emitter/templates/dockerfile.hbs +34 -0
- package/dist/emitter/templates/env.example.hbs +52 -0
- package/dist/emitter/templates/gitignore.hbs +5 -0
- package/dist/emitter/templates/http-executor.ts.hbs +159 -0
- package/dist/emitter/templates/oauth.ts.hbs +188 -0
- package/dist/emitter/templates/package.json.hbs +25 -0
- package/dist/emitter/templates/prompts.ts.hbs +22 -0
- package/dist/emitter/templates/readme.md.hbs +156 -0
- package/dist/emitter/templates/resources.ts.hbs +63 -0
- package/dist/emitter/templates/response-filter.ts.hbs +128 -0
- package/dist/emitter/templates/server-main-http.ts.hbs +442 -0
- package/dist/emitter/templates/server-main.ts.hbs +40 -0
- package/dist/emitter/templates/task-handlers.ts.hbs +189 -0
- package/dist/emitter/templates/task-manager.ts.hbs +139 -0
- package/dist/emitter/templates/task-sse.ts.hbs +105 -0
- package/dist/emitter/templates/tool-handler.ts.hbs +142 -0
- package/dist/emitter/templates/tool-index.ts.hbs +42 -0
- package/dist/emitter/templates/tool-test.ts.hbs +57 -0
- package/dist/emitter/templates/trace.ts.hbs +79 -0
- package/dist/emitter/templates/tsconfig.json.hbs +16 -0
- package/dist/emitter/templates/types.ts.hbs +5 -0
- package/dist/emitter/worker-template-loader.d.ts +6 -0
- package/dist/emitter/worker-template-loader.d.ts.map +1 -0
- package/dist/emitter/worker-template-loader.js +34 -0
- package/dist/emitter/worker-template-loader.js.map +1 -0
- package/dist/emitter/worker-templates/config.ts.hbs +93 -0
- package/dist/emitter/worker-templates/dev-vars.example.hbs +27 -0
- package/dist/emitter/worker-templates/gitignore.hbs +6 -0
- package/dist/emitter/worker-templates/package.json.hbs +24 -0
- package/dist/emitter/worker-templates/readme.md.hbs +73 -0
- package/dist/emitter/worker-templates/server.test.ts.hbs +20 -0
- package/dist/emitter/worker-templates/tool-handler.ts.hbs +103 -0
- package/dist/emitter/worker-templates/tool-index.ts.hbs +28 -0
- package/dist/emitter/worker-templates/tsconfig.json.hbs +17 -0
- package/dist/emitter/worker-templates/worker.ts.hbs +286 -0
- package/dist/emitter/worker-templates/wrangler.toml.hbs +19 -0
- package/dist/generator/spec-generator.d.ts +7 -0
- package/dist/generator/spec-generator.d.ts.map +1 -0
- package/dist/generator/spec-generator.js +51 -0
- package/dist/generator/spec-generator.js.map +1 -0
- package/dist/index.d.ts +75 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +101 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/har-filter.d.ts +9 -0
- package/dist/parser/har-filter.d.ts.map +1 -0
- package/dist/parser/har-filter.js +72 -0
- package/dist/parser/har-filter.js.map +1 -0
- package/dist/parser/har-loader.d.ts +3 -0
- package/dist/parser/har-loader.d.ts.map +1 -0
- package/dist/parser/har-loader.js +15 -0
- package/dist/parser/har-loader.js.map +1 -0
- package/dist/parser/har-normalizer.d.ts +21 -0
- package/dist/parser/har-normalizer.d.ts.map +1 -0
- package/dist/parser/har-normalizer.js +79 -0
- package/dist/parser/har-normalizer.js.map +1 -0
- package/dist/parser/index.d.ts +11 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +7 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/openapi-loader.d.ts +7 -0
- package/dist/parser/openapi-loader.d.ts.map +1 -0
- package/dist/parser/openapi-loader.js +309 -0
- package/dist/parser/openapi-loader.js.map +1 -0
- package/dist/parser/operation-extractor.d.ts +14 -0
- package/dist/parser/operation-extractor.d.ts.map +1 -0
- package/dist/parser/operation-extractor.js +156 -0
- package/dist/parser/operation-extractor.js.map +1 -0
- package/dist/parser/overlay-loader.d.ts +11 -0
- package/dist/parser/overlay-loader.d.ts.map +1 -0
- package/dist/parser/overlay-loader.js +185 -0
- package/dist/parser/overlay-loader.js.map +1 -0
- package/dist/parser/postman-loader.d.ts +10 -0
- package/dist/parser/postman-loader.d.ts.map +1 -0
- package/dist/parser/postman-loader.js +107 -0
- package/dist/parser/postman-loader.js.map +1 -0
- package/dist/parser/schema-converter.d.ts +13 -0
- package/dist/parser/schema-converter.d.ts.map +1 -0
- package/dist/parser/schema-converter.js +118 -0
- package/dist/parser/schema-converter.js.map +1 -0
- package/dist/plugins/adapter.d.ts +41 -0
- package/dist/plugins/adapter.d.ts.map +1 -0
- package/dist/plugins/adapter.js +16 -0
- package/dist/plugins/adapter.js.map +1 -0
- package/dist/plugins/loader.d.ts +26 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +59 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/pricing.d.ts +56 -0
- package/dist/pricing.d.ts.map +1 -0
- package/dist/pricing.js +134 -0
- package/dist/pricing.js.map +1 -0
- package/dist/providers/index.d.ts +16 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +57 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/recorder/browser-recorder.d.ts +23 -0
- package/dist/recorder/browser-recorder.d.ts.map +1 -0
- package/dist/recorder/browser-recorder.js +206 -0
- package/dist/recorder/browser-recorder.js.map +1 -0
- package/dist/rescan/diff-engine.d.ts +6 -0
- package/dist/rescan/diff-engine.d.ts.map +1 -0
- package/dist/rescan/diff-engine.js +313 -0
- package/dist/rescan/diff-engine.js.map +1 -0
- package/dist/rescan/index.d.ts +4 -0
- package/dist/rescan/index.d.ts.map +1 -0
- package/dist/rescan/index.js +3 -0
- package/dist/rescan/index.js.map +1 -0
- package/dist/rescan/rescan-runner.d.ts +43 -0
- package/dist/rescan/rescan-runner.d.ts.map +1 -0
- package/dist/rescan/rescan-runner.js +70 -0
- package/dist/rescan/rescan-runner.js.map +1 -0
- package/dist/rescan/rescan-scheduler.d.ts +42 -0
- package/dist/rescan/rescan-scheduler.d.ts.map +1 -0
- package/dist/rescan/rescan-scheduler.js +180 -0
- package/dist/rescan/rescan-scheduler.js.map +1 -0
- package/dist/site-transformer/browser-tools.d.ts +11 -0
- package/dist/site-transformer/browser-tools.d.ts.map +1 -0
- package/dist/site-transformer/browser-tools.js +60 -0
- package/dist/site-transformer/browser-tools.js.map +1 -0
- package/dist/site-transformer/index.d.ts +3 -0
- package/dist/site-transformer/index.d.ts.map +1 -0
- package/dist/site-transformer/index.js +3 -0
- package/dist/site-transformer/index.js.map +1 -0
- package/dist/site-transformer/selector-healer.d.ts +9 -0
- package/dist/site-transformer/selector-healer.d.ts.map +1 -0
- package/dist/site-transformer/selector-healer.js +107 -0
- package/dist/site-transformer/selector-healer.js.map +1 -0
- package/dist/site-transformer/tool-generator.d.ts +14 -0
- package/dist/site-transformer/tool-generator.d.ts.map +1 -0
- package/dist/site-transformer/tool-generator.js +246 -0
- package/dist/site-transformer/tool-generator.js.map +1 -0
- package/dist/transformer/auth-detector.d.ts +29 -0
- package/dist/transformer/auth-detector.d.ts.map +1 -0
- package/dist/transformer/auth-detector.js +104 -0
- package/dist/transformer/auth-detector.js.map +1 -0
- package/dist/transformer/catalog-builder.d.ts +19 -0
- package/dist/transformer/catalog-builder.d.ts.map +1 -0
- package/dist/transformer/catalog-builder.js +57 -0
- package/dist/transformer/catalog-builder.js.map +1 -0
- package/dist/transformer/client-compat.d.ts +7 -0
- package/dist/transformer/client-compat.d.ts.map +1 -0
- package/dist/transformer/client-compat.js +45 -0
- package/dist/transformer/client-compat.js.map +1 -0
- package/dist/transformer/har-clusterer.d.ts +10 -0
- package/dist/transformer/har-clusterer.d.ts.map +1 -0
- package/dist/transformer/har-clusterer.js +28 -0
- package/dist/transformer/har-clusterer.js.map +1 -0
- package/dist/transformer/har-dedup.d.ts +11 -0
- package/dist/transformer/har-dedup.d.ts.map +1 -0
- package/dist/transformer/har-dedup.js +82 -0
- package/dist/transformer/har-dedup.js.map +1 -0
- package/dist/transformer/har-schema-inferrer.d.ts +16 -0
- package/dist/transformer/har-schema-inferrer.d.ts.map +1 -0
- package/dist/transformer/har-schema-inferrer.js +91 -0
- package/dist/transformer/har-schema-inferrer.js.map +1 -0
- package/dist/transformer/har-to-operations.d.ts +14 -0
- package/dist/transformer/har-to-operations.d.ts.map +1 -0
- package/dist/transformer/har-to-operations.js +193 -0
- package/dist/transformer/har-to-operations.js.map +1 -0
- package/dist/transformer/index.d.ts +9 -0
- package/dist/transformer/index.d.ts.map +1 -0
- package/dist/transformer/index.js +7 -0
- package/dist/transformer/index.js.map +1 -0
- package/dist/transformer/llm-namer.d.ts +7 -0
- package/dist/transformer/llm-namer.d.ts.map +1 -0
- package/dist/transformer/llm-namer.js +60 -0
- package/dist/transformer/llm-namer.js.map +1 -0
- package/dist/transformer/naming.d.ts +5 -0
- package/dist/transformer/naming.d.ts.map +1 -0
- package/dist/transformer/naming.js +31 -0
- package/dist/transformer/naming.js.map +1 -0
- package/dist/transformer/operation-filter.d.ts +14 -0
- package/dist/transformer/operation-filter.d.ts.map +1 -0
- package/dist/transformer/operation-filter.js +53 -0
- package/dist/transformer/operation-filter.js.map +1 -0
- package/dist/transformer/resource-builder.d.ts +13 -0
- package/dist/transformer/resource-builder.d.ts.map +1 -0
- package/dist/transformer/resource-builder.js +87 -0
- package/dist/transformer/resource-builder.js.map +1 -0
- package/dist/transformer/schema-merger.d.ts +15 -0
- package/dist/transformer/schema-merger.d.ts.map +1 -0
- package/dist/transformer/schema-merger.js +66 -0
- package/dist/transformer/schema-merger.js.map +1 -0
- package/dist/transformer/stainless-config.d.ts +75 -0
- package/dist/transformer/stainless-config.d.ts.map +1 -0
- package/dist/transformer/stainless-config.js +59 -0
- package/dist/transformer/stainless-config.js.map +1 -0
- package/dist/transformer/stainless-translator.d.ts +61 -0
- package/dist/transformer/stainless-translator.d.ts.map +1 -0
- package/dist/transformer/stainless-translator.js +375 -0
- package/dist/transformer/stainless-translator.js.map +1 -0
- package/dist/transformer/tool-builder.d.ts +4 -0
- package/dist/transformer/tool-builder.d.ts.map +1 -0
- package/dist/transformer/tool-builder.js +119 -0
- package/dist/transformer/tool-builder.js.map +1 -0
- package/dist/types/index.d.ts +140 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/site.d.ts +285 -0
- package/dist/types/site.d.ts.map +1 -0
- package/dist/types/site.js +9 -0
- package/dist/types/site.js.map +1 -0
- package/dist/utils/fail.d.ts +49 -0
- package/dist/utils/fail.d.ts.map +1 -0
- package/dist/utils/fail.js +223 -0
- package/dist/utils/fail.js.map +1 -0
- package/dist/utils/fs.d.ts +6 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +29 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/interactive.d.ts +7 -0
- package/dist/utils/interactive.d.ts.map +1 -0
- package/dist/utils/interactive.js +31 -0
- package/dist/utils/interactive.js.map +1 -0
- package/dist/utils/logger.d.ts +2 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +3 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/sanitize.d.ts +29 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/sanitize.js +45 -0
- package/dist/utils/sanitize.js.map +1 -0
- package/dist/utils/watcher.d.ts +12 -0
- package/dist/utils/watcher.d.ts.map +1 -0
- package/dist/utils/watcher.js +37 -0
- package/dist/utils/watcher.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a SiteDescriptor into SiteToolDefinition[].
|
|
3
|
+
*
|
|
4
|
+
* Generates two levels of tools:
|
|
5
|
+
* - Page-level: one tool per form (e.g., login(email, password))
|
|
6
|
+
* - Action-level: one tool per standalone button/link
|
|
7
|
+
* Plus built-in browser lifecycle tools.
|
|
8
|
+
*/
|
|
9
|
+
import { buildBrowserLifecycleTools } from './browser-tools.js';
|
|
10
|
+
import { toToolName, toToolTitle, toFileName, toFunctionName } from '../transformer/naming.js';
|
|
11
|
+
/**
|
|
12
|
+
* Generate all tools from a site descriptor.
|
|
13
|
+
*/
|
|
14
|
+
export function generateSiteTools(site) {
|
|
15
|
+
const tools = [];
|
|
16
|
+
const usedNames = new Set();
|
|
17
|
+
// 1. Built-in browser lifecycle tools
|
|
18
|
+
const lifecycleTools = buildBrowserLifecycleTools();
|
|
19
|
+
for (const tool of lifecycleTools) {
|
|
20
|
+
usedNames.add(tool.name);
|
|
21
|
+
tools.push(tool);
|
|
22
|
+
}
|
|
23
|
+
// 2. Navigation tool to the site's home page
|
|
24
|
+
const homeTool = buildNavigationTool('navigate_home', site.baseUrl, `Navigate to the home page at ${site.baseUrl}`, usedNames);
|
|
25
|
+
tools.push(homeTool);
|
|
26
|
+
// 3. Page-level tools (forms)
|
|
27
|
+
for (const page of site.pages) {
|
|
28
|
+
for (const form of page.forms) {
|
|
29
|
+
const tool = buildFormTool(page, form, usedNames);
|
|
30
|
+
if (tool)
|
|
31
|
+
tools.push(tool);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// 4. Action-level tools (standalone buttons)
|
|
35
|
+
for (const page of site.pages) {
|
|
36
|
+
for (const button of page.buttons) {
|
|
37
|
+
const tool = buildButtonTool(page, button, usedNames);
|
|
38
|
+
if (tool)
|
|
39
|
+
tools.push(tool);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// 5. Navigation tools (key links)
|
|
43
|
+
for (const page of site.pages) {
|
|
44
|
+
for (const link of page.links) {
|
|
45
|
+
if (!link.isNavigation)
|
|
46
|
+
continue;
|
|
47
|
+
const tool = buildLinkTool(page, link, usedNames);
|
|
48
|
+
if (tool)
|
|
49
|
+
tools.push(tool);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return tools;
|
|
53
|
+
}
|
|
54
|
+
// ─── Form Tool Builder ──────────────────────────────────────────────
|
|
55
|
+
function buildFormTool(page, form, usedNames) {
|
|
56
|
+
// Skip forms with no visible fields
|
|
57
|
+
const visibleFields = form.fields.filter((f) => f.fieldType !== 'hidden');
|
|
58
|
+
if (visibleFields.length === 0)
|
|
59
|
+
return null;
|
|
60
|
+
// Generate tool name from semantic name or form fields
|
|
61
|
+
const rawName = form.semanticName || inferFormName(form);
|
|
62
|
+
const name = deduplicateName(toToolName(rawName), usedNames);
|
|
63
|
+
// Build Zod input schema from form fields
|
|
64
|
+
const inputSchemaCode = buildFormInputSchema(visibleFields);
|
|
65
|
+
// Collect all selectors this tool depends on
|
|
66
|
+
const selectors = [form.selector];
|
|
67
|
+
for (const field of visibleFields) {
|
|
68
|
+
selectors.push(field.selector);
|
|
69
|
+
}
|
|
70
|
+
if (form.submitButton)
|
|
71
|
+
selectors.push(form.submitButton);
|
|
72
|
+
const description = form.description ||
|
|
73
|
+
`Fill and submit the ${form.semanticName || 'form'} on ${page.title || page.url}`;
|
|
74
|
+
return {
|
|
75
|
+
name,
|
|
76
|
+
title: toToolTitle(rawName),
|
|
77
|
+
description,
|
|
78
|
+
inputSchemaCode,
|
|
79
|
+
fileName: toFileName(rawName),
|
|
80
|
+
functionName: toFunctionName(rawName),
|
|
81
|
+
toolType: 'page-action',
|
|
82
|
+
pageId: page.pageId,
|
|
83
|
+
pageUrl: page.url,
|
|
84
|
+
form,
|
|
85
|
+
selectors,
|
|
86
|
+
returnsScreenshot: true,
|
|
87
|
+
annotations: { readOnlyHint: false },
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// ─── Button Tool Builder ────────────────────────────────────────────
|
|
91
|
+
function buildButtonTool(page, button, usedNames) {
|
|
92
|
+
const rawName = button.semanticAction ||
|
|
93
|
+
(button.text ? `click_${button.text.replace(/\s+/g, '_').toLowerCase()}` : null);
|
|
94
|
+
if (!rawName)
|
|
95
|
+
return null;
|
|
96
|
+
const name = deduplicateName(toToolName(rawName), usedNames);
|
|
97
|
+
// Buttons typically don't need input parameters beyond sessionId
|
|
98
|
+
const inputSchemaCode = `z.object({
|
|
99
|
+
sessionId: z.string().max(64).regex(/^[a-zA-Z0-9_-]+$/).optional().describe('Browser session ID'),
|
|
100
|
+
})`;
|
|
101
|
+
const description = button.description ||
|
|
102
|
+
`Click the "${button.text || button.ariaLabel}" button on ${page.title || page.url}`;
|
|
103
|
+
return {
|
|
104
|
+
name,
|
|
105
|
+
title: toToolTitle(rawName),
|
|
106
|
+
description,
|
|
107
|
+
inputSchemaCode,
|
|
108
|
+
fileName: toFileName(rawName),
|
|
109
|
+
functionName: toFunctionName(rawName),
|
|
110
|
+
toolType: 'element-action',
|
|
111
|
+
pageId: page.pageId,
|
|
112
|
+
pageUrl: page.url,
|
|
113
|
+
button,
|
|
114
|
+
selectors: [button.selector],
|
|
115
|
+
returnsScreenshot: true,
|
|
116
|
+
annotations: { readOnlyHint: false },
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
// ─── Link Tool Builder ──────────────────────────────────────────────
|
|
120
|
+
function buildLinkTool(page, link, usedNames) {
|
|
121
|
+
const rawName = link.semanticAction ||
|
|
122
|
+
(link.text ? `navigate_to_${link.text.replace(/\s+/g, '_').toLowerCase()}` : null);
|
|
123
|
+
if (!rawName)
|
|
124
|
+
return null;
|
|
125
|
+
const name = deduplicateName(toToolName(rawName), usedNames);
|
|
126
|
+
const inputSchemaCode = `z.object({
|
|
127
|
+
sessionId: z.string().max(64).regex(/^[a-zA-Z0-9_-]+$/).optional().describe('Browser session ID'),
|
|
128
|
+
})`;
|
|
129
|
+
const description = `Navigate to "${link.text}" at ${link.href}`;
|
|
130
|
+
return {
|
|
131
|
+
name,
|
|
132
|
+
title: toToolTitle(rawName),
|
|
133
|
+
description,
|
|
134
|
+
inputSchemaCode,
|
|
135
|
+
fileName: toFileName(rawName),
|
|
136
|
+
functionName: toFunctionName(rawName),
|
|
137
|
+
toolType: 'navigation',
|
|
138
|
+
pageId: page.pageId,
|
|
139
|
+
pageUrl: page.url,
|
|
140
|
+
link,
|
|
141
|
+
selectors: [link.selector],
|
|
142
|
+
returnsScreenshot: true,
|
|
143
|
+
annotations: { readOnlyHint: true },
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// ─── Navigation Helper ──────────────────────────────────────────────
|
|
147
|
+
function buildNavigationTool(rawName, url, description, usedNames) {
|
|
148
|
+
const name = deduplicateName(toToolName(rawName), usedNames);
|
|
149
|
+
return {
|
|
150
|
+
name,
|
|
151
|
+
title: toToolTitle(rawName),
|
|
152
|
+
description,
|
|
153
|
+
inputSchemaCode: `z.object({
|
|
154
|
+
sessionId: z.string().max(64).regex(/^[a-zA-Z0-9_-]+$/).optional().describe('Browser session ID'),
|
|
155
|
+
})`,
|
|
156
|
+
fileName: toFileName(rawName),
|
|
157
|
+
functionName: toFunctionName(rawName),
|
|
158
|
+
toolType: 'navigation',
|
|
159
|
+
pageUrl: url,
|
|
160
|
+
selectors: [],
|
|
161
|
+
returnsScreenshot: true,
|
|
162
|
+
annotations: { readOnlyHint: true },
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
// ─── Schema Builders ────────────────────────────────────────────────
|
|
166
|
+
function buildFormInputSchema(fields) {
|
|
167
|
+
const fieldLines = [
|
|
168
|
+
` sessionId: z.string().max(64).regex(/^[a-zA-Z0-9_-]+$/).optional().describe('Browser session ID'),`,
|
|
169
|
+
];
|
|
170
|
+
for (const field of fields) {
|
|
171
|
+
const zodType = mapFieldToZodType(field);
|
|
172
|
+
const desc = field.label || field.placeholder || field.name;
|
|
173
|
+
const required = field.required ? '' : '.optional()';
|
|
174
|
+
fieldLines.push(` ${sanitizeFieldName(field.name)}: ${zodType}${required}.describe('${escapeString(desc)}'),`);
|
|
175
|
+
}
|
|
176
|
+
return `z.object({\n${fieldLines.join('\n')}\n})`;
|
|
177
|
+
}
|
|
178
|
+
function mapFieldToZodType(field) {
|
|
179
|
+
switch (field.fieldType) {
|
|
180
|
+
case 'email':
|
|
181
|
+
return 'z.string().email()';
|
|
182
|
+
case 'number':
|
|
183
|
+
case 'range':
|
|
184
|
+
return 'z.number()';
|
|
185
|
+
case 'checkbox':
|
|
186
|
+
return 'z.boolean()';
|
|
187
|
+
case 'url':
|
|
188
|
+
return 'z.string().url()';
|
|
189
|
+
case 'select':
|
|
190
|
+
if (field.options && field.options.length > 0) {
|
|
191
|
+
const opts = field.options.map((o) => `'${escapeString(o)}'`).join(', ');
|
|
192
|
+
return `z.enum([${opts}])`;
|
|
193
|
+
}
|
|
194
|
+
return 'z.string()';
|
|
195
|
+
case 'radio':
|
|
196
|
+
if (field.options && field.options.length > 0) {
|
|
197
|
+
const opts = field.options.map((o) => `'${escapeString(o)}'`).join(', ');
|
|
198
|
+
return `z.enum([${opts}])`;
|
|
199
|
+
}
|
|
200
|
+
return 'z.string()';
|
|
201
|
+
default:
|
|
202
|
+
return 'z.string()';
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// ─── Helpers ────────────────────────────────────────────────────────
|
|
206
|
+
/** Infer a form name from its fields when no semantic name is available. */
|
|
207
|
+
function inferFormName(form) {
|
|
208
|
+
const fieldNames = form.fields.map((f) => f.name.toLowerCase());
|
|
209
|
+
// Common form patterns
|
|
210
|
+
if (fieldNames.some((n) => n.includes('password'))) {
|
|
211
|
+
if (fieldNames.some((n) => n.includes('confirm') || n.includes('register') || n.includes('signup'))) {
|
|
212
|
+
return 'register';
|
|
213
|
+
}
|
|
214
|
+
return 'login';
|
|
215
|
+
}
|
|
216
|
+
if (fieldNames.some((n) => n.includes('search') || n.includes('query') || n.includes('q'))) {
|
|
217
|
+
return 'search';
|
|
218
|
+
}
|
|
219
|
+
if (fieldNames.some((n) => n.includes('email') && !fieldNames.some((n2) => n2.includes('password')))) {
|
|
220
|
+
return 'subscribe';
|
|
221
|
+
}
|
|
222
|
+
if (fieldNames.some((n) => n.includes('message') || n.includes('comment'))) {
|
|
223
|
+
return 'send_message';
|
|
224
|
+
}
|
|
225
|
+
// Fallback: use first field name or form ID
|
|
226
|
+
return form.formId.replace(/^form_/, 'submit_form_');
|
|
227
|
+
}
|
|
228
|
+
function deduplicateName(name, usedNames) {
|
|
229
|
+
let candidate = name;
|
|
230
|
+
let suffix = 2;
|
|
231
|
+
while (usedNames.has(candidate)) {
|
|
232
|
+
candidate = `${name}_${suffix}`;
|
|
233
|
+
suffix++;
|
|
234
|
+
}
|
|
235
|
+
usedNames.add(candidate);
|
|
236
|
+
return candidate;
|
|
237
|
+
}
|
|
238
|
+
function sanitizeFieldName(name) {
|
|
239
|
+
// Make valid JS identifier
|
|
240
|
+
const sanitized = name.replace(/[^a-zA-Z0-9_]/g, '_').replace(/^[0-9]/, '_$&');
|
|
241
|
+
return sanitized || '_field';
|
|
242
|
+
}
|
|
243
|
+
function escapeString(str) {
|
|
244
|
+
return str.replace(/\\/g, '\\\\').replace(/'/g, "\\'").replace(/\n/g, ' ');
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=tool-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-generator.js","sourceRoot":"","sources":["../../src/site-transformer/tool-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { OpenAPIV3 } from 'openapi-types';
|
|
2
|
+
import type { AuthScheme, EnvVarDescriptor } from '../types/index.js';
|
|
3
|
+
export interface OAuthFlowInfo {
|
|
4
|
+
authorizationUrl?: string;
|
|
5
|
+
tokenUrl?: string;
|
|
6
|
+
scopes: string[];
|
|
7
|
+
flowType: 'authorizationCode' | 'clientCredentials' | 'implicit' | 'password';
|
|
8
|
+
}
|
|
9
|
+
export interface AuthDetectOptions {
|
|
10
|
+
/**
|
|
11
|
+
* Only emit the named OpenAPI security scheme (the rest are ignored). Maps a
|
|
12
|
+
* Stainless `security_scheme` choice so the generated server uses the same
|
|
13
|
+
* credential the SDK did, even when the spec declares several schemes.
|
|
14
|
+
*/
|
|
15
|
+
onlyScheme?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Override the credential env-var name for the single-secret schemes (apiKey /
|
|
18
|
+
* http-bearer). Maps a Stainless `read_env` so the generated server reads e.g.
|
|
19
|
+
* `ACME_API_KEY` instead of mcpmake's default. Ignored for basic/oauth2
|
|
20
|
+
* (multiple secrets — there is no single name to rename).
|
|
21
|
+
*/
|
|
22
|
+
envVarName?: string;
|
|
23
|
+
}
|
|
24
|
+
export declare function detectAuthSchemes(securitySchemes: Record<string, OpenAPIV3.SecuritySchemeObject>, options?: AuthDetectOptions): {
|
|
25
|
+
authSchemes: AuthScheme[];
|
|
26
|
+
envVars: EnvVarDescriptor[];
|
|
27
|
+
oauthFlows: OAuthFlowInfo[];
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=auth-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-detector.d.ts","sourceRoot":"","sources":["../../src/transformer/auth-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEtE,MAAM,WAAW,aAAa;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,mBAAmB,GAAG,mBAAmB,GAAG,UAAU,GAAG,UAAU,CAAC;CAC/E;AAED,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,oBAAoB,CAAC,EAC/D,OAAO,CAAC,EAAE,iBAAiB,GAC1B;IAAE,WAAW,EAAE,UAAU,EAAE,CAAC;IAAC,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAAC,UAAU,EAAE,aAAa,EAAE,CAAA;CAAE,CAkHzF"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
export function detectAuthSchemes(securitySchemes, options) {
|
|
2
|
+
const authSchemes = [];
|
|
3
|
+
const envVars = [];
|
|
4
|
+
const oauthFlows = [];
|
|
5
|
+
// Honour an explicit scheme choice (Stainless `security_scheme`) when it
|
|
6
|
+
// exists; otherwise emit every detected scheme as before.
|
|
7
|
+
let entries = Object.entries(securitySchemes);
|
|
8
|
+
if (options?.onlyScheme && securitySchemes[options.onlyScheme]) {
|
|
9
|
+
entries = entries.filter(([name]) => name === options.onlyScheme);
|
|
10
|
+
}
|
|
11
|
+
// Renaming the credential env var is only unambiguous for a single emitted,
|
|
12
|
+
// single-secret scheme. Apply it to the chosen scheme, or the sole scheme.
|
|
13
|
+
const renameTarget = options?.envVarName !== undefined
|
|
14
|
+
? (options.onlyScheme ?? (entries.length === 1 ? entries[0][0] : undefined))
|
|
15
|
+
: undefined;
|
|
16
|
+
for (const [name, scheme] of entries) {
|
|
17
|
+
if (scheme.type === 'apiKey') {
|
|
18
|
+
const envVarName = name === renameTarget ? options.envVarName : 'API_KEY';
|
|
19
|
+
authSchemes.push({
|
|
20
|
+
type: 'apiKey',
|
|
21
|
+
envVarName,
|
|
22
|
+
headerName: scheme.name,
|
|
23
|
+
in: scheme.in,
|
|
24
|
+
description: `API key for ${name}`,
|
|
25
|
+
});
|
|
26
|
+
envVars.push({
|
|
27
|
+
name: envVarName,
|
|
28
|
+
description: `API key (sent as ${scheme.in} "${scheme.name}")`,
|
|
29
|
+
required: true,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
else if (scheme.type === 'http' && scheme.scheme === 'bearer') {
|
|
33
|
+
const envVarName = name === renameTarget ? options.envVarName : 'BEARER_TOKEN';
|
|
34
|
+
authSchemes.push({
|
|
35
|
+
type: 'http-bearer',
|
|
36
|
+
envVarName,
|
|
37
|
+
description: `Bearer token for ${name}`,
|
|
38
|
+
});
|
|
39
|
+
envVars.push({
|
|
40
|
+
name: envVarName,
|
|
41
|
+
description: 'Bearer authentication token',
|
|
42
|
+
required: true,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
else if (scheme.type === 'http' && scheme.scheme === 'basic') {
|
|
46
|
+
authSchemes.push({
|
|
47
|
+
type: 'http-basic',
|
|
48
|
+
envVarName: 'BASIC_USERNAME',
|
|
49
|
+
description: `Basic auth for ${name}`,
|
|
50
|
+
});
|
|
51
|
+
envVars.push({ name: 'BASIC_USERNAME', description: 'Basic auth username', required: true }, { name: 'BASIC_PASSWORD', description: 'Basic auth password', required: true });
|
|
52
|
+
}
|
|
53
|
+
else if (scheme.type === 'oauth2') {
|
|
54
|
+
authSchemes.push({
|
|
55
|
+
type: 'oauth2',
|
|
56
|
+
envVarName: 'OAUTH2_CLIENT_ID',
|
|
57
|
+
description: `OAuth2 for ${name}`,
|
|
58
|
+
});
|
|
59
|
+
// Extract flow details
|
|
60
|
+
const flows = scheme.flows;
|
|
61
|
+
if (flows?.authorizationCode) {
|
|
62
|
+
const flow = flows.authorizationCode;
|
|
63
|
+
oauthFlows.push({
|
|
64
|
+
authorizationUrl: flow.authorizationUrl,
|
|
65
|
+
tokenUrl: flow.tokenUrl,
|
|
66
|
+
scopes: Object.keys(flow.scopes ?? {}),
|
|
67
|
+
flowType: 'authorizationCode',
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
if (flows?.clientCredentials) {
|
|
71
|
+
const flow = flows.clientCredentials;
|
|
72
|
+
oauthFlows.push({
|
|
73
|
+
tokenUrl: flow.tokenUrl,
|
|
74
|
+
scopes: Object.keys(flow.scopes ?? {}),
|
|
75
|
+
flowType: 'clientCredentials',
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
// Emit OAuth env vars
|
|
79
|
+
envVars.push({ name: 'OAUTH2_CLIENT_ID', description: 'OAuth2 client ID', required: true }, { name: 'OAUTH2_CLIENT_SECRET', description: 'OAuth2 client secret', required: false }, {
|
|
80
|
+
name: 'OAUTH2_TOKEN',
|
|
81
|
+
description: 'Pre-obtained OAuth2 token (alternative to client credentials)',
|
|
82
|
+
required: false,
|
|
83
|
+
});
|
|
84
|
+
if (flows?.authorizationCode) {
|
|
85
|
+
envVars.push({
|
|
86
|
+
name: 'OAUTH2_REDIRECT_URI',
|
|
87
|
+
description: 'OAuth2 redirect URI for authorization code flow',
|
|
88
|
+
required: false,
|
|
89
|
+
example: 'http://localhost:3000/callback',
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Deduplicate env vars by name
|
|
95
|
+
const seen = new Set();
|
|
96
|
+
const uniqueEnvVars = envVars.filter((v) => {
|
|
97
|
+
if (seen.has(v.name))
|
|
98
|
+
return false;
|
|
99
|
+
seen.add(v.name);
|
|
100
|
+
return true;
|
|
101
|
+
});
|
|
102
|
+
return { authSchemes, envVars: uniqueEnvVars, oauthFlows };
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=auth-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-detector.js","sourceRoot":"","sources":["../../src/transformer/auth-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ToolDefinition } from '../types/index.js';
|
|
2
|
+
export interface CatalogEntry {
|
|
3
|
+
name: string;
|
|
4
|
+
title: string;
|
|
5
|
+
description: string;
|
|
6
|
+
method: string;
|
|
7
|
+
path: string;
|
|
8
|
+
inputSchema: Record<string, unknown>;
|
|
9
|
+
pathParams: string[];
|
|
10
|
+
queryParams: string[];
|
|
11
|
+
hasRequestBody: boolean;
|
|
12
|
+
requestBodyContentType: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Build a tool catalog JSON from tool definitions.
|
|
16
|
+
* Used by dynamic discovery mode to avoid registering all tools upfront.
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildCatalog(tools: ToolDefinition[]): CatalogEntry[];
|
|
19
|
+
//# sourceMappingURL=catalog-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-builder.d.ts","sourceRoot":"","sources":["../../src/transformer/catalog-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,YAAY,EAAE,CAapE"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build a tool catalog JSON from tool definitions.
|
|
3
|
+
* Used by dynamic discovery mode to avoid registering all tools upfront.
|
|
4
|
+
*/
|
|
5
|
+
export function buildCatalog(tools) {
|
|
6
|
+
return tools.map((tool) => ({
|
|
7
|
+
name: tool.name,
|
|
8
|
+
title: tool.title,
|
|
9
|
+
description: tool.description,
|
|
10
|
+
method: tool.method,
|
|
11
|
+
path: tool.pathTemplate,
|
|
12
|
+
inputSchema: parseInputSchema(tool.inputSchemaCode),
|
|
13
|
+
pathParams: tool.pathParams,
|
|
14
|
+
queryParams: tool.queryParams,
|
|
15
|
+
hasRequestBody: tool.hasRequestBody,
|
|
16
|
+
requestBodyContentType: tool.requestBodyContentType,
|
|
17
|
+
}));
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Parse the Zod code string into a JSON Schema-like object for the catalog.
|
|
21
|
+
* This is a best-effort conversion for display purposes.
|
|
22
|
+
*/
|
|
23
|
+
function parseInputSchema(zodCode) {
|
|
24
|
+
// Extract field names and types from the Zod code
|
|
25
|
+
const fields = {};
|
|
26
|
+
const fieldPattern = /(\w+):\s*z\.(\w+)/g;
|
|
27
|
+
let match;
|
|
28
|
+
while ((match = fieldPattern.exec(zodCode)) !== null) {
|
|
29
|
+
fields[match[1]] = match[2];
|
|
30
|
+
}
|
|
31
|
+
if (Object.keys(fields).length === 0) {
|
|
32
|
+
return { type: 'object', properties: {} };
|
|
33
|
+
}
|
|
34
|
+
const properties = {};
|
|
35
|
+
for (const [name, type] of Object.entries(fields)) {
|
|
36
|
+
properties[name] = { type: mapZodType(type) };
|
|
37
|
+
}
|
|
38
|
+
return { type: 'object', properties };
|
|
39
|
+
}
|
|
40
|
+
function mapZodType(zodType) {
|
|
41
|
+
switch (zodType) {
|
|
42
|
+
case 'string':
|
|
43
|
+
return 'string';
|
|
44
|
+
case 'number':
|
|
45
|
+
case 'int':
|
|
46
|
+
return 'number';
|
|
47
|
+
case 'boolean':
|
|
48
|
+
return 'boolean';
|
|
49
|
+
case 'array':
|
|
50
|
+
return 'array';
|
|
51
|
+
case 'object':
|
|
52
|
+
return 'object';
|
|
53
|
+
default:
|
|
54
|
+
return 'string';
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=catalog-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-builder.js","sourceRoot":"","sources":["../../src/transformer/catalog-builder.ts"],"names":[],"mappings":"AAeA;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAAuB;IAClD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,YAAY;QACvB,WAAW,EAAE,gBAAgB,CAAC,IAAI,CAAC,eAAe,CAAC;QACnD,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;KACpD,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,OAAe;IACvC,kDAAkD;IAClD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,YAAY,GAAG,oBAAoB,CAAC;IAC1C,IAAI,KAAK,CAAC;IAEV,OAAO,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAC5C,CAAC;IAED,MAAM,UAAU,GAA4B,EAAE,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;IAChD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,UAAU,CAAC,OAAe;IACjC,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,QAAQ,CAAC;QACd,KAAK,KAAK;YACR,OAAO,QAAQ,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB;YACE,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ToolDefinition } from '../types/index.js';
|
|
2
|
+
export type ClientMode = 'cursor' | 'claude' | 'openai';
|
|
3
|
+
/**
|
|
4
|
+
* Apply client-specific compatibility transforms to tool definitions.
|
|
5
|
+
*/
|
|
6
|
+
export declare function applyClientCompat(tools: ToolDefinition[], client: ClientMode): ToolDefinition[];
|
|
7
|
+
//# sourceMappingURL=client-compat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-compat.d.ts","sourceRoot":"","sources":["../../src/transformer/client-compat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGxD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAaxD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,UAAU,GAAG,cAAc,EAAE,CA2C/F"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { logger } from '../utils/logger.js';
|
|
2
|
+
const CLIENT_LIMITS = {
|
|
3
|
+
cursor: { maxToolNameLength: 60, maxTools: 40 },
|
|
4
|
+
claude: { maxToolNameLength: 128, maxTools: 1000 },
|
|
5
|
+
openai: { maxToolNameLength: 128, maxTools: 128 },
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Apply client-specific compatibility transforms to tool definitions.
|
|
9
|
+
*/
|
|
10
|
+
export function applyClientCompat(tools, client) {
|
|
11
|
+
const limits = CLIENT_LIMITS[client];
|
|
12
|
+
let result = tools.map((t) => ({ ...t }));
|
|
13
|
+
// Truncate tool names to client limit
|
|
14
|
+
const renamed = new Map();
|
|
15
|
+
for (const tool of result) {
|
|
16
|
+
if (tool.name.length > limits.maxToolNameLength) {
|
|
17
|
+
const original = tool.name;
|
|
18
|
+
tool.name = tool.name.slice(0, limits.maxToolNameLength);
|
|
19
|
+
renamed.set(original, tool.name);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// Deduplicate after truncation
|
|
23
|
+
const nameCount = new Map();
|
|
24
|
+
for (const t of result) {
|
|
25
|
+
nameCount.set(t.name, (nameCount.get(t.name) ?? 0) + 1);
|
|
26
|
+
}
|
|
27
|
+
for (const tool of result) {
|
|
28
|
+
if ((nameCount.get(tool.name) ?? 0) > 1) {
|
|
29
|
+
// Append a hash suffix to make unique, staying within limit
|
|
30
|
+
const suffix = `_${tool.method}`;
|
|
31
|
+
const maxBase = limits.maxToolNameLength - suffix.length;
|
|
32
|
+
tool.name = tool.name.slice(0, maxBase) + suffix;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (renamed.size > 0) {
|
|
36
|
+
logger.warn(`[${client}] Truncated ${renamed.size} tool name(s) to ${limits.maxToolNameLength} chars`);
|
|
37
|
+
}
|
|
38
|
+
// Enforce max tool count
|
|
39
|
+
if (result.length > limits.maxTools) {
|
|
40
|
+
logger.warn(`[${client}] Tool count (${result.length}) exceeds limit (${limits.maxTools}). Keeping first ${limits.maxTools}.`);
|
|
41
|
+
result = result.slice(0, limits.maxTools);
|
|
42
|
+
}
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=client-compat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-compat.js","sourceRoot":"","sources":["../../src/transformer/client-compat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAS5C,MAAM,aAAa,GAAqC;IACtD,MAAM,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC/C,MAAM,EAAE,EAAE,iBAAiB,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClD,MAAM,EAAE,EAAE,iBAAiB,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE;CAClD,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAuB,EAAE,MAAkB;IAC3E,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAE1C,sCAAsC;IACtC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;YAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,4DAA4D;YAC5D,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,MAAM,CAAC,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC;YACzD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC;QACnD,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CACT,IAAI,MAAM,eAAe,OAAO,CAAC,IAAI,oBAAoB,MAAM,CAAC,iBAAiB,QAAQ,CAC1F,CAAC;IACJ,CAAC;IAED,yBAAyB;IACzB,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CACT,IAAI,MAAM,iBAAiB,MAAM,CAAC,MAAM,oBAAoB,MAAM,CAAC,QAAQ,oBAAoB,MAAM,CAAC,QAAQ,GAAG,CAClH,CAAC;QACF,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { NormalizedEntry } from '../parser/har-normalizer.js';
|
|
2
|
+
export interface EntryCluster {
|
|
3
|
+
signature: string;
|
|
4
|
+
method: string;
|
|
5
|
+
normalizedPath: string;
|
|
6
|
+
baseUrl: string;
|
|
7
|
+
entries: NormalizedEntry[];
|
|
8
|
+
}
|
|
9
|
+
export declare function clusterEntries(entries: NormalizedEntry[]): EntryCluster[];
|
|
10
|
+
//# sourceMappingURL=har-clusterer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"har-clusterer.d.ts","sourceRoot":"","sources":["../../src/transformer/har-clusterer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,YAAY,EAAE,CA4BzE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export function clusterEntries(entries) {
|
|
2
|
+
const groups = new Map();
|
|
3
|
+
for (const entry of entries) {
|
|
4
|
+
const method = entry.entry.request.method.toUpperCase();
|
|
5
|
+
const signature = `${method} ${entry.normalizedPath}`;
|
|
6
|
+
const existing = groups.get(signature);
|
|
7
|
+
if (existing) {
|
|
8
|
+
existing.push(entry);
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
groups.set(signature, [entry]);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const clusters = [];
|
|
15
|
+
for (const [signature, clusterEntries] of groups) {
|
|
16
|
+
const [method, ...pathParts] = signature.split(' ');
|
|
17
|
+
const normalizedPath = pathParts.join(' ');
|
|
18
|
+
clusters.push({
|
|
19
|
+
signature,
|
|
20
|
+
method: method.toLowerCase(),
|
|
21
|
+
normalizedPath,
|
|
22
|
+
baseUrl: clusterEntries[0].baseUrl,
|
|
23
|
+
entries: clusterEntries,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
return clusters;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=har-clusterer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"har-clusterer.js","sourceRoot":"","sources":["../../src/transformer/har-clusterer.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,cAAc,CAAC,OAA0B;IACvD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA6B,CAAC;IAEpD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACxD,MAAM,SAAS,GAAG,GAAG,MAAM,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,IAAI,MAAM,EAAE,CAAC;QACjD,MAAM,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpD,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,QAAQ,CAAC,IAAI,CAAC;YACZ,SAAS;YACT,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE;YAC5B,cAAc;YACd,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO;YAClC,OAAO,EAAE,cAAc;SACxB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { NormalizedEntry } from '../parser/har-normalizer.js';
|
|
2
|
+
/**
|
|
3
|
+
* Deduplicate HAR entries that are likely pagination or retries.
|
|
4
|
+
*
|
|
5
|
+
* Strategy:
|
|
6
|
+
* - Group by method + normalizedPath (same as clustering)
|
|
7
|
+
* - Within each group, detect pagination patterns (same URL with different page/offset/cursor params)
|
|
8
|
+
* - Remove retries: consecutive requests to the same URL within 5s with same method
|
|
9
|
+
*/
|
|
10
|
+
export declare function deduplicateEntries(entries: NormalizedEntry[]): NormalizedEntry[];
|
|
11
|
+
//# sourceMappingURL=har-dedup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"har-dedup.d.ts","sourceRoot":"","sources":["../../src/transformer/har-dedup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAoChF"}
|