@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,10 +1,17 @@
1
1
  import crypto from "crypto";
2
2
 
3
3
  import { getDbExec, intType, isPostgres } from "../db/client.js";
4
- import { ensureTableExists, ensureColumnExists } from "../db/ddl-guard.js";
4
+ import {
5
+ ensureTableExists,
6
+ ensureColumnExists,
7
+ ensureIndexExists,
8
+ } from "../db/ddl-guard.js";
5
9
  import type { Task, Message, TaskState, Artifact } from "./types.js";
6
10
 
7
11
  let _initPromise: Promise<void> | undefined;
12
+ export const MAX_A2A_IDEMPOTENCY_KEY_CHARS = 128;
13
+ const A2A_IDEMPOTENCY_INDEX = "idx_a2a_tasks_owner_scope_idempotency";
14
+ export const A2A_PERSONAL_OWNER_SCOPE = "__personal__";
8
15
 
9
16
  async function ensureTable(): Promise<void> {
10
17
  if (!_initPromise) {
@@ -20,10 +27,16 @@ async function ensureTable(): Promise<void> {
20
27
  history TEXT NOT NULL DEFAULT '[]',
21
28
  artifacts TEXT NOT NULL DEFAULT '[]',
22
29
  metadata TEXT,
30
+ owner_email TEXT,
31
+ owner_scope TEXT NOT NULL DEFAULT '',
32
+ idempotency_key TEXT,
23
33
  created_at ${intType()} NOT NULL,
24
34
  updated_at ${intType()} NOT NULL
25
35
  )
26
36
  `;
37
+ const createIdempotencyIndexSql =
38
+ `CREATE UNIQUE INDEX IF NOT EXISTS ${A2A_IDEMPOTENCY_INDEX} ` +
39
+ `ON a2a_tasks(owner_email, owner_scope, idempotency_key)`;
27
40
  const createApprovalsSql = `
28
41
  CREATE TABLE IF NOT EXISTS a2a_approvals (
29
42
  id TEXT PRIMARY KEY,
@@ -57,6 +70,20 @@ async function ensureTable(): Promise<void> {
57
70
  "owner_email",
58
71
  `ALTER TABLE a2a_tasks ADD COLUMN IF NOT EXISTS owner_email TEXT`,
59
72
  );
73
+ await ensureColumnExists(
74
+ "a2a_tasks",
75
+ "owner_scope",
76
+ `ALTER TABLE a2a_tasks ADD COLUMN IF NOT EXISTS owner_scope TEXT NOT NULL DEFAULT ''`,
77
+ );
78
+ await ensureColumnExists(
79
+ "a2a_tasks",
80
+ "idempotency_key",
81
+ `ALTER TABLE a2a_tasks ADD COLUMN IF NOT EXISTS idempotency_key TEXT`,
82
+ );
83
+ await ensureIndexExists(
84
+ A2A_IDEMPOTENCY_INDEX,
85
+ createIdempotencyIndexSql,
86
+ );
60
87
  await ensureTableExists("a2a_approvals", createApprovalsSql);
61
88
  return;
62
89
  }
@@ -69,6 +96,13 @@ async function ensureTable(): Promise<void> {
69
96
  // have NULL owner_email and remain accessible to legacy callers via
70
97
  // the legacy-token apiKeyEnv path; new rows are scoped from this point
71
98
  // forward.
99
+ try {
100
+ await client.execute(
101
+ `ALTER TABLE a2a_tasks ADD COLUMN owner_scope TEXT NOT NULL DEFAULT ''`,
102
+ );
103
+ } catch {
104
+ // Column already exists — expected on every restart after first run.
105
+ }
72
106
  try {
73
107
  await client.execute(
74
108
  `ALTER TABLE a2a_tasks ADD COLUMN owner_email TEXT`,
@@ -76,6 +110,14 @@ async function ensureTable(): Promise<void> {
76
110
  } catch {
77
111
  // Column already exists — expected on every restart after first run.
78
112
  }
113
+ try {
114
+ await client.execute(
115
+ `ALTER TABLE a2a_tasks ADD COLUMN idempotency_key TEXT`,
116
+ );
117
+ } catch {
118
+ // Column already exists — expected on every restart after first run.
119
+ }
120
+ await client.execute(createIdempotencyIndexSql);
79
121
  await client.execute(createApprovalsSql);
80
122
  })().catch((err) => {
81
123
  // Retry init on the next call after a failed startup.
@@ -320,7 +362,10 @@ export async function pauseProcessingA2ATask(
320
362
  return task;
321
363
  }
322
364
 
323
- function taskFromRow(row: any): Task & { ownerEmail?: string | null } {
365
+ function taskFromRow(row: any): Task & {
366
+ ownerEmail?: string | null;
367
+ ownerScope?: string | null;
368
+ } {
324
369
  return {
325
370
  id: row.id as string,
326
371
  contextId: (row.context_id as string) || undefined,
@@ -335,6 +380,7 @@ function taskFromRow(row: any): Task & { ownerEmail?: string | null } {
335
380
  artifacts: JSON.parse(row.artifacts as string),
336
381
  metadata: row.metadata ? JSON.parse(row.metadata as string) : undefined,
337
382
  ownerEmail: (row.owner_email as string | null) ?? null,
383
+ ownerScope: (row.owner_scope as string | null) ?? null,
338
384
  };
339
385
  }
340
386
 
@@ -356,6 +402,7 @@ export async function createTask(
356
402
  contextId?: string,
357
403
  metadata?: Record<string, unknown>,
358
404
  ownerEmail?: string | null,
405
+ ownerScope?: string | null,
359
406
  ): Promise<Task> {
360
407
  await ensureTable();
361
408
  const client = getDbExec();
@@ -373,7 +420,7 @@ export async function createTask(
373
420
  };
374
421
 
375
422
  await client.execute({
376
- sql: `INSERT INTO a2a_tasks (id, context_id, status_state, status_timestamp, history, artifacts, metadata, owner_email, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
423
+ sql: `INSERT INTO a2a_tasks (id, context_id, status_state, status_timestamp, history, artifacts, metadata, owner_email, owner_scope, idempotency_key, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
377
424
  args: [
378
425
  id,
379
426
  contextId ?? null,
@@ -383,6 +430,8 @@ export async function createTask(
383
430
  "[]",
384
431
  metadata ? JSON.stringify(metadata) : null,
385
432
  ownerEmail ?? null,
433
+ ownerScope ?? "",
434
+ null,
386
435
  now,
387
436
  now,
388
437
  ],
@@ -391,6 +440,87 @@ export async function createTask(
391
440
  return task;
392
441
  }
393
442
 
443
+ export async function createOrReuseTask(
444
+ message: Message,
445
+ contextId: string | undefined,
446
+ metadata: Record<string, unknown> | undefined,
447
+ ownerEmail: string | null,
448
+ ownerScope: string | null,
449
+ idempotencyKey: string | undefined,
450
+ ): Promise<{ task: Task; reused: boolean }> {
451
+ if (!ownerEmail || !idempotencyKey) {
452
+ return {
453
+ task: await createTask(
454
+ message,
455
+ contextId,
456
+ metadata,
457
+ ownerEmail,
458
+ ownerScope,
459
+ ),
460
+ reused: false,
461
+ };
462
+ }
463
+ if (idempotencyKey.length > MAX_A2A_IDEMPOTENCY_KEY_CHARS) {
464
+ throw new Error("A2A idempotency key is too long");
465
+ }
466
+
467
+ await ensureTable();
468
+ const client = getDbExec();
469
+ const normalizedOwner = ownerEmail.trim().toLowerCase();
470
+ const normalizedScope =
471
+ ownerScope?.trim().toLowerCase() || A2A_PERSONAL_OWNER_SCOPE;
472
+
473
+ for (let attempt = 0; attempt < 2; attempt++) {
474
+ const id = crypto.randomUUID();
475
+ const now = Date.now();
476
+ const timestamp = new Date().toISOString();
477
+ await client.execute({
478
+ sql: `INSERT INTO a2a_tasks (id, context_id, status_state, status_timestamp, history, artifacts, metadata, owner_email, owner_scope, idempotency_key, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT(owner_email, owner_scope, idempotency_key) DO NOTHING`,
479
+ args: [
480
+ id,
481
+ contextId ?? null,
482
+ "submitted",
483
+ timestamp,
484
+ JSON.stringify([message]),
485
+ "[]",
486
+ metadata ? JSON.stringify(metadata) : null,
487
+ normalizedOwner,
488
+ normalizedScope,
489
+ idempotencyKey,
490
+ now,
491
+ now,
492
+ ],
493
+ });
494
+
495
+ const { rows } = await client.execute({
496
+ sql: `SELECT * FROM a2a_tasks WHERE owner_email = ? AND owner_scope = ? AND idempotency_key = ?`,
497
+ args: [normalizedOwner, normalizedScope, idempotencyKey],
498
+ });
499
+ if (rows.length === 0) {
500
+ throw new Error("A2A idempotent task insert could not be verified");
501
+ }
502
+ const task = taskFromRow(rows[0]);
503
+ const reused = task.id !== id;
504
+ if (
505
+ reused &&
506
+ (task.status.state === "failed" || task.status.state === "canceled")
507
+ ) {
508
+ await client.execute({
509
+ sql: `UPDATE a2a_tasks SET idempotency_key = NULL, updated_at = ? WHERE id = ? AND idempotency_key = ? AND status_state IN ('failed', 'canceled')`,
510
+ args: [Date.now(), task.id, idempotencyKey],
511
+ });
512
+ continue;
513
+ }
514
+ return { task, reused };
515
+ }
516
+ throw new Error("A2A terminal task idempotency key could not be released");
517
+ }
518
+
519
+ export interface A2ATaskOwnership {
520
+ ownerEmail: string | null;
521
+ ownerScope: string | null;
522
+ }
523
+
394
524
  /**
395
525
  * Fetch the verified owner email recorded against a task at creation time.
396
526
  * Returns null when the task has no owner (legacy rows or unauthenticated
@@ -400,15 +530,25 @@ export async function createTask(
400
530
  * verified caller's email must match `owner_email` to read or cancel.
401
531
  */
402
532
  export async function getTaskOwner(id: string): Promise<string | null> {
533
+ return (await getTaskOwnership(id)).ownerEmail;
534
+ }
535
+
536
+ export async function getTaskOwnership(id: string): Promise<A2ATaskOwnership> {
403
537
  await ensureTable();
404
538
  const client = getDbExec();
405
539
  const { rows } = await client.execute({
406
- sql: `SELECT owner_email FROM a2a_tasks WHERE id = ?`,
540
+ sql: `SELECT owner_email, owner_scope FROM a2a_tasks WHERE id = ?`,
407
541
  args: [id],
408
542
  });
409
- if (rows.length === 0) return null;
543
+ if (rows.length === 0) return { ownerEmail: null, ownerScope: null };
410
544
  const ownerEmail = (rows[0] as any).owner_email;
411
- return typeof ownerEmail === "string" && ownerEmail ? ownerEmail : null;
545
+ const ownerScope = (rows[0] as any).owner_scope;
546
+ return {
547
+ ownerEmail:
548
+ typeof ownerEmail === "string" && ownerEmail ? ownerEmail : null,
549
+ ownerScope:
550
+ typeof ownerScope === "string" && ownerScope ? ownerScope : null,
551
+ };
412
552
  }
413
553
 
414
554
  /**
@@ -132,6 +132,19 @@ export interface A2AApprovedAction {
132
132
  input: unknown;
133
133
  }
134
134
 
135
+ /**
136
+ * Telemetry-only cross-app correlation. Receivers must never use these
137
+ * caller-supplied values for identity, ownership, org scoping, access, or
138
+ * approval decisions.
139
+ */
140
+ export interface A2ACorrelationMetadata {
141
+ callerApp?: string;
142
+ callerThreadId?: string;
143
+ parentRunId?: string;
144
+ parentTurnId?: string;
145
+ invocationId?: string;
146
+ }
147
+
135
148
  // --- Framework config ---
136
149
 
137
150
  export interface A2AHandlerContext {
@@ -164,6 +177,19 @@ export interface A2AApprovalExecution {
164
177
  callId: string;
165
178
  }
166
179
 
180
+ /** One explicitly exposed read-only app action invoked without an agent loop. */
181
+ export interface A2AReadOnlyActionInvocation {
182
+ action: string;
183
+ input: Record<string, unknown>;
184
+ invocationId: string;
185
+ }
186
+
187
+ export interface A2AReadOnlyActionResult {
188
+ action: string;
189
+ status: "completed" | "failed";
190
+ output: string;
191
+ }
192
+
167
193
  export type A2AHandler = (
168
194
  message: Message,
169
195
  context: A2AHandlerContext,
@@ -171,6 +197,8 @@ export type A2AHandler = (
171
197
 
172
198
  export interface A2AConfig {
173
199
  name: string;
200
+ /** Canonical receiver app id used only for telemetry attribution. */
201
+ appId?: string;
174
202
  description: string;
175
203
  version?: string;
176
204
  skills: AgentSkill[];
@@ -186,4 +214,8 @@ export interface A2AConfig {
186
214
  status: "completed" | "failed";
187
215
  output: string;
188
216
  }>;
217
+ /** Execute an explicitly exposed read-only action without starting a model. */
218
+ executeReadOnlyAction?: (
219
+ invocation: A2AReadOnlyActionInvocation,
220
+ ) => Promise<Pick<A2AReadOnlyActionResult, "status" | "output">>;
189
221
  }
@@ -24,8 +24,9 @@ import type { ActionAuditConfig } from "./audit/types.js";
24
24
  * `callAction` (tagged with the `X-Request-Source` header).
25
25
  * - `"cli"` — `pnpm action <name>` (the CLI runner).
26
26
  * - `"mcp"` — an external agent over the MCP `tools/call` endpoint.
27
- * - `"a2a"` — a direct, scoped A2A action dispatch. Ordinary A2A agent work
28
- * still runs through the agent loop and is tagged `"tool"`.
27
+ * - `"a2a"` — a direct, explicitly exposed read-only A2A action dispatch.
28
+ * Natural-language A2A delegation still runs through the agent loop and its
29
+ * selected actions are attributed as `"tool"`.
29
30
  */
30
31
  export type ActionCaller = "tool" | "http" | "frontend" | "cli" | "mcp" | "a2a";
31
32
 
@@ -96,6 +97,8 @@ export interface ActionRunContext {
96
97
  * every human/programmatic surface.
97
98
  */
98
99
  threadId?: string;
100
+ /** Concrete execution id for this agent-loop attempt. */
101
+ runId?: string;
99
102
  turnId?: string;
100
103
  }
101
104
 
@@ -8,7 +8,7 @@ import {
8
8
  } from "h3";
9
9
  import type { EventHandler as H3EventHandler } from "h3";
10
10
 
11
- import { isAgentActionStopError } from "../action.js";
11
+ import { isAgentActionStopError, type ActionCaller } from "../action.js";
12
12
  import { readAppState } from "../application-state/script-helpers.js";
13
13
  import { isReadOnlyShellCommand } from "../coding-tools/index.js";
14
14
  import { extensionIdFromPathname } from "../extensions/path.js";
@@ -2479,6 +2479,11 @@ export interface ExecuteAgentToolCallOptions {
2479
2479
  signal?: AbortSignal;
2480
2480
  ownerEmail?: string | null;
2481
2481
  orgId?: string | null;
2482
+ /** Audit/action attribution for this externally selected call. */
2483
+ caller?: ActionCaller;
2484
+ networkProtocol?: "a2a" | "mcp" | "provider-api";
2485
+ networkId?: string;
2486
+ networkPeer?: string;
2482
2487
  threadId?: string;
2483
2488
  turnId?: string;
2484
2489
  approvedToolCalls?: string[];
@@ -2573,6 +2578,10 @@ export async function executeAgentToolCall(
2573
2578
  signal,
2574
2579
  ownerEmail: options.ownerEmail,
2575
2580
  orgId: options.orgId,
2581
+ actionCaller: options.caller,
2582
+ networkProtocol: options.networkProtocol,
2583
+ networkId: options.networkId,
2584
+ networkPeer: options.networkPeer,
2576
2585
  executionMode: "act",
2577
2586
  maxIterations: 2,
2578
2587
  threadId: options.threadId,
@@ -3152,6 +3161,14 @@ export async function runAgentLoop(opts: {
3152
3161
  signal: AbortSignal;
3153
3162
  ownerEmail?: string | null;
3154
3163
  orgId?: string | null;
3164
+ /** Action invocation attribution. Defaults to the normal agent tool loop. */
3165
+ actionCaller?: ActionCaller;
3166
+ /** Concrete execution id used for cross-app trace correlation. */
3167
+ runId?: string;
3168
+ /** Verified/telemetry-only delegated lineage supplied by the transport. */
3169
+ networkProtocol?: "a2a" | "mcp" | "provider-api";
3170
+ networkId?: string;
3171
+ networkPeer?: string;
3155
3172
  /**
3156
3173
  * Attachments submitted with this turn (pasted text, files, images), passed
3157
3174
  * through to each tool's `ActionRunContext.attachments` so actions can
@@ -4102,6 +4119,7 @@ export async function runAgentLoop(opts: {
4102
4119
  requestedActionStop ??= {
4103
4120
  message:
4104
4121
  `Stopped because ${toolCall.name} failed ${count} times with the same arguments and error. ` +
4122
+ `Last error: ${sanitizedResult} ` +
4105
4123
  "Fix the underlying issue or change the arguments before retrying.",
4106
4124
  errorCode: "repeated_identical_tool_error",
4107
4125
  };
@@ -4208,7 +4226,10 @@ export async function runAgentLoop(opts: {
4208
4226
  await actionEntry.needsApproval(toolCall.input, {
4209
4227
  userEmail: getRequestUserEmail(),
4210
4228
  orgId: getRequestOrgId() ?? null,
4211
- caller: "tool",
4229
+ caller: opts.actionCaller ?? "tool",
4230
+ networkProtocol: opts.networkProtocol,
4231
+ networkId: opts.networkId,
4232
+ networkPeer: opts.networkPeer,
4212
4233
  }),
4213
4234
  )
4214
4235
  : actionEntry.needsApproval === true;
@@ -4242,7 +4263,10 @@ export async function runAgentLoop(opts: {
4242
4263
  args: toolCall.input,
4243
4264
  ctx: {
4244
4265
  actionName: toolCall.name,
4245
- caller: "tool",
4266
+ caller: opts.actionCaller ?? "tool",
4267
+ networkProtocol: opts.networkProtocol,
4268
+ networkId: opts.networkId,
4269
+ networkPeer: opts.networkPeer,
4246
4270
  userEmail: getRequestUserEmail(),
4247
4271
  orgId: getRequestOrgId() ?? null,
4248
4272
  ...(opts.threadId ? { threadId: opts.threadId } : {}),
@@ -4638,13 +4662,17 @@ export async function runAgentLoop(opts: {
4638
4662
  send,
4639
4663
  userEmail: actionUserEmail ?? undefined,
4640
4664
  orgId: actionOrgId,
4641
- caller: "tool" as const,
4665
+ caller: opts.actionCaller ?? "tool",
4666
+ networkProtocol: opts.networkProtocol,
4667
+ networkId: opts.networkId,
4668
+ networkPeer: opts.networkPeer,
4642
4669
  attachments: opts.attachments,
4643
4670
  signal,
4644
4671
  // Audit attribution: the action name + the agent thread/turn that
4645
4672
  // triggered this call, so a mutation can be traced to its run.
4646
4673
  actionName: toolCall.name,
4647
4674
  ...(opts.threadId ? { threadId: opts.threadId } : {}),
4675
+ ...(opts.runId ? { runId: opts.runId } : {}),
4648
4676
  ...(opts.turnId ? { turnId: opts.turnId } : {}),
4649
4677
  };
4650
4678
  const requestContext = getRequestContext();
@@ -7998,6 +8026,7 @@ export function createProductionAgentHandler(
7998
8026
  const agentLoopOpts = {
7999
8027
  engine,
8000
8028
  model: effectiveModel,
8029
+ runId,
8001
8030
  systemPrompt: requestSystemPrompt,
8002
8031
  tools: requestTools,
8003
8032
  availableTools: availableRequestTools,