@agent-native/core 0.69.0 → 0.70.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. package/README.md +15 -15
  2. package/corpus/README.md +2 -2
  3. package/corpus/core/CHANGELOG.md +109 -0
  4. package/corpus/core/docs/design/durable-agent-runs.md +217 -0
  5. package/corpus/core/package.json +1 -1
  6. package/corpus/core/src/action.ts +89 -0
  7. package/corpus/core/src/agent/model-config.ts +0 -2
  8. package/corpus/core/src/agent/run-loop-with-resume.ts +48 -0
  9. package/corpus/core/src/changelog/parse.ts +245 -0
  10. package/corpus/core/src/cli/changelog.ts +199 -0
  11. package/corpus/core/src/cli/index.ts +19 -0
  12. package/corpus/core/src/cli/recap.ts +24 -1
  13. package/corpus/core/src/cli/skills.ts +74 -47
  14. package/corpus/core/src/client/AgentPanel.tsx +5 -3
  15. package/corpus/core/src/client/AssistantChat.tsx +8 -0
  16. package/corpus/core/src/client/CommandMenu.tsx +183 -75
  17. package/corpus/core/src/client/agent-chat-adapter.ts +44 -7
  18. package/corpus/core/src/client/analytics.ts +181 -0
  19. package/corpus/core/src/client/changelog/Changelog.tsx +321 -0
  20. package/corpus/core/src/client/client-surface.ts +41 -0
  21. package/corpus/core/src/client/composer/TiptapComposer.tsx +123 -12
  22. package/corpus/core/src/client/feedback-context.ts +4 -0
  23. package/corpus/core/src/client/index.ts +12 -0
  24. package/corpus/core/src/client/mcp-apps/McpAppRenderer.tsx +54 -0
  25. package/corpus/core/src/client/settings/useBuilderStatus.ts +82 -20
  26. package/corpus/core/src/client/sse-event-processor.ts +7 -1
  27. package/corpus/core/src/mcp/build-server.ts +57 -1
  28. package/corpus/core/src/mcp/embed-app.ts +197 -7
  29. package/corpus/core/src/mcp/oauth-route.ts +109 -13
  30. package/corpus/core/src/server/attribution.ts +211 -0
  31. package/corpus/core/src/server/auth.ts +6 -0
  32. package/corpus/core/src/server/better-auth-instance.ts +49 -5
  33. package/corpus/core/src/server/builder-browser.ts +27 -1
  34. package/corpus/core/src/server/core-routes-plugin.ts +136 -0
  35. package/corpus/core/src/server/google-oauth.ts +19 -6
  36. package/corpus/core/src/server/onboarding-html.ts +35 -0
  37. package/corpus/core/src/shared/mcp-embed-headers.ts +1 -1
  38. package/corpus/core/src/styles/agent-conversation.css +21 -0
  39. package/corpus/core/src/templates/workspace-core/.agents/skills/changelog/SKILL.md +111 -0
  40. package/corpus/core/src/templates/workspace-core/.agents/skills/reliable-mutations/SKILL.md +72 -0
  41. package/corpus/core/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +46 -14
  42. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +22 -0
  43. package/corpus/templates/analytics/AGENTS.md +8 -1
  44. package/corpus/templates/analytics/CHANGELOG.md +10 -0
  45. package/corpus/templates/analytics/actions/install-dashboard-template.ts +99 -4
  46. package/corpus/templates/analytics/actions/open-traffic-dashboard.ts +1 -1
  47. package/corpus/templates/analytics/actions/update-dashboard.ts +39 -8
  48. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +30 -3
  49. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +180 -144
  50. package/corpus/templates/analytics/app/components/layout/Header.tsx +2 -3
  51. package/corpus/templates/analytics/app/components/layout/Layout.tsx +7 -5
  52. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +221 -215
  53. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +6 -6
  54. package/corpus/templates/analytics/app/lib/demo-dashboard-path.ts +1 -1
  55. package/corpus/templates/analytics/app/lib/last-opened.ts +2 -1
  56. package/corpus/templates/analytics/app/pages/Settings.tsx +4 -0
  57. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +3 -3
  58. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +2 -2
  59. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +32 -2
  60. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +101 -99
  61. package/corpus/templates/analytics/app/pages/overview/OverviewPage.tsx +1 -1
  62. package/corpus/templates/analytics/app/routes/adhoc.$id.tsx +18 -5
  63. package/corpus/templates/analytics/app/routes/catalog.tsx +1 -1
  64. package/corpus/templates/analytics/app/routes/dashboards.$id.tsx +9 -0
  65. package/corpus/templates/analytics/app/routes/traffic.tsx +1 -1
  66. package/corpus/templates/analytics/changelog/2026-06-23-long-dashboard-and-analysis-names-in-the-sidebar-now-truncat.md +6 -0
  67. package/corpus/templates/analytics/changelog/2026-06-23-open-any-dashboard-chart-full-screen-in-a-modal-from-the-pan.md +6 -0
  68. package/corpus/templates/analytics/changelog/2026-06-23-the-dashboards-and-analyses-sidebar-settings-buttons-now-sta.md +6 -0
  69. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +145 -0
  70. package/corpus/templates/analytics/server/db/index.ts +1 -1
  71. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +9 -2
  72. package/corpus/templates/analytics/server/lib/demo-dashboards.ts +1 -1
  73. package/corpus/templates/analytics/server/plugins/agent-chat.ts +2 -2
  74. package/corpus/templates/analytics/server/plugins/core-routes.ts +6 -6
  75. package/corpus/templates/assets/CHANGELOG.md +10 -0
  76. package/corpus/templates/assets/actions/generate-image.ts +24 -0
  77. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +2 -2
  78. package/corpus/templates/assets/app/global.css +17 -1
  79. package/corpus/templates/assets/app/root.tsx +7 -1
  80. package/corpus/templates/assets/app/routes/_index.tsx +94 -14
  81. package/corpus/templates/assets/app/routes/settings.tsx +6 -0
  82. package/corpus/templates/assets/changelog/2026-06-23-chat-dates-in-the-sidebar-no-longer-wrap-onto-two-lines.md +6 -0
  83. package/corpus/templates/assets/changelog/2026-06-23-clicking-image-video-or-refine-on-the-start-screen-now-drops.md +6 -0
  84. package/corpus/templates/assets/changelog/2026-06-23-pick-your-image-generation-model-right-from-the-chat-model-m.md +6 -0
  85. package/corpus/templates/brain/CHANGELOG.md +10 -0
  86. package/corpus/templates/brain/app/root.tsx +7 -1
  87. package/corpus/templates/brain/app/routes/settings.tsx +8 -1
  88. package/corpus/templates/calendar/CHANGELOG.md +10 -0
  89. package/corpus/templates/calendar/app/pages/Settings.tsx +4 -0
  90. package/corpus/templates/calendar/app/root.tsx +7 -1
  91. package/corpus/templates/chat/CHANGELOG.md +10 -0
  92. package/corpus/templates/chat/app/root.tsx +7 -1
  93. package/corpus/templates/clips/CHANGELOG.md +10 -0
  94. package/corpus/templates/clips/app/components/library/library-grid.tsx +1 -20
  95. package/corpus/templates/clips/app/components/player/share-dialog.tsx +33 -7
  96. package/corpus/templates/clips/app/components/player/sign-in-prompt-dialog.tsx +8 -0
  97. package/corpus/templates/clips/app/components/player/video-player.tsx +150 -20
  98. package/corpus/templates/clips/app/components/recorder/countdown-overlay.tsx +72 -48
  99. package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +7 -11
  100. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +31 -0
  101. package/corpus/templates/clips/app/components/sharing/slack-share-hint.tsx +71 -0
  102. package/corpus/templates/clips/app/lib/countdown-audio-cue.ts +35 -17
  103. package/corpus/templates/clips/app/root.tsx +7 -1
  104. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +15 -1
  105. package/corpus/templates/clips/app/routes/record.tsx +78 -5
  106. package/corpus/templates/clips/app/routes/share.$shareId.tsx +86 -5
  107. package/corpus/templates/clips/changelog/2026-06-23-clips-shared-in-slack-no-longer-show-a-could-not-start-playb.md +6 -0
  108. package/corpus/templates/clips/changelog/2026-06-23-made-the-play-button-on-shared-and-embedded-clips-scale-with.md +6 -0
  109. package/corpus/templates/clips/changelog/2026-06-23-public-clip-share-links-now-show-whether-they-ll-play-inline.md +6 -0
  110. package/corpus/templates/clips/changelog/2026-06-23-removed-select-button-from-library-hover-a-clip-to-select-it.md +6 -0
  111. package/corpus/templates/clips/changelog/2026-06-23-screen-camera-recordings-now-keep-the-presenter-s-face-in-th.md +6 -0
  112. package/corpus/templates/clips/changelog/2026-06-23-shared-video-links-now-play-for-anyone-without-signing-in.md +6 -0
  113. package/corpus/templates/clips/changelog/2026-06-23-skip-or-cancel-the-recording-countdown-with-buttons-beside-t.md +6 -0
  114. package/corpus/templates/clips/changelog/2026-06-23-the-desktop-camera-bubble-now-looks-sharp-the-instant-it-ope.md +6 -0
  115. package/corpus/templates/clips/changelog/2026-06-23-the-desktop-recording-widget-now-grows-downward-only-when-yo.md +6 -0
  116. package/corpus/templates/clips/changelog/2026-06-23-the-recording-start-sound-is-now-a-softer-more-modern-chime.md +6 -0
  117. package/corpus/templates/clips/chrome-extension/public/manifest.json +17 -8
  118. package/corpus/templates/clips/chrome-extension/src/background.ts +769 -180
  119. package/corpus/templates/clips/chrome-extension/src/content-script.ts +177 -0
  120. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +466 -329
  121. package/corpus/templates/clips/chrome-extension/src/overlay.css +377 -0
  122. package/corpus/templates/clips/chrome-extension/src/overlay.html +12 -0
  123. package/corpus/templates/clips/chrome-extension/src/overlay.ts +330 -0
  124. package/corpus/templates/clips/chrome-extension/src/permission.html +227 -0
  125. package/corpus/templates/clips/chrome-extension/src/permission.ts +105 -0
  126. package/corpus/templates/clips/chrome-extension/src/popup.html +3 -0
  127. package/corpus/templates/clips/chrome-extension/src/popup.ts +50 -2
  128. package/corpus/templates/clips/chrome-extension/src/styles.css +50 -0
  129. package/corpus/templates/clips/chrome-extension/vite.config.ts +3 -0
  130. package/corpus/templates/clips/desktop/src/lib/audio-cue.ts +41 -24
  131. package/corpus/templates/clips/desktop/src/lib/bubble-webrtc.ts +119 -2
  132. package/corpus/templates/clips/desktop/src/lib/recorder.ts +20 -0
  133. package/corpus/templates/clips/desktop/src/main.tsx +3 -0
  134. package/corpus/templates/clips/desktop/src/overlays/countdown.tsx +21 -2
  135. package/corpus/templates/clips/desktop/src/overlays/region-record-border.tsx +76 -0
  136. package/corpus/templates/clips/desktop/src/styles.css +119 -2
  137. package/corpus/templates/clips/desktop/src-tauri/capabilities/default.json +2 -1
  138. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +140 -1
  139. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +2 -0
  140. package/corpus/templates/clips/desktop/src-tauri/src/util.rs +4 -1
  141. package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +85 -6
  142. package/corpus/templates/clips/shared/share-attribution.ts +79 -0
  143. package/corpus/templates/content/AGENTS.md +20 -3
  144. package/corpus/templates/content/CHANGELOG.md +10 -0
  145. package/corpus/templates/content/actions/_database-utils.ts +15 -0
  146. package/corpus/templates/content/actions/_property-utils.ts +371 -4
  147. package/corpus/templates/content/actions/configure-document-property.ts +35 -1
  148. package/corpus/templates/content/actions/create-content-database.ts +5 -1
  149. package/corpus/templates/content/actions/delete-document-property.ts +52 -2
  150. package/corpus/templates/content/actions/duplicate-document-property.ts +34 -17
  151. package/corpus/templates/content/actions/reorder-document-property.ts +79 -0
  152. package/corpus/templates/content/actions/set-document-property.ts +39 -0
  153. package/corpus/templates/content/app/components/editor/DocumentBlockFields.tsx +806 -0
  154. package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +226 -68
  155. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +59 -30
  156. package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +25 -1
  157. package/corpus/templates/content/app/components/editor/blockFieldSaveController.ts +180 -0
  158. package/corpus/templates/content/app/components/editor/blockFieldSaveRegistry.ts +179 -0
  159. package/corpus/templates/content/app/components/editor/previewDocumentSaveController.ts +244 -0
  160. package/corpus/templates/content/app/components/editor/previewDocumentSaveRegistry.ts +132 -0
  161. package/corpus/templates/content/app/global.css +9 -0
  162. package/corpus/templates/content/app/hooks/use-document-properties.ts +21 -0
  163. package/corpus/templates/content/app/root.tsx +7 -1
  164. package/corpus/templates/content/server/db/schema.ts +30 -0
  165. package/corpus/templates/content/server/plugins/db.ts +87 -0
  166. package/corpus/templates/content/shared/api.ts +7 -0
  167. package/corpus/templates/content/shared/properties.ts +109 -0
  168. package/corpus/templates/design/CHANGELOG.md +10 -0
  169. package/corpus/templates/design/actions/generate-design.ts +4 -0
  170. package/corpus/templates/design/app/root.tsx +7 -1
  171. package/corpus/templates/design/app/routes/settings.tsx +10 -2
  172. package/corpus/templates/dispatch/CHANGELOG.md +10 -0
  173. package/corpus/templates/dispatch/app/root.tsx +7 -1
  174. package/corpus/templates/forms/.agents/skills/form-responses/SKILL.md +10 -0
  175. package/corpus/templates/forms/CHANGELOG.md +10 -0
  176. package/corpus/templates/forms/actions/export-responses.ts +6 -0
  177. package/corpus/templates/forms/actions/list-responses.ts +2 -0
  178. package/corpus/templates/forms/actions/response-insights.ts +2 -0
  179. package/corpus/templates/forms/app/pages/ResponsesPage.tsx +138 -1
  180. package/corpus/templates/forms/app/root.tsx +7 -1
  181. package/corpus/templates/forms/changelog/2026-06-23-response-tables-now-show-the-page-each-submission-came-from-.md +6 -0
  182. package/corpus/templates/forms/changelog/2026-06-23-response-tables-now-show-whether-feedback-came-from-the-web-.md +6 -0
  183. package/corpus/templates/forms/server/db/schema.ts +7 -0
  184. package/corpus/templates/forms/server/handlers/submissions.ts +19 -2
  185. package/corpus/templates/forms/server/lib/integrations.ts +76 -2
  186. package/corpus/templates/forms/server/plugins/db.ts +20 -0
  187. package/corpus/templates/forms/shared/types.ts +12 -0
  188. package/corpus/templates/macros/CHANGELOG.md +10 -0
  189. package/corpus/templates/macros/app/root.tsx +7 -1
  190. package/corpus/templates/mail/CHANGELOG.md +10 -0
  191. package/corpus/templates/mail/app/components/layout/CommandPalette.tsx +3 -0
  192. package/corpus/templates/mail/app/pages/SettingsPage.tsx +27 -0
  193. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +31 -17
  194. package/corpus/templates/plan/.agents/skills/visual-plan/references/wireframe.md +7 -4
  195. package/corpus/templates/plan/.agents/skills/visual-recap/SKILL.md +34 -24
  196. package/corpus/templates/plan/.agents/skills/visual-recap/references/wireframe.md +7 -4
  197. package/corpus/templates/plan/AGENTS.md +4 -0
  198. package/corpus/templates/plan/CHANGELOG.md +10 -0
  199. package/corpus/templates/plan/actions/view-screen.ts +5 -0
  200. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +98 -1
  201. package/corpus/templates/plan/app/components/plan/wireframe/html-artboard.css +3 -1
  202. package/corpus/templates/plan/app/pages/PlansPage.tsx +107 -7
  203. package/corpus/templates/plan/app/root.tsx +7 -1
  204. package/corpus/templates/plan/changelog/2026-06-23-large-diagrams-in-a-plan-now-scroll-within-their-block-inste.md +6 -0
  205. package/corpus/templates/plan/shared/share-attribution.ts +72 -0
  206. package/corpus/templates/slides/CHANGELOG.md +10 -0
  207. package/corpus/templates/slides/app/root.tsx +7 -1
  208. package/corpus/templates/videos/CHANGELOG.md +4 -151
  209. package/corpus/templates/videos/app/root.tsx +7 -1
  210. package/dist/action.js +87 -0
  211. package/dist/action.js.map +1 -1
  212. package/dist/agent/engine/builder-engine.d.ts +1 -1
  213. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  214. package/dist/agent/model-config.d.ts +2 -2
  215. package/dist/agent/model-config.d.ts.map +1 -1
  216. package/dist/agent/model-config.js +0 -2
  217. package/dist/agent/model-config.js.map +1 -1
  218. package/dist/agent/run-loop-with-resume.d.ts +13 -0
  219. package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
  220. package/dist/agent/run-loop-with-resume.js +44 -0
  221. package/dist/agent/run-loop-with-resume.js.map +1 -1
  222. package/dist/changelog/parse.d.ts +70 -0
  223. package/dist/changelog/parse.d.ts.map +1 -0
  224. package/dist/changelog/parse.js +200 -0
  225. package/dist/changelog/parse.js.map +1 -0
  226. package/dist/cli/changelog.d.ts +4 -0
  227. package/dist/cli/changelog.d.ts.map +1 -0
  228. package/dist/cli/changelog.js +166 -0
  229. package/dist/cli/changelog.js.map +1 -0
  230. package/dist/cli/index.js +18 -0
  231. package/dist/cli/index.js.map +1 -1
  232. package/dist/cli/recap.d.ts.map +1 -1
  233. package/dist/cli/recap.js +22 -1
  234. package/dist/cli/recap.js.map +1 -1
  235. package/dist/cli/skills.d.ts +3 -3
  236. package/dist/cli/skills.d.ts.map +1 -1
  237. package/dist/cli/skills.js +74 -47
  238. package/dist/cli/skills.js.map +1 -1
  239. package/dist/client/AgentPanel.d.ts.map +1 -1
  240. package/dist/client/AgentPanel.js +5 -3
  241. package/dist/client/AgentPanel.js.map +1 -1
  242. package/dist/client/AssistantChat.d.ts +6 -1
  243. package/dist/client/AssistantChat.d.ts.map +1 -1
  244. package/dist/client/AssistantChat.js +2 -2
  245. package/dist/client/AssistantChat.js.map +1 -1
  246. package/dist/client/CommandMenu.d.ts +17 -1
  247. package/dist/client/CommandMenu.d.ts.map +1 -1
  248. package/dist/client/CommandMenu.js +49 -13
  249. package/dist/client/CommandMenu.js.map +1 -1
  250. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  251. package/dist/client/agent-chat-adapter.js +43 -6
  252. package/dist/client/agent-chat-adapter.js.map +1 -1
  253. package/dist/client/analytics.d.ts +18 -0
  254. package/dist/client/analytics.d.ts.map +1 -1
  255. package/dist/client/analytics.js +177 -0
  256. package/dist/client/analytics.js.map +1 -1
  257. package/dist/client/changelog/Changelog.d.ts +47 -0
  258. package/dist/client/changelog/Changelog.d.ts.map +1 -0
  259. package/dist/client/changelog/Changelog.js +138 -0
  260. package/dist/client/changelog/Changelog.js.map +1 -0
  261. package/dist/client/client-surface.d.ts +17 -0
  262. package/dist/client/client-surface.d.ts.map +1 -0
  263. package/dist/client/client-surface.js +24 -0
  264. package/dist/client/client-surface.js.map +1 -0
  265. package/dist/client/composer/TiptapComposer.d.ts +26 -1
  266. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  267. package/dist/client/composer/TiptapComposer.js +27 -5
  268. package/dist/client/composer/TiptapComposer.js.map +1 -1
  269. package/dist/client/feedback-context.d.ts +3 -0
  270. package/dist/client/feedback-context.d.ts.map +1 -1
  271. package/dist/client/feedback-context.js +2 -0
  272. package/dist/client/feedback-context.js.map +1 -1
  273. package/dist/client/index.d.ts +3 -1
  274. package/dist/client/index.d.ts.map +1 -1
  275. package/dist/client/index.js +3 -1
  276. package/dist/client/index.js.map +1 -1
  277. package/dist/client/mcp-apps/McpAppRenderer.d.ts +1 -0
  278. package/dist/client/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  279. package/dist/client/mcp-apps/McpAppRenderer.js +42 -1
  280. package/dist/client/mcp-apps/McpAppRenderer.js.map +1 -1
  281. package/dist/client/settings/useBuilderStatus.d.ts +2 -0
  282. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  283. package/dist/client/settings/useBuilderStatus.js +58 -10
  284. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  285. package/dist/client/sse-event-processor.d.ts.map +1 -1
  286. package/dist/client/sse-event-processor.js +7 -1
  287. package/dist/client/sse-event-processor.js.map +1 -1
  288. package/dist/mcp/build-server.d.ts +21 -0
  289. package/dist/mcp/build-server.d.ts.map +1 -1
  290. package/dist/mcp/build-server.js +43 -1
  291. package/dist/mcp/build-server.js.map +1 -1
  292. package/dist/mcp/embed-app.d.ts.map +1 -1
  293. package/dist/mcp/embed-app.js +197 -7
  294. package/dist/mcp/embed-app.js.map +1 -1
  295. package/dist/mcp/oauth-route.d.ts.map +1 -1
  296. package/dist/mcp/oauth-route.js +95 -12
  297. package/dist/mcp/oauth-route.js.map +1 -1
  298. package/dist/server/attribution.d.ts +83 -0
  299. package/dist/server/attribution.d.ts.map +1 -0
  300. package/dist/server/attribution.js +178 -0
  301. package/dist/server/attribution.js.map +1 -0
  302. package/dist/server/auth.d.ts.map +1 -1
  303. package/dist/server/auth.js +7 -0
  304. package/dist/server/auth.js.map +1 -1
  305. package/dist/server/better-auth-instance.d.ts +9 -1
  306. package/dist/server/better-auth-instance.d.ts.map +1 -1
  307. package/dist/server/better-auth-instance.js +32 -2
  308. package/dist/server/better-auth-instance.js.map +1 -1
  309. package/dist/server/builder-browser.d.ts +4 -0
  310. package/dist/server/builder-browser.d.ts.map +1 -1
  311. package/dist/server/builder-browser.js +20 -1
  312. package/dist/server/builder-browser.js.map +1 -1
  313. package/dist/server/core-routes-plugin.d.ts +25 -0
  314. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  315. package/dist/server/core-routes-plugin.js +101 -0
  316. package/dist/server/core-routes-plugin.js.map +1 -1
  317. package/dist/server/google-oauth.d.ts.map +1 -1
  318. package/dist/server/google-oauth.js +16 -2
  319. package/dist/server/google-oauth.js.map +1 -1
  320. package/dist/server/onboarding-html.d.ts.map +1 -1
  321. package/dist/server/onboarding-html.js +35 -0
  322. package/dist/server/onboarding-html.js.map +1 -1
  323. package/dist/shared/mcp-embed-headers.js +1 -1
  324. package/dist/shared/mcp-embed-headers.js.map +1 -1
  325. package/dist/styles/agent-conversation.css +21 -0
  326. package/dist/templates/workspace-core/.agents/skills/changelog/SKILL.md +111 -0
  327. package/dist/templates/workspace-core/.agents/skills/reliable-mutations/SKILL.md +72 -0
  328. package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +46 -14
  329. package/docs/design/durable-agent-runs.md +217 -0
  330. package/package.json +1 -1
  331. package/src/templates/workspace-core/.agents/skills/changelog/SKILL.md +111 -0
  332. package/src/templates/workspace-core/.agents/skills/reliable-mutations/SKILL.md +72 -0
  333. package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +46 -14
  334. package/corpus/templates/analytics/app/pages/About.tsx +0 -108
  335. package/corpus/templates/analytics/app/routes/about.tsx +0 -9
  336. /package/corpus/templates/analytics/app/routes/{dashboards.tsx → dashboards._index.tsx} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"embed-app.d.ts","sourceRoot":"","sources":["../../src/mcp/embed-app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAM/D,eAAO,MAAM,iCAAiC,mBAAmB,CAAC;AAElE,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAChD,eAAO,MAAM,+BAA+B,QACkB,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAUD,wBAAgB,QAAQ,CACtB,OAAO,GAAE,eAAoB,GAC5B,0BAA0B,CAwpD5B"}
