@mastra/playground-ui 68.0.0-alpha.2 → 68.0.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 (479) hide show
  1. package/dist/{FilterBar-CQl04O6t.cjs → FilterBar-BSP2UTjc.cjs} +2 -2
  2. package/dist/{FilterBar-CQl04O6t.cjs.map → FilterBar-BSP2UTjc.cjs.map} +1 -1
  3. package/dist/{FilterBar-BgW2dqRQ.js → FilterBar-PSQ1OwqH.js} +2 -2
  4. package/dist/{FilterBar-BgW2dqRQ.js.map → FilterBar-PSQ1OwqH.js.map} +1 -1
  5. package/dist/KnowledgePageGraph.css +55 -0
  6. package/dist/{MarkdownRenderer-2GOXQJEv.js → MarkdownRenderer-CI30RqdB.js} +19 -6
  7. package/dist/MarkdownRenderer-CI30RqdB.js.map +1 -0
  8. package/dist/{MarkdownRenderer-CB8Z_CHc.cjs → MarkdownRenderer-y65WGBhC.cjs} +19 -6
  9. package/dist/MarkdownRenderer-y65WGBhC.cjs.map +1 -0
  10. package/dist/{MetricsCard-CEB-f2sv.cjs → MetricsCard-BEwiS7Pe.cjs} +8 -8
  11. package/dist/MetricsCard-BEwiS7Pe.cjs.map +1 -0
  12. package/dist/{MetricsCard-M8awJ2B_.js → MetricsCard-ua6C6b8a.js} +10 -10
  13. package/dist/MetricsCard-ua6C6b8a.js.map +1 -0
  14. package/dist/{MetricsLineChart-BhHoduO0.js → MetricsLineChart-4SwxBbQx.js} +14 -3
  15. package/dist/MetricsLineChart-4SwxBbQx.js.map +1 -0
  16. package/dist/{MetricsLineChart-CjBm4IXu.cjs → MetricsLineChart-tZxsauau.cjs} +13 -2
  17. package/dist/MetricsLineChart-tZxsauau.cjs.map +1 -0
  18. package/dist/{MetricsStackedBarChart-BdMlKv6G.cjs → MetricsStackedBarChart-CDLE76IB.cjs} +2 -2
  19. package/dist/{MetricsStackedBarChart-BdMlKv6G.cjs.map → MetricsStackedBarChart-CDLE76IB.cjs.map} +1 -1
  20. package/dist/{MetricsStackedBarChart-BRuA6MTE.js → MetricsStackedBarChart-D2QyS4-z.js} +2 -2
  21. package/dist/{MetricsStackedBarChart-BRuA6MTE.js.map → MetricsStackedBarChart-D2QyS4-z.js.map} +1 -1
  22. package/dist/{activity-rJ1NQl_2.js → activity-C8Ql81WM.js} +2 -2
  23. package/dist/{activity-rJ1NQl_2.js.map → activity-C8Ql81WM.js.map} +1 -1
  24. package/dist/{activity-DyB5H3gF.cjs → activity-CcQZeDYi.cjs} +2 -2
  25. package/dist/{activity-DyB5H3gF.cjs.map → activity-CcQZeDYi.cjs.map} +1 -1
  26. package/dist/components/DateTimeRangePicker.cjs.js +1 -1
  27. package/dist/components/DateTimeRangePicker.es.js +1 -1
  28. package/dist/components/FilterBar.cjs.js +2 -2
  29. package/dist/components/FilterBar.es.js +2 -2
  30. package/dist/components/MarkdownRenderer.cjs.js +1 -1
  31. package/dist/components/MarkdownRenderer.es.js +1 -1
  32. package/dist/components/MetricsCard.cjs.js +1 -1
  33. package/dist/components/MetricsCard.es.js +1 -1
  34. package/dist/components/MetricsLineChart.cjs.js +1 -1
  35. package/dist/components/MetricsLineChart.es.js +1 -1
  36. package/dist/components/MetricsStackedBarChart.cjs.js +1 -1
  37. package/dist/components/MetricsStackedBarChart.es.js +1 -1
  38. package/dist/components/SavedViews.cjs.js +1 -1
  39. package/dist/components/SavedViews.es.js +1 -1
  40. package/dist/components/ai/activity.cjs.js +1 -1
  41. package/dist/components/ai/activity.es.js +1 -1
  42. package/dist/components/ai/plan.cjs.js +1 -1
  43. package/dist/components/ai/plan.es.js +1 -1
  44. package/dist/components/ai/tool-approval.cjs.js +1 -1
  45. package/dist/components/ai/tool-approval.es.js +1 -1
  46. package/dist/components/ai/tool-call.cjs.js +2 -2
  47. package/dist/components/ai/tool-call.es.js +2 -2
  48. package/dist/{date-time-range-picker-CTt7Od0P.cjs → date-time-range-picker-CWGjoR3j.cjs} +40 -13
  49. package/dist/date-time-range-picker-CWGjoR3j.cjs.map +1 -0
  50. package/dist/{date-time-range-picker-DKh1K9Iy.js → date-time-range-picker-CdSiXwB4.js} +40 -13
  51. package/dist/date-time-range-picker-CdSiXwB4.js.map +1 -0
  52. package/dist/domains/chat/activity/activity-stretch-line.cjs.js +1 -1
  53. package/dist/domains/chat/activity/activity-stretch-line.es.js +1 -1
  54. package/dist/domains/chat/activity/components/activity-fold.cjs.js +1 -1
  55. package/dist/domains/chat/activity/components/activity-fold.es.js +1 -1
  56. package/dist/domains/chat/activity/components/activity-timed-trigger.cjs.js +1 -1
  57. package/dist/domains/chat/activity/components/activity-timed-trigger.es.js +1 -1
  58. package/dist/domains/chat/activity/components/calls-panel.cjs.js +1 -1
  59. package/dist/domains/chat/activity/components/calls-panel.es.js +1 -1
  60. package/dist/domains/chat/activity/components/stretch-content.cjs.js +1 -1
  61. package/dist/domains/chat/activity/components/stretch-content.es.js +1 -1
  62. package/dist/domains/chat/activity/components/stretch-thought.cjs.js +1 -1
  63. package/dist/domains/chat/activity/components/stretch-thought.es.js +1 -1
  64. package/dist/domains/chat/activity/model/activity-segments.cjs.js +1 -1
  65. package/dist/domains/chat/activity/model/activity-segments.es.js +1 -1
  66. package/dist/domains/chat/activity/model/activity-words.cjs.js +2 -2
  67. package/dist/domains/chat/activity/model/activity-words.es.js +2 -2
  68. package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
  69. package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
  70. package/dist/domains/chat/knowledge/knowledge-links.cjs.js +52 -6
  71. package/dist/domains/chat/knowledge/knowledge-links.cjs.js.map +1 -1
  72. package/dist/domains/chat/knowledge/knowledge-links.es.js +53 -9
  73. package/dist/domains/chat/knowledge/knowledge-links.es.js.map +1 -1
  74. package/dist/domains/chat/knowledge/pinned-knowledge-data.cjs.js +10 -3
  75. package/dist/domains/chat/knowledge/pinned-knowledge-data.cjs.js.map +1 -1
  76. package/dist/domains/chat/knowledge/pinned-knowledge-data.es.js +10 -3
  77. package/dist/domains/chat/knowledge/pinned-knowledge-data.es.js.map +1 -1
  78. package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js +8 -3
  79. package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js.map +1 -1
  80. package/dist/domains/chat/knowledge/pinned-knowledge.es.js +8 -3
  81. package/dist/domains/chat/knowledge/pinned-knowledge.es.js.map +1 -1
  82. package/dist/domains/chat/knowledge.cjs.js +2 -0
  83. package/dist/domains/chat/knowledge.es.js +2 -2
  84. package/dist/domains/chat/messages/message-row.cjs.js +3 -3
  85. package/dist/domains/chat/messages/message-row.es.js +3 -3
  86. package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
  87. package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
  88. package/dist/domains/chat/messages/reasoning-content.cjs.js +1 -1
  89. package/dist/domains/chat/messages/reasoning-content.es.js +1 -1
  90. package/dist/domains/chat/messages/renderers/message-text.cjs.js +35 -1
  91. package/dist/domains/chat/messages/renderers/message-text.cjs.js.map +1 -1
  92. package/dist/domains/chat/messages/renderers/message-text.es.js +36 -2
  93. package/dist/domains/chat/messages/renderers/message-text.es.js.map +1 -1
  94. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.cjs.js +1 -1
  95. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.es.js +1 -1
  96. package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
  97. package/dist/domains/chat/messages/signal-badge.es.js +1 -1
  98. package/dist/domains/chat/messages/skill-message.cjs.js +2 -2
  99. package/dist/domains/chat/messages/skill-message.es.js +2 -2
  100. package/dist/domains/chat/messages/system-reminder-badge.cjs.js +1 -1
  101. package/dist/domains/chat/messages/system-reminder-badge.es.js +1 -1
  102. package/dist/domains/chat/tools/badges/agent-badge-wrapper.cjs.js +1 -1
  103. package/dist/domains/chat/tools/badges/agent-badge-wrapper.es.js +1 -1
  104. package/dist/domains/chat/tools/badges/agent-badge.cjs.js +1 -1
  105. package/dist/domains/chat/tools/badges/agent-badge.es.js +1 -1
  106. package/dist/domains/chat/tools/badges/file-tree-badge.cjs.js +2 -2
  107. package/dist/domains/chat/tools/badges/file-tree-badge.es.js +2 -2
  108. package/dist/domains/chat/tools/badges/knowledge-body-range.cjs.js +80 -0
  109. package/dist/domains/chat/tools/badges/knowledge-body-range.cjs.js.map +1 -0
  110. package/dist/domains/chat/tools/badges/knowledge-body-range.d.ts +1 -0
  111. package/dist/domains/chat/tools/badges/knowledge-body-range.es.js +78 -0
  112. package/dist/domains/chat/tools/badges/knowledge-body-range.es.js.map +1 -0
  113. package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js +163 -13
  114. package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js.map +1 -1
  115. package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js +165 -15
  116. package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js.map +1 -1
  117. package/dist/domains/chat/tools/badges/mcp-input-request-badge.cjs.js +51 -0
  118. package/dist/domains/chat/tools/badges/mcp-input-request-badge.cjs.js.map +1 -0
  119. package/dist/domains/chat/tools/badges/mcp-input-request-badge.d.ts +1 -0
  120. package/dist/domains/chat/tools/badges/mcp-input-request-badge.es.js +49 -0
  121. package/dist/domains/chat/tools/badges/mcp-input-request-badge.es.js.map +1 -0
  122. package/dist/domains/chat/tools/badges/mcp-task-chip.cjs.js +7 -2
  123. package/dist/domains/chat/tools/badges/mcp-task-chip.cjs.js.map +1 -1
  124. package/dist/domains/chat/tools/badges/mcp-task-chip.es.js +7 -2
  125. package/dist/domains/chat/tools/badges/mcp-task-chip.es.js.map +1 -1
  126. package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +2 -2
  127. package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +2 -2
  128. package/dist/domains/chat/tools/badges/observation-marker-details.cjs.js +2 -2
  129. package/dist/domains/chat/tools/badges/observation-marker-details.es.js +2 -2
  130. package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +1 -1
  131. package/dist/domains/chat/tools/badges/observation-renderer.es.js +1 -1
  132. package/dist/domains/chat/tools/badges/sandbox-execution-badge.cjs.js +2 -2
  133. package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js +2 -2
  134. package/dist/domains/chat/tools/badges/tool-approval-badge.cjs.js +1 -1
  135. package/dist/domains/chat/tools/badges/tool-approval-badge.es.js +1 -1
  136. package/dist/domains/chat/tools/badges/tool-badge.cjs.js +9 -4
  137. package/dist/domains/chat/tools/badges/tool-badge.cjs.js.map +1 -1
  138. package/dist/domains/chat/tools/badges/tool-badge.es.js +9 -4
  139. package/dist/domains/chat/tools/badges/tool-badge.es.js.map +1 -1
  140. package/dist/domains/chat/tools/badges/use-deferred-input-request.cjs.js +81 -0
  141. package/dist/domains/chat/tools/badges/use-deferred-input-request.cjs.js.map +1 -0
  142. package/dist/domains/chat/tools/badges/use-deferred-input-request.d.ts +1 -0
  143. package/dist/domains/chat/tools/badges/use-deferred-input-request.es.js +77 -0
  144. package/dist/domains/chat/tools/badges/use-deferred-input-request.es.js.map +1 -0
  145. package/dist/domains/chat/tools/badges/use-mcp-task-progress.cjs.js +11 -2
  146. package/dist/domains/chat/tools/badges/use-mcp-task-progress.cjs.js.map +1 -1
  147. package/dist/domains/chat/tools/badges/use-mcp-task-progress.es.js +11 -2
  148. package/dist/domains/chat/tools/badges/use-mcp-task-progress.es.js.map +1 -1
  149. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +1 -1
  150. package/dist/domains/chat/tools/badges/workflow-badge.es.js +1 -1
  151. package/dist/domains/chat/tools/connect-prompt-tool.cjs.js +79 -4
  152. package/dist/domains/chat/tools/connect-prompt-tool.cjs.js.map +1 -1
  153. package/dist/domains/chat/tools/connect-prompt-tool.es.js +79 -4
  154. package/dist/domains/chat/tools/connect-prompt-tool.es.js.map +1 -1
  155. package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js +238 -0
  156. package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js.map +1 -0
  157. package/dist/domains/chat/tools/mcp-input-request-tool.d.ts +1 -0
  158. package/dist/domains/chat/tools/mcp-input-request-tool.es.js +237 -0
  159. package/dist/domains/chat/tools/mcp-input-request-tool.es.js.map +1 -0
  160. package/dist/domains/chat/tools/mcp-input-request.cjs.js +40 -0
  161. package/dist/domains/chat/tools/mcp-input-request.cjs.js.map +1 -0
  162. package/dist/domains/chat/tools/mcp-input-request.d.ts +1 -0
  163. package/dist/domains/chat/tools/mcp-input-request.es.js +33 -0
  164. package/dist/domains/chat/tools/mcp-input-request.es.js.map +1 -0
  165. package/dist/domains/chat/tools/tool-card-kind.cjs.js +9 -4
  166. package/dist/domains/chat/tools/tool-card-kind.cjs.js.map +1 -1
  167. package/dist/domains/chat/tools/tool-card-kind.es.js +9 -5
  168. package/dist/domains/chat/tools/tool-card-kind.es.js.map +1 -1
  169. package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
  170. package/dist/domains/chat/tools/tool-card.es.js +1 -1
  171. package/dist/domains/chat/tools/tool-groups.cjs.js +1 -1
  172. package/dist/domains/chat/tools/tool-groups.es.js +1 -1
  173. package/dist/domains/chat.cjs.js +5 -3
  174. package/dist/domains/chat.es.js +4 -4
  175. package/dist/domains/connect/types.cjs.js.map +1 -1
  176. package/dist/domains/connect/types.es.js.map +1 -1
  177. package/dist/domains/connect/use-user-connect.cjs.js +19 -2
  178. package/dist/domains/connect/use-user-connect.cjs.js.map +1 -1
  179. package/dist/domains/connect/use-user-connect.es.js +19 -2
  180. package/dist/domains/connect/use-user-connect.es.js.map +1 -1
  181. package/dist/domains/dashboards/components/dashboard-renderer.cjs.js +4 -3
  182. package/dist/domains/dashboards/components/dashboard-renderer.cjs.js.map +1 -1
  183. package/dist/domains/dashboards/components/dashboard-renderer.es.js +4 -3
  184. package/dist/domains/dashboards/components/dashboard-renderer.es.js.map +1 -1
  185. package/dist/domains/dashboards/components/widget-chrome.cjs.js +1 -1
  186. package/dist/domains/dashboards/components/widget-chrome.es.js +1 -1
  187. package/dist/domains/dashboards/components/widget-error.cjs.js +1 -1
  188. package/dist/domains/dashboards/components/widget-error.es.js +1 -1
  189. package/dist/domains/dashboards/hooks/use-widget-views.cjs.js +4 -3
  190. package/dist/domains/dashboards/hooks/use-widget-views.cjs.js.map +1 -1
  191. package/dist/domains/dashboards/hooks/use-widget-views.es.js +4 -3
  192. package/dist/domains/dashboards/hooks/use-widget-views.es.js.map +1 -1
  193. package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js +9 -6
  194. package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js.map +1 -1
  195. package/dist/domains/dashboards/kinds/scores/scores-widget.es.js +9 -6
  196. package/dist/domains/dashboards/kinds/scores/scores-widget.es.js.map +1 -1
  197. package/dist/domains/dashboards/kinds/table/table-tabs.cjs.js +2 -2
  198. package/dist/domains/dashboards/kinds/table/table-tabs.es.js +2 -2
  199. package/dist/domains/dashboards/kinds/table/table-widget.cjs.js +1 -1
  200. package/dist/domains/dashboards/kinds/table/table-widget.es.js +1 -1
  201. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js +6 -5
  202. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js.map +1 -1
  203. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js +6 -5
  204. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js.map +1 -1
  205. package/dist/domains/dashboards/lib/chrome.cjs.js +9 -2
  206. package/dist/domains/dashboards/lib/chrome.cjs.js.map +1 -1
  207. package/dist/domains/dashboards/lib/chrome.es.js +9 -2
  208. package/dist/domains/dashboards/lib/chrome.es.js.map +1 -1
  209. package/dist/domains/dashboards/widget-kind.cjs.js.map +1 -1
  210. package/dist/domains/dashboards/widget-kind.es.js.map +1 -1
  211. package/dist/domains/knowledge/components/KnowledgePageCard.cjs.js +48 -0
  212. package/dist/domains/knowledge/components/KnowledgePageCard.cjs.js.map +1 -0
  213. package/dist/domains/knowledge/components/KnowledgePageCard.d.ts +1 -0
  214. package/dist/domains/knowledge/components/KnowledgePageCard.es.js +47 -0
  215. package/dist/domains/knowledge/components/KnowledgePageCard.es.js.map +1 -0
  216. package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js +63 -5
  217. package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js.map +1 -1
  218. package/dist/domains/knowledge/components/KnowledgePageDetail.es.js +64 -6
  219. package/dist/domains/knowledge/components/KnowledgePageDetail.es.js.map +1 -1
  220. package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js +485 -47
  221. package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js.map +1 -1
  222. package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js +487 -50
  223. package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js.map +1 -1
  224. package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js +1051 -123
  225. package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js.map +1 -1
  226. package/dist/domains/knowledge/components/KnowledgePageGraph.es.js +1054 -126
  227. package/dist/domains/knowledge/components/KnowledgePageGraph.es.js.map +1 -1
  228. package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js +75 -3
  229. package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js.map +1 -1
  230. package/dist/domains/knowledge/components/KnowledgePageTree.es.js +76 -4
  231. package/dist/domains/knowledge/components/KnowledgePageTree.es.js.map +1 -1
  232. package/dist/domains/knowledge/lib/circleText.cjs.js +9 -0
  233. package/dist/domains/knowledge/lib/circleText.cjs.js.map +1 -0
  234. package/dist/domains/knowledge/lib/circleText.d.ts +1 -0
  235. package/dist/domains/knowledge/lib/circleText.es.js +8 -0
  236. package/dist/domains/knowledge/lib/circleText.es.js.map +1 -0
  237. package/dist/domains/knowledge/lib/fitViewport.cjs.js +82 -0
  238. package/dist/domains/knowledge/lib/fitViewport.cjs.js.map +1 -0
  239. package/dist/domains/knowledge/lib/fitViewport.d.ts +1 -0
  240. package/dist/domains/knowledge/lib/fitViewport.es.js +73 -0
  241. package/dist/domains/knowledge/lib/fitViewport.es.js.map +1 -0
  242. package/dist/domains/knowledge/lib/graphShape.cjs.js +524 -0
  243. package/dist/domains/knowledge/lib/graphShape.cjs.js.map +1 -0
  244. package/dist/domains/knowledge/lib/graphShape.d.ts +1 -0
  245. package/dist/domains/knowledge/lib/graphShape.es.js +499 -0
  246. package/dist/domains/knowledge/lib/graphShape.es.js.map +1 -0
  247. package/dist/domains/knowledge/lib/linkCountsText.cjs.js +11 -0
  248. package/dist/domains/knowledge/lib/linkCountsText.cjs.js.map +1 -0
  249. package/dist/domains/knowledge/lib/linkCountsText.d.ts +1 -0
  250. package/dist/domains/knowledge/lib/linkCountsText.es.js +10 -0
  251. package/dist/domains/knowledge/lib/linkCountsText.es.js.map +1 -0
  252. package/dist/domains/knowledge/lib/pageAddress.cjs.js +29 -0
  253. package/dist/domains/knowledge/lib/pageAddress.cjs.js.map +1 -0
  254. package/dist/domains/knowledge/lib/pageAddress.d.ts +1 -0
  255. package/dist/domains/knowledge/lib/pageAddress.es.js +27 -0
  256. package/dist/domains/knowledge/lib/pageAddress.es.js.map +1 -0
  257. package/dist/domains/knowledge/lib/pageGraph.cjs.js +11 -11
  258. package/dist/domains/knowledge/lib/pageGraph.cjs.js.map +1 -1
  259. package/dist/domains/knowledge/lib/pageGraph.es.js +11 -11
  260. package/dist/domains/knowledge/lib/pageGraph.es.js.map +1 -1
  261. package/dist/domains/knowledge/lib/pageRefs.cjs.js +69 -0
  262. package/dist/domains/knowledge/lib/pageRefs.cjs.js.map +1 -0
  263. package/dist/domains/knowledge/lib/pageRefs.d.ts +1 -0
  264. package/dist/domains/knowledge/lib/pageRefs.es.js +66 -0
  265. package/dist/domains/knowledge/lib/pageRefs.es.js.map +1 -0
  266. package/dist/domains/knowledge/lib/pageTree.cjs.js +5 -0
  267. package/dist/domains/knowledge/lib/pageTree.cjs.js.map +1 -1
  268. package/dist/domains/knowledge/lib/pageTree.es.js +5 -1
  269. package/dist/domains/knowledge/lib/pageTree.es.js.map +1 -1
  270. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.cjs.js +82 -0
  271. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.cjs.js.map +1 -0
  272. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.d.ts +1 -0
  273. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.es.js +78 -0
  274. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.es.js.map +1 -0
  275. package/dist/domains/knowledge/lib/tooltipSide.cjs.js +77 -0
  276. package/dist/domains/knowledge/lib/tooltipSide.cjs.js.map +1 -0
  277. package/dist/domains/knowledge/lib/tooltipSide.d.ts +1 -0
  278. package/dist/domains/knowledge/lib/tooltipSide.es.js +75 -0
  279. package/dist/domains/knowledge/lib/tooltipSide.es.js.map +1 -0
  280. package/dist/domains/knowledge/lib/useLeavingNodes.cjs.js +65 -0
  281. package/dist/domains/knowledge/lib/useLeavingNodes.cjs.js.map +1 -0
  282. package/dist/domains/knowledge/lib/useLeavingNodes.d.ts +1 -0
  283. package/dist/domains/knowledge/lib/useLeavingNodes.es.js +62 -0
  284. package/dist/domains/knowledge/lib/useLeavingNodes.es.js.map +1 -0
  285. package/dist/domains/knowledge/lib/useStableWhile.cjs.js +15 -0
  286. package/dist/domains/knowledge/lib/useStableWhile.cjs.js.map +1 -0
  287. package/dist/domains/knowledge/lib/useStableWhile.d.ts +1 -0
  288. package/dist/domains/knowledge/lib/useStableWhile.es.js +14 -0
  289. package/dist/domains/knowledge/lib/useStableWhile.es.js.map +1 -0
  290. package/dist/domains/metrics/components/agent-runs-card.cjs.js +3 -3
  291. package/dist/domains/metrics/components/agent-runs-card.es.js +3 -3
  292. package/dist/domains/metrics/components/breakdown/breakdown-tab-body.cjs.js +1 -1
  293. package/dist/domains/metrics/components/breakdown/breakdown-tab-body.es.js +1 -1
  294. package/dist/domains/metrics/components/breakdown-card.cjs.js +1 -1
  295. package/dist/domains/metrics/components/breakdown-card.es.js +1 -1
  296. package/dist/domains/metrics/components/chart-area.cjs.js +1 -1
  297. package/dist/domains/metrics/components/chart-area.es.js +1 -1
  298. package/dist/domains/metrics/components/chart-card-error.cjs.js +1 -1
  299. package/dist/domains/metrics/components/chart-card-error.es.js +1 -1
  300. package/dist/domains/metrics/components/chart-card.cjs.js +1 -1
  301. package/dist/domains/metrics/components/chart-card.es.js +1 -1
  302. package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
  303. package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
  304. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js +3 -2
  305. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js.map +1 -1
  306. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js +3 -2
  307. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js.map +1 -1
  308. package/dist/domains/metrics/components/failure-rate-card.cjs.js +3 -2
  309. package/dist/domains/metrics/components/failure-rate-card.cjs.js.map +1 -1
  310. package/dist/domains/metrics/components/failure-rate-card.es.js +3 -2
  311. package/dist/domains/metrics/components/failure-rate-card.es.js.map +1 -1
  312. package/dist/domains/metrics/components/latency-card.cjs.js +3 -2
  313. package/dist/domains/metrics/components/latency-card.cjs.js.map +1 -1
  314. package/dist/domains/metrics/components/latency-card.es.js +3 -2
  315. package/dist/domains/metrics/components/latency-card.es.js.map +1 -1
  316. package/dist/domains/metrics/components/metrics-time-range-chip.cjs.js +1 -1
  317. package/dist/domains/metrics/components/metrics-time-range-chip.es.js +1 -1
  318. package/dist/domains/metrics/components/scores-card.cjs.js +2 -1
  319. package/dist/domains/metrics/components/scores-card.cjs.js.map +1 -1
  320. package/dist/domains/metrics/components/scores-card.es.js +2 -1
  321. package/dist/domains/metrics/components/scores-card.es.js.map +1 -1
  322. package/dist/domains/metrics/components/token-usage-card.cjs.js +3 -3
  323. package/dist/domains/metrics/components/token-usage-card.es.js +3 -3
  324. package/dist/domains/metrics/components/trace-aggregate-card.cjs.js +1 -1
  325. package/dist/domains/metrics/components/trace-aggregate-card.es.js +1 -1
  326. package/dist/domains/observability/components/observability-histogram.cjs.js +1 -1
  327. package/dist/domains/observability/components/observability-histogram.es.js +1 -1
  328. package/dist/domains/scores/components/trace-scores-list.cjs.js +2 -2
  329. package/dist/domains/scores/components/trace-scores-list.es.js +2 -2
  330. package/dist/domains/skills/skill-simple-form.cjs.js +1 -1
  331. package/dist/domains/skills/skill-simple-form.es.js +1 -1
  332. package/dist/domains/spans/components/spans-filter-bar.cjs.js +2 -2
  333. package/dist/domains/spans/components/spans-filter-bar.es.js +2 -2
  334. package/dist/domains/spans/hooks/use-spans-filter-bar.cjs.js +1 -1
  335. package/dist/domains/spans/hooks/use-spans-filter-bar.es.js +1 -1
  336. package/dist/domains/threads/components/threads-filter-bar.cjs.js +2 -2
  337. package/dist/domains/threads/components/threads-filter-bar.es.js +2 -2
  338. package/dist/domains/threads/hooks/use-threads-filter-bar.cjs.js +1 -1
  339. package/dist/domains/threads/hooks/use-threads-filter-bar.es.js +1 -1
  340. package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +1 -1
  341. package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +1 -1
  342. package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +1 -1
  343. package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +1 -1
  344. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +2 -2
  345. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +2 -2
  346. package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +2 -2
  347. package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +2 -2
  348. package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +1 -1
  349. package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +1 -1
  350. package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +1 -1
  351. package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +1 -1
  352. package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +1 -1
  353. package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +1 -1
  354. package/dist/domains/traces/components/span-payload/span-processor-mutations.cjs.js +1 -1
  355. package/dist/domains/traces/components/span-payload/span-processor-mutations.es.js +1 -1
  356. package/dist/domains/traces/components/span-payload/span-tools-section.cjs.js +1 -1
  357. package/dist/domains/traces/components/span-payload/span-tools-section.es.js +1 -1
  358. package/dist/domains/traces/components/span-timeline-row.cjs.js +1 -1
  359. package/dist/domains/traces/components/span-timeline-row.es.js +1 -1
  360. package/dist/domains/traces/components/span-timing-hover-card.cjs.js +1 -1
  361. package/dist/domains/traces/components/span-timing-hover-card.es.js +1 -1
  362. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +8 -2
  363. package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
  364. package/dist/domains/traces/components/trace-data-panel-view.es.js +8 -2
  365. package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
  366. package/dist/domains/traces/components/trace-error-cell.cjs.js +1 -1
  367. package/dist/domains/traces/components/trace-error-cell.es.js +1 -1
  368. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js +2 -2
  369. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js +2 -2
  370. package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.cjs.js +1 -1
  371. package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.es.js +1 -1
  372. package/dist/domains/workflows/runs/workflow-run-list.cjs.js +1 -1
  373. package/dist/domains/workflows/runs/workflow-run-list.es.js +1 -1
  374. package/dist/domains/workflows/workflow/input/workflow-processor-input.cjs.js +2 -2
  375. package/dist/domains/workflows/workflow/input/workflow-processor-input.es.js +2 -2
  376. package/dist/domains/workflows/workflow/use-workflow-trigger.cjs.js +3 -3
  377. package/dist/domains/workflows/workflow/use-workflow-trigger.es.js +3 -3
  378. package/dist/domains/workflows/workflow/workflow-input-data.cjs.js +1 -1
  379. package/dist/domains/workflows/workflow/workflow-input-data.es.js +1 -1
  380. package/dist/domains/workflows/workflow/workflow-suspended-steps.cjs.js +2 -2
  381. package/dist/domains/workflows/workflow/workflow-suspended-steps.es.js +2 -2
  382. package/dist/domains/workflows/workflow/workflow-time-travel-form.cjs.js +2 -2
  383. package/dist/domains/workflows/workflow/workflow-time-travel-form.es.js +2 -2
  384. package/dist/domains/workspace/components/workspace-add-skill-dialog.cjs.js +1 -1
  385. package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js +1 -1
  386. package/dist/domains/workspace/components/workspace-markdown-preview.cjs.js +1 -1
  387. package/dist/domains/workspace/components/workspace-markdown-preview.es.js +1 -1
  388. package/dist/{filter-bar-time-range-mg9JeYue.js → filter-bar-time-range-qlV8p7hp.js} +2 -2
  389. package/dist/{filter-bar-time-range-mg9JeYue.js.map → filter-bar-time-range-qlV8p7hp.js.map} +1 -1
  390. package/dist/{filter-bar-time-range-BA-pXMlo.cjs → filter-bar-time-range-zdM024JD.cjs} +2 -2
  391. package/dist/{filter-bar-time-range-BA-pXMlo.cjs.map → filter-bar-time-range-zdM024JD.cjs.map} +1 -1
  392. package/dist/lib/form/dynamic-form.cjs.js +2 -2
  393. package/dist/lib/form/dynamic-form.es.js +2 -2
  394. package/dist/lib/form/json-draft.cjs.js +1 -1
  395. package/dist/lib/form/json-draft.es.js +1 -1
  396. package/dist/lib/form/zod-provider.cjs.js +1 -1
  397. package/dist/lib/form/zod-provider.es.js +1 -1
  398. package/dist/{span-payload-primitives-B3RdahsC.js → span-payload-primitives-CKKIAVPJ.js} +4 -4
  399. package/dist/{span-payload-primitives-B3RdahsC.js.map → span-payload-primitives-CKKIAVPJ.js.map} +1 -1
  400. package/dist/{span-payload-primitives-_2d-pAOD.cjs → span-payload-primitives-D4tHWN2W.cjs} +4 -4
  401. package/dist/{span-payload-primitives-_2d-pAOD.cjs.map → span-payload-primitives-D4tHWN2W.cjs.map} +1 -1
  402. package/dist/src/domains/chat/knowledge/knowledge-links.d.ts +32 -4
  403. package/dist/src/domains/chat/knowledge/pinned-knowledge-data.d.ts +2 -0
  404. package/dist/src/domains/chat/tools/badges/knowledge-body-range.d.ts +12 -0
  405. package/dist/src/domains/chat/tools/badges/knowledge-tool-badge.d.ts +5 -2
  406. package/dist/src/domains/chat/tools/badges/mcp-input-request-badge.d.ts +18 -0
  407. package/dist/src/domains/chat/tools/badges/tool-badge.d.ts +4 -1
  408. package/dist/src/domains/chat/tools/badges/use-deferred-input-request.d.ts +44 -0
  409. package/dist/src/domains/chat/tools/badges/use-mcp-task-progress.d.ts +6 -1
  410. package/dist/src/domains/chat/tools/connect-prompt-tool.d.ts +10 -1
  411. package/dist/src/domains/chat/tools/mcp-input-request-tool.d.ts +18 -0
  412. package/dist/src/domains/chat/tools/mcp-input-request.d.ts +40 -0
  413. package/dist/src/domains/chat/tools/tool-card-kind.d.ts +4 -2
  414. package/dist/src/domains/chat/tools/tool-card.d.ts +1 -1
  415. package/dist/src/domains/connect/types.d.ts +16 -0
  416. package/dist/src/domains/dashboards/components/dashboard-renderer.d.ts +4 -2
  417. package/dist/src/domains/dashboards/hooks/use-widget-views.d.ts +4 -3
  418. package/dist/src/domains/dashboards/index.d.ts +1 -1
  419. package/dist/src/domains/dashboards/kinds/scores/scores-widget.d.ts +1 -1
  420. package/dist/src/domains/dashboards/lib/chrome.d.ts +6 -4
  421. package/dist/src/domains/dashboards/widget-kind.d.ts +12 -0
  422. package/dist/src/domains/knowledge/components/KnowledgePageCard.d.ts +23 -0
  423. package/dist/src/domains/knowledge/components/KnowledgePageExplorer.d.ts +29 -0
  424. package/dist/src/domains/knowledge/components/KnowledgePageGraph.d.ts +27 -1
  425. package/dist/src/domains/knowledge/components/KnowledgePageTree.d.ts +2 -1
  426. package/dist/src/domains/knowledge/lib/circleText.d.ts +2 -0
  427. package/dist/src/domains/knowledge/lib/fitViewport.d.ts +67 -0
  428. package/dist/src/domains/knowledge/lib/graphShape.d.ts +131 -0
  429. package/dist/src/domains/knowledge/lib/linkCountsText.d.ts +5 -0
  430. package/dist/src/domains/knowledge/lib/pageAddress.d.ts +5 -0
  431. package/dist/src/domains/knowledge/lib/pageGraph.d.ts +4 -4
  432. package/dist/src/domains/knowledge/lib/pageRefs.d.ts +15 -0
  433. package/dist/src/domains/knowledge/lib/pageTree.d.ts +2 -0
  434. package/dist/src/domains/knowledge/lib/remarkKnowledgeLinks.d.ts +13 -0
  435. package/dist/src/domains/knowledge/lib/tooltipSide.d.ts +40 -0
  436. package/dist/src/domains/knowledge/lib/useLeavingNodes.d.ts +14 -0
  437. package/dist/src/domains/knowledge/lib/useStableWhile.d.ts +5 -0
  438. package/dist/src/domains/knowledge/pageTypes.d.ts +6 -1
  439. package/dist/src/ds/components/DateTimeRangePicker/date-time-range-picker.d.ts +12 -1
  440. package/dist/src/ds/components/MarkdownRenderer/markdown-renderer.d.ts +8 -1
  441. package/dist/src/ds/components/MetricsCard/metrics-card-headline.d.ts +1 -1
  442. package/dist/src/ds/components/MetricsLineChart/metrics-line-chart.d.ts +8 -0
  443. package/dist/src/ds/components/ai/tool-call/tool-phrases.d.ts +6 -0
  444. package/dist/style.css +73 -2
  445. package/dist/{tool-approval-1qiB4hhG.cjs → tool-approval-CJvPDL7D.cjs} +4 -4
  446. package/dist/{tool-approval-1qiB4hhG.cjs.map → tool-approval-CJvPDL7D.cjs.map} +1 -1
  447. package/dist/{tool-approval-B6MFcaKV.js → tool-approval-DyN11vFA.js} +4 -4
  448. package/dist/{tool-approval-B6MFcaKV.js.map → tool-approval-DyN11vFA.js.map} +1 -1
  449. package/dist/{tool-call-Bu66PkD-.cjs → tool-call-DBn14X-3.cjs} +9 -3
  450. package/dist/{tool-call-Bu66PkD-.cjs.map → tool-call-DBn14X-3.cjs.map} +1 -1
  451. package/dist/{tool-call-Ch9-jjXU.js → tool-call-Dsj43lvJ.js} +9 -3
  452. package/dist/{tool-call-Ch9-jjXU.js.map → tool-call-Dsj43lvJ.js.map} +1 -1
  453. package/dist/{tool-card-DrqPZfPQ.cjs → tool-card-BOLXeKIp.cjs} +167 -126
  454. package/dist/tool-card-BOLXeKIp.cjs.map +1 -0
  455. package/dist/{tool-card-sO6P2Qj4.js → tool-card-HZ5bm7ue.js} +168 -127
  456. package/dist/tool-card-HZ5bm7ue.js.map +1 -0
  457. package/dist/{tool-presentation-DvCsb_kz.js → tool-presentation-CvibOP1J.js} +6 -1
  458. package/dist/tool-presentation-CvibOP1J.js.map +1 -0
  459. package/dist/{tool-presentation-CQlDEwgS.cjs → tool-presentation-D6nzVruN.cjs} +6 -1
  460. package/dist/tool-presentation-D6nzVruN.cjs.map +1 -0
  461. package/package.json +11 -11
  462. package/dist/MarkdownRenderer-2GOXQJEv.js.map +0 -1
  463. package/dist/MarkdownRenderer-CB8Z_CHc.cjs.map +0 -1
  464. package/dist/MetricsCard-CEB-f2sv.cjs.map +0 -1
  465. package/dist/MetricsCard-M8awJ2B_.js.map +0 -1
  466. package/dist/MetricsLineChart-BhHoduO0.js.map +0 -1
  467. package/dist/MetricsLineChart-CjBm4IXu.cjs.map +0 -1
  468. package/dist/date-time-range-picker-CTt7Od0P.cjs.map +0 -1
  469. package/dist/date-time-range-picker-DKh1K9Iy.js.map +0 -1
  470. package/dist/domains/knowledge/lib/pageLayout.cjs.js +0 -49
  471. package/dist/domains/knowledge/lib/pageLayout.cjs.js.map +0 -1
  472. package/dist/domains/knowledge/lib/pageLayout.d.ts +0 -1
  473. package/dist/domains/knowledge/lib/pageLayout.es.js +0 -48
  474. package/dist/domains/knowledge/lib/pageLayout.es.js.map +0 -1
  475. package/dist/src/domains/knowledge/lib/pageLayout.d.ts +0 -24
  476. package/dist/tool-card-DrqPZfPQ.cjs.map +0 -1
  477. package/dist/tool-card-sO6P2Qj4.js.map +0 -1
  478. package/dist/tool-presentation-CQlDEwgS.cjs.map +0 -1
  479. package/dist/tool-presentation-DvCsb_kz.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"use-mcp-task-progress.es.js","names":[],"sources":["../../../../../src/domains/chat/tools/badges/use-mcp-task-progress.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport type { ActivityStatus } from '@/ds/components/ai/activity';\n\nexport type McpTaskStatus = 'working' | 'input_required' | 'completed' | 'failed' | 'cancelled';\n\n/** What `@mastra/mcp`'s client writes to a task-backed tool's output stream (`MCPTaskProgress`). */\nexport interface McpTaskProgress {\n type: 'mcp-task';\n taskId: string;\n status: McpTaskStatus;\n createdAt: string;\n serverName: string;\n}\n\nconst STATUSES: ReadonlySet<string> = new Set(['working', 'input_required', 'completed', 'failed', 'cancelled']);\n\nexport const isTerminalMcpTaskStatus = (status: McpTaskStatus) =>\n status === 'completed' || status === 'failed' || status === 'cancelled';\n\nfunction isMcpTaskProgress(value: unknown): value is McpTaskProgress {\n if (typeof value !== 'object' || value === null) return false;\n const entry = value as Record<string, unknown>;\n return (\n entry.type === 'mcp-task' &&\n typeof entry.taskId === 'string' &&\n typeof entry.createdAt === 'string' &&\n typeof entry.serverName === 'string' &&\n typeof entry.status === 'string' &&\n STATUSES.has(entry.status)\n );\n}\n\n/** While a tool call runs, its progress writes accumulate as the call's `result` array. */\nfunction latestProgress(result: unknown): McpTaskProgress | undefined {\n if (!Array.isArray(result)) return undefined;\n for (let index = result.length - 1; index >= 0; index--) {\n if (isMcpTaskProgress(result[index])) return result[index];\n }\n return undefined;\n}\n\nexport interface McpTaskView extends McpTaskProgress {\n /** When the card saw the task end; the elapsed time stops here. */\n endedAt?: number;\n}\n\n/**\n * The MCP task behind a tool call, if the call continued as one. The final result replaces the\n * progress writes, so the last one seen is kept for as long as the card is mounted; its terminal\n * status then comes from how the call ended. Progress isn't saved with the thread, so a reloaded\n * card has no task to show.\n *\n * A deferred call (one running as a Mastra background task) settles its part with a placeholder\n * long before the task ends, so its end is never inferred here: the background task says when.\n */\nexport function useMcpTaskProgress(\n result: unknown,\n status: ActivityStatus,\n { deferred = false }: { deferred?: boolean } = {},\n): McpTaskView | undefined {\n const live = latestProgress(result);\n const [seen, setSeen] = useState(live);\n if (live && (live.taskId !== seen?.taskId || live.status !== seen.status)) setSeen(live);\n\n const task = live ?? seen;\n const ended = task && !live && !deferred && status !== 'running';\n const taskStatus: McpTaskStatus | undefined = !task\n ? undefined\n : ended && !isTerminalMcpTaskStatus(task.status)\n ? status === 'error'\n ? 'failed'\n : 'completed'\n : task.status;\n const terminal = taskStatus !== undefined && isTerminalMcpTaskStatus(taskStatus);\n\n const [endedAt, setEndedAt] = useState<number>();\n useEffect(() => {\n if (terminal && endedAt === undefined) setEndedAt(Date.now());\n }, [terminal, endedAt]);\n\n return task && taskStatus ? { ...task, status: taskStatus, endedAt } : undefined;\n}\n"],"mappings":";;AAcA,IAAM,2BAAgC,IAAI,IAAI;CAAC;CAAW;CAAkB;CAAa;CAAU;AAAW,CAAC;AAE/G,IAAa,2BAA2B,WACtC,WAAW,eAAe,WAAW,YAAY,WAAW;AAE9D,SAAS,kBAAkB,OAA0C;CACnE,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO;CACxD,MAAM,QAAQ;CACd,OACE,MAAM,SAAS,cACf,OAAO,MAAM,WAAW,YACxB,OAAO,MAAM,cAAc,YAC3B,OAAO,MAAM,eAAe,YAC5B,OAAO,MAAM,WAAW,YACxB,SAAS,IAAI,MAAM,MAAM;AAE7B;;AAGA,SAAS,eAAe,QAA8C;CACpE,IAAI,CAAC,MAAM,QAAQ,MAAM,GAAG,OAAO,KAAA;CACnC,KAAK,IAAI,QAAQ,OAAO,SAAS,GAAG,SAAS,GAAG,SAC9C,IAAI,kBAAkB,OAAO,MAAM,GAAG,OAAO,OAAO;AAGxD;;;;;;;;;;AAgBA,SAAgB,mBACd,QACA,QACA,EAAE,WAAW,UAAkC,CAAC,GACvB;CACzB,MAAM,OAAO,eAAe,MAAM;CAClC,MAAM,CAAC,MAAM,WAAW,SAAS,IAAI;CACrC,IAAI,SAAS,KAAK,WAAW,MAAM,UAAU,KAAK,WAAW,KAAK,SAAS,QAAQ,IAAI;CAEvF,MAAM,OAAO,QAAQ;CAErB,MAAM,aAAwC,CAAC,OAC3C,KAAA,IAFU,QAAQ,CAAC,QAAQ,CAAC,YAAY,WAAW,aAG1C,CAAC,wBAAwB,KAAK,MAAM,IAC3C,WAAW,UACT,WACA,cACF,KAAK;CACX,MAAM,WAAW,eAAe,KAAA,KAAa,wBAAwB,UAAU;CAE/E,MAAM,CAAC,SAAS,cAAc,SAAiB;CAC/C,gBAAgB;EACd,IAAI,YAAY,YAAY,KAAA,GAAW,WAAW,KAAK,IAAI,CAAC;CAC9D,GAAG,CAAC,UAAU,OAAO,CAAC;CAEtB,OAAO,QAAQ,aAAa;EAAE,GAAG;EAAM,QAAQ;EAAY;CAAQ,IAAI,KAAA;AACzE"}
