@agent-native/core 0.92.12 → 0.93.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (772) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +39 -0
  3. package/corpus/core/docs/content/automation-connectors.mdx +80 -0
  4. package/corpus/core/docs/content/extensions.mdx +8 -0
  5. package/corpus/core/docs/content/locales/ar-SA/extensions.mdx +8 -0
  6. package/corpus/core/docs/content/locales/ar-SA/messaging.mdx +84 -15
  7. package/corpus/core/docs/content/locales/ar-SA/template-clips.mdx +1 -0
  8. package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +1 -0
  9. package/corpus/core/docs/content/locales/de-DE/extensions.mdx +10 -0
  10. package/corpus/core/docs/content/locales/de-DE/messaging.mdx +92 -15
  11. package/corpus/core/docs/content/locales/de-DE/template-clips.mdx +1 -0
  12. package/corpus/core/docs/content/locales/de-DE/template-design.mdx +1 -0
  13. package/corpus/core/docs/content/locales/es-ES/extensions.mdx +10 -0
  14. package/corpus/core/docs/content/locales/es-ES/messaging.mdx +91 -15
  15. package/corpus/core/docs/content/locales/es-ES/template-clips.mdx +1 -0
  16. package/corpus/core/docs/content/locales/es-ES/template-design.mdx +1 -0
  17. package/corpus/core/docs/content/locales/fr-FR/extensions.mdx +10 -0
  18. package/corpus/core/docs/content/locales/fr-FR/messaging.mdx +91 -15
  19. package/corpus/core/docs/content/locales/fr-FR/template-clips.mdx +1 -0
  20. package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +1 -0
  21. package/corpus/core/docs/content/locales/hi-IN/extensions.mdx +8 -0
  22. package/corpus/core/docs/content/locales/hi-IN/messaging.mdx +81 -15
  23. package/corpus/core/docs/content/locales/hi-IN/template-clips.mdx +1 -0
  24. package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +1 -0
  25. package/corpus/core/docs/content/locales/ja-JP/extensions.mdx +9 -0
  26. package/corpus/core/docs/content/locales/ja-JP/messaging.mdx +81 -15
  27. package/corpus/core/docs/content/locales/ja-JP/template-clips.mdx +1 -0
  28. package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +1 -0
  29. package/corpus/core/docs/content/locales/ko-KR/extensions.mdx +8 -0
  30. package/corpus/core/docs/content/locales/ko-KR/messaging.mdx +80 -15
  31. package/corpus/core/docs/content/locales/ko-KR/template-clips.mdx +1 -0
  32. package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +1 -0
  33. package/corpus/core/docs/content/locales/pt-BR/extensions.mdx +9 -0
  34. package/corpus/core/docs/content/locales/pt-BR/messaging.mdx +88 -15
  35. package/corpus/core/docs/content/locales/pt-BR/template-clips.mdx +1 -0
  36. package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +1 -0
  37. package/corpus/core/docs/content/locales/zh-CN/extensions.mdx +6 -0
  38. package/corpus/core/docs/content/locales/zh-CN/messaging.mdx +78 -15
  39. package/corpus/core/docs/content/locales/zh-CN/template-clips.mdx +1 -0
  40. package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +1 -0
  41. package/corpus/core/docs/content/locales/zh-TW/extensions.mdx +6 -0
  42. package/corpus/core/docs/content/locales/zh-TW/messaging.mdx +78 -15
  43. package/corpus/core/docs/content/locales/zh-TW/template-clips.mdx +1 -0
  44. package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +1 -0
  45. package/corpus/core/docs/content/messaging.mdx +227 -45
  46. package/corpus/core/docs/content/template-clips.mdx +3 -0
  47. package/corpus/core/docs/content/template-design.mdx +4 -0
  48. package/corpus/core/package.json +5 -1
  49. package/corpus/core/src/a2a/artifact-response.ts +131 -2
  50. package/corpus/core/src/a2a/client.ts +10 -0
  51. package/corpus/core/src/a2a/handlers.ts +40 -76
  52. package/corpus/core/src/a2a/types.ts +2 -0
  53. package/corpus/core/src/agent/durable-background.ts +24 -0
  54. package/corpus/core/src/agent/production-agent.ts +15 -3
  55. package/corpus/core/src/agent/run-manager.ts +130 -10
  56. package/corpus/core/src/agent/run-store.ts +225 -15
  57. package/corpus/core/src/agent/types.ts +23 -0
  58. package/corpus/core/src/audit/record.ts +31 -0
  59. package/corpus/core/src/audit/store.ts +69 -3
  60. package/corpus/core/src/audit/types.ts +13 -0
  61. package/corpus/core/src/automation/index.ts +802 -0
  62. package/corpus/core/src/cli/create.ts +12 -5
  63. package/corpus/core/src/cli/design-connect.ts +596 -36
  64. package/corpus/core/src/client/AgentPanel.tsx +51 -6
  65. package/corpus/core/src/client/AssistantChat.tsx +274 -147
  66. package/corpus/core/src/client/MultiTabAssistantChat.tsx +3 -0
  67. package/corpus/core/src/client/RunStuckBanner.tsx +69 -20
  68. package/corpus/core/src/client/agent-chat-adapter.ts +54 -5
  69. package/corpus/core/src/client/automation.ts +22 -0
  70. package/corpus/core/src/client/chat/run-recovery.tsx +67 -50
  71. package/corpus/core/src/client/composer/TiptapComposer.tsx +8 -0
  72. package/corpus/core/src/client/index.ts +30 -0
  73. package/corpus/core/src/client/integrations/api.ts +295 -0
  74. package/corpus/core/src/client/integrations/index.ts +26 -0
  75. package/corpus/core/src/client/transcription/use-live-transcription.ts +68 -5
  76. package/corpus/core/src/client/use-run-stuck-detection.ts +41 -3
  77. package/corpus/core/src/deploy/build.ts +59 -3
  78. package/corpus/core/src/deploy/workspace-deploy.ts +37 -2
  79. package/corpus/core/src/file-upload/types.ts +2 -0
  80. package/corpus/core/src/index.ts +37 -0
  81. package/corpus/core/src/integrations/a2a-continuations-store.ts +6 -4
  82. package/corpus/core/src/integrations/adapters/discord.ts +362 -0
  83. package/corpus/core/src/integrations/adapters/index.ts +29 -0
  84. package/corpus/core/src/integrations/adapters/microsoft-teams.ts +411 -0
  85. package/corpus/core/src/integrations/adapters/slack.ts +861 -27
  86. package/corpus/core/src/integrations/adapters/telegram.ts +54 -15
  87. package/corpus/core/src/integrations/adapters/whatsapp.ts +41 -17
  88. package/corpus/core/src/integrations/catalog.ts +571 -0
  89. package/corpus/core/src/integrations/controls-store.ts +187 -0
  90. package/corpus/core/src/integrations/index.ts +100 -0
  91. package/corpus/core/src/integrations/installations-store.ts +677 -0
  92. package/corpus/core/src/integrations/integration-memory.ts +187 -0
  93. package/corpus/core/src/integrations/pending-tasks-retry-job.ts +6 -6
  94. package/corpus/core/src/integrations/pending-tasks-store.ts +83 -5
  95. package/corpus/core/src/integrations/plugin.ts +685 -47
  96. package/corpus/core/src/integrations/scope-store.ts +498 -0
  97. package/corpus/core/src/integrations/slack-manifest.ts +78 -0
  98. package/corpus/core/src/integrations/slack-oauth.ts +343 -0
  99. package/corpus/core/src/integrations/types.ts +179 -0
  100. package/corpus/core/src/integrations/usage-budget-store.ts +906 -0
  101. package/corpus/core/src/integrations/webhook-handler.ts +562 -51
  102. package/corpus/core/src/jobs/scheduler.ts +100 -2
  103. package/corpus/core/src/jobs/tools.ts +45 -9
  104. package/corpus/core/src/provider-api/index.ts +72 -1
  105. package/corpus/core/src/resources/handlers.ts +88 -14
  106. package/corpus/core/src/resources/script-helpers.ts +36 -7
  107. package/corpus/core/src/resources/store.ts +59 -52
  108. package/corpus/core/src/scripts/call-agent.ts +107 -1
  109. package/corpus/core/src/server/agent-chat-plugin.ts +294 -119
  110. package/corpus/core/src/server/auth.ts +10 -14
  111. package/corpus/core/src/server/builder-design-systems.ts +16 -1
  112. package/corpus/core/src/server/edge.ts +18 -0
  113. package/corpus/core/src/server/index.ts +26 -0
  114. package/corpus/core/src/server/request-context.ts +18 -0
  115. package/corpus/core/src/server/social-og-image.ts +3 -2
  116. package/corpus/core/src/styles/agent-native.css +62 -44
  117. package/corpus/core/src/templates/default/.agents/skills/capture-learnings/SKILL.md +22 -9
  118. package/corpus/core/src/templates/default/AGENTS.md +7 -3
  119. package/corpus/core/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +1 -1
  120. package/corpus/core/src/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +22 -9
  121. package/corpus/core/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +6 -3
  122. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +25 -0
  123. package/corpus/core/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +15 -0
  124. package/corpus/core/src/templates/workspace-core/AGENTS.md +3 -2
  125. package/corpus/core/src/usage/store.ts +37 -2
  126. package/corpus/templates/analytics/.agents/skills/capture-learnings/SKILL.md +22 -9
  127. package/corpus/templates/analytics/.agents/skills/provider-api/SKILL.md +23 -0
  128. package/corpus/templates/analytics/.builder/skills/provider-api/SKILL.md +15 -0
  129. package/corpus/templates/analytics/actions/save-monitor.ts +25 -2
  130. package/corpus/templates/analytics/app/lib/data-sources.ts +28 -0
  131. package/corpus/templates/analytics/changelog/2026-07-10-agent-created-uptime-monitors-now-return-a-direct-link-to-th.md +6 -0
  132. package/corpus/templates/analytics/changelog/2026-07-10-dashboard-email-reports-still-arrive-when-screenshot-capture-temporarily-fails.md +6 -0
  133. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +3 -7
  134. package/corpus/templates/analytics/server/lib/credential-keys.ts +12 -0
  135. package/corpus/templates/analytics/server/lib/dashboard-report.ts +5 -1
  136. package/corpus/templates/analytics/server/lib/provider-credentials.ts +2 -0
  137. package/corpus/templates/analytics/server/routes/api/test-connection.post.ts +16 -0
  138. package/corpus/templates/assets/.agents/skills/capture-learnings/SKILL.md +22 -9
  139. package/corpus/templates/brain/.agents/skills/capture-learnings/SKILL.md +22 -9
  140. package/corpus/templates/calendar/.agents/skills/capture-learnings/SKILL.md +22 -9
  141. package/corpus/templates/calendar/app/components/calendar/CommandPalette.tsx +98 -108
  142. package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +97 -90
  143. package/corpus/templates/calendar/changelog/2026-07-10-event-guest-details-and-option-menus-now-use-valid-accessibl.md +6 -0
  144. package/corpus/templates/calendar/changelog/2026-07-10-natural-language-event-phrases-stay-available-as-quick-creat.md +6 -0
  145. package/corpus/templates/chat/.agents/skills/capture-learnings/SKILL.md +22 -9
  146. package/corpus/templates/chat/changelog/2026-07-10-chat-now-makes-ai-connection-setup-clear-without-shifting-th.md +6 -0
  147. package/corpus/templates/clips/.agents/skills/capture-learnings/SKILL.md +22 -9
  148. package/corpus/templates/clips/.agents/skills/recording/SKILL.md +17 -1
  149. package/corpus/templates/clips/.agents/skills/video-sharing/SKILL.md +8 -0
  150. package/corpus/templates/clips/AGENTS.md +8 -3
  151. package/corpus/templates/clips/actions/finalize-recording.ts +63 -23
  152. package/corpus/templates/clips/actions/get-recording-player-data.ts +6 -2
  153. package/corpus/templates/clips/actions/lib/ensure-seekable-video.ts +72 -9
  154. package/corpus/templates/clips/actions/list-recordings.ts +19 -3
  155. package/corpus/templates/clips/actions/navigate.ts +2 -0
  156. package/corpus/templates/clips/actions/reprocess-recording.ts +20 -6
  157. package/corpus/templates/clips/actions/request-transcript.ts +16 -31
  158. package/corpus/templates/clips/actions/view-screen.ts +57 -5
  159. package/corpus/templates/clips/app/components/layout/Header.tsx +1 -0
  160. package/corpus/templates/clips/app/components/library/empty-state.tsx +2 -0
  161. package/corpus/templates/clips/app/components/library/library-grid.tsx +69 -42
  162. package/corpus/templates/clips/app/components/library/library-layout.tsx +15 -1
  163. package/corpus/templates/clips/app/components/library/recording-card.tsx +81 -68
  164. package/corpus/templates/clips/app/components/library/search-bar.tsx +4 -3
  165. package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +9 -3
  166. package/corpus/templates/clips/app/components/player/share-dialog.tsx +1 -1
  167. package/corpus/templates/clips/app/hooks/use-library.ts +1 -1
  168. package/corpus/templates/clips/app/hooks/use-navigation-state.ts +10 -2
  169. package/corpus/templates/clips/app/i18n/ar-SA.ts +7 -1
  170. package/corpus/templates/clips/app/i18n/de-DE.ts +7 -1
  171. package/corpus/templates/clips/app/i18n/en-US.ts +7 -1
  172. package/corpus/templates/clips/app/i18n/es-ES.ts +7 -1
  173. package/corpus/templates/clips/app/i18n/fr-FR.ts +7 -1
  174. package/corpus/templates/clips/app/i18n/hi-IN.ts +7 -1
  175. package/corpus/templates/clips/app/i18n/ja-JP.ts +7 -1
  176. package/corpus/templates/clips/app/i18n/ko-KR.ts +7 -1
  177. package/corpus/templates/clips/app/i18n/pt-BR.ts +7 -1
  178. package/corpus/templates/clips/app/i18n/zh-CN.ts +8 -1
  179. package/corpus/templates/clips/app/i18n/zh-TW.ts +8 -1
  180. package/corpus/templates/clips/app/lib/recording-visibility.ts +70 -0
  181. package/corpus/templates/clips/app/routes/_app.shared.tsx +20 -0
  182. package/corpus/templates/clips/app/routes/download.tsx +24 -8
  183. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +115 -2
  184. package/corpus/templates/clips/app/routes/record.tsx +62 -0
  185. package/corpus/templates/clips/app/routes/share.$shareId.tsx +25 -16
  186. package/corpus/templates/clips/changelog/2026-07-10-clips-desktop-is-now-available-for-linux-with-appimage-debia.md +6 -0
  187. package/corpus/templates/clips/changelog/2026-07-10-clips-downloads-updates-sooner-in-the-background-and-offers-.md +6 -0
  188. package/corpus/templates/clips/changelog/2026-07-10-clips-shared-with-you-now-appear-in-a-searchable-shared-with.md +6 -0
  189. package/corpus/templates/clips/changelog/2026-07-10-clips-with-missing-mobile-video-frames-can-be-repaired-witho.md +6 -0
  190. package/corpus/templates/clips/changelog/2026-07-10-mobile-camera-recordings-pause-while-backgrounded.md +6 -0
  191. package/corpus/templates/clips/changelog/2026-07-10-mp4-downloads-now-show-progress-immediately-after-the-option.md +6 -0
  192. package/corpus/templates/clips/changelog/2026-07-10-recording-pages-now-open-as-soon-as-you-stop-with-a-share-li.md +6 -0
  193. package/corpus/templates/clips/changelog/2026-07-10-recordings-now-seek-smoothly-downloads-use-the-correct-file-.md +6 -0
  194. package/corpus/templates/clips/changelog/2026-07-10-s3-compatible-storage-now-saves-hosted-recordings-without-re.md +6 -0
  195. package/corpus/templates/clips/desktop/README.md +22 -6
  196. package/corpus/templates/clips/desktop/package.json +1 -1
  197. package/corpus/templates/clips/desktop/src/app.tsx +32 -19
  198. package/corpus/templates/clips/desktop/src/components/ReadinessPanel.tsx +15 -9
  199. package/corpus/templates/clips/desktop/src/lib/finalization-guard.ts +22 -0
  200. package/corpus/templates/clips/desktop/src/lib/permissions.ts +3 -1
  201. package/corpus/templates/clips/desktop/src/lib/recorder.ts +97 -120
  202. package/corpus/templates/clips/desktop/src/lib/updater.ts +26 -4
  203. package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +4 -8
  204. package/corpus/templates/clips/desktop/src-tauri/Cargo.toml +1 -1
  205. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +2 -2
  206. package/corpus/templates/clips/desktop/src-tauri/src/permission_status.rs +11 -7
  207. package/corpus/templates/clips/desktop/src-tauri/tauri.linux.conf.json +11 -0
  208. package/corpus/templates/clips/netlify.toml +3 -0
  209. package/corpus/templates/clips/server/lib/post-finalize-dispatch.ts +106 -0
  210. package/corpus/templates/clips/server/lib/public-agent-context.ts +9 -1
  211. package/corpus/templates/clips/server/lib/resumable-upload-provider.ts +52 -0
  212. package/corpus/templates/clips/server/lib/s3-upload-provider.ts +433 -85
  213. package/corpus/templates/clips/server/lib/video-remux.ts +114 -0
  214. package/corpus/templates/clips/server/routes/api/_agent-native-background/post-finalize-worker.post.ts +109 -0
  215. package/corpus/templates/clips/server/routes/api/clips-updater.json.get.ts +22 -11
  216. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +4 -2
  217. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +47 -5
  218. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +10 -2
  219. package/corpus/templates/clips/shared/share-loader-response.ts +12 -0
  220. package/corpus/templates/clips/shared/transcript-status.ts +40 -0
  221. package/corpus/templates/content/.agents/skills/capture-learnings/SKILL.md +22 -9
  222. package/corpus/templates/content/.agents/skills/content/SKILL.md +57 -5
  223. package/corpus/templates/content/AGENTS.md +65 -55
  224. package/corpus/templates/content/actions/_builder-cms-read-client.ts +10 -16
  225. package/corpus/templates/content/actions/_database-source-utils.ts +58 -11
  226. package/corpus/templates/content/actions/_property-utils.ts +30 -2
  227. package/corpus/templates/content/actions/add-content-database-source-field-property.ts +312 -114
  228. package/corpus/templates/content/actions/submit-content-database-form.ts +497 -0
  229. package/corpus/templates/content/actions/update-content-database-view.ts +8 -1
  230. package/corpus/templates/content/actions/view-screen.ts +4 -1
  231. package/corpus/templates/content/agent-native.app-skill.json +1 -1
  232. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +250 -64
  233. package/corpus/templates/content/app/components/editor/database/FormView.tsx +460 -0
  234. package/corpus/templates/content/app/components/editor/database/navigation-state.ts +3 -0
  235. package/corpus/templates/content/app/components/editor/database/settings.tsx +30 -37
  236. package/corpus/templates/content/app/components/editor/database/shared.tsx +2 -0
  237. package/corpus/templates/content/app/components/editor/database/view-config.ts +29 -1
  238. package/corpus/templates/content/app/components/ui/textarea.tsx +1 -0
  239. package/corpus/templates/content/app/hooks/use-content-database.ts +22 -0
  240. package/corpus/templates/content/app/i18n/zh-TW.ts +21 -0
  241. package/corpus/templates/content/app/i18n-data.ts +225 -0
  242. package/corpus/templates/content/changelog/2026-07-10-builder-backed-properties-now-load-current-source-values-as-.md +6 -0
  243. package/corpus/templates/content/changelog/2026-07-10-builder-database-refreshes-now-stay-explicit-and-accurate.md +6 -0
  244. package/corpus/templates/content/changelog/2026-07-10-database-form-views-now-collect-ordered-required-answers-and.md +6 -0
  245. package/corpus/templates/content/changelog/2026-07-10-database-tables-now-use-a-quieter-more-compact-layout-with-c.md +6 -0
  246. package/corpus/templates/content/changelog/2026-07-10-slack-intake-routes-to-content-database-forms.md +6 -0
  247. package/corpus/templates/content/parity/matrix.md +1 -0
  248. package/corpus/templates/content/parity/matrix.ts +18 -0
  249. package/corpus/templates/content/shared/api.ts +27 -1
  250. package/corpus/templates/content/shared/database-form.ts +53 -0
  251. package/corpus/templates/design/.agents/skills/capture-learnings/SKILL.md +22 -9
  252. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +26 -0
  253. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +85 -12
  254. package/corpus/templates/design/AGENTS.md +72 -18
  255. package/corpus/templates/design/DESIGN.md +1 -1
  256. package/corpus/templates/design/DEVELOPING.md +1 -1
  257. package/corpus/templates/design/FIGMA_INTEROPERABILITY.md +116 -0
  258. package/corpus/templates/design/actions/create-design-from-template.ts +220 -0
  259. package/corpus/templates/design/actions/create-design-system.ts +92 -16
  260. package/corpus/templates/design/actions/delete-design-template.ts +28 -0
  261. package/corpus/templates/design/actions/delete-file.ts +7 -0
  262. package/corpus/templates/design/actions/edit-design.ts +3 -0
  263. package/corpus/templates/design/actions/export-design-as-figma-svg.ts +137 -5
  264. package/corpus/templates/design/actions/export-pdf.ts +1 -1
  265. package/corpus/templates/design/actions/generate-design.ts +3 -0
  266. package/corpus/templates/design/actions/get-design-snapshot.ts +9 -0
  267. package/corpus/templates/design/actions/get-figma-connection-status.ts +26 -0
  268. package/corpus/templates/design/actions/get-figma-design-context.ts +138 -0
  269. package/corpus/templates/design/actions/get-figma-styles.ts +2 -2
  270. package/corpus/templates/design/actions/import-figma-clipboard.ts +112 -16
  271. package/corpus/templates/design/actions/import-figma-frame.ts +15 -4
  272. package/corpus/templates/design/actions/index-design-system-with-builder.ts +4 -0
  273. package/corpus/templates/design/actions/list-design-templates.ts +118 -0
  274. package/corpus/templates/design/actions/navigate.ts +16 -2
  275. package/corpus/templates/design/actions/provider-api-request.ts +11 -1
  276. package/corpus/templates/design/actions/save-design-as-template.ts +156 -0
  277. package/corpus/templates/design/actions/set-active-breakpoint.ts +13 -4
  278. package/corpus/templates/design/actions/take-design-screenshot.ts +73 -3
  279. package/corpus/templates/design/actions/update-file.ts +39 -22
  280. package/corpus/templates/design/actions/view-screen.ts +36 -1
  281. package/corpus/templates/design/actions/write-local-file.ts +50 -38
  282. package/corpus/templates/design/app/components/design/AutoLayoutSuggestionDialog.tsx +151 -0
  283. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +20 -0
  284. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +251 -22
  285. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +3 -3
  286. package/corpus/templates/design/app/components/design/DesignImportPanel.tsx +384 -9
  287. package/corpus/templates/design/app/components/design/EditPanel.tsx +105 -32
  288. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +58 -28
  289. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +6 -0
  290. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +539 -53
  291. package/corpus/templates/design/app/components/design/bridge/embedded-wheel.bridge.ts +40 -0
  292. package/corpus/templates/design/app/components/design/code-workbench/CodeWorkbench.tsx +1 -0
  293. package/corpus/templates/design/app/components/design/code-workbench/explorer/ExplorerView.tsx +1 -0
  294. package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +5 -1
  295. package/corpus/templates/design/app/components/design/code-workbench/workspace/create-providers.ts +2 -0
  296. package/corpus/templates/design/app/components/design/code-workbench/workspace/localhost-provider.ts +3 -1
  297. package/corpus/templates/design/app/components/design/code-workbench/workspace/types.ts +2 -0
  298. package/corpus/templates/design/app/components/design/edit-panel/element-identity.ts +19 -0
  299. package/corpus/templates/design/app/components/design/edit-panel/frame-presets-panel.tsx +1 -0
  300. package/corpus/templates/design/app/components/design/edit-panel/interaction-state-helpers.ts +27 -0
  301. package/corpus/templates/design/app/components/design/inspector/InteractionStatePanel.tsx +137 -81
  302. package/corpus/templates/design/app/components/design/inspector/frame-size-presets.ts +25 -5
  303. package/corpus/templates/design/app/components/design/multi-screen/chrome-transitions.ts +1 -1
  304. package/corpus/templates/design/app/components/design/multi-screen/frame-geometry.ts +220 -3
  305. package/corpus/templates/design/app/components/design/multi-screen/overview-layout.ts +13 -0
  306. package/corpus/templates/design/app/components/design/multi-screen/types.ts +22 -1
  307. package/corpus/templates/design/app/components/design/types.ts +4 -0
  308. package/corpus/templates/design/app/components/design-system/ProductionDesignSystemShowcase.tsx +208 -0
  309. package/corpus/templates/design/app/components/editor/FigmaLinkComposerBubble.tsx +321 -0
  310. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +24 -4
  311. package/corpus/templates/design/app/components/layout/Layout.tsx +16 -2
  312. package/corpus/templates/design/app/components/layout/Sidebar.tsx +2 -0
  313. package/corpus/templates/design/app/components/templates/TemplatePreview.tsx +72 -0
  314. package/corpus/templates/design/app/global.css +2 -35
  315. package/corpus/templates/design/app/hooks/use-navigation-state.ts +10 -0
  316. package/corpus/templates/design/app/i18n/zh-TW.ts +127 -5
  317. package/corpus/templates/design/app/i18n-breakpoints.ts +209 -0
  318. package/corpus/templates/design/app/i18n-data.ts +1317 -59
  319. package/corpus/templates/design/app/i18n-template-feature.ts +458 -0
  320. package/corpus/templates/design/app/lib/design-clipboard.ts +202 -0
  321. package/corpus/templates/design/app/lib/design-file-upload.ts +87 -0
  322. package/corpus/templates/design/app/lib/design-import.ts +168 -11
  323. package/corpus/templates/design/app/lib/desktop-design-preview.ts +423 -0
  324. package/corpus/templates/design/app/lib/figma-clipboard.ts +74 -8
  325. package/corpus/templates/design/app/lib/figma-connection.ts +161 -0
  326. package/corpus/templates/design/app/lib/figma-svg-copy.ts +814 -22
  327. package/corpus/templates/design/app/lib/figma-url.ts +77 -0
  328. package/corpus/templates/design/app/lib/pending-generation.ts +35 -0
  329. package/corpus/templates/design/app/pages/DesignSystems.tsx +236 -177
  330. package/corpus/templates/design/app/pages/Index.tsx +38 -0
  331. package/corpus/templates/design/app/pages/Templates.tsx +498 -0
  332. package/corpus/templates/design/app/pages/design-editor/auto-layout-suggestion.ts +328 -0
  333. package/corpus/templates/design/app/pages/design-editor/clone-idrefs.ts +113 -0
  334. package/corpus/templates/design/app/pages/design-editor/created-screen-navigation.ts +55 -0
  335. package/corpus/templates/design/app/pages/design-editor/editor-session.ts +32 -0
  336. package/corpus/templates/design/app/pages/design-editor/editor-state.ts +49 -2
  337. package/corpus/templates/design/app/pages/design-editor/export-capture.ts +296 -0
  338. package/corpus/templates/design/app/pages/design-editor/history.ts +101 -2
  339. package/corpus/templates/design/app/pages/design-editor/layout-operations.ts +28 -1
  340. package/corpus/templates/design/app/pages/design-editor/overview-camera.ts +34 -0
  341. package/corpus/templates/design/app/pages/design-editor/pending-edits.ts +202 -6
  342. package/corpus/templates/design/app/pages/design-editor/pending-structure-verification.ts +92 -0
  343. package/corpus/templates/design/app/pages/design-editor/save-failure.ts +58 -0
  344. package/corpus/templates/design/app/routes/templates.tsx +4 -6
  345. package/corpus/templates/design/changelog/2026-07-10-app-workspaces-now-use-clean-borderless-main-surfaces-throug.md +6 -0
  346. package/corpus/templates/design/changelog/2026-07-10-ask-chat-what-s-in-a-figma-file-or-frame-structure-screensho.md +6 -0
  347. package/corpus/templates/design/changelog/2026-07-10-canvas-edits-now-reject-malformed-html-before-it-can-corrupt.md +6 -0
  348. package/corpus/templates/design/changelog/2026-07-10-complex-designs-now-export-as-valid-secure-svgs-and-crisp-ra.md +6 -0
  349. package/corpus/templates/design/changelog/2026-07-10-complex-figma-masks-arcs-rich-text-transformed-images-and-ad.md +6 -0
  350. package/corpus/templates/design/changelog/2026-07-10-copied-layers-paste-across-designs-and-browser-tabs.md +6 -0
  351. package/corpus/templates/design/changelog/2026-07-10-copy-and-download-editable-figma-svg.md +6 -0
  352. package/corpus/templates/design/changelog/2026-07-10-copying-design-text-now-pastes-readable-text-into-other-apps.md +6 -0
  353. package/corpus/templates/design/changelog/2026-07-10-deleted-screens-can-be-restored-with-undo-and-removed-again-.md +6 -0
  354. package/corpus/templates/design/changelog/2026-07-10-design-changes-now-save-before-switching-apps-and-retry-when.md +6 -0
  355. package/corpus/templates/design/changelog/2026-07-10-design-stays-usable-on-phones-by-keeping-editor-panels-and-f.md +6 -0
  356. package/corpus/templates/design/changelog/2026-07-10-download-all-screens-as-one-multi-page-pdf-from-the-overview.md +6 -0
  357. package/corpus/templates/design/changelog/2026-07-10-duplicated-layers-now-keep-labels-aria-relationships-fragmen.md +6 -0
  358. package/corpus/templates/design/changelog/2026-07-10-fig-import-results-stay-compact.md +6 -0
  359. package/corpus/templates/design/changelog/2026-07-10-figma-imports-now-load-real-fonts-fix-rotated-gradient-dashe.md +6 -0
  360. package/corpus/templates/design/changelog/2026-07-10-figma-links-in-chat-and-the-import-tab-now-offer-secure-one-.md +6 -0
  361. package/corpus/templates/design/changelog/2026-07-10-fixed-cmd-z-not-restoring-content-after-an-agent-driven-desi.md +6 -0
  362. package/corpus/templates/design/changelog/2026-07-10-fixed-download-pdf-being-unreachable-from-the-export-panel-e.md +6 -0
  363. package/corpus/templates/design/changelog/2026-07-10-fixed-dragging-a-layer-out-of-an-auto-layout-row-column-no-l.md +6 -0
  364. package/corpus/templates/design/changelog/2026-07-10-fixed-figma-svg-export-text-wrapping-sizing-and-inner-layer.md +6 -0
  365. package/corpus/templates/design/changelog/2026-07-10-fixed-hiding-or-locking-one-layer-no-longer-hides-or-blocks-.md +6 -0
  366. package/corpus/templates/design/changelog/2026-07-10-fixed-png-screenshots-of-tall-screens-being-cropped-to-one-v.md +6 -0
  367. package/corpus/templates/design/changelog/2026-07-10-fixed-png-svg-exports-capturing-broken-layout-when-webfonts-.md +6 -0
  368. package/corpus/templates/design/changelog/2026-07-10-frame-tool-now-offers-standard-ad-unit-size-presets-medium-r.md +6 -0
  369. package/corpus/templates/design/changelog/2026-07-10-full-view-controls-stay-within-their-frame-instead-of-coveri.md +6 -0
  370. package/corpus/templates/design/changelog/2026-07-10-hover-focus-focus-visible-pressed-and-disabled-states-now-pr.md +6 -0
  371. package/corpus/templates/design/changelog/2026-07-10-layer-drops-now-land-in-the-intended-grid-row-stay-visually-.md +6 -0
  372. package/corpus/templates/design/changelog/2026-07-10-local-code-workspaces-now-keep-unsaved-edits-across-panel-sw.md +6 -0
  373. package/corpus/templates/design/changelog/2026-07-10-local-visual-editing-now-keeps-authenticated-sessions-shared.md +6 -0
  374. package/corpus/templates/design/changelog/2026-07-10-long-running-agent-work-no-longer-shows-a-premature-stuck-wa.md +6 -0
  375. package/corpus/templates/design/changelog/2026-07-10-managed-figma-connections-are-recognized-automatically.md +6 -0
  376. package/corpus/templates/design/changelog/2026-07-10-new-designs-can-open-directly-in-the-editor-without-a-pr.md +6 -0
  377. package/corpus/templates/design/changelog/2026-07-10-new-screens-are-selected-and-revealed-immediately.md +6 -0
  378. package/corpus/templates/design/changelog/2026-07-10-new-text-layers-undo-as-one-safe-creation.md +6 -0
  379. package/corpus/templates/design/changelog/2026-07-10-preview-and-apply-inferred-auto-layout-without-changing-yo.md +5 -0
  380. package/corpus/templates/design/changelog/2026-07-10-print-pdf-exports-and-paper-size-presets-letter-a4-now-match.md +6 -0
  381. package/corpus/templates/design/changelog/2026-07-10-responsive-frame-editing.md +6 -0
  382. package/corpus/templates/design/changelog/2026-07-10-reusable-design-templates.md +6 -0
  383. package/corpus/templates/design/changelog/2026-07-10-screen-overview-frames-now-use-a-clearer-interact-action-wit.md +6 -0
  384. package/corpus/templates/design/changelog/2026-07-10-start-designs-from-source-linked-material-3-carbon-or-primer.md +6 -0
  385. package/corpus/templates/design/changelog/2026-07-10-tweaks-guidance.md +6 -0
  386. package/corpus/templates/design/changelog/2026-07-10-uploaded-fig-files-can-now-become-editable-design-screens-wi.md +6 -0
  387. package/corpus/templates/design/e2e/helpers.ts +3 -3
  388. package/corpus/templates/design/package.json +2 -0
  389. package/corpus/templates/design/scripts/qa-figma-stress-import.ts +96 -0
  390. package/corpus/templates/design/server/db/index.ts +10 -0
  391. package/corpus/templates/design/server/db/schema.ts +44 -0
  392. package/corpus/templates/design/server/handlers/import-design-file.ts +114 -80
  393. package/corpus/templates/design/server/handlers/index-design-system-with-builder.ts +19 -6
  394. package/corpus/templates/design/server/lib/design-export.ts +240 -3
  395. package/corpus/templates/design/server/lib/design-template-data.ts +89 -0
  396. package/corpus/templates/design/server/lib/design-to-figma-svg.ts +250 -26
  397. package/corpus/templates/design/server/lib/fig-file-decoder.ts +839 -0
  398. package/corpus/templates/design/server/lib/fig-file-import.ts +287 -0
  399. package/corpus/templates/design/server/lib/fig-file-limits.ts +3 -0
  400. package/corpus/templates/design/server/lib/fig-file-to-html.ts +2568 -0
  401. package/corpus/templates/design/server/lib/figma-design-context.ts +359 -0
  402. package/corpus/templates/design/server/lib/figma-node-import.ts +478 -22
  403. package/corpus/templates/design/server/lib/figma-node-to-html.ts +554 -29
  404. package/corpus/templates/design/server/lib/local-figma-qa-upload.ts +112 -0
  405. package/corpus/templates/design/server/lib/verify-write-grant.ts +16 -2
  406. package/corpus/templates/design/server/lib/visible-clipboard-html.ts +13 -3
  407. package/corpus/templates/design/server/plugins/agent-chat.ts +7 -0
  408. package/corpus/templates/design/server/plugins/db.ts +42 -0
  409. package/corpus/templates/design/server/plugins/local-figma-qa-upload.ts +7 -0
  410. package/corpus/templates/design/server/register-secrets.ts +8 -8
  411. package/corpus/templates/design/server/routes/api/qa-figma-import-assets/[assetId].get.ts +46 -0
  412. package/corpus/templates/design/server/source-workspace.ts +104 -12
  413. package/corpus/templates/design/shared/code-layer.ts +105 -28
  414. package/corpus/templates/design/shared/design-system-templates.ts +301 -0
  415. package/corpus/templates/design/shared/design-template-presets.ts +195 -0
  416. package/corpus/templates/design/shared/figma-url.ts +8 -0
  417. package/corpus/templates/design/shared/html-integrity.ts +306 -0
  418. package/corpus/templates/design/shared/interaction-states.ts +318 -23
  419. package/corpus/templates/design/shared/locked-layers.ts +151 -0
  420. package/corpus/templates/dispatch/.agents/skills/capture-learnings/SKILL.md +22 -9
  421. package/corpus/templates/dispatch/app/i18n/zh-TW.ts +48 -0
  422. package/corpus/templates/dispatch/app/i18n-data.ts +536 -1
  423. package/corpus/templates/dispatch/changelog/2026-07-10-connect-slack-workspaces-with-oauth-and-manage-channel-ident.md +6 -0
  424. package/corpus/templates/dispatch/changelog/2026-07-10-microsoft-teams-bots-and-discord-slash-commands-can-now-conn.md +6 -0
  425. package/corpus/templates/dispatch/changelog/2026-07-10-slack-and-telegram-now-route-uptime-monitor-requests-to-anal.md +6 -0
  426. package/corpus/templates/forms/.agents/skills/capture-learnings/SKILL.md +22 -9
  427. package/corpus/templates/forms/.agents/skills/form-publishing/SKILL.md +7 -0
  428. package/corpus/templates/forms/AGENTS.md +4 -0
  429. package/corpus/templates/forms/actions/create-form.ts +44 -7
  430. package/corpus/templates/forms/actions/lib/assert-publishable-form.ts +38 -0
  431. package/corpus/templates/forms/actions/patch-form-fields.ts +4 -0
  432. package/corpus/templates/forms/actions/update-form.ts +2 -36
  433. package/corpus/templates/forms/app/i18n/ar-SA.ts +3 -0
  434. package/corpus/templates/forms/app/i18n/de-DE.ts +3 -0
  435. package/corpus/templates/forms/app/i18n/en-US.ts +3 -0
  436. package/corpus/templates/forms/app/i18n/es-ES.ts +3 -0
  437. package/corpus/templates/forms/app/i18n/fr-FR.ts +3 -0
  438. package/corpus/templates/forms/app/i18n/hi-IN.ts +3 -0
  439. package/corpus/templates/forms/app/i18n/ja-JP.ts +3 -0
  440. package/corpus/templates/forms/app/i18n/ko-KR.ts +3 -0
  441. package/corpus/templates/forms/app/i18n/pt-BR.ts +3 -0
  442. package/corpus/templates/forms/app/i18n/zh-CN.ts +2 -0
  443. package/corpus/templates/forms/app/i18n/zh-TW.ts +3 -0
  444. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +17 -0
  445. package/corpus/templates/forms/changelog/2026-07-10-agent-created-published-forms-now-return-the-anonymous-publi.md +6 -0
  446. package/corpus/templates/forms/changelog/2026-07-10-published-forms-can-no-longer-be-edited-into-an-unusable-emp.md +6 -0
  447. package/corpus/templates/forms/server/handlers/submissions.ts +4 -3
  448. package/corpus/templates/forms/server/plugins/agent-chat.ts +1 -0
  449. package/corpus/templates/forms/shared/types.ts +5 -0
  450. package/corpus/templates/mail/.agents/skills/capture-learnings/SKILL.md +22 -9
  451. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +2 -2
  452. package/corpus/templates/mail/changelog/2026-07-10-mail-navigation-now-uses-a-clean-borderless-drawer.md +6 -0
  453. package/corpus/templates/plan/.agents/skills/capture-learnings/SKILL.md +22 -9
  454. package/corpus/templates/plan/app/lib/plan-local-bridge.ts +4 -1
  455. package/corpus/templates/plan/changelog/2026-07-10-local-plans-now-keep-valid-content-visible-when-one-generate.md +6 -0
  456. package/corpus/templates/plan/server/lib/local-plan-files.ts +4 -1
  457. package/corpus/templates/slides/.agents/skills/capture-learnings/SKILL.md +22 -9
  458. package/dist/a2a/artifact-response.d.ts.map +1 -1
  459. package/dist/a2a/artifact-response.js +88 -2
  460. package/dist/a2a/artifact-response.js.map +1 -1
  461. package/dist/a2a/client.d.ts +9 -0
  462. package/dist/a2a/client.d.ts.map +1 -1
  463. package/dist/a2a/client.js +1 -0
  464. package/dist/a2a/client.js.map +1 -1
  465. package/dist/a2a/handlers.d.ts.map +1 -1
  466. package/dist/a2a/handlers.js +24 -69
  467. package/dist/a2a/handlers.js.map +1 -1
  468. package/dist/a2a/types.d.ts +2 -0
  469. package/dist/a2a/types.d.ts.map +1 -1
  470. package/dist/a2a/types.js.map +1 -1
  471. package/dist/agent/durable-background.d.ts +11 -0
  472. package/dist/agent/durable-background.d.ts.map +1 -1
  473. package/dist/agent/durable-background.js +17 -0
  474. package/dist/agent/durable-background.js.map +1 -1
  475. package/dist/agent/production-agent.d.ts +2 -2
  476. package/dist/agent/production-agent.d.ts.map +1 -1
  477. package/dist/agent/production-agent.js +15 -5
  478. package/dist/agent/production-agent.js.map +1 -1
  479. package/dist/agent/run-manager.d.ts +44 -2
  480. package/dist/agent/run-manager.d.ts.map +1 -1
  481. package/dist/agent/run-manager.js +90 -9
  482. package/dist/agent/run-manager.js.map +1 -1
  483. package/dist/agent/run-store.d.ts +109 -0
  484. package/dist/agent/run-store.d.ts.map +1 -1
  485. package/dist/agent/run-store.js +206 -15
  486. package/dist/agent/run-store.js.map +1 -1
  487. package/dist/agent/types.d.ts +22 -0
  488. package/dist/agent/types.d.ts.map +1 -1
  489. package/dist/agent/types.js.map +1 -1
  490. package/dist/audit/record.d.ts.map +1 -1
  491. package/dist/audit/record.js +29 -0
  492. package/dist/audit/record.js.map +1 -1
  493. package/dist/audit/store.d.ts.map +1 -1
  494. package/dist/audit/store.js +62 -3
  495. package/dist/audit/store.js.map +1 -1
  496. package/dist/audit/types.d.ts +13 -0
  497. package/dist/audit/types.d.ts.map +1 -1
  498. package/dist/audit/types.js.map +1 -1
  499. package/dist/automation/index.d.ts +193 -0
  500. package/dist/automation/index.d.ts.map +1 -0
  501. package/dist/automation/index.js +464 -0
  502. package/dist/automation/index.js.map +1 -0
  503. package/dist/cli/create.d.ts.map +1 -1
  504. package/dist/cli/create.js +10 -3
  505. package/dist/cli/create.js.map +1 -1
  506. package/dist/cli/design-connect.d.ts.map +1 -1
  507. package/dist/cli/design-connect.js +492 -35
  508. package/dist/cli/design-connect.js.map +1 -1
  509. package/dist/client/AgentPanel.d.ts +7 -1
  510. package/dist/client/AgentPanel.d.ts.map +1 -1
  511. package/dist/client/AgentPanel.js +32 -8
  512. package/dist/client/AgentPanel.js.map +1 -1
  513. package/dist/client/AssistantChat.d.ts +15 -0
  514. package/dist/client/AssistantChat.d.ts.map +1 -1
  515. package/dist/client/AssistantChat.js +115 -47
  516. package/dist/client/AssistantChat.js.map +1 -1
  517. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  518. package/dist/client/MultiTabAssistantChat.js +1 -1
  519. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  520. package/dist/client/RunStuckBanner.d.ts +14 -1
  521. package/dist/client/RunStuckBanner.d.ts.map +1 -1
  522. package/dist/client/RunStuckBanner.js +35 -7
  523. package/dist/client/RunStuckBanner.js.map +1 -1
  524. package/dist/client/agent-chat-adapter.d.ts +4 -1
  525. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  526. package/dist/client/agent-chat-adapter.js +49 -4
  527. package/dist/client/agent-chat-adapter.js.map +1 -1
  528. package/dist/client/automation.d.ts +14 -0
  529. package/dist/client/automation.d.ts.map +1 -0
  530. package/dist/client/automation.js +9 -0
  531. package/dist/client/automation.js.map +1 -0
  532. package/dist/client/chat/run-recovery.d.ts +4 -0
  533. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  534. package/dist/client/chat/run-recovery.js +12 -10
  535. package/dist/client/chat/run-recovery.js.map +1 -1
  536. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  537. package/dist/client/composer/TiptapComposer.js +8 -0
  538. package/dist/client/composer/TiptapComposer.js.map +1 -1
  539. package/dist/client/index.d.ts +2 -0
  540. package/dist/client/index.d.ts.map +1 -1
  541. package/dist/client/index.js +2 -0
  542. package/dist/client/index.js.map +1 -1
  543. package/dist/client/integrations/api.d.ts +115 -0
  544. package/dist/client/integrations/api.d.ts.map +1 -0
  545. package/dist/client/integrations/api.js +123 -0
  546. package/dist/client/integrations/api.js.map +1 -0
  547. package/dist/client/integrations/index.d.ts +1 -0
  548. package/dist/client/integrations/index.d.ts.map +1 -1
  549. package/dist/client/integrations/index.js +1 -0
  550. package/dist/client/integrations/index.js.map +1 -1
  551. package/dist/client/transcription/use-live-transcription.d.ts.map +1 -1
  552. package/dist/client/transcription/use-live-transcription.js +59 -5
  553. package/dist/client/transcription/use-live-transcription.js.map +1 -1
  554. package/dist/client/use-run-stuck-detection.d.ts +16 -1
  555. package/dist/client/use-run-stuck-detection.d.ts.map +1 -1
  556. package/dist/client/use-run-stuck-detection.js +23 -4
  557. package/dist/client/use-run-stuck-detection.js.map +1 -1
  558. package/dist/collab/struct-routes.d.ts +1 -1
  559. package/dist/deploy/build.d.ts.map +1 -1
  560. package/dist/deploy/build.js +49 -4
  561. package/dist/deploy/build.js.map +1 -1
  562. package/dist/deploy/workspace-deploy.d.ts.map +1 -1
  563. package/dist/deploy/workspace-deploy.js +31 -2
  564. package/dist/deploy/workspace-deploy.js.map +1 -1
  565. package/dist/file-upload/types.d.ts +2 -0
  566. package/dist/file-upload/types.d.ts.map +1 -1
  567. package/dist/file-upload/types.js.map +1 -1
  568. package/dist/index.d.ts +2 -0
  569. package/dist/index.d.ts.map +1 -1
  570. package/dist/index.js +2 -0
  571. package/dist/index.js.map +1 -1
  572. package/dist/integrations/a2a-continuations-store.d.ts.map +1 -1
  573. package/dist/integrations/a2a-continuations-store.js +6 -4
  574. package/dist/integrations/a2a-continuations-store.js.map +1 -1
  575. package/dist/integrations/adapters/discord.d.ts +3 -0
  576. package/dist/integrations/adapters/discord.d.ts.map +1 -0
  577. package/dist/integrations/adapters/discord.js +261 -0
  578. package/dist/integrations/adapters/discord.js.map +1 -0
  579. package/dist/integrations/adapters/index.d.ts +4 -0
  580. package/dist/integrations/adapters/index.d.ts.map +1 -0
  581. package/dist/integrations/adapters/index.js +26 -0
  582. package/dist/integrations/adapters/index.js.map +1 -0
  583. package/dist/integrations/adapters/microsoft-teams.d.ts +5 -0
  584. package/dist/integrations/adapters/microsoft-teams.d.ts.map +1 -0
  585. package/dist/integrations/adapters/microsoft-teams.js +295 -0
  586. package/dist/integrations/adapters/microsoft-teams.js.map +1 -0
  587. package/dist/integrations/adapters/slack.d.ts +8 -2
  588. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  589. package/dist/integrations/adapters/slack.js +736 -27
  590. package/dist/integrations/adapters/slack.js.map +1 -1
  591. package/dist/integrations/adapters/telegram.d.ts +0 -2
  592. package/dist/integrations/adapters/telegram.d.ts.map +1 -1
  593. package/dist/integrations/adapters/telegram.js +49 -15
  594. package/dist/integrations/adapters/telegram.js.map +1 -1
  595. package/dist/integrations/adapters/whatsapp.d.ts +0 -2
  596. package/dist/integrations/adapters/whatsapp.d.ts.map +1 -1
  597. package/dist/integrations/adapters/whatsapp.js +40 -17
  598. package/dist/integrations/adapters/whatsapp.js.map +1 -1
  599. package/dist/integrations/catalog.d.ts +75 -0
  600. package/dist/integrations/catalog.d.ts.map +1 -0
  601. package/dist/integrations/catalog.js +451 -0
  602. package/dist/integrations/catalog.js.map +1 -0
  603. package/dist/integrations/controls-store.d.ts +44 -0
  604. package/dist/integrations/controls-store.d.ts.map +1 -0
  605. package/dist/integrations/controls-store.js +129 -0
  606. package/dist/integrations/controls-store.js.map +1 -0
  607. package/dist/integrations/index.d.ts +13 -1
  608. package/dist/integrations/index.d.ts.map +1 -1
  609. package/dist/integrations/index.js +9 -0
  610. package/dist/integrations/index.js.map +1 -1
  611. package/dist/integrations/installations-store.d.ts +112 -0
  612. package/dist/integrations/installations-store.d.ts.map +1 -0
  613. package/dist/integrations/installations-store.js +493 -0
  614. package/dist/integrations/installations-store.js.map +1 -0
  615. package/dist/integrations/integration-memory.d.ts +24 -0
  616. package/dist/integrations/integration-memory.d.ts.map +1 -0
  617. package/dist/integrations/integration-memory.js +136 -0
  618. package/dist/integrations/integration-memory.js.map +1 -0
  619. package/dist/integrations/pending-tasks-retry-job.d.ts.map +1 -1
  620. package/dist/integrations/pending-tasks-retry-job.js +6 -5
  621. package/dist/integrations/pending-tasks-retry-job.js.map +1 -1
  622. package/dist/integrations/pending-tasks-store.d.ts +17 -0
  623. package/dist/integrations/pending-tasks-store.d.ts.map +1 -1
  624. package/dist/integrations/pending-tasks-store.js +71 -5
  625. package/dist/integrations/pending-tasks-store.js.map +1 -1
  626. package/dist/integrations/plugin.d.ts.map +1 -1
  627. package/dist/integrations/plugin.js +520 -35
  628. package/dist/integrations/plugin.js.map +1 -1
  629. package/dist/integrations/scope-store.d.ts +65 -0
  630. package/dist/integrations/scope-store.d.ts.map +1 -0
  631. package/dist/integrations/scope-store.js +361 -0
  632. package/dist/integrations/scope-store.js.map +1 -0
  633. package/dist/integrations/slack-manifest.d.ts +66 -0
  634. package/dist/integrations/slack-manifest.d.ts.map +1 -0
  635. package/dist/integrations/slack-manifest.js +70 -0
  636. package/dist/integrations/slack-manifest.js.map +1 -0
  637. package/dist/integrations/slack-oauth.d.ts +99 -0
  638. package/dist/integrations/slack-oauth.d.ts.map +1 -0
  639. package/dist/integrations/slack-oauth.js +226 -0
  640. package/dist/integrations/slack-oauth.js.map +1 -0
  641. package/dist/integrations/types.d.ts +144 -0
  642. package/dist/integrations/types.d.ts.map +1 -1
  643. package/dist/integrations/types.js +16 -1
  644. package/dist/integrations/types.js.map +1 -1
  645. package/dist/integrations/usage-budget-store.d.ts +84 -0
  646. package/dist/integrations/usage-budget-store.d.ts.map +1 -0
  647. package/dist/integrations/usage-budget-store.js +650 -0
  648. package/dist/integrations/usage-budget-store.js.map +1 -0
  649. package/dist/integrations/webhook-handler.d.ts +4 -0
  650. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  651. package/dist/integrations/webhook-handler.js +415 -47
  652. package/dist/integrations/webhook-handler.js.map +1 -1
  653. package/dist/jobs/scheduler.d.ts +6 -0
  654. package/dist/jobs/scheduler.d.ts.map +1 -1
  655. package/dist/jobs/scheduler.js +83 -4
  656. package/dist/jobs/scheduler.js.map +1 -1
  657. package/dist/jobs/tools.d.ts.map +1 -1
  658. package/dist/jobs/tools.js +43 -11
  659. package/dist/jobs/tools.js.map +1 -1
  660. package/dist/observability/routes.d.ts +5 -5
  661. package/dist/progress/routes.d.ts +1 -1
  662. package/dist/provider-api/index.d.ts +4 -4
  663. package/dist/provider-api/index.d.ts.map +1 -1
  664. package/dist/provider-api/index.js +72 -1
  665. package/dist/provider-api/index.js.map +1 -1
  666. package/dist/resources/handlers.d.ts +3 -3
  667. package/dist/resources/handlers.d.ts.map +1 -1
  668. package/dist/resources/handlers.js +57 -15
  669. package/dist/resources/handlers.js.map +1 -1
  670. package/dist/resources/script-helpers.d.ts.map +1 -1
  671. package/dist/resources/script-helpers.js +34 -8
  672. package/dist/resources/script-helpers.js.map +1 -1
  673. package/dist/resources/store.d.ts +10 -0
  674. package/dist/resources/store.d.ts.map +1 -1
  675. package/dist/resources/store.js +54 -47
  676. package/dist/resources/store.js.map +1 -1
  677. package/dist/scripts/call-agent.d.ts.map +1 -1
  678. package/dist/scripts/call-agent.js +106 -1
  679. package/dist/scripts/call-agent.js.map +1 -1
  680. package/dist/server/agent-chat-plugin.d.ts +15 -4
  681. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  682. package/dist/server/agent-chat-plugin.js +248 -113
  683. package/dist/server/agent-chat-plugin.js.map +1 -1
  684. package/dist/server/auth.d.ts.map +1 -1
  685. package/dist/server/auth.js +10 -14
  686. package/dist/server/auth.js.map +1 -1
  687. package/dist/server/builder-design-systems.d.ts +3 -1
  688. package/dist/server/builder-design-systems.d.ts.map +1 -1
  689. package/dist/server/builder-design-systems.js +9 -2
  690. package/dist/server/builder-design-systems.js.map +1 -1
  691. package/dist/server/edge.d.ts +1 -1
  692. package/dist/server/edge.d.ts.map +1 -1
  693. package/dist/server/edge.js +1 -1
  694. package/dist/server/edge.js.map +1 -1
  695. package/dist/server/index.d.ts +2 -1
  696. package/dist/server/index.d.ts.map +1 -1
  697. package/dist/server/index.js +2 -1
  698. package/dist/server/index.js.map +1 -1
  699. package/dist/server/request-context.d.ts +18 -0
  700. package/dist/server/request-context.d.ts.map +1 -1
  701. package/dist/server/request-context.js.map +1 -1
  702. package/dist/server/social-og-image.d.ts.map +1 -1
  703. package/dist/server/social-og-image.js +3 -2
  704. package/dist/server/social-og-image.js.map +1 -1
  705. package/dist/server/transcribe-voice.d.ts +1 -1
  706. package/dist/styles/agent-native.css +62 -44
  707. package/dist/templates/default/.agents/skills/capture-learnings/SKILL.md +22 -9
  708. package/dist/templates/default/AGENTS.md +7 -3
  709. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +1 -1
  710. package/dist/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +22 -9
  711. package/dist/templates/workspace-core/.agents/skills/extension-points/SKILL.md +6 -3
  712. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +25 -0
  713. package/dist/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +15 -0
  714. package/dist/templates/workspace-core/AGENTS.md +3 -2
  715. package/dist/usage/store.d.ts +7 -0
  716. package/dist/usage/store.d.ts.map +1 -1
  717. package/dist/usage/store.js +24 -3
  718. package/dist/usage/store.js.map +1 -1
  719. package/docs/content/automation-connectors.mdx +80 -0
  720. package/docs/content/extensions.mdx +8 -0
  721. package/docs/content/locales/ar-SA/extensions.mdx +8 -0
  722. package/docs/content/locales/ar-SA/messaging.mdx +84 -15
  723. package/docs/content/locales/ar-SA/template-clips.mdx +1 -0
  724. package/docs/content/locales/ar-SA/template-design.mdx +1 -0
  725. package/docs/content/locales/de-DE/extensions.mdx +10 -0
  726. package/docs/content/locales/de-DE/messaging.mdx +92 -15
  727. package/docs/content/locales/de-DE/template-clips.mdx +1 -0
  728. package/docs/content/locales/de-DE/template-design.mdx +1 -0
  729. package/docs/content/locales/es-ES/extensions.mdx +10 -0
  730. package/docs/content/locales/es-ES/messaging.mdx +91 -15
  731. package/docs/content/locales/es-ES/template-clips.mdx +1 -0
  732. package/docs/content/locales/es-ES/template-design.mdx +1 -0
  733. package/docs/content/locales/fr-FR/extensions.mdx +10 -0
  734. package/docs/content/locales/fr-FR/messaging.mdx +91 -15
  735. package/docs/content/locales/fr-FR/template-clips.mdx +1 -0
  736. package/docs/content/locales/fr-FR/template-design.mdx +1 -0
  737. package/docs/content/locales/hi-IN/extensions.mdx +8 -0
  738. package/docs/content/locales/hi-IN/messaging.mdx +81 -15
  739. package/docs/content/locales/hi-IN/template-clips.mdx +1 -0
  740. package/docs/content/locales/hi-IN/template-design.mdx +1 -0
  741. package/docs/content/locales/ja-JP/extensions.mdx +9 -0
  742. package/docs/content/locales/ja-JP/messaging.mdx +81 -15
  743. package/docs/content/locales/ja-JP/template-clips.mdx +1 -0
  744. package/docs/content/locales/ja-JP/template-design.mdx +1 -0
  745. package/docs/content/locales/ko-KR/extensions.mdx +8 -0
  746. package/docs/content/locales/ko-KR/messaging.mdx +80 -15
  747. package/docs/content/locales/ko-KR/template-clips.mdx +1 -0
  748. package/docs/content/locales/ko-KR/template-design.mdx +1 -0
  749. package/docs/content/locales/pt-BR/extensions.mdx +9 -0
  750. package/docs/content/locales/pt-BR/messaging.mdx +88 -15
  751. package/docs/content/locales/pt-BR/template-clips.mdx +1 -0
  752. package/docs/content/locales/pt-BR/template-design.mdx +1 -0
  753. package/docs/content/locales/zh-CN/extensions.mdx +6 -0
  754. package/docs/content/locales/zh-CN/messaging.mdx +78 -15
  755. package/docs/content/locales/zh-CN/template-clips.mdx +1 -0
  756. package/docs/content/locales/zh-CN/template-design.mdx +1 -0
  757. package/docs/content/locales/zh-TW/extensions.mdx +6 -0
  758. package/docs/content/locales/zh-TW/messaging.mdx +78 -15
  759. package/docs/content/locales/zh-TW/template-clips.mdx +1 -0
  760. package/docs/content/locales/zh-TW/template-design.mdx +1 -0
  761. package/docs/content/messaging.mdx +227 -45
  762. package/docs/content/template-clips.mdx +3 -0
  763. package/docs/content/template-design.mdx +4 -0
  764. package/package.json +5 -1
  765. package/src/templates/default/.agents/skills/capture-learnings/SKILL.md +22 -9
  766. package/src/templates/default/AGENTS.md +7 -3
  767. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +1 -1
  768. package/src/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +22 -9
  769. package/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +6 -3
  770. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +25 -0
  771. package/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +15 -0
  772. package/src/templates/workspace-core/AGENTS.md +3 -2
