@agent-native/core 0.108.0 → 0.109.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +18 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/a2a/client.ts +140 -17
  5. package/corpus/core/src/a2a/handlers.ts +60 -0
  6. package/corpus/core/src/a2a/index.ts +6 -1
  7. package/corpus/core/src/a2a/invoke.ts +68 -1
  8. package/corpus/core/src/a2a/server.ts +13 -1
  9. package/corpus/core/src/a2a/types.ts +16 -0
  10. package/corpus/core/src/action.ts +3 -2
  11. package/corpus/core/src/agent/production-agent.ts +10 -4
  12. package/corpus/core/src/client/AssistantChat.tsx +648 -603
  13. package/corpus/core/src/client/MultiTabAssistantChat.tsx +31 -4
  14. package/corpus/core/src/client/agent-chat-adapter.ts +23 -37
  15. package/corpus/core/src/client/agent-sidebar-state.ts +4 -0
  16. package/corpus/core/src/client/analytics.ts +84 -0
  17. package/corpus/core/src/client/chat/message-components.tsx +94 -22
  18. package/corpus/core/src/client/chat/tool-call-display.tsx +170 -47
  19. package/corpus/core/src/client/chat/use-agent-chat-lifecycle-tracking.ts +74 -0
  20. package/corpus/core/src/client/chat-thread-url.ts +11 -0
  21. package/corpus/core/src/client/error-capture.ts +12 -0
  22. package/corpus/core/src/client/extensions/ExtensionSlot.tsx +37 -1
  23. package/corpus/core/src/client/index.ts +2 -0
  24. package/corpus/core/src/client/route-chunk-recovery.ts +20 -8
  25. package/corpus/core/src/client/session-replay.ts +31 -0
  26. package/corpus/core/src/extensions/actions.ts +2 -14
  27. package/corpus/core/src/extensions/store.ts +1 -1
  28. package/corpus/core/src/localization/default-messages.ts +3 -0
  29. package/corpus/core/src/mcp/build-server.ts +2 -2
  30. package/corpus/core/src/progress/actions.ts +4 -2
  31. package/corpus/core/src/provider-api/index.ts +205 -105
  32. package/corpus/core/src/scripts/call-agent.ts +137 -17
  33. package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +40 -0
  34. package/corpus/core/src/server/agent-chat-plugin.ts +31 -0
  35. package/corpus/core/src/styles/agent-conversation.css +7 -0
  36. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +20 -0
  37. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +20 -0
  38. package/corpus/core/src/templates/default/app/i18n/en-US.ts +20 -0
  39. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +20 -0
  40. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +21 -0
  41. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +19 -0
  42. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +20 -0
  43. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +19 -0
  44. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +20 -0
  45. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +19 -0
  46. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +19 -0
  47. package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +28 -0
  48. package/corpus/core/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  49. package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  50. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +29 -10
  51. package/corpus/templates/analytics/.agents/skills/gong/SKILL.md +54 -23
  52. package/corpus/templates/analytics/.builder/skills/apollo/SKILL.md +19 -41
  53. package/corpus/templates/analytics/.builder/skills/commonroom/SKILL.md +20 -35
  54. package/corpus/templates/analytics/.builder/skills/github/SKILL.md +23 -67
  55. package/corpus/templates/analytics/.builder/skills/pylon/SKILL.md +25 -43
  56. package/corpus/templates/analytics/AGENTS.md +22 -13
  57. package/corpus/templates/analytics/actions/account-deep-dive.ts +1 -0
  58. package/corpus/templates/analytics/actions/configure-gong-native-insights.ts +29 -0
  59. package/corpus/templates/analytics/actions/content-calendar-schema.ts +8 -4
  60. package/corpus/templates/analytics/actions/content-calendar.ts +12 -4
  61. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +2 -1
  62. package/corpus/templates/analytics/actions/gong-calls.ts +113 -22
  63. package/corpus/templates/analytics/actions/gong-native-insights.ts +166 -0
  64. package/corpus/templates/analytics/actions/hubspot-deals.ts +190 -46
  65. package/corpus/templates/analytics/actions/pylon-issues.ts +123 -0
  66. package/corpus/templates/analytics/actions/slack-messages.ts +179 -27
  67. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +48 -152
  68. package/corpus/templates/analytics/app/components/ui/chart.tsx +1 -1
  69. package/corpus/templates/analytics/app/hooks/use-chart-tooltip-flip.ts +21 -6
  70. package/corpus/templates/analytics/app/i18n/zh-TW.ts +13 -0
  71. package/corpus/templates/analytics/app/i18n-data.ts +134 -0
  72. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +181 -30
  73. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +6 -0
  74. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +4 -3
  75. package/corpus/templates/analytics/changelog/2026-07-17-dashboard-editors-can-add-shared-extensions-or-opt-into-per-.md +6 -0
  76. package/corpus/templates/analytics/changelog/2026-07-17-dashboard-extensions-show-a-loading-skeleton.md +6 -0
  77. package/corpus/templates/analytics/changelog/2026-07-17-errors-now-group-repeat-failures-consistently-and-keep-priva.md +6 -0
  78. package/corpus/templates/analytics/changelog/2026-07-17-gong-transcript-reviews-now-batch-bounded-call-windows-for-f.md +6 -0
  79. package/corpus/templates/analytics/changelog/2026-07-17-hubspot-deal-filters-now-run-in-hubspot-before-paging-result.md +6 -0
  80. package/corpus/templates/analytics/changelog/2026-07-17-notion-content-calendars-now-discover-the-matching-database-.md +6 -0
  81. package/corpus/templates/analytics/changelog/2026-07-17-pylon-dashboard-reads-now-use-the-paginated-issue-search-api.md +6 -0
  82. package/corpus/templates/analytics/changelog/2026-07-17-slack-reads-no-longer-join-channels-and-report-pagination-coverage.md +6 -0
  83. package/corpus/templates/analytics/server/handlers/notion.ts +14 -3
  84. package/corpus/templates/analytics/server/handlers/slack.ts +182 -29
  85. package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +2 -6
  86. package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +6 -2
  87. package/corpus/templates/analytics/server/lib/error-capture.ts +75 -8
  88. package/corpus/templates/analytics/server/lib/gong-native-policy.ts +72 -0
  89. package/corpus/templates/analytics/server/lib/gong.ts +54 -66
  90. package/corpus/templates/analytics/server/lib/hubspot.ts +40 -3
  91. package/corpus/templates/analytics/server/lib/notion.ts +83 -8
  92. package/corpus/templates/analytics/server/lib/real-data-actions.ts +4 -0
  93. package/corpus/templates/analytics/server/lib/slack.ts +242 -90
  94. package/corpus/templates/analytics/server/plugins/agent-chat.ts +3 -3
  95. package/corpus/templates/analytics/server/routes/api/pylon/accounts.get.ts +42 -1
  96. package/corpus/templates/analytics/server/routes/api/pylon/issues.get.ts +71 -1
  97. package/corpus/templates/analytics/server/routes/api/test-connection.post.ts +44 -4
  98. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +19 -1
  99. package/corpus/templates/clips/app/components/library/create-folder-dialog.tsx +123 -0
  100. package/corpus/templates/clips/app/components/library/library-grid.tsx +42 -4
  101. package/corpus/templates/clips/app/components/library/recording-card.tsx +30 -0
  102. package/corpus/templates/clips/app/entry.client.tsx +6 -1
  103. package/corpus/templates/clips/app/i18n/ar-SA.ts +12 -1
  104. package/corpus/templates/clips/app/i18n/de-DE.ts +12 -1
  105. package/corpus/templates/clips/app/i18n/en-US.ts +12 -1
  106. package/corpus/templates/clips/app/i18n/es-ES.ts +11 -1
  107. package/corpus/templates/clips/app/i18n/fr-FR.ts +11 -1
  108. package/corpus/templates/clips/app/i18n/hi-IN.ts +10 -1
  109. package/corpus/templates/clips/app/i18n/ja-JP.ts +12 -1
  110. package/corpus/templates/clips/app/i18n/ko-KR.ts +11 -1
  111. package/corpus/templates/clips/app/i18n/pt-BR.ts +11 -1
  112. package/corpus/templates/clips/app/i18n/zh-CN.ts +11 -1
  113. package/corpus/templates/clips/app/i18n/zh-TW.ts +11 -1
  114. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +72 -1
  115. package/corpus/templates/clips/changelog/2026-07-17-choose-which-workspace-receives-new-clips-recordings-and-des.md +6 -0
  116. package/corpus/templates/clips/changelog/2026-07-17-create-folders-directly-from-the-move-menu.md +6 -0
  117. package/corpus/templates/clips/changelog/2026-07-17-failed-desktop-uploads-now-offer-a-direct-way-to-reopen-clip.md +6 -0
  118. package/corpus/templates/clips/desktop/src/app.tsx +1 -1
  119. package/corpus/templates/content/app/entry.client.tsx +6 -1
  120. package/corpus/templates/dispatch/AGENTS.md +5 -0
  121. package/corpus/templates/dispatch/changelog/2026-07-17-apps-page-links-to-other-available-apps.md +6 -0
  122. package/corpus/templates/dispatch/changelog/2026-07-17-curated-template-remixes.md +6 -0
  123. package/corpus/templates/mail/app/entry.client.tsx +6 -1
  124. package/corpus/templates/slides/.agents/skills/slide-images/SKILL.md +11 -7
  125. package/corpus/templates/slides/.env.example +0 -1
  126. package/corpus/templates/slides/AGENTS.md +4 -0
  127. package/corpus/templates/slides/DEVELOPING.md +2 -2
  128. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +1 -1
  129. package/corpus/templates/slides/actions/logo-config.ts +6 -7
  130. package/corpus/templates/slides/actions/search-images.ts +11 -39
  131. package/corpus/templates/slides/actions/search-logos.ts +5 -52
  132. package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +1 -1
  133. package/corpus/templates/slides/app/components/editor/LogoSearchPanel.tsx +16 -26
  134. package/corpus/templates/slides/app/entry.client.tsx +6 -1
  135. package/corpus/templates/slides/server/lib/media-search-providers.ts +216 -0
  136. package/corpus/templates/slides/server/register-secrets.ts +30 -0
  137. package/dist/a2a/client.d.ts +38 -1
  138. package/dist/a2a/client.d.ts.map +1 -1
  139. package/dist/a2a/client.js +81 -12
  140. package/dist/a2a/client.js.map +1 -1
  141. package/dist/a2a/handlers.d.ts.map +1 -1
  142. package/dist/a2a/handlers.js +47 -0
  143. package/dist/a2a/handlers.js.map +1 -1
  144. package/dist/a2a/index.d.ts +4 -4
  145. package/dist/a2a/index.d.ts.map +1 -1
  146. package/dist/a2a/index.js +2 -2
  147. package/dist/a2a/index.js.map +1 -1
  148. package/dist/a2a/invoke.d.ts +26 -2
  149. package/dist/a2a/invoke.d.ts.map +1 -1
  150. package/dist/a2a/invoke.js +30 -1
  151. package/dist/a2a/invoke.js.map +1 -1
  152. package/dist/a2a/server.d.ts.map +1 -1
  153. package/dist/a2a/server.js +14 -1
  154. package/dist/a2a/server.js.map +1 -1
  155. package/dist/a2a/types.d.ts +12 -0
  156. package/dist/a2a/types.d.ts.map +1 -1
  157. package/dist/a2a/types.js.map +1 -1
  158. package/dist/action.d.ts +3 -2
  159. package/dist/action.d.ts.map +1 -1
  160. package/dist/action.js.map +1 -1
  161. package/dist/agent/production-agent.d.ts +5 -0
  162. package/dist/agent/production-agent.d.ts.map +1 -1
  163. package/dist/agent/production-agent.js +5 -3
  164. package/dist/agent/production-agent.js.map +1 -1
  165. package/dist/client/AssistantChat.d.ts +14 -1
  166. package/dist/client/AssistantChat.d.ts.map +1 -1
  167. package/dist/client/AssistantChat.js +158 -136
  168. package/dist/client/AssistantChat.js.map +1 -1
  169. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  170. package/dist/client/MultiTabAssistantChat.js +27 -4
  171. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  172. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  173. package/dist/client/agent-chat-adapter.js +21 -39
  174. package/dist/client/agent-chat-adapter.js.map +1 -1
  175. package/dist/client/agent-sidebar-state.d.ts +1 -0
  176. package/dist/client/agent-sidebar-state.d.ts.map +1 -1
  177. package/dist/client/agent-sidebar-state.js +4 -0
  178. package/dist/client/agent-sidebar-state.js.map +1 -1
  179. package/dist/client/analytics.d.ts +14 -0
  180. package/dist/client/analytics.d.ts.map +1 -1
  181. package/dist/client/analytics.js +67 -0
  182. package/dist/client/analytics.js.map +1 -1
  183. package/dist/client/chat/message-components.d.ts +8 -0
  184. package/dist/client/chat/message-components.d.ts.map +1 -1
  185. package/dist/client/chat/message-components.js +62 -19
  186. package/dist/client/chat/message-components.js.map +1 -1
  187. package/dist/client/chat/tool-call-display.d.ts +6 -0
  188. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  189. package/dist/client/chat/tool-call-display.js +83 -14
  190. package/dist/client/chat/tool-call-display.js.map +1 -1
  191. package/dist/client/chat/use-agent-chat-lifecycle-tracking.d.ts +8 -0
  192. package/dist/client/chat/use-agent-chat-lifecycle-tracking.d.ts.map +1 -0
  193. package/dist/client/chat/use-agent-chat-lifecycle-tracking.js +51 -0
  194. package/dist/client/chat/use-agent-chat-lifecycle-tracking.js.map +1 -0
  195. package/dist/client/chat-thread-url.d.ts +2 -0
  196. package/dist/client/chat-thread-url.d.ts.map +1 -0
  197. package/dist/client/chat-thread-url.js +12 -0
  198. package/dist/client/chat-thread-url.js.map +1 -0
  199. package/dist/client/error-capture.d.ts.map +1 -1
  200. package/dist/client/error-capture.js +7 -0
  201. package/dist/client/error-capture.js.map +1 -1
  202. package/dist/client/extensions/ExtensionSlot.d.ts +3 -1
  203. package/dist/client/extensions/ExtensionSlot.d.ts.map +1 -1
  204. package/dist/client/extensions/ExtensionSlot.js +28 -3
  205. package/dist/client/extensions/ExtensionSlot.js.map +1 -1
  206. package/dist/client/index.d.ts +1 -1
  207. package/dist/client/index.d.ts.map +1 -1
  208. package/dist/client/index.js +1 -1
  209. package/dist/client/index.js.map +1 -1
  210. package/dist/client/route-chunk-recovery.d.ts.map +1 -1
  211. package/dist/client/route-chunk-recovery.js +14 -9
  212. package/dist/client/route-chunk-recovery.js.map +1 -1
  213. package/dist/client/session-replay.d.ts +15 -0
  214. package/dist/client/session-replay.d.ts.map +1 -1
  215. package/dist/client/session-replay.js +20 -0
  216. package/dist/client/session-replay.js.map +1 -1
  217. package/dist/collab/routes.d.ts +1 -1
  218. package/dist/collab/struct-routes.d.ts +1 -1
  219. package/dist/extensions/actions.d.ts.map +1 -1
  220. package/dist/extensions/actions.js +2 -10
  221. package/dist/extensions/actions.js.map +1 -1
  222. package/dist/extensions/store.js +1 -1
  223. package/dist/extensions/store.js.map +1 -1
  224. package/dist/localization/default-messages.d.ts +3 -0
  225. package/dist/localization/default-messages.d.ts.map +1 -1
  226. package/dist/localization/default-messages.js +3 -0
  227. package/dist/localization/default-messages.js.map +1 -1
  228. package/dist/mcp/build-server.d.ts +2 -0
  229. package/dist/mcp/build-server.d.ts.map +1 -1
  230. package/dist/mcp/build-server.js +2 -2
  231. package/dist/mcp/build-server.js.map +1 -1
  232. package/dist/notifications/routes.d.ts +2 -2
  233. package/dist/observability/routes.d.ts +1 -1
  234. package/dist/progress/actions.d.ts.map +1 -1
  235. package/dist/progress/actions.js +3 -2
  236. package/dist/progress/actions.js.map +1 -1
  237. package/dist/progress/routes.d.ts +1 -1
  238. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  239. package/dist/provider-api/index.d.ts.map +1 -1
  240. package/dist/provider-api/index.js +91 -8
  241. package/dist/provider-api/index.js.map +1 -1
  242. package/dist/resources/handlers.d.ts +2 -2
  243. package/dist/scripts/call-agent.d.ts.map +1 -1
  244. package/dist/scripts/call-agent.js +107 -16
  245. package/dist/scripts/call-agent.js.map +1 -1
  246. package/dist/server/agent-chat/action-filters-a2a.d.ts +6 -0
  247. package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
  248. package/dist/server/agent-chat/action-filters-a2a.js +27 -0
  249. package/dist/server/agent-chat/action-filters-a2a.js.map +1 -1
  250. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  251. package/dist/server/agent-chat-plugin.js +27 -1
  252. package/dist/server/agent-chat-plugin.js.map +1 -1
  253. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  254. package/dist/server/transcribe-voice.d.ts +1 -1
  255. package/dist/styles/agent-conversation.css +7 -0
  256. package/dist/templates/default/app/i18n/ar-SA.ts +20 -0
  257. package/dist/templates/default/app/i18n/de-DE.ts +20 -0
  258. package/dist/templates/default/app/i18n/en-US.ts +20 -0
  259. package/dist/templates/default/app/i18n/es-ES.ts +20 -0
  260. package/dist/templates/default/app/i18n/fr-FR.ts +21 -0
  261. package/dist/templates/default/app/i18n/hi-IN.ts +19 -0
  262. package/dist/templates/default/app/i18n/ja-JP.ts +20 -0
  263. package/dist/templates/default/app/i18n/ko-KR.ts +19 -0
  264. package/dist/templates/default/app/i18n/pt-BR.ts +20 -0
  265. package/dist/templates/default/app/i18n/zh-CN.ts +19 -0
  266. package/dist/templates/default/app/i18n/zh-TW.ts +19 -0
  267. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +28 -0
  268. package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  269. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  270. package/package.json +1 -1
  271. package/src/templates/default/app/i18n/ar-SA.ts +20 -0
  272. package/src/templates/default/app/i18n/de-DE.ts +20 -0
  273. package/src/templates/default/app/i18n/en-US.ts +20 -0
  274. package/src/templates/default/app/i18n/es-ES.ts +20 -0
  275. package/src/templates/default/app/i18n/fr-FR.ts +21 -0
  276. package/src/templates/default/app/i18n/hi-IN.ts +19 -0
  277. package/src/templates/default/app/i18n/ja-JP.ts +20 -0
  278. package/src/templates/default/app/i18n/ko-KR.ts +19 -0
  279. package/src/templates/default/app/i18n/pt-BR.ts +20 -0
  280. package/src/templates/default/app/i18n/zh-CN.ts +19 -0
  281. package/src/templates/default/app/i18n/zh-TW.ts +19 -0
  282. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +28 -0
  283. package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  284. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  285. package/corpus/templates/analytics/server/handlers/github.ts +0 -200
  286. package/corpus/templates/analytics/server/handlers/pylon.ts +0 -43
  287. package/corpus/templates/analytics/server/lib/apollo.ts +0 -167
  288. package/corpus/templates/analytics/server/lib/commonroom.ts +0 -149
  289. package/corpus/templates/analytics/server/lib/github.ts +0 -660
  290. package/corpus/templates/analytics/server/lib/mixpanel.ts +0 -156
  291. package/corpus/templates/analytics/server/lib/posthog.ts +0 -194
  292. package/corpus/templates/analytics/server/lib/pylon.ts +0 -109
  293. package/corpus/templates/analytics/server/routes/api/github/graphql.post.ts +0 -1
  294. package/corpus/templates/analytics/server/routes/api/github/issue.get.ts +0 -1
  295. package/corpus/templates/analytics/server/routes/api/github/org-prs.get.ts +0 -1
  296. package/corpus/templates/analytics/server/routes/api/github/pr.get.ts +0 -1
  297. package/corpus/templates/analytics/server/routes/api/github/prs.get.ts +0 -1
  298. package/corpus/templates/analytics/server/routes/api/github/search.get.ts +0 -1
  299. package/corpus/templates/slides/actions/fetch-logos.ts +0 -90
  300. package/corpus/templates/slides/actions/image-search.ts +0 -64
  301. package/corpus/templates/slides/actions/import-github.ts +0 -182
  302. package/corpus/templates/slides/actions/logo-lookup.ts +0 -113
