@frontmcp/uipack 0.6.2 → 0.7.1

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 (60) hide show
  1. package/CLAUDE.md +0 -14
  2. package/adapters/index.js +50 -47
  3. package/adapters/platform-meta.d.ts.map +1 -1
  4. package/adapters/response-builder.d.ts +16 -3
  5. package/adapters/response-builder.d.ts.map +1 -1
  6. package/bridge-runtime/iife-generator.d.ts.map +1 -1
  7. package/bridge-runtime/index.js +4 -0
  8. package/build/builders/base-builder.d.ts +2 -0
  9. package/build/builders/base-builder.d.ts.map +1 -1
  10. package/build/index.d.ts +1 -1
  11. package/build/index.d.ts.map +1 -1
  12. package/build/index.js +81 -75
  13. package/bundler/file-cache/component-builder.d.ts.map +1 -1
  14. package/bundler/index.js +40 -36
  15. package/dependency/import-map.d.ts.map +1 -1
  16. package/dependency/index.js +22 -29
  17. package/esm/adapters/index.mjs +52 -42
  18. package/esm/bridge-runtime/index.mjs +4 -0
  19. package/esm/build/index.mjs +50 -38
  20. package/esm/bundler/index.mjs +25 -14
  21. package/esm/dependency/index.mjs +18 -18
  22. package/esm/handlebars/index.mjs +9 -8
  23. package/esm/index.mjs +136 -136
  24. package/esm/package.json +16 -17
  25. package/esm/registry/index.mjs +57 -50
  26. package/esm/renderers/index.mjs +19 -22
  27. package/esm/runtime/index.mjs +16 -15
  28. package/esm/theme/index.mjs +8 -0
  29. package/esm/tool-template/index.mjs +23 -15
  30. package/esm/typings/index.mjs +4 -0
  31. package/esm/utils/index.mjs +9 -56
  32. package/esm/validation/index.mjs +9 -8
  33. package/handlebars/index.js +4 -10
  34. package/index.js +215 -221
  35. package/package.json +3 -2
  36. package/preview/generic-preview.d.ts +4 -5
  37. package/preview/generic-preview.d.ts.map +1 -1
  38. package/preview/types.d.ts +15 -1
  39. package/preview/types.d.ts.map +1 -1
  40. package/registry/index.js +65 -64
  41. package/registry/render-template.d.ts.map +1 -1
  42. package/renderers/index.js +20 -29
  43. package/renderers/utils/detect.d.ts.map +1 -1
  44. package/renderers/utils/transpiler.d.ts.map +1 -1
  45. package/runtime/index.js +20 -25
  46. package/runtime/sanitizer.d.ts.map +1 -1
  47. package/theme/css-to-theme.d.ts +0 -27
  48. package/theme/css-to-theme.d.ts.map +1 -1
  49. package/theme/index.js +8 -0
  50. package/tool-template/index.js +30 -28
  51. package/typings/dts-parser.d.ts.map +1 -1
  52. package/typings/index.js +4 -0
  53. package/utils/index.d.ts +2 -3
  54. package/utils/index.d.ts.map +1 -1
  55. package/utils/index.js +7 -63
  56. package/validation/index.js +6 -12
  57. package/utils/escape-html.d.ts +0 -102
  58. package/utils/escape-html.d.ts.map +0 -1
  59. package/utils/safe-stringify.d.ts +0 -30
  60. package/utils/safe-stringify.d.ts.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@frontmcp/uipack",
3
- "version": "0.6.2",
3
+ "version": "0.7.1",
4
4
  "description": "FrontMCP UIpack - Bundling, build tools, and platform adapters for MCP UI development (React-free core)",
5
5
  "author": "AgentFront <info@agentfront.dev>",
6
6
  "homepage": "https://docs.agentfront.dev",
@@ -55,8 +55,9 @@
55
55
  "./esm": null
56
56
  },
