@agent-native/core 0.113.0 → 0.114.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1508) hide show
  1. package/agent-native.eject.json +164 -0
  2. package/corpus/README.md +3 -3
  3. package/corpus/core/CHANGELOG.md +11 -0
  4. package/corpus/core/README.md +61 -174
  5. package/corpus/core/agent-native.eject.json +164 -0
  6. package/corpus/core/docs/content/agent-native-toolkit.mdx +38 -0
  7. package/corpus/core/docs/content/package-lifecycle.mdx +54 -4
  8. package/corpus/core/package.json +15 -2
  9. package/corpus/core/src/cli/eject.ts +1594 -0
  10. package/corpus/core/src/cli/index.ts +16 -0
  11. package/corpus/core/src/client/index.ts +4 -0
  12. package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +8 -2
  13. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +7 -2
  14. package/corpus/core/src/client/resources/ResourcesPanel.tsx +17 -3
  15. package/corpus/core/src/client/resources/index.ts +19 -0
  16. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +9 -1
  17. package/corpus/core/src/client/resources/runtime.ts +1 -0
  18. package/corpus/core/src/client/setup-connections/catalog.ts +6 -0
  19. package/corpus/core/src/client/setup-connections/index.ts +1 -0
  20. package/corpus/core/src/client/setup-connections/runtime.ts +1 -0
  21. package/corpus/core/src/connections/catalog.ts +41 -24
  22. package/corpus/core/src/connections/index.ts +1 -0
  23. package/corpus/core/src/connections/runtime.ts +1 -0
  24. package/corpus/core/src/eject/provider-api-definitions.ts +193 -0
  25. package/corpus/core/src/eject/remote-mcp-presets.ts +137 -0
  26. package/corpus/core/src/eject/setup-readiness-ui.tsx +29 -0
  27. package/corpus/core/src/eject/workspace-connections.ts +92 -0
  28. package/corpus/core/src/index.ts +1 -0
  29. package/corpus/core/src/integrations/adapter-overrides.ts +12 -0
  30. package/corpus/core/src/integrations/eject/messaging-adapters.ts +85 -0
  31. package/corpus/core/src/integrations/index.ts +5 -1
  32. package/corpus/core/src/integrations/plugin.ts +34 -12
  33. package/corpus/core/src/integrations/runtime.ts +1 -0
  34. package/corpus/core/src/integrations/types.ts +3 -1
  35. package/corpus/core/src/package-lifecycle/eject-manifest.ts +345 -0
  36. package/corpus/core/src/package-lifecycle/index.ts +1 -0
  37. package/corpus/core/src/provider-api/index.ts +46 -12
  38. package/corpus/core/src/provider-api/runtime.ts +1 -0
  39. package/corpus/core/src/setup-connections/index.ts +1 -0
  40. package/corpus/core/src/shared/merge-by-id.ts +14 -0
  41. package/corpus/core/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +15 -13
  42. package/corpus/core/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  43. package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +9 -6
  44. package/corpus/core/src/templates/default/AGENTS.md +6 -5
  45. package/corpus/core/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +15 -13
  46. package/corpus/core/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  47. package/corpus/core/src/templates/headless/AGENTS.md +5 -4
  48. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +15 -13
  49. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +3 -2
  50. package/corpus/core/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  51. package/corpus/core/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +9 -6
  52. package/corpus/core/src/templates/workspace-core/AGENTS.md +4 -4
  53. package/corpus/core/src/templates/workspace-root/AGENTS.md +4 -4
  54. package/corpus/core/src/vite/client.ts +25 -2
  55. package/corpus/templates/analytics/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  56. package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +9 -6
  57. package/corpus/templates/assets/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  58. package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +9 -6
  59. package/corpus/templates/brain/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  60. package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +9 -6
  61. package/corpus/templates/brain/actions/remediate-legacy-capture-audiences.ts +167 -0
  62. package/corpus/templates/brain/app/lib/brain-chat-readiness.ts +6 -0
  63. package/corpus/templates/brain/app/routes/_index.tsx +8 -0
  64. package/corpus/templates/brain/app/routes.ts +1 -0
  65. package/corpus/templates/brain/changelog/2026-07-19-ask-starts-immediately-when-builder-s-managed-ai-connection-.md +6 -0
  66. package/corpus/templates/brain/changelog/2026-07-19-slack-and-granola-backfills-now-process-captures-concurrentl.md +6 -0
  67. package/corpus/templates/brain/changelog/2026-07-19-source-review-settings-now-control-knowledge-approval.md +6 -0
  68. package/corpus/templates/brain/changelog/2026-07-19-the-manage-agent-page-now-opens-correctly-from-brain-navigat.md +6 -0
  69. package/corpus/templates/brain/server/db/schema.ts +3 -0
  70. package/corpus/templates/brain/server/lib/brain.ts +41 -2
  71. package/corpus/templates/brain/server/lib/connectors.ts +379 -113
  72. package/corpus/templates/brain/server/lib/meeting-audience.ts +38 -0
  73. package/corpus/templates/brain/server/plugins/db.ts +10 -0
  74. package/corpus/templates/brain/server/routes/api/_agent-native/brain/ingest.post.ts +6 -4
  75. package/corpus/templates/calendar/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  76. package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +9 -6
  77. package/corpus/templates/chat/.agents/skills/agent-native-docs/SKILL.md +15 -13
  78. package/corpus/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  79. package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +9 -6
  80. package/corpus/templates/chat/AGENTS.md +3 -2
  81. package/corpus/templates/clips/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  82. package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +9 -6
  83. package/corpus/templates/content/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  84. package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +9 -6
  85. package/corpus/templates/design/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  86. package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +9 -6
  87. package/corpus/templates/dispatch/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  88. package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +9 -6
  89. package/corpus/templates/forms/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  90. package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +9 -6
  91. package/corpus/templates/macros/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  92. package/corpus/templates/mail/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  93. package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +9 -6
  94. package/corpus/templates/plan/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  95. package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +9 -6
  96. package/corpus/templates/slides/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  97. package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +9 -6
  98. package/corpus/templates/tasks/.agents/skills/agent-native-docs/SKILL.md +15 -13
  99. package/corpus/templates/tasks/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  100. package/corpus/templates/tasks/.agents/skills/self-modifying-code/SKILL.md +9 -6
  101. package/corpus/toolkit/CHANGELOG.md +6 -0
  102. package/corpus/toolkit/agent-native.eject.json +411 -0
  103. package/corpus/toolkit/package.json +5 -2
  104. package/dist/cli/eject.d.ts +21 -0
  105. package/dist/cli/eject.d.ts.map +1 -0
  106. package/dist/cli/eject.js +1145 -0
  107. package/dist/cli/eject.js.map +1 -0
  108. package/dist/cli/index.js +15 -0
  109. package/dist/cli/index.js.map +1 -1
  110. package/dist/client/index.d.ts +1 -1
  111. package/dist/client/index.d.ts.map +1 -1
  112. package/dist/client/index.js +1 -1
  113. package/dist/client/index.js.map +1 -1
  114. package/dist/client/resources/McpConnectionSuggestion.d.ts +4 -3
  115. package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
  116. package/dist/client/resources/McpConnectionSuggestion.js +3 -3
  117. package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
  118. package/dist/client/resources/McpIntegrationDialog.d.ts +4 -3
  119. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  120. package/dist/client/resources/McpIntegrationDialog.js +2 -2
  121. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  122. package/dist/client/resources/ResourcesPanel.d.ts +4 -1
  123. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  124. package/dist/client/resources/ResourcesPanel.js +9 -7
  125. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  126. package/dist/client/resources/index.d.ts +3 -0
  127. package/dist/client/resources/index.d.ts.map +1 -1
  128. package/dist/client/resources/index.js +3 -0
  129. package/dist/client/resources/index.js.map +1 -1
  130. package/dist/client/resources/mcp-integration-catalog.d.ts +2 -1
  131. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  132. package/dist/client/resources/mcp-integration-catalog.js +6 -2
  133. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  134. package/dist/client/resources/runtime.d.ts +2 -0
  135. package/dist/client/resources/runtime.d.ts.map +1 -0
  136. package/dist/client/resources/runtime.js +2 -0
  137. package/dist/client/resources/runtime.js.map +1 -0
  138. package/dist/client/setup-connections/catalog.d.ts +2 -0
  139. package/dist/client/setup-connections/catalog.d.ts.map +1 -0
  140. package/dist/client/setup-connections/catalog.js +7 -0
  141. package/dist/client/setup-connections/catalog.js.map +1 -0
  142. package/dist/client/setup-connections/index.d.ts +1 -0
  143. package/dist/client/setup-connections/index.d.ts.map +1 -1
  144. package/dist/client/setup-connections/index.js +1 -0
  145. package/dist/client/setup-connections/index.js.map +1 -1
  146. package/dist/client/setup-connections/runtime.d.ts +2 -0
  147. package/dist/client/setup-connections/runtime.d.ts.map +1 -0
  148. package/dist/client/setup-connections/runtime.js +2 -0
  149. package/dist/client/setup-connections/runtime.js.map +1 -0
  150. package/dist/collab/awareness.d.ts +2 -2
  151. package/dist/collab/awareness.d.ts.map +1 -1
  152. package/dist/collab/routes.d.ts +1 -1
  153. package/dist/connections/catalog.d.ts +5 -3
  154. package/dist/connections/catalog.d.ts.map +1 -1
  155. package/dist/connections/catalog.js +16 -8
  156. package/dist/connections/catalog.js.map +1 -1
  157. package/dist/connections/index.d.ts +1 -1
  158. package/dist/connections/index.d.ts.map +1 -1
  159. package/dist/connections/index.js +1 -1
  160. package/dist/connections/index.js.map +1 -1
  161. package/dist/connections/runtime.d.ts +2 -0
  162. package/dist/connections/runtime.d.ts.map +1 -0
  163. package/dist/connections/runtime.js +2 -0
  164. package/dist/connections/runtime.js.map +1 -0
  165. package/dist/eject/provider-api-definitions.d.ts +34 -0
  166. package/dist/eject/provider-api-definitions.d.ts.map +1 -0
  167. package/dist/eject/provider-api-definitions.js +88 -0
  168. package/dist/eject/provider-api-definitions.js.map +1 -0
  169. package/dist/eject/remote-mcp-presets.d.ts +17 -0
  170. package/dist/eject/remote-mcp-presets.d.ts.map +1 -0
  171. package/dist/eject/remote-mcp-presets.js +81 -0
  172. package/dist/eject/remote-mcp-presets.js.map +1 -0
  173. package/dist/eject/setup-readiness-ui.d.ts +7 -0
  174. package/dist/eject/setup-readiness-ui.d.ts.map +1 -0
  175. package/dist/eject/setup-readiness-ui.js +13 -0
  176. package/dist/eject/setup-readiness-ui.js.map +1 -0
  177. package/dist/eject/workspace-connections.d.ts +11 -0
  178. package/dist/eject/workspace-connections.d.ts.map +1 -0
  179. package/dist/eject/workspace-connections.js +47 -0
  180. package/dist/eject/workspace-connections.js.map +1 -0
  181. package/dist/index.d.ts +1 -1
  182. package/dist/index.d.ts.map +1 -1
  183. package/dist/index.js +1 -1
  184. package/dist/index.js.map +1 -1
  185. package/dist/integrations/adapter-overrides.d.ts +3 -0
  186. package/dist/integrations/adapter-overrides.d.ts.map +1 -0
  187. package/dist/integrations/adapter-overrides.js +7 -0
  188. package/dist/integrations/adapter-overrides.js.map +1 -0
  189. package/dist/integrations/eject/messaging-adapters.d.ts +12 -0
  190. package/dist/integrations/eject/messaging-adapters.d.ts.map +1 -0
  191. package/dist/integrations/eject/messaging-adapters.js +49 -0
  192. package/dist/integrations/eject/messaging-adapters.js.map +1 -0
  193. package/dist/integrations/index.d.ts +3 -2
  194. package/dist/integrations/index.d.ts.map +1 -1
  195. package/dist/integrations/index.js +2 -1
  196. package/dist/integrations/index.js.map +1 -1
  197. package/dist/integrations/plugin.d.ts +32 -1
  198. package/dist/integrations/plugin.d.ts.map +1 -1
  199. package/dist/integrations/plugin.js +19 -12
  200. package/dist/integrations/plugin.js.map +1 -1
  201. package/dist/integrations/runtime.d.ts +2 -0
  202. package/dist/integrations/runtime.d.ts.map +1 -0
  203. package/dist/integrations/runtime.js +2 -0
  204. package/dist/integrations/runtime.js.map +1 -0
  205. package/dist/integrations/types.d.ts +3 -1
  206. package/dist/integrations/types.d.ts.map +1 -1
  207. package/dist/integrations/types.js.map +1 -1
  208. package/dist/notifications/routes.d.ts +3 -3
  209. package/dist/package-lifecycle/eject-manifest.d.ts +43 -0
  210. package/dist/package-lifecycle/eject-manifest.d.ts.map +1 -0
  211. package/dist/package-lifecycle/eject-manifest.js +219 -0
  212. package/dist/package-lifecycle/eject-manifest.js.map +1 -0
  213. package/dist/package-lifecycle/index.d.ts +1 -0
  214. package/dist/package-lifecycle/index.d.ts.map +1 -1
  215. package/dist/package-lifecycle/index.js +1 -0
  216. package/dist/package-lifecycle/index.js.map +1 -1
  217. package/dist/progress/routes.d.ts +1 -1
  218. package/dist/provider-api/actions/custom-provider-registration.d.ts +4 -4
  219. package/dist/provider-api/actions/provider-api.d.ts +8 -8
  220. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  221. package/dist/provider-api/index.d.ts +6 -2
  222. package/dist/provider-api/index.d.ts.map +1 -1
  223. package/dist/provider-api/index.js +25 -12
  224. package/dist/provider-api/index.js.map +1 -1
  225. package/dist/provider-api/runtime.d.ts +2 -0
  226. package/dist/provider-api/runtime.d.ts.map +1 -0
  227. package/dist/provider-api/runtime.js +2 -0
  228. package/dist/provider-api/runtime.js.map +1 -0
  229. package/dist/secrets/routes.d.ts +9 -9
  230. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  231. package/dist/server/transcribe-voice.d.ts +1 -1
  232. package/dist/setup-connections/index.d.ts +1 -1
  233. package/dist/setup-connections/index.d.ts.map +1 -1
  234. package/dist/setup-connections/index.js +1 -1
  235. package/dist/setup-connections/index.js.map +1 -1
  236. package/dist/shared/merge-by-id.d.ts +5 -0
  237. package/dist/shared/merge-by-id.d.ts.map +1 -0
  238. package/dist/shared/merge-by-id.js +7 -0
  239. package/dist/shared/merge-by-id.js.map +1 -0
  240. package/dist/templates/chat/.agents/skills/agent-native-docs/SKILL.md +15 -13
  241. package/dist/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  242. package/dist/templates/chat/.agents/skills/self-modifying-code/SKILL.md +9 -6
  243. package/dist/templates/chat/AGENTS.md +3 -2
  244. package/dist/templates/default/.agents/skills/agent-native-docs/SKILL.md +15 -13
  245. package/dist/templates/default/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  246. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +9 -6
  247. package/dist/templates/default/AGENTS.md +6 -5
  248. package/dist/templates/headless/.agents/skills/agent-native-docs/SKILL.md +15 -13
  249. package/dist/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  250. package/dist/templates/headless/AGENTS.md +5 -4
  251. package/dist/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +15 -13
  252. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +3 -2
  253. package/dist/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  254. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +9 -6
  255. package/dist/templates/workspace-core/AGENTS.md +4 -4
  256. package/dist/templates/workspace-root/AGENTS.md +4 -4
  257. package/dist/vite/client.d.ts.map +1 -1
  258. package/dist/vite/client.js +22 -2
  259. package/dist/vite/client.js.map +1 -1
  260. package/docs/content/agent-native-toolkit.mdx +38 -0
  261. package/docs/content/package-lifecycle.mdx +54 -4
  262. package/package.json +15 -2
  263. package/src/a2a/agent-card.ts +83 -0
  264. package/src/a2a/artifact-response.ts +1648 -0
  265. package/src/a2a/auth-policy.ts +66 -0
  266. package/src/a2a/caller-auth.ts +102 -0
  267. package/src/a2a/client.ts +876 -0
  268. package/src/a2a/correlation.ts +50 -0
  269. package/src/a2a/handlers.ts +1285 -0
  270. package/src/a2a/index.ts +50 -0
  271. package/src/a2a/invoke.ts +348 -0
  272. package/src/a2a/response-text.ts +53 -0
  273. package/src/a2a/server.ts +586 -0
  274. package/src/a2a/task-store.ts +917 -0
  275. package/src/a2a/types.ts +221 -0
  276. package/src/a2a-claims.ts +52 -0
  277. package/src/action-change-marker.ts +74 -0
  278. package/src/action-ui.ts +38 -0
  279. package/src/action.ts +1406 -0
  280. package/src/adapters/cli/index.ts +6 -0
  281. package/src/adapters/cli/registry.ts +73 -0
  282. package/src/adapters/cli/shell-adapter.ts +92 -0
  283. package/src/adapters/cli/types.ts +27 -0
  284. package/src/agent/action-continuation-guidance.ts +38 -0
  285. package/src/agent/app-model-defaults.ts +201 -0
  286. package/src/agent/context-xray/actions/context-evict.ts +56 -0
  287. package/src/agent/context-xray/actions/context-manifest-get.ts +75 -0
  288. package/src/agent/context-xray/actions/context-pin.ts +56 -0
  289. package/src/agent/context-xray/actions/context-preview-get.ts +134 -0
  290. package/src/agent/context-xray/actions/context-report.ts +75 -0
  291. package/src/agent/context-xray/actions/context-restore.ts +51 -0
  292. package/src/agent/context-xray/actions/errors.ts +40 -0
  293. package/src/agent/context-xray/apply-directives.ts +137 -0
  294. package/src/agent/context-xray/directives-store.ts +178 -0
  295. package/src/agent/context-xray/identity.ts +37 -0
  296. package/src/agent/context-xray/manifest.ts +284 -0
  297. package/src/agent/context-xray/migrations.ts +32 -0
  298. package/src/agent/context-xray/plugin.ts +23 -0
  299. package/src/agent/context-xray/schema.ts +17 -0
  300. package/src/agent/context-xray/segments.ts +194 -0
  301. package/src/agent/context-xray/tokenize.ts +93 -0
  302. package/src/agent/default-model.ts +5 -0
  303. package/src/agent/durable-background.ts +547 -0
  304. package/src/agent/engine/ai-sdk-engine.ts +565 -0
  305. package/src/agent/engine/anthropic-engine.ts +320 -0
  306. package/src/agent/engine/builder-engine.ts +1110 -0
  307. package/src/agent/engine/builder-gateway-headers.ts +44 -0
  308. package/src/agent/engine/builtin.ts +122 -0
  309. package/src/agent/engine/context-directives-transform.ts +73 -0
  310. package/src/agent/engine/continuation-dispatch-retry.ts +168 -0
  311. package/src/agent/engine/credential-errors.ts +69 -0
  312. package/src/agent/engine/index.ts +54 -0
  313. package/src/agent/engine/openai-compatible-endpoint.ts +25 -0
  314. package/src/agent/engine/output-tokens.ts +181 -0
  315. package/src/agent/engine/provider-env-vars.ts +69 -0
  316. package/src/agent/engine/registry.ts +853 -0
  317. package/src/agent/engine/tool-call-journal-seed.ts +85 -0
  318. package/src/agent/engine/translate-ai-sdk.ts +407 -0
  319. package/src/agent/engine/translate-anthropic.ts +611 -0
  320. package/src/agent/engine/types.ts +310 -0
  321. package/src/agent/harness/acp-adapter.ts +893 -0
  322. package/src/agent/harness/acp-builtin.ts +70 -0
  323. package/src/agent/harness/ai-sdk-adapter.ts +509 -0
  324. package/src/agent/harness/background.ts +365 -0
  325. package/src/agent/harness/builtin.ts +50 -0
  326. package/src/agent/harness/index.ts +86 -0
  327. package/src/agent/harness/lifecycle.ts +498 -0
  328. package/src/agent/harness/registry.ts +97 -0
  329. package/src/agent/harness/runner.ts +182 -0
  330. package/src/agent/harness/store.ts +466 -0
  331. package/src/agent/harness/translate.ts +130 -0
  332. package/src/agent/harness/types.ts +129 -0
  333. package/src/agent/index.ts +32 -0
  334. package/src/agent/loop-settings.ts +186 -0
  335. package/src/agent/model-config.ts +363 -0
  336. package/src/agent/observational-memory/compactor.ts +78 -0
  337. package/src/agent/observational-memory/config.ts +78 -0
  338. package/src/agent/observational-memory/index.ts +79 -0
  339. package/src/agent/observational-memory/internal-run.ts +89 -0
  340. package/src/agent/observational-memory/message-text.ts +49 -0
  341. package/src/agent/observational-memory/migrations.ts +44 -0
  342. package/src/agent/observational-memory/observer.ts +128 -0
  343. package/src/agent/observational-memory/plugin.ts +35 -0
  344. package/src/agent/observational-memory/prompts.ts +53 -0
  345. package/src/agent/observational-memory/read.ts +131 -0
  346. package/src/agent/observational-memory/reflector.ts +119 -0
  347. package/src/agent/observational-memory/schema.ts +48 -0
  348. package/src/agent/observational-memory/store.ts +275 -0
  349. package/src/agent/observational-memory/types.ts +65 -0
  350. package/src/agent/processors.ts +209 -0
  351. package/src/agent/production-agent.ts +8254 -0
  352. package/src/agent/run-loop-with-resume.ts +394 -0
  353. package/src/agent/run-manager.ts +1825 -0
  354. package/src/agent/run-ownership.ts +75 -0
  355. package/src/agent/run-store.ts +2601 -0
  356. package/src/agent/runtime-context.ts +169 -0
  357. package/src/agent/thread-data-builder.ts +1584 -0
  358. package/src/agent/tool-call-journal.ts +368 -0
  359. package/src/agent/tool-error-redaction.ts +52 -0
  360. package/src/agent/tool-result-images.ts +178 -0
  361. package/src/agent/tool-search.ts +376 -0
  362. package/src/agent/types.ts +372 -0
  363. package/src/agent-native/index.ts +198 -0
  364. package/src/agent-web/config.ts +253 -0
  365. package/src/agent-web/generator.ts +382 -0
  366. package/src/agent-web/index.ts +36 -0
  367. package/src/appearance/actions/change-appearance.ts +35 -0
  368. package/src/application-state/emitter.ts +81 -0
  369. package/src/application-state/handlers.ts +121 -0
  370. package/src/application-state/index.ts +44 -0
  371. package/src/application-state/script-helpers.ts +155 -0
  372. package/src/application-state/store.ts +274 -0
  373. package/src/assets/branding/agent-native.icon/Assets/background.svg +3 -0
  374. package/src/assets/branding/agent-native.icon/Assets/foreground.svg +12 -0
  375. package/src/assets/branding/agent-native.icon/icon.json +49 -0
  376. package/src/assets/branding/favicon.png +0 -0
  377. package/src/assets/branding/favicon.svg +1 -0
  378. package/src/assets/branding/icon-on-dark.svg +10 -0
  379. package/src/assets/branding/icon-on-light.svg +10 -0
  380. package/src/assets/branding/mac-app-icon.svg +1 -0
  381. package/src/assets/branding/slack-bot/agent-native-1024.png +0 -0
  382. package/src/assets/branding/slack-bot/agent-native-512.png +0 -0
  383. package/src/assets/branding/tray-icon.svg +6 -0
  384. package/src/assets/branding/wordmark-on-dark.svg +21 -0
  385. package/src/assets/branding/wordmark-on-light.svg +21 -0
  386. package/src/assets/fonts/LICENSE_LIBERATION +96 -0
  387. package/src/assets/fonts/LICENSE_NOTO_NASKH_ARABIC +93 -0
  388. package/src/assets/fonts/LiberationSans-Bold.ttf +0 -0
  389. package/src/assets/fonts/LiberationSans-Regular.ttf +0 -0
  390. package/src/assets/fonts/NotoNaskhArabic-Variable.ttf +0 -0
  391. package/src/audit/actions/export-audit-events.ts +162 -0
  392. package/src/audit/actions/get-audit-event.ts +24 -0
  393. package/src/audit/actions/list-audit-events.ts +66 -0
  394. package/src/audit/cleanup-job.ts +100 -0
  395. package/src/audit/config.ts +90 -0
  396. package/src/audit/index.ts +43 -0
  397. package/src/audit/record.ts +180 -0
  398. package/src/audit/redact.ts +109 -0
  399. package/src/audit/store.ts +346 -0
  400. package/src/audit/types.ts +141 -0
  401. package/src/automation/index.ts +802 -0
  402. package/src/brand-kit/brand-signals.ts +124 -0
  403. package/src/brand-kit/fig/index.ts +64 -0
  404. package/src/brand-kit/index.ts +72 -0
  405. package/src/brand-kit/types.ts +113 -0
  406. package/src/browser-sessions/actions.ts +302 -0
  407. package/src/browser-sessions/routes.ts +234 -0
  408. package/src/browser-sessions/store.ts +679 -0
  409. package/src/browser-sessions/types.ts +84 -0
  410. package/src/changelog/parse.ts +328 -0
  411. package/src/chat-threads/emitter.ts +22 -0
  412. package/src/chat-threads/schema.ts +43 -0
  413. package/src/chat-threads/store.ts +1311 -0
  414. package/src/checkpoints/index.ts +15 -0
  415. package/src/checkpoints/service.ts +142 -0
  416. package/src/checkpoints/store.ts +153 -0
  417. package/src/cli/add.ts +425 -0
  418. package/src/cli/agent.ts +424 -0
  419. package/src/cli/agents.ts +122 -0
  420. package/src/cli/app-skill.ts +1455 -0
  421. package/src/cli/atomic-json-file.ts +324 -0
  422. package/src/cli/audit-agent-web.ts +324 -0
  423. package/src/cli/changelog.ts +199 -0
  424. package/src/cli/claude-code-participant.ts +515 -0
  425. package/src/cli/code-agent-commands.ts +270 -0
  426. package/src/cli/code-agent-connector.ts +1109 -0
  427. package/src/cli/code-agent-executor.ts +1970 -0
  428. package/src/cli/code-agent-output-smoother.ts +140 -0
  429. package/src/cli/code-agent-runs.concurrent-worker.ts +33 -0
  430. package/src/cli/code-agent-runs.ts +548 -0
  431. package/src/cli/code.ts +1805 -0
  432. package/src/cli/codex-cli-participant.ts +496 -0
  433. package/src/cli/connect.ts +2714 -0
  434. package/src/cli/content-local.ts +442 -0
  435. package/src/cli/context-xray-local.ts +2193 -0
  436. package/src/cli/create-workspace.ts +30 -0
  437. package/src/cli/create.ts +2247 -0
  438. package/src/cli/deploy-build.ts +50 -0
  439. package/src/cli/design-connect.ts +3187 -0
  440. package/src/cli/doctor.ts +472 -0
  441. package/src/cli/eject.ts +1594 -0
  442. package/src/cli/eval.ts +134 -0
  443. package/src/cli/gateway-helpers.ts +70 -0
  444. package/src/cli/index.ts +1217 -0
  445. package/src/cli/info.ts +105 -0
  446. package/src/cli/invoke.ts +288 -0
  447. package/src/cli/mcp-config-writers.ts +857 -0
  448. package/src/cli/mcp.ts +594 -0
  449. package/src/cli/migrate.ts +1813 -0
  450. package/src/cli/migration-codemod.ts +646 -0
  451. package/src/cli/multi-frontier-runs.ts +1952 -0
  452. package/src/cli/package-lifecycle.ts +823 -0
  453. package/src/cli/plan-blocks.ts +143 -0
  454. package/src/cli/plan-local.ts +3189 -0
  455. package/src/cli/plan-publish-store.ts +138 -0
  456. package/src/cli/pr-visual-recap-workflow.ts +2 -0
  457. package/src/cli/recap.ts +5 -0
  458. package/src/cli/setup-agents.ts +120 -0
  459. package/src/cli/skills-content/assets-skill.ts +83 -0
  460. package/src/cli/skills-content/canvas.ts +153 -0
  461. package/src/cli/skills-content/connection.ts +52 -0
  462. package/src/cli/skills-content/content-skill.ts +120 -0
  463. package/src/cli/skills-content/design-exploration-skill.ts +118 -0
  464. package/src/cli/skills-content/design-visual-edit-skill.ts +228 -0
  465. package/src/cli/skills-content/document-quality.ts +196 -0
  466. package/src/cli/skills-content/exemplar.ts +69 -0
  467. package/src/cli/skills-content/help.ts +77 -0
  468. package/src/cli/skills-content/index.ts +22 -0
  469. package/src/cli/skills-content/local-files.ts +100 -0
  470. package/src/cli/skills-content/plan-setup-auth.ts +80 -0
  471. package/src/cli/skills-content/visual-plan-skill.ts +493 -0
  472. package/src/cli/skills-content/visual-recap-skill.ts +553 -0
  473. package/src/cli/skills-content/visualize-repo-skill.ts +93 -0
  474. package/src/cli/skills-content/wireframe.ts +349 -0
  475. package/src/cli/skills.ts +4340 -0
  476. package/src/cli/sync-builder-starter-manifest.ts +631 -0
  477. package/src/cli/telemetry.ts +136 -0
  478. package/src/cli/templates-meta.ts +269 -0
  479. package/src/cli/upgrade.ts +956 -0
  480. package/src/cli/visualize-repo.ts +715 -0
  481. package/src/cli/workspace-dev.ts +1486 -0
  482. package/src/cli/workspacify.ts +258 -0
  483. package/src/client/AgentAskPopover.tsx +89 -0
  484. package/src/client/AgentChatHome.tsx +66 -0
  485. package/src/client/AgentNative.tsx +161 -0
  486. package/src/client/AgentNativeEmbedded.tsx +288 -0
  487. package/src/client/AgentNativeFrame.tsx +151 -0
  488. package/src/client/AgentPanel.tsx +3437 -0
  489. package/src/client/AgentTaskCard.tsx +273 -0
  490. package/src/client/AppearancePicker.tsx +79 -0
  491. package/src/client/AssistantChat.tsx +5793 -0
  492. package/src/client/ClientOnly.tsx +22 -0
  493. package/src/client/CommandMenu.tsx +726 -0
  494. package/src/client/ConnectBuilderCard.tsx +390 -0
  495. package/src/client/DefaultSpinner.tsx +47 -0
  496. package/src/client/ErrorBoundary.tsx +359 -0
  497. package/src/client/ErrorReportActions.tsx +69 -0
  498. package/src/client/FeedbackButton.tsx +553 -0
  499. package/src/client/HighlightedCodeBlock.tsx +173 -0
  500. package/src/client/IframeEmbed.tsx +151 -0
  501. package/src/client/KeepTabOpenNotice.tsx +181 -0
  502. package/src/client/MultiTabAssistantChat.tsx +2576 -0
  503. package/src/client/NewWorkspaceAppFlow.tsx +525 -0
  504. package/src/client/PoweredByBadge.tsx +284 -0
  505. package/src/client/RunStuckBanner.tsx +431 -0
  506. package/src/client/StarfieldBackground.tsx +466 -0
  507. package/src/client/Turnstile.tsx +125 -0
  508. package/src/client/active-run-state.ts +139 -0
  509. package/src/client/agent-chat/index.ts +279 -0
  510. package/src/client/agent-chat-adapter.ts +3692 -0
  511. package/src/client/agent-chat.ts +1233 -0
  512. package/src/client/agent-engine-key.ts +122 -0
  513. package/src/client/agent-page/AgentContextTab.tsx +487 -0
  514. package/src/client/agent-page/AgentEmptyState.tsx +44 -0
  515. package/src/client/agent-page/AgentJobsTab.tsx +441 -0
  516. package/src/client/agent-page/AgentTabFrame.tsx +39 -0
  517. package/src/client/agent-page/AgentTabsPage.tsx +1096 -0
  518. package/src/client/agent-page/types.ts +18 -0
  519. package/src/client/agent-page/use-jobs.ts +150 -0
  520. package/src/client/agent-sidebar-state.ts +166 -0
  521. package/src/client/analytics/index.ts +40 -0
  522. package/src/client/analytics-session.ts +70 -0
  523. package/src/client/analytics.ts +1757 -0
  524. package/src/client/api-path.ts +124 -0
  525. package/src/client/app-providers.tsx +230 -0
  526. package/src/client/appearance.ts +130 -0
  527. package/src/client/application-state.ts +154 -0
  528. package/src/client/assistant-ui-recovery.tsx +205 -0
  529. package/src/client/automation/index.ts +4 -0
  530. package/src/client/automation.ts +22 -0
  531. package/src/client/blocks/AiEditableField.tsx +30 -0
  532. package/src/client/blocks/BlockView.tsx +145 -0
  533. package/src/client/blocks/RegistryBlockDataProvider.tsx +121 -0
  534. package/src/client/blocks/SchemaBlockEditor.tsx +457 -0
  535. package/src/client/blocks/agent.ts +95 -0
  536. package/src/client/blocks/code-block-direction.ts +21 -0
  537. package/src/client/blocks/index.ts +308 -0
  538. package/src/client/blocks/library/AnnotatedCodeBlock.tsx +710 -0
  539. package/src/client/blocks/library/ApiEndpointBlock.tsx +1120 -0
  540. package/src/client/blocks/library/DataModelBlock.tsx +775 -0
  541. package/src/client/blocks/library/DiffBlock.tsx +1854 -0
  542. package/src/client/blocks/library/FileTreeBlock.tsx +868 -0
  543. package/src/client/blocks/library/HighlightedCode.tsx +260 -0
  544. package/src/client/blocks/library/JsonExplorerBlock.tsx +608 -0
  545. package/src/client/blocks/library/MermaidBlock.tsx +362 -0
  546. package/src/client/blocks/library/OpenApiSpecBlock.tsx +998 -0
  547. package/src/client/blocks/library/annotated-code.config.ts +101 -0
  548. package/src/client/blocks/library/annotation-rail.tsx +1020 -0
  549. package/src/client/blocks/library/api-endpoint.config.ts +207 -0
  550. package/src/client/blocks/library/block-copy.ts +399 -0
  551. package/src/client/blocks/library/callout.config.ts +57 -0
  552. package/src/client/blocks/library/callout.tsx +149 -0
  553. package/src/client/blocks/library/checklist.config.ts +56 -0
  554. package/src/client/blocks/library/checklist.tsx +208 -0
  555. package/src/client/blocks/library/code-filename-label.tsx +59 -0
  556. package/src/client/blocks/library/code-highlight.tsx +178 -0
  557. package/src/client/blocks/library/code-tabs.config.ts +70 -0
  558. package/src/client/blocks/library/code-tabs.tsx +606 -0
  559. package/src/client/blocks/library/code.config.ts +69 -0
  560. package/src/client/blocks/library/code.tsx +440 -0
  561. package/src/client/blocks/library/columns.config.ts +85 -0
  562. package/src/client/blocks/library/columns.tsx +334 -0
  563. package/src/client/blocks/library/data-model.config.ts +152 -0
  564. package/src/client/blocks/library/dev-doc-ui.tsx +191 -0
  565. package/src/client/blocks/library/diagram.config.ts +222 -0
  566. package/src/client/blocks/library/diagram.tsx +958 -0
  567. package/src/client/blocks/library/diff.config.ts +115 -0
  568. package/src/client/blocks/library/file-tree.config.ts +92 -0
  569. package/src/client/blocks/library/html.config.ts +79 -0
  570. package/src/client/blocks/library/html.tsx +258 -0
  571. package/src/client/blocks/library/json-explorer.config.ts +74 -0
  572. package/src/client/blocks/library/mermaid.config.ts +49 -0
  573. package/src/client/blocks/library/narrow-container.tsx +37 -0
  574. package/src/client/blocks/library/openapi-spec.config.ts +66 -0
  575. package/src/client/blocks/library/question-form.config.ts +127 -0
  576. package/src/client/blocks/library/question-form.tsx +944 -0
  577. package/src/client/blocks/library/sanitize-html.ts +343 -0
  578. package/src/client/blocks/library/server-specs.ts +338 -0
  579. package/src/client/blocks/library/specs.tsx +308 -0
  580. package/src/client/blocks/library/table.config.ts +61 -0
  581. package/src/client/blocks/library/table.tsx +449 -0
  582. package/src/client/blocks/library/tabs.config.ts +96 -0
  583. package/src/client/blocks/library/tabs.tsx +665 -0
  584. package/src/client/blocks/library/wireframe-icons.ts +210 -0
  585. package/src/client/blocks/library/wireframe-kit.tsx +1850 -0
  586. package/src/client/blocks/library/wireframe.config.ts +539 -0
  587. package/src/client/blocks/library/wireframe.tsx +535 -0
  588. package/src/client/blocks/mdx.ts +364 -0
  589. package/src/client/blocks/provider.tsx +51 -0
  590. package/src/client/blocks/registry.ts +83 -0
  591. package/src/client/blocks/schema-form/introspect.ts +201 -0
  592. package/src/client/blocks/server.ts +170 -0
  593. package/src/client/blocks/types.ts +415 -0
  594. package/src/client/browser-session-bridge.ts +548 -0
  595. package/src/client/browser-tab-id.ts +36 -0
  596. package/src/client/builder-frame.ts +194 -0
  597. package/src/client/builder-mark.tsx +21 -0
  598. package/src/client/changelog/Changelog.tsx +333 -0
  599. package/src/client/changelog/index.ts +1 -0
  600. package/src/client/chat/ChatHistoryList.tsx +7 -0
  601. package/src/client/chat/attachment-adapters.ts +426 -0
  602. package/src/client/chat/connectors.ts +1579 -0
  603. package/src/client/chat/index.ts +160 -0
  604. package/src/client/chat/markdown-renderer.tsx +693 -0
  605. package/src/client/chat/message-components.tsx +1326 -0
  606. package/src/client/chat/repo-helpers.ts +281 -0
  607. package/src/client/chat/run-recovery.tsx +994 -0
  608. package/src/client/chat/runtime.ts +1810 -0
  609. package/src/client/chat/tool-call-display.tsx +1270 -0
  610. package/src/client/chat/tool-render-registry.tsx +144 -0
  611. package/src/client/chat/use-agent-chat-lifecycle-tracking.ts +74 -0
  612. package/src/client/chat/use-reconnect-reader-owner.ts +28 -0
  613. package/src/client/chat/widgets/DataChartRenderer.tsx +242 -0
  614. package/src/client/chat/widgets/DataChartWidget.tsx +51 -0
  615. package/src/client/chat/widgets/DataInsightsWidget.tsx +59 -0
  616. package/src/client/chat/widgets/DataTableWidget.tsx +240 -0
  617. package/src/client/chat/widgets/InlineExtensionWidget.tsx +60 -0
  618. package/src/client/chat/widgets/builtin-tool-renderers.tsx +213 -0
  619. package/src/client/chat/widgets/data-widget-types.ts +1 -0
  620. package/src/client/chat/widgets/inline-extension-result.ts +86 -0
  621. package/src/client/chat-model-groups.ts +171 -0
  622. package/src/client/chat-thread-url.ts +11 -0
  623. package/src/client/chat-view-transition.ts +213 -0
  624. package/src/client/client-action.ts +21 -0
  625. package/src/client/client-bootstrap.ts +7 -0
  626. package/src/client/client-surface.ts +41 -0
  627. package/src/client/clipboard.ts +89 -0
  628. package/src/client/code-agent-chat-adapter.ts +537 -0
  629. package/src/client/collab/index.ts +60 -0
  630. package/src/client/command-navigation/index.ts +15 -0
  631. package/src/client/comments-review/index.ts +1 -0
  632. package/src/client/components/AgentPresenceChip.tsx +4 -0
  633. package/src/client/components/ApiKeySettings.tsx +309 -0
  634. package/src/client/components/CodeAgentIndicator.tsx +59 -0
  635. package/src/client/components/CodeRequiredDialog.tsx +470 -0
  636. package/src/client/components/LiveCursorOverlay.tsx +5 -0
  637. package/src/client/components/MissingKeyCard.tsx +61 -0
  638. package/src/client/components/PresenceBar.tsx +4 -0
  639. package/src/client/components/RecentEditHighlights.tsx +4 -0
  640. package/src/client/components/RemoteSelectionRings.tsx +5 -0
  641. package/src/client/components/icons/AgentNativeIcon.tsx +46 -0
  642. package/src/client/components/ui/dialog.tsx +1 -0
  643. package/src/client/components/ui/dropdown-menu.tsx +1 -0
  644. package/src/client/components/ui/hover-card.tsx +1 -0
  645. package/src/client/components/ui/message-scroller.tsx +131 -0
  646. package/src/client/components/ui/popover.tsx +1 -0
  647. package/src/client/components/ui/sheet.tsx +1 -0
  648. package/src/client/components/ui/tooltip.tsx +1 -0
  649. package/src/client/composer/index.ts +11 -0
  650. package/src/client/composer/runtime-adapters.tsx +123 -0
  651. package/src/client/composer/use-mention-search.ts +7 -0
  652. package/src/client/composer/wired-components.tsx +53 -0
  653. package/src/client/context-xray/ContextMeter.tsx +124 -0
  654. package/src/client/context-xray/ContextSegmentRow.tsx +27 -0
  655. package/src/client/context-xray/ContextTreemap.tsx +24 -0
  656. package/src/client/context-xray/ContextXRayPanel.tsx +59 -0
  657. package/src/client/context-xray/SegmentProvenancePopover.tsx +18 -0
  658. package/src/client/context-xray/format.ts +27 -0
  659. package/src/client/conversation/AgentConversation.tsx +555 -0
  660. package/src/client/conversation/code-agent-transcript.ts +283 -0
  661. package/src/client/conversation/index.ts +22 -0
  662. package/src/client/conversation/types.ts +85 -0
  663. package/src/client/conversation/use-near-bottom-autoscroll.ts +278 -0
  664. package/src/client/create-query-client.ts +86 -0
  665. package/src/client/db-admin/DataGrid.tsx +551 -0
  666. package/src/client/db-admin/DbAdminPage.tsx +218 -0
  667. package/src/client/db-admin/DevDatabaseLink.tsx +16 -0
  668. package/src/client/db-admin/EditableCell.tsx +451 -0
  669. package/src/client/db-admin/FilterBar.tsx +203 -0
  670. package/src/client/db-admin/ResultsGrid.tsx +114 -0
  671. package/src/client/db-admin/RowSidePanel.tsx +337 -0
  672. package/src/client/db-admin/SqlEditor.tsx +840 -0
  673. package/src/client/db-admin/TableBrowser.tsx +212 -0
  674. package/src/client/db-admin/TableEditor.tsx +760 -0
  675. package/src/client/db-admin/cell-format.ts +246 -0
  676. package/src/client/db-admin/changeset.ts +296 -0
  677. package/src/client/db-admin/export-utils.ts +78 -0
  678. package/src/client/db-admin/index.ts +33 -0
  679. package/src/client/db-admin/sql-storage.ts +134 -0
  680. package/src/client/db-admin/storage.ts +68 -0
  681. package/src/client/db-admin/useAgentSync.ts +226 -0
  682. package/src/client/db-admin/useDbAdmin.ts +294 -0
  683. package/src/client/dev-overlay/DevOverlay.tsx +576 -0
  684. package/src/client/dev-overlay/builtins.ts +40 -0
  685. package/src/client/dev-overlay/index.ts +23 -0
  686. package/src/client/dev-overlay/registry.ts +67 -0
  687. package/src/client/dev-overlay/types.ts +64 -0
  688. package/src/client/dev-overlay/use-dev-option.ts +78 -0
  689. package/src/client/dev-overlay/use-dev-overlay-shortcut.ts +31 -0
  690. package/src/client/dynamic-suggestions.ts +455 -0
  691. package/src/client/embed-auth.ts +544 -0
  692. package/src/client/embed.ts +54 -0
  693. package/src/client/error-capture.ts +690 -0
  694. package/src/client/error-format.ts +211 -0
  695. package/src/client/error-reporting.ts +100 -0
  696. package/src/client/extensions/AgentNativeExtensionFrame.e2e-host.tsx +136 -0
  697. package/src/client/extensions/AgentNativeExtensionFrame.tsx +708 -0
  698. package/src/client/extensions/EmbeddedExtension.tsx +604 -0
  699. package/src/client/extensions/ExtensionEditor.tsx +450 -0
  700. package/src/client/extensions/ExtensionQueryErrorState.tsx +47 -0
  701. package/src/client/extensions/ExtensionSlot.tsx +345 -0
  702. package/src/client/extensions/ExtensionViewer.tsx +1502 -0
  703. package/src/client/extensions/ExtensionViewerPage.tsx +32 -0
  704. package/src/client/extensions/ExtensionsListPage.tsx +432 -0
  705. package/src/client/extensions/ExtensionsSidebarSection.tsx +1259 -0
  706. package/src/client/extensions/InlineExtensionFrame.tsx +660 -0
  707. package/src/client/extensions/agent-native-extension-runtime.ts +495 -0
  708. package/src/client/extensions/delete-extension.ts +76 -0
  709. package/src/client/extensions/extension-load-error.ts +26 -0
  710. package/src/client/extensions/extension-order.ts +49 -0
  711. package/src/client/extensions/extension-popularity.ts +61 -0
  712. package/src/client/extensions/iframe-bridge.ts +377 -0
  713. package/src/client/extensions/index.ts +84 -0
  714. package/src/client/extensions/portable-extension.ts +712 -0
  715. package/src/client/feature-flags/FeatureFlagsPanel.tsx +519 -0
  716. package/src/client/feature-flags/helpers.ts +77 -0
  717. package/src/client/feature-flags/index.ts +13 -0
  718. package/src/client/feature-flags/types.ts +29 -0
  719. package/src/client/feature-flags/use-feature-flag.ts +26 -0
  720. package/src/client/feedback-context.ts +90 -0
  721. package/src/client/frame-protocol.ts +168 -0
  722. package/src/client/frame.ts +329 -0
  723. package/src/client/guided-questions.tsx +1152 -0
  724. package/src/client/history/VersionHistoryPanel.tsx +175 -0
  725. package/src/client/history/index.ts +21 -0
  726. package/src/client/history/use-history.ts +114 -0
  727. package/src/client/hooks/index.ts +46 -0
  728. package/src/client/host/index.ts +170 -0
  729. package/src/client/host-bridge.ts +1272 -0
  730. package/src/client/host-tools.ts +190 -0
  731. package/src/client/i18n.tsx +798 -0
  732. package/src/client/index.ts +370 -0
  733. package/src/client/integrations/IntegrationCard.tsx +186 -0
  734. package/src/client/integrations/IntegrationsPanel.tsx +633 -0
  735. package/src/client/integrations/api.ts +295 -0
  736. package/src/client/integrations/index.ts +29 -0
  737. package/src/client/integrations/useIntegrationStatus.ts +52 -0
  738. package/src/client/mcp-app-host.ts +720 -0
  739. package/src/client/mcp-apps/McpAppRenderer.tsx +760 -0
  740. package/src/client/navigation/index.ts +54 -0
  741. package/src/client/notifications/NotificationsBell.tsx +383 -0
  742. package/src/client/notifications/index.ts +1 -0
  743. package/src/client/observability/ObservabilityDashboard.tsx +890 -0
  744. package/src/client/observability/ThumbsFeedback.tsx +160 -0
  745. package/src/client/observability/index.ts +20 -0
  746. package/src/client/observability/useObservability.ts +266 -0
  747. package/src/client/onboarding/OnboardingBanner.tsx +73 -0
  748. package/src/client/onboarding/OnboardingPanel.tsx +1036 -0
  749. package/src/client/onboarding/SetupButton.tsx +64 -0
  750. package/src/client/onboarding/index.ts +25 -0
  751. package/src/client/onboarding/use-onboarding.ts +164 -0
  752. package/src/client/onboarding/use-preview-mode.ts +40 -0
  753. package/src/client/org/InvitationBanner.tsx +148 -0
  754. package/src/client/org/OrgSwitcher.tsx +754 -0
  755. package/src/client/org/RequireActiveOrg.tsx +337 -0
  756. package/src/client/org/TeamPage.tsx +1432 -0
  757. package/src/client/org/hooks.ts +359 -0
  758. package/src/client/org/index.ts +70 -0
  759. package/src/client/org/workspace-app-links.ts +367 -0
  760. package/src/client/org-team/index.ts +1 -0
  761. package/src/client/progress/RunsTray.tsx +680 -0
  762. package/src/client/progress/index.ts +1 -0
  763. package/src/client/require-session.tsx +142 -0
  764. package/src/client/resources/BuiltinCapabilityDetail.tsx +258 -0
  765. package/src/client/resources/McpConnectionSuggestion.tsx +276 -0
  766. package/src/client/resources/McpIntegrationDialog.tsx +808 -0
  767. package/src/client/resources/McpServerDetail.tsx +230 -0
  768. package/src/client/resources/ResourceEditor.tsx +872 -0
  769. package/src/client/resources/ResourceTree.tsx +860 -0
  770. package/src/client/resources/ResourcesPanel.tsx +1960 -0
  771. package/src/client/resources/index.ts +25 -0
  772. package/src/client/resources/mcp-integration-catalog.ts +771 -0
  773. package/src/client/resources/mcp-integration-logos.ts +108 -0
  774. package/src/client/resources/runtime.ts +1 -0
  775. package/src/client/resources/use-builtin-capabilities.ts +113 -0
  776. package/src/client/resources/use-mcp-servers.ts +217 -0
  777. package/src/client/resources/use-resources.ts +402 -0
  778. package/src/client/review/ReviewCommentComposer.tsx +123 -0
  779. package/src/client/review/ReviewStatusBadge.tsx +39 -0
  780. package/src/client/review/ReviewThreadPanel.tsx +625 -0
  781. package/src/client/review/index.ts +38 -0
  782. package/src/client/review/use-review.ts +186 -0
  783. package/src/client/route-chunk-recovery/index.ts +1 -0
  784. package/src/client/route-chunk-recovery.ts +331 -0
  785. package/src/client/route-state.ts +455 -0
  786. package/src/client/route-warmup.tsx +543 -0
  787. package/src/client/session-replay-iframe.e2e-host.tsx +100 -0
  788. package/src/client/session-replay.ts +3417 -0
  789. package/src/client/settings/AgentsSection.tsx +441 -0
  790. package/src/client/settings/AutomationsSection.tsx +516 -0
  791. package/src/client/settings/BackgroundAgentSection.tsx +189 -0
  792. package/src/client/settings/BrowserSection.tsx +110 -0
  793. package/src/client/settings/DemoModeSection.tsx +48 -0
  794. package/src/client/settings/SecretsSection.tsx +875 -0
  795. package/src/client/settings/SettingsPanel.tsx +3162 -0
  796. package/src/client/settings/SettingsSection.tsx +283 -0
  797. package/src/client/settings/SettingsTabsPage.tsx +592 -0
  798. package/src/client/settings/UsageSection.tsx +401 -0
  799. package/src/client/settings/VoiceTranscriptionSection.tsx +960 -0
  800. package/src/client/settings/agent-settings-search.ts +220 -0
  801. package/src/client/settings/index.ts +27 -0
  802. package/src/client/settings/useBuilderStatus.ts +1055 -0
  803. package/src/client/setup-connections/BuilderConnectCard.tsx +89 -0
  804. package/src/client/setup-connections/ProviderReadinessBadge.tsx +73 -0
  805. package/src/client/setup-connections/SetupConnectionsPage.tsx +94 -0
  806. package/src/client/setup-connections/catalog.ts +6 -0
  807. package/src/client/setup-connections/index.ts +47 -0
  808. package/src/client/setup-connections/runtime.ts +1 -0
  809. package/src/client/sharing/ShareButton.tsx +1748 -0
  810. package/src/client/sharing/ShareDialog.tsx +846 -0
  811. package/src/client/sharing/VisibilityBadge.tsx +4 -0
  812. package/src/client/sharing/index.ts +2 -0
  813. package/src/client/sse-event-processor.ts +2002 -0
  814. package/src/client/terminal/AgentTerminal.tsx +488 -0
  815. package/src/client/terminal/index.ts +7 -0
  816. package/src/client/theme.ts +27 -0
  817. package/src/client/tombstone/agent-presence-chip.ts +17 -0
  818. package/src/client/tombstone/editor.ts +265 -0
  819. package/src/client/tombstone/live-cursor-overlay.ts +21 -0
  820. package/src/client/tombstone/presence-bar.ts +17 -0
  821. package/src/client/tombstone/recent-edit-highlights.ts +17 -0
  822. package/src/client/tombstone/remote-selection-rings.ts +21 -0
  823. package/src/client/tombstone/rich-markdown-editor.ts +265 -0
  824. package/src/client/tombstone/ui-dialog.ts +49 -0
  825. package/src/client/tombstone/ui-dropdown-menu.ts +69 -0
  826. package/src/client/tombstone/ui-hover-card.ts +21 -0
  827. package/src/client/tombstone/ui-popover.ts +25 -0
  828. package/src/client/tombstone/ui-sheet.ts +49 -0
  829. package/src/client/tombstone/ui-tooltip.ts +29 -0
  830. package/src/client/tombstone/visual-style-controls.ts +61 -0
  831. package/src/client/tool-cells/BashCell.tsx +164 -0
  832. package/src/client/tool-cells/EditCell.tsx +303 -0
  833. package/src/client/tool-cells/FilesChangedSummary.tsx +208 -0
  834. package/src/client/tool-cells/WriteCell.tsx +145 -0
  835. package/src/client/tool-cells/index.ts +7 -0
  836. package/src/client/tool-display.ts +41 -0
  837. package/src/client/track.ts +57 -0
  838. package/src/client/transcription/BuilderTranscriptionCta.tsx +120 -0
  839. package/src/client/transcription/use-live-transcription.ts +292 -0
  840. package/src/client/ui/index.ts +55 -0
  841. package/src/client/uploads/index.ts +6 -0
  842. package/src/client/uploads/upload-editor-image.ts +79 -0
  843. package/src/client/uploads/use-upload-resource.ts +24 -0
  844. package/src/client/url-scrub.ts +51 -0
  845. package/src/client/use-action.ts +766 -0
  846. package/src/client/use-agent-chat-context.ts +63 -0
  847. package/src/client/use-agent-chat-home-handoff.ts +207 -0
  848. package/src/client/use-agent-chat.ts +53 -0
  849. package/src/client/use-agent-engine-configured.ts +211 -0
  850. package/src/client/use-avatar.ts +127 -0
  851. package/src/client/use-change-version.ts +150 -0
  852. package/src/client/use-chat-models.ts +252 -0
  853. package/src/client/use-chat-threads.ts +1262 -0
  854. package/src/client/use-db-sync.ts +1112 -0
  855. package/src/client/use-demo-mode-status.ts +30 -0
  856. package/src/client/use-dev-mode.ts +177 -0
  857. package/src/client/use-external-value.ts +40 -0
  858. package/src/client/use-pausing-interval.ts +65 -0
  859. package/src/client/use-pinch-zoom.ts +202 -0
  860. package/src/client/use-run-stuck-detection.ts +427 -0
  861. package/src/client/use-send-to-agent-chat.ts +85 -0
  862. package/src/client/use-session.ts +114 -0
  863. package/src/client/utils.ts +7 -0
  864. package/src/client/visual-style-controls.tsx +1 -0
  865. package/src/client/vite-dev-recovery-script.ts +226 -0
  866. package/src/client/voice-provider-status.ts +44 -0
  867. package/src/client/widgets/index.ts +41 -0
  868. package/src/code-agents/background-controller.ts +398 -0
  869. package/src/code-agents/background-run.ts +156 -0
  870. package/src/code-agents/index.ts +95 -0
  871. package/src/code-agents/prompt-attachments.ts +39 -0
  872. package/src/code-agents/transcript-normalizer.ts +750 -0
  873. package/src/code-agents/transcript-order.ts +73 -0
  874. package/src/coding-tools/index.ts +742 -0
  875. package/src/coding-tools/run-code.ts +1662 -0
  876. package/src/coding-tools/sandbox/adapter.ts +82 -0
  877. package/src/coding-tools/sandbox/background.ts +406 -0
  878. package/src/coding-tools/sandbox/executions-store.ts +517 -0
  879. package/src/coding-tools/sandbox/index.ts +132 -0
  880. package/src/coding-tools/sandbox/local-child-process-adapter.ts +217 -0
  881. package/src/collab/agent-identity.ts +5 -0
  882. package/src/collab/agent-presence.ts +341 -0
  883. package/src/collab/awareness-store.ts +196 -0
  884. package/src/collab/awareness.ts +317 -0
  885. package/src/collab/client-struct.ts +366 -0
  886. package/src/collab/client.ts +1205 -0
  887. package/src/collab/emitter.ts +31 -0
  888. package/src/collab/follow-mode.ts +107 -0
  889. package/src/collab/index.ts +151 -0
  890. package/src/collab/json-to-yjs.ts +504 -0
  891. package/src/collab/presence.ts +207 -0
  892. package/src/collab/recent-edits.ts +215 -0
  893. package/src/collab/routes.ts +191 -0
  894. package/src/collab/storage.ts +228 -0
  895. package/src/collab/struct-routes.ts +133 -0
  896. package/src/collab/text-to-yjs.ts +79 -0
  897. package/src/collab/undo.ts +432 -0
  898. package/src/collab/xml-ops.ts +68 -0
  899. package/src/collab/ydoc-manager.ts +544 -0
  900. package/src/command-navigation/actions.ts +100 -0
  901. package/src/command-navigation/index.ts +12 -0
  902. package/src/comments-review/index.ts +1 -0
  903. package/src/connections/catalog.ts +451 -0
  904. package/src/connections/index.ts +48 -0
  905. package/src/connections/reader.ts +911 -0
  906. package/src/connections/runtime.ts +1 -0
  907. package/src/credentials/index.ts +187 -0
  908. package/src/data-programs/actions.ts +335 -0
  909. package/src/data-programs/contract.ts +284 -0
  910. package/src/data-programs/execute.ts +693 -0
  911. package/src/data-programs/index.ts +72 -0
  912. package/src/data-programs/schema.ts +148 -0
  913. package/src/data-programs/store.ts +755 -0
  914. package/src/data-widgets/index.ts +376 -0
  915. package/src/db/client.ts +1627 -0
  916. package/src/db/create-get-db.ts +579 -0
  917. package/src/db/ddl-guard.ts +302 -0
  918. package/src/db/drizzle-config.ts +190 -0
  919. package/src/db/ensure-additive-columns.ts +430 -0
  920. package/src/db/index.ts +57 -0
  921. package/src/db/migrations.ts +691 -0
  922. package/src/db/request-telemetry.ts +154 -0
  923. package/src/db/runtime-diagnostics.ts +331 -0
  924. package/src/db/schema.ts +121 -0
  925. package/src/db/widen-columns.ts +75 -0
  926. package/src/db-admin/agent-tools.ts +202 -0
  927. package/src/db-admin/index.ts +26 -0
  928. package/src/db-admin/operations.ts +803 -0
  929. package/src/db-admin/routes.ts +174 -0
  930. package/src/db-admin/types.ts +110 -0
  931. package/src/demo/browser-state.ts +47 -0
  932. package/src/demo/fetch-interceptor.ts +175 -0
  933. package/src/demo/redact.ts +575 -0
  934. package/src/deploy/build.ts +3935 -0
  935. package/src/deploy/immutable-assets.ts +65 -0
  936. package/src/deploy/route-discovery.ts +458 -0
  937. package/src/deploy/workspace-core.ts +282 -0
  938. package/src/deploy/workspace-deploy.ts +1488 -0
  939. package/src/eject/provider-api-definitions.ts +193 -0
  940. package/src/eject/remote-mcp-presets.ts +137 -0
  941. package/src/eject/setup-readiness-ui.tsx +29 -0
  942. package/src/eject/workspace-connections.ts +92 -0
  943. package/src/embedding/agent.ts +159 -0
  944. package/src/embedding/bridge.ts +297 -0
  945. package/src/embedding/index.ts +43 -0
  946. package/src/embedding/protocol.ts +185 -0
  947. package/src/embedding/react.tsx +319 -0
  948. package/src/embeddings/index.ts +233 -0
  949. package/src/eval/agent-runner.ts +210 -0
  950. package/src/eval/define-eval.ts +55 -0
  951. package/src/eval/index.ts +49 -0
  952. package/src/eval/report.ts +75 -0
  953. package/src/eval/runner.ts +369 -0
  954. package/src/eval/scorer.ts +244 -0
  955. package/src/eval/types.ts +188 -0
  956. package/src/event-bus/bus.ts +140 -0
  957. package/src/event-bus/index.ts +3 -0
  958. package/src/event-bus/registry.ts +79 -0
  959. package/src/event-bus/types.ts +29 -0
  960. package/src/extensions/actions.ts +1636 -0
  961. package/src/extensions/change-marker.ts +54 -0
  962. package/src/extensions/content-patch.ts +468 -0
  963. package/src/extensions/fetch-tool.ts +461 -0
  964. package/src/extensions/html-shell.ts +803 -0
  965. package/src/extensions/local.ts +462 -0
  966. package/src/extensions/path.ts +40 -0
  967. package/src/extensions/proxy-security.ts +171 -0
  968. package/src/extensions/routes.ts +1080 -0
  969. package/src/extensions/schema.ts +269 -0
  970. package/src/extensions/session-replay-iframe.ts +131 -0
  971. package/src/extensions/slots/routes.ts +126 -0
  972. package/src/extensions/slots/schema.ts +87 -0
  973. package/src/extensions/slots/store.ts +450 -0
  974. package/src/extensions/store.ts +1347 -0
  975. package/src/extensions/theme.ts +114 -0
  976. package/src/extensions/url-safety.ts +316 -0
  977. package/src/extensions/web-content.ts +663 -0
  978. package/src/extensions/web-search-tool.ts +437 -0
  979. package/src/feature-flags/a2a-action-route.ts +56 -0
  980. package/src/feature-flags/actions/get-feature-flags.ts +24 -0
  981. package/src/feature-flags/actions/list-feature-flags.ts +69 -0
  982. package/src/feature-flags/actions/set-feature-flag.ts +89 -0
  983. package/src/feature-flags/index.ts +21 -0
  984. package/src/feature-flags/permissions.ts +53 -0
  985. package/src/feature-flags/plugin.ts +44 -0
  986. package/src/feature-flags/registry.ts +96 -0
  987. package/src/feature-flags/store.ts +176 -0
  988. package/src/file-upload/actions/upload-image.ts +213 -0
  989. package/src/file-upload/builder.ts +431 -0
  990. package/src/file-upload/index.ts +24 -0
  991. package/src/file-upload/pre-upload-attachments.ts +305 -0
  992. package/src/file-upload/registry.ts +125 -0
  993. package/src/file-upload/types.ts +89 -0
  994. package/src/guards/db-tool-scoping.ts +129 -0
  995. package/src/guards/index.ts +23 -0
  996. package/src/guards/no-drizzle-push.ts +116 -0
  997. package/src/guards/no-env-credentials.ts +229 -0
  998. package/src/guards/no-env-mutation.ts +114 -0
  999. package/src/guards/no-localhost-fallback.ts +124 -0
  1000. package/src/guards/no-unscoped-credentials.ts +227 -0
  1001. package/src/guards/no-unscoped-queries.ts +834 -0
  1002. package/src/guards/scan-utils.ts +105 -0
  1003. package/src/guards/types.ts +30 -0
  1004. package/src/history/actions/create-resource-version.ts +92 -0
  1005. package/src/history/actions/get-resource-version.ts +60 -0
  1006. package/src/history/actions/list-resource-history.ts +53 -0
  1007. package/src/history/actions/list-resource-versions.ts +43 -0
  1008. package/src/history/actions/restore-resource-version.ts +96 -0
  1009. package/src/history/index.ts +26 -0
  1010. package/src/history/registry.ts +111 -0
  1011. package/src/history/store.ts +379 -0
  1012. package/src/history/types.ts +69 -0
  1013. package/src/index.browser.ts +155 -0
  1014. package/src/index.ts +408 -0
  1015. package/src/ingestion/docx.ts +158 -0
  1016. package/src/ingestion/figma-node-to-html.ts +1860 -0
  1017. package/src/ingestion/figma.ts +548 -0
  1018. package/src/ingestion/index.ts +107 -0
  1019. package/src/ingestion/media.ts +264 -0
  1020. package/src/ingestion/notion.ts +121 -0
  1021. package/src/ingestion/office.ts +213 -0
  1022. package/src/ingestion/orchestration.ts +160 -0
  1023. package/src/ingestion/pptx.ts +331 -0
  1024. package/src/ingestion/selection.ts +81 -0
  1025. package/src/ingestion/website.ts +151 -0
  1026. package/src/integrations/a2a-continuation-marker.ts +2 -0
  1027. package/src/integrations/a2a-continuation-processor.ts +888 -0
  1028. package/src/integrations/a2a-continuations-store.ts +643 -0
  1029. package/src/integrations/adapter-overrides.ts +12 -0
  1030. package/src/integrations/adapters/discord.ts +364 -0
  1031. package/src/integrations/adapters/email.ts +1164 -0
  1032. package/src/integrations/adapters/google-docs.ts +371 -0
  1033. package/src/integrations/adapters/index.ts +29 -0
  1034. package/src/integrations/adapters/microsoft-teams.ts +413 -0
  1035. package/src/integrations/adapters/slack.ts +1914 -0
  1036. package/src/integrations/adapters/telegram.ts +386 -0
  1037. package/src/integrations/adapters/whatsapp.ts +358 -0
  1038. package/src/integrations/awaiting-input-store.ts +130 -0
  1039. package/src/integrations/catalog.ts +571 -0
  1040. package/src/integrations/computer-supervision-store.ts +423 -0
  1041. package/src/integrations/computer-supervision.ts +213 -0
  1042. package/src/integrations/config-store.ts +131 -0
  1043. package/src/integrations/controls-store.ts +187 -0
  1044. package/src/integrations/eject/messaging-adapters.ts +85 -0
  1045. package/src/integrations/google-docs-poller.ts +671 -0
  1046. package/src/integrations/identity-links-store.ts +210 -0
  1047. package/src/integrations/identity.ts +196 -0
  1048. package/src/integrations/index.ts +220 -0
  1049. package/src/integrations/installations-store.ts +677 -0
  1050. package/src/integrations/integration-memory.ts +187 -0
  1051. package/src/integrations/internal-token.ts +106 -0
  1052. package/src/integrations/pending-tasks-retry-job.ts +286 -0
  1053. package/src/integrations/pending-tasks-store.ts +468 -0
  1054. package/src/integrations/plugin.ts +3048 -0
  1055. package/src/integrations/remote-commands-store.ts +690 -0
  1056. package/src/integrations/remote-devices-store.ts +492 -0
  1057. package/src/integrations/remote-json-safety.ts +127 -0
  1058. package/src/integrations/remote-push-delivery-job.ts +48 -0
  1059. package/src/integrations/remote-push-delivery.ts +370 -0
  1060. package/src/integrations/remote-push-store.ts +664 -0
  1061. package/src/integrations/remote-retry-job.ts +55 -0
  1062. package/src/integrations/remote-run-events-store.ts +222 -0
  1063. package/src/integrations/remote-types.ts +186 -0
  1064. package/src/integrations/runtime.ts +1 -0
  1065. package/src/integrations/scope-store.ts +498 -0
  1066. package/src/integrations/slack-manifest.ts +78 -0
  1067. package/src/integrations/slack-oauth.ts +344 -0
  1068. package/src/integrations/task-queue-stats.ts +144 -0
  1069. package/src/integrations/thread-mapping-store.ts +134 -0
  1070. package/src/integrations/types.ts +485 -0
  1071. package/src/integrations/usage-budget-store.ts +906 -0
  1072. package/src/integrations/webhook-delivery.ts +55 -0
  1073. package/src/integrations/webhook-handler.ts +1939 -0
  1074. package/src/jobs/actions/list-recurring-jobs.ts +105 -0
  1075. package/src/jobs/actions/manage-recurring-job.ts +85 -0
  1076. package/src/jobs/cron.ts +126 -0
  1077. package/src/jobs/index.ts +9 -0
  1078. package/src/jobs/scheduler.ts +703 -0
  1079. package/src/jobs/tools.ts +367 -0
  1080. package/src/local-artifacts/index.ts +1372 -0
  1081. package/src/localization/actions/get-localization-preference.ts +24 -0
  1082. package/src/localization/actions/set-localization-preference.ts +32 -0
  1083. package/src/localization/default-messages.ts +1009 -0
  1084. package/src/localization/index.ts +2 -0
  1085. package/src/localization/server.ts +131 -0
  1086. package/src/localization/shared.ts +208 -0
  1087. package/src/mcp/actions/call-mcp-tool.ts +19 -0
  1088. package/src/mcp/actions/create-org-service-token.ts +87 -0
  1089. package/src/mcp/actions/list-mcp-tools.ts +18 -0
  1090. package/src/mcp/actions/list-org-service-tokens.ts +44 -0
  1091. package/src/mcp/actions/revoke-org-service-token.ts +30 -0
  1092. package/src/mcp/actions/service-token-access.ts +121 -0
  1093. package/src/mcp/ask-app-inline-tasks.ts +125 -0
  1094. package/src/mcp/build-server.ts +2356 -0
  1095. package/src/mcp/builtin-tools.ts +1506 -0
  1096. package/src/mcp/connect-route.ts +1460 -0
  1097. package/src/mcp/connect-store.ts +680 -0
  1098. package/src/mcp/embed-app.ts +2051 -0
  1099. package/src/mcp/embed-route.ts +84 -0
  1100. package/src/mcp/external-agent-policy.ts +18 -0
  1101. package/src/mcp/index.ts +47 -0
  1102. package/src/mcp/oauth-route.ts +1016 -0
  1103. package/src/mcp/oauth-store.ts +581 -0
  1104. package/src/mcp/oauth-token.ts +227 -0
  1105. package/src/mcp/org-directory.ts +343 -0
  1106. package/src/mcp/route-paths.ts +34 -0
  1107. package/src/mcp/screen-memory-stdio.ts +290 -0
  1108. package/src/mcp/server.ts +507 -0
  1109. package/src/mcp/stdio.ts +328 -0
  1110. package/src/mcp/workspace-resolve.ts +261 -0
  1111. package/src/mcp-client/app-api.ts +136 -0
  1112. package/src/mcp-client/app-result.ts +64 -0
  1113. package/src/mcp-client/builtin-capabilities.ts +146 -0
  1114. package/src/mcp-client/builtin-store.ts +93 -0
  1115. package/src/mcp-client/config.ts +281 -0
  1116. package/src/mcp-client/errors.ts +54 -0
  1117. package/src/mcp-client/hub-client.ts +172 -0
  1118. package/src/mcp-client/hub-routes.ts +198 -0
  1119. package/src/mcp-client/index.ts +504 -0
  1120. package/src/mcp-client/manager.ts +968 -0
  1121. package/src/mcp-client/oauth-client.ts +462 -0
  1122. package/src/mcp-client/oauth-routes.ts +307 -0
  1123. package/src/mcp-client/remote-store.ts +674 -0
  1124. package/src/mcp-client/remote-url.ts +97 -0
  1125. package/src/mcp-client/routes.ts +1093 -0
  1126. package/src/mcp-client/screen-memory-local.ts +461 -0
  1127. package/src/mcp-client/tool-policy.ts +182 -0
  1128. package/src/mcp-client/visibility.ts +56 -0
  1129. package/src/mcp-client/workspace-servers.ts +379 -0
  1130. package/src/navigation/index.ts +170 -0
  1131. package/src/notifications/actions.ts +151 -0
  1132. package/src/notifications/channels.ts +410 -0
  1133. package/src/notifications/index.ts +22 -0
  1134. package/src/notifications/registry.ts +216 -0
  1135. package/src/notifications/routes.ts +106 -0
  1136. package/src/notifications/store.ts +236 -0
  1137. package/src/notifications/types.ts +52 -0
  1138. package/src/oauth-tokens/google-refresh.ts +175 -0
  1139. package/src/oauth-tokens/index.ts +15 -0
  1140. package/src/oauth-tokens/store.ts +384 -0
  1141. package/src/observability/cleanup-job.ts +124 -0
  1142. package/src/observability/evals.ts +507 -0
  1143. package/src/observability/experiments.ts +359 -0
  1144. package/src/observability/feedback.ts +332 -0
  1145. package/src/observability/hosted-model-experiment.ts +118 -0
  1146. package/src/observability/index.ts +62 -0
  1147. package/src/observability/plugin.ts +31 -0
  1148. package/src/observability/routes.ts +431 -0
  1149. package/src/observability/sentiment.ts +261 -0
  1150. package/src/observability/store.ts +1347 -0
  1151. package/src/observability/traces.ts +789 -0
  1152. package/src/observability/tracing.ts +157 -0
  1153. package/src/observability/tracking-identity.ts +55 -0
  1154. package/src/observability/types.ts +211 -0
  1155. package/src/onboarding/default-steps.ts +428 -0
  1156. package/src/onboarding/index.ts +22 -0
  1157. package/src/onboarding/plugin.ts +262 -0
  1158. package/src/onboarding/registry.ts +47 -0
  1159. package/src/onboarding/types.ts +96 -0
  1160. package/src/org/accept-pending.ts +98 -0
  1161. package/src/org/auto-join-domain.ts +113 -0
  1162. package/src/org/context.ts +614 -0
  1163. package/src/org/free-email-providers.ts +124 -0
  1164. package/src/org/handlers.ts +1153 -0
  1165. package/src/org/index.ts +63 -0
  1166. package/src/org/migrations.ts +105 -0
  1167. package/src/org/permissions.ts +30 -0
  1168. package/src/org/plugin.ts +255 -0
  1169. package/src/org/schema.ts +28 -0
  1170. package/src/org/types.ts +57 -0
  1171. package/src/org-team/index.ts +1 -0
  1172. package/src/package-lifecycle/deprecated-imports.ts +179 -0
  1173. package/src/package-lifecycle/eject-manifest.ts +345 -0
  1174. package/src/package-lifecycle/index.ts +7 -0
  1175. package/src/package-lifecycle/manifest.ts +120 -0
  1176. package/src/package-lifecycle/migration-manifest.ts +159 -0
  1177. package/src/package-lifecycle/migration-message.ts +6 -0
  1178. package/src/package-lifecycle/tombstone.ts +58 -0
  1179. package/src/package-lifecycle/upgrade-error.ts +37 -0
  1180. package/src/private-blob/index.ts +18 -0
  1181. package/src/private-blob/registry.ts +242 -0
  1182. package/src/private-blob/types.ts +55 -0
  1183. package/src/progress/actions.ts +179 -0
  1184. package/src/progress/index.ts +16 -0
  1185. package/src/progress/registry.ts +127 -0
  1186. package/src/progress/routes.ts +89 -0
  1187. package/src/progress/store.ts +353 -0
  1188. package/src/progress/types.ts +59 -0
  1189. package/src/provider-api/actions/custom-provider-registration.ts +197 -0
  1190. package/src/provider-api/actions/delete-staged-dataset.ts +5 -0
  1191. package/src/provider-api/actions/github-repo-files.ts +266 -0
  1192. package/src/provider-api/actions/list-staged-datasets.ts +5 -0
  1193. package/src/provider-api/actions/provider-api-audit.ts +88 -0
  1194. package/src/provider-api/actions/provider-api.ts +460 -0
  1195. package/src/provider-api/actions/query-staged-dataset.ts +5 -0
  1196. package/src/provider-api/actions/staged-datasets.ts +359 -0
  1197. package/src/provider-api/corpus-jobs-store.ts +522 -0
  1198. package/src/provider-api/corpus-jobs.ts +1817 -0
  1199. package/src/provider-api/custom-registry.ts +456 -0
  1200. package/src/provider-api/github-repo.ts +675 -0
  1201. package/src/provider-api/gong.ts +108 -0
  1202. package/src/provider-api/index.ts +5444 -0
  1203. package/src/provider-api/quota-governor.ts +562 -0
  1204. package/src/provider-api/runtime.ts +1 -0
  1205. package/src/provider-api/staged-datasets-aggregate.ts +304 -0
  1206. package/src/provider-api/staged-datasets-store.ts +441 -0
  1207. package/src/provider-api/staging.ts +483 -0
  1208. package/src/resources/agents.ts +65 -0
  1209. package/src/resources/emitter.ts +54 -0
  1210. package/src/resources/handlers.ts +728 -0
  1211. package/src/resources/index.ts +4 -0
  1212. package/src/resources/metadata.ts +252 -0
  1213. package/src/resources/script-helpers.ts +160 -0
  1214. package/src/resources/store.ts +1618 -0
  1215. package/src/review/actions/consume-review-feedback.ts +48 -0
  1216. package/src/review/actions/create-review-comment.ts +108 -0
  1217. package/src/review/actions/delete-review-comment.ts +67 -0
  1218. package/src/review/actions/get-review-feedback.ts +49 -0
  1219. package/src/review/actions/list-review-comments.ts +87 -0
  1220. package/src/review/actions/reply-review-comment.ts +118 -0
  1221. package/src/review/actions/resolve-review-thread.ts +94 -0
  1222. package/src/review/actions/send-review-thread-to-agent.ts +62 -0
  1223. package/src/review/actions/set-review-status.ts +58 -0
  1224. package/src/review/identity.ts +101 -0
  1225. package/src/review/index.ts +45 -0
  1226. package/src/review/mentions.ts +44 -0
  1227. package/src/review/registry.ts +111 -0
  1228. package/src/review/store.ts +997 -0
  1229. package/src/review/types.ts +101 -0
  1230. package/src/router/index.ts +24 -0
  1231. package/src/scripts/agent-engines/list-agent-engines.ts +130 -0
  1232. package/src/scripts/agent-engines/manage-agent-engine.ts +197 -0
  1233. package/src/scripts/agent-engines/set-agent-engine.ts +84 -0
  1234. package/src/scripts/agent-engines/test-agent-engine.ts +174 -0
  1235. package/src/scripts/call-agent.ts +792 -0
  1236. package/src/scripts/chat/index.ts +8 -0
  1237. package/src/scripts/chat/open-chat.ts +56 -0
  1238. package/src/scripts/chat/search-chats.ts +121 -0
  1239. package/src/scripts/core-scripts.ts +22 -0
  1240. package/src/scripts/db/check-scoping.ts +212 -0
  1241. package/src/scripts/db/exec.ts +791 -0
  1242. package/src/scripts/db/index.ts +19 -0
  1243. package/src/scripts/db/migrate-encrypt-credentials.ts +223 -0
  1244. package/src/scripts/db/migrate-encrypt-oauth-tokens.ts +213 -0
  1245. package/src/scripts/db/migrate-user-api-keys.ts +257 -0
  1246. package/src/scripts/db/patch.ts +820 -0
  1247. package/src/scripts/db/query.ts +299 -0
  1248. package/src/scripts/db/reset-dev-owner.ts +285 -0
  1249. package/src/scripts/db/safety.ts +286 -0
  1250. package/src/scripts/db/schema.ts +364 -0
  1251. package/src/scripts/db/scoping.ts +341 -0
  1252. package/src/scripts/db/sqlite-client.ts +78 -0
  1253. package/src/scripts/db/tool-mode.ts +23 -0
  1254. package/src/scripts/db/tool-schemas.ts +31 -0
  1255. package/src/scripts/db/wipe-leaked-builder-keys.ts +201 -0
  1256. package/src/scripts/dev/index.ts +296 -0
  1257. package/src/scripts/dev/list-files.ts +119 -0
  1258. package/src/scripts/dev/read-file.ts +77 -0
  1259. package/src/scripts/dev/search-files.ts +151 -0
  1260. package/src/scripts/dev/shell.ts +111 -0
  1261. package/src/scripts/dev/write-file.ts +56 -0
  1262. package/src/scripts/dev-session.ts +96 -0
  1263. package/src/scripts/docs/index.ts +8 -0
  1264. package/src/scripts/docs/search.ts +274 -0
  1265. package/src/scripts/docs/source-search.ts +363 -0
  1266. package/src/scripts/index.ts +15 -0
  1267. package/src/scripts/manage-agent-loop-settings.ts +84 -0
  1268. package/src/scripts/parse-args.ts +46 -0
  1269. package/src/scripts/resources/delete-memory.ts +67 -0
  1270. package/src/scripts/resources/delete.ts +69 -0
  1271. package/src/scripts/resources/effective.ts +71 -0
  1272. package/src/scripts/resources/index.ts +18 -0
  1273. package/src/scripts/resources/list.ts +103 -0
  1274. package/src/scripts/resources/migrate-learnings.ts +40 -0
  1275. package/src/scripts/resources/read.ts +107 -0
  1276. package/src/scripts/resources/save-memory.ts +99 -0
  1277. package/src/scripts/resources/write.ts +158 -0
  1278. package/src/scripts/runner.ts +339 -0
  1279. package/src/scripts/utils.ts +130 -0
  1280. package/src/search/index.ts +413 -0
  1281. package/src/search-utils/index.ts +112 -0
  1282. package/src/secrets/crypto.ts +228 -0
  1283. package/src/secrets/index.ts +65 -0
  1284. package/src/secrets/onboarding.ts +101 -0
  1285. package/src/secrets/register-framework-secrets.ts +228 -0
  1286. package/src/secrets/register.ts +129 -0
  1287. package/src/secrets/routes.ts +697 -0
  1288. package/src/secrets/schema.ts +52 -0
  1289. package/src/secrets/storage.ts +561 -0
  1290. package/src/secrets/substitution.ts +305 -0
  1291. package/src/server/__snapshots__/agent-chat-plugin.surface.spec.ts.snap +150 -0
  1292. package/src/server/action-change.ts +66 -0
  1293. package/src/server/action-discovery.ts +774 -0
  1294. package/src/server/action-routes.ts +608 -0
  1295. package/src/server/agent-access.ts +72 -0
  1296. package/src/server/agent-chat/action-filters-a2a.ts +339 -0
  1297. package/src/server/agent-chat/browser-team-tools.ts +510 -0
  1298. package/src/server/agent-chat/context-tools.ts +599 -0
  1299. package/src/server/agent-chat/framework-prompts.ts +467 -0
  1300. package/src/server/agent-chat/lazy-fs.ts +11 -0
  1301. package/src/server/agent-chat/mcp-glue.ts +91 -0
  1302. package/src/server/agent-chat/plugin-options.ts +379 -0
  1303. package/src/server/agent-chat/process-run-failure.ts +62 -0
  1304. package/src/server/agent-chat/prompt-resources.ts +1004 -0
  1305. package/src/server/agent-chat/recurring-jobs-runtime.ts +80 -0
  1306. package/src/server/agent-chat/request-surface.ts +71 -0
  1307. package/src/server/agent-chat/run-code-tools.ts +67 -0
  1308. package/src/server/agent-chat/script-entries.ts +796 -0
  1309. package/src/server/agent-chat/shared-thread.ts +301 -0
  1310. package/src/server/agent-chat/skill-frontmatter.ts +41 -0
  1311. package/src/server/agent-chat-plugin.ts +5930 -0
  1312. package/src/server/agent-discovery.ts +706 -0
  1313. package/src/server/agent-engine-api-key-route.ts +236 -0
  1314. package/src/server/agent-run-context.ts +204 -0
  1315. package/src/server/agent-teams-run-queue.ts +344 -0
  1316. package/src/server/agent-teams.ts +2257 -0
  1317. package/src/server/agents-bundle.ts +464 -0
  1318. package/src/server/analytics.ts +105 -0
  1319. package/src/server/app-base-path.ts +79 -0
  1320. package/src/server/app-name.ts +53 -0
  1321. package/src/server/app-url.ts +184 -0
  1322. package/src/server/attachment-actions.ts +276 -0
  1323. package/src/server/attribution.ts +214 -0
  1324. package/src/server/auth-marketing.ts +260 -0
  1325. package/src/server/auth-plugin.ts +27 -0
  1326. package/src/server/auth.ts +3803 -0
  1327. package/src/server/better-auth-instance.ts +1197 -0
  1328. package/src/server/builder-browser.ts +1701 -0
  1329. package/src/server/builder-design-systems.ts +668 -0
  1330. package/src/server/builder-space.ts +176 -0
  1331. package/src/server/captcha.ts +63 -0
  1332. package/src/server/capture-error.ts +64 -0
  1333. package/src/server/cli-capture.ts +141 -0
  1334. package/src/server/collab-plugin.ts +391 -0
  1335. package/src/server/complete-text.ts +231 -0
  1336. package/src/server/cookie-namespace.ts +159 -0
  1337. package/src/server/core-routes-plugin.ts +4122 -0
  1338. package/src/server/cors-origins.ts +60 -0
  1339. package/src/server/create-server.ts +268 -0
  1340. package/src/server/credential-provider.ts +1202 -0
  1341. package/src/server/csrf.ts +229 -0
  1342. package/src/server/date-utils.ts +42 -0
  1343. package/src/server/deep-link.ts +119 -0
  1344. package/src/server/derived-secret.ts +32 -0
  1345. package/src/server/design-token-utils.ts +1032 -0
  1346. package/src/server/desktop-sso.ts +83 -0
  1347. package/src/server/edge.ts +69 -0
  1348. package/src/server/email-actions.ts +218 -0
  1349. package/src/server/email-template.ts +192 -0
  1350. package/src/server/email-templates.ts +148 -0
  1351. package/src/server/email.ts +219 -0
  1352. package/src/server/embed-route.ts +283 -0
  1353. package/src/server/embed-session.ts +805 -0
  1354. package/src/server/embedded.ts +252 -0
  1355. package/src/server/entry-server.tsx +154 -0
  1356. package/src/server/framework-request-handler.ts +848 -0
  1357. package/src/server/fusion-app.ts +447 -0
  1358. package/src/server/google-auth-mode.ts +34 -0
  1359. package/src/server/google-auth-plugin.ts +496 -0
  1360. package/src/server/google-oauth-credentials.ts +128 -0
  1361. package/src/server/google-oauth.ts +972 -0
  1362. package/src/server/google-realtime-session.ts +182 -0
  1363. package/src/server/h3-helpers.ts +174 -0
  1364. package/src/server/http-response-telemetry.ts +396 -0
  1365. package/src/server/identity-sso-store.ts +304 -0
  1366. package/src/server/identity-sso.ts +514 -0
  1367. package/src/server/index.ts +593 -0
  1368. package/src/server/missing-key.ts +36 -0
  1369. package/src/server/oauth-helpers.ts +44 -0
  1370. package/src/server/oauth-public-origin.ts +44 -0
  1371. package/src/server/oauth-return-url.ts +120 -0
  1372. package/src/server/og-fonts-data.ts +15 -0
  1373. package/src/server/og-fonts.ts +75 -0
  1374. package/src/server/onboarding-html.ts +4040 -0
  1375. package/src/server/open-route.ts +311 -0
  1376. package/src/server/org-admin.ts +28 -0
  1377. package/src/server/poll-events.ts +88 -0
  1378. package/src/server/poll.ts +1224 -0
  1379. package/src/server/prompts/framework-core-compact.ts +107 -0
  1380. package/src/server/prompts/framework-core.ts +143 -0
  1381. package/src/server/prompts/index.ts +16 -0
  1382. package/src/server/prompts/model-overlays.ts +54 -0
  1383. package/src/server/prompts/shared-rules.ts +104 -0
  1384. package/src/server/realtime-voice.ts +967 -0
  1385. package/src/server/recap-image-route.ts +242 -0
  1386. package/src/server/recap-image-store.ts +185 -0
  1387. package/src/server/request-context.ts +416 -0
  1388. package/src/server/request-origin.ts +67 -0
  1389. package/src/server/resources-plugin.ts +119 -0
  1390. package/src/server/schema-prompt.ts +429 -0
  1391. package/src/server/scoped-key-storage.ts +223 -0
  1392. package/src/server/security-headers.ts +170 -0
  1393. package/src/server/self-dispatch.ts +224 -0
  1394. package/src/server/sentry-config.ts +73 -0
  1395. package/src/server/sentry-plugin.ts +138 -0
  1396. package/src/server/sentry.ts +444 -0
  1397. package/src/server/short-lived-token.ts +170 -0
  1398. package/src/server/social-og-image.ts +454 -0
  1399. package/src/server/sse.ts +102 -0
  1400. package/src/server/ssr-handler.ts +466 -0
  1401. package/src/server/transcribe-voice.ts +1076 -0
  1402. package/src/server/voice-providers-status.ts +118 -0
  1403. package/src/server/workspace-oauth.ts +31 -0
  1404. package/src/server/workspace-provider-oauth.ts +970 -0
  1405. package/src/session-replay-iframe-protocol.ts +58 -0
  1406. package/src/settings/handlers.ts +44 -0
  1407. package/src/settings/index.ts +34 -0
  1408. package/src/settings/org-settings.ts +83 -0
  1409. package/src/settings/script-helpers.ts +24 -0
  1410. package/src/settings/store.ts +247 -0
  1411. package/src/settings/user-settings.ts +47 -0
  1412. package/src/setup-connections/index.ts +90 -0
  1413. package/src/setup-connections/onboarding.ts +47 -0
  1414. package/src/shared/agent-access.ts +112 -0
  1415. package/src/shared/agent-chat.ts +124 -0
  1416. package/src/shared/agent-env.ts +46 -0
  1417. package/src/shared/agent-readable-resource.ts +111 -0
  1418. package/src/shared/agent-sidebar-url.ts +39 -0
  1419. package/src/shared/cache-control.ts +25 -0
  1420. package/src/shared/cloudflare-globals.d.ts +34 -0
  1421. package/src/shared/context-xray.ts +172 -0
  1422. package/src/shared/embed-auth.ts +6 -0
  1423. package/src/shared/index.ts +83 -0
  1424. package/src/shared/llm-connection.ts +42 -0
  1425. package/src/shared/markdown-block-split.ts +129 -0
  1426. package/src/shared/mcp-connect-content.ts +130 -0
  1427. package/src/shared/mcp-embed-headers.ts +175 -0
  1428. package/src/shared/mcp-integration-config.ts +101 -0
  1429. package/src/shared/merge-by-id.ts +14 -0
  1430. package/src/shared/oauth-state.ts +39 -0
  1431. package/src/shared/reasoning-effort.ts +228 -0
  1432. package/src/shared/route-warmup-config.ts +128 -0
  1433. package/src/shared/runtime.ts +31 -0
  1434. package/src/shared/social-meta.ts +82 -0
  1435. package/src/shared/streaming-text-smoothing.ts +184 -0
  1436. package/src/shared/truncate.ts +13 -0
  1437. package/src/shared/workspace-app-audience.ts +177 -0
  1438. package/src/shared/workspace-app-id.ts +54 -0
  1439. package/src/sharing/access.ts +585 -0
  1440. package/src/sharing/actions/create-agent-resource-link.ts +91 -0
  1441. package/src/sharing/actions/extension-change.ts +22 -0
  1442. package/src/sharing/actions/list-resource-shares.ts +93 -0
  1443. package/src/sharing/actions/set-resource-visibility.ts +91 -0
  1444. package/src/sharing/actions/share-resource.ts +322 -0
  1445. package/src/sharing/actions/unshare-resource.ts +72 -0
  1446. package/src/sharing/index.ts +35 -0
  1447. package/src/sharing/registry.ts +201 -0
  1448. package/src/sharing/schema.ts +99 -0
  1449. package/src/styles/agent-conversation.css +766 -0
  1450. package/src/styles/agent-native.css +938 -0
  1451. package/src/styles/blocks.css +1717 -0
  1452. package/src/styles/chat-history-list.css +1 -0
  1453. package/src/styles/rich-markdown-editor.css +1 -0
  1454. package/src/tailwind.preset.ts +140 -0
  1455. package/src/templates/chat/.agents/skills/agent-native-docs/SKILL.md +15 -13
  1456. package/src/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  1457. package/src/templates/chat/.agents/skills/self-modifying-code/SKILL.md +9 -6
  1458. package/src/templates/chat/AGENTS.md +3 -2
  1459. package/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +15 -13
  1460. package/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  1461. package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +9 -6
  1462. package/src/templates/default/AGENTS.md +6 -5
  1463. package/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +15 -13
  1464. package/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  1465. package/src/templates/headless/AGENTS.md +5 -4
  1466. package/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +15 -13
  1467. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +3 -2
  1468. package/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  1469. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +9 -6
  1470. package/src/templates/workspace-core/AGENTS.md +4 -4
  1471. package/src/templates/workspace-root/AGENTS.md +4 -4
  1472. package/src/terminal/cli-registry.ts +57 -0
  1473. package/src/terminal/index.ts +22 -0
  1474. package/src/terminal/pty-server.ts +389 -0
  1475. package/src/terminal/terminal-plugin.ts +265 -0
  1476. package/src/testing.ts +23 -0
  1477. package/src/tracking/index.ts +10 -0
  1478. package/src/tracking/providers.ts +422 -0
  1479. package/src/tracking/registry.ts +102 -0
  1480. package/src/tracking/route.ts +108 -0
  1481. package/src/tracking/types.ts +16 -0
  1482. package/src/transcription/builder-transcription.ts +118 -0
  1483. package/src/triggers/actions/list-automations.ts +99 -0
  1484. package/src/triggers/actions/manage-automation.ts +78 -0
  1485. package/src/triggers/actions.ts +333 -0
  1486. package/src/triggers/condition-evaluator.ts +163 -0
  1487. package/src/triggers/dispatcher.ts +536 -0
  1488. package/src/triggers/index.ts +13 -0
  1489. package/src/triggers/routes.ts +322 -0
  1490. package/src/triggers/types.ts +42 -0
  1491. package/src/types/pglite.d.ts +26 -0
  1492. package/src/usage/store.ts +698 -0
  1493. package/src/vite/action-types-plugin.ts +481 -0
  1494. package/src/vite/agent-web-plugin.ts +78 -0
  1495. package/src/vite/agents-bundle-plugin.ts +185 -0
  1496. package/src/vite/client.ts +3039 -0
  1497. package/src/vite/index.ts +21 -0
  1498. package/src/voice/index.ts +18 -0
  1499. package/src/voice/voice-cleanup-prompt.ts +38 -0
  1500. package/src/voice/voice-context.ts +217 -0
  1501. package/src/voice/voice-replacements.ts +75 -0
  1502. package/src/workspace-connections/credentials.ts +603 -0
  1503. package/src/workspace-connections/index.ts +72 -0
  1504. package/src/workspace-connections/lifecycle.ts +43 -0
  1505. package/src/workspace-connections/store.ts +1943 -0
  1506. package/src/workspace-files/index.ts +18 -0
  1507. package/src/workspace-files/store.ts +339 -0
  1508. package/src/workspace-files/tool.ts +266 -0
