@agent-native/core 0.131.5 → 0.131.7

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 (350) hide show
  1. package/corpus/README.md +3 -3
  2. package/corpus/core/CHANGELOG.md +70 -0
  3. package/corpus/core/docs/content/agent-native-toolkit.mdx +13 -6
  4. package/corpus/core/docs/content/cloneable-saas.mdx +5 -5
  5. package/corpus/core/docs/content/creating-templates.mdx +9 -0
  6. package/corpus/core/docs/content/deployment.mdx +18 -12
  7. package/corpus/core/docs/content/doctor.mdx +8 -1
  8. package/corpus/core/docs/content/drop-in-agent.mdx +1 -1
  9. package/corpus/core/docs/content/extensions.mdx +18 -18
  10. package/corpus/core/docs/content/faq.mdx +4 -4
  11. package/corpus/core/docs/content/key-concepts.mdx +30 -21
  12. package/corpus/core/docs/content/security.mdx +2 -2
  13. package/corpus/core/docs/content/template-brain-developers.mdx +4 -1
  14. package/corpus/core/docs/content/template-mail-developers.mdx +4 -1
  15. package/corpus/core/docs/content/what-is-agent-native.mdx +6 -6
  16. package/corpus/core/package.json +1 -1
  17. package/corpus/core/src/a2a/client.ts +449 -66
  18. package/corpus/core/src/a2a/correlation.ts +31 -0
  19. package/corpus/core/src/a2a/invoke.ts +4 -2
  20. package/corpus/core/src/a2a/types.ts +4 -0
  21. package/corpus/core/src/action.ts +3 -0
  22. package/corpus/core/src/agent/action-continuation-guidance.ts +2 -1
  23. package/corpus/core/src/agent/engine/registry.ts +98 -6
  24. package/corpus/core/src/agent/production-agent.ts +151 -18
  25. package/corpus/core/src/agent/run-loop-with-resume.ts +190 -3
  26. package/corpus/core/src/agent/run-manager.ts +117 -41
  27. package/corpus/core/src/agent/thread-debug-history.ts +86 -0
  28. package/corpus/core/src/agent/types.ts +3 -1
  29. package/corpus/core/src/cli/create.ts +11 -1
  30. package/corpus/core/src/cli/templates-meta.ts +2 -2
  31. package/corpus/core/src/client/agent-chat-adapter.ts +91 -13
  32. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +11 -9
  33. package/corpus/core/src/client/sse-event-processor.ts +17 -3
  34. package/corpus/core/src/db/client.ts +57 -17
  35. package/corpus/core/src/guards/no-env-credentials.ts +2 -0
  36. package/corpus/core/src/integrations/adapters/slack.ts +8 -3
  37. package/corpus/core/src/localization/default-messages.ts +44 -0
  38. package/corpus/core/src/observability/traces.ts +78 -5
  39. package/corpus/core/src/scripts/call-agent.ts +294 -11
  40. package/corpus/core/src/scripts/describe-workspace-apps.ts +2 -2
  41. package/corpus/core/src/secrets/crypto.ts +156 -35
  42. package/corpus/core/src/secrets/storage.ts +64 -26
  43. package/corpus/core/src/server/agent-capabilities.ts +1 -1
  44. package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +113 -7
  45. package/corpus/core/src/server/agent-chat/context-tools.ts +2 -0
  46. package/corpus/core/src/server/agent-chat/plugin-options.ts +34 -1
  47. package/corpus/core/src/server/agent-chat/prompt-resources.ts +1 -1
  48. package/corpus/core/src/server/agent-chat-plugin.ts +91 -59
  49. package/corpus/core/src/templates/default/.agents/skills/secrets/SKILL.md +19 -7
  50. package/corpus/core/src/templates/headless/.agents/skills/secrets/SKILL.md +19 -7
  51. package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +18 -7
  52. package/corpus/core/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +15 -14
  53. package/corpus/core/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +19 -7
  54. package/corpus/core/src/vite/client.ts +1 -0
  55. package/corpus/templates/analytics/.agents/skills/dashboard-ops/SKILL.md +5 -4
  56. package/corpus/templates/analytics/.agents/skills/gong/SKILL.md +6 -4
  57. package/corpus/templates/analytics/AGENTS.md +7 -4
  58. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +4 -3
  59. package/corpus/templates/analytics/changelog/2026-07-30-delegated-analytics-questions-now-return-a-useful-current-me.md +6 -0
  60. package/corpus/templates/analytics/changelog/2026-07-30-scheduled-dashboard-emails-complete-every-panel-without-pool.md +6 -0
  61. package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +28 -1
  62. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +18 -11
  63. package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +4 -4
  64. package/corpus/templates/analytics/server/lib/canonical-first-party-dashboard-repair.ts +9 -5
  65. package/corpus/templates/analytics/server/lib/dashboard-panel-query.ts +6 -2
  66. package/corpus/templates/analytics/server/lib/dashboard-panel-source-resolver.ts +11 -4
  67. package/corpus/templates/analytics/server/lib/dashboard-report-render.ts +49 -31
  68. package/corpus/templates/analytics/server/lib/first-party-analytics.ts +16 -8
  69. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +9 -3
  70. package/corpus/templates/analytics/server/lib/production-serverless-runtime.ts +11 -0
  71. package/corpus/templates/analytics/server/lib/real-data-actions.ts +10 -0
  72. package/corpus/templates/analytics/server/plugins/agent-chat.ts +3 -2
  73. package/corpus/templates/analytics/server/plugins/analytics-alert-jobs.ts +2 -1
  74. package/corpus/templates/analytics/server/plugins/dashboard-report-jobs.ts +2 -1
  75. package/corpus/templates/analytics/server/plugins/uptime-monitor-jobs.ts +1 -12
  76. package/corpus/templates/brain/.agents/skills/brain/RUNBOOK.md +54 -6
  77. package/corpus/templates/brain/.agents/skills/brain/SKILL.md +20 -9
  78. package/corpus/templates/brain/.agents/skills/ingestion-and-connectors/SKILL.md +33 -1
  79. package/corpus/templates/brain/AGENTS.md +3 -1
  80. package/corpus/templates/brain/README.md +4 -1
  81. package/corpus/templates/brain/actions/_schemas.ts +30 -8
  82. package/corpus/templates/brain/actions/ask-brain.ts +124 -14
  83. package/corpus/templates/brain/actions/create-source.ts +18 -2
  84. package/corpus/templates/brain/actions/enqueue-captures-distillation.ts +8 -123
  85. package/corpus/templates/brain/actions/enqueue-distillation.ts +6 -127
  86. package/corpus/templates/brain/actions/import-capture.ts +17 -5
  87. package/corpus/templates/brain/actions/import-transcript.ts +17 -5
  88. package/corpus/templates/brain/actions/update-source.ts +25 -5
  89. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +1 -1
  90. package/corpus/templates/brain/changelog/2026-07-30-blessed-resources-can-feed-cited-company-answers.md +6 -0
  91. package/corpus/templates/brain/changelog/2026-07-30-the-left-sidebar-no-longer-shows-a-blank-organization-placeh.md +6 -0
  92. package/corpus/templates/brain/server/lib/brain.ts +49 -19
  93. package/corpus/templates/brain/server/lib/distillation-queue.ts +147 -0
  94. package/corpus/templates/brain/server/lib/source-policy.ts +264 -0
  95. package/corpus/templates/brain/server/plugins/agent-chat.ts +3 -2
  96. package/corpus/templates/brain/server/routes/api/_agent-native/brain/ingest.post.ts +116 -19
  97. package/corpus/templates/clips/app/components/meetings/google-oauth-identity-notice.tsx +51 -0
  98. package/corpus/templates/clips/app/i18n/en-US.ts +4 -0
  99. package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +3 -1
  100. package/corpus/templates/clips/changelog/2026-07-30-google-calendar-warning.md +6 -0
  101. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +72 -8
  102. package/corpus/templates/content/changelog/2026-07-30-the-slash-command-hint-now-stays-on-only-the-active-empty-li.md +6 -0
  103. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +506 -11
  104. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +148 -17
  105. package/corpus/templates/design/app/components/design/canvas-interactions/design-canvas-interactions.ts +357 -0
  106. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +7 -466
  107. package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +15 -311
  108. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +19 -997
  109. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +8 -1216
  110. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +31 -38
  111. package/corpus/templates/design/package.json +0 -1
  112. package/corpus/templates/dispatch/AGENTS.md +8 -0
  113. package/corpus/templates/dispatch/DEVELOPING.md +29 -0
  114. package/corpus/templates/dispatch/actions/view-screen.ts +34 -2
  115. package/corpus/templates/dispatch/app/i18n-data.ts +457 -0
  116. package/corpus/templates/dispatch/changelog/2026-07-30-delegated-dispatch-work-continues-reliably-in-the-background.md +6 -0
  117. package/corpus/templates/dispatch/changelog/2026-07-30-find-failed-runs-across-apps.md +6 -0
  118. package/corpus/templates/dispatch/netlify.toml +3 -0
  119. package/corpus/templates/plan/actions/get-visual-plan.ts +10 -6
  120. package/corpus/templates/plan/actions/patch-visual-plan-source.ts +117 -1
  121. package/corpus/templates/plan/actions/update-visual-plan.ts +56 -14
  122. package/corpus/templates/plan/app/pages/PlansPage.tsx +1 -1
  123. package/corpus/templates/plan/changelog/2026-07-30-plan-agents-recover-with-targeted-writes.md +6 -0
  124. package/corpus/templates/plan/shared/plan-content.ts +35 -0
  125. package/corpus/templates/slides/.agents/skills/analytics-data-for-decks/SKILL.md +8 -12
  126. package/corpus/templates/slides/AGENTS.md +4 -4
  127. package/corpus/templates/slides/actions/create-deck.ts +1 -1
  128. package/corpus/templates/slides/actions/duplicate-deck.ts +19 -4
  129. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +2 -10
  130. package/corpus/templates/slides/app/components/deck/MermaidRenderer.tsx +12 -1
  131. package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +30 -13
  132. package/corpus/templates/slides/app/components/editor/DeckEditorSkeleton.tsx +35 -0
  133. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +63 -56
  134. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +21 -76
  135. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +1110 -292
  136. package/corpus/templates/slides/app/components/editor/SlideOverflowWarning.tsx +53 -0
  137. package/corpus/templates/slides/app/components/editor/SlideStyleInspector.tsx +235 -18
  138. package/corpus/templates/slides/app/components/editor/SpeakerNotesPanel.tsx +4 -1
  139. package/corpus/templates/slides/app/components/editor/canvas-interactions/index.ts +11 -0
  140. package/corpus/templates/slides/app/components/editor/canvas-interactions/slides-canvas-adapter.ts +129 -0
  141. package/corpus/templates/slides/app/components/editor/selection-overlay-measurement.ts +70 -0
  142. package/corpus/templates/slides/app/components/editor/slide-object-interactions.ts +519 -65
  143. package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +36 -426
  144. package/corpus/templates/slides/app/components/visual-editor/DrawOverlay.tsx +19 -458
  145. package/corpus/templates/slides/app/context/DeckContext.tsx +179 -72
  146. package/corpus/templates/slides/app/global.css +105 -0
  147. package/corpus/templates/slides/app/i18n/en-US.ts +8 -0
  148. package/corpus/templates/slides/app/lib/deck-editor-loading.ts +26 -0
  149. package/corpus/templates/slides/app/lib/mermaid-blocks.ts +27 -0
  150. package/corpus/templates/slides/app/pages/DeckEditor.tsx +71 -38
  151. package/corpus/templates/slides/app/pages/Index.tsx +98 -41
  152. package/corpus/templates/slides/changelog/2026-07-30-deck-loading-no-longer-flashes-an-unavailable-message.md +6 -0
  153. package/corpus/templates/slides/changelog/2026-07-30-duplicating-a-deck-from-the-deck-list-now-opens-the-copy-imm.md +6 -0
  154. package/corpus/templates/slides/changelog/2026-07-30-layout-overflow-warning-is-readable-and-dismissible.md +6 -0
  155. package/corpus/templates/slides/changelog/2026-07-30-new-decks-now-start-with-an-empty-slide-list-when-no-slides-.md +6 -0
  156. package/corpus/templates/slides/changelog/2026-07-30-shared-canvas-annotations.md +6 -0
  157. package/corpus/templates/slides/changelog/2026-07-30-slide-objects-can-be-moved-as-a-group-copied-and-pasted-with.md +6 -0
  158. package/corpus/templates/slides/changelog/2026-07-30-slide-text-editing-and-object-controls-now-match-google-slides.md +6 -0
  159. package/corpus/templates/slides/changelog/2026-07-30-style-panel-now-scrolls-with-speaker-notes-open-shows-the-sl.md +6 -0
  160. package/corpus/templates/slides/changelog/2026-07-30-top-toolbar-controls-now-use-consistent-sizing-with-undo-and.md +6 -0
  161. package/corpus/templates/slides/netlify.toml +3 -1
  162. package/corpus/templates/slides/package.json +0 -1
  163. package/corpus/templates/slides/server/lib/chat-attachments.ts +18 -0
  164. package/corpus/templates/slides/server/plugins/agent-chat.ts +5 -0
  165. package/corpus/templates/slides/vite.config.ts +0 -1
  166. package/corpus/toolkit/CHANGELOG.md +13 -0
  167. package/corpus/toolkit/README.md +19 -0
  168. package/corpus/toolkit/agent-native.eject.json +38 -0
  169. package/corpus/toolkit/package.json +29 -1
  170. package/corpus/toolkit/src/canvas-annotations/CanvasCommentPins.tsx +861 -0
  171. package/corpus/toolkit/src/canvas-annotations/DrawOverlay.tsx +1233 -0
  172. package/corpus/toolkit/src/canvas-annotations/index.ts +15 -0
  173. package/corpus/toolkit/src/canvas-annotations/types.ts +14 -0
  174. package/corpus/toolkit/src/canvas-interactions/canvas-interactions.ts +933 -0
  175. package/corpus/toolkit/src/canvas-interactions/index.ts +67 -0
  176. package/corpus/toolkit/src/design-tweaks/scrub-input-utils.ts +311 -0
  177. package/corpus/toolkit/src/design-tweaks/scrub-input.tsx +491 -0
  178. package/corpus/toolkit/src/design-tweaks/visual-style-controls.tsx +26 -171
  179. package/corpus/toolkit/src/index.ts +1 -0
  180. package/dist/a2a/client.d.ts +23 -0
  181. package/dist/a2a/client.d.ts.map +1 -1
  182. package/dist/a2a/client.js +309 -44
  183. package/dist/a2a/client.js.map +1 -1
  184. package/dist/a2a/correlation.d.ts +1 -0
  185. package/dist/a2a/correlation.d.ts.map +1 -1
  186. package/dist/a2a/correlation.js +27 -0
  187. package/dist/a2a/correlation.js.map +1 -1
  188. package/dist/a2a/invoke.d.ts.map +1 -1
  189. package/dist/a2a/invoke.js +4 -2
  190. package/dist/a2a/invoke.js.map +1 -1
  191. package/dist/a2a/types.d.ts +4 -0
  192. package/dist/a2a/types.d.ts.map +1 -1
  193. package/dist/a2a/types.js.map +1 -1
  194. package/dist/action.d.ts +3 -0
  195. package/dist/action.d.ts.map +1 -1
  196. package/dist/action.js.map +1 -1
  197. package/dist/agent/action-continuation-guidance.d.ts.map +1 -1
  198. package/dist/agent/action-continuation-guidance.js +2 -1
  199. package/dist/agent/action-continuation-guidance.js.map +1 -1
  200. package/dist/agent/engine/registry.d.ts.map +1 -1
  201. package/dist/agent/engine/registry.js +82 -8
  202. package/dist/agent/engine/registry.js.map +1 -1
  203. package/dist/agent/production-agent.d.ts +40 -1
  204. package/dist/agent/production-agent.d.ts.map +1 -1
  205. package/dist/agent/production-agent.js +113 -15
  206. package/dist/agent/production-agent.js.map +1 -1
  207. package/dist/agent/run-loop-with-resume.d.ts +21 -0
  208. package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
  209. package/dist/agent/run-loop-with-resume.js +163 -4
  210. package/dist/agent/run-loop-with-resume.js.map +1 -1
  211. package/dist/agent/run-manager.d.ts +16 -9
  212. package/dist/agent/run-manager.d.ts.map +1 -1
  213. package/dist/agent/run-manager.js +93 -42
  214. package/dist/agent/run-manager.js.map +1 -1
  215. package/dist/agent/thread-debug-history.d.ts +10 -0
  216. package/dist/agent/thread-debug-history.d.ts.map +1 -0
  217. package/dist/agent/thread-debug-history.js +68 -0
  218. package/dist/agent/thread-debug-history.js.map +1 -0
  219. package/dist/agent/types.d.ts +3 -1
  220. package/dist/agent/types.d.ts.map +1 -1
  221. package/dist/agent/types.js.map +1 -1
  222. package/dist/cli/create.d.ts.map +1 -1
  223. package/dist/cli/create.js +6 -1
  224. package/dist/cli/create.js.map +1 -1
  225. package/dist/cli/templates-meta.js +2 -2
  226. package/dist/cli/templates-meta.js.map +1 -1
  227. package/dist/client/agent-chat-adapter.d.ts +1 -1
  228. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  229. package/dist/client/agent-chat-adapter.js +76 -13
  230. package/dist/client/agent-chat-adapter.js.map +1 -1
  231. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  232. package/dist/client/resources/McpIntegrationDialog.js +1 -1
  233. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  234. package/dist/client/sse-event-processor.d.ts.map +1 -1
  235. package/dist/client/sse-event-processor.js +12 -3
  236. package/dist/client/sse-event-processor.js.map +1 -1
  237. package/dist/collab/routes.d.ts +1 -1
  238. package/dist/db/client.d.ts.map +1 -1
  239. package/dist/db/client.js +48 -17
  240. package/dist/db/client.js.map +1 -1
  241. package/dist/guards/no-env-credentials.d.ts.map +1 -1
  242. package/dist/guards/no-env-credentials.js +2 -0
  243. package/dist/guards/no-env-credentials.js.map +1 -1
  244. package/dist/integrations/adapters/slack.js +7 -3
  245. package/dist/integrations/adapters/slack.js.map +1 -1
  246. package/dist/localization/default-messages.d.ts +43 -0
  247. package/dist/localization/default-messages.d.ts.map +1 -1
  248. package/dist/localization/default-messages.js +43 -0
  249. package/dist/localization/default-messages.js.map +1 -1
  250. package/dist/observability/traces.d.ts +3 -1
  251. package/dist/observability/traces.d.ts.map +1 -1
  252. package/dist/observability/traces.js +73 -4
  253. package/dist/observability/traces.js.map +1 -1
  254. package/dist/progress/routes.d.ts +1 -1
  255. package/dist/provider-api/actions/custom-provider-registration.d.ts +12 -12
  256. package/dist/provider-api/actions/provider-api.d.ts +13 -13
  257. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  258. package/dist/scripts/call-agent.d.ts.map +1 -1
  259. package/dist/scripts/call-agent.js +237 -12
  260. package/dist/scripts/call-agent.js.map +1 -1
  261. package/dist/scripts/describe-workspace-apps.js +2 -2
  262. package/dist/scripts/describe-workspace-apps.js.map +1 -1
  263. package/dist/secrets/crypto.d.ts +36 -21
  264. package/dist/secrets/crypto.d.ts.map +1 -1
  265. package/dist/secrets/crypto.js +134 -33
  266. package/dist/secrets/crypto.js.map +1 -1
  267. package/dist/secrets/storage.d.ts +6 -6
  268. package/dist/secrets/storage.d.ts.map +1 -1
  269. package/dist/secrets/storage.js +43 -26
  270. package/dist/secrets/storage.js.map +1 -1
  271. package/dist/server/agent-capabilities.js +1 -1
  272. package/dist/server/agent-capabilities.js.map +1 -1
  273. package/dist/server/agent-chat/action-filters-a2a.d.ts +17 -3
  274. package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
  275. package/dist/server/agent-chat/action-filters-a2a.js +94 -3
  276. package/dist/server/agent-chat/action-filters-a2a.js.map +1 -1
  277. package/dist/server/agent-chat/context-tools.d.ts.map +1 -1
  278. package/dist/server/agent-chat/context-tools.js +2 -0
  279. package/dist/server/agent-chat/context-tools.js.map +1 -1
  280. package/dist/server/agent-chat/plugin-options.d.ts +23 -0
  281. package/dist/server/agent-chat/plugin-options.d.ts.map +1 -1
  282. package/dist/server/agent-chat/plugin-options.js +4 -1
  283. package/dist/server/agent-chat/plugin-options.js.map +1 -1
  284. package/dist/server/agent-chat/prompt-resources.js +1 -1
  285. package/dist/server/agent-chat/prompt-resources.js.map +1 -1
  286. package/dist/server/agent-chat-plugin.d.ts +2 -1
  287. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  288. package/dist/server/agent-chat-plugin.js +79 -56
  289. package/dist/server/agent-chat-plugin.js.map +1 -1
  290. package/dist/server/realtime-token.d.ts +1 -1
  291. package/dist/templates/default/.agents/skills/secrets/SKILL.md +19 -7
  292. package/dist/templates/headless/.agents/skills/secrets/SKILL.md +19 -7
  293. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +18 -7
  294. package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +15 -14
  295. package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +19 -7
  296. package/dist/vite/client.d.ts.map +1 -1
  297. package/dist/vite/client.js +1 -0
  298. package/dist/vite/client.js.map +1 -1
  299. package/docs/content/agent-native-toolkit.mdx +13 -6
  300. package/docs/content/cloneable-saas.mdx +5 -5
  301. package/docs/content/creating-templates.mdx +9 -0
  302. package/docs/content/deployment.mdx +18 -12
  303. package/docs/content/doctor.mdx +8 -1
  304. package/docs/content/drop-in-agent.mdx +1 -1
  305. package/docs/content/extensions.mdx +18 -18
  306. package/docs/content/faq.mdx +4 -4
  307. package/docs/content/key-concepts.mdx +30 -21
  308. package/docs/content/security.mdx +2 -2
  309. package/docs/content/template-brain-developers.mdx +4 -1
  310. package/docs/content/template-mail-developers.mdx +4 -1
  311. package/docs/content/what-is-agent-native.mdx +6 -6
  312. package/package.json +3 -3
  313. package/src/a2a/client.ts +449 -66
  314. package/src/a2a/correlation.ts +31 -0
  315. package/src/a2a/invoke.ts +4 -2
  316. package/src/a2a/types.ts +4 -0
  317. package/src/action.ts +3 -0
  318. package/src/agent/action-continuation-guidance.ts +2 -1
  319. package/src/agent/engine/registry.ts +98 -6
  320. package/src/agent/production-agent.ts +151 -18
  321. package/src/agent/run-loop-with-resume.ts +190 -3
  322. package/src/agent/run-manager.ts +117 -41
  323. package/src/agent/thread-debug-history.ts +86 -0
  324. package/src/agent/types.ts +3 -1
  325. package/src/cli/create.ts +11 -1
  326. package/src/cli/templates-meta.ts +2 -2
  327. package/src/client/agent-chat-adapter.ts +91 -13
  328. package/src/client/resources/McpIntegrationDialog.tsx +11 -9
  329. package/src/client/sse-event-processor.ts +17 -3
  330. package/src/db/client.ts +57 -17
  331. package/src/guards/no-env-credentials.ts +2 -0
  332. package/src/integrations/adapters/slack.ts +8 -3
  333. package/src/localization/default-messages.ts +44 -0
  334. package/src/observability/traces.ts +78 -5
  335. package/src/scripts/call-agent.ts +294 -11
  336. package/src/scripts/describe-workspace-apps.ts +2 -2
  337. package/src/secrets/crypto.ts +156 -35
  338. package/src/secrets/storage.ts +64 -26
  339. package/src/server/agent-capabilities.ts +1 -1
  340. package/src/server/agent-chat/action-filters-a2a.ts +113 -7
  341. package/src/server/agent-chat/context-tools.ts +2 -0
  342. package/src/server/agent-chat/plugin-options.ts +34 -1
  343. package/src/server/agent-chat/prompt-resources.ts +1 -1
  344. package/src/server/agent-chat-plugin.ts +91 -59
  345. package/src/templates/default/.agents/skills/secrets/SKILL.md +19 -7
  346. package/src/templates/headless/.agents/skills/secrets/SKILL.md +19 -7
  347. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +18 -7
  348. package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +15 -14
  349. package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +19 -7
  350. package/src/vite/client.ts +1 -0
