@mcpmake/core 0.2.3 → 0.2.5

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 (105) hide show
  1. package/dist/analyzer/dom-parser.d.ts +7 -0
  2. package/dist/analyzer/dom-parser.d.ts.map +1 -1
  3. package/dist/analyzer/dom-parser.js +31 -5
  4. package/dist/analyzer/dom-parser.js.map +1 -1
  5. package/dist/analyzer/goal-crawler.d.ts.map +1 -1
  6. package/dist/analyzer/goal-crawler.js +3 -2
  7. package/dist/analyzer/goal-crawler.js.map +1 -1
  8. package/dist/analyzer/semantic-analyzer.d.ts.map +1 -1
  9. package/dist/analyzer/semantic-analyzer.js +3 -2
  10. package/dist/analyzer/semantic-analyzer.js.map +1 -1
  11. package/dist/analyzer/site-crawler.d.ts.map +1 -1
  12. package/dist/analyzer/site-crawler.js +40 -8
  13. package/dist/analyzer/site-crawler.js.map +1 -1
  14. package/dist/emitter/index.d.ts.map +1 -1
  15. package/dist/emitter/index.js +113 -6
  16. package/dist/emitter/index.js.map +1 -1
  17. package/dist/emitter/project-scaffolder.d.ts +13 -0
  18. package/dist/emitter/project-scaffolder.d.ts.map +1 -1
  19. package/dist/emitter/project-scaffolder.js +29 -0
  20. package/dist/emitter/project-scaffolder.js.map +1 -1
  21. package/dist/emitter/python-template-loader.d.ts.map +1 -1
  22. package/dist/emitter/python-template-loader.js +10 -0
  23. package/dist/emitter/python-template-loader.js.map +1 -1
  24. package/dist/emitter/python-templates/server.py.hbs +78 -8
  25. package/dist/emitter/site-templates/browser-manager.ts.hbs +81 -32
  26. package/dist/emitter/site-templates/server-main-http.ts.hbs +25 -7
  27. package/dist/emitter/site-templates/tool-handler-form.ts.hbs +10 -8
  28. package/dist/emitter/template-loader.d.ts.map +1 -1
  29. package/dist/emitter/template-loader.js +9 -0
  30. package/dist/emitter/template-loader.js.map +1 -1
  31. package/dist/emitter/templates/auth-provider.ts.hbs +81 -20
  32. package/dist/emitter/templates/config.ts.hbs +7 -0
  33. package/dist/emitter/templates/env.example.hbs +6 -0
  34. package/dist/emitter/templates/http-executor.ts.hbs +150 -7
  35. package/dist/emitter/templates/server-main-http.ts.hbs +60 -4
  36. package/dist/emitter/templates/tool-handler.ts.hbs +37 -2
  37. package/dist/emitter/templates/tool-test.ts.hbs +9 -1
  38. package/dist/emitter/worker-templates/config.ts.hbs +7 -0
  39. package/dist/emitter/worker-templates/tool-handler.ts.hbs +37 -2
  40. package/dist/emitter/worker-templates/worker.ts.hbs +33 -2
  41. package/dist/generator/spec-generator.d.ts.map +1 -1
  42. package/dist/generator/spec-generator.js +44 -5
  43. package/dist/generator/spec-generator.js.map +1 -1
  44. package/dist/index.d.ts +2 -0
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +1 -0
  47. package/dist/index.js.map +1 -1
  48. package/dist/parser/operation-extractor.d.ts.map +1 -1
  49. package/dist/parser/operation-extractor.js +12 -1
  50. package/dist/parser/operation-extractor.js.map +1 -1
  51. package/dist/parser/overlay-loader.d.ts.map +1 -1
  52. package/dist/parser/overlay-loader.js +11 -2
  53. package/dist/parser/overlay-loader.js.map +1 -1
  54. package/dist/parser/schema-converter.d.ts +13 -2
  55. package/dist/parser/schema-converter.d.ts.map +1 -1
  56. package/dist/parser/schema-converter.js +30 -19
  57. package/dist/parser/schema-converter.js.map +1 -1
  58. package/dist/pricing.d.ts +5 -1
  59. package/dist/pricing.d.ts.map +1 -1
  60. package/dist/pricing.js +7 -3
  61. package/dist/pricing.js.map +1 -1
  62. package/dist/providers/index.d.ts.map +1 -1
  63. package/dist/providers/index.js +6 -21
  64. package/dist/providers/index.js.map +1 -1
  65. package/dist/recorder/browser-recorder.d.ts.map +1 -1
  66. package/dist/recorder/browser-recorder.js +39 -7
  67. package/dist/recorder/browser-recorder.js.map +1 -1
  68. package/dist/site-transformer/selector-healer.d.ts.map +1 -1
  69. package/dist/site-transformer/selector-healer.js +2 -1
  70. package/dist/site-transformer/selector-healer.js.map +1 -1
  71. package/dist/site-transformer/tool-generator.d.ts.map +1 -1
  72. package/dist/site-transformer/tool-generator.js +90 -22
  73. package/dist/site-transformer/tool-generator.js.map +1 -1
  74. package/dist/transformer/auth-detector.d.ts.map +1 -1
  75. package/dist/transformer/auth-detector.js +11 -4
  76. package/dist/transformer/auth-detector.js.map +1 -1
  77. package/dist/transformer/llm-namer.d.ts.map +1 -1
  78. package/dist/transformer/llm-namer.js +35 -10
  79. package/dist/transformer/llm-namer.js.map +1 -1
  80. package/dist/transformer/naming.d.ts.map +1 -1
  81. package/dist/transformer/naming.js +17 -9
  82. package/dist/transformer/naming.js.map +1 -1
  83. package/dist/transformer/resource-builder.d.ts.map +1 -1
  84. package/dist/transformer/resource-builder.js +13 -6
  85. package/dist/transformer/resource-builder.js.map +1 -1
  86. package/dist/transformer/stainless-translator.d.ts +6 -0
  87. package/dist/transformer/stainless-translator.d.ts.map +1 -1
  88. package/dist/transformer/stainless-translator.js +18 -1
  89. package/dist/transformer/stainless-translator.js.map +1 -1
  90. package/dist/transformer/tool-builder.d.ts.map +1 -1
  91. package/dist/transformer/tool-builder.js +111 -13
  92. package/dist/transformer/tool-builder.js.map +1 -1
  93. package/dist/types/index.d.ts +72 -0
  94. package/dist/types/index.d.ts.map +1 -1
  95. package/dist/types/site.d.ts +19 -1
  96. package/dist/types/site.d.ts.map +1 -1
  97. package/dist/utils/model-resolver.d.ts +21 -0
  98. package/dist/utils/model-resolver.d.ts.map +1 -0
  99. package/dist/utils/model-resolver.js +64 -0
  100. package/dist/utils/model-resolver.js.map +1 -0
  101. package/dist/utils/sanitize.d.ts +62 -0
  102. package/dist/utils/sanitize.d.ts.map +1 -1
  103. package/dist/utils/sanitize.js +141 -0
  104. package/dist/utils/sanitize.js.map +1 -1
  105. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/emitter/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/emitter/index.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,18 @@
