@agent-native/core 0.129.1 → 0.130.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 (596) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +78 -0
  3. package/corpus/core/docs/content/cloneable-saas.mdx +114 -0
  4. package/corpus/core/docs/content/creating-templates.mdx +28 -2
  5. package/corpus/core/docs/content/syncing-template-changes.mdx +7 -0
  6. package/corpus/core/docs/content/template-clips-developers.mdx +12 -5
  7. package/corpus/core/docs/content/template-dispatch-developers.mdx +1 -1
  8. package/corpus/core/docs/content/template-dispatch.mdx +1 -1
  9. package/corpus/core/package.json +1 -1
  10. package/corpus/core/src/action-ui.ts +1 -0
  11. package/corpus/core/src/action.ts +5 -1
  12. package/corpus/core/src/agent/engine/ai-sdk-engine.ts +15 -5
  13. package/corpus/core/src/agent/harness/runner.ts +5 -0
  14. package/corpus/core/src/agent/production-agent.ts +33 -0
  15. package/corpus/core/src/agent/run-loop-with-resume.ts +5 -0
  16. package/corpus/core/src/agent/run-manager.ts +126 -1
  17. package/corpus/core/src/agent/thread-data-builder.ts +47 -2
  18. package/corpus/core/src/agent/types.ts +2 -0
  19. package/corpus/core/src/chat-threads/store.ts +4 -5
  20. package/corpus/core/src/cli/create.ts +1139 -65
  21. package/corpus/core/src/cli/design-connect.ts +3 -7
  22. package/corpus/core/src/cli/index.ts +5 -3
  23. package/corpus/core/src/cli/skills-content/design-visual-edit-skill.ts +83 -47
  24. package/corpus/core/src/client/AssistantChat.tsx +27 -16
  25. package/corpus/core/src/client/agent-chat-adapter.ts +24 -0
  26. package/corpus/core/src/client/blocks/library/wireframe-kit.tsx +17 -2
  27. package/corpus/core/src/client/chat/index.ts +1 -0
  28. package/corpus/core/src/client/chat/message-components.tsx +104 -1
  29. package/corpus/core/src/client/chat/run-recovery.tsx +15 -3
  30. package/corpus/core/src/client/chat/widgets/DataTableWidget.tsx +10 -29
  31. package/corpus/core/src/client/chat/widgets/WorkspaceFileWidget.tsx +71 -0
  32. package/corpus/core/src/client/chat/widgets/builtin-tool-renderers.tsx +22 -0
  33. package/corpus/core/src/client/chat/widgets/workspace-file-result.ts +49 -0
  34. package/corpus/core/src/client/embed-auth.ts +2 -0
  35. package/corpus/core/src/client/org/InvitationBanner.tsx +14 -1
  36. package/corpus/core/src/client/org/OrgSwitcher.tsx +23 -0
  37. package/corpus/core/src/client/org/TeamPage.tsx +130 -0
  38. package/corpus/core/src/client/org/WorkspaceNotice.tsx +85 -0
  39. package/corpus/core/src/client/org/hooks.ts +14 -0
  40. package/corpus/core/src/client/org/index.ts +2 -0
  41. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +27 -40
  42. package/corpus/core/src/client/resources/ResourcesPanel.tsx +134 -51
  43. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +7 -0
  44. package/corpus/core/src/client/resources/use-resources.ts +6 -0
  45. package/corpus/core/src/client/use-action.ts +3 -1
  46. package/corpus/core/src/client/widgets/index.ts +1 -0
  47. package/corpus/core/src/coding-tools/run-code.ts +2 -1
  48. package/corpus/core/src/db/client.ts +28 -4
  49. package/corpus/core/src/deploy/build.ts +31 -3
  50. package/corpus/core/src/eject/remote-mcp-presets.ts +1 -1
  51. package/corpus/core/src/index.browser.ts +1 -0
  52. package/corpus/core/src/index.ts +1 -0
  53. package/corpus/core/src/integrations/google-docs-poller.ts +3 -0
  54. package/corpus/core/src/integrations/webhook-handler.ts +28 -11
  55. package/corpus/core/src/jobs/scheduler.ts +4 -0
  56. package/corpus/core/src/localization/default-messages.ts +3 -2
  57. package/corpus/core/src/mcp/build-server.ts +20 -2
  58. package/corpus/core/src/observability/traces.ts +48 -12
  59. package/corpus/core/src/org/handlers.ts +52 -1
  60. package/corpus/core/src/org/migrations.ts +4 -0
  61. package/corpus/core/src/org/plugin.ts +14 -0
  62. package/corpus/core/src/org/schema.ts +1 -0
  63. package/corpus/core/src/org/types.ts +8 -0
  64. package/corpus/core/src/org/workspace-url.ts +74 -0
  65. package/corpus/core/src/resources/handlers.ts +35 -5
  66. package/corpus/core/src/scripts/runner.ts +183 -5
  67. package/corpus/core/src/server/action-routes.ts +32 -2
  68. package/corpus/core/src/server/agent-chat-plugin.ts +29 -0
  69. package/corpus/core/src/server/agent-teams.ts +10 -1
  70. package/corpus/core/src/server/auth.ts +33 -7
  71. package/corpus/core/src/server/embed-route.ts +9 -0
  72. package/corpus/core/src/server/embed-session.ts +62 -3
  73. package/corpus/core/src/server/open-route.ts +20 -6
  74. package/corpus/core/src/server/prompts/framework-core-compact.ts +1 -1
  75. package/corpus/core/src/server/prompts/framework-core.ts +1 -0
  76. package/corpus/core/src/server/request-context.ts +36 -1
  77. package/corpus/core/src/shared/embed-auth.ts +1 -0
  78. package/corpus/core/src/shared/html-document.ts +115 -0
  79. package/corpus/core/src/shared/index.ts +1 -0
  80. package/corpus/core/src/sharing/access.ts +8 -1
  81. package/corpus/core/src/sharing/registry.ts +11 -2
  82. package/corpus/core/src/workspace-files/actions.ts +100 -0
  83. package/corpus/core/src/workspace-files/tool.ts +4 -0
  84. package/corpus/templates/analytics/.agents/skills/analysis-workspace/SKILL.md +4 -0
  85. package/corpus/templates/analytics/.agents/skills/hubspot/SKILL.md +9 -1
  86. package/corpus/templates/analytics/AGENTS.md +17 -24
  87. package/corpus/templates/analytics/actions/data-source-status.ts +11 -1
  88. package/corpus/templates/analytics/app/i18n-data.ts +34 -0
  89. package/corpus/templates/analytics/app/lib/data-source-status.ts +86 -0
  90. package/corpus/templates/analytics/app/lib/native-mcp-exclusions.ts +9 -0
  91. package/corpus/templates/analytics/app/pages/DataSources.tsx +184 -20
  92. package/corpus/templates/analytics/changelog/2026-07-28-native-analytics-data-sources-no-longer-show-duplicate-mc.md +6 -0
  93. package/corpus/templates/analytics/changelog/2026-07-29-exports-now-appear-in-chat-with-a-direct-download-instead-of.md +6 -0
  94. package/corpus/templates/analytics/changelog/2026-07-29-queued-chat-prompts-no-longer-resend-after-analytics-navigat.md +6 -0
  95. package/corpus/templates/analytics/changelog/2026-07-29-scheduled-dashboard-emails-load-every-panel-reliably-without.md +6 -0
  96. package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +6 -3
  97. package/corpus/templates/analytics/server/lib/credential-keys.ts +1 -1
  98. package/corpus/templates/analytics/server/lib/hubspot.ts +1 -1
  99. package/corpus/templates/analytics/server/lib/provider-credentials.ts +55 -1
  100. package/corpus/templates/analytics/server/plugins/agent-chat.ts +123 -27
  101. package/corpus/templates/analytics/server/routes/[...page].get.ts +2 -7
  102. package/corpus/templates/analytics/vite.config.ts +7 -0
  103. package/corpus/templates/brain/actions/list-connection-providers.ts +100 -2
  104. package/corpus/templates/brain/app/lib/brain.ts +10 -0
  105. package/corpus/templates/brain/app/routes/sources.tsx +15 -4
  106. package/corpus/templates/brain/changelog/2026-07-29-brain-automatically-retries-failed-source-syncs-and-guides-y.md +6 -0
  107. package/corpus/templates/brain/jobs/process-ingest-queue.ts +13 -0
  108. package/corpus/templates/brain/server/jobs/sync-sources.ts +27 -22
  109. package/corpus/templates/brain/server/plugins/agent-chat.ts +2 -1
  110. package/corpus/templates/brain/server/routes/api/brain/queue/run.post.ts +7 -1
  111. package/corpus/templates/clips/AGENTS.md +1 -1
  112. package/corpus/templates/clips/actions/create-recording-agent-link.ts +11 -1
  113. package/corpus/templates/clips/actions/update-comment.ts +68 -0
  114. package/corpus/templates/clips/app/components/editor/editor-layout.tsx +0 -1
  115. package/corpus/templates/clips/app/components/player/comments-panel.tsx +221 -65
  116. package/corpus/templates/clips/app/components/player/video-player.tsx +101 -27
  117. package/corpus/templates/clips/app/i18n/en-US.ts +2 -1
  118. package/corpus/templates/clips/app/routes/bug-report.done.tsx +48 -27
  119. package/corpus/templates/clips/app/routes/bug-report.tsx +43 -4
  120. package/corpus/templates/clips/app/routes/record.tsx +2 -0
  121. package/corpus/templates/clips/changelog/2026-07-29-clip-playback-now-recovers-instead-of-getting-stuck-when-a-b.md +6 -0
  122. package/corpus/templates/clips/changelog/2026-07-29-comments-can-now-be-edited-after-posting.md +6 -0
  123. package/corpus/templates/clips/changelog/2026-07-29-download-actions-now-use-a-shorter-clearer-label.md +6 -0
  124. package/corpus/templates/clips/changelog/2026-07-29-embedded-bug-reports-now-return-a-temporary-agent-readable.md +6 -0
  125. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +1 -1
  126. package/corpus/templates/clips/desktop/src-tauri/src/system_audio.rs +21 -1
  127. package/corpus/templates/clips/shared/bug-report.ts +99 -0
  128. package/corpus/templates/content/actions/_content-database-personal-view.ts +7 -1
  129. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +5 -2
  130. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +20 -8
  131. package/corpus/templates/content/changelog/2026-07-29-missing-databases-no-longer-trigger-repeated-personal-view-e.md +6 -0
  132. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +83 -47
  133. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +474 -55
  134. package/corpus/templates/design/.generated/bridge/embedded-wheel.generated.ts +3 -0
  135. package/corpus/templates/design/.generated/bridge/hit-test.generated.ts +18 -1
  136. package/corpus/templates/design/.generated/bridge/source-location.generated.ts +348 -0
  137. package/corpus/templates/design/actions/add-localhost-screens.ts +2 -7
  138. package/corpus/templates/design/actions/apply-visual-edit.ts +7 -1
  139. package/corpus/templates/design/actions/connect-localhost.ts +5 -9
  140. package/corpus/templates/design/actions/create-component.ts +16 -13
  141. package/corpus/templates/design/actions/grant-localhost-write-consent.ts +2 -7
  142. package/corpus/templates/design/actions/list-design-source-capabilities.ts +4 -7
  143. package/corpus/templates/design/actions/list-local-files.ts +26 -50
  144. package/corpus/templates/design/actions/list-localhost-connections.ts +2 -7
  145. package/corpus/templates/design/actions/migrate-board-objects-to-file.ts +2 -2
  146. package/corpus/templates/design/actions/open-visual-edit.ts +234 -135
  147. package/corpus/templates/design/actions/read-local-file.ts +26 -50
  148. package/corpus/templates/design/actions/request-localhost-write-consent.ts +2 -7
  149. package/corpus/templates/design/actions/write-local-file.ts +31 -73
  150. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +307 -133
  151. package/corpus/templates/design/app/components/design/EditPanel.tsx +94 -22
  152. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +137 -60
  153. package/corpus/templates/design/app/components/design/ResponsiveInteractBar.tsx +75 -14
  154. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +755 -97
  155. package/corpus/templates/design/app/components/design/bridge/embedded-wheel.bridge.ts +8 -0
  156. package/corpus/templates/design/app/components/design/bridge/hit-test.bridge.ts +24 -1
  157. package/corpus/templates/design/app/components/design/bridge/source-location.bridge.ts +530 -0
  158. package/corpus/templates/design/app/components/design/code-workbench/CodeWorkbenchLoader.tsx +278 -0
  159. package/corpus/templates/design/app/components/design/code-workbench/editor/MonacoHost.tsx +32 -12
  160. package/corpus/templates/design/app/components/design/code-workbench/editor/monaco-setup.ts +14 -3
  161. package/corpus/templates/design/app/components/design/code-workbench/explorer/ExplorerView.tsx +87 -24
  162. package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +36 -0
  163. package/corpus/templates/design/app/components/design/code-workbench/store.tsx +2 -1
  164. package/corpus/templates/design/app/components/design/code-workbench/workspace/localhost-provider.ts +48 -8
  165. package/corpus/templates/design/app/components/design/design-canvas/content-size-report.ts +3 -13
  166. package/corpus/templates/design/app/components/design/design-canvas/embedded-frame.ts +4 -2
  167. package/corpus/templates/design/app/components/design/design-canvas/hit-test.ts +3 -13
  168. package/corpus/templates/design/app/components/design/edit-panel/element-classification.ts +3 -1
  169. package/corpus/templates/design/app/components/design/edit-panel/inspect-code-source.ts +93 -0
  170. package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +4 -2
  171. package/corpus/templates/design/app/components/design/multi-screen/cross-screen-drop.ts +35 -0
  172. package/corpus/templates/design/app/components/design/multi-screen/iframe-targeting.ts +24 -0
  173. package/corpus/templates/design/app/components/design/multi-screen/types.ts +9 -0
  174. package/corpus/templates/design/app/components/design/types.ts +29 -0
  175. package/corpus/templates/design/app/components/layout/Layout.tsx +7 -4
  176. package/corpus/templates/design/app/hooks/use-navigation-state.ts +3 -0
  177. package/corpus/templates/design/app/i18n-data.ts +153 -46
  178. package/corpus/templates/design/app/i18n-responsive-interact.ts +12 -12
  179. package/corpus/templates/design/app/lib/design-editor-route.ts +23 -0
  180. package/corpus/templates/design/app/pages/VisualEdit.tsx +19 -6
  181. package/corpus/templates/design/app/pages/design-editor/action-error.ts +19 -0
  182. package/corpus/templates/design/app/pages/design-editor/canvas-primitive-insert.ts +29 -0
  183. package/corpus/templates/design/app/pages/design-editor/clone-and-pen-edit.ts +6 -0
  184. package/corpus/templates/design/app/pages/design-editor/code-layer-state.ts +277 -15
  185. package/corpus/templates/design/app/pages/design-editor/editor-state.ts +75 -9
  186. package/corpus/templates/design/app/pages/design-editor/layer-state-scope.ts +28 -0
  187. package/corpus/templates/design/app/pages/design-editor/live-screen-layer-drop.ts +41 -0
  188. package/corpus/templates/design/app/pages/design-editor/pending-edits.ts +496 -41
  189. package/corpus/templates/design/app/pages/design-editor/pending-live-edit-unload-guard.ts +27 -0
  190. package/corpus/templates/design/app/pages/design-editor/pending-structure-verification.ts +10 -0
  191. package/corpus/templates/design/app/pages/design-editor/react-semantic-handoff.ts +168 -9
  192. package/corpus/templates/design/app/pages/design-editor/responsive-interact.ts +41 -3
  193. package/corpus/templates/design/app/pages/design-editor/screen-command-utils.ts +5 -0
  194. package/corpus/templates/design/app/pages/design-editor/selection-state.ts +42 -13
  195. package/corpus/templates/design/app/pages/design-editor/source-location.ts +180 -0
  196. package/corpus/templates/design/app/pages/design-editor/tool-state.ts +17 -0
  197. package/corpus/templates/design/app/public-routes.ts +1 -0
  198. package/corpus/templates/design/app/routes/visual-edit.$id.tsx +15 -0
  199. package/corpus/templates/design/changelog/2026-06-29-screen-overview-is-easier-to-find-and-named-screens-open-dir.md +1 -1
  200. package/corpus/templates/design/changelog/2026-07-28-deleting-a-selected-element-now-removes-it-from-the-live-pre.md +6 -0
  201. package/corpus/templates/design/changelog/2026-07-28-deleting-an-element-on-a-connected-localhost-screen-now-queu.md +6 -0
  202. package/corpus/templates/design/changelog/2026-07-28-interact-mode-now-shows-a-responsive-device-preview-with-pre.md +6 -0
  203. package/corpus/templates/design/changelog/2026-07-28-layer-hide-and-lock-now-apply-to-the-live-preview-instead-of.md +6 -0
  204. package/corpus/templates/design/changelog/2026-07-28-layers-panel-selections-on-a-connected-localhost-screen-can-.md +6 -0
  205. package/corpus/templates/design/changelog/2026-07-28-locked-layers-now-show-a-subtle-dashed-outline-in-the-live-p.md +6 -0
  206. package/corpus/templates/design/changelog/2026-07-28-the-apply-design-updates-button-now-counts-pending-live-text.md +6 -0
  207. package/corpus/templates/design/changelog/2026-07-28-the-design-canvas-no-longer-stalls-on-a-render-loop-while-a-.md +6 -0
  208. package/corpus/templates/design/changelog/2026-07-28-visual-edit-on-a-local-dev-server-no-longer-requires-signing.md +6 -0
  209. package/corpus/templates/design/changelog/2026-07-28-visual-edits-on-a-react-19-app-no-longer-report-a-source-lin.md +6 -0
  210. package/corpus/templates/design/changelog/2026-07-29-an-edit-that-cannot-be-written-to-source-now-names-the-reaso.md +6 -0
  211. package/corpus/templates/design/changelog/2026-07-29-applying-a-primitive-dropped-onto-a-connected-localhost-scre.md +6 -0
  212. package/corpus/templates/design/changelog/2026-07-29-changing-a-style-in-the-inspector-now-updates-a-connected-lo.md +6 -0
  213. package/corpus/templates/design/changelog/2026-07-29-choosing-edit-or-annotate-from-a-focused-screen-now-returns-.md +6 -0
  214. package/corpus/templates/design/changelog/2026-07-29-concurrent-source-edits-now-return-a-clear-conflict-response.md +6 -0
  215. package/corpus/templates/design/changelog/2026-07-29-creating-a-component-from-an-element-that-repeats-in-the-sou.md +6 -0
  216. package/corpus/templates/design/changelog/2026-07-29-deleting-an-element-you-just-dropped-onto-a-live-screen-no-l.md +6 -0
  217. package/corpus/templates/design/changelog/2026-07-29-dragging-a-layer-across-screens-no-longer-dies-when-the-poin.md +6 -0
  218. package/corpus/templates/design/changelog/2026-07-29-dragging-an-element-from-a-stored-screen-into-a-live-localho.md +6 -0
  219. package/corpus/templates/design/changelog/2026-07-29-drawing-a-box-on-the-canvas-and-dragging-it-into-a-connected.md +6 -0
  220. package/corpus/templates/design/changelog/2026-07-29-fixed-a-loading-screen-flicker-when-reopening-designs-with-a.md +6 -0
  221. package/corpus/templates/design/changelog/2026-07-29-interact-mode-has-edit-and-annotate-buttons-again-so-you-can.md +6 -0
  222. package/corpus/templates/design/changelog/2026-07-29-layer-groups-can-be-dropped-onto-live-localhost-screens.md +6 -0
  223. package/corpus/templates/design/changelog/2026-07-29-localhost-source-errors-now-say-what-actually-went-wrong-whi.md +6 -0
  224. package/corpus/templates/design/changelog/2026-07-29-opening-or-refreshing-a-live-localhost-screen-in-single-scre.md +6 -0
  225. package/corpus/templates/design/changelog/2026-07-29-redo-after-undoing-a-drop-onto-a-live-screen-puts-the-elemen.md +6 -0
  226. package/corpus/templates/design/changelog/2026-07-29-shapes-can-be-drawn-directly-onto-live-localhost-screens.md +6 -0
  227. package/corpus/templates/design/changelog/2026-07-29-shapes-drawn-on-the-canvas-board-now-appear-immediately-inst.md +6 -0
  228. package/corpus/templates/design/changelog/2026-07-29-style-edits-on-a-running-localhost-screen-now-preview-live-a.md +6 -0
  229. package/corpus/templates/design/changelog/2026-07-29-the-apply-design-updates-control-now-appears-as-a-clean-conn.md +6 -0
  230. package/corpus/templates/design/changelog/2026-07-29-visual-edits-on-a-mapped-component-instance-now-tell-the-age.md +6 -0
  231. package/corpus/templates/design/server/lib/design-data-access.ts +21 -7
  232. package/corpus/templates/design/server/lib/localhost-connection.ts +240 -0
  233. package/corpus/templates/design/server/routes/[...page].get.ts +2 -5
  234. package/corpus/templates/design/server/source-workspace.ts +2 -0
  235. package/corpus/templates/design/shared/code-layer.ts +43 -0
  236. package/corpus/templates/design/shared/html-content.ts +26 -0
  237. package/corpus/templates/design/shared/html-integrity.ts +21 -1
  238. package/corpus/templates/design/shared/local-jsx-visual-edit.ts +15 -0
  239. package/corpus/templates/design/shared/source-mode.ts +76 -0
  240. package/corpus/templates/dispatch/changelog/2026-07-29-workspace-members-without-admin-access-now-see-a-clear-permi.md +6 -0
  241. package/corpus/templates/dispatch/server/lib/usage-metrics.ts +2 -1
  242. package/corpus/templates/plan/app/lib/plan-annotation-runtime.ts +3 -4
  243. package/corpus/templates/plan/server/routes/[...page].get.ts +2 -5
  244. package/corpus/templates/slides/actions/patch-deck.ts +29 -17
  245. package/corpus/toolkit/CHANGELOG.md +6 -0
  246. package/corpus/toolkit/package.json +1 -1
  247. package/corpus/toolkit/src/composer/ComposerPlusMenu.tsx +3 -2
  248. package/dist/action-ui.d.ts +1 -0
  249. package/dist/action-ui.d.ts.map +1 -1
  250. package/dist/action-ui.js +1 -0
  251. package/dist/action-ui.js.map +1 -1
  252. package/dist/action.d.ts +5 -1
  253. package/dist/action.d.ts.map +1 -1
  254. package/dist/action.js.map +1 -1
  255. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  256. package/dist/agent/engine/ai-sdk-engine.js +13 -5
  257. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  258. package/dist/agent/harness/runner.d.ts.map +1 -1
  259. package/dist/agent/harness/runner.js +5 -0
  260. package/dist/agent/harness/runner.js.map +1 -1
  261. package/dist/agent/production-agent.d.ts +16 -0
  262. package/dist/agent/production-agent.d.ts.map +1 -1
  263. package/dist/agent/production-agent.js +18 -1
  264. package/dist/agent/production-agent.js.map +1 -1
  265. package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
  266. package/dist/agent/run-loop-with-resume.js +6 -0
  267. package/dist/agent/run-loop-with-resume.js.map +1 -1
  268. package/dist/agent/run-manager.d.ts +14 -0
  269. package/dist/agent/run-manager.d.ts.map +1 -1
  270. package/dist/agent/run-manager.js +91 -1
  271. package/dist/agent/run-manager.js.map +1 -1
  272. package/dist/agent/thread-data-builder.d.ts +3 -0
  273. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  274. package/dist/agent/thread-data-builder.js +35 -3
  275. package/dist/agent/thread-data-builder.js.map +1 -1
  276. package/dist/agent/types.d.ts +2 -0
  277. package/dist/agent/types.d.ts.map +1 -1
  278. package/dist/agent/types.js.map +1 -1
  279. package/dist/chat-threads/store.d.ts.map +1 -1
  280. package/dist/chat-threads/store.js +4 -6
  281. package/dist/chat-threads/store.js.map +1 -1
  282. package/dist/cli/create.d.ts +66 -6
  283. package/dist/cli/create.d.ts.map +1 -1
  284. package/dist/cli/create.js +765 -66
  285. package/dist/cli/create.js.map +1 -1
  286. package/dist/cli/design-connect.d.ts.map +1 -1
  287. package/dist/cli/design-connect.js +2 -7
  288. package/dist/cli/design-connect.js.map +1 -1
  289. package/dist/cli/index.js +5 -3
  290. package/dist/cli/index.js.map +1 -1
  291. package/dist/cli/skills-content/design-visual-edit-skill.d.ts +1 -1
  292. package/dist/cli/skills-content/design-visual-edit-skill.d.ts.map +1 -1
  293. package/dist/cli/skills-content/design-visual-edit-skill.js +83 -47
  294. package/dist/cli/skills-content/design-visual-edit-skill.js.map +1 -1
  295. package/dist/client/AssistantChat.d.ts.map +1 -1
  296. package/dist/client/AssistantChat.js +16 -9
  297. package/dist/client/AssistantChat.js.map +1 -1
  298. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  299. package/dist/client/agent-chat-adapter.js +21 -0
  300. package/dist/client/agent-chat-adapter.js.map +1 -1
  301. package/dist/client/blocks/library/wireframe-kit.d.ts +2 -0
  302. package/dist/client/blocks/library/wireframe-kit.d.ts.map +1 -1
  303. package/dist/client/blocks/library/wireframe-kit.js +8 -2
  304. package/dist/client/blocks/library/wireframe-kit.js.map +1 -1
  305. package/dist/client/chat/index.d.ts +1 -1
  306. package/dist/client/chat/index.d.ts.map +1 -1
  307. package/dist/client/chat/index.js +1 -1
  308. package/dist/client/chat/index.js.map +1 -1
  309. package/dist/client/chat/message-components.d.ts +17 -0
  310. package/dist/client/chat/message-components.d.ts.map +1 -1
  311. package/dist/client/chat/message-components.js +24 -2
  312. package/dist/client/chat/message-components.js.map +1 -1
  313. package/dist/client/chat/run-recovery.d.ts +6 -0
  314. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  315. package/dist/client/chat/run-recovery.js +13 -3
  316. package/dist/client/chat/run-recovery.js.map +1 -1
  317. package/dist/client/chat/widgets/DataTableWidget.d.ts.map +1 -1
  318. package/dist/client/chat/widgets/DataTableWidget.js +2 -3
  319. package/dist/client/chat/widgets/DataTableWidget.js.map +1 -1
  320. package/dist/client/chat/widgets/WorkspaceFileWidget.d.ts +5 -0
  321. package/dist/client/chat/widgets/WorkspaceFileWidget.d.ts.map +1 -0
  322. package/dist/client/chat/widgets/WorkspaceFileWidget.js +34 -0
  323. package/dist/client/chat/widgets/WorkspaceFileWidget.js.map +1 -0
  324. package/dist/client/chat/widgets/builtin-tool-renderers.d.ts.map +1 -1
  325. package/dist/client/chat/widgets/builtin-tool-renderers.js +13 -1
  326. package/dist/client/chat/widgets/builtin-tool-renderers.js.map +1 -1
  327. package/dist/client/chat/widgets/workspace-file-result.d.ts +12 -0
  328. package/dist/client/chat/widgets/workspace-file-result.d.ts.map +1 -0
  329. package/dist/client/chat/widgets/workspace-file-result.js +34 -0
  330. package/dist/client/chat/widgets/workspace-file-result.js.map +1 -0
  331. package/dist/client/embed-auth.d.ts.map +1 -1
  332. package/dist/client/embed-auth.js +2 -1
  333. package/dist/client/embed-auth.js.map +1 -1
  334. package/dist/client/org/InvitationBanner.d.ts +5 -2
  335. package/dist/client/org/InvitationBanner.d.ts.map +1 -1
  336. package/dist/client/org/InvitationBanner.js +9 -2
  337. package/dist/client/org/InvitationBanner.js.map +1 -1
  338. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  339. package/dist/client/org/OrgSwitcher.js +3 -2
  340. package/dist/client/org/OrgSwitcher.js.map +1 -1
  341. package/dist/client/org/TeamPage.d.ts.map +1 -1
  342. package/dist/client/org/TeamPage.js +27 -3
  343. package/dist/client/org/TeamPage.js.map +1 -1
  344. package/dist/client/org/WorkspaceNotice.d.ts +18 -0
  345. package/dist/client/org/WorkspaceNotice.d.ts.map +1 -0
  346. package/dist/client/org/WorkspaceNotice.js +56 -0
  347. package/dist/client/org/WorkspaceNotice.js.map +1 -0
  348. package/dist/client/org/hooks.d.ts +1 -0
  349. package/dist/client/org/hooks.d.ts.map +1 -1
  350. package/dist/client/org/hooks.js +12 -0
  351. package/dist/client/org/hooks.js.map +1 -1
  352. package/dist/client/org/index.d.ts +2 -1
  353. package/dist/client/org/index.d.ts.map +1 -1
  354. package/dist/client/org/index.js +2 -1
  355. package/dist/client/org/index.js.map +1 -1
  356. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  357. package/dist/client/resources/McpIntegrationDialog.js +8 -12
  358. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  359. package/dist/client/resources/ResourcesPanel.d.ts +3 -0
  360. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  361. package/dist/client/resources/ResourcesPanel.js +49 -20
  362. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  363. package/dist/client/resources/mcp-integration-catalog.d.ts +1 -0
  364. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  365. package/dist/client/resources/mcp-integration-catalog.js +3 -0
  366. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  367. package/dist/client/resources/use-resources.d.ts +1 -0
  368. package/dist/client/resources/use-resources.d.ts.map +1 -1
  369. package/dist/client/resources/use-resources.js +3 -0
  370. package/dist/client/resources/use-resources.js.map +1 -1
  371. package/dist/client/use-action.d.ts +3 -1
  372. package/dist/client/use-action.d.ts.map +1 -1
  373. package/dist/client/use-action.js +3 -1
  374. package/dist/client/use-action.js.map +1 -1
  375. package/dist/client/widgets/index.d.ts +1 -1
  376. package/dist/client/widgets/index.d.ts.map +1 -1
  377. package/dist/client/widgets/index.js +1 -1
  378. package/dist/client/widgets/index.js.map +1 -1
  379. package/dist/coding-tools/run-code.js +2 -1
  380. package/dist/coding-tools/run-code.js.map +1 -1
  381. package/dist/collab/awareness.d.ts +2 -2
  382. package/dist/collab/awareness.d.ts.map +1 -1
  383. package/dist/collab/routes.d.ts +1 -1
  384. package/dist/db/client.d.ts +1 -0
  385. package/dist/db/client.d.ts.map +1 -1
  386. package/dist/db/client.js +24 -3
  387. package/dist/db/client.js.map +1 -1
  388. package/dist/deploy/build.d.ts.map +1 -1
  389. package/dist/deploy/build.js +25 -3
  390. package/dist/deploy/build.js.map +1 -1
  391. package/dist/eject/remote-mcp-presets.js +1 -1
  392. package/dist/eject/remote-mcp-presets.js.map +1 -1
  393. package/dist/index.browser.d.ts +1 -1
  394. package/dist/index.browser.d.ts.map +1 -1
  395. package/dist/index.browser.js +1 -1
  396. package/dist/index.browser.js.map +1 -1
  397. package/dist/index.d.ts +1 -1
  398. package/dist/index.d.ts.map +1 -1
  399. package/dist/index.js +1 -1
  400. package/dist/index.js.map +1 -1
  401. package/dist/integrations/google-docs-poller.d.ts.map +1 -1
  402. package/dist/integrations/google-docs-poller.js +4 -1
  403. package/dist/integrations/google-docs-poller.js.map +1 -1
  404. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  405. package/dist/integrations/webhook-handler.js +23 -11
  406. package/dist/integrations/webhook-handler.js.map +1 -1
  407. package/dist/jobs/scheduler.js +4 -0
  408. package/dist/jobs/scheduler.js.map +1 -1
  409. package/dist/localization/default-messages.d.ts +3 -2
  410. package/dist/localization/default-messages.d.ts.map +1 -1
  411. package/dist/localization/default-messages.js +3 -2
  412. package/dist/localization/default-messages.js.map +1 -1
  413. package/dist/mcp/build-server.d.ts.map +1 -1
  414. package/dist/mcp/build-server.js +10 -1
  415. package/dist/mcp/build-server.js.map +1 -1
  416. package/dist/notifications/routes.d.ts +1 -1
  417. package/dist/observability/traces.d.ts.map +1 -1
  418. package/dist/observability/traces.js +27 -7
  419. package/dist/observability/traces.js.map +1 -1
  420. package/dist/org/handlers.d.ts +15 -0
  421. package/dist/org/handlers.d.ts.map +1 -1
  422. package/dist/org/handlers.js +45 -1
  423. package/dist/org/handlers.js.map +1 -1
  424. package/dist/org/migrations.d.ts.map +1 -1
  425. package/dist/org/migrations.js +4 -0
  426. package/dist/org/migrations.js.map +1 -1
  427. package/dist/org/plugin.d.ts +1 -0
  428. package/dist/org/plugin.d.ts.map +1 -1
  429. package/dist/org/plugin.js +10 -1
  430. package/dist/org/plugin.js.map +1 -1
  431. package/dist/org/schema.d.ts +19 -0
  432. package/dist/org/schema.d.ts.map +1 -1
  433. package/dist/org/schema.js +1 -0
  434. package/dist/org/schema.js.map +1 -1
  435. package/dist/org/types.d.ts +8 -0
  436. package/dist/org/types.d.ts.map +1 -1
  437. package/dist/org/types.js.map +1 -1
  438. package/dist/org/workspace-url.d.ts +32 -0
  439. package/dist/org/workspace-url.d.ts.map +1 -0
  440. package/dist/org/workspace-url.js +63 -0
  441. package/dist/org/workspace-url.js.map +1 -0
  442. package/dist/progress/routes.d.ts +1 -1
  443. package/dist/provider-api/actions/custom-provider-registration.d.ts +11 -11
  444. package/dist/provider-api/actions/provider-api.d.ts +7 -7
  445. package/dist/resources/handlers.d.ts +2 -3
  446. package/dist/resources/handlers.d.ts.map +1 -1
  447. package/dist/resources/handlers.js +25 -5
  448. package/dist/resources/handlers.js.map +1 -1
  449. package/dist/scripts/runner.d.ts +17 -0
  450. package/dist/scripts/runner.d.ts.map +1 -1
  451. package/dist/scripts/runner.js +130 -5
  452. package/dist/scripts/runner.js.map +1 -1
  453. package/dist/secrets/routes.d.ts +9 -9
  454. package/dist/server/action-routes.d.ts.map +1 -1
  455. package/dist/server/action-routes.js +24 -2
  456. package/dist/server/action-routes.js.map +1 -1
  457. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  458. package/dist/server/agent-chat-plugin.js +26 -1
  459. package/dist/server/agent-chat-plugin.js.map +1 -1
  460. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  461. package/dist/server/agent-teams.d.ts.map +1 -1
  462. package/dist/server/agent-teams.js +10 -1
  463. package/dist/server/agent-teams.js.map +1 -1
  464. package/dist/server/auth.d.ts +22 -0
  465. package/dist/server/auth.d.ts.map +1 -1
  466. package/dist/server/auth.js +33 -7
  467. package/dist/server/auth.js.map +1 -1
  468. package/dist/server/embed-route.d.ts.map +1 -1
  469. package/dist/server/embed-route.js +6 -1
  470. package/dist/server/embed-route.js.map +1 -1
  471. package/dist/server/embed-session.d.ts +7 -0
  472. package/dist/server/embed-session.d.ts.map +1 -1
  473. package/dist/server/embed-session.js +46 -4
  474. package/dist/server/embed-session.js.map +1 -1
  475. package/dist/server/open-route.d.ts.map +1 -1
  476. package/dist/server/open-route.js +17 -7
  477. package/dist/server/open-route.js.map +1 -1
  478. package/dist/server/prompts/framework-core-compact.js +1 -1
  479. package/dist/server/prompts/framework-core-compact.js.map +1 -1
  480. package/dist/server/prompts/framework-core.d.ts.map +1 -1
  481. package/dist/server/prompts/framework-core.js +1 -0
  482. package/dist/server/prompts/framework-core.js.map +1 -1
  483. package/dist/server/request-context.d.ts +26 -0
  484. package/dist/server/request-context.d.ts.map +1 -1
  485. package/dist/server/request-context.js +18 -1
  486. package/dist/server/request-context.js.map +1 -1
  487. package/dist/shared/embed-auth.d.ts +1 -0
  488. package/dist/shared/embed-auth.d.ts.map +1 -1
  489. package/dist/shared/embed-auth.js +1 -0
  490. package/dist/shared/embed-auth.js.map +1 -1
  491. package/dist/shared/html-document.d.ts +12 -0
  492. package/dist/shared/html-document.d.ts.map +1 -0
  493. package/dist/shared/html-document.js +92 -0
  494. package/dist/shared/html-document.js.map +1 -0
  495. package/dist/shared/index.d.ts +1 -0
  496. package/dist/shared/index.d.ts.map +1 -1
  497. package/dist/shared/index.js +1 -0
  498. package/dist/shared/index.js.map +1 -1
  499. package/dist/sharing/access.d.ts +1 -0
  500. package/dist/sharing/access.d.ts.map +1 -1
  501. package/dist/sharing/access.js +8 -2
  502. package/dist/sharing/access.js.map +1 -1
  503. package/dist/sharing/registry.d.ts +3 -0
  504. package/dist/sharing/registry.d.ts.map +1 -1
  505. package/dist/sharing/registry.js.map +1 -1
  506. package/dist/workspace-files/actions.d.ts +28 -0
  507. package/dist/workspace-files/actions.d.ts.map +1 -0
  508. package/dist/workspace-files/actions.js +75 -0
  509. package/dist/workspace-files/actions.js.map +1 -0
  510. package/dist/workspace-files/tool.d.ts.map +1 -1
  511. package/dist/workspace-files/tool.js +4 -0
  512. package/dist/workspace-files/tool.js.map +1 -1
  513. package/docs/content/cloneable-saas.mdx +114 -0
  514. package/docs/content/creating-templates.mdx +28 -2
  515. package/docs/content/syncing-template-changes.mdx +7 -0
  516. package/docs/content/template-clips-developers.mdx +12 -5
  517. package/docs/content/template-dispatch-developers.mdx +1 -1
  518. package/docs/content/template-dispatch.mdx +1 -1
  519. package/package.json +2 -2
  520. package/src/action-ui.ts +1 -0
  521. package/src/action.ts +5 -1
  522. package/src/agent/engine/ai-sdk-engine.ts +15 -5
  523. package/src/agent/harness/runner.ts +5 -0
  524. package/src/agent/production-agent.ts +33 -0
  525. package/src/agent/run-loop-with-resume.ts +5 -0
  526. package/src/agent/run-manager.ts +126 -1
  527. package/src/agent/thread-data-builder.ts +47 -2
  528. package/src/agent/types.ts +2 -0
  529. package/src/chat-threads/store.ts +4 -5
  530. package/src/cli/create.ts +1139 -65
  531. package/src/cli/design-connect.ts +3 -7
  532. package/src/cli/index.ts +5 -3
  533. package/src/cli/skills-content/design-visual-edit-skill.ts +83 -47
  534. package/src/client/AssistantChat.tsx +27 -16
  535. package/src/client/agent-chat-adapter.ts +24 -0
  536. package/src/client/blocks/library/wireframe-kit.tsx +17 -2
  537. package/src/client/chat/index.ts +1 -0
  538. package/src/client/chat/message-components.tsx +104 -1
  539. package/src/client/chat/run-recovery.tsx +15 -3
  540. package/src/client/chat/widgets/DataTableWidget.tsx +10 -29
  541. package/src/client/chat/widgets/WorkspaceFileWidget.tsx +71 -0
  542. package/src/client/chat/widgets/builtin-tool-renderers.tsx +22 -0
  543. package/src/client/chat/widgets/workspace-file-result.ts +49 -0
  544. package/src/client/embed-auth.ts +2 -0
  545. package/src/client/org/InvitationBanner.tsx +14 -1
  546. package/src/client/org/OrgSwitcher.tsx +23 -0
  547. package/src/client/org/TeamPage.tsx +130 -0
  548. package/src/client/org/WorkspaceNotice.tsx +85 -0
  549. package/src/client/org/hooks.ts +14 -0
  550. package/src/client/org/index.ts +2 -0
  551. package/src/client/resources/McpIntegrationDialog.tsx +27 -40
  552. package/src/client/resources/ResourcesPanel.tsx +134 -51
  553. package/src/client/resources/mcp-integration-catalog.ts +7 -0
  554. package/src/client/resources/use-resources.ts +6 -0
  555. package/src/client/use-action.ts +3 -1
  556. package/src/client/widgets/index.ts +1 -0
  557. package/src/coding-tools/run-code.ts +2 -1
  558. package/src/db/client.ts +28 -4
  559. package/src/deploy/build.ts +31 -3
  560. package/src/eject/remote-mcp-presets.ts +1 -1
  561. package/src/index.browser.ts +1 -0
  562. package/src/index.ts +1 -0
  563. package/src/integrations/google-docs-poller.ts +3 -0
  564. package/src/integrations/webhook-handler.ts +28 -11
  565. package/src/jobs/scheduler.ts +4 -0
  566. package/src/localization/default-messages.ts +3 -2
  567. package/src/mcp/build-server.ts +20 -2
  568. package/src/observability/traces.ts +48 -12
  569. package/src/org/handlers.ts +52 -1
  570. package/src/org/migrations.ts +4 -0
  571. package/src/org/plugin.ts +14 -0
  572. package/src/org/schema.ts +1 -0
  573. package/src/org/types.ts +8 -0
  574. package/src/org/workspace-url.ts +74 -0
  575. package/src/resources/handlers.ts +35 -5
  576. package/src/scripts/runner.ts +183 -5
  577. package/src/server/__snapshots__/agent-chat-plugin.surface.spec.ts.snap +2 -1
  578. package/src/server/action-routes.ts +32 -2
  579. package/src/server/agent-chat-plugin.ts +29 -0
  580. package/src/server/agent-teams.ts +10 -1
  581. package/src/server/auth.ts +33 -7
  582. package/src/server/embed-route.ts +9 -0
  583. package/src/server/embed-session.ts +62 -3
  584. package/src/server/open-route.ts +20 -6
  585. package/src/server/prompts/framework-core-compact.ts +1 -1
  586. package/src/server/prompts/framework-core.ts +1 -0
  587. package/src/server/request-context.ts +36 -1
  588. package/src/shared/embed-auth.ts +1 -0
  589. package/src/shared/html-document.ts +115 -0
  590. package/src/shared/index.ts +1 -0
  591. package/src/sharing/access.ts +8 -1
  592. package/src/sharing/registry.ts +11 -2
  593. package/src/workspace-files/actions.ts +100 -0
  594. package/src/workspace-files/tool.ts +4 -0
  595. package/corpus/templates/design/changelog/2026-07-28-interact-mode-can-preview-designs-in-responsive-device-sizes.md +0 -6
  596. package/corpus/templates/design/changelog/2026-07-28-interact-mode-now-opens-a-full-screen-responsive-preview-wit.md +0 -6