@@ -0,0 +1,2051 @@
1
+ import type { ActionMcpAppResourceConfig } from "../action.js";
2
+ import { MCP_APP_CHAT_BRIDGE_QUERY_PARAM } from "../shared/embed-auth.js";
3
+
4
+ const MCP_APP_IMPORT =
5
+ "https://esm.sh/@modelcontextprotocol/ext-apps@1.7.2/app-with-deps";
6
+
7
+ export const MCP_APP_REQUEST_ORIGIN_CSP_SOURCE = "$requestOrigin";
8
+ const MCP_APP_WRAPPER_CHROME_HEIGHT = 44;
9
+ export const DEFAULT_MCP_APP_SHELL_HEIGHT = 560;
10
+ export const DEFAULT_MCP_APP_VIEWPORT_HEIGHT =
11
+ DEFAULT_MCP_APP_SHELL_HEIGHT - MCP_APP_WRAPPER_CHROME_HEIGHT;
12
+
13
+ export interface EmbedAppOptions {
14
+ title?: string;
15
+ description?: string;
16
+ iframeTitle?: string;
17
+ openLabel?: string;
18
+ embedByDefault?: boolean;
19
+ startToolName?: string;
20
+ connectDomains?: string[];
21
+ resourceDomains?: string[];
22
+ baseUriDomains?: string[];
23
+ frameDomains?: string[];
24
+ height?: number;
25
+ }
26
+
27
+ function attr(value: string | undefined): string {
28
+ return String(value ?? "")
29
+ .replace(/&/g, "&")
30
+ .replace(/"/g, """)
31
+ .replace(/</g, "&lt;")
32
+ .replace(/>/g, "&gt;");
33
+ }
34
+
35
+ export function embedApp(
36
+ options: EmbedAppOptions = {},
37
+ ): ActionMcpAppResourceConfig {
38
+ const title = options.title ?? "Open app";
39
+ const iframeTitle = options.iframeTitle ?? "Agent Native app";
40
+ const openLabel = options.openLabel ?? "Open in app";
41
+ const startToolName = options.startToolName ?? "create_embed_session";
42
+ const embedByDefault = options.embedByDefault !== false;
43
+ const height = Math.max(
44
+ 320,
45
+ Math.min(900, options.height ?? DEFAULT_MCP_APP_SHELL_HEIGHT),
46
+ );
47
+ const viewportHeight = height - MCP_APP_WRAPPER_CHROME_HEIGHT;
48
+ const frameDomains = [
49
+ MCP_APP_REQUEST_ORIGIN_CSP_SOURCE,
50
+ ...(options.frameDomains ?? []),
51
+ ];
52
+
53
+ return {
54
+ title,
55
+ ...(options.description ? { description: options.description } : {}),
56
+ html: () => `<!doctype html>
57
+ <html lang="en">
58
+ <head>
59
+ <meta charset="utf-8">
60
+ <meta name="viewport" content="width=device-width, initial-scale=1">
61
+ <style>
62
+ :root { color-scheme: light dark; font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: Canvas; color: CanvasText; --agent-native-shell-height: ${height}px; --agent-native-viewport-height: ${viewportHeight}px; }
63
+ * { box-sizing: border-box; }
64
+ body { margin: 0; }
65
+ .shell { display: grid; gap: 8px; min-height: var(--agent-native-shell-height); padding: 0; }
66
+ .bar { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 36px; padding: 6px 8px; border-bottom: 1px solid color-mix(in srgb, CanvasText 12%, Canvas); }
67
+ .title { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; font-weight: 700; color: color-mix(in srgb, CanvasText 72%, Canvas); }
68
+ .actions { display: flex; align-items: center; gap: 6px; }
69
+ button { min-height: 28px; border: 1px solid color-mix(in srgb, CanvasText 14%, Canvas); border-radius: 7px; background: Canvas; color: CanvasText; cursor: pointer; font: inherit; font-size: 12px; font-weight: 700; padding: 0 9px; }
70
+ button.primary { min-height: 32px; padding: 0 14px; background: CanvasText; color: Canvas; border-color: CanvasText; }
71
+ button.primary:hover:not(:disabled) { background: color-mix(in srgb, CanvasText 86%, Canvas); }
72
+ button:disabled { opacity: .55; cursor: default; }
73
+ .stage { position: relative; min-height: var(--agent-native-viewport-height); }
74
+ iframe { display: block; width: 100%; height: var(--agent-native-viewport-height); border: 0; background: Canvas; }
75
+ .message { display: grid; place-items: center; min-height: var(--agent-native-viewport-height); padding: 18px; color: color-mix(in srgb, CanvasText 62%, Canvas); font-size: 13px; line-height: 1.45; text-align: center; }
76
+ .fallback { display: grid; align-content: center; justify-items: center; gap: 12px; min-height: var(--agent-native-viewport-height); padding: 24px; background: Canvas; color: CanvasText; text-align: center; }
77
+ .fallback-title { max-width: 440px; font-size: 14px; font-weight: 700; }
78
+ .fallback-copy { max-width: 520px; color: color-mix(in srgb, CanvasText 64%, Canvas); font-size: 13px; line-height: 1.45; }
79
+ .fallback-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 8px; }
80
+ .fallback-url { max-width: min(560px, 100%); overflow-wrap: anywhere; color: color-mix(in srgb, CanvasText 76%, Canvas); font-size: 12px; }
81
+ </style>
82
+ </head>
83
+ <body
84
+ data-app-title="${attr(title)}"
85
+ data-iframe-title="${attr(iframeTitle)}"
86
+ data-open-label="${attr(openLabel)}"
87
+ data-start-tool="${attr(startToolName)}"
88
+ data-embed-default="${embedByDefault ? "1" : "0"}"
89
+ >
90
+ <main class="shell">
91
+ <div class="bar">
92
+ <div class="title" data-title-label>${attr(title)}</div>
93
+ <div class="actions">
94
+ <button type="button" data-display hidden disabled>Fullscreen</button>
95
+ <button type="button" data-open disabled>${attr(openLabel)}</button>
96
+ </div>
97
+ </div>
98
+ <section class="stage" data-stage>
99
+ <div class="message">Preparing app</div>
100
+ </section>
101
+ </main>
102
+ <script>
103
+ (async () => {
104
+ const body = document.body;
105
+ const stage = document.querySelector("[data-stage]");
106
+ const titleEl = document.querySelector("[data-title-label]");
107
+ const openButton = document.querySelector("[data-open]");
108
+ const displayButton = document.querySelector("[data-display]");
109
+ const startTool = body.dataset.startTool || "create_embed_session";
110
+ const embedByDefault = body.dataset.embedDefault !== "0";
111
+ const chatBridgeParam = ${JSON.stringify(MCP_APP_CHAT_BRIDGE_QUERY_PARAM)};
112
+ const defaultIntrinsicHeight = ${height};
113
+ const chromeHeight = ${MCP_APP_WRAPPER_CHROME_HEIGHT};
114
+ const frameReadyMessageDelays = [0, 200, 500, 1500, 3000, 7000, 15000, 30000];
115
+ const frameReadyTimeoutMs = 45000;
116
+ const frameLoadTimeoutMs = 45000;
117
+ const maxEmbedSessionRefreshAttempts = 2;
118
+ const defaultOpenAiBridgeWaitMs = 200;
119
+ const chatGptOpenAiBridgeWaitMs = 5000;
120
+ const openAiBridgePollMs = 50;
121
+ const nativeBridgeInitializeTimeoutMs = 5000;
122
+ const nativeBridgeRequestTimeoutMs = 30000;
123
+ const wrapperRequestTimeoutMs = 5000;
124
+ let app = null;
125
+ let appConnectPromise = null;
126
+ let openAiBridge = null;
127
+ let lastOpenAiSyncSignature = null;
128
+ let wrapperRequestId = 0;
129
+ const wrapperRequests = new Map();
130
+ let toolInput = {};
131
+ let toolResultData = {};
132
+ let openUrl = "";
133
+ let openStartUrl = "";
134
+ let startedFor = "";
135
+ let appFrame = null;
136
+ let appFrameReady = false;
137
+ let appFrameReadyTimer = null;
138
+ let appFrameLoadTimer = null;
139
+ let lastFrameSrc = "";
140
+ let embedSessionRefreshAttempts = 0;
141
+ let reportedContentHeight = 0;
142
+
143
+ function esc(value) {
144
+ return String(value ?? "")
145
+ .replace(/&/g, "&amp;")
146
+ .replace(/</g, "&lt;")
147
+ .replace(/>/g, "&gt;")
148
+ .replace(/"/g, "&quot;");
149
+ }
150
+
151
+ function parseJson(value, fallback) {
152
+ if (value && typeof value === "object") return value;
153
+ if (typeof value !== "string" || !value.trim()) return fallback;
154
+ try { return JSON.parse(value); } catch { return fallback; }
155
+ }
156
+
157
+ function objectValue(value) {
158
+ return value && typeof value === "object" && !Array.isArray(value)
159
+ ? value
160
+ : {};
161
+ }
162
+
163
+ function finiteNumber(value) {
164
+ return typeof value === "number" && Number.isFinite(value) && value > 0
165
+ ? value
166
+ : null;
167
+ }
168
+
169
+ function contextMaxHeight(context) {
170
+ if (!context || typeof context !== "object") return null;
171
+ return finiteNumber(context.maxHeight) ||
172
+ finiteNumber(context.containerDimensions && context.containerDimensions.maxHeight);
173
+ }
174
+
175
+ function visibleIntrinsicHeight() {
176
+ const context = hostState().context || {};
177
+ const hostMaxHeight = contextMaxHeight(context);
178
+ // Size to the app-reported content height (the shell can't measure the
179
+ // cross-origin frame). Don't clamp to the host maxHeight — on Codex it's a
180
+ // small inline hint (~360) that clips the plan; applyIntrinsicHeight still
181
+ // caps at defaultIntrinsicHeight.
182
+ if (reportedContentHeight > 0) {
183
+ return Math.floor(reportedContentHeight + chromeHeight);
184
+ }
185
+ if (hostMaxHeight) return Math.floor(hostMaxHeight);
186
+ // No host maxHeight and no content height yet: use the CONFIGURED height,
187
+ // never window.innerHeight. Echoing the iframe's own size pins us to the
188
+ // current frame height (circular) and locks the embed at the cap forever.
189
+ return Math.floor(defaultIntrinsicHeight);
190
+ }
191
+
192
+ function applyIntrinsicHeight(nextHeight) {
193
+ const boundedHeight = Math.min(
194
+ defaultIntrinsicHeight,
195
+ Math.floor(nextHeight || defaultIntrinsicHeight)
196
+ );
197
+ const height = Math.max(320, boundedHeight);
198
+ const viewportHeight = Math.max(0, height - chromeHeight);
199
+ document.documentElement.style.setProperty("--agent-native-shell-height", height + "px");
200
+ document.documentElement.style.setProperty("--agent-native-viewport-height", viewportHeight + "px");
201
+ if (appFrame) appFrame.style.height = viewportHeight + "px";
202
+ return height;
203
+ }
204
+
205
+ function parseToolResult(params) {
206
+ if (!params) return {};
207
+ if (params.result && typeof params.result === "object") {
208
+ return parseToolResult(params.result);
209
+ }
210
+ if (params.toolResult && typeof params.toolResult === "object") {
211
+ return parseToolResult(params.toolResult);
212
+ }
213
+ if (params.structuredContent && typeof params.structuredContent === "object") {
214
+ return params.structuredContent;
215
+ }
216
+ const parts = Array.isArray(params.content) ? params.content : [];
217
+ const textPart = parts.find((part) => part && part.type === "text" && typeof part.text === "string");
218
+ const text = textPart ? textPart.text : "";
219
+ if (params.isError && typeof text === "string" && text.trim()) {
220
+ return { error: text.trim() };
221
+ }
222
+ return parseJson(text, {});
223
+ }
224
+
225
+ function metadataRecord(value) {
226
+ const meta = value && typeof value === "object" && !Array.isArray(value)
227
+ ? value._meta
228
+ : null;
229
+ return meta && typeof meta === "object" && !Array.isArray(meta)
230
+ ? meta
231
+ : null;
232
+ }
233
+
234
+ function toolResultMeta(params) {
235
+ if (!params || typeof params !== "object") return {};
236
+ const direct = metadataRecord(params);
237
+ if (direct) return direct;
238
+ if (params.result && typeof params.result === "object") {
239
+ return toolResultMeta(params.result);
240
+ }
241
+ if (params.toolResult && typeof params.toolResult === "object") {
242
+ return toolResultMeta(params.toolResult);
243
+ }
244
+ return {};
245
+ }
246
+
247
+ function openLinkRecordFrom(value) {
248
+ return value && typeof value === "object" && !Array.isArray(value)
249
+ ? value
250
+ : {};
251
+ }
252
+
253
+ function openLinkWebUrlFrom(value) {
254
+ const record = openLinkRecordFrom(value);
255
+ return typeof record.webUrl === "string" ? record.webUrl : "";
256
+ }
257
+
258
+ function firstNonEmbedStartUrl(values) {
259
+ for (const value of values) {
260
+ if (typeof value === "string" && value && !isEmbedStartUrl(value)) return value;
261
+ }
262
+ return "";
263
+ }
264
+
265
+ function firstEmbedStartUrl(values) {
266
+ for (const value of values) {
267
+ if (typeof value === "string" && value && isEmbedStartUrl(value)) {
268
+ return withChatBridgeParam(value);
269
+ }
270
+ }
271
+ return "";
272
+ }
273
+
274
+ function openLinkFrom(params, data) {
275
+ const meta = toolResultMeta(params);
276
+ const openLink = meta["agent-native/openLink"];
277
+ const metaUrl = openLinkWebUrlFrom(openLink);
278
+ const record = data && typeof data === "object" ? data : {};
279
+ const structuredOpenLinkUrl = openLinkWebUrlFrom(record.openLink);
280
+ return firstNonEmbedStartUrl([
281
+ record.embedTargetPath,
282
+ record.deepLinkUrl,
283
+ record.deepLink,
284
+ record.openUrl,
285
+ structuredOpenLinkUrl,
286
+ metaUrl,
287
+ record.url
288
+ ]);
289
+ }
290
+
291
+ function embedStartUrlFrom(params, data) {
292
+ const meta = toolResultMeta(params);
293
+ const embedStart = meta["agent-native/embedStart"];
294
+ const embedStartRecord =
295
+ embedStart && typeof embedStart === "object" && !Array.isArray(embedStart)
296
+ ? embedStart
297
+ : {};
298
+ const openLink = meta["agent-native/openLink"];
299
+ const metaUrl = openLinkWebUrlFrom(openLink);
300
+ const record = data && typeof data === "object" ? data : {};
301
+ return firstEmbedStartUrl([
302
+ embedStartRecord.startUrl,
303
+ record.embedStartUrl,
304
+ record.startUrl,
305
+ record.url,
306
+ openLinkWebUrlFrom(record.openLink),
307
+ metaUrl
308
+ ]);
309
+ }
310
+
311
+ function hostState() {
312
+ if (openAiBridge) {
313
+ return {
314
+ context: {
315
+ displayMode: openAiBridge.displayMode,
316
+ availableDisplayModes: typeof openAiBridge.requestDisplayMode === "function"
317
+ ? ["inline", "fullscreen", "pip"]
318
+ : [],
319
+ maxHeight: openAiBridge.maxHeight,
320
+ locale: openAiBridge.locale,
321
+ theme: openAiBridge.theme,
322
+ view: openAiBridge.view
323
+ },
324
+ capabilities: { openai: true },
325
+ version: openAiBridge.userAgent
326
+ };
327
+ }
328
+ return {
329
+ context: app && app.getHostContext ? app.getHostContext() : undefined,
330
+ capabilities: app && app.getHostCapabilities ? app.getHostCapabilities() : undefined,
331
+ version: app && app.getHostVersion ? app.getHostVersion() : undefined
332
+ };
333
+ }
334
+
335
+ function sendToAppFrame(message) {
336
+ if (!appFrame || !appFrame.contentWindow) return;
337
+ try { appFrame.contentWindow.postMessage(message, "*"); } catch {}
338
+ }
339
+
340
+ function notifyOuterMcpAppReady() {
341
+ try {
342
+ window.parent.postMessage({ type: "agentNative.embeddedAppReady" }, "*");
343
+ } catch {}
344
+ }
345
+
346
+ function nextWrapperRequestId() {
347
+ wrapperRequestId += 1;
348
+ return "mcp-wrapper-" + Date.now() + "-" + wrapperRequestId;
349
+ }
350
+
351
+ function respondToWrapperRequest(requestId, result) {
352
+ if (!requestId) return;
353
+ sendToAppFrame({
354
+ type: "agentNative.mcpHost.response",
355
+ data: {
356
+ requestId,
357
+ ok: !!(result && result.ok),
358
+ result: result || {}
359
+ }
360
+ });
361
+ }
362
+
363
+ function wrapperRpcRequest(method, params, timeoutMs) {
364
+ return new Promise((resolve) => {
365
+ const id = nextWrapperRequestId();
366
+ const timer = window.setTimeout(() => {
367
+ wrapperRequests.delete(id);
368
+ resolve({ ok: false, error: "MCP host bridge request timed out." });
369
+ }, timeoutMs || wrapperRequestTimeoutMs);
370
+ wrapperRequests.set(id, { resolve, timer });
371
+ try {
372
+ window.parent.postMessage(
373
+ { jsonrpc: "2.0", id, method, params: params || {} },
374
+ "*"
375
+ );
376
+ } catch (err) {
377
+ wrapperRequests.delete(id);
378
+ clearTimeout(timer);
379
+ resolve({ ok: false, error: err && err.message ? err.message : String(err) });
380
+ }
381
+ });
382
+ }
383
+
384
+ function settleWrapperRpcResponse(message) {
385
+ const id = typeof (message && message.id) === "string" ? message.id : "";
386
+ if (!id) return false;
387
+ const pending = wrapperRequests.get(id);
388
+ if (!pending) return false;
389
+ wrapperRequests.delete(id);
390
+ clearTimeout(pending.timer);
391
+ if (message.error) {
392
+ pending.resolve({ ok: false, error: message.error });
393
+ } else {
394
+ pending.resolve({ ok: true, result: message.result });
395
+ }
396
+ return true;
397
+ }
398
+
399
+ function sendHostContext() {
400
+ sendToAppFrame({ type: "agentNative.mcpHostContext", data: hostState() });
401
+ }
402
+
403
+ function sendFrameReadyMessages(frame) {
404
+ const originPayload = { type: "agentNative.frameOrigin", origin: window.location.origin };
405
+ frameReadyMessageDelays.forEach((delay) => {
406
+ setTimeout(() => {
407
+ try { frame.contentWindow && frame.contentWindow.postMessage(originPayload, "*"); } catch {}
408
+ sendHostContext();
409
+ }, delay);
410
+ });
411
+ }
412
+
413
+ function withChatBridgeParam(value) {
414
+ if (typeof value !== "string" || !value) return value;
415
+ try {
416
+ const base = "http://agent-native.invalid";
417
+ const url = value.startsWith("/") ? new URL(value, base) : new URL(value);
418
+ url.searchParams.set(chatBridgeParam, "1");
419
+ return value.startsWith("/")
420
+ ? url.pathname + url.search + url.hash
421
+ : url.toString();
422
+ } catch {
423
+ return value;
424
+ }
425
+ }
426
+
427
+ function embedSessionArgsFor(value) {
428
+ const chrome = typeof toolInput.chrome === "string" ? toolInput.chrome : "full";
429
+ return typeof value === "string" && value.startsWith("/")
430
+ ? { path: value, chrome }
431
+ : { url: value, chrome };
432
+ }
433
+
434
+ function isEmbedStartUrl(value) {
435
+ if (typeof value !== "string" || !value) return false;
436
+ try {
437
+ const url = new URL(value, window.location.href);
438
+ return url.pathname.endsWith("/_agent-native/embed/start");
439
+ } catch {
440
+ return false;
441
+ }
442
+ }
443
+
444
+ function localPathFromUrl(url, includeToken) {
445
+ const next = new URL(url.href);
446
+ if (!includeToken) next.searchParams.delete("__an_embed_token");
447
+ return next.pathname + next.search + next.hash;
448
+ }
449
+
450
+ function rewriteRootRelativeHtmlUrls(html, appOrigin) {
451
+ return String(html).replace(
452
+ /\\b(src|href|poster|action)\\s*=\\s*(["'])\\/(?!\\/)/gi,
453
+ (_match, name, quote) => String(name) + "=" + quote + appOrigin + "/"
454
+ );
455
+ }
456
+
457
+ function removeHtmlCspMeta(html) {
458
+ return String(html).replace(
459
+ /<meta\\s+[^>]*http-equiv\\s*=\\s*(["'])?content-security-policy\\1?[^>]*>/gi,
460
+ ""
461
+ );
462
+ }
463
+
464
+ function embedConfigForAppUrl(appUrl) {
465
+ const sanitizedTarget = localPathFromUrl(appUrl, false);
466
+ return {
467
+ origin: appUrl.origin,
468
+ href: appUrl.href,
469
+ baseHref: appUrl.origin + appUrl.pathname,
470
+ target: sanitizedTarget,
471
+ token: appUrl.searchParams.get("__an_embed_token") || "",
472
+ chatBridgeActive: appUrl.searchParams.get(chatBridgeParam) === "1",
473
+ chatBridgeParam,
474
+ embedTokenParam: "__an_embed_token",
475
+ embedTargetHeader: "x-agent-native-embed-target"
476
+ };
477
+ }
478
+
479
+ function externalOpenUrlForAppUrl(appUrl) {
480
+ if (openUrl) return openUrl;
481
+ try {
482
+ const url = new URL(appUrl.href);
483
+ url.searchParams.delete("embedded");
484
+ url.searchParams.delete("__an_embed_token");
485
+ url.searchParams.delete(chatBridgeParam);
486
+ return url.toString();
487
+ } catch (_err) {
488
+ return "";
489
+ }
490
+ }
491
+
492
+ function installExternalOpenControl(appUrl) {
493
+ const href = externalOpenUrlForAppUrl(appUrl);
494
+ if (!href || !document.body || document.getElementById("agent-native-external-open-control")) {
495
+ return;
496
+ }
497
+ const host = document.createElement("div");
498
+ host.id = "agent-native-external-open-control";
499
+ host.style.position = "fixed";
500
+ host.style.top = "10px";
501
+ host.style.right = "10px";
502
+ host.style.zIndex = "2147483647";
503
+ host.style.pointerEvents = "auto";
504
+ const root = host.attachShadow ? host.attachShadow({ mode: "open" }) : host;
505
+ root.innerHTML =
506
+ '<style>' +
507
+ ':host{all:initial;}' +
508
+ 'button{box-sizing:border-box;min-height:30px;border:1px solid color-mix(in srgb, CanvasText 18%, Canvas);border-radius:7px;background:Canvas;color:CanvasText;box-shadow:0 6px 22px color-mix(in srgb, CanvasText 14%, transparent);cursor:pointer;font:700 12px ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;padding:0 10px;white-space:nowrap;}' +
509
+ 'button:hover{background:color-mix(in srgb, CanvasText 6%, Canvas);}' +
510
+ '</style>' +
511
+ '<button type="button">Open in new tab</button>';
512
+ const button = root.querySelector("button");
513
+ if (button) {
514
+ button.addEventListener("click", (event) => {
515
+ event.preventDefault();
516
+ void openHostLink({ url: href });
517
+ });
518
+ }
519
+ document.body.appendChild(host);
520
+ }
521
+
522
+ function installReactRefreshPreambleFallback() {
523
+ window.__vite_plugin_react_preamble_installed__ = true;
524
+ if (typeof window.$RefreshReg$ !== "function") {
525
+ window.$RefreshReg$ = function() {};
526
+ }
527
+ if (typeof window.$RefreshSig$ !== "function") {
528
+ window.$RefreshSig$ = function() {
529
+ return function(type) {
530
+ return type;
531
+ };
532
+ };
533
+ }
534
+ }
535
+
536
+ function installExternalEmbedRuntime(config) {
537
+ window.__AGENT_NATIVE_EXTERNAL_EMBED = config;
538
+ installReactRefreshPreambleFallback();
539
+ try {
540
+ if (config.target) {
541
+ window.history.replaceState(window.history.state, "", config.target);
542
+ }
543
+ } catch (_err) {}
544
+ try {
545
+ if (config.token) {
546
+ sessionStorage.setItem("agent-native:embed-auth-token", config.token);
547
+ }
548
+ if (config.chatBridgeActive && config.token) {
549
+ sessionStorage.setItem("agent-native:mcp-chat-bridge", config.token);
550
+ }
551
+ } catch (_err) {}
552
+ if (window.__agentNativeExternalEmbedRuntimeInstalled) return;
553
+ window.__agentNativeExternalEmbedRuntimeInstalled = true;
554
+ function appOrigin() {
555
+ try {
556
+ return new URL(config.origin).origin;
557
+ } catch (_err) {
558
+ return "";
559
+ }
560
+ }
561
+ function targetPath() {
562
+ return config.target || location.pathname + location.search;
563
+ }
564
+ function rewrittenUrl(value, appendToken) {
565
+ const origin = appOrigin();
566
+ if (!origin) return null;
567
+ let url;
568
+ try {
569
+ url = new URL(value, location.href);
570
+ } catch (_err) {
571
+ return null;
572
+ }
573
+ if (url.origin !== location.origin && url.origin !== origin) return null;
574
+ if (url.origin !== origin) {
575
+ const app = new URL(origin);
576
+ url.protocol = app.protocol;
577
+ url.host = app.host;
578
+ }
579
+ if (appendToken && config.token && url.pathname === "/_agent-native/events") {
580
+ url.searchParams.set(config.embedTokenParam, config.token);
581
+ }
582
+ return url.toString();
583
+ }
584
+ function authHeaders(input, init) {
585
+ const headers = new Headers(
586
+ init && init.headers ? init.headers : input instanceof Request ? input.headers : undefined
587
+ );
588
+ if (config.token && !headers.has("Authorization")) {
589
+ headers.set("Authorization", "Bearer " + config.token);
590
+ }
591
+ if (!headers.has(config.embedTargetHeader)) {
592
+ headers.set(config.embedTargetHeader, targetPath());
593
+ }
594
+ return headers;
595
+ }
596
+ if (typeof fetch === "function") {
597
+ const originalFetch = fetch.bind(window);
598
+ window.fetch = function(input, init) {
599
+ const raw = input instanceof Request ? input.url : String(input);
600
+ const url = rewrittenUrl(raw, false);
601
+ if (!url) return originalFetch(input, init);
602
+ const nextInit = Object.assign({}, init || {}, {
603
+ headers: authHeaders(input, init),
604
+ credentials: "omit"
605
+ });
606
+ if (input instanceof Request) {
607
+ return originalFetch(new Request(url, input), nextInit);
608
+ }
609
+ return originalFetch(url, nextInit);
610
+ };
611
+ }
612
+ if (typeof XMLHttpRequest !== "undefined") {
613
+ const originalOpen = XMLHttpRequest.prototype.open;
614
+ const originalSend = XMLHttpRequest.prototype.send;
615
+ XMLHttpRequest.prototype.open = function(method, url) {
616
+ const rewritten = rewrittenUrl(url, false);
617
+ this.__agentNativeExternalEmbed = !!rewritten;
618
+ return originalOpen.call(
619
+ this,
620
+ method,
621
+ rewritten || url,
622
+ arguments.length > 2 ? arguments[2] : true,
623
+ arguments[3],
624
+ arguments[4]
625
+ );
626
+ };
627
+ XMLHttpRequest.prototype.send = function(body) {
628
+ if (this.__agentNativeExternalEmbed) {
629
+ try {
630
+ if (config.token) this.setRequestHeader("Authorization", "Bearer " + config.token);
631
+ this.setRequestHeader(config.embedTargetHeader, targetPath());
632
+ } catch (_err) {}
633
+ }
634
+ return originalSend.call(this, body);
635
+ };
636
+ }
637
+ if (typeof EventSource !== "undefined") {
638
+ const OriginalEventSource = EventSource;
639
+ window.EventSource = function(url, options) {
640
+ return new OriginalEventSource(rewrittenUrl(url, true) || url, options);
641
+ };
642
+ window.EventSource.prototype = OriginalEventSource.prototype;
643
+ }
644
+ }
645
+
646
+ function copyDocumentElementAttributes(source) {
647
+ const target = document.documentElement;
648
+ for (const attr of Array.from(target.attributes)) {
649
+ target.removeAttribute(attr.name);
650
+ }
651
+ for (const attr of Array.from(source.attributes)) {
652
+ target.setAttribute(attr.name, attr.value);
653
+ }
654
+ }
655
+
656
+ function importChildren(source, target) {
657
+ target.replaceChildren(
658
+ ...Array.from(source.childNodes).map((node) => document.importNode(node, true))
659
+ );
660
+ }
661
+
662
+ function importHeadChildrenWithBase(source, baseHref) {
663
+ const base = document.createElement("base");
664
+ base.href = baseHref;
665
+ const nodes = Array.from(source.childNodes).filter((node) => {
666
+ return !(
667
+ node.nodeType === 1 &&
668
+ String(node.nodeName || "").toLowerCase() === "base"
669
+ );
670
+ });
671
+ document.head.replaceChildren(
672
+ base,
673
+ ...nodes.map((node) => document.importNode(node, true))
674
+ );
675
+ }
676
+
677
+ function isModuleScript(script) {
678
+ return (script.getAttribute("type") || "").trim().toLowerCase() === "module";
679
+ }
680
+
681
+ function isRunnableClassicScript(script) {
682
+ const type = (script.getAttribute("type") || "").trim().toLowerCase();
683
+ return !type || type === "text/javascript" || type === "application/javascript";
684
+ }
685
+
686
+ function runClassicScript(script) {
687
+ const next = document.createElement("script");
688
+ for (const attr of Array.from(script.attributes)) {
689
+ if (attr.name === "type") continue;
690
+ next.setAttribute(attr.name, attr.value);
691
+ }
692
+ if (script.src) {
693
+ next.src = script.src;
694
+ } else {
695
+ next.textContent = script.textContent || "";
696
+ }
697
+ document.body.appendChild(next);
698
+ next.remove();
699
+ }
700
+
701
+ function isEmbedRuntimeModulePath(pathname) {
702
+ if (typeof pathname !== "string" || !pathname) return false;
703
+ return /(?:^|\\/)(?:@(?:id|vite|fs|react-refresh)|app|node_modules|packages|src)(?:\\/|$)/.test(pathname) ||
704
+ /(?:^|\\/)__x00__virtual:/.test(pathname) ||
705
+ pathname.includes("virtual:react-router");
706
+ }
707
+
708
+ function appendEmbedParamsToAppUrl(url, config) {
709
+ if (isEmbedRuntimeModulePath(url.pathname)) return url;
710
+ if (config.token) url.searchParams.set(config.embedTokenParam, config.token);
711
+ if (config.chatBridgeActive) url.searchParams.set(config.chatBridgeParam, "1");
712
+ return url;
713
+ }
714
+
715
+ function rootRelativeSpecifierToAppUrl(specifier, config) {
716
+ if (typeof specifier !== "string" || !specifier.startsWith("/") || specifier.startsWith("//")) {
717
+ return specifier;
718
+ }
719
+ try {
720
+ const url = new URL(specifier, config.origin);
721
+ return appendEmbedParamsToAppUrl(url, config).toString();
722
+ } catch (_err) {
723
+ return specifier;
724
+ }
725
+ }
726
+
727
+ function rootRelativeSpecifiersToAbsolute(code, config) {
728
+ return String(code).replace(/(["'])\\/(?!\\/)([^"']*)/g, (_match, quote, rest) => {
729
+ return quote + rootRelativeSpecifierToAppUrl("/" + rest, config);
730
+ });
731
+ }
732
+
733
+ function relativeSpecifierToAppUrl(specifier, config, baseUrl) {
734
+ if (typeof specifier !== "string" || !/^\\.\\.?\\//.test(specifier)) {
735
+ return specifier;
736
+ }
737
+ try {
738
+ const url = new URL(specifier, baseUrl || config.baseHref);
739
+ if (url.origin === config.origin) {
740
+ appendEmbedParamsToAppUrl(url, config);
741
+ }
742
+ return url.toString();
743
+ } catch (_err) {
744
+ return specifier;
745
+ }
746
+ }
747
+
748
+ function relativeModuleSpecifiersToAbsolute(code, config, baseUrl) {
749
+ return String(code)
750
+ .replace(/(\\bimport\\s+(?:[^"']+?\\s+from\\s+)?)(["'])(\\.\\.?\\/[^"']*)\\2/g, (_match, prefix, quote, specifier) => {
751
+ return prefix + quote + relativeSpecifierToAppUrl(specifier, config, baseUrl) + quote;
752
+ })
753
+ .replace(/(\\bimport\\s*\\(\\s*)(["'])(\\.\\.?\\/[^"']*)\\2/g, (_match, prefix, quote, specifier) => {
754
+ return prefix + quote + relativeSpecifierToAppUrl(specifier, config, baseUrl) + quote;
755
+ })
756
+ .replace(/(\\bexport\\s+[^"']*?\\s+from\\s+)(["'])(\\.\\.?\\/[^"']*)\\2/g, (_match, prefix, quote, specifier) => {
757
+ return prefix + quote + relativeSpecifierToAppUrl(specifier, config, baseUrl) + quote;
758
+ });
759
+ }
760
+
761
+ function stripDevOnlyModuleImports(code) {
762
+ return String(code).replace(
763
+ /\\bimport\\s+(?:[^"']+\\s+from\\s+)?["'][^"']*(?:virtual:react-router\\/inject-hmr-runtime|__x00__virtual:react-router\\/inject-hmr-runtime)[^"']*["']\\s*;?/g,
764
+ ""
765
+ );
766
+ }
767
+
768
+ function namedImportBindings(specifierList) {
769
+ return String(specifierList)
770
+ .split(",")
771
+ .map((part) => {
772
+ const trimmed = part.trim();
773
+ if (!trimmed) return "";
774
+ return trimmed.replace(
775
+ /^([A-Za-z_$][\\w$]*)\\s+as\\s+([A-Za-z_$][\\w$]*)$/,
776
+ "$1: $2"
777
+ );
778
+ })
779
+ .filter(Boolean)
780
+ .join(", ");
781
+ }
782
+
783
+ function moduleCodeToClassicAsync(code, config, baseUrl) {
784
+ return relativeModuleSpecifiersToAbsolute(
785
+ rootRelativeSpecifiersToAbsolute(stripDevOnlyModuleImports(code), config),
786
+ config,
787
+ baseUrl
788
+ )
789
+ .replace(
790
+ /\\bimport\\s+([A-Za-z_$][\\w$]*)\\s*,\\s*\\*\\s+as\\s+([A-Za-z_$][\\w$]*)\\s+from\\s+(["'][^"']+["'])\\s*;?/g,
791
+ "const $2 = await import($3); const $1 = $2.default;"
792
+ )
793
+ .replace(
794
+ /\\bimport\\s+([A-Za-z_$][\\w$]*)\\s*,\\s*\\{([\\s\\S]*?)\\}\\s*from\\s+(["'][^"']+["'])\\s*;?/g,
795
+ (_match, defaultName, specifiers, source) =>
796
+ "const { default: " +
797
+ defaultName +
798
+ (namedImportBindings(specifiers) ? ", " + namedImportBindings(specifiers) : "") +
799
+ " } = await import(" +
800
+ source +
801
+ ");"
802
+ )
803
+ .replace(
804
+ /\\bimport\\s+\\{([\\s\\S]*?)\\}\\s*from\\s+(["'][^"']+["'])\\s*;?/g,
805
+ (_match, specifiers, source) =>
806
+ "const { " + namedImportBindings(specifiers) + " } = await import(" + source + ");"
807
+ )
808
+ .replace(
809
+ /\\bimport\\s+\\*\\s+as\\s+([A-Za-z_$][\\w$]*)\\s+from\\s+(["'][^"']+["'])\\s*;?/g,
810
+ "const $1 = await import($2);"
811
+ )
812
+ .replace(
813
+ /\\bimport\\s+([A-Za-z_$][\\w$]*)\\s+from\\s+(["'][^"']+["'])\\s*;?/g,
814
+ "const { default: $1 } = await import($2);"
815
+ )
816
+ .replace(/\\bimport\\s+(["'][^"']+["'])\\s*;?/g, "await import($1);")
817
+ .replace(/\\bimport\\((["'][^"']+["'])\\)\\s*;?/g, "await import($1);");
818
+ }
819
+
820
+ function scriptSourceUrl(script, config) {
821
+ const raw = script.getAttribute("src") || "";
822
+ if (!raw) return "";
823
+ try {
824
+ const url = new URL(raw, config.baseHref);
825
+ if (url.origin === config.origin) {
826
+ appendEmbedParamsToAppUrl(url, config);
827
+ }
828
+ return url.toString();
829
+ } catch (_err) {
830
+ return raw;
831
+ }
832
+ }
833
+
834
+ async function moduleScriptCode(script, config) {
835
+ const src = scriptSourceUrl(script, config);
836
+ if (!src) return script.textContent || "";
837
+ const response = await fetch(src, {
838
+ credentials: "omit",
839
+ headers: { Accept: "text/javascript, application/javascript, */*" }
840
+ });
841
+ if (!response.ok) {
842
+ throw new Error("Module script returned HTTP " + response.status + ".");
843
+ }
844
+ return await response.text();
845
+ }
846
+
847
+ async function runModuleScriptAsClassic(script, config) {
848
+ const sourceUrl = scriptSourceUrl(script, config) || config.baseHref;
849
+ const code = moduleCodeToClassicAsync(
850
+ await moduleScriptCode(script, config),
851
+ config,
852
+ sourceUrl
853
+ );
854
+ const runner = document.createElement("script");
855
+ runner.textContent =
856
+ "(async()=>{" +
857
+ code +
858
+ "})().catch((err)=>{console.error('[agent-native] transplanted app module failed',err);document.body.setAttribute('data-agent-native-hydration-error',String(err&&err.message||err));});";
859
+ document.body.appendChild(runner);
860
+ runner.remove();
861
+ }
862
+
863
+ async function mountTransplantedHtml(html, appUrl) {
864
+ const config = embedConfigForAppUrl(appUrl);
865
+ installExternalEmbedRuntime(config);
866
+ const parsed = new DOMParser().parseFromString(
867
+ rewriteRootRelativeHtmlUrls(removeHtmlCspMeta(html), appUrl.origin),
868
+ "text/html"
869
+ );
870
+ const scripts = Array.from(parsed.querySelectorAll("script"));
871
+ copyDocumentElementAttributes(parsed.documentElement);
872
+ importHeadChildrenWithBase(parsed.head, config.baseHref);
873
+ importChildren(parsed.body, document.body);
874
+ installExternalOpenControl(appUrl);
875
+ for (const script of scripts) {
876
+ if (isRunnableClassicScript(script)) runClassicScript(script);
877
+ }
878
+ for (const script of scripts) {
879
+ if (isModuleScript(script)) await runModuleScriptAsClassic(script, config);
880
+ }
881
+ }
882
+
883
+ function absoluteUrl(value, base) {
884
+ try {
885
+ return new URL(value, base).toString();
886
+ } catch {
887
+ return "";
888
+ }
889
+ }
890
+
891
+ async function resolveTransplantAppDocumentSource(src) {
892
+ if (!isEmbedStartUrl(src)) {
893
+ return { url: new URL(src), response: null };
894
+ }
895
+ const response = await fetch(src, {
896
+ credentials: "omit",
897
+ redirect: "follow",
898
+ headers: {
899
+ Accept: "application/json",
900
+ "X-Agent-Native-Embed-Transplant": "1"
901
+ }
902
+ });
903
+ const contentType = response.headers.get("content-type") || "";
904
+ if (response.ok && /\\bapplication\\/json\\b/i.test(contentType)) {
905
+ const data = await response.json();
906
+ const location = typeof data.location === "string" ? data.location : "";
907
+ const url = absoluteUrl(location, src);
908
+ if (url) return { url: new URL(withChatBridgeParam(url)), response: null };
909
+ throw new Error("Embedded app did not return a launch URL.");
910
+ }
911
+ return {
912
+ url: new URL(response.url || src),
913
+ response
914
+ };
915
+ }
916
+
917
+ async function transplantAppDocument(src) {
918
+ clearFrameReadyTimer();
919
+ clearFrameLoadTimer();
920
+ appFrame = null;
921
+ lastFrameSrc = src;
922
+ setMessage("Loading app");
923
+ const source = await resolveTransplantAppDocumentSource(src);
924
+ const response = source.response || await fetch(source.url.href, {
925
+ credentials: "omit",
926
+ redirect: "follow",
927
+ headers: { Accept: "text/html" }
928
+ });
929
+ if (!response.ok) {
930
+ if (response.status === 401 && isEmbedStartUrl(src)) {
931
+ reportEmbedError(
932
+ "transplant-auth",
933
+ "Embedded app session expired (HTTP 401).",
934
+ "Opaque-origin sandbox could not authenticate the embed.",
935
+ 401
936
+ );
937
+ refreshExpiredEmbedSession();
938
+ return;
939
+ }
940
+ reportEmbedError(
941
+ "transplant-http",
942
+ "Embedded app returned HTTP " + response.status + ".",
943
+ undefined,
944
+ response.status
945
+ );
946
+ throw new Error("Embedded app returned HTTP " + response.status + ".");
947
+ }
948
+ const html = await response.text();
949
+ // Use the FINAL URL the fetch landed on after following redirects, NOT
950
+ // the pre-redirect embed-start location. The embed ticket's targetPath is
951
+ // /_agent-native/open?...&to=/plans/<id>, which 302-redirects to the real
952
+ // app route; we render that route's HTML. If we replaceState to the
953
+ // pre-redirect /_agent-native/open (a server-only framework route), the
954
+ // hydrated React Router has no matching client route and throws a 404
955
+ // ("No route matches URL /_agent-native/open"). response.url is the
956
+ // resolved app route (/plans/<id>) the router can actually match.
957
+ const appUrl = new URL(
958
+ response.url || (source.url ? source.url.href : src),
959
+ );
960
+ try {
961
+ window.history.replaceState(window.history.state, "", localPathFromUrl(appUrl, false));
962
+ } catch {}
963
+ await mountTransplantedHtml(html, appUrl);
964
+ embedSessionRefreshAttempts = 0;
965
+ notifyHostHeightRepeatedly();
966
+ }
967
+
968
+ function wantsEmbed() {
969
+ if (toolInput.embed === false || toolInput.embed === "false") return false;
970
+ if (embedByDefault) return true;
971
+ return toolInput.embed === true || toolInput.embed === "true";
972
+ }
973
+
974
+ function renderModeSource() {
975
+ const input = objectValue(toolInput);
976
+ const result = objectValue(toolResultData);
977
+ return {
978
+ mode: typeof input.embedMode === "string"
979
+ ? input.embedMode
980
+ : typeof input.renderMode === "string"
981
+ ? input.renderMode
982
+ : typeof result.embedMode === "string"
983
+ ? result.embedMode
984
+ : typeof result.renderMode === "string"
985
+ ? result.renderMode
986
+ : "",
987
+ frame: typeof input.frame === "string"
988
+ ? input.frame
989
+ : typeof result.frame === "string"
990
+ ? result.frame
991
+ : "",
992
+ nested: input.nested === true || result.nested === true
993
+ };
994
+ }
995
+
996
+ function supportedDisplayMode(mode) {
997
+ if (openAiBridge && typeof openAiBridge.requestDisplayMode === "function") {
998
+ return mode === "inline" || mode === "fullscreen" || mode === "pip";
999
+ }
1000
+ const modes = hostState().context && hostState().context.availableDisplayModes;
1001
+ return Array.isArray(modes) && modes.includes(mode);
1002
+ }
1003
+
1004
+ async function requestHostDisplayMode(mode) {
1005
+ let result;
1006
+ if (openAiBridge && typeof openAiBridge.requestDisplayMode === "function") {
1007
+ result = await openAiBridge.requestDisplayMode({ mode });
1008
+ } else {
1009
+ if (!app || typeof app.requestDisplayMode !== "function") {
1010
+ throw new Error("Display mode changes are not available in this host.");
1011
+ }
1012
+ result = await app.requestDisplayMode({ mode });
1013
+ }
1014
+ updateDisplayButton();
1015
+ sendHostContext();
1016
+ return result;
1017
+ }
1018
+
1019
+ function updateDisplayButton() {
1020
+ const context = hostState().context || {};
1021
+ const nextMode = context.displayMode === "fullscreen" ? "inline" : "fullscreen";
1022
+ const supported = supportedDisplayMode(nextMode);
1023
+ displayButton.hidden = !supported;
1024
+ displayButton.disabled = !supported;
1025
+ displayButton.textContent = nextMode === "fullscreen" ? "Fullscreen" : "Inline";
1026
+ displayButton.onclick = () => {
1027
+ if (!supportedDisplayMode(nextMode)) return;
1028
+ void requestHostDisplayMode(nextMode).catch((err) => {
1029
+ console.warn("[agent-native] MCP host rejected display mode request", err);
1030
+ });
1031
+ };
1032
+ }
1033
+
1034
+ function setMessage(message) {
1035
+ stage.innerHTML = '<div class="message">' + esc(message) + '</div>';
1036
+ }
1037
+
1038
+ function clearFrameReadyTimer() {
1039
+ if (!appFrameReadyTimer) return;
1040
+ clearTimeout(appFrameReadyTimer);
1041
+ appFrameReadyTimer = null;
1042
+ }
1043
+
1044
+ function clearFrameLoadTimer() {
1045
+ if (!appFrameLoadTimer) return;
1046
+ clearTimeout(appFrameLoadTimer);
1047
+ appFrameLoadTimer = null;
1048
+ }
1049
+
1050
+ function startFrameReadyTimer(frame) {
1051
+ clearFrameReadyTimer();
1052
+ appFrameReadyTimer = setTimeout(() => {
1053
+ if (!appFrameReady && appFrame === frame) renderFrameFallback();
1054
+ }, frameReadyTimeoutMs);
1055
+ }
1056
+
1057
+ // Best-effort telemetry sink so inline-embed failures are visible in
1058
+ // Sentry (handshake timeout, transplant fetch status/CORS, auth, CSP).
1059
+ // The shell is a sandboxed opaque-origin iframe, so it POSTs to the app
1060
+ // origin's CORS-open /_agent-native/mcp/embed-error route, derived from the
1061
+ // known app URLs. Deduped per stage+message so a retry loop can't spam.
1062
+ const reportedEmbedErrorKeys = new Set();
1063
+ let embedErrorReportCount = 0;
1064
+ function embedReportOrigin() {
1065
+ for (const value of [openStartUrl, openUrl, lastFrameSrc]) {
1066
+ if (typeof value === "string" && value) {
1067
+ try { return new URL(value, window.location.href).origin; } catch {}
1068
+ }
1069
+ }
1070
+ return "";
1071
+ }
1072
+ function reportEmbedError(stage, message, detail, status) {
1073
+ try {
1074
+ const key = String(stage) + "|" + String(message || "");
1075
+ if (reportedEmbedErrorKeys.has(key) || embedErrorReportCount >= 8) return;
1076
+ reportedEmbedErrorKeys.add(key);
1077
+ embedErrorReportCount += 1;
1078
+ const origin = embedReportOrigin();
1079
+ if (!origin) return;
1080
+ let renderMode = "";
1081
+ try { renderMode = renderModeSource().mode || ""; } catch {}
1082
+ const body = JSON.stringify({
1083
+ stage: String(stage || ""),
1084
+ message: String(message || "").slice(0, 500),
1085
+ detail: detail ? String(detail).slice(0, 1200) : undefined,
1086
+ url: openStartUrl || openUrl || lastFrameSrc || "",
1087
+ status: typeof status === "number" ? status : undefined,
1088
+ host: window.location.hostname || "",
1089
+ renderMode: renderMode,
1090
+ bridge: openAiBridge ? "openai" : app ? "native" : "none",
1091
+ userAgent: navigator.userAgent || ""
1092
+ });
1093
+ fetch(origin + "/_agent-native/mcp/embed-error", {
1094
+ method: "POST",
1095
+ credentials: "omit",
1096
+ keepalive: true,
1097
+ headers: { "Content-Type": "application/json" },
1098
+ body: body
1099
+ }).catch(() => {});
1100
+ } catch {}
1101
+ }
1102
+
1103
+ function renderFrameFallback() {
1104
+ clearFrameReadyTimer();
1105
+ clearFrameLoadTimer();
1106
+ appFrame = null;
1107
+ const fallbackCopy = openUrl
1108
+ ? "This chat host did not allow the embedded app frame to load inline. You can still open the same app route through the host or use the URL below."
1109
+ : "This chat host did not allow the embedded app frame to load inline.";
1110
+ reportEmbedError("frame-fallback", fallbackCopy);
1111
+ stage.innerHTML =
1112
+ '<div class="fallback">' +
1113
+ '<div class="fallback-title">Open this app in its own tab</div>' +
1114
+ '<div class="fallback-copy">' + esc(fallbackCopy) + '</div>' +
1115
+ '<div class="fallback-actions">' +
1116
+ '<button type="button" class="primary" data-fallback-open>Open in new tab</button>' +
1117
+ '<button type="button" data-fallback-retry>Try inline again</button>' +
1118
+ '</div>' +
1119
+ (openUrl ? '<a class="fallback-url" href="' + esc(openUrl) + '" target="_blank" rel="noreferrer">' + esc(openUrl) + '</a>' : '') +
1120
+ '</div>';
1121
+ const fallbackOpen = stage.querySelector("[data-fallback-open]");
1122
+ const fallbackRetry = stage.querySelector("[data-fallback-retry]");
1123
+ if (fallbackOpen) {
1124
+ fallbackOpen.disabled = !openUrl;
1125
+ fallbackOpen.onclick = () => {
1126
+ if (openUrl) void openFallbackExternal();
1127
+ };
1128
+ }
1129
+ if (fallbackRetry) {
1130
+ fallbackRetry.disabled = !lastFrameSrc;
1131
+ fallbackRetry.onclick = () => {
1132
+ if (lastFrameSrc) renderFrame(lastFrameSrc);
1133
+ };
1134
+ }
1135
+ }
1136
+
1137
+ function renderAppLaunchError(message) {
1138
+ clearFrameReadyTimer();
1139
+ clearFrameLoadTimer();
1140
+ appFrame = null;
1141
+ const fallbackCopy = openUrl
1142
+ ? "The inline MCP app could not load in this chat host. You can open the same app route in a new tab or retry the inline load."
1143
+ : "The inline MCP app could not load in this chat host.";
1144
+ reportEmbedError("app-launch-error", message || fallbackCopy, message);
1145
+ const copyHtml = message
1146
+ ? '<div>' + esc(message) + '</div><div>' + esc(fallbackCopy) + '</div>'
1147
+ : esc(fallbackCopy);
1148
+ stage.innerHTML =
1149
+ '<div class="fallback">' +
1150
+ '<div class="fallback-title">App did not load</div>' +
1151
+ '<div class="fallback-copy">' + copyHtml + '</div>' +
1152
+ '<div class="fallback-actions">' +
1153
+ '<button type="button" class="primary" data-fallback-open>Open in new tab</button>' +
1154
+ '<button type="button" data-fallback-retry>Retry</button>' +
1155
+ '</div>' +
1156
+ (openUrl ? '<a class="fallback-url" href="' + esc(openUrl) + '" target="_blank" rel="noreferrer">' + esc(openUrl) + '</a>' : '') +
1157
+ '</div>';
1158
+ const fallbackOpen = stage.querySelector("[data-fallback-open]");
1159
+ const fallbackRetry = stage.querySelector("[data-fallback-retry]");
1160
+ if (fallbackOpen) {
1161
+ fallbackOpen.disabled = !openUrl;
1162
+ fallbackOpen.onclick = () => {
1163
+ if (openUrl) void openHostLink({ url: openUrl });
1164
+ };
1165
+ }
1166
+ if (fallbackRetry) {
1167
+ fallbackRetry.onclick = () => {
1168
+ startedFor = "";
1169
+ void launchEmbed();
1170
+ };
1171
+ }
1172
+ }
1173
+
1174
+ async function openFallbackExternal() {
1175
+ if (!openUrl) return;
1176
+ let url = withChatBridgeParam(openUrl);
1177
+ try {
1178
+ if (url) {
1179
+ const result = await callEmbedSessionTool(embedSessionArgsFor(url));
1180
+ const data = parseToolResult(result);
1181
+ if (typeof data.startUrl === "string" && data.startUrl) {
1182
+ url = withChatBridgeParam(data.startUrl);
1183
+ }
1184
+ }
1185
+ } catch (err) {
1186
+ console.warn("[agent-native] MCP fallback could not mint a fresh app session", err);
1187
+ }
1188
+ await openHostLink({ url });
1189
+ }
1190
+
1191
+ function renderFrame(src) {
1192
+ clearFrameReadyTimer();
1193
+ clearFrameLoadTimer();
1194
+ const frame = document.createElement("iframe");
1195
+ frame.title = body.dataset.iframeTitle || "Agent Native app";
1196
+ frame.src = src;
1197
+ frame.allow = "clipboard-read; clipboard-write";
1198
+ appFrame = frame;
1199
+ appFrameReady = false;
1200
+ lastFrameSrc = src;
1201
+ frame.addEventListener("load", () => {
1202
+ if (appFrame !== frame) return;
1203
+ clearFrameLoadTimer();
1204
+ notifyOuterMcpAppReady();
1205
+ sendFrameReadyMessages(frame);
1206
+ startFrameReadyTimer(frame);
1207
+ });
1208
+ stage.replaceChildren(frame);
1209
+ notifyHostHeight();
1210
+ appFrameLoadTimer = setTimeout(() => {
1211
+ if (!appFrameReady && appFrame === frame) renderFrameFallback();
1212
+ }, frameLoadTimeoutMs);
1213
+ }
1214
+
1215
+ function refreshExpiredEmbedSession() {
1216
+ clearFrameReadyTimer();
1217
+ clearFrameLoadTimer();
1218
+ appFrameReady = false;
1219
+ if (!openUrl) {
1220
+ renderFrameFallback();
1221
+ return;
1222
+ }
1223
+ if (embedSessionRefreshAttempts >= maxEmbedSessionRefreshAttempts) {
1224
+ renderAppLaunchError(
1225
+ "Embedded app session expired. Reopen the app to mint a fresh session."
1226
+ );
1227
+ return;
1228
+ }
1229
+ embedSessionRefreshAttempts += 1;
1230
+ openStartUrl = "";
1231
+ startedFor = "";
1232
+ lastFrameSrc = "";
1233
+ setMessage("Refreshing app session");
1234
+ void launchEmbed();
1235
+ }
1236
+
1237
+ function shouldSelfNavigateToApp() {
1238
+ const render = renderModeSource();
1239
+ const mode = render.mode;
1240
+ if (isClaudeMcpContentHost()) return true;
1241
+ if (mode === "iframe" || mode === "nested") return false;
1242
+ if (render.nested || render.frame === "iframe") return false;
1243
+ return true;
1244
+ }
1245
+
1246
+ function shouldTransplantAppDocument() {
1247
+ const render = renderModeSource();
1248
+ const mode = render.mode;
1249
+ if (mode === "iframe" || mode === "nested" || render.frame === "iframe" || render.nested) {
1250
+ return false;
1251
+ }
1252
+ // ChatGPT is excluded so it uses the controlled nested frame instead:
1253
+ // transplant would cross-origin import() app chunks in its opaque-origin
1254
+ // sandbox, which it blocks (blank embed). embedMode "transplant" still forces it.
1255
+ return (
1256
+ isClaudeMcpContentHost() ||
1257
+ mode === "transplant" ||
1258
+ render.frame === "transplant"
1259
+ );
1260
+ }
1261
+
1262
+ function isClaudeMcpContentHost() {
1263
+ try {
1264
+ return /(^|\\.)claudemcpcontent\\.com$/i.test(window.location.hostname || "");
1265
+ } catch {
1266
+ return false;
1267
+ }
1268
+ }
1269
+
1270
+ function isChatGptSandboxHost() {
1271
+ try {
1272
+ const host = window.location.hostname || "";
1273
+ const appParam = new URL(window.location.href).searchParams.get("app");
1274
+ return /^(?:[^.]+\\.)?web-sandbox\\.oaiusercontent\\.com$/i.test(host) || appParam === "chatgpt";
1275
+ } catch {
1276
+ return false;
1277
+ }
1278
+ }
1279
+
1280
+ function shouldRenderControlledAppFrame() {
1281
+ return !!openAiBridge || !!app || isChatGptSandboxHost();
1282
+ }
1283
+
1284
+ function shouldDirectRenderKnownAppRoute(src) {
1285
+ return !!app && !openAiBridge && !isEmbedStartUrl(src) && !shouldTransplantAppDocument();
1286
+ }
1287
+
1288
+ function isCurrentFrameUrl(src) {
1289
+ try {
1290
+ return new URL(src, window.location.href).href === window.location.href;
1291
+ } catch {
1292
+ return false;
1293
+ }
1294
+ }
1295
+
1296
+ function navigateToAppFrame(src) {
1297
+ if (isCurrentFrameUrl(src)) {
1298
+ clearFrameReadyTimer();
1299
+ clearFrameLoadTimer();
1300
+ setMessage("App opened");
1301
+ notifyHostHeightRepeatedly();
1302
+ return;
1303
+ }
1304
+ clearFrameReadyTimer();
1305
+ clearFrameLoadTimer();
1306
+ appFrame = null;
1307
+ lastFrameSrc = src;
1308
+ setMessage("Opening app");
1309
+ try {
1310
+ window.location.replace(src);
1311
+ } catch (err) {
1312
+ console.warn("[agent-native] MCP app self-navigation failed", err);
1313
+ renderFrameFallback();
1314
+ }
1315
+ }
1316
+
1317
+ async function ensureHostAppConnected() {
1318
+ if (!app || typeof app.connect !== "function") return;
1319
+ if (!appConnectPromise) {
1320
+ appConnectPromise = Promise.resolve(app.connect())
1321
+ .then(async (value) => {
1322
+ // Let the host process ui/notifications/initialized before follow-up calls.
1323
+ await new Promise((resolve) => window.setTimeout(resolve, 0));
1324
+ await new Promise((resolve) => window.setTimeout(resolve, 0));
1325
+ return value;
1326
+ })
1327
+ .catch((err) => {
1328
+ appConnectPromise = null;
1329
+ throw err;
1330
+ });
1331
+ }
1332
+ await appConnectPromise;
1333
+ }
1334
+
1335
+ async function updateHostModelContext(data) {
1336
+ const params = {};
1337
+ if (Array.isArray(data && data.content)) params.content = data.content;
1338
+ if (data && data.structuredContent && typeof data.structuredContent === "object") {
1339
+ params.structuredContent = data.structuredContent;
1340
+ }
1341
+ if (openAiBridge && typeof openAiBridge.setWidgetState === "function") {
1342
+ openAiBridge.setWidgetState({
1343
+ ...objectValue(openAiBridge.widgetState),
1344
+ agentNativeModelContext: params
1345
+ });
1346
+ return { ok: true };
1347
+ }
1348
+ if (!app || typeof app.updateModelContext !== "function") return { ok: false };
1349
+ await ensureHostAppConnected();
1350
+ await app.updateModelContext(params);
1351
+ return { ok: true };
1352
+ }
1353
+
1354
+ async function openHostLink(data) {
1355
+ const url = typeof (data && data.url) === "string" ? data.url : "";
1356
+ if (!url) return { isError: true };
1357
+ if (openAiBridge && typeof openAiBridge.openExternal === "function") {
1358
+ return await openAiBridge.openExternal({ href: url, redirectUrl: false });
1359
+ }
1360
+ if (app && typeof app.openLink === "function") {
1361
+ return await app.openLink({ url });
1362
+ }
1363
+ window.open(url, "_blank", "noopener,noreferrer");
1364
+ return { ok: true };
1365
+ }
1366
+
1367
+ function notifyHostHeight() {
1368
+ const intrinsic = visibleIntrinsicHeight();
1369
+ const height = applyIntrinsicHeight(intrinsic);
1370
+ if (!openAiBridge || typeof openAiBridge.notifyIntrinsicHeight !== "function") {
1371
+ if (app && typeof app.sendSizeChanged === "function") {
1372
+ try {
1373
+ app.sendSizeChanged({ height });
1374
+ } catch (err) {
1375
+ console.warn("[agent-native] MCP host rejected size update", err);
1376
+ }
1377
+ }
1378
+ return;
1379
+ }
1380
+ try {
1381
+ openAiBridge.notifyIntrinsicHeight({ height });
1382
+ } catch (err) {
1383
+ console.warn("[agent-native] ChatGPT rejected intrinsic height update", err);
1384
+ }
1385
+ }
1386
+
1387
+ function respondToAppFrame(requestId, work) {
1388
+ if (!requestId) return;
1389
+ Promise.resolve(work)
1390
+ .then((result) => {
1391
+ sendToAppFrame({
1392
+ type: "agentNative.mcpHost.response",
1393
+ data: { requestId, ok: true, result }
1394
+ });
1395
+ })
1396
+ .catch((err) => {
1397
+ sendToAppFrame({
1398
+ type: "agentNative.mcpHost.response",
1399
+ data: {
1400
+ requestId,
1401
+ ok: false,
1402
+ error: err && err.message ? err.message : String(err)
1403
+ }
1404
+ });
1405
+ });
1406
+ }
1407
+
1408
+ async function sendHostChat(chat) {
1409
+ const requestId = typeof (chat && chat.requestId) === "string" ? chat.requestId : "";
1410
+ if (!chat || chat.submit === false) return;
1411
+ const message = typeof chat.message === "string" ? chat.message : "";
1412
+ if (!message.trim()) return;
1413
+ const context = typeof chat.context === "string" ? chat.context.trim() : "";
1414
+ const content = Array.isArray(chat.content) && chat.content.length
1415
+ ? chat.content
1416
+ : [{ type: "text", text: message }];
1417
+ const structuredContent =
1418
+ chat && chat.structuredContent !== undefined
1419
+ ? chat.structuredContent
1420
+ : undefined;
1421
+ try {
1422
+ const contextContent = context
1423
+ ? [{ type: "text", text: context }, ...content.filter((part) => part && part.type !== "text")]
1424
+ : content.filter((part) => part && part.type !== "text");
1425
+ const modelContext = {
1426
+ content: contextContent,
1427
+ ...(structuredContent !== undefined ? { structuredContent } : {})
1428
+ };
1429
+ if (openAiBridge && typeof openAiBridge.setWidgetState === "function") {
1430
+ openAiBridge.setWidgetState({
1431
+ ...objectValue(openAiBridge.widgetState),
1432
+ agentNativeChatContext: context || null,
1433
+ agentNativeModelContext: modelContext
1434
+ });
1435
+ } else if (app && typeof app.updateModelContext === "function") {
1436
+ await ensureHostAppConnected();
1437
+ await app.updateModelContext(modelContext);
1438
+ }
1439
+ } catch (err) {
1440
+ console.warn("[agent-native] MCP host rejected model context update", err);
1441
+ }
1442
+ try {
1443
+ if (openAiBridge && typeof openAiBridge.sendFollowUpMessage === "function") {
1444
+ await openAiBridge.sendFollowUpMessage({
1445
+ prompt: message,
1446
+ scrollToBottom: true
1447
+ });
1448
+ respondToWrapperRequest(requestId, { ok: true });
1449
+ return;
1450
+ }
1451
+ let result = null;
1452
+ if (app && typeof app.sendMessage === "function") {
1453
+ await ensureHostAppConnected();
1454
+ result = await app.sendMessage({
1455
+ role: "user",
1456
+ content
1457
+ });
1458
+ } else {
1459
+ result = await wrapperRpcRequest("ui/message", {
1460
+ role: "user",
1461
+ content
1462
+ });
1463
+ }
1464
+ if (result && result.isError) {
1465
+ console.warn("[agent-native] MCP host rejected chat message", result);
1466
+ respondToWrapperRequest(requestId, { ok: false, result });
1467
+ return;
1468
+ }
1469
+ if (result && result.ok === false) {
1470
+ console.warn("[agent-native] MCP host chat bridge failed", result);
1471
+ respondToWrapperRequest(requestId, { ok: false, result });
1472
+ return;
1473
+ }
1474
+ respondToWrapperRequest(requestId, { ok: true, result });
1475
+ } catch (err) {
1476
+ console.warn("[agent-native] MCP host chat bridge failed", err);
1477
+ respondToWrapperRequest(requestId, { ok: false, error: err && err.message ? err.message : String(err) });
1478
+ }
1479
+ }
1480
+
1481
+ window.addEventListener("message", (event) => {
1482
+ if (event.source !== window.parent) return;
1483
+ const message = event.data;
1484
+ if (!message || message.jsonrpc !== "2.0") return;
1485
+ settleWrapperRpcResponse(message);
1486
+ });
1487
+
1488
+ window.addEventListener("message", (event) => {
1489
+ if (!appFrame || event.source !== appFrame.contentWindow) return;
1490
+ if (!event.data) return;
1491
+ const data = event.data.data || {};
1492
+ if (event.data.type === "agentNative.embeddedAppReady") {
1493
+ appFrameReady = true;
1494
+ embedSessionRefreshAttempts = 0;
1495
+ clearFrameLoadTimer();
1496
+ clearFrameReadyTimer();
1497
+ notifyOuterMcpAppReady();
1498
+ return;
1499
+ }
1500
+ if (event.data.type === "agentNative.contentHeight") {
1501
+ const next = finiteNumber(data && data.height);
1502
+ if (next && Math.abs(next - reportedContentHeight) >= 1) {
1503
+ reportedContentHeight = next;
1504
+ notifyHostHeightSoon();
1505
+ }
1506
+ return;
1507
+ }
1508
+ if (event.data.type === "agentNative.embedSessionExpired") {
1509
+ refreshExpiredEmbedSession();
1510
+ return;
1511
+ }
1512
+ if (event.data.type === "agentNative.submitChat") {
1513
+ void sendHostChat(data);
1514
+ return;
1515
+ }
1516
+ if (event.data.type === "agentNative.mcpHost.updateModelContext") {
1517
+ respondToAppFrame(data.requestId, updateHostModelContext(data));
1518
+ return;
1519
+ }
1520
+ if (event.data.type === "agentNative.mcpHost.openLink") {
1521
+ respondToAppFrame(data.requestId, openHostLink(data));
1522
+ return;
1523
+ }
1524
+ if (event.data.type === "agentNative.mcpHost.requestDisplayMode") {
1525
+ respondToAppFrame(data.requestId, requestHostDisplayMode(data.mode));
1526
+ }
1527
+ });
1528
+
1529
+ function notifyHostHeightSoon() {
1530
+ requestAnimationFrame(() => notifyHostHeight());
1531
+ }
1532
+
1533
+ function notifyHostHeightRepeatedly() {
1534
+ notifyHostHeight();
1535
+ [0, 250, 1000, 2500].forEach((delay) => {
1536
+ setTimeout(() => notifyHostHeight(), delay);
1537
+ });
1538
+ }
1539
+
1540
+ window.addEventListener("resize", notifyHostHeightSoon, { passive: true });
1541
+ if (window.visualViewport) {
1542
+ window.visualViewport.addEventListener("resize", notifyHostHeightSoon, { passive: true });
1543
+ }
1544
+
1545
+ async function launchEmbed() {
1546
+ let launchUrl = openStartUrl || openUrl;
1547
+ if (!launchUrl) {
1548
+ renderAppLaunchError("Open link was not available.");
1549
+ return;
1550
+ }
1551
+ if (!wantsEmbed()) {
1552
+ setMessage("Ready to open.");
1553
+ return;
1554
+ }
1555
+ try {
1556
+ const selfNavigate = shouldSelfNavigateToApp();
1557
+ if (startedFor === launchUrl) return;
1558
+ startedFor = launchUrl;
1559
+ // Only show "Loading app" when no frame is mounted. set_globals
1560
+ // re-launches constantly, so calling it every time would wipe the
1561
+ // just-mounted iframe; renderFrame/transplant own the stage on (re)mount.
1562
+ if (!appFrame) {
1563
+ setMessage("Loading app");
1564
+ }
1565
+ const embedUrl = withChatBridgeParam(launchUrl);
1566
+ if (selfNavigate && isEmbedStartUrl(embedUrl)) {
1567
+ if (shouldTransplantAppDocument()) {
1568
+ await transplantAppDocument(embedUrl);
1569
+ } else if (shouldRenderControlledAppFrame()) {
1570
+ renderFrame(embedUrl);
1571
+ } else {
1572
+ navigateToAppFrame(embedUrl);
1573
+ }
1574
+ return;
1575
+ }
1576
+ if (!selfNavigate && isEmbedStartUrl(embedUrl)) {
1577
+ renderFrame(embedUrl);
1578
+ return;
1579
+ }
1580
+ if (shouldDirectRenderKnownAppRoute(embedUrl)) {
1581
+ renderFrame(embedUrl);
1582
+ return;
1583
+ }
1584
+ const result = await callEmbedSessionTool(embedSessionArgsFor(embedUrl));
1585
+ const data = parseToolResult(result);
1586
+ if (typeof data.startUrl !== "string" || !data.startUrl) {
1587
+ startedFor = "";
1588
+ renderAppLaunchError(data.error || "This app can be opened, but not embedded from this MCP server.");
1589
+ return;
1590
+ }
1591
+ const startUrl = withChatBridgeParam(data.startUrl);
1592
+ if (selfNavigate) {
1593
+ if (shouldTransplantAppDocument()) {
1594
+ await transplantAppDocument(startUrl);
1595
+ } else if (shouldRenderControlledAppFrame()) {
1596
+ renderFrame(startUrl);
1597
+ } else {
1598
+ navigateToAppFrame(startUrl);
1599
+ }
1600
+ } else {
1601
+ renderFrame(startUrl);
1602
+ }
1603
+ } catch (err) {
1604
+ startedFor = "";
1605
+ renderAppLaunchError(err && err.message ? err.message : "Could not launch embedded app.");
1606
+ }
1607
+ }
1608
+
1609
+ async function callEmbedSessionTool(args) {
1610
+ if (openAiBridge && typeof openAiBridge.callTool === "function") {
1611
+ return await openAiBridge.callTool(startTool, args);
1612
+ }
1613
+ if (!app || typeof app.callServerTool !== "function") {
1614
+ throw new Error("Host tool calls are not available.");
1615
+ }
1616
+ return await app.callServerTool({ name: startTool, arguments: args });
1617
+ }
1618
+
1619
+ function updateHostOpenInAppUrl() {
1620
+ if (!openAiBridge || !openUrl || typeof openAiBridge.setOpenInAppUrl !== "function") {
1621
+ return;
1622
+ }
1623
+ try {
1624
+ openAiBridge.setOpenInAppUrl({ href: openUrl });
1625
+ } catch (err) {
1626
+ console.warn("[agent-native] ChatGPT rejected open-in-app URL", err);
1627
+ }
1628
+ }
1629
+
1630
+ function updateOpenButton() {
1631
+ const buttonUrl = openUrl;
1632
+ openButton.disabled = !buttonUrl;
1633
+ openButton.onclick = () => {
1634
+ if (buttonUrl) void openHostLink({ url: buttonUrl });
1635
+ };
1636
+ updateHostOpenInAppUrl();
1637
+ }
1638
+
1639
+ function updateTitle(data) {
1640
+ const record = objectValue(data);
1641
+ const label = record.label || record.app || record.view || body.dataset.appTitle || "App";
1642
+ titleEl.textContent = String(label);
1643
+ }
1644
+
1645
+ function readOpenAiBridge() {
1646
+ return window.openai && typeof window.openai === "object"
1647
+ ? window.openai
1648
+ : null;
1649
+ }
1650
+
1651
+ function isChatGptHostHint() {
1652
+ try {
1653
+ if (new URLSearchParams(window.location.search).get("app") === "chatgpt") return true;
1654
+ } catch (_err) {}
1655
+ try {
1656
+ if (/^(?:[^.]+\\.)?web-sandbox\\.oaiusercontent\\.com$/i.test(window.location.hostname || "")) return true;
1657
+ } catch (_err) {}
1658
+ try {
1659
+ return /chatgpt/i.test(String(navigator.userAgent || ""));
1660
+ } catch (_err) {
1661
+ return false;
1662
+ }
1663
+ }
1664
+
1665
+ function openAiToolResultParams(bridge) {
1666
+ const params = {};
1667
+ if (bridge && bridge.toolOutput !== undefined) {
1668
+ if (bridge.toolOutput && typeof bridge.toolOutput === "object") {
1669
+ params.structuredContent = bridge.toolOutput;
1670
+ } else {
1671
+ params.content = [{ type: "text", text: String(bridge.toolOutput) }];
1672
+ }
1673
+ }
1674
+ if (bridge && bridge.toolResponseMetadata && typeof bridge.toolResponseMetadata === "object") {
1675
+ params._meta = bridge.toolResponseMetadata;
1676
+ }
1677
+ return params;
1678
+ }
1679
+
1680
+ function syncOpenAiBridge(bridge) {
1681
+ if (!bridge) return false;
1682
+ openAiBridge = bridge;
1683
+ toolInput = objectValue(bridge.toolInput);
1684
+ const params = openAiToolResultParams(bridge);
1685
+ const data = parseToolResult(params);
1686
+ toolResultData = objectValue(data);
1687
+ openUrl = openLinkFrom(params, data);
1688
+ openStartUrl = embedStartUrlFrom(params, data);
1689
+ // set_globals fires constantly, and this sync calls notifyHostHeight/
1690
+ // sendHostContext which the host echoes back as another set_globals — an
1691
+ // infinite storm. Only do the host round-trips + (re)launch when something
1692
+ // we care about changed. Exclude maxHeight: the host mutates it every
1693
+ // event, which would defeat the guard.
1694
+ let signature;
1695
+ try {
1696
+ signature = JSON.stringify([
1697
+ toolInput,
1698
+ openUrl,
1699
+ openStartUrl,
1700
+ bridge.displayMode,
1701
+ bridge.theme,
1702
+ bridge.locale
1703
+ ]);
1704
+ } catch {
1705
+ signature = null;
1706
+ }
1707
+ if (signature !== null && signature === lastOpenAiSyncSignature) {
1708
+ return true;
1709
+ }
1710
+ lastOpenAiSyncSignature = signature;
1711
+ updateTitle(data);
1712
+ updateOpenButton();
1713
+ updateDisplayButton();
1714
+ notifyHostHeight();
1715
+ sendHostContext();
1716
+ if (openUrl || openStartUrl) {
1717
+ void launchEmbed();
1718
+ } else if (!appFrame) {
1719
+ // No open URL yet — a content-less result no longer reaches the host as
1720
+ // a widget (build-server marks it isError), so this is the transient
1721
+ // "waiting for the embed to resolve" state, not an empty box.
1722
+ setMessage("Waiting for app result");
1723
+ }
1724
+ return true;
1725
+ }
1726
+
1727
+ function waitForOpenAiBridge() {
1728
+ const existing = readOpenAiBridge();
1729
+ if (existing) return Promise.resolve(existing);
1730
+ return new Promise((resolve) => {
1731
+ let settled = false;
1732
+ let pollTimer = 0;
1733
+ const finish = (bridge) => {
1734
+ if (settled) return;
1735
+ settled = true;
1736
+ window.removeEventListener("openai:set_globals", onGlobals);
1737
+ clearTimeout(timer);
1738
+ clearTimeout(pollTimer);
1739
+ resolve(bridge || readOpenAiBridge());
1740
+ };
1741
+ const poll = () => {
1742
+ const bridge = readOpenAiBridge();
1743
+ if (bridge) {
1744
+ finish(bridge);
1745
+ return;
1746
+ }
1747
+ pollTimer = window.setTimeout(poll, openAiBridgePollMs);
1748
+ };
1749
+ const onGlobals = () => finish(readOpenAiBridge());
1750
+ const timer = window.setTimeout(
1751
+ () => finish(null),
1752
+ isChatGptHostHint() ? chatGptOpenAiBridgeWaitMs : defaultOpenAiBridgeWaitMs
1753
+ );
1754
+ window.addEventListener("openai:set_globals", onGlobals, { passive: true });
1755
+ pollTimer = window.setTimeout(poll, openAiBridgePollMs);
1756
+ });
1757
+ }
1758
+
1759
+ window.addEventListener("openai:set_globals", () => {
1760
+ const bridge = readOpenAiBridge();
1761
+ if (bridge && (!appFrame || openAiBridge)) syncOpenAiBridge(bridge);
1762
+ }, { passive: true });
1763
+
1764
+ function createNativeMcpAppsBridge() {
1765
+ let rpcId = 0;
1766
+ let connectPromise = null;
1767
+ let hostContext = {};
1768
+ const pendingRequests = new Map();
1769
+
1770
+ function rpcNotify(method, params) {
1771
+ window.parent.postMessage({ jsonrpc: "2.0", method, params: params || {} }, "*");
1772
+ }
1773
+
1774
+ function rpcRequest(method, params, timeoutMs) {
1775
+ return new Promise((resolve, reject) => {
1776
+ const id = ++rpcId;
1777
+ const timer = window.setTimeout(() => {
1778
+ pendingRequests.delete(id);
1779
+ reject(new Error("MCP Apps bridge request timed out: " + method));
1780
+ }, timeoutMs || nativeBridgeRequestTimeoutMs);
1781
+ pendingRequests.set(id, { resolve, reject, timer });
1782
+ window.parent.postMessage(
1783
+ { jsonrpc: "2.0", id, method, params: params || {} },
1784
+ "*"
1785
+ );
1786
+ });
1787
+ }
1788
+
1789
+ function settleRpcResponse(message) {
1790
+ const pending = pendingRequests.get(message.id);
1791
+ if (!pending) return true;
1792
+ pendingRequests.delete(message.id);
1793
+ clearTimeout(pending.timer);
1794
+ if (message.error) {
1795
+ const error = new Error(message.error.message || "MCP Apps bridge request failed.");
1796
+ error.data = message.error.data;
1797
+ pending.reject(error);
1798
+ return true;
1799
+ }
1800
+ pending.resolve(message.result);
1801
+ return true;
1802
+ }
1803
+
1804
+ function notificationParams(message) {
1805
+ return message && typeof message.params === "object" && message.params
1806
+ ? message.params
1807
+ : {};
1808
+ }
1809
+
1810
+ function toolInputNotificationParams(params) {
1811
+ if (params && typeof params.arguments === "object" && params.arguments) {
1812
+ return params;
1813
+ }
1814
+ if (params && typeof params.input === "object" && params.input) {
1815
+ return { arguments: params.input };
1816
+ }
1817
+ return { arguments: objectValue(params) };
1818
+ }
1819
+
1820
+ const nativeApp = {
1821
+ ontoolinput: null,
1822
+ ontoolresult: null,
1823
+ onhostcontextchanged: null,
1824
+ getHostContext() {
1825
+ return hostContext.context || hostContext;
1826
+ },
1827
+ getHostCapabilities() {
1828
+ return hostContext.capabilities || { tools: true, messaging: true };
1829
+ },
1830
+ getHostVersion() {
1831
+ return hostContext.protocolVersion || "mcp-apps-postmessage";
1832
+ },
1833
+ async connect() {
1834
+ if (connectPromise) return await connectPromise;
1835
+ connectPromise = (async () => {
1836
+ window.addEventListener("message", onMessage, { passive: true });
1837
+ const result = await rpcRequest(
1838
+ "ui/initialize",
1839
+ {
1840
+ appInfo: { name: "Agent Native Embed", version: "1.0.0" },
1841
+ appCapabilities: {},
1842
+ protocolVersion: "2026-01-26"
1843
+ },
1844
+ nativeBridgeInitializeTimeoutMs
1845
+ );
1846
+ hostContext = objectValue(result);
1847
+ rpcNotify("ui/notifications/initialized", {});
1848
+ if (typeof nativeApp.onhostcontextchanged === "function") {
1849
+ nativeApp.onhostcontextchanged(hostContext);
1850
+ }
1851
+ return hostContext;
1852
+ })().catch((err) => {
1853
+ connectPromise = null;
1854
+ throw err;
1855
+ });
1856
+ return await connectPromise;
1857
+ },
1858
+ async callServerTool(request) {
1859
+ await nativeApp.connect();
1860
+ const record = objectValue(request);
1861
+ return await rpcRequest("tools/call", {
1862
+ name: record.name,
1863
+ arguments: objectValue(record.arguments)
1864
+ });
1865
+ },
1866
+ async updateModelContext(params) {
1867
+ await nativeApp.connect();
1868
+ return await rpcRequest("ui/update-model-context", objectValue(params));
1869
+ },
1870
+ async openLink(params) {
1871
+ const url = typeof (params && params.url) === "string" ? params.url : "";
1872
+ if (!url) return { isError: true };
1873
+ try {
1874
+ return await rpcRequest("ui/open-link", { url }, wrapperRequestTimeoutMs);
1875
+ } catch (err) {
1876
+ console.warn("[agent-native] MCP host open-link request failed", err);
1877
+ }
1878
+ const opened = window.open(url, "_blank", "noopener,noreferrer");
1879
+ return opened ? { ok: true } : { isError: true };
1880
+ },
1881
+ async requestDisplayMode(params) {
1882
+ await nativeApp.connect();
1883
+ return await rpcRequest("ui/request-display-mode", objectValue(params));
1884
+ },
1885
+ sendSizeChanged(params) {
1886
+ rpcNotify("ui/notifications/size-changed", objectValue(params));
1887
+ },
1888
+ async sendMessage(params) {
1889
+ await nativeApp.connect();
1890
+ return await rpcRequest("ui/message", objectValue(params));
1891
+ }
1892
+ };
1893
+
1894
+ function onMessage(event) {
1895
+ if (event.source !== window.parent) return;
1896
+ const message = event.data;
1897
+ if (!message || message.jsonrpc !== "2.0") return;
1898
+ if (typeof message.id === "number" || typeof message.id === "string") {
1899
+ settleRpcResponse(message);
1900
+ return;
1901
+ }
1902
+ if (typeof message.method !== "string") return;
1903
+ const params = notificationParams(message);
1904
+ if (message.method === "ui/notifications/tool-input") {
1905
+ if (typeof nativeApp.ontoolinput === "function") {
1906
+ nativeApp.ontoolinput(toolInputNotificationParams(params));
1907
+ }
1908
+ return;
1909
+ }
1910
+ if (message.method === "ui/notifications/tool-result") {
1911
+ if (typeof nativeApp.ontoolresult === "function") {
1912
+ nativeApp.ontoolresult(params);
1913
+ }
1914
+ return;
1915
+ }
1916
+ if (
1917
+ message.method === "ui/notifications/host-context-changed" ||
1918
+ message.method === "ui/notifications/host-context" ||
1919
+ message.method === "ui/notifications/context"
1920
+ ) {
1921
+ hostContext = objectValue(params);
1922
+ if (typeof nativeApp.onhostcontextchanged === "function") {
1923
+ nativeApp.onhostcontextchanged(hostContext);
1924
+ }
1925
+ }
1926
+ }
1927
+
1928
+ return nativeApp;
1929
+ }
1930
+
1931
+ async function startNativeMcpAppsBridge() {
1932
+ app = createNativeMcpAppsBridge();
1933
+ appConnectPromise = null;
1934
+ app.ontoolinput = (params) => {
1935
+ toolInput = params.arguments || {};
1936
+ };
1937
+ app.ontoolresult = (params) => {
1938
+ const data = parseToolResult(params);
1939
+ toolResultData = objectValue(data);
1940
+ openUrl = openLinkFrom(params, data);
1941
+ openStartUrl = embedStartUrlFrom(params, data);
1942
+ updateTitle(data);
1943
+ updateOpenButton();
1944
+ void launchEmbed();
1945
+ };
1946
+ app.onhostcontextchanged = () => {
1947
+ updateDisplayButton();
1948
+ notifyHostHeight();
1949
+ sendHostContext();
1950
+ };
1951
+ await ensureHostAppConnected();
1952
+ notifyOuterMcpAppReady();
1953
+ updateDisplayButton();
1954
+ notifyHostHeight();
1955
+ sendHostContext();
1956
+ }
1957
+
1958
+ async function startMcpAppsBridge() {
1959
+ const { App } = await import("${MCP_APP_IMPORT}");
1960
+ app = new App(
1961
+ { name: "Agent Native Embed", version: "1.0.0" },
1962
+ {},
1963
+ { autoResize: false }
1964
+ );
1965
+ appConnectPromise = null;
1966
+ app.ontoolinput = (params) => {
1967
+ toolInput = params.arguments || {};
1968
+ };
1969
+ app.ontoolresult = (params) => {
1970
+ const data = parseToolResult(params);
1971
+ toolResultData = objectValue(data);
1972
+ openUrl = openLinkFrom(params, data);
1973
+ openStartUrl = embedStartUrlFrom(params, data);
1974
+ updateTitle(data);
1975
+ updateOpenButton();
1976
+ void launchEmbed();
1977
+ };
1978
+ app.onhostcontextchanged = () => {
1979
+ updateDisplayButton();
1980
+ notifyHostHeight();
1981
+ sendHostContext();
1982
+ };
1983
+ await ensureHostAppConnected();
1984
+ notifyOuterMcpAppReady();
1985
+ updateDisplayButton();
1986
+ notifyHostHeight();
1987
+ sendHostContext();
1988
+ }
1989
+
1990
+ try {
1991
+ const initialOpenAiBridge = await waitForOpenAiBridge();
1992
+ if (!syncOpenAiBridge(initialOpenAiBridge)) {
1993
+ try {
1994
+ await startNativeMcpAppsBridge();
1995
+ } catch (nativeErr) {
1996
+ console.warn("[agent-native] native MCP Apps bridge failed", nativeErr);
1997
+ await startMcpAppsBridge();
1998
+ }
1999
+ }
2000
+ } catch (err) {
2001
+ console.error("[agent-native] MCP app shell failed", err);
2002
+ reportEmbedError(
2003
+ "bridge-init",
2004
+ err && err.message ? err.message : "Could not initialize app.",
2005
+ err && err.stack ? String(err.stack) : undefined
2006
+ );
2007
+ setMessage(err && err.message ? err.message : "Could not initialize app.");
2008
+ }
2009
+
2010
+ window.addEventListener("error", (event) => {
2011
+ const err = event && event.error;
2012
+ reportEmbedError(
2013
+ "window-error",
2014
+ (err && err.message) || (event && event.message) || "Uncaught error in MCP app embed.",
2015
+ err && err.stack ? String(err.stack) : undefined
2016
+ );
2017
+ });
2018
+ window.addEventListener("unhandledrejection", (event) => {
2019
+ const reason = event && event.reason;
2020
+ reportEmbedError(
2021
+ "unhandled-rejection",
2022
+ (reason && reason.message) || String(reason || "Unhandled promise rejection in MCP app embed."),
2023
+ reason && reason.stack ? String(reason.stack) : undefined
2024
+ );
2025
+ });
2026
+ })();
2027
+ </script>
2028
+ </body>
2029
+ </html>`,
2030
+ csp: {
2031
+ connectDomains: [
2032
+ "https://esm.sh",
2033
+ MCP_APP_REQUEST_ORIGIN_CSP_SOURCE,
2034
+ ...(options.connectDomains ?? []),
2035
+ ...(options.frameDomains ?? []),
2036
+ ],
2037
+ resourceDomains: [
2038
+ "https://esm.sh",
2039
+ MCP_APP_REQUEST_ORIGIN_CSP_SOURCE,
2040
+ ...(options.resourceDomains ?? []),
2041
+ ...(options.frameDomains ?? []),
2042
+ ],
2043
+ baseUriDomains: [
2044
+ MCP_APP_REQUEST_ORIGIN_CSP_SOURCE,
2045
+ ...(options.baseUriDomains ?? []),
2046
+ ],
2047
+ frameDomains,
2048
+ },
2049
+ prefersBorder: false,
2050
+ };
2051
+ }