1
1
  import type { ProjectManifest } from '../types/index.js';
2
2
  import type { CodeUnit } from './code-writer.js';
3
+ /**
4
+ * Escape an arbitrary string for use as a single-line dotenv value in the
5
+ * generated `.env.example` (the file users are told to copy to `.env`).
6
+ *
7
+ * Untrusted values (e.g. a Stainless `defaultEnvironment` name, a base URL) are
8
+ * interpolated raw by Handlebars (`noEscape: true`), so a value containing a
9
+ * newline or `#` could inject extra `KEY=value` lines or a comment — config
10
+ * injection into the operator's `.env`. We collapse all line breaks to a single
11
+ * space and wrap the value in double quotes (dotenv treats a quoted value as a
12
+ * single token) whenever it contains a character that would otherwise change how
13
+ * dotenv parses the line. Lossless for benign values (those are returned as-is).
14
+ */
15
+ export declare function escapeDotenvValue(raw: string): string;
3
16
  export declare function scaffoldProjectFiles(manifest: ProjectManifest): CodeUnit[];
4
17
  export declare function scaffoldSharedModules(manifest: ProjectManifest): CodeUnit[];
5
18
  //# sourceMappingURL=project-scaffolder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-scaffolder.d.ts","sourceRoot":"","sources":["../../src/emitter/project-scaffolder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AASjD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,eAAe,GAAG,QAAQ,EAAE,CAgD1E;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,GAAG,QAAQ,EAAE,CAmD3E"}
