@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,7 +1,15 @@
1
- import { defineEventHandler, setResponseStatus, getMethod, getQuery } from "h3";
1
+ import {
2
+ defineEventHandler,
3
+ setResponseStatus,
4
+ setResponseHeader,
5
+ getMethod,
6
+ getQuery,
7
+ sendRedirect,
8
+ } from "h3";
2
9
  import { getRequestHeader } from "h3";
3
10
  import { createRemoteJWKSet, jwtVerify } from "jose";
4
11
 
12
+ import { abortRun } from "../agent/run-manager.js";
5
13
  import { getOrgContext, resolveOrgIdForEmail } from "../org/context.js";
6
14
  import { loadResourcesForPrompt } from "../server/agent-chat-plugin.js";
7
15
  import { withConfiguredAppBasePath } from "../server/app-base-path.js";
@@ -12,6 +20,13 @@ import {
12
20
  getH3App,
13
21
  markDefaultPluginProvided,
14
22
  } from "../server/framework-request-handler.js";
23
+ import {
24
+ decodeOAuthState,
25
+ encodeOAuthState,
26
+ oauthCallbackResponse,
27
+ oauthErrorPage,
28
+ resolveOAuthRedirectUri,
29
+ } from "../server/google-oauth.js";
15
30
  import { readBody } from "../server/h3-helpers.js";
16
31
  import { runWithRequestContext } from "../server/request-context.js";
