@agent-native/core 0.108.0 → 0.109.1

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 (368) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +25 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/a2a/client.ts +162 -17
  5. package/corpus/core/src/a2a/correlation.ts +50 -0
  6. package/corpus/core/src/a2a/handlers.ts +200 -14
  7. package/corpus/core/src/a2a/index.ts +7 -1
  8. package/corpus/core/src/a2a/invoke.ts +77 -1
  9. package/corpus/core/src/a2a/server.ts +13 -1
  10. package/corpus/core/src/a2a/task-store.ts +146 -6
  11. package/corpus/core/src/a2a/types.ts +32 -0
  12. package/corpus/core/src/action.ts +5 -2
  13. package/corpus/core/src/agent/production-agent.ts +33 -4
  14. package/corpus/core/src/client/AssistantChat.tsx +648 -603
  15. package/corpus/core/src/client/MultiTabAssistantChat.tsx +31 -4
  16. package/corpus/core/src/client/agent-chat-adapter.ts +23 -37
  17. package/corpus/core/src/client/agent-sidebar-state.ts +4 -0
  18. package/corpus/core/src/client/analytics.ts +84 -0
  19. package/corpus/core/src/client/chat/message-components.tsx +94 -22
  20. package/corpus/core/src/client/chat/tool-call-display.tsx +170 -47
  21. package/corpus/core/src/client/chat/use-agent-chat-lifecycle-tracking.ts +74 -0
  22. package/corpus/core/src/client/chat-thread-url.ts +11 -0
  23. package/corpus/core/src/client/error-capture.ts +12 -0
  24. package/corpus/core/src/client/extensions/ExtensionSlot.tsx +37 -1
  25. package/corpus/core/src/client/index.ts +2 -0
  26. package/corpus/core/src/client/route-chunk-recovery.ts +20 -8
  27. package/corpus/core/src/client/session-replay.ts +31 -0
  28. package/corpus/core/src/client/use-run-stuck-detection.ts +27 -1
  29. package/corpus/core/src/db/client.ts +55 -0
  30. package/corpus/core/src/extensions/actions.ts +2 -14
  31. package/corpus/core/src/extensions/store.ts +1 -1
  32. package/corpus/core/src/localization/default-messages.ts +3 -0
  33. package/corpus/core/src/mcp/build-server.ts +2 -2
  34. package/corpus/core/src/observability/traces.ts +172 -19
  35. package/corpus/core/src/progress/actions.ts +4 -2
  36. package/corpus/core/src/provider-api/index.ts +205 -105
  37. package/corpus/core/src/scripts/call-agent.ts +190 -19
  38. package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +112 -25
  39. package/corpus/core/src/server/agent-chat-plugin.ts +136 -4
  40. package/corpus/core/src/styles/agent-conversation.css +7 -0
  41. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +20 -0
  42. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +20 -0
  43. package/corpus/core/src/templates/default/app/i18n/en-US.ts +20 -0
  44. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +20 -0
  45. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +21 -0
  46. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +19 -0
  47. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +20 -0
  48. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +19 -0
  49. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +20 -0
  50. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +19 -0
  51. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +19 -0
  52. package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +49 -0
  53. package/corpus/core/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  54. package/corpus/core/src/templates/workspace-core/.agents/skills/observability/SKILL.md +7 -1
  55. package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  56. package/corpus/core/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -1
  57. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +29 -10
  58. package/corpus/templates/analytics/.agents/skills/gong/SKILL.md +54 -23
  59. package/corpus/templates/analytics/.builder/skills/apollo/SKILL.md +19 -41
  60. package/corpus/templates/analytics/.builder/skills/commonroom/SKILL.md +20 -35
  61. package/corpus/templates/analytics/.builder/skills/github/SKILL.md +23 -67
  62. package/corpus/templates/analytics/.builder/skills/pylon/SKILL.md +25 -43
  63. package/corpus/templates/analytics/AGENTS.md +22 -13
  64. package/corpus/templates/analytics/actions/account-deep-dive.ts +1 -0
  65. package/corpus/templates/analytics/actions/configure-gong-native-insights.ts +29 -0
  66. package/corpus/templates/analytics/actions/content-calendar-schema.ts +8 -4
  67. package/corpus/templates/analytics/actions/content-calendar.ts +12 -4
  68. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +2 -1
  69. package/corpus/templates/analytics/actions/gong-calls.ts +113 -22
  70. package/corpus/templates/analytics/actions/gong-native-insights.ts +166 -0
  71. package/corpus/templates/analytics/actions/hubspot-deals.ts +190 -46
  72. package/corpus/templates/analytics/actions/pylon-issues.ts +123 -0
  73. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +1 -1
  74. package/corpus/templates/analytics/actions/slack-messages.ts +179 -27
  75. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +48 -152
  76. package/corpus/templates/analytics/app/components/ui/chart.tsx +1 -1
  77. package/corpus/templates/analytics/app/hooks/use-chart-tooltip-flip.ts +21 -6
  78. package/corpus/templates/analytics/app/i18n/zh-TW.ts +13 -0
  79. package/corpus/templates/analytics/app/i18n-data.ts +134 -0
  80. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +181 -30
  81. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +6 -0
  82. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +4 -3
  83. package/corpus/templates/analytics/changelog/2026-07-17-analytics-now-includes-a-default-alert-for-spikes-in-stuck-agent-chats.md +6 -0
  84. package/corpus/templates/analytics/changelog/2026-07-17-dashboard-editors-can-add-shared-extensions-or-opt-into-per-.md +6 -0
  85. package/corpus/templates/analytics/changelog/2026-07-17-dashboard-extensions-show-a-loading-skeleton.md +6 -0
  86. package/corpus/templates/analytics/changelog/2026-07-17-errors-now-group-repeat-failures-consistently-and-keep-priva.md +6 -0
  87. package/corpus/templates/analytics/changelog/2026-07-17-gong-transcript-reviews-now-batch-bounded-call-windows-for-f.md +6 -0
  88. package/corpus/templates/analytics/changelog/2026-07-17-hubspot-deal-filters-now-run-in-hubspot-before-paging-result.md +6 -0
  89. package/corpus/templates/analytics/changelog/2026-07-17-notion-content-calendars-now-discover-the-matching-database-.md +6 -0
  90. package/corpus/templates/analytics/changelog/2026-07-17-pylon-dashboard-reads-now-use-the-paginated-issue-search-api.md +6 -0
  91. package/corpus/templates/analytics/changelog/2026-07-17-slack-reads-no-longer-join-channels-and-report-pagination-coverage.md +6 -0
  92. package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +23 -14
  93. package/corpus/templates/analytics/docs/schemas/tracked-events.md +5 -1
  94. package/corpus/templates/analytics/server/handlers/notion.ts +14 -3
  95. package/corpus/templates/analytics/server/handlers/slack.ts +182 -29
  96. package/corpus/templates/analytics/server/jobs/analytics-alerts.ts +3 -3
  97. package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +2 -6
  98. package/corpus/templates/analytics/server/lib/analytics-alerts.ts +209 -87
  99. package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +6 -2
  100. package/corpus/templates/analytics/server/lib/error-capture.ts +75 -8
  101. package/corpus/templates/analytics/server/lib/gong-native-policy.ts +72 -0
  102. package/corpus/templates/analytics/server/lib/gong.ts +54 -66
  103. package/corpus/templates/analytics/server/lib/hubspot.ts +40 -3
  104. package/corpus/templates/analytics/server/lib/notion.ts +83 -8
  105. package/corpus/templates/analytics/server/lib/real-data-actions.ts +4 -0
  106. package/corpus/templates/analytics/server/lib/slack.ts +242 -90
  107. package/corpus/templates/analytics/server/plugins/agent-chat.ts +3 -3
  108. package/corpus/templates/analytics/server/routes/api/pylon/accounts.get.ts +42 -1
  109. package/corpus/templates/analytics/server/routes/api/pylon/issues.get.ts +71 -1
  110. package/corpus/templates/analytics/server/routes/api/test-connection.post.ts +44 -4
  111. package/corpus/templates/clips/actions/finalize-recording.ts +541 -62
  112. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +19 -1
  113. package/corpus/templates/clips/app/components/library/create-folder-dialog.tsx +123 -0
  114. package/corpus/templates/clips/app/components/library/library-grid.tsx +42 -4
  115. package/corpus/templates/clips/app/components/library/recording-card.tsx +30 -0
  116. package/corpus/templates/clips/app/components/player/playback-comment-overlay.tsx +17 -2
  117. package/corpus/templates/clips/app/components/player/video-player.tsx +14 -2
  118. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +2 -2
  119. package/corpus/templates/clips/app/entry.client.tsx +6 -1
  120. package/corpus/templates/clips/app/i18n/ar-SA.ts +12 -1
  121. package/corpus/templates/clips/app/i18n/de-DE.ts +12 -1
  122. package/corpus/templates/clips/app/i18n/en-US.ts +12 -1
  123. package/corpus/templates/clips/app/i18n/es-ES.ts +11 -1
  124. package/corpus/templates/clips/app/i18n/fr-FR.ts +11 -1
  125. package/corpus/templates/clips/app/i18n/hi-IN.ts +10 -1
  126. package/corpus/templates/clips/app/i18n/ja-JP.ts +12 -1
  127. package/corpus/templates/clips/app/i18n/ko-KR.ts +11 -1
  128. package/corpus/templates/clips/app/i18n/pt-BR.ts +11 -1
  129. package/corpus/templates/clips/app/i18n/zh-CN.ts +11 -1
  130. package/corpus/templates/clips/app/i18n/zh-TW.ts +11 -1
  131. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +72 -1
  132. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +1 -1
  133. package/corpus/templates/clips/app/routes/record.tsx +3 -3
  134. package/corpus/templates/clips/app/routes/share.$shareId.tsx +6 -3
  135. package/corpus/templates/clips/changelog/2026-07-17-choose-which-workspace-receives-new-clips-recordings-and-des.md +6 -0
  136. package/corpus/templates/clips/changelog/2026-07-17-clips-now-retries-storage-verification-in-the-background-ins.md +6 -0
  137. package/corpus/templates/clips/changelog/2026-07-17-create-folders-directly-from-the-move-menu.md +6 -0
  138. package/corpus/templates/clips/changelog/2026-07-17-failed-desktop-uploads-now-offer-a-direct-way-to-reopen-clip.md +6 -0
  139. package/corpus/templates/clips/changelog/2026-07-17-fixed-broken-thumbnail-icons-appearing-over-playable-clip-em.md +6 -0
  140. package/corpus/templates/clips/changelog/2026-07-17-playback-comments-stay-readable-at-faster-playback-speeds.md +6 -0
  141. package/corpus/templates/clips/chrome-extension/src/finalize-recovery.ts +3 -0
  142. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +3 -3
  143. package/corpus/templates/clips/desktop/src/app.tsx +19 -7
  144. package/corpus/templates/clips/desktop/src/lib/recorder.ts +111 -13
  145. package/corpus/templates/clips/desktop/src/lib/upload-verification.ts +16 -7
  146. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +2 -4
  147. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/live_upload.rs +32 -15
  148. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +45 -18
  149. package/corpus/templates/clips/server/jobs/media-verification.ts +130 -0
  150. package/corpus/templates/clips/server/lib/builder-media-compression.ts +15 -0
  151. package/corpus/templates/clips/server/lib/media-verification-state.ts +38 -0
  152. package/corpus/templates/clips/server/lib/player-thumbnail-url.ts +31 -0
  153. package/corpus/templates/clips/server/lib/post-finalize-dispatch.ts +10 -3
  154. package/corpus/templates/clips/server/plugins/auth.ts +5 -5
  155. package/corpus/templates/clips/server/plugins/calendar-jobs.ts +2 -0
  156. package/corpus/templates/clips/server/routes/api/_agent-native-background/post-finalize-worker.post.ts +12 -2
  157. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +6 -1
  158. package/corpus/templates/clips/server/routes/api/thumbnail/[recordingId].get.ts +340 -0
  159. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +24 -7
  160. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +91 -7
  161. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/status.get.ts +14 -0
  162. package/corpus/templates/clips/shared/finalize-recovery.ts +61 -2
  163. package/corpus/templates/clips/shared/share-meta.ts +1 -1
  164. package/corpus/templates/content/app/entry.client.tsx +6 -1
  165. package/corpus/templates/dispatch/AGENTS.md +5 -0
  166. package/corpus/templates/dispatch/changelog/2026-07-17-apps-page-links-to-other-available-apps.md +6 -0
  167. package/corpus/templates/dispatch/changelog/2026-07-17-curated-template-remixes.md +6 -0
  168. package/corpus/templates/mail/app/entry.client.tsx +6 -1
  169. package/corpus/templates/slides/.agents/skills/slide-images/SKILL.md +11 -7
  170. package/corpus/templates/slides/.env.example +0 -1
  171. package/corpus/templates/slides/AGENTS.md +4 -0
  172. package/corpus/templates/slides/DEVELOPING.md +2 -2
  173. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +1 -1
  174. package/corpus/templates/slides/actions/logo-config.ts +6 -7
  175. package/corpus/templates/slides/actions/search-images.ts +11 -39
  176. package/corpus/templates/slides/actions/search-logos.ts +5 -52
  177. package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +1 -1
  178. package/corpus/templates/slides/app/components/editor/LogoSearchPanel.tsx +16 -26
  179. package/corpus/templates/slides/app/entry.client.tsx +6 -1
  180. package/corpus/templates/slides/server/lib/media-search-providers.ts +216 -0
  181. package/corpus/templates/slides/server/register-secrets.ts +30 -0
  182. package/dist/a2a/client.d.ts +47 -1
  183. package/dist/a2a/client.d.ts.map +1 -1
  184. package/dist/a2a/client.js +94 -12
  185. package/dist/a2a/client.js.map +1 -1
  186. package/dist/a2a/correlation.d.ts +10 -0
  187. package/dist/a2a/correlation.d.ts.map +1 -0
  188. package/dist/a2a/correlation.js +40 -0
  189. package/dist/a2a/correlation.js.map +1 -0
  190. package/dist/a2a/handlers.d.ts.map +1 -1
  191. package/dist/a2a/handlers.js +147 -15
  192. package/dist/a2a/handlers.js.map +1 -1
  193. package/dist/a2a/index.d.ts +4 -4
  194. package/dist/a2a/index.d.ts.map +1 -1
  195. package/dist/a2a/index.js +2 -2
  196. package/dist/a2a/index.js.map +1 -1
  197. package/dist/a2a/invoke.d.ts +29 -2
  198. package/dist/a2a/invoke.d.ts.map +1 -1
  199. package/dist/a2a/invoke.js +33 -1
  200. package/dist/a2a/invoke.js.map +1 -1
  201. package/dist/a2a/server.d.ts.map +1 -1
  202. package/dist/a2a/server.js +14 -1
  203. package/dist/a2a/server.js.map +1 -1
  204. package/dist/a2a/task-store.d.ts +12 -1
  205. package/dist/a2a/task-store.d.ts.map +1 -1
  206. package/dist/a2a/task-store.js +96 -6
  207. package/dist/a2a/task-store.js.map +1 -1
  208. package/dist/a2a/types.d.ts +27 -0
  209. package/dist/a2a/types.d.ts.map +1 -1
  210. package/dist/a2a/types.js.map +1 -1
  211. package/dist/action.d.ts +5 -2
  212. package/dist/action.d.ts.map +1 -1
  213. package/dist/action.js.map +1 -1
  214. package/dist/agent/production-agent.d.ts +14 -0
  215. package/dist/agent/production-agent.d.ts.map +1 -1
  216. package/dist/agent/production-agent.js +19 -3
  217. package/dist/agent/production-agent.js.map +1 -1
  218. package/dist/client/AssistantChat.d.ts +14 -1
  219. package/dist/client/AssistantChat.d.ts.map +1 -1
  220. package/dist/client/AssistantChat.js +158 -136
  221. package/dist/client/AssistantChat.js.map +1 -1
  222. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  223. package/dist/client/MultiTabAssistantChat.js +27 -4
  224. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  225. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  226. package/dist/client/agent-chat-adapter.js +21 -39
  227. package/dist/client/agent-chat-adapter.js.map +1 -1
  228. package/dist/client/agent-sidebar-state.d.ts +1 -0
  229. package/dist/client/agent-sidebar-state.d.ts.map +1 -1
  230. package/dist/client/agent-sidebar-state.js +4 -0
  231. package/dist/client/agent-sidebar-state.js.map +1 -1
  232. package/dist/client/analytics.d.ts +14 -0
  233. package/dist/client/analytics.d.ts.map +1 -1
  234. package/dist/client/analytics.js +67 -0
  235. package/dist/client/analytics.js.map +1 -1
  236. package/dist/client/chat/message-components.d.ts +8 -0
  237. package/dist/client/chat/message-components.d.ts.map +1 -1
  238. package/dist/client/chat/message-components.js +62 -19
  239. package/dist/client/chat/message-components.js.map +1 -1
  240. package/dist/client/chat/tool-call-display.d.ts +6 -0
  241. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  242. package/dist/client/chat/tool-call-display.js +83 -14
  243. package/dist/client/chat/tool-call-display.js.map +1 -1
  244. package/dist/client/chat/use-agent-chat-lifecycle-tracking.d.ts +8 -0
  245. package/dist/client/chat/use-agent-chat-lifecycle-tracking.d.ts.map +1 -0
  246. package/dist/client/chat/use-agent-chat-lifecycle-tracking.js +51 -0
  247. package/dist/client/chat/use-agent-chat-lifecycle-tracking.js.map +1 -0
  248. package/dist/client/chat-thread-url.d.ts +2 -0
  249. package/dist/client/chat-thread-url.d.ts.map +1 -0
  250. package/dist/client/chat-thread-url.js +12 -0
  251. package/dist/client/chat-thread-url.js.map +1 -0
  252. package/dist/client/error-capture.d.ts.map +1 -1
  253. package/dist/client/error-capture.js +7 -0
  254. package/dist/client/error-capture.js.map +1 -1
  255. package/dist/client/extensions/ExtensionSlot.d.ts +3 -1
  256. package/dist/client/extensions/ExtensionSlot.d.ts.map +1 -1
  257. package/dist/client/extensions/ExtensionSlot.js +28 -3
  258. package/dist/client/extensions/ExtensionSlot.js.map +1 -1
  259. package/dist/client/index.d.ts +1 -1
  260. package/dist/client/index.d.ts.map +1 -1
  261. package/dist/client/index.js +1 -1
  262. package/dist/client/index.js.map +1 -1
  263. package/dist/client/route-chunk-recovery.d.ts.map +1 -1
  264. package/dist/client/route-chunk-recovery.js +14 -9
  265. package/dist/client/route-chunk-recovery.js.map +1 -1
  266. package/dist/client/session-replay.d.ts +15 -0
  267. package/dist/client/session-replay.d.ts.map +1 -1
  268. package/dist/client/session-replay.js +20 -0
  269. package/dist/client/session-replay.js.map +1 -1
  270. package/dist/client/use-run-stuck-detection.d.ts.map +1 -1
  271. package/dist/client/use-run-stuck-detection.js +25 -1
  272. package/dist/client/use-run-stuck-detection.js.map +1 -1
  273. package/dist/db/client.d.ts +7 -0
  274. package/dist/db/client.d.ts.map +1 -1
  275. package/dist/db/client.js +33 -0
  276. package/dist/db/client.js.map +1 -1
  277. package/dist/extensions/actions.d.ts.map +1 -1
  278. package/dist/extensions/actions.js +2 -10
  279. package/dist/extensions/actions.js.map +1 -1
  280. package/dist/extensions/store.js +1 -1
  281. package/dist/extensions/store.js.map +1 -1
  282. package/dist/localization/default-messages.d.ts +3 -0
  283. package/dist/localization/default-messages.d.ts.map +1 -1
  284. package/dist/localization/default-messages.js +3 -0
  285. package/dist/localization/default-messages.js.map +1 -1
  286. package/dist/mcp/build-server.d.ts +2 -0
  287. package/dist/mcp/build-server.d.ts.map +1 -1
  288. package/dist/mcp/build-server.js +2 -2
  289. package/dist/mcp/build-server.js.map +1 -1
  290. package/dist/notifications/routes.d.ts +2 -2
  291. package/dist/observability/routes.d.ts +5 -5
  292. package/dist/observability/traces.d.ts +9 -0
  293. package/dist/observability/traces.d.ts.map +1 -1
  294. package/dist/observability/traces.js +137 -19
  295. package/dist/observability/traces.js.map +1 -1
  296. package/dist/progress/actions.d.ts.map +1 -1
  297. package/dist/progress/actions.js +3 -2
  298. package/dist/progress/actions.js.map +1 -1
  299. package/dist/progress/routes.d.ts +1 -1
  300. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  301. package/dist/provider-api/index.d.ts.map +1 -1
  302. package/dist/provider-api/index.js +91 -8
  303. package/dist/provider-api/index.js.map +1 -1
  304. package/dist/scripts/call-agent.d.ts.map +1 -1
  305. package/dist/scripts/call-agent.js +140 -17
  306. package/dist/scripts/call-agent.js.map +1 -1
  307. package/dist/secrets/routes.d.ts +9 -9
  308. package/dist/server/agent-chat/action-filters-a2a.d.ts +24 -2
  309. package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
  310. package/dist/server/agent-chat/action-filters-a2a.js +62 -7
  311. package/dist/server/agent-chat/action-filters-a2a.js.map +1 -1
  312. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  313. package/dist/server/agent-chat-plugin.js +118 -5
  314. package/dist/server/agent-chat-plugin.js.map +1 -1
  315. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  316. package/dist/server/transcribe-voice.d.ts +1 -1
  317. package/dist/styles/agent-conversation.css +7 -0
  318. package/dist/templates/default/app/i18n/ar-SA.ts +20 -0
  319. package/dist/templates/default/app/i18n/de-DE.ts +20 -0
  320. package/dist/templates/default/app/i18n/en-US.ts +20 -0
  321. package/dist/templates/default/app/i18n/es-ES.ts +20 -0
  322. package/dist/templates/default/app/i18n/fr-FR.ts +21 -0
  323. package/dist/templates/default/app/i18n/hi-IN.ts +19 -0
  324. package/dist/templates/default/app/i18n/ja-JP.ts +20 -0
  325. package/dist/templates/default/app/i18n/ko-KR.ts +19 -0
  326. package/dist/templates/default/app/i18n/pt-BR.ts +20 -0
  327. package/dist/templates/default/app/i18n/zh-CN.ts +19 -0
  328. package/dist/templates/default/app/i18n/zh-TW.ts +19 -0
  329. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +49 -0
  330. package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  331. package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +7 -1
  332. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  333. package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -1
  334. package/package.json +1 -1
  335. package/src/templates/default/app/i18n/ar-SA.ts +20 -0
  336. package/src/templates/default/app/i18n/de-DE.ts +20 -0
  337. package/src/templates/default/app/i18n/en-US.ts +20 -0
  338. package/src/templates/default/app/i18n/es-ES.ts +20 -0
  339. package/src/templates/default/app/i18n/fr-FR.ts +21 -0
  340. package/src/templates/default/app/i18n/hi-IN.ts +19 -0
  341. package/src/templates/default/app/i18n/ja-JP.ts +20 -0
  342. package/src/templates/default/app/i18n/ko-KR.ts +19 -0
  343. package/src/templates/default/app/i18n/pt-BR.ts +20 -0
  344. package/src/templates/default/app/i18n/zh-CN.ts +19 -0
  345. package/src/templates/default/app/i18n/zh-TW.ts +19 -0
  346. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +49 -0
  347. package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  348. package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +7 -1
  349. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  350. package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -1
  351. package/corpus/templates/analytics/server/handlers/github.ts +0 -200
  352. package/corpus/templates/analytics/server/handlers/pylon.ts +0 -43
  353. package/corpus/templates/analytics/server/lib/apollo.ts +0 -167
  354. package/corpus/templates/analytics/server/lib/commonroom.ts +0 -149
  355. package/corpus/templates/analytics/server/lib/github.ts +0 -660
  356. package/corpus/templates/analytics/server/lib/mixpanel.ts +0 -156
  357. package/corpus/templates/analytics/server/lib/posthog.ts +0 -194
  358. package/corpus/templates/analytics/server/lib/pylon.ts +0 -109
  359. package/corpus/templates/analytics/server/routes/api/github/graphql.post.ts +0 -1
  360. package/corpus/templates/analytics/server/routes/api/github/issue.get.ts +0 -1
  361. package/corpus/templates/analytics/server/routes/api/github/org-prs.get.ts +0 -1
  362. package/corpus/templates/analytics/server/routes/api/github/pr.get.ts +0 -1
  363. package/corpus/templates/analytics/server/routes/api/github/prs.get.ts +0 -1
  364. package/corpus/templates/analytics/server/routes/api/github/search.get.ts +0 -1
  365. package/corpus/templates/slides/actions/fetch-logos.ts +0 -90
  366. package/corpus/templates/slides/actions/image-search.ts +0 -64
  367. package/corpus/templates/slides/actions/import-github.ts +0 -182
  368. package/corpus/templates/slides/actions/logo-lookup.ts +0 -113