57
57
  "dependencies": {
58
+ "@frontmcp/utils": "0.7.1",
58
59
  "@swc/core": "^1.5.0",
59
- "enclave-vm": "^1.0.3",
60
+ "enclave-vm": "^2.7.0",
60
61
  "esbuild": "^0.27.1",
61
62
  "handlebars": "^4.7.8",
62
63
  "zod": "^4.0.0"
@@ -2,9 +2,8 @@
2
2
  * Generic Preview Handler
3
3
  *
4
4
  * Generates metadata for generic MCP clients.
5
- * Uses frontmcp/* namespace with ui/* fallback for compatibility.
6
- *
7
- * Behaves like OpenAI but with different metadata namespaces.
5
+ * Uses ui/* namespace for maximum compatibility with MCP clients
6
+ * (Claude, Cursor, etc.).
8
7
  *
9
8
  * @packageDocumentation
10
9
  */
@@ -12,8 +11,8 @@ import type { PreviewHandler, DiscoveryPreviewOptions, ExecutionPreviewOptions,
12
11
  /**
13
12
  * Preview handler for generic MCP clients.
14
13
  *
15
- * Uses the same patterns as OpenAI but with frontmcp/* namespace
16
- * and ui/* fallback for maximum compatibility.
14
+ * Uses the ui/* namespace for maximum compatibility with
15
+ * MCP clients (Claude, Cursor, etc.).
17
16
  *
18
17
  * @example
19
18
  * ```typescript
@@ -1 +1 @@
1
- {"version":3,"file":"generic-preview.d.ts","sourceRoot":"","sources":["../../src/preview/generic-preview.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,uBAAuB,EACvB,uBAAuB,EACvB,aAAa,EACb,aAAa,EAGd,MAAM,SAAS,CAAC;AAsBjB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,cAAe,YAAW,cAAc;IACnD,QAAQ,CAAC,QAAQ,EAAG,SAAS,CAAU;IAEvC;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,uBAAuB,GAAG,aAAa;IAkB7D;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,uBAAuB,GAAG,aAAa;IAsB7D,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,kBAAkB;IA4B1B,OAAO,CAAC,kBAAkB;IA+B1B,OAAO,CAAC,kBAAkB;IAwB1B;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAuCzB;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;CA6BhC"}
1
+ {"version":3,"file":"generic-preview.d.ts","sourceRoot":"","sources":["../../src/preview/generic-preview.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,uBAAuB,EACvB,uBAAuB,EACvB,aAAa,EACb,aAAa,EAGd,MAAM,SAAS,CAAC;AAsBjB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,cAAe,YAAW,cAAc;IACnD,QAAQ,CAAC,QAAQ,EAAG,SAAS,CAAU;IAEvC;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,uBAAuB,GAAG,aAAa;IAkB7D;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,uBAAuB,GAAG,aAAa;IAsB7D,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,kBAAkB;IAkB1B,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,kBAAkB;IA2B1B,OAAO,CAAC,kBAAkB;IA8B1B,OAAO,CAAC,kBAAkB;IAuB1B;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAuCzB;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;CA6BhC"}
@@ -165,7 +165,15 @@ export interface ClaudeMetaFields {
165
165
  'claude/prefersBorder'?: boolean;
166
166
  }
167
167
  /**
168
- * FrontMCP/Generic metadata fields.
168
+ * Generic MCP metadata fields.
169
+ * Uses ui/* namespace for maximum compatibility with MCP clients.
170
+ *
171
+ * Note: This type includes both legacy frontmcp/* and new ui/* keys
172
+ * for type compatibility during the migration period. New code should
173
+ * only emit ui/* keys. The frontmcp/* keys will be removed in a future
174
+ * major version.
175
+ *
176
+ * @deprecated frontmcp/* keys are deprecated - use ui/* keys instead
169
177
  */
170
178
  export interface FrontMCPMetaFields {
171
179
  'frontmcp/html'?: string;
@@ -177,6 +185,12 @@ export interface FrontMCPMetaFields {
177
185
  };
178
186
  'ui/html'?: string;
179
187
  'ui/mimeType'?: string;
188
+ 'ui/resourceUri'?: string;
189
+ 'ui/component'?: string;
190
+ 'ui/widgetCSP'?: {
191
+ connectDomains?: string[];
192
+ resourceDomains?: string[];
193
+ };
180
194
  }
181
195
  /**
182
196
  * Combined metadata fields for all platforms.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/preview/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/preview/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG7D,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAMhE;;;;;;;;;;GAUG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAMvD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,WAAW,EAAE,aAAa,CAAC;IAE3B;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,WAAW,EAAE,aAAa,CAAC;IAE3B;;OAEG;IACH,KAAK,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAEzB;;OAEG;IACH,WAAW,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;IAErC;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAMD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE/B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE/B;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAMD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAE5B;;;;;OAKG;IACH,YAAY,CAAC,OAAO,EAAE,uBAAuB,GAAG,aAAa,CAAC;IAE9D;;;;;OAKG;IACH,YAAY,CAAC,OAAO,EAAE,uBAAuB,GAAG,aAAa,CAAC;CAC/D;AAMD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE;QACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC7B,CAAC;IACF,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,oBAAoB,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;IAC9C,+BAA+B,CAAC,EAAE,OAAO,CAAC;CAC3C;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,kBAAkB;IAEjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE;QACrB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC7B,CAAC;IAEF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE;QACf,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5B,CAAC;CACH;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,kBAAkB,CAAC"}
package/registry/index.js CHANGED
@@ -570,31 +570,12 @@ var init_theme2 = __esm({
570
570
  }
571
571
  });
572
572
 
573
- // libs/uipack/src/utils/escape-html.ts
574
- function escapeHtml(str) {
575
- if (str === null || str === void 0) {
576
- return "";
577
- }
578
- const s = String(str);
579
- return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
580
- }
581
- function escapeJsString(str) {
582
- return str.replace(/\\/g, "\\\\").replace(/'/g, "\\'").replace(/"/g, '\\"').replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
583
- }
584
- function escapeScriptClose(jsonString) {
585
- return jsonString.replace(/<\//g, "<\\/");
586
- }
587
- var init_escape_html = __esm({
588
- "libs/uipack/src/utils/escape-html.ts"() {
589
- "use strict";
590
- }
591
- });
592
-
593
573
  // libs/uipack/src/utils/index.ts
574
+ var import_utils;
594
575
  var init_utils = __esm({
595
576
  "libs/uipack/src/utils/index.ts"() {
596
577
  "use strict";
597
- init_escape_html();
578
+ import_utils = require("@frontmcp/utils");
598
579
  }
599
580
  });
600
581
 
@@ -848,6 +829,9 @@ function isTemplateBuilderFunction(fn) {
848
829
  return true;
849
830
  }
850
831
  function containsJsx(source) {
832
+ if (source.length > MAX_TEMPLATE_LENGTH) {
833
+ return false;
834
+ }
851
835
  if (/<[A-Z][a-zA-Z0-9]*(\s|>|\/)/.test(source)) {
852
836
  return true;
853
837
  }
@@ -872,6 +856,9 @@ function containsJsx(source) {
872
856
  return false;
873
857
  }
874
858
  function containsMdxSyntax(source) {
859
+ if (source.length > MAX_TEMPLATE_LENGTH) {
860
+ return false;
861
+ }
875
862
  if (/<[A-Z][a-zA-Z0-9]*/.test(source)) {
876
863
  return true;
877
864
  }
@@ -945,9 +932,11 @@ function detectTemplateType(template) {
945
932
  reason: "Unknown template type, defaulting to HTML"
946
933
  };
947
934
  }
