@agent-native/core 0.92.11 → 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 (777) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +45 -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 +48 -5
  55. package/corpus/core/src/agent/run-manager.ts +171 -20
  56. package/corpus/core/src/agent/run-store.ts +297 -42
  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 +110 -17
  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/components/player/transcript-panel.tsx +27 -5
  168. package/corpus/templates/clips/app/hooks/use-library.ts +1 -1
  169. package/corpus/templates/clips/app/hooks/use-navigation-state.ts +10 -2
  170. package/corpus/templates/clips/app/hooks/use-player-shortcuts.ts +1 -0
  171. package/corpus/templates/clips/app/i18n/ar-SA.ts +7 -1
  172. package/corpus/templates/clips/app/i18n/de-DE.ts +7 -1
  173. package/corpus/templates/clips/app/i18n/en-US.ts +7 -1
  174. package/corpus/templates/clips/app/i18n/es-ES.ts +7 -1
  175. package/corpus/templates/clips/app/i18n/fr-FR.ts +7 -1
  176. package/corpus/templates/clips/app/i18n/hi-IN.ts +7 -1
  177. package/corpus/templates/clips/app/i18n/ja-JP.ts +7 -1
  178. package/corpus/templates/clips/app/i18n/ko-KR.ts +7 -1
  179. package/corpus/templates/clips/app/i18n/pt-BR.ts +7 -1
  180. package/corpus/templates/clips/app/i18n/zh-CN.ts +8 -1
  181. package/corpus/templates/clips/app/i18n/zh-TW.ts +8 -1
  182. package/corpus/templates/clips/app/lib/recording-visibility.ts +70 -0
  183. package/corpus/templates/clips/app/routes/_app.shared.tsx +20 -0
  184. package/corpus/templates/clips/app/routes/download.tsx +24 -8
  185. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +115 -2
  186. package/corpus/templates/clips/app/routes/record.tsx +62 -0
  187. package/corpus/templates/clips/app/routes/share.$shareId.tsx +25 -16
  188. package/corpus/templates/clips/changelog/2026-07-10-clips-desktop-is-now-available-for-linux-with-appimage-debia.md +6 -0
  189. package/corpus/templates/clips/changelog/2026-07-10-clips-downloads-updates-sooner-in-the-background-and-offers-.md +6 -0
  190. package/corpus/templates/clips/changelog/2026-07-10-clips-shared-with-you-now-appear-in-a-searchable-shared-with.md +6 -0
  191. package/corpus/templates/clips/changelog/2026-07-10-clips-with-missing-mobile-video-frames-can-be-repaired-witho.md +6 -0
  192. package/corpus/templates/clips/changelog/2026-07-10-fixed-copying-agent-responses-and-transcript-text-from-recor.md +6 -0
  193. package/corpus/templates/clips/changelog/2026-07-10-mobile-camera-recordings-pause-while-backgrounded.md +6 -0
  194. package/corpus/templates/clips/changelog/2026-07-10-mp4-downloads-now-show-progress-immediately-after-the-option.md +6 -0
  195. package/corpus/templates/clips/changelog/2026-07-10-recording-pages-now-open-as-soon-as-you-stop-with-a-share-li.md +6 -0
  196. package/corpus/templates/clips/changelog/2026-07-10-recordings-now-seek-smoothly-downloads-use-the-correct-file-.md +6 -0
  197. package/corpus/templates/clips/changelog/2026-07-10-s3-compatible-storage-now-saves-hosted-recordings-without-re.md +6 -0
  198. package/corpus/templates/clips/desktop/README.md +22 -6
  199. package/corpus/templates/clips/desktop/package.json +1 -1
  200. package/corpus/templates/clips/desktop/src/app.tsx +32 -19
  201. package/corpus/templates/clips/desktop/src/components/ReadinessPanel.tsx +15 -9
  202. package/corpus/templates/clips/desktop/src/lib/finalization-guard.ts +22 -0
  203. package/corpus/templates/clips/desktop/src/lib/permissions.ts +3 -1
  204. package/corpus/templates/clips/desktop/src/lib/recorder.ts +97 -120
  205. package/corpus/templates/clips/desktop/src/lib/updater.ts +26 -4
  206. package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +4 -8
  207. package/corpus/templates/clips/desktop/src-tauri/Cargo.toml +1 -1
  208. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +2 -2
  209. package/corpus/templates/clips/desktop/src-tauri/src/permission_status.rs +11 -7
  210. package/corpus/templates/clips/desktop/src-tauri/tauri.linux.conf.json +11 -0
  211. package/corpus/templates/clips/netlify.toml +3 -0
  212. package/corpus/templates/clips/server/lib/post-finalize-dispatch.ts +106 -0
  213. package/corpus/templates/clips/server/lib/public-agent-context.ts +9 -1
  214. package/corpus/templates/clips/server/lib/resumable-upload-provider.ts +52 -0
  215. package/corpus/templates/clips/server/lib/s3-upload-provider.ts +433 -85
  216. package/corpus/templates/clips/server/lib/video-remux.ts +114 -0
  217. package/corpus/templates/clips/server/routes/api/_agent-native-background/post-finalize-worker.post.ts +109 -0
  218. package/corpus/templates/clips/server/routes/api/clips-updater.json.get.ts +22 -11
  219. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +4 -2
  220. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +47 -5
  221. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +10 -2
  222. package/corpus/templates/clips/shared/share-loader-response.ts +12 -0
  223. package/corpus/templates/clips/shared/transcript-status.ts +40 -0
  224. package/corpus/templates/content/.agents/skills/capture-learnings/SKILL.md +22 -9
  225. package/corpus/templates/content/.agents/skills/content/SKILL.md +57 -5
  226. package/corpus/templates/content/AGENTS.md +65 -55
  227. package/corpus/templates/content/actions/_builder-cms-read-client.ts +92 -23
  228. package/corpus/templates/content/actions/_database-source-utils.ts +207 -41
  229. package/corpus/templates/content/actions/_property-utils.ts +30 -2
  230. package/corpus/templates/content/actions/add-content-database-source-field-property.ts +316 -121
  231. package/corpus/templates/content/actions/attach-content-database-source.ts +41 -17
  232. package/corpus/templates/content/actions/change-content-database-source-role.ts +46 -8
  233. package/corpus/templates/content/actions/submit-content-database-form.ts +497 -0
  234. package/corpus/templates/content/actions/suggest-source-join-key.ts +8 -1
  235. package/corpus/templates/content/actions/update-content-database-view.ts +8 -1
  236. package/corpus/templates/content/actions/view-screen.ts +4 -1
  237. package/corpus/templates/content/agent-native.app-skill.json +1 -1
  238. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +250 -64
  239. package/corpus/templates/content/app/components/editor/database/FormView.tsx +460 -0
  240. package/corpus/templates/content/app/components/editor/database/navigation-state.ts +3 -0
  241. package/corpus/templates/content/app/components/editor/database/settings.tsx +30 -37
  242. package/corpus/templates/content/app/components/editor/database/shared.tsx +2 -0
  243. package/corpus/templates/content/app/components/editor/database/view-config.ts +29 -1
  244. package/corpus/templates/content/app/components/ui/textarea.tsx +1 -0
  245. package/corpus/templates/content/app/hooks/use-content-database.ts +22 -0
  246. package/corpus/templates/content/app/i18n/zh-TW.ts +21 -0
  247. package/corpus/templates/content/app/i18n-data.ts +225 -0
  248. package/corpus/templates/content/changelog/2026-07-09-builder-source-refreshes-now-keep-mapped-fields-such-as-topi.md +6 -0
  249. package/corpus/templates/content/changelog/2026-07-10-builder-backed-properties-now-load-current-source-values-as-.md +6 -0
  250. package/corpus/templates/content/changelog/2026-07-10-builder-database-refreshes-now-stay-explicit-and-accurate.md +6 -0
  251. package/corpus/templates/content/changelog/2026-07-10-database-form-views-now-collect-ordered-required-answers-and.md +6 -0
  252. package/corpus/templates/content/changelog/2026-07-10-database-tables-now-use-a-quieter-more-compact-layout-with-c.md +6 -0
  253. package/corpus/templates/content/changelog/2026-07-10-slack-intake-routes-to-content-database-forms.md +6 -0
  254. package/corpus/templates/content/parity/matrix.md +1 -0
  255. package/corpus/templates/content/parity/matrix.ts +18 -0
  256. package/corpus/templates/content/shared/api.ts +28 -1
  257. package/corpus/templates/content/shared/database-form.ts +53 -0
  258. package/corpus/templates/design/.agents/skills/capture-learnings/SKILL.md +22 -9
  259. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +26 -0
  260. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +85 -12
  261. package/corpus/templates/design/AGENTS.md +72 -18
  262. package/corpus/templates/design/DESIGN.md +1 -1
  263. package/corpus/templates/design/DEVELOPING.md +1 -1
  264. package/corpus/templates/design/FIGMA_INTEROPERABILITY.md +116 -0
  265. package/corpus/templates/design/actions/create-design-from-template.ts +220 -0
  266. package/corpus/templates/design/actions/create-design-system.ts +92 -16
  267. package/corpus/templates/design/actions/delete-design-template.ts +28 -0
  268. package/corpus/templates/design/actions/delete-file.ts +7 -0
  269. package/corpus/templates/design/actions/edit-design.ts +3 -0
  270. package/corpus/templates/design/actions/export-design-as-figma-svg.ts +137 -5
  271. package/corpus/templates/design/actions/export-pdf.ts +1 -1
  272. package/corpus/templates/design/actions/generate-design.ts +3 -0
  273. package/corpus/templates/design/actions/get-design-snapshot.ts +9 -0
  274. package/corpus/templates/design/actions/get-figma-connection-status.ts +26 -0
  275. package/corpus/templates/design/actions/get-figma-design-context.ts +138 -0
  276. package/corpus/templates/design/actions/get-figma-styles.ts +2 -2
  277. package/corpus/templates/design/actions/import-figma-clipboard.ts +112 -16
  278. package/corpus/templates/design/actions/import-figma-frame.ts +15 -4
  279. package/corpus/templates/design/actions/index-design-system-with-builder.ts +4 -0
  280. package/corpus/templates/design/actions/list-design-templates.ts +118 -0
  281. package/corpus/templates/design/actions/navigate.ts +16 -2
  282. package/corpus/templates/design/actions/provider-api-request.ts +11 -1
  283. package/corpus/templates/design/actions/save-design-as-template.ts +156 -0
  284. package/corpus/templates/design/actions/set-active-breakpoint.ts +13 -4
  285. package/corpus/templates/design/actions/take-design-screenshot.ts +73 -3
  286. package/corpus/templates/design/actions/update-file.ts +39 -22
  287. package/corpus/templates/design/actions/view-screen.ts +36 -1
  288. package/corpus/templates/design/actions/write-local-file.ts +50 -38
  289. package/corpus/templates/design/app/components/design/AutoLayoutSuggestionDialog.tsx +151 -0
  290. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +20 -0
  291. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +251 -22
  292. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +3 -3
  293. package/corpus/templates/design/app/components/design/DesignImportPanel.tsx +384 -9
  294. package/corpus/templates/design/app/components/design/EditPanel.tsx +105 -32
  295. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +58 -28
  296. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +6 -0
  297. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +539 -53
  298. package/corpus/templates/design/app/components/design/bridge/embedded-wheel.bridge.ts +40 -0
  299. package/corpus/templates/design/app/components/design/code-workbench/CodeWorkbench.tsx +1 -0
  300. package/corpus/templates/design/app/components/design/code-workbench/explorer/ExplorerView.tsx +1 -0
  301. package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +5 -1
  302. package/corpus/templates/design/app/components/design/code-workbench/workspace/create-providers.ts +2 -0
  303. package/corpus/templates/design/app/components/design/code-workbench/workspace/localhost-provider.ts +3 -1
  304. package/corpus/templates/design/app/components/design/code-workbench/workspace/types.ts +2 -0
  305. package/corpus/templates/design/app/components/design/edit-panel/element-identity.ts +19 -0
  306. package/corpus/templates/design/app/components/design/edit-panel/frame-presets-panel.tsx +1 -0
  307. package/corpus/templates/design/app/components/design/edit-panel/interaction-state-helpers.ts +27 -0
  308. package/corpus/templates/design/app/components/design/inspector/InteractionStatePanel.tsx +137 -81
  309. package/corpus/templates/design/app/components/design/inspector/frame-size-presets.ts +25 -5
  310. package/corpus/templates/design/app/components/design/multi-screen/chrome-transitions.ts +1 -1
  311. package/corpus/templates/design/app/components/design/multi-screen/frame-geometry.ts +220 -3
  312. package/corpus/templates/design/app/components/design/multi-screen/overview-layout.ts +13 -0
  313. package/corpus/templates/design/app/components/design/multi-screen/types.ts +22 -1
  314. package/corpus/templates/design/app/components/design/types.ts +4 -0
  315. package/corpus/templates/design/app/components/design-system/ProductionDesignSystemShowcase.tsx +208 -0
  316. package/corpus/templates/design/app/components/editor/FigmaLinkComposerBubble.tsx +321 -0
  317. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +24 -4
  318. package/corpus/templates/design/app/components/layout/Layout.tsx +16 -2
  319. package/corpus/templates/design/app/components/layout/Sidebar.tsx +2 -0
  320. package/corpus/templates/design/app/components/templates/TemplatePreview.tsx +72 -0
  321. package/corpus/templates/design/app/global.css +2 -35
  322. package/corpus/templates/design/app/hooks/use-navigation-state.ts +10 -0
  323. package/corpus/templates/design/app/i18n/zh-TW.ts +127 -5
  324. package/corpus/templates/design/app/i18n-breakpoints.ts +209 -0
  325. package/corpus/templates/design/app/i18n-data.ts +1317 -59
  326. package/corpus/templates/design/app/i18n-template-feature.ts +458 -0
  327. package/corpus/templates/design/app/lib/design-clipboard.ts +202 -0
  328. package/corpus/templates/design/app/lib/design-file-upload.ts +87 -0
  329. package/corpus/templates/design/app/lib/design-import.ts +168 -11
  330. package/corpus/templates/design/app/lib/desktop-design-preview.ts +423 -0
  331. package/corpus/templates/design/app/lib/figma-clipboard.ts +74 -8
  332. package/corpus/templates/design/app/lib/figma-connection.ts +161 -0
  333. package/corpus/templates/design/app/lib/figma-svg-copy.ts +814 -22
  334. package/corpus/templates/design/app/lib/figma-url.ts +77 -0
  335. package/corpus/templates/design/app/lib/pending-generation.ts +35 -0
  336. package/corpus/templates/design/app/pages/DesignSystems.tsx +236 -177
  337. package/corpus/templates/design/app/pages/Index.tsx +38 -0
  338. package/corpus/templates/design/app/pages/Templates.tsx +498 -0
  339. package/corpus/templates/design/app/pages/design-editor/auto-layout-suggestion.ts +328 -0
  340. package/corpus/templates/design/app/pages/design-editor/clone-idrefs.ts +113 -0
  341. package/corpus/templates/design/app/pages/design-editor/created-screen-navigation.ts +55 -0
  342. package/corpus/templates/design/app/pages/design-editor/editor-session.ts +32 -0
  343. package/corpus/templates/design/app/pages/design-editor/editor-state.ts +49 -2
  344. package/corpus/templates/design/app/pages/design-editor/export-capture.ts +296 -0
  345. package/corpus/templates/design/app/pages/design-editor/history.ts +101 -2
  346. package/corpus/templates/design/app/pages/design-editor/layout-operations.ts +28 -1
  347. package/corpus/templates/design/app/pages/design-editor/overview-camera.ts +34 -0
  348. package/corpus/templates/design/app/pages/design-editor/pending-edits.ts +202 -6
  349. package/corpus/templates/design/app/pages/design-editor/pending-structure-verification.ts +92 -0
  350. package/corpus/templates/design/app/pages/design-editor/save-failure.ts +58 -0
  351. package/corpus/templates/design/app/routes/templates.tsx +4 -6
  352. package/corpus/templates/design/changelog/2026-07-10-app-workspaces-now-use-clean-borderless-main-surfaces-throug.md +6 -0
  353. package/corpus/templates/design/changelog/2026-07-10-ask-chat-what-s-in-a-figma-file-or-frame-structure-screensho.md +6 -0
  354. package/corpus/templates/design/changelog/2026-07-10-canvas-edits-now-reject-malformed-html-before-it-can-corrupt.md +6 -0
  355. package/corpus/templates/design/changelog/2026-07-10-complex-designs-now-export-as-valid-secure-svgs-and-crisp-ra.md +6 -0
  356. package/corpus/templates/design/changelog/2026-07-10-complex-figma-masks-arcs-rich-text-transformed-images-and-ad.md +6 -0
  357. package/corpus/templates/design/changelog/2026-07-10-copied-layers-paste-across-designs-and-browser-tabs.md +6 -0
  358. package/corpus/templates/design/changelog/2026-07-10-copy-and-download-editable-figma-svg.md +6 -0
  359. package/corpus/templates/design/changelog/2026-07-10-copying-design-text-now-pastes-readable-text-into-other-apps.md +6 -0
  360. package/corpus/templates/design/changelog/2026-07-10-deleted-screens-can-be-restored-with-undo-and-removed-again-.md +6 -0
  361. package/corpus/templates/design/changelog/2026-07-10-design-changes-now-save-before-switching-apps-and-retry-when.md +6 -0
  362. package/corpus/templates/design/changelog/2026-07-10-design-stays-usable-on-phones-by-keeping-editor-panels-and-f.md +6 -0
  363. package/corpus/templates/design/changelog/2026-07-10-download-all-screens-as-one-multi-page-pdf-from-the-overview.md +6 -0
  364. package/corpus/templates/design/changelog/2026-07-10-duplicated-layers-now-keep-labels-aria-relationships-fragmen.md +6 -0
  365. package/corpus/templates/design/changelog/2026-07-10-fig-import-results-stay-compact.md +6 -0
  366. package/corpus/templates/design/changelog/2026-07-10-figma-imports-now-load-real-fonts-fix-rotated-gradient-dashe.md +6 -0
  367. package/corpus/templates/design/changelog/2026-07-10-figma-links-in-chat-and-the-import-tab-now-offer-secure-one-.md +6 -0
  368. package/corpus/templates/design/changelog/2026-07-10-fixed-cmd-z-not-restoring-content-after-an-agent-driven-desi.md +6 -0
  369. package/corpus/templates/design/changelog/2026-07-10-fixed-download-pdf-being-unreachable-from-the-export-panel-e.md +6 -0
  370. package/corpus/templates/design/changelog/2026-07-10-fixed-dragging-a-layer-out-of-an-auto-layout-row-column-no-l.md +6 -0
  371. package/corpus/templates/design/changelog/2026-07-10-fixed-figma-svg-export-text-wrapping-sizing-and-inner-layer.md +6 -0
  372. package/corpus/templates/design/changelog/2026-07-10-fixed-hiding-or-locking-one-layer-no-longer-hides-or-blocks-.md +6 -0
  373. package/corpus/templates/design/changelog/2026-07-10-fixed-png-screenshots-of-tall-screens-being-cropped-to-one-v.md +6 -0
  374. package/corpus/templates/design/changelog/2026-07-10-fixed-png-svg-exports-capturing-broken-layout-when-webfonts-.md +6 -0
  375. package/corpus/templates/design/changelog/2026-07-10-frame-tool-now-offers-standard-ad-unit-size-presets-medium-r.md +6 -0
  376. package/corpus/templates/design/changelog/2026-07-10-full-view-controls-stay-within-their-frame-instead-of-coveri.md +6 -0
  377. package/corpus/templates/design/changelog/2026-07-10-hover-focus-focus-visible-pressed-and-disabled-states-now-pr.md +6 -0
  378. package/corpus/templates/design/changelog/2026-07-10-layer-drops-now-land-in-the-intended-grid-row-stay-visually-.md +6 -0
  379. package/corpus/templates/design/changelog/2026-07-10-local-code-workspaces-now-keep-unsaved-edits-across-panel-sw.md +6 -0
  380. package/corpus/templates/design/changelog/2026-07-10-local-visual-editing-now-keeps-authenticated-sessions-shared.md +6 -0
  381. package/corpus/templates/design/changelog/2026-07-10-long-running-agent-work-no-longer-shows-a-premature-stuck-wa.md +6 -0
  382. package/corpus/templates/design/changelog/2026-07-10-managed-figma-connections-are-recognized-automatically.md +6 -0
  383. package/corpus/templates/design/changelog/2026-07-10-new-designs-can-open-directly-in-the-editor-without-a-pr.md +6 -0
  384. package/corpus/templates/design/changelog/2026-07-10-new-screens-are-selected-and-revealed-immediately.md +6 -0
  385. package/corpus/templates/design/changelog/2026-07-10-new-text-layers-undo-as-one-safe-creation.md +6 -0
  386. package/corpus/templates/design/changelog/2026-07-10-preview-and-apply-inferred-auto-layout-without-changing-yo.md +5 -0
  387. package/corpus/templates/design/changelog/2026-07-10-print-pdf-exports-and-paper-size-presets-letter-a4-now-match.md +6 -0
  388. package/corpus/templates/design/changelog/2026-07-10-responsive-frame-editing.md +6 -0
  389. package/corpus/templates/design/changelog/2026-07-10-reusable-design-templates.md +6 -0
  390. package/corpus/templates/design/changelog/2026-07-10-screen-overview-frames-now-use-a-clearer-interact-action-wit.md +6 -0
  391. package/corpus/templates/design/changelog/2026-07-10-start-designs-from-source-linked-material-3-carbon-or-primer.md +6 -0
  392. package/corpus/templates/design/changelog/2026-07-10-tweaks-guidance.md +6 -0
  393. package/corpus/templates/design/changelog/2026-07-10-uploaded-fig-files-can-now-become-editable-design-screens-wi.md +6 -0
  394. package/corpus/templates/design/e2e/helpers.ts +3 -3
  395. package/corpus/templates/design/package.json +2 -0
  396. package/corpus/templates/design/scripts/qa-figma-stress-import.ts +96 -0
  397. package/corpus/templates/design/server/db/index.ts +10 -0
  398. package/corpus/templates/design/server/db/schema.ts +44 -0
  399. package/corpus/templates/design/server/handlers/import-design-file.ts +114 -80
  400. package/corpus/templates/design/server/handlers/index-design-system-with-builder.ts +19 -6
  401. package/corpus/templates/design/server/lib/design-export.ts +240 -3
  402. package/corpus/templates/design/server/lib/design-template-data.ts +89 -0
  403. package/corpus/templates/design/server/lib/design-to-figma-svg.ts +250 -26
  404. package/corpus/templates/design/server/lib/fig-file-decoder.ts +839 -0
  405. package/corpus/templates/design/server/lib/fig-file-import.ts +287 -0
  406. package/corpus/templates/design/server/lib/fig-file-limits.ts +3 -0
  407. package/corpus/templates/design/server/lib/fig-file-to-html.ts +2568 -0
  408. package/corpus/templates/design/server/lib/figma-design-context.ts +359 -0
  409. package/corpus/templates/design/server/lib/figma-node-import.ts +478 -22
  410. package/corpus/templates/design/server/lib/figma-node-to-html.ts +554 -29
  411. package/corpus/templates/design/server/lib/local-figma-qa-upload.ts +112 -0
  412. package/corpus/templates/design/server/lib/verify-write-grant.ts +16 -2
  413. package/corpus/templates/design/server/lib/visible-clipboard-html.ts +13 -3
  414. package/corpus/templates/design/server/plugins/agent-chat.ts +7 -0
  415. package/corpus/templates/design/server/plugins/db.ts +42 -0
  416. package/corpus/templates/design/server/plugins/local-figma-qa-upload.ts +7 -0
  417. package/corpus/templates/design/server/register-secrets.ts +8 -8
  418. package/corpus/templates/design/server/routes/api/qa-figma-import-assets/[assetId].get.ts +46 -0
  419. package/corpus/templates/design/server/source-workspace.ts +104 -12
  420. package/corpus/templates/design/shared/code-layer.ts +105 -28
  421. package/corpus/templates/design/shared/design-system-templates.ts +301 -0
  422. package/corpus/templates/design/shared/design-template-presets.ts +195 -0
  423. package/corpus/templates/design/shared/figma-url.ts +8 -0
  424. package/corpus/templates/design/shared/html-integrity.ts +306 -0
  425. package/corpus/templates/design/shared/interaction-states.ts +318 -23
  426. package/corpus/templates/design/shared/locked-layers.ts +151 -0
  427. package/corpus/templates/dispatch/.agents/skills/capture-learnings/SKILL.md +22 -9
  428. package/corpus/templates/dispatch/app/i18n/zh-TW.ts +48 -0
  429. package/corpus/templates/dispatch/app/i18n-data.ts +536 -1
  430. package/corpus/templates/dispatch/changelog/2026-07-10-connect-slack-workspaces-with-oauth-and-manage-channel-ident.md +6 -0
  431. package/corpus/templates/dispatch/changelog/2026-07-10-microsoft-teams-bots-and-discord-slash-commands-can-now-conn.md +6 -0
  432. package/corpus/templates/dispatch/changelog/2026-07-10-slack-and-telegram-now-route-uptime-monitor-requests-to-anal.md +6 -0
  433. package/corpus/templates/forms/.agents/skills/capture-learnings/SKILL.md +22 -9
  434. package/corpus/templates/forms/.agents/skills/form-publishing/SKILL.md +7 -0
  435. package/corpus/templates/forms/AGENTS.md +4 -0
  436. package/corpus/templates/forms/actions/create-form.ts +44 -7
  437. package/corpus/templates/forms/actions/lib/assert-publishable-form.ts +38 -0
  438. package/corpus/templates/forms/actions/patch-form-fields.ts +4 -0
  439. package/corpus/templates/forms/actions/update-form.ts +2 -36
  440. package/corpus/templates/forms/app/i18n/ar-SA.ts +3 -0
  441. package/corpus/templates/forms/app/i18n/de-DE.ts +3 -0
  442. package/corpus/templates/forms/app/i18n/en-US.ts +3 -0
  443. package/corpus/templates/forms/app/i18n/es-ES.ts +3 -0
  444. package/corpus/templates/forms/app/i18n/fr-FR.ts +3 -0
  445. package/corpus/templates/forms/app/i18n/hi-IN.ts +3 -0
  446. package/corpus/templates/forms/app/i18n/ja-JP.ts +3 -0
  447. package/corpus/templates/forms/app/i18n/ko-KR.ts +3 -0
  448. package/corpus/templates/forms/app/i18n/pt-BR.ts +3 -0
  449. package/corpus/templates/forms/app/i18n/zh-CN.ts +2 -0
  450. package/corpus/templates/forms/app/i18n/zh-TW.ts +3 -0
  451. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +17 -0
  452. package/corpus/templates/forms/changelog/2026-07-10-agent-created-published-forms-now-return-the-anonymous-publi.md +6 -0
  453. package/corpus/templates/forms/changelog/2026-07-10-published-forms-can-no-longer-be-edited-into-an-unusable-emp.md +6 -0
  454. package/corpus/templates/forms/server/handlers/submissions.ts +4 -3
  455. package/corpus/templates/forms/server/plugins/agent-chat.ts +1 -0
  456. package/corpus/templates/forms/shared/types.ts +5 -0
  457. package/corpus/templates/mail/.agents/skills/capture-learnings/SKILL.md +22 -9
  458. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +2 -2
  459. package/corpus/templates/mail/changelog/2026-07-10-mail-navigation-now-uses-a-clean-borderless-drawer.md +6 -0
  460. package/corpus/templates/plan/.agents/skills/capture-learnings/SKILL.md +22 -9
  461. package/corpus/templates/plan/app/lib/plan-local-bridge.ts +4 -1
  462. package/corpus/templates/plan/changelog/2026-07-10-local-plans-now-keep-valid-content-visible-when-one-generate.md +6 -0
  463. package/corpus/templates/plan/server/lib/local-plan-files.ts +4 -1
  464. package/corpus/templates/slides/.agents/skills/capture-learnings/SKILL.md +22 -9
  465. package/dist/a2a/artifact-response.d.ts.map +1 -1
  466. package/dist/a2a/artifact-response.js +88 -2
  467. package/dist/a2a/artifact-response.js.map +1 -1
  468. package/dist/a2a/client.d.ts +9 -0
  469. package/dist/a2a/client.d.ts.map +1 -1
  470. package/dist/a2a/client.js +1 -0
  471. package/dist/a2a/client.js.map +1 -1
  472. package/dist/a2a/handlers.d.ts.map +1 -1
  473. package/dist/a2a/handlers.js +24 -69
  474. package/dist/a2a/handlers.js.map +1 -1
  475. package/dist/a2a/types.d.ts +2 -0
  476. package/dist/a2a/types.d.ts.map +1 -1
  477. package/dist/a2a/types.js.map +1 -1
  478. package/dist/agent/durable-background.d.ts +11 -0
  479. package/dist/agent/durable-background.d.ts.map +1 -1
  480. package/dist/agent/durable-background.js +17 -0
  481. package/dist/agent/durable-background.js.map +1 -1
  482. package/dist/agent/production-agent.d.ts +5 -3
  483. package/dist/agent/production-agent.d.ts.map +1 -1
  484. package/dist/agent/production-agent.js +34 -8
  485. package/dist/agent/production-agent.js.map +1 -1
  486. package/dist/agent/run-manager.d.ts +44 -2
  487. package/dist/agent/run-manager.d.ts.map +1 -1
  488. package/dist/agent/run-manager.js +124 -18
  489. package/dist/agent/run-manager.js.map +1 -1
  490. package/dist/agent/run-store.d.ts +109 -0
  491. package/dist/agent/run-store.d.ts.map +1 -1
  492. package/dist/agent/run-store.js +274 -37
  493. package/dist/agent/run-store.js.map +1 -1
  494. package/dist/agent/types.d.ts +22 -0
  495. package/dist/agent/types.d.ts.map +1 -1
  496. package/dist/agent/types.js.map +1 -1
  497. package/dist/audit/record.d.ts.map +1 -1
  498. package/dist/audit/record.js +29 -0
  499. package/dist/audit/record.js.map +1 -1
  500. package/dist/audit/store.d.ts.map +1 -1
  501. package/dist/audit/store.js +62 -3
  502. package/dist/audit/store.js.map +1 -1
  503. package/dist/audit/types.d.ts +13 -0
  504. package/dist/audit/types.d.ts.map +1 -1
  505. package/dist/audit/types.js.map +1 -1
  506. package/dist/automation/index.d.ts +193 -0
  507. package/dist/automation/index.d.ts.map +1 -0
  508. package/dist/automation/index.js +464 -0
  509. package/dist/automation/index.js.map +1 -0
  510. package/dist/cli/create.d.ts.map +1 -1
  511. package/dist/cli/create.js +10 -3
  512. package/dist/cli/create.js.map +1 -1
  513. package/dist/cli/design-connect.d.ts.map +1 -1
  514. package/dist/cli/design-connect.js +492 -35
  515. package/dist/cli/design-connect.js.map +1 -1
  516. package/dist/client/AgentPanel.d.ts +7 -1
  517. package/dist/client/AgentPanel.d.ts.map +1 -1
  518. package/dist/client/AgentPanel.js +32 -8
  519. package/dist/client/AgentPanel.js.map +1 -1
  520. package/dist/client/AssistantChat.d.ts +15 -0
  521. package/dist/client/AssistantChat.d.ts.map +1 -1
  522. package/dist/client/AssistantChat.js +115 -47
  523. package/dist/client/AssistantChat.js.map +1 -1
  524. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  525. package/dist/client/MultiTabAssistantChat.js +1 -1
  526. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  527. package/dist/client/RunStuckBanner.d.ts +14 -1
  528. package/dist/client/RunStuckBanner.d.ts.map +1 -1
  529. package/dist/client/RunStuckBanner.js +35 -7
  530. package/dist/client/RunStuckBanner.js.map +1 -1
  531. package/dist/client/agent-chat-adapter.d.ts +4 -1
  532. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  533. package/dist/client/agent-chat-adapter.js +97 -16
  534. package/dist/client/agent-chat-adapter.js.map +1 -1
  535. package/dist/client/automation.d.ts +14 -0
  536. package/dist/client/automation.d.ts.map +1 -0
  537. package/dist/client/automation.js +9 -0
  538. package/dist/client/automation.js.map +1 -0
  539. package/dist/client/chat/run-recovery.d.ts +4 -0
  540. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  541. package/dist/client/chat/run-recovery.js +12 -10
  542. package/dist/client/chat/run-recovery.js.map +1 -1
  543. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  544. package/dist/client/composer/TiptapComposer.js +8 -0
  545. package/dist/client/composer/TiptapComposer.js.map +1 -1
  546. package/dist/client/index.d.ts +2 -0
  547. package/dist/client/index.d.ts.map +1 -1
  548. package/dist/client/index.js +2 -0
  549. package/dist/client/index.js.map +1 -1
  550. package/dist/client/integrations/api.d.ts +115 -0
  551. package/dist/client/integrations/api.d.ts.map +1 -0
  552. package/dist/client/integrations/api.js +123 -0
  553. package/dist/client/integrations/api.js.map +1 -0
  554. package/dist/client/integrations/index.d.ts +1 -0
  555. package/dist/client/integrations/index.d.ts.map +1 -1
  556. package/dist/client/integrations/index.js +1 -0
  557. package/dist/client/integrations/index.js.map +1 -1
  558. package/dist/client/transcription/use-live-transcription.d.ts.map +1 -1
  559. package/dist/client/transcription/use-live-transcription.js +59 -5
  560. package/dist/client/transcription/use-live-transcription.js.map +1 -1
  561. package/dist/client/use-run-stuck-detection.d.ts +16 -1
  562. package/dist/client/use-run-stuck-detection.d.ts.map +1 -1
  563. package/dist/client/use-run-stuck-detection.js +23 -4
  564. package/dist/client/use-run-stuck-detection.js.map +1 -1
  565. package/dist/collab/awareness.d.ts +2 -2
  566. package/dist/collab/awareness.d.ts.map +1 -1
  567. package/dist/deploy/build.d.ts.map +1 -1
  568. package/dist/deploy/build.js +49 -4
  569. package/dist/deploy/build.js.map +1 -1
  570. package/dist/deploy/workspace-deploy.d.ts.map +1 -1
  571. package/dist/deploy/workspace-deploy.js +31 -2
  572. package/dist/deploy/workspace-deploy.js.map +1 -1
  573. package/dist/file-upload/types.d.ts +2 -0
  574. package/dist/file-upload/types.d.ts.map +1 -1
  575. package/dist/file-upload/types.js.map +1 -1
  576. package/dist/index.d.ts +2 -0
  577. package/dist/index.d.ts.map +1 -1
  578. package/dist/index.js +2 -0
  579. package/dist/index.js.map +1 -1
  580. package/dist/integrations/a2a-continuations-store.d.ts.map +1 -1
  581. package/dist/integrations/a2a-continuations-store.js +6 -4
  582. package/dist/integrations/a2a-continuations-store.js.map +1 -1
  583. package/dist/integrations/adapters/discord.d.ts +3 -0
  584. package/dist/integrations/adapters/discord.d.ts.map +1 -0
  585. package/dist/integrations/adapters/discord.js +261 -0
  586. package/dist/integrations/adapters/discord.js.map +1 -0
  587. package/dist/integrations/adapters/index.d.ts +4 -0
  588. package/dist/integrations/adapters/index.d.ts.map +1 -0
  589. package/dist/integrations/adapters/index.js +26 -0
  590. package/dist/integrations/adapters/index.js.map +1 -0
  591. package/dist/integrations/adapters/microsoft-teams.d.ts +5 -0
  592. package/dist/integrations/adapters/microsoft-teams.d.ts.map +1 -0
  593. package/dist/integrations/adapters/microsoft-teams.js +295 -0
  594. package/dist/integrations/adapters/microsoft-teams.js.map +1 -0
  595. package/dist/integrations/adapters/slack.d.ts +8 -2
  596. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  597. package/dist/integrations/adapters/slack.js +736 -27
  598. package/dist/integrations/adapters/slack.js.map +1 -1
  599. package/dist/integrations/adapters/telegram.d.ts +0 -2
  600. package/dist/integrations/adapters/telegram.d.ts.map +1 -1
  601. package/dist/integrations/adapters/telegram.js +49 -15
  602. package/dist/integrations/adapters/telegram.js.map +1 -1
  603. package/dist/integrations/adapters/whatsapp.d.ts +0 -2
  604. package/dist/integrations/adapters/whatsapp.d.ts.map +1 -1
  605. package/dist/integrations/adapters/whatsapp.js +40 -17
  606. package/dist/integrations/adapters/whatsapp.js.map +1 -1
  607. package/dist/integrations/catalog.d.ts +75 -0
  608. package/dist/integrations/catalog.d.ts.map +1 -0
  609. package/dist/integrations/catalog.js +451 -0
  610. package/dist/integrations/catalog.js.map +1 -0
  611. package/dist/integrations/controls-store.d.ts +44 -0
  612. package/dist/integrations/controls-store.d.ts.map +1 -0
  613. package/dist/integrations/controls-store.js +129 -0
  614. package/dist/integrations/controls-store.js.map +1 -0
  615. package/dist/integrations/index.d.ts +13 -1
  616. package/dist/integrations/index.d.ts.map +1 -1
  617. package/dist/integrations/index.js +9 -0
  618. package/dist/integrations/index.js.map +1 -1
  619. package/dist/integrations/installations-store.d.ts +112 -0
  620. package/dist/integrations/installations-store.d.ts.map +1 -0
  621. package/dist/integrations/installations-store.js +493 -0
  622. package/dist/integrations/installations-store.js.map +1 -0
  623. package/dist/integrations/integration-memory.d.ts +24 -0
  624. package/dist/integrations/integration-memory.d.ts.map +1 -0
  625. package/dist/integrations/integration-memory.js +136 -0
  626. package/dist/integrations/integration-memory.js.map +1 -0
  627. package/dist/integrations/pending-tasks-retry-job.d.ts.map +1 -1
  628. package/dist/integrations/pending-tasks-retry-job.js +6 -5
  629. package/dist/integrations/pending-tasks-retry-job.js.map +1 -1
  630. package/dist/integrations/pending-tasks-store.d.ts +17 -0
  631. package/dist/integrations/pending-tasks-store.d.ts.map +1 -1
  632. package/dist/integrations/pending-tasks-store.js +71 -5
  633. package/dist/integrations/pending-tasks-store.js.map +1 -1
  634. package/dist/integrations/plugin.d.ts.map +1 -1
  635. package/dist/integrations/plugin.js +520 -35
  636. package/dist/integrations/plugin.js.map +1 -1
  637. package/dist/integrations/scope-store.d.ts +65 -0
  638. package/dist/integrations/scope-store.d.ts.map +1 -0
  639. package/dist/integrations/scope-store.js +361 -0
  640. package/dist/integrations/scope-store.js.map +1 -0
  641. package/dist/integrations/slack-manifest.d.ts +66 -0
  642. package/dist/integrations/slack-manifest.d.ts.map +1 -0
  643. package/dist/integrations/slack-manifest.js +70 -0
  644. package/dist/integrations/slack-manifest.js.map +1 -0
  645. package/dist/integrations/slack-oauth.d.ts +99 -0
  646. package/dist/integrations/slack-oauth.d.ts.map +1 -0
  647. package/dist/integrations/slack-oauth.js +226 -0
  648. package/dist/integrations/slack-oauth.js.map +1 -0
  649. package/dist/integrations/types.d.ts +144 -0
  650. package/dist/integrations/types.d.ts.map +1 -1
  651. package/dist/integrations/types.js +16 -1
  652. package/dist/integrations/types.js.map +1 -1
  653. package/dist/integrations/usage-budget-store.d.ts +84 -0
  654. package/dist/integrations/usage-budget-store.d.ts.map +1 -0
  655. package/dist/integrations/usage-budget-store.js +650 -0
  656. package/dist/integrations/usage-budget-store.js.map +1 -0
  657. package/dist/integrations/webhook-handler.d.ts +4 -0
  658. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  659. package/dist/integrations/webhook-handler.js +415 -47
  660. package/dist/integrations/webhook-handler.js.map +1 -1
  661. package/dist/jobs/scheduler.d.ts +6 -0
  662. package/dist/jobs/scheduler.d.ts.map +1 -1
  663. package/dist/jobs/scheduler.js +83 -4
  664. package/dist/jobs/scheduler.js.map +1 -1
  665. package/dist/jobs/tools.d.ts.map +1 -1
  666. package/dist/jobs/tools.js +43 -11
  667. package/dist/jobs/tools.js.map +1 -1
  668. package/dist/provider-api/index.d.ts +4 -4
  669. package/dist/provider-api/index.d.ts.map +1 -1
  670. package/dist/provider-api/index.js +72 -1
  671. package/dist/provider-api/index.js.map +1 -1
  672. package/dist/resources/handlers.d.ts.map +1 -1
  673. package/dist/resources/handlers.js +57 -15
  674. package/dist/resources/handlers.js.map +1 -1
  675. package/dist/resources/script-helpers.d.ts.map +1 -1
  676. package/dist/resources/script-helpers.js +34 -8
  677. package/dist/resources/script-helpers.js.map +1 -1
  678. package/dist/resources/store.d.ts +10 -0
  679. package/dist/resources/store.d.ts.map +1 -1
  680. package/dist/resources/store.js +54 -47
  681. package/dist/resources/store.js.map +1 -1
  682. package/dist/scripts/call-agent.d.ts.map +1 -1
  683. package/dist/scripts/call-agent.js +106 -1
  684. package/dist/scripts/call-agent.js.map +1 -1
  685. package/dist/server/agent-chat-plugin.d.ts +15 -4
  686. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  687. package/dist/server/agent-chat-plugin.js +248 -113
  688. package/dist/server/agent-chat-plugin.js.map +1 -1
  689. package/dist/server/auth.d.ts.map +1 -1
  690. package/dist/server/auth.js +10 -14
  691. package/dist/server/auth.js.map +1 -1
  692. package/dist/server/builder-design-systems.d.ts +3 -1
  693. package/dist/server/builder-design-systems.d.ts.map +1 -1
  694. package/dist/server/builder-design-systems.js +9 -2
  695. package/dist/server/builder-design-systems.js.map +1 -1
  696. package/dist/server/edge.d.ts +1 -1
  697. package/dist/server/edge.d.ts.map +1 -1
  698. package/dist/server/edge.js +1 -1
  699. package/dist/server/edge.js.map +1 -1
  700. package/dist/server/index.d.ts +2 -1
  701. package/dist/server/index.d.ts.map +1 -1
  702. package/dist/server/index.js +2 -1
  703. package/dist/server/index.js.map +1 -1
  704. package/dist/server/request-context.d.ts +18 -0
  705. package/dist/server/request-context.d.ts.map +1 -1
  706. package/dist/server/request-context.js.map +1 -1
  707. package/dist/server/social-og-image.d.ts.map +1 -1
  708. package/dist/server/social-og-image.js +3 -2
  709. package/dist/server/social-og-image.js.map +1 -1
  710. package/dist/server/transcribe-voice.d.ts +1 -1
  711. package/dist/styles/agent-native.css +62 -44
  712. package/dist/templates/default/.agents/skills/capture-learnings/SKILL.md +22 -9
  713. package/dist/templates/default/AGENTS.md +7 -3
  714. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +1 -1
  715. package/dist/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +22 -9
  716. package/dist/templates/workspace-core/.agents/skills/extension-points/SKILL.md +6 -3
  717. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +25 -0
  718. package/dist/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +15 -0
  719. package/dist/templates/workspace-core/AGENTS.md +3 -2
  720. package/dist/usage/store.d.ts +7 -0
  721. package/dist/usage/store.d.ts.map +1 -1
  722. package/dist/usage/store.js +24 -3
  723. package/dist/usage/store.js.map +1 -1
  724. package/docs/content/automation-connectors.mdx +80 -0
  725. package/docs/content/extensions.mdx +8 -0
  726. package/docs/content/locales/ar-SA/extensions.mdx +8 -0
  727. package/docs/content/locales/ar-SA/messaging.mdx +84 -15
  728. package/docs/content/locales/ar-SA/template-clips.mdx +1 -0
  729. package/docs/content/locales/ar-SA/template-design.mdx +1 -0
  730. package/docs/content/locales/de-DE/extensions.mdx +10 -0
  731. package/docs/content/locales/de-DE/messaging.mdx +92 -15
  732. package/docs/content/locales/de-DE/template-clips.mdx +1 -0
  733. package/docs/content/locales/de-DE/template-design.mdx +1 -0
  734. package/docs/content/locales/es-ES/extensions.mdx +10 -0
  735. package/docs/content/locales/es-ES/messaging.mdx +91 -15
  736. package/docs/content/locales/es-ES/template-clips.mdx +1 -0
  737. package/docs/content/locales/es-ES/template-design.mdx +1 -0
  738. package/docs/content/locales/fr-FR/extensions.mdx +10 -0
  739. package/docs/content/locales/fr-FR/messaging.mdx +91 -15
  740. package/docs/content/locales/fr-FR/template-clips.mdx +1 -0
  741. package/docs/content/locales/fr-FR/template-design.mdx +1 -0
  742. package/docs/content/locales/hi-IN/extensions.mdx +8 -0
  743. package/docs/content/locales/hi-IN/messaging.mdx +81 -15
  744. package/docs/content/locales/hi-IN/template-clips.mdx +1 -0
  745. package/docs/content/locales/hi-IN/template-design.mdx +1 -0
  746. package/docs/content/locales/ja-JP/extensions.mdx +9 -0
  747. package/docs/content/locales/ja-JP/messaging.mdx +81 -15
  748. package/docs/content/locales/ja-JP/template-clips.mdx +1 -0
  749. package/docs/content/locales/ja-JP/template-design.mdx +1 -0
  750. package/docs/content/locales/ko-KR/extensions.mdx +8 -0
  751. package/docs/content/locales/ko-KR/messaging.mdx +80 -15
  752. package/docs/content/locales/ko-KR/template-clips.mdx +1 -0
  753. package/docs/content/locales/ko-KR/template-design.mdx +1 -0
  754. package/docs/content/locales/pt-BR/extensions.mdx +9 -0
  755. package/docs/content/locales/pt-BR/messaging.mdx +88 -15
  756. package/docs/content/locales/pt-BR/template-clips.mdx +1 -0
  757. package/docs/content/locales/pt-BR/template-design.mdx +1 -0
  758. package/docs/content/locales/zh-CN/extensions.mdx +6 -0
  759. package/docs/content/locales/zh-CN/messaging.mdx +78 -15
  760. package/docs/content/locales/zh-CN/template-clips.mdx +1 -0
  761. package/docs/content/locales/zh-CN/template-design.mdx +1 -0
  762. package/docs/content/locales/zh-TW/extensions.mdx +6 -0
  763. package/docs/content/locales/zh-TW/messaging.mdx +78 -15
  764. package/docs/content/locales/zh-TW/template-clips.mdx +1 -0
  765. package/docs/content/locales/zh-TW/template-design.mdx +1 -0
  766. package/docs/content/messaging.mdx +227 -45
  767. package/docs/content/template-clips.mdx +3 -0
  768. package/docs/content/template-design.mdx +4 -0
  769. package/package.json +5 -1
  770. package/src/templates/default/.agents/skills/capture-learnings/SKILL.md +22 -9
  771. package/src/templates/default/AGENTS.md +7 -3
  772. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +1 -1
  773. package/src/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +22 -9
  774. package/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +6 -3
  775. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +25 -0
  776. package/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +15 -0
  777. package/src/templates/workspace-core/AGENTS.md +3 -2
