@agent-native/core 0.131.5 → 0.131.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. package/corpus/README.md +3 -3
  2. package/corpus/core/CHANGELOG.md +70 -0
  3. package/corpus/core/docs/content/agent-native-toolkit.mdx +13 -6
  4. package/corpus/core/docs/content/cloneable-saas.mdx +5 -5
  5. package/corpus/core/docs/content/creating-templates.mdx +9 -0
  6. package/corpus/core/docs/content/deployment.mdx +18 -12
  7. package/corpus/core/docs/content/doctor.mdx +8 -1
  8. package/corpus/core/docs/content/drop-in-agent.mdx +1 -1
  9. package/corpus/core/docs/content/extensions.mdx +18 -18
  10. package/corpus/core/docs/content/faq.mdx +4 -4
  11. package/corpus/core/docs/content/key-concepts.mdx +30 -21
  12. package/corpus/core/docs/content/security.mdx +2 -2
  13. package/corpus/core/docs/content/template-brain-developers.mdx +4 -1
  14. package/corpus/core/docs/content/template-mail-developers.mdx +4 -1
  15. package/corpus/core/docs/content/what-is-agent-native.mdx +6 -6
  16. package/corpus/core/package.json +1 -1
  17. package/corpus/core/src/a2a/client.ts +449 -66
  18. package/corpus/core/src/a2a/correlation.ts +31 -0
  19. package/corpus/core/src/a2a/invoke.ts +4 -2
  20. package/corpus/core/src/a2a/types.ts +4 -0
  21. package/corpus/core/src/action.ts +3 -0
  22. package/corpus/core/src/agent/action-continuation-guidance.ts +2 -1
  23. package/corpus/core/src/agent/engine/registry.ts +98 -6
  24. package/corpus/core/src/agent/production-agent.ts +151 -18
  25. package/corpus/core/src/agent/run-loop-with-resume.ts +190 -3
  26. package/corpus/core/src/agent/run-manager.ts +117 -41
  27. package/corpus/core/src/agent/thread-debug-history.ts +86 -0
  28. package/corpus/core/src/agent/types.ts +3 -1
  29. package/corpus/core/src/cli/create.ts +11 -1
  30. package/corpus/core/src/cli/templates-meta.ts +2 -2
  31. package/corpus/core/src/client/agent-chat-adapter.ts +91 -13
  32. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +11 -9
  33. package/corpus/core/src/client/sse-event-processor.ts +17 -3
  34. package/corpus/core/src/db/client.ts +57 -17
  35. package/corpus/core/src/guards/no-env-credentials.ts +2 -0
  36. package/corpus/core/src/integrations/adapters/slack.ts +8 -3
  37. package/corpus/core/src/localization/default-messages.ts +44 -0
  38. package/corpus/core/src/observability/traces.ts +78 -5
  39. package/corpus/core/src/scripts/call-agent.ts +294 -11
  40. package/corpus/core/src/scripts/describe-workspace-apps.ts +2 -2
  41. package/corpus/core/src/secrets/crypto.ts +156 -35
  42. package/corpus/core/src/secrets/storage.ts +64 -26
  43. package/corpus/core/src/server/agent-capabilities.ts +1 -1
  44. package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +113 -7
  45. package/corpus/core/src/server/agent-chat/context-tools.ts +2 -0
  46. package/corpus/core/src/server/agent-chat/plugin-options.ts +34 -1
  47. package/corpus/core/src/server/agent-chat/prompt-resources.ts +1 -1
  48. package/corpus/core/src/server/agent-chat-plugin.ts +91 -59
  49. package/corpus/core/src/templates/default/.agents/skills/secrets/SKILL.md +19 -7
  50. package/corpus/core/src/templates/headless/.agents/skills/secrets/SKILL.md +19 -7
  51. package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +18 -7
  52. package/corpus/core/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +15 -14
  53. package/corpus/core/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +19 -7
  54. package/corpus/core/src/vite/client.ts +1 -0
  55. package/corpus/templates/analytics/.agents/skills/dashboard-ops/SKILL.md +5 -4
  56. package/corpus/templates/analytics/.agents/skills/gong/SKILL.md +6 -4
  57. package/corpus/templates/analytics/AGENTS.md +7 -4
  58. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +4 -3
  59. package/corpus/templates/analytics/changelog/2026-07-30-delegated-analytics-questions-now-return-a-useful-current-me.md +6 -0
  60. package/corpus/templates/analytics/changelog/2026-07-30-scheduled-dashboard-emails-complete-every-panel-without-pool.md +6 -0
  61. package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +28 -1
  62. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +18 -11
  63. package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +4 -4
  64. package/corpus/templates/analytics/server/lib/canonical-first-party-dashboard-repair.ts +9 -5
  65. package/corpus/templates/analytics/server/lib/dashboard-panel-query.ts +6 -2
  66. package/corpus/templates/analytics/server/lib/dashboard-panel-source-resolver.ts +11 -4
  67. package/corpus/templates/analytics/server/lib/dashboard-report-render.ts +49 -31
  68. package/corpus/templates/analytics/server/lib/first-party-analytics.ts +16 -8
  69. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +9 -3
  70. package/corpus/templates/analytics/server/lib/production-serverless-runtime.ts +11 -0
  71. package/corpus/templates/analytics/server/lib/real-data-actions.ts +10 -0
  72. package/corpus/templates/analytics/server/plugins/agent-chat.ts +3 -2
  73. package/corpus/templates/analytics/server/plugins/analytics-alert-jobs.ts +2 -1
  74. package/corpus/templates/analytics/server/plugins/dashboard-report-jobs.ts +2 -1
  75. package/corpus/templates/analytics/server/plugins/uptime-monitor-jobs.ts +1 -12
  76. package/corpus/templates/brain/.agents/skills/brain/RUNBOOK.md +54 -6
  77. package/corpus/templates/brain/.agents/skills/brain/SKILL.md +20 -9
  78. package/corpus/templates/brain/.agents/skills/ingestion-and-connectors/SKILL.md +33 -1
  79. package/corpus/templates/brain/AGENTS.md +3 -1
  80. package/corpus/templates/brain/README.md +4 -1
  81. package/corpus/templates/brain/actions/_schemas.ts +30 -8
  82. package/corpus/templates/brain/actions/ask-brain.ts +124 -14
  83. package/corpus/templates/brain/actions/create-source.ts +18 -2
  84. package/corpus/templates/brain/actions/enqueue-captures-distillation.ts +8 -123
  85. package/corpus/templates/brain/actions/enqueue-distillation.ts +6 -127
  86. package/corpus/templates/brain/actions/import-capture.ts +17 -5
  87. package/corpus/templates/brain/actions/import-transcript.ts +17 -5
  88. package/corpus/templates/brain/actions/update-source.ts +25 -5
  89. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +1 -1
  90. package/corpus/templates/brain/changelog/2026-07-30-blessed-resources-can-feed-cited-company-answers.md +6 -0
  91. package/corpus/templates/brain/changelog/2026-07-30-the-left-sidebar-no-longer-shows-a-blank-organization-placeh.md +6 -0
  92. package/corpus/templates/brain/server/lib/brain.ts +49 -19
  93. package/corpus/templates/brain/server/lib/distillation-queue.ts +147 -0
  94. package/corpus/templates/brain/server/lib/source-policy.ts +264 -0
  95. package/corpus/templates/brain/server/plugins/agent-chat.ts +3 -2
  96. package/corpus/templates/brain/server/routes/api/_agent-native/brain/ingest.post.ts +116 -19
  97. package/corpus/templates/clips/app/components/meetings/google-oauth-identity-notice.tsx +51 -0
  98. package/corpus/templates/clips/app/i18n/en-US.ts +4 -0
  99. package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +3 -1
  100. package/corpus/templates/clips/changelog/2026-07-30-google-calendar-warning.md +6 -0
  101. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +72 -8
  102. package/corpus/templates/content/changelog/2026-07-30-the-slash-command-hint-now-stays-on-only-the-active-empty-li.md +6 -0
  103. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +506 -11
  104. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +148 -17
  105. package/corpus/templates/design/app/components/design/canvas-interactions/design-canvas-interactions.ts +357 -0
  106. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +7 -466
  107. package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +15 -311
  108. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +19 -997
  109. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +8 -1216
  110. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +31 -38
  111. package/corpus/templates/design/package.json +0 -1
  112. package/corpus/templates/dispatch/AGENTS.md +8 -0
  113. package/corpus/templates/dispatch/DEVELOPING.md +29 -0
  114. package/corpus/templates/dispatch/actions/view-screen.ts +34 -2
  115. package/corpus/templates/dispatch/app/i18n-data.ts +457 -0
  116. package/corpus/templates/dispatch/changelog/2026-07-30-delegated-dispatch-work-continues-reliably-in-the-background.md +6 -0
  117. package/corpus/templates/dispatch/changelog/2026-07-30-find-failed-runs-across-apps.md +6 -0
  118. package/corpus/templates/dispatch/netlify.toml +3 -0
  119. package/corpus/templates/plan/actions/get-visual-plan.ts +10 -6
  120. package/corpus/templates/plan/actions/patch-visual-plan-source.ts +117 -1
  121. package/corpus/templates/plan/actions/update-visual-plan.ts +56 -14
  122. package/corpus/templates/plan/app/pages/PlansPage.tsx +1 -1
  123. package/corpus/templates/plan/changelog/2026-07-30-plan-agents-recover-with-targeted-writes.md +6 -0
  124. package/corpus/templates/plan/shared/plan-content.ts +35 -0
  125. package/corpus/templates/slides/.agents/skills/analytics-data-for-decks/SKILL.md +8 -12
  126. package/corpus/templates/slides/AGENTS.md +4 -4
  127. package/corpus/templates/slides/actions/create-deck.ts +1 -1
  128. package/corpus/templates/slides/actions/duplicate-deck.ts +19 -4
  129. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +2 -10
  130. package/corpus/templates/slides/app/components/deck/MermaidRenderer.tsx +12 -1
  131. package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +30 -13
  132. package/corpus/templates/slides/app/components/editor/DeckEditorSkeleton.tsx +35 -0
  133. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +63 -56
  134. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +21 -76
  135. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +1110 -292
  136. package/corpus/templates/slides/app/components/editor/SlideOverflowWarning.tsx +53 -0
  137. package/corpus/templates/slides/app/components/editor/SlideStyleInspector.tsx +235 -18
  138. package/corpus/templates/slides/app/components/editor/SpeakerNotesPanel.tsx +4 -1
  139. package/corpus/templates/slides/app/components/editor/canvas-interactions/index.ts +11 -0
  140. package/corpus/templates/slides/app/components/editor/canvas-interactions/slides-canvas-adapter.ts +129 -0
  141. package/corpus/templates/slides/app/components/editor/selection-overlay-measurement.ts +70 -0
  142. package/corpus/templates/slides/app/components/editor/slide-object-interactions.ts +519 -65
  143. package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +36 -426
  144. package/corpus/templates/slides/app/components/visual-editor/DrawOverlay.tsx +19 -458
  145. package/corpus/templates/slides/app/context/DeckContext.tsx +179 -72
  146. package/corpus/templates/slides/app/global.css +105 -0
  147. package/corpus/templates/slides/app/i18n/en-US.ts +8 -0
  148. package/corpus/templates/slides/app/lib/deck-editor-loading.ts +26 -0
  149. package/corpus/templates/slides/app/lib/mermaid-blocks.ts +27 -0
  150. package/corpus/templates/slides/app/pages/DeckEditor.tsx +71 -38
  151. package/corpus/templates/slides/app/pages/Index.tsx +98 -41
  152. package/corpus/templates/slides/changelog/2026-07-30-deck-loading-no-longer-flashes-an-unavailable-message.md +6 -0
  153. package/corpus/templates/slides/changelog/2026-07-30-duplicating-a-deck-from-the-deck-list-now-opens-the-copy-imm.md +6 -0
  154. package/corpus/templates/slides/changelog/2026-07-30-layout-overflow-warning-is-readable-and-dismissible.md +6 -0
  155. package/corpus/templates/slides/changelog/2026-07-30-new-decks-now-start-with-an-empty-slide-list-when-no-slides-.md +6 -0
  156. package/corpus/templates/slides/changelog/2026-07-30-shared-canvas-annotations.md +6 -0
  157. package/corpus/templates/slides/changelog/2026-07-30-slide-objects-can-be-moved-as-a-group-copied-and-pasted-with.md +6 -0
  158. package/corpus/templates/slides/changelog/2026-07-30-slide-text-editing-and-object-controls-now-match-google-slides.md +6 -0
  159. package/corpus/templates/slides/changelog/2026-07-30-style-panel-now-scrolls-with-speaker-notes-open-shows-the-sl.md +6 -0
  160. package/corpus/templates/slides/changelog/2026-07-30-top-toolbar-controls-now-use-consistent-sizing-with-undo-and.md +6 -0
  161. package/corpus/templates/slides/netlify.toml +3 -1
  162. package/corpus/templates/slides/package.json +0 -1
  163. package/corpus/templates/slides/server/lib/chat-attachments.ts +18 -0
  164. package/corpus/templates/slides/server/plugins/agent-chat.ts +5 -0
  165. package/corpus/templates/slides/vite.config.ts +0 -1
  166. package/corpus/toolkit/CHANGELOG.md +13 -0
  167. package/corpus/toolkit/README.md +19 -0
  168. package/corpus/toolkit/agent-native.eject.json +38 -0
  169. package/corpus/toolkit/package.json +29 -1
  170. package/corpus/toolkit/src/canvas-annotations/CanvasCommentPins.tsx +861 -0
  171. package/corpus/toolkit/src/canvas-annotations/DrawOverlay.tsx +1233 -0
  172. package/corpus/toolkit/src/canvas-annotations/index.ts +15 -0
  173. package/corpus/toolkit/src/canvas-annotations/types.ts +14 -0
  174. package/corpus/toolkit/src/canvas-interactions/canvas-interactions.ts +933 -0
  175. package/corpus/toolkit/src/canvas-interactions/index.ts +67 -0
  176. package/corpus/toolkit/src/design-tweaks/scrub-input-utils.ts +311 -0
  177. package/corpus/toolkit/src/design-tweaks/scrub-input.tsx +491 -0
  178. package/corpus/toolkit/src/design-tweaks/visual-style-controls.tsx +26 -171
  179. package/corpus/toolkit/src/index.ts +1 -0
  180. package/dist/a2a/client.d.ts +23 -0
  181. package/dist/a2a/client.d.ts.map +1 -1
  182. package/dist/a2a/client.js +309 -44
  183. package/dist/a2a/client.js.map +1 -1
  184. package/dist/a2a/correlation.d.ts +1 -0
  185. package/dist/a2a/correlation.d.ts.map +1 -1
  186. package/dist/a2a/correlation.js +27 -0
  187. package/dist/a2a/correlation.js.map +1 -1
  188. package/dist/a2a/invoke.d.ts.map +1 -1
  189. package/dist/a2a/invoke.js +4 -2
  190. package/dist/a2a/invoke.js.map +1 -1
  191. package/dist/a2a/types.d.ts +4 -0
  192. package/dist/a2a/types.d.ts.map +1 -1
  193. package/dist/a2a/types.js.map +1 -1
  194. package/dist/action.d.ts +3 -0
  195. package/dist/action.d.ts.map +1 -1
  196. package/dist/action.js.map +1 -1
  197. package/dist/agent/action-continuation-guidance.d.ts.map +1 -1
  198. package/dist/agent/action-continuation-guidance.js +2 -1
  199. package/dist/agent/action-continuation-guidance.js.map +1 -1
  200. package/dist/agent/engine/registry.d.ts.map +1 -1
  201. package/dist/agent/engine/registry.js +82 -8
  202. package/dist/agent/engine/registry.js.map +1 -1
  203. package/dist/agent/production-agent.d.ts +40 -1
  204. package/dist/agent/production-agent.d.ts.map +1 -1
  205. package/dist/agent/production-agent.js +113 -15
  206. package/dist/agent/production-agent.js.map +1 -1
  207. package/dist/agent/run-loop-with-resume.d.ts +21 -0
  208. package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
  209. package/dist/agent/run-loop-with-resume.js +163 -4
  210. package/dist/agent/run-loop-with-resume.js.map +1 -1
  211. package/dist/agent/run-manager.d.ts +16 -9
  212. package/dist/agent/run-manager.d.ts.map +1 -1
  213. package/dist/agent/run-manager.js +93 -42
  214. package/dist/agent/run-manager.js.map +1 -1
  215. package/dist/agent/thread-debug-history.d.ts +10 -0
  216. package/dist/agent/thread-debug-history.d.ts.map +1 -0
  217. package/dist/agent/thread-debug-history.js +68 -0
  218. package/dist/agent/thread-debug-history.js.map +1 -0
  219. package/dist/agent/types.d.ts +3 -1
  220. package/dist/agent/types.d.ts.map +1 -1
  221. package/dist/agent/types.js.map +1 -1
  222. package/dist/cli/create.d.ts.map +1 -1
  223. package/dist/cli/create.js +6 -1
  224. package/dist/cli/create.js.map +1 -1
  225. package/dist/cli/templates-meta.js +2 -2
  226. package/dist/cli/templates-meta.js.map +1 -1
  227. package/dist/client/agent-chat-adapter.d.ts +1 -1
  228. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  229. package/dist/client/agent-chat-adapter.js +76 -13
  230. package/dist/client/agent-chat-adapter.js.map +1 -1
  231. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  232. package/dist/client/resources/McpIntegrationDialog.js +1 -1
  233. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  234. package/dist/client/sse-event-processor.d.ts.map +1 -1
  235. package/dist/client/sse-event-processor.js +12 -3
  236. package/dist/client/sse-event-processor.js.map +1 -1
  237. package/dist/collab/routes.d.ts +1 -1
  238. package/dist/db/client.d.ts.map +1 -1
  239. package/dist/db/client.js +48 -17
  240. package/dist/db/client.js.map +1 -1
  241. package/dist/guards/no-env-credentials.d.ts.map +1 -1
  242. package/dist/guards/no-env-credentials.js +2 -0
  243. package/dist/guards/no-env-credentials.js.map +1 -1
  244. package/dist/integrations/adapters/slack.js +7 -3
  245. package/dist/integrations/adapters/slack.js.map +1 -1
  246. package/dist/localization/default-messages.d.ts +43 -0
  247. package/dist/localization/default-messages.d.ts.map +1 -1
  248. package/dist/localization/default-messages.js +43 -0
  249. package/dist/localization/default-messages.js.map +1 -1
  250. package/dist/observability/traces.d.ts +3 -1
  251. package/dist/observability/traces.d.ts.map +1 -1
  252. package/dist/observability/traces.js +73 -4
  253. package/dist/observability/traces.js.map +1 -1
  254. package/dist/progress/routes.d.ts +1 -1
  255. package/dist/provider-api/actions/custom-provider-registration.d.ts +12 -12
  256. package/dist/provider-api/actions/provider-api.d.ts +13 -13
  257. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  258. package/dist/scripts/call-agent.d.ts.map +1 -1
  259. package/dist/scripts/call-agent.js +237 -12
  260. package/dist/scripts/call-agent.js.map +1 -1
  261. package/dist/scripts/describe-workspace-apps.js +2 -2
  262. package/dist/scripts/describe-workspace-apps.js.map +1 -1
  263. package/dist/secrets/crypto.d.ts +36 -21
  264. package/dist/secrets/crypto.d.ts.map +1 -1
  265. package/dist/secrets/crypto.js +134 -33
  266. package/dist/secrets/crypto.js.map +1 -1
  267. package/dist/secrets/storage.d.ts +6 -6
  268. package/dist/secrets/storage.d.ts.map +1 -1
  269. package/dist/secrets/storage.js +43 -26
  270. package/dist/secrets/storage.js.map +1 -1
  271. package/dist/server/agent-capabilities.js +1 -1
  272. package/dist/server/agent-capabilities.js.map +1 -1
  273. package/dist/server/agent-chat/action-filters-a2a.d.ts +17 -3
  274. package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
  275. package/dist/server/agent-chat/action-filters-a2a.js +94 -3
  276. package/dist/server/agent-chat/action-filters-a2a.js.map +1 -1
  277. package/dist/server/agent-chat/context-tools.d.ts.map +1 -1
  278. package/dist/server/agent-chat/context-tools.js +2 -0
  279. package/dist/server/agent-chat/context-tools.js.map +1 -1
  280. package/dist/server/agent-chat/plugin-options.d.ts +23 -0
  281. package/dist/server/agent-chat/plugin-options.d.ts.map +1 -1
  282. package/dist/server/agent-chat/plugin-options.js +4 -1
  283. package/dist/server/agent-chat/plugin-options.js.map +1 -1
  284. package/dist/server/agent-chat/prompt-resources.js +1 -1
  285. package/dist/server/agent-chat/prompt-resources.js.map +1 -1
  286. package/dist/server/agent-chat-plugin.d.ts +2 -1
  287. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  288. package/dist/server/agent-chat-plugin.js +79 -56
  289. package/dist/server/agent-chat-plugin.js.map +1 -1
  290. package/dist/server/realtime-token.d.ts +1 -1
  291. package/dist/templates/default/.agents/skills/secrets/SKILL.md +19 -7
  292. package/dist/templates/headless/.agents/skills/secrets/SKILL.md +19 -7
  293. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +18 -7
  294. package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +15 -14
  295. package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +19 -7
  296. package/dist/vite/client.d.ts.map +1 -1
  297. package/dist/vite/client.js +1 -0
  298. package/dist/vite/client.js.map +1 -1
  299. package/docs/content/agent-native-toolkit.mdx +13 -6
  300. package/docs/content/cloneable-saas.mdx +5 -5
  301. package/docs/content/creating-templates.mdx +9 -0
  302. package/docs/content/deployment.mdx +18 -12
  303. package/docs/content/doctor.mdx +8 -1
  304. package/docs/content/drop-in-agent.mdx +1 -1
  305. package/docs/content/extensions.mdx +18 -18
  306. package/docs/content/faq.mdx +4 -4
  307. package/docs/content/key-concepts.mdx +30 -21
  308. package/docs/content/security.mdx +2 -2
  309. package/docs/content/template-brain-developers.mdx +4 -1
  310. package/docs/content/template-mail-developers.mdx +4 -1
  311. package/docs/content/what-is-agent-native.mdx +6 -6
  312. package/package.json +3 -3
  313. package/src/a2a/client.ts +449 -66
  314. package/src/a2a/correlation.ts +31 -0
  315. package/src/a2a/invoke.ts +4 -2
  316. package/src/a2a/types.ts +4 -0
  317. package/src/action.ts +3 -0
  318. package/src/agent/action-continuation-guidance.ts +2 -1
  319. package/src/agent/engine/registry.ts +98 -6
  320. package/src/agent/production-agent.ts +151 -18
  321. package/src/agent/run-loop-with-resume.ts +190 -3
  322. package/src/agent/run-manager.ts +117 -41
  323. package/src/agent/thread-debug-history.ts +86 -0
  324. package/src/agent/types.ts +3 -1
  325. package/src/cli/create.ts +11 -1
  326. package/src/cli/templates-meta.ts +2 -2
  327. package/src/client/agent-chat-adapter.ts +91 -13
  328. package/src/client/resources/McpIntegrationDialog.tsx +11 -9
  329. package/src/client/sse-event-processor.ts +17 -3
  330. package/src/db/client.ts +57 -17
  331. package/src/guards/no-env-credentials.ts +2 -0
  332. package/src/integrations/adapters/slack.ts +8 -3
  333. package/src/localization/default-messages.ts +44 -0
  334. package/src/observability/traces.ts +78 -5
  335. package/src/scripts/call-agent.ts +294 -11
  336. package/src/scripts/describe-workspace-apps.ts +2 -2
  337. package/src/secrets/crypto.ts +156 -35
  338. package/src/secrets/storage.ts +64 -26
  339. package/src/server/agent-capabilities.ts +1 -1
  340. package/src/server/agent-chat/action-filters-a2a.ts +113 -7
  341. package/src/server/agent-chat/context-tools.ts +2 -0
  342. package/src/server/agent-chat/plugin-options.ts +34 -1
  343. package/src/server/agent-chat/prompt-resources.ts +1 -1
  344. package/src/server/agent-chat-plugin.ts +91 -59
  345. package/src/templates/default/.agents/skills/secrets/SKILL.md +19 -7
  346. package/src/templates/headless/.agents/skills/secrets/SKILL.md +19 -7
  347. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +18 -7
  348. package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +15 -14
  349. package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +19 -7
  350. package/src/vite/client.ts +1 -0