1
+ {"version":3,"file":"embed-app.d.ts","sourceRoot":"","sources":["../../src/mcp/embed-app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAM/D,eAAO,MAAM,iCAAiC,mBAAmB,CAAC;AAElE,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAChD,eAAO,MAAM,+BAA+B,QACkB,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAUD,wBAAgB,QAAQ,CACtB,OAAO,GAAE,eAAoB,GAC5B,0BAA0B,CAs1D5B"}
@@ -40,6 +40,8 @@ export function embedApp(options = {}) {
40
40
  .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); }
41
41
  .actions { display: flex; align-items: center; gap: 6px; }
42
42
  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; }
43
+ button.primary { min-height: 32px; padding: 0 14px; background: CanvasText; color: Canvas; border-color: CanvasText; }
44
+ button.primary:hover:not(:disabled) { background: color-mix(in srgb, CanvasText 86%, Canvas); }
43
45
  button:disabled { opacity: .55; cursor: default; }
44
46
  .stage { position: relative; min-height: var(--agent-native-viewport-height); }
45
47
  iframe { display: block; width: 100%; height: var(--agent-native-viewport-height); border: 0; background: Canvas; }
@@ -428,6 +430,49 @@ export function embedApp(options = {}) {
428
430
  };
429
431
  }
430
432
 