@@ -1,6 +1,7 @@
1
- import { defineEventHandler, setResponseStatus, getMethod, getQuery } from "h3";
1
+ import { defineEventHandler, setResponseStatus, setResponseHeader, getMethod, getQuery, sendRedirect, } from "h3";
2
2
  import { getRequestHeader } from "h3";
3
3
  import { createRemoteJWKSet, jwtVerify } from "jose";
4
+ import { abortRun } from "../agent/run-manager.js";
4
5
  import { getOrgContext, resolveOrgIdForEmail } from "../org/context.js";
5
6
  import { loadResourcesForPrompt } from "../server/agent-chat-plugin.js";
6
7
  import { withConfiguredAppBasePath } from "../server/app-base-path.js";
@@ -8,26 +9,36 @@ import { getSession } from "../server/auth.js";
8
9
  import { FRAMEWORK_ROUTE_PREFIX } from "../server/core-routes-plugin.js";
9
10
  import { resolveSecret } from "../server/credential-provider.js";
10
11
  import { getH3App, markDefaultPluginProvided, } from "../server/framework-request-handler.js";
12
+ import { decodeOAuthState, encodeOAuthState, oauthCallbackResponse, oauthErrorPage, resolveOAuthRedirectUri, } from "../server/google-oauth.js";
11
13
  import { readBody } from "../server/h3-helpers.js";