1
+ {"version":3,"file":"use-mcp-task-progress.es.js","names":[],"sources":["../../../../../src/domains/chat/tools/badges/use-mcp-task-progress.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport type { McpInputRequestPayload } from '../mcp-input-request';\nimport type { ActivityStatus } from '@/ds/components/ai/activity';\n\nexport type McpTaskStatus = 'working' | 'input_required' | 'completed' | 'failed' | 'cancelled';\n\n/** What `@mastra/mcp`'s client writes to a task-backed tool's output stream (`MCPTaskProgress`). */\nexport interface McpTaskProgress {\n type: 'mcp-task';\n taskId: string;\n status: McpTaskStatus;\n createdAt: string;\n serverName: string;\n}\n\nconst STATUSES: ReadonlySet<string> = new Set(['working', 'input_required', 'completed', 'failed', 'cancelled']);\n\nexport const isTerminalMcpTaskStatus = (status: McpTaskStatus) =>\n status === 'completed' || status === 'failed' || status === 'cancelled';\n\nfunction isMcpTaskProgress(value: unknown): value is McpTaskProgress {\n if (typeof value !== 'object' || value === null) return false;\n const entry = value as Record<string, unknown>;\n return (\n entry.type === 'mcp-task' &&\n typeof entry.taskId === 'string' &&\n typeof entry.createdAt === 'string' &&\n typeof entry.serverName === 'string' &&\n typeof entry.status === 'string' &&\n STATUSES.has(entry.status)\n );\n}\n\n/** While a tool call runs, its progress writes accumulate as the call's `result` array. */\nfunction latestProgress(result: unknown): McpTaskProgress | undefined {\n if (!Array.isArray(result)) return undefined;\n for (let index = result.length - 1; index >= 0; index--) {\n if (isMcpTaskProgress(result[index])) return result[index];\n }\n return undefined;\n}\n\nexport interface McpTaskView extends McpTaskProgress {\n /** When the card saw the task end; the elapsed time stops here. */\n endedAt?: number;\n}\n\n/**\n * The MCP task behind a tool call, if the call continued as one. The final result replaces the\n * progress writes, so the last one seen is kept for as long as the card is mounted; its terminal\n * status then comes from how the call ended. Progress isn't saved with the thread, so a reloaded\n * card has no task to show.\n *\n * A deferred call (one running as a Mastra background task) settles its part with a placeholder\n * long before the task ends, so its end is never inferred here: the background task says when.\n *\n * While the call is suspended on the task's input request, the request names the task, so the chip\n * reads `input_required` even on a reloaded card with no progress.\n */\nexport function useMcpTaskProgress(\n result: unknown,\n status: ActivityStatus,\n { deferred = false, request }: { deferred?: boolean; request?: McpInputRequestPayload } = {},\n): McpTaskView | undefined {\n const live: McpTaskProgress | undefined = request\n ? {\n type: 'mcp-task',\n taskId: request.taskId,\n status: 'input_required',\n createdAt: request.createdAt,\n serverName: request.serverName,\n }\n : latestProgress(result);\n const [seen, setSeen] = useState(live);\n if (live && (live.taskId !== seen?.taskId || live.status !== seen.status)) setSeen(live);\n\n const task = live ?? seen;\n const ended = task && !live && !deferred && status !== 'running';\n const taskStatus: McpTaskStatus | undefined = !task\n ? undefined\n : ended && !isTerminalMcpTaskStatus(task.status)\n ? status === 'error'\n ? 'failed'\n : 'completed'\n : task.status;\n const terminal = taskStatus !== undefined && isTerminalMcpTaskStatus(taskStatus);\n\n const [endedAt, setEndedAt] = useState<number>();\n useEffect(() => {\n if (terminal && endedAt === undefined) setEndedAt(Date.now());\n }, [terminal, endedAt]);\n\n return task && taskStatus ? { ...task, status: taskStatus, endedAt } : undefined;\n}\n"],"mappings":";;AAeA,IAAM,2BAAgC,IAAI,IAAI;CAAC;CAAW;CAAkB;CAAa;CAAU;AAAW,CAAC;AAE/G,IAAa,2BAA2B,WACtC,WAAW,eAAe,WAAW,YAAY,WAAW;AAE9D,SAAS,kBAAkB,OAA0C;CACnE,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO;CACxD,MAAM,QAAQ;CACd,OACE,MAAM,SAAS,cACf,OAAO,MAAM,WAAW,YACxB,OAAO,MAAM,cAAc,YAC3B,OAAO,MAAM,eAAe,YAC5B,OAAO,MAAM,WAAW,YACxB,SAAS,IAAI,MAAM,MAAM;AAE7B;;AAGA,SAAS,eAAe,QAA8C;CACpE,IAAI,CAAC,MAAM,QAAQ,MAAM,GAAG,OAAO,KAAA;CACnC,KAAK,IAAI,QAAQ,OAAO,SAAS,GAAG,SAAS,GAAG,SAC9C,IAAI,kBAAkB,OAAO,MAAM,GAAG,OAAO,OAAO;AAGxD;;;;;;;;;;;;;AAmBA,SAAgB,mBACd,QACA,QACA,EAAE,WAAW,OAAO,YAAsE,CAAC,GAClE;CACzB,MAAM,OAAoC,UACtC;EACE,MAAM;EACN,QAAQ,QAAQ;EAChB,QAAQ;EACR,WAAW,QAAQ;EACnB,YAAY,QAAQ;CACtB,IACA,eAAe,MAAM;CACzB,MAAM,CAAC,MAAM,WAAW,SAAS,IAAI;CACrC,IAAI,SAAS,KAAK,WAAW,MAAM,UAAU,KAAK,WAAW,KAAK,SAAS,QAAQ,IAAI;CAEvF,MAAM,OAAO,QAAQ;CAErB,MAAM,aAAwC,CAAC,OAC3C,KAAA,IAFU,QAAQ,CAAC,QAAQ,CAAC,YAAY,WAAW,aAG1C,CAAC,wBAAwB,KAAK,MAAM,IAC3C,WAAW,UACT,WACA,cACF,KAAK;CACX,MAAM,WAAW,eAAe,KAAA,KAAa,wBAAwB,UAAU;CAE/E,MAAM,CAAC,SAAS,cAAc,SAAiB;CAC/C,gBAAgB;EACd,IAAI,YAAY,YAAY,KAAA,GAAW,WAAW,KAAK,IAAI,CAAC;CAC9D,GAAG,CAAC,UAAU,OAAO,CAAC;CAEtB,OAAO,QAAQ,aAAa;EAAE,GAAG;EAAM,QAAQ;EAAY;CAAQ,IAAI,KAAA;AACzE"}
@@ -2,7 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_lib_framework = require("../../../../lib/framework.cjs.js");
3
3
  const require_Button = require("../../../../Button-DLcMcuUL.cjs");