433
+ function externalOpenUrlForAppUrl(appUrl) {
434
+ if (openUrl) return openUrl;
435
+ try {
436
+ const url = new URL(appUrl.href);
437
+ url.searchParams.delete("embedded");
438
+ url.searchParams.delete("__an_embed_token");
439
+ url.searchParams.delete(chatBridgeParam);
440
+ return url.toString();
441
+ } catch (_err) {
442
+ return "";
443
+ }
444
+ }
445
+
446
+ function installExternalOpenControl(appUrl) {
447
+ const href = externalOpenUrlForAppUrl(appUrl);
448
+ if (!href || !document.body || document.getElementById("agent-native-external-open-control")) {
449
+ return;
450
+ }
451
+ const host = document.createElement("div");
452
+ host.id = "agent-native-external-open-control";
453
+ host.style.position = "fixed";
454
+ host.style.top = "10px";
455
+ host.style.right = "10px";
456
+ host.style.zIndex = "2147483647";
457
+ host.style.pointerEvents = "auto";
458
+ const root = host.attachShadow ? host.attachShadow({ mode: "open" }) : host;
459
+ root.innerHTML =
460
+ '<style>' +
461
+ ':host{all:initial;}' +
462
+ '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;}' +
463
+ 'button:hover{background:color-mix(in srgb, CanvasText 6%, Canvas);}' +
464
+ '</style>' +
465
+ '<button type="button">Open in new tab</button>';
466
+ const button = root.querySelector("button");
467
+ if (button) {
468
+ button.addEventListener("click", (event) => {
469
+ event.preventDefault();
470
+ void openHostLink({ url: href });
471
+ });
472
+ }
473
+ document.body.appendChild(host);
474
+ }
475
+
431
476
  function installReactRefreshPreambleFallback() {
432
477
  window.__vite_plugin_react_preamble_installed__ = true;
433
478
  if (typeof window.$RefreshReg$ !== "function") {
@@ -768,6 +813,7 @@ export function embedApp(options = {}) {
768
813
  base.href = config.baseHref;
769
814
  document.head.prepend(base);
770
815
  importChildren(parsed.body, document.body);
816
+ installExternalOpenControl(appUrl);
771
817
  for (const script of scripts) {
772
818
  if (isRunnableClassicScript(script)) runClassicScript(script);
773
819
  }
@@ -824,9 +870,21 @@ export function embedApp(options = {}) {
824
870
  });
825
871
  if (!response.ok) {
826
872
  if (response.status === 401 && isEmbedStartUrl(src)) {
873
+ reportEmbedError(
874
+ "transplant-auth",
875
+ "Embedded app session expired (HTTP 401).",
876
+ "Opaque-origin sandbox could not authenticate the embed.",
877
+ 401
878
+ );
827
879
  refreshExpiredEmbedSession();
828
880
  return;
829
881
  }
882
+ reportEmbedError(
883
+ "transplant-http",
884
+ "Embedded app returned HTTP " + response.status + ".",
885
+ undefined,
886
+ response.status
887
+ );
830
888
  throw new Error("Embedded app returned HTTP " + response.status + ".");
831
889
  }
832
890
  const html = await response.text();
@@ -927,6 +985,52 @@ export function embedApp(options = {}) {
927
985
  }, frameReadyTimeoutMs);
928
986
  }
