@agent-native/core 0.26.5 → 0.26.7

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 (85) hide show
  1. package/dist/cli/skills.d.ts.map +1 -1
  2. package/dist/cli/skills.js +3 -1
  3. package/dist/cli/skills.js.map +1 -1
  4. package/dist/cli/workspace-dev.d.ts.map +1 -1
  5. package/dist/cli/workspace-dev.js +9 -2
  6. package/dist/cli/workspace-dev.js.map +1 -1
  7. package/dist/client/AgentPanel.d.ts.map +1 -1
  8. package/dist/client/AgentPanel.js +2 -2
  9. package/dist/client/AgentPanel.js.map +1 -1
  10. package/dist/client/agent-chat.d.ts.map +1 -1
  11. package/dist/client/agent-chat.js +6 -5
  12. package/dist/client/agent-chat.js.map +1 -1
  13. package/dist/client/frame.d.ts +1 -0
  14. package/dist/client/frame.d.ts.map +1 -1
  15. package/dist/client/frame.js +20 -6
  16. package/dist/client/frame.js.map +1 -1
  17. package/dist/client/index.d.ts +1 -1
  18. package/dist/client/index.d.ts.map +1 -1
  19. package/dist/client/index.js +1 -1
  20. package/dist/client/index.js.map +1 -1
  21. package/dist/client/resources/ResourceTree.js +1 -1
  22. package/dist/client/resources/ResourceTree.js.map +1 -1
  23. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  24. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  25. package/dist/client/resources/use-resources.d.ts.map +1 -1
  26. package/dist/client/resources/use-resources.js +1 -4
  27. package/dist/client/resources/use-resources.js.map +1 -1
  28. package/dist/client/settings/useBuilderStatus.d.ts +2 -0
  29. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  30. package/dist/client/settings/useBuilderStatus.js +21 -5
  31. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  32. package/dist/client/settings/useBuilderStatus.spec.js +53 -1
  33. package/dist/client/settings/useBuilderStatus.spec.js.map +1 -1
  34. package/dist/mcp/build-server.js +1 -1
  35. package/dist/mcp/build-server.js.map +1 -1
  36. package/dist/mcp/embed-app.d.ts +3 -0
  37. package/dist/mcp/embed-app.d.ts.map +1 -1
  38. package/dist/mcp/embed-app.js +255 -13
  39. package/dist/mcp/embed-app.js.map +1 -1
  40. package/dist/mcp/server.d.ts.map +1 -1
  41. package/dist/mcp/server.js +5 -10
  42. package/dist/mcp/server.js.map +1 -1
  43. package/dist/mcp-client/builtin-capabilities.d.ts +2 -0
  44. package/dist/mcp-client/builtin-capabilities.d.ts.map +1 -1
  45. package/dist/mcp-client/builtin-capabilities.js +20 -0
  46. package/dist/mcp-client/builtin-capabilities.js.map +1 -1
  47. package/dist/mcp-client/index.d.ts +1 -1
  48. package/dist/mcp-client/index.d.ts.map +1 -1
  49. package/dist/mcp-client/index.js +1 -1
  50. package/dist/mcp-client/index.js.map +1 -1
  51. package/dist/mcp-client/routes.d.ts.map +1 -1
  52. package/dist/mcp-client/routes.js +41 -29
  53. package/dist/mcp-client/routes.js.map +1 -1
  54. package/dist/onboarding/default-steps.d.ts.map +1 -1
  55. package/dist/onboarding/default-steps.js +4 -3
  56. package/dist/onboarding/default-steps.js.map +1 -1
  57. package/dist/secrets/storage.d.ts.map +1 -1
  58. package/dist/secrets/storage.js +4 -1
  59. package/dist/secrets/storage.js.map +1 -1
  60. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  61. package/dist/server/agent-chat-plugin.js +10 -5
  62. package/dist/server/agent-chat-plugin.js.map +1 -1
  63. package/dist/server/credential-provider.d.ts +5 -0
  64. package/dist/server/credential-provider.d.ts.map +1 -1
  65. package/dist/server/credential-provider.js +8 -0
  66. package/dist/server/credential-provider.js.map +1 -1
  67. package/dist/server/deep-link.d.ts.map +1 -1
  68. package/dist/server/deep-link.js +16 -1
  69. package/dist/server/deep-link.js.map +1 -1
  70. package/dist/server/index.d.ts +1 -1
  71. package/dist/server/index.d.ts.map +1 -1
  72. package/dist/server/index.js +1 -1
  73. package/dist/server/index.js.map +1 -1
  74. package/dist/server/security-headers.d.ts.map +1 -1
  75. package/dist/server/security-headers.js +7 -1
  76. package/dist/server/security-headers.js.map +1 -1
  77. package/dist/shared/mcp-embed-headers.d.ts +1 -0
  78. package/dist/shared/mcp-embed-headers.d.ts.map +1 -1
  79. package/dist/shared/mcp-embed-headers.js +19 -2
  80. package/dist/shared/mcp-embed-headers.js.map +1 -1
  81. package/dist/vite/client.d.ts.map +1 -1
  82. package/dist/vite/client.js +124 -0
  83. package/dist/vite/client.js.map +1 -1
  84. package/docs/content/mcp-clients.md +16 -4
  85. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
