@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.
Files changed (323) hide show
  1. package/dist/analyzer/auth-detector.d.ts +13 -0
  2. package/dist/analyzer/auth-detector.d.ts.map +1 -0
  3. package/dist/analyzer/auth-detector.js +143 -0
  4. package/dist/analyzer/auth-detector.js.map +1 -0
  5. package/dist/analyzer/dom-parser.d.ts +11 -0
  6. package/dist/analyzer/dom-parser.d.ts.map +1 -0
  7. package/dist/analyzer/dom-parser.js +260 -0
  8. package/dist/analyzer/dom-parser.js.map +1 -0
  9. package/dist/analyzer/goal-crawler.d.ts +26 -0
  10. package/dist/analyzer/goal-crawler.d.ts.map +1 -0
  11. package/dist/analyzer/goal-crawler.js +178 -0
  12. package/dist/analyzer/goal-crawler.js.map +1 -0
  13. package/dist/analyzer/hybrid-detector.d.ts +29 -0
  14. package/dist/analyzer/hybrid-detector.d.ts.map +1 -0
  15. package/dist/analyzer/hybrid-detector.js +97 -0
  16. package/dist/analyzer/hybrid-detector.js.map +1 -0
  17. package/dist/analyzer/index.d.ts +13 -0
  18. package/dist/analyzer/index.d.ts.map +1 -0
  19. package/dist/analyzer/index.js +9 -0
  20. package/dist/analyzer/index.js.map +1 -0
  21. package/dist/analyzer/screenshot-capture.d.ts +30 -0
  22. package/dist/analyzer/screenshot-capture.d.ts.map +1 -0
  23. package/dist/analyzer/screenshot-capture.js +43 -0
  24. package/dist/analyzer/screenshot-capture.js.map +1 -0
  25. package/dist/analyzer/selector-builder.d.ts +20 -0
  26. package/dist/analyzer/selector-builder.d.ts.map +1 -0
  27. package/dist/analyzer/selector-builder.js +200 -0
  28. package/dist/analyzer/selector-builder.js.map +1 -0
  29. package/dist/analyzer/semantic-analyzer.d.ts +14 -0
  30. package/dist/analyzer/semantic-analyzer.d.ts.map +1 -0
  31. package/dist/analyzer/semantic-analyzer.js +146 -0
  32. package/dist/analyzer/semantic-analyzer.js.map +1 -0
  33. package/dist/analyzer/site-crawler.d.ts +39 -0
  34. package/dist/analyzer/site-crawler.d.ts.map +1 -0
  35. package/dist/analyzer/site-crawler.js +236 -0
  36. package/dist/analyzer/site-crawler.js.map +1 -0
  37. package/dist/config/configurable-command.d.ts +14 -0
  38. package/dist/config/configurable-command.d.ts.map +1 -0
  39. package/dist/config/configurable-command.js +71 -0
  40. package/dist/config/configurable-command.js.map +1 -0
  41. package/dist/config/mcpmake-config.d.ts +69 -0
  42. package/dist/config/mcpmake-config.d.ts.map +1 -0
  43. package/dist/config/mcpmake-config.js +209 -0
  44. package/dist/config/mcpmake-config.js.map +1 -0
  45. package/dist/emitter/code-writer.d.ts +9 -0
  46. package/dist/emitter/code-writer.d.ts.map +1 -0
  47. package/dist/emitter/code-writer.js +26 -0
  48. package/dist/emitter/code-writer.js.map +1 -0
  49. package/dist/emitter/index.d.ts +33 -0
  50. package/dist/emitter/index.d.ts.map +1 -0
  51. package/dist/emitter/index.js +297 -0
  52. package/dist/emitter/index.js.map +1 -0
  53. package/dist/emitter/mcpb-bundler.d.ts +32 -0
  54. package/dist/emitter/mcpb-bundler.d.ts.map +1 -0
  55. package/dist/emitter/mcpb-bundler.js +173 -0
  56. package/dist/emitter/mcpb-bundler.js.map +1 -0
  57. package/dist/emitter/project-scaffolder.d.ts +5 -0
  58. package/dist/emitter/project-scaffolder.d.ts.map +1 -0
  59. package/dist/emitter/project-scaffolder.js +101 -0
  60. package/dist/emitter/project-scaffolder.js.map +1 -0
  61. package/dist/emitter/python-template-loader.d.ts +5 -0
  62. package/dist/emitter/python-template-loader.d.ts.map +1 -0
  63. package/dist/emitter/python-template-loader.js +31 -0
  64. package/dist/emitter/python-template-loader.js.map +1 -0
  65. package/dist/emitter/python-templates/dockerfile.hbs +14 -0
  66. package/dist/emitter/python-templates/env.example.hbs +12 -0
  67. package/dist/emitter/python-templates/requirements.txt.hbs +4 -0
  68. package/dist/emitter/python-templates/server.py.hbs +93 -0
  69. package/dist/emitter/site-scaffolder.d.ts +14 -0
  70. package/dist/emitter/site-scaffolder.d.ts.map +1 -0
  71. package/dist/emitter/site-scaffolder.js +71 -0
  72. package/dist/emitter/site-scaffolder.js.map +1 -0
  73. package/dist/emitter/site-template-loader.d.ts +6 -0
  74. package/dist/emitter/site-template-loader.d.ts.map +1 -0
  75. package/dist/emitter/site-template-loader.js +48 -0
  76. package/dist/emitter/site-template-loader.js.map +1 -0
  77. package/dist/emitter/site-templates/browser-manager.ts.hbs +233 -0
  78. package/dist/emitter/site-templates/config.ts.hbs +28 -0
  79. package/dist/emitter/site-templates/dockerfile.hbs +31 -0
  80. package/dist/emitter/site-templates/env.example.hbs +19 -0
  81. package/dist/emitter/site-templates/package.json.hbs +26 -0
  82. package/dist/emitter/site-templates/server-main-http.ts.hbs +108 -0
  83. package/dist/emitter/site-templates/server-main.ts.hbs +23 -0
  84. package/dist/emitter/site-templates/tool-handler-action.ts.hbs +86 -0
  85. package/dist/emitter/site-templates/tool-handler-form.ts.hbs +116 -0
  86. package/dist/emitter/site-templates/tool-handler-lifecycle.ts.hbs +146 -0
  87. package/dist/emitter/site-templates/tool-index.ts.hbs +11 -0
  88. package/dist/emitter/template-loader.d.ts +2 -0
  89. package/dist/emitter/template-loader.d.ts.map +1 -0
  90. package/dist/emitter/template-loader.js +28 -0
  91. package/dist/emitter/template-loader.js.map +1 -0
  92. package/dist/emitter/templates/auth-provider.ts.hbs +57 -0
  93. package/dist/emitter/templates/config.ts.hbs +110 -0
  94. package/dist/emitter/templates/discovery.ts.hbs +320 -0
  95. package/dist/emitter/templates/dockerfile.hbs +34 -0
  96. package/dist/emitter/templates/env.example.hbs +52 -0
  97. package/dist/emitter/templates/gitignore.hbs +5 -0
  98. package/dist/emitter/templates/http-executor.ts.hbs +159 -0
  99. package/dist/emitter/templates/oauth.ts.hbs +188 -0
  100. package/dist/emitter/templates/package.json.hbs +25 -0
  101. package/dist/emitter/templates/prompts.ts.hbs +22 -0
  102. package/dist/emitter/templates/readme.md.hbs +156 -0
  103. package/dist/emitter/templates/resources.ts.hbs +63 -0
  104. package/dist/emitter/templates/response-filter.ts.hbs +128 -0
  105. package/dist/emitter/templates/server-main-http.ts.hbs +442 -0
  106. package/dist/emitter/templates/server-main.ts.hbs +40 -0
  107. package/dist/emitter/templates/task-handlers.ts.hbs +189 -0
  108. package/dist/emitter/templates/task-manager.ts.hbs +139 -0
  109. package/dist/emitter/templates/task-sse.ts.hbs +105 -0
  110. package/dist/emitter/templates/tool-handler.ts.hbs +142 -0
  111. package/dist/emitter/templates/tool-index.ts.hbs +42 -0
  112. package/dist/emitter/templates/tool-test.ts.hbs +57 -0
  113. package/dist/emitter/templates/trace.ts.hbs +79 -0
  114. package/dist/emitter/templates/tsconfig.json.hbs +16 -0
  115. package/dist/emitter/templates/types.ts.hbs +5 -0
  116. package/dist/emitter/worker-template-loader.d.ts +6 -0
  117. package/dist/emitter/worker-template-loader.d.ts.map +1 -0
  118. package/dist/emitter/worker-template-loader.js +34 -0
  119. package/dist/emitter/worker-template-loader.js.map +1 -0
  120. package/dist/emitter/worker-templates/config.ts.hbs +93 -0
  121. package/dist/emitter/worker-templates/dev-vars.example.hbs +27 -0
  122. package/dist/emitter/worker-templates/gitignore.hbs +6 -0
  123. package/dist/emitter/worker-templates/package.json.hbs +24 -0
  124. package/dist/emitter/worker-templates/readme.md.hbs +73 -0
  125. package/dist/emitter/worker-templates/server.test.ts.hbs +20 -0
  126. package/dist/emitter/worker-templates/tool-handler.ts.hbs +103 -0
  127. package/dist/emitter/worker-templates/tool-index.ts.hbs +28 -0
  128. package/dist/emitter/worker-templates/tsconfig.json.hbs +17 -0
  129. package/dist/emitter/worker-templates/worker.ts.hbs +286 -0
  130. package/dist/emitter/worker-templates/wrangler.toml.hbs +19 -0
  131. package/dist/generator/spec-generator.d.ts +7 -0
  132. package/dist/generator/spec-generator.d.ts.map +1 -0
  133. package/dist/generator/spec-generator.js +51 -0
  134. package/dist/generator/spec-generator.js.map +1 -0
  135. package/dist/index.d.ts +75 -0
  136. package/dist/index.d.ts.map +1 -0
  137. package/dist/index.js +101 -0
  138. package/dist/index.js.map +1 -0
  139. package/dist/parser/har-filter.d.ts +9 -0
  140. package/dist/parser/har-filter.d.ts.map +1 -0
  141. package/dist/parser/har-filter.js +72 -0
  142. package/dist/parser/har-filter.js.map +1 -0
  143. package/dist/parser/har-loader.d.ts +3 -0
  144. package/dist/parser/har-loader.d.ts.map +1 -0
  145. package/dist/parser/har-loader.js +15 -0
  146. package/dist/parser/har-loader.js.map +1 -0
  147. package/dist/parser/har-normalizer.d.ts +21 -0
  148. package/dist/parser/har-normalizer.d.ts.map +1 -0
  149. package/dist/parser/har-normalizer.js +79 -0
  150. package/dist/parser/har-normalizer.js.map +1 -0
  151. package/dist/parser/index.d.ts +11 -0
  152. package/dist/parser/index.d.ts.map +1 -0
  153. package/dist/parser/index.js +7 -0
  154. package/dist/parser/index.js.map +1 -0
  155. package/dist/parser/openapi-loader.d.ts +7 -0
  156. package/dist/parser/openapi-loader.d.ts.map +1 -0
  157. package/dist/parser/openapi-loader.js +309 -0
  158. package/dist/parser/openapi-loader.js.map +1 -0
  159. package/dist/parser/operation-extractor.d.ts +14 -0
  160. package/dist/parser/operation-extractor.d.ts.map +1 -0
  161. package/dist/parser/operation-extractor.js +156 -0
  162. package/dist/parser/operation-extractor.js.map +1 -0
  163. package/dist/parser/overlay-loader.d.ts +11 -0
  164. package/dist/parser/overlay-loader.d.ts.map +1 -0
  165. package/dist/parser/overlay-loader.js +185 -0
  166. package/dist/parser/overlay-loader.js.map +1 -0
  167. package/dist/parser/postman-loader.d.ts +10 -0
  168. package/dist/parser/postman-loader.d.ts.map +1 -0
  169. package/dist/parser/postman-loader.js +107 -0
  170. package/dist/parser/postman-loader.js.map +1 -0
  171. package/dist/parser/schema-converter.d.ts +13 -0
  172. package/dist/parser/schema-converter.d.ts.map +1 -0
  173. package/dist/parser/schema-converter.js +118 -0
  174. package/dist/parser/schema-converter.js.map +1 -0
  175. package/dist/plugins/adapter.d.ts +41 -0
  176. package/dist/plugins/adapter.d.ts.map +1 -0
  177. package/dist/plugins/adapter.js +16 -0
  178. package/dist/plugins/adapter.js.map +1 -0
  179. package/dist/plugins/loader.d.ts +26 -0
  180. package/dist/plugins/loader.d.ts.map +1 -0
  181. package/dist/plugins/loader.js +59 -0
  182. package/dist/plugins/loader.js.map +1 -0
  183. package/dist/pricing.d.ts +56 -0
  184. package/dist/pricing.d.ts.map +1 -0
  185. package/dist/pricing.js +134 -0
  186. package/dist/pricing.js.map +1 -0
  187. package/dist/providers/index.d.ts +16 -0
  188. package/dist/providers/index.d.ts.map +1 -0
  189. package/dist/providers/index.js +57 -0
  190. package/dist/providers/index.js.map +1 -0
  191. package/dist/recorder/browser-recorder.d.ts +23 -0
  192. package/dist/recorder/browser-recorder.d.ts.map +1 -0
  193. package/dist/recorder/browser-recorder.js +206 -0
  194. package/dist/recorder/browser-recorder.js.map +1 -0
  195. package/dist/rescan/diff-engine.d.ts +6 -0
  196. package/dist/rescan/diff-engine.d.ts.map +1 -0
  197. package/dist/rescan/diff-engine.js +313 -0
  198. package/dist/rescan/diff-engine.js.map +1 -0
  199. package/dist/rescan/index.d.ts +4 -0
  200. package/dist/rescan/index.d.ts.map +1 -0
  201. package/dist/rescan/index.js +3 -0
  202. package/dist/rescan/index.js.map +1 -0
  203. package/dist/rescan/rescan-runner.d.ts +43 -0
  204. package/dist/rescan/rescan-runner.d.ts.map +1 -0
  205. package/dist/rescan/rescan-runner.js +70 -0
  206. package/dist/rescan/rescan-runner.js.map +1 -0
  207. package/dist/rescan/rescan-scheduler.d.ts +42 -0
  208. package/dist/rescan/rescan-scheduler.d.ts.map +1 -0
  209. package/dist/rescan/rescan-scheduler.js +180 -0
  210. package/dist/rescan/rescan-scheduler.js.map +1 -0
  211. package/dist/site-transformer/browser-tools.d.ts +11 -0
  212. package/dist/site-transformer/browser-tools.d.ts.map +1 -0
  213. package/dist/site-transformer/browser-tools.js +60 -0
  214. package/dist/site-transformer/browser-tools.js.map +1 -0
  215. package/dist/site-transformer/index.d.ts +3 -0
  216. package/dist/site-transformer/index.d.ts.map +1 -0
  217. package/dist/site-transformer/index.js +3 -0
  218. package/dist/site-transformer/index.js.map +1 -0
  219. package/dist/site-transformer/selector-healer.d.ts +9 -0
  220. package/dist/site-transformer/selector-healer.d.ts.map +1 -0
  221. package/dist/site-transformer/selector-healer.js +107 -0
  222. package/dist/site-transformer/selector-healer.js.map +1 -0
  223. package/dist/site-transformer/tool-generator.d.ts +14 -0
  224. package/dist/site-transformer/tool-generator.d.ts.map +1 -0
  225. package/dist/site-transformer/tool-generator.js +246 -0
  226. package/dist/site-transformer/tool-generator.js.map +1 -0
  227. package/dist/transformer/auth-detector.d.ts +29 -0
  228. package/dist/transformer/auth-detector.d.ts.map +1 -0
  229. package/dist/transformer/auth-detector.js +104 -0
  230. package/dist/transformer/auth-detector.js.map +1 -0
  231. package/dist/transformer/catalog-builder.d.ts +19 -0
  232. package/dist/transformer/catalog-builder.d.ts.map +1 -0
  233. package/dist/transformer/catalog-builder.js +57 -0
  234. package/dist/transformer/catalog-builder.js.map +1 -0
  235. package/dist/transformer/client-compat.d.ts +7 -0
  236. package/dist/transformer/client-compat.d.ts.map +1 -0
  237. package/dist/transformer/client-compat.js +45 -0
  238. package/dist/transformer/client-compat.js.map +1 -0
  239. package/dist/transformer/har-clusterer.d.ts +10 -0
  240. package/dist/transformer/har-clusterer.d.ts.map +1 -0
  241. package/dist/transformer/har-clusterer.js +28 -0
  242. package/dist/transformer/har-clusterer.js.map +1 -0
  243. package/dist/transformer/har-dedup.d.ts +11 -0
  244. package/dist/transformer/har-dedup.d.ts.map +1 -0
  245. package/dist/transformer/har-dedup.js +82 -0
  246. package/dist/transformer/har-dedup.js.map +1 -0
  247. package/dist/transformer/har-schema-inferrer.d.ts +16 -0
  248. package/dist/transformer/har-schema-inferrer.d.ts.map +1 -0
  249. package/dist/transformer/har-schema-inferrer.js +91 -0
  250. package/dist/transformer/har-schema-inferrer.js.map +1 -0
  251. package/dist/transformer/har-to-operations.d.ts +14 -0
  252. package/dist/transformer/har-to-operations.d.ts.map +1 -0
  253. package/dist/transformer/har-to-operations.js +193 -0
  254. package/dist/transformer/har-to-operations.js.map +1 -0
  255. package/dist/transformer/index.d.ts +9 -0
  256. package/dist/transformer/index.d.ts.map +1 -0
  257. package/dist/transformer/index.js +7 -0
  258. package/dist/transformer/index.js.map +1 -0
  259. package/dist/transformer/llm-namer.d.ts +7 -0
  260. package/dist/transformer/llm-namer.d.ts.map +1 -0
  261. package/dist/transformer/llm-namer.js +60 -0
  262. package/dist/transformer/llm-namer.js.map +1 -0
  263. package/dist/transformer/naming.d.ts +5 -0
  264. package/dist/transformer/naming.d.ts.map +1 -0
  265. package/dist/transformer/naming.js +31 -0
  266. package/dist/transformer/naming.js.map +1 -0
  267. package/dist/transformer/operation-filter.d.ts +14 -0
  268. package/dist/transformer/operation-filter.d.ts.map +1 -0
  269. package/dist/transformer/operation-filter.js +53 -0
  270. package/dist/transformer/operation-filter.js.map +1 -0
  271. package/dist/transformer/resource-builder.d.ts +13 -0
  272. package/dist/transformer/resource-builder.d.ts.map +1 -0
  273. package/dist/transformer/resource-builder.js +87 -0
  274. package/dist/transformer/resource-builder.js.map +1 -0
  275. package/dist/transformer/schema-merger.d.ts +15 -0
  276. package/dist/transformer/schema-merger.d.ts.map +1 -0
  277. package/dist/transformer/schema-merger.js +66 -0
  278. package/dist/transformer/schema-merger.js.map +1 -0
  279. package/dist/transformer/stainless-config.d.ts +75 -0
  280. package/dist/transformer/stainless-config.d.ts.map +1 -0
  281. package/dist/transformer/stainless-config.js +59 -0
  282. package/dist/transformer/stainless-config.js.map +1 -0
  283. package/dist/transformer/stainless-translator.d.ts +61 -0
  284. package/dist/transformer/stainless-translator.d.ts.map +1 -0
  285. package/dist/transformer/stainless-translator.js +375 -0
  286. package/dist/transformer/stainless-translator.js.map +1 -0
  287. package/dist/transformer/tool-builder.d.ts +4 -0
  288. package/dist/transformer/tool-builder.d.ts.map +1 -0
  289. package/dist/transformer/tool-builder.js +119 -0
  290. package/dist/transformer/tool-builder.js.map +1 -0
  291. package/dist/types/index.d.ts +140 -0
  292. package/dist/types/index.d.ts.map +1 -0
  293. package/dist/types/index.js +2 -0
  294. package/dist/types/index.js.map +1 -0
  295. package/dist/types/site.d.ts +285 -0
  296. package/dist/types/site.d.ts.map +1 -0
  297. package/dist/types/site.js +9 -0
  298. package/dist/types/site.js.map +1 -0
  299. package/dist/utils/fail.d.ts +49 -0
  300. package/dist/utils/fail.d.ts.map +1 -0
  301. package/dist/utils/fail.js +223 -0
  302. package/dist/utils/fail.js.map +1 -0
  303. package/dist/utils/fs.d.ts +6 -0
  304. package/dist/utils/fs.d.ts.map +1 -0
  305. package/dist/utils/fs.js +29 -0
  306. package/dist/utils/fs.js.map +1 -0
  307. package/dist/utils/interactive.d.ts +7 -0
  308. package/dist/utils/interactive.d.ts.map +1 -0
  309. package/dist/utils/interactive.js +31 -0
  310. package/dist/utils/interactive.js.map +1 -0
  311. package/dist/utils/logger.d.ts +2 -0
  312. package/dist/utils/logger.d.ts.map +1 -0
  313. package/dist/utils/logger.js +3 -0
  314. package/dist/utils/logger.js.map +1 -0
  315. package/dist/utils/sanitize.d.ts +29 -0
  316. package/dist/utils/sanitize.d.ts.map +1 -0
  317. package/dist/utils/sanitize.js +45 -0
  318. package/dist/utils/sanitize.js.map +1 -0
  319. package/dist/utils/watcher.d.ts +12 -0
  320. package/dist/utils/watcher.d.ts.map +1 -0
  321. package/dist/utils/watcher.js +37 -0
  322. package/dist/utils/watcher.js.map +1 -0
  323. 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"}