12
14
  import { runWithRequestContext } from "../server/request-context.js";
13
15
  import { processA2AContinuationById, processDueA2AContinuations, } from "./a2a-continuation-processor.js";
14
16
  import { failA2AContinuation } from "./a2a-continuations-store.js";
17
+ import { discordAdapter } from "./adapters/discord.js";
15
18
  import { emailAdapter } from "./adapters/email.js";
16
19
  import { googleDocsAdapter } from "./adapters/google-docs.js";
20
+ import { microsoftTeamsAdapter } from "./adapters/microsoft-teams.js";
17
21
  import { slackAdapter } from "./adapters/slack.js";
18
22
  import { telegramAdapter } from "./adapters/telegram.js";
19
23
  import { whatsappAdapter } from "./adapters/whatsapp.js";
20
24
  import { getIntegrationConfig, saveIntegrationConfig } from "./config-store.js";
25
+ import { claimIntegrationControl } from "./controls-store.js";
21
26
  import { startGoogleDocsPoller, handlePushNotification, } from "./google-docs-poller.js";
22
- import { extractBearerToken, verifyInternalToken } from "./internal-token.js";
27
+ import { disconnectIntegrationInstallation, listIntegrationInstallations, resolveIntegrationTokenBundle, updateIntegrationInstallation, upsertIntegrationInstallation, } from "./installations-store.js";
28
+ import { forgetIntegrationMemory, integrationMemoryActions, listIntegrationMemory, rememberForIntegrationScope, } from "./integration-memory.js";
29
+ import { extractBearerToken, signInternalToken, verifyInternalToken, } from "./internal-token.js";
23
30
  import { startPendingTasksRetryJob } from "./pending-tasks-retry-job.js";