@@ -53,6 +53,40 @@ interface WriteLocalFileResponse {
53
53
  versionHash?: string;
54
54
  }
55
55
 
56
+ const LOCAL_READ_TIMEOUT_MS = 15_000;
57
+
58
+ export class LocalWorkspaceTimeoutError extends Error {
59
+ constructor(operation: "list" | "read") {
60
+ super(
61
+ operation === "list"
62
+ ? "Local files took too long to load. Check the local connection and try again." /* i18n-ignore */
63
+ : "This local file took too long to load. Check the local connection and try again." /* i18n-ignore */,
64
+ );
65
+ this.name = "LocalWorkspaceTimeoutError";
66
+ }
67
+ }
68
+
69
+ export async function withLocalReadTimeout<T>(
70
+ operation: "list" | "read",
71
+ request: Promise<T>,
72
+ timeoutMs = LOCAL_READ_TIMEOUT_MS,
73
+ ): Promise<T> {
74
+ let timer: ReturnType<typeof setTimeout> | undefined;
75
+ try {
76
+ return await Promise.race([
77
+ request,
78
+ new Promise<never>((_resolve, reject) => {
79
+ timer = setTimeout(
80
+ () => reject(new LocalWorkspaceTimeoutError(operation)),
81
+ timeoutMs,
82
+ );
83
+ }),
84
+ ]);
85
+ } finally {
86
+ if (timer) clearTimeout(timer);
87
+ }
88
+ }
89
+
56
90
  /** Detect the write-local-file action's grant-related error messages. */