4
4
  const require_icons_WorkflowIcon = require("../../../../icons/WorkflowIcon.cjs.js");
5
- const require_tool_call = require("../../../../tool-call-Bu66PkD-.cjs");
5
+ const require_tool_call = require("../../../../tool-call-DBn14X-3.cjs");
6
6
  const require_CodeEditor = require("../../../../CodeEditor-CLzs0yVc.cjs");
7
7
  const require_domains_chat_components_loading_badge = require("../../components/loading-badge.cjs.js");
8
8
  const require_domains_chat_components_network_choice_metadata_dialog = require("../../components/network-choice-metadata-dialog.cjs.js");
@@ -1,7 +1,7 @@
1
1
  import { useLinkComponent } from "../../../../lib/framework.es.js";
2
2
  import { t as Button } from "../../../../Button-CLXTbAY8.js";
3
3
  import { WorkflowIcon as WorkflowIcon$1 } from "../../../../icons/WorkflowIcon.es.js";
4
- import { c as ToolCallMono } from "../../../../tool-call-Ch9-jjXU.js";
4
+ import { c as ToolCallMono } from "../../../../tool-call-Dsj43lvJ.js";
5
5
  import { t as CodeEditor } from "../../../../CodeEditor-COnz9c6B.js";
6
6
  import { LoadingBadge } from "../../components/loading-badge.es.js";