1
  export declare const MCP_EMBED_CORS_ALLOW_HEADERS = "Content-Type,Authorization,X-Requested-With,X-Request-Source,X-Agent-Native-CSRF,X-User-Timezone,X-Agent-Native-Embed-Target,X-Agent-Native-Embed-Transplant";
2
2
  export declare const EMBED_TRANSPLANT_HEADER = "x-agent-native-embed-transplant";
3
3
  export declare function isClaudeMcpContentOrigin(origin: string | null | undefined): boolean;
4
+ export declare function isChatGptMcpSandboxOrigin(origin: string | null | undefined): boolean;
4
5
  export declare function isMcpEmbedCorsOrigin(origin: string | null | undefined): boolean;
5
6
  export declare function shouldAllowMcpEmbedCredentials(origin: string | null | undefined): boolean;
6
7
  export declare const MCP_EMBED_STATIC_ASSET_HEADERS: {
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-embed-headers.d.ts","sourceRoot":"","sources":["../../src/shared/mcp-embed-headers.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,4BAA4B,iKACuH,CAAC;AACjK,eAAO,MAAM,uBAAuB,oCAAoC,CAAC;AAIzE,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,OAAO,CAUT;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,OAAO,CAET;AAED,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,OAAO,CAET;AAED,eAAO,MAAM,8BAA8B;;;CAGjC,CAAC;AAoBX,wBAAgB,6BAA6B,CAC3C,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,OAAO,8BAA8B,CAAA;CAAE,CAAC,CAapE"}
1
+ {"version":3,"file":"mcp-embed-headers.d.ts","sourceRoot":"","sources":["../../src/shared/mcp-embed-headers.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,4BAA4B,iKACuH,CAAC;AACjK,eAAO,MAAM,uBAAuB,oCAAoC,CAAC;AAMzE,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,OAAO,CAUT;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,OAAO,CAWT;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,OAAO,CAMT;AAED,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,OAAO,CAMT;AAED,eAAO,MAAM,8BAA8B;;;CAGjC,CAAC;AAoBX,wBAAgB,6BAA6B,CAC3C,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,OAAO,8BAA8B,CAAA;CAAE,CAAC,CAapE"}
@@ -1,6 +1,7 @@
1
1
  export const MCP_EMBED_CORS_ALLOW_HEADERS = "Content-Type,Authorization,X-Requested-With,X-Request-Source,X-Agent-Native-CSRF,X-User-Timezone,X-Agent-Native-Embed-Target,X-Agent-Native-Embed-Transplant";
2
2
  export const EMBED_TRANSPLANT_HEADER = "x-agent-native-embed-transplant";
3
3
  const CLAUDE_MCP_CONTENT_HOST_RE = /^[a-f0-9]{32}\.claudemcpcontent\.com$/i;
4
+ const CHATGPT_MCP_SANDBOX_HOST_RE = /^[^.]+\.web-sandbox\.oaiusercontent\.com$/i;
4
5
  export function isClaudeMcpContentOrigin(origin) {
5
6
  if (!origin)
6
7
  return false;
@@ -12,11 +13,27 @@ export function isClaudeMcpContentOrigin(origin) {
12
13
  return false;
13
14
  }
14
15
  }
16
+ export function isChatGptMcpSandboxOrigin(origin) {
17
+ if (!origin)
18
+ return false;
19
+ try {
20
+ const url = new URL(origin);
21
+ return (url.protocol === "https:" &&
22
+ CHATGPT_MCP_SANDBOX_HOST_RE.test(url.hostname));
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
15
28
  export function isMcpEmbedCorsOrigin(origin) {
16
- return origin === "null" || isClaudeMcpContentOrigin(origin);
29
+ return (origin === "null" ||
30
+ isClaudeMcpContentOrigin(origin) ||
31
+ isChatGptMcpSandboxOrigin(origin));
17
32
  }
18
33
  export function shouldAllowMcpEmbedCredentials(origin) {
19
- return origin !== "null" && !isClaudeMcpContentOrigin(origin);
34
+ return (origin !== "null" &&
35
+ !isClaudeMcpContentOrigin(origin) &&
36
+ !isChatGptMcpSandboxOrigin(origin));
20
37
  }
21
38
  export const MCP_EMBED_STATIC_ASSET_HEADERS = {
22
39
  "Access-Control-Allow-Origin": "*",
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-embed-headers.js","sourceRoot":"","sources":["../../src/shared/mcp-embed-headers.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,4BAA4B,GACvC,8JAA8J,CAAC;AACjK,MAAM,CAAC,MAAM,uBAAuB,GAAG,iCAAiC,CAAC;AAEzE,MAAM,0BAA0B,GAAG,wCAAwC,CAAC;AAE5E,MAAM,UAAU,wBAAwB,CACtC,MAAiC;IAEjC,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO,CACL,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAC3E,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,MAAiC;IAEjC,OAAO,MAAM,KAAK,MAAM,IAAI,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,MAAiC;IAEjC,OAAO,MAAM,KAAK,MAAM,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC5C,6BAA6B,EAAE,GAAG;IAClC,8BAA8B,EAAE,cAAc;CACtC,CAAC;AAEX,MAAM,qBAAqB,GAAG;IAC5B,YAAY;IACZ,cAAc;IACd,cAAc;IACd,gBAAgB;IAChB,aAAa;IACb,qBAAqB;IACrB,qBAAqB;CACtB,CAAC;AAEF,SAAS,iBAAiB,CAAC,QAA4B;IACrD,MAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QACzB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC3B,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,QAAiB;IAEjB,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,KAAK,GAGP,EAAE,CAAC;IACP,KAAK,MAAM,OAAO,IAAI,qBAAqB,EAAE,CAAC;QAC5C,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC;QAC7D,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,CAAC,GAAG,IAAI,GAAG,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC;QAC3E,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["export const MCP_EMBED_CORS_ALLOW_HEADERS =\n \"Content-Type,Authorization,X-Requested-With,X-Request-Source,X-Agent-Native-CSRF,X-User-Timezone,X-Agent-Native-Embed-Target,X-Agent-Native-Embed-Transplant\";\nexport const EMBED_TRANSPLANT_HEADER = \"x-agent-native-embed-transplant\";\n\nconst CLAUDE_MCP_CONTENT_HOST_RE = /^[a-f0-9]{32}\\.claudemcpcontent\\.com$/i;\n\nexport function isClaudeMcpContentOrigin(\n origin: string | null | undefined,\n): boolean {\n if (!origin) return false;\n try {\n const url = new URL(origin);\n return (\n url.protocol === \"https:\" && CLAUDE_MCP_CONTENT_HOST_RE.test(url.hostname)\n );\n } catch {\n return false;\n }\n}\n\nexport function isMcpEmbedCorsOrigin(\n origin: string | null | undefined,\n): boolean {\n return origin === \"null\" || isClaudeMcpContentOrigin(origin);\n}\n\nexport function shouldAllowMcpEmbedCredentials(\n origin: string | null | undefined,\n): boolean {\n return origin !== \"null\" && !isClaudeMcpContentOrigin(origin);\n}\n\nexport const MCP_EMBED_STATIC_ASSET_HEADERS = {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Cross-Origin-Resource-Policy\": \"cross-origin\",\n} as const;\n\nconst STATIC_ASSET_PATTERNS = [\n \"/assets/**\",\n \"/favicon.ico\",\n \"/favicon.svg\",\n \"/manifest.json\",\n \"/icon-*.svg\",\n \"/agent-native-*.svg\",\n \"/library-presets/**\",\n];\n\nfunction normalizeBasePath(basePath: string | undefined): string {\n const base = (basePath ?? \"\").trim();\n if (!base || base === \"/\") return \"\";\n return base.startsWith(\"/\")\n ? base.replace(/\\/+$/g, \"\")\n : `/${base.replace(/\\/+$/g, \"\")}`;\n}\n\nexport function mcpEmbedStaticAssetRouteRules(\n basePath?: string,\n): Record<string, { headers: typeof MCP_EMBED_STATIC_ASSET_HEADERS }> {\n const base = normalizeBasePath(basePath);\n const rules: Record<\n string,\n { headers: typeof MCP_EMBED_STATIC_ASSET_HEADERS }\n > = {};\n for (const pattern of STATIC_ASSET_PATTERNS) {\n rules[pattern] = { headers: MCP_EMBED_STATIC_ASSET_HEADERS };\n if (base) {\n rules[`${base}${pattern}`] = { headers: MCP_EMBED_STATIC_ASSET_HEADERS };\n }\n }\n return rules;\n}\n"]}
1
+ {"version":3,"file":"mcp-embed-headers.js","sourceRoot":"","sources":["../../src/shared/mcp-embed-headers.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,4BAA4B,GACvC,8JAA8J,CAAC;AACjK,MAAM,CAAC,MAAM,uBAAuB,GAAG,iCAAiC,CAAC;AAEzE,MAAM,0BAA0B,GAAG,wCAAwC,CAAC;AAC5E,MAAM,2BAA2B,GAC/B,4CAA4C,CAAC;AAE/C,MAAM,UAAU,wBAAwB,CACtC,MAAiC;IAEjC,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO,CACL,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAC3E,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,MAAiC;IAEjC,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO,CACL,GAAG,CAAC,QAAQ,KAAK,QAAQ;YACzB,2BAA2B,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAC/C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,MAAiC;IAEjC,OAAO,CACL,MAAM,KAAK,MAAM;QACjB,wBAAwB,CAAC,MAAM,CAAC;QAChC,yBAAyB,CAAC,MAAM,CAAC,CAClC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,MAAiC;IAEjC,OAAO,CACL,MAAM,KAAK,MAAM;QACjB,CAAC,wBAAwB,CAAC,MAAM,CAAC;QACjC,CAAC,yBAAyB,CAAC,MAAM,CAAC,CACnC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC5C,6BAA6B,EAAE,GAAG;IAClC,8BAA8B,EAAE,cAAc;CACtC,CAAC;AAEX,MAAM,qBAAqB,GAAG;IAC5B,YAAY;IACZ,cAAc;IACd,cAAc;IACd,gBAAgB;IAChB,aAAa;IACb,qBAAqB;IACrB,qBAAqB;CACtB,CAAC;AAEF,SAAS,iBAAiB,CAAC,QAA4B;IACrD,MAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QACzB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC3B,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,QAAiB;IAEjB,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,KAAK,GAGP,EAAE,CAAC;IACP,KAAK,MAAM,OAAO,IAAI,qBAAqB,EAAE,CAAC;QAC5C,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC;QAC7D,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,CAAC,GAAG,IAAI,GAAG,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC;QAC3E,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["export const MCP_EMBED_CORS_ALLOW_HEADERS =\n \"Content-Type,Authorization,X-Requested-With,X-Request-Source,X-Agent-Native-CSRF,X-User-Timezone,X-Agent-Native-Embed-Target,X-Agent-Native-Embed-Transplant\";\nexport const EMBED_TRANSPLANT_HEADER = \"x-agent-native-embed-transplant\";\n\nconst CLAUDE_MCP_CONTENT_HOST_RE = /^[a-f0-9]{32}\\.claudemcpcontent\\.com$/i;\nconst CHATGPT_MCP_SANDBOX_HOST_RE =\n /^[^.]+\\.web-sandbox\\.oaiusercontent\\.com$/i;\n\nexport function isClaudeMcpContentOrigin(\n origin: string | null | undefined,\n): boolean {\n if (!origin) return false;\n try {\n const url = new URL(origin);\n return (\n url.protocol === \"https:\" && CLAUDE_MCP_CONTENT_HOST_RE.test(url.hostname)\n );\n } catch {\n return false;\n }\n}\n\nexport function isChatGptMcpSandboxOrigin(\n origin: string | null | undefined,\n): boolean {\n if (!origin) return false;\n try {\n const url = new URL(origin);\n return (\n url.protocol === \"https:\" &&\n CHATGPT_MCP_SANDBOX_HOST_RE.test(url.hostname)\n );\n } catch {\n return false;\n }\n}\n\nexport function isMcpEmbedCorsOrigin(\n origin: string | null | undefined,\n): boolean {\n return (\n origin === \"null\" ||\n isClaudeMcpContentOrigin(origin) ||\n isChatGptMcpSandboxOrigin(origin)\n );\n}\n\nexport function shouldAllowMcpEmbedCredentials(\n origin: string | null | undefined,\n): boolean {\n return (\n origin !== \"null\" &&\n !isClaudeMcpContentOrigin(origin) &&\n !isChatGptMcpSandboxOrigin(origin)\n );\n}\n\nexport const MCP_EMBED_STATIC_ASSET_HEADERS = {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Cross-Origin-Resource-Policy\": \"cross-origin\",\n} as const;\n\nconst STATIC_ASSET_PATTERNS = [\n \"/assets/**\",\n \"/favicon.ico\",\n \"/favicon.svg\",\n \"/manifest.json\",\n \"/icon-*.svg\",\n \"/agent-native-*.svg\",\n \"/library-presets/**\",\n];\n\nfunction normalizeBasePath(basePath: string | undefined): string {\n const base = (basePath ?? \"\").trim();\n if (!base || base === \"/\") return \"\";\n return base.startsWith(\"/\")\n ? base.replace(/\\/+$/g, \"\")\n : `/${base.replace(/\\/+$/g, \"\")}`;\n}\n\nexport function mcpEmbedStaticAssetRouteRules(\n basePath?: string,\n): Record<string, { headers: typeof MCP_EMBED_STATIC_ASSET_HEADERS }> {\n const base = normalizeBasePath(basePath);\n const rules: Record<\n string,\n { headers: typeof MCP_EMBED_STATIC_ASSET_HEADERS }\n > = {};\n for (const pattern of STATIC_ASSET_PATTERNS) {\n rules[pattern] = { headers: MCP_EMBED_STATIC_ASSET_HEADERS };\n if (base) {\n rules[`${base}${pattern}`] = { headers: MCP_EMBED_STATIC_ASSET_HEADERS };\n }\n }\n return rules;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/vite/client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAU,UAAU,EAAE,MAAM,MAAM,CAAC;AAmZ/C,MAAM,WAAW,YAAY;IAC3B,sGAAsG;IACtG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,YAAY,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;IAC9E,oGAAoG;IACpG,QAAQ,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IAClC,8BAA8B;IAC9B,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,iDAAiD;IACjD,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,iDAAiD;IACjD,YAAY,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;IACvD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjD;AAyPD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,MAAM,GAAG,SAAS,CAMpB;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,OAAO,CAWT;AA6KD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,UAAU,CAkQ1E"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/vite/client.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAU,UAAU,EAAE,MAAM,MAAM,CAAC;AAyZ/C,MAAM,WAAW,YAAY;IAC3B,sGAAsG;IACtG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,YAAY,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;IAC9E,oGAAoG;IACpG,QAAQ,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IAClC,8BAA8B;IAC9B,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,iDAAiD;IACjD,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,iDAAiD;IACjD,YAAY,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;IACvD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjD;AA6XD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,MAAM,GAAG,SAAS,CAMpB;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,OAAO,CAWT;AA6KD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,UAAU,CAkQ1E"}
@@ -6,6 +6,8 @@ import { actionTypesPlugin } from "./action-types-plugin.js";
6
6
  import { agentsBundlePlugin } from "./agents-bundle-plugin.js";
7
7
  import { findWorkspaceRoot } from "../scripts/utils.js";
8
8
  import { getViteDevRecoveryScript } from "../client/vite-dev-recovery-script.js";
9
+ import { verifyEmbedSessionToken } from "../server/embed-session.js";
10
+ import { EMBED_SESSION_COOKIE, EMBED_TOKEN_QUERY_PARAM, MCP_APP_CHAT_BRIDGE_QUERY_PARAM, } from "../shared/embed-auth.js";
9
11
  import { isMcpEmbedCorsOrigin, MCP_EMBED_CORS_ALLOW_HEADERS, MCP_EMBED_STATIC_ASSET_HEADERS, mcpEmbedStaticAssetRouteRules, } from "../shared/mcp-embed-headers.js";
10
12
  import { fileURLToPath } from "url";
11
13
  const require = createRequire(import.meta.url);
@@ -449,6 +451,9 @@ function baseRedirectGuard() {
449
451
  // original path so the normal dev-server error handling applies.
450
452
  }
451
453
  }
454
+ if (serveMountedEmbedRuntimeModule(server, req, res, base)) {
455
+ return;
456
+ }
452
457
  req.url = stripMountedDevApiPath(req.url, base);
453
458
  if (req.method === "HEAD" &&
454
459
  req.url &&
@@ -466,6 +471,125 @@ function baseRedirectGuard() {
466
471
  },
467
472
  };
468
473
  }
474
+ const VITE_RUNTIME_PATH_PREFIXES = [
475
+ "/@fs/",
476
+ "/@id/",
477
+ "/@vite/",
478
+ "/app/",
479
+ "/node_modules/",
480
+ "/packages/",
481
+ "/src/",
482
+ ];
483
+ function cookieValue(req, name) {
484
+ const header = req.headers.cookie;
485
+ if (typeof header !== "string" || !header)
486
+ return undefined;
487
+ for (const part of header.split(";")) {
488
+ const index = part.indexOf("=");
489
+ if (index < 0)
490
+ continue;
491
+ const key = part.slice(0, index).trim();
492
+ if (key !== name)
493
+ continue;
494
+ try {
495
+ return decodeURIComponent(part.slice(index + 1).trim());
496
+ }
497
+ catch {
498
+ return part.slice(index + 1).trim();
499
+ }
500
+ }
501
+ return undefined;
502
+ }
503
+ function hasValidEmbedRuntimeToken(req) {
504
+ try {
505
+ const url = new URL(req.url ?? "/", "http://agent-native.local");
506
+ const queryToken = url.searchParams.get(EMBED_TOKEN_QUERY_PARAM);
507
+ const cookieToken = cookieValue(req, EMBED_SESSION_COOKIE);
508
+ return [queryToken, cookieToken].some((token) => verifyEmbedSessionToken(token).ok);
509
+ }
510
+ catch {
511
+ return false;
512
+ }
513
+ }
514
+ function mountedEmbedRuntimeModuleUrl(reqUrl, base) {
515
+ if (!reqUrl || !base || base === "/")
516
+ return null;
517
+ const normalizedBase = base.endsWith("/") ? base : `${base}/`;
518
+ if (!reqUrl.startsWith(normalizedBase))
519
+ return null;
520
+ const runtimeUrl = reqUrl.slice(normalizedBase.length - 1) || "/";
521
+ let url;
522
+ try {
523
+ url = new URL(runtimeUrl, "http://agent-native.local");
524
+ }
525
+ catch {
526
+ return null;
527
+ }
528
+ if (!VITE_RUNTIME_PATH_PREFIXES.some((prefix) => url.pathname.startsWith(prefix))) {
529
+ return null;
530
+ }
531
+ url.searchParams.delete(EMBED_TOKEN_QUERY_PARAM);
532
+ url.searchParams.delete(MCP_APP_CHAT_BRIDGE_QUERY_PARAM);
533
+ return `${url.pathname}${url.search}${url.hash}`;
534
+ }
535
+ function virtualModuleIdFromRuntimeUrl(runtimeUrl) {
536
+ try {
537
+ const pathname = new URL(runtimeUrl, "http://agent-native.local").pathname;
538
+ const prefix = "/@id/__x00__";
539
+ if (!pathname.startsWith(prefix))
540
+ return null;
541
+ return `\0${decodeURIComponent(pathname.slice(prefix.length))}`;
542
+ }
543
+ catch {
544
+ return null;
545
+ }
546
+ }
547
+ async function loadMountedEmbedRuntimeModule(server, runtimeUrl) {
548
+ const virtualId = virtualModuleIdFromRuntimeUrl(runtimeUrl);
549
+ if (virtualId) {
550
+ const loaded = await server.pluginContainer?.load?.(virtualId);
551
+ if (typeof loaded === "string")
552
+ return loaded;
553
+ if (loaded && typeof loaded.code === "string")
554
+ return loaded.code;
555
+ }
556
+ const result = await server.transformRequest(runtimeUrl);
557
+ return result?.code ?? null;
558
+ }
559
+ function serveMountedEmbedRuntimeModule(server, req, res, base) {
560
+ if (req.method !== "GET" && req.method !== "HEAD")
561
+ return false;
562
+ if (!hasValidEmbedRuntimeToken(req))
563
+ return false;
564
+ const runtimeUrl = mountedEmbedRuntimeModuleUrl(req.url, base);
565
+ if (!runtimeUrl)
566
+ return false;
567
+ void loadMountedEmbedRuntimeModule(server, runtimeUrl)
568
+ .then((code) => {
569
+ if (!code) {
570
+ if (!res.headersSent) {
571
+ res.statusCode = 404;
572
+ res.end();
573
+ }
574
+ return;
575
+ }
576
+ res.statusCode = 200;
577
+ res.setHeader("content-type", "text/javascript");
578
+ if (req.method === "HEAD") {
579
+ res.end();
580
+ return;
581
+ }
582
+ res.end(code);
583
+ })
584
+ .catch((err) => {
585
+ if (res.headersSent)
586
+ return;
587
+ res.statusCode = 500;
588
+ res.setHeader("content-type", "text/plain");
589
+ res.end(err instanceof Error ? err.message : String(err));
590
+ });
591
+ return true;
592
+ }
469
593
  function embedDevFrameHeaders() {
470
594
  return {
471
595
  name: "agent-native-embed-dev-frame-headers",