57
91
  function isWriteConsentError(error: unknown): boolean {
58
92
  if (!(error instanceof Error)) return false;
@@ -103,10 +137,13 @@ export function createLocalhostProvider(
103
137
  };
104
138
 
105
139
  async function listFiles(): Promise<WorkspaceFileEntry[]> {
106
- const response = await callAction<ListLocalFilesResponse>(
107
- "list-local-files",
108
- { designId, connectionId },
109
- { method: "GET" },
140
+ const response = await withLocalReadTimeout(
141
+ "list",
142
+ callAction<ListLocalFilesResponse>(
143
+ "list-local-files",
144
+ { designId, connectionId },
145
+ { method: "GET" },
146
+ ),
110
147
  );
111
148
  return response.files.map((file) => ({
112
149
  path: file.path,
@@ -116,10 +153,13 @@ export function createLocalhostProvider(
116
153
  }
117
154
 
118
155
  async function readFile(path: string): Promise<WorkspaceReadResult> {
119
- const response = await callAction<ReadLocalFileResponse>(
120
- "read-local-file",
121
- { designId, connectionId, path },
122
- { method: "GET" },
156
+ const response = await withLocalReadTimeout(
157
+ "read",
158
+ callAction<ReadLocalFileResponse>(
159
+ "read-local-file",
160
+ { designId, connectionId, path },
161
+ { method: "GET" },
162
+ ),
123
163
  );
124
164
  return {
125
165
  content: response.content,
@@ -1,3 +1,5 @@
1
+ import { injectDocumentMarkup } from "@agent-native/core/shared";
2
+
1
3
  /**
2
4
  * Content-size reporter injected into every canvas iframe (primary + each
3
5
  * breakpoint) so a frame can grow to fit its own content instead of inheriting
@@ -108,17 +110,5 @@ export const CONTENT_SIZE_REPORT_MESSAGE_TYPE = "agent-native:content-size";
108
110
  /** Appends the reporter + full-height guard, mirroring appendHitTestResponder's
109
111
  * marker handling so it runs regardless of document structure. */
110
112
  export function appendContentSizeReporter(html: string): string {
111
- if (html.includes("</body>")) {
112
- return html.replace(
113
- "</body>", // i18n-ignore generated iframe HTML marker
114
- CONTENT_SIZE_REPORT_BRIDGE + "</body>", // i18n-ignore generated iframe HTML injection
115
- );
116
- }
117
- if (html.includes("</html>")) {
118
- return html.replace(
119
- "</html>", // i18n-ignore generated iframe HTML marker
120
- CONTENT_SIZE_REPORT_BRIDGE + "</html>", // i18n-ignore generated iframe HTML injection
121
- );
122
- }
123
- return html + CONTENT_SIZE_REPORT_BRIDGE;
113
+ return injectDocumentMarkup(html, CONTENT_SIZE_REPORT_BRIDGE);
124
114
  }
@@ -1,3 +1,5 @@
1
+ import { injectDocumentMarkup } from "@agent-native/core/shared";
2
+
1
3
  const TRANSPARENT_EMBEDDED_FRAME_STYLE =
2
4
  "<style data-agent-native-transparent-frame>html,body{background:transparent!important;}body{background-color:transparent!important;}</style>";
3
5
 
@@ -37,8 +39,8 @@ export function embeddedContentOffsetStyle(x: number, y: number): string {
37
39
 
38
40
  function injectEmbeddedFrameStyle(content: string, style: string): string {
39
41
  if (!style) return content;
40
- if (/<\/head>/i.test(content)) {
41
- return content.replace(/<\/head>/i, `${style}</head>`);
42
+ if (/<\/head\s*>/i.test(content)) {
43
+ return injectDocumentMarkup(content, style, { target: "head" });
42
44
  }
43
45
  if (/<body\b/i.test(content)) {
44
46
  return content.replace(/<body\b/i, `${style}<body`);
@@ -1,3 +1,5 @@
1
+ import { injectDocumentMarkup } from "@agent-native/core/shared";
2
+
1
3
  import { hitTestBridgeScript } from "../../../../.generated/bridge/hit-test.generated";
2
4
 
3
5
  export const LIGHTWEIGHT_HIT_TEST_BRIDGE_SCRIPT = `
@@ -7,17 +9,5 @@ ${hitTestBridgeScript}
7
9
  `;
8
10
 
9
11
  export function appendHitTestResponder(html: string): string {
10
- if (html.includes("</body>")) {
11
- return html.replace(
12
- "</body>", // i18n-ignore generated iframe HTML marker
13
- LIGHTWEIGHT_HIT_TEST_BRIDGE_SCRIPT + "</body>", // i18n-ignore generated iframe HTML injection
14
- );
15
- }
16
- if (html.includes("</html>")) {
17
- return html.replace(
18
- "</html>", // i18n-ignore generated iframe HTML marker
19
- LIGHTWEIGHT_HIT_TEST_BRIDGE_SCRIPT + "</html>", // i18n-ignore generated iframe HTML injection
20
- );
21
- }
22
- return html + LIGHTWEIGHT_HIT_TEST_BRIDGE_SCRIPT;
12
+ return injectDocumentMarkup(html, LIGHTWEIGHT_HIT_TEST_BRIDGE_SCRIPT);
23
13
  }
@@ -40,7 +40,9 @@ export function inspectorObjectTitle(element: ElementInfo): string {
40
40
  export function componentNameForElementInfo(
41
41
  element: ElementInfo | null | undefined,
42
42
  ): string {
43
- return element?.componentName?.trim() ?? "";
43
+ const explicitName = element?.componentName?.trim();
44
+ if (explicitName) return explicitName;
45
+ return element?.provenance?.component?.trim() ?? "";
44
46
  }
45
47
 
46
48
  export function elementIsComponentSelection(
@@ -0,0 +1,93 @@
1
+ import type { ElementProvenance } from "@shared/source-mode";
2
+
3
+ export interface InspectCodeSourceLocation {
4
+ /**
5
+ * Path exactly as reported by the runtime. This can be project-relative on
6
+ * ordinary Vite URLs, so it must not automatically become a vscode:// link.
7
+ */
8
+ filePath: string;
9
+ /** Absolute paths are safe to expose through the local-editor deep link. */
10
+ absolutePath?: string;
11
+ line?: number;
12
+ column?: number;
13
+ componentName?: string;
14
+ method?: ElementProvenance["method"];
15
+ owner?: {
16
+ filePath: string;
17
+ line?: number;
18
+ column?: number;
19
+ componentName?: string;
20
+ key?: string;
21
+ method?: ElementProvenance["ownerMethod"];
22
+ };
23
+ }
24
+
25
+ interface InspectableElement {
26
+ tagName: string;
27
+ id?: string;
28
+ classes: string[];
29
+ provenance?: ElementProvenance;
30
+ }
31
+
32
+ function isAbsoluteSourcePath(filePath: string): boolean {
33
+ return (
34
+ filePath.startsWith("/") ||
35
+ filePath.startsWith("\\\\") ||
36
+ /^[A-Za-z]:[\\/]/.test(filePath)
37
+ );
38
+ }
39
+
40
+ /**
41
+ * Preserve the live bridge's compiler/debug provenance for the inspector.
42
+ * A missing file remains unavailable; a React 19 debug-stack line remains
43
+ * explicitly labelled as runtime-transformed instead of being presented as an
44
+ * authored JSX position.
45
+ */
46
+ export function inspectCodeSourceLocation(
47
+ provenance: ElementProvenance | null | undefined,
48
+ ): InspectCodeSourceLocation | null {
49
+ if (!provenance) return null;
50
+ const filePath = provenance.sourceFile?.trim();
51
+ if (!filePath) return null;
52
+
53
+ const ownerFilePath = provenance.ownerSourceFile?.trim();
54
+ return {
55
+ filePath,
56
+ ...(isAbsoluteSourcePath(filePath) ? { absolutePath: filePath } : {}),
57
+ ...(provenance.line ? { line: provenance.line } : {}),
58
+ ...(provenance.column ? { column: provenance.column } : {}),
59
+ ...(provenance.component ? { componentName: provenance.component } : {}),
60
+ ...(provenance.method ? { method: provenance.method } : {}),
61
+ ...(ownerFilePath
62
+ ? {
63
+ owner: {
64
+ filePath: ownerFilePath,
65
+ ...(provenance.ownerLine ? { line: provenance.ownerLine } : {}),
66
+ ...(provenance.ownerColumn
67
+ ? { column: provenance.ownerColumn }
68
+ : {}),
69
+ ...(provenance.ownerComponentName
70
+ ? { componentName: provenance.ownerComponentName }
71
+ : {}),
72
+ ...(provenance.ownerKey ? { key: provenance.ownerKey } : {}),
73
+ ...(provenance.ownerMethod
74
+ ? { method: provenance.ownerMethod }
75
+ : {}),
76
+ },
77
+ }
78
+ : {}),
79
+ };
80
+ }
81
+
82
+ export function inspectCodeDataForElement(
83
+ element: InspectableElement,
84
+ html: string | null | undefined,
85
+ ) {
86
+ return {
87
+ html,
88
+ tagName: element.tagName,
89
+ id: element.id,
90
+ classes: element.classes,
91
+ sourceLocation: inspectCodeSourceLocation(element.provenance),
92
+ };
93
+ }
@@ -1,3 +1,5 @@
1
+ import { injectDocumentMarkup } from "@agent-native/core/shared";
2
+
1
3
  import type { FrameGeometry } from "./types";
2
4
 
3
5
  export function hasBoardSurfaceContent(html: string | undefined) {
@@ -322,8 +324,8 @@ export function getBoardSurfaceStaticPreviewContent(args: {
322
324
  const offsetX = -args.logicalGeometry.x;
323
325
  const offsetY = -args.logicalGeometry.y;
324
326
  const style = `<style data-agent-native-board-static-preview>*,*::before,*::after{animation:none!important;animation-delay:0s!important;transition:none!important;caret-color:transparent!important;}html{width:${viewportWidth}px!important;height:${viewportHeight}px!important;overflow:hidden!important;}body{margin:0!important;width:${width}px!important;height:${height}px!important;overflow:visible!important;transform:scale(${scale})!important;transform-origin:0 0!important;}body>[data-agent-native-node-id]{translate:${offsetX}px ${offsetY}px!important;}</style>`;
325
- if (/<\/head>/i.test(renderHtml)) {
326
- return renderHtml.replace(/<\/head>/i, `${style}</head>`);
327
+ if (/<\/head\s*>/i.test(renderHtml)) {
328
+ return injectDocumentMarkup(renderHtml, style, { target: "head" });
327
329
  }
328
330
  if (/<body\b/i.test(renderHtml)) {
329
331
  return renderHtml.replace(/<body\b/i, `${style}<body`);
@@ -28,6 +28,41 @@ export function isPortableStyleSnapshot(
28
28
  return snapshot.version === 1 && Array.isArray(snapshot.nodes);
29
29
  }
30
30
 
31
+ export function captureCrossScreenSourceHtmlSnapshot(
32
+ sourceDocument: Document | null,
33
+ sourceNodeId: string | undefined,
34
+ ): string | undefined {
35
+ if (!sourceDocument || !sourceNodeId) return undefined;
36
+ const matches = sourceDocument.querySelectorAll(
37
+ `[data-agent-native-node-id="${CSS.escape(sourceNodeId)}"]`,
38
+ );
39
+ if (matches.length !== 1) return undefined;
40
+ return matches.item(0)?.outerHTML;
41
+ }
42
+
43
+ export function validateCrossScreenSourceHtmlSnapshot(
44
+ snapshot: string,
45
+ sourceNodeId: string,
46
+ ): string | undefined {
47
+ if (typeof document === "undefined") return undefined;
48
+ const template = document.createElement("template");
49
+ template.innerHTML = snapshot.trim();
50
+ const meaningfulNodes = Array.from(template.content.childNodes).filter(
51
+ (node) => node.nodeType !== Node.TEXT_NODE || node.textContent?.trim(),
52
+ );
53
+ if (
54
+ meaningfulNodes.length !== 1 ||
55
+ meaningfulNodes[0]?.nodeType !== Node.ELEMENT_NODE
56
+ ) {
57
+ return undefined;
58
+ }
59
+ const root = meaningfulNodes[0] as Element;
60
+ if (root.getAttribute("data-agent-native-node-id") !== sourceNodeId) {
61
+ return undefined;
62
+ }
63
+ return root.outerHTML;
64
+ }
65
+
31
66
  export function isCrossScreenDropPlacement(
32
67
  value: unknown,
33
68
  ): value is CrossScreenDropPlacement {
@@ -19,6 +19,30 @@ export function isBreakpointSelectionTarget(screen: {
19
19
  );
20
20
  }
21
21
 
22
+ /**
23
+ * Whether the screen's own frame-level SelectionBox (corner/rotate handles +
24
+ * outline sized to the whole screen) should be suppressed because a MORE
25
+ * specific target already owns the selection chrome — either one of the
26
+ * screen's breakpoint sub-frames (existing BP-DEEP v2 case), or a specific
27
+ * element inside the screen (Layers-panel row, in-canvas click resolving to
28
+ * a node). The editor-chrome bridge inside the iframe already renders a
29
+ * correctly-fitted outline + resize handles for that element; drawing the
30
+ * frame-sized box on top of it is wrong, not just redundant — it always
31
+ * spans the whole screen regardless of what's actually selected.
32
+ */
33
+ export function shouldSuppressFrameSelectionBox(
34
+ screen: {
35
+ id: string;
36
+ breakpointWidths?: number[];
37
+ activeBreakpointWidth?: number;
38
+ },
39
+ selectedElementScreenId: string | null | undefined,
40
+ ): boolean {
41
+ return (
42
+ isBreakpointSelectionTarget(screen) || selectedElementScreenId === screen.id
43
+ );
44
+ }
45
+
22
46
  export function getActiveScreenIframeId(screen: {
23
47
  id: string;
24
48
  activeBreakpointWidth?: number;
@@ -124,6 +124,13 @@ export interface MultiScreenCanvasProps {
124
124
  zoom: number;
125
125
  activeId?: string | null;
126
126
  selectedScreenIds?: string[];
127
+ /** Screen id whose active selection is a specific element INSIDE the
128
+ * screen (a Layers-panel row, an in-canvas click) rather than the screen
129
+ * frame itself. The frame's own SelectionBox is suppressed for this
130
+ * screen — the iframe's editor-chrome bridge already draws a tightly
131
+ * fitted outline + resize handles around the real element, so drawing the
132
+ * frame-sized box on top of it would be wrong, not just redundant. */
133
+ selectedElementScreenId?: string | null;
127
134
  /** Hidden screen/file rows retain geometry but do not render or participate
128
135
  * in overview hit testing, fit, or selection until shown again. */
129
136
  hiddenScreenIds?: ReadonlySet<string> | readonly string[];
@@ -294,6 +301,8 @@ export interface MultiScreenCanvasProps {
294
301
  targetLocalPoint?: Point;
295
302
  /** Pointer offset from the dragged element's top-left in source iframe px. */
296
303
  sourcePointerOffset?: Point;
304
+ /** Host-captured HTML for a board root, including its current DOM subtree. */
305
+ sourceHtmlSnapshot?: string;
297
306
  /** Portable computed styles captured in the source iframe before the move. */
298
307
  styleSnapshot?: PortableStyleSnapshot;
299
308
  }) => void;
@@ -19,6 +19,23 @@ export interface RuntimeStructureMoveRequest {
19
19
  placement: "before" | "after" | "inside";
20
20
  }
21
21
 
22
+ /**
23
+ * Insert NEW markup into a live screen's running DOM. Unlike
24
+ * RuntimeStructureMoveRequest there is no subject in the running app yet —
25
+ * the html is the subject, already positioned by the host.
26
+ */
27
+ export interface RuntimeStructureInsertRequest {
28
+ requestId: number;
29
+ html: string;
30
+ anchor: {
31
+ selector: string;
32
+ sourceId?: string | null;
33
+ /** Hit-test-minted id, live-DOM only. The only handle on an id-less anchor. */
34
+ pendingNodeId?: string | null;
35
+ };
36
+ placement: "before" | "after" | "inside";
37
+ }
38
+
22
39
  export interface RuntimeVerificationRequest {
23
40
  requestId: number;
24
41
  }
@@ -52,6 +69,18 @@ export interface ElementInfo {
52
69
  */
53
70
  pendingNodeId?: string;
54
71
  selector?: string;
72
+ /**
73
+ * The `selector` / `sourceId` the canvas bridge originally reported, kept
74
+ * verbatim when the host canonicalizes the selection onto its own source
75
+ * projection (canonicalElementInfoForCodeLayerNode). For a live/localhost
76
+ * screen the two are DIFFERENT node-id namespaces — the running document
77
+ * carries the ids the bridge assigned there, the fetched source snapshot
78
+ * carries the ones ensureCodeLayerNodeIdsInHtml stamped — so the canonical
79
+ * selector cannot address the live DOM. Any host-initiated mutation of the
80
+ * running document (currently only delete) must target these instead.
81
+ */
82
+ runtimeSelector?: string;
83
+ runtimeSourceId?: string;
55
84
  classes: string[];
56
85
  computedStyles: Record<string, string>;
57
86
  /**
@@ -20,6 +20,10 @@ import { useLocation } from "react-router";
20
20
 
21
21
  import { useNavigationState } from "@/hooks/use-navigation-state";
22
22
  import { DESIGN_CHAT_STORAGE_KEY } from "@/lib/agent-chat";
23
+ import {
24
+ designEditorRoute,
25
+ isDesignEditorRoute,
26
+ } from "@/lib/design-editor-route";
23
27
  import { cn } from "@/lib/utils";
24
28
 
25
29
  import {
@@ -48,7 +52,7 @@ const BARE_PREFIXES = ["/present/"];
48
52
  * DesignEditor mode/zoom/device, shared ExtensionViewer / ExtensionsListPage
49
53
  * chrome). The editor owns its agent surface inside its Figma-style left rail.
50
54
  */
51
- const EDITOR_PREFIXES = ["/design/", "/extensions"];
55
+ const EDITOR_PREFIXES = ["/design/", "/visual-edit/", "/extensions"];
52
56
 
53
57
  export function Layout({ children }: LayoutProps) {
54
58
  const location = useLocation();
@@ -59,7 +63,7 @@ export function Layout({ children }: LayoutProps) {
59
63
  useNavigationState(hasSession);
60
64
  const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false);
61
65
  const openMobileSidebar = useCallback(() => setMobileSidebarOpen(true), []);
62
- const isDesignEditor = location.pathname.startsWith("/design/");
66
+ const isDesignEditor = isDesignEditorRoute(location.pathname);
63
67
  const showMobileTopBar = !isDesignEditor;
64
68
  const browserTabId = getBrowserTabId();
65
69
  const {
@@ -72,8 +76,7 @@ export function Layout({ children }: LayoutProps) {
72
76
  // (which we already short-circuit as BARE). Anywhere else (list,
73
77
  // design-systems, settings) leaves scope null so general chats keep working.
74
78
  const designScope = useMemo(() => {
75
- const match = location.pathname.match(/^\/design\/([^/]+)/);
76
- const designId = match?.[1];
79
+ const designId = designEditorRoute(location.pathname)?.designId;
77
80
  if (!designId) return null;
78
81
  return { type: "design" as const, id: designId };
79
82
  }, [location.pathname]);
@@ -54,6 +54,7 @@ export interface DesignEditorCommand {
54
54
  designId: string;
55
55
  editorView?: "single" | "overview";
56
56
  viewMode?: "single" | "overview";
57
+ mode?: "edit" | "annotate" | "interact";
57
58
  inspectorTab?: "design" | "comments" | "tweaks" | "code" | "extensions";
58
59
  inspector?: "design" | "comments" | "tweaks" | "code" | "extensions";
59
60
  leftPanel?:
@@ -165,6 +166,7 @@ export function editorPathFromCommand(cmd: NavigationState): string | null {
165
166
  const params = new URLSearchParams();
166
167
  const editorView = normalizeEditorView(cmd.editorView);
167
168
  if (editorView) params.set("view", editorView);
169
+ if (editorView === "single") params.set("mode", "interact");
168
170
  const inspectorTab = normalizeInspectorTab(cmd.inspectorTab ?? cmd.inspector);
169
171
  if (inspectorTab) params.set("inspector", inspectorTab);
170
172
  const leftPanel = normalizeLeftPanel(cmd.leftPanel ?? cmd.panel);
@@ -200,6 +202,7 @@ export function editorCommandFromNavigate(
200
202
  path,
201
203
  };
202
204
  if (editorView) command.editorView = editorView;
205
+ if (editorView === "single") command.mode = "interact";
203
206
  if (inspectorTab) command.inspectorTab = inspectorTab;
204
207
  if (leftPanel) command.leftPanel = leftPanel;
205
208
  if (cmd.fileId) command.fileId = cmd.fileId;