@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
@@ -9,7 +9,7 @@ import { canUpdateAgentAppModelDefaultSettings, normalizeAgentAppModelDefaultApp
9
9
  import { DEFAULT_ANTHROPIC_MODEL } from "../agent/default-model.js";
10
10
  import { AGENT_CHAT_BACKGROUND_RUN_FIELD, AGENT_CHAT_PROCESS_RUN_PATH, backgroundRunMarkerExpectsBackgroundRuntime, isInBackgroundFunctionRuntime, prepareProcessRunRequest, } from "../agent/durable-background.js";
11
11
  import { resolveEngine, createAnthropicEngine, getStoredModelForEngine, normalizeModelForEngine, getAgentEngineEntry, isAgentEnginePackageInstalled, isStoredEngineUsableForRequest, listAgentEngines, registerBuiltinEngines, } from "../agent/engine/index.js";
12
- import { createProductionAgentHandler, actionsToEngineTools, getActiveRunForThreadAsync, abortRun, subscribeToRun, } from "../agent/production-agent.js";
12
+ import { createProductionAgentHandler, actionsToEngineTools, getActiveRunForThreadAsync, abortRunDurably, subscribeToRun, } from "../agent/production-agent.js";
13
13
  import { runAgentLoopDirectWithSoftTimeout } from "../agent/run-loop-with-resume.js";
14
14
  import { callerHasRunAccess, callerHasThreadAccess, } from "../agent/run-ownership.js";
15
15
  import { CLAIMED_BACKGROUND_WORKER_FAILED_ERROR_EVENT, ensureTerminalRunEvent, readBackgroundRunClaim, recordRunDiagnostic, RUN_DIAG_STAGE, setRunError, setRunTerminalReason, updateRunStatusIfRunning, } from "../agent/run-store.js";
@@ -23,7 +23,7 @@ import { verifyInternalToken, extractBearerToken, } from "../integrations/intern
23
23
  import { McpClientManager, loadMcpConfig, autoDetectMcpConfig, mcpToolsToActionEntries, syncMcpActionEntries, mountMcpServersRoutes, mountMcpHubRoutes, buildMergedConfig, startMcpConfigRefresh, areBuiltinMcpCapabilitiesSupported, setBuiltinMcpCapabilityEnabled, getHubStatus, isHubServeEnabled, } from "../mcp-client/index.js";
24
24
  import { setProgressPreListHook } from "../progress/store.js";
25
25
  import { getFrontmatterValue, getSkillNameFromPath, parseFrontmatter, } from "../resources/metadata.js";
26
- import { resourceList, resourceListAccessible, resourceGet, resourceGetByPath, ensurePersonalDefaults, SHARED_OWNER, WORKSPACE_OWNER, } from "../resources/store.js";
26
+ import { resourceList, resourceListAccessible, resourceGet, resourceGetByPath, ensurePersonalDefaults, organizationIdFromResourceOwner, sharedResourceOwner, SHARED_OWNER, WORKSPACE_OWNER, } from "../resources/store.js";
27
27
  import { normalizeDatabaseToolsMode, } from "../scripts/db/tool-mode.js";
28
28
  import { dbExecToolParameters } from "../scripts/db/tool-schemas.js";
29
29
  import { getSetting, putSetting } from "../settings/store.js";
@@ -382,8 +382,9 @@ function getResourceSummaryFromContent(content) {
382
382
  function resourceScopeForOwner(owner, currentOwner) {
383
383
  if (owner === WORKSPACE_OWNER)
384
384
  return "workspace";
385
- if (owner === SHARED_OWNER)
385
+ if (owner === SHARED_OWNER || organizationIdFromResourceOwner(owner)) {
386
386
  return "shared";
387
+ }
387
388
  if (currentOwner && owner === currentOwner)
388
389
  return "personal";
389
390
  return "resource";
@@ -432,29 +433,34 @@ async function loadInstructionResourcesForPrompt(owner, scope, maxChars = SHARED
432
433
  return [];
433
434
  }
434
435
  }
435
- async function loadResourceSkillsPromptBlock(owner) {
436
+ async function loadResourceSkillsPromptBlock(owner, orgId) {
436
437
  try {
438
+ const organizationOwner = sharedResourceOwner(orgId);
437
439
  const resources = owner === SHARED_OWNER
438
440
  ? [
439
441
  ...(await resourceList(SHARED_OWNER, "skills/")),
440
442
  ...(await resourceList(WORKSPACE_OWNER, "skills/")),
441
443
  ]
442
- : await resourceListAccessible(owner, "skills/");
444
+ : await resourceListAccessible(owner, "skills/", { orgId });
443
445
  const sorted = resources.sort((a, b) => {
444
446
  const ownerOrder = (a.owner === owner
445
447
  ? 0
446
- : a.owner === SHARED_OWNER
448
+ : a.owner === organizationOwner
447
449
  ? 1
448
- : a.owner === WORKSPACE_OWNER
450
+ : a.owner === SHARED_OWNER
449
451
  ? 2
450
- : 3) -
452
+ : a.owner === WORKSPACE_OWNER
453
+ ? 3
454
+ : 4) -
451
455
  (b.owner === owner
452
456
  ? 0
453
- : b.owner === SHARED_OWNER
457
+ : b.owner === organizationOwner
454
458
  ? 1
455
- : b.owner === WORKSPACE_OWNER
459
+ : b.owner === SHARED_OWNER
456
460
  ? 2
457
- : 3);
461
+ : b.owner === WORKSPACE_OWNER
462
+ ? 3
463
+ : 4);
458
464
  if (ownerOrder !== 0)
459
465
  return ownerOrder;
460
466
  return a.path.localeCompare(b.path);
@@ -1301,7 +1307,7 @@ async function createResourceScriptEntries() {
1301
1307
  return "Error: promote supports personal or shared scope only";
1302
1308
  }
1303
1309
  const owner = scope === "shared"
1304
- ? store.SHARED_OWNER
1310
+ ? store.sharedResourceOwner(getRequestOrgId())
1305
1311
  : (getRequestRunContext()?.owner ??
1306
1312
  getRequestUserEmail() ??
1307
1313
  process.env.AGENT_USER_EMAIL);
@@ -1568,7 +1574,7 @@ async function createCallAgentScriptEntry(selfAppId) {
1568
1574
  function createBuilderBrowserTool(deps) {
1569
1575
  const extensionRequestGuidance = deps.extensionTools === false
1570
1576
  ? "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. "
1571
- : "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. ";
1577
+ : "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. ";
1572
1578
  const setBuiltinForCurrentUser = async (id, enabled) => {
1573
1579
  const email = getRequestUserEmail();
1574
1580
  if (!email) {
@@ -1973,6 +1979,20 @@ function createTeamTools(deps) {
1973
1979
  },
1974
1980
  };
1975
1981
  }
1982
+ /**
1983
+ * Run an A2A-delegated agent turn with the same final-response guard used by
1984
+ * the app's interactive chat surface.
1985
+ *
1986
+ * Keeping this in one helper prevents delegated calls from silently bypassing
1987
+ * template guarantees such as Analytics' requirement to query real data
1988
+ * before presenting metrics or exhaustive provider conclusions.
1989
+ */
1990
+ export function runA2AAgentLoop(runOptions, pluginOptions, timeoutOptions, runner = runAgentLoopDirectWithSoftTimeout) {
1991
+ return runner({
1992
+ ...runOptions,
1993
+ finalResponseGuard: pluginOptions.finalResponseGuard,
1994
+ }, pluginOptions.runSoftTimeoutMs, timeoutOptions);
1995
+ }
1976
1996
  /**
1977
1997
  * Verbose framework sections returned by the `get-framework-context` tool.
1978
1998
  * Keyed by topic so the agent can request specific sections.
@@ -2168,7 +2188,7 @@ function buildFrameworkPrompts(examples, options) {
2168
2188
  ? "`render-inline-extension`, `create-extension`, `update-extension`, `connect-builder`, or any action that creates, updates, deletes, sends, publishes, or persists data"
2169
2189
  : "`connect-builder`, or any action that creates, updates, deletes, sends, publishes, or persists data";
2170
2190
  const extensionConnectBuilderGuard = extensionToolsEnabled
2171
- ? "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`."
2191
+ ? "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."
2172
2192
  : "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.";
2173
2193
  const extensionInstructionsFull = extensionToolsEnabled
2174
2194
  ? `### Generative UI and Extensions (Mini-Apps)
@@ -2197,7 +2217,7 @@ For existing extensions, use \`get-extension\` or \`update-extension\` directly
2197
2217
 
2198
2218
  ### Extensions vs. Code Changes — Pick the Right Path
2199
2219
 
2200
- 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.
2220
+ 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.
2201
2221
 
2202
2222
  <routing>
2203
2223
  | The request is for… | Path |
@@ -2207,10 +2227,13 @@ Route by what the request changes, not how it is phrased. Extensions render in t
2207
2227
  | Loading a saved extension inside chat | \`show-extension-inline\` |
2208
2228
  | Editing an existing extension (fix, restyle, rename, add behavior) | \`update-extension\` |
2209
2229
  | The host app's own chrome (nav bar, sidebar, layout, routes, shipped components, existing styles, business logic) | \`connect-builder\` — a real source-code change |
2230
+ | UI inside or beside a native component where no named slot exists | \`connect-builder\` — add the native UI or a suitable slot in source |
2210
2231
  | Ambiguous, satisfiable either way (e.g. "give me an unread view") | \`render-inline-extension\` for chat-only, \`create-extension\` for reusable |
2211
2232
  </routing>
2212
2233
 
2213
- 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\`.`
2234
+ 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.
2235
+
2236
+ 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\`.`
2214
2237
  : `### Extensions Disabled
2215
2238
 
2216
2239
  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.`;
@@ -2231,7 +2254,7 @@ For existing extensions, use \`get-extension\` or \`update-extension\` directly
2231
2254
 
2232
2255
  ### Extensions vs. Code Changes — Pick the Right Path
2233
2256
 
2234
- 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.`
2257
+ 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.`
2235
2258
  : `### Extensions Disabled
2236
2259
 
2237
2260
  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.`;
@@ -2355,9 +2378,9 @@ export const _agentChatPromptSectionsForTests = (() => {
2355
2378
  * 2. `<template>` — AGENTS.md + skills index from the Vite plugin bundle.
2356
2379
  * 3. `<workspace>` — SQL workspace AGENTS.md and instructions/*.md.
2357
2380
  * Runtime global defaults managed from Dispatch and inherited by apps.
2358
- * 4. `<shared>` — SQL shared AGENTS.md and instructions/*.md. App/team/org
2359
- * guidance that can override or narrow workspace defaults.
2360
- * 5. `<shared>` LEARNINGS.md from the SQL shared scope. Team-level notes.
2381
+ * 4. `<app-default>` — legacy app-wide SQL defaults.
2382
+ * 5. `<shared>` organization AGENTS.md, instructions, and LEARNINGS.md.
2383
+ * These are isolated by active org and override app/workspace defaults.
2361
2384
  * 6. `<personal>` — memory/MEMORY.md from the SQL personal scope. The
2362
2385
  * current user's structured memory index.
2363
2386
  *
@@ -2365,7 +2388,7 @@ export const _agentChatPromptSectionsForTests = (() => {
2365
2388
  * AGENTS.md and restarting the server is all it takes; Vite HMR invalidates
2366
2389
  * the bundle in dev so changes land instantly.
2367
2390
  */
2368
- export async function loadResourcesForPrompt(owner, compact = false, selfAppId) {
2391
+ export async function loadResourcesForPrompt(owner, compact = false, selfAppId, orgId = getRequestOrgId() ?? null) {
2369
2392
  await ensurePersonalDefaults(owner);
2370
2393
  const sections = [];
2371
2394
  const promptResourceMaxChars = compact
@@ -2428,13 +2451,25 @@ export async function loadResourcesForPrompt(owner, compact = false, selfAppId)
2428
2451
  if (workspaceAgents)
2429
2452
  sections.push(workspaceAgents);
2430
2453
  sections.push(...(await loadInstructionResourcesForPrompt(WORKSPACE_OWNER, "workspace-instruction", promptResourceMaxChars)));
2431
- // 4. Runtime shared/app/org resources from SQL. These come after workspace
2432
- // defaults so app/team-specific guidance can override or narrow them.
2433
- const sharedAgents = await loadAgentsResourceForPrompt(SHARED_OWNER, "shared", promptResourceMaxChars);
2434
- if (sharedAgents)
2435
- sections.push(sharedAgents);
2436
- sections.push(...(await loadInstructionResourcesForPrompt(SHARED_OWNER, "shared-instruction", promptResourceMaxChars)));
2437
- // 5. Personal SQL resources. These come last in the instruction stack so a
2454
+ const organizationOwner = sharedResourceOwner(orgId);
2455
+ // 4. Legacy app-wide defaults. Existing deployments keep their seeded
2456
+ // shared guidance as an inherited fallback; organization writes never
2457
+ // mutate this owner.
2458
+ const appDefaultAgents = await loadAgentsResourceForPrompt(SHARED_OWNER, organizationOwner === SHARED_OWNER ? "shared" : "app-default", promptResourceMaxChars);
2459
+ if (appDefaultAgents)
2460
+ sections.push(appDefaultAgents);
2461
+ sections.push(...(await loadInstructionResourcesForPrompt(SHARED_OWNER, organizationOwner === SHARED_OWNER
2462
+ ? "shared-instruction"
2463
+ : "app-default-instruction", promptResourceMaxChars)));
2464
+ // 5. Active organization resources. These are the durable team rules and
2465
+ // learnings that Slack/integration runs share with interactive app chat.
2466
+ if (organizationOwner !== SHARED_OWNER) {
2467
+ const organizationAgents = await loadAgentsResourceForPrompt(organizationOwner, "shared", promptResourceMaxChars);
2468
+ if (organizationAgents)
2469
+ sections.push(organizationAgents);
2470
+ sections.push(...(await loadInstructionResourcesForPrompt(organizationOwner, "shared-instruction", promptResourceMaxChars)));
2471
+ }
2472
+ // 6. Personal SQL resources. These come last in the instruction stack so a
2438
2473
  // user can narrow or override organization/app and workspace defaults.
2439
2474
  if (owner !== SHARED_OWNER && owner !== WORKSPACE_OWNER) {
2440
2475
  const personalAgents = await loadAgentsResourceForPrompt(owner, "personal", promptResourceMaxChars);
@@ -2442,25 +2477,41 @@ export async function loadResourcesForPrompt(owner, compact = false, selfAppId)
2442
2477
  sections.push(personalAgents);
2443
2478
  sections.push(...(await loadInstructionResourcesForPrompt(owner, "personal-instruction", promptResourceMaxChars)));
2444
2479
  }
2445
- const resourceSkillsBlock = await loadResourceSkillsPromptBlock(owner);
2480
+ const resourceSkillsBlock = await loadResourceSkillsPromptBlock(owner, orgId);
2446
2481
  if (resourceSkillsBlock)
2447
2482
  sections.push(resourceSkillsBlock);
2483
+ let sharedLearnings = null;
2484
+ try {
2485
+ sharedLearnings =
2486
+ (organizationOwner !== SHARED_OWNER
2487
+ ? await resourceGetByPath(organizationOwner, "LEARNINGS.md")
2488
+ : null) ?? (await resourceGetByPath(SHARED_OWNER, "LEARNINGS.md"));
2489
+ }
2490
+ catch { }
2448
2491
  if (compact) {
2449
- // In compact mode, skip learnings and memory in the prompt.
2450
- // The agent can access them via the resources tool when needed.
2451
- // Add a brief pointer so the agent knows they exist.
2452
- sections.push(`<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>`);
2492
+ // Integration/Slack turns use compact context, but organization learnings
2493
+ // are operational routing input, not optional background. Preload the
2494
+ // bounded shared file so canonical destinations/fields are available on
2495
+ // the first turn; keep personal memory on-demand to preserve the compact
2496
+ // budget.
2497
+ if (sharedLearnings?.content?.trim()) {
2498
+ const block = promptResourceBlock({
2499
+ name: "LEARNINGS.md",
2500
+ scope: "shared",
2501
+ path: "LEARNINGS.md",
2502
+ content: sharedLearnings.content,
2503
+ maxChars: COMPACT_PROMPT_RESOURCE_MAX_CHARS,
2504
+ });
2505
+ if (block)
2506
+ sections.push(block);
2507
+ }
2508
+ sections.push(`<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>`);
2453
2509
  }
2454
2510
  else {
2455
2511
  // LEARNINGS.md from SQL (template-level instructions are in AGENTS.md above).
2456
- // 2. Shared SQL scope
2457
- try {
2458
- const shared = await resourceGetByPath(SHARED_OWNER, "LEARNINGS.md");
2459
- if (shared?.content?.trim()) {
2460
- sections.push(`<resource name="LEARNINGS.md" scope="shared">\n${shared.content.trim()}\n</resource>`);
2461
- }
2512
+ if (sharedLearnings?.content?.trim()) {
2513
+ sections.push(`<resource name="LEARNINGS.md" scope="shared">\n${sharedLearnings.content.trim()}\n</resource>`);
2462
2514
  }
2463
- catch { }
2464
2515
  // 3. Personal memory index (skip if owner is the shared sentinel)
2465
2516
  if (owner !== SHARED_OWNER) {
2466
2517
  try {
@@ -2475,9 +2526,14 @@ export async function loadResourcesForPrompt(owner, compact = false, selfAppId)
2475
2526
  const workspaceResourceIndex = await loadResourceIndexForPrompt(WORKSPACE_OWNER, "workspace");
2476
2527
  if (workspaceResourceIndex)
2477
2528
  sections.push(workspaceResourceIndex);
2478
- const sharedResourceIndex = await loadResourceIndexForPrompt(SHARED_OWNER, "shared");
2479
- if (sharedResourceIndex)
2480
- sections.push(sharedResourceIndex);
2529
+ const appDefaultResourceIndex = await loadResourceIndexForPrompt(SHARED_OWNER, "shared");
2530
+ if (appDefaultResourceIndex)
2531
+ sections.push(appDefaultResourceIndex);
2532
+ if (organizationOwner !== SHARED_OWNER) {
2533
+ const organizationResourceIndex = await loadResourceIndexForPrompt(organizationOwner, "shared");
2534
+ if (organizationResourceIndex)
2535
+ sections.push(organizationResourceIndex);
2536
+ }
2481
2537
  try {
2482
2538
  const agents = (await discoverAgents(selfAppId)).slice(0, 30);
2483
2539
  if (agents.length > 0) {
@@ -3519,6 +3575,7 @@ export function createAgentChatPlugin(options) {
3519
3575
  skills: buildPublicAgentA2ASkills(allScripts),
3520
3576
  publicSkillsOnly: true,
3521
3577
  streaming: true,
3578
+ durableBackgroundRuns: options?.durableBackgroundRuns,
3522
3579
  handler: async function* (message, context) {
3523
3580
  // Resolve the caller's identity for user-scoped data access.
3524
3581
  // Priority: A2A-JWT verified email (set by the A2A handler in
@@ -3744,7 +3801,7 @@ export function createAgentChatPlugin(options) {
3744
3801
  let lastRecoverableArtifactText = "";
3745
3802
  const controller = new AbortController();
3746
3803
  console.log(`[A2A] Starting agent loop: ${a2aTools.length} tools, prompt ${systemPrompt.length} chars`);
3747
- await runAgentLoopDirectWithSoftTimeout({
3804
+ await runA2AAgentLoop({
3748
3805
  engine: a2aEngine,
3749
3806
  model,
3750
3807
  systemPrompt,
@@ -3789,7 +3846,10 @@ export function createAgentChatPlugin(options) {
3789
3846
  }
3790
3847
  },
3791
3848
  signal: controller.signal,
3792
- }, options?.runSoftTimeoutMs, {
3849
+ }, {
3850
+ finalResponseGuard: options?.finalResponseGuard,
3851
+ runSoftTimeoutMs: options?.runSoftTimeoutMs,
3852
+ }, {
3793
3853
  backgroundFunction: options?.durableBackgroundRuns === true &&
3794
3854
  isInBackgroundFunctionRuntime(),
3795
3855
  });
@@ -5738,7 +5798,10 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
5738
5798
  catch {
5739
5799
  // Empty/invalid body — keep the default user abort reason.
5740
5800
  }
5741
- abortRun(runId, reason); // Aborts in-memory + marks aborted in SQL
5801
+ // Recovery starts as soon as this response resolves, so wait for
5802
+ // the cross-isolate abort + terminal event to be durable. Returning
5803
+ // early lets Retry collide with the still-running row.
5804
+ await abortRunDurably(runId, reason);
5742
5805
  return { ok: true };
5743
5806
  }
5744
5807
  // Route: GET /runs/:id/background-events
@@ -5850,6 +5913,26 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
5850
5913
  // Server clock so the client computes "stuck" elapsed time
5851
5914
  // server-relative, immune to client clock skew.
5852
5915
  serverNow: Date.now(),
5916
+ // True exactly when this run is a `chainServerDrivenContinuation`
5917
+ // deferral still inside `UNCLAIMED_BACKGROUND_RUN_REDISPATCH_BOUND_MS`
5918
+ // — silently recovering server-side via the unclaimed-background-run
5919
+ // sweep(s), never a dead run. See `getActiveRunForThreadAsync`'s doc
5920
+ // comment (run-manager.ts) and the THREE-SITE INVARIANT comments in
5921
+ // agent-chat-plugin.ts / production-agent.ts / agent-chat-adapter.ts.
5922
+ awaitingRedispatch: run.awaitingRedispatch === true,
5923
+ // True exactly when this run holds an open tool call or A2A
5924
+ // `agent_call` delegation (`in_flight_since` set — the same
5925
+ // marker `reapIfStale` reads to grant its bounded stale-reap
5926
+ // grace, see run-store.ts). This is the server-authoritative
5927
+ // signal for "would aborting this run right now destroy live
5928
+ // work" — RunStuckBanner's Retry gating should prefer this
5929
+ // field over its client-side proxy (unresolved `tool-call`
5930
+ // content parts in the local message list), which can go stale
5931
+ // after a reconnect or reader-mode replay. NOTE: this response
5932
+ // object is explicitly field-picked, not spread — a field added
5933
+ // to `getActiveRunForThreadAsync`'s return type does NOT reach
5934
+ // the wire on its own; it must be listed here too.
5935
+ hasInFlightWork: run.hasInFlightWork === true,
5853
5936
  };
5854
5937
  }
5855
5938
  setResponseStatus(event, 405);
@@ -6658,30 +6741,128 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
6658
6741
  // turn hangs silently. `chainServerDrivenContinuation` (production-agent.ts)
6659
6742
  // leaves exactly such a row behind — status='running', dispatch_mode=
6660
6743
  // 'background', `dispatch_payload` intact — when it exhausts its own
6661
- // dispatch retry budget, instead of erroring it immediately. This sweep
6662
- // gives that row a real chance to RECOVER: within
6663
- // `UNCLAIMED_BACKGROUND_RUN_REDISPATCH_BOUND_MS` of its original
6664
- // `started_at` it redispatches the handoff (same `_process-run`
6665
- // processor, same persisted payload); past that bound it falls back to
6666
- // the existing loud reap (`background_worker_never_started`) so a
6667
- // genuinely dead handoff still fails loud, never silently. A
6668
- // redispatch is always safe to attempt — even a duplicate or
6669
- // late-arriving one — because the worker's `claimBackgroundRun` atomic
6670
- // CAS (status='running' AND dispatch_mode='background' -> 'background-
6671
- // processing') is the sole gate on actual execution; a row that was
6672
- // already claimed or already reaped by a concurrent path just loses the
6673
- // CAS and no-ops. Cheap: one indexed-ish query per 2-min window.
6744
+ // dispatch retry budget, instead of erroring it immediately. Two timers
6745
+ // cooperate to recover it, both reading `listUnclaimedBackgroundRunRows`
6746
+ // fresh each tick and gated by `shouldRedispatchUnclaimedBackgroundRun`
6747
+ // (so they always agree on which rows are still eligible):
6748
+ // - the FAST sweep (`UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS`, 20s)
6749
+ // below ONLY attempts redispatch never reaps — so it puts the
6750
+ // first recovery attempt well inside the client's
6751
+ // `BACKGROUND_FOLLOW_IDLE_TIMEOUT_MS` (see the derived budget on
6752
+ // `UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS` in run-store.ts).
6753
+ // - the SLOW sweep (2 minutes, immediately below the fast one) is the
6754
+ // one that falls back to the loud reap once
6755
+ // `UNCLAIMED_BACKGROUND_RUN_REDISPATCH_BOUND_MS` is exceeded; it
6756
+ // also still attempts redispatch itself so a fast-sweep outage
6757
+ // (e.g. a restart between ticks) is not the only path to recovery.
6758
+ // A redispatch is always safe to attempt — even a duplicate, concurrent,
6759
+ // or late-arriving one, including the fast and slow sweeps racing each
6760
+ // other on the SAME row — because the worker's `claimBackgroundRun`
6761
+ // atomic CAS (status='running' AND dispatch_mode='background' ->
6762
+ // 'background-processing') is the sole gate on actual execution; a row
6763
+ // that was already claimed or already reaped by a concurrent path just
6764
+ // loses the CAS and no-ops. Cheap: one indexed-ish query per tick.
6674
6765
  //
6675
6766
  // THREE-SITE INVARIANT (keep in lockstep): this sweep only ever sees the
6676
6767
  // deferred successor because the ~1s client poll in
6677
6768
  // `getActiveRunForThreadAsync` (run-manager.ts) skips its own
6678
6769
  // `reapUnclaimedBackgroundRun` while the row is within the redispatch
6679
- // bound (`shouldRedispatchUnclaimedBackgroundRun`). If a future change
6680
- // makes that client poll reap deferred successors at the 25s grace
6681
- // again, this sweep will almost never win the race for connected clients.
6682
- // Do not edit one site without the others (producer:
6683
- // chainServerDrivenContinuation in production-agent.ts; guard:
6684
- // run-manager.ts; recovery actor: here).
6770
+ // bound (`shouldRedispatchUnclaimedBackgroundRun`). That same client
6771
+ // poll also surfaces `awaitingRedispatch: true` on `/runs/active` for
6772
+ // exactly this state, which `agent-chat-adapter.ts`'s follow loop uses
6773
+ // to stop counting the quiet gap against its own idle timeout. If a
6774
+ // future change makes the client poll reap deferred successors at the
6775
+ // 25s grace again, or stops surfacing `awaitingRedispatch`, both sweeps
6776
+ // here will almost never win the race for connected clients. Do not
6777
+ // edit one site without the others (producer: chainServerDrivenContinuation
6778
+ // in production-agent.ts; guard + wire signal: run-manager.ts; recovery
6779
+ // actors: here).
6780
+ const attemptUnclaimedBackgroundRunRedispatch = async (row) => {
6781
+ const { updateRunHeartbeat } = await import("../agent/run-store.js");
6782
+ const { resolveAgentChatProcessRunDispatchPath } = await import("../agent/durable-background.js");
6783
+ const { fireInternalDispatch } = await import("./self-dispatch.js");
6784
+ // Bump liveness BEFORE attempting the redispatch so the row doesn't
6785
+ // look freshly-stale again the instant this tick returns —
6786
+ // best-effort, the CAS is what actually matters for correctness, not
6787
+ // this timing.
6788
+ await updateRunHeartbeat(row.id).catch(() => { });
6789
+ try {
6790
+ // DELIBERATE: this marker omits `continuationCount`.
6791
+ // `chainServerDrivenContinuation` (production-agent.ts) reads
6792
+ // `backgroundRunMarker.continuationCount` to compute
6793
+ // `backgroundContinuationCount`, defaulting to 0 when absent — so a
6794
+ // chunk recovered here always starts a fresh nested-dispatch
6795
+ // segment at depth 0, regardless of how deep the chain was before
6796
+ // this sweep picked it up. This is what makes the sweep a genuine
6797
+ // CHAIN BREAK, not just a retry: this redispatch fires from an
6798
+ // unrelated, timer-driven invocation rather than from inside the
6799
+ // prior chain's own live execution, so starting its nested-depth
6800
+ // count over at 0 here is correct — see
6801
+ // `MAX_NESTED_SELF_DISPATCH_DEPTH` in production-agent.ts for why
6802
+ // nested depth is bounded and how this reset keeps a long turn
6803
+ // progressing past Netlify's undocumented self-invocation
6804
+ // loop-protection limit instead of dying at it. Do not "fix" this
6805
+ // by adding `continuationCount` back without re-reading that
6806
+ // constant's doc comment.
6807
+ await fireInternalDispatch({
6808
+ path: resolveAgentChatProcessRunDispatchPath(),
6809
+ taskId: row.id,
6810
+ body: {
6811
+ internalContinuation: true,
6812
+ [AGENT_CHAT_BACKGROUND_RUN_FIELD]: {
6813
+ runId: row.id,
6814
+ payloadRef: true,
6815
+ },
6816
+ },
6817
+ awaitResponse: true,
6818
+ responseTimeoutMs: 15_000,
6819
+ });
6820
+ console.error("[agent-chat] redispatched unclaimed background run (handoff recovery):", row.id);
6821
+ }
6822
+ catch (redispatchErr) {
6823
+ console.error("[agent-chat] unclaimed background run redispatch attempt failed (retrying until the redispatch bound, then reaping):", row.id, redispatchErr instanceof Error
6824
+ ? redispatchErr.message
6825
+ : redispatchErr);
6826
+ }
6827
+ };
6828
+ // FAST sweep — redispatch-only, tight cadence. See the invariant
6829
+ // comment above for why this exists and the timing budget in
6830
+ // run-store.ts's `UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS` doc comment.
6831
+ (() => {
6832
+ setTimeout(() => {
6833
+ (async () => {
6834
+ const { UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS } = await import("../agent/run-store.js");
6835
+ setInterval(() => {
6836
+ (async () => {
6837
+ const { listUnclaimedBackgroundRunRows, shouldRedispatchUnclaimedBackgroundRun, } = await import("../agent/run-store.js");
6838
+ let rows;
6839
+ try {
6840
+ rows = await listUnclaimedBackgroundRunRows();
6841
+ }
6842
+ catch {
6843
+ return; // Table may not exist yet on first boot
6844
+ }
6845
+ for (const row of rows) {
6846
+ if (!shouldRedispatchUnclaimedBackgroundRun(row))
6847
+ continue;
6848
+ await attemptUnclaimedBackgroundRunRedispatch(row).catch(() => { });
6849
+ }
6850
+ })().catch(() => {
6851
+ // best-effort — never break the server
6852
+ });
6853
+ }, UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS);
6854
+ })().catch(() => {
6855
+ // best-effort — if run-store fails to load, the slow sweep below
6856
+ // still provides eventual (loud) recovery.
6857
+ });
6858
+ }, 10_000); // Start 10s after init — before the slow sweep's first tick.
6859
+ })();
6860
+ // SLOW sweep — redispatch AND the loud-failure reap fallback past the
6861
+ // redispatch bound. Kept on its original 2-minute cadence: it is not
6862
+ // the latency-critical path anymore (the fast sweep above is), it is
6863
+ // the correctness backstop that guarantees a genuinely lost handoff
6864
+ // still fails loud, and it survives the fast sweep having missed a row
6865
+ // entirely (e.g. a restart landed between fast-sweep ticks).
6685
6866
  (() => {
6686
6867
  let lastSweep = 0;
6687
6868
  const SWEEP_INTERVAL_MS = 2 * 60 * 1000;
@@ -6692,9 +6873,7 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
6692
6873
  return;
6693
6874
  lastSweep = now;
6694
6875
  (async () => {
6695
- const { listUnclaimedBackgroundRunRows, reapUnclaimedBackgroundRun, updateRunHeartbeat, shouldRedispatchUnclaimedBackgroundRun, } = await import("../agent/run-store.js");
6696
- const { resolveAgentChatProcessRunDispatchPath } = await import("../agent/durable-background.js");
6697
- const { fireInternalDispatch } = await import("./self-dispatch.js");
6876
+ const { listUnclaimedBackgroundRunRows, reapUnclaimedBackgroundRun, shouldRedispatchUnclaimedBackgroundRun, } = await import("../agent/run-store.js");
6698
6877
  let rows;
6699
6878
  try {
6700
6879
  rows = await listUnclaimedBackgroundRunRows();
@@ -6705,51 +6884,7 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
6705
6884
  for (const row of rows) {
6706
6885
  try {
6707
6886
  if (shouldRedispatchUnclaimedBackgroundRun(row)) {
6708
- // Bump liveness BEFORE attempting the redispatch so the
6709
- // row doesn't look freshly-stale again the instant this
6710
- // tick returns — best-effort, the CAS is what actually
6711
- // matters for correctness, not this timing.
6712
- await updateRunHeartbeat(row.id).catch(() => { });
6713
- try {
6714
- // DELIBERATE: this marker omits `continuationCount`.
6715
- // `chainServerDrivenContinuation` (production-agent.ts)
6716
- // reads `backgroundRunMarker.continuationCount` to
6717
- // compute `backgroundContinuationCount`, defaulting to 0
6718
- // when absent — so a chunk recovered here always starts
6719
- // a fresh nested-dispatch segment at depth 0, regardless
6720
- // of how deep the chain was before this sweep picked it
6721
- // up. This is what makes the sweep a genuine CHAIN
6722
- // BREAK, not just a retry: this redispatch fires from an
6723
- // unrelated, timer-driven invocation rather than from
6724
- // inside the prior chain's own live execution, so
6725
- // starting its nested-depth count over at 0 here is
6726
- // correct — see `MAX_NESTED_SELF_DISPATCH_DEPTH` in
6727
- // production-agent.ts for why nested depth is bounded
6728
- // and how this reset keeps a long turn progressing past
6729
- // Netlify's undocumented self-invocation loop-protection
6730
- // limit instead of dying at it. Do not "fix" this by
6731
- // adding `continuationCount` back without re-reading
6732
- // that constant's doc comment.
6733
- await fireInternalDispatch({
6734
- path: resolveAgentChatProcessRunDispatchPath(),
6735
- taskId: row.id,
6736
- body: {
6737
- internalContinuation: true,
6738
- [AGENT_CHAT_BACKGROUND_RUN_FIELD]: {
6739
- runId: row.id,
6740
- payloadRef: true,
6741
- },
6742
- },
6743
- awaitResponse: true,
6744
- responseTimeoutMs: 15_000,
6745
- });
6746
- console.error("[agent-chat] redispatched unclaimed background run (handoff recovery):", row.id);
6747
- }
6748
- catch (redispatchErr) {
6749
- console.error("[agent-chat] unclaimed background run redispatch attempt failed (retrying until the redispatch bound, then reaping):", row.id, redispatchErr instanceof Error
6750
- ? redispatchErr.message
6751
- : redispatchErr);
6752
- }
6887
+ await attemptUnclaimedBackgroundRunRedispatch(row);
6753
6888
  continue;
6754
6889
  }
6755
6890
  // Redispatch bound exceeded — this handoff is not