24
- import { claimPendingTask, markTaskCompleted, markTaskFailed, } from "./pending-tasks-store.js";
31
+ import { claimPendingTask, getNextPendingTaskIdForThread, insertPendingTask, MAX_PENDING_TASK_ATTEMPTS, markTaskCompleted, markTaskFailed, markTaskRetryable, } from "./pending-tasks-store.js";
25
32
  import { claimNextRemoteCommand, enqueueRemoteCommand as enqueueRemoteCommandRow, isRemoteCommandKind, listRemoteCommandsForOwner, updateRemoteCommandResult, } from "./remote-commands-store.js";
26
33
  import { authenticateRemoteDeviceToken, createRemoteDevice, getRemoteDeviceForOwner, listRemoteDevicesForOwner, revokeRemoteDeviceForOwner, toPublicRemoteDevice, unregisterRemoteDevice, updateRemoteDeviceDetails, } from "./remote-devices-store.js";
27
34
  import { listRemotePushNotificationsForOwner, listRemotePushRegistrationsForOwner, queueRemotePushNotifications, toPublicRemotePushRegistration, unregisterRemotePushRegistrationForOwner, upsertRemotePushRegistration, } from "./remote-push-store.js";
28
35
  import { startRemoteCommandsRetryJob } from "./remote-retry-job.js";