@@ -18,13 +18,17 @@
18
18
  * __RUNTIME_LAYER_SNAPSHOT_ENABLED__ — true only for URL-backed localhost apps
19
19
  *
20
20
  * Rules:
21
- * • No import/require of any module (DOM globals only).
21
+ * • The shared, build-time-inlined canvas interaction controller is the one
22
+ * permitted import. No runtime module lookup survives code generation.
23
+ * • No require of any module (DOM globals only at iframe runtime).
22
24
  * • No references to outer/module scope (the code runs inside an iframe).
23
25
  * • Wrap everything in a self-executing IIFE.
24
26
  *
25
27
  * keep in sync with hit-test.bridge.ts for the shared container/axis/placement
26
28
  * helpers (search for "// keep in sync" comments).
27
29
  */
30
+ import { createCanvasGestureController } from "@agent-native/toolkit/canvas-interactions";
31
+
28
32
  declare var __READ_ONLY__: boolean;
29
33
  declare var __TEXT_EDITING_ENABLED__: boolean;
30
34
  declare var __EDITOR_CHROME_SCALE_X__: string;
@@ -4908,6 +4912,34 @@ declare var __SELECTED_LAYER_DRAG_PRIORITY__: boolean;
4908
4912
  : { move: "mousemove", up: "mouseup" };
