@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
@@ -217,6 +217,7 @@ import {
217
217
  } from "./edit-panel/fill-gradient-helpers";
218
218
  import { FillProperties } from "./edit-panel/fill-properties";
219
219
  import { FramePresetsPanel } from "./edit-panel/frame-presets-panel";
220
+ import type { InspectCodeSourceLocation } from "./edit-panel/inspect-code-source";
220
221
  import {
221
222
  InspectorIconButton,
222
223
  InspectorSegment,
@@ -687,14 +688,91 @@ export interface InspectCodeData {
687
688
  * Resolved source file for real-app sources (localhost / fusion), when the
688
689
  * resolveNodeToFile capability is available.
689
690
  */
690
- sourceLocation?: {
691
- /** Absolute path on disk — used to build the vscode:// deep link. */
692
- absolutePath: string;
693
- line?: number;
694
- column?: number;
695
- /** Optional snippet to show above the Open-in-VS-Code button. */
696
- snippet?: string;
697
- } | null;
691
+ sourceLocation?:
692
+ | (InspectCodeSourceLocation & {
693
+ /** Optional snippet to show above the Open-in-VS-Code button. */
694
+ snippet?: string;
695
+ })
696
+ | null;
697
+ }
698
+
699
+ function sourcePositionLabel(
700
+ source: Pick<InspectCodeSourceLocation, "filePath" | "line" | "column">,
701
+ ): string {
702
+ if (source.line == null) return source.filePath;
703
+ return `${source.filePath}:${source.line}${
704
+ source.column == null ? "" : `:${source.column}`
705
+ }`;
706
+ }
707
+
708
+ function sourcePrecisionLabel(
709
+ method: InspectCodeSourceLocation["method"],
710
+ ): string | null {
711
+ if (method === "debug-stack") return "Runtime-transformed location"; // i18n-ignore design inspector technical provenance label
712
+ if (method === "debug-source" || method === "data-attribute") {
713
+ return "Authored source location"; // i18n-ignore design inspector technical provenance label
714
+ }
715
+ return null;
716
+ }
717
+
718
+ function SourceLocationSummary({
719
+ source,
720
+ }: {
721
+ source: InspectCodeSourceLocation;
722
+ }) {
723
+ const precision = sourcePrecisionLabel(source.method);
724
+ const ownerPrecision = source.owner
725
+ ? sourcePrecisionLabel(source.owner.method)
726
+ : null;
727
+ return (
728
+ <div className="space-y-1">
729
+ <div
730
+ className="rounded bg-[var(--design-editor-control-bg)] px-2 py-1.5"
731
+ title={sourcePositionLabel(source)}
732
+ >
733
+ <div className="flex min-w-0 items-center gap-1">
734
+ <IconCode className="size-3 shrink-0 text-muted-foreground/60" />
735
+ {source.componentName ? (
736
+ <span className="shrink-0 font-medium text-foreground">
737
+ {source.componentName}
738
+ </span>
739
+ ) : null}
740
+ <span className="min-w-0 flex-1 truncate font-mono text-[10px] text-muted-foreground">
741
+ {sourcePositionLabel(source)}
742
+ </span>
743
+ </div>
744
+ {precision ? (
745
+ <div className="mt-0.5 pl-4 text-[9px] text-muted-foreground/70">
746
+ {precision}
747
+ </div>
748
+ ) : null}
749
+ </div>
750
+ {source.owner ? (
751
+ <div
752
+ className="rounded border border-border/60 px-2 py-1 text-[10px] text-muted-foreground"
753
+ title={sourcePositionLabel(source.owner)}
754
+ >
755
+ <div className="truncate">
756
+ <span className="mr-1 font-medium text-foreground/80">
757
+ {"Owner" /* i18n-ignore design inspector provenance label */}
758
+ </span>
759
+ {source.owner.componentName
760
+ ? `${source.owner.componentName} · `
761
+ : ""}
762
+ <span className="font-mono">
763
+ {sourcePositionLabel(source.owner)}
764
+ </span>
765
+ {source.owner.key ? ` · key ${source.owner.key}` : ""}
766
+ </div>
767
+ {ownerPrecision ? (
768
+ <div className="mt-0.5 text-[9px] text-muted-foreground/70">
769
+ {ownerPrecision}
770
+ </div>
771
+ ) : null}
772
+ </div>
773
+ ) : null}
774
+ </div>
775
+ );
698
776
  }
699
777
 
700
778
  /**
@@ -882,18 +960,7 @@ function InspectCodePopover({ data }: { data: InspectCodeData }) {
882
960
  </Button>
883
961
  </div>
884
962
 
885
- {source && (
886
- <div
887
- className="flex items-center gap-1 rounded bg-[var(--design-editor-control-bg)] px-2 py-1"
888
- title={source.absolutePath}
889
- >
890
- <IconCode className="size-3 shrink-0 text-muted-foreground/60" />
891
- <span className="min-w-0 flex-1 truncate font-mono text-[10px] text-muted-foreground">
892
- {source.absolutePath}
893
- {source.line != null ? `:${source.line}` : ""}
894
- </span>
895
- </div>
896
- )}
963
+ {source ? <SourceLocationSummary source={source} /> : null}
897
964
 
898
965
  {snippet ? (
899
966
  <pre className="max-h-64 overflow-auto rounded bg-[var(--design-editor-control-bg)] p-2 font-mono text-[10px] leading-relaxed text-foreground">
@@ -907,7 +974,7 @@ function InspectCodePopover({ data }: { data: InspectCodeData }) {
907
974
  </p>
908
975
  )}
909
976
 
910
- {source && (
977
+ {source?.absolutePath ? (
911
978
  <a
912
979
  href={vscodeDeepLink(
913
980
  source.absolutePath,
@@ -926,7 +993,7 @@ function InspectCodePopover({ data }: { data: InspectCodeData }) {
926
993
  {"Open in VS Code" /* i18n-ignore design inspector action */}
