@agent-native/core 0.129.2 → 0.130.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (634) 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/a2a-continuation-processor.ts +481 -122
  54. package/corpus/core/src/integrations/a2a-continuations-store.ts +345 -14
  55. package/corpus/core/src/integrations/adapters/slack.ts +243 -53
  56. package/corpus/core/src/integrations/google-docs-poller.ts +3 -0
  57. package/corpus/core/src/integrations/integration-campaign-recovery.ts +4 -1
  58. package/corpus/core/src/integrations/plugin.ts +39 -21
  59. package/corpus/core/src/integrations/task-queue-stats.ts +146 -0
  60. package/corpus/core/src/integrations/types.ts +25 -4
  61. package/corpus/core/src/integrations/webhook-handler.ts +46 -16
  62. package/corpus/core/src/jobs/scheduler.ts +4 -0
  63. package/corpus/core/src/localization/default-messages.ts +3 -2
  64. package/corpus/core/src/observability/traces.ts +48 -12
  65. package/corpus/core/src/org/handlers.ts +52 -1
  66. package/corpus/core/src/org/migrations.ts +4 -0
  67. package/corpus/core/src/org/plugin.ts +14 -0
  68. package/corpus/core/src/org/schema.ts +1 -0
  69. package/corpus/core/src/org/types.ts +8 -0
  70. package/corpus/core/src/org/workspace-url.ts +74 -0
  71. package/corpus/core/src/resources/handlers.ts +35 -5
  72. package/corpus/core/src/scripts/runner.ts +183 -5
  73. package/corpus/core/src/server/action-routes.ts +32 -2
  74. package/corpus/core/src/server/agent-chat-plugin.ts +29 -0
  75. package/corpus/core/src/server/agent-teams.ts +10 -1
  76. package/corpus/core/src/server/auth.ts +33 -7
  77. package/corpus/core/src/server/embed-route.ts +9 -0
  78. package/corpus/core/src/server/embed-session.ts +62 -3
  79. package/corpus/core/src/server/open-route.ts +20 -6
  80. package/corpus/core/src/server/prompts/framework-core-compact.ts +1 -1
  81. package/corpus/core/src/server/prompts/framework-core.ts +1 -0
  82. package/corpus/core/src/server/request-context.ts +36 -1
  83. package/corpus/core/src/shared/embed-auth.ts +1 -0
  84. package/corpus/core/src/shared/html-document.ts +115 -0
  85. package/corpus/core/src/shared/index.ts +1 -0
  86. package/corpus/core/src/sharing/access.ts +8 -1
  87. package/corpus/core/src/sharing/registry.ts +11 -2
  88. package/corpus/core/src/workspace-files/actions.ts +100 -0
  89. package/corpus/core/src/workspace-files/tool.ts +4 -0
  90. package/corpus/templates/analytics/.agents/skills/analysis-workspace/SKILL.md +4 -0
  91. package/corpus/templates/analytics/.agents/skills/hubspot/SKILL.md +9 -1
  92. package/corpus/templates/analytics/AGENTS.md +17 -24
  93. package/corpus/templates/analytics/actions/data-source-status.ts +11 -1
  94. package/corpus/templates/analytics/app/i18n-data.ts +34 -0
  95. package/corpus/templates/analytics/app/lib/data-source-status.ts +86 -0
  96. package/corpus/templates/analytics/app/lib/native-mcp-exclusions.ts +9 -0
  97. package/corpus/templates/analytics/app/pages/DataSources.tsx +184 -20
  98. package/corpus/templates/analytics/changelog/2026-07-28-native-analytics-data-sources-no-longer-show-duplicate-mc.md +6 -0
  99. package/corpus/templates/analytics/changelog/2026-07-29-exports-now-appear-in-chat-with-a-direct-download-instead-of.md +6 -0
  100. package/corpus/templates/analytics/changelog/2026-07-29-queued-chat-prompts-no-longer-resend-after-analytics-navigat.md +6 -0
  101. package/corpus/templates/analytics/changelog/2026-07-29-scheduled-dashboard-emails-load-every-panel-reliably-without.md +6 -0
  102. package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +6 -3
  103. package/corpus/templates/analytics/server/lib/credential-keys.ts +1 -1
  104. package/corpus/templates/analytics/server/lib/hubspot.ts +1 -1
  105. package/corpus/templates/analytics/server/lib/provider-credentials.ts +55 -1
  106. package/corpus/templates/analytics/server/plugins/agent-chat.ts +123 -27
  107. package/corpus/templates/analytics/server/routes/[...page].get.ts +2 -7
  108. package/corpus/templates/analytics/vite.config.ts +7 -0
  109. package/corpus/templates/brain/actions/list-connection-providers.ts +100 -2
  110. package/corpus/templates/brain/app/lib/brain.ts +10 -0
  111. package/corpus/templates/brain/app/routes/sources.tsx +15 -4
  112. package/corpus/templates/brain/changelog/2026-07-29-brain-automatically-retries-failed-source-syncs-and-guides-y.md +6 -0
  113. package/corpus/templates/brain/jobs/process-ingest-queue.ts +13 -0
  114. package/corpus/templates/brain/server/jobs/sync-sources.ts +27 -22
  115. package/corpus/templates/brain/server/plugins/agent-chat.ts +2 -1
  116. package/corpus/templates/brain/server/routes/api/brain/queue/run.post.ts +7 -1
  117. package/corpus/templates/clips/AGENTS.md +1 -1
  118. package/corpus/templates/clips/actions/create-recording-agent-link.ts +11 -1
  119. package/corpus/templates/clips/actions/update-comment.ts +68 -0
  120. package/corpus/templates/clips/app/components/editor/editor-layout.tsx +0 -1
  121. package/corpus/templates/clips/app/components/player/comments-panel.tsx +221 -65
  122. package/corpus/templates/clips/app/components/player/video-player.tsx +101 -27
  123. package/corpus/templates/clips/app/i18n/en-US.ts +2 -1
  124. package/corpus/templates/clips/app/routes/bug-report.done.tsx +48 -27
  125. package/corpus/templates/clips/app/routes/bug-report.tsx +43 -4
  126. package/corpus/templates/clips/app/routes/record.tsx +2 -0
  127. package/corpus/templates/clips/changelog/2026-07-29-clip-playback-now-recovers-instead-of-getting-stuck-when-a-b.md +6 -0
  128. package/corpus/templates/clips/changelog/2026-07-29-comments-can-now-be-edited-after-posting.md +6 -0
  129. package/corpus/templates/clips/changelog/2026-07-29-download-actions-now-use-a-shorter-clearer-label.md +6 -0
  130. package/corpus/templates/clips/changelog/2026-07-29-embedded-bug-reports-now-return-a-temporary-agent-readable.md +6 -0
  131. package/corpus/templates/clips/shared/bug-report.ts +99 -0
  132. package/corpus/templates/content/actions/_content-database-personal-view.ts +7 -1
  133. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +5 -2
  134. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +20 -8
  135. package/corpus/templates/content/changelog/2026-07-29-missing-databases-no-longer-trigger-repeated-personal-view-e.md +6 -0
  136. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +83 -47
  137. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +474 -55
  138. package/corpus/templates/design/.generated/bridge/embedded-wheel.generated.ts +3 -0
  139. package/corpus/templates/design/.generated/bridge/hit-test.generated.ts +18 -1
  140. package/corpus/templates/design/.generated/bridge/source-location.generated.ts +348 -0
  141. package/corpus/templates/design/actions/add-localhost-screens.ts +2 -7
  142. package/corpus/templates/design/actions/apply-visual-edit.ts +7 -1
  143. package/corpus/templates/design/actions/connect-localhost.ts +5 -9
  144. package/corpus/templates/design/actions/create-component.ts +16 -13
  145. package/corpus/templates/design/actions/grant-localhost-write-consent.ts +2 -7
  146. package/corpus/templates/design/actions/list-design-source-capabilities.ts +4 -7
  147. package/corpus/templates/design/actions/list-local-files.ts +26 -50
  148. package/corpus/templates/design/actions/list-localhost-connections.ts +2 -7
  149. package/corpus/templates/design/actions/migrate-board-objects-to-file.ts +2 -2
  150. package/corpus/templates/design/actions/open-visual-edit.ts +234 -135
  151. package/corpus/templates/design/actions/read-local-file.ts +26 -50
  152. package/corpus/templates/design/actions/request-localhost-write-consent.ts +2 -7
  153. package/corpus/templates/design/actions/write-local-file.ts +31 -73
  154. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +307 -133
  155. package/corpus/templates/design/app/components/design/EditPanel.tsx +94 -22
  156. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +137 -60
  157. package/corpus/templates/design/app/components/design/ResponsiveInteractBar.tsx +75 -14
  158. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +755 -97
  159. package/corpus/templates/design/app/components/design/bridge/embedded-wheel.bridge.ts +8 -0
  160. package/corpus/templates/design/app/components/design/bridge/hit-test.bridge.ts +24 -1
  161. package/corpus/templates/design/app/components/design/bridge/source-location.bridge.ts +530 -0
  162. package/corpus/templates/design/app/components/design/code-workbench/CodeWorkbenchLoader.tsx +278 -0
  163. package/corpus/templates/design/app/components/design/code-workbench/editor/MonacoHost.tsx +32 -12
  164. package/corpus/templates/design/app/components/design/code-workbench/editor/monaco-setup.ts +14 -3
  165. package/corpus/templates/design/app/components/design/code-workbench/explorer/ExplorerView.tsx +87 -24
  166. package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +36 -0
  167. package/corpus/templates/design/app/components/design/code-workbench/store.tsx +2 -1
  168. package/corpus/templates/design/app/components/design/code-workbench/workspace/localhost-provider.ts +48 -8
  169. package/corpus/templates/design/app/components/design/design-canvas/content-size-report.ts +3 -13
  170. package/corpus/templates/design/app/components/design/design-canvas/embedded-frame.ts +4 -2
  171. package/corpus/templates/design/app/components/design/design-canvas/hit-test.ts +3 -13
  172. package/corpus/templates/design/app/components/design/edit-panel/element-classification.ts +3 -1
  173. package/corpus/templates/design/app/components/design/edit-panel/inspect-code-source.ts +93 -0
  174. package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +4 -2
  175. package/corpus/templates/design/app/components/design/multi-screen/cross-screen-drop.ts +35 -0
  176. package/corpus/templates/design/app/components/design/multi-screen/iframe-targeting.ts +24 -0
  177. package/corpus/templates/design/app/components/design/multi-screen/types.ts +9 -0
  178. package/corpus/templates/design/app/components/design/types.ts +29 -0
  179. package/corpus/templates/design/app/components/layout/Layout.tsx +7 -4
  180. package/corpus/templates/design/app/hooks/use-navigation-state.ts +3 -0
  181. package/corpus/templates/design/app/i18n-data.ts +153 -46
  182. package/corpus/templates/design/app/i18n-responsive-interact.ts +12 -12
  183. package/corpus/templates/design/app/lib/design-editor-route.ts +23 -0
  184. package/corpus/templates/design/app/pages/VisualEdit.tsx +19 -6
  185. package/corpus/templates/design/app/pages/design-editor/action-error.ts +19 -0
  186. package/corpus/templates/design/app/pages/design-editor/canvas-primitive-insert.ts +29 -0
  187. package/corpus/templates/design/app/pages/design-editor/clone-and-pen-edit.ts +6 -0
  188. package/corpus/templates/design/app/pages/design-editor/code-layer-state.ts +277 -15
  189. package/corpus/templates/design/app/pages/design-editor/editor-state.ts +75 -9
  190. package/corpus/templates/design/app/pages/design-editor/layer-state-scope.ts +28 -0
  191. package/corpus/templates/design/app/pages/design-editor/live-screen-layer-drop.ts +41 -0
  192. package/corpus/templates/design/app/pages/design-editor/pending-edits.ts +496 -41
  193. package/corpus/templates/design/app/pages/design-editor/pending-live-edit-unload-guard.ts +27 -0
  194. package/corpus/templates/design/app/pages/design-editor/pending-structure-verification.ts +10 -0
  195. package/corpus/templates/design/app/pages/design-editor/react-semantic-handoff.ts +168 -9
  196. package/corpus/templates/design/app/pages/design-editor/responsive-interact.ts +41 -3
  197. package/corpus/templates/design/app/pages/design-editor/screen-command-utils.ts +5 -0
  198. package/corpus/templates/design/app/pages/design-editor/selection-state.ts +42 -13
  199. package/corpus/templates/design/app/pages/design-editor/source-location.ts +180 -0
  200. package/corpus/templates/design/app/pages/design-editor/tool-state.ts +17 -0
  201. package/corpus/templates/design/app/public-routes.ts +1 -0
  202. package/corpus/templates/design/app/routes/visual-edit.$id.tsx +15 -0
  203. package/corpus/templates/design/changelog/2026-06-29-screen-overview-is-easier-to-find-and-named-screens-open-dir.md +1 -1
  204. package/corpus/templates/design/changelog/2026-07-28-deleting-a-selected-element-now-removes-it-from-the-live-pre.md +6 -0
  205. package/corpus/templates/design/changelog/2026-07-28-deleting-an-element-on-a-connected-localhost-screen-now-queu.md +6 -0
  206. package/corpus/templates/design/changelog/2026-07-28-interact-mode-now-shows-a-responsive-device-preview-with-pre.md +6 -0
  207. package/corpus/templates/design/changelog/2026-07-28-layer-hide-and-lock-now-apply-to-the-live-preview-instead-of.md +6 -0
  208. package/corpus/templates/design/changelog/2026-07-28-layers-panel-selections-on-a-connected-localhost-screen-can-.md +6 -0
  209. package/corpus/templates/design/changelog/2026-07-28-locked-layers-now-show-a-subtle-dashed-outline-in-the-live-p.md +6 -0
  210. package/corpus/templates/design/changelog/2026-07-28-the-apply-design-updates-button-now-counts-pending-live-text.md +6 -0
  211. package/corpus/templates/design/changelog/2026-07-28-the-design-canvas-no-longer-stalls-on-a-render-loop-while-a-.md +6 -0
  212. package/corpus/templates/design/changelog/2026-07-28-visual-edit-on-a-local-dev-server-no-longer-requires-signing.md +6 -0
  213. package/corpus/templates/design/changelog/2026-07-28-visual-edits-on-a-react-19-app-no-longer-report-a-source-lin.md +6 -0
  214. package/corpus/templates/design/changelog/2026-07-29-an-edit-that-cannot-be-written-to-source-now-names-the-reaso.md +6 -0
  215. package/corpus/templates/design/changelog/2026-07-29-applying-a-primitive-dropped-onto-a-connected-localhost-scre.md +6 -0
  216. package/corpus/templates/design/changelog/2026-07-29-changing-a-style-in-the-inspector-now-updates-a-connected-lo.md +6 -0
  217. package/corpus/templates/design/changelog/2026-07-29-choosing-edit-or-annotate-from-a-focused-screen-now-returns-.md +6 -0
  218. package/corpus/templates/design/changelog/2026-07-29-concurrent-source-edits-now-return-a-clear-conflict-response.md +6 -0
  219. package/corpus/templates/design/changelog/2026-07-29-creating-a-component-from-an-element-that-repeats-in-the-sou.md +6 -0
  220. package/corpus/templates/design/changelog/2026-07-29-deleting-an-element-you-just-dropped-onto-a-live-screen-no-l.md +6 -0
  221. package/corpus/templates/design/changelog/2026-07-29-dragging-a-layer-across-screens-no-longer-dies-when-the-poin.md +6 -0
  222. package/corpus/templates/design/changelog/2026-07-29-dragging-an-element-from-a-stored-screen-into-a-live-localho.md +6 -0
  223. package/corpus/templates/design/changelog/2026-07-29-drawing-a-box-on-the-canvas-and-dragging-it-into-a-connected.md +6 -0
  224. package/corpus/templates/design/changelog/2026-07-29-fixed-a-loading-screen-flicker-when-reopening-designs-with-a.md +6 -0
  225. package/corpus/templates/design/changelog/2026-07-29-interact-mode-has-edit-and-annotate-buttons-again-so-you-can.md +6 -0
  226. package/corpus/templates/design/changelog/2026-07-29-layer-groups-can-be-dropped-onto-live-localhost-screens.md +6 -0
  227. package/corpus/templates/design/changelog/2026-07-29-localhost-source-errors-now-say-what-actually-went-wrong-whi.md +6 -0
  228. package/corpus/templates/design/changelog/2026-07-29-opening-or-refreshing-a-live-localhost-screen-in-single-scre.md +6 -0
  229. package/corpus/templates/design/changelog/2026-07-29-redo-after-undoing-a-drop-onto-a-live-screen-puts-the-elemen.md +6 -0
  230. package/corpus/templates/design/changelog/2026-07-29-shapes-can-be-drawn-directly-onto-live-localhost-screens.md +6 -0
  231. package/corpus/templates/design/changelog/2026-07-29-shapes-drawn-on-the-canvas-board-now-appear-immediately-inst.md +6 -0
  232. package/corpus/templates/design/changelog/2026-07-29-style-edits-on-a-running-localhost-screen-now-preview-live-a.md +6 -0
  233. package/corpus/templates/design/changelog/2026-07-29-the-apply-design-updates-control-now-appears-as-a-clean-conn.md +6 -0
  234. package/corpus/templates/design/changelog/2026-07-29-visual-edits-on-a-mapped-component-instance-now-tell-the-age.md +6 -0
  235. package/corpus/templates/design/server/lib/design-data-access.ts +21 -7
  236. package/corpus/templates/design/server/lib/localhost-connection.ts +240 -0
  237. package/corpus/templates/design/server/routes/[...page].get.ts +2 -5
  238. package/corpus/templates/design/server/source-workspace.ts +2 -0
  239. package/corpus/templates/design/shared/code-layer.ts +43 -0
  240. package/corpus/templates/design/shared/html-content.ts +26 -0
  241. package/corpus/templates/design/shared/html-integrity.ts +21 -1
  242. package/corpus/templates/design/shared/local-jsx-visual-edit.ts +15 -0
  243. package/corpus/templates/design/shared/source-mode.ts +76 -0
  244. package/corpus/templates/dispatch/changelog/2026-07-26-slack-replies-recover-after-connected-app-updates.md +6 -0
  245. package/corpus/templates/dispatch/changelog/2026-07-29-workspace-members-without-admin-access-now-see-a-clear-permi.md +6 -0
  246. package/corpus/templates/dispatch/server/lib/usage-metrics.ts +2 -1
  247. package/corpus/templates/plan/app/lib/plan-annotation-runtime.ts +3 -4
  248. package/corpus/templates/plan/server/routes/[...page].get.ts +2 -5
  249. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +15 -0
  250. package/corpus/templates/slides/actions/delete-design-system.ts +145 -0
  251. package/corpus/templates/slides/actions/list-design-systems.ts +94 -2
  252. package/corpus/templates/slides/actions/patch-deck.ts +29 -17
  253. package/corpus/templates/slides/app/components/design-system/DesignSystemCard.tsx +43 -1
  254. package/corpus/templates/slides/app/hooks/use-design-systems.ts +2 -0
  255. package/corpus/templates/slides/app/i18n/en-US.ts +7 -0
  256. package/corpus/templates/slides/app/pages/DesignSystems.tsx +56 -1
  257. package/corpus/templates/slides/changelog/2026-07-28-delete-a-design-system-you-own-from-the-design-systems-page-.md +6 -0
  258. package/corpus/toolkit/CHANGELOG.md +6 -0
  259. package/corpus/toolkit/package.json +1 -1
  260. package/corpus/toolkit/src/composer/ComposerPlusMenu.tsx +3 -2
  261. package/dist/action-ui.d.ts +1 -0
  262. package/dist/action-ui.d.ts.map +1 -1
  263. package/dist/action-ui.js +1 -0
  264. package/dist/action-ui.js.map +1 -1
  265. package/dist/action.d.ts +5 -1
  266. package/dist/action.d.ts.map +1 -1
  267. package/dist/action.js.map +1 -1
  268. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  269. package/dist/agent/engine/ai-sdk-engine.js +13 -5
  270. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  271. package/dist/agent/harness/runner.d.ts.map +1 -1
  272. package/dist/agent/harness/runner.js +5 -0
  273. package/dist/agent/harness/runner.js.map +1 -1
  274. package/dist/agent/production-agent.d.ts +16 -0
  275. package/dist/agent/production-agent.d.ts.map +1 -1
  276. package/dist/agent/production-agent.js +18 -1
  277. package/dist/agent/production-agent.js.map +1 -1
  278. package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
  279. package/dist/agent/run-loop-with-resume.js +6 -0
  280. package/dist/agent/run-loop-with-resume.js.map +1 -1
  281. package/dist/agent/run-manager.d.ts +14 -0
  282. package/dist/agent/run-manager.d.ts.map +1 -1
  283. package/dist/agent/run-manager.js +91 -1
  284. package/dist/agent/run-manager.js.map +1 -1
  285. package/dist/agent/thread-data-builder.d.ts +3 -0
  286. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  287. package/dist/agent/thread-data-builder.js +35 -3
  288. package/dist/agent/thread-data-builder.js.map +1 -1
  289. package/dist/agent/types.d.ts +2 -0
  290. package/dist/agent/types.d.ts.map +1 -1
  291. package/dist/agent/types.js.map +1 -1
  292. package/dist/chat-threads/store.d.ts.map +1 -1
  293. package/dist/chat-threads/store.js +4 -6
  294. package/dist/chat-threads/store.js.map +1 -1
  295. package/dist/cli/create.d.ts +66 -6
  296. package/dist/cli/create.d.ts.map +1 -1
  297. package/dist/cli/create.js +765 -66
  298. package/dist/cli/create.js.map +1 -1
  299. package/dist/cli/design-connect.d.ts.map +1 -1
  300. package/dist/cli/design-connect.js +2 -7
  301. package/dist/cli/design-connect.js.map +1 -1
  302. package/dist/cli/index.js +5 -3
  303. package/dist/cli/index.js.map +1 -1
  304. package/dist/cli/skills-content/design-visual-edit-skill.d.ts +1 -1
  305. package/dist/cli/skills-content/design-visual-edit-skill.d.ts.map +1 -1
  306. package/dist/cli/skills-content/design-visual-edit-skill.js +83 -47
  307. package/dist/cli/skills-content/design-visual-edit-skill.js.map +1 -1
  308. package/dist/client/AssistantChat.d.ts.map +1 -1
  309. package/dist/client/AssistantChat.js +16 -9
  310. package/dist/client/AssistantChat.js.map +1 -1
  311. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  312. package/dist/client/agent-chat-adapter.js +21 -0
  313. package/dist/client/agent-chat-adapter.js.map +1 -1
  314. package/dist/client/blocks/library/wireframe-kit.d.ts +2 -0
  315. package/dist/client/blocks/library/wireframe-kit.d.ts.map +1 -1
  316. package/dist/client/blocks/library/wireframe-kit.js +8 -2
  317. package/dist/client/blocks/library/wireframe-kit.js.map +1 -1
  318. package/dist/client/chat/index.d.ts +1 -1
  319. package/dist/client/chat/index.d.ts.map +1 -1
  320. package/dist/client/chat/index.js +1 -1
  321. package/dist/client/chat/index.js.map +1 -1
  322. package/dist/client/chat/message-components.d.ts +17 -0
  323. package/dist/client/chat/message-components.d.ts.map +1 -1
  324. package/dist/client/chat/message-components.js +24 -2
  325. package/dist/client/chat/message-components.js.map +1 -1
  326. package/dist/client/chat/run-recovery.d.ts +6 -0
  327. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  328. package/dist/client/chat/run-recovery.js +13 -3
  329. package/dist/client/chat/run-recovery.js.map +1 -1
  330. package/dist/client/chat/widgets/DataTableWidget.d.ts.map +1 -1
  331. package/dist/client/chat/widgets/DataTableWidget.js +2 -3
  332. package/dist/client/chat/widgets/DataTableWidget.js.map +1 -1
  333. package/dist/client/chat/widgets/WorkspaceFileWidget.d.ts +5 -0
  334. package/dist/client/chat/widgets/WorkspaceFileWidget.d.ts.map +1 -0
  335. package/dist/client/chat/widgets/WorkspaceFileWidget.js +34 -0
  336. package/dist/client/chat/widgets/WorkspaceFileWidget.js.map +1 -0
  337. package/dist/client/chat/widgets/builtin-tool-renderers.d.ts.map +1 -1
  338. package/dist/client/chat/widgets/builtin-tool-renderers.js +13 -1
  339. package/dist/client/chat/widgets/builtin-tool-renderers.js.map +1 -1
  340. package/dist/client/chat/widgets/workspace-file-result.d.ts +12 -0
  341. package/dist/client/chat/widgets/workspace-file-result.d.ts.map +1 -0
  342. package/dist/client/chat/widgets/workspace-file-result.js +34 -0
  343. package/dist/client/chat/widgets/workspace-file-result.js.map +1 -0
  344. package/dist/client/embed-auth.d.ts.map +1 -1
  345. package/dist/client/embed-auth.js +2 -1
  346. package/dist/client/embed-auth.js.map +1 -1
  347. package/dist/client/org/InvitationBanner.d.ts +5 -2
  348. package/dist/client/org/InvitationBanner.d.ts.map +1 -1
  349. package/dist/client/org/InvitationBanner.js +9 -2
  350. package/dist/client/org/InvitationBanner.js.map +1 -1
  351. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  352. package/dist/client/org/OrgSwitcher.js +3 -2
  353. package/dist/client/org/OrgSwitcher.js.map +1 -1
  354. package/dist/client/org/TeamPage.d.ts.map +1 -1
  355. package/dist/client/org/TeamPage.js +27 -3
  356. package/dist/client/org/TeamPage.js.map +1 -1
  357. package/dist/client/org/WorkspaceNotice.d.ts +18 -0
  358. package/dist/client/org/WorkspaceNotice.d.ts.map +1 -0
  359. package/dist/client/org/WorkspaceNotice.js +56 -0
  360. package/dist/client/org/WorkspaceNotice.js.map +1 -0
  361. package/dist/client/org/hooks.d.ts +1 -0
  362. package/dist/client/org/hooks.d.ts.map +1 -1
  363. package/dist/client/org/hooks.js +12 -0
  364. package/dist/client/org/hooks.js.map +1 -1
  365. package/dist/client/org/index.d.ts +2 -1
  366. package/dist/client/org/index.d.ts.map +1 -1
  367. package/dist/client/org/index.js +2 -1
  368. package/dist/client/org/index.js.map +1 -1
  369. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  370. package/dist/client/resources/McpIntegrationDialog.js +8 -12
  371. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  372. package/dist/client/resources/ResourcesPanel.d.ts +3 -0
  373. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  374. package/dist/client/resources/ResourcesPanel.js +49 -20
  375. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  376. package/dist/client/resources/mcp-integration-catalog.d.ts +1 -0
  377. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  378. package/dist/client/resources/mcp-integration-catalog.js +3 -0
  379. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  380. package/dist/client/resources/use-resources.d.ts +1 -0
  381. package/dist/client/resources/use-resources.d.ts.map +1 -1
  382. package/dist/client/resources/use-resources.js +3 -0
  383. package/dist/client/resources/use-resources.js.map +1 -1
  384. package/dist/client/use-action.d.ts +3 -1
  385. package/dist/client/use-action.d.ts.map +1 -1
  386. package/dist/client/use-action.js +3 -1
  387. package/dist/client/use-action.js.map +1 -1
  388. package/dist/client/widgets/index.d.ts +1 -1
  389. package/dist/client/widgets/index.d.ts.map +1 -1
  390. package/dist/client/widgets/index.js +1 -1
  391. package/dist/client/widgets/index.js.map +1 -1
  392. package/dist/coding-tools/run-code.js +2 -1
  393. package/dist/coding-tools/run-code.js.map +1 -1
  394. package/dist/collab/awareness.d.ts +2 -2
  395. package/dist/collab/awareness.d.ts.map +1 -1
  396. package/dist/collab/struct-routes.d.ts +1 -1
  397. package/dist/db/client.d.ts +1 -0
  398. package/dist/db/client.d.ts.map +1 -1
  399. package/dist/db/client.js +24 -3
  400. package/dist/db/client.js.map +1 -1
  401. package/dist/deploy/build.d.ts.map +1 -1
  402. package/dist/deploy/build.js +25 -3
  403. package/dist/deploy/build.js.map +1 -1
  404. package/dist/eject/remote-mcp-presets.js +1 -1
  405. package/dist/eject/remote-mcp-presets.js.map +1 -1
  406. package/dist/index.browser.d.ts +1 -1
  407. package/dist/index.browser.d.ts.map +1 -1
  408. package/dist/index.browser.js +1 -1
  409. package/dist/index.browser.js.map +1 -1
  410. package/dist/index.d.ts +1 -1
  411. package/dist/index.d.ts.map +1 -1
  412. package/dist/index.js +1 -1
  413. package/dist/index.js.map +1 -1
  414. package/dist/integrations/a2a-continuation-processor.d.ts +5 -0
  415. package/dist/integrations/a2a-continuation-processor.d.ts.map +1 -1
  416. package/dist/integrations/a2a-continuation-processor.js +293 -79
  417. package/dist/integrations/a2a-continuation-processor.js.map +1 -1
  418. package/dist/integrations/a2a-continuations-store.d.ts +23 -1
  419. package/dist/integrations/a2a-continuations-store.d.ts.map +1 -1
  420. package/dist/integrations/a2a-continuations-store.js +249 -15
  421. package/dist/integrations/a2a-continuations-store.js.map +1 -1
  422. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  423. package/dist/integrations/adapters/slack.js +155 -31
  424. package/dist/integrations/adapters/slack.js.map +1 -1
  425. package/dist/integrations/google-docs-poller.d.ts.map +1 -1
  426. package/dist/integrations/google-docs-poller.js +4 -1
  427. package/dist/integrations/google-docs-poller.js.map +1 -1
  428. package/dist/integrations/integration-campaign-recovery.d.ts.map +1 -1
  429. package/dist/integrations/integration-campaign-recovery.js +3 -1
  430. package/dist/integrations/integration-campaign-recovery.js.map +1 -1
  431. package/dist/integrations/plugin.d.ts.map +1 -1
  432. package/dist/integrations/plugin.js +29 -12
  433. package/dist/integrations/plugin.js.map +1 -1
  434. package/dist/integrations/task-queue-stats.d.ts +12 -0
  435. package/dist/integrations/task-queue-stats.d.ts.map +1 -1
  436. package/dist/integrations/task-queue-stats.js +106 -0
  437. package/dist/integrations/task-queue-stats.js.map +1 -1
  438. package/dist/integrations/types.d.ts +24 -6
  439. package/dist/integrations/types.d.ts.map +1 -1
  440. package/dist/integrations/types.js.map +1 -1
  441. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  442. package/dist/integrations/webhook-handler.js +35 -14
  443. package/dist/integrations/webhook-handler.js.map +1 -1
  444. package/dist/jobs/scheduler.js +4 -0
  445. package/dist/jobs/scheduler.js.map +1 -1
  446. package/dist/localization/default-messages.d.ts +3 -2
  447. package/dist/localization/default-messages.d.ts.map +1 -1
  448. package/dist/localization/default-messages.js +3 -2
  449. package/dist/localization/default-messages.js.map +1 -1
  450. package/dist/notifications/routes.d.ts +1 -1
  451. package/dist/observability/traces.d.ts.map +1 -1
  452. package/dist/observability/traces.js +27 -7
  453. package/dist/observability/traces.js.map +1 -1
  454. package/dist/org/handlers.d.ts +15 -0
  455. package/dist/org/handlers.d.ts.map +1 -1
  456. package/dist/org/handlers.js +45 -1
  457. package/dist/org/handlers.js.map +1 -1
  458. package/dist/org/migrations.d.ts.map +1 -1
  459. package/dist/org/migrations.js +4 -0
  460. package/dist/org/migrations.js.map +1 -1
  461. package/dist/org/plugin.d.ts +1 -0
  462. package/dist/org/plugin.d.ts.map +1 -1
  463. package/dist/org/plugin.js +10 -1
  464. package/dist/org/plugin.js.map +1 -1
  465. package/dist/org/schema.d.ts +19 -0
  466. package/dist/org/schema.d.ts.map +1 -1
  467. package/dist/org/schema.js +1 -0
  468. package/dist/org/schema.js.map +1 -1
  469. package/dist/org/types.d.ts +8 -0
  470. package/dist/org/types.d.ts.map +1 -1
  471. package/dist/org/types.js.map +1 -1
  472. package/dist/org/workspace-url.d.ts +32 -0
  473. package/dist/org/workspace-url.d.ts.map +1 -0
  474. package/dist/org/workspace-url.js +63 -0
  475. package/dist/org/workspace-url.js.map +1 -0
  476. package/dist/provider-api/actions/custom-provider-registration.d.ts +11 -11
  477. package/dist/provider-api/actions/provider-api.d.ts +7 -7
  478. package/dist/resources/handlers.d.ts +3 -4
  479. package/dist/resources/handlers.d.ts.map +1 -1
  480. package/dist/resources/handlers.js +25 -5
  481. package/dist/resources/handlers.js.map +1 -1
  482. package/dist/scripts/runner.d.ts +17 -0
  483. package/dist/scripts/runner.d.ts.map +1 -1
  484. package/dist/scripts/runner.js +130 -5
  485. package/dist/scripts/runner.js.map +1 -1
  486. package/dist/secrets/routes.d.ts +9 -9
  487. package/dist/server/action-routes.d.ts.map +1 -1
  488. package/dist/server/action-routes.js +24 -2
  489. package/dist/server/action-routes.js.map +1 -1
  490. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  491. package/dist/server/agent-chat-plugin.js +26 -1
  492. package/dist/server/agent-chat-plugin.js.map +1 -1
  493. package/dist/server/agent-teams.d.ts.map +1 -1
  494. package/dist/server/agent-teams.js +10 -1
  495. package/dist/server/agent-teams.js.map +1 -1
  496. package/dist/server/auth.d.ts +22 -0
  497. package/dist/server/auth.d.ts.map +1 -1
  498. package/dist/server/auth.js +33 -7
  499. package/dist/server/auth.js.map +1 -1
  500. package/dist/server/embed-route.d.ts.map +1 -1
  501. package/dist/server/embed-route.js +6 -1
  502. package/dist/server/embed-route.js.map +1 -1
  503. package/dist/server/embed-session.d.ts +7 -0
  504. package/dist/server/embed-session.d.ts.map +1 -1
  505. package/dist/server/embed-session.js +46 -4
  506. package/dist/server/embed-session.js.map +1 -1
  507. package/dist/server/open-route.d.ts.map +1 -1
  508. package/dist/server/open-route.js +17 -7
  509. package/dist/server/open-route.js.map +1 -1
  510. package/dist/server/prompts/framework-core-compact.js +1 -1
  511. package/dist/server/prompts/framework-core-compact.js.map +1 -1
  512. package/dist/server/prompts/framework-core.d.ts.map +1 -1
  513. package/dist/server/prompts/framework-core.js +1 -0
  514. package/dist/server/prompts/framework-core.js.map +1 -1
  515. package/dist/server/request-context.d.ts +26 -0
  516. package/dist/server/request-context.d.ts.map +1 -1
  517. package/dist/server/request-context.js +18 -1
  518. package/dist/server/request-context.js.map +1 -1
  519. package/dist/shared/embed-auth.d.ts +1 -0
  520. package/dist/shared/embed-auth.d.ts.map +1 -1
  521. package/dist/shared/embed-auth.js +1 -0
  522. package/dist/shared/embed-auth.js.map +1 -1
  523. package/dist/shared/html-document.d.ts +12 -0
  524. package/dist/shared/html-document.d.ts.map +1 -0
  525. package/dist/shared/html-document.js +92 -0
  526. package/dist/shared/html-document.js.map +1 -0
  527. package/dist/shared/index.d.ts +1 -0
  528. package/dist/shared/index.d.ts.map +1 -1
  529. package/dist/shared/index.js +1 -0
  530. package/dist/shared/index.js.map +1 -1
  531. package/dist/sharing/access.d.ts +1 -0
  532. package/dist/sharing/access.d.ts.map +1 -1
  533. package/dist/sharing/access.js +8 -2
  534. package/dist/sharing/access.js.map +1 -1
  535. package/dist/sharing/registry.d.ts +3 -0
  536. package/dist/sharing/registry.d.ts.map +1 -1
  537. package/dist/sharing/registry.js.map +1 -1
  538. package/dist/workspace-files/actions.d.ts +28 -0
  539. package/dist/workspace-files/actions.d.ts.map +1 -0
  540. package/dist/workspace-files/actions.js +75 -0
  541. package/dist/workspace-files/actions.js.map +1 -0
  542. package/dist/workspace-files/tool.d.ts.map +1 -1
  543. package/dist/workspace-files/tool.js +4 -0
  544. package/dist/workspace-files/tool.js.map +1 -1
  545. package/docs/content/cloneable-saas.mdx +114 -0
  546. package/docs/content/creating-templates.mdx +28 -2
  547. package/docs/content/syncing-template-changes.mdx +7 -0
  548. package/docs/content/template-clips-developers.mdx +12 -5
  549. package/docs/content/template-dispatch-developers.mdx +1 -1
  550. package/docs/content/template-dispatch.mdx +1 -1
  551. package/package.json +2 -2
  552. package/src/action-ui.ts +1 -0
  553. package/src/action.ts +5 -1
  554. package/src/agent/engine/ai-sdk-engine.ts +15 -5
  555. package/src/agent/harness/runner.ts +5 -0
  556. package/src/agent/production-agent.ts +33 -0
  557. package/src/agent/run-loop-with-resume.ts +5 -0
  558. package/src/agent/run-manager.ts +126 -1
  559. package/src/agent/thread-data-builder.ts +47 -2
  560. package/src/agent/types.ts +2 -0
  561. package/src/chat-threads/store.ts +4 -5
  562. package/src/cli/create.ts +1139 -65
  563. package/src/cli/design-connect.ts +3 -7
  564. package/src/cli/index.ts +5 -3
  565. package/src/cli/skills-content/design-visual-edit-skill.ts +83 -47
  566. package/src/client/AssistantChat.tsx +27 -16
  567. package/src/client/agent-chat-adapter.ts +24 -0
  568. package/src/client/blocks/library/wireframe-kit.tsx +17 -2
  569. package/src/client/chat/index.ts +1 -0
  570. package/src/client/chat/message-components.tsx +104 -1
  571. package/src/client/chat/run-recovery.tsx +15 -3
  572. package/src/client/chat/widgets/DataTableWidget.tsx +10 -29
  573. package/src/client/chat/widgets/WorkspaceFileWidget.tsx +71 -0
  574. package/src/client/chat/widgets/builtin-tool-renderers.tsx +22 -0
  575. package/src/client/chat/widgets/workspace-file-result.ts +49 -0
  576. package/src/client/embed-auth.ts +2 -0
  577. package/src/client/org/InvitationBanner.tsx +14 -1
  578. package/src/client/org/OrgSwitcher.tsx +23 -0
  579. package/src/client/org/TeamPage.tsx +130 -0
  580. package/src/client/org/WorkspaceNotice.tsx +85 -0
  581. package/src/client/org/hooks.ts +14 -0
  582. package/src/client/org/index.ts +2 -0
  583. package/src/client/resources/McpIntegrationDialog.tsx +27 -40
  584. package/src/client/resources/ResourcesPanel.tsx +134 -51
  585. package/src/client/resources/mcp-integration-catalog.ts +7 -0
  586. package/src/client/resources/use-resources.ts +6 -0
  587. package/src/client/use-action.ts +3 -1
  588. package/src/client/widgets/index.ts +1 -0
  589. package/src/coding-tools/run-code.ts +2 -1
  590. package/src/db/client.ts +28 -4
  591. package/src/deploy/build.ts +31 -3
  592. package/src/eject/remote-mcp-presets.ts +1 -1
  593. package/src/index.browser.ts +1 -0
  594. package/src/index.ts +1 -0
  595. package/src/integrations/a2a-continuation-processor.ts +481 -122
  596. package/src/integrations/a2a-continuations-store.ts +345 -14
  597. package/src/integrations/adapters/slack.ts +243 -53
  598. package/src/integrations/google-docs-poller.ts +3 -0
  599. package/src/integrations/integration-campaign-recovery.ts +4 -1
  600. package/src/integrations/plugin.ts +39 -21
  601. package/src/integrations/task-queue-stats.ts +146 -0
  602. package/src/integrations/types.ts +25 -4
  603. package/src/integrations/webhook-handler.ts +46 -16
  604. package/src/jobs/scheduler.ts +4 -0
  605. package/src/localization/default-messages.ts +3 -2
  606. package/src/observability/traces.ts +48 -12
  607. package/src/org/handlers.ts +52 -1
  608. package/src/org/migrations.ts +4 -0
  609. package/src/org/plugin.ts +14 -0
  610. package/src/org/schema.ts +1 -0
  611. package/src/org/types.ts +8 -0
  612. package/src/org/workspace-url.ts +74 -0
  613. package/src/resources/handlers.ts +35 -5
  614. package/src/scripts/runner.ts +183 -5
  615. package/src/server/__snapshots__/agent-chat-plugin.surface.spec.ts.snap +2 -1
  616. package/src/server/action-routes.ts +32 -2
  617. package/src/server/agent-chat-plugin.ts +29 -0
  618. package/src/server/agent-teams.ts +10 -1
  619. package/src/server/auth.ts +33 -7
  620. package/src/server/embed-route.ts +9 -0
  621. package/src/server/embed-session.ts +62 -3
  622. package/src/server/open-route.ts +20 -6
  623. package/src/server/prompts/framework-core-compact.ts +1 -1
  624. package/src/server/prompts/framework-core.ts +1 -0
  625. package/src/server/request-context.ts +36 -1
  626. package/src/shared/embed-auth.ts +1 -0
  627. package/src/shared/html-document.ts +115 -0
  628. package/src/shared/index.ts +1 -0
  629. package/src/sharing/access.ts +8 -1
  630. package/src/sharing/registry.ts +11 -2
  631. package/src/workspace-files/actions.ts +100 -0
  632. package/src/workspace-files/tool.ts +4 -0
  633. package/corpus/templates/design/changelog/2026-07-28-interact-mode-can-preview-designs-in-responsive-device-sizes.md +0 -6
  634. package/corpus/templates/design/changelog/2026-07-28-interact-mode-now-opens-a-full-screen-responsive-preview-wit.md +0 -6
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Parsing and comparison for `organizations.workspace_url` — the origin of an
3
+ * org's own workspace deployment.
4
+ *
5
+ * The value is set by an owner/admin and then rendered as a link target for
6
+ * every member of the org, so it is parsed at the trust boundary rather than
7
+ * on the way out: anything that is not an `http(s)` origin never reaches the
8
+ * database.
9
+ */
10
+
11
+ export type ParsedWorkspaceUrl =
12
+ | { ok: true; url: string }
13
+ | { ok: false; reason: string };
14
+
15
+ /**
16
+ * Normalize a workspace URL to a bare origin (`https://host[:port]`).
17
+ *
18
+ * Path, query, and hash are dropped: this points at a deployment, not a page,
19
+ * and keeping them would send members to a route that may not exist in the
20
+ * app they arrive at.
21
+ */
22
+ export function parseWorkspaceUrl(raw: string): ParsedWorkspaceUrl {
23
+ const trimmed = raw.trim();
24
+ if (!trimmed) {
25
+ return { ok: false, reason: "Workspace URL is empty" };
26
+ }
27
+
28
+ // Accept a bare host ("agent-workspace.builder.io") the way a browser bar
29
+ // does — otherwise the most natural thing to paste is rejected.
30
+ const withScheme = /^[a-z][a-z0-9+.-]*:\/\//i.test(trimmed)
31
+ ? trimmed
32
+ : `https://${trimmed}`;
33
+
34
+ let parsed: URL;
35
+ try {
36
+ parsed = new URL(withScheme);
37
+ } catch {
38
+ return { ok: false, reason: "Not a valid URL" };
39
+ }
40
+
41
+ if (parsed.protocol !== "https:" && parsed.protocol !== "http:") {
42
+ return { ok: false, reason: "Workspace URL must be http or https" };
43
+ }
44
+ if (!parsed.hostname.includes(".") && parsed.hostname !== "localhost") {
45
+ return { ok: false, reason: "Workspace URL must include a full hostname" };
46
+ }
47
+
48
+ return { ok: true, url: parsed.origin };
49
+ }
50
+
51
+ /**
52
+ * Whether a member currently on `currentUrl` should be pointed at the org's
53
+ * workspace. False when the org has no workspace, when the stored value is
54
+ * unusable, or when they are already on it — including any subdomain-free
55
+ * port/scheme difference, which `URL.origin` compares exactly.
56
+ */
57
+ export function shouldOfferWorkspace(
58
+ currentUrl: string,
59
+ workspaceUrl: string | null | undefined,
60
+ ): boolean {
61
+ if (!workspaceUrl) return false;
62
+
63
+ const parsed = parseWorkspaceUrl(workspaceUrl);
64
+ if (!parsed.ok) return false;
65
+
66
+ let currentOrigin: string;
67
+ try {
68
+ currentOrigin = new URL(currentUrl).origin;
69
+ } catch {
70
+ return false;
71
+ }
72
+
73
+ return currentOrigin !== parsed.url;
74
+ }
@@ -72,6 +72,28 @@ function canReadOwner(
72
72
  );