29
36
  import { insertRemoteRunEvents, listRemoteRunEvents, } from "./remote-run-events-store.js";
37
+ import { listIntegrationScopes, saveIntegrationScope } from "./scope-store.js";
38
+ import { buildSlackAgentManifest } from "./slack-manifest.js";
39
+ import { assertSlackInstallAccess, buildSlackAuthorizeUrl, exchangeSlackOAuthCode, slackOAuthResponseToInstallation, testSlackAuth, } from "./slack-oauth.js";
30
40
  import { getTaskQueueStats } from "./task-queue-stats.js";
41
+ import { listIntegrationUsageBudgets, saveIntegrationUsageBudget, } from "./usage-budget-store.js";
31
42
  import { handleWebhook, processIntegrationTask } from "./webhook-handler.js";
32
43
  let a2aContinuationRetryInterval = null;
33
44
  function startA2AContinuationRetryJob(adapters) {
@@ -96,11 +107,13 @@ function getDefaultAdapters() {
96
107
  slackAdapter(),
97
108
  telegramAdapter(),
98
109
  whatsappAdapter(),
110
+ microsoftTeamsAdapter(),
111
+ discordAdapter(),
99
112
  googleDocsAdapter(),
100
113
  emailAdapter(),
101
114
  ];
102
115
  }