@@ -63,6 +63,8 @@ import {
63
63
 
64
64
  // Exported so AssistantChatInner can provide a context value.
65
65
  export const ChatRunningContext = React.createContext(false);
66
+ export const ChatRunDurationContext = React.createContext<number | null>(null);
67
+ export const ASSISTANT_VISIBLE_TOOL_CALL_LIMIT = 3;
66
68
 
67
69
  /**
68
70
  * Human-in-the-loop approval bridge. `AssistantChatInner` provides a value that
@@ -898,6 +900,7 @@ export function ReconnectStreamMessage({
898
900
  content: ContentPart[];
899
901
  }) {
900
902
  const chatRunning = React.useContext(ChatRunningContext);
903
+ const toolSummary = getReconnectToolSummaryInfo(content);
901
904
  const latestReasoningPartIndex = content.reduce(
902
905
  (latestIndex, part, index) =>
903
906
  part.type === "reasoning" ? index : latestIndex,
@@ -908,61 +911,148 @@ export function ReconnectStreamMessage({
908
911
  const streamingReasoningPartIndex =
909
912
  content.at(-1)?.type === "reasoning" ? content.length - 1 : -1;
910
913
 
914
+ const renderPart = (part: ContentPart, i: number) => {
915
+ if (part.type === "text") {
916
+ const partStreaming = chatRunning && i === streamingTextPartIndex;
917
+ return (
918
+ <SmoothMarkdownText
919
+ key={`reconnect-text-${i}`}
920
+ text={part.text}
921
+ streaming={partStreaming}
922
+ resetKey={`reconnect-text-${i}`}
923
+ statusType={partStreaming ? "running" : "complete"}
924
+ />
925
+ );
926
+ }
927
+ if (part.type === "reasoning") {
928
+ return (
929
+ <ReasoningCell
930
+ key={`reconnect-reasoning-${i}`}
931
+ text={part.text}
932
+ isStreaming={chatRunning && i === streamingReasoningPartIndex}
933
+ resetKey={`reconnect-reasoning-${i}`}
934
+ defaultOpen={i === latestReasoningPartIndex}
935
+ collapseWhenReplaced={i < latestReasoningPartIndex}
936
+ />
937
+ );
938
+ }
939
+ return (
940
+ <ToolCallDisplay
941
+ key={`reconnect-tool-${i}`}
942
+ toolName={part.toolName}
943
+ argsText={part.argsText}
944
+ args={part.args}
945
+ result={part.result}
946
+ mcpApp={part.mcpApp}
947
+ chatUI={part.chatUI}
948
+ structuredMeta={part.structuredMeta}
949
+ isRunning={
950
+ part.result === undefined && (chatRunning || part.activity === true)
951
+ }
952
+ approval={part.approval}
953
+ repeatCount={part.repeatCount}
954
+ />
955
+ );
956
+ };
957
+
958
+ const renderedParts: React.ReactNode[] = [];
959
+ let summaryStartIndex = -1;
960
+ let summaryToolCount = 0;
961
+ const flushSummary = (endIndex: number) => {
962
+ if (summaryStartIndex < 0) return;
963
+ renderedParts.push(
964
+ <RanToolsSummary
965
+ key={`reconnect-tool-summary-${summaryStartIndex}`}
966
+ toolCount={summaryToolCount}
967
+ >
968
+ {content
969
+ .slice(summaryStartIndex, endIndex)
970
+ .map((part, offset) => renderPart(part, summaryStartIndex + offset))}
971
+ </RanToolsSummary>,
972
+ );
973
+ summaryStartIndex = -1;
974
+ summaryToolCount = 0;
975
+ };
976
+
977
+ for (let i = 0; i < content.length; i++) {
978
+ const part = content[i]!;
979
+ const isOlderToolWork =
980
+ toolSummary.startIndex >= 0 &&
981
+ i < toolSummary.startIndex &&
982
+ isReconnectToolSummaryPart(content, i, toolSummary.startIndex);
983
+ if (isOlderToolWork) {
984
+ summaryStartIndex = summaryStartIndex < 0 ? i : summaryStartIndex;
985
+ if (part.type === "tool-call") summaryToolCount++;
986
+ continue;
987
+ }
988
+ flushSummary(i);
989
+ renderedParts.push(renderPart(part, i));
990
+ }
991
+ flushSummary(content.length);
992
+
911
993
  return (
912
994
  <div className="flex justify-start">
913
995
  <div className="w-full max-w-[95%] text-sm leading-relaxed text-foreground space-y-1">
914
- {content.map((part, i) => {
915
- if (part.type === "text") {
916
- const partStreaming = chatRunning && i === streamingTextPartIndex;
917
- return (
918
- <SmoothMarkdownText
919
- key={`reconnect-text-${i}`}
920
- text={part.text}
921
- streaming={partStreaming}
922
- resetKey={`reconnect-text-${i}`}
923
- statusType={partStreaming ? "running" : "complete"}
924
- />
925
- );
926
- }
927
- if (part.type === "reasoning") {
928
- return (
929
- <ReasoningCell
930
- key={`reconnect-reasoning-${i}`}
931
- text={part.text}
932
- isStreaming={chatRunning && i === streamingReasoningPartIndex}
933
- resetKey={`reconnect-reasoning-${i}`}
934
- defaultOpen={i === latestReasoningPartIndex}
935
- collapseWhenReplaced={i < latestReasoningPartIndex}
936
- />
937
- );
938
- }
939
- if (part.type === "tool-call") {
940
- return (
941
- <ToolCallDisplay
942
- key={`reconnect-tool-${i}`}
943
- toolName={part.toolName}
944
- argsText={part.argsText}
945
- args={part.args}
946
- result={part.result}
947
- mcpApp={part.mcpApp}
948
- chatUI={part.chatUI}
949
- structuredMeta={part.structuredMeta}
950
- isRunning={
951
- part.result === undefined &&
952
- (chatRunning || part.activity === true)
953
- }
954
- approval={part.approval}
955
- repeatCount={part.repeatCount}
956
- />
957
- );
958
- }
959
- return null;
960
- })}
996
+ {renderedParts}
961
997
  </div>
962
998
  </div>
963
999
  );
964
1000
  }
965
1001
 
1002
+ function getReconnectToolSummaryInfo(content: readonly ContentPart[]) {
1003
+ const toolCallIndices = content.reduce<number[]>((indices, part, index) => {
1004
+ if (part.type === "tool-call" && isReconnectSummarizablePart(part)) {
1005
+ indices.push(index);
1006
+ }
1007
+ return indices;
1008
+ }, []);
1009
+ if (toolCallIndices.length <= ASSISTANT_VISIBLE_TOOL_CALL_LIMIT) {
1010
+ return { startIndex: -1 };
1011
+ }
1012
+ return {
1013
+ startIndex:
1014
+ toolCallIndices[
1015
+ toolCallIndices.length - ASSISTANT_VISIBLE_TOOL_CALL_LIMIT
1016
+ ]!,
1017
+ };
1018
+ }
1019
+
1020
+ function isReconnectSummarizablePart(part: ContentPart): boolean {
1021
+ return (
1022
+ part.type === "reasoning" ||
1023
+ (part.type === "tool-call" && part.toolName !== "connect-builder")
1024
+ );
1025
+ }
1026
+
1027
+ function isReconnectToolSummaryPart(
1028
+ content: readonly ContentPart[],
1029
+ index: number,
1030
+ startIndex: number,
1031
+ ): boolean {
1032
+ if (startIndex < 0 || index >= startIndex) return false;
1033
+ if (!isReconnectSummarizablePart(content[index]!)) return false;
1034
+
1035
+ let segmentStart = index;
1036
+ while (
1037
+ segmentStart > 0 &&
1038
+ isReconnectSummarizablePart(content[segmentStart - 1]!)
1039
+ ) {
1040
+ segmentStart--;
1041
+ }
1042
+
1043
+ let segmentEnd = index + 1;
1044
+ while (
1045
+ segmentEnd < startIndex &&
1046
+ isReconnectSummarizablePart(content[segmentEnd]!)
1047
+ ) {
1048
+ segmentEnd++;
1049
+ }
1050
+
1051
+ return content
1052
+ .slice(segmentStart, segmentEnd)
1053
+ .some((candidate) => candidate.type === "tool-call");
1054
+ }
1055
+
966
1056
  // ─── Reasoning / Thinking cell ────────────────────────────────────────────────
967
1057
 
968
1058
  /**
@@ -1141,6 +1231,39 @@ export function WorkedForSummary({
1141
1231
  );
1142
1232
  }
1143
1233
 
1234
+ export function RanToolsSummary({
1235
+ toolCount,
1236
+ children,
1237
+ }: {
1238
+ toolCount: number;
1239
+ children: React.ReactNode;
1240
+ }) {
1241
+ const [open, setOpen] = useState(false);
1242
+ const label = `Ran ${toolCount} ${toolCount === 1 ? "tool" : "tools"}`;
1243
+
1244
+ return (
1245
+ <div className="my-1 w-full">
1246
+ <button
1247
+ type="button"
1248
+ onClick={() => setOpen((v) => !v)}
1249
+ aria-expanded={open}
1250
+ className="flex items-center gap-1.5 py-0.5 text-[13px] text-muted-foreground transition-colors hover:text-foreground"
1251
+ >
1252
+ <span>{label}</span>
1253
+ <IconChevronRight
1254
+ className={cn(
1255
+ "size-3.5 shrink-0 transition-transform",
1256
+ open && "rotate-90",
1257
+ )}
1258
+ />
1259
+ </button>
1260
+ <AnimatedCollapse open={open}>
1261
+ <div className="pt-1">{children}</div>
1262
+ </AnimatedCollapse>
1263
+ </div>
1264
+ );
1265
+ }
1266
+
1144
1267
  // ─── Re-export for AssistantMessage ───────────────────────────────────────────
1145
1268
  // AssistantMessage in AssistantChat.tsx uses FilesChangedSummary directly, so
1146
1269
  // re-export it so AssistantChat.tsx can import from one place.
@@ -0,0 +1,74 @@
1
+ import { useCallback, useEffect } from "react";
2
+
3
+ import {
4
+ ACTIVE_RUN_STATE_EVENT,
5
+ getActiveRun,
6
+ type ActiveRunState,
7
+ } from "../active-run-state.js";
8
+ import { trackAgentChatLifecycle } from "../analytics.js";
9
+
10
+ export interface AgentChatLifecycleTrackingOptions {
11
+ surface: string;
12
+ threadId?: string;
13
+ tabId?: string;
14
+ onActiveRunChange?: (active: boolean) => void;
15
+ }
16
+
17
+ export function useAgentChatLifecycleTracking({
18
+ surface,
19
+ threadId,
20
+ tabId,
21
+ onActiveRunChange,
22
+ }: AgentChatLifecycleTrackingOptions): (runId?: string) => void {
23
+ useEffect(() => {
24
+ trackAgentChatLifecycle({
25
+ phase: "surface-mounted",
26
+ surface,
27
+ ...(threadId ? { threadId } : {}),
28
+ ...(tabId ? { tabId } : {}),
29
+ });
30
+ }, [surface, tabId, threadId]);
31
+
32
+ useEffect(() => {
33
+ const sync = (state = getActiveRun()) => {
34
+ const active = Boolean(
35
+ threadId && state?.threadId === threadId && state.runId,
36
+ );
37
+ onActiveRunChange?.(active);
38
+ if (!active || !state) return;
39
+ trackAgentChatLifecycle({
40
+ phase: "run-observed",
41
+ surface,
42
+ threadId: state.threadId,
43
+ runId: state.runId,
44
+ ...(tabId ? { tabId } : {}),
45
+ });
46
+ };
47
+ sync();
48
+ const activeRunHandler = (event: Event) => {
49
+ const state = (event as CustomEvent<{ state?: ActiveRunState | null }>)
50
+ .detail?.state;
51
+ sync(state ?? null);
52
+ };
53
+ const storageHandler = () => sync();
54
+ window.addEventListener(ACTIVE_RUN_STATE_EVENT, activeRunHandler);
55
+ window.addEventListener("storage", storageHandler);
56
+ return () => {
57
+ window.removeEventListener(ACTIVE_RUN_STATE_EVENT, activeRunHandler);
58
+ window.removeEventListener("storage", storageHandler);
59
+ };
60
+ }, [onActiveRunChange, surface, tabId, threadId]);
61
+
62
+ return useCallback(
63
+ (runId?: string) => {
64
+ trackAgentChatLifecycle({
65
+ phase: "run-stopped",
66
+ surface,
67
+ ...(threadId ? { threadId } : {}),
68
+ ...(runId ? { runId } : {}),
69
+ ...(tabId ? { tabId } : {}),
70
+ });
71
+ },
72
+ [surface, tabId, threadId],
73
+ );
74
+ }
@@ -0,0 +1,11 @@
1
+ export function hasChatThreadDeepLink(): boolean {
2
+ if (typeof window === "undefined") return false;
3
+ try {
4
+ const params = new URLSearchParams(window.location.search);
5
+ return Boolean(
6
+ params.get("thread")?.trim() || params.get("threadId")?.trim(),
7
+ );
8
+ } catch {
9
+ return false;
10
+ }
11
+ }
@@ -355,6 +355,18 @@ function shouldIgnoreAutoCapturedError(normalized: {
355
355
  return true;
356
356
  }
357
357
 
358
+ // Route-chunk recovery reloads the current page after stale lazy chunks or
359
+ // module scripts fail. Browser-level failures have no useful stack, so do
360
+ // not retain the transient loader noise as an application issue.
361
+ if (
362
+ !stack &&
363
+ /^(?:Importing a module script failed\.?|(?:Failed to fetch|error loading) dynamically imported module(?::.*)?)$/i.test(
364
+ message,
365
+ )
366
+ ) {
367
+ return true;
368
+ }
369
+
358
370
  if (
359
371
  normalized.type === "InvalidStateError" &&
360
372
  /^Transition was aborted because of invalid state$/i.test(message)
@@ -1,6 +1,6 @@
1
1
  import { IconPlus } from "@tabler/icons-react";
2
2
  import { useQuery, useQueryClient } from "@tanstack/react-query";
3
- import { useState } from "react";
3
+ import { useEffect, useRef, useState } from "react";
4
4
 
5
5
  import { sendToAgentChat } from "../agent-chat.js";
6
6
  import { agentNativePath } from "../api-path.js";
@@ -49,6 +49,8 @@ export interface ExtensionSlotProps {
49
49
  className?: string;
50
50
  /** Optional className applied to each EmbeddedExtension. */
51
51
  toolClassName?: string;
52
+ /** Fires once when the slot query and all installed extensions are ready. */
53
+ onReady?: () => void;
52
54
  }