7
7
  import { NetworkChoiceMetadataDialogTrigger } from "../../components/network-choice-metadata-dialog.es.js";
@@ -3,32 +3,107 @@ const require_icons_Icon = require("../../../icons/Icon.cjs.js");
3
3
  const require_Button = require("../../../Button-DLcMcuUL.cjs");
4
4
  const require_Txt = require("../../../Txt-BnoSqxKE.cjs");
5
5
  const require_Notice = require("../../../Notice-JZ7SW7q6.cjs");
6
+ const require_domains_chat_context_tool_call_context = require("../context/tool-call-context.cjs.js");
6
7
  const require_domains_chat_tools_connect_prompt_tool_id = require("./connect-prompt-tool-id.cjs.js");
7
8
  const require_domains_connect_types = require("../../connect/types.cjs.js");
9
+ const require_domains_chat_tools_tool_card_kind = require("./tool-card-kind.cjs.js");
8
10
  const require_data_list = require("../../../data-list-C4Vmq5HA.cjs");
9
11
  const require_domains_connect_use_user_connect = require("../../connect/use-user-connect.cjs.js");
10
12
  const require_domains_connect_provider_logo = require("../../connect/provider-logo.cjs.js");
13
+ let react = require("react");
11
14
  let react_jsx_runtime = require("react/jsx-runtime");