4909
4913
  }
4910
4914
 
4915
+ // The bridge is bundled into an iframe IIFE. Its canvas is expressed in the
4916
+ // iframe's CSS pixels, so client and canvas coordinates intentionally share
4917
+ // the same viewport. Keeping this conversion at the adapter boundary lets
4918
+ // the common controller own gesture lifecycle/threshold/Shift semantics
4919
+ // without teaching it Design's source patches, auto layout, or transforms.
4920
+ function bridgeGestureViewport() {
4921
+ var width = Math.max(
4922
+ 1,
4923
+ window.innerWidth || document.documentElement.clientWidth || 1,
4924
+ );
4925
+ var height = Math.max(
4926
+ 1,
4927
+ window.innerHeight || document.documentElement.clientHeight || 1,
4928
+ );
4929
+ return { left: 0, top: 0, width: width, height: height };
4930
+ }
4931
+
4932
+ function bridgeGesturePointer(e) {
4933
+ return {
4934
+ x: e.clientX,
4935
+ y: e.clientY,
4936
+ altKey: !!e.altKey,
4937
+ ctrlKey: !!e.ctrlKey,
4938
+ metaKey: !!e.metaKey,
4939
+ shiftKey: !!e.shiftKey,
4940
+ };
4941
+ }
4942
+
4911
4943
  function elementFromEditorPoint(
4912
4944
  clientX: number,
4913
4945
  clientY: number,
@@ -9815,8 +9847,49 @@ declare var __SELECTED_LAYER_DRAG_PRIORITY__: boolean;
9815
9847
  // clear-selection postMessage cannot swap selectedEl mid-drag and cause
9816
9848
  // mutations on the wrong element or a null-deref in onUp.
9817
9849
  var dragEl = gestureEl;
9818
- var moved = false;
9850
+ var gestureViewport = bridgeGestureViewport();
9851
+ // Design owns the advanced preview math below: snapping/guides, nested
9852
+ // auto-layout conversion, and cross-screen state all have source-aware
9853
+ // invariants. The shared controller owns only the browser gesture state
9854
+ // machine and emits the normalized pointer lifecycle that gates it.
9855
+ // Use the same threshold for the controller and the legacy moved flag so
9856
+ // a selected-box click remains a click instead of starting a persistence
9857
+ // gesture with a zero delta.
9819
9858
  var DRAG_THRESHOLD = 3;
9859
+ var bridgeMoveController = createCanvasGestureController({
9860
+ capabilities: { move: true, resize: true },
9861
+ drag: {
9862
+ // Shield drags already crossed the outer threshold before reaching
9863
+ // startMove. Keeping their controller threshold at zero preserves the
9864
+ // first post-shield delta, while direct selection-chrome drags still
9865
+ // need a real threshold before they preview or persist.
9866
+ threshold: pointerStartParam ? 0 : DRAG_THRESHOLD,
9867
+ duplicateModifier: "alt",
9868
+ },
9869
+ adapter: {
9870
+ preview: function () {
9871
+ return { handled: true };
9872
+ },
9873
+ commit: function () {
9874
+ return { handled: true };
9875
+ },
9876
+ cancel: function () {
9877
+ return { handled: true };
9878
+ },
9879
+ },
9880
+ });
9881
+ bridgeMoveController.pointerDown({
9882
+ kind: "move",
9883
+ objectIds: [getSelector(gestureEl)],
9884
+ // `e` is deliberately the event that actually began the legacy move
9885
+ // lifecycle. `pointerStartParam` is only Design's outer shield
9886
+ // disambiguation origin; using it here would apply that first
9887
+ // threshold-crossing delta twice.
9888
+ pointer: bridgeGesturePointer(e),
9889
+ viewport: gestureViewport,
9890
+ canvas: { width: gestureViewport.width, height: gestureViewport.height },
9891
+ });
9892
+ var moved = false;
9820
9893
  dndLog("start:free", { el: getSelector(gestureEl), isGroup: isGroupDrag });
9821
9894
  var currentAutoLayoutTarget: {
9822
9895
  anchor: Element;
@@ -9866,26 +9939,21 @@ declare var __SELECTED_LAYER_DRAG_PRIORITY__: boolean;
9866
9939
  window.requestAnimationFrame(flushCrossScreenDragMove);
9867
9940
  }
9868
9941
  function onMove(ev) {
9942
+ var controllerMove = bridgeMoveController.pointerMove(
9943
+ bridgeGesturePointer(ev),
9944
+ );
9945
+ if (controllerMove.phase !== "active") return;
9869
9946
  if (
9870
9947
  !moved &&
9871
9948
  Math.hypot(ev.clientX - startX, ev.clientY - startY) > DRAG_THRESHOLD
9872
9949
  ) {
9873
9950
  moved = true;
9874
9951
  }
9875
- var rawDx = ev.clientX - startX;
9876
- var rawDy = ev.clientY - startY;
9877
- // Figma dominant-axis lock: while Shift is held, zero out whichever
9878
- // delta has the smaller magnitude so the element only moves along one
9879
- // axis. Read live off the move event (not cached at drag start) so
9880
- // pressing/releasing Shift mid-drag re-evaluates every event, matching
9881
- // how the resize path reads ev.shiftKey per-move rather than once.
9882
- if (ev.shiftKey) {
9883
- if (Math.abs(rawDx) > Math.abs(rawDy)) {
9884
- rawDy = 0;
9885
- } else {
9886
- rawDx = 0;
9887
- }
9888
- }
9952
+ // The controller converts client deltas at the iframe boundary and
9953
+ // applies the live Shift dominant-axis constraint. Design-specific snap
9954
+ // and auto-layout handling decorates this normalized delta below.
9955
+ var rawDx = controllerMove.gesture.canvasDelta.x;
9956
+ var rawDy = controllerMove.gesture.canvasDelta.y;
9889
9957
  var nextLeft = originLeft + rawDx;
9890
9958
  var nextTop = originTop + rawDy;
9891
9959
  // Alignment/smart-guide snapping: disabled while Cmd/Ctrl is held
@@ -9993,6 +10061,7 @@ declare var __SELECTED_LAYER_DRAG_PRIORITY__: boolean;
9993
10061
  crossScreenDragMovePendingEv = null;
9994
10062
  }
9995
10063
  function cancelMoveDrag() {
10064
+ bridgeMoveController.cancel();
9996
10065
  cleanupMoveDrag();
9997
10066
  hideTransformBadge();
9998
10067
  hideInsertionGuide();
@@ -10019,6 +10088,16 @@ declare var __SELECTED_LAYER_DRAG_PRIORITY__: boolean;
10019
10088
  cancelMoveDrag();
10020
10089
  }
10021
10090
  function onUp(ev) {
10091
+ var controllerEnd = bridgeMoveController.pointerUp(
10092
+ bridgeGesturePointer(ev),
10093
+ );
10094
+ if (!controllerEnd.committed) {
10095
+ cleanupMoveDrag();
10096
+ hideTransformBadge();
10097
+ hideInsertionGuide();
10098
+ hideSnapGuides();
10099
+ return;
10100
+ }
10022
10101
  cleanupMoveDrag();
10023
10102
  hideTransformBadge();
10024
10103
  hideInsertionGuide();
@@ -10224,6 +10303,45 @@ declare var __SELECTED_LAYER_DRAG_PRIORITY__: boolean;
10224
10303
  // Capture the element rotation once at drag-start so per-move projection is
10225
10304
  // cheap and consistent even if the transform changes during the drag.
10226
10305
  var resizeTheta = (currentRotation(resizeEl) * Math.PI) / 180;
10306
+ var resizeGestureViewport = bridgeGestureViewport();
10307
+ // Keep generic resize lifecycle in Toolkit while Design continues to own
10308
+ // rotated/Alt-centered/Scale-tool geometry. The generic rect emitted by
10309
+ // the controller is intentionally advisory here; applying it directly
10310
+ // would discard Design's rotation-projected resize invariants.
10311
+ var RESIZE_DRAG_THRESHOLD = 3;
10312
+ var bridgeResizeController = createCanvasGestureController({
10313
+ capabilities: { move: true, resize: true },
10314
+ drag: { threshold: RESIZE_DRAG_THRESHOLD, duplicateModifier: "alt" },
10315
+ minSize: 8,
10316
+ adapter: {
10317
+ preview: function () {
10318
+ return { handled: true };
10319
+ },
10320
+ commit: function () {
10321
+ return { handled: true };
10322
+ },
10323
+ cancel: function () {
10324
+ return { handled: true };
10325
+ },
10326
+ },
10327
+ });
10328
+ bridgeResizeController.pointerDown({
10329
+ kind: "resize",
10330
+ objectIds: [getSelector(resizeEl)],
10331
+ pointer: bridgeGesturePointer(e),
10332
+ viewport: resizeGestureViewport,
10333
+ canvas: {
10334
+ width: resizeGestureViewport.width,
10335
+ height: resizeGestureViewport.height,
10336
+ },
10337
+ handle: handle,
10338
+ rect: {
10339
+ x: origin.left,
10340
+ y: origin.top,
10341
+ width: origin.width,
10342
+ height: origin.height,
10343
+ },
10344
+ });
10227
10345
  // Figma commit-semantics parity: a resize must only ever write the
10228
10346
  // axis/axes the user actually dragged. A pure vertical edge-drag (handle
10229
10347
  // "n"/"s", no Shift, scale tool off) must leave width completely alone —
@@ -10336,6 +10454,10 @@ declare var __SELECTED_LAYER_DRAG_PRIORITY__: boolean;
10336
10454
  };
10337
10455
  }