53
55
 
54
56
  /**
@@ -70,8 +72,11 @@ export function ExtensionSlot({
70
72
  showEmptyAffordance,
71
73
  className,
72
74
  toolClassName,
75
+ onReady,
73
76
  }: ExtensionSlotProps) {
74
77
  const t = useT();
78
+ const readyInstallIds = useRef(new Set<string>());
79
+ const readyNotified = useRef(false);
75
80
  const installsQuery = useQuery<SlotInstall[]>({
76
81
  queryKey: ["slot-installs", id],
77
82
  queryFn: async () => {
@@ -87,6 +92,35 @@ export function ExtensionSlot({
87
92
  });
88
93
  const installs = installsQuery.data ?? [];
89
94
 
95
+ useEffect(() => {
96
+ readyInstallIds.current.clear();
97
+ readyNotified.current = false;
98
+ }, [id]);
99
+
100
+ useEffect(() => {
101
+ if (readyNotified.current || installsQuery.isLoading) return;
102
+ if (
103
+ installsQuery.isError ||
104
+ installs.length === 0 ||
105
+ readyInstallIds.current.size >= installs.length
106
+ ) {
107
+ readyNotified.current = true;
108
+ onReady?.();
109
+ }
110
+ }, [installs, installsQuery.isError, installsQuery.isLoading, onReady]);
111
+
112
+ const markInstallReady = (installId: string) => {
113
+ readyInstallIds.current.add(installId);
114
+ if (
115
+ !readyNotified.current &&
116
+ !installsQuery.isLoading &&
117
+ readyInstallIds.current.size >= installs.length
118
+ ) {
119
+ readyNotified.current = true;
120
+ onReady?.();
121
+ }
122
+ };
123
+
90
124
  if (installsQuery.isLoading) {
91
125
  return null;
92
126
  }
@@ -121,6 +155,8 @@ export function ExtensionSlot({
121
155
  slotId={id}
122
156
  context={context}
123
157
  className={toolClassName}
158
+ onReady={() => markInstallReady(install.installId)}
159
+ onUnavailable={() => markInstallReady(install.installId)}
124
160
  />
125
161
  ))}
126
162
  </div>
@@ -787,6 +787,7 @@ export {
787
787
  export { AgentTerminal, type AgentTerminalProps } from "./terminal/index.js";
788
788
  export {
789
789
  trackEvent,
790
+ trackAgentChatLifecycle,
790
791
  trackSessionStatus,
791
792
  configureTracking,
792
793
  setTrackingContentCaptureEnabled,
@@ -811,6 +812,7 @@ export {
811
812
  type CaptureExceptionContext,
812
813
  type CapturedExceptionEvent,
813
814
  type ClientCaptureContext,
815
+ type AgentChatLifecycleEvent,
814
816
  type ConfigureTrackingOptions,
815
817
  type ErrorCaptureConfigOptions,
816
818
  type ExceptionBreadcrumb,
@@ -201,6 +201,17 @@ function recoverToIntendedNavigation(
201
201
  return true;
202
202
  }
203
203
 
204
+ function recoverFromDynamicImportFailure(
205
+ win: Window,
206
+ state: RouteChunkRecoveryState,
207
+ message: string,
208
+ ): boolean {
209
+ if (!isDynamicImportFailureMessage(message)) return false;
210
+ state.routeModuleFailureAt = Date.now();
211
+ if (recoverToIntendedNavigation(win, state)) return true;
212
+ return reloadForStaleChunk(win);
213
+ }
214
+
204
215
  function patchHistoryMethod(
205
216
  win: Window,
206
217
  state: RouteChunkRecoveryState,
@@ -290,16 +301,17 @@ export function installRouteChunkRecovery(
290
301
  win.addEventListener("unhandledrejection", (event) => {
291
302
  const reason = (event as PromiseRejectionEvent).reason;
292
303
  const message = String(reason?.message || reason || "");
293
- if (!isDynamicImportFailureMessage(message)) return;
294
- state.routeModuleFailureAt = Date.now();
295
- if (recoverToIntendedNavigation(win, state)) {
304
+ if (recoverFromDynamicImportFailure(win, state, message)) {
296
305
  event.preventDefault();
297
- return;
298
306
  }
299
- // No fresh cross-route target — the current route's own chunk went stale.
300
- // Reload once (guarded) to fetch fresh assets instead of leaving the user
301
- // on a broken view.
302
- if (reloadForStaleChunk(win)) {
307
+ });
308
+
309
+ win.addEventListener("error", (event) => {
310
+ const errorEvent = event as ErrorEvent;
311
+ const message = String(
312
+ errorEvent.error?.message || errorEvent.message || "",
313
+ );
314
+ if (recoverFromDynamicImportFailure(win, state, message)) {
303
315
  event.preventDefault();
304
316
  }
305
317
  });
@@ -390,6 +390,8 @@ const SESSION_REPLAY_CLAIM_TIMEOUT_MS = 150;
390
390
  export const SESSION_REPLAY_CONSOLE_EVENT_TAG = "agent-native.console";
391
391
  /** rrweb custom-event tag for captured fetch/XHR request summaries. */