103
- const INTEGRATION_SYSTEM_PROMPT = `You are an AI agent responding via a messaging platform integration (Slack, Telegram, WhatsApp, etc.).
116
+ const INTEGRATION_SYSTEM_PROMPT = `You are an AI agent responding via a messaging platform integration (Slack, Microsoft Teams, Discord interactions, Telegram, WhatsApp, etc.).
104
117
 
105
118
  You have the same capabilities as the web chat agent. Use your tools to help the user.
106
119
 
@@ -429,6 +442,7 @@ export function createIntegrationsPlugin(options) {
429
442
  // call-agent script not available — skip
430
443
  }
431
444
  const actions = {
445
+ ...integrationMemoryActions(),
432
446
  ...localActions,
433
447
  ...callAgentEntry,
434
448
  };
@@ -1078,17 +1092,38 @@ export function createIntegrationsPlugin(options) {
1078
1092
  setResponseStatus(event, 404);
1079
1093
  return { error: "Unknown platform" };
1080
1094
  }
1081
- const resources = await loadResourcesForPrompt(task.ownerEmail, true, options?.appId);
1082
- await processIntegrationTask(task, {
1083
- adapter,
1084
- systemPrompt: baseSystemPrompt + resources,
1085
- actions,
1086
- model,
1087
- apiKey: getApiKey(),
1088
- engine: options?.engine,
1089
- ownerEmail: task.ownerEmail,
1095
+ await runWithRequestContext({
1096
+ userEmail: task.ownerEmail,
1097
+ ...(task.orgId ? { orgId: task.orgId } : {}),
1098
+ isIntegrationCaller: true,
1099
+ }, async () => {
1100
+ const resources = await loadResourcesForPrompt(task.ownerEmail, true, options?.appId, task.orgId);
1101
+ await processIntegrationTask(task, {
1102
+ adapter,
1103
+ systemPrompt: baseSystemPrompt + resources,
1104
+ actions,
1105
+ model,
1106
+ apiKey: getApiKey(),
1107
+ engine: options?.engine,
1108
+ ownerEmail: task.ownerEmail,
1109
+ appId: options?.appId,
1110
+ });
1090
1111
  });
1091
1112
  await markTaskCompleted(taskId);
1113
+ const nextTaskId = await getNextPendingTaskIdForThread(task.platform, task.externalThreadId);
1114
+ if (nextTaskId) {
1115
+ const nextToken = signInternalToken(nextTaskId);
1116
+ void fetch(`${getBaseUrl(event)}${P}/process-task`, {
1117
+ method: "POST",
1118
+ headers: {
1119
+ "Content-Type": "application/json",
1120
+ ...(nextToken ? { Authorization: `Bearer ${nextToken}` } : {}),
1121
+ },
1122
+ body: JSON.stringify({ taskId: nextTaskId }),
1123
+ }).catch((err) => {
1124
+ console.error("[integrations] Failed to dispatch queued thread turn:", err);
1125
+ });
1126
+ }
1092
1127
  await processDueA2AContinuations({
1093
1128
  adapters: adapterMap,
1094
1129
  limit: 2,
@@ -1098,9 +1133,15 @@ export function createIntegrationsPlugin(options) {
1098
1133
  return { ok: true, taskId };
1099
1134
  }
1100
1135
  catch (err) {
1101
- await markTaskFailed(taskId, err?.message
1136
+ const errorMessage = err?.message
1102
1137
  ? String(err.message).slice(0, 1000)
1103
- : "processor failed");
1138
+ : "processor failed";
1139
+ if (task.attempts >= MAX_PENDING_TASK_ATTEMPTS) {
1140
+ await markTaskFailed(taskId, errorMessage);
1141
+ }
1142
+ else {
1143
+ await markTaskRetryable(taskId, errorMessage);
1144
+ }
1104
1145
  // Log the detail server-side; never return the raw error message
1105
1146
  // to the caller. Raw messages have leaked DB error codes, schema
1106
1147
  // names, and stack hints in the past (L3 in the webhook security
@@ -1155,6 +1196,424 @@ export function createIntegrationsPlugin(options) {
1155
1196
  }
1156
1197
  return { ok: true, continuationId };
1157
1198
  }));
1199
+ // ─── Slack native action controls ─────────────────────────────
1200
+ h3.use(`${P}/slack/interactions`, defineEventHandler(async (event) => {
1201
+ if (getMethod(event) !== "POST") {
1202
+ setResponseStatus(event, 405);
1203
+ return { error: "Method not allowed" };
1204
+ }
1205
+ const adapter = adapterMap.get("slack");
1206
+ if (!adapter) {
1207
+ setResponseStatus(event, 404);
1208
+ return "ok";
1209
+ }
1210
+ // handleVerification caches the exact raw form bytes even though the
1211
+ // body is not JSON; verifyWebhook then validates Slack's HMAC before
1212
+ // any action value is parsed.
1213
+ await adapter.handleVerification(event);
1214
+ if (!(await adapter.verifyWebhook(event))) {
1215
+ setResponseStatus(event, 401);
1216
+ return { error: "Invalid webhook signature" };
1217
+ }
1218
+ try {
1219
+ const raw = String(event.context?.__rawBody ?? "");
1220
+ const encoded = new URLSearchParams(raw).get("payload");
1221
+ const payload = encoded ? JSON.parse(encoded) : null;
1222
+ const action = payload?.actions?.[0];
1223
+ const actionKind = action?.action_id === "agent_native_approve"
1224
+ ? "approve"
1225
+ : action?.action_id === "agent_native_deny"
1226
+ ? "deny"
1227
+ : action?.action_id === "agent_native_cancel"
1228
+ ? "cancel"
1229
+ : null;
1230
+ if (!actionKind || typeof action?.value !== "string")
1231
+ return "ok";
1232
+ const requesterId = payload?.user?.id;
1233
+ const teamId = payload?.team?.id ?? payload?.user?.team_id;
1234
+ const channelId = payload?.channel?.id ?? payload?.container?.channel_id;
1235
+ const messageTs = payload?.container?.message_ts;
1236
+ if (!requesterId || !teamId || !channelId || !messageTs) {
1237
+ return "ok";
1238
+ }
1239
+ const control = await claimIntegrationControl({
1240
+ id: action.value,
1241
+ action: actionKind,
1242
+ requesterId,
1243
+ teamId,
1244
+ apiAppId: typeof payload?.api_app_id === "string" ? payload.api_app_id : "",
1245
+ channelId,
1246
+ messageTs,
1247
+ });
1248
+ if (!control)
1249
+ return "ok";
1250
+ if (actionKind === "cancel") {
1251
+ if (control.runId)
1252
+ abortRun(control.runId, "slack_cancel");
1253
+ return "ok";
1254
+ }
1255
+ if (actionKind === "deny")
1256
+ return "ok";
1257
+ if (!control.approvalKey)
1258
+ return "ok";
1259
+ const taskId = `task-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
1260
+ const incoming = {
1261
+ ...control.incoming,
1262
+ text: "The requester approved the pending action. Continue the task.",
1263
+ approvedToolCalls: [control.approvalKey],
1264
+ timestamp: Date.now(),
1265
+ platformContext: {
1266
+ ...control.incoming.platformContext,
1267
+ eventId: `control:${control.id}`,
1268
+ },
1269
+ };
1270
+ await insertPendingTask({
1271
+ id: taskId,
1272
+ platform: incoming.platform,
1273
+ externalThreadId: incoming.externalThreadId,
1274
+ payload: JSON.stringify({ incoming }),
1275
+ ownerEmail: control.ownerEmail,
1276
+ orgId: control.orgId,
1277
+ externalEventKey: `control:${control.id}`,
1278
+ });
1279
+ const processUrl = `${getBaseUrl(event)}${P}/process-task`;
1280
+ const token = signInternalToken(taskId);
1281
+ void fetch(processUrl, {
1282
+ method: "POST",
1283
+ headers: {
1284
+ "Content-Type": "application/json",
1285
+ ...(token ? { Authorization: `Bearer ${token}` } : {}),
1286
+ },
1287
+ body: JSON.stringify({ taskId }),
1288
+ }).catch((err) => {
1289
+ console.error("[slack] Approval dispatch failed:", err);
1290
+ });
1291
+ }
1292
+ catch (err) {
1293
+ console.error("[slack] Interaction handling failed:", err);
1294
+ }
1295
+ return "ok";
1296
+ }));
1297
+ // ─── Managed integration installations ───────────────────────
1298
+ h3.use(`${P}/installations`, defineEventHandler(async (event) => {
1299
+ const method = getMethod(event);
1300
+ if (method !== "GET" && method !== "POST") {
1301
+ setResponseStatus(event, 405);
1302
+ return { error: "Method not allowed" };
1303
+ }
1304
+ const session = await getSession(event).catch(() => null);
1305
+ if (!session?.email) {
1306
+ setResponseStatus(event, 401);
1307
+ return { error: "unauthorized" };
1308
+ }
1309
+ const org = await getOrgContext(event).catch(() => null);
1310
+ const actor = {
1311
+ userEmail: session.email,
1312
+ orgId: org?.orgId ?? session.orgId ?? null,
1313
+ isOrgAdmin: org?.role === "owner" || org?.role === "admin",
1314
+ };
1315
+ if (method === "GET") {
1316
+ const query = getQuery(event);
1317
+ return {
1318
+ installations: await listIntegrationInstallations(actor, typeof query.platform === "string" ? query.platform : undefined),
1319
+ };
1320
+ }
1321
+ const body = (await readBody(event));
1322
+ const id = typeof body.id === "string" ? body.id : "";
1323
+ if (!id) {
1324
+ setResponseStatus(event, 400);
1325
+ return { error: "installation id required" };
1326
+ }
1327
+ if (body.action === "disconnect") {
1328
+ return {
1329
+ installation: await disconnectIntegrationInstallation(id, actor),
1330
+ };
1331
+ }
1332
+ if (body.action === "test") {
1333
+ const installation = (await listIntegrationInstallations(actor, "slack")).find((item) => item.id === id);
1334
+ if (!installation) {
1335
+ setResponseStatus(event, 404);
1336
+ return { error: "installation not found" };
1337
+ }
1338
+ const bundle = await resolveIntegrationTokenBundle(installation.platform, installation.installationKey);
1339
+ if (!bundle) {
1340
+ const updated = await updateIntegrationInstallation(id, actor, {
1341
+ health: "revoked",
1342
+ status: "revoked",
1343
+ lastError: "token_unavailable",
1344
+ healthCheckedAt: Date.now(),
1345
+ });
1346
+ return { installation: updated };
1347
+ }
1348
+ const health = await testSlackAuth(bundle.accessToken);
1349
+ const updated = await updateIntegrationInstallation(id, actor, {
1350
+ health: health.health,
1351
+ status: health.health === "revoked" ? "revoked" : "connected",
1352
+ lastError: health.error,
1353
+ healthCheckedAt: health.checkedAt,
1354
+ ...(health.ok ? { lastHealthyAt: health.checkedAt } : {}),
1355
+ });
1356
+ return { installation: updated };
1357
+ }
1358
+ setResponseStatus(event, 400);
1359
+ return { error: "unsupported installation action" };
1360
+ }));
1361
+ h3.use(`${P}/scopes`, defineEventHandler(async (event) => {
1362
+ const method = getMethod(event);
1363
+ if (method !== "GET" && method !== "POST") {
1364
+ setResponseStatus(event, 405);
1365
+ return { error: "Method not allowed" };
1366
+ }
1367
+ const ctx = await requireSessionContext(event);
1368
+ if (!ctx)
1369
+ return { error: "unauthorized" };
1370
+ const access = { ownerEmail: ctx.ownerEmail, orgId: ctx.orgId };
1371
+ if (method === "GET") {
1372
+ const query = getQuery(event);
1373
+ return {
1374
+ scopes: await listIntegrationScopes(access, {
1375
+ platform: typeof query.platform === "string" ? query.platform : undefined,
1376
+ tenantId: typeof query.tenantId === "string" ? query.tenantId : undefined,
1377
+ }),
1378
+ };
1379
+ }
1380
+ const admin = await checkOrgAdmin(event);
1381
+ if (!admin.ok)
1382
+ return { error: admin.error };
1383
+ try {
1384
+ const body = (await readBody(event));
1385
+ return { scope: await saveIntegrationScope(body, access) };
1386
+ }
1387
+ catch (err) {
1388
+ setResponseStatus(event, 400);
1389
+ return {
1390
+ error: err instanceof Error ? err.message : "invalid scope",
1391
+ };
1392
+ }
1393
+ }));
1394
+ h3.use(`${P}/budgets`, defineEventHandler(async (event) => {
1395
+ const method = getMethod(event);
1396
+ if (method !== "GET" && method !== "POST") {
1397
+ setResponseStatus(event, 405);
1398
+ return { error: "Method not allowed" };
1399
+ }
1400
+ const ctx = await requireSessionContext(event);
1401
+ if (!ctx)
1402
+ return { error: "unauthorized" };
1403
+ const access = { ownerEmail: ctx.ownerEmail, orgId: ctx.orgId };
1404
+ if (method === "GET") {
1405
+ return { budgets: await listIntegrationUsageBudgets(access) };
1406
+ }
1407
+ const admin = await checkOrgAdmin(event);
1408
+ if (!admin.ok)
1409
+ return { error: admin.error };
1410
+ try {
1411
+ const body = (await readBody(event));
1412
+ return {
1413
+ budget: await saveIntegrationUsageBudget(body, access),
1414
+ };
1415
+ }
1416
+ catch (err) {
1417
+ setResponseStatus(event, 400);
1418
+ return {
1419
+ error: err instanceof Error ? err.message : "invalid budget",
1420
+ };
1421
+ }
1422
+ }));
1423
+ h3.use(`${P}/memory`, defineEventHandler(async (event) => {
1424
+ const method = getMethod(event);
1425
+ if (method !== "GET" && method !== "POST") {
1426
+ setResponseStatus(event, 405);
1427
+ return { error: "Method not allowed" };
1428
+ }
1429
+ const ctx = await requireSessionContext(event);
1430
+ if (!ctx)
1431
+ return { error: "unauthorized" };
1432
+ const access = { ownerEmail: ctx.ownerEmail, orgId: ctx.orgId };
1433
+ const query = getQuery(event);
1434
+ const body = method === "POST"
1435
+ ? (await readBody(event))
1436
+ : null;
1437
+ const scopeId = typeof query.scopeId === "string"
1438
+ ? query.scopeId
1439
+ : typeof body?.scopeId === "string"
1440
+ ? body.scopeId
1441
+ : "";
1442
+ const scope = (await listIntegrationScopes(access)).find((item) => item.id === scopeId);
1443
+ if (!scope) {
1444
+ setResponseStatus(event, 404);
1445
+ return { error: "integration scope not found" };
1446
+ }
1447
+ if (method === "GET") {
1448
+ return { memories: await listIntegrationMemory(scope.id) };
1449
+ }
1450
+ const admin = await checkOrgAdmin(event);
1451
+ if (!admin.ok)
1452
+ return { error: admin.error };
1453
+ if (body?.action === "remember") {
1454
+ return {
1455
+ memory: await rememberForIntegrationScope({
1456
+ name: String(body.name ?? ""),
1457
+ description: String(body.description ?? ""),
1458
+ content: String(body.content ?? ""),
1459
+ }, scope.id),
1460
+ };
1461
+ }
1462
+ if (body?.action === "forget") {
1463
+ return {
1464
+ memory: await forgetIntegrationMemory({ name: String(body.name ?? "") }, scope.id),
1465
+ };
1466
+ }
1467
+ setResponseStatus(event, 400);
1468
+ return { error: "unsupported memory action" };
1469
+ }));
1470
+ // ─── Managed Slack OAuth ──────────────────────────────────────
1471
+ h3.use(`${P}/slack/manifest`, defineEventHandler(async (event) => {
1472
+ if (getMethod(event) !== "GET") {
1473
+ setResponseStatus(event, 405);
1474
+ return { error: "Method not allowed" };
1475
+ }
1476
+ const oauthRedirectUrl = resolveOAuthRedirectUri(event, `${P}/slack/oauth/callback`);
1477
+ const eventsRequestUrl = resolveOAuthRedirectUri(event, `${P}/slack/webhook`);
1478
+ const interactivityRequestUrl = resolveOAuthRedirectUri(event, `${P}/slack/interactions`);
1479
+ if (!oauthRedirectUrl ||
1480
+ !eventsRequestUrl ||
1481
+ !interactivityRequestUrl) {
1482
+ setResponseStatus(event, 400);
1483
+ return { error: "Slack manifest URLs are not allowed." };
1484
+ }
1485
+ setResponseHeader(event, "content-disposition", 'attachment; filename="agent-native-slack-manifest.json"');
1486
+ return buildSlackAgentManifest({
1487
+ oauthRedirectUrl,
1488
+ eventsRequestUrl,
1489
+ interactivityRequestUrl,
1490
+ });
1491
+ }));
1492
+ h3.use(`${P}/slack/oauth/install`, defineEventHandler(async (event) => {
1493
+ if (getMethod(event) !== "GET") {
1494
+ setResponseStatus(event, 405);
1495
+ return { error: "Method not allowed" };
1496
+ }
1497
+ const session = await getSession(event).catch(() => null);
1498
+ if (!session?.email) {
1499
+ setResponseStatus(event, 401);
1500
+ return { error: "Sign in before connecting Slack." };
1501
+ }
1502
+ const org = await getOrgContext(event).catch(() => null);
1503
+ try {
1504
+ assertSlackInstallAccess({
1505
+ email: session.email,
1506
+ orgId: org?.orgId ?? session.orgId ?? null,
1507
+ orgRole: org?.role ?? null,
1508
+ });
1509
+ }
1510
+ catch (err) {
1511
+ setResponseStatus(event, 403);
1512
+ return {
1513
+ error: err instanceof Error ? err.message : "Slack access denied",
1514
+ };
1515
+ }
1516
+ const clientId = await resolveSecret("SLACK_CLIENT_ID");
1517
+ const clientSecret = await resolveSecret("SLACK_CLIENT_SECRET");
1518
+ const signingSecret = await resolveSecret("SLACK_SIGNING_SECRET");
1519
+ if (!clientId || !clientSecret || !signingSecret) {
1520
+ setResponseStatus(event, 503);
1521
+ return {
1522
+ error: "Slack OAuth is not configured. Add the Slack client id, client secret, and signing secret first.",
1523
+ };
1524
+ }
1525
+ const redirectUri = resolveOAuthRedirectUri(event, `${P}/slack/oauth/callback`);
1526
+ if (!redirectUri) {
1527
+ setResponseStatus(event, 400);
1528
+ return { error: "Slack OAuth redirect URL is not allowed." };
1529
+ }
1530
+ const query = getQuery(event);
1531
+ const state = encodeOAuthState({
1532
+ redirectUri,
1533
+ owner: session.email,
1534
+ orgId: org?.orgId ?? session.orgId ?? undefined,
1535
+ app: "agent-native:slack",
1536
+ addAccount: true,
1537
+ returnUrl: typeof query.return === "string" ? query.return : "/messaging",
1538
+ });
1539
+ return sendRedirect(event, buildSlackAuthorizeUrl({ clientId, redirectUri, state }), 302);
1540
+ }));
1541
+ h3.use(`${P}/slack/oauth/callback`, defineEventHandler(async (event) => {
1542
+ if (getMethod(event) !== "GET") {
1543
+ setResponseStatus(event, 405);
1544
+ return { error: "Method not allowed" };
1545
+ }
1546
+ const query = getQuery(event);
1547
+ if (typeof query.error === "string") {
1548
+ return oauthErrorPage("Slack authorization was canceled or denied.");
1549
+ }
1550
+ const fallbackRedirect = resolveOAuthRedirectUri(event, `${P}/slack/oauth/callback`);
1551
+ if (!fallbackRedirect) {
1552
+ return oauthErrorPage("Slack OAuth redirect URL is not allowed.");
1553
+ }
1554
+ const state = decodeOAuthState(typeof query.state === "string" ? query.state : undefined, fallbackRedirect);
1555
+ const session = await getSession(event).catch(() => null);
1556
+ const org = await getOrgContext(event).catch(() => null);
1557
+ if (state.app !== "agent-native:slack" ||
1558
+ !session?.email ||
1559
+ !state.owner ||
1560
+ session.email.toLowerCase() !== state.owner.toLowerCase() ||
1561
+ (state.orgId ?? null) !== (org?.orgId ?? session.orgId ?? null)) {
1562
+ return oauthErrorPage("Your Slack install session expired or changed. Sign in and start again.");
1563
+ }
1564
+ const code = typeof query.code === "string" ? query.code : null;
1565
+ if (!code)
1566
+ return oauthErrorPage("Slack did not return an OAuth code.");
1567
+ try {
1568
+ const access = assertSlackInstallAccess({
1569
+ email: session.email,
1570
+ orgId: org?.orgId ?? session.orgId ?? null,
1571
+ orgRole: org?.role ?? null,
1572
+ });
1573
+ const clientId = await resolveSecret("SLACK_CLIENT_ID");
1574
+ const clientSecret = await resolveSecret("SLACK_CLIENT_SECRET");
1575
+ if (!clientId || !clientSecret) {
1576
+ return oauthErrorPage("Slack OAuth is not configured.");
1577
+ }
1578
+ return await runWithRequestContext({
1579
+ userEmail: access.ownerEmail,
1580
+ orgId: access.orgId ?? undefined,
1581
+ }, async () => {
1582
+ const oauth = await exchangeSlackOAuthCode({
1583
+ code,
1584
+ clientId,
1585
+ clientSecret,
1586
+ redirectUri: state.redirectUri,
1587
+ });
1588
+ const health = await testSlackAuth(oauth.access_token || "");
1589
+ if (!health.ok) {
1590
+ return oauthErrorPage("Slack connected, but the bot token could not be verified. Please retry.");
1591
+ }
1592
+ if (oauth.team?.id &&
1593
+ health.teamId &&
1594
+ oauth.team.id !== health.teamId) {
1595
+ return oauthErrorPage("Slack returned inconsistent workspace details. Please retry.");
1596
+ }
1597
+ const input = slackOAuthResponseToInstallation(oauth, access);
1598
+ const installation = await upsertIntegrationInstallation({
1599
+ ...input,
1600
+ health: health.health,
1601
+ healthCheckedAt: health.checkedAt,
1602
+ lastHealthyAt: health.checkedAt,
1603
+ });
1604
+ await saveIntegrationConfig("slack", { enabled: true, managedOAuth: true }, "default", access.ownerEmail);
1605
+ return oauthCallbackResponse(event, installation.teamName || installation.enterpriseName || "Slack", {
1606
+ addAccount: true,
1607
+ appName: "Agent Native",
1608
+ returnUrl: state.returnUrl || "/messaging",
1609
+ });
1610
+ });
1611
+ }
1612
+ catch (err) {
1613
+ console.error("[slack] OAuth callback failed:", err);
1614
+ return oauthErrorPage("Slack connection failed. Please try again.");
1615
+ }
1616
+ }));
1158
1617
  // ─── Per-platform catch-all ───────────────────────────────────
1159
1618
  // Handles: webhook, status, enable, disable, setup for each platform
1160
1619
  h3.use(`${P}`, defineEventHandler(async (event) => {
@@ -1258,16 +1717,10 @@ export function createIntegrationsPlugin(options) {
1258
1717
  }
1259
1718
  const config = await getIntegrationConfig(platform);
1260
1719
  const credentialContext = await credentialContextForIntegrationConfig(config);
1261
- // Handle platform verification challenges (e.g. Slack url_verification)
1262
- // before checking enable state or parsing the message.
1720
+ // Let the adapter cache the raw request and identify setup
1721
+ // challenges, but never return a challenge response until the
1722
+ // provider signature has been verified.
1263
1723
  const verification = await withCredentialContext(credentialContext, () => adapter.handleVerification(event));
1264
- if (verification.handled) {
1265
- return verification.response ?? "ok";
1266
- }
1267
- if (!config?.configData?.enabled) {
1268
- setResponseStatus(event, 404);
1269
- return { error: `Integration ${platform} is not enabled` };
1270
- }
1271
1724
  // Verify the webhook signature BEFORE parsing. We pre-parse the
1272
1725
  // body here (so handleWebhook can skip its second readBody, which
1273
1726
  // hangs on streaming providers), and that means handleWebhook's
@@ -1278,31 +1731,59 @@ export function createIntegrationsPlugin(options) {
1278
1731
  setResponseStatus(event, 401);
1279
1732
  return { error: "Invalid webhook signature" };
1280
1733
  }
1734
+ if (verification.handled) {
1735
+ setResponseStatus(event, 200);
1736
+ return verification.response ?? "ok";
1737
+ }
1738
+ if (!config?.configData?.enabled) {
1739
+ setResponseStatus(event, 404);
1740
+ return { error: `Integration ${platform} is not enabled` };
1741
+ }
1281
1742
  const incoming = await withCredentialContext(credentialContext, () => adapter.parseIncomingMessage(event));
1282
1743
  if (!incoming) {
1283
1744
  setResponseStatus(event, 200);
1284
1745
  return "ok";
1285
1746
  }
1286
- let owner = `integration@${platform}`;
1287
- if (options?.resolveOwner) {
1747
+ let executionContext = {
1748
+ ownerEmail: `integration@${platform}`,
1749
+ orgId: null,
1750
+ principalType: "service",
1751
+ };
1752
+ if (options?.resolveExecutionContext) {
1753
+ try {
1754
+ executionContext = await withCredentialContext(credentialContext, () => Promise.resolve(options.resolveExecutionContext(incoming)));
1755
+ }
1756
+ catch (err) {
1757
+ console.error(`[integrations] resolveExecutionContext denied message:`, err);
1758
+ setResponseStatus(event, 200);
1759
+ return "ok";
1760
+ }
1761
+ }
1762
+ else if (options?.resolveOwner) {
1288
1763
  try {
1289
- owner = await options.resolveOwner(incoming);
1764
+ executionContext.ownerEmail = await withCredentialContext(credentialContext, () => Promise.resolve(options.resolveOwner(incoming)));
1290
1765
  }
1291
1766
  catch (err) {
1292
1767
  console.error(`[integrations] resolveOwner failed, using default:`, err);
1293
1768
  }
1294
1769
  }
1295
- const resources = await loadResourcesForPrompt(owner, true, options?.appId);
1296
- const systemPrompt = baseSystemPrompt + resources;
1770
+ if (executionContext.scopeId) {
1771
+ incoming.integrationScopeId = executionContext.scopeId;
1772
+ }
1297
1773
  const result = await handleWebhook(event, {
1298
1774
  adapter,
1299
- systemPrompt,
1775
+ // The processor reloads scoped resources immediately before the
1776
+ // agent run. Avoid doing that work on the acknowledgement path,
1777
+ // where providers such as Discord enforce a 3-second deadline.
1778
+ systemPrompt: baseSystemPrompt,
1300
1779
  actions,
1301
1780
  model,
1302
1781
  apiKey: getApiKey(),
1303
1782
  engine: options?.engine,
1304
1783
  appId: options?.appId,
1305
- ownerEmail: owner,
1784
+ ownerEmail: executionContext.ownerEmail,
1785
+ orgId: executionContext.orgId,
1786
+ principalType: executionContext.principalType,
1306
1787
  beforeProcess: options?.beforeProcess,
1307
1788
  incoming,
1308
1789
  });
@@ -1342,17 +1823,21 @@ export function createIntegrationsPlugin(options) {
1342
1823
  if (!ctx)
1343
1824
  return { error: "unauthorized" };
1344
1825
  const token = await withCredentialContext(toCredentialContext(ctx), () => resolveSecret("TELEGRAM_BOT_TOKEN"));
1345
- if (!token) {
1826
+ const webhookSecret = await withCredentialContext(toCredentialContext(ctx), () => resolveSecret("TELEGRAM_WEBHOOK_SECRET"));
1827
+ if (!token || !webhookSecret) {
1346
1828
  setResponseStatus(event, 400);
1347
1829
  return {
1348
- error: "TELEGRAM_BOT_TOKEN not configured. Save it in settings.",
1830
+ error: "TELEGRAM_BOT_TOKEN and TELEGRAM_WEBHOOK_SECRET must be configured before webhook setup.",
1349
1831
  };
1350
1832
  }
1351
1833
  try {
1352
1834
  const res = await fetch(`https://api.telegram.org/bot${token}/setWebhook`, {
1353
1835
  method: "POST",
1354
1836
  headers: { "Content-Type": "application/json" },
1355
- body: JSON.stringify({ url: webhookUrl }),
1837
+ body: JSON.stringify({
1838
+ url: webhookUrl,
1839
+ secret_token: webhookSecret,
1840
+ }),
1356
1841
  });
1357
1842
  const data = await res.json();
1358
1843
  return { ok: true, platform, webhookUrl, result: data };
@@ -1390,7 +1875,7 @@ export function createIntegrationsPlugin(options) {
1390
1875
  const webhookUrl = baseUrl
1391
1876
  ? `${withConfiguredAppBasePath(baseUrl)}${P}/google-docs/webhook`
1392
1877
  : undefined;
1393
- startGoogleDocsPoller({
1878
+ void startGoogleDocsPoller({
1394
1879
  systemPrompt: baseSystemPrompt,
1395
1880
  actions,
1396
1881
  model: model ?? "",