927
994
  </Button>
928
995
  </a>
929
- )}
996
+ ) : null}
930
997
  </PopoverContent>
931
998
  </Popover>
932
999
  );
@@ -1040,6 +1107,11 @@ function CodeInspectPanel({
1040
1107
  ) : null}
1041
1108
 
1042
1109
  <PanelSection title={"Code" /* i18n-ignore design inspector section */}>
1110
+ {data?.sourceLocation ? (
1111
+ <div className="mb-2">
1112
+ <SourceLocationSummary source={data.sourceLocation} />
1113
+ </div>
1114
+ ) : null}
1043
1115
  {snippet ? (
1044
1116
  <pre className="max-h-80 overflow-auto rounded bg-[var(--design-editor-control-bg)] p-2 font-mono text-[10px] leading-relaxed text-foreground">
1045
1117
  <code>{highlightedHtml(snippet)}</code>
@@ -46,7 +46,6 @@ import {
46
46
  type PenPath,
47
47
  } from "@shared/pen-path";
48
48
  import {
49
- IconArrowsMaximize,
50
49
  IconCopy,
51
50
  IconDots,
52
51
  IconHandClick,
@@ -213,6 +212,7 @@ import {
213
212
  getActiveScreenIframeId,
214
213
  getBreakpointIframeId,
215
214
  isBreakpointSelectionTarget,
215
+ shouldSuppressFrameSelectionBox,
216
216
  } from "./multi-screen/iframe-targeting";
217
217
  import {
218
218
  boardPointToBoardSurfaceLocalPoint,
@@ -266,6 +266,7 @@ import {
266
266
  screenLocalRectToBoardGeometry,
267
267
  } from "./multi-screen/coordinate-transforms";
268
268
  import {
269
+ captureCrossScreenSourceHtmlSnapshot,
269
270
  getCrossScreenDropGuideForHitTest,
270
271
  getCrossScreenDropGuideStyle,
271
272
  isCrossScreenDropAxis,
@@ -406,6 +407,7 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
406
407
  zoom,
407
408
  activeId,
408
409
  selectedScreenIds,
410
+ selectedElementScreenId = null,
409
411
  hiddenScreenIds = EMPTY_SCREEN_IDS,
410
412
  lockedScreenIds = EMPTY_SCREEN_IDS,
411
413
  fullViewScreenIds,
@@ -861,6 +863,7 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
861
863
  sourceId?: string;
862
864
  sourcePointerOffset?: Point;
863
865
  sourceElementSize?: { width: number; height: number };
866
+ sourceHtmlSnapshot?: string;
864
867
  styleSnapshot?: PortableStyleSnapshot;
865
868
  } | null>(null);
866
869
  const crossScreenParentDragCleanupRef = useRef<(() => void) | null>(null);
@@ -2070,6 +2073,38 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
2070
2073
  });
2071
2074
  };
2072
2075
 
2076
+ /**
2077
+ * Board-space point for a drag message's own pointer position. Every
2078
+ * phase carries it, so a drop never has to trust a ref that a mid-gesture
2079
+ * re-render or an interleaved message may have cleared — losing the board
2080
+ * point silently loses the whole drop.
2081
+ */
2082
+ const boardPointFromDragMessage = (
2083
+ sourceScreenId: string,
2084
+ iframeX: number,
2085
+ iframeY: number,
2086
+ viewportW: number,
2087
+ viewportH: number,
2088
+ ): Point | null => {
2089
+ if (sourceScreenId === boardFileId) {
2090
+ if (!boardSurfaceRenderGeometry) return null;
2091
+ return boardSurfaceLocalPointToBoardPoint(
2092
+ { x: iframeX, y: iframeY },
2093
+ boardSurfaceRenderGeometry,
2094
+ );
2095
+ }
2096
+ const sourceScreen = screensRef.current.find(
2097
+ (s) => s.id === sourceScreenId,
2098
+ );
2099
+ const sourceGeometry = frameGeometryRef.current[sourceScreenId];
2100
+ if (!sourceScreen || !sourceGeometry) return null;
2101
+ return screenLocalPointToBoardPoint(
2102
+ { x: iframeX, y: iframeY },
2103
+ sourceGeometry,
2104
+ { width: viewportW, height: viewportH },
2105
+ );
2106
+ };
2107
+
2073
2108
  const updateCrossScreenTargetFromBoardPoint = (
2074
2109
  boardPoint: Point,
2075
2110
  sourceScreenId: string,
@@ -2134,10 +2169,17 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
2134
2169
  selector: string;
2135
2170
  sourceId?: string;
2136
2171
  sourcePointerOffset?: Point;
2172
+ sourceHtmlSnapshot?: string;
2137
2173
  styleSnapshot?: PortableStyleSnapshot;
2138
2174
  },
2139
2175
  lastBoardPoint: Point | null,
2140
2176
  ) => {
2177
+ dndHostLog("overview:finalize", {
2178
+ sourceScreenId,
2179
+ candidate: candidate?.id ?? null,
2180
+ lastBoardPoint,
2181
+ selector: payload.selector,
2182
+ });
2141
2183
  clearCrossScreenDrag();
2142
2184
  crossScreenLastBoardPointRef.current = null;
2143
2185
  const hasIdentifier = !!(payload.selector || payload.sourceId);
@@ -2186,6 +2228,7 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
2186
2228
  )