392
392
  export const SESSION_REPLAY_NETWORK_EVENT_TAG = "agent-native.network";
393
+ /** Content-free agent-chat lifecycle markers for replay incident forensics. */
394
+ export const SESSION_REPLAY_AGENT_CHAT_EVENT_TAG = "agent-native.chat";
393
395
 
394
396
  const DEFAULT_MAX_CONSOLE_EVENTS = 1000;
395
397
  const DEFAULT_MAX_NETWORK_EVENTS = 2000;
@@ -3384,3 +3386,32 @@ export function emitSessionReplayException(input: {
3384
3386
  ...(input.url ? { url: input.url } : {}),
3385
3387
  });
3386
3388
  }
3389
+
3390
+ export type SessionReplayAgentChatEvent = {
3391
+ phase: "surface-mounted" | "run-observed" | "run-stopped";
3392
+ surface: string;
3393
+ threadId?: string;
3394
+ runId?: string;
3395
+ tabId?: string;
3396
+ };
3397
+
3398
+ /**
3399
+ * Add a content-free chat lifecycle marker to the active replay. The payload
3400
+ * deliberately accepts only ids and low-cardinality state; prompt/response
3401
+ * content must never enter replay diagnostics through this path.
3402
+ */
3403
+ export function emitSessionReplayAgentChatEvent(
3404
+ input: SessionReplayAgentChatEvent,
3405
+ ): void {
3406
+ const state = getState();
3407
+ if (!state.active || !state.addCustomEvent) return;
3408
+ const bounded = (value: string | undefined, max = 160) =>
3409
+ value?.trim().slice(0, max) || undefined;
3410
+ emitReplayCustomEvent(state, SESSION_REPLAY_AGENT_CHAT_EVENT_TAG, {
3411
+ phase: input.phase,
3412
+ surface: bounded(input.surface, 80) ?? "app",
3413
+ ...(bounded(input.threadId) ? { threadId: bounded(input.threadId) } : {}),
3414
+ ...(bounded(input.runId) ? { runId: bounded(input.runId) } : {}),
3415
+ ...(bounded(input.tabId) ? { tabId: bounded(input.tabId) } : {}),
3416
+ });
3417
+ }
@@ -727,20 +727,8 @@ export function createExtensionActionEntries(): Record<string, ActionEntry> {
727
727
  !coerceBoolean(args?.allowFullReplacement)
728
728
  ) {
729
729
  const message =
730
- "Full extension-body replacement was blocked to preserve the existing visual design. Read the current extension and use focused patches/edits for a data-only repair. Only retry with allowFullReplacement=true when the user explicitly requested a broad visual rewrite or supplied a complete replacement body.";
731
- throw new AgentActionStopError(message, {
732
- errorCode: "extension_full_replacement_requires_explicit_intent",
733
- toolResult: JSON.stringify(
734
- {
735
- error: "extension_full_replacement_requires_explicit_intent",
736
- message,
737
- recoverable: false,
738
- next: "Call get-extension once, then update-extension with patches or edits that change only the data-loading code. Use allowFullReplacement=true only for an explicitly requested visual rewrite.",
739
- },
740
- null,
741
- 2,
742
- ),
743
- });
730
+ "Full extension-body replacement requires allowFullReplacement=true. No changes were applied. If the user's request includes a broad visual rewrite such as changing layout, compactness, visible sections, naming, or padding, retry once with allowFullReplacement=true; otherwise read the current extension and use focused patches/edits for a data-only repair. Do not retry unchanged arguments.";
731
+ throw new ExtensionContentEditError(message);
744
732
  }