12
15
  let lucide_react = require("lucide-react");
13
16
  // src/domains/chat/tools/connect-prompt-tool.tsx
14
17
  /**
18
+ * The prompt this card renders: the finished call's result, or the payload
19
+ * the run paused with while it waits for the user to connect.
20
+ */
21
+ function connectPromptFor({ toolName, toolCallId, output, metadata }) {
22
+ if (require_domains_connect_types.isConnectPromptPayload(output)) return {
23
+ payload: output,
24
+ paused: false
25
+ };
26
+ const suspendPayload = require_domains_chat_tools_tool_card_kind.toolInteraction(metadata, toolName, toolCallId).suspended?.suspendPayload;
27
+ if (require_domains_connect_types.isConnectPromptPayload(suspendPayload)) return {
28
+ payload: suspendPayload,
29
+ paused: true
30
+ };
31
+ }
32
+ /** The resume tool's schema accepts; longer failure reasons are cut to fit. */
33
+ var MAX_RESUME_ERROR_LENGTH = 500;
34
+ /**
35
+ * What to resume the paused call with: the settled flow, or a failure when the
36
+ * connect session couldn't even be created (e.g. the connection limit).
37
+ */
38
+ function connectPromptResumeFor(payload, settled, createError) {
39
+ const failed = (provider, error) => ({
40
+ provider,
41
+ status: "failed",
42
+ error: error.slice(0, MAX_RESUME_ERROR_LENGTH)
43
+ });
44
+ if (createError) {
45
+ const provider = payload.requestedProvider ?? payload.providers[0]?.id;
46
+ return provider ? failed(provider, createError.message) : void 0;
47
+ }
48
+ if (!settled) return void 0;
49
+ if (settled.status === "active") return {
50
+ provider: settled.provider,
51
+ status: "active"
52
+ };
53
+ return failed(settled.provider, settled.message ?? "The connection was not completed.");
54
+ }
55
+ /**
15
56
  * Chat card for the built-in `request_connection` tool: the agent surfaces it
16
57
  * when provider tools are unavailable because the caller has no connection.
17
58
  * Each provider row offers a Connect action that creates a connect session on
18
59
  * the mounted `/connect` routes, drives the OAuth flow in a popup through the
19
60
  * server's launch gate (which verifies this browser owns the pending session
20
61
  * before redirecting to the vendor), and polls until the connection settles.
62
+ *
63
+ * The tool pauses the agent run while the card is up. Once the connection
64
+ * settles, the card resumes the paused call with the outcome — connected, or
65
+ * the reason it failed — so the agent continues from the tool's result rather
66
+ * than a chat message.
21
67
  */
22
- var ConnectPromptTool = ({ output, readOnly = false }) => {
23
- if (!require_domains_connect_types.isConnectPromptPayload(output)) return null;
68
+ var ConnectPromptTool = ({ toolName, toolCallId, output, metadata, readOnly = false }) => {
69
+ const prompt = connectPromptFor({
70
+ toolName,
71
+ toolCallId,
72
+ output,
73
+ metadata
74
+ });
75
+ if (!prompt) return null;
24
76
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ConnectPromptCard, {
25
- payload: output,
77
+ toolCallId,
78
+ payload: prompt.payload,
79
+ paused: prompt.paused,
26
80
  readOnly
27
81
  });
28
82
  };