2187
2229
  : lastBoardPoint,
2188
2230
  sourcePointerOffset: payload.sourcePointerOffset,
2231
+ sourceHtmlSnapshot: payload.sourceHtmlSnapshot,
2189
2232
  styleSnapshot: payload.styleSnapshot,
2190
2233
  });
2191
2234
  },
@@ -2227,6 +2270,7 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
2227
2270
  targetCanvasPoint: lastBoardPoint,
2228
2271
  targetLocalPoint: targetLocalPoint ?? undefined,
2229
2272
  sourcePointerOffset: payload.sourcePointerOffset,
2273
+ sourceHtmlSnapshot: payload.sourceHtmlSnapshot,
2230
2274
  styleSnapshot: payload.styleSnapshot,
2231
2275
  });
2232
2276
  },
@@ -2316,6 +2360,13 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
2316
2360
  clearCrossScreenDrag();
2317
2361
  return;
2318
2362
  }
2363
+ const sourceHtmlSnapshot =
2364
+ sourceScreenId === boardFileId
2365
+ ? captureCrossScreenSourceHtmlSnapshot(
2366
+ sourcePreviewIframe.contentDocument,
2367
+ msg.sourceId,
2368
+ )
2369
+ : undefined;
2319
2370
 
2320
2371
  if (msg.phase !== "move") {
2321
2372
  dndHostLog("overview:cross-screen", {
@@ -2331,11 +2382,13 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
2331
2382
  sourceId: msg.sourceId,
2332
2383
  sourcePointerOffset,
2333
2384
  sourceElementSize,
2385
+ sourceHtmlSnapshot,
2334
2386
  styleSnapshot,
2335
2387
  };
2336
2388
  stopParentCrossScreenDrag();
2337
2389
  const restorePreviewPointerEvents = mutePreviewIframePointerEvents(
2338
2390
  surfaceRef.current,
2391
+ sourcePreviewIframe,
2339
2392
  );
2340
2393
  let didCleanup = false;
2341
2394
  const cancelPendingParentDrag = () => {
@@ -2390,6 +2443,7 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
2390
2443
  sourceId: msg.sourceId,
2391
2444
  sourcePointerOffset,
2392
2445
  sourceElementSize,
2446
+ sourceHtmlSnapshot,
2393
2447
  styleSnapshot,
2394
2448
  };
2395
2449
  const lastBoardPoint = crossScreenLastBoardPointRef.current;
@@ -2454,13 +2508,16 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
2454
2508
  // path where "start" itself didn't have one yet.
2455
2509
  crossScreenDragMsgRef.current = {
2456
2510
  selector: selector ?? "",
2457
- sourceId,
2511
+ sourceId: sourceId ?? crossScreenDragMsgRef.current?.sourceId,
2458
2512
  sourcePointerOffset:
2459
2513
  crossScreenDragMsgRef.current?.sourcePointerOffset ??
2460
2514
  sourcePointerOffset,
2461
2515
  sourceElementSize:
2462
2516
  sourceElementSize ??
2463
2517
  crossScreenDragMsgRef.current?.sourceElementSize,
2518
+ sourceHtmlSnapshot:
2519
+ sourceHtmlSnapshot ??
2520
+ crossScreenDragMsgRef.current?.sourceHtmlSnapshot,
2464
2521
  styleSnapshot:
2465
2522
  styleSnapshot ?? crossScreenDragMsgRef.current?.styleSnapshot,
2466
2523
  };
@@ -2491,44 +2548,26 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
2491
2548
  // viewport from the bridge. In overview, the iframe viewport may be the
2492
2549
  // frame geometry rather than the screen metadata width.
2493
2550
 
2494
- let boardX: number;
2495
- let boardY: number;
2496
-
2497
- if (sourceScreenId === boardFileId && boardSurfaceRenderGeometry) {
2498
- // The board iframe is pixel-exact: 1 iframe pixel == 1 canvas unit.
2499
- // Its finite paint window can start anywhere within the much larger
2500
- // logical board, so add the render origin (not the logical board's
2501
- // fixed -65536 origin) to recover persisted canvas coordinates.
2502
- const boardPoint = boardSurfaceLocalPointToBoardPoint(
2503
- { x: iframeX, y: iframeY },
2504
- boardSurfaceRenderGeometry,
2505
- );
2506
- boardX = boardPoint.x;
2507
- boardY = boardPoint.y;
2508
- } else {
2509
- const sourceScreen = screensRef.current.find(
2510
- (s) => s.id === sourceScreenId,
2511
- );
2512
- const sourceGeometry = frameGeometryRef.current[sourceScreenId];
2513
- if (!sourceScreen || !sourceGeometry) {
2514
- clearCrossScreenDrag();
2515
- return;
2516
- }
2517
- const boardPoint = screenLocalPointToBoardPoint(
2518
- { x: iframeX, y: iframeY },
2519
- sourceGeometry,
2520
- { width: viewportW, height: viewportH },
2521
- );
2522
- boardX = boardPoint.x;
2523
- boardY = boardPoint.y;
2551
+ // The board iframe is pixel-exact: 1 iframe pixel == 1 canvas unit.
2552
+ // Its finite paint window can start anywhere within the much larger
2553
+ // logical board, so the helper adds the render origin (not the logical
2554
+ // board's fixed -65536 origin) to recover persisted canvas coords.
2555
+ const boardPoint = boardPointFromDragMessage(
2556
+ sourceScreenId,
2557
+ iframeX,
2558
+ iframeY,
2559
+ viewportW,
2560
+ viewportH,
2561
+ );
2562
+ if (!boardPoint) {
2563
+ clearCrossScreenDrag();
2564
+ return;
2524
2565
  }
2525
- const boardPoint = { x: boardX, y: boardY };
2526
2566
  updateCrossScreenTargetFromBoardPoint(boardPoint, sourceScreenId);
2527
2567
  return;
2528
2568
  }
2529
2569
 
2530
2570
  if (msg.phase === "end") {
2531
- const candidate = crossScreenTargetRef.current;
2532
2571
  // Use the saved payload from the last "move" as the primary source of
2533
2572
  // truth; fall back to the "end" message's own fields in case the ref
2534
2573
  // was cleared (e.g. a brief re-entry into the source iframe nulled it
@@ -2538,9 +2577,31 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
2538
2577
  sourceId: msg.sourceId,
2539
2578
  sourcePointerOffset,
2540
2579
  sourceElementSize,
2580
+ sourceHtmlSnapshot,
2541
2581
  styleSnapshot,
2542
2582
  };
2543
- const lastBoardPoint = crossScreenLastBoardPointRef.current;
2583
+ // Derive the release point from THIS message before falling back to
2584
+ // the refs the "move" phase maintained. The refs are cleared by any
2585
+ // cancel/blur/re-render that lands between the last move and the
2586
+ // release, and a drop that reads them empty returns silently — the
2587
+ // whole gesture vanishes with the element back on the board and no
2588
+ // error anywhere. The end message always describes its own pointer.
2589
+ const lastBoardPoint =
2590
+ boardPointFromDragMessage(
2591
+ sourceScreenId,
2592
+ msg.iframeX ?? 0,
2593
+ msg.iframeY ?? 0,
2594
+ msg.viewportW ?? 0,
2595
+ msg.viewportH ?? 0,
2596
+ ) ?? crossScreenLastBoardPointRef.current;
2597
+ const targetAtRelease = lastBoardPoint
2598
+ ? getFrameEntryAtPoint(lastBoardPoint)
2599
+ : null;
2600
+ const candidate =
2601
+ crossScreenTargetRef.current ??
2602
+ (targetAtRelease && targetAtRelease.id !== sourceScreenId
2603
+ ? { id: targetAtRelease.id, geometry: targetAtRelease.geometry }
2604
+ : null);
2544
2605
  finalizeCrossScreenDrop(
2545
2606
  sourceScreenId,
2546
2607
  candidate,
@@ -2552,7 +2613,6 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
2552
2613
 
2553
2614
  window.addEventListener("message", handleMessage);
2554
2615
  return () => {
2555
- stopParentCrossScreenDrag();
2556
2616
  window.removeEventListener("message", handleMessage);
2557
2617
  };
2558
2618
  }, [
@@ -2566,6 +2626,21 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
2566
2626
  onCrossScreenElementDrop,
2567
2627
  ]);
2568
2628
 
2629
+ // Unmount only — deliberately NOT part of the message effect's cleanup
2630
+ // above. That effect re-subscribes whenever its deps change, which happens
2631
+ // several times during a single drag, and running the parent-drag teardown
2632
+ // there restores the preview iframes' pointer-events mid-gesture. The
2633
+ // pointer then falls into a live cross-origin screen iframe, the source
2634
+ // bridge stops receiving the drag, and the gesture dies with nothing
2635
+ // dropped and no error.
2636
+ useEffect(
2637
+ () => () => {
2638
+ crossScreenParentDragCleanupRef.current?.();
2639
+ crossScreenParentDragCleanupRef.current = null;
2640
+ },
2641
+ [],
2642
+ );
2643
+
2569
2644
  const deleteSelectedItems = useCallback(() => {
2570
2645
  if (readOnly) return false;
2571
2646
  const frameIds = selectedIdsRef.current.filter(
@@ -7568,9 +7643,17 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
7568
7643
  ? canvasFrames.find((entry) => entry.screen.id === singleSelectedFrame.id)
7569
7644
  ?.screen
7570
7645
  : undefined;
7646
+ // Overview element selection (a Layers-panel row or an in-canvas click
7647
+ // resolving to a specific node) also suppresses the frame box: the parent
7648
+ // still carries the screen in `selectedIds` (other UI — z-order, "topmost
7649
+ // screen" — depends on that), but the frame's own bounds are the wrong
7650
+ // outline for an element selection. See shouldSuppressFrameSelectionBox.
7571
7651
  const suppressBaseSelectionBox = Boolean(
7572
7652
  singleSelectedFrameScreen &&
7573
- isBreakpointSelectionTarget(singleSelectedFrameScreen),
7653
+ shouldSuppressFrameSelectionBox(
7654
+ singleSelectedFrameScreen,
7655
+ selectedElementScreenId,
7656
+ ),
7574
7657
  );
7575
7658
  const singleSelectedDraft =
7576
7659
  selectedDraftEntries.length === 1 && !selectedDraftGroupBounds
@@ -7816,7 +7899,6 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
7816
7899
  showFullView={fullViewIdSet.has(screen.id)}
7817
7900
  pendingReview={pendingReviewScreenIdSet.has(screen.id)}
7818
7901
  onReviewPendingScreen={onReviewPendingScreen}
7819
- interactMode={interactMode}
7820
7902
  isDirectlyHovered={screen.id === directlyHoveredScreenId}
7821
7903
  isFileDragOver={
7822
7904
  fileDragOverFrameId !== null &&
@@ -9125,7 +9207,6 @@ interface ScreenProps {
9125
9207
  showFullView: boolean;
9126
9208
  pendingReview: boolean;
9127
9209
  onReviewPendingScreen?: (screenId: string) => void;
9128
- interactMode: boolean;
9129
9210
  readOnly: boolean;
9130
9211
  isDirectlyHovered: boolean;
9131
9212
  /** True while a native OS file drag is hovering this frame (Figma parity §1). */
@@ -9197,7 +9278,6 @@ const Screen = memo(function Screen({
9197
9278
  showFullView,
9198
9279
  pendingReview,
9199
9280
  onReviewPendingScreen,
9200
- interactMode,
9201
9281
  readOnly,
9202
9282
  isDirectlyHovered,
9203
9283
  isFileDragOver,
@@ -9303,9 +9383,7 @@ const Screen = memo(function Screen({
9303
9383
  // cover one another. Narrow frames collapse the action to its familiar icon;
9304
9384
  // the accessible name and native tooltip preserve the action's meaning.
9305
9385
  const compactFullView = frameScreenWidth < FRAME_HEADER_BUTTON_COMPACT_WIDTH;
9306
- const frameActionLabel = interactMode
9307
- ? t("multiScreenCanvas.fullView")
9308
- : t("designEditor.modes.interact");
9386
+ const frameActionLabel = t("designEditor.modes.interact");
9309
9387
  const labelInfoMaxWidth = Math.max(
9310
9388
  64,
9311
9389
  frameScreenWidth -
@@ -9473,11 +9551,7 @@ const Screen = memo(function Screen({
9473
9551
  onMouseEnter={() => updateDirectHover(true)}
9474
9552
  onMouseLeave={() => updateDirectHover(false)}
9475
9553
  >
9476
- {interactMode ? (
9477
- <IconArrowsMaximize className="size-3 shrink-0" />
9478
- ) : (
9479
- <IconHandClick className="size-3 shrink-0" />
9480
- )}
9554
+ <IconHandClick className="size-3 shrink-0" />
9481
9555
  <span className={cn("truncate", compactFullView && "sr-only")}>
9482
9556
  {frameActionLabel}
9483
9557
  </span>
@@ -9714,7 +9788,6 @@ const Screen = memo(function Screen({
9714
9788
  renderBreakpointContent={renderBreakpointContent}
9715
9789
  activeBreakpointWidth={screen.activeBreakpointWidth}
9716
9790
  isScreenSelected={isSelected}
9717
- interactMode={interactMode}
9718
9791
  penActive={penActive}
9719
9792
  creationToolActive={creationToolActive}
9720
9793
  cullTier={cullTier}
@@ -9862,7 +9935,6 @@ function BreakpointPreviewRow({
9862
9935
  renderBreakpointContent,
9863
9936
  activeBreakpointWidth,
9864
9937
  isScreenSelected,
9865
- interactMode,
9866
9938
  penActive,
9867
9939
  creationToolActive,
9868
9940
  cullTier,
@@ -9906,7 +9978,6 @@ function BreakpointPreviewRow({
9906
9978
  * mirrors `Screen`'s own `isSelected`, used so a breakpoint frame's chrome
9907
9979
  * reads as "part of a selected group" the same way the base frame does. */
9908
9980
  isScreenSelected: boolean;
9909
- interactMode: boolean;
9910
9981
  penActive: boolean;
9911
9982
  creationToolActive: boolean;
9912
9983
  /** Uses the owning screen's exact culling lifecycle: never-seen/evicted
@@ -9943,9 +10014,7 @@ function BreakpointPreviewRow({
9943
10014
  canEdit?: boolean;
9944
10015
  }) {
9945
10016
  const t = useT();
9946
- const frameActionLabel = interactMode
9947
- ? t("multiScreenCanvas.fullView")
9948
- : t("designEditor.modes.interact");
10017
+ const frameActionLabel = t("designEditor.modes.interact");
9949
10018
  const breakpointWidths = visibleBreakpointWidths(
9950
10019
  screen.breakpointWidths,
9951
10020
  // Immutable device width, not the resizable box width (see frame-geometry).
@@ -10264,11 +10333,7 @@ function BreakpointPreviewRow({
10264
10333
  e.stopPropagation();
10265
10334
  }}
10266
10335
  >
10267
- {interactMode ? (
10268
- <IconArrowsMaximize className="size-3" />
10269
- ) : (
10270
- <IconHandClick className="size-3" />
10271
- )}
10336
+ <IconHandClick className="size-3" />
10272
10337
  </button>
10273
10338
  ) : null}
10274
10339
  <span
@@ -10917,12 +10982,24 @@ function isInteractiveScreenContentTarget(target: EventTarget | null) {
10917
10982
  );
10918
10983
  }
10919
10984
 
10920
- function mutePreviewIframePointerEvents(root: HTMLElement | null) {
10985
+ /**
10986
+ * `except` (the iframe a cross-screen drag STARTED in) must keep its pointer
10987
+ * events: its bridge owns the gesture — the lift visual, the move/end posts
10988
+ * this canvas finalizes on — and muting it hands the whole event stream to the
10989
+ * parent mid-drag, which silently drops the drop. Every OTHER preview iframe
10990
+ * still gets muted, which is the point: an unmuted cross-origin screen frame
10991
+ * swallows the pointer the moment the drag crosses into it.
10992
+ */
10993
+ function mutePreviewIframePointerEvents(
10994
+ root: HTMLElement | null,
10995
+ except?: HTMLIFrameElement | null,
10996
+ ) {
10921
10997
  if (!root) return () => {};
10922
10998
  const previous = new Map<HTMLIFrameElement, string>();
10923
10999
  root
10924
11000
  .querySelectorAll<HTMLIFrameElement>("[data-design-preview-iframe]")
10925
11001
  .forEach((iframe) => {
11002
+ if (iframe === except) return;
10926
11003
  previous.set(iframe, iframe.style.pointerEvents);
10927
11004
  iframe.style.pointerEvents = "none";
10928
11005
  });