1
+ {"version":3,"file":"project-scaffolder.d.ts","sourceRoot":"","sources":["../../src/emitter/project-scaffolder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AASjD;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQrD;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,eAAe,GAAG,QAAQ,EAAE,CAuD1E;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,GAAG,QAAQ,EAAE,CAmD3E"}
@@ -4,6 +4,28 @@ import { renderTemplate } from './template-loader.js';
4
4
  * problem; the README recommends `--dynamic-discovery` (the #1 buyer concern).
5
5
  */
6
6
  const DISCOVERY_RECOMMEND_THRESHOLD = 50;
7
+ /**
8
+ * Escape an arbitrary string for use as a single-line dotenv value in the
9
+ * generated `.env.example` (the file users are told to copy to `.env`).
10
+ *
11
+ * Untrusted values (e.g. a Stainless `defaultEnvironment` name, a base URL) are
12
+ * interpolated raw by Handlebars (`noEscape: true`), so a value containing a
13
+ * newline or `#` could inject extra `KEY=value` lines or a comment — config
14
+ * injection into the operator's `.env`. We collapse all line breaks to a single
15
+ * space and wrap the value in double quotes (dotenv treats a quoted value as a
16
+ * single token) whenever it contains a character that would otherwise change how
17
+ * dotenv parses the line. Lossless for benign values (those are returned as-is).
18
+ */
19
+ export function escapeDotenvValue(raw) {
20
+ // Neutralize any CR/LF — these are what break out into new dotenv lines.
21
+ const oneLine = raw.replace(/[\r\n]+/g, ' ');
22
+ // A bare value is safe only when it has no characters dotenv treats specially
23
+ // at the start/inside an unquoted value (#, quotes, backslash, surrounding ws).
24
+ const needsQuoting = /[#"'\\]/.test(oneLine) || /^\s|\s$/.test(oneLine) || oneLine !== raw;
25
+ if (!needsQuoting)
26
+ return oneLine;
27
+ return `"${oneLine.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
28
+ }
7
29
  export function scaffoldProjectFiles(manifest) {
8
30
  const dynamicDiscovery = manifest.dynamicDiscovery ?? false;
9
31
  const units = [
@@ -19,9 +41,16 @@ export function scaffoldProjectFiles(manifest) {
19
41
  filePath: '.env.example',
20
42
  content: renderTemplate('env.example', {
21
43
  ...manifest,
44
+ // Serialize every untrusted scalar through the dotenv escaper at this
45
+ // emit boundary so a value with a newline/`#` cannot inject extra lines.
46
+ baseUrl: escapeDotenvValue(manifest.baseUrl),
47
+ defaultEnvironment: manifest.defaultEnvironment
48
+ ? escapeDotenvValue(manifest.defaultEnvironment)
49
+ : manifest.defaultEnvironment,
22
50
  authEnvVars: manifest.envVars.filter((v) => v.name !== 'BASE_URL'),
23
51
  // Pre-seed MCP_ENVIRONMENTS when an importer carried over named
24
52
  // environments (e.g. Stainless `environments:`); omitted otherwise.
53
+ // JSON.stringify already escapes the keys/values into a single token.
25
54
  environmentsJson: manifest.environments && Object.keys(manifest.environments).length > 0
26
55
  ? JSON.stringify(manifest.environments)
27
56
  : undefined,
@@ -1 +1 @@
1
- {"version":3,"file":"project-scaffolder.js","sourceRoot":"","sources":["../../src/emitter/project-scaffolder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project-scaffolder.js","sourceRoot":"","sources":["../../src/emitter/project-scaffolder.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"python-template-loader.d.ts","sourceRoot":"","sources":["../../src/emitter/python-template-loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAsBH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,MAAM,CAUpE"}
1
+ {"version":3,"file":"python-template-loader.d.ts","sourceRoot":"","sources":["../../src/emitter/python-template-loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkCH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,MAAM,CAUpE"}
@@ -5,17 +5,27 @@ import { readFileSync } from 'node:fs';
5
5
  import { resolve, dirname } from 'node:path';
6
6
  import { fileURLToPath } from 'node:url';
7
7
  import Handlebars from 'handlebars';
8
+ import { escapePyString } from '../utils/sanitize.js';
8
9
  const __dirname = dirname(fileURLToPath(import.meta.url));
9
10
  const PYTHON_TEMPLATE_DIR = resolve(__dirname, 'python-templates');
10
11
  const pythonTemplateCache = new Map();
11
12
  Handlebars.registerHelper('eq', function (a, b) {
12
13
  return a === b;
13
14
  });
15
+ // Logical OR for block conditionals (e.g. emit a section when either of two
16
+ // param lists is non-empty). Handlebars has no built-in `or`.
17
+ Handlebars.registerHelper('or', function (a, b) {
18
+ return a || b;
19
+ });
14
20
  Handlebars.registerHelper('pyDocstring', function (str) {
15
21
  if (!str)
16
22
  return '';
17
23
  return str.replace(/"""/g, '\\"\\"\\"').replace(/\\/g, '\\\\');
18
24
  });
25
+ // Escape a value for embedding in a double-quoted Python string literal.
26
+ Handlebars.registerHelper('pyStr', function (str) {
27
+ return escapePyString(String(str ?? ''));
28
+ });
19
29
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
30
  export function renderPythonTemplate(name, data) {
21
31
  if (!pythonTemplateCache.has(name)) {
@@ -1 +1 @@
1
- {"version":3,"file":"python-template-loader.js","sourceRoot":"","sources":["../../src/emitter/python-template-loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,mBAAmB,GAAG,OAAO,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;AAEnE,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAuC,CAAC;AAE3E,UAAU,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,CAAU,EAAE,CAAU;IAC9D,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC;AAEH,UAAU,CAAC,cAAc,CAAC,aAAa,EAAE,UAAU,GAAW;IAC5D,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACjE,CAAC,CAAC,CAAC;AAEH,8DAA8D;AAC9D,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,IAAS;IAC1D,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,OAAO,CAAC,mBAAmB,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;QACjE,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,mBAAmB,GAAG,GAAG,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAChD,mBAAmB,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"python-template-loader.js","sourceRoot":"","sources":["../../src/emitter/python-template-loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,mBAAmB,GAAG,OAAO,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;AAEnE,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAuC,CAAC;AAE3E,UAAU,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,CAAU,EAAE,CAAU;IAC9D,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC;AAEH,4EAA4E;AAC5E,8DAA8D;AAC9D,UAAU,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,CAAU,EAAE,CAAU;IAC9D,OAAO,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC,CAAC,CAAC;AAEH,UAAU,CAAC,cAAc,CAAC,aAAa,EAAE,UAAU,GAAW;IAC5D,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACjE,CAAC,CAAC,CAAC;AAEH,yEAAyE;AACzE,UAAU,CAAC,cAAc,CAAC,OAAO,EAAE,UAAU,GAAY;IACvD,OAAO,cAAc,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC;AAEH,8DAA8D;AAC9D,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,IAAS;IAC1D,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,OAAO,CAAC,mBAAmB,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;QACjE,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,mBAAmB,GAAG,GAAG,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAChD,mBAAmB,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC"}
@@ -3,6 +3,7 @@
3
3
  import os
4
4
  import json
5
5
  import httpx
6
+ from urllib.parse import quote
6
7
  from dotenv import load_dotenv
7
8
  from mcp.server import Server
8
9
  from mcp.server.stdio import stdio_server
@@ -37,7 +38,12 @@ API_KEY = os.environ.get("{{envVarName}}", "")
37
38
  {{/each}}
38
39
 
39
40
  server = Server("{{serverName}}")
40
- client = httpx.AsyncClient(timeout=30.0)
41
+
42
+ # Hard per-request deadline (seconds) and response-size cap (bytes). A stalled or
43
+ # runaway upstream otherwise keeps tool calls alive indefinitely or exhausts memory.
44
+ _REQUEST_TIMEOUT_S = float(os.environ.get("MCP_REQUEST_TIMEOUT_MS", "30000")) / 1000.0
45
+ _MAX_RESPONSE_BYTES = int(os.environ.get("MCP_MAX_RESPONSE_BYTES", str(10 * 1024 * 1024)))
46
+ client = httpx.AsyncClient(timeout=_REQUEST_TIMEOUT_S)
41
47
 
42
48
 
43
49
  def _headers() -> dict[str, str]:
@@ -48,34 +54,98 @@ def _headers() -> dict[str, str]:
48
54
  headers["Authorization"] = f"Bearer {BEARER_TOKEN}"
49
55
  {{/if}}
50
56
  {{#if (eq type "apiKey")}}
57
+ {{#if (eq in "header")}}
58
+ if API_KEY:
59
+ headers["{{pyStr headerName}}"] = API_KEY
60
+ {{/if}}
61
+ {{#if (eq in "cookie")}}
62
+ # API key sent as a cookie — appended to the Cookie header.
51
63
  if API_KEY:
52
- headers["{{headerName}}"] = API_KEY
64
+ _existing = headers.get("Cookie")
65
+ _pair = "{{pyStr headerName}}=" + quote(str(API_KEY), safe="")
66
+ headers["Cookie"] = (_existing + "; " + _pair) if _existing else _pair
67
+ {{/if}}
53
68
  {{/if}}
54
69
  {{/each}}
55
70
  return headers
56
71
 
57
72
 
73
+ def _auth_query_params() -> dict[str, str]:
74
+ # apiKey-in-query auth: the key is sent as a query parameter, not a header.
75
+ params: dict[str, str] = {}
76
+ {{#each authSchemes}}
77
+ {{#if (eq type "apiKey")}}
78
+ {{#if (eq in "query")}}
79
+ if API_KEY:
80
+ params["{{pyStr headerName}}"] = API_KEY
81
+ {{/if}}
82
+ {{/if}}
83
+ {{/each}}
84
+ return params
85
+
86
+
58
87
  {{#each tools}}
59
88
  @server.tool()
60
- async def {{functionName}}({{#each pathParams}}{{this}}: str, {{/each}}{{#each queryParams}}{{this}}: str = "", {{/each}}{{#if hasRequestBody}}body: dict | None = None{{/if}}) -> list[TextContent]:
89
+ async def {{functionName}}({{#each pyPathParams}}{{pyName}}: str, {{/each}}{{#each pyQueryParams}}{{pyName}}: str = "", {{/each}}{{#each pyHeaderParams}}{{pyName}}: str = "", {{/each}}{{#each pyCookieParams}}{{pyName}}: str = "", {{/each}}{{#if hasRequestBody}}body: dict | None = None{{/if}}) -> list[TextContent]:
61
90
  """{{pyDocstring description}}"""
62
- url = f"{BASE_URL}{{{pathTemplate}}}"
63
- {{#if queryParams.length}}
64
- params = { {{#each queryParams}}"{{this}}": {{this}}, {{/each}} }
91
+ url = BASE_URL + "{{pyStr pathTemplate}}"
92
+ {{#each pyPathParams}}
93
+ url = url.replace("{{pyStr brace}}", quote(str({{pyName}}), safe=""))
94
+ {{/each}}
95
+ {{#if pyQueryParams.length}}
96
+ params = { {{#each pyQueryParams}}"{{pyStr apiName}}": {{pyName}}, {{/each}} }
65
97
  params = {k: v for k, v in params.items() if v}
98
+ {{#if @root.hasQueryApiKey}}
99
+ params.update(_auth_query_params())
100
+ {{/if}}
101
+ {{else}}
102
+ {{#if @root.hasQueryApiKey}}
103
+ params = _auth_query_params()
104
+ {{/if}}
105
+ {{/if}}
106
+ {{#if (or pyHeaderParams.length pyCookieParams.length)}}
107
+ # Per-request header/cookie params (D-H2): sent under their original wire
108
+ # names, merged over the auth headers. Empty values are omitted.
109
+ req_headers = dict(_headers())
110
+ {{#each pyHeaderParams}}
111
+ if {{pyName}}:
112
+ req_headers["{{pyStr wireName}}"] = {{pyName}}
113
+ {{/each}}
114
+ {{#if pyCookieParams.length}}
115
+ _cookie_parts = []
116
+ {{#each pyCookieParams}}
117
+ if {{pyName}}:
118
+ _cookie_parts.append("{{pyStr wireName}}=" + quote(str({{pyName}}), safe=""))
119
+ {{/each}}
120
+ if _cookie_parts:
121
+ _existing = req_headers.get("Cookie")
122
+ _joined = "; ".join(_cookie_parts)
123
+ req_headers["Cookie"] = (_existing + "; " + _joined) if _existing else _joined
124
+ {{/if}}
66
125
  {{/if}}
67
126
  try:
68
127
  resp = await client.request(
69
128
  "{{method}}",
70
129
  url,
71
- headers=_headers(),
72
- {{#if queryParams.length}}
130
+ headers={{#if (or pyHeaderParams.length pyCookieParams.length)}}req_headers{{else}}_headers(){{/if}},
131
+ {{#if (or queryParams.length @root.hasQueryApiKey)}}
73
132
  params=params,
74
133
  {{/if}}
75
134
  {{#if hasRequestBody}}
135
+ {{#if (eq bodyEncoding "form")}}
136
+ data=body,
137
+ {{else}}
138
+ {{#if (eq bodyEncoding "multipart")}}
139
+ files=body,
140
+ {{else}}
76
141
  json=body,
77
142
  {{/if}}
143
+ {{/if}}
144
+ {{/if}}
78
145
  )
146
+ # Cap the buffered response so a runaway upstream cannot exhaust memory.
147
+ if len(resp.content) > _MAX_RESPONSE_BYTES:
148
+ return [TextContent(type="text", text=f"Error: response exceeded {_MAX_RESPONSE_BYTES}-byte cap")]
79
149
  data = resp.json() if resp.headers.get("content-type", "").startswith("application/json") else resp.text
80
150
  return [TextContent(type="text", text=json.dumps(data, indent=2) if isinstance(data, (dict, list)) else str(data))]
81
151
  except Exception as e:
@@ -18,6 +18,16 @@ const sessions = new Map<string, BrowserSession>();
18
18
  let idleTimer: ReturnType<typeof setInterval> | undefined;
19
19
  let config: BrowserConfig;
20
20
 
21
+ // In-flight session creations, keyed by session id. Single-flighting per id
22
+ // means concurrent no-ID calls (which all resolve to DEFAULT_SESSION) and
23
+ // repeated calls with the same explicit id share one Chromium context instead
24
+ // of racing to create several.
25
+ const sessionCreations = new Map<string, Promise<{ page: Page; sessionId: string }>>();
26
+
27
+ // Single-flight the browser launch so concurrent cold starts can't spawn
28
+ // multiple Chromium processes.
29
+ let browserLaunch: Promise<Browser> | undefined;
30
+
21
31
  const DEFAULT_SESSION = '__default__';
22
32
 
23
33
  /**
@@ -78,10 +88,37 @@ export async function resolveSelector(
78
88
  }
79
89
  }
80
90
 
91
+ /**
92
+ * Launch the shared browser, single-flighting concurrent cold starts so two
93
+ * simultaneous requests can never spawn two Chromium processes.
94
+ */
95
+ async function getBrowser(): Promise<Browser> {
96
+ if (browser && browser.isConnected()) return browser;
97
+ if (browserLaunch) return browserLaunch;
98
+
99
+ // Only disable sandbox when running as root in a container.
100
+ const isRoot = process.getuid?.() === 0;
101
+ browserLaunch = chromium
102
+ .launch({
103
+ headless: config.headless,
104
+ args: isRoot ? ['--no-sandbox', '--disable-setuid-sandbox'] : [],
105
+ })
106
+ .then((b) => {
107
+ browser = b;
108
+ return b;
109
+ })
110
+ .finally(() => {
111
+ browserLaunch = undefined;
112
+ });
113
+ return browserLaunch;
114
+ }
115
+
81
116
  /**
82
117
  * Get or create a browser session.
83
118
  * If sessionId is provided, reuses an existing session or creates one with that ID.
84
- * If not, creates a new session with a generated ID.
119
+ * If not, reuses (or creates) a single shared default session under a fixed ID,
120
+ * so repeat no-ID calls and `take_screenshot` without an ID all hit the same
121
+ * context instead of leaking a new Chromium context per call.
85
122
  * Throws if the session pool is at capacity (maxSessions).
86
123
  */
87
124
  export async function getOrCreateSession(sessionId?: string): Promise<{ page: Page; sessionId: string }> {
@@ -95,7 +132,23 @@ export async function getOrCreateSession(sessionId?: string): Promise<{ page: Pa
95
132
  return { page: existing.page, sessionId: id };
96
133
  }
97
134
 
98
- // Check capacity before creating a new session
135
+ // Coalesce concurrent creations for the same id (notably the default
136
+ // session) onto one promise so we don't create duplicate contexts or
137
+ // double-count capacity.
138
+ const inFlight = sessionCreations.get(id);
139
+ if (inFlight) return inFlight;
140
+
141
+ const creation = createSession(id).finally(() => {
142
+ sessionCreations.delete(id);
143
+ });
144
+ sessionCreations.set(id, creation);
145
+ return creation;
146
+ }
147
+
148
+ async function createSession(id: string): Promise<{ page: Page; sessionId: string }> {
149
+ // Reserve the capacity slot BEFORE any await so concurrent creations of
150
+ // distinct ids can't all pass the gate and then blow past maxSessions. We
151
+ // insert a placeholder entry now and fill in the real handles below.
99
152
  const maxSessions = config.maxSessions ?? 10;
100
153
  if (sessions.size >= maxSessions) {
101
154
  throw new Error(
@@ -103,38 +156,33 @@ export async function getOrCreateSession(sessionId?: string): Promise<{ page: Pa
103
156
  'Close an existing session before creating a new one.'
104
157
  );
105
158
  }
159
+ const reserved: BrowserSession = {
160
+ context: undefined as unknown as BrowserContext,
161
+ page: undefined as unknown as Page,
162
+ lastAccessedAt: Date.now(),
163
+ };
164
+ sessions.set(id, reserved);
106
165
 
107
- // Launch browser if not running
108
- if (!browser || !browser.isConnected()) {
109
- // Only disable sandbox when running as root in a container
110
- const isRoot = process.getuid?.() === 0;
111
- browser = await chromium.launch({
112
- headless: config.headless,
113
- args: isRoot ? ['--no-sandbox', '--disable-setuid-sandbox'] : [],
166
+ try {
167
+ const activeBrowser = await getBrowser();
168
+ const context = await activeBrowser.newContext({
169
+ viewport: config.viewport,
170
+ ...(config.userAgent ? { userAgent: config.userAgent } : {}),
114
171
  });
115
- }
116
-
117
- // Create new session
118
- const context = await browser.newContext({
119
- viewport: config.viewport,
120
- ...(config.userAgent ? { userAgent: config.userAgent } : {}),
121
- });
122
- const page = await context.newPage();
172
+ const page = await context.newPage();
123
173
 
124
- // Generate final session ID upfront to avoid race conditions
125
- const finalId = id === DEFAULT_SESSION
126
- ? `session_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`
127
- : id;
174
+ reserved.context = context;
175
+ reserved.page = page;
176
+ reserved.lastAccessedAt = Date.now();
128
177
 
129
- sessions.set(finalId, {
130
- context,
131
- page,
132
- lastAccessedAt: Date.now(),
133
- });
134
-
135
- resetIdleTimer();
178
+ resetIdleTimer();
136
179
 
137
- return { page, sessionId: finalId };
180
+ return { page, sessionId: id };
181
+ } catch (err) {
182
+ // Release the reserved slot if context creation failed.
183
+ sessions.delete(id);
184
+ throw err;
185
+ }
138
186
  }
139
187
 
140
188
  /**
@@ -145,7 +193,7 @@ export async function closeSession(sessionId?: string): Promise<void> {
145
193
  const session = sessions.get(id);
146
194
  if (!session) return;
147
195
 
148
- await session.context.close().catch(() => {});
196
+ await session.context?.close().catch(() => {});
149
197
  sessions.delete(id);
150
198
 
151
199
  // If no sessions remain, close the browser
@@ -161,7 +209,7 @@ export async function closeBrowser(): Promise<void> {
161
209
  clearIdleTimer();
162
210
 
163
211
  for (const [id, session] of sessions) {
164
- await session.context.close().catch(() => {});
212
+ await session.context?.close().catch(() => {});
165
213
  sessions.delete(id);
166
214
  }
167
215
 
@@ -207,8 +255,9 @@ function resetIdleTimer(): void {
207
255
  clearIdleTimer();
208
256
  idleTimer = setInterval(() => {
209
257
  const now = Date.now();
210
- // Close idle sessions
258
+ // Close idle sessions. Skip slots still being created (no context yet).
211
259
  for (const [id, session] of sessions) {
260
+ if (!session.context) continue;
212
261
  if (now - session.lastAccessedAt > config.idleTimeoutMs) {
213
262
  session.context.close().catch(() => {});
214
263
  sessions.delete(id);
@@ -14,12 +14,19 @@ function log(level: string, message: string, data?: Record<string, unknown>): vo
14
14
  const config = loadConfig();
15
15
  initBrowserManager(config.browser);
16
16
 
17
- const server = new McpServer({
18
- name: '{{serverName}}',
19
- version: '{{serverVersion}}',
20
- });
21
-
22
- registerAllTools(server, config);
17
+ /* Build a fully-registered McpServer. A single McpServer connected to multiple
18
+ * transports concurrently races on its internal transport reference (the API
19
+ * HTTP template documents the same hazard), so HTTP requests get a fresh,
20
+ * stateless server + transport per request instead of sharing one global
21
+ * instance. */
22
+ function createMcpServer(): McpServer {
23
+ const server = new McpServer({
24
+ name: '{{serverName}}',
25
+ version: '{{serverVersion}}',
26
+ });
27
+ registerAllTools(server, config);
28
+ return server;
29
+ }
23
30
 
24
31
  let isReady = false;
25
32
 
@@ -72,8 +79,17 @@ if (process.env.TRANSPORT === 'http') {
72
79
  }
73
80
  }
74
81
 
82
+ // Fresh stateless server + transport per request. Both are closed when
83
+ // the response finishes or the connection aborts, so transports and
84
+ // their listeners are never leaked and concurrent requests can't
85
+ // misroute through a shared transport reference.
86
+ const reqServer = createMcpServer();
75
87
  const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
76
- await server.connect(transport);
88
+ res.on('close', () => {
89
+ void transport.close();
90
+ void reqServer.close();
91
+ });
92
+ await reqServer.connect(transport);
77
93
  await transport.handleRequest(req, res);
78
94
  return;
79
95
  }
@@ -97,6 +113,8 @@ if (process.env.TRANSPORT === 'http') {
97
113
  process.on('SIGTERM', shutdown);
98
114
  process.on('SIGINT', shutdown);
99
115
  } else {
116
+ // Stdio is inherently single-connection, so one long-lived server is correct.
117
+ const server = createMcpServer();
100
118
  const transport = new StdioServerTransport();
101
119
  await server.connect(transport);
102
120
  isReady = true;
@@ -45,8 +45,8 @@ export function register(server: McpServer, config: AppConfig): void {
45
45
  {{#each form.fields}}
46
46
  {{#unless (eq fieldType "hidden")}}
47
47
  {{#if (eq fieldType "checkbox")}}
48
- if ((input as Record<string, unknown>)['{{jsString name}}'] !== undefined) {
49
- const checked = Boolean((input as Record<string, unknown>)['{{jsString name}}']);
48
+ if ((input as Record<string, unknown>)['{{jsString inputKey}}'] !== undefined) {
49
+ const checked = Boolean((input as Record<string, unknown>)['{{jsString inputKey}}']);
50
50
  const fieldSelector = await resolveSelector(page, ['{{jsString selector.primary}}'{{#each selector.fallbacks}}, '{{jsString this}}'{{/each}}]);
51
51
  if (checked) {
52
52
  await page.check(fieldSelector);
@@ -55,21 +55,23 @@ export function register(server: McpServer, config: AppConfig): void {
55
55
  }
56
56
  }
57
57
  {{else if (eq fieldType "select")}}
58
- if ((input as Record<string, unknown>)['{{jsString name}}'] !== undefined) {
58
+ if ((input as Record<string, unknown>)['{{jsString inputKey}}'] !== undefined) {
59
59
  const fieldSelector = await resolveSelector(page, ['{{jsString selector.primary}}'{{#each selector.fallbacks}}, '{{jsString this}}'{{/each}}]);
60
- await page.selectOption(fieldSelector, String((input as Record<string, unknown>)['{{jsString name}}']));
60
+ // The schema enum is built from option VALUES, and selectOption
61
+ // matches by value, so pass the value through directly.
62
+ await page.selectOption(fieldSelector, String((input as Record<string, unknown>)['{{jsString inputKey}}']));
61
63
  }
62
64
  {{else if (eq fieldType "radio")}}
63
- if ((input as Record<string, unknown>)['{{jsString name}}'] !== undefined) {
65
+ if ((input as Record<string, unknown>)['{{jsString inputKey}}'] !== undefined) {
64
66
  const radioName = '{{jsString name}}';
65
- const radioValue = String((input as Record<string, unknown>)['{{jsString name}}']).replace(/["\\[\]()]/g, '\\$&');
67
+ const radioValue = String((input as Record<string, unknown>)['{{jsString inputKey}}']).replace(/["\\[\]()]/g, '\\$&');
66
68
  const radioNameSel = radioName.replace(/["\\]/g, '\\$&');
67
69
  await page.check(`input[name="${radioNameSel}"][value="${radioValue}"]`);
68
70
  }
69
71
  {{else}}
70
- if ((input as Record<string, unknown>)['{{jsString name}}'] !== undefined) {
72
+ if ((input as Record<string, unknown>)['{{jsString inputKey}}'] !== undefined) {
71
73
  const fieldSelector = await resolveSelector(page, ['{{jsString selector.primary}}'{{#each selector.fallbacks}}, '{{jsString this}}'{{/each}}]);
72
- await page.fill(fieldSelector, String((input as Record<string, unknown>)['{{jsString name}}']));
74
+ await page.fill(fieldSelector, String((input as Record<string, unknown>)['{{jsString inputKey}}']));
73
75
  }
74
76
  {{/if}}
75
77
  {{/unless}}
@@ -1 +1 @@
1
- {"version":3,"file":"template-loader.d.ts","sourceRoot":"","sources":["../../src/emitter/template-loader.ts"],"names":[],"mappings":"AAoBA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,MAAM,CAU9D"}
1
+ {"version":3,"file":"template-loader.d.ts","sourceRoot":"","sources":["../../src/emitter/template-loader.ts"],"names":[],"mappings":"AA8BA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,MAAM,CAU9D"}
@@ -13,6 +13,15 @@ Handlebars.registerHelper('capitalize', function (str) {
13
13
  return str;
14
14
  return str.charAt(0).toUpperCase() + str.slice(1);
15
15
  });
16
+ // Emit a value as a valid JS/TS literal via JSON.stringify. Safe for embedding
17
+ // untrusted spec-derived strings (e.g. OpenAPI security-scheme names) into
18
+ // generated code: JSON.stringify produces a double-quoted literal with all
19
+ // special characters escaped, so the value can never break out of the literal.
20
+ // Registered on the shared Handlebars singleton, so worker templates (which
21
+ // import the same instance) can use it too.
22
+ Handlebars.registerHelper('json', function (value) {
23
+ return JSON.stringify(value === undefined ? null : value);
24
+ });
16
25
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
26
  export function renderTemplate(name, data) {
18
27
  if (!templateCache.has(name)) {
@@ -1 +1 @@
1
- {"version":3,"file":"template-loader.js","sourceRoot":"","sources":["../../src/emitter/template-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AAErD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAuC,CAAC;AAErE,UAAU,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,CAAU,EAAE,CAAU;IAC9D,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC;AAEH,UAAU,CAAC,cAAc,CAAC,YAAY,EAAE,UAAU,GAAW;IAC3D,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC;IACrB,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC,CAAC;AAEH,8DAA8D;AAC9D,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,IAAS;IACpD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,YAAY,GAAG,GAAG,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAChD,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"template-loader.js","sourceRoot":"","sources":["../../src/emitter/template-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AAErD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAuC,CAAC;AAErE,UAAU,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,CAAU,EAAE,CAAU;IAC9D,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC;AAEH,UAAU,CAAC,cAAc,CAAC,YAAY,EAAE,UAAU,GAAW;IAC3D,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC;IACrB,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAC/E,2EAA2E;AAC3E,2EAA2E;AAC3E,+EAA+E;AAC/E,4EAA4E;AAC5E,4CAA4C;AAC5C,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE,UAAU,KAAc;IACxD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC,CAAC,CAAC;AAEH,8DAA8D;AAC9D,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,IAAS;IACpD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,YAAY,GAAG,GAAG,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAChD,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC"}