@@ -1,22 +1,87 @@
1
1
  import { createHash, randomUUID } from "node:crypto";
2
2
  import { parseA2AAgentActivityPart } from "../a2a/activity.js";
3
- import { A2ATaskTimeoutError, callAgent, shouldPreferGlobalA2ASecret, signA2AToken, } from "../a2a/client.js";
3
+ import { A2ATaskTimeoutError, MAX_A2A_CALLER_RESPONSE_CHARS, callAgent, shouldPreferGlobalA2ASecret, signA2AToken, } from "../a2a/client.js";
4
+ import { MAX_A2A_DELEGATION_HOPS } from "../a2a/correlation.js";
4
5
  import { invokeAgentAction } from "../a2a/invoke.js";
5
6
  import { formatLlmCredentialErrorMessage, isLlmCredentialError, } from "../agent/engine/credential-errors.js";
6
7
  import { A2A_CONTINUATION_QUEUED_MARKER } from "../integrations/a2a-continuation-marker.js";
8
+ import { trackingIdentityProperties } from "../observability/tracking-identity.js";
7
9
  import { getOrgDomain, getOrgA2ASecret } from "../org/context.js";
8
10
  import { findAgent, discoverAgents } from "../server/agent-discovery.js";
9
11
  import { getRequestUserEmail, getRequestOrgId, isIntegrationCallerRequest, getIntegrationRequestContext, } from "../server/request-context.js";