17
32
  import {
@@ -19,22 +34,46 @@ import {
19
34
  processDueA2AContinuations,
20
35
  } from "./a2a-continuation-processor.js";
21
36
  import { failA2AContinuation } from "./a2a-continuations-store.js";
37
+ import { discordAdapter } from "./adapters/discord.js";
22
38
  import { emailAdapter } from "./adapters/email.js";
23
39
  import { googleDocsAdapter } from "./adapters/google-docs.js";
40
+ import { microsoftTeamsAdapter } from "./adapters/microsoft-teams.js";
24
41
  import { slackAdapter } from "./adapters/slack.js";
25
42
  import { telegramAdapter } from "./adapters/telegram.js";
26
43
  import { whatsappAdapter } from "./adapters/whatsapp.js";
27
44
  import { getIntegrationConfig, saveIntegrationConfig } from "./config-store.js";
45
+ import { claimIntegrationControl } from "./controls-store.js";
28
46
  import {
29
47
  startGoogleDocsPoller,
30
48
  handlePushNotification,
31
49
  } from "./google-docs-poller.js";
32
- import { extractBearerToken, verifyInternalToken } from "./internal-token.js";
50
+ import {
51
+ disconnectIntegrationInstallation,
52
+ listIntegrationInstallations,
53
+ resolveIntegrationTokenBundle,
54
+ updateIntegrationInstallation,
55
+ upsertIntegrationInstallation,
56
+ } from "./installations-store.js";
57
+ import {
58
+ forgetIntegrationMemory,
59
+ integrationMemoryActions,
60
+ listIntegrationMemory,
61
+ rememberForIntegrationScope,
62
+ } from "./integration-memory.js";
63
+ import {
64
+ extractBearerToken,
65
+ signInternalToken,
66
+ verifyInternalToken,
67
+ } from "./internal-token.js";
33
68
  import { startPendingTasksRetryJob } from "./pending-tasks-retry-job.js";
34
69
  import {
35
70
  claimPendingTask,
71
+ getNextPendingTaskIdForThread,
72
+ insertPendingTask,
73
+ MAX_PENDING_TASK_ATTEMPTS,
36
74
  markTaskCompleted,
37
75
  markTaskFailed,
76
+ markTaskRetryable,
38
77
  } from "./pending-tasks-store.js";
39
78
  import {
40
79
  claimNextRemoteCommand,
@@ -71,12 +110,26 @@ import type {
71
110
  RemoteCommandKind,
72
111
  RemoteDevice,
73
112
  } from "./remote-types.js";
113
+ import { listIntegrationScopes, saveIntegrationScope } from "./scope-store.js";
114
+ import { buildSlackAgentManifest } from "./slack-manifest.js";
115
+ import {
116
+ assertSlackInstallAccess,
117
+ buildSlackAuthorizeUrl,
118
+ exchangeSlackOAuthCode,
119
+ slackOAuthResponseToInstallation,
120
+ testSlackAuth,
121
+ } from "./slack-oauth.js";
74
122
  import { getTaskQueueStats } from "./task-queue-stats.js";
75
123
  import type {
76
124
  PlatformAdapter,
77
125
  IntegrationsPluginOptions,
78
126
  IntegrationStatus,
127
+ IntegrationExecutionContext,
79
128
  } from "./types.js";
129
+ import {
130
+ listIntegrationUsageBudgets,
131
+ saveIntegrationUsageBudget,
132
+ } from "./usage-budget-store.js";
80
133
  import { handleWebhook, processIntegrationTask } from "./webhook-handler.js";
81
134
 
82
135
  type NitroPluginDef = (nitroApp: any) => void | Promise<void>;
@@ -156,12 +209,14 @@ function getDefaultAdapters(): PlatformAdapter[] {
156
209
  slackAdapter(),
157
210
  telegramAdapter(),
158
211
  whatsappAdapter(),
212
+ microsoftTeamsAdapter(),
213
+ discordAdapter(),
159
214
  googleDocsAdapter(),
160
215
  emailAdapter(),
161
216
  ];
162
217
  }
163
218
 
164
- const INTEGRATION_SYSTEM_PROMPT = `You are an AI agent responding via a messaging platform integration (Slack, Telegram, WhatsApp, etc.).
219
+ const INTEGRATION_SYSTEM_PROMPT = `You are an AI agent responding via a messaging platform integration (Slack, Microsoft Teams, Discord interactions, Telegram, WhatsApp, etc.).
165
220
 
166
221
  You have the same capabilities as the web chat agent. Use your tools to help the user.
167
222
 
@@ -547,6 +602,7 @@ export function createIntegrationsPlugin(
547
602
  // call-agent script not available — skip
548
603
  }
549
604
  const actions = {
605
+ ...integrationMemoryActions(),
550
606
  ...localActions,
551
607
  ...callAgentEntry,
552
608
  } as typeof localActions;
@@ -1319,21 +1375,52 @@ export function createIntegrationsPlugin(
1319
1375
  setResponseStatus(event, 404);
1320
1376
  return { error: "Unknown platform" };
1321
1377
  }
1322
- const resources = await loadResourcesForPrompt(
1323
- task.ownerEmail,
1324
- true,
1325
- options?.appId,
1378
+ await runWithRequestContext(
1379
+ {
1380
+ userEmail: task.ownerEmail,
1381
+ ...(task.orgId ? { orgId: task.orgId } : {}),
1382
+ isIntegrationCaller: true,
1383
+ },
1384
+ async () => {
1385
+ const resources = await loadResourcesForPrompt(
1386
+ task.ownerEmail,
1387
+ true,
1388
+ options?.appId,
1389
+ task.orgId,
1390
+ );
1391
+ await processIntegrationTask(task, {
1392
+ adapter,
1393
+ systemPrompt: baseSystemPrompt + resources,
1394
+ actions,
1395
+ model,
1396
+ apiKey: getApiKey(),
1397
+ engine: options?.engine,
1398
+ ownerEmail: task.ownerEmail,
1399
+ appId: options?.appId,
1400
+ });
1401
+ },
1326
1402
  );
1327
- await processIntegrationTask(task, {
1328
- adapter,
1329
- systemPrompt: baseSystemPrompt + resources,
1330
- actions,
1331
- model,
1332
- apiKey: getApiKey(),
1333
- engine: options?.engine,
1334
- ownerEmail: task.ownerEmail,
1335
- });
1336
1403
  await markTaskCompleted(taskId);
1404
+ const nextTaskId = await getNextPendingTaskIdForThread(
1405
+ task.platform,
1406
+ task.externalThreadId,
1407
+ );
1408
+ if (nextTaskId) {
1409
+ const nextToken = signInternalToken(nextTaskId);
1410
+ void fetch(`${getBaseUrl(event)}${P}/process-task`, {
1411
+ method: "POST",
1412
+ headers: {
1413
+ "Content-Type": "application/json",
1414
+ ...(nextToken ? { Authorization: `Bearer ${nextToken}` } : {}),
1415
+ },
1416
+ body: JSON.stringify({ taskId: nextTaskId }),
1417
+ }).catch((err) => {
1418
+ console.error(
1419
+ "[integrations] Failed to dispatch queued thread turn:",
1420
+ err,
1421
+ );
1422
+ });
1423
+ }
1337
1424
  await processDueA2AContinuations({
1338
1425
  adapters: adapterMap,
1339
1426
  limit: 2,
@@ -1345,12 +1432,14 @@ export function createIntegrationsPlugin(
1345
1432
  });
1346
1433
  return { ok: true, taskId };
1347
1434
  } catch (err: any) {
1348
- await markTaskFailed(
1349
- taskId,
1350
- err?.message
1351
- ? String(err.message).slice(0, 1000)
1352
- : "processor failed",
1353
- );
1435
+ const errorMessage = err?.message
1436
+ ? String(err.message).slice(0, 1000)
1437
+ : "processor failed";
1438
+ if (task.attempts >= MAX_PENDING_TASK_ATTEMPTS) {
1439
+ await markTaskFailed(taskId, errorMessage);
1440
+ } else {
1441
+ await markTaskRetryable(taskId, errorMessage);
1442
+ }
1354
1443
  // Log the detail server-side; never return the raw error message
1355
1444
  // to the caller. Raw messages have leaked DB error codes, schema
1356
1445
  // names, and stack hints in the past (L3 in the webhook security
@@ -1421,6 +1510,522 @@ export function createIntegrationsPlugin(
1421
1510
  }),
1422
1511
  );
1423
1512
 
1513
+ // ─── Slack native action controls ─────────────────────────────
1514
+ h3.use(
1515
+ `${P}/slack/interactions`,
1516
+ defineEventHandler(async (event) => {
1517
+ if (getMethod(event) !== "POST") {
1518
+ setResponseStatus(event, 405);
1519
+ return { error: "Method not allowed" };
1520
+ }
1521
+ const adapter = adapterMap.get("slack");
1522
+ if (!adapter) {
1523
+ setResponseStatus(event, 404);
1524
+ return "ok";
1525
+ }
1526
+ // handleVerification caches the exact raw form bytes even though the
1527
+ // body is not JSON; verifyWebhook then validates Slack's HMAC before
1528
+ // any action value is parsed.
1529
+ await adapter.handleVerification(event);
1530
+ if (!(await adapter.verifyWebhook(event))) {
1531
+ setResponseStatus(event, 401);
1532
+ return { error: "Invalid webhook signature" };
1533
+ }
1534
+ try {
1535
+ const raw = String(event.context?.__rawBody ?? "");
1536
+ const encoded = new URLSearchParams(raw).get("payload");
1537
+ const payload = encoded ? JSON.parse(encoded) : null;
1538
+ const action = payload?.actions?.[0];
1539
+ const actionKind =
1540
+ action?.action_id === "agent_native_approve"
1541
+ ? "approve"
1542
+ : action?.action_id === "agent_native_deny"
1543
+ ? "deny"
1544
+ : action?.action_id === "agent_native_cancel"
1545
+ ? "cancel"
1546
+ : null;
1547
+ if (!actionKind || typeof action?.value !== "string") return "ok";
1548
+ const requesterId = payload?.user?.id;
1549
+ const teamId = payload?.team?.id ?? payload?.user?.team_id;
1550
+ const channelId =
1551
+ payload?.channel?.id ?? payload?.container?.channel_id;
1552
+ const messageTs = payload?.container?.message_ts;
1553
+ if (!requesterId || !teamId || !channelId || !messageTs) {
1554
+ return "ok";
1555
+ }
1556
+ const control = await claimIntegrationControl({
1557
+ id: action.value,
1558
+ action: actionKind,
1559
+ requesterId,
1560
+ teamId,
1561
+ apiAppId:
1562
+ typeof payload?.api_app_id === "string" ? payload.api_app_id : "",
1563
+ channelId,
1564
+ messageTs,
1565
+ });
1566
+ if (!control) return "ok";
1567
+ if (actionKind === "cancel") {
1568
+ if (control.runId) abortRun(control.runId, "slack_cancel");
1569
+ return "ok";
1570
+ }
1571
+ if (actionKind === "deny") return "ok";
1572
+ if (!control.approvalKey) return "ok";
1573
+
1574
+ const taskId = `task-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
1575
+ const incoming = {
1576
+ ...control.incoming,
1577
+ text: "The requester approved the pending action. Continue the task.",
1578
+ approvedToolCalls: [control.approvalKey],
1579
+ timestamp: Date.now(),
1580
+ platformContext: {
1581
+ ...control.incoming.platformContext,
1582
+ eventId: `control:${control.id}`,
1583
+ },
1584
+ };
1585
+ await insertPendingTask({
1586
+ id: taskId,
1587
+ platform: incoming.platform,
1588
+ externalThreadId: incoming.externalThreadId,
1589
+ payload: JSON.stringify({ incoming }),
1590
+ ownerEmail: control.ownerEmail,
1591
+ orgId: control.orgId,
1592
+ externalEventKey: `control:${control.id}`,
1593
+ });
1594
+ const processUrl = `${getBaseUrl(event)}${P}/process-task`;
1595
+ const token = signInternalToken(taskId);
1596
+ void fetch(processUrl, {
1597
+ method: "POST",
1598
+ headers: {
1599
+ "Content-Type": "application/json",
1600
+ ...(token ? { Authorization: `Bearer ${token}` } : {}),
1601
+ },
1602
+ body: JSON.stringify({ taskId }),
1603
+ }).catch((err) => {
1604
+ console.error("[slack] Approval dispatch failed:", err);
1605
+ });
1606
+ } catch (err) {
1607
+ console.error("[slack] Interaction handling failed:", err);
1608
+ }
1609
+ return "ok";
1610
+ }),
1611
+ );
1612
+
1613
+ // ─── Managed integration installations ───────────────────────
1614
+ h3.use(
1615
+ `${P}/installations`,
1616
+ defineEventHandler(async (event) => {
1617
+ const method = getMethod(event);
1618
+ if (method !== "GET" && method !== "POST") {
1619
+ setResponseStatus(event, 405);
1620
+ return { error: "Method not allowed" };
1621
+ }
1622
+ const session = await getSession(event).catch(() => null);
1623
+ if (!session?.email) {
1624
+ setResponseStatus(event, 401);
1625
+ return { error: "unauthorized" };
1626
+ }
1627
+ const org = await getOrgContext(event).catch(() => null);
1628
+ const actor = {
1629
+ userEmail: session.email,
1630
+ orgId: org?.orgId ?? session.orgId ?? null,
1631
+ isOrgAdmin: org?.role === "owner" || org?.role === "admin",
1632
+ };
1633
+ if (method === "GET") {
1634
+ const query = getQuery(event);
1635
+ return {
1636
+ installations: await listIntegrationInstallations(
1637
+ actor,
1638
+ typeof query.platform === "string" ? query.platform : undefined,
1639
+ ),
1640
+ };
1641
+ }
1642
+ const body = (await readBody(event)) as {
1643
+ id?: unknown;
1644
+ action?: unknown;
1645
+ };
1646
+ const id = typeof body.id === "string" ? body.id : "";
1647
+ if (!id) {
1648
+ setResponseStatus(event, 400);
1649
+ return { error: "installation id required" };
1650
+ }
1651
+ if (body.action === "disconnect") {
1652
+ return {
1653
+ installation: await disconnectIntegrationInstallation(id, actor),
1654
+ };
1655
+ }
1656
+ if (body.action === "test") {
1657
+ const installation = (
1658
+ await listIntegrationInstallations(actor, "slack")
1659
+ ).find((item) => item.id === id);
1660
+ if (!installation) {
1661
+ setResponseStatus(event, 404);
1662
+ return { error: "installation not found" };
1663
+ }
1664
+ const bundle = await resolveIntegrationTokenBundle(
1665
+ installation.platform,
1666
+ installation.installationKey,
1667
+ );
1668
+ if (!bundle) {
1669
+ const updated = await updateIntegrationInstallation(id, actor, {
1670
+ health: "revoked",
1671
+ status: "revoked",
1672
+ lastError: "token_unavailable",
1673
+ healthCheckedAt: Date.now(),
1674
+ });
1675
+ return { installation: updated };
1676
+ }
1677
+ const health = await testSlackAuth(bundle.accessToken);
1678
+ const updated = await updateIntegrationInstallation(id, actor, {
1679
+ health: health.health,
1680
+ status: health.health === "revoked" ? "revoked" : "connected",
1681
+ lastError: health.error,
1682
+ healthCheckedAt: health.checkedAt,
1683
+ ...(health.ok ? { lastHealthyAt: health.checkedAt } : {}),
1684
+ });
1685
+ return { installation: updated };
1686
+ }
1687
+ setResponseStatus(event, 400);
1688
+ return { error: "unsupported installation action" };
1689
+ }),
1690
+ );
1691
+
1692
+ h3.use(
1693
+ `${P}/scopes`,
1694
+ defineEventHandler(async (event) => {
1695
+ const method = getMethod(event);
1696
+ if (method !== "GET" && method !== "POST") {
1697
+ setResponseStatus(event, 405);
1698
+ return { error: "Method not allowed" };
1699
+ }
1700
+ const ctx = await requireSessionContext(event);
1701
+ if (!ctx) return { error: "unauthorized" };
1702
+ const access = { ownerEmail: ctx.ownerEmail, orgId: ctx.orgId };
1703
+ if (method === "GET") {
1704
+ const query = getQuery(event);
1705
+ return {
1706
+ scopes: await listIntegrationScopes(access, {
1707
+ platform:
1708
+ typeof query.platform === "string" ? query.platform : undefined,
1709
+ tenantId:
1710
+ typeof query.tenantId === "string" ? query.tenantId : undefined,
1711
+ }),
1712
+ };
1713
+ }
1714
+ const admin = await checkOrgAdmin(event);
1715
+ if (!admin.ok) return { error: admin.error };
1716
+ try {
1717
+ const body = (await readBody(event)) as Parameters<
1718
+ typeof saveIntegrationScope
1719
+ >[0];
1720
+ return { scope: await saveIntegrationScope(body, access) };
1721
+ } catch (err) {
1722
+ setResponseStatus(event, 400);
1723
+ return {
1724
+ error: err instanceof Error ? err.message : "invalid scope",
1725
+ };
1726
+ }
1727
+ }),
1728
+ );
1729
+
1730
+ h3.use(
1731
+ `${P}/budgets`,
1732
+ defineEventHandler(async (event) => {
1733
+ const method = getMethod(event);
1734
+ if (method !== "GET" && method !== "POST") {
1735
+ setResponseStatus(event, 405);
1736
+ return { error: "Method not allowed" };
1737
+ }
1738
+ const ctx = await requireSessionContext(event);
1739
+ if (!ctx) return { error: "unauthorized" };
1740
+ const access = { ownerEmail: ctx.ownerEmail, orgId: ctx.orgId };
1741
+ if (method === "GET") {
1742
+ return { budgets: await listIntegrationUsageBudgets(access) };
1743
+ }
1744
+ const admin = await checkOrgAdmin(event);
1745
+ if (!admin.ok) return { error: admin.error };
1746
+ try {
1747
+ const body = (await readBody(event)) as Parameters<
1748
+ typeof saveIntegrationUsageBudget
1749
+ >[0];
1750
+ return {
1751
+ budget: await saveIntegrationUsageBudget(body, access),
1752
+ };
1753
+ } catch (err) {
1754
+ setResponseStatus(event, 400);
1755
+ return {
1756
+ error: err instanceof Error ? err.message : "invalid budget",
1757
+ };
1758
+ }
1759
+ }),
1760
+ );
1761
+
1762
+ h3.use(
1763
+ `${P}/memory`,
1764
+ defineEventHandler(async (event) => {
1765
+ const method = getMethod(event);
1766
+ if (method !== "GET" && method !== "POST") {
1767
+ setResponseStatus(event, 405);
1768
+ return { error: "Method not allowed" };
1769
+ }
1770
+ const ctx = await requireSessionContext(event);
1771
+ if (!ctx) return { error: "unauthorized" };
1772
+ const access = { ownerEmail: ctx.ownerEmail, orgId: ctx.orgId };
1773
+ const query = getQuery(event);
1774
+ const body =
1775
+ method === "POST"
1776
+ ? ((await readBody(event)) as Record<string, unknown>)
1777
+ : null;
1778
+ const scopeId =
1779
+ typeof query.scopeId === "string"
1780
+ ? query.scopeId
1781
+ : typeof body?.scopeId === "string"
1782
+ ? body.scopeId
1783
+ : "";
1784
+ const scope = (await listIntegrationScopes(access)).find(
1785
+ (item) => item.id === scopeId,
1786
+ );
1787
+ if (!scope) {
1788
+ setResponseStatus(event, 404);
1789
+ return { error: "integration scope not found" };
1790
+ }
1791
+ if (method === "GET") {
1792
+ return { memories: await listIntegrationMemory(scope.id) };
1793
+ }
1794
+ const admin = await checkOrgAdmin(event);
1795
+ if (!admin.ok) return { error: admin.error };
1796
+ if (body?.action === "remember") {
1797
+ return {
1798
+ memory: await rememberForIntegrationScope(
1799
+ {
1800
+ name: String(body.name ?? ""),
1801
+ description: String(body.description ?? ""),
1802
+ content: String(body.content ?? ""),
1803
+ },
1804
+ scope.id,
1805
+ ),
1806
+ };
1807
+ }
1808
+ if (body?.action === "forget") {
1809
+ return {
1810
+ memory: await forgetIntegrationMemory(
1811
+ { name: String(body.name ?? "") },
1812
+ scope.id,
1813
+ ),
1814
+ };
1815
+ }
1816
+ setResponseStatus(event, 400);
1817
+ return { error: "unsupported memory action" };
1818
+ }),
1819
+ );
1820
+
1821
+ // ─── Managed Slack OAuth ──────────────────────────────────────
1822
+ h3.use(
1823
+ `${P}/slack/manifest`,
1824
+ defineEventHandler(async (event) => {
1825
+ if (getMethod(event) !== "GET") {
1826
+ setResponseStatus(event, 405);
1827
+ return { error: "Method not allowed" };
1828
+ }
1829
+ const oauthRedirectUrl = resolveOAuthRedirectUri(
1830
+ event,
1831
+ `${P}/slack/oauth/callback`,
1832
+ );
1833
+ const eventsRequestUrl = resolveOAuthRedirectUri(
1834
+ event,
1835
+ `${P}/slack/webhook`,
1836
+ );
1837
+ const interactivityRequestUrl = resolveOAuthRedirectUri(
1838
+ event,
1839
+ `${P}/slack/interactions`,
1840
+ );
1841
+ if (
1842
+ !oauthRedirectUrl ||
1843
+ !eventsRequestUrl ||
1844
+ !interactivityRequestUrl
1845
+ ) {
1846
+ setResponseStatus(event, 400);
1847
+ return { error: "Slack manifest URLs are not allowed." };
1848
+ }
1849
+ setResponseHeader(
1850
+ event,
1851
+ "content-disposition",
1852
+ 'attachment; filename="agent-native-slack-manifest.json"',
1853
+ );
1854
+ return buildSlackAgentManifest({
1855
+ oauthRedirectUrl,
1856
+ eventsRequestUrl,
1857
+ interactivityRequestUrl,
1858
+ });
1859
+ }),
1860
+ );
1861
+
1862
+ h3.use(
1863
+ `${P}/slack/oauth/install`,
1864
+ defineEventHandler(async (event) => {
1865
+ if (getMethod(event) !== "GET") {
1866
+ setResponseStatus(event, 405);
1867
+ return { error: "Method not allowed" };
1868
+ }
1869
+ const session = await getSession(event).catch(() => null);
1870
+ if (!session?.email) {
1871
+ setResponseStatus(event, 401);
1872
+ return { error: "Sign in before connecting Slack." };
1873
+ }
1874
+ const org = await getOrgContext(event).catch(() => null);
1875
+ try {
1876
+ assertSlackInstallAccess({
1877
+ email: session.email,
1878
+ orgId: org?.orgId ?? session.orgId ?? null,
1879
+ orgRole: org?.role ?? null,
1880
+ });
1881
+ } catch (err) {
1882
+ setResponseStatus(event, 403);
1883
+ return {
1884
+ error: err instanceof Error ? err.message : "Slack access denied",
1885
+ };
1886
+ }
1887
+ const clientId = await resolveSecret("SLACK_CLIENT_ID");
1888
+ const clientSecret = await resolveSecret("SLACK_CLIENT_SECRET");
1889
+ const signingSecret = await resolveSecret("SLACK_SIGNING_SECRET");
1890
+ if (!clientId || !clientSecret || !signingSecret) {
1891
+ setResponseStatus(event, 503);
1892
+ return {
1893
+ error:
1894
+ "Slack OAuth is not configured. Add the Slack client id, client secret, and signing secret first.",
1895
+ };
1896
+ }
1897
+ const redirectUri = resolveOAuthRedirectUri(
1898
+ event,
1899
+ `${P}/slack/oauth/callback`,
1900
+ );
1901
+ if (!redirectUri) {
1902
+ setResponseStatus(event, 400);
1903
+ return { error: "Slack OAuth redirect URL is not allowed." };
1904
+ }
1905
+ const query = getQuery(event);
1906
+ const state = encodeOAuthState({
1907
+ redirectUri,
1908
+ owner: session.email,
1909
+ orgId: org?.orgId ?? session.orgId ?? undefined,
1910
+ app: "agent-native:slack",
1911
+ addAccount: true,
1912
+ returnUrl:
1913
+ typeof query.return === "string" ? query.return : "/messaging",
1914
+ });
1915
+ return sendRedirect(
1916
+ event,
1917
+ buildSlackAuthorizeUrl({ clientId, redirectUri, state }),
1918
+ 302,
1919
+ );
1920
+ }),
1921
+ );
1922
+
1923
+ h3.use(
1924
+ `${P}/slack/oauth/callback`,
1925
+ defineEventHandler(async (event) => {
1926
+ if (getMethod(event) !== "GET") {
1927
+ setResponseStatus(event, 405);
1928
+ return { error: "Method not allowed" };
1929
+ }
1930
+ const query = getQuery(event);
1931
+ if (typeof query.error === "string") {
1932
+ return oauthErrorPage("Slack authorization was canceled or denied.");
1933
+ }
1934
+ const fallbackRedirect = resolveOAuthRedirectUri(
1935
+ event,
1936
+ `${P}/slack/oauth/callback`,
1937
+ );
1938
+ if (!fallbackRedirect) {
1939
+ return oauthErrorPage("Slack OAuth redirect URL is not allowed.");
1940
+ }
1941
+ const state = decodeOAuthState(
1942
+ typeof query.state === "string" ? query.state : undefined,
1943
+ fallbackRedirect,
1944
+ );
1945
+ const session = await getSession(event).catch(() => null);
1946
+ const org = await getOrgContext(event).catch(() => null);
1947
+ if (
1948
+ state.app !== "agent-native:slack" ||
1949
+ !session?.email ||
1950
+ !state.owner ||
1951
+ session.email.toLowerCase() !== state.owner.toLowerCase() ||
1952
+ (state.orgId ?? null) !== (org?.orgId ?? session.orgId ?? null)
1953
+ ) {
1954
+ return oauthErrorPage(
1955
+ "Your Slack install session expired or changed. Sign in and start again.",
1956
+ );
1957
+ }
1958
+ const code = typeof query.code === "string" ? query.code : null;
1959
+ if (!code) return oauthErrorPage("Slack did not return an OAuth code.");
1960
+ try {
1961
+ const access = assertSlackInstallAccess({
1962
+ email: session.email,
1963
+ orgId: org?.orgId ?? session.orgId ?? null,
1964
+ orgRole: org?.role ?? null,
1965
+ });
1966
+ const clientId = await resolveSecret("SLACK_CLIENT_ID");
1967
+ const clientSecret = await resolveSecret("SLACK_CLIENT_SECRET");
1968
+ if (!clientId || !clientSecret) {
1969
+ return oauthErrorPage("Slack OAuth is not configured.");
1970
+ }
1971
+ return await runWithRequestContext(
1972
+ {
1973
+ userEmail: access.ownerEmail,
1974
+ orgId: access.orgId ?? undefined,
1975
+ },
1976
+ async () => {
1977
+ const oauth = await exchangeSlackOAuthCode({
1978
+ code,
1979
+ clientId,
1980
+ clientSecret,
1981
+ redirectUri: state.redirectUri,
1982
+ });
1983
+ const health = await testSlackAuth(oauth.access_token || "");
1984
+ if (!health.ok) {
1985
+ return oauthErrorPage(
1986
+ "Slack connected, but the bot token could not be verified. Please retry.",
1987
+ );
1988
+ }
1989
+ if (
1990
+ oauth.team?.id &&
1991
+ health.teamId &&
1992
+ oauth.team.id !== health.teamId
1993
+ ) {
1994
+ return oauthErrorPage(
1995
+ "Slack returned inconsistent workspace details. Please retry.",
1996
+ );
1997
+ }
1998
+ const input = slackOAuthResponseToInstallation(oauth, access);
1999
+ const installation = await upsertIntegrationInstallation({
2000
+ ...input,
2001
+ health: health.health,
2002
+ healthCheckedAt: health.checkedAt,
2003
+ lastHealthyAt: health.checkedAt,
2004
+ });
2005
+ await saveIntegrationConfig(
2006
+ "slack",
2007
+ { enabled: true, managedOAuth: true },
2008
+ "default",
2009
+ access.ownerEmail,
2010
+ );
2011
+ return oauthCallbackResponse(
2012
+ event,
2013
+ installation.teamName || installation.enterpriseName || "Slack",
2014
+ {
2015
+ addAccount: true,
2016
+ appName: "Agent Native",
2017
+ returnUrl: state.returnUrl || "/messaging",
2018
+ },
2019
+ );
2020
+ },
2021
+ );
2022
+ } catch (err) {
2023
+ console.error("[slack] OAuth callback failed:", err);
2024
+ return oauthErrorPage("Slack connection failed. Please try again.");
2025
+ }
2026
+ }),
2027
+ );
2028
+
1424
2029
  // ─── Per-platform catch-all ───────────────────────────────────
1425
2030
  // Handles: webhook, status, enable, disable, setup for each platform
1426
2031
  h3.use(
@@ -1534,20 +2139,13 @@ export function createIntegrationsPlugin(
1534
2139
  const credentialContext =
1535
2140
  await credentialContextForIntegrationConfig(config);
1536
2141
 
1537
- // Handle platform verification challenges (e.g. Slack url_verification)
1538
- // before checking enable state or parsing the message.
2142
+ // Let the adapter cache the raw request and identify setup
2143
+ // challenges, but never return a challenge response until the
2144
+ // provider signature has been verified.
1539
2145
  const verification = await withCredentialContext(
1540
2146
  credentialContext,
1541
2147
  () => adapter.handleVerification(event),
1542
2148
  );
1543
- if (verification.handled) {
1544
- return verification.response ?? "ok";
1545
- }
1546
-
1547
- if (!config?.configData?.enabled) {
1548
- setResponseStatus(event, 404);
1549
- return { error: `Integration ${platform} is not enabled` };
1550
- }
1551
2149
 
1552
2150
  // Verify the webhook signature BEFORE parsing. We pre-parse the
1553
2151
  // body here (so handleWebhook can skip its second readBody, which
@@ -1561,6 +2159,15 @@ export function createIntegrationsPlugin(
1561
2159
  setResponseStatus(event, 401);
1562
2160
  return { error: "Invalid webhook signature" };
1563
2161
  }
2162
+ if (verification.handled) {
2163
+ setResponseStatus(event, 200);
2164
+ return verification.response ?? "ok";
2165
+ }
2166
+
2167
+ if (!config?.configData?.enabled) {
2168
+ setResponseStatus(event, 404);
2169
+ return { error: `Integration ${platform} is not enabled` };
2170
+ }
1564
2171
 
1565
2172
  const incoming = await withCredentialContext(credentialContext, () =>
1566
2173
  adapter.parseIncomingMessage(event),
@@ -1569,10 +2176,32 @@ export function createIntegrationsPlugin(
1569
2176
  setResponseStatus(event, 200);
1570
2177
  return "ok";
1571
2178
  }
1572
- let owner = `integration@${platform}`;
1573
- if (options?.resolveOwner) {
2179
+ let executionContext: IntegrationExecutionContext = {
2180
+ ownerEmail: `integration@${platform}`,
2181
+ orgId: null as string | null,
2182
+ principalType: "service" as const,
2183
+ };
2184
+ if (options?.resolveExecutionContext) {
1574
2185
  try {
1575
- owner = await options.resolveOwner(incoming);
2186
+ executionContext = await withCredentialContext(
2187
+ credentialContext,
2188
+ () =>
2189
+ Promise.resolve(options.resolveExecutionContext!(incoming)),
2190
+ );
2191
+ } catch (err) {
2192
+ console.error(
2193
+ `[integrations] resolveExecutionContext denied message:`,
2194
+ err,
2195
+ );
2196
+ setResponseStatus(event, 200);
2197
+ return "ok";
2198
+ }
2199
+ } else if (options?.resolveOwner) {
2200
+ try {
2201
+ executionContext.ownerEmail = await withCredentialContext(
2202
+ credentialContext,
2203
+ () => Promise.resolve(options.resolveOwner!(incoming)),
2204
+ );
1576
2205
  } catch (err) {
1577
2206
  console.error(
1578
2207
  `[integrations] resolveOwner failed, using default:`,
@@ -1580,21 +2209,23 @@ export function createIntegrationsPlugin(
1580
2209
  );
1581
2210
  }
1582
2211
  }
1583
- const resources = await loadResourcesForPrompt(
1584
- owner,
1585
- true,
1586
- options?.appId,
1587
- );
1588
- const systemPrompt = baseSystemPrompt + resources;
2212
+ if (executionContext.scopeId) {
2213
+ incoming.integrationScopeId = executionContext.scopeId;
2214
+ }
1589
2215
  const result = await handleWebhook(event, {
1590
2216
  adapter,
1591
- systemPrompt,
2217
+ // The processor reloads scoped resources immediately before the
2218
+ // agent run. Avoid doing that work on the acknowledgement path,
2219
+ // where providers such as Discord enforce a 3-second deadline.
2220
+ systemPrompt: baseSystemPrompt,
1592
2221
  actions,
1593
2222
  model,
1594
2223
  apiKey: getApiKey(),
1595
2224
  engine: options?.engine,
1596
2225
  appId: options?.appId,
1597
- ownerEmail: owner,
2226
+ ownerEmail: executionContext.ownerEmail,
2227
+ orgId: executionContext.orgId,
2228
+ principalType: executionContext.principalType,
1598
2229
  beforeProcess: options?.beforeProcess,
1599
2230
  incoming,
1600
2231
  });
@@ -1646,11 +2277,15 @@ export function createIntegrationsPlugin(
1646
2277
  toCredentialContext(ctx),
1647
2278
  () => resolveSecret("TELEGRAM_BOT_TOKEN"),
1648
2279
  );
1649
- if (!token) {
2280
+ const webhookSecret = await withCredentialContext(
2281
+ toCredentialContext(ctx),
2282
+ () => resolveSecret("TELEGRAM_WEBHOOK_SECRET"),
2283
+ );
2284
+ if (!token || !webhookSecret) {
1650
2285
  setResponseStatus(event, 400);
1651
2286
  return {
1652
2287
  error:
1653
- "TELEGRAM_BOT_TOKEN not configured. Save it in settings.",
2288
+ "TELEGRAM_BOT_TOKEN and TELEGRAM_WEBHOOK_SECRET must be configured before webhook setup.",
1654
2289
  };
1655
2290
  }
1656
2291
  try {
@@ -1659,7 +2294,10 @@ export function createIntegrationsPlugin(
1659
2294
  {
1660
2295
  method: "POST",
1661
2296
  headers: { "Content-Type": "application/json" },
1662
- body: JSON.stringify({ url: webhookUrl }),
2297
+ body: JSON.stringify({
2298
+ url: webhookUrl,
2299
+ secret_token: webhookSecret,
2300
+ }),
1663
2301
  },
1664
2302
  );
1665
2303
  const data = await res.json();
@@ -1702,7 +2340,7 @@ export function createIntegrationsPlugin(
1702
2340
  ? `${withConfiguredAppBasePath(baseUrl)}${P}/google-docs/webhook`
1703
2341
  : undefined;
1704
2342
 
1705
- startGoogleDocsPoller({
2343
+ void startGoogleDocsPoller({
1706
2344
  systemPrompt: baseSystemPrompt,
1707
2345
  actions,
1708
2346
  model: model ?? "",