10338
10456
  function onMove(ev) {
10457
+ var controllerMove = bridgeResizeController.pointerMove(
10458
+ bridgeGesturePointer(ev),
10459
+ );
10460
+ if (controllerMove.phase !== "active") return;
10339
10461
  if (!resizeEl) return;
10340
10462
  var rect = nextRect(ev);
10341
10463
  if (rect.touchesWidth) widthTouched = true;
@@ -10382,6 +10504,7 @@ declare var __SELECTED_LAYER_DRAG_PRIORITY__: boolean;
10382
10504
  clearActiveDragCancel(cancelResizeDrag);
10383
10505
  }
10384
10506
  function cancelResizeDrag() {
10507
+ bridgeResizeController.cancel();
10385
10508
  cleanupResizeDrag();
10386
10509
  hideTransformBadge();
10387
10510
  if (resizeEl && document.documentElement.contains(resizeEl)) {
@@ -10404,7 +10527,15 @@ declare var __SELECTED_LAYER_DRAG_PRIORITY__: boolean;
10404
10527
  stopNativeInteraction(ev);
10405
10528
  cancelResizeDrag();
10406
10529
  }
10407
- function onUp() {
10530
+ function onUp(ev) {
10531
+ var controllerEnd = bridgeResizeController.pointerUp(
10532
+ bridgeGesturePointer(ev),
10533
+ );
10534
+ if (!controllerEnd.committed) {
10535
+ cleanupResizeDrag();
10536
+ hideTransformBadge();
10537
+ return;
10538
+ }
10408
10539
  cleanupResizeDrag();
10409
10540
  hideTransformBadge();
10410
10541
  if (!resizeEl) return;
@@ -0,0 +1,357 @@
1
+ import {
2
+ resolveCanvasNudge,
3
+ resolveCanvasShortcut,
4
+ } from "@agent-native/toolkit/canvas-interactions";
5
+ import type {
6
+ CanvasCommand,
7
+ CanvasCommandDispatchResult,
8
+ CanvasCommandId,
9
+ CanvasInteractionAdapter,
10
+ CanvasInteractionCapabilities,
11
+ CanvasShortcut,
12
+ CanvasShortcutInput,
13
+ CanvasTextEditPolicy,
14
+ } from "@agent-native/toolkit/canvas-interactions";
15
+
16
+ import type { UseDesignHotkeysProps } from "@/hooks/useDesignHotkeys";
17
+
18
+ export type DesignCanvasInteractionHandlers = Pick<
19
+ UseDesignHotkeysProps,
20
+ | "onSelectAll"
21
+ | "onUndo"
22
+ | "onRedo"
23
+ | "onCopy"
24
+ | "onCut"
25
+ | "onPaste"
26
+ | "onDuplicate"
27
+ | "onDelete"
28
+ | "onNudge"
29
+ | "onBringForward"
30
+ | "onBringToFront"
31
+ | "onSendBackward"
32
+ | "onSendToBack"
33
+ | "onAlignSelection"
34
+ | "onDistributeSelection"
35
+ | "onGroup"
36
+ | "onUngroup"
37
+ | "onFrameSelection"
38
+ | "onEscape"
39
+ | "onEnter"
40
+ >;
41
+
42
+ export interface CreateDesignCanvasInteractionAdapterOptions {
43
+ shortcuts: DesignCanvasInteractionHandlers;
44
+ /**
45
+ * The shared command contract intentionally does not carry DOM events.
46
+ * Design provides the original event at this seam when it dispatches from
47
+ * its existing hotkey loop, preserving source/editor behavior.
48
+ */
49
+ getHotkeyDetails?: (command: CanvasCommand) => DesignHotkeyDetails | null;
50
+ }
51
+
52
+ type DesignHotkeyDetails = Parameters<
53
+ NonNullable<UseDesignHotkeysProps["onUndo"]>
54
+ >[0];
55
+
56
+ export interface DesignCanvasInteractionAdapter extends CanvasInteractionAdapter {
57
+ readonly id: "design";
58
+ readonly textEditing: Required<CanvasTextEditPolicy>;
59
+ dispatchShortcut(
60
+ command: CanvasCommandId,
61
+ event: KeyboardEvent,
62
+ ): CanvasCommandDispatchResult;
63
+ dispatchKeyboardEvent(event: KeyboardEvent): CanvasCommandDispatchResult;
64
+ }
65
+
66
+ export const DESIGN_CANVAS_INTERACTION_CAPABILITIES = {
67
+ selection: true,
68
+ multiSelection: true,
69
+ marquee: true,
70
+ move: true,
71
+ resize: true,
72
+ rotation: true,
73
+ snapping: true,
74
+ alignment: true,
75
+ distribution: true,
76
+ duplicate: true,
77
+ clipboard: true,
78
+ delete: true,
79
+ nudge: true,
80
+ arrange: true,
81
+ grouping: true,
82
+ textEditing: true,
83
+ } satisfies CanvasInteractionCapabilities;
84
+
85
+ /**
86
+ * Design's equivalent subset of the shared canvas command registry. The
87
+ * broader Figma shortcut catalogue remains in `useDesignHotkeys`: it has
88
+ * Design-only commands and platform rules which should not be projected onto
89
+ * other canvases. These entries are intentionally semantic rather than tied
90
+ * to the iframe/source persistence implementation.
91
+ */
92
+ export const DESIGN_CANVAS_SHORTCUTS: readonly CanvasShortcut[] = [
93
+ { command: "select-all", key: "a", modifiers: ["primary"] },
94
+ { command: "undo", key: "z", modifiers: ["primary"] },
95
+ { command: "redo", key: "z", modifiers: ["primary", "shift"] },
96
+ { command: "copy", key: "c", modifiers: ["primary"] },
97
+ { command: "cut", key: "x", modifiers: ["primary"] },
98
+ { command: "paste", key: "v", modifiers: ["primary"] },
99
+ { command: "duplicate", key: "d", modifiers: ["primary"] },
100
+ { command: "delete", key: "Backspace" },
101
+ { command: "delete", key: "Delete" },
102
+ {
103
+ command: "bring-forward",
104
+ key: "]",
105
+ code: "BracketRight",
106
+ modifiers: ["primary"],
107
+ },
108
+ {
109
+ command: "send-backward",
110
+ key: "[",
111
+ code: "BracketLeft",
112
+ modifiers: ["primary"],
113
+ },
114
+ { command: "bring-to-front", key: "]" },
115
+ { command: "send-to-back", key: "[" },
116
+ {
117
+ command: "bring-to-front",
118
+ key: "]",
119
+ code: "BracketRight",
120
+ modifiers: ["primary", "alt"],
121
+ },
122
+ {
123
+ command: "send-to-back",
124
+ key: "[",
125
+ code: "BracketLeft",
126
+ modifiers: ["primary", "alt"],
127
+ },
128
+ ];
129
+
130
+ /** Shared semantic lookup used by Design's live hotkey shell. */
131
+ export function resolveDesignCanvasShortcut(
132
+ input: CanvasShortcutInput,
133
+ ): CanvasCommandId | null {
134
+ return resolveCanvasShortcut(input, DESIGN_CANVAS_SHORTCUTS);
135
+ }
136
+
137
+ function canvasCommandForDesignKeyboardEvent(
138
+ event: KeyboardEvent,
139
+ ): CanvasCommandId | null {
140
+ const shortcut = resolveDesignCanvasShortcut({
141
+ key: event.key,
142
+ code: event.code,
143
+ metaKey: event.metaKey,
144
+ ctrlKey: event.ctrlKey,
145
+ shiftKey: event.shiftKey,
146
+ altKey: event.altKey,
147
+ });
148
+ if (shortcut) return shortcut;
149
+ if (event.metaKey || event.ctrlKey || event.altKey) return null;
150
+ return (
151
+ resolveCanvasNudge({ key: event.key, shiftKey: event.shiftKey })?.command ??
152
+ null
153
+ );
154
+ }
155
+
156
+ function dispatchDesignShortcut(
157
+ command: CanvasCommand,
158
+ details: DesignHotkeyDetails | null,
159
+ handlers: DesignCanvasInteractionHandlers,
160
+ ): CanvasCommandDispatchResult {
161
+ if (!details) return { handled: false, reason: "unhandled" };
162
+
163
+ switch (command.id) {
164
+ case "undo":
165
+ return runShortcutHandler(handlers.onUndo, details);
166
+ case "redo":
167
+ return runShortcutHandler(handlers.onRedo, details);
168
+ case "copy":
169
+ return runShortcutHandler(handlers.onCopy, details);
170
+ case "cut":
171
+ return runShortcutHandler(handlers.onCut, details);
172
+ case "paste":
173
+ return runShortcutHandler(handlers.onPaste, details);
174
+ case "duplicate":
175
+ return runShortcutHandler(handlers.onDuplicate, details);
176
+ case "delete":
177
+ return runShortcutHandler(handlers.onDelete, details);
178
+ case "bring-forward":
179
+ return runShortcutHandler(handlers.onBringForward, details);
180
+ case "bring-to-front":
181
+ return runShortcutHandler(handlers.onBringToFront, details);
182
+ case "send-backward":
183
+ return runShortcutHandler(handlers.onSendBackward, details);
184
+ case "send-to-back":
185
+ return runShortcutHandler(handlers.onSendToBack, details);
186
+ case "group":
187
+ return runShortcutHandler(handlers.onGroup, details);
188
+ case "ungroup":
189
+ return runShortcutHandler(handlers.onUngroup, details);
190
+ case "frame-selection":
191
+ return runShortcutHandler(handlers.onFrameSelection, details);
192
+ case "escape":
193
+ return runShortcutHandler(handlers.onEscape, details);
194
+ case "enter":
195
+ return runShortcutHandler(handlers.onEnter, details);
196
+ case "nudge-left":
197
+ return runNudgeHandler(handlers.onNudge, details, "left", command);
198
+ case "nudge-right":
199
+ return runNudgeHandler(handlers.onNudge, details, "right", command);
200
+ case "nudge-up":
201
+ return runNudgeHandler(handlers.onNudge, details, "up", command);
202
+ case "nudge-down":
203
+ return runNudgeHandler(handlers.onNudge, details, "down", command);
204
+ case "align-left":
205
+ return runAlignHandler(handlers.onAlignSelection, details, "left");
206
+ case "align-center":
207
+ return runAlignHandler(handlers.onAlignSelection, details, "center-h");
208
+ case "align-right":
209
+ return runAlignHandler(handlers.onAlignSelection, details, "right");
210
+ case "align-top":
211
+ return runAlignHandler(handlers.onAlignSelection, details, "top");
212
+ case "align-middle":
213
+ return runAlignHandler(handlers.onAlignSelection, details, "center-v");
214
+ case "align-bottom":
215
+ return runAlignHandler(handlers.onAlignSelection, details, "bottom");
216
+ case "distribute-horizontal":
217
+ return runDistributeHandler(
218
+ handlers.onDistributeSelection,
219
+ details,
220
+ "horizontal",
221
+ );
222
+ case "distribute-vertical":
223
+ return runDistributeHandler(
224
+ handlers.onDistributeSelection,
225
+ details,
226
+ "vertical",
227
+ );
228
+ case "arrange-front":
229
+ return runShortcutHandler(handlers.onBringToFront, details);
230
+ case "arrange-back":
231
+ return runShortcutHandler(handlers.onSendToBack, details);
232
+ case "select-all":
233
+ return runShortcutHandler(handlers.onSelectAll, details);
234
+ case "nudge":
235
+ return { handled: false, reason: "unhandled" };
236
+ }
237
+ return { handled: false, reason: "unhandled" };
238
+ }
239
+
240
+ function runShortcutHandler(
241
+ handler:
242
+ | ((details: {
243
+ event: KeyboardEvent;
244
+ key: string;
245
+ primary: boolean;
246
+ shift: boolean;
247
+ alt: boolean;
248
+ repeat: boolean;
249
+ }) => void)
250
+ | undefined,
251
+ details: {
252
+ event: KeyboardEvent;
253
+ key: string;
254
+ primary: boolean;
255
+ shift: boolean;
256
+ alt: boolean;
257
+ repeat: boolean;
258
+ },
259
+ ): CanvasCommandDispatchResult {
260
+ if (!handler) return { handled: false, reason: "unhandled" };
261
+ handler(details);
262
+ return { handled: true };
263
+ }
264
+
265
+ function runNudgeHandler(
266
+ handler: UseDesignHotkeysProps["onNudge"],
267
+ details: DesignHotkeyDetails,
268
+ direction: "left" | "right" | "up" | "down",
269
+ command: CanvasCommand,
270
+ ): CanvasCommandDispatchResult {
271
+ if (!handler) return { handled: false, reason: "unhandled" };
272
+ const amount = Math.max(
273
+ Math.abs(command.delta?.x ?? 0),
274
+ Math.abs(command.delta?.y ?? 0),
275
+ );
276
+ handler({ ...details, direction, largeStep: amount >= 10 || details.shift });
277
+ return { handled: true };
278
+ }
279
+
280
+ function runAlignHandler(
281
+ handler: UseDesignHotkeysProps["onAlignSelection"],
282
+ details: DesignHotkeyDetails,
283
+ edge: "left" | "center-h" | "right" | "top" | "center-v" | "bottom",
284
+ ): CanvasCommandDispatchResult {
285
+ if (!handler) return { handled: false, reason: "unhandled" };
286
+ handler({ ...details, edge });
287
+ return { handled: true };
288
+ }
289
+
290
+ function runDistributeHandler(
291
+ handler: UseDesignHotkeysProps["onDistributeSelection"],
292
+ details: DesignHotkeyDetails,
293
+ axis: "horizontal" | "vertical",
294
+ ): CanvasCommandDispatchResult {
295
+ if (!handler) return { handled: false, reason: "unhandled" };
296
+ handler({ ...details, axis });
297
+ return { handled: true };
298
+ }
299
+
300
+ /**
301
+ * The Design adapter is deliberately small. `DesignEditor` remains the owner
302
+ * of selection canonicalization and source writes; a future Toolkit canvas
303
+ * controller can call this object without importing the iframe bridge.
304
+ *
305
+ * Wiring points:
306
+ * - DesignCanvas onElementSelect / onElementDblClickText -> selection
307
+ * - DesignCanvas visual/text callbacks -> persistence
308
+ * - useDesignHotkeys handlers -> shortcuts
309
+ */
310
+ export function createDesignCanvasInteractionAdapter(
311
+ options: CreateDesignCanvasInteractionAdapterOptions,
312
+ ): DesignCanvasInteractionAdapter {
313
+ return {
314
+ id: "design",
315
+ capabilities: DESIGN_CANVAS_INTERACTION_CAPABILITIES,
316
+ textEditing: {
317
+ activation: "double-click",
318
+ escapeBehavior: "select-object",
319
+ },
320
+ dispatch: (command) =>
321
+ dispatchDesignShortcut(
322
+ command,
323
+ options.getHotkeyDetails?.(command) ?? null,
324
+ options.shortcuts,
325
+ ),
326
+ dispatchShortcut: (command, event) =>
327
+ dispatchDesignShortcut(
328
+ { id: command },
329
+ {
330
+ event,
331
+ key: event.key,
332
+ primary: event.metaKey || event.ctrlKey,
333
+ shift: event.shiftKey,
334
+ alt: event.altKey,
335
+ repeat: event.repeat,
336
+ },
337
+ options.shortcuts,
338
+ ),
339
+ dispatchKeyboardEvent: (event) => {
340
+ const command = canvasCommandForDesignKeyboardEvent(event);
341
+ return command
342
+ ? dispatchDesignShortcut(
343
+ { id: command },
344
+ {
345
+ event,
346
+ key: event.key,
347
+ primary: event.metaKey || event.ctrlKey,
348
+ shift: event.shiftKey,
349
+ alt: event.altKey,
350
+ repeat: event.repeat,
351
+ },
352
+ options.shortcuts,
353
+ )
354
+ : { handled: false, reason: "unhandled" };
355
+ },
356
+ };
357
+ }