29
- var ConnectPromptCard = ({ payload, readOnly }) => {
83
+ var ConnectPromptCard = ({ toolCallId, payload, paused, readOnly }) => {
30
84
  const { pending, connect, connectedProviders, isCreating, createError, settled } = require_domains_connect_use_user_connect.usePendingConnect();
85
+ const { approveToolcall, isRunning, toolCallApprovals } = require_domains_chat_context_tool_call_context.useToolCall();
86
+ const resumedRef = (0, react.useRef)(null);
87
+ const alreadyResumed = toolCallApprovals[toolCallId] !== void 0;
31
88
  const errorMessage = createError?.message ?? (settled?.status === "failed" ? settled.message ?? "The connection was not completed. Try connecting again." : null);
89
+ (0, react.useEffect)(() => {
90
+ if (readOnly || !paused || alreadyResumed || isRunning) return;
91
+ const outcome = createError ?? settled;
92
+ if (!outcome || resumedRef.current === outcome) return;
93
+ resumedRef.current = outcome;
94
+ const resume = connectPromptResumeFor(payload, settled, createError);
95
+ if (resume) approveToolcall(toolCallId, resume);
96
+ }, [
97
+ readOnly,
98
+ paused,
99
+ alreadyResumed,
100
+ isRunning,
101
+ settled,
102
+ createError,
103
+ payload,
104
+ approveToolcall,
105
+ toolCallId
106
+ ]);
32
107
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
33
108
  "aria-label": "Connect an account",
34
109
  className: "my-2 space-y-3",
@@ -1 +1 @@
1
- {"version":3,"file":"connect-prompt-tool.cjs.js","names":["isConnectPromptPayload","usePendingConnect","DataList","Txt","ProviderLogo","Icon","CheckIcon","Button","Notice"],"sources":["../../../../src/domains/chat/tools/connect-prompt-tool.tsx"],"sourcesContent":["import { CheckIcon } from 'lucide-react';\nimport type { ConnectPromptPayload } from '@/domains/connect';\nimport { isConnectPromptPayload, ProviderLogo, usePendingConnect } from '@/domains/connect';\nimport { Button } from '@/ds/components/Button';\nimport { DataList } from '@/ds/components/DataList';\nimport { Notice } from '@/ds/components/Notice';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\n\nexport { CONNECT_PROMPT_TOOL_NAME } from './connect-prompt-tool-id';\n\nexport interface ConnectPromptToolProps {\n output: unknown;\n /** Historical rendering: show the card but suppress the connect action. */\n readOnly?: boolean;\n}\n\n/**\n * Chat card for the built-in `request_connection` tool: the agent surfaces it\n * when provider tools are unavailable because the caller has no connection.\n * Each provider row offers a Connect action that creates a connect session on\n * the mounted `/connect` routes, drives the OAuth flow in a popup through the\n * server's launch gate (which verifies this browser owns the pending session\n * before redirecting to the vendor), and polls until the connection settles.\n */\nexport const ConnectPromptTool = ({ output, readOnly = false }: ConnectPromptToolProps) => {\n if (!isConnectPromptPayload(output)) return null;\n return <ConnectPromptCard payload={output} readOnly={readOnly} />;\n};\n\nconst ConnectPromptCard = ({ payload, readOnly }: { payload: ConnectPromptPayload; readOnly: boolean }) => {\n const { pending, connect, connectedProviders, isCreating, createError, settled } = usePendingConnect();\n\n const errorMessage =\n createError?.message ??\n (settled?.status === 'failed'\n ? (settled.message ?? 'The connection was not completed. Try connecting again.')\n : null);\n\n return (\n <section aria-label=\"Connect an account\" className=\"my-2 space-y-3\">\n <DataList columns=\"minmax(0, 1fr)\" fit=\"container\" scrollable={false}>\n <DataList.Subheader>\n <Txt as=\"h4\" variant=\"subheading\" tone=\"ink\">\n Connect an account\n </Txt>\n </DataList.Subheader>\n {payload.providers.map(provider => {\n const isConnected = provider.connected || connectedProviders.has(provider.id);\n const isPending = pending?.provider === provider.id;\n return (\n <DataList.RowStatic key={provider.id}>\n <DataList.Cell className=\"col-span-full py-2\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n <ProviderLogo logoUrl={provider.logoUrl} />\n <Txt as=\"span\" variant=\"body-sm\" tone=\"ink\" className=\"truncate\">\n {provider.displayName ?? provider.id}\n </Txt>\n </div>\n <div className=\"flex flex-wrap items-center gap-3\">\n {isPending ? (\n <Txt as=\"span\" variant=\"body-sm\" tone=\"muted\" role=\"status\">\n Waiting for authorization…\n </Txt>\n ) : null}\n {isPending && pending?.fallbackUrl ? (\n <a\n href={pending.fallbackUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-ui-md underline underline-offset-2\"\n >\n Open the connect window\n </a>\n ) : null}\n {isConnected ? (\n <Txt\n as=\"span\"\n variant=\"body-sm\"\n tone=\"muted\"\n className=\"flex min-w-24 items-center justify-center gap-1\"\n >\n <Icon size=\"sm\">\n <CheckIcon aria-hidden />\n </Icon>\n Connected\n </Txt>\n ) : (\n <Button\n variant=\"primary\"\n size=\"sm\"\n className=\"min-w-24\"\n disabled={readOnly || isCreating || isPending}\n onClick={() => connect(provider)}\n >\n Connect\n </Button>\n )}\n </div>\n </div>\n </DataList.Cell>\n </DataList.RowStatic>\n );\n })}\n </DataList>\n {errorMessage ? (\n <div role=\"alert\">\n <Notice variant=\"destructive\" title=\"Couldn't connect\">\n <Notice.Message>{errorMessage}</Notice.Message>\n </Notice>\n </div>\n ) : null}\n </section>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAyBA,IAAa,qBAAqB,EAAE,QAAQ,WAAW,YAAoC;CACzF,IAAI,CAACA,8BAAAA,uBAAuB,MAAM,GAAG,OAAO;CAC5C,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,mBAAD;EAAmB,SAAS;EAAkB;CAAW,CAAA;AAClE;AAEA,IAAM,qBAAqB,EAAE,SAAS,eAAqE;CACzG,MAAM,EAAE,SAAS,SAAS,oBAAoB,YAAY,aAAa,YAAYC,yCAAAA,kBAAkB;CAErG,MAAM,eACJ,aAAa,YACZ,SAAS,WAAW,WAChB,QAAQ,WAAW,4DACpB;CAEN,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;EAAS,cAAW;EAAqB,WAAU;EAAnD,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAACC,kBAAAA,UAAD;GAAU,SAAQ;GAAiB,KAAI;GAAY,YAAY;GAA/D,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,kBAAAA,SAAS,WAAV,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,YAAAA,KAAD;IAAK,IAAG;IAAK,SAAQ;IAAa,MAAK;IAAM,UAAA;GAExC,CAAA,EACa,CAAA,GACnB,QAAQ,UAAU,KAAI,aAAY;IACjC,MAAM,cAAc,SAAS,aAAa,mBAAmB,IAAI,SAAS,EAAE;IAC5E,MAAM,YAAY,SAAS,aAAa,SAAS;IACjD,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACD,kBAAAA,SAAS,WAAV,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,kBAAAA,SAAS,MAAV;KAAe,WAAU;KACvB,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACE,sCAAAA,cAAD,EAAc,SAAS,SAAS,QAAU,CAAA,GAC1C,iBAAA,GAAA,kBAAA,IAAA,CAACD,YAAAA,KAAD;QAAK,IAAG;QAAO,SAAQ;QAAU,MAAK;QAAM,WAAU;QACnD,UAAA,SAAS,eAAe,SAAS;OAC/B,CAAA,CACF;MACL,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAU;OAAf,UAAA;QACG,YACC,iBAAA,GAAA,kBAAA,IAAA,CAACA,YAAAA,KAAD;SAAK,IAAG;SAAO,SAAQ;SAAU,MAAK;SAAQ,MAAK;SAAS,UAAA;QAEvD,CAAA,IACH;QACH,aAAa,SAAS,cACrB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SACE,MAAM,QAAQ;SACd,QAAO;SACP,KAAI;SACJ,WAAU;SACX,UAAA;QAEE,CAAA,IACD;QACH,cACC,iBAAA,GAAA,kBAAA,KAAA,CAACA,YAAAA,KAAD;SACE,IAAG;SACH,SAAQ;SACR,MAAK;SACL,WAAU;SAJZ,UAAA,CAME,iBAAA,GAAA,kBAAA,IAAA,CAACE,mBAAAA,MAAD;UAAM,MAAK;UACT,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,aAAAA,WAAD,EAAW,eAAA,KAAa,CAAA;SACpB,CAAA,GAAC,WAEJ;QAEL,CAAA,IAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,eAAAA,QAAD;SACE,SAAQ;SACR,MAAK;SACL,WAAU;SACV,UAAU,YAAY,cAAc;SACpC,eAAe,QAAQ,QAAQ;SAChC,UAAA;QAEO,CAAA;OAEP;MACF,CAAA,CAAA;;IACQ,CAAA,EACG,GAnDK,SAAS,EAmDd;GAExB,CAAC,CACO;EACT,CAAA,GAAA,eACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;GAAK,MAAK;GACR,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,eAAAA,QAAD;IAAQ,SAAQ;IAAc,OAAM;IAClC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACA,eAAAA,OAAO,SAAR,EAAA,UAAiB,aAA6B,CAAA;GACxC,CAAA;EACL,CAAA,IACH,IACG;;AAEb"}
1
+ {"version":3,"file":"connect-prompt-tool.cjs.js","names":["isConnectPromptPayload","toolInteraction","usePendingConnect","useToolCall","useRef","DataList","Txt","ProviderLogo","Icon","CheckIcon","Button","Notice"],"sources":["../../../../src/domains/chat/tools/connect-prompt-tool.tsx"],"sourcesContent":["import { CheckIcon } from 'lucide-react';\nimport { useEffect, useRef } from 'react';\nimport type { MessageMetadata } from '../messages/message-metadata';\nimport { toolInteraction } from './tool-card-kind';\nimport { useToolCall } from '@/domains/chat/context/tool-call-context';\nimport type { ConnectPromptPayload, ConnectPromptResume, SettledConnect } from '@/domains/connect';\nimport { isConnectPromptPayload, ProviderLogo, usePendingConnect } from '@/domains/connect';\nimport { Button } from '@/ds/components/Button';\nimport { DataList } from '@/ds/components/DataList';\nimport { Notice } from '@/ds/components/Notice';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\n\nexport { CONNECT_PROMPT_TOOL_NAME } from './connect-prompt-tool-id';\n\nexport interface ConnectPromptToolProps {\n toolName: string;\n toolCallId: string;\n output: unknown;\n metadata?: MessageMetadata;\n /** Historical rendering: show the card but suppress the connect action. */\n readOnly?: boolean;\n}\n\n/**\n * The prompt this card renders: the finished call's result, or the payload\n * the run paused with while it waits for the user to connect.\n */\nfunction connectPromptFor({\n toolName,\n toolCallId,\n output,\n metadata,\n}: Pick<ConnectPromptToolProps, 'toolName' | 'toolCallId' | 'output' | 'metadata'>):\n | { payload: ConnectPromptPayload; paused: boolean }\n | undefined {\n if (isConnectPromptPayload(output)) return { payload: output, paused: false };\n const suspendPayload = toolInteraction(metadata, toolName, toolCallId).suspended?.suspendPayload;\n if (isConnectPromptPayload(suspendPayload)) return { payload: suspendPayload, paused: true };\n return undefined;\n}\n\n/** The resume tool's schema accepts; longer failure reasons are cut to fit. */\nconst MAX_RESUME_ERROR_LENGTH = 500;\n\n/**\n * What to resume the paused call with: the settled flow, or a failure when the\n * connect session couldn't even be created (e.g. the connection limit).\n */\nfunction connectPromptResumeFor(\n payload: ConnectPromptPayload,\n settled: SettledConnect | null,\n createError: Error | null,\n): ConnectPromptResume | undefined {\n const failed = (provider: string, error: string): ConnectPromptResume => ({\n provider,\n status: 'failed',\n error: error.slice(0, MAX_RESUME_ERROR_LENGTH),\n });\n if (createError) {\n const provider = payload.requestedProvider ?? payload.providers[0]?.id;\n return provider ? failed(provider, createError.message) : undefined;\n }\n if (!settled) return undefined;\n if (settled.status === 'active') return { provider: settled.provider, status: 'active' };\n return failed(settled.provider, settled.message ?? 'The connection was not completed.');\n}\n\n/**\n * Chat card for the built-in `request_connection` tool: the agent surfaces it\n * when provider tools are unavailable because the caller has no connection.\n * Each provider row offers a Connect action that creates a connect session on\n * the mounted `/connect` routes, drives the OAuth flow in a popup through the\n * server's launch gate (which verifies this browser owns the pending session\n * before redirecting to the vendor), and polls until the connection settles.\n *\n * The tool pauses the agent run while the card is up. Once the connection\n * settles, the card resumes the paused call with the outcome — connected, or\n * the reason it failed — so the agent continues from the tool's result rather\n * than a chat message.\n */\nexport const ConnectPromptTool = ({\n toolName,\n toolCallId,\n output,\n metadata,\n readOnly = false,\n}: ConnectPromptToolProps) => {\n const prompt = connectPromptFor({ toolName, toolCallId, output, metadata });\n if (!prompt) return null;\n return (\n <ConnectPromptCard toolCallId={toolCallId} payload={prompt.payload} paused={prompt.paused} readOnly={readOnly} />\n );\n};\n\ninterface ConnectPromptCardProps {\n toolCallId: string;\n payload: ConnectPromptPayload;\n /** The run is waiting on this call, so an activation resumes it. */\n paused: boolean;\n readOnly: boolean;\n}\n\nconst ConnectPromptCard = ({ toolCallId, payload, paused, readOnly }: ConnectPromptCardProps) => {\n const { pending, connect, connectedProviders, isCreating, createError, settled } = usePendingConnect();\n const { approveToolcall, isRunning, toolCallApprovals } = useToolCall();\n // The outcome (settled flow or session-creation error) this call was resumed with.\n const resumedRef = useRef<SettledConnect | Error | null>(null);\n const alreadyResumed = toolCallApprovals[toolCallId] !== undefined;\n\n const errorMessage =\n createError?.message ??\n (settled?.status === 'failed'\n ? (settled.message ?? 'The connection was not completed. Try connecting again.')\n : null);\n\n // Resume once per outcome, success or failure, so the agent sees what\n // happened in the tool result. A run that is still streaming can't be\n // resumed yet, so an outcome that lands mid-run waits for it to stop.\n useEffect(() => {\n if (readOnly || !paused || alreadyResumed || isRunning) return;\n const outcome = createError ?? settled;\n if (!outcome || resumedRef.current === outcome) return;\n resumedRef.current = outcome;\n const resume = connectPromptResumeFor(payload, settled, createError);\n if (resume) approveToolcall(toolCallId, resume);\n }, [readOnly, paused, alreadyResumed, isRunning, settled, createError, payload, approveToolcall, toolCallId]);\n\n return (\n <section aria-label=\"Connect an account\" className=\"my-2 space-y-3\">\n <DataList columns=\"minmax(0, 1fr)\" fit=\"container\" scrollable={false}>\n <DataList.Subheader>\n <Txt as=\"h4\" variant=\"subheading\" tone=\"ink\">\n Connect an account\n </Txt>\n </DataList.Subheader>\n {payload.providers.map(provider => {\n const isConnected = provider.connected || connectedProviders.has(provider.id);\n const isPending = pending?.provider === provider.id;\n return (\n <DataList.RowStatic key={provider.id}>\n <DataList.Cell className=\"col-span-full py-2\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n <ProviderLogo logoUrl={provider.logoUrl} />\n <Txt as=\"span\" variant=\"body-sm\" tone=\"ink\" className=\"truncate\">\n {provider.displayName ?? provider.id}\n </Txt>\n </div>\n <div className=\"flex flex-wrap items-center gap-3\">\n {isPending ? (\n <Txt as=\"span\" variant=\"body-sm\" tone=\"muted\" role=\"status\">\n Waiting for authorization…\n </Txt>\n ) : null}\n {isPending && pending?.fallbackUrl ? (\n <a\n href={pending.fallbackUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-ui-md underline underline-offset-2\"\n >\n Open the connect window\n </a>\n ) : null}\n {isConnected ? (\n <Txt\n as=\"span\"\n variant=\"body-sm\"\n tone=\"muted\"\n className=\"flex min-w-24 items-center justify-center gap-1\"\n >\n <Icon size=\"sm\">\n <CheckIcon aria-hidden />\n </Icon>\n Connected\n </Txt>\n ) : (\n <Button\n variant=\"primary\"\n size=\"sm\"\n className=\"min-w-24\"\n disabled={readOnly || isCreating || isPending}\n onClick={() => connect(provider)}\n >\n Connect\n </Button>\n )}\n </div>\n </div>\n </DataList.Cell>\n </DataList.RowStatic>\n );\n })}\n </DataList>\n {errorMessage ? (\n <div role=\"alert\">\n <Notice variant=\"destructive\" title=\"Couldn't connect\">\n <Notice.Message>{errorMessage}</Notice.Message>\n </Notice>\n </div>\n ) : null}\n </section>\n );\n};\n"],"mappings":"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"}
@@ -2,32 +2,107 @@ import { Icon } from "../../../icons/Icon.es.js";
2
2
  import { t as Button } from "../../../Button-CLXTbAY8.js";
3
3
  import { t as Txt } from "../../../Txt-BM6TVV_c.js";
4
4
  import { t as Notice } from "../../../Notice-C-8oOZZF.js";
5
+ import { useToolCall } from "../context/tool-call-context.es.js";
5
6
  import { CONNECT_PROMPT_TOOL_NAME } from "./connect-prompt-tool-id.es.js";
6
7
  import { isConnectPromptPayload } from "../../connect/types.es.js";
8
+ import { toolInteraction } from "./tool-card-kind.es.js";
7
9
  import { t as DataList } from "../../../data-list-DHCOoLmj.js";
8
10
  import { usePendingConnect } from "../../connect/use-user-connect.es.js";
9
11
  import { ProviderLogo } from "../../connect/provider-logo.es.js";
12
+ import { useEffect, useRef } from "react";
10
13
  import { jsx, jsxs } from "react/jsx-runtime";
11
14
  import { CheckIcon } from "lucide-react";
12
15
  // src/domains/chat/tools/connect-prompt-tool.tsx
13
16
  /**
17
+ * The prompt this card renders: the finished call's result, or the payload
18
+ * the run paused with while it waits for the user to connect.
19
+ */
20
+ function connectPromptFor({ toolName, toolCallId, output, metadata }) {
21
+ if (isConnectPromptPayload(output)) return {
22
+ payload: output,
23
+ paused: false
24
+ };
25
+ const suspendPayload = toolInteraction(metadata, toolName, toolCallId).suspended?.suspendPayload;
26
+ if (isConnectPromptPayload(suspendPayload)) return {
27
+ payload: suspendPayload,
28
+ paused: true
29
+ };
30
+ }
31
+ /** The resume tool's schema accepts; longer failure reasons are cut to fit. */
32
+ var MAX_RESUME_ERROR_LENGTH = 500;
33
+ /**
34
+ * What to resume the paused call with: the settled flow, or a failure when the
35
+ * connect session couldn't even be created (e.g. the connection limit).
36
+ */
37
+ function connectPromptResumeFor(payload, settled, createError) {
38
+ const failed = (provider, error) => ({
39
+ provider,
40
+ status: "failed",
41
+ error: error.slice(0, MAX_RESUME_ERROR_LENGTH)
42
+ });
43
+ if (createError) {
44
+ const provider = payload.requestedProvider ?? payload.providers[0]?.id;
45
+ return provider ? failed(provider, createError.message) : void 0;
46
+ }
47
+ if (!settled) return void 0;
48
+ if (settled.status === "active") return {
49
+ provider: settled.provider,
50
+ status: "active"
51
+ };
52
+ return failed(settled.provider, settled.message ?? "The connection was not completed.");
53
+ }
54
+ /**
14
55
  * Chat card for the built-in `request_connection` tool: the agent surfaces it
15
56
  * when provider tools are unavailable because the caller has no connection.
16
57
  * Each provider row offers a Connect action that creates a connect session on
17
58
  * the mounted `/connect` routes, drives the OAuth flow in a popup through the
18
59
  * server's launch gate (which verifies this browser owns the pending session
19
60
  * before redirecting to the vendor), and polls until the connection settles.
61
+ *
62
+ * The tool pauses the agent run while the card is up. Once the connection
63
+ * settles, the card resumes the paused call with the outcome — connected, or
64
+ * the reason it failed — so the agent continues from the tool's result rather
65
+ * than a chat message.
20
66
  */
21
- var ConnectPromptTool = ({ output, readOnly = false }) => {
22
- if (!isConnectPromptPayload(output)) return null;
67
+ var ConnectPromptTool = ({ toolName, toolCallId, output, metadata, readOnly = false }) => {
68
+ const prompt = connectPromptFor({
69
+ toolName,
70
+ toolCallId,
71
+ output,
72
+ metadata
73
+ });
74
+ if (!prompt) return null;
23
75
  return /* @__PURE__ */ jsx(ConnectPromptCard, {
24
- payload: output,
76
+ toolCallId,
77
+ payload: prompt.payload,
78
+ paused: prompt.paused,
25
79
  readOnly
26
80
  });
27
81
  };
28
- var ConnectPromptCard = ({ payload, readOnly }) => {
82
+ var ConnectPromptCard = ({ toolCallId, payload, paused, readOnly }) => {
29
83
  const { pending, connect, connectedProviders, isCreating, createError, settled } = usePendingConnect();
84
+ const { approveToolcall, isRunning, toolCallApprovals } = useToolCall();
85
+ const resumedRef = useRef(null);
86
+ const alreadyResumed = toolCallApprovals[toolCallId] !== void 0;
30
87
  const errorMessage = createError?.message ?? (settled?.status === "failed" ? settled.message ?? "The connection was not completed. Try connecting again." : null);
88
+ useEffect(() => {
89
+ if (readOnly || !paused || alreadyResumed || isRunning) return;
90
+ const outcome = createError ?? settled;
91
+ if (!outcome || resumedRef.current === outcome) return;
92
+ resumedRef.current = outcome;
93
+ const resume = connectPromptResumeFor(payload, settled, createError);
94
+ if (resume) approveToolcall(toolCallId, resume);
95
+ }, [
96
+ readOnly,
97
+ paused,
98
+ alreadyResumed,
99
+ isRunning,
100
+ settled,
101
+ createError,
102
+ payload,
103
+ approveToolcall,
104
+ toolCallId
105
+ ]);
31
106
  return /* @__PURE__ */ jsxs("section", {
32
107
  "aria-label": "Connect an account",
33
108
  className: "my-2 space-y-3",
@@ -1 +1 @@
1
- {"version":3,"file":"connect-prompt-tool.es.js","names":[],"sources":["../../../../src/domains/chat/tools/connect-prompt-tool.tsx"],"sourcesContent":["import { CheckIcon } from 'lucide-react';\nimport type { ConnectPromptPayload } from '@/domains/connect';\nimport { isConnectPromptPayload, ProviderLogo, usePendingConnect } from '@/domains/connect';\nimport { Button } from '@/ds/components/Button';\nimport { DataList } from '@/ds/components/DataList';\nimport { Notice } from '@/ds/components/Notice';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\n\nexport { CONNECT_PROMPT_TOOL_NAME } from './connect-prompt-tool-id';\n\nexport interface ConnectPromptToolProps {\n output: unknown;\n /** Historical rendering: show the card but suppress the connect action. */\n readOnly?: boolean;\n}\n\n/**\n * Chat card for the built-in `request_connection` tool: the agent surfaces it\n * when provider tools are unavailable because the caller has no connection.\n * Each provider row offers a Connect action that creates a connect session on\n * the mounted `/connect` routes, drives the OAuth flow in a popup through the\n * server's launch gate (which verifies this browser owns the pending session\n * before redirecting to the vendor), and polls until the connection settles.\n */\nexport const ConnectPromptTool = ({ output, readOnly = false }: ConnectPromptToolProps) => {\n if (!isConnectPromptPayload(output)) return null;\n return <ConnectPromptCard payload={output} readOnly={readOnly} />;\n};\n\nconst ConnectPromptCard = ({ payload, readOnly }: { payload: ConnectPromptPayload; readOnly: boolean }) => {\n const { pending, connect, connectedProviders, isCreating, createError, settled } = usePendingConnect();\n\n const errorMessage =\n createError?.message ??\n (settled?.status === 'failed'\n ? (settled.message ?? 'The connection was not completed. Try connecting again.')\n : null);\n\n return (\n <section aria-label=\"Connect an account\" className=\"my-2 space-y-3\">\n <DataList columns=\"minmax(0, 1fr)\" fit=\"container\" scrollable={false}>\n <DataList.Subheader>\n <Txt as=\"h4\" variant=\"subheading\" tone=\"ink\">\n Connect an account\n </Txt>\n </DataList.Subheader>\n {payload.providers.map(provider => {\n const isConnected = provider.connected || connectedProviders.has(provider.id);\n const isPending = pending?.provider === provider.id;\n return (\n <DataList.RowStatic key={provider.id}>\n <DataList.Cell className=\"col-span-full py-2\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n <ProviderLogo logoUrl={provider.logoUrl} />\n <Txt as=\"span\" variant=\"body-sm\" tone=\"ink\" className=\"truncate\">\n {provider.displayName ?? provider.id}\n </Txt>\n </div>\n <div className=\"flex flex-wrap items-center gap-3\">\n {isPending ? (\n <Txt as=\"span\" variant=\"body-sm\" tone=\"muted\" role=\"status\">\n Waiting for authorization…\n </Txt>\n ) : null}\n {isPending && pending?.fallbackUrl ? (\n <a\n href={pending.fallbackUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-ui-md underline underline-offset-2\"\n >\n Open the connect window\n </a>\n ) : null}\n {isConnected ? (\n <Txt\n as=\"span\"\n variant=\"body-sm\"\n tone=\"muted\"\n className=\"flex min-w-24 items-center justify-center gap-1\"\n >\n <Icon size=\"sm\">\n <CheckIcon aria-hidden />\n </Icon>\n Connected\n </Txt>\n ) : (\n <Button\n variant=\"primary\"\n size=\"sm\"\n className=\"min-w-24\"\n disabled={readOnly || isCreating || isPending}\n onClick={() => connect(provider)}\n >\n Connect\n </Button>\n )}\n </div>\n </div>\n </DataList.Cell>\n </DataList.RowStatic>\n );\n })}\n </DataList>\n {errorMessage ? (\n <div role=\"alert\">\n <Notice variant=\"destructive\" title=\"Couldn't connect\">\n <Notice.Message>{errorMessage}</Notice.Message>\n </Notice>\n </div>\n ) : null}\n </section>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAyBA,IAAa,qBAAqB,EAAE,QAAQ,WAAW,YAAoC;CACzF,IAAI,CAAC,uBAAuB,MAAM,GAAG,OAAO;CAC5C,OAAO,oBAAC,mBAAD;EAAmB,SAAS;EAAkB;CAAW,CAAA;AAClE;AAEA,IAAM,qBAAqB,EAAE,SAAS,eAAqE;CACzG,MAAM,EAAE,SAAS,SAAS,oBAAoB,YAAY,aAAa,YAAY,kBAAkB;CAErG,MAAM,eACJ,aAAa,YACZ,SAAS,WAAW,WAChB,QAAQ,WAAW,4DACpB;CAEN,OACE,qBAAC,WAAD;EAAS,cAAW;EAAqB,WAAU;EAAnD,UAAA,CACE,qBAAC,UAAD;GAAU,SAAQ;GAAiB,KAAI;GAAY,YAAY;GAA/D,UAAA,CACE,oBAAC,SAAS,WAAV,EAAA,UACE,oBAAC,KAAD;IAAK,IAAG;IAAK,SAAQ;IAAa,MAAK;IAAM,UAAA;GAExC,CAAA,EACa,CAAA,GACnB,QAAQ,UAAU,KAAI,aAAY;IACjC,MAAM,cAAc,SAAS,aAAa,mBAAmB,IAAI,SAAS,EAAE;IAC5E,MAAM,YAAY,SAAS,aAAa,SAAS;IACjD,OACE,oBAAC,SAAS,WAAV,EAAA,UACE,oBAAC,SAAS,MAAV;KAAe,WAAU;KACvB,UAAA,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,qBAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACE,oBAAC,cAAD,EAAc,SAAS,SAAS,QAAU,CAAA,GAC1C,oBAAC,KAAD;QAAK,IAAG;QAAO,SAAQ;QAAU,MAAK;QAAM,WAAU;QACnD,UAAA,SAAS,eAAe,SAAS;OAC/B,CAAA,CACF;MACL,CAAA,GAAA,qBAAC,OAAD;OAAK,WAAU;OAAf,UAAA;QACG,YACC,oBAAC,KAAD;SAAK,IAAG;SAAO,SAAQ;SAAU,MAAK;SAAQ,MAAK;SAAS,UAAA;QAEvD,CAAA,IACH;QACH,aAAa,SAAS,cACrB,oBAAC,KAAD;SACE,MAAM,QAAQ;SACd,QAAO;SACP,KAAI;SACJ,WAAU;SACX,UAAA;QAEE,CAAA,IACD;QACH,cACC,qBAAC,KAAD;SACE,IAAG;SACH,SAAQ;SACR,MAAK;SACL,WAAU;SAJZ,UAAA,CAME,oBAAC,MAAD;UAAM,MAAK;UACT,UAAA,oBAAC,WAAD,EAAW,eAAA,KAAa,CAAA;SACpB,CAAA,GAAC,WAEJ;QAEL,CAAA,IAAA,oBAAC,QAAD;SACE,SAAQ;SACR,MAAK;SACL,WAAU;SACV,UAAU,YAAY,cAAc;SACpC,eAAe,QAAQ,QAAQ;SAChC,UAAA;QAEO,CAAA;OAEP;MACF,CAAA,CAAA;;IACQ,CAAA,EACG,GAnDK,SAAS,EAmDd;GAExB,CAAC,CACO;EACT,CAAA,GAAA,eACC,oBAAC,OAAD;GAAK,MAAK;GACR,UAAA,oBAAC,QAAD;IAAQ,SAAQ;IAAc,OAAM;IAClC,UAAA,oBAAC,OAAO,SAAR,EAAA,UAAiB,aAA6B,CAAA;GACxC,CAAA;EACL,CAAA,IACH,IACG;;AAEb"}
1
+ {"version":3,"file":"connect-prompt-tool.es.js","names":[],"sources":["../../../../src/domains/chat/tools/connect-prompt-tool.tsx"],"sourcesContent":["import { CheckIcon } from 'lucide-react';\nimport { useEffect, useRef } from 'react';\nimport type { MessageMetadata } from '../messages/message-metadata';\nimport { toolInteraction } from './tool-card-kind';\nimport { useToolCall } from '@/domains/chat/context/tool-call-context';\nimport type { ConnectPromptPayload, ConnectPromptResume, SettledConnect } from '@/domains/connect';\nimport { isConnectPromptPayload, ProviderLogo, usePendingConnect } from '@/domains/connect';\nimport { Button } from '@/ds/components/Button';\nimport { DataList } from '@/ds/components/DataList';\nimport { Notice } from '@/ds/components/Notice';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\n\nexport { CONNECT_PROMPT_TOOL_NAME } from './connect-prompt-tool-id';\n\nexport interface ConnectPromptToolProps {\n toolName: string;\n toolCallId: string;\n output: unknown;\n metadata?: MessageMetadata;\n /** Historical rendering: show the card but suppress the connect action. */\n readOnly?: boolean;\n}\n\n/**\n * The prompt this card renders: the finished call's result, or the payload\n * the run paused with while it waits for the user to connect.\n */\nfunction connectPromptFor({\n toolName,\n toolCallId,\n output,\n metadata,\n}: Pick<ConnectPromptToolProps, 'toolName' | 'toolCallId' | 'output' | 'metadata'>):\n | { payload: ConnectPromptPayload; paused: boolean }\n | undefined {\n if (isConnectPromptPayload(output)) return { payload: output, paused: false };\n const suspendPayload = toolInteraction(metadata, toolName, toolCallId).suspended?.suspendPayload;\n if (isConnectPromptPayload(suspendPayload)) return { payload: suspendPayload, paused: true };\n return undefined;\n}\n\n/** The resume tool's schema accepts; longer failure reasons are cut to fit. */\nconst MAX_RESUME_ERROR_LENGTH = 500;\n\n/**\n * What to resume the paused call with: the settled flow, or a failure when the\n * connect session couldn't even be created (e.g. the connection limit).\n */\nfunction connectPromptResumeFor(\n payload: ConnectPromptPayload,\n settled: SettledConnect | null,\n createError: Error | null,\n): ConnectPromptResume | undefined {\n const failed = (provider: string, error: string): ConnectPromptResume => ({\n provider,\n status: 'failed',\n error: error.slice(0, MAX_RESUME_ERROR_LENGTH),\n });\n if (createError) {\n const provider = payload.requestedProvider ?? payload.providers[0]?.id;\n return provider ? failed(provider, createError.message) : undefined;\n }\n if (!settled) return undefined;\n if (settled.status === 'active') return { provider: settled.provider, status: 'active' };\n return failed(settled.provider, settled.message ?? 'The connection was not completed.');\n}\n\n/**\n * Chat card for the built-in `request_connection` tool: the agent surfaces it\n * when provider tools are unavailable because the caller has no connection.\n * Each provider row offers a Connect action that creates a connect session on\n * the mounted `/connect` routes, drives the OAuth flow in a popup through the\n * server's launch gate (which verifies this browser owns the pending session\n * before redirecting to the vendor), and polls until the connection settles.\n *\n * The tool pauses the agent run while the card is up. Once the connection\n * settles, the card resumes the paused call with the outcome — connected, or\n * the reason it failed — so the agent continues from the tool's result rather\n * than a chat message.\n */\nexport const ConnectPromptTool = ({\n toolName,\n toolCallId,\n output,\n metadata,\n readOnly = false,\n}: ConnectPromptToolProps) => {\n const prompt = connectPromptFor({ toolName, toolCallId, output, metadata });\n if (!prompt) return null;\n return (\n <ConnectPromptCard toolCallId={toolCallId} payload={prompt.payload} paused={prompt.paused} readOnly={readOnly} />\n );\n};\n\ninterface ConnectPromptCardProps {\n toolCallId: string;\n payload: ConnectPromptPayload;\n /** The run is waiting on this call, so an activation resumes it. */\n paused: boolean;\n readOnly: boolean;\n}\n\nconst ConnectPromptCard = ({ toolCallId, payload, paused, readOnly }: ConnectPromptCardProps) => {\n const { pending, connect, connectedProviders, isCreating, createError, settled } = usePendingConnect();\n const { approveToolcall, isRunning, toolCallApprovals } = useToolCall();\n // The outcome (settled flow or session-creation error) this call was resumed with.\n const resumedRef = useRef<SettledConnect | Error | null>(null);\n const alreadyResumed = toolCallApprovals[toolCallId] !== undefined;\n\n const errorMessage =\n createError?.message ??\n (settled?.status === 'failed'\n ? (settled.message ?? 'The connection was not completed. Try connecting again.')\n : null);\n\n // Resume once per outcome, success or failure, so the agent sees what\n // happened in the tool result. A run that is still streaming can't be\n // resumed yet, so an outcome that lands mid-run waits for it to stop.\n useEffect(() => {\n if (readOnly || !paused || alreadyResumed || isRunning) return;\n const outcome = createError ?? settled;\n if (!outcome || resumedRef.current === outcome) return;\n resumedRef.current = outcome;\n const resume = connectPromptResumeFor(payload, settled, createError);\n if (resume) approveToolcall(toolCallId, resume);\n }, [readOnly, paused, alreadyResumed, isRunning, settled, createError, payload, approveToolcall, toolCallId]);\n\n return (\n <section aria-label=\"Connect an account\" className=\"my-2 space-y-3\">\n <DataList columns=\"minmax(0, 1fr)\" fit=\"container\" scrollable={false}>\n <DataList.Subheader>\n <Txt as=\"h4\" variant=\"subheading\" tone=\"ink\">\n Connect an account\n </Txt>\n </DataList.Subheader>\n {payload.providers.map(provider => {\n const isConnected = provider.connected || connectedProviders.has(provider.id);\n const isPending = pending?.provider === provider.id;\n return (\n <DataList.RowStatic key={provider.id}>\n <DataList.Cell className=\"col-span-full py-2\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n <ProviderLogo logoUrl={provider.logoUrl} />\n <Txt as=\"span\" variant=\"body-sm\" tone=\"ink\" className=\"truncate\">\n {provider.displayName ?? provider.id}\n </Txt>\n </div>\n <div className=\"flex flex-wrap items-center gap-3\">\n {isPending ? (\n <Txt as=\"span\" variant=\"body-sm\" tone=\"muted\" role=\"status\">\n Waiting for authorization…\n </Txt>\n ) : null}\n {isPending && pending?.fallbackUrl ? (\n <a\n href={pending.fallbackUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-ui-md underline underline-offset-2\"\n >\n Open the connect window\n </a>\n ) : null}\n {isConnected ? (\n <Txt\n as=\"span\"\n variant=\"body-sm\"\n tone=\"muted\"\n className=\"flex min-w-24 items-center justify-center gap-1\"\n >\n <Icon size=\"sm\">\n <CheckIcon aria-hidden />\n </Icon>\n Connected\n </Txt>\n ) : (\n <Button\n variant=\"primary\"\n size=\"sm\"\n className=\"min-w-24\"\n disabled={readOnly || isCreating || isPending}\n onClick={() => connect(provider)}\n >\n Connect\n </Button>\n )}\n </div>\n </div>\n </DataList.Cell>\n </DataList.RowStatic>\n );\n })}\n </DataList>\n {errorMessage ? (\n <div role=\"alert\">\n <Notice variant=\"destructive\" title=\"Couldn't connect\">\n <Notice.Message>{errorMessage}</Notice.Message>\n </Notice>\n </div>\n ) : null}\n </section>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,238 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_Button = require("../../../Button-DLcMcuUL.cjs");
3
+ const require_Txt = require("../../../Txt-BnoSqxKE.cjs");
4
+ const require_CodeEditor = require("../../../CodeEditor-CLzs0yVc.cjs");
5
+ const require_Notice = require("../../../Notice-JZ7SW7q6.cjs");
6
+ const require_domains_chat_tools_mcp_input_request = require("./mcp-input-request.cjs.js");
7
+ const require_ask_user = require("../../../ask-user-C1p2PEYe.cjs");
8
+ const require_lib_form_dynamic_form = require("../../../lib/form/dynamic-form.cjs.js");
9
+ const require_lib_form_json_schema_to_zod_runtime = require("../../../lib/form/json-schema-to-zod-runtime.cjs.js");
10
+ let react = require("react");
11
+ let react_jsx_runtime = require("react/jsx-runtime");
12
+ let lucide_react = require("lucide-react");
13
+ // src/domains/chat/tools/mcp-input-request-tool.tsx
14
+ var ACTION_LABEL = {
15
+ accept: "Accepted",
16
+ decline: "Declined",
17
+ cancel: "Cancelled"
18
+ };
19
+ var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
20
+ var httpUrl = (value) => {
21
+ if (typeof value !== "string") return void 0;
22
+ try {
23
+ const url = new URL(value);
24
+ return url.protocol === "https:" || url.protocol === "http:" ? url.href : void 0;
25
+ } catch {
26
+ return;
27
+ }
28
+ };
29
+ /** More fields than any real question needs; a bigger form is not one Studio should draw. */
30
+ var MAX_FORM_FIELDS = 100;
31
+ var FIELD_TYPES = /* @__PURE__ */ new Set([
32
+ "string",
33
+ "number",
34
+ "integer",
35
+ "boolean"
36
+ ]);
37
+ var FIELD_KEYS = [
38
+ "type",
39
+ "title",
40
+ "description",
41
+ "default",
42
+ "enum",
43
+ "enumNames",
44
+ "format",
45
+ "minLength",
46
+ "maxLength",
47
+ "minimum",
48
+ "maximum"
49
+ ];
50
+ var isStringList = (value) => Array.isArray(value) && value.every((item) => typeof item === "string");
51
+ /**
52
+ * The MCP spec limits `requestedSchema` to a flat object of primitive fields. Keep only that shape, so a
53
+ * server can't hand Studio a deep or huge schema to convert; anything else isn't a form Studio draws.
54
+ */
55
+ function formSchema(requested) {
56
+ const { type, properties, required } = requested;
57
+ if (type !== "object" || !isRecord(properties)) return void 0;
58
+ const entries = Object.entries(properties);
59
+ if (entries.length > MAX_FORM_FIELDS) return void 0;
60
+ const fields = {};
61
+ for (const [key, field] of entries) {
62
+ if (!isRecord(field) || typeof field.type !== "string" || !FIELD_TYPES.has(field.type)) return void 0;
63
+ if (field.enum !== void 0 && !isStringList(field.enum)) return void 0;
64
+ fields[key] = Object.fromEntries(FIELD_KEYS.filter((name) => field[name] !== void 0).map((name) => [name, field[name]]));
65
+ }
66
+ return {
67
+ type: "object",
68
+ properties: fields,
69
+ ...isStringList(required) ? { required } : {}
70
+ };
71
+ }
72
+ function viewRequest({ method, params }) {
73
+ const message = typeof params?.message === "string" ? params.message : void 0;
74
+ if (method !== "elicitation/create") return {
75
+ kind: "unsupported",
76
+ message
77
+ };
78
+ const url = params?.mode === "url" ? httpUrl(params.url) : void 0;
79
+ if (url) return {
80
+ kind: "url",
81
+ message,
82
+ url
83
+ };
84
+ const schema = params?.mode !== "url" && isRecord(params?.requestedSchema) ? formSchema(params.requestedSchema) : void 0;
85
+ if (schema) return {
86
+ kind: "form",
87
+ message,
88
+ schema
89
+ };
90
+ return {
91
+ kind: "unsupported",
92
+ message
93
+ };
94
+ }
95
+ /**
96
+ * The questions an MCP server asked while a tool call's task waits. Every request key needs an answer
97
+ * before the call can continue, so answers are held until the last one is given, then sent together.
98
+ */
99
+ function McpInputRequestTool({ payload, onSubmit, isSubmitting, error, readOnly, notice }) {
100
+ const [answers, setAnswers] = (0, react.useState)(() => /* @__PURE__ */ new Map());
101
+ const keys = Object.keys(payload.requests);
102
+ const tooLarge = (0, react.useMemo)(() => require_domains_chat_tools_mcp_input_request.inputRequestTooLarge(payload), [payload]);
103
+ const send = (next) => {
104
+ const inputResponses = Object.fromEntries(next);
105
+ Promise.resolve(onSubmit({ inputResponses })).catch(() => setAnswers(/* @__PURE__ */ new Map()));
106
+ };
107
+ const answer = (key, response) => {
108
+ const next = new Map(answers).set(key, response);
109
+ setAnswers(next);
110
+ if (!keys.every((requestKey) => next.has(requestKey))) return;
111
+ send(next);
112
+ };
113
+ const cancelAll = () => {
114
+ const next = new Map(keys.map((key) => [key, { action: "cancel" }]));
115
+ setAnswers(next);
116
+ send(next);
117
+ };
118
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_ask_user.AskUserContainer, {
119
+ className: "mb-4",
120
+ "data-testid": "mcp-input-request",
121
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_ask_user.AskUserLabel, { children: [
122
+ payload.serverName,
123
+ " needs input to continue ",
124
+ payload.toolName
125
+ ] }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_ask_user.AskUserBody, {
126
+ className: "flex flex-col gap-4",
127
+ children: [
128
+ notice && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Notice.Notice, {
129
+ variant: "info",
130
+ children: notice
131
+ }),
132
+ tooLarge ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_Txt.Txt, {
133
+ tone: "muted",
134
+ children: [payload.serverName, " sent more than Studio can show here."]
135
+ }), !readOnly && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
136
+ className: "flex gap-2",
137
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Button.Button, {
138
+ type: "button",
139
+ variant: "ghost",
140
+ disabled: isSubmitting || answers.size > 0,
141
+ onClick: cancelAll,
142
+ children: "Cancel"
143
+ })
144
+ })] }) : Object.entries(payload.requests).map(([key, request]) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(InputRequest, {
145
+ requestKey: key,
146
+ request,
147
+ answered: answers.get(key)?.action,
148
+ disabled: readOnly || isSubmitting || answers.has(key),
149
+ readOnly,
150
+ onAnswer: (response) => answer(key, response)
151
+ }, key)),
152
+ error && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Notice.Notice, {
153
+ variant: "destructive",
154
+ role: "alert",
155
+ children: error
156
+ })
157
+ ]
158
+ })]
159
+ });
160
+ }
161
+ function InputRequest({ requestKey, request, answered, disabled, readOnly, onAnswer }) {
162
+ const view = (0, react.useMemo)(() => viewRequest(request), [request]);
163
+ const schema = (0, react.useMemo)(() => view.kind === "form" ? require_lib_form_json_schema_to_zod_runtime.jsonSchemaToZodRuntime(view.schema) : void 0, [view]);
164
+ const decline = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Button.Button, {
165
+ type: "button",
166
+ disabled,
167
+ onClick: () => onAnswer({ action: "decline" }),
168
+ children: "Decline"
169
+ });
170
+ const cancel = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Button.Button, {
171
+ type: "button",
172
+ variant: "ghost",
173
+ disabled,
174
+ onClick: () => onAnswer({ action: "cancel" }),
175
+ children: "Cancel"
176
+ });
177
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
178
+ "aria-label": `Input request ${requestKey}`,
179
+ className: "flex flex-col gap-3",
180
+ children: [view.message && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Txt.Txt, {
181
+ variant: "subheading",
182
+ tone: "ink",
183
+ children: view.message
184
+ }), answered ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Txt.Txt, {
185
+ tone: "muted",
186
+ children: ACTION_LABEL[answered]
187
+ }) : readOnly ? null : view.kind === "form" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_lib_form_dynamic_form.DynamicForm, {
188
+ schema,
189
+ onSubmit: (values) => onAnswer({
190
+ action: "accept",
191
+ content: isRecord(values) ? values : {}
192
+ }),
193
+ isSubmitLoading: disabled,
194
+ submitButtonLabel: "Accept",
195
+ submitButtonVariant: "primary",
196
+ submitActions: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [decline, cancel] })
197
+ }) : view.kind === "url" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
198
+ className: "flex flex-wrap items-center gap-2",
199
+ children: [
200
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Button.Button, {
201
+ variant: "link",
202
+ render: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
203
+ href: view.url,
204
+ target: "_blank",
205
+ rel: "noopener noreferrer"
206
+ }),
207
+ iconEnd: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.ExternalLink, {}),
208
+ children: "Open link"
209
+ }),
210
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Button.Button, {
211
+ type: "button",
212
+ variant: "primary",
213
+ disabled,
214
+ onClick: () => onAnswer({ action: "accept" }),
215
+ children: "Done"
216
+ }),
217
+ cancel
218
+ ]
219
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
220
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_Txt.Txt, {
221
+ tone: "muted",
222
+ children: [
223
+ "Studio can't answer a ",
224
+ request.method,
225
+ " request."
226
+ ]
227
+ }),
228
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_CodeEditor.CodeEditor, { data: { ...request } }),
229
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
230
+ className: "flex gap-2",
231
+ children: cancel
232
+ })
233
+ ] })]
234
+ });
235
+ }
236
+ exports.McpInputRequestTool = McpInputRequestTool;
237
+
238
+ //# sourceMappingURL=mcp-input-request-tool.cjs.js.map