73
73
  }
74
74
 
75
+ function resourceDownloadDisposition(path: string): string {
76
+ const basename = path.replaceAll("\\", "/").split("/").pop()?.trim() || "";
77
+ const filename = Array.from(basename)
78
+ .slice(0, 180)
79
+ .map((character) => {
80
+ const codePoint = character.codePointAt(0) ?? 0;
81
+ return codePoint <= 31 || codePoint === 127 ? "_" : character;
82
+ })
83
+ .join("");
84
+ const safeFilename =
85
+ filename && filename !== "." && filename !== ".." ? filename : "download";
86
+ const asciiFilename = safeFilename
87
+ .replace(/[^\x20-\x7e]/g, "_")
88
+ .replace(/["\\]/g, "_");
89
+ const encodedFilename = encodeURIComponent(safeFilename).replace(
90
+ /['()*]/g,
91
+ (character) => `%${character.charCodeAt(0).toString(16).toUpperCase()}`,
92
+ );
93
+
94
+ return `attachment; filename="${asciiFilename}"; filename*=UTF-8''${encodedFilename}`;
95
+ }
96
+
75
97
  function mergeScopedResources(
76
98
  primary: ResourceMeta[],
77
99
  inherited: ResourceMeta[],
@@ -398,9 +420,8 @@ async function enrichTreeNodes(nodes: TreeNode[]): Promise<void> {
398
420
  }
399
421
 
400
422
  /** GET /_agent-native/resources/:id — get single resource with content.
401
- * If the request comes from an <img>/<video>/etc tag (Accept includes the
402
- * resource's mime type, or query param `?raw` is set), return the raw binary
403
- * with the correct Content-Type so the browser can render it inline. */
423
+ * `?raw` returns the bytes inline; `?download=1` returns the same bytes as a
424
+ * safe attachment. */
404
425
  export async function handleGetResource(event: any) {
405
426
  const id = getRouterParam(event, "id") || event.context.params?.id;
406
427
  if (!id) {
@@ -421,11 +442,11 @@ export async function handleGetResource(event: any) {
421
442
  return { error: "Resource not found" };
422
443
  }
423
444
 
424
- // Serve raw binary when ?raw query param is set (used by <img> tags etc.)
425
445
  const query = getQuery(event);
426
446
  const wantsRaw = query.raw !== undefined;
447
+ const wantsDownload = query.download === "1";
427
448
 
428
- if (wantsRaw && resource.content) {
449
+ if ((wantsRaw || wantsDownload) && typeof resource.content === "string") {
429
450
  const isText =
430
451
  resource.mimeType.startsWith("text/") ||
431
452
  resource.mimeType === "application/json";
@@ -435,6 +456,15 @@ export async function handleGetResource(event: any) {
435
456
 
436
457
  setResponseHeader(event, "Content-Type", resource.mimeType);
437
458
  setResponseHeader(event, "Content-Length", String(buf.length));
459
+ setResponseHeader(event, "Cache-Control", "private, no-store");
460
+ setResponseHeader(event, "X-Content-Type-Options", "nosniff");
461
+ if (wantsDownload) {
462
+ setResponseHeader(
463
+ event,
464
+ "Content-Disposition",
465
+ resourceDownloadDisposition(resource.path),
466
+ );
467
+ }
438
468
  return new Response(buf);
439
469
  }
440
470
 
@@ -11,6 +11,7 @@
11
11
  */
12
12
 
13
13
  import fs from "fs";
14
+ import { spawnSync } from "node:child_process";
14
15
  import path from "path";
15
16
  import { pathToFileURL } from "url";
16
17
 
@@ -29,6 +30,174 @@ import { loadEnv } from "./utils.js";
29
30
  // Load .env from cwd so DATABASE_URL and other vars are available to all actions.
30
31
  loadEnv();
31
32
 
33
+ const CLI_HANDOFF_KEYS = new Set(["embedStartUrl", "startUrl"]);
34
+ const CLI_HANDOFF_URL_PATTERN =
35
+ /\/_agent-native\/embed\/start\?[^\s"'<>)}\]]+/g;
36
+
37
+ function withoutCliHandoffText(value: unknown): string {
38
+ return String(value).replace(
39
+ CLI_HANDOFF_URL_PATTERN,
40
+ "[redacted embed handoff]",
41
+ );
42
+ }
43
+
44
+ function cliHandoffUrl(result: unknown): string | undefined {
45
+ if (!result || typeof result !== "object") return undefined;
46
+ for (const key of CLI_HANDOFF_KEYS) {
47
+ const value = (result as Record<string, unknown>)[key];
48
+ if (
49
+ typeof value === "string" &&
50
+ value.includes("/_agent-native/embed/start?")
51
+ ) {
52
+ return value;
53
+ }
54
+ }
55
+ return undefined;
56
+ }
57
+
58
+ function withoutCliHandoffSecrets(
59
+ value: unknown,
60
+ ancestors = new WeakSet<object>(),
61
+ ): unknown {
62
+ if (
63
+ typeof value === "string" &&
64
+ value.includes("/_agent-native/embed/start?")
65
+ ) {
66
+ return withoutCliHandoffText(value);
67
+ }
68
+ if (!value || typeof value !== "object") return value;
69
+ if (ancestors.has(value)) return "[Circular]";
70
+ ancestors.add(value);
71
+ try {
72
+ if (Array.isArray(value)) {
73
+ return value.map((child) => withoutCliHandoffSecrets(child, ancestors));
74
+ }
75
+ return Object.fromEntries(
76
+ Object.entries(value as Record<string, unknown>)
77
+ .filter(([key]) => !CLI_HANDOFF_KEYS.has(key))
78
+ .map(([key, child]) => [
79
+ key,
80
+ withoutCliHandoffSecrets(child, ancestors),
81
+ ]),
82
+ );
83
+ } finally {
84
+ ancestors.delete(value);
85
+ }
86
+ }
87
+
88
+ type CliHandoffLaunchOutcome =
89
+ | { ok: true }
90
+ | {
91
+ ok: false;
92
+ reason: "disabled" | "missing-base" | "invalid-url" | "open-failed";
93
+ message: string;
94
+ };
95
+
96
+ interface CliHandoffLaunchDeps {
97
+ env?: NodeJS.ProcessEnv;
98
+ platform?: NodeJS.Platform;
99
+ spawn?: (
100
+ command: string,
101
+ args: string[],
102
+ ) => { status: number | null; error?: Error };
103
+ }
104
+
105
+ export function openCliHandoff(
106
+ urlOrPath: string,
107
+ deps: CliHandoffLaunchDeps = {},
108
+ ): CliHandoffLaunchOutcome {
109
+ const env = deps.env ?? process.env;
110
+ if (env.AGENT_NATIVE_NO_OPEN === "1") {
111
+ return {
112
+ ok: false,
113
+ reason: "disabled",
114
+ message:
115
+ "Secure browser handoff is disabled by AGENT_NATIVE_NO_OPEN. Remove it and rerun this action.",
116
+ };
117
+ }
118
+ let url = urlOrPath;
119
+ if (urlOrPath.startsWith("/")) {
120
+ const baseUrl =
121
+ env.APP_URL ||
122
+ env.WORKSPACE_GATEWAY_URL ||
123
+ env.VITE_WORKSPACE_GATEWAY_URL ||
124
+ env.BETTER_AUTH_URL;
125
+ if (!baseUrl) {
126
+ return {
127
+ ok: false,
128
+ reason: "missing-base",
129
+ message:
130
+ "Secure browser handoff needs APP_URL or WORKSPACE_GATEWAY_URL. Start the app locally or set its URL, then rerun this action.",
131
+ };
132
+ }
133
+ try {
134
+ url = new URL(urlOrPath, baseUrl).toString();
135
+ } catch {
136
+ return {
137
+ ok: false,
138
+ reason: "invalid-url",
139
+ message:
140
+ "Secure browser handoff found an invalid app URL. Fix APP_URL or WORKSPACE_GATEWAY_URL, then rerun this action.",
141
+ };
142
+ }
143
+ }
144
+ try {
145
+ const parsed = new URL(url);
146
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
147
+ throw new Error("unsupported protocol");
148
+ }
149
+ } catch {
150
+ return {
151
+ ok: false,
152
+ reason: "invalid-url",
153
+ message:
154
+ "Secure browser handoff found an invalid app URL. Fix APP_URL or WORKSPACE_GATEWAY_URL, then rerun this action.",
155
+ };
156
+ }
157
+
158
+ const platform = deps.platform ?? process.platform;
159
+ const command =
160
+ platform === "darwin" ? "open" : platform === "win32" ? "cmd" : "xdg-open";
161
+ const args = platform === "win32" ? ["/c", "start", "", url] : [url];
162
+ try {
163
+ const launch =
164
+ deps.spawn?.(command, args) ??
165
+ spawnSync(command, args, {
166
+ stdio: "ignore",
167
+ timeout: 10_000,
168
+ });
169
+ if (launch.error || launch.status !== 0) {
170
+ return {
171
+ ok: false,
172
+ reason: "open-failed",
173
+ message:
174
+ "Secure browser handoff could not invoke the system URL opener. Verify local URL handling, then rerun this action.",
175
+ };
176
+ }
177
+ } catch {
178
+ return {
179
+ ok: false,
180
+ reason: "open-failed",
181
+ message:
182
+ "Secure browser handoff could not invoke the system URL opener. Verify local URL handling, then rerun this action.",
183
+ };
184
+ }
185
+ return { ok: true };
186
+ }
187
+
188
+ function printActionResult(result: unknown): CliHandoffLaunchOutcome | null {
189
+ const handoffUrl = cliHandoffUrl(result);
190
+ const handoff = handoffUrl ? openCliHandoff(handoffUrl) : null;
191
+ console.log(withoutCliHandoffSecrets(result));
192
+ return handoff;
193
+ }
194
+
195
+ function assertCliHandoffLaunched(
196
+ outcome: CliHandoffLaunchOutcome | null,
197
+ ): void {
198
+ if (outcome && !outcome.ok) throw new Error(outcome.message);
199
+ }
200
+
32
201
  export interface RunScriptOptions {
33
202
  /**
34
203
  * Actions contributed by packages rather than the app's local `actions/`
@@ -276,7 +445,7 @@ async function dispatchAction(
276
445
  if (handler.readOnly !== true) {
277
446
  await notifyActionChange({ actionName }).catch(() => {});
278
447
  }
279
- if (result) console.log(result);
448
+ if (result) assertCliHandoffLaunched(printActionResult(result));
280
449
  } else if (typeof handler === "function") {
281
450
  await handler(args);
282
451
  } else {
@@ -289,7 +458,10 @@ async function dispatchAction(
289
458
  process.exit(0);
290
459
  } catch (err: any) {
291
460
  await closeDbExec().catch(() => {});
292
- console.error(`Action "${actionName}" failed:`, err.message || err);
461
+ console.error(
462
+ `Action "${actionName}" failed:`,
463
+ withoutCliHandoffText(err.message || err),
464
+ );
293
465
  process.exit(1);
294
466
  }
295
467
  }
@@ -307,12 +479,15 @@ async function dispatchAction(
307
479
  if (packageAction.readOnly !== true) {
308
480
  await notifyActionChange({ actionName }).catch(() => {});
309
481
  }
310
- if (result) console.log(result);
482
+ if (result) assertCliHandoffLaunched(printActionResult(result));
311
483
  await closeDbExec().catch(() => {});
312
484
  process.exit(0);
313
485
  } catch (err: any) {
314
486
  await closeDbExec().catch(() => {});
315
- console.error(`Action "${actionName}" failed:`, err.message || err);
487
+ console.error(
488
+ `Action "${actionName}" failed:`,
489
+ withoutCliHandoffText(err.message || err),
490
+ );
316
491
  process.exit(1);
317
492
  }
318
493
  }
@@ -326,7 +501,10 @@ async function dispatchAction(
326
501
  process.exit(0);
327
502
  } catch (err: any) {
328
503
  await closeDbExec().catch(() => {});
329
- console.error(`Core action "${actionName}" failed:`, err.message || err);
504
+ console.error(
505
+ `Core action "${actionName}" failed:`,
506
+ withoutCliHandoffText(err.message || err),
507
+ );
330
508
  process.exit(1);
331
509
  }
332
510
  }
@@ -31,6 +31,10 @@ import {
31
31
  getAllowedCorsOrigin as resolveAllowedCorsOrigin,
32
32
  readCorsAllowedOrigins,
33
33
  } from "./cors-origins.js";
34
+ import {
35
+ resolveEmbedSessionFromRequest,
36
+ resolvedEmbedCapabilityScope,
37
+ } from "./embed-session.js";
34
38
  import { getHttpRequestTelemetryId } from "./http-response-telemetry.js";
35
39
 
36
40
  declare const __AGENT_NATIVE_BUILD_ID__: string | undefined;
@@ -58,10 +62,12 @@ function currentBuildId(): string {
58
62
  * Actions are exposed as POST by default. Use `http: { method: "GET" }` in
59
63
  * defineAction to expose as GET. Use `http: false` to mark as agent-only.
60
64
  */
65
+ import { isLoopbackRequest } from "./auth.js";
61
66
  import { getH3App } from "./framework-request-handler.js";
62
67
  import { runWithRequestContext } from "./request-context.js";
63
68
 
64
69
  const ROUTE_PREFIX = "/_agent-native/actions";
70
+ const FRONTEND_MUTATION_METHODS = new Set(["POST", "PUT", "DELETE"]);
65
71
 
66
72
  async function resolveFeatureFlagA2ACaller(event: any, actionName: string) {
67
73
  const required =
@@ -309,6 +315,19 @@ function isAuthResolutionFailure(error: unknown): boolean {
309
315
  );
310
316
  }
311
317
 
318
+ async function resolveRequestAuthCapability(
319
+ event: any,
320
+ ): Promise<string | undefined> {
321
+ try {
322
+ return resolvedEmbedCapabilityScope(
323
+ await resolveEmbedSessionFromRequest(event),
324
+ );
325
+ } catch {
326
+ // Invalid or unavailable embed auth must fail closed as no capability.
327
+ return undefined;
328
+ }
329
+ }
330
+
312
331
  /**
313
332
  * Mount discovered actions as HTTP endpoints.
314
333
  *
@@ -348,8 +367,14 @@ export function mountActionRoutes(
348
367
  "X-Agent-Native-Client-Mismatch,X-Agent-Native-Build-Id,X-Agent-Native-Client-Compatibility",
349
368
  );
350
369
 
351
- // Allow the declared method
352
- if (effectiveMethod !== method) {
370
+ // Browser action calls are RPCs over the framework transport. The
371
+ // action's HTTP method remains authoritative for direct HTTP callers,
372
+ // but frontend callers must not have to duplicate it in every hook.
373
+ const isFrontendMutation =
374
+ isFrontendActionRequest(event) &&
375
+ FRONTEND_MUTATION_METHODS.has(method) &&
376
+ FRONTEND_MUTATION_METHODS.has(effectiveMethod);
377
+ if (effectiveMethod !== method && !isFrontendMutation) {
353
378
  setResponseStatus(event, 405);
354
379
  return { error: `Method not allowed. Use ${method}.` };
355
380
  }
@@ -403,6 +428,7 @@ export function mountActionRoutes(
403
428
  // Resolve auth context for per-request scoping
404
429
  let userEmail: string | undefined;
405
430
  let userName: string | undefined;
431
+ const authCapability = await resolveRequestAuthCapability(event);
406
432
  // An app-supplied auth adapter runs first: it can accept caller
407
433
  // identities the framework's getSession chain doesn't understand (e.g.
408
434
  // an A2A JWT). A resolved caller is seeded onto the event context so any
@@ -493,8 +519,12 @@ export function mountActionRoutes(
493
519
  userEmail,
494
520
  userName,
495
521
  orgId,
522
+ authCapability,
496
523
  timezone,
497
524
  requestOrigin: getRequestURL(event).origin,
525
+ // Captured here because this is the last layer that still holds
526
+ // the h3 event; everything below reads it off the request store.
527
+ isLoopbackRequest: isLoopbackRequest(event),
498
528
  },
499
529
  async () => {
500
530
  // Reject oversize bodies from Content-Length before parsing, so a
@@ -90,8 +90,10 @@ import {
90
90
  import {
91
91
  buildAssistantMessage,
92
92
  buildUserMessage,
93
+ claimQueuedMessage,
93
94
  extractThreadMeta,
94
95
  foldAssistantTurn,
96
+ hasClaimedQueuedMessage,
95
97
  mergeThreadDataForClientSave,
96
98
  upsertUserMessage,
97
99
  } from "../agent/thread-data-builder.js";
@@ -1043,6 +1045,12 @@ export function createAgentChatPlugin(
1043
1045
  await import("../workspace-files/tool.js");
1044
1046
  workspaceFilesTool = createWorkspaceFilesTool();
1045
1047
  } catch {}
1048
+ let workspaceFileActions: Record<string, ActionEntry> = {};
1049
+ try {
1050
+ const { createWorkspaceFileActionEntries } =
1051
+ await import("../workspace-files/actions.js");
1052
+ workspaceFileActions = createWorkspaceFileActionEntries();
1053
+ } catch {}
1046
1054
  let toolActions: Record<string, ActionEntry> =
1047
1055
  createDataWidgetActionEntries();
1048
1056
  if (extensionToolsEnabled) {
@@ -1238,6 +1246,7 @@ export function createAgentChatPlugin(
1238
1246
  ...fetchTool,
1239
1247
  ...webSearchTool,
1240
1248
  ...workspaceFilesTool,
1249
+ ...workspaceFileActions,
1241
1250
  ...toolActions,
1242
1251
  ...browserSessionTools,
1243
1252
  ...coreEmailTools,
@@ -1263,6 +1272,7 @@ export function createAgentChatPlugin(
1263
1272
  ...fetchTool,
1264
1273
  ...webSearchTool,
1265
1274
  ...workspaceFilesTool,
1275
+ ...workspaceFileActions,
1266
1276
  ...toolActions,
1267
1277
  ...browserSessionTools,
1268
1278
  ...coreEmailTools,
@@ -1302,6 +1312,7 @@ export function createAgentChatPlugin(
1302
1312
  ...fetchTool,
1303
1313
  ...webSearchTool,
1304
1314
  ...workspaceFilesTool,
1315
+ ...workspaceFileActions,
1305
1316
  ...toolActions,
1306
1317
  ...browserSessionTools,
1307
1318
  ...coreEmailTools,
@@ -1630,6 +1641,7 @@ export function createAgentChatPlugin(
1630
1641
  ...fetchTool,
1631
1642
  ...webSearchTool,
1632
1643
  ...workspaceFilesTool,
1644
+ ...workspaceFileActions,
1633
1645
  ...toolActions,
1634
1646
  ...browserSessionTools,
1635
1647
  ...coreEmailTools,
@@ -1651,6 +1663,7 @@ export function createAgentChatPlugin(
1651
1663
  ...fetchTool,
1652
1664
  ...webSearchTool,
1653
1665
  ...workspaceFilesTool,
1666
+ ...workspaceFileActions,
1654
1667
  ...toolActions,
1655
1668
  ...browserSessionTools,
1656
1669
  ...coreEmailTools,
@@ -2030,6 +2043,7 @@ export function createAgentChatPlugin(
2030
2043
  ...fetchTool,
2031
2044
  ...webSearchTool,
2032
2045
  ...workspaceFilesTool,
2046
+ ...workspaceFileActions,
2033
2047
  ...toolActions,
2034
2048
  ...mcpActionEntries,
2035
2049
  ...devScriptsForA2A,
@@ -2047,6 +2061,7 @@ export function createAgentChatPlugin(
2047
2061
  ...fetchTool,
2048
2062
  ...webSearchTool,
2049
2063
  ...workspaceFilesTool,
2064
+ ...workspaceFileActions,
2050
2065
  ...toolActions,
2051
2066
  ...mcpActionEntries,
2052
2067
  ...(resolvedProdCodeExec !== "off" ? runCodeTool : {}),
@@ -2472,6 +2487,7 @@ export function createAgentChatPlugin(
2472
2487
  threadId: string | undefined;
2473
2488
  message: string;
2474
2489
  attachments?: AgentChatAttachment[];
2490
+ queuedMessageId?: string;
2475
2491
  }) => {
2476
2492
  const threadId = details.threadId;
2477
2493
  if (!threadId) return;
@@ -2514,12 +2530,23 @@ export function createAgentChatPlugin(
2514
2530
  repo = {};
2515
2531
  }
2516
2532
 
2533
+ if (details.queuedMessageId) {
2534
+ if (hasClaimedQueuedMessage(repo, details.queuedMessageId)) {
2535
+ throw createError({
2536
+ statusCode: 409,
2537
+ statusMessage: "Queued message was already submitted",
2538
+ });
2539
+ }
2540
+ repo = claimQueuedMessage(repo, details.queuedMessageId);
2541
+ }
2542
+
2517
2543
  repo = upsertUserMessage(
2518
2544
  repo,
2519
2545
  buildUserMessage({
2520
2546
  text: details.message,
2521
2547
  attachments: details.attachments,
2522
2548
  runId: details.runId,
2549
+ queuedMessageId: details.queuedMessageId,
2523
2550
  }),
2524
2551
  );
2525
2552
 
@@ -2654,6 +2681,7 @@ export function createAgentChatPlugin(
2654
2681
  ...fetchTool,
2655
2682
  ...webSearchTool,
2656
2683
  ...workspaceFilesTool,
2684
+ ...workspaceFileActions,
2657
2685
  ...toolActions,
2658
2686
  ...browserSessionTools,
2659
2687
  ...coreEmailTools,
@@ -3193,6 +3221,7 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
3193
3221
  ...fetchTool,
3194
3222
  ...webSearchTool,
3195
3223
  ...workspaceFilesTool,
3224
+ ...workspaceFileActions,
3196
3225
  ...toolActions,
3197
3226
  ...browserSessionTools,
3198
3227
  ...coreEmailTools,
@@ -1988,7 +1988,16 @@ export async function processAgentTeamRun(
1988
1988
  resolve();
1989
1989
  }
1990
1990
  },
1991
- { useHostedSoftTimeoutDefault: true, turnId },
1991
+ {
1992
+ useHostedSoftTimeoutDefault: true,
1993
+ turnId,
1994
+ // No userId here: `ownerEmail` is the only identity known at
1995
+ // this scope and is PII (email), which the terminal event must
1996
+ // not carry.
1997
+ model: config.model,
1998
+ engineName: config.engine.name,
1999
+ attemptCount: claimedAttempts,
2000
+ },
1992
2001
  );
1993
2002
  });
1994
2003