935
+ var MAX_TEMPLATE_LENGTH;
948
936
  var init_detect = __esm({
949
937
  "libs/uipack/src/renderers/utils/detect.ts"() {
950
938
  "use strict";
939
+ MAX_TEMPLATE_LENGTH = 5e4;
951
940
  }
952
941
  });
953
942
 
@@ -1137,7 +1126,7 @@ var init_helpers = __esm({
1137
1126
  idCounter = 0;
1138
1127
  builtinHelpers = {
1139
1128
  // Escaping
1140
- escapeHtml,
1129
+ escapeHtml: import_utils.escapeHtml,
1141
1130
  // Formatting
1142
1131
  formatDate,
1143
1132
  formatCurrency,
@@ -1308,7 +1297,7 @@ __export(handlebars_exports, {
1308
1297
  createHandlebarsRenderer: () => createHandlebarsRenderer,
1309
1298
  defaultValue: () => defaultValue,
1310
1299
  eq: () => eq,
1311
- escapeHtml: () => escapeHtml,
1300
+ escapeHtml: () => import_utils.escapeHtml,
1312
1301
  extractAll: () => extractAll,
1313
1302
  extractExpressions: () => extractExpressions,
1314
1303
  extractInputPaths: () => extractInputPaths,
@@ -1954,12 +1943,12 @@ var init_mdx_client_renderer = __esm({
1954
1943
  ...outputProps,
1955
1944
  ...props
1956
1945
  };
1957
- const escapedMdx = escapeScriptClose(JSON.stringify(template));
1958
- const escapedProps = escapeScriptClose(JSON.stringify(spreadProps));
1959
- const safeContainerId = escapeJsString(containerId);
1960
- const loadingHtml = showLoading ? `<div class="mdx-loading">${escapeHtml(loadingMessage)}</div>` : "";
1946
+ const escapedMdx = (0, import_utils.escapeScriptClose)(JSON.stringify(template));
1947
+ const escapedProps = (0, import_utils.escapeScriptClose)(JSON.stringify(spreadProps));
1948
+ const safeContainerId = (0, import_utils.escapeJsString)(containerId);
1949
+ const loadingHtml = showLoading ? `<div class="mdx-loading">${(0, import_utils.escapeHtml)(loadingMessage)}</div>` : "";
1961
1950
  return `
1962
- <div id="${escapeHtml(containerId)}">${loadingHtml}</div>
1951
+ <div id="${(0, import_utils.escapeHtml)(containerId)}">${loadingHtml}</div>
1963
1952
  <script type="module">
1964
1953
  (async function() {
1965
1954
  try {
@@ -2031,7 +2020,10 @@ async function loadSwcTransform() {
2031
2020
  return swcTransform;
2032
2021
  }
2033
2022
  try {
2034
- const swc = await import("@swc/core");
2023
+ const swc = await import(
2024
+ /* webpackIgnore: true */
2025
+ "@swc/core"
2026
+ );
2035
2027
  swcTransform = swc.transform;
2036
2028
  return swcTransform;
2037
2029
  } catch {
@@ -2164,11 +2156,12 @@ var init_renderers = __esm({
2164
2156
  function sha256(content) {
2165
2157
  return (0, import_crypto.createHash)("sha256").update(content, "utf8").digest("hex");
2166
2158
  }
2167
- var import_crypto;
2159
+ var import_crypto, import_utils6;
2168
2160
  var init_hash_calculator = __esm({
2169
2161
  "libs/uipack/src/bundler/file-cache/hash-calculator.ts"() {
2170
2162
  "use strict";
2171
2163
  import_crypto = require("crypto");
2164
+ import_utils6 = require("@frontmcp/utils");
2172
2165
  }
2173
2166
  });
2174
2167
 
@@ -3019,7 +3012,11 @@ FrontMcpBridge.prototype._setupDataToolCallHandler = function() {
3019
3012
  };
3020
3013
  `.trim();
3021
3014
  }
3015
+ var MAX_MINIFY_CODE_LENGTH = 5e5;
3022
3016
  function minifyJS(code) {
3017
+ if (code.length > MAX_MINIFY_CODE_LENGTH) {
3018
+ return code;
3019
+ }
3023
3020
  return code.replace(/\/\*[\s\S]*?\*\//g, "").replace(/\/\/.*$/gm, "").replace(/\s+/g, " ").replace(/\s*([{};,:()[\]])\s*/g, "$1").replace(/;\}/g, "}").trim();
3024
3021
  }
3025
3022
  function generatePlatformBundle(platform, options = {}) {
@@ -3126,7 +3123,7 @@ function createTemplateHelpers() {
3126
3123
  /**
3127
3124
  * Escape HTML special characters to prevent XSS
3128
3125
  */
3129
- escapeHtml,
3126
+ escapeHtml: import_utils.escapeHtml,
3130
3127
  /**
3131
3128
  * Format a date for display
3132
3129
  */
@@ -3243,7 +3240,7 @@ function wrapToolUIUniversal(options) {
3243
3240
  resourceMode
3244
3241
  });
3245
3242
  const bridgeScript = includeBridge ? BRIDGE_SCRIPT_TAGS.universal : "";
3246
- const pageTitle = title || `${escapeHtml(toolName)} - Tool Result`;
3243
+ const pageTitle = title || `${(0, import_utils.escapeHtml)(toolName)} - Tool Result`;
3247
3244
  return `<!DOCTYPE html>
3248
3245
  <html lang="en">
3249
3246
  <head>
@@ -3468,7 +3465,7 @@ function wrapLeanWidgetShell(options) {
3468
3465
  <head>
3469
3466
  <meta charset="UTF-8">
3470
3467
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
3471
- <title>${escapeHtml(title || toolName)}</title>
3468
+ <title>${(0, import_utils.escapeHtml)(title || toolName)}</title>
3472
3469
  ${fontPreconnect}
3473
3470
  ${fontStylesheets}
3474
3471
  ${tailwindScript}
@@ -3869,7 +3866,7 @@ function wrapHybridWidgetShell(options) {
3869
3866
  <head>
3870
3867
  <meta charset="UTF-8">
3871
3868
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
3872
- <title>${escapeHtml(title || toolName)}</title>
3869
+ <title>${(0, import_utils.escapeHtml)(title || toolName)}</title>
3873
3870
  ${fontPreconnect}
3874
3871
  ${fontStylesheets}
3875
3872
  ${tailwindScript}
@@ -4411,7 +4408,7 @@ function wrapStaticWidgetUniversal(options) {
4411
4408
  }, 100);
4412
4409
  }
4413
4410
  </script>` : "";
4414
- const pageTitle = title || `${escapeHtml(toolName)} - Tool Widget`;
4411
+ const pageTitle = title || `${(0, import_utils.escapeHtml)(toolName)} - Tool Widget`;
4415
4412
  const loaderHtml = isReactBased && componentCode && !hasEmbeddedData ? `
4416
4413
  <!-- Loading State -->
4417
4414
  <div id="frontmcp-loader" style="display: flex; align-items: center; justify-content: center; padding: 2rem; gap: 0.5rem;">
@@ -4461,7 +4458,11 @@ function wrapStaticWidgetUniversal(options) {
4461
4458
  }
4462
4459
 
4463
4460
  // libs/uipack/src/registry/render-template.ts
4461
+ var MAX_MDX_SOURCE_LENGTH = 1e5;
4464
4462
  function containsMdxSyntax2(source) {
4463
+ if (source.length > MAX_MDX_SOURCE_LENGTH) {
4464
+ return false;
4465
+ }
4465
4466
  if (/<[A-Z][a-zA-Z0-9]*/.test(source)) {
4466
4467
  return true;
4467
4468
  }
@@ -4629,16 +4630,13 @@ function buildUIMeta(options) {
4629
4630
  case "generic-mcp":
4630
4631
  case "gemini":
4631
4632
  default:
4632
- meta["frontmcp/html"] = html;
4633
- meta["frontmcp/mimeType"] = "text/html+mcp";
4634
- if (rendererType) meta["frontmcp/type"] = rendererType;
4635
- if (contentHash) meta["frontmcp/contentHash"] = contentHash;
4636
- if (manifestUri) meta["frontmcp/manifestUri"] = manifestUri;
4637
- if (token) meta["frontmcp/widgetToken"] = token;
4638
- if (directUrl) meta["frontmcp/directUrl"] = directUrl;
4639
4633
  meta["ui/html"] = html;
4640
4634
  meta["ui/mimeType"] = "text/html+mcp";
4641
4635
  if (rendererType) meta["ui/type"] = rendererType;
4636
+ if (contentHash) meta["ui/contentHash"] = contentHash;
4637
+ if (manifestUri) meta["ui/manifestUri"] = manifestUri;
4638
+ if (token) meta["ui/widgetToken"] = token;
4639
+ if (directUrl) meta["ui/directUrl"] = directUrl;
4642
4640
  if (platformType === "claude") {
4643
4641
  return buildClaudeMeta(meta, uiConfig);
4644
4642
  } else if (platformType === "gemini") {
@@ -4687,34 +4685,37 @@ function buildIDEMeta(meta, uiConfig) {
4687
4685
  }
4688
4686
  return meta;
4689
4687
  }
4690
- function buildFrontMCPCSP(csp) {
4691
- const result = {};
4692
- if (csp.connectDomains?.length) {
4693
- result.connectDomains = csp.connectDomains;
4694
- }
4695
- if (csp.resourceDomains?.length) {
4696
- result.resourceDomains = csp.resourceDomains;
4697
- }
4698
- return result;
4699
- }
4700
4688
  function buildGenericMeta(meta, uiConfig) {
4701
- if (uiConfig.widgetAccessible) {
4702
- meta["frontmcp/widgetAccessible"] = true;
4703
- }
4704
4689
  if (uiConfig.csp) {
4705
- meta["frontmcp/widgetCSP"] = buildFrontMCPCSP(uiConfig.csp);
4690
+ const csp = {};
4691
+ if (uiConfig.csp.connectDomains?.length) {
4692
+ csp.connectDomains = uiConfig.csp.connectDomains;
4693
+ }
4694
+ if (uiConfig.csp.resourceDomains?.length) {
4695
+ csp.resourceDomains = uiConfig.csp.resourceDomains;
4696
+ }
4697
+ if (Object.keys(csp).length > 0) {
4698
+ meta["ui/csp"] = csp;
4699
+ }
4706
4700
  }
4707
4701
  if (uiConfig.displayMode) {
4708
- meta["frontmcp/displayMode"] = uiConfig.displayMode;
4709
- }
4710
- if (uiConfig.widgetDescription) {
4711
- meta["frontmcp/widgetDescription"] = uiConfig.widgetDescription;
4702
+ const displayModeMap = {
4703
+ inline: "inline",
4704
+ fullscreen: "fullscreen",
4705
+ pip: "pip",
4706
+ widget: "inline",
4707
+ panel: "fullscreen"
4708
+ };
4709
+ const mappedMode = displayModeMap[uiConfig.displayMode];
4710
+ if (mappedMode) {
4711
+ meta["ui/displayMode"] = mappedMode;
4712
+ }
4712
4713
  }
4713
4714
  if (uiConfig.prefersBorder !== void 0) {
4714
- meta["frontmcp/prefersBorder"] = uiConfig.prefersBorder;
4715
+ meta["ui/prefersBorder"] = uiConfig.prefersBorder;
4715
4716
  }
4716
4717
  if (uiConfig.sandboxDomain) {
4717
- meta["frontmcp/domain"] = uiConfig.sandboxDomain;
4718
+ meta["ui/domain"] = uiConfig.sandboxDomain;
4718
4719
  }
4719
4720
  return meta;
4720
4721
  }
@@ -4988,7 +4989,7 @@ function getSchemaPathStrings(schema, prefix = "output") {
4988
4989
  }
4989
4990
 
4990
4991
  // libs/uipack/src/validation/template-validator.ts
4991
- init_expression_extractor();
4992
+ init_handlebars();
4992
4993
  function validateTemplate(template, outputSchema, options = {}) {
4993
4994
  const { inputSchema, warnOnOptional = true, suggestSimilar = true, maxSuggestionDistance = 3 } = options;
4994
4995
  const errors = [];
@@ -5338,7 +5339,7 @@ function safeInputToRecord(input) {
5338
5339
  return {};
5339
5340
  }
5340
5341
  var defaultHelpers = {
5341
- escapeHtml,
5342
+ escapeHtml: import_utils.escapeHtml,
5342
5343
  formatDate: (date, format) => {
5343
5344
  const d = date instanceof Date ? date : new Date(date);
5344
5345
  if (format === "iso") return d.toISOString();
@@ -1 +1 @@
1
- {"version":3,"file":"render-template.d.ts","sourceRoot":"","sources":["../../src/registry/render-template.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAmB,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAOrF;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAsCzD;AAkCD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAyB3D;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,+CAA+C;IAE/C,QAAQ,EAAE,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC;IAC/E,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,4CAA4C;IAC5C,MAAM,EAAE,OAAO,CAAC;IAChB,4CAA4C;IAC5C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,oDAAoD;IAEpD,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACrC;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAuBzE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE;IAAE,EAAE,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,QAAQ,IAAI;IAAE,EAAE,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;CAAE,CAG9G;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmGpG"}
1
+ {"version":3,"file":"render-template.d.ts","sourceRoot":"","sources":["../../src/registry/render-template.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAmB,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAYrF;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CA2CzD;AAkCD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAyB3D;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,+CAA+C;IAE/C,QAAQ,EAAE,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC;IAC/E,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,4CAA4C;IAC5C,MAAM,EAAE,OAAO,CAAC;IAChB,4CAA4C;IAC5C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,oDAAoD;IAEpD,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACrC;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAuBzE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE;IAAE,EAAE,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,QAAQ,IAAI;IAAE,EAAE,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;CAAE,CAG9G;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmGpG"}
@@ -30,31 +30,12 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
30
30
  ));
31
31
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
32
32
 
33
- // libs/uipack/src/utils/escape-html.ts
34
- function escapeHtml(str) {
35
- if (str === null || str === void 0) {
36
- return "";
37
- }
38
- const s = String(str);
39
- return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
40
- }
41
- function escapeJsString(str) {
42
- return str.replace(/\\/g, "\\\\").replace(/'/g, "\\'").replace(/"/g, '\\"').replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
43
- }
44
- function escapeScriptClose(jsonString) {
45
- return jsonString.replace(/<\//g, "<\\/");
46
- }
47
- var init_escape_html = __esm({
48
- "libs/uipack/src/utils/escape-html.ts"() {
49
- "use strict";
50
- }
51
- });
52
-
53
33
  // libs/uipack/src/utils/index.ts
34
+ var import_utils;
54
35
  var init_utils = __esm({
55
36
  "libs/uipack/src/utils/index.ts"() {
56
37
  "use strict";
57
- init_escape_html();
38
+ import_utils = require("@frontmcp/utils");
58
39
  }
59
40
  });
60
41
 
@@ -244,7 +225,7 @@ var init_helpers = __esm({
244
225
  idCounter = 0;
245
226
  builtinHelpers = {
246
227
  // Escaping
247
- escapeHtml,
228
+ escapeHtml: import_utils.escapeHtml,
248
229
  // Formatting
249
230
  formatDate,
250
231
  formatCurrency,
@@ -415,7 +396,7 @@ __export(handlebars_exports, {
415
396
  createHandlebarsRenderer: () => createHandlebarsRenderer,
416
397
  defaultValue: () => defaultValue,
417
398
  eq: () => eq,
418
- escapeHtml: () => escapeHtml,
399
+ escapeHtml: () => import_utils.escapeHtml,
419
400
  extractAll: () => extractAll,
420
401
  extractExpressions: () => extractExpressions,
421
402
  extractInputPaths: () => extractInputPaths,
@@ -932,6 +913,7 @@ var CLAUDE_PLATFORM = {
932
913
  };
933
914
 
934
915
  // libs/uipack/src/renderers/utils/detect.ts
916
+ var MAX_TEMPLATE_LENGTH = 5e4;
935
917
  function isReactComponent(value) {
936
918
  if (typeof value !== "function") {
937
919
  return false;
@@ -960,6 +942,9 @@ function isTemplateBuilderFunction(fn) {
960
942
  return true;
961
943
  }
962
944
  function containsJsx(source) {
945
+ if (source.length > MAX_TEMPLATE_LENGTH) {
946
+ return false;
947
+ }
963
948
  if (/<[A-Z][a-zA-Z0-9]*(\s|>|\/)/.test(source)) {
964
949
  return true;
965
950
  }
@@ -984,6 +969,9 @@ function containsJsx(source) {
984
969
  return false;
985
970
  }
986
971
  function containsMdxSyntax(source) {
972
+ if (source.length > MAX_TEMPLATE_LENGTH) {
973
+ return false;
974
+ }
987
975
  if (/<[A-Z][a-zA-Z0-9]*/.test(source)) {
988
976
  return true;
989
977
  }
@@ -1437,12 +1425,12 @@ var MdxClientRenderer = class {
1437
1425
  ...outputProps,
1438
1426
  ...props
1439
1427
  };
1440
- const escapedMdx = escapeScriptClose(JSON.stringify(template));
1441
- const escapedProps = escapeScriptClose(JSON.stringify(spreadProps));
1442
- const safeContainerId = escapeJsString(containerId);
1443
- const loadingHtml = showLoading ? `<div class="mdx-loading">${escapeHtml(loadingMessage)}</div>` : "";
1428
+ const escapedMdx = (0, import_utils.escapeScriptClose)(JSON.stringify(template));
1429
+ const escapedProps = (0, import_utils.escapeScriptClose)(JSON.stringify(spreadProps));
1430
+ const safeContainerId = (0, import_utils.escapeJsString)(containerId);
1431
+ const loadingHtml = showLoading ? `<div class="mdx-loading">${(0, import_utils.escapeHtml)(loadingMessage)}</div>` : "";
1444
1432
  return `
1445
- <div id="${escapeHtml(containerId)}">${loadingHtml}</div>
1433
+ <div id="${(0, import_utils.escapeHtml)(containerId)}">${loadingHtml}</div>
1446
1434
  <script type="module">
1447
1435
  (async function() {
1448
1436
  try {
@@ -1519,7 +1507,10 @@ async function loadSwcTransform() {
1519
1507
  return swcTransform;
1520
1508
  }
1521
1509
  try {
1522
- const swc = await import("@swc/core");
1510
+ const swc = await import(
1511
+ /* webpackIgnore: true */
1512
+ "@swc/core"
1513
+ );
1523
1514
  swcTransform = swc.transform;
1524
1515
  return swcTransform;
1525
1516
  } catch {
@@ -1 +1 @@
1
- {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../../src/renderers/utils/detect.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAuCxD;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAa/D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAqCnD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAkCzD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG;IACrD,IAAI,EAAE,OAAO,GAAG,KAAK,GAAG,YAAY,GAAG,eAAe,GAAG,aAAa,CAAC;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CA8DA"}
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../../src/renderers/utils/detect.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAuCxD;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAa/D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CA0CnD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAuCzD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG;IACrD,IAAI,EAAE,OAAO,GAAG,KAAK,GAAG,YAAY,GAAG,eAAe,GAAG,aAAa,CAAC;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CA8DA"}
@@ -1 +1 @@
1
- {"version":3,"file":"transpiler.d.ts","sourceRoot":"","sources":["../../../src/renderers/utils/transpiler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD;;GAEG;AACH,UAAU,mBAAmB;IAC3B,+BAA+B;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wBAAwB;IACxB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,wEAAwE;IACxE,UAAU,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACrC,sDAAsD;IACtD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAyCD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,eAAe,CAAC,CAwD9G;AAED;;;;GAIG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAGvD;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAKjH;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAKjH"}
1
+ {"version":3,"file":"transpiler.d.ts","sourceRoot":"","sources":["../../../src/renderers/utils/transpiler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD;;GAEG;AACH,UAAU,mBAAmB;IAC3B,+BAA+B;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wBAAwB;IACxB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,wEAAwE;IACxE,UAAU,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACrC,sDAAsD;IACtD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA2CD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,eAAe,CAAC,CAwD9G;AAED;;;;GAIG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAGvD;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAKjH;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAKjH"}
package/runtime/index.js CHANGED
@@ -30,25 +30,12 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
30
30
  ));
31
31
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
32
32
 
33
- // libs/uipack/src/utils/escape-html.ts
34
- function escapeHtml(str) {
35
- if (str === null || str === void 0) {
36
- return "";
37
- }
38
- const s = String(str);
39
- return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
40
- }
41
- var init_escape_html = __esm({
42
- "libs/uipack/src/utils/escape-html.ts"() {
43
- "use strict";
44
- }
45
- });
46
-
47
33
  // libs/uipack/src/utils/index.ts
34
+ var import_utils;
48
35
  var init_utils = __esm({
49
36
  "libs/uipack/src/utils/index.ts"() {
50
37
  "use strict";
51
- init_escape_html();
38
+ import_utils = require("@frontmcp/utils");
52
39
  }
53
40
  });
54
41
 
@@ -238,7 +225,7 @@ var init_helpers = __esm({
238
225
  idCounter = 0;
239
226
  builtinHelpers = {
240
227
  // Escaping
241
- escapeHtml,
228
+ escapeHtml: import_utils.escapeHtml,
242
229
  // Formatting
243
230
  formatDate,
244
231
  formatCurrency,
@@ -409,7 +396,7 @@ __export(handlebars_exports, {
409
396
  createHandlebarsRenderer: () => createHandlebarsRenderer,
410
397
  defaultValue: () => defaultValue,
411
398
  eq: () => eq,
412
- escapeHtml: () => escapeHtml,
399
+ escapeHtml: () => import_utils.escapeHtml,
413
400
  extractAll: () => extractAll,
414
401
  extractExpressions: () => extractExpressions,
415
402
  extractInputPaths: () => extractInputPaths,
@@ -1831,7 +1818,11 @@ FrontMcpBridge.prototype._setupDataToolCallHandler = function() {
1831
1818
  };
1832
1819
  `.trim();
1833
1820
  }
1821
+ var MAX_MINIFY_CODE_LENGTH = 5e5;
1834
1822
  function minifyJS(code) {
1823
+ if (code.length > MAX_MINIFY_CODE_LENGTH) {
1824
+ return code;
1825
+ }
1835
1826
  return code.replace(/\/\*[\s\S]*?\*\//g, "").replace(/\/\/.*$/gm, "").replace(/\s+/g, " ").replace(/\s*([{};,:()[\]])\s*/g, "$1").replace(/;\}/g, "}").trim();
1836
1827
  }
1837
1828
  function generatePlatformBundle(platform, options = {}) {
@@ -2985,7 +2976,11 @@ function detectPIIType(value) {
2985
2976
  if (isIPv4(value)) return "IP";
2986
2977
  return null;
2987
2978
  }
2979
+ var MAX_PII_TEXT_LENGTH = 1e5;
2988
2980
  function redactPIIFromText(text) {
2981
+ if (text.length > MAX_PII_TEXT_LENGTH) {
2982
+ return text;
2983
+ }
2989
2984
  let result = text;
2990
2985
  result = result.replace(PII_PATTERNS.creditCardInText, REDACTION_TOKENS.CARD);
2991
2986
  result = result.replace(PII_PATTERNS.ssnInText, REDACTION_TOKENS.ID);
@@ -3104,7 +3099,7 @@ function createTemplateHelpers() {
3104
3099
  /**
3105
3100
  * Escape HTML special characters to prevent XSS
3106
3101
  */
3107
- escapeHtml,
3102
+ escapeHtml: import_utils.escapeHtml,
3108
3103
  /**
3109
3104
  * Format a date for display
3110
3105
  */
@@ -3208,7 +3203,7 @@ function wrapToolUI(options) {
3208
3203
  widgetAccessible,
3209
3204
  hostContext
3210
3205
  });
3211
- const pageTitle = title || `${escapeHtml(toolName)} - Tool Result`;
3206
+ const pageTitle = title || `${(0, import_utils.escapeHtml)(toolName)} - Tool Result`;
3212
3207
  return `<!DOCTYPE html>
3213
3208
  <html lang="en">
3214
3209
  <head>
@@ -3361,7 +3356,7 @@ function wrapToolUIUniversal(options) {
3361
3356
  resourceMode
3362
3357
  });
3363
3358
  const bridgeScript = includeBridge ? BRIDGE_SCRIPT_TAGS.universal : "";
3364
- const pageTitle = title || `${escapeHtml(toolName)} - Tool Result`;
3359
+ const pageTitle = title || `${(0, import_utils.escapeHtml)(toolName)} - Tool Result`;
3365
3360
  return `<!DOCTYPE html>
3366
3361
  <html lang="en">
3367
3362
  <head>
@@ -3475,7 +3470,7 @@ function wrapToolUIMinimal(options) {
3475
3470
  window.__mcpWidgetAccessible = ${helpers.jsonEmbed(widgetAccessible)};
3476
3471
  window.__mcpHostContext = ${helpers.jsonEmbed(contextData)};
3477
3472
  </script>`;
3478
- const pageTitle = title || `${escapeHtml(toolName)} - Tool Result`;
3473
+ const pageTitle = title || `${(0, import_utils.escapeHtml)(toolName)} - Tool Result`;
3479
3474
  return `<!DOCTYPE html>
3480
3475
  <html lang="en">
3481
3476
  <head>
@@ -3625,7 +3620,7 @@ function wrapLeanWidgetShell(options) {
3625
3620
  <head>
3626
3621
  <meta charset="UTF-8">
3627
3622
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
3628
- <title>${escapeHtml(title || toolName)}</title>
3623
+ <title>${(0, import_utils.escapeHtml)(title || toolName)}</title>
3629
3624
  ${fontPreconnect}
3630
3625
  ${fontStylesheets}
3631
3626
  ${tailwindScript}
@@ -4026,7 +4021,7 @@ function wrapHybridWidgetShell(options) {
4026
4021
  <head>
4027
4022
  <meta charset="UTF-8">
4028
4023
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
4029
- <title>${escapeHtml(title || toolName)}</title>
4024
+ <title>${(0, import_utils.escapeHtml)(title || toolName)}</title>
4030
4025
  ${fontPreconnect}
4031
4026
  ${fontStylesheets}
4032
4027
  ${tailwindScript}
@@ -4568,7 +4563,7 @@ function wrapStaticWidgetUniversal(options) {
4568
4563
  }, 100);
4569
4564
  }
4570
4565
  </script>` : "";
4571
- const pageTitle = title || `${escapeHtml(toolName)} - Tool Widget`;
4566
+ const pageTitle = title || `${(0, import_utils.escapeHtml)(toolName)} - Tool Widget`;
4572
4567
  const loaderHtml = isReactBased && componentCode && !hasEmbeddedData ? `
4573
4568
  <!-- Loading State -->
4574
4569
  <div id="frontmcp-loader" style="display: flex; align-items: center; justify-content: center; padding: 2rem; gap: 0.5rem;">
@@ -4667,7 +4662,7 @@ function wrapToolUIForClaude(options) {
4667
4662
  window.__mcpToolInput = ${helpers.jsonEmbed(input)};
4668
4663
  window.__mcpToolOutput = ${helpers.jsonEmbed(output)};
4669
4664
  </script>`;
4670
- const pageTitle = title || `${escapeHtml(toolName)} - Tool Result`;
4665
+ const pageTitle = title || `${(0, import_utils.escapeHtml)(toolName)} - Tool Result`;
4671
4666
  return `<!DOCTYPE html>
4672
4667
  <html lang="en">
4673
4668
  <head>
@@ -1 +1 @@
1
- {"version":3,"file":"sanitizer.d.ts","sourceRoot":"","sources":["../../src/runtime/sanitizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;CAOnB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;CA8BxB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;AAEnF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,GAAG,WAAW,CAAC;IAEpC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAInD;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE5C;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE7C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,OAAO,gBAAgB,GAAG,IAAI,CAOjF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWtD;AA0FD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,IAAI,GAAE,IAAI,GAAG,MAAM,EAAE,GAAG,WAAkB,GACzC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAczB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAC7B,IAAI,GAAE,IAAI,GAAG,MAAM,EAAE,GAAG,WAAkB,GACzC,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9B;IACD,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CA0CA"}
1
+ {"version":3,"file":"sanitizer.d.ts","sourceRoot":"","sources":["../../src/runtime/sanitizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;CAOnB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;CA8BxB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;AAEnF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,GAAG,WAAW,CAAC;IAEpC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAInD;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE5C;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE7C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,OAAO,gBAAgB,GAAG,IAAI,CAOjF;AAQD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBtD;AA0FD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,IAAI,GAAE,IAAI,GAAG,MAAM,EAAE,GAAG,WAAkB,GACzC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAczB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAC7B,IAAI,GAAE,IAAI,GAAG,MAAM,EAAE,GAAG,WAAkB,GACzC,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9B;IACD,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CA0CA"}