12
+ import { track } from "../tracking/registry.js";
10
13
  const DEFAULT_SERVERLESS_INTEGRATION_A2A_TIMEOUT_MS = 18_000;
11
14
  const NETLIFY_INTEGRATION_A2A_TIMEOUT_MS = 2_000;
12
15
  const INTEGRATION_A2A_TOKEN_TTL = "30m";
16
+ const A2A_INVOCATION_EVENT = "$a2a_invocation";
17
+ function trackA2AInvocation(args) {
18
+ try {
19
+ track(A2A_INVOCATION_EVENT, {
20
+ ...trackingIdentityProperties(),
21
+ source: "a2a_delegation",
22
+ invocation_id: args.invocationId,
23
+ caller_app: args.callerApp ?? "unknown",
24
+ target_app: args.targetApp,
25
+ mode: args.mode,
26
+ status: args.status,
27
+ duration_ms: Math.max(0, Date.now() - args.startedAt),
28
+ task_id: args.taskId,
29
+ terminal_code: args.terminalCode,
30
+ delegation_depth: args.correlation.delegationDepth,
31
+ parent_run_id: args.correlation.parentRunId,
32
+ parent_turn_id: args.correlation.parentTurnId,
33
+ }, { userId: getRequestUserEmail() });
34
+ }
35
+ catch {
36
+ // Tracking must never affect delegation.
37
+ }
38
+ }
13
39
  function buildDelegationCorrelation(context, selfAppId, invocationId) {
40
+ const self = normalizeAppHandle(selfAppId);
41
+ const inheritedVisited = Array.isArray(context?.visitedApps)
42
+ ? context.visitedApps.map(normalizeAppHandle).filter(Boolean)
43
+ : [];
44
+ const visitedApps = self
45
+ ? [...new Set([...inheritedVisited, self])]
46
+ : [...new Set(inheritedVisited)];
47
+ const inheritedDepth = Number.isInteger(context?.delegationDepth)
48
+ ? Math.max(0, Number(context?.delegationDepth))
49
+ : 0;
14
50
  return {
15
51
  ...(selfAppId?.trim() ? { callerApp: selfAppId.trim() } : {}),
16
52
  ...(context?.threadId ? { callerThreadId: context.threadId } : {}),
17
53
  ...(context?.runId ? { parentRunId: context.runId } : {}),
18
54
  ...(context?.turnId ? { parentTurnId: context.turnId } : {}),
19
55
  ...(invocationId ? { invocationId } : {}),
56
+ delegationDepth: Math.min(MAX_A2A_DELEGATION_HOPS, inheritedDepth + 1),
57
+ ...(visitedApps.length > 0 ? { visitedApps } : {}),
58
+ };
59
+ }
60
+ function normalizeAppHandle(value) {
61
+ return typeof value === "string"
62
+ ? value
63
+ .trim()
64
+ .toLowerCase()
65
+ .replace(/^agent-native-/, "")
66
+ : "";
67
+ }
68
+ function terminalTaskError(value) {
69
+ if (!value || typeof value !== "object")
70
+ return null;
71
+ const candidate = value;
72
+ if (candidate.name !== "A2ATaskTerminalError")
73
+ return null;
74
+ return {
75
+ state: String(candidate.state ?? "failed"),
76
+ ...(typeof candidate.taskId === "string"
77
+ ? { taskId: candidate.taskId }
78
+ : {}),
79
+ ...(typeof candidate.responseText === "string"
80
+ ? { responseText: candidate.responseText }
81
+ : {}),
82
+ ...(typeof candidate.errorCode === "string"
83
+ ? { errorCode: candidate.errorCode }
84
+ : {}),
20
85
  };
21
86
  }
