@agent-native/core 0.72.3 → 0.72.4

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 (136) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +10 -0
  3. package/corpus/core/package.json +6 -6
  4. package/corpus/core/src/a2a/client.ts +7 -3
  5. package/corpus/core/src/client/api-path.ts +28 -0
  6. package/corpus/core/src/client/embed-auth.ts +26 -0
  7. package/corpus/core/src/client/mcp-app-host.ts +6 -0
  8. package/corpus/core/src/client/mcp-apps/McpAppRenderer.tsx +227 -33
  9. package/corpus/core/src/client/resources/use-mcp-servers.ts +1 -0
  10. package/corpus/core/src/client/settings/DemoModeSection.tsx +3 -1
  11. package/corpus/core/src/demo/fetch-interceptor.ts +1 -1
  12. package/corpus/core/src/embedding/agent.ts +6 -1
  13. package/corpus/core/src/embedding/bridge.ts +34 -1
  14. package/corpus/core/src/mcp/build-server.ts +38 -10
  15. package/corpus/core/src/mcp/embed-app.ts +120 -45
  16. package/corpus/core/src/mcp/index.ts +5 -0
  17. package/corpus/core/src/mcp/org-directory.ts +70 -11
  18. package/corpus/core/src/mcp/server.ts +14 -0
  19. package/corpus/core/src/mcp-client/config.ts +12 -0
  20. package/corpus/core/src/mcp-client/index.ts +2 -0
  21. package/corpus/core/src/mcp-client/manager.ts +268 -9
  22. package/corpus/core/src/mcp-client/remote-store.ts +154 -0
  23. package/corpus/core/src/mcp-client/routes.ts +2 -0
  24. package/corpus/core/src/server/agent-chat-plugin.ts +8 -0
  25. package/corpus/core/src/server/index.ts +1 -0
  26. package/corpus/core/src/shared/mcp-embed-headers.ts +44 -3
  27. package/corpus/core/src/vite/client.ts +53 -0
  28. package/corpus/templates/assets/.agents/skills/a2a-assets/SKILL.md +17 -10
  29. package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +15 -6
  30. package/corpus/templates/assets/AGENTS.md +7 -5
  31. package/corpus/templates/assets/actions/generate-asset.ts +161 -0
  32. package/corpus/templates/assets/actions/list-assets.ts +4 -2
  33. package/corpus/templates/assets/actions/open-asset-picker.ts +84 -3
  34. package/corpus/templates/assets/app/routes/library.tsx +243 -40
  35. package/corpus/templates/clips/desktop/src-tauri/src/native_speech.rs +9 -0
  36. package/corpus/templates/design/AGENTS.md +10 -5
  37. package/corpus/templates/design/actions/connect-assets-mcp.ts +131 -0
  38. package/corpus/templates/design/actions/insert-asset.ts +219 -0
  39. package/corpus/templates/design/actions/view-screen.ts +3 -1
  40. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +1 -1
  41. package/corpus/templates/design/app/pages/DesignEditor.tsx +53 -0
  42. package/corpus/templates/design/server/plugins/agent-chat.ts +5 -1
  43. package/corpus/templates/design/server/plugins/assets-mcp.ts +60 -0
  44. package/dist/a2a/client.d.ts +1 -0
  45. package/dist/a2a/client.d.ts.map +1 -1
  46. package/dist/a2a/client.js +5 -3
  47. package/dist/a2a/client.js.map +1 -1
  48. package/dist/client/api-path.d.ts.map +1 -1
  49. package/dist/client/api-path.js +27 -0
  50. package/dist/client/api-path.js.map +1 -1
  51. package/dist/client/embed-auth.d.ts.map +1 -1
  52. package/dist/client/embed-auth.js +27 -0
  53. package/dist/client/embed-auth.js.map +1 -1
  54. package/dist/client/mcp-app-host.d.ts.map +1 -1
  55. package/dist/client/mcp-app-host.js +5 -0
  56. package/dist/client/mcp-app-host.js.map +1 -1
  57. package/dist/client/mcp-apps/McpAppRenderer.d.ts +1 -0
  58. package/dist/client/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  59. package/dist/client/mcp-apps/McpAppRenderer.js +179 -33
  60. package/dist/client/mcp-apps/McpAppRenderer.js.map +1 -1
  61. package/dist/client/resources/use-mcp-servers.d.ts +1 -0
  62. package/dist/client/resources/use-mcp-servers.d.ts.map +1 -1
  63. package/dist/client/resources/use-mcp-servers.js.map +1 -1
  64. package/dist/client/settings/DemoModeSection.d.ts.map +1 -1
  65. package/dist/client/settings/DemoModeSection.js +3 -1
  66. package/dist/client/settings/DemoModeSection.js.map +1 -1
  67. package/dist/demo/fetch-interceptor.js +1 -1
  68. package/dist/demo/fetch-interceptor.js.map +1 -1
  69. package/dist/embedding/agent.d.ts +1 -1
  70. package/dist/embedding/agent.d.ts.map +1 -1
  71. package/dist/embedding/agent.js +1 -1
  72. package/dist/embedding/agent.js.map +1 -1
  73. package/dist/embedding/bridge.d.ts.map +1 -1
  74. package/dist/embedding/bridge.js +27 -1
  75. package/dist/embedding/bridge.js.map +1 -1
  76. package/dist/extensions/schema.d.ts +2 -2
  77. package/dist/mcp/build-server.d.ts +2 -0
  78. package/dist/mcp/build-server.d.ts.map +1 -1
  79. package/dist/mcp/build-server.js +32 -9
  80. package/dist/mcp/build-server.js.map +1 -1
  81. package/dist/mcp/embed-app.d.ts.map +1 -1
  82. package/dist/mcp/embed-app.js +120 -45
  83. package/dist/mcp/embed-app.js.map +1 -1
  84. package/dist/mcp/index.d.ts +1 -0
  85. package/dist/mcp/index.d.ts.map +1 -1
  86. package/dist/mcp/index.js +1 -0
  87. package/dist/mcp/index.js.map +1 -1
  88. package/dist/mcp/org-directory.d.ts +1 -0
  89. package/dist/mcp/org-directory.d.ts.map +1 -1
  90. package/dist/mcp/org-directory.js +59 -11
  91. package/dist/mcp/org-directory.js.map +1 -1
  92. package/dist/mcp/server.d.ts.map +1 -1
  93. package/dist/mcp/server.js +9 -0
  94. package/dist/mcp/server.js.map +1 -1
  95. package/dist/mcp-client/config.d.ts +12 -0
  96. package/dist/mcp-client/config.d.ts.map +1 -1
  97. package/dist/mcp-client/config.js.map +1 -1
  98. package/dist/mcp-client/index.d.ts +1 -1
  99. package/dist/mcp-client/index.d.ts.map +1 -1
  100. package/dist/mcp-client/index.js +1 -1
  101. package/dist/mcp-client/index.js.map +1 -1
  102. package/dist/mcp-client/manager.d.ts +2 -0
  103. package/dist/mcp-client/manager.d.ts.map +1 -1
  104. package/dist/mcp-client/manager.js +201 -9
  105. package/dist/mcp-client/manager.js.map +1 -1
  106. package/dist/mcp-client/remote-store.d.ts +27 -0
  107. package/dist/mcp-client/remote-store.d.ts.map +1 -1
  108. package/dist/mcp-client/remote-store.js +105 -0
  109. package/dist/mcp-client/remote-store.js.map +1 -1
  110. package/dist/mcp-client/routes.d.ts +1 -0
  111. package/dist/mcp-client/routes.d.ts.map +1 -1
  112. package/dist/mcp-client/routes.js +1 -0
  113. package/dist/mcp-client/routes.js.map +1 -1
  114. package/dist/provider-api/actions/github-repo-files.d.ts +2 -2
  115. package/dist/provider-api/actions/query-staged-dataset.d.ts +3 -3
  116. package/dist/provider-api/corpus-jobs.d.ts +8 -8
  117. package/dist/server/agent-chat-plugin.d.ts +2 -0
  118. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  119. package/dist/server/agent-chat-plugin.js +8 -0
  120. package/dist/server/agent-chat-plugin.js.map +1 -1
  121. package/dist/server/index.d.ts +1 -1
  122. package/dist/server/index.d.ts.map +1 -1
  123. package/dist/server/index.js +1 -1
  124. package/dist/server/index.js.map +1 -1
  125. package/dist/shared/mcp-embed-headers.d.ts +3 -1
  126. package/dist/shared/mcp-embed-headers.d.ts.map +1 -1
  127. package/dist/shared/mcp-embed-headers.js +40 -3
  128. package/dist/shared/mcp-embed-headers.js.map +1 -1
  129. package/dist/sharing/actions/list-resource-shares.d.ts +1 -1
  130. package/dist/sharing/actions/set-resource-visibility.d.ts +2 -2
  131. package/dist/sharing/actions/share-resource.d.ts +1 -1
  132. package/dist/sharing/schema.d.ts +1 -1
  133. package/dist/vite/client.d.ts.map +1 -1
  134. package/dist/vite/client.js +44 -0
  135. package/dist/vite/client.js.map +1 -1
  136. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"DemoModeSection.js","sourceRoot":"","sources":["../../../src/client/settings/DemoModeSection.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAOjD,MAAM,eAAe,GAAG,eAAe,CAAC,4BAA4B,CAAC,CAAC;AACtE,MAAM,mBAAmB,GAAG,eAAe,CACzC,4CAA4C,CAC7C,CAAC;AAEF,MAAM,UAAU,eAAe;IAC7B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAiB,IAAI,CAAC,CAAC;IAE7D,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;QACxB,QAAQ,EAAE,CAAC,cAAc,EAAE,WAAW,CAAC;QACvC,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,eAAe,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;YACrE,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC;YACzB,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAsB,CAAC;QACjD,CAAC;QACD,eAAe,EAAE,KAAK;QACtB,SAAS,EAAE,KAAK;KACjB,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,IAAI,EAAE,OAAO,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAErC,0EAA0E;IAC1E,uEAAuE;IACvE,qDAAqD;IACrD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,EAAE,CAAC;YACX,UAAU,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;aAAM,IAAI,OAAO,aAAa,KAAK,SAAS,EAAE,CAAC;YAC9C,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/D,CAAC;aAAM,IAAI,aAAa,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7D,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAElC,MAAM,MAAM,GAAG,KAAK,EAAE,IAAa,EAAE,EAAE;QACrC,IAAI,MAAM;YAAE,OAAO;QACnB,MAAM,QAAQ,GAAG,OAAO,CAAC;QACzB,yDAAyD;QACzD,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,mBAAmB,EAAE;gBAC3C,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,WAAW,EAAE,SAAS;gBACtB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;aACxC,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAC,iGAAiG,aAC9G,eAAK,SAAS,EAAC,SAAS,aACtB,cAAK,SAAS,EAAC,yCAAyC,iCAElD,EACN,YAAG,SAAS,EAAC,0CAA0C,2LAInD,EACH,MAAM,IAAI,CACT,aAAG,SAAS,EAAC,0CAA0C,iCACrC,uCAAsB,8DAEpC,CACL,IACG,EACN,iBACE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,QAAQ,kBACC,CAAC,CAAC,OAAO,gBACZ,kBAAkB,EAC7B,QAAQ,EAAE,OAAO,KAAK,IAAI,IAAI,MAAM,EACpC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBAC/B,6CAA6C;gBAC7C,SAAS,EAAE,oGACT,OAAO;oBACL,CAAC,CAAC,YAAY;oBACd,CAAC,CAAC,qDACN,IAAI,OAAO,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,YAEpD,eACE,SAAS,EAAE,kFACT,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAChC,EAAE,GACF,GACK,IACL,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,KAAC,UAAU,IAAC,IAAI,EAAE,EAAE,GAAI,CAAC;AAClC,CAAC","sourcesContent":["/**\n * <DemoModeSection /> — toggle that replaces names, emails, and numbers with\n * realistic fake data everywhere (UI + what the agent sees) while preserving\n * IDs and structure so the app keeps working.\n *\n * The toggle is stored in application_state under `demo-mode`\n * (`{ enabled: boolean }`) and written via `PUT\n * /_agent-native/application-state/demo-mode` (optimistic — flip first,\n * write in the background). It READS from `/_agent-native/demo/status`\n * instead, which ORs the per-user toggle with the `DEMO_MODE` env: a hosted\n * demo deployment is forced on and the switch is locked so it can't be\n * accidentally turned off on stage.\n */\n\nimport { useEffect, useState } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { agentNativePath } from \"../api-path.js\";\nimport { IconEyeOff } from \"@tabler/icons-react\";\n\ninterface DemoStatus {\n enabled?: boolean;\n forced?: boolean;\n}\n\nconst DEMO_STATUS_URL = agentNativePath(\"/_agent-native/demo/status\");\nconst DEMO_MODE_WRITE_URL = agentNativePath(\n \"/_agent-native/application-state/demo-mode\",\n);\n\nexport function DemoModeSection() {\n const [enabled, setEnabled] = useState<boolean | null>(null);\n\n const { data } = useQuery({\n queryKey: [\"agent-native\", \"demo-mode\"],\n queryFn: async () => {\n const res = await fetch(DEMO_STATUS_URL, { credentials: \"include\" });\n if (!res.ok) return null;\n return (await res.json()) as DemoStatus | null;\n },\n refetchInterval: 4_000,\n staleTime: 2_000,\n });\n\n const serverEnabled = data?.enabled;\n const forced = data?.forced === true;\n\n // Surface the server value once it arrives (and on subsequent polls), but\n // never clobber an in-flight optimistic toggle with a stale read. When\n // forced by env, always reflect the locked-on state.\n useEffect(() => {\n if (forced) {\n setEnabled(true);\n } else if (typeof serverEnabled === \"boolean\") {\n setEnabled((prev) => (prev === null ? serverEnabled : prev));\n } else if (serverEnabled === undefined && data !== undefined) {\n setEnabled((prev) => (prev === null ? false : prev));\n }\n }, [serverEnabled, forced, data]);\n\n const toggle = async (next: boolean) => {\n if (forced) return;\n const previous = enabled;\n // Optimistic: flip immediately, write in the background.\n setEnabled(next);\n try {\n const res = await fetch(DEMO_MODE_WRITE_URL, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: JSON.stringify({ enabled: next }),\n });\n if (!res.ok) {\n throw new Error(`HTTP ${res.status}`);\n }\n } catch {\n setEnabled(previous);\n }\n };\n\n return (\n <div className=\"flex items-start justify-between gap-3 rounded-md border border-border bg-accent/30 px-2.5 py-2\">\n <div className=\"min-w-0\">\n <div className=\"text-[11px] font-medium text-foreground\">\n Enable demo mode\n </div>\n <p className=\"text-[10px] text-muted-foreground mt-0.5\">\n Replace names, emails, and numbers with realistic fake data everywhere\n — in the UI and what the agent sees. IDs and structure are preserved\n so the app keeps working.\n </p>\n {forced && (\n <p className=\"text-[10px] text-muted-foreground mt-0.5\">\n Enforced by the <code>DEMO_MODE</code> environment variable — can't\n be turned off here.\n </p>\n )}\n </div>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={!!enabled}\n aria-label=\"Enable demo mode\"\n disabled={enabled === null || forced}\n onClick={() => toggle(!enabled)}\n // Theme tokens; streaming agent owns layout.\n className={`relative inline-flex h-4 w-7 shrink-0 cursor-pointer items-center rounded-full transition-colors ${\n enabled\n ? \"bg-primary\"\n : \"bg-muted-foreground/30 hover:bg-muted-foreground/50\"\n } ${enabled === null || forced ? \"opacity-60\" : \"\"}`}\n >\n <span\n className={`inline-block h-3 w-3 transform rounded-full bg-background transition-transform ${\n enabled ? \"translate-x-3.5\" : \"translate-x-0.5\"\n }`}\n />\n </button>\n </div>\n );\n}\n\nexport function DemoModeIcon() {\n return <IconEyeOff size={14} />;\n}\n"]}