@@ -59,7 +59,7 @@ import {
59
59
  createProductionAgentHandler,
60
60
  actionsToEngineTools,
61
61
  getActiveRunForThreadAsync,
62
- abortRun,
62
+ abortRunDurably,
63
63
  subscribeToRun,
64
64
  type ActionEntry,
65
65
  } from "../agent/production-agent.js";
@@ -158,6 +158,8 @@ import {
158
158
  resourceGet,
159
159
  resourceGetByPath,
160
160
  ensurePersonalDefaults,
161
+ organizationIdFromResourceOwner,
162
+ sharedResourceOwner,
161
163
  SHARED_OWNER,
162
164
  WORKSPACE_OWNER,
163
165
  } from "../resources/store.js";
@@ -638,7 +640,9 @@ function getResourceSummaryFromContent(content: string): string | null {
638
640
 
639
641
  function resourceScopeForOwner(owner: string, currentOwner?: string): string {
640
642
  if (owner === WORKSPACE_OWNER) return "workspace";
641
- if (owner === SHARED_OWNER) return "shared";
643
+ if (owner === SHARED_OWNER || organizationIdFromResourceOwner(owner)) {
644
+ return "shared";
645
+ }
642
646
  if (currentOwner && owner === currentOwner) return "personal";
643
647
  return "resource";
644
648
  }
@@ -694,31 +698,37 @@ async function loadInstructionResourcesForPrompt(
694
698
 
695
699
  async function loadResourceSkillsPromptBlock(
696
700
  owner: string,
701
+ orgId?: string | null,
697
702
  ): Promise<string | null> {
698
703
  try {
704
+ const organizationOwner = sharedResourceOwner(orgId);
699
705
  const resources =
700
706
  owner === SHARED_OWNER
701
707
  ? [
702
708
  ...(await resourceList(SHARED_OWNER, "skills/")),
703
709
  ...(await resourceList(WORKSPACE_OWNER, "skills/")),
704
710
  ]
705
- : await resourceListAccessible(owner, "skills/");
711
+ : await resourceListAccessible(owner, "skills/", { orgId });
706
712
  const sorted = resources.sort((a, b) => {
707
713
  const ownerOrder =
708
714
  (a.owner === owner
709
715
  ? 0
710
- : a.owner === SHARED_OWNER
716
+ : a.owner === organizationOwner
711
717
  ? 1
712
- : a.owner === WORKSPACE_OWNER
718
+ : a.owner === SHARED_OWNER
713
719
  ? 2
714
- : 3) -
720
+ : a.owner === WORKSPACE_OWNER
721
+ ? 3
722
+ : 4) -
715
723
  (b.owner === owner
716
724
  ? 0
717
- : b.owner === SHARED_OWNER
725
+ : b.owner === organizationOwner
718
726
  ? 1
719
- : b.owner === WORKSPACE_OWNER
727
+ : b.owner === SHARED_OWNER
720
728
  ? 2
721
- : 3);
729
+ : b.owner === WORKSPACE_OWNER
730
+ ? 3
731
+ : 4);
722
732
  if (ownerOrder !== 0) return ownerOrder;
723
733
  return a.path.localeCompare(b.path);
724
734
  });
@@ -1765,7 +1775,7 @@ async function createResourceScriptEntries(): Promise<
1765
1775
  }
1766
1776
  const owner =
1767
1777
  scope === "shared"
1768
- ? store.SHARED_OWNER
1778
+ ? store.sharedResourceOwner(getRequestOrgId())
1769
1779
  : (getRequestRunContext()?.owner ??
1770
1780
  getRequestUserEmail() ??
1771
1781
  process.env.AGENT_USER_EMAIL);
@@ -2078,7 +2088,7 @@ function createBuilderBrowserTool(deps: {
2078
2088
  const extensionRequestGuidance =
2079
2089
  deps.extensionTools === false
2080
2090
  ? "Do NOT call this for requests to create or edit user-authored extensions/widgets/dashboards/calculators/mini-apps; extension tools are disabled for this app, and Builder is only for source-code changes to the host app. "
2081
- : "Do NOT call this for creating or editing extensions/widgets/dashboards/calculators/mini-apps; those are sandboxed extension data and must use create-extension/update-extension instead. ";
2091
+ : "Do NOT call this for a self-contained extension/widget/dashboard/calculator/mini-app or an extension that fits an existing named slot; those use create-extension/update-extension instead. If the requested result requires changing the host UI or placing UI where no named slot exists, it IS a source-code change: call this through the normal flow even when the user describes it as an extension. Never stop at saying an extension cannot do it. ";
2082
2092
  const setBuiltinForCurrentUser = async (
2083
2093
  id: BuiltinMcpCapabilityId,
2084
2094
  enabled: boolean,
@@ -2898,6 +2908,35 @@ export interface AgentChatPluginOptions {
2898
2908
  toolLimits?: { timeoutMs?: number; maxResultChars?: number };
2899
2909
  }
2900
2910
 
2911
+ type A2AAgentLoopRunner = typeof runAgentLoopDirectWithSoftTimeout;
2912
+
2913
+ /**
2914
+ * Run an A2A-delegated agent turn with the same final-response guard used by
2915
+ * the app's interactive chat surface.
2916
+ *
2917
+ * Keeping this in one helper prevents delegated calls from silently bypassing
2918
+ * template guarantees such as Analytics' requirement to query real data
2919
+ * before presenting metrics or exhaustive provider conclusions.
2920
+ */
2921
+ export function runA2AAgentLoop(
2922
+ runOptions: Parameters<A2AAgentLoopRunner>[0],
2923
+ pluginOptions: Pick<
2924
+ AgentChatPluginOptions,
2925
+ "finalResponseGuard" | "runSoftTimeoutMs"
2926
+ >,
2927
+ timeoutOptions: Parameters<A2AAgentLoopRunner>[2],
2928
+ runner: A2AAgentLoopRunner = runAgentLoopDirectWithSoftTimeout,
2929
+ ) {
2930
+ return runner(
2931
+ {
2932
+ ...runOptions,
2933
+ finalResponseGuard: pluginOptions.finalResponseGuard,
2934
+ },
2935
+ pluginOptions.runSoftTimeoutMs,
2936
+ timeoutOptions,
2937
+ );
2938
+ }
2939
+
2901
2940
  /**
2902
2941
  * Verbose framework sections returned by the `get-framework-context` tool.
2903
2942
  * Keyed by topic so the agent can request specific sections.
@@ -3112,7 +3151,7 @@ function buildFrameworkPrompts(
3112
3151
  ? "`render-inline-extension`, `create-extension`, `update-extension`, `connect-builder`, or any action that creates, updates, deletes, sends, publishes, or persists data"
3113
3152
  : "`connect-builder`, or any action that creates, updates, deletes, sends, publishes, or persists data";
3114
3153
  const extensionConnectBuilderGuard = extensionToolsEnabled
3115
- ? "If the request matches the Extensions section above, use `render-inline-extension`, `create-extension`, `show-extension-inline`, or `update-extension` instead do NOT route it to `connect-builder`."
3154
+ ? "If the complete request can be satisfied by a self-contained extension or an existing named slot, use `render-inline-extension`, `create-extension`, `show-extension-inline`, or `update-extension` instead. If the exact placement or behavior requires changing the host UI or no suitable slot exists, continue with the normal `connect-builder` source-change flow even if the user called it an extension; never stop at saying extensions cannot do it."
3116
3155
  : "Because extension tools are disabled, do NOT invent an extension workflow. Only use `connect-builder` when the request genuinely requires changing the host app's source code.";
3117
3156
  const extensionInstructionsFull = extensionToolsEnabled
3118
3157
  ? `### Generative UI and Extensions (Mini-Apps)
@@ -3141,7 +3180,7 @@ For existing extensions, use \`get-extension\` or \`update-extension\` directly
3141
3180
 
3142
3181
  ### Extensions vs. Code Changes — Pick the Right Path
3143
3182
 
3144
- Route by what the request changes, not how it is phrased. Extensions render in their own sandboxed iframe and CANNOT change the host app's nav, restyle existing components, or replace built-in views.
3183
+ Route by the exact outcome, not by whether the user calls it an extension. Extensions render in their own sandboxed iframe, either on their own page or inside an existing named slot. They CANNOT change the host app's nav, restyle or inject elements into existing native components, replace built-in views, or render at an arbitrary location that has no slot.
3145
3184
 
3146
3185
  <routing>
3147
3186
  | The request is for… | Path |
@@ -3151,10 +3190,13 @@ Route by what the request changes, not how it is phrased. Extensions render in t
3151
3190
  | Loading a saved extension inside chat | \`show-extension-inline\` |
3152
3191
  | Editing an existing extension (fix, restyle, rename, add behavior) | \`update-extension\` |
3153
3192
  | The host app's own chrome (nav bar, sidebar, layout, routes, shipped components, existing styles, business logic) | \`connect-builder\` — a real source-code change |
3193
+ | UI inside or beside a native component where no named slot exists | \`connect-builder\` — add the native UI or a suitable slot in source |
3154
3194
  | Ambiguous, satisfiable either way (e.g. "give me an unread view") | \`render-inline-extension\` for chat-only, \`create-extension\` for reusable |
3155
3195
  </routing>
3156
3196
 
3157
- Worked examples: "a widget showing unread emails grouped by sender", "a tracker for my newsletter subscriptions", "a custom kanban board with drag-and-drop rules the app does not have" \`create-extension\`. "Add an Unread tab to the left navigation", "make the subject lines wrap", "change the inbox grouping logic", "add a field to the compose form" → \`connect-builder\`.`
3197
+ If an extension could only approximate the request in a different location, do not silently downgrade the requirement and do not end with "extensions cannot do that." Briefly explain the boundary, then follow the normal source-code handoff so the app can still be customized fully.
3198
+
3199
+ Worked examples: "a widget showing unread emails grouped by sender", "a tracker for my newsletter subscriptions", "a custom kanban board with drag-and-drop rules the app does not have" → \`create-extension\`. "Add an Unread tab to the left navigation", "show local time beside every native Calendar attendee row", "make the subject lines wrap", "change the inbox grouping logic", "add a field to the compose form" → \`connect-builder\`.`
3158
3200
  : `### Extensions Disabled
3159
3201
 
3160
3202
  Extension creation and management tools are disabled for this app. Do not claim you can create, edit, hide, or delete Agent-Native extensions unless the template exposes its own typed action for that workflow. For requests that would otherwise be handled as an extension/widget/dashboard/calculator mini-app, explain that this app has disabled extension tools and use the app's available actions instead.`;
@@ -3175,7 +3217,7 @@ For existing extensions, use \`get-extension\` or \`update-extension\` directly
3175
3217
 
3176
3218
  ### Extensions vs. Code Changes — Pick the Right Path
3177
3219
 
3178
- If the user wants a **one-off interactive answer in chat**, use \`render-inline-extension\`. If they want a **new reusable self-contained surface** (custom widget, dashboard, list, viewer, calculator), use \`create-extension\` — extensions ship instantly without a PR. Use \`connect-builder\` only when the request **modifies the host app's existing chrome** (nav bar, sidebar, current components, layout, styles, routes). Extensions cannot change the host nav or restyle existing components.`
3220
+ If the user wants a **one-off interactive answer in chat**, use \`render-inline-extension\`. If they want a **new reusable self-contained surface** (custom widget, dashboard, list, viewer, calculator), use \`create-extension\` — extensions ship instantly without a PR. Extensions can render only on their own page or in an existing named slot; they cannot inject UI into arbitrary native components. If the exact request changes host chrome, native components, layout, styles, routes, business logic, or needs placement where no slot exists, treat it as a source-code change and use the normal \`connect-builder\` flow even if the user called it an extension. Never stop at "extensions cannot do that" or silently offer a different placement; explain the boundary briefly and continue the code-change handoff.`
3179
3221
  : `### Extensions Disabled
3180
3222
 
3181
3223
  Extension creation and management tools are disabled for this app. Do not claim you can create, edit, hide, or delete Agent-Native extensions unless the template exposes its own typed action for that workflow.`;
@@ -3309,9 +3351,9 @@ export const _agentChatPromptSectionsForTests = (() => {
3309
3351
  * 2. `<template>` — AGENTS.md + skills index from the Vite plugin bundle.
3310
3352
  * 3. `<workspace>` — SQL workspace AGENTS.md and instructions/*.md.
3311
3353
  * Runtime global defaults managed from Dispatch and inherited by apps.
3312
- * 4. `<shared>` — SQL shared AGENTS.md and instructions/*.md. App/team/org
3313
- * guidance that can override or narrow workspace defaults.
3314
- * 5. `<shared>` LEARNINGS.md from the SQL shared scope. Team-level notes.
3354
+ * 4. `<app-default>` — legacy app-wide SQL defaults.
3355
+ * 5. `<shared>` organization AGENTS.md, instructions, and LEARNINGS.md.
3356
+ * These are isolated by active org and override app/workspace defaults.
3315
3357
  * 6. `<personal>` — memory/MEMORY.md from the SQL personal scope. The
3316
3358
  * current user's structured memory index.
3317
3359
  *
@@ -3323,6 +3365,7 @@ export async function loadResourcesForPrompt(
3323
3365
  owner: string,
3324
3366
  compact = false,
3325
3367
  selfAppId?: string,
3368
+ orgId: string | null = getRequestOrgId() ?? null,
3326
3369
  ): Promise<string> {
3327
3370
  await ensurePersonalDefaults(owner);
3328
3371
 
@@ -3402,23 +3445,46 @@ export async function loadResourcesForPrompt(
3402
3445
  )),
3403
3446
  );
3404
3447
 
3405
- // 4. Runtime shared/app/org resources from SQL. These come after workspace
3406
- // defaults so app/team-specific guidance can override or narrow them.
3407
- const sharedAgents = await loadAgentsResourceForPrompt(
3448
+ const organizationOwner = sharedResourceOwner(orgId);
3449
+
3450
+ // 4. Legacy app-wide defaults. Existing deployments keep their seeded
3451
+ // shared guidance as an inherited fallback; organization writes never
3452
+ // mutate this owner.
3453
+ const appDefaultAgents = await loadAgentsResourceForPrompt(
3408
3454
  SHARED_OWNER,
3409
- "shared",
3455
+ organizationOwner === SHARED_OWNER ? "shared" : "app-default",
3410
3456
  promptResourceMaxChars,
3411
3457
  );
3412
- if (sharedAgents) sections.push(sharedAgents);
3458
+ if (appDefaultAgents) sections.push(appDefaultAgents);
3413
3459
  sections.push(
3414
3460
  ...(await loadInstructionResourcesForPrompt(
3415
3461
  SHARED_OWNER,
3416
- "shared-instruction",
3462
+ organizationOwner === SHARED_OWNER
3463
+ ? "shared-instruction"
3464
+ : "app-default-instruction",
3417
3465
  promptResourceMaxChars,
3418
3466
  )),
3419
3467
  );
3420
3468
 
3421
- // 5. Personal SQL resources. These come last in the instruction stack so a
3469
+ // 5. Active organization resources. These are the durable team rules and
3470
+ // learnings that Slack/integration runs share with interactive app chat.
3471
+ if (organizationOwner !== SHARED_OWNER) {
3472
+ const organizationAgents = await loadAgentsResourceForPrompt(
3473
+ organizationOwner,
3474
+ "shared",
3475
+ promptResourceMaxChars,
3476
+ );
3477
+ if (organizationAgents) sections.push(organizationAgents);
3478
+ sections.push(
3479
+ ...(await loadInstructionResourcesForPrompt(
3480
+ organizationOwner,
3481
+ "shared-instruction",
3482
+ promptResourceMaxChars,
3483
+ )),
3484
+ );
3485
+ }
3486
+
3487
+ // 6. Personal SQL resources. These come last in the instruction stack so a
3422
3488
  // user can narrow or override organization/app and workspace defaults.
3423
3489
  if (owner !== SHARED_OWNER && owner !== WORKSPACE_OWNER) {
3424
3490
  const personalAgents = await loadAgentsResourceForPrompt(
@@ -3436,27 +3502,43 @@ export async function loadResourcesForPrompt(
3436
3502
  );
3437
3503
  }
3438
3504
 
3439
- const resourceSkillsBlock = await loadResourceSkillsPromptBlock(owner);
3505
+ const resourceSkillsBlock = await loadResourceSkillsPromptBlock(owner, orgId);
3440
3506
  if (resourceSkillsBlock) sections.push(resourceSkillsBlock);
3441
3507
 
3508
+ let sharedLearnings: Awaited<ReturnType<typeof resourceGetByPath>> = null;
3509
+ try {
3510
+ sharedLearnings =
3511
+ (organizationOwner !== SHARED_OWNER
3512
+ ? await resourceGetByPath(organizationOwner, "LEARNINGS.md")
3513
+ : null) ?? (await resourceGetByPath(SHARED_OWNER, "LEARNINGS.md"));
3514
+ } catch {}
3515
+
3442
3516
  if (compact) {
3443
- // In compact mode, skip learnings and memory in the prompt.
3444
- // The agent can access them via the resources tool when needed.
3445
- // Add a brief pointer so the agent knows they exist.
3517
+ // Integration/Slack turns use compact context, but organization learnings
3518
+ // are operational routing input, not optional background. Preload the
3519
+ // bounded shared file so canonical destinations/fields are available on
3520
+ // the first turn; keep personal memory on-demand to preserve the compact
3521
+ // budget.
3522
+ if (sharedLearnings?.content?.trim()) {
3523
+ const block = promptResourceBlock({
3524
+ name: "LEARNINGS.md",
3525
+ scope: "shared",
3526
+ path: "LEARNINGS.md",
3527
+ content: sharedLearnings.content,
3528
+ maxChars: COMPACT_PROMPT_RESOURCE_MAX_CHARS,
3529
+ });
3530
+ if (block) sections.push(block);
3531
+ }
3446
3532
  sections.push(
3447
- `<context-note>Shared learnings (LEARNINGS.md) and your personal memory (memory/MEMORY.md) are available via the \`resources\` tool with \`action: "read"\`. Check them when making decisions that might benefit from prior context.</context-note>`,
3533
+ `<context-note>Organization learnings above and your personal memory (memory/MEMORY.md) are available via the \`resources\` tool. Save durable team facts and routing conventions to shared LEARNINGS.md; keep personal preferences in save-memory.</context-note>`,
3448
3534
  );
3449
3535
  } else {
3450
3536
  // LEARNINGS.md from SQL (template-level instructions are in AGENTS.md above).
3451
- // 2. Shared SQL scope
3452
- try {
3453
- const shared = await resourceGetByPath(SHARED_OWNER, "LEARNINGS.md");
3454
- if (shared?.content?.trim()) {
3455
- sections.push(
3456
- `<resource name="LEARNINGS.md" scope="shared">\n${shared.content.trim()}\n</resource>`,
3457
- );
3458
- }
3459
- } catch {}
3537
+ if (sharedLearnings?.content?.trim()) {
3538
+ sections.push(
3539
+ `<resource name="LEARNINGS.md" scope="shared">\n${sharedLearnings.content.trim()}\n</resource>`,
3540
+ );
3541
+ }
3460
3542
 
3461
3543
  // 3. Personal memory index (skip if owner is the shared sentinel)
3462
3544
  if (owner !== SHARED_OWNER) {
@@ -3477,11 +3559,18 @@ export async function loadResourcesForPrompt(
3477
3559
  );
3478
3560
  if (workspaceResourceIndex) sections.push(workspaceResourceIndex);
3479
3561
 
3480
- const sharedResourceIndex = await loadResourceIndexForPrompt(
3562
+ const appDefaultResourceIndex = await loadResourceIndexForPrompt(
3481
3563
  SHARED_OWNER,
3482
3564
  "shared",
3483
3565
  );
3484
- if (sharedResourceIndex) sections.push(sharedResourceIndex);
3566
+ if (appDefaultResourceIndex) sections.push(appDefaultResourceIndex);
3567
+ if (organizationOwner !== SHARED_OWNER) {
3568
+ const organizationResourceIndex = await loadResourceIndexForPrompt(
3569
+ organizationOwner,
3570
+ "shared",
3571
+ );
3572
+ if (organizationResourceIndex) sections.push(organizationResourceIndex);
3573
+ }
3485
3574
 
3486
3575
  try {
3487
3576
  const agents = (await discoverAgents(selfAppId)).slice(0, 30);
@@ -4754,6 +4843,7 @@ export function createAgentChatPlugin(
4754
4843
  skills: buildPublicAgentA2ASkills(allScripts),
4755
4844
  publicSkillsOnly: true,
4756
4845
  streaming: true,
4846
+ durableBackgroundRuns: options?.durableBackgroundRuns,
4757
4847
  handler: async function* (message, context) {
4758
4848
  // Resolve the caller's identity for user-scoped data access.
4759
4849
  // Priority: A2A-JWT verified email (set by the A2A handler in
@@ -5008,7 +5098,7 @@ export function createAgentChatPlugin(
5008
5098
  `[A2A] Starting agent loop: ${a2aTools.length} tools, prompt ${systemPrompt.length} chars`,
5009
5099
  );
5010
5100
 
5011
- await runAgentLoopDirectWithSoftTimeout(
5101
+ await runA2AAgentLoop(
5012
5102
  {
5013
5103
  engine: a2aEngine,
5014
5104
  model,
@@ -5058,7 +5148,10 @@ export function createAgentChatPlugin(
5058
5148
  },
5059
5149
  signal: controller.signal,
5060
5150
  },
5061
- options?.runSoftTimeoutMs,
5151
+ {
5152
+ finalResponseGuard: options?.finalResponseGuard,
5153
+ runSoftTimeoutMs: options?.runSoftTimeoutMs,
5154
+ },
5062
5155
  {
5063
5156
  backgroundFunction:
5064
5157
  options?.durableBackgroundRuns === true &&
@@ -7453,7 +7546,10 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
7453
7546
  } catch {
7454
7547
  // Empty/invalid body — keep the default user abort reason.
7455
7548
  }
7456
- abortRun(runId, reason); // Aborts in-memory + marks aborted in SQL
7549
+ // Recovery starts as soon as this response resolves, so wait for
7550
+ // the cross-isolate abort + terminal event to be durable. Returning
7551
+ // early lets Retry collide with the still-running row.
7552
+ await abortRunDurably(runId, reason);
7457
7553
  return { ok: true };
7458
7554
  }
7459
7555
 
@@ -7599,6 +7695,26 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
7599
7695
  // Server clock so the client computes "stuck" elapsed time
7600
7696
  // server-relative, immune to client clock skew.
7601
7697
  serverNow: Date.now(),
7698
+ // True exactly when this run is a `chainServerDrivenContinuation`
7699
+ // deferral still inside `UNCLAIMED_BACKGROUND_RUN_REDISPATCH_BOUND_MS`
7700
+ // — silently recovering server-side via the unclaimed-background-run
7701
+ // sweep(s), never a dead run. See `getActiveRunForThreadAsync`'s doc
7702
+ // comment (run-manager.ts) and the THREE-SITE INVARIANT comments in
7703
+ // agent-chat-plugin.ts / production-agent.ts / agent-chat-adapter.ts.
7704
+ awaitingRedispatch: run.awaitingRedispatch === true,
7705
+ // True exactly when this run holds an open tool call or A2A
7706
+ // `agent_call` delegation (`in_flight_since` set — the same
7707
+ // marker `reapIfStale` reads to grant its bounded stale-reap
7708
+ // grace, see run-store.ts). This is the server-authoritative
7709
+ // signal for "would aborting this run right now destroy live
7710
+ // work" — RunStuckBanner's Retry gating should prefer this
7711
+ // field over its client-side proxy (unresolved `tool-call`
7712
+ // content parts in the local message list), which can go stale
7713
+ // after a reconnect or reader-mode replay. NOTE: this response
7714
+ // object is explicitly field-picked, not spread — a field added
7715
+ // to `getActiveRunForThreadAsync`'s return type does NOT reach
7716
+ // the wire on its own; it must be listed here too.
7717
+ hasInFlightWork: run.hasInFlightWork === true,
7602
7718
  };
7603
7719
  }
7604
7720
 
@@ -8565,30 +8681,144 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
8565
8681
  // turn hangs silently. `chainServerDrivenContinuation` (production-agent.ts)
8566
8682
  // leaves exactly such a row behind — status='running', dispatch_mode=
8567
8683
  // 'background', `dispatch_payload` intact — when it exhausts its own
8568
- // dispatch retry budget, instead of erroring it immediately. This sweep
8569
- // gives that row a real chance to RECOVER: within
8570
- // `UNCLAIMED_BACKGROUND_RUN_REDISPATCH_BOUND_MS` of its original
8571
- // `started_at` it redispatches the handoff (same `_process-run`
8572
- // processor, same persisted payload); past that bound it falls back to
8573
- // the existing loud reap (`background_worker_never_started`) so a
8574
- // genuinely dead handoff still fails loud, never silently. A
8575
- // redispatch is always safe to attempt — even a duplicate or
8576
- // late-arriving one — because the worker's `claimBackgroundRun` atomic
8577
- // CAS (status='running' AND dispatch_mode='background' -> 'background-
8578
- // processing') is the sole gate on actual execution; a row that was
8579
- // already claimed or already reaped by a concurrent path just loses the
8580
- // CAS and no-ops. Cheap: one indexed-ish query per 2-min window.
8684
+ // dispatch retry budget, instead of erroring it immediately. Two timers
8685
+ // cooperate to recover it, both reading `listUnclaimedBackgroundRunRows`
8686
+ // fresh each tick and gated by `shouldRedispatchUnclaimedBackgroundRun`
8687
+ // (so they always agree on which rows are still eligible):
8688
+ // - the FAST sweep (`UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS`, 20s)
8689
+ // below ONLY attempts redispatch never reaps — so it puts the
8690
+ // first recovery attempt well inside the client's
8691
+ // `BACKGROUND_FOLLOW_IDLE_TIMEOUT_MS` (see the derived budget on
8692
+ // `UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS` in run-store.ts).
8693
+ // - the SLOW sweep (2 minutes, immediately below the fast one) is the
8694
+ // one that falls back to the loud reap once
8695
+ // `UNCLAIMED_BACKGROUND_RUN_REDISPATCH_BOUND_MS` is exceeded; it
8696
+ // also still attempts redispatch itself so a fast-sweep outage
8697
+ // (e.g. a restart between ticks) is not the only path to recovery.
8698
+ // A redispatch is always safe to attempt — even a duplicate, concurrent,
8699
+ // or late-arriving one, including the fast and slow sweeps racing each
8700
+ // other on the SAME row — because the worker's `claimBackgroundRun`
8701
+ // atomic CAS (status='running' AND dispatch_mode='background' ->
8702
+ // 'background-processing') is the sole gate on actual execution; a row
8703
+ // that was already claimed or already reaped by a concurrent path just
8704
+ // loses the CAS and no-ops. Cheap: one indexed-ish query per tick.
8581
8705
  //
8582
8706
  // THREE-SITE INVARIANT (keep in lockstep): this sweep only ever sees the
8583
8707
  // deferred successor because the ~1s client poll in
8584
8708
  // `getActiveRunForThreadAsync` (run-manager.ts) skips its own
8585
8709
  // `reapUnclaimedBackgroundRun` while the row is within the redispatch
8586
- // bound (`shouldRedispatchUnclaimedBackgroundRun`). If a future change
8587
- // makes that client poll reap deferred successors at the 25s grace
8588
- // again, this sweep will almost never win the race for connected clients.
8589
- // Do not edit one site without the others (producer:
8590
- // chainServerDrivenContinuation in production-agent.ts; guard:
8591
- // run-manager.ts; recovery actor: here).
8710
+ // bound (`shouldRedispatchUnclaimedBackgroundRun`). That same client
8711
+ // poll also surfaces `awaitingRedispatch: true` on `/runs/active` for
8712
+ // exactly this state, which `agent-chat-adapter.ts`'s follow loop uses
8713
+ // to stop counting the quiet gap against its own idle timeout. If a
8714
+ // future change makes the client poll reap deferred successors at the
8715
+ // 25s grace again, or stops surfacing `awaitingRedispatch`, both sweeps
8716
+ // here will almost never win the race for connected clients. Do not
8717
+ // edit one site without the others (producer: chainServerDrivenContinuation
8718
+ // in production-agent.ts; guard + wire signal: run-manager.ts; recovery
8719
+ // actors: here).
8720
+ const attemptUnclaimedBackgroundRunRedispatch = async (row: {
8721
+ id: string;
8722
+ startedAt: number;
8723
+ }): Promise<void> => {
8724
+ const { updateRunHeartbeat } = await import("../agent/run-store.js");
8725
+ const { resolveAgentChatProcessRunDispatchPath } =
8726
+ await import("../agent/durable-background.js");
8727
+ const { fireInternalDispatch } = await import("./self-dispatch.js");
8728
+ // Bump liveness BEFORE attempting the redispatch so the row doesn't
8729
+ // look freshly-stale again the instant this tick returns —
8730
+ // best-effort, the CAS is what actually matters for correctness, not
8731
+ // this timing.
8732
+ await updateRunHeartbeat(row.id).catch(() => {});
8733
+ try {
8734
+ // DELIBERATE: this marker omits `continuationCount`.
8735
+ // `chainServerDrivenContinuation` (production-agent.ts) reads
8736
+ // `backgroundRunMarker.continuationCount` to compute
8737
+ // `backgroundContinuationCount`, defaulting to 0 when absent — so a
8738
+ // chunk recovered here always starts a fresh nested-dispatch
8739
+ // segment at depth 0, regardless of how deep the chain was before
8740
+ // this sweep picked it up. This is what makes the sweep a genuine
8741
+ // CHAIN BREAK, not just a retry: this redispatch fires from an
8742
+ // unrelated, timer-driven invocation rather than from inside the
8743
+ // prior chain's own live execution, so starting its nested-depth
8744
+ // count over at 0 here is correct — see
8745
+ // `MAX_NESTED_SELF_DISPATCH_DEPTH` in production-agent.ts for why
8746
+ // nested depth is bounded and how this reset keeps a long turn
8747
+ // progressing past Netlify's undocumented self-invocation
8748
+ // loop-protection limit instead of dying at it. Do not "fix" this
8749
+ // by adding `continuationCount` back without re-reading that
8750
+ // constant's doc comment.
8751
+ await fireInternalDispatch({
8752
+ path: resolveAgentChatProcessRunDispatchPath(),
8753
+ taskId: row.id,
8754
+ body: {
8755
+ internalContinuation: true,
8756
+ [AGENT_CHAT_BACKGROUND_RUN_FIELD]: {
8757
+ runId: row.id,
8758
+ payloadRef: true,
8759
+ },
8760
+ },
8761
+ awaitResponse: true,
8762
+ responseTimeoutMs: 15_000,
8763
+ });
8764
+ console.error(
8765
+ "[agent-chat] redispatched unclaimed background run (handoff recovery):",
8766
+ row.id,
8767
+ );
8768
+ } catch (redispatchErr) {
8769
+ console.error(
8770
+ "[agent-chat] unclaimed background run redispatch attempt failed (retrying until the redispatch bound, then reaping):",
8771
+ row.id,
8772
+ redispatchErr instanceof Error
8773
+ ? redispatchErr.message
8774
+ : redispatchErr,
8775
+ );
8776
+ }
8777
+ };
8778
+
8779
+ // FAST sweep — redispatch-only, tight cadence. See the invariant
8780
+ // comment above for why this exists and the timing budget in
8781
+ // run-store.ts's `UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS` doc comment.
8782
+ (() => {
8783
+ setTimeout(() => {
8784
+ (async () => {
8785
+ const { UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS } =
8786
+ await import("../agent/run-store.js");
8787
+ setInterval(() => {
8788
+ (async () => {
8789
+ const {
8790
+ listUnclaimedBackgroundRunRows,
8791
+ shouldRedispatchUnclaimedBackgroundRun,
8792
+ } = await import("../agent/run-store.js");
8793
+ let rows: { id: string; startedAt: number }[];
8794
+ try {
8795
+ rows = await listUnclaimedBackgroundRunRows();
8796
+ } catch {
8797
+ return; // Table may not exist yet on first boot
8798
+ }
8799
+ for (const row of rows) {
8800
+ if (!shouldRedispatchUnclaimedBackgroundRun(row)) continue;
8801
+ await attemptUnclaimedBackgroundRunRedispatch(row).catch(
8802
+ () => {},
8803
+ );
8804
+ }
8805
+ })().catch(() => {
8806
+ // best-effort — never break the server
8807
+ });
8808
+ }, UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS);
8809
+ })().catch(() => {
8810
+ // best-effort — if run-store fails to load, the slow sweep below
8811
+ // still provides eventual (loud) recovery.
8812
+ });
8813
+ }, 10_000); // Start 10s after init — before the slow sweep's first tick.
8814
+ })();
8815
+
8816
+ // SLOW sweep — redispatch AND the loud-failure reap fallback past the
8817
+ // redispatch bound. Kept on its original 2-minute cadence: it is not
8818
+ // the latency-critical path anymore (the fast sweep above is), it is
8819
+ // the correctness backstop that guarantees a genuinely lost handoff
8820
+ // still fails loud, and it survives the fast sweep having missed a row
8821
+ // entirely (e.g. a restart landed between fast-sweep ticks).
8592
8822
  (() => {
8593
8823
  let lastSweep = 0;
8594
8824
  const SWEEP_INTERVAL_MS = 2 * 60 * 1000;
@@ -8603,13 +8833,8 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
8603
8833
  const {
8604
8834
  listUnclaimedBackgroundRunRows,
8605
8835
  reapUnclaimedBackgroundRun,
8606
- updateRunHeartbeat,
8607
8836
  shouldRedispatchUnclaimedBackgroundRun,
8608
8837
  } = await import("../agent/run-store.js");
8609
- const { resolveAgentChatProcessRunDispatchPath } =
8610
- await import("../agent/durable-background.js");
8611
- const { fireInternalDispatch } =
8612
- await import("./self-dispatch.js");
8613
8838
  let rows: { id: string; startedAt: number }[];
8614
8839
  try {
8615
8840
  rows = await listUnclaimedBackgroundRunRows();
@@ -8619,57 +8844,7 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
8619
8844
  for (const row of rows) {
8620
8845
  try {
8621
8846
  if (shouldRedispatchUnclaimedBackgroundRun(row)) {
8622
- // Bump liveness BEFORE attempting the redispatch so the
8623
- // row doesn't look freshly-stale again the instant this
8624
- // tick returns — best-effort, the CAS is what actually
8625
- // matters for correctness, not this timing.
8626
- await updateRunHeartbeat(row.id).catch(() => {});
8627
- try {
8628
- // DELIBERATE: this marker omits `continuationCount`.
8629
- // `chainServerDrivenContinuation` (production-agent.ts)
8630
- // reads `backgroundRunMarker.continuationCount` to
8631
- // compute `backgroundContinuationCount`, defaulting to 0
8632
- // when absent — so a chunk recovered here always starts
8633
- // a fresh nested-dispatch segment at depth 0, regardless
8634
- // of how deep the chain was before this sweep picked it
8635
- // up. This is what makes the sweep a genuine CHAIN
8636
- // BREAK, not just a retry: this redispatch fires from an
8637
- // unrelated, timer-driven invocation rather than from
8638
- // inside the prior chain's own live execution, so
8639
- // starting its nested-depth count over at 0 here is
8640
- // correct — see `MAX_NESTED_SELF_DISPATCH_DEPTH` in
8641
- // production-agent.ts for why nested depth is bounded
8642
- // and how this reset keeps a long turn progressing past
8643
- // Netlify's undocumented self-invocation loop-protection
8644
- // limit instead of dying at it. Do not "fix" this by
8645
- // adding `continuationCount` back without re-reading
8646
- // that constant's doc comment.
8647
- await fireInternalDispatch({
8648
- path: resolveAgentChatProcessRunDispatchPath(),
8649
- taskId: row.id,
8650
- body: {
8651
- internalContinuation: true,
8652
- [AGENT_CHAT_BACKGROUND_RUN_FIELD]: {
8653
- runId: row.id,
8654
- payloadRef: true,
8655
- },
8656
- },
8657
- awaitResponse: true,
8658
- responseTimeoutMs: 15_000,
8659
- });
8660
- console.error(
8661
- "[agent-chat] redispatched unclaimed background run (handoff recovery):",
8662
- row.id,
8663
- );
8664
- } catch (redispatchErr) {
8665
- console.error(
8666
- "[agent-chat] unclaimed background run redispatch attempt failed (retrying until the redispatch bound, then reaping):",
8667
- row.id,
8668
- redispatchErr instanceof Error
8669
- ? redispatchErr.message
8670
- : redispatchErr,
8671
- );
8672
- }
8847
+ await attemptUnclaimedBackgroundRunRedispatch(row);
8673
8848
  continue;
8674
8849
  }
8675
8850
  // Redispatch bound exceeded — this handoff is not