929
987
 
988
+ // Best-effort telemetry sink so inline-embed failures are visible in
989
+ // Sentry (handshake timeout, transplant fetch status/CORS, auth, CSP).
990
+ // The shell is a sandboxed opaque-origin iframe, so it POSTs to the app
991
+ // origin's CORS-open /_agent-native/mcp/embed-error route, derived from the
992
+ // known app URLs. Deduped per stage+message so a retry loop can't spam.
993
+ const reportedEmbedErrorKeys = new Set();
994
+ let embedErrorReportCount = 0;
995
+ function embedReportOrigin() {
996
+ for (const value of [openStartUrl, openUrl, lastFrameSrc]) {
997
+ if (typeof value === "string" && value) {
998
+ try { return new URL(value, window.location.href).origin; } catch {}
999
+ }
1000
+ }
1001
+ return "";
1002
+ }
1003
+ function reportEmbedError(stage, message, detail, status) {
1004
+ try {
1005
+ const key = String(stage) + "|" + String(message || "");
1006
+ if (reportedEmbedErrorKeys.has(key) || embedErrorReportCount >= 8) return;
1007
+ reportedEmbedErrorKeys.add(key);
1008
+ embedErrorReportCount += 1;
1009
+ const origin = embedReportOrigin();
1010
+ if (!origin) return;
1011
+ let renderMode = "";
1012
+ try { renderMode = renderModeSource().mode || ""; } catch {}
1013
+ const body = JSON.stringify({
1014
+ stage: String(stage || ""),
1015
+ message: String(message || "").slice(0, 500),
1016
+ detail: detail ? String(detail).slice(0, 1200) : undefined,
1017
+ url: openStartUrl || openUrl || lastFrameSrc || "",
1018
+ status: typeof status === "number" ? status : undefined,
1019
+ host: window.location.hostname || "",
1020
+ renderMode: renderMode,
1021
+ bridge: openAiBridge ? "openai" : app ? "native" : "none",
1022
+ userAgent: navigator.userAgent || ""
1023
+ });
1024
+ fetch(origin + "/_agent-native/mcp/embed-error", {
1025
+ method: "POST",
1026
+ credentials: "omit",
1027
+ keepalive: true,
1028
+ headers: { "Content-Type": "application/json" },
1029
+ body: body
1030
+ }).catch(() => {});
1031
+ } catch {}
1032
+ }
1033
+
930
1034
  function renderFrameFallback() {
931
1035
  clearFrameReadyTimer();
932
1036
  clearFrameLoadTimer();
@@ -934,12 +1038,13 @@ export function embedApp(options = {}) {
934
1038
  const fallbackCopy = openUrl
935
1039
  ? "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."
936
1040
  : "This chat host did not allow the embedded app frame to load inline.";
1041
+ reportEmbedError("frame-fallback", fallbackCopy);
937
1042
  stage.innerHTML =
938
1043
  '<div class="fallback">' +
939
1044
  '<div class="fallback-title">Open this app in its own tab</div>' +
940
1045
  '<div class="fallback-copy">' + esc(fallbackCopy) + '</div>' +
941
1046
  '<div class="fallback-actions">' +
942
- '<button type="button" data-fallback-open>Open app</button>' +
1047
+ '<button type="button" class="primary" data-fallback-open>Open in new tab</button>' +
943
1048
  '<button type="button" data-fallback-retry>Try inline again</button>' +
944
1049
  '</div>' +
945
1050
  (openUrl ? '<a class="fallback-url" href="' + esc(openUrl) + '" target="_blank" rel="noreferrer">' + esc(openUrl) + '</a>' : '') +
@@ -960,6 +1065,43 @@ export function embedApp(options = {}) {
960
1065
  }
961
1066
  }
962
1067
 
1068
+ function renderAppLaunchError(message) {
1069
+ clearFrameReadyTimer();
1070
+ clearFrameLoadTimer();
1071
+ appFrame = null;
1072
+ const fallbackCopy = openUrl
1073
+ ? "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."
1074
+ : "The inline MCP app could not load in this chat host.";
1075
+ reportEmbedError("app-launch-error", message || fallbackCopy, message);
1076
+ const copyHtml = message
1077
+ ? '<div>' + esc(message) + '</div><div>' + esc(fallbackCopy) + '</div>'
1078
+ : esc(fallbackCopy);
1079
+ stage.innerHTML =
1080
+ '<div class="fallback">' +
1081
+ '<div class="fallback-title">App did not load</div>' +
1082
+ '<div class="fallback-copy">' + copyHtml + '</div>' +
1083
+ '<div class="fallback-actions">' +
1084
+ '<button type="button" class="primary" data-fallback-open>Open in new tab</button>' +
1085
+ '<button type="button" data-fallback-retry>Retry</button>' +
1086
+ '</div>' +
1087
+ (openUrl ? '<a class="fallback-url" href="' + esc(openUrl) + '" target="_blank" rel="noreferrer">' + esc(openUrl) + '</a>' : '') +
1088
+ '</div>';
1089
+ const fallbackOpen = stage.querySelector("[data-fallback-open]");
1090
+ const fallbackRetry = stage.querySelector("[data-fallback-retry]");
1091
+ if (fallbackOpen) {
1092
+ fallbackOpen.disabled = !openUrl;
1093
+ fallbackOpen.onclick = () => {
1094
+ if (openUrl) void openHostLink({ url: openUrl });
1095
+ };
1096
+ }
1097
+ if (fallbackRetry) {
1098
+ fallbackRetry.onclick = () => {
1099
+ startedFor = "";
1100
+ void launchEmbed();
1101
+ };
1102
+ }
1103
+ }
1104
+
963
1105
  async function openFallbackExternal() {
964
1106
  if (!openUrl) return;
965
1107
  let url = withChatBridgeParam(openUrl);
@@ -1024,12 +1166,29 @@ export function embedApp(options = {}) {
1024
1166
  return true;
1025
1167
  }
1026
1168
 
1169
+ // We have connected to a standards-track MCP Apps host (Codex, Cursor,
1170
+ // Claude over the SDK, our own renderer, …) through the postMessage
1171
+ // \`ui/*\` bridge rather than ChatGPT's \`window.openai\` global. These hosts
1172
+ // render the resource in a strict sandboxed iframe (typically
1173
+ // \`sandbox="allow-scripts"\`, opaque origin). Self-navigating that iframe to
1174
+ // the real app origin tears down the host bridge and loses the opaque-origin
1175
+ // auth context, which shows up as a permanent / flashing loading state.
1176
+ // Transplanting the app document into the shell keeps the bridge alive and
1177
+ // works under the opaque origin via embed-token auth, exactly like Claude.
1178
+ function isNativeMcpAppsBridgeHost() {
1179
+ return !!app && !openAiBridge;
1180
+ }
1181
+
1027
1182
  function shouldTransplantAppDocument() {
1028
1183
  const render = renderModeSource();
1029
1184
  const mode = render.mode;
1185
+ if (mode === "iframe" || mode === "nested" || render.frame === "iframe" || render.nested) {
1186
+ return false;
1187
+ }
1030
1188
  return (
1031
1189
  isClaudeMcpContentHost() ||
1032
1190
  isChatGptSandboxHost() ||
1191
+ isNativeMcpAppsBridgeHost() ||
1033
1192
  mode === "transplant" ||
1034
1193
  render.frame === "transplant"
1035
1194
  );
@@ -1047,7 +1206,7 @@ export function embedApp(options = {}) {
1047
1206
  try {
1048
1207
  const host = window.location.hostname || "";
1049
1208
  const appParam = new URL(window.location.href).searchParams.get("app");
1050
- return /^[^.]+\\.web-sandbox\\.oaiusercontent\\.com$/i.test(host) || appParam === "chatgpt";
1209
+ return /^(?:[^.]+\\.)?web-sandbox\\.oaiusercontent\\.com$/i.test(host) || appParam === "chatgpt";
1051
1210
  } catch {
1052
1211
  return false;
1053
1212
  }
@@ -1270,7 +1429,7 @@ export function embedApp(options = {}) {
1270
1429
  async function launchEmbed() {
1271
1430
  const launchUrl = openStartUrl || openUrl;
1272
1431
  if (!launchUrl) {
1273
- setMessage("Open link was not available.");
1432
+ renderAppLaunchError("Open link was not available.");
1274
1433
  return;
1275
1434
  }
1276
1435
  if (!wantsEmbed()) {
@@ -1301,7 +1460,7 @@ export function embedApp(options = {}) {
1301
1460
  const data = parseToolResult(result);
1302
1461
  if (typeof data.startUrl !== "string" || !data.startUrl) {
1303
1462
  startedFor = "";
1304
- setMessage(data.error || "This app can be opened, but not embedded from this MCP server.");
1463
+ renderAppLaunchError(data.error || "This app can be opened, but not embedded from this MCP server.");
1305
1464
  return;
1306
1465
  }
1307
1466
  const startUrl = withChatBridgeParam(data.startUrl);
@@ -1318,7 +1477,7 @@ export function embedApp(options = {}) {
1318
1477
  }
1319
1478
  } catch (err) {
1320
1479
  startedFor = "";
1321
- setMessage(err && err.message ? err.message : "Could not launch embedded app.");
1480
+ renderAppLaunchError(err && err.message ? err.message : "Could not launch embedded app.");
1322
1481
  }
1323
1482
  }
1324
1483
 
@@ -1368,6 +1527,9 @@ export function embedApp(options = {}) {
1368
1527
  try {
1369
1528
  if (new URLSearchParams(window.location.search).get("app") === "chatgpt") return true;
1370
1529
  } catch (_err) {}
1530
+ try {
1531
+ if (/^(?:[^.]+\\.)?web-sandbox\\.oaiusercontent\\.com$/i.test(window.location.hostname || "")) return true;
1532
+ } catch (_err) {}
1371
1533
  try {
1372
1534
  return /chatgpt/i.test(String(navigator.userAgent || ""));
1373
1535
  } catch (_err) {
@@ -1551,8 +1713,13 @@ export function embedApp(options = {}) {
1551
1713
  async openLink(params) {
1552
1714
  const url = typeof (params && params.url) === "string" ? params.url : "";
1553
1715
  if (!url) return { isError: true };
1554
- window.open(url, "_blank", "noopener,noreferrer");
1555
- return { ok: true };
1716
+ try {
1717
+ return await rpcRequest("ui/open-link", { url }, wrapperRequestTimeoutMs);
1718
+ } catch (err) {
1719
+ console.warn("[agent-native] MCP host open-link request failed", err);
1720
+ }
1721
+ const opened = window.open(url, "_blank", "noopener,noreferrer");
1722
+ return opened ? { ok: true } : { isError: true };
1556
1723
  },
1557
1724
  async requestDisplayMode(params) {
1558
1725
  return await rpcRequest("ui/request-display-mode", objectValue(params));
@@ -1588,6 +1755,7 @@ export function embedApp(options = {}) {
1588
1755
  return;
1589
1756
  }
1590
1757
  if (
1758
+ message.method === "ui/notifications/host-context-changed" ||
1591
1759
  message.method === "ui/notifications/host-context" ||
1592
1760
  message.method === "ui/notifications/context"
1593
1761
  ) {
@@ -1668,8 +1836,30 @@ export function embedApp(options = {}) {
1668
1836
  }
1669
1837
  } catch (err) {
1670
1838
  console.error("[agent-native] MCP app shell failed", err);
1839
+ reportEmbedError(
1840
+ "bridge-init",
1841
+ err && err.message ? err.message : "Could not initialize app.",
1842
+ err && err.stack ? String(err.stack) : undefined
1843
+ );
1671
1844
  setMessage(err && err.message ? err.message : "Could not initialize app.");
1672
1845
  }
1846
+
1847
+ window.addEventListener("error", (event) => {
1848
+ const err = event && event.error;
1849
+ reportEmbedError(
1850
+ "window-error",
1851
+ (err && err.message) || (event && event.message) || "Uncaught error in MCP app embed.",
1852
+ err && err.stack ? String(err.stack) : undefined
1853
+ );
1854
+ });
1855
+ window.addEventListener("unhandledrejection", (event) => {
1856
+ const reason = event && event.reason;
1857
+ reportEmbedError(
1858
+ "unhandled-rejection",
1859
+ (reason && reason.message) || String(reason || "Unhandled promise rejection in MCP app embed."),
1860
+ reason && reason.stack ? String(reason.stack) : undefined
1861
+ );
1862
+ });
1673
1863
  })();
1674
1864
  </script>
1675
1865
  </body>