1
+ {"version":3,"file":"DemoModeSection.js","sourceRoot":"","sources":["../../../src/client/settings/DemoModeSection.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * <DemoModeSection /> — toggle that replaces names, emails, and numbers with\n * realistic fake data everywhere (UI + what the agent sees) while preserving\n * IDs and structure so the app keeps working.\n *\n * The toggle is stored in application_state under `demo-mode`\n * (`{ enabled: boolean }`) and written via `PUT\n * /_agent-native/application-state/demo-mode` (optimistic — flip first,\n * write in the background). It READS from `/_agent-native/demo/status`\n * instead, which ORs the per-user toggle with the `DEMO_MODE` env: a hosted\n * demo deployment is forced on and the switch is locked so it can't be\n * accidentally turned off on stage.\n */\n\nimport { useEffect, useState } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { agentNativePath } from \"../api-path.js\";\nimport { IconEyeOff } from \"@tabler/icons-react\";\n\ninterface DemoStatus {\n enabled?: boolean;\n forced?: boolean;\n}\n\nconst DEMO_STATUS_URL = agentNativePath(\"/_agent-native/demo/status\");\nconst DEMO_MODE_WRITE_URL = agentNativePath(\n \"/_agent-native/application-state/demo-mode\",\n);\n\nexport function DemoModeSection() {\n const [enabled, setEnabled] = useState<boolean | null>(null);\n\n const { data } = useQuery({\n queryKey: [\"agent-native\", \"demo-mode\"],\n queryFn: async () => {\n const res = await fetch(DEMO_STATUS_URL, {\n credentials: \"same-origin\",\n });\n if (!res.ok) return null;\n return (await res.json()) as DemoStatus | null;\n },\n refetchInterval: 4_000,\n staleTime: 2_000,\n });\n\n const serverEnabled = data?.enabled;\n const forced = data?.forced === true;\n\n // Surface the server value once it arrives (and on subsequent polls), but\n // never clobber an in-flight optimistic toggle with a stale read. When\n // forced by env, always reflect the locked-on state.\n useEffect(() => {\n if (forced) {\n setEnabled(true);\n } else if (typeof serverEnabled === \"boolean\") {\n setEnabled((prev) => (prev === null ? serverEnabled : prev));\n } else if (serverEnabled === undefined && data !== undefined) {\n setEnabled((prev) => (prev === null ? false : prev));\n }\n }, [serverEnabled, forced, data]);\n\n const toggle = async (next: boolean) => {\n if (forced) return;\n const previous = enabled;\n // Optimistic: flip immediately, write in the background.\n setEnabled(next);\n try {\n const res = await fetch(DEMO_MODE_WRITE_URL, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: JSON.stringify({ enabled: next }),\n });\n if (!res.ok) {\n throw new Error(`HTTP ${res.status}`);\n }\n } catch {\n setEnabled(previous);\n }\n };\n\n return (\n <div className=\"flex items-start justify-between gap-3 rounded-md border border-border bg-accent/30 px-2.5 py-2\">\n <div className=\"min-w-0\">\n <div className=\"text-[11px] font-medium text-foreground\">\n Enable demo mode\n </div>\n <p className=\"text-[10px] text-muted-foreground mt-0.5\">\n Replace names, emails, and numbers with realistic fake data everywhere\n — in the UI and what the agent sees. IDs and structure are preserved\n so the app keeps working.\n </p>\n {forced && (\n <p className=\"text-[10px] text-muted-foreground mt-0.5\">\n Enforced by the <code>DEMO_MODE</code> environment variable — can't\n be turned off here.\n </p>\n )}\n </div>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={!!enabled}\n aria-label=\"Enable demo mode\"\n disabled={enabled === null || forced}\n onClick={() => toggle(!enabled)}\n // Theme tokens; streaming agent owns layout.\n className={`relative inline-flex h-4 w-7 shrink-0 cursor-pointer items-center rounded-full transition-colors ${\n enabled\n ? \"bg-primary\"\n : \"bg-muted-foreground/30 hover:bg-muted-foreground/50\"\n } ${enabled === null || forced ? \"opacity-60\" : \"\"}`}\n >\n <span\n className={`inline-block h-3 w-3 transform rounded-full bg-background transition-transform ${\n enabled ? \"translate-x-3.5\" : \"translate-x-0.5\"\n }`}\n />\n </button>\n </div>\n );\n}\n\nexport function DemoModeIcon() {\n return <IconEyeOff size={14} />;\n}\n"]}
@@ -84,7 +84,7 @@ function methodOf(input, init) {
84
84
  async function refreshDemoFlag() {
85
85
  const f = originalFetch ?? fetch;
86
86
  try {
87
- const res = await f(STATUS_PATH, { credentials: "include" });
87
+ const res = await f(STATUS_PATH, { credentials: "same-origin" });
88
88
  if (!res.ok)
89
89
  return;
90
90
  const json = (await res.json());
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-interceptor.js","sourceRoot":"","sources":["../../src/demo/fetch-interceptor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Client-side demo-mode redaction.\n *\n * Why client-side and not (only) at the server action boundary: templates\n * serve a lot of their UI data through their OWN custom Nitro `/api/*`\n * handlers (e.g. mail's `/api/emails`, `/api/threads/:id/messages`,\n * `/api/contacts`, `/api/apollo/person`), which never pass through the\n * framework action runtime. On this stack (Nitro v3 / h3 v2) there is no\n * single server hook that can safely rewrite every JSON body (the `response`\n * hook hands you an immutable Web `Response` and returns `void`). Patching the\n * browser's `fetch` is the one place that is BOTH universal (every template's\n * reads — actions and custom routes alike — go through it) AND low-risk: it\n * can only ever post-process JSON the app already parses for display, so it\n * physically cannot break auth, SSE streams, SSR HTML, or binary downloads.\n *\n * The agent is handled separately and in-process (its action tool results are\n * redacted in `production-agent.ts`), so it doesn't depend on this at all.\n *\n * Scope intentionally narrow:\n * - Only same-document `GET` requests are redacted. Mutation responses\n * (POST/PUT/PATCH/DELETE) pass through untouched so a draft you just\n * typed isn't echoed back as fake data mid-demo.\n * - Only `application/json` 2xx bodies. Streams (`text/event-stream`),\n * HTML, and binary are skipped by content-type.\n * - Framework infra endpoints (poll, events, the demo-status endpoint\n * itself) are skipped — no PII and avoids self-recursion.\n * - Any error during interception falls back to the original response.\n */\nimport { redactDemoData } from \"./redact.js\";\nimport { agentNativePath } from \"../client/api-path.js\";\n\nconst STATUS_PATH = agentNativePath(\"/_agent-native/demo/status\");\nconst SKIP_SUBSTRINGS = [\n \"/_agent-native/demo/status\",\n \"/_agent-native/poll\",\n \"/_agent-native/events\",\n // Never touch agent transport. The agent already gets in-process\n // redaction of its tool results; faking its own transcript adds no demo\n // value and must stay clear of the tool_use/tool_result protocol. Covers\n // \"/_agent-native/agent\" (stream) and \"/_agent-native/agent-chat\"\n // (thread history) and any sub-paths.\n \"/_agent-native/agent\",\n // Run-manager state read by the reconnect/recovery loop. Faking numeric\n // run state here would make recovery think it's not progressing and\n // exhaust its retries (\"agent connection kept failing\").\n \"/_agent-native/runs\",\n];\n\nlet installed = false;\nlet pollTimer: ReturnType<typeof setInterval> | null = null;\nlet demoEnabled = false;\nlet originalFetch: typeof fetch | null = null;\n\n// Set once the first demo-status check completes. We DO NOT block requests on\n// it — if status isn't known yet a response is simply passed through\n// un-redacted (a brief first-paint window) rather than delaying transport.\n// Injecting latency into early GETs previously risked the agent's streaming\n// reconnect logic; transport safety wins over redacting the first paint.\nlet firstStatusDone = false;\n\n/** Reject after `ms` so a misclassified streaming body can never hang. */\nfunction withTimeout<T>(p: Promise<T>, ms: number): Promise<T> {\n return Promise.race([\n p,\n new Promise<T>((_, reject) =>\n setTimeout(() => reject(new Error(\"redact-timeout\")), ms),\n ),\n ]);\n}\n\nfunction urlOf(input: RequestInfo | URL): string {\n try {\n if (typeof input === \"string\") return input;\n if (input instanceof URL) return input.href;\n return (input as Request).url ?? \"\";\n } catch {\n return \"\";\n }\n}\n\nfunction methodOf(input: RequestInfo | URL, init?: RequestInit): string {\n const m =\n init?.method ??\n (typeof input !== \"string\" && !(input instanceof URL)\n ? (input as Request).method\n : undefined) ??\n \"GET\";\n return m.toUpperCase();\n}\n\nasync function refreshDemoFlag(): Promise<void> {\n const f = originalFetch ?? fetch;\n try {\n const res = await f(STATUS_PATH, { credentials: \"include\" });\n if (!res.ok) return;\n const json = (await res.json()) as {\n enabled?: boolean;\n forced?: boolean;\n } | null;\n demoEnabled = json?.enabled === true || json?.forced === true;\n } catch {\n // Status endpoint unreachable — leave the last known value.\n } finally {\n firstStatusDone = true;\n }\n}\n\n/**\n * Install the demo-mode fetch interceptor and start polling demo status.\n * Idempotent and browser-only — safe to call from any hook that runs in\n * every template root (we call it from `useDbSync`). A no-op until demo\n * mode is actually on.\n */\nexport function ensureDemoModeFetchInterceptor(): void {\n if (typeof window === \"undefined\") return;\n if (installed) return;\n installed = true;\n\n originalFetch = window.fetch.bind(window);\n const base = originalFetch;\n\n window.fetch = async function patchedFetch(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n const res = await base(input, init);\n\n // Fast path: anything that isn't a demo-enabled, plain GET returns the\n // ORIGINAL response with zero body work and zero extra awaits — when\n // demo mode is off this wrapper is byte-for-byte native fetch, so it\n // cannot influence agent/run/stream transport.\n if (!demoEnabled || !firstStatusDone) return res;\n if (methodOf(input, init) !== \"GET\") return res;\n if (!res.ok) return res;\n\n try {\n const url = urlOf(input);\n if (SKIP_SUBSTRINGS.some((s) => url.includes(s))) return res;\n\n // Only buffered, finite JSON. SSE / streaming / chunked-forever bodies\n // never reach `redactDemoData`: streaming content-types are excluded,\n // and the JSON read is hard-timeout-bounded so a misclassified stream\n // degrades to \"return the original response\" instead of hanging the\n // request (which is what tripped the reconnect/recovery loop).\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n if (!contentType.includes(\"application/json\")) return res;\n if (\n contentType.includes(\"event-stream\") ||\n contentType.includes(\"ndjson\") ||\n contentType.includes(\"stream\")\n ) {\n return res;\n }\n if (res.bodyUsed) return res;\n\n const data = await withTimeout(res.clone().json(), 3_000);\n const redacted = redactDemoData(data);\n\n const headers = new Headers(res.headers);\n // Body is re-serialized — these would be wrong now.\n headers.delete(\"content-length\");\n headers.delete(\"content-encoding\");\n\n return new Response(JSON.stringify(redacted), {\n status: res.status,\n statusText: res.statusText,\n headers,\n });\n } catch {\n // Never let redaction break a request — fall back to the real\n // response (its body stream is untouched; we only ever read a clone).\n return res;\n }\n };\n\n void refreshDemoFlag();\n pollTimer = setInterval(() => void refreshDemoFlag(), 4_000);\n if (typeof pollTimer === \"object\" && \"unref\" in pollTimer) {\n try {\n (pollTimer as unknown as { unref: () => void }).unref();\n } catch {\n // unref unavailable in the browser — fine, interval is cheap.\n }\n }\n}\n"]}
1
+ {"version":3,"file":"fetch-interceptor.js","sourceRoot":"","sources":["../../src/demo/fetch-interceptor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Client-side demo-mode redaction.\n *\n * Why client-side and not (only) at the server action boundary: templates\n * serve a lot of their UI data through their OWN custom Nitro `/api/*`\n * handlers (e.g. mail's `/api/emails`, `/api/threads/:id/messages`,\n * `/api/contacts`, `/api/apollo/person`), which never pass through the\n * framework action runtime. On this stack (Nitro v3 / h3 v2) there is no\n * single server hook that can safely rewrite every JSON body (the `response`\n * hook hands you an immutable Web `Response` and returns `void`). Patching the\n * browser's `fetch` is the one place that is BOTH universal (every template's\n * reads — actions and custom routes alike — go through it) AND low-risk: it\n * can only ever post-process JSON the app already parses for display, so it\n * physically cannot break auth, SSE streams, SSR HTML, or binary downloads.\n *\n * The agent is handled separately and in-process (its action tool results are\n * redacted in `production-agent.ts`), so it doesn't depend on this at all.\n *\n * Scope intentionally narrow:\n * - Only same-document `GET` requests are redacted. Mutation responses\n * (POST/PUT/PATCH/DELETE) pass through untouched so a draft you just\n * typed isn't echoed back as fake data mid-demo.\n * - Only `application/json` 2xx bodies. Streams (`text/event-stream`),\n * HTML, and binary are skipped by content-type.\n * - Framework infra endpoints (poll, events, the demo-status endpoint\n * itself) are skipped — no PII and avoids self-recursion.\n * - Any error during interception falls back to the original response.\n */\nimport { redactDemoData } from \"./redact.js\";\nimport { agentNativePath } from \"../client/api-path.js\";\n\nconst STATUS_PATH = agentNativePath(\"/_agent-native/demo/status\");\nconst SKIP_SUBSTRINGS = [\n \"/_agent-native/demo/status\",\n \"/_agent-native/poll\",\n \"/_agent-native/events\",\n // Never touch agent transport. The agent already gets in-process\n // redaction of its tool results; faking its own transcript adds no demo\n // value and must stay clear of the tool_use/tool_result protocol. Covers\n // \"/_agent-native/agent\" (stream) and \"/_agent-native/agent-chat\"\n // (thread history) and any sub-paths.\n \"/_agent-native/agent\",\n // Run-manager state read by the reconnect/recovery loop. Faking numeric\n // run state here would make recovery think it's not progressing and\n // exhaust its retries (\"agent connection kept failing\").\n \"/_agent-native/runs\",\n];\n\nlet installed = false;\nlet pollTimer: ReturnType<typeof setInterval> | null = null;\nlet demoEnabled = false;\nlet originalFetch: typeof fetch | null = null;\n\n// Set once the first demo-status check completes. We DO NOT block requests on\n// it — if status isn't known yet a response is simply passed through\n// un-redacted (a brief first-paint window) rather than delaying transport.\n// Injecting latency into early GETs previously risked the agent's streaming\n// reconnect logic; transport safety wins over redacting the first paint.\nlet firstStatusDone = false;\n\n/** Reject after `ms` so a misclassified streaming body can never hang. */\nfunction withTimeout<T>(p: Promise<T>, ms: number): Promise<T> {\n return Promise.race([\n p,\n new Promise<T>((_, reject) =>\n setTimeout(() => reject(new Error(\"redact-timeout\")), ms),\n ),\n ]);\n}\n\nfunction urlOf(input: RequestInfo | URL): string {\n try {\n if (typeof input === \"string\") return input;\n if (input instanceof URL) return input.href;\n return (input as Request).url ?? \"\";\n } catch {\n return \"\";\n }\n}\n\nfunction methodOf(input: RequestInfo | URL, init?: RequestInit): string {\n const m =\n init?.method ??\n (typeof input !== \"string\" && !(input instanceof URL)\n ? (input as Request).method\n : undefined) ??\n \"GET\";\n return m.toUpperCase();\n}\n\nasync function refreshDemoFlag(): Promise<void> {\n const f = originalFetch ?? fetch;\n try {\n const res = await f(STATUS_PATH, { credentials: \"same-origin\" });\n if (!res.ok) return;\n const json = (await res.json()) as {\n enabled?: boolean;\n forced?: boolean;\n } | null;\n demoEnabled = json?.enabled === true || json?.forced === true;\n } catch {\n // Status endpoint unreachable — leave the last known value.\n } finally {\n firstStatusDone = true;\n }\n}\n\n/**\n * Install the demo-mode fetch interceptor and start polling demo status.\n * Idempotent and browser-only — safe to call from any hook that runs in\n * every template root (we call it from `useDbSync`). A no-op until demo\n * mode is actually on.\n */\nexport function ensureDemoModeFetchInterceptor(): void {\n if (typeof window === \"undefined\") return;\n if (installed) return;\n installed = true;\n\n originalFetch = window.fetch.bind(window);\n const base = originalFetch;\n\n window.fetch = async function patchedFetch(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n const res = await base(input, init);\n\n // Fast path: anything that isn't a demo-enabled, plain GET returns the\n // ORIGINAL response with zero body work and zero extra awaits — when\n // demo mode is off this wrapper is byte-for-byte native fetch, so it\n // cannot influence agent/run/stream transport.\n if (!demoEnabled || !firstStatusDone) return res;\n if (methodOf(input, init) !== \"GET\") return res;\n if (!res.ok) return res;\n\n try {\n const url = urlOf(input);\n if (SKIP_SUBSTRINGS.some((s) => url.includes(s))) return res;\n\n // Only buffered, finite JSON. SSE / streaming / chunked-forever bodies\n // never reach `redactDemoData`: streaming content-types are excluded,\n // and the JSON read is hard-timeout-bounded so a misclassified stream\n // degrades to \"return the original response\" instead of hanging the\n // request (which is what tripped the reconnect/recovery loop).\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n if (!contentType.includes(\"application/json\")) return res;\n if (\n contentType.includes(\"event-stream\") ||\n contentType.includes(\"ndjson\") ||\n contentType.includes(\"stream\")\n ) {\n return res;\n }\n if (res.bodyUsed) return res;\n\n const data = await withTimeout(res.clone().json(), 3_000);\n const redacted = redactDemoData(data);\n\n const headers = new Headers(res.headers);\n // Body is re-serialized — these would be wrong now.\n headers.delete(\"content-length\");\n headers.delete(\"content-encoding\");\n\n return new Response(JSON.stringify(redacted), {\n status: res.status,\n statusText: res.statusText,\n headers,\n });\n } catch {\n // Never let redaction break a request — fall back to the real\n // response (its body stream is untouched; we only ever read a clone).\n return res;\n }\n };\n\n void refreshDemoFlag();\n pollTimer = setInterval(() => void refreshDemoFlag(), 4_000);\n if (typeof pollTimer === \"object\" && \"unref\" in pollTimer) {\n try {\n (pollTimer as unknown as { unref: () => void }).unref();\n } catch {\n // unref unavailable in the browser — fine, interval is cheap.\n }\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { A2AClient, type Message, type Task } from "../a2a/index.js";
1
+ import { A2AClient, type Message, type Task } from "@agent-native/core/a2a";
2
2
  export interface AgentEndpointOptions {
3
3
  /**
4
4
  * Optional URL base used when resolving relative app URLs.
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/embedding/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEhF,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAiBD,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,oBAAyB,GACjC,MAAM,CAWR;AAED,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,oBAAyB,GACjC,MAAM,CAiBR;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,oBAAyB,GACjC,MAAM,CAMR;AAoBD;;GAEG;AACH,wBAAuB,WAAW,CAChC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,kBAAuB,GAC/B,cAAc,CAAC,MAAM,CAAC,CAsCxB;AAED,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/embedding/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAET,KAAK,OAAO,EACZ,KAAK,IAAI,EACV,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAiBD,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,oBAAyB,GACjC,MAAM,CAWR;AAED,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,oBAAyB,GACjC,MAAM,CAiBR;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,oBAAyB,GACjC,MAAM,CAMR;AAoBD;;GAEG;AACH,wBAAuB,WAAW,CAChC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,kBAAuB,GAC/B,cAAc,CAAC,MAAM,CAAC,CAsCxB;AAED,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC"}
@@ -1,4 +1,4 @@
1
- import { A2AClient, callAgent } from "../a2a/index.js";
1
+ import { A2AClient, callAgent, } from "@agent-native/core/a2a";
2
2
  function appUrl(url, options = {}) {
3
3
  const base = options.base ??
4
4
  (typeof window !== "undefined"
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/embedding/agent.ts"],"names":[],"mappings":"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","sourcesContent":["import { A2AClient, callAgent, type Message, type Task } from \"../a2a/index.js\";\n\nexport interface AgentEndpointOptions {\n /**\n * Optional URL base used when resolving relative app URLs.\n */\n base?: string;\n}\n\nexport interface SendMessageOptions {\n apiKey?: string;\n contextId?: string;\n metadata?: Record<string, unknown>;\n requestTimeoutMs?: number;\n /**\n * If the target does not support streaming, fall back to async send + poll.\n * Defaults to true.\n */\n fallbackToPolling?: boolean;\n timeoutMs?: number;\n userEmail?: string;\n orgDomain?: string;\n orgSecret?: string;\n}\n\nfunction appUrl(url: string, options: AgentEndpointOptions = {}): URL {\n const base =\n options.base ??\n (typeof window !== \"undefined\"\n ? window.location.href\n : \"http://agent-native.local\");\n return new URL(url, base);\n}\n\nfunction trimEndpointPath(pathname: string, suffix: string): string | null {\n const normalized = pathname.replace(/\\/$/, \"\");\n if (!normalized.endsWith(suffix)) return null;\n return normalized.slice(0, -suffix.length) || \"/\";\n}\n\nexport function getMcpUrl(\n url: string,\n options: AgentEndpointOptions = {},\n): string {\n const parsed = appUrl(url, options);\n const trimmed = trimEndpointPath(parsed.pathname, \"/_agent-native/mcp\");\n if (trimmed !== null) {\n parsed.pathname = `${trimmed.replace(/\\/$/, \"\")}/_agent-native/mcp`;\n } else {\n parsed.pathname = `${parsed.pathname.replace(/\\/$/, \"\")}/_agent-native/mcp`;\n }\n parsed.search = \"\";\n parsed.hash = \"\";\n return parsed.toString();\n}\n\nexport function getA2AUrl(\n url: string,\n options: AgentEndpointOptions = {},\n): string {\n const parsed = appUrl(url, options);\n const agentNativeTrimmed = trimEndpointPath(\n parsed.pathname,\n \"/_agent-native/a2a\",\n );\n const legacyTrimmed = trimEndpointPath(parsed.pathname, \"/a2a\");\n if (agentNativeTrimmed !== null) {\n parsed.pathname = `${agentNativeTrimmed.replace(/\\/$/, \"\")}/_agent-native/a2a`;\n } else if (legacyTrimmed !== null) {\n parsed.pathname = `${legacyTrimmed.replace(/\\/$/, \"\")}/_agent-native/a2a`;\n } else {\n parsed.pathname = `${parsed.pathname.replace(/\\/$/, \"\")}/_agent-native/a2a`;\n }\n parsed.search = \"\";\n parsed.hash = \"\";\n return parsed.toString();\n}\n\nexport function getAgentCardUrl(\n url: string,\n options: AgentEndpointOptions = {},\n): string {\n const parsed = appUrl(url, options);\n parsed.pathname = \"/.well-known/agent-card.json\";\n parsed.search = \"\";\n parsed.hash = \"\";\n return parsed.toString();\n}\n\nfunction textMessage(text: string): Message {\n return {\n role: \"user\",\n parts: [{ type: \"text\", text }],\n };\n}\n\nfunction extractTaskText(task: Task): string {\n return (\n task.status.message?.parts\n .filter((part): part is { type: \"text\"; text: string } => {\n return part.type === \"text\" && typeof part.text === \"string\";\n })\n .map((part) => part.text)\n .join(\"\\n\") ?? \"\"\n );\n}\n\n/**\n * Send a text prompt to an Agent-Native A2A endpoint and yield text deltas.\n */\nexport async function* sendMessage(\n url: string,\n text: string,\n options: SendMessageOptions = {},\n): AsyncGenerator<string> {\n const client = new A2AClient(url, options.apiKey, {\n requestTimeoutMs: options.requestTimeoutMs,\n });\n const message = textMessage(text);\n let previous = \"\";\n let yielded = false;\n\n try {\n for await (const task of client.stream(message, {\n contextId: options.contextId,\n metadata: options.metadata,\n })) {\n const next = extractTaskText(task);\n const chunk = next.startsWith(previous)\n ? next.slice(previous.length)\n : next;\n previous = next;\n if (chunk) {\n yielded = true;\n yield chunk;\n }\n }\n return;\n } catch (error) {\n if (yielded || options.fallbackToPolling === false) throw error;\n }\n\n const answer = await callAgent(url, text, {\n apiKey: options.apiKey,\n contextId: options.contextId,\n timeoutMs: options.timeoutMs,\n userEmail: options.userEmail,\n orgDomain: options.orgDomain,\n orgSecret: options.orgSecret,\n async: true,\n });\n if (answer) yield answer;\n}\n\nexport { A2AClient };\nexport type { Message, Task };\n"]}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/embedding/agent.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n A2AClient,\n callAgent,\n type Message,\n type Task,\n} from \"@agent-native/core/a2a\";\n\nexport interface AgentEndpointOptions {\n /**\n * Optional URL base used when resolving relative app URLs.\n */\n base?: string;\n}\n\nexport interface SendMessageOptions {\n apiKey?: string;\n contextId?: string;\n metadata?: Record<string, unknown>;\n requestTimeoutMs?: number;\n /**\n * If the target does not support streaming, fall back to async send + poll.\n * Defaults to true.\n */\n fallbackToPolling?: boolean;\n timeoutMs?: number;\n userEmail?: string;\n orgDomain?: string;\n orgSecret?: string;\n}\n\nfunction appUrl(url: string, options: AgentEndpointOptions = {}): URL {\n const base =\n options.base ??\n (typeof window !== \"undefined\"\n ? window.location.href\n : \"http://agent-native.local\");\n return new URL(url, base);\n}\n\nfunction trimEndpointPath(pathname: string, suffix: string): string | null {\n const normalized = pathname.replace(/\\/$/, \"\");\n if (!normalized.endsWith(suffix)) return null;\n return normalized.slice(0, -suffix.length) || \"/\";\n}\n\nexport function getMcpUrl(\n url: string,\n options: AgentEndpointOptions = {},\n): string {\n const parsed = appUrl(url, options);\n const trimmed = trimEndpointPath(parsed.pathname, \"/_agent-native/mcp\");\n if (trimmed !== null) {\n parsed.pathname = `${trimmed.replace(/\\/$/, \"\")}/_agent-native/mcp`;\n } else {\n parsed.pathname = `${parsed.pathname.replace(/\\/$/, \"\")}/_agent-native/mcp`;\n }\n parsed.search = \"\";\n parsed.hash = \"\";\n return parsed.toString();\n}\n\nexport function getA2AUrl(\n url: string,\n options: AgentEndpointOptions = {},\n): string {\n const parsed = appUrl(url, options);\n const agentNativeTrimmed = trimEndpointPath(\n parsed.pathname,\n \"/_agent-native/a2a\",\n );\n const legacyTrimmed = trimEndpointPath(parsed.pathname, \"/a2a\");\n if (agentNativeTrimmed !== null) {\n parsed.pathname = `${agentNativeTrimmed.replace(/\\/$/, \"\")}/_agent-native/a2a`;\n } else if (legacyTrimmed !== null) {\n parsed.pathname = `${legacyTrimmed.replace(/\\/$/, \"\")}/_agent-native/a2a`;\n } else {\n parsed.pathname = `${parsed.pathname.replace(/\\/$/, \"\")}/_agent-native/a2a`;\n }\n parsed.search = \"\";\n parsed.hash = \"\";\n return parsed.toString();\n}\n\nexport function getAgentCardUrl(\n url: string,\n options: AgentEndpointOptions = {},\n): string {\n const parsed = appUrl(url, options);\n parsed.pathname = \"/.well-known/agent-card.json\";\n parsed.search = \"\";\n parsed.hash = \"\";\n return parsed.toString();\n}\n\nfunction textMessage(text: string): Message {\n return {\n role: \"user\",\n parts: [{ type: \"text\", text }],\n };\n}\n\nfunction extractTaskText(task: Task): string {\n return (\n task.status.message?.parts\n .filter((part): part is { type: \"text\"; text: string } => {\n return part.type === \"text\" && typeof part.text === \"string\";\n })\n .map((part) => part.text)\n .join(\"\\n\") ?? \"\"\n );\n}\n\n/**\n * Send a text prompt to an Agent-Native A2A endpoint and yield text deltas.\n */\nexport async function* sendMessage(\n url: string,\n text: string,\n options: SendMessageOptions = {},\n): AsyncGenerator<string> {\n const client = new A2AClient(url, options.apiKey, {\n requestTimeoutMs: options.requestTimeoutMs,\n });\n const message = textMessage(text);\n let previous = \"\";\n let yielded = false;\n\n try {\n for await (const task of client.stream(message, {\n contextId: options.contextId,\n metadata: options.metadata,\n })) {\n const next = extractTaskText(task);\n const chunk = next.startsWith(previous)\n ? next.slice(previous.length)\n : next;\n previous = next;\n if (chunk) {\n yielded = true;\n yield chunk;\n }\n }\n return;\n } catch (error) {\n if (yielded || options.fallbackToPolling === false) throw error;\n }\n\n const answer = await callAgent(url, text, {\n apiKey: options.apiKey,\n contextId: options.contextId,\n timeoutMs: options.timeoutMs,\n userEmail: options.userEmail,\n orgDomain: options.orgDomain,\n orgSecret: options.orgSecret,\n async: true,\n });\n if (answer) yield answer;\n}\n\nexport { A2AClient };\nexport type { Message, Task };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/embedding/bridge.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,uBAAuB,CAAC,QAAQ,GAAG,OAAO;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,QAAQ,CAAC;IAClB,KAAK,EAAE,YAAY,CAAC;CACrB;AAED,MAAM,MAAM,yBAAyB,GAAG,CACtC,OAAO,EAAE,uBAAuB,KAC7B,IAAI,CAAC;AAEV,MAAM,MAAM,yBAAyB,GAAG,CACtC,OAAO,EAAE,uBAAuB,KAC7B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhC,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,CAAC,EAAE,yBAAyB,CAAC;IACtC,SAAS,CAAC,EAAE,yBAAyB,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,CAAC,QAAQ,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC3E,OAAO,CAAC,OAAO,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,EAC3C,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/B,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,KAAK,CAAC,QAAQ,GAAG,OAAO,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IACvD,KAAK,CAAC,QAAQ,GAAG,OAAO,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IACvD,OAAO,IAAI,IAAI,CAAC;CACjB;AA2BD,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,wBAA6B,GACrC,iBAAiB,CA6InB;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,GAAG,OAAO,EACvD,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,QAAQ,EAClB,OAAO,GAAE,IAAI,CACX,wBAAwB,EACxB,eAAe,GAAG,cAAc,GAAG,cAAc,CAC7C,GACL,OAAO,CAYT;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,GAAG,OAAO,EACzD,OAAO,CAAC,EAAE,QAAQ,EAClB,OAAO,GAAE,IAAI,CACX,wBAAwB,EACxB,eAAe,GAAG,cAAc,GAAG,cAAc,CAC7C,GACL,OAAO,CAWT"}
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/embedding/bridge.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,uBAAuB,CAAC,QAAQ,GAAG,OAAO;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,QAAQ,CAAC;IAClB,KAAK,EAAE,YAAY,CAAC;CACrB;AAED,MAAM,MAAM,yBAAyB,GAAG,CACtC,OAAO,EAAE,uBAAuB,KAC7B,IAAI,CAAC;AAEV,MAAM,MAAM,yBAAyB,GAAG,CACtC,OAAO,EAAE,uBAAuB,KAC7B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhC,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,CAAC,EAAE,yBAAyB,CAAC;IACtC,SAAS,CAAC,EAAE,yBAAyB,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,CAAC,QAAQ,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC3E,OAAO,CAAC,OAAO,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,EAC3C,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/B,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,KAAK,CAAC,QAAQ,GAAG,OAAO,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IACvD,KAAK,CAAC,QAAQ,GAAG,OAAO,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IACvD,OAAO,IAAI,IAAI,CAAC;CACjB;AAuDD,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,wBAA6B,GACrC,iBAAiB,CA8InB;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,GAAG,OAAO,EACvD,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,QAAQ,EAClB,OAAO,GAAE,IAAI,CACX,wBAAwB,EACxB,eAAe,GAAG,cAAc,GAAG,cAAc,CAC7C,GACL,OAAO,CAYT;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,GAAG,OAAO,EACzD,OAAO,CAAC,EAAE,QAAQ,EAClB,OAAO,GAAE,IAAI,CACX,wBAAwB,EACxB,eAAe,GAAG,cAAc,GAAG,cAAc,CAC7C,GACL,OAAO,CAWT"}
@@ -1,10 +1,35 @@
1
+ import { MCP_APP_CHAT_BRIDGE_QUERY_PARAM, EMBED_MODE_QUERY_PARAM, } from "../shared/embed-auth.js";
1
2
  import { AGENT_NATIVE_EMBED_MESSAGE_TYPES, createAgentNativeEmbedEnvelope, createEmbeddedAppRequestId, embeddedAppOrigin, isAgentNativeEmbedEnvelope, isAllowedEmbeddedAppOrigin, messageErrorPayload, } from "./protocol.js";
2
3
  function resolveParentOrigin(win, explicit) {
3
4
  if (explicit)
4
5
  return explicit;
6
+ if (shouldUseOpaqueParentTarget(win))
7
+ return "*";
5
8
  const referrerOrigin = embeddedAppOrigin(win.document?.referrer ?? "");
6
9
  return referrerOrigin;
7
10
  }
11
+ function shouldUseOpaqueParentTarget(win) {
12
+ try {
13
+ const url = new URL(win.location.href);
14
+ const chatBridge = url.searchParams.get(MCP_APP_CHAT_BRIDGE_QUERY_PARAM);
15
+ const embedMode = url.searchParams.get(EMBED_MODE_QUERY_PARAM);
16
+ return (chatBridge === "1" ||
17
+ chatBridge === "true" ||
18
+ embedMode === "1" ||
19
+ embedMode === "true");
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
25
+ function defaultAllowedOrigins(parentOrigin, referrerOrigin) {
26
+ if (!parentOrigin)
27
+ return [];
28
+ if (parentOrigin === "*") {
29
+ return ["null", ...(referrerOrigin ? [referrerOrigin] : [])];
30
+ }
31
+ return [parentOrigin];
32
+ }
8
33
  function postToParent(win, parent, parentOrigin, envelope) {
9
34
  const target = parent ?? (win.parent === win ? null : win.parent);
10
35
  if (!parentOrigin)
@@ -17,8 +42,9 @@ function postToParent(win, parent, parentOrigin, envelope) {
17
42
  export function createEmbeddedAppBridge(options = {}) {
18
43
  const win = options.currentWindow ?? window;
19
44
  const parentOrigin = resolveParentOrigin(win, options.parentOrigin);
45
+ const referrerOrigin = embeddedAppOrigin(win.document?.referrer ?? "");
20
46
  const allowedOrigins = options.allowedOrigins ??
21
- (parentOrigin && parentOrigin !== "*" ? [parentOrigin] : []);
47
+ defaultAllowedOrigins(parentOrigin, referrerOrigin);
22
48
  const pending = new Map();
23
49
  let destroyed = false;
24
50
  const postEnvelope = (envelope) => postToParent(win, options.targetWindow ?? null, parentOrigin, envelope);
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/embedding/bridge.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AGENT_NATIVE_EMBED_MESSAGE_TYPES,\n createAgentNativeEmbedEnvelope,\n createEmbeddedAppRequestId,\n embeddedAppOrigin,\n isAgentNativeEmbedEnvelope,\n isAllowedEmbeddedAppOrigin,\n messageErrorPayload,\n type AgentNativeEmbedEnvelope,\n} from \"./protocol.js\";\n\nexport interface EmbeddedAppMessageEvent<TPayload = unknown> {\n name: string;\n payload: TPayload;\n event: MessageEvent;\n}\n\nexport type EmbeddedAppMessageHandler = (\n message: EmbeddedAppMessageEvent,\n) => void;\n\nexport type EmbeddedAppRequestHandler = (\n message: EmbeddedAppMessageEvent,\n) => unknown | Promise<unknown>;\n\nexport interface EmbeddedAppBridgeOptions {\n /**\n * Exact parent origin to post back to. Defaults to document.referrer's\n * origin when available. If no origin can be resolved, sends fail closed.\n */\n parentOrigin?: string;\n /**\n * Origins allowed to send messages to the embedded app. Defaults to the\n * resolved parent origin.\n */\n allowedOrigins?: string[];\n onMessage?: EmbeddedAppMessageHandler;\n onRequest?: EmbeddedAppRequestHandler;\n targetWindow?: Window | null;\n currentWindow?: Window;\n}\n\nexport interface EmbeddedAppBridge {\n parentOrigin: string | null;\n postMessage<TPayload = unknown>(name: string, payload?: TPayload): boolean;\n request<TResult = unknown, TPayload = unknown>(\n name: string,\n payload?: TPayload,\n options?: { timeoutMs?: number },\n ): Promise<TResult>;\n ready<TPayload = unknown>(payload?: TPayload): boolean;\n close<TPayload = unknown>(payload?: TPayload): boolean;\n destroy(): void;\n}\n\ntype PendingRequest = {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout> | undefined;\n};\n\nfunction resolveParentOrigin(win: Window, explicit?: string): string | null {\n if (explicit) return explicit;\n const referrerOrigin = embeddedAppOrigin(win.document?.referrer ?? \"\");\n return referrerOrigin;\n}\n\nfunction postToParent(\n win: Window,\n parent: Window | null,\n parentOrigin: string | null,\n envelope: AgentNativeEmbedEnvelope,\n): boolean {\n const target = parent ?? (win.parent === win ? null : win.parent);\n if (!parentOrigin) return false;\n if (!target) return false;\n target.postMessage(envelope, parentOrigin);\n return true;\n}\n\nexport function createEmbeddedAppBridge(\n options: EmbeddedAppBridgeOptions = {},\n): EmbeddedAppBridge {\n const win = options.currentWindow ?? window;\n const parentOrigin = resolveParentOrigin(win, options.parentOrigin);\n const allowedOrigins =\n options.allowedOrigins ??\n (parentOrigin && parentOrigin !== \"*\" ? [parentOrigin] : []);\n const pending = new Map<string, PendingRequest>();\n let destroyed = false;\n\n const postEnvelope = (envelope: AgentNativeEmbedEnvelope) =>\n postToParent(win, options.targetWindow ?? null, parentOrigin, envelope);\n\n const listener = (event: MessageEvent) => {\n if (destroyed) return;\n if (!isAllowedEmbeddedAppOrigin(event.origin, allowedOrigins)) return;\n if (!isAgentNativeEmbedEnvelope(event.data)) return;\n\n const envelope = event.data;\n if (envelope.type === AGENT_NATIVE_EMBED_MESSAGE_TYPES.RESPONSE) {\n const requestId = envelope.requestId;\n if (!requestId) return;\n const entry = pending.get(requestId);\n if (!entry) return;\n pending.delete(requestId);\n if (entry.timer) clearTimeout(entry.timer);\n entry.resolve(envelope.payload);\n return;\n }\n\n if (envelope.type === AGENT_NATIVE_EMBED_MESSAGE_TYPES.ERROR) {\n const requestId = envelope.requestId;\n if (!requestId) return;\n const entry = pending.get(requestId);\n if (!entry) return;\n pending.delete(requestId);\n if (entry.timer) clearTimeout(entry.timer);\n entry.reject(new Error(envelope.error?.message ?? \"Embedded app error\"));\n return;\n }\n\n if (!envelope.name) return;\n const message = {\n name: envelope.name,\n payload: envelope.payload,\n event,\n } satisfies EmbeddedAppMessageEvent;\n\n if (envelope.type === AGENT_NATIVE_EMBED_MESSAGE_TYPES.REQUEST) {\n Promise.resolve(options.onRequest?.(message))\n .then((payload) => {\n postEnvelope(\n createAgentNativeEmbedEnvelope(\n AGENT_NATIVE_EMBED_MESSAGE_TYPES.RESPONSE,\n { requestId: envelope.requestId, payload },\n ),\n );\n })\n .catch((error) => {\n postEnvelope(\n createAgentNativeEmbedEnvelope(\n AGENT_NATIVE_EMBED_MESSAGE_TYPES.ERROR,\n {\n requestId: envelope.requestId,\n error: messageErrorPayload(error),\n },\n ),\n );\n });\n return;\n }\n\n if (envelope.type === AGENT_NATIVE_EMBED_MESSAGE_TYPES.MESSAGE) {\n options.onMessage?.(message);\n }\n };\n\n win.addEventListener(\"message\", listener);\n\n return {\n parentOrigin,\n postMessage(name, payload) {\n return postEnvelope(\n createAgentNativeEmbedEnvelope(\n AGENT_NATIVE_EMBED_MESSAGE_TYPES.MESSAGE,\n { name, payload },\n ),\n );\n },\n request<TResult = unknown, TPayload = unknown>(\n name: string,\n payload?: TPayload,\n requestOptions?: { timeoutMs?: number },\n ) {\n const requestId = createEmbeddedAppRequestId();\n return new Promise<TResult>((resolve, reject) => {\n const timeoutMs = requestOptions?.timeoutMs ?? 30_000;\n const timer =\n timeoutMs > 0\n ? setTimeout(() => {\n pending.delete(requestId);\n reject(new Error(`Embedded app request timed out: ${name}`));\n }, timeoutMs)\n : undefined;\n pending.set(requestId, {\n resolve: (value) => resolve(value as TResult),\n reject,\n timer,\n });\n const posted = postEnvelope(\n createAgentNativeEmbedEnvelope(\n AGENT_NATIVE_EMBED_MESSAGE_TYPES.REQUEST,\n { name, payload, requestId },\n ),\n );\n if (!posted) {\n pending.delete(requestId);\n if (timer) clearTimeout(timer);\n reject(new Error(\"Embedded app parent window is not available\"));\n }\n });\n },\n ready(payload) {\n return postEnvelope(\n createAgentNativeEmbedEnvelope(AGENT_NATIVE_EMBED_MESSAGE_TYPES.READY, {\n payload,\n }),\n );\n },\n close(payload) {\n return this.postMessage(\"close\", payload);\n },\n destroy() {\n destroyed = true;\n win.removeEventListener(\"message\", listener);\n for (const entry of pending.values()) {\n if (entry.timer) clearTimeout(entry.timer);\n entry.reject(new Error(\"Embedded app bridge destroyed\"));\n }\n pending.clear();\n },\n };\n}\n\nexport function sendEmbeddedAppMessage<TPayload = unknown>(\n name: string,\n payload?: TPayload,\n options: Pick<\n EmbeddedAppBridgeOptions,\n \"currentWindow\" | \"parentOrigin\" | \"targetWindow\"\n > = {},\n): boolean {\n const win = options.currentWindow ?? window;\n const parentOrigin = resolveParentOrigin(win, options.parentOrigin);\n return postToParent(\n win,\n options.targetWindow ?? null,\n parentOrigin,\n createAgentNativeEmbedEnvelope(AGENT_NATIVE_EMBED_MESSAGE_TYPES.MESSAGE, {\n name,\n payload,\n }),\n );\n}\n\nexport function announceEmbeddedAppReady<TPayload = unknown>(\n payload?: TPayload,\n options: Pick<\n EmbeddedAppBridgeOptions,\n \"currentWindow\" | \"parentOrigin\" | \"targetWindow\"\n > = {},\n): boolean {\n const win = options.currentWindow ?? window;\n const parentOrigin = resolveParentOrigin(win, options.parentOrigin);\n return postToParent(\n win,\n options.targetWindow ?? null,\n parentOrigin,\n createAgentNativeEmbedEnvelope(AGENT_NATIVE_EMBED_MESSAGE_TYPES.READY, {\n payload,\n }),\n );\n}\n"]}
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/embedding/bridge.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n MCP_APP_CHAT_BRIDGE_QUERY_PARAM,\n EMBED_MODE_QUERY_PARAM,\n} from \"../shared/embed-auth.js\";\nimport {\n AGENT_NATIVE_EMBED_MESSAGE_TYPES,\n createAgentNativeEmbedEnvelope,\n createEmbeddedAppRequestId,\n embeddedAppOrigin,\n isAgentNativeEmbedEnvelope,\n isAllowedEmbeddedAppOrigin,\n messageErrorPayload,\n type AgentNativeEmbedEnvelope,\n} from \"./protocol.js\";\n\nexport interface EmbeddedAppMessageEvent<TPayload = unknown> {\n name: string;\n payload: TPayload;\n event: MessageEvent;\n}\n\nexport type EmbeddedAppMessageHandler = (\n message: EmbeddedAppMessageEvent,\n) => void;\n\nexport type EmbeddedAppRequestHandler = (\n message: EmbeddedAppMessageEvent,\n) => unknown | Promise<unknown>;\n\nexport interface EmbeddedAppBridgeOptions {\n /**\n * Exact parent origin to post back to. Defaults to document.referrer's\n * origin when available. If no origin can be resolved, sends fail closed.\n */\n parentOrigin?: string;\n /**\n * Origins allowed to send messages to the embedded app. Defaults to the\n * resolved parent origin.\n */\n allowedOrigins?: string[];\n onMessage?: EmbeddedAppMessageHandler;\n onRequest?: EmbeddedAppRequestHandler;\n targetWindow?: Window | null;\n currentWindow?: Window;\n}\n\nexport interface EmbeddedAppBridge {\n parentOrigin: string | null;\n postMessage<TPayload = unknown>(name: string, payload?: TPayload): boolean;\n request<TResult = unknown, TPayload = unknown>(\n name: string,\n payload?: TPayload,\n options?: { timeoutMs?: number },\n ): Promise<TResult>;\n ready<TPayload = unknown>(payload?: TPayload): boolean;\n close<TPayload = unknown>(payload?: TPayload): boolean;\n destroy(): void;\n}\n\ntype PendingRequest = {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout> | undefined;\n};\n\nfunction resolveParentOrigin(win: Window, explicit?: string): string | null {\n if (explicit) return explicit;\n if (shouldUseOpaqueParentTarget(win)) return \"*\";\n const referrerOrigin = embeddedAppOrigin(win.document?.referrer ?? \"\");\n return referrerOrigin;\n}\n\nfunction shouldUseOpaqueParentTarget(win: Window): boolean {\n try {\n const url = new URL(win.location.href);\n const chatBridge = url.searchParams.get(MCP_APP_CHAT_BRIDGE_QUERY_PARAM);\n const embedMode = url.searchParams.get(EMBED_MODE_QUERY_PARAM);\n return (\n chatBridge === \"1\" ||\n chatBridge === \"true\" ||\n embedMode === \"1\" ||\n embedMode === \"true\"\n );\n } catch {\n return false;\n }\n}\n\nfunction defaultAllowedOrigins(\n parentOrigin: string | null,\n referrerOrigin: string | null,\n): string[] {\n if (!parentOrigin) return [];\n if (parentOrigin === \"*\") {\n return [\"null\", ...(referrerOrigin ? [referrerOrigin] : [])];\n }\n return [parentOrigin];\n}\n\nfunction postToParent(\n win: Window,\n parent: Window | null,\n parentOrigin: string | null,\n envelope: AgentNativeEmbedEnvelope,\n): boolean {\n const target = parent ?? (win.parent === win ? null : win.parent);\n if (!parentOrigin) return false;\n if (!target) return false;\n target.postMessage(envelope, parentOrigin);\n return true;\n}\n\nexport function createEmbeddedAppBridge(\n options: EmbeddedAppBridgeOptions = {},\n): EmbeddedAppBridge {\n const win = options.currentWindow ?? window;\n const parentOrigin = resolveParentOrigin(win, options.parentOrigin);\n const referrerOrigin = embeddedAppOrigin(win.document?.referrer ?? \"\");\n const allowedOrigins =\n options.allowedOrigins ??\n defaultAllowedOrigins(parentOrigin, referrerOrigin);\n const pending = new Map<string, PendingRequest>();\n let destroyed = false;\n\n const postEnvelope = (envelope: AgentNativeEmbedEnvelope) =>\n postToParent(win, options.targetWindow ?? null, parentOrigin, envelope);\n\n const listener = (event: MessageEvent) => {\n if (destroyed) return;\n if (!isAllowedEmbeddedAppOrigin(event.origin, allowedOrigins)) return;\n if (!isAgentNativeEmbedEnvelope(event.data)) return;\n\n const envelope = event.data;\n if (envelope.type === AGENT_NATIVE_EMBED_MESSAGE_TYPES.RESPONSE) {\n const requestId = envelope.requestId;\n if (!requestId) return;\n const entry = pending.get(requestId);\n if (!entry) return;\n pending.delete(requestId);\n if (entry.timer) clearTimeout(entry.timer);\n entry.resolve(envelope.payload);\n return;\n }\n\n if (envelope.type === AGENT_NATIVE_EMBED_MESSAGE_TYPES.ERROR) {\n const requestId = envelope.requestId;\n if (!requestId) return;\n const entry = pending.get(requestId);\n if (!entry) return;\n pending.delete(requestId);\n if (entry.timer) clearTimeout(entry.timer);\n entry.reject(new Error(envelope.error?.message ?? \"Embedded app error\"));\n return;\n }\n\n if (!envelope.name) return;\n const message = {\n name: envelope.name,\n payload: envelope.payload,\n event,\n } satisfies EmbeddedAppMessageEvent;\n\n if (envelope.type === AGENT_NATIVE_EMBED_MESSAGE_TYPES.REQUEST) {\n Promise.resolve(options.onRequest?.(message))\n .then((payload) => {\n postEnvelope(\n createAgentNativeEmbedEnvelope(\n AGENT_NATIVE_EMBED_MESSAGE_TYPES.RESPONSE,\n { requestId: envelope.requestId, payload },\n ),\n );\n })\n .catch((error) => {\n postEnvelope(\n createAgentNativeEmbedEnvelope(\n AGENT_NATIVE_EMBED_MESSAGE_TYPES.ERROR,\n {\n requestId: envelope.requestId,\n error: messageErrorPayload(error),\n },\n ),\n );\n });\n return;\n }\n\n if (envelope.type === AGENT_NATIVE_EMBED_MESSAGE_TYPES.MESSAGE) {\n options.onMessage?.(message);\n }\n };\n\n win.addEventListener(\"message\", listener);\n\n return {\n parentOrigin,\n postMessage(name, payload) {\n return postEnvelope(\n createAgentNativeEmbedEnvelope(\n AGENT_NATIVE_EMBED_MESSAGE_TYPES.MESSAGE,\n { name, payload },\n ),\n );\n },\n request<TResult = unknown, TPayload = unknown>(\n name: string,\n payload?: TPayload,\n requestOptions?: { timeoutMs?: number },\n ) {\n const requestId = createEmbeddedAppRequestId();\n return new Promise<TResult>((resolve, reject) => {\n const timeoutMs = requestOptions?.timeoutMs ?? 30_000;\n const timer =\n timeoutMs > 0\n ? setTimeout(() => {\n pending.delete(requestId);\n reject(new Error(`Embedded app request timed out: ${name}`));\n }, timeoutMs)\n : undefined;\n pending.set(requestId, {\n resolve: (value) => resolve(value as TResult),\n reject,\n timer,\n });\n const posted = postEnvelope(\n createAgentNativeEmbedEnvelope(\n AGENT_NATIVE_EMBED_MESSAGE_TYPES.REQUEST,\n { name, payload, requestId },\n ),\n );\n if (!posted) {\n pending.delete(requestId);\n if (timer) clearTimeout(timer);\n reject(new Error(\"Embedded app parent window is not available\"));\n }\n });\n },\n ready(payload) {\n return postEnvelope(\n createAgentNativeEmbedEnvelope(AGENT_NATIVE_EMBED_MESSAGE_TYPES.READY, {\n payload,\n }),\n );\n },\n close(payload) {\n return this.postMessage(\"close\", payload);\n },\n destroy() {\n destroyed = true;\n win.removeEventListener(\"message\", listener);\n for (const entry of pending.values()) {\n if (entry.timer) clearTimeout(entry.timer);\n entry.reject(new Error(\"Embedded app bridge destroyed\"));\n }\n pending.clear();\n },\n };\n}\n\nexport function sendEmbeddedAppMessage<TPayload = unknown>(\n name: string,\n payload?: TPayload,\n options: Pick<\n EmbeddedAppBridgeOptions,\n \"currentWindow\" | \"parentOrigin\" | \"targetWindow\"\n > = {},\n): boolean {\n const win = options.currentWindow ?? window;\n const parentOrigin = resolveParentOrigin(win, options.parentOrigin);\n return postToParent(\n win,\n options.targetWindow ?? null,\n parentOrigin,\n createAgentNativeEmbedEnvelope(AGENT_NATIVE_EMBED_MESSAGE_TYPES.MESSAGE, {\n name,\n payload,\n }),\n );\n}\n\nexport function announceEmbeddedAppReady<TPayload = unknown>(\n payload?: TPayload,\n options: Pick<\n EmbeddedAppBridgeOptions,\n \"currentWindow\" | \"parentOrigin\" | \"targetWindow\"\n > = {},\n): boolean {\n const win = options.currentWindow ?? window;\n const parentOrigin = resolveParentOrigin(win, options.parentOrigin);\n return postToParent(\n win,\n options.targetWindow ?? null,\n parentOrigin,\n createAgentNativeEmbedEnvelope(AGENT_NATIVE_EMBED_MESSAGE_TYPES.READY, {\n payload,\n }),\n );\n}\n"]}
@@ -62,7 +62,7 @@ export declare const extensions: import("drizzle-orm/sqlite-core").SQLiteTableWi
62
62
  tableName: "tools";
63
63
  dataType: "string";
64
64
  columnType: "SQLiteText";
65
- data: "public" | "private" | "org";
65
+ data: "private" | "org" | "public";
66
66
  driverParam: string;
67
67
  notNull: true;
68
68
  hasDefault: true;
@@ -335,7 +335,7 @@ export declare const extensionShares: import("drizzle-orm/sqlite-core").SQLiteTa
335
335
  tableName: string;
336
336
  dataType: "string";
337
337
  columnType: "SQLiteText";
338
- data: "admin" | "viewer" | "editor";
338
+ data: "viewer" | "editor" | "admin";
339
339
  driverParam: string;
340
340
  notNull: true;
341
341
  hasDefault: true;
@@ -112,6 +112,8 @@ export interface MCPCallerIdentity {
112
112
  oauthScopes?: string[];
113
113
  /** Present only for standard remote MCP OAuth access tokens. */
114
114
  oauthClientId?: string;
115
+ /** Present only for framework-minted first-party MCP client tokens. */
116
+ firstPartyMcp?: boolean;
115
117
  }
116
118
  /** Per-request context used to turn an action's relative deep link into the
117
119
  * absolute web URL (and desktop `agentnative://` URL) the external agent
@@ -1 +1 @@
1
- {"version":3,"file":"build-server.d.ts","sourceRoot":"","sources":["../../src/mcp/build-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build-server.d.ts","sourceRoot":"","sources":["../../src/mcp/build-server.ts"],"names":[],"mappings":"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"}
@@ -494,7 +494,7 @@ function safeUiSegment(value, fallback) {
494
494
  }
495
495
  // ChatGPT and Claude cache MCP App resource HTML by `ui://` URI. Bump this
496
496
  // when the shared shell changes in a way that must invalidate host caches.
497
- const MCP_APP_RESOURCE_SHELL_VERSION = "shell-v46";
497
+ const MCP_APP_RESOURCE_SHELL_VERSION = "shell-v51";
498
498
  function legacyDefaultMcpAppUri(config, actionName) {
499
499
  const app = safeUiSegment(config.appId ?? config.name, "agent-native");
500
500
  const action = safeUiSegment(actionName, "tool");
@@ -1324,7 +1324,7 @@ function addSecretCandidate(candidates, secret) {
1324
1324
  return;
1325
1325
  candidates.push(trimmed);
1326
1326
  }
1327
- async function verifyA2AJwtForMcp(token) {
1327
+ async function verifyA2AJwtForMcp(token, resourceUrl) {
1328
1328
  const jose = await import("jose");
1329
1329
  let unverifiedPayload = null;
1330
1330
  try {
@@ -1347,17 +1347,37 @@ async function verifyA2AJwtForMcp(token) {
1347
1347
  // DB not ready or org lookup unavailable — fall back to other candidates.
1348
1348
  }
1349
1349
  }
1350
+ const firstPartyMcp = unverifiedPayload.agent_native_first_party_mcp === true;
1351
+ const audiences = firstPartyMcp ? mcpAudienceList(resourceUrl) : null;
1352
+ if (firstPartyMcp && !audiences?.length)
1353
+ return null;
1350
1354
  for (const secret of candidateSecrets) {
1351
- try {
1352
- const { payload } = await jose.jwtVerify(token, new TextEncoder().encode(secret));
1353
- return payload;
1354
- }
1355
- catch {
1356
- // Try the next candidate without exposing which secret matched.
1355
+ const encodedSecret = new TextEncoder().encode(secret);
1356
+ for (const audience of audiences ?? [undefined]) {
1357
+ try {
1358
+ const { payload } = await jose.jwtVerify(token, encodedSecret, audience ? { audience } : undefined);
1359
+ return payload;
1360
+ }
1361
+ catch {
1362
+ // Try the next candidate without exposing which secret matched.
1363
+ }
1357
1364
  }
1358
1365
  }
1359
1366
  return null;
1360
1367
  }
1368
+ function mcpAudienceList(resource) {
1369
+ const raw = Array.isArray(resource) ? resource : resource ? [resource] : [];
1370
+ const seen = new Set();
1371
+ const out = [];
1372
+ for (const value of raw) {
1373
+ const normalized = value.replace(/\/+$/, "");
1374
+ if (normalized && !seen.has(normalized)) {
1375
+ seen.add(normalized);
1376
+ out.push(normalized);
1377
+ }
1378
+ }
1379
+ return out;
1380
+ }
1361
1381
  async function isConnectTokenAllowed(jti) {
1362
1382
  if (!jti)
1363
1383
  return false;
@@ -1442,7 +1462,7 @@ export async function verifyAuth(authHeader, ownerEmailHeader, options = {}) {
1442
1462
  return { authed: false };
1443
1463
  // Try an A2A JWT via the shared A2A_SECRET first, then the caller org's
1444
1464
  // synced A2A secret when the token carries org_domain.
1445
- const payload = await verifyA2AJwtForMcp(token);
1465
+ const payload = await verifyA2AJwtForMcp(token, options.resourceUrl);
1446
1466
  if (payload) {
1447
1467
  const tokenScope = typeof payload.scope === "string" ? payload.scope : undefined;
1448
1468
  if (tokenScope && tokenScope !== MCP_CONNECT_SCOPE) {
@@ -1473,6 +1493,9 @@ export async function verifyAuth(authHeader, ownerEmailHeader, options = {}) {
1473
1493
  orgDomain: typeof payload.org_domain === "string"
1474
1494
  ? payload.org_domain
1475
1495
  : undefined,
1496
+ ...(payload.agent_native_first_party_mcp === true
1497
+ ? { firstPartyMcp: true }
1498
+ : {}),
1476
1499
  },
1477
1500
  // Verified JWT (connect-minted or A2A delegation) — a real caller.
1478
1501
  fullSurface: true,