22
87
  function buildMessageIdempotencyKey(originatingTurnId, target, exactMessage) {
@@ -114,7 +179,7 @@ function formatDownstreamLlmCredentialFailure(agentName, value) {
114
179
  : null;
115
180
  }
116
181
  export const tool = {
117
- description: "Call a DIFFERENT, separately-deployed app over A2A. When you know the exact exposed read-only action, pass action + input and omit message; this invokes it directly without starting the other app's model and is the fastest path for bounded data reads. Use message only for natural-language investigation, synthesis, mutations, or multi-step work that needs the other agent. NEVER use this to call your own app or perform actions you can do with your own tools. Using call-agent on yourself will fail and waste time. " +
182
+ description: "Ask a DIFFERENT, separately-deployed app's agent over A2A. Use message by default so the receiving specialist interprets the objective with its own instructions, skills, connected sources, data dictionary, and tools. The receiver owns provider, schema, query, join, and SQL decisions. Use action + input only for an exact, explicitly known, bounded read whose complete input schema is already known; never expose or call a direct action to work around slow or unreliable delegation, and never guess receiver-owned query logic. NEVER use this to call your own app or perform actions you can do with your own tools. Using call-agent on yourself will fail and waste time. " +
118
183
  'For brand-consistent generated media, the first-party Assets agent is available as agent="assets"; use it when another app needs generated heroes, diagrams, product shots, thumbnails, videos, or design imagery, unless the current app has its own generation action that already delegates there. ' +
119
184
  "IMPORTANT — handling the response: " +
120
185
  "(a) If it contains a URL or ID, copy it VERBATIM into your reply. Do not 'correct' or pluralize the path (e.g. /deck/ → /decks/), normalize casing, or change the slug — any edit breaks the link. " +
@@ -138,7 +203,7 @@ export const tool = {
138
203
  },
139
204
  action: {
140
205
  type: "string",
141
- description: "Exact read-only action exposed by the target app. Use with input and omit message/taskId to skip the downstream agent loop.",
206
+ description: "Optional exact read-only action for an explicitly known bounded operation. Prefer message when the target agent must interpret data, choose sources or tools, synthesize, mutate, or do multi-step work. Never guess the action schema or send receiver-owned SQL.",
142
207
  },
143
208
  input: {
144
209
  type: "object",
@@ -185,6 +250,13 @@ export async function run(args, context, selfAppId) {
185
250
  if (selfAppId && agentIdOrName.toLowerCase() === selfAppId.toLowerCase()) {
186
251
  return `Error: You cannot use call-agent to call yourself (${selfAppId}). Use your own registered actions/tools instead. call-agent is only for communicating with OTHER separately-deployed apps.`;
187
252
  }
253
+ const inheritedDepth = Number.isInteger(context?.delegationDepth)
254
+ ? Math.max(0, Number(context?.delegationDepth))
255
+ : 0;
256
+ if (!taskId && inheritedDepth >= MAX_A2A_DELEGATION_HOPS) {
257
+ return (`Error: Cross-app delegation stopped at the ${MAX_A2A_DELEGATION_HOPS}-hop limit. ` +
258
+ "Finish with the results already collected instead of starting another agent.");
259
+ }
188
260
  const agent = await findAgent(agentIdOrName, selfAppId);
189
261
  if (!agent) {
190
262
  const available = (await discoverAgents(selfAppId))
@@ -192,13 +264,35 @@ export async function run(args, context, selfAppId) {
192
264
  .join(", ");
193
265
  return `Error: Agent "${agentIdOrName}" not found. Available agents: ${available || "(none)"}`;
194
266
  }
267
+ if (!taskId) {
268
+ const visited = new Set((context?.visitedApps ?? []).map(normalizeAppHandle).filter(Boolean));
269
+ const self = normalizeAppHandle(selfAppId);
270
+ if (self)
271
+ visited.add(self);
272
+ const targetHandles = [
273
+ normalizeAppHandle(agent.id),
274
+ normalizeAppHandle(agent.name),
275
+ normalizeAppHandle(agentIdOrName),
276
+ ].filter(Boolean);
277
+ const repeated = targetHandles.find((handle) => visited.has(handle));
278
+ if (repeated) {
279
+ return (`Error: Cross-app delegation cycle blocked before calling ${agent.name}. ` +
280
+ `The request already visited ${[...visited].join(" -> ")}.`);
281
+ }
282
+ }
195
283
  const correlation = buildDelegationCorrelation(context, selfAppId);
196
284
  const idempotencyKey = message && !taskId
197
285
  ? buildMessageIdempotencyKey(context?.turnId, agent.url, message)
198
286
  : undefined;
287
+ const targetApp = normalizeAppHandle(agent.id) ||
288
+ normalizeAppHandle(agent.name) ||
289
+ normalizeAppHandle(agentIdOrName) ||
290
+ "unknown";
199
291
  if (action) {
200
292
  const agentCallId = randomUUID();
201
293
  const startedAt = Date.now();
294
+ let terminalStatus = "done";
295
+ let terminalCode;
202
296
  if (context?.send) {
203
297
  context.send({
204
298
  type: "agent_call",
@@ -209,6 +303,10 @@ export async function run(args, context, selfAppId) {
209
303
  }
210
304
  try {
211
305
  const output = await invokeReadOnlyAppAction(agent, action, input, buildDelegationCorrelation(context, selfAppId, randomUUID()));
306
+ if (/^Error\b/i.test(output)) {
307
+ terminalStatus = "error";
308
+ terminalCode = "direct_action_failed";
309
+ }
212
310
  if (context?.send && output) {
213
311
  context.send({
214
312
  type: "agent_call_text",
@@ -219,12 +317,27 @@ export async function run(args, context, selfAppId) {
219
317
  }
220
318
  return output;
221
319
  }
320
+ catch (error) {
321
+ terminalStatus = "error";
322
+ terminalCode = "direct_action_failed";
323
+ throw error;
324
+ }
222
325
  finally {
326
+ trackA2AInvocation({
327
+ invocationId: agentCallId,
328
+ callerApp: selfAppId,
329
+ targetApp,
330
+ mode: "direct_action",
331
+ status: terminalStatus === "done" ? "success" : "error",
332
+ startedAt,
333
+ terminalCode,
334
+ correlation,
335
+ });
223
336
  if (context?.send) {
224
337
  context.send({
225
338
  type: "agent_call",
226
339
  agent: agent.name,
227
- status: "done",
340
+ status: terminalStatus,
228
341
  agentCallId,
229
342
  durationMs: Date.now() - startedAt,
230
343
  });
@@ -240,10 +353,17 @@ export async function run(args, context, selfAppId) {
240
353
  const messageWithHint = taskId
241
354
  ? ""
242
355
  : `${message}${integrationSourceContextHint(sourceContext)}\n\n` +
243
- `[Note: this request comes from another app via A2A. The caller cannot see your local UI, deck list, or navigation — only the literal text you put in your reply. ` +
356
+ `<a2a-caller-hint>\n` +
357
+ `This request comes from another app via A2A. The caller cannot see your local UI, deck list, or navigation — only the literal text you put in your reply. ` +
244
358
  `If you create or reference a deck/document/design/dashboard, include its FULLY-QUALIFIED URL (e.g. ${agent.url}/deck/<id>) in your reply, not a relative path. ` +
245
359
  `Use only artifact IDs and URL paths returned by successful actions — never invent slugs, IDs, or hosts. ` +
246
- `Return a concise caller-ready synthesis rather than raw tool output or full transcripts; preserve source counts, IDs, short supporting quotes, and URLs needed to substantiate the answer.]`;
360
+ `Return a concise caller-ready synthesis rather than raw tool output or full transcripts; preserve source counts, IDs, short supporting quotes, and URLs needed to substantiate the answer.\n` +
361
+ `</a2a-caller-hint>`;
362
+ const invocationId = randomUUID();
363
+ const invocationStartedAt = Date.now();
364
+ let invocationStatus = "error";
365
+ let invocationTaskId = taskId || undefined;
366
+ let invocationTerminalCode;
247
367
  try {
248
368
  // If we have a send context, use streaming so the UI shows progressive text
249
369
  if (context?.send) {
@@ -297,11 +417,15 @@ export async function run(args, context, selfAppId) {
297
417
  let responseText = "";
298
418
  let lastSentLength = 0;
299
419
  const agentCallId = randomUUID();
420
+ let terminalStatus = "done";
300
421
  const existingContinuationText = taskId
301
422
  ? null
302
423
  : await formatExistingIntegrationContinuationIfRetry(agent, message);
303
- if (existingContinuationText)
424
+ if (existingContinuationText) {
425
+ invocationStatus = "pending";
426
+ invocationTerminalCode = "existing_continuation";
304
427
  return existingContinuationText;
428
+ }
305
429
  context.send({
306
430
  type: "agent_call",
307
431
  agent: agent.name,
@@ -457,6 +581,9 @@ export async function run(args, context, selfAppId) {
457
581
  catch (pollErr) {
458
582
  const timeoutTaskId = getA2ATaskTimeoutTaskId(pollErr);
459
583
  if (timeoutTaskId) {
584
+ terminalStatus = "pending";
585
+ invocationTaskId = timeoutTaskId;
586
+ invocationTerminalCode = "timeout_pending";
460
587
  const queued = await enqueueIntegrationContinuationIfPossible(timeoutTaskId, agent, message, callerEmail);
461
588
  if (queued) {
462
589
  responseText =
@@ -480,21 +607,60 @@ export async function run(args, context, selfAppId) {
480
607
  }
481
608
  }
482
609
  }
610
+ else if (terminalTaskError(pollErr)?.state === "input-required") {
611
+ terminalStatus = "pending";
612
+ const terminal = terminalTaskError(pollErr);
613
+ invocationTaskId = terminal.taskId;
614
+ invocationTerminalCode = terminal.errorCode ?? "input_required";
615
+ responseText = formatInputRequiredWaitInstruction(agent.name, terminal, agentIdOrName);
616
+ }
617
+ else if (terminalTaskError(pollErr)) {
618
+ terminalStatus = "error";
619
+ const terminal = terminalTaskError(pollErr);
620
+ invocationTaskId = terminal.taskId;
621
+ invocationTerminalCode = terminal.errorCode ?? terminal.state;
622
+ const detail = expandRelativeUrls(terminal.responseText ?? pollErr?.message ?? "unknown failure", agent.url);
623
+ responseText =
624
+ `Error: The ${agent.name} agent ended ${terminal.state}` +
625
+ (terminal.errorCode ? ` (${terminal.errorCode})` : "") +
626
+ (terminal.taskId ? ` [taskId: ${terminal.taskId}]` : "") +
627
+ (detail ? `: ${detail}` : "");
628
+ }
483
629
  else {
630
+ terminalStatus = "error";
631
+ invocationTerminalCode = "call_failed";
484
632
  const reason = pollErr?.message ?? "unknown error";
485
633
  responseText =
486
634
  formatDownstreamLlmCredentialFailure(agent.name, pollErr) ??
487
- `The ${agent.name} agent is taking longer than expected and didn't reply in time. (${reason})`;
635
+ `Error: The ${agent.name} agent call failed. (${reason})`;
488
636
  }
489
637
  }
638
+ if (!responseText && terminalStatus === "done") {
639
+ terminalStatus = "error";
640
+ invocationTerminalCode = "empty_agent_response";
641
+ }
642
+ if (responseText.length > MAX_A2A_CALLER_RESPONSE_CHARS) {
643
+ terminalStatus = "error";
644
+ invocationTerminalCode = "a2a_response_too_large";
645
+ responseText =
646
+ `Error: The ${agent.name} agent returned more data than the caller can safely consume. ` +
647
+ "Ask it for a concise synthesis or a retrievable artifact instead.";
648
+ }
649
+ invocationStatus =
650
+ terminalStatus === "done"
651
+ ? "success"
652
+ : terminalStatus === "pending"
653
+ ? "pending"
654
+ : "error";
490
655
  context.send({
491
656
  type: "agent_call",
492
657
  agent: agent.name,
493
- status: "done",
658
+ status: terminalStatus,
494
659
  agentCallId,
660
+ ...(invocationTaskId ? { taskId: invocationTaskId } : {}),
495
661
  durationMs: Date.now() - callStartedAt,
496
662
  });
497
- return responseText || "(empty response)";
663
+ return (responseText || `Error: The ${agent.name} agent returned no result.`);
498
664
  }
499
665
  // No context — use the async + poll call so we don't get cut off at the
500
666
  // serverless gateway's ~30s timeout. callAgent defaults to async:true.
@@ -525,24 +691,73 @@ export async function run(args, context, selfAppId) {
525
691
  returnRecoverableArtifactsOnTimeout: false,
526
692
  });
527
693
  const sanitized = formatDownstreamLlmCredentialFailure(agent.name, response) ?? response;
528
- return expandRelativeUrls(sanitized, agent.url) || "(empty response)";
694
+ const expanded = expandRelativeUrls(sanitized, agent.url);
695
+ if (!expanded) {
696
+ invocationStatus = "error";
697
+ invocationTerminalCode = "empty_agent_response";
698
+ return "Error: The remote agent returned no result.";
699
+ }
700
+ if (expanded.length > MAX_A2A_CALLER_RESPONSE_CHARS) {
701
+ invocationStatus = "error";
702
+ invocationTerminalCode = "a2a_response_too_large";
703
+ return (`Error: The ${agent.name} agent returned more data than the caller can safely consume. ` +
704
+ "Ask it for a concise synthesis or a retrievable artifact instead.");
705
+ }
706
+ invocationStatus = "success";
707
+ return expanded;
529
708
  }
530
709
  catch (err) {
531
710
  const msg = err?.message ?? String(err);
532
711
  const credentialMessage = formatDownstreamLlmCredentialFailure(agent.name, err);
533
712
  if (credentialMessage)
534
713
  return credentialMessage;
714
+ const terminal = terminalTaskError(err);
715
+ if (terminal?.state === "input-required") {
716
+ invocationStatus = "pending";
717
+ invocationTaskId = terminal.taskId;
718
+ invocationTerminalCode = terminal.errorCode ?? "input_required";
719
+ return formatInputRequiredWaitInstruction(agent.name, terminal, agentIdOrName);
720
+ }
721
+ if (terminal) {
722
+ invocationStatus = "error";
723
+ invocationTaskId = terminal.taskId;
724
+ invocationTerminalCode = terminal.errorCode ?? terminal.state;
725
+ return (`Error calling ${agent.name}: remote task ${terminal.state}` +
726
+ (terminal.errorCode ? ` (${terminal.errorCode})` : "") +
727
+ (terminal.taskId ? ` [taskId: ${terminal.taskId}]` : "") +
728
+ (terminal.responseText ? `: ${terminal.responseText}` : ""));
729
+ }
535
730
  const timeoutTaskId = getA2ATaskTimeoutTaskId(err);
536
731
  if (timeoutTaskId) {
732
+ invocationStatus = "pending";
733
+ invocationTaskId = timeoutTaskId;
734
+ invocationTerminalCode = "timeout_pending";
537
735
  return formatExistingTaskWaitInstruction(agent.name, timeoutTaskId, agentIdOrName);
538
736
  }
539
737
  // Friendlier message for the common timeout case so the calling agent can
540
738
  // decide whether to give up or retry.
541
739
  if (/timeout|did not complete|Inactivity|504/i.test(msg)) {
542
- return `The ${agent.name} agent is taking longer than expected. Please try again, ask a simpler question, or open the ${agent.name} app directly.`;
740
+ invocationStatus = "error";
741
+ invocationTerminalCode = "timeout_without_task";
742
+ return `Error calling ${agent.name}: the remote request timed out before a task id could be recovered.`;
543
743
  }
744
+ invocationStatus = "error";
745
+ invocationTerminalCode = "call_failed";
544
746
  return `Error calling ${agent.name}: ${msg}`;
545
747
  }
748
+ finally {
749
+ trackA2AInvocation({
750
+ invocationId,
751
+ callerApp: selfAppId,
752
+ targetApp,
753
+ mode: taskId ? "task_poll" : "message",
754
+ status: invocationStatus,
755
+ startedAt: invocationStartedAt,
756
+ taskId: invocationTaskId,
757
+ terminalCode: invocationTerminalCode,
758
+ correlation,
759
+ });
760
+ }
546
761
  }
547
762
  async function invokeReadOnlyAppAction(agent, action, input, correlation) {
548
763
  const callerEmail = getRequestUserEmail();
@@ -588,6 +803,16 @@ function formatExistingTaskWaitInstruction(agentName, taskId, agentIdOrName) {
588
803
  `Do not send ${agentName} a new check-in or follow-up message; that would start duplicate work. ` +
589
804
  `Call call-agent again with agent="${agentIdOrName}" and taskId="${taskId}" (omit message) to continue waiting for this same task.`);
590
805
  }
806
+ function formatInputRequiredWaitInstruction(agentName, terminal, agentIdOrName) {
807
+ const detail = terminal.responseText?.trim();
808
+ if (!terminal.taskId) {
809
+ return ((detail ? `${detail}\n\n` : "") +
810
+ `Pending: The ${agentName} agent needs input before it can continue.`);
811
+ }
812
+ return ((detail ? `${detail}\n\n` : "") +
813
+ `The ${agentName} agent is waiting for input under taskId "${terminal.taskId}". ` +
814
+ `After providing or approving the requested input, call call-agent with agent="${agentIdOrName}" and taskId="${terminal.taskId}" (omit message) to continue this same task. Do not start a new message for this work.`);
815
+ }
591
816
  async function enqueueIntegrationContinuationIfPossible(taskId, agent, message, ownerEmail) {
592
817
  const integration = getIntegrationRequestContext();
593
818
  if (!integration || !ownerEmail)