@@ -1,4 +1,4 @@
1
- import { createHash } from "node:crypto";
1
+ import { createHash, randomUUID } from "node:crypto";
2
2
 
3
3
  import {
4
4
  A2ATaskTimeoutError,
@@ -6,7 +6,12 @@ import {
6
6
  shouldPreferGlobalA2ASecret,
7
7
  signA2AToken,
8
8
  } from "../a2a/client.js";
9
- import type { A2AApprovedAction, Task } from "../a2a/types.js";
9
+ import { invokeAgentAction } from "../a2a/invoke.js";
10
+ import type {
11
+ A2AApprovedAction,
12
+ A2ACorrelationMetadata,
13
+ Task,
14
+ } from "../a2a/types.js";
10
15
  import {
11
16
  formatLlmCredentialErrorMessage,
12
17
  isLlmCredentialError,
@@ -27,6 +32,38 @@ const DEFAULT_SERVERLESS_INTEGRATION_A2A_TIMEOUT_MS = 18_000;
27
32
  const NETLIFY_INTEGRATION_A2A_TIMEOUT_MS = 2_000;
28
33
  const INTEGRATION_A2A_TOKEN_TTL = "30m";
29
34
 
35
+ function buildDelegationCorrelation(
36
+ context: ActionRunContext | undefined,
37
+ selfAppId: string | undefined,
38
+ invocationId?: string,
39
+ ): A2ACorrelationMetadata {
40
+ return {
41
+ ...(selfAppId?.trim() ? { callerApp: selfAppId.trim() } : {}),
42
+ ...(context?.threadId ? { callerThreadId: context.threadId } : {}),
43
+ ...(context?.runId ? { parentRunId: context.runId } : {}),
44
+ ...(context?.turnId ? { parentTurnId: context.turnId } : {}),
45
+ ...(invocationId ? { invocationId } : {}),
46
+ };
47
+ }
48
+
49
+ function buildMessageIdempotencyKey(
50
+ originatingTurnId: string | undefined,
51
+ target: string,
52
+ exactMessage: string,
53
+ ): string | undefined {
54
+ if (!originatingTurnId) return undefined;
55
+ const digest = createHash("sha256")
56
+ .update(
57
+ JSON.stringify({
58
+ originatingTurnId,
59
+ target,
60
+ message: exactMessage,
61
+ }),
62
+ )
63
+ .digest("hex");
64
+ return `v1:${digest}`;
65
+ }
66
+
30
67
  function parseTimeoutMs(value: string | undefined): number | undefined {
31
68
  if (!value) return undefined;
32
69
  const parsed = Number(value);
@@ -94,12 +131,13 @@ function formatDownstreamLlmCredentialFailure(
94
131
 
95
132
  export const tool: ActionTool = {
96
133
  description:
97
- "Call a DIFFERENT, separately-deployed agent app to ask a question or delegate a task. This is strictly for cross-app A2A communication for example, asking the mail agent to send an email while you are the calendar 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. " +
134
+ "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. " +
98
135
  '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. ' +
99
136
  "IMPORTANT — handling the response: " +
100
137
  "(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. " +
101
138
  '(b) If it does NOT contain a URL/ID and the user asked for one, say so explicitly (e.g. "the agent created the deck/image but didn\'t return a link — open the app directly to view it"). NEVER invent a URL, slug, or path — guessing produces broken links that look real. ' +
102
- "(c) If the downstream response reports missing credentials, never repeat raw env var names, Vault key names, token names, secret names, or other credential identifiers. Tell the user the target app needs its LLM/provider connection configured.",
139
+ "(c) If the downstream response reports missing credentials, never repeat raw env var names, Vault key names, token names, secret names, or other credential identifiers. Tell the user the target app needs its LLM/provider connection configured. " +
140
+ "(d) A bounded wait can expire while the remote task is still healthy. The result will include its taskId and exact retry instructions. Continue polling that SAME task with taskId; NEVER send a new check-in/follow-up message, because that starts duplicate downstream work.",
103
141
  parameters: {
104
142
  type: "object",
105
143
  properties: {
@@ -110,7 +148,24 @@ export const tool: ActionTool = {
110
148
  },
111
149
  message: {
112
150
  type: "string",
113
- description: "The message/question to send to the other agent",
151
+ description:
152
+ "The message/question to send when starting a new task. Omit when taskId is provided.",
153
+ },
154
+ taskId: {
155
+ type: "string",
156
+ description:
157
+ "Existing A2A task ID returned by a timed-out call. Polls that exact task without sending a new message. Never create a fresh check-in message for work that already has a taskId.",
158
+ },
159
+ action: {
160
+ type: "string",
161
+ description:
162
+ "Exact read-only action exposed by the target app. Use with input and omit message/taskId to skip the downstream agent loop.",
163
+ },
164
+ input: {
165
+ type: "object",
166
+ description:
167
+ "Complete input object for action. The target app validates it and refuses actions that are not explicitly exposed read-only operations.",
168
+ additionalProperties: true,
114
169
  },
115
170
  approvedActions: {
116
171
  type: "array",
@@ -126,7 +181,7 @@ export const tool: ActionTool = {
126
181
  },
127
182
  },
128
183
  },
129
- required: ["agent", "message"],
184
+ required: ["agent"],
130
185
  },
131
186
  };
132
187
 
@@ -137,12 +192,23 @@ export async function run(
137
192
  ): Promise<string> {
138
193
  const agentIdOrName = String(args.agent ?? "");
139
194
  const message = String(args.message ?? "");
195
+ const taskId = String(args.taskId ?? "").trim();
196
+ const action = String(args.action ?? "").trim();
197
+ const input = args.input ?? {};
140
198
  const approvedActions = Array.isArray(args.approvedActions)
141
199
  ? (args.approvedActions as A2AApprovedAction[])
142
200
  : undefined;
143
201
 
144
202
  if (!agentIdOrName) return "Error: --agent is required";
145
- if (!message) return "Error: --message is required";
203
+ if (!message && !taskId && !action) {
204
+ return "Error: --message, --taskId, or --action is required";
205
+ }
206
+ if (action && (message || taskId)) {
207
+ return "Error: --action direct-invoke mode cannot be combined with --message or --taskId";
208
+ }
209
+ if (action && (!input || typeof input !== "object" || Array.isArray(input))) {
210
+ return "Error: --input must be an object when --action is provided";
211
+ }
146
212
 
147
213
  // Prevent self-calls — the agent must use its own registered tools instead
148
214
  if (selfAppId && agentIdOrName.toLowerCase() === selfAppId.toLowerCase()) {
@@ -157,16 +223,43 @@ export async function run(
157
223
  return `Error: Agent "${agentIdOrName}" not found. Available agents: ${available || "(none)"}`;
158
224
  }
159
225
 
226
+ const correlation = buildDelegationCorrelation(context, selfAppId);
227
+ const idempotencyKey =
228
+ message && !taskId
229
+ ? buildMessageIdempotencyKey(context?.turnId, agent.url, message)
230
+ : undefined;
231
+
232
+ if (action) {
233
+ if (context?.send) {
234
+ context.send({ type: "agent_call", agent: agent.name, status: "start" });
235
+ }
236
+ try {
237
+ const output = await invokeReadOnlyAppAction(
238
+ agent,
239
+ action,
240
+ input as Record<string, unknown>,
241
+ buildDelegationCorrelation(context, selfAppId, randomUUID()),
242
+ );
243
+ return output;
244
+ } finally {
245
+ if (context?.send) {
246
+ context.send({ type: "agent_call", agent: agent.name, status: "done" });
247
+ }
248
+ }
249
+ }
250
+
160
251
  // Append a small cross-app hint to the outgoing message so the receiving
161
252
  // agent (which may be on an older deploy without the receiver-side hint
162
253
  // in handlers.ts) still emits fully-qualified URLs. This is belt-and-
163
254
  // suspenders with the receiver hint — but it works against any current
164
255
  // deployment, no redeploy required.
165
- const messageWithHint =
166
- `${message}${integrationSourceContextHint()}\n\n` +
167
- `[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. ` +
168
- `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. ` +
169
- `Use only artifact IDs and URL paths returned by successful actions never invent slugs, IDs, or hosts.]`;
256
+ const messageWithHint = taskId
257
+ ? ""
258
+ : `${message}${integrationSourceContextHint()}\n\n` +
259
+ `[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. ` +
260
+ `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. ` +
261
+ `Use only artifact IDs and URL paths returned by successful actions — never invent slugs, IDs, or hosts. ` +
262
+ `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.]`;
170
263
 
171
264
  try {
172
265
  // If we have a send context, use streaming so the UI shows progressive text
@@ -228,8 +321,9 @@ export async function run(
228
321
 
229
322
  let responseText = "";
230
323
  let lastSentLength = 0;
231
- const existingContinuationText =
232
- await formatExistingIntegrationContinuationIfRetry(agent, message);
324
+ const existingContinuationText = taskId
325
+ ? null
326
+ : await formatExistingIntegrationContinuationIfRetry(agent, message);
233
327
  if (existingContinuationText) return existingContinuationText;
234
328
 
235
329
  context.send({
@@ -338,13 +432,15 @@ export async function run(
338
432
  orgDomain: callerOrgDomain,
339
433
  orgSecret: callerOrgSecret,
340
434
  approvedActions,
435
+ contextId: context.threadId,
436
+ correlation,
437
+ idempotencyKey,
438
+ ...(taskId ? { taskId } : {}),
341
439
  onUpdate: onRemotePollUpdate,
440
+ returnRecoverableArtifactsOnTimeout: false,
342
441
  ...(callTimeoutMs
343
442
  ? {
344
443
  timeoutMs: callTimeoutMs,
345
- // Integration callers must keep the timeout task id so the
346
- // catch below can enqueue durable continuation polling.
347
- returnRecoverableArtifactsOnTimeout: false,
348
444
  }
349
445
  : {}),
350
446
  });
@@ -387,8 +483,11 @@ export async function run(
387
483
  agent.url,
388
484
  );
389
485
  } else {
390
- const reason = pollErr?.message ?? "unknown error";
391
- responseText = `The ${agent.name} agent is taking longer than expected and didn't reply in time. (${reason})`;
486
+ responseText = formatExistingTaskWaitInstruction(
487
+ agent.name,
488
+ timeoutTaskId,
489
+ agentIdOrName,
490
+ );
392
491
  }
393
492
  }
394
493
  } else {
@@ -427,6 +526,11 @@ export async function run(
427
526
  orgDomain: domain,
428
527
  orgSecret,
429
528
  approvedActions,
529
+ contextId: context?.threadId,
530
+ correlation,
531
+ idempotencyKey,
532
+ ...(taskId ? { taskId } : {}),
533
+ returnRecoverableArtifactsOnTimeout: false,
430
534
  });
431
535
  const sanitized =
432
536
  formatDownstreamLlmCredentialFailure(agent.name, response) ?? response;
@@ -438,6 +542,14 @@ export async function run(
438
542
  err,
439
543
  );
440
544
  if (credentialMessage) return credentialMessage;
545
+ const timeoutTaskId = getA2ATaskTimeoutTaskId(err);
546
+ if (timeoutTaskId) {
547
+ return formatExistingTaskWaitInstruction(
548
+ agent.name,
549
+ timeoutTaskId,
550
+ agentIdOrName,
551
+ );
552
+ }
441
553
  // Friendlier message for the common timeout case so the calling agent can
442
554
  // decide whether to give up or retry.
443
555
  if (/timeout|did not complete|Inactivity|504/i.test(msg)) {
@@ -447,6 +559,65 @@ export async function run(
447
559
  }
448
560
  }
449
561
 
562
+ async function invokeReadOnlyAppAction(
563
+ agent: { name: string; url: string },
564
+ action: string,
565
+ input: Record<string, unknown>,
566
+ correlation: A2ACorrelationMetadata,
567
+ ): Promise<string> {
568
+ const callerEmail = getRequestUserEmail();
569
+ if (!callerEmail) {
570
+ return `Error calling ${agent.name} action ${action}: a signed-in user identity is required`;
571
+ }
572
+
573
+ let callerOrgDomain: string | undefined;
574
+ let callerOrgSecret: string | undefined;
575
+ const orgId = getRequestOrgId();
576
+ if (orgId) {
577
+ try {
578
+ callerOrgDomain = (await getOrgDomain(orgId)) ?? undefined;
579
+ } catch {}
580
+ try {
581
+ callerOrgSecret = (await getOrgA2ASecret(orgId)) ?? undefined;
582
+ } catch {}
583
+ }
584
+
585
+ if (!callerOrgSecret && !process.env.A2A_SECRET) {
586
+ return `Error calling ${agent.name} action ${action}: direct cross-app reads require A2A identity verification`;
587
+ }
588
+
589
+ try {
590
+ const invocation = await invokeAgentAction({
591
+ target: agent.url,
592
+ action,
593
+ input,
594
+ userEmail: callerEmail,
595
+ orgDomain: callerOrgDomain,
596
+ orgSecret: callerOrgSecret,
597
+ correlation,
598
+ });
599
+ return invocation.result.status === "completed"
600
+ ? invocation.result.output
601
+ : `Error calling ${agent.name} action ${action}: ${invocation.result.output}`;
602
+ } catch (error) {
603
+ return `Error calling ${agent.name} action ${action}: ${
604
+ error instanceof Error ? error.message : String(error)
605
+ }`;
606
+ }
607
+ }
608
+
609
+ function formatExistingTaskWaitInstruction(
610
+ agentName: string,
611
+ taskId: string,
612
+ agentIdOrName: string,
613
+ ): string {
614
+ return (
615
+ `The ${agentName} task is still running under taskId "${taskId}". ` +
616
+ `Do not send ${agentName} a new check-in or follow-up message; that would start duplicate work. ` +
617
+ `Call call-agent again with agent="${agentIdOrName}" and taskId="${taskId}" (omit message) to continue waiting for this same task.`
618
+ );
619
+ }
620
+
450
621
  async function enqueueIntegrationContinuationIfPossible(
451
622
  taskId: string,
452
623
  agent: { name: string; url: string },
@@ -15,6 +15,10 @@ import {
15
15
  } from "../../agent/production-agent.js";
16
16
  import { runAgentLoopDirectWithSoftTimeout } from "../../agent/run-loop-with-resume.js";
17
17
  import type { AgentChatEvent } from "../../agent/types.js";
18
+ import {
19
+ isAuthenticatedReadAction,
20
+ isAutoReadExcludedActionName,
21
+ } from "../../mcp/build-server.js";
18
22
  import { withConfiguredAppBasePath } from "../app-base-path.js";
19
23
  import type { AgentChatPluginOptions } from "./plugin-options.js";
20
24
 
@@ -61,6 +65,42 @@ export function filterPublicAgentActions(
61
65
  );
62
66
  }
63
67
 
68
+ /**
69
+ * Direct A2A action calls share the authenticated external-agent policy with
70
+ * MCP, but remain stricter: only explicitly exposed, authenticated read-only
71
+ * actions can skip the receiver's model loop.
72
+ */
73
+ export function filterDirectA2AActions(
74
+ actions: Record<string, ActionEntry>,
75
+ options: Pick<AgentChatPluginOptions, "connectorCatalog" | "externalAgents">,
76
+ ): Record<string, ActionEntry> {
77
+ const catalog = new Set(options.connectorCatalog ?? []);
78
+ const denied = new Set(options.externalAgents?.denyActions ?? []);
79
+ const autoReads = options.externalAgents?.authenticatedReads === "auto";
80
+
81
+ return Object.fromEntries(
82
+ Object.entries(actions).filter(([name, entry]) => {
83
+ const exposure = entry.publicAgent;
84
+ const selected =
85
+ catalog.has(name) ||
86
+ (autoReads &&
87
+ isAuthenticatedReadAction(entry) &&
88
+ !isAutoReadExcludedActionName(name));
89
+ return (
90
+ selected &&
91
+ !denied.has(name) &&
92
+ entry.agentTool !== false &&
93
+ entry.readOnly === true &&
94
+ exposure?.expose === true &&
95
+ exposure.readOnly === true &&
96
+ exposure.requiresAuth === true &&
97
+ (entry.needsApproval === undefined || entry.needsApproval === false) &&
98
+ exposure.isConsequential !== true
99
+ );
100
+ }),
101
+ );
102
+ }
103
+
64
104
  export function buildPublicAgentA2ASkills(
65
105
  actions: Record<string, ActionEntry>,
66
106
  ): Array<{
@@ -151,34 +191,81 @@ function formatA2ATerminalError(
151
191
 
152
192
  type A2AAgentLoopRunner = typeof runAgentLoopDirectWithSoftTimeout;
153
193
 
154
- function runDelegatedAgentLoop(
194
+ export interface DelegatedAgentLoopTelemetry {
195
+ runId: string;
196
+ threadId: string | null;
197
+ userId: string | null;
198
+ delegation: {
199
+ protocol: "a2a" | "mcp";
200
+ callerApp?: string;
201
+ taskId?: string;
202
+ parentRunId?: string;
203
+ parentTurnId?: string;
204
+ };
205
+ }
206
+
207
+ interface DelegatedAgentLoopOptions {
208
+ runner?: A2AAgentLoopRunner;
209
+ telemetry?: DelegatedAgentLoopTelemetry;
210
+ }
211
+
212
+ async function runDelegatedAgentLoop(
155
213
  runOptions: Parameters<A2AAgentLoopRunner>[0],
156
214
  pluginOptions: Pick<
157
215
  AgentChatPluginOptions,
158
216
  "finalResponseGuard" | "runSoftTimeoutMs"
159
217
  >,
160
218
  timeoutOptions: Parameters<A2AAgentLoopRunner>[2],
161
- runner: A2AAgentLoopRunner,
219
+ options: DelegatedAgentLoopOptions,
162
220
  ) {
163
- return runner(
164
- {
165
- ...runOptions,
166
- // Delegated runs resolve their own model and do not pass through the
167
- // interactive request handler's output-token setup. Use the same
168
- // model-aware headroom here so reasoning models (notably GPT-5.x) do
169
- // not spend the small internal default entirely on reasoning before
170
- // emitting a tool call or answer. Preserve explicit test/caller values.
171
- maxOutputTokens:
172
- runOptions.maxOutputTokens ??
173
- resolveMainChatMaxOutputTokens(runOptions.model),
174
- reasoningEffort:
175
- runOptions.reasoningEffort ??
176
- resolveAgentRequestReasoningEffort({ model: runOptions.model }),
177
- finalResponseGuard: pluginOptions.finalResponseGuard,
178
- },
179
- pluginOptions.runSoftTimeoutMs,
180
- timeoutOptions,
181
- );
221
+ const runner = options.runner ?? runAgentLoopDirectWithSoftTimeout;
222
+ const resolvedRunOptions = {
223
+ ...runOptions,
224
+ // Delegated runs resolve their own model and do not pass through the
225
+ // interactive request handler's output-token setup. Use the same
226
+ // model-aware headroom here so reasoning models (notably GPT-5.x) do
227
+ // not spend the small internal default entirely on reasoning before
228
+ // emitting a tool call or answer. Preserve explicit test/caller values.
229
+ maxOutputTokens:
230
+ runOptions.maxOutputTokens ??
231
+ resolveMainChatMaxOutputTokens(runOptions.model),
232
+ reasoningEffort:
233
+ runOptions.reasoningEffort ??
234
+ resolveAgentRequestReasoningEffort({ model: runOptions.model }),
235
+ finalResponseGuard: pluginOptions.finalResponseGuard,
236
+ };
237
+ const execute = (loopOptions = resolvedRunOptions) =>
238
+ runner(loopOptions, pluginOptions.runSoftTimeoutMs, timeoutOptions);
239
+
240
+ if (!options.telemetry) return execute();
241
+
242
+ let instrumented = false;
243
+ try {
244
+ const { getObservabilityConfig, instrumentAgentLoop } =
245
+ await import("../../observability/traces.js");
246
+ const config = await getObservabilityConfig();
247
+ if (config.enabled) {
248
+ instrumented = true;
249
+ return await instrumentAgentLoop({
250
+ runAgentLoop: (loopOptions) =>
251
+ execute(
252
+ loopOptions as Parameters<A2AAgentLoopRunner>[0] &
253
+ typeof resolvedRunOptions,
254
+ ),
255
+ loopOpts: resolvedRunOptions,
256
+ runId: options.telemetry.runId,
257
+ threadId: options.telemetry.threadId,
258
+ userId: options.telemetry.userId,
259
+ config,
260
+ delegation: options.telemetry.delegation,
261
+ });
262
+ }
263
+ } catch (error) {
264
+ // Match interactive chat: setup failures fall through, but a failure from
265
+ // inside an instrumented agent loop is the real run failure and rethrows.
266
+ if (instrumented) throw error;
267
+ }
268
+ return execute();
182
269
  }
183
270
 
184
271
  /**
@@ -196,13 +283,13 @@ export function runA2AAgentLoop(
196
283
  "finalResponseGuard" | "runSoftTimeoutMs"
197
284
  >,
198
285
  timeoutOptions: Parameters<A2AAgentLoopRunner>[2],
199
- runner: A2AAgentLoopRunner = runAgentLoopDirectWithSoftTimeout,
286
+ options: DelegatedAgentLoopOptions = {},
200
287
  ) {
201
288
  return runDelegatedAgentLoop(
202
289
  runOptions,
203
290
  pluginOptions,
204
291
  timeoutOptions,
205
- runner,
292
+ options,
206
293
  );
207
294
  }
208
295
 
@@ -218,13 +305,13 @@ export function runMCPAgentLoop(
218
305
  "finalResponseGuard" | "runSoftTimeoutMs"
219
306
  >,
220
307
  timeoutOptions: Parameters<A2AAgentLoopRunner>[2],
221
- runner: A2AAgentLoopRunner = runAgentLoopDirectWithSoftTimeout,
308
+ options: DelegatedAgentLoopOptions = {},
222
309
  ) {
223
310
  return runDelegatedAgentLoop(
224
311
  runOptions,
225
312
  pluginOptions,
226
313
  timeoutOptions,
227
- runner,
314
+ options,
228
315
  );
229
316
  }
230
317