745
733
 
746
734
  // Full-replacement content can come inline (`content`) or by reference
@@ -1192,7 +1192,7 @@ export async function updateExtensionContent(
1192
1192
 
1193
1193
  if (opts.content !== undefined && opts.allowFullReplacement !== true) {
1194
1194
  throw new ExtensionContentEditError(
1195
- "Full extension-body replacement requires explicit allowFullReplacement=true. Use patches or edits for a targeted data-only repair so the existing design is preserved.",
1195
+ "Full extension-body replacement requires allowFullReplacement=true. No changes were applied. Use patches or edits for a targeted data-only repair, or set allowFullReplacement=true for a user-requested broad visual rewrite.",
1196
1196
  );
1197
1197
  }
1198
1198
 
@@ -129,6 +129,9 @@ const messages = {
129
129
  'Apps in the "{{workspace}}" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.',
130
130
  appsInWorkspace: "Apps in {{workspace}}",
131
131
  workspaceApps: "Workspace apps",
132
+ otherApps: "Other apps",
133
+ otherAppsDescription: "Open other apps available to you.",
134
+ availableCount: "{{count}} available",
132
135
  activeCount: "{{count}} active",
133
136
  hiddenCount: "{{count}} hidden",
134
137
  createApp: "Create app",
@@ -345,7 +345,7 @@ function warnFullCatalogServed(toolCount: number): void {
345
345
  );
346
346
  }
347
347
 
348
- function isAuthenticatedReadAction(entry: ActionEntry): boolean {
348
+ export function isAuthenticatedReadAction(entry: ActionEntry): boolean {
349
349
  return (
350
350
  entry.http !== false &&
351
351
  entry.http?.method === "GET" &&
@@ -404,7 +404,7 @@ const AUTO_READ_EXCLUDED_ACTION_PATTERNS: RegExp[] = [
404
404
  /browser-session/,
405
405
  ];
406
406
 
407
- function isAutoReadExcludedActionName(name: string): boolean {
407
+ export function isAutoReadExcludedActionName(name: string): boolean {
408
408
  return (
409
409
  AUTO_READ_EXCLUDED_ACTION_NAMES.has(name) ||
410
410
  AUTO_READ_EXCLUDED_ACTION_PATTERNS.some((pattern) => pattern.test(name))
@@ -35,6 +35,7 @@ Use for non-trivial work with multiple real steps (not single-action lookups). D
35
35
  - Exactly one task in progress at a time; never batch-complete steps after the fact — update as you go.
36
36
  - Always transition pending → in_progress before completing a step.
37
37
  - If the task pivots (scope change, unexpected blocker), update the current step to reflect it before continuing.
38
+ - Only include fields for the selected action; do not send empty placeholder fields.
38
39
  - End every run with "complete" (succeeded / failed / cancelled). Never leave a run open indefinitely.
39
40
 
40
41
  Actions:
@@ -78,8 +79,9 @@ Actions:
78
79
  },
79
80
  status: {
80
81
  type: "string",
81
- enum: ["succeeded", "failed", "cancelled"],
82
- description: "[complete] Terminal status for the run.",
82
+ enum: ["", "succeeded", "failed", "cancelled"],
83
+ description:
84
+ '[complete] Terminal status for the run. Omit it for "start" and "update".',
83
85
  },
84
86
  active: {
85
87
  type: "boolean",