@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.
- package/dist/{FilterBar-CQl04O6t.cjs → FilterBar-BSP2UTjc.cjs} +2 -2
- package/dist/{FilterBar-CQl04O6t.cjs.map → FilterBar-BSP2UTjc.cjs.map} +1 -1
- package/dist/{FilterBar-BgW2dqRQ.js → FilterBar-PSQ1OwqH.js} +2 -2
- package/dist/{FilterBar-BgW2dqRQ.js.map → FilterBar-PSQ1OwqH.js.map} +1 -1
- package/dist/KnowledgePageGraph.css +55 -0
- package/dist/{MarkdownRenderer-2GOXQJEv.js → MarkdownRenderer-CI30RqdB.js} +19 -6
- package/dist/MarkdownRenderer-CI30RqdB.js.map +1 -0
- package/dist/{MarkdownRenderer-CB8Z_CHc.cjs → MarkdownRenderer-y65WGBhC.cjs} +19 -6
- package/dist/MarkdownRenderer-y65WGBhC.cjs.map +1 -0
- package/dist/{MetricsCard-CEB-f2sv.cjs → MetricsCard-BEwiS7Pe.cjs} +8 -8
- package/dist/MetricsCard-BEwiS7Pe.cjs.map +1 -0
- package/dist/{MetricsCard-M8awJ2B_.js → MetricsCard-ua6C6b8a.js} +10 -10
- package/dist/MetricsCard-ua6C6b8a.js.map +1 -0
- package/dist/{MetricsLineChart-BhHoduO0.js → MetricsLineChart-4SwxBbQx.js} +14 -3
- package/dist/MetricsLineChart-4SwxBbQx.js.map +1 -0
- package/dist/{MetricsLineChart-CjBm4IXu.cjs → MetricsLineChart-tZxsauau.cjs} +13 -2
- package/dist/MetricsLineChart-tZxsauau.cjs.map +1 -0
- package/dist/{MetricsStackedBarChart-BdMlKv6G.cjs → MetricsStackedBarChart-CDLE76IB.cjs} +2 -2
- package/dist/{MetricsStackedBarChart-BdMlKv6G.cjs.map → MetricsStackedBarChart-CDLE76IB.cjs.map} +1 -1
- package/dist/{MetricsStackedBarChart-BRuA6MTE.js → MetricsStackedBarChart-D2QyS4-z.js} +2 -2
- package/dist/{MetricsStackedBarChart-BRuA6MTE.js.map → MetricsStackedBarChart-D2QyS4-z.js.map} +1 -1
- package/dist/{activity-rJ1NQl_2.js → activity-C8Ql81WM.js} +2 -2
- package/dist/{activity-rJ1NQl_2.js.map → activity-C8Ql81WM.js.map} +1 -1
- package/dist/{activity-DyB5H3gF.cjs → activity-CcQZeDYi.cjs} +2 -2
- package/dist/{activity-DyB5H3gF.cjs.map → activity-CcQZeDYi.cjs.map} +1 -1
- package/dist/components/DateTimeRangePicker.cjs.js +1 -1
- package/dist/components/DateTimeRangePicker.es.js +1 -1
- package/dist/components/FilterBar.cjs.js +2 -2
- package/dist/components/FilterBar.es.js +2 -2
- package/dist/components/MarkdownRenderer.cjs.js +1 -1
- package/dist/components/MarkdownRenderer.es.js +1 -1
- package/dist/components/MetricsCard.cjs.js +1 -1
- package/dist/components/MetricsCard.es.js +1 -1
- package/dist/components/MetricsLineChart.cjs.js +1 -1
- package/dist/components/MetricsLineChart.es.js +1 -1
- package/dist/components/MetricsStackedBarChart.cjs.js +1 -1
- package/dist/components/MetricsStackedBarChart.es.js +1 -1
- package/dist/components/SavedViews.cjs.js +1 -1
- package/dist/components/SavedViews.es.js +1 -1
- package/dist/components/ai/activity.cjs.js +1 -1
- package/dist/components/ai/activity.es.js +1 -1
- package/dist/components/ai/plan.cjs.js +1 -1
- package/dist/components/ai/plan.es.js +1 -1
- package/dist/components/ai/tool-approval.cjs.js +1 -1
- package/dist/components/ai/tool-approval.es.js +1 -1
- package/dist/components/ai/tool-call.cjs.js +2 -2
- package/dist/components/ai/tool-call.es.js +2 -2
- package/dist/{date-time-range-picker-CTt7Od0P.cjs → date-time-range-picker-CWGjoR3j.cjs} +40 -13
- package/dist/date-time-range-picker-CWGjoR3j.cjs.map +1 -0
- package/dist/{date-time-range-picker-DKh1K9Iy.js → date-time-range-picker-CdSiXwB4.js} +40 -13
- package/dist/date-time-range-picker-CdSiXwB4.js.map +1 -0
- package/dist/domains/chat/activity/activity-stretch-line.cjs.js +1 -1
- package/dist/domains/chat/activity/activity-stretch-line.es.js +1 -1
- package/dist/domains/chat/activity/components/activity-fold.cjs.js +1 -1
- package/dist/domains/chat/activity/components/activity-fold.es.js +1 -1
- package/dist/domains/chat/activity/components/activity-timed-trigger.cjs.js +1 -1
- package/dist/domains/chat/activity/components/activity-timed-trigger.es.js +1 -1
- package/dist/domains/chat/activity/components/calls-panel.cjs.js +1 -1
- package/dist/domains/chat/activity/components/calls-panel.es.js +1 -1
- package/dist/domains/chat/activity/components/stretch-content.cjs.js +1 -1
- package/dist/domains/chat/activity/components/stretch-content.es.js +1 -1
- package/dist/domains/chat/activity/components/stretch-thought.cjs.js +1 -1
- package/dist/domains/chat/activity/components/stretch-thought.es.js +1 -1
- package/dist/domains/chat/activity/model/activity-segments.cjs.js +1 -1
- package/dist/domains/chat/activity/model/activity-segments.es.js +1 -1
- package/dist/domains/chat/activity/model/activity-words.cjs.js +2 -2
- package/dist/domains/chat/activity/model/activity-words.es.js +2 -2
- package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
- package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
- package/dist/domains/chat/knowledge/knowledge-links.cjs.js +52 -6
- package/dist/domains/chat/knowledge/knowledge-links.cjs.js.map +1 -1
- package/dist/domains/chat/knowledge/knowledge-links.es.js +53 -9
- package/dist/domains/chat/knowledge/knowledge-links.es.js.map +1 -1
- package/dist/domains/chat/knowledge/pinned-knowledge-data.cjs.js +10 -3
- package/dist/domains/chat/knowledge/pinned-knowledge-data.cjs.js.map +1 -1
- package/dist/domains/chat/knowledge/pinned-knowledge-data.es.js +10 -3
- package/dist/domains/chat/knowledge/pinned-knowledge-data.es.js.map +1 -1
- package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js +8 -3
- package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js.map +1 -1
- package/dist/domains/chat/knowledge/pinned-knowledge.es.js +8 -3
- package/dist/domains/chat/knowledge/pinned-knowledge.es.js.map +1 -1
- package/dist/domains/chat/knowledge.cjs.js +2 -0
- package/dist/domains/chat/knowledge.es.js +2 -2
- package/dist/domains/chat/messages/message-row.cjs.js +3 -3
- package/dist/domains/chat/messages/message-row.es.js +3 -3
- package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
- package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
- package/dist/domains/chat/messages/reasoning-content.cjs.js +1 -1
- package/dist/domains/chat/messages/reasoning-content.es.js +1 -1
- package/dist/domains/chat/messages/renderers/message-text.cjs.js +35 -1
- package/dist/domains/chat/messages/renderers/message-text.cjs.js.map +1 -1
- package/dist/domains/chat/messages/renderers/message-text.es.js +36 -2
- package/dist/domains/chat/messages/renderers/message-text.es.js.map +1 -1
- package/dist/domains/chat/messages/renderers/reasoning-part-renderer.cjs.js +1 -1
- package/dist/domains/chat/messages/renderers/reasoning-part-renderer.es.js +1 -1
- package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
- package/dist/domains/chat/messages/signal-badge.es.js +1 -1
- package/dist/domains/chat/messages/skill-message.cjs.js +2 -2
- package/dist/domains/chat/messages/skill-message.es.js +2 -2
- package/dist/domains/chat/messages/system-reminder-badge.cjs.js +1 -1
- package/dist/domains/chat/messages/system-reminder-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge-wrapper.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge-wrapper.es.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/file-tree-badge.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/file-tree-badge.es.js +2 -2
- package/dist/domains/chat/tools/badges/knowledge-body-range.cjs.js +80 -0
- package/dist/domains/chat/tools/badges/knowledge-body-range.cjs.js.map +1 -0
- package/dist/domains/chat/tools/badges/knowledge-body-range.d.ts +1 -0
- package/dist/domains/chat/tools/badges/knowledge-body-range.es.js +78 -0
- package/dist/domains/chat/tools/badges/knowledge-body-range.es.js.map +1 -0
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js +163 -13
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js +165 -15
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/mcp-input-request-badge.cjs.js +51 -0
- package/dist/domains/chat/tools/badges/mcp-input-request-badge.cjs.js.map +1 -0
- package/dist/domains/chat/tools/badges/mcp-input-request-badge.d.ts +1 -0
- package/dist/domains/chat/tools/badges/mcp-input-request-badge.es.js +49 -0
- package/dist/domains/chat/tools/badges/mcp-input-request-badge.es.js.map +1 -0
- package/dist/domains/chat/tools/badges/mcp-task-chip.cjs.js +7 -2
- package/dist/domains/chat/tools/badges/mcp-task-chip.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/mcp-task-chip.es.js +7 -2
- package/dist/domains/chat/tools/badges/mcp-task-chip.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +2 -2
- package/dist/domains/chat/tools/badges/observation-marker-details.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/observation-marker-details.es.js +2 -2
- package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/observation-renderer.es.js +1 -1
- package/dist/domains/chat/tools/badges/sandbox-execution-badge.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js +2 -2
- package/dist/domains/chat/tools/badges/tool-approval-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/tool-approval-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/tool-badge.cjs.js +9 -4
- package/dist/domains/chat/tools/badges/tool-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/tool-badge.es.js +9 -4
- package/dist/domains/chat/tools/badges/tool-badge.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/use-deferred-input-request.cjs.js +81 -0
- package/dist/domains/chat/tools/badges/use-deferred-input-request.cjs.js.map +1 -0
- package/dist/domains/chat/tools/badges/use-deferred-input-request.d.ts +1 -0
- package/dist/domains/chat/tools/badges/use-deferred-input-request.es.js +77 -0
- package/dist/domains/chat/tools/badges/use-deferred-input-request.es.js.map +1 -0
- package/dist/domains/chat/tools/badges/use-mcp-task-progress.cjs.js +11 -2
- package/dist/domains/chat/tools/badges/use-mcp-task-progress.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/use-mcp-task-progress.es.js +11 -2
- package/dist/domains/chat/tools/badges/use-mcp-task-progress.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/workflow-badge.es.js +1 -1
- package/dist/domains/chat/tools/connect-prompt-tool.cjs.js +79 -4
- package/dist/domains/chat/tools/connect-prompt-tool.cjs.js.map +1 -1
- package/dist/domains/chat/tools/connect-prompt-tool.es.js +79 -4
- package/dist/domains/chat/tools/connect-prompt-tool.es.js.map +1 -1
- package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js +238 -0
- package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js.map +1 -0
- package/dist/domains/chat/tools/mcp-input-request-tool.d.ts +1 -0
- package/dist/domains/chat/tools/mcp-input-request-tool.es.js +237 -0
- package/dist/domains/chat/tools/mcp-input-request-tool.es.js.map +1 -0
- package/dist/domains/chat/tools/mcp-input-request.cjs.js +40 -0
- package/dist/domains/chat/tools/mcp-input-request.cjs.js.map +1 -0
- package/dist/domains/chat/tools/mcp-input-request.d.ts +1 -0
- package/dist/domains/chat/tools/mcp-input-request.es.js +33 -0
- package/dist/domains/chat/tools/mcp-input-request.es.js.map +1 -0
- package/dist/domains/chat/tools/tool-card-kind.cjs.js +9 -4
- package/dist/domains/chat/tools/tool-card-kind.cjs.js.map +1 -1
- package/dist/domains/chat/tools/tool-card-kind.es.js +9 -5
- package/dist/domains/chat/tools/tool-card-kind.es.js.map +1 -1
- package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
- package/dist/domains/chat/tools/tool-card.es.js +1 -1
- package/dist/domains/chat/tools/tool-groups.cjs.js +1 -1
- package/dist/domains/chat/tools/tool-groups.es.js +1 -1
- package/dist/domains/chat.cjs.js +5 -3
- package/dist/domains/chat.es.js +4 -4
- package/dist/domains/connect/types.cjs.js.map +1 -1
- package/dist/domains/connect/types.es.js.map +1 -1
- package/dist/domains/connect/use-user-connect.cjs.js +19 -2
- package/dist/domains/connect/use-user-connect.cjs.js.map +1 -1
- package/dist/domains/connect/use-user-connect.es.js +19 -2
- package/dist/domains/connect/use-user-connect.es.js.map +1 -1
- package/dist/domains/dashboards/components/dashboard-renderer.cjs.js +4 -3
- package/dist/domains/dashboards/components/dashboard-renderer.cjs.js.map +1 -1
- package/dist/domains/dashboards/components/dashboard-renderer.es.js +4 -3
- package/dist/domains/dashboards/components/dashboard-renderer.es.js.map +1 -1
- package/dist/domains/dashboards/components/widget-chrome.cjs.js +1 -1
- package/dist/domains/dashboards/components/widget-chrome.es.js +1 -1
- package/dist/domains/dashboards/components/widget-error.cjs.js +1 -1
- package/dist/domains/dashboards/components/widget-error.es.js +1 -1
- package/dist/domains/dashboards/hooks/use-widget-views.cjs.js +4 -3
- package/dist/domains/dashboards/hooks/use-widget-views.cjs.js.map +1 -1
- package/dist/domains/dashboards/hooks/use-widget-views.es.js +4 -3
- package/dist/domains/dashboards/hooks/use-widget-views.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js +9 -6
- package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/scores/scores-widget.es.js +9 -6
- package/dist/domains/dashboards/kinds/scores/scores-widget.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/table/table-tabs.cjs.js +2 -2
- package/dist/domains/dashboards/kinds/table/table-tabs.es.js +2 -2
- package/dist/domains/dashboards/kinds/table/table-widget.cjs.js +1 -1
- package/dist/domains/dashboards/kinds/table/table-widget.es.js +1 -1
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js +6 -5
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js +6 -5
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js.map +1 -1
- package/dist/domains/dashboards/lib/chrome.cjs.js +9 -2
- package/dist/domains/dashboards/lib/chrome.cjs.js.map +1 -1
- package/dist/domains/dashboards/lib/chrome.es.js +9 -2
- package/dist/domains/dashboards/lib/chrome.es.js.map +1 -1
- package/dist/domains/dashboards/widget-kind.cjs.js.map +1 -1
- package/dist/domains/dashboards/widget-kind.es.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageCard.cjs.js +48 -0
- package/dist/domains/knowledge/components/KnowledgePageCard.cjs.js.map +1 -0
- package/dist/domains/knowledge/components/KnowledgePageCard.d.ts +1 -0
- package/dist/domains/knowledge/components/KnowledgePageCard.es.js +47 -0
- package/dist/domains/knowledge/components/KnowledgePageCard.es.js.map +1 -0
- package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js +63 -5
- package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageDetail.es.js +64 -6
- package/dist/domains/knowledge/components/KnowledgePageDetail.es.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js +485 -47
- package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js +487 -50
- package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js +1051 -123
- package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageGraph.es.js +1054 -126
- package/dist/domains/knowledge/components/KnowledgePageGraph.es.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js +75 -3
- package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageTree.es.js +76 -4
- package/dist/domains/knowledge/components/KnowledgePageTree.es.js.map +1 -1
- package/dist/domains/knowledge/lib/circleText.cjs.js +9 -0
- package/dist/domains/knowledge/lib/circleText.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/circleText.d.ts +1 -0
- package/dist/domains/knowledge/lib/circleText.es.js +8 -0
- package/dist/domains/knowledge/lib/circleText.es.js.map +1 -0
- package/dist/domains/knowledge/lib/fitViewport.cjs.js +82 -0
- package/dist/domains/knowledge/lib/fitViewport.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/fitViewport.d.ts +1 -0
- package/dist/domains/knowledge/lib/fitViewport.es.js +73 -0
- package/dist/domains/knowledge/lib/fitViewport.es.js.map +1 -0
- package/dist/domains/knowledge/lib/graphShape.cjs.js +524 -0
- package/dist/domains/knowledge/lib/graphShape.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/graphShape.d.ts +1 -0
- package/dist/domains/knowledge/lib/graphShape.es.js +499 -0
- package/dist/domains/knowledge/lib/graphShape.es.js.map +1 -0
- package/dist/domains/knowledge/lib/linkCountsText.cjs.js +11 -0
- package/dist/domains/knowledge/lib/linkCountsText.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/linkCountsText.d.ts +1 -0
- package/dist/domains/knowledge/lib/linkCountsText.es.js +10 -0
- package/dist/domains/knowledge/lib/linkCountsText.es.js.map +1 -0
- package/dist/domains/knowledge/lib/pageAddress.cjs.js +29 -0
- package/dist/domains/knowledge/lib/pageAddress.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/pageAddress.d.ts +1 -0
- package/dist/domains/knowledge/lib/pageAddress.es.js +27 -0
- package/dist/domains/knowledge/lib/pageAddress.es.js.map +1 -0
- package/dist/domains/knowledge/lib/pageGraph.cjs.js +11 -11
- package/dist/domains/knowledge/lib/pageGraph.cjs.js.map +1 -1
- package/dist/domains/knowledge/lib/pageGraph.es.js +11 -11
- package/dist/domains/knowledge/lib/pageGraph.es.js.map +1 -1
- package/dist/domains/knowledge/lib/pageRefs.cjs.js +69 -0
- package/dist/domains/knowledge/lib/pageRefs.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/pageRefs.d.ts +1 -0
- package/dist/domains/knowledge/lib/pageRefs.es.js +66 -0
- package/dist/domains/knowledge/lib/pageRefs.es.js.map +1 -0
- package/dist/domains/knowledge/lib/pageTree.cjs.js +5 -0
- package/dist/domains/knowledge/lib/pageTree.cjs.js.map +1 -1
- package/dist/domains/knowledge/lib/pageTree.es.js +5 -1
- package/dist/domains/knowledge/lib/pageTree.es.js.map +1 -1
- package/dist/domains/knowledge/lib/remarkKnowledgeLinks.cjs.js +82 -0
- package/dist/domains/knowledge/lib/remarkKnowledgeLinks.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/remarkKnowledgeLinks.d.ts +1 -0
- package/dist/domains/knowledge/lib/remarkKnowledgeLinks.es.js +78 -0
- package/dist/domains/knowledge/lib/remarkKnowledgeLinks.es.js.map +1 -0
- package/dist/domains/knowledge/lib/tooltipSide.cjs.js +77 -0
- package/dist/domains/knowledge/lib/tooltipSide.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/tooltipSide.d.ts +1 -0
- package/dist/domains/knowledge/lib/tooltipSide.es.js +75 -0
- package/dist/domains/knowledge/lib/tooltipSide.es.js.map +1 -0
- package/dist/domains/knowledge/lib/useLeavingNodes.cjs.js +65 -0
- package/dist/domains/knowledge/lib/useLeavingNodes.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/useLeavingNodes.d.ts +1 -0
- package/dist/domains/knowledge/lib/useLeavingNodes.es.js +62 -0
- package/dist/domains/knowledge/lib/useLeavingNodes.es.js.map +1 -0
- package/dist/domains/knowledge/lib/useStableWhile.cjs.js +15 -0
- package/dist/domains/knowledge/lib/useStableWhile.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/useStableWhile.d.ts +1 -0
- package/dist/domains/knowledge/lib/useStableWhile.es.js +14 -0
- package/dist/domains/knowledge/lib/useStableWhile.es.js.map +1 -0
- package/dist/domains/metrics/components/agent-runs-card.cjs.js +3 -3
- package/dist/domains/metrics/components/agent-runs-card.es.js +3 -3
- package/dist/domains/metrics/components/breakdown/breakdown-tab-body.cjs.js +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-tab-body.es.js +1 -1
- package/dist/domains/metrics/components/breakdown-card.cjs.js +1 -1
- package/dist/domains/metrics/components/breakdown-card.es.js +1 -1
- package/dist/domains/metrics/components/chart-area.cjs.js +1 -1
- package/dist/domains/metrics/components/chart-area.es.js +1 -1
- package/dist/domains/metrics/components/chart-card-error.cjs.js +1 -1
- package/dist/domains/metrics/components/chart-card-error.es.js +1 -1
- package/dist/domains/metrics/components/chart-card.cjs.js +1 -1
- package/dist/domains/metrics/components/chart-card.es.js +1 -1
- package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
- package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
- package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js +3 -2
- package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js.map +1 -1
- package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js +3 -2
- package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js.map +1 -1
- package/dist/domains/metrics/components/failure-rate-card.cjs.js +3 -2
- package/dist/domains/metrics/components/failure-rate-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/failure-rate-card.es.js +3 -2
- package/dist/domains/metrics/components/failure-rate-card.es.js.map +1 -1
- package/dist/domains/metrics/components/latency-card.cjs.js +3 -2
- package/dist/domains/metrics/components/latency-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/latency-card.es.js +3 -2
- package/dist/domains/metrics/components/latency-card.es.js.map +1 -1
- package/dist/domains/metrics/components/metrics-time-range-chip.cjs.js +1 -1
- package/dist/domains/metrics/components/metrics-time-range-chip.es.js +1 -1
- package/dist/domains/metrics/components/scores-card.cjs.js +2 -1
- package/dist/domains/metrics/components/scores-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/scores-card.es.js +2 -1
- package/dist/domains/metrics/components/scores-card.es.js.map +1 -1
- package/dist/domains/metrics/components/token-usage-card.cjs.js +3 -3
- package/dist/domains/metrics/components/token-usage-card.es.js +3 -3
- package/dist/domains/metrics/components/trace-aggregate-card.cjs.js +1 -1
- package/dist/domains/metrics/components/trace-aggregate-card.es.js +1 -1
- package/dist/domains/observability/components/observability-histogram.cjs.js +1 -1
- package/dist/domains/observability/components/observability-histogram.es.js +1 -1
- package/dist/domains/scores/components/trace-scores-list.cjs.js +2 -2
- package/dist/domains/scores/components/trace-scores-list.es.js +2 -2
- package/dist/domains/skills/skill-simple-form.cjs.js +1 -1
- package/dist/domains/skills/skill-simple-form.es.js +1 -1
- package/dist/domains/spans/components/spans-filter-bar.cjs.js +2 -2
- package/dist/domains/spans/components/spans-filter-bar.es.js +2 -2
- package/dist/domains/spans/hooks/use-spans-filter-bar.cjs.js +1 -1
- package/dist/domains/spans/hooks/use-spans-filter-bar.es.js +1 -1
- package/dist/domains/threads/components/threads-filter-bar.cjs.js +2 -2
- package/dist/domains/threads/components/threads-filter-bar.es.js +2 -2
- package/dist/domains/threads/hooks/use-threads-filter-bar.cjs.js +1 -1
- package/dist/domains/threads/hooks/use-threads-filter-bar.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +2 -2
- package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-processor-mutations.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-processor-mutations.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-tools-section.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-tools-section.es.js +1 -1
- package/dist/domains/traces/components/span-timeline-row.cjs.js +1 -1
- package/dist/domains/traces/components/span-timeline-row.es.js +1 -1
- package/dist/domains/traces/components/span-timing-hover-card.cjs.js +1 -1
- package/dist/domains/traces/components/span-timing-hover-card.es.js +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +8 -2
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.es.js +8 -2
- package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
- package/dist/domains/traces/components/trace-error-cell.cjs.js +1 -1
- package/dist/domains/traces/components/trace-error-cell.es.js +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js +2 -2
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js +2 -2
- package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.cjs.js +1 -1
- package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.es.js +1 -1
- package/dist/domains/workflows/runs/workflow-run-list.cjs.js +1 -1
- package/dist/domains/workflows/runs/workflow-run-list.es.js +1 -1
- package/dist/domains/workflows/workflow/input/workflow-processor-input.cjs.js +2 -2
- package/dist/domains/workflows/workflow/input/workflow-processor-input.es.js +2 -2
- package/dist/domains/workflows/workflow/use-workflow-trigger.cjs.js +3 -3
- package/dist/domains/workflows/workflow/use-workflow-trigger.es.js +3 -3
- package/dist/domains/workflows/workflow/workflow-input-data.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-input-data.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-suspended-steps.cjs.js +2 -2
- package/dist/domains/workflows/workflow/workflow-suspended-steps.es.js +2 -2
- package/dist/domains/workflows/workflow/workflow-time-travel-form.cjs.js +2 -2
- package/dist/domains/workflows/workflow/workflow-time-travel-form.es.js +2 -2
- package/dist/domains/workspace/components/workspace-add-skill-dialog.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js +1 -1
- package/dist/domains/workspace/components/workspace-markdown-preview.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-markdown-preview.es.js +1 -1
- package/dist/{filter-bar-time-range-mg9JeYue.js → filter-bar-time-range-qlV8p7hp.js} +2 -2
- package/dist/{filter-bar-time-range-mg9JeYue.js.map → filter-bar-time-range-qlV8p7hp.js.map} +1 -1
- package/dist/{filter-bar-time-range-BA-pXMlo.cjs → filter-bar-time-range-zdM024JD.cjs} +2 -2
- package/dist/{filter-bar-time-range-BA-pXMlo.cjs.map → filter-bar-time-range-zdM024JD.cjs.map} +1 -1
- package/dist/lib/form/dynamic-form.cjs.js +2 -2
- package/dist/lib/form/dynamic-form.es.js +2 -2
- package/dist/lib/form/json-draft.cjs.js +1 -1
- package/dist/lib/form/json-draft.es.js +1 -1
- package/dist/lib/form/zod-provider.cjs.js +1 -1
- package/dist/lib/form/zod-provider.es.js +1 -1
- package/dist/{span-payload-primitives-B3RdahsC.js → span-payload-primitives-CKKIAVPJ.js} +4 -4
- package/dist/{span-payload-primitives-B3RdahsC.js.map → span-payload-primitives-CKKIAVPJ.js.map} +1 -1
- package/dist/{span-payload-primitives-_2d-pAOD.cjs → span-payload-primitives-D4tHWN2W.cjs} +4 -4
- package/dist/{span-payload-primitives-_2d-pAOD.cjs.map → span-payload-primitives-D4tHWN2W.cjs.map} +1 -1
- package/dist/src/domains/chat/knowledge/knowledge-links.d.ts +32 -4
- package/dist/src/domains/chat/knowledge/pinned-knowledge-data.d.ts +2 -0
- package/dist/src/domains/chat/tools/badges/knowledge-body-range.d.ts +12 -0
- package/dist/src/domains/chat/tools/badges/knowledge-tool-badge.d.ts +5 -2
- package/dist/src/domains/chat/tools/badges/mcp-input-request-badge.d.ts +18 -0
- package/dist/src/domains/chat/tools/badges/tool-badge.d.ts +4 -1
- package/dist/src/domains/chat/tools/badges/use-deferred-input-request.d.ts +44 -0
- package/dist/src/domains/chat/tools/badges/use-mcp-task-progress.d.ts +6 -1
- package/dist/src/domains/chat/tools/connect-prompt-tool.d.ts +10 -1
- package/dist/src/domains/chat/tools/mcp-input-request-tool.d.ts +18 -0
- package/dist/src/domains/chat/tools/mcp-input-request.d.ts +40 -0
- package/dist/src/domains/chat/tools/tool-card-kind.d.ts +4 -2
- package/dist/src/domains/chat/tools/tool-card.d.ts +1 -1
- package/dist/src/domains/connect/types.d.ts +16 -0
- package/dist/src/domains/dashboards/components/dashboard-renderer.d.ts +4 -2
- package/dist/src/domains/dashboards/hooks/use-widget-views.d.ts +4 -3
- package/dist/src/domains/dashboards/index.d.ts +1 -1
- package/dist/src/domains/dashboards/kinds/scores/scores-widget.d.ts +1 -1
- package/dist/src/domains/dashboards/lib/chrome.d.ts +6 -4
- package/dist/src/domains/dashboards/widget-kind.d.ts +12 -0
- package/dist/src/domains/knowledge/components/KnowledgePageCard.d.ts +23 -0
- package/dist/src/domains/knowledge/components/KnowledgePageExplorer.d.ts +29 -0
- package/dist/src/domains/knowledge/components/KnowledgePageGraph.d.ts +27 -1
- package/dist/src/domains/knowledge/components/KnowledgePageTree.d.ts +2 -1
- package/dist/src/domains/knowledge/lib/circleText.d.ts +2 -0
- package/dist/src/domains/knowledge/lib/fitViewport.d.ts +67 -0
- package/dist/src/domains/knowledge/lib/graphShape.d.ts +131 -0
- package/dist/src/domains/knowledge/lib/linkCountsText.d.ts +5 -0
- package/dist/src/domains/knowledge/lib/pageAddress.d.ts +5 -0
- package/dist/src/domains/knowledge/lib/pageGraph.d.ts +4 -4
- package/dist/src/domains/knowledge/lib/pageRefs.d.ts +15 -0
- package/dist/src/domains/knowledge/lib/pageTree.d.ts +2 -0
- package/dist/src/domains/knowledge/lib/remarkKnowledgeLinks.d.ts +13 -0
- package/dist/src/domains/knowledge/lib/tooltipSide.d.ts +40 -0
- package/dist/src/domains/knowledge/lib/useLeavingNodes.d.ts +14 -0
- package/dist/src/domains/knowledge/lib/useStableWhile.d.ts +5 -0
- package/dist/src/domains/knowledge/pageTypes.d.ts +6 -1
- package/dist/src/ds/components/DateTimeRangePicker/date-time-range-picker.d.ts +12 -1
- package/dist/src/ds/components/MarkdownRenderer/markdown-renderer.d.ts +8 -1
- package/dist/src/ds/components/MetricsCard/metrics-card-headline.d.ts +1 -1
- package/dist/src/ds/components/MetricsLineChart/metrics-line-chart.d.ts +8 -0
- package/dist/src/ds/components/ai/tool-call/tool-phrases.d.ts +6 -0
- package/dist/style.css +73 -2
- package/dist/{tool-approval-1qiB4hhG.cjs → tool-approval-CJvPDL7D.cjs} +4 -4
- package/dist/{tool-approval-1qiB4hhG.cjs.map → tool-approval-CJvPDL7D.cjs.map} +1 -1
- package/dist/{tool-approval-B6MFcaKV.js → tool-approval-DyN11vFA.js} +4 -4
- package/dist/{tool-approval-B6MFcaKV.js.map → tool-approval-DyN11vFA.js.map} +1 -1
- package/dist/{tool-call-Bu66PkD-.cjs → tool-call-DBn14X-3.cjs} +9 -3
- package/dist/{tool-call-Bu66PkD-.cjs.map → tool-call-DBn14X-3.cjs.map} +1 -1
- package/dist/{tool-call-Ch9-jjXU.js → tool-call-Dsj43lvJ.js} +9 -3
- package/dist/{tool-call-Ch9-jjXU.js.map → tool-call-Dsj43lvJ.js.map} +1 -1
- package/dist/{tool-card-DrqPZfPQ.cjs → tool-card-BOLXeKIp.cjs} +167 -126
- package/dist/tool-card-BOLXeKIp.cjs.map +1 -0
- package/dist/{tool-card-sO6P2Qj4.js → tool-card-HZ5bm7ue.js} +168 -127
- package/dist/tool-card-HZ5bm7ue.js.map +1 -0
- package/dist/{tool-presentation-DvCsb_kz.js → tool-presentation-CvibOP1J.js} +6 -1
- package/dist/tool-presentation-CvibOP1J.js.map +1 -0
- package/dist/{tool-presentation-CQlDEwgS.cjs → tool-presentation-D6nzVruN.cjs} +6 -1
- package/dist/tool-presentation-D6nzVruN.cjs.map +1 -0
- package/package.json +11 -11
- package/dist/MarkdownRenderer-2GOXQJEv.js.map +0 -1
- package/dist/MarkdownRenderer-CB8Z_CHc.cjs.map +0 -1
- package/dist/MetricsCard-CEB-f2sv.cjs.map +0 -1
- package/dist/MetricsCard-M8awJ2B_.js.map +0 -1
- package/dist/MetricsLineChart-BhHoduO0.js.map +0 -1
- package/dist/MetricsLineChart-CjBm4IXu.cjs.map +0 -1
- package/dist/date-time-range-picker-CTt7Od0P.cjs.map +0 -1
- package/dist/date-time-range-picker-DKh1K9Iy.js.map +0 -1
- package/dist/domains/knowledge/lib/pageLayout.cjs.js +0 -49
- package/dist/domains/knowledge/lib/pageLayout.cjs.js.map +0 -1
- package/dist/domains/knowledge/lib/pageLayout.d.ts +0 -1
- package/dist/domains/knowledge/lib/pageLayout.es.js +0 -48
- package/dist/domains/knowledge/lib/pageLayout.es.js.map +0 -1
- package/dist/src/domains/knowledge/lib/pageLayout.d.ts +0 -24
- package/dist/tool-card-DrqPZfPQ.cjs.map +0 -1
- package/dist/tool-card-sO6P2Qj4.js.map +0 -1
- package/dist/tool-presentation-CQlDEwgS.cjs.map +0 -1
- package/dist/tool-presentation-DvCsb_kz.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-input-request-tool.cjs.js","names":["useState","useMemo","inputRequestTooLarge","AskUserContainer","AskUserLabel","AskUserBody","Notice","_Fragment","Txt","Button","jsonSchemaToZodRuntime","DynamicForm","ExternalLink","CodeEditor"],"sources":["../../../../src/domains/chat/tools/mcp-input-request-tool.tsx"],"sourcesContent":["import { ExternalLink } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport type {\n McpInputAction,\n McpInputRequest,\n McpInputRequestPayload,\n McpInputResponse,\n McpInputResumeData,\n} from './mcp-input-request';\nimport { inputRequestTooLarge } from './mcp-input-request';\nimport { AskUserBody, AskUserContainer, AskUserLabel } from '@/ds/components/ai/ask-user';\nimport { Button } from '@/ds/components/Button';\nimport { CodeEditor } from '@/ds/components/CodeEditor';\nimport { Notice } from '@/ds/components/Notice';\nimport { Txt } from '@/ds/components/Txt';\nimport { DynamicForm } from '@/lib/form/dynamic-form';\nimport { jsonSchemaToZodRuntime } from '@/lib/form/json-schema-to-zod-runtime';\n\nexport interface McpInputRequestToolProps {\n payload: McpInputRequestPayload;\n /** Sends the answers; the request stays open (and answerable again) if the returned promise rejects. */\n onSubmit: (resumeData: McpInputResumeData) => void | Promise<unknown>;\n isSubmitting?: boolean;\n /** Why the last answer didn't go through. */\n error?: string;\n /** History view: show the question without answering it. */\n readOnly?: boolean;\n /** Why the request can't be answered here, shown with the questions. */\n notice?: string;\n}\n\nconst ACTION_LABEL: Record<McpInputAction, string> = {\n accept: 'Accepted',\n decline: 'Declined',\n cancel: 'Cancelled',\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\ntype RequestView =\n | { kind: 'form'; message?: string; schema: Record<string, unknown> }\n | { kind: 'url'; message?: string; url: string }\n | { kind: 'unsupported'; message?: string };\n\nconst httpUrl = (value: unknown): string | undefined => {\n if (typeof value !== 'string') return undefined;\n try {\n const url = new URL(value);\n return url.protocol === 'https:' || url.protocol === 'http:' ? url.href : undefined;\n } catch {\n return undefined;\n }\n};\n\n/** More fields than any real question needs; a bigger form is not one Studio should draw. */\nconst MAX_FORM_FIELDS = 100;\nconst FIELD_TYPES = new Set(['string', 'number', 'integer', 'boolean']);\n// Keywords the MCP spec allows on a requested field. `pattern` isn't one: a server-chosen regex would\n// run against every keystroke.\nconst FIELD_KEYS = [\n 'type',\n 'title',\n 'description',\n 'default',\n 'enum',\n 'enumNames',\n 'format',\n 'minLength',\n 'maxLength',\n 'minimum',\n 'maximum',\n];\n\nconst isStringList = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every(item => typeof item === 'string');\n\n/**\n * The MCP spec limits `requestedSchema` to a flat object of primitive fields. Keep only that shape, so a\n * server can't hand Studio a deep or huge schema to convert; anything else isn't a form Studio draws.\n */\nfunction formSchema(requested: Record<string, unknown>): Record<string, unknown> | undefined {\n const { type, properties, required } = requested;\n if (type !== 'object' || !isRecord(properties)) return undefined;\n const entries = Object.entries(properties);\n if (entries.length > MAX_FORM_FIELDS) return undefined;\n const fields: Record<string, Record<string, unknown>> = {};\n for (const [key, field] of entries) {\n if (!isRecord(field) || typeof field.type !== 'string' || !FIELD_TYPES.has(field.type)) return undefined;\n if (field.enum !== undefined && !isStringList(field.enum)) return undefined;\n fields[key] = Object.fromEntries(\n FIELD_KEYS.filter(name => field[name] !== undefined).map(name => [name, field[name]]),\n );\n }\n return { type: 'object', properties: fields, ...(isStringList(required) ? { required } : {}) };\n}\n\nfunction viewRequest({ method, params }: McpInputRequest): RequestView {\n const message = typeof params?.message === 'string' ? params.message : undefined;\n if (method !== 'elicitation/create') return { kind: 'unsupported', message };\n // Only web links: a server-chosen `javascript:` URL must not become a clickable link.\n const url = params?.mode === 'url' ? httpUrl(params.url) : undefined;\n if (url) return { kind: 'url', message, url };\n const schema =\n params?.mode !== 'url' && isRecord(params?.requestedSchema) ? formSchema(params.requestedSchema) : undefined;\n if (schema) return { kind: 'form', message, schema };\n return { kind: 'unsupported', message };\n}\n\n/**\n * The questions an MCP server asked while a tool call's task waits. Every request key needs an answer\n * before the call can continue, so answers are held until the last one is given, then sent together.\n */\nexport function McpInputRequestTool({\n payload,\n onSubmit,\n isSubmitting,\n error,\n readOnly,\n notice,\n}: McpInputRequestToolProps) {\n // A Map, not an object: request keys come from the server, and one named `constructor` or\n // `__proto__` must not read `Object.prototype` and look answered.\n const [answers, setAnswers] = useState<ReadonlyMap<string, McpInputResponse>>(() => new Map());\n const keys = Object.keys(payload.requests);\n const tooLarge = useMemo(() => inputRequestTooLarge(payload), [payload]);\n\n const send = (next: ReadonlyMap<string, McpInputResponse>) => {\n // `Object.fromEntries` defines own properties, so a `__proto__` key is sent as data.\n const inputResponses = Object.fromEntries(next);\n void Promise.resolve(onSubmit({ inputResponses })).catch(() => setAnswers(new Map()));\n };\n\n const answer = (key: string, response: McpInputResponse) => {\n const next = new Map(answers).set(key, response);\n setAnswers(next);\n if (!keys.every(requestKey => next.has(requestKey))) return;\n send(next);\n };\n\n const cancelAll = () => {\n const next = new Map(keys.map(key => [key, { action: 'cancel' as const }]));\n setAnswers(next);\n send(next);\n };\n\n return (\n <AskUserContainer className=\"mb-4\" data-testid=\"mcp-input-request\">\n <AskUserLabel>\n {payload.serverName} needs input to continue {payload.toolName}\n </AskUserLabel>\n <AskUserBody className=\"flex flex-col gap-4\">\n {notice && <Notice variant=\"info\">{notice}</Notice>}\n {tooLarge ? (\n <>\n <Txt tone=\"muted\">{payload.serverName} sent more than Studio can show here.</Txt>\n {!readOnly && (\n <div className=\"flex gap-2\">\n <Button type=\"button\" variant=\"ghost\" disabled={isSubmitting || answers.size > 0} onClick={cancelAll}>\n Cancel\n </Button>\n </div>\n )}\n </>\n ) : (\n Object.entries(payload.requests).map(([key, request]) => (\n <InputRequest\n key={key}\n requestKey={key}\n request={request}\n answered={answers.get(key)?.action}\n disabled={readOnly || isSubmitting || answers.has(key)}\n readOnly={readOnly}\n onAnswer={response => answer(key, response)}\n />\n ))\n )}\n {error && (\n <Notice variant=\"destructive\" role=\"alert\">\n {error}\n </Notice>\n )}\n </AskUserBody>\n </AskUserContainer>\n );\n}\n\nfunction InputRequest({\n requestKey,\n request,\n answered,\n disabled,\n readOnly,\n onAnswer,\n}: {\n requestKey: string;\n request: McpInputRequest;\n answered?: McpInputAction;\n disabled?: boolean;\n readOnly?: boolean;\n onAnswer: (response: McpInputResponse) => void;\n}) {\n const view = useMemo(() => viewRequest(request), [request]);\n const schema = useMemo(() => (view.kind === 'form' ? jsonSchemaToZodRuntime(view.schema) : undefined), [view]);\n\n const decline = (\n <Button type=\"button\" disabled={disabled} onClick={() => onAnswer({ action: 'decline' })}>\n Decline\n </Button>\n );\n const cancel = (\n <Button type=\"button\" variant=\"ghost\" disabled={disabled} onClick={() => onAnswer({ action: 'cancel' })}>\n Cancel\n </Button>\n );\n\n return (\n <section aria-label={`Input request ${requestKey}`} className=\"flex flex-col gap-3\">\n {view.message && (\n <Txt variant=\"subheading\" tone=\"ink\">\n {view.message}\n </Txt>\n )}\n {answered ? (\n <Txt tone=\"muted\">{ACTION_LABEL[answered]}</Txt>\n ) : readOnly ? null : view.kind === 'form' ? (\n <DynamicForm\n schema={schema}\n onSubmit={values => onAnswer({ action: 'accept', content: isRecord(values) ? values : {} })}\n isSubmitLoading={disabled}\n submitButtonLabel=\"Accept\"\n submitButtonVariant=\"primary\"\n submitActions={\n <>\n {decline}\n {cancel}\n </>\n }\n />\n ) : view.kind === 'url' ? (\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button\n variant=\"link\"\n render={<a href={view.url} target=\"_blank\" rel=\"noopener noreferrer\" />}\n iconEnd={<ExternalLink />}\n >\n Open link\n </Button>\n <Button type=\"button\" variant=\"primary\" disabled={disabled} onClick={() => onAnswer({ action: 'accept' })}>\n Done\n </Button>\n {cancel}\n </div>\n ) : (\n <>\n <Txt tone=\"muted\">Studio can't answer a {request.method} request.</Txt>\n <CodeEditor data={{ ...request }} />\n <div className=\"flex gap-2\">{cancel}</div>\n </>\n )}\n </section>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../../../src/domains/chat/tools/mcp-input-request-tool';
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { t as Button } from "../../../Button-CLXTbAY8.js";
|
|
2
|
+
import { t as Txt } from "../../../Txt-BM6TVV_c.js";
|
|
3
|
+
import { t as CodeEditor } from "../../../CodeEditor-COnz9c6B.js";
|
|
4
|
+
import { t as Notice } from "../../../Notice-C-8oOZZF.js";
|
|
5
|
+
import { inputRequestTooLarge } from "./mcp-input-request.es.js";
|
|
6
|
+
import { c as AskUserBody, l as AskUserContainer, u as AskUserLabel } from "../../../ask-user-DPznrqGO.js";
|
|
7
|
+
import { DynamicForm } from "../../../lib/form/dynamic-form.es.js";
|
|
8
|
+
import { jsonSchemaToZodRuntime } from "../../../lib/form/json-schema-to-zod-runtime.es.js";
|
|
9
|
+
import { useMemo, useState } from "react";
|
|
10
|
+
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
11
|
+
import { ExternalLink } from "lucide-react";
|
|
12
|
+
// src/domains/chat/tools/mcp-input-request-tool.tsx
|
|
13
|
+
var ACTION_LABEL = {
|
|
14
|
+
accept: "Accepted",
|
|
15
|
+
decline: "Declined",
|
|
16
|
+
cancel: "Cancelled"
|
|
17
|
+
};
|
|
18
|
+
var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
19
|
+
var httpUrl = (value) => {
|
|
20
|
+
if (typeof value !== "string") return void 0;
|
|
21
|
+
try {
|
|
22
|
+
const url = new URL(value);
|
|
23
|
+
return url.protocol === "https:" || url.protocol === "http:" ? url.href : void 0;
|
|
24
|
+
} catch {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
/** More fields than any real question needs; a bigger form is not one Studio should draw. */
|
|
29
|
+
var MAX_FORM_FIELDS = 100;
|
|
30
|
+
var FIELD_TYPES = /* @__PURE__ */ new Set([
|
|
31
|
+
"string",
|
|
32
|
+
"number",
|
|
33
|
+
"integer",
|
|
34
|
+
"boolean"
|
|
35
|
+
]);
|
|
36
|
+
var FIELD_KEYS = [
|
|
37
|
+
"type",
|
|
38
|
+
"title",
|
|
39
|
+
"description",
|
|
40
|
+
"default",
|
|
41
|
+
"enum",
|
|
42
|
+
"enumNames",
|
|
43
|
+
"format",
|
|
44
|
+
"minLength",
|
|
45
|
+
"maxLength",
|
|
46
|
+
"minimum",
|
|
47
|
+
"maximum"
|
|
48
|
+
];
|
|
49
|
+
var isStringList = (value) => Array.isArray(value) && value.every((item) => typeof item === "string");
|
|
50
|
+
/**
|
|
51
|
+
* The MCP spec limits `requestedSchema` to a flat object of primitive fields. Keep only that shape, so a
|
|
52
|
+
* server can't hand Studio a deep or huge schema to convert; anything else isn't a form Studio draws.
|
|
53
|
+
*/
|
|
54
|
+
function formSchema(requested) {
|
|
55
|
+
const { type, properties, required } = requested;
|
|
56
|
+
if (type !== "object" || !isRecord(properties)) return void 0;
|
|
57
|
+
const entries = Object.entries(properties);
|
|
58
|
+
if (entries.length > MAX_FORM_FIELDS) return void 0;
|
|
59
|
+
const fields = {};
|
|
60
|
+
for (const [key, field] of entries) {
|
|
61
|
+
if (!isRecord(field) || typeof field.type !== "string" || !FIELD_TYPES.has(field.type)) return void 0;
|
|
62
|
+
if (field.enum !== void 0 && !isStringList(field.enum)) return void 0;
|
|
63
|
+
fields[key] = Object.fromEntries(FIELD_KEYS.filter((name) => field[name] !== void 0).map((name) => [name, field[name]]));
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
type: "object",
|
|
67
|
+
properties: fields,
|
|
68
|
+
...isStringList(required) ? { required } : {}
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function viewRequest({ method, params }) {
|
|
72
|
+
const message = typeof params?.message === "string" ? params.message : void 0;
|
|
73
|
+
if (method !== "elicitation/create") return {
|
|
74
|
+
kind: "unsupported",
|
|
75
|
+
message
|
|
76
|
+
};
|
|
77
|
+
const url = params?.mode === "url" ? httpUrl(params.url) : void 0;
|
|
78
|
+
if (url) return {
|
|
79
|
+
kind: "url",
|
|
80
|
+
message,
|
|
81
|
+
url
|
|
82
|
+
};
|
|
83
|
+
const schema = params?.mode !== "url" && isRecord(params?.requestedSchema) ? formSchema(params.requestedSchema) : void 0;
|
|
84
|
+
if (schema) return {
|
|
85
|
+
kind: "form",
|
|
86
|
+
message,
|
|
87
|
+
schema
|
|
88
|
+
};
|
|
89
|
+
return {
|
|
90
|
+
kind: "unsupported",
|
|
91
|
+
message
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* The questions an MCP server asked while a tool call's task waits. Every request key needs an answer
|
|
96
|
+
* before the call can continue, so answers are held until the last one is given, then sent together.
|
|
97
|
+
*/
|
|
98
|
+
function McpInputRequestTool({ payload, onSubmit, isSubmitting, error, readOnly, notice }) {
|
|
99
|
+
const [answers, setAnswers] = useState(() => /* @__PURE__ */ new Map());
|
|
100
|
+
const keys = Object.keys(payload.requests);
|
|
101
|
+
const tooLarge = useMemo(() => inputRequestTooLarge(payload), [payload]);
|
|
102
|
+
const send = (next) => {
|
|
103
|
+
const inputResponses = Object.fromEntries(next);
|
|
104
|
+
Promise.resolve(onSubmit({ inputResponses })).catch(() => setAnswers(/* @__PURE__ */ new Map()));
|
|
105
|
+
};
|
|
106
|
+
const answer = (key, response) => {
|
|
107
|
+
const next = new Map(answers).set(key, response);
|
|
108
|
+
setAnswers(next);
|
|
109
|
+
if (!keys.every((requestKey) => next.has(requestKey))) return;
|
|
110
|
+
send(next);
|
|
111
|
+
};
|
|
112
|
+
const cancelAll = () => {
|
|
113
|
+
const next = new Map(keys.map((key) => [key, { action: "cancel" }]));
|
|
114
|
+
setAnswers(next);
|
|
115
|
+
send(next);
|
|
116
|
+
};
|
|
117
|
+
return /* @__PURE__ */ jsxs(AskUserContainer, {
|
|
118
|
+
className: "mb-4",
|
|
119
|
+
"data-testid": "mcp-input-request",
|
|
120
|
+
children: [/* @__PURE__ */ jsxs(AskUserLabel, { children: [
|
|
121
|
+
payload.serverName,
|
|
122
|
+
" needs input to continue ",
|
|
123
|
+
payload.toolName
|
|
124
|
+
] }), /* @__PURE__ */ jsxs(AskUserBody, {
|
|
125
|
+
className: "flex flex-col gap-4",
|
|
126
|
+
children: [
|
|
127
|
+
notice && /* @__PURE__ */ jsx(Notice, {
|
|
128
|
+
variant: "info",
|
|
129
|
+
children: notice
|
|
130
|
+
}),
|
|
131
|
+
tooLarge ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs(Txt, {
|
|
132
|
+
tone: "muted",
|
|
133
|
+
children: [payload.serverName, " sent more than Studio can show here."]
|
|
134
|
+
}), !readOnly && /* @__PURE__ */ jsx("div", {
|
|
135
|
+
className: "flex gap-2",
|
|
136
|
+
children: /* @__PURE__ */ jsx(Button, {
|
|
137
|
+
type: "button",
|
|
138
|
+
variant: "ghost",
|
|
139
|
+
disabled: isSubmitting || answers.size > 0,
|
|
140
|
+
onClick: cancelAll,
|
|
141
|
+
children: "Cancel"
|
|
142
|
+
})
|
|
143
|
+
})] }) : Object.entries(payload.requests).map(([key, request]) => /* @__PURE__ */ jsx(InputRequest, {
|
|
144
|
+
requestKey: key,
|
|
145
|
+
request,
|
|
146
|
+
answered: answers.get(key)?.action,
|
|
147
|
+
disabled: readOnly || isSubmitting || answers.has(key),
|
|
148
|
+
readOnly,
|
|
149
|
+
onAnswer: (response) => answer(key, response)
|
|
150
|
+
}, key)),
|
|
151
|
+
error && /* @__PURE__ */ jsx(Notice, {
|
|
152
|
+
variant: "destructive",
|
|
153
|
+
role: "alert",
|
|
154
|
+
children: error
|
|
155
|
+
})
|
|
156
|
+
]
|
|
157
|
+
})]
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
function InputRequest({ requestKey, request, answered, disabled, readOnly, onAnswer }) {
|
|
161
|
+
const view = useMemo(() => viewRequest(request), [request]);
|
|
162
|
+
const schema = useMemo(() => view.kind === "form" ? jsonSchemaToZodRuntime(view.schema) : void 0, [view]);
|
|
163
|
+
const decline = /* @__PURE__ */ jsx(Button, {
|
|
164
|
+
type: "button",
|
|
165
|
+
disabled,
|
|
166
|
+
onClick: () => onAnswer({ action: "decline" }),
|
|
167
|
+
children: "Decline"
|
|
168
|
+
});
|
|
169
|
+
const cancel = /* @__PURE__ */ jsx(Button, {
|
|
170
|
+
type: "button",
|
|
171
|
+
variant: "ghost",
|
|
172
|
+
disabled,
|
|
173
|
+
onClick: () => onAnswer({ action: "cancel" }),
|
|
174
|
+
children: "Cancel"
|
|
175
|
+
});
|
|
176
|
+
return /* @__PURE__ */ jsxs("section", {
|
|
177
|
+
"aria-label": `Input request ${requestKey}`,
|
|
178
|
+
className: "flex flex-col gap-3",
|
|
179
|
+
children: [view.message && /* @__PURE__ */ jsx(Txt, {
|
|
180
|
+
variant: "subheading",
|
|
181
|
+
tone: "ink",
|
|
182
|
+
children: view.message
|
|
183
|
+
}), answered ? /* @__PURE__ */ jsx(Txt, {
|
|
184
|
+
tone: "muted",
|
|
185
|
+
children: ACTION_LABEL[answered]
|
|
186
|
+
}) : readOnly ? null : view.kind === "form" ? /* @__PURE__ */ jsx(DynamicForm, {
|
|
187
|
+
schema,
|
|
188
|
+
onSubmit: (values) => onAnswer({
|
|
189
|
+
action: "accept",
|
|
190
|
+
content: isRecord(values) ? values : {}
|
|
191
|
+
}),
|
|
192
|
+
isSubmitLoading: disabled,
|
|
193
|
+
submitButtonLabel: "Accept",
|
|
194
|
+
submitButtonVariant: "primary",
|
|
195
|
+
submitActions: /* @__PURE__ */ jsxs(Fragment$1, { children: [decline, cancel] })
|
|
196
|
+
}) : view.kind === "url" ? /* @__PURE__ */ jsxs("div", {
|
|
197
|
+
className: "flex flex-wrap items-center gap-2",
|
|
198
|
+
children: [
|
|
199
|
+
/* @__PURE__ */ jsx(Button, {
|
|
200
|
+
variant: "link",
|
|
201
|
+
render: /* @__PURE__ */ jsx("a", {
|
|
202
|
+
href: view.url,
|
|
203
|
+
target: "_blank",
|
|
204
|
+
rel: "noopener noreferrer"
|
|
205
|
+
}),
|
|
206
|
+
iconEnd: /* @__PURE__ */ jsx(ExternalLink, {}),
|
|
207
|
+
children: "Open link"
|
|
208
|
+
}),
|
|
209
|
+
/* @__PURE__ */ jsx(Button, {
|
|
210
|
+
type: "button",
|
|
211
|
+
variant: "primary",
|
|
212
|
+
disabled,
|
|
213
|
+
onClick: () => onAnswer({ action: "accept" }),
|
|
214
|
+
children: "Done"
|
|
215
|
+
}),
|
|
216
|
+
cancel
|
|
217
|
+
]
|
|
218
|
+
}) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
219
|
+
/* @__PURE__ */ jsxs(Txt, {
|
|
220
|
+
tone: "muted",
|
|
221
|
+
children: [
|
|
222
|
+
"Studio can't answer a ",
|
|
223
|
+
request.method,
|
|
224
|
+
" request."
|
|
225
|
+
]
|
|
226
|
+
}),
|
|
227
|
+
/* @__PURE__ */ jsx(CodeEditor, { data: { ...request } }),
|
|
228
|
+
/* @__PURE__ */ jsx("div", {
|
|
229
|
+
className: "flex gap-2",
|
|
230
|
+
children: cancel
|
|
231
|
+
})
|
|
232
|
+
] })]
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
export { McpInputRequestTool };
|
|
236
|
+
|
|
237
|
+
//# sourceMappingURL=mcp-input-request-tool.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-input-request-tool.es.js","names":["_Fragment"],"sources":["../../../../src/domains/chat/tools/mcp-input-request-tool.tsx"],"sourcesContent":["import { ExternalLink } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport type {\n McpInputAction,\n McpInputRequest,\n McpInputRequestPayload,\n McpInputResponse,\n McpInputResumeData,\n} from './mcp-input-request';\nimport { inputRequestTooLarge } from './mcp-input-request';\nimport { AskUserBody, AskUserContainer, AskUserLabel } from '@/ds/components/ai/ask-user';\nimport { Button } from '@/ds/components/Button';\nimport { CodeEditor } from '@/ds/components/CodeEditor';\nimport { Notice } from '@/ds/components/Notice';\nimport { Txt } from '@/ds/components/Txt';\nimport { DynamicForm } from '@/lib/form/dynamic-form';\nimport { jsonSchemaToZodRuntime } from '@/lib/form/json-schema-to-zod-runtime';\n\nexport interface McpInputRequestToolProps {\n payload: McpInputRequestPayload;\n /** Sends the answers; the request stays open (and answerable again) if the returned promise rejects. */\n onSubmit: (resumeData: McpInputResumeData) => void | Promise<unknown>;\n isSubmitting?: boolean;\n /** Why the last answer didn't go through. */\n error?: string;\n /** History view: show the question without answering it. */\n readOnly?: boolean;\n /** Why the request can't be answered here, shown with the questions. */\n notice?: string;\n}\n\nconst ACTION_LABEL: Record<McpInputAction, string> = {\n accept: 'Accepted',\n decline: 'Declined',\n cancel: 'Cancelled',\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\ntype RequestView =\n | { kind: 'form'; message?: string; schema: Record<string, unknown> }\n | { kind: 'url'; message?: string; url: string }\n | { kind: 'unsupported'; message?: string };\n\nconst httpUrl = (value: unknown): string | undefined => {\n if (typeof value !== 'string') return undefined;\n try {\n const url = new URL(value);\n return url.protocol === 'https:' || url.protocol === 'http:' ? url.href : undefined;\n } catch {\n return undefined;\n }\n};\n\n/** More fields than any real question needs; a bigger form is not one Studio should draw. */\nconst MAX_FORM_FIELDS = 100;\nconst FIELD_TYPES = new Set(['string', 'number', 'integer', 'boolean']);\n// Keywords the MCP spec allows on a requested field. `pattern` isn't one: a server-chosen regex would\n// run against every keystroke.\nconst FIELD_KEYS = [\n 'type',\n 'title',\n 'description',\n 'default',\n 'enum',\n 'enumNames',\n 'format',\n 'minLength',\n 'maxLength',\n 'minimum',\n 'maximum',\n];\n\nconst isStringList = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every(item => typeof item === 'string');\n\n/**\n * The MCP spec limits `requestedSchema` to a flat object of primitive fields. Keep only that shape, so a\n * server can't hand Studio a deep or huge schema to convert; anything else isn't a form Studio draws.\n */\nfunction formSchema(requested: Record<string, unknown>): Record<string, unknown> | undefined {\n const { type, properties, required } = requested;\n if (type !== 'object' || !isRecord(properties)) return undefined;\n const entries = Object.entries(properties);\n if (entries.length > MAX_FORM_FIELDS) return undefined;\n const fields: Record<string, Record<string, unknown>> = {};\n for (const [key, field] of entries) {\n if (!isRecord(field) || typeof field.type !== 'string' || !FIELD_TYPES.has(field.type)) return undefined;\n if (field.enum !== undefined && !isStringList(field.enum)) return undefined;\n fields[key] = Object.fromEntries(\n FIELD_KEYS.filter(name => field[name] !== undefined).map(name => [name, field[name]]),\n );\n }\n return { type: 'object', properties: fields, ...(isStringList(required) ? { required } : {}) };\n}\n\nfunction viewRequest({ method, params }: McpInputRequest): RequestView {\n const message = typeof params?.message === 'string' ? params.message : undefined;\n if (method !== 'elicitation/create') return { kind: 'unsupported', message };\n // Only web links: a server-chosen `javascript:` URL must not become a clickable link.\n const url = params?.mode === 'url' ? httpUrl(params.url) : undefined;\n if (url) return { kind: 'url', message, url };\n const schema =\n params?.mode !== 'url' && isRecord(params?.requestedSchema) ? formSchema(params.requestedSchema) : undefined;\n if (schema) return { kind: 'form', message, schema };\n return { kind: 'unsupported', message };\n}\n\n/**\n * The questions an MCP server asked while a tool call's task waits. Every request key needs an answer\n * before the call can continue, so answers are held until the last one is given, then sent together.\n */\nexport function McpInputRequestTool({\n payload,\n onSubmit,\n isSubmitting,\n error,\n readOnly,\n notice,\n}: McpInputRequestToolProps) {\n // A Map, not an object: request keys come from the server, and one named `constructor` or\n // `__proto__` must not read `Object.prototype` and look answered.\n const [answers, setAnswers] = useState<ReadonlyMap<string, McpInputResponse>>(() => new Map());\n const keys = Object.keys(payload.requests);\n const tooLarge = useMemo(() => inputRequestTooLarge(payload), [payload]);\n\n const send = (next: ReadonlyMap<string, McpInputResponse>) => {\n // `Object.fromEntries` defines own properties, so a `__proto__` key is sent as data.\n const inputResponses = Object.fromEntries(next);\n void Promise.resolve(onSubmit({ inputResponses })).catch(() => setAnswers(new Map()));\n };\n\n const answer = (key: string, response: McpInputResponse) => {\n const next = new Map(answers).set(key, response);\n setAnswers(next);\n if (!keys.every(requestKey => next.has(requestKey))) return;\n send(next);\n };\n\n const cancelAll = () => {\n const next = new Map(keys.map(key => [key, { action: 'cancel' as const }]));\n setAnswers(next);\n send(next);\n };\n\n return (\n <AskUserContainer className=\"mb-4\" data-testid=\"mcp-input-request\">\n <AskUserLabel>\n {payload.serverName} needs input to continue {payload.toolName}\n </AskUserLabel>\n <AskUserBody className=\"flex flex-col gap-4\">\n {notice && <Notice variant=\"info\">{notice}</Notice>}\n {tooLarge ? (\n <>\n <Txt tone=\"muted\">{payload.serverName} sent more than Studio can show here.</Txt>\n {!readOnly && (\n <div className=\"flex gap-2\">\n <Button type=\"button\" variant=\"ghost\" disabled={isSubmitting || answers.size > 0} onClick={cancelAll}>\n Cancel\n </Button>\n </div>\n )}\n </>\n ) : (\n Object.entries(payload.requests).map(([key, request]) => (\n <InputRequest\n key={key}\n requestKey={key}\n request={request}\n answered={answers.get(key)?.action}\n disabled={readOnly || isSubmitting || answers.has(key)}\n readOnly={readOnly}\n onAnswer={response => answer(key, response)}\n />\n ))\n )}\n {error && (\n <Notice variant=\"destructive\" role=\"alert\">\n {error}\n </Notice>\n )}\n </AskUserBody>\n </AskUserContainer>\n );\n}\n\nfunction InputRequest({\n requestKey,\n request,\n answered,\n disabled,\n readOnly,\n onAnswer,\n}: {\n requestKey: string;\n request: McpInputRequest;\n answered?: McpInputAction;\n disabled?: boolean;\n readOnly?: boolean;\n onAnswer: (response: McpInputResponse) => void;\n}) {\n const view = useMemo(() => viewRequest(request), [request]);\n const schema = useMemo(() => (view.kind === 'form' ? jsonSchemaToZodRuntime(view.schema) : undefined), [view]);\n\n const decline = (\n <Button type=\"button\" disabled={disabled} onClick={() => onAnswer({ action: 'decline' })}>\n Decline\n </Button>\n );\n const cancel = (\n <Button type=\"button\" variant=\"ghost\" disabled={disabled} onClick={() => onAnswer({ action: 'cancel' })}>\n Cancel\n </Button>\n );\n\n return (\n <section aria-label={`Input request ${requestKey}`} className=\"flex flex-col gap-3\">\n {view.message && (\n <Txt variant=\"subheading\" tone=\"ink\">\n {view.message}\n </Txt>\n )}\n {answered ? (\n <Txt tone=\"muted\">{ACTION_LABEL[answered]}</Txt>\n ) : readOnly ? null : view.kind === 'form' ? (\n <DynamicForm\n schema={schema}\n onSubmit={values => onAnswer({ action: 'accept', content: isRecord(values) ? values : {} })}\n isSubmitLoading={disabled}\n submitButtonLabel=\"Accept\"\n submitButtonVariant=\"primary\"\n submitActions={\n <>\n {decline}\n {cancel}\n </>\n }\n />\n ) : view.kind === 'url' ? (\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button\n variant=\"link\"\n render={<a href={view.url} target=\"_blank\" rel=\"noopener noreferrer\" />}\n iconEnd={<ExternalLink />}\n >\n Open link\n </Button>\n <Button type=\"button\" variant=\"primary\" disabled={disabled} onClick={() => onAnswer({ action: 'accept' })}>\n Done\n </Button>\n {cancel}\n </div>\n ) : (\n <>\n <Txt tone=\"muted\">Studio can't answer a {request.method} request.</Txt>\n <CodeEditor data={{ ...request }} />\n <div className=\"flex gap-2\">{cancel}</div>\n </>\n )}\n </section>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_domains_chat_messages_signal_data = require("../messages/signal-data.cjs.js");
|
|
3
|
+
// src/domains/chat/tools/mcp-input-request.ts
|
|
4
|
+
function isMcpInputRequest(payload) {
|
|
5
|
+
return require_domains_chat_messages_signal_data.isRecord(payload) && payload.type === "mcp-input-request" && typeof payload.serverName === "string" && typeof payload.toolName === "string" && typeof payload.taskId === "string" && typeof payload.createdAt === "string" && require_domains_chat_messages_signal_data.isRecord(payload.requests) && Object.values(payload.requests).every((request) => require_domains_chat_messages_signal_data.isRecord(request) && typeof request.method === "string");
|
|
6
|
+
}
|
|
7
|
+
/** More questions at once than any real task asks; the server decides these, so Studio bounds them. */
|
|
8
|
+
var MAX_INPUT_REQUESTS = 20;
|
|
9
|
+
var MAX_REQUEST_MESSAGE_LENGTH = 2e3;
|
|
10
|
+
var MAX_INPUT_REQUESTS_SIZE = 65536;
|
|
11
|
+
/** Whether the server sent more than Studio draws: too many questions, a huge message, or huge params. */
|
|
12
|
+
function inputRequestTooLarge(payload) {
|
|
13
|
+
const requests = Object.values(payload.requests);
|
|
14
|
+
if (requests.length > 20) return true;
|
|
15
|
+
if (requests.some((request) => typeof request.params?.message === "string" && request.params.message.length > 2e3)) return true;
|
|
16
|
+
return JSON.stringify(payload.requests).length > MAX_INPUT_REQUESTS_SIZE;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* This call's own suspension. Saved entries are keyed by call id, but a live run keys them by tool
|
|
20
|
+
* name (two calls of one tool share that key), so the entry's own `toolCallId` decides.
|
|
21
|
+
*/
|
|
22
|
+
function findSuspension(metadata, toolCallId) {
|
|
23
|
+
const suspensions = metadata?.suspendedTools;
|
|
24
|
+
if (!suspensions) return void 0;
|
|
25
|
+
return Object.values(suspensions).find((entry) => entry?.toolCallId === toolCallId);
|
|
26
|
+
}
|
|
27
|
+
/** The MCP input request this call is suspended on, if it is. */
|
|
28
|
+
function suspendedMcpInputRequest(metadata, toolCallId) {
|
|
29
|
+
const payload = findSuspension(metadata, toolCallId)?.suspendPayload;
|
|
30
|
+
return isMcpInputRequest(payload) ? payload : void 0;
|
|
31
|
+
}
|
|
32
|
+
exports.MAX_INPUT_REQUESTS = MAX_INPUT_REQUESTS;
|
|
33
|
+
exports.MAX_INPUT_REQUESTS_SIZE = MAX_INPUT_REQUESTS_SIZE;
|
|
34
|
+
exports.MAX_REQUEST_MESSAGE_LENGTH = MAX_REQUEST_MESSAGE_LENGTH;
|
|
35
|
+
exports.findSuspension = findSuspension;
|
|
36
|
+
exports.inputRequestTooLarge = inputRequestTooLarge;
|
|
37
|
+
exports.isMcpInputRequest = isMcpInputRequest;
|
|
38
|
+
exports.suspendedMcpInputRequest = suspendedMcpInputRequest;
|
|
39
|
+
|
|
40
|
+
//# sourceMappingURL=mcp-input-request.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-input-request.cjs.js","names":["isRecord"],"sources":["../../../../src/domains/chat/tools/mcp-input-request.ts"],"sourcesContent":["import type { MessageMetadata, SuspendedToolMetadata } from '../messages/message-metadata';\nimport { isRecord } from '../messages/signal-data';\n\n/** An embedded request an MCP server sent while its task waits (`{ method, params }`). */\nexport interface McpInputRequest {\n method: string;\n params?: Record<string, unknown>;\n}\n\n/** What `@mastra/mcp` suspends a task-backed tool call with (`MCPInputRequestSuspendPayload`). */\nexport interface McpInputRequestPayload {\n type: 'mcp-input-request';\n serverName: string;\n toolName: string;\n taskId: string;\n createdAt: string;\n /** When the call suspended; new each time the same task asks again, unlike `createdAt`. */\n requestedAt?: string;\n requests: Record<string, McpInputRequest>;\n}\n\nexport type McpInputAction = 'accept' | 'decline' | 'cancel';\n\nexport interface McpInputResponse {\n action: McpInputAction;\n content?: Record<string, unknown>;\n}\n\n/** Resume data answering every request key (`MCPInputRequestResumeData`). */\nexport interface McpInputResumeData {\n inputResponses: Record<string, McpInputResponse>;\n}\n\nexport function isMcpInputRequest(payload: unknown): payload is McpInputRequestPayload {\n return (\n isRecord(payload) &&\n payload.type === 'mcp-input-request' &&\n typeof payload.serverName === 'string' &&\n typeof payload.toolName === 'string' &&\n typeof payload.taskId === 'string' &&\n typeof payload.createdAt === 'string' &&\n isRecord(payload.requests) &&\n Object.values(payload.requests).every(request => isRecord(request) && typeof request.method === 'string')\n );\n}\n\n/** More questions at once than any real task asks; the server decides these, so Studio bounds them. */\nexport const MAX_INPUT_REQUESTS = 20;\nexport const MAX_REQUEST_MESSAGE_LENGTH = 2_000;\nexport const MAX_INPUT_REQUESTS_SIZE = 64 * 1024;\n\n/** Whether the server sent more than Studio draws: too many questions, a huge message, or huge params. */\nexport function inputRequestTooLarge(payload: McpInputRequestPayload): boolean {\n const requests = Object.values(payload.requests);\n if (requests.length > MAX_INPUT_REQUESTS) return true;\n if (\n requests.some(\n request =>\n typeof request.params?.message === 'string' && request.params.message.length > MAX_REQUEST_MESSAGE_LENGTH,\n )\n ) {\n return true;\n }\n return JSON.stringify(payload.requests).length > MAX_INPUT_REQUESTS_SIZE;\n}\n\n/**\n * This call's own suspension. Saved entries are keyed by call id, but a live run keys them by tool\n * name (two calls of one tool share that key), so the entry's own `toolCallId` decides.\n */\nexport function findSuspension(\n metadata: MessageMetadata | undefined,\n toolCallId: string,\n): SuspendedToolMetadata | undefined {\n const suspensions = metadata?.suspendedTools;\n if (!suspensions) return undefined;\n return Object.values(suspensions).find(entry => entry?.toolCallId === toolCallId);\n}\n\n/** The MCP input request this call is suspended on, if it is. */\nexport function suspendedMcpInputRequest(\n metadata: MessageMetadata | undefined,\n toolCallId: string,\n): McpInputRequestPayload | undefined {\n const payload = findSuspension(metadata, toolCallId)?.suspendPayload;\n return isMcpInputRequest(payload) ? payload : undefined;\n}\n"],"mappings":";;;AAiCA,SAAgB,kBAAkB,SAAqD;CACrF,OACEA,0CAAAA,SAAS,OAAO,KAChB,QAAQ,SAAS,uBACjB,OAAO,QAAQ,eAAe,YAC9B,OAAO,QAAQ,aAAa,YAC5B,OAAO,QAAQ,WAAW,YAC1B,OAAO,QAAQ,cAAc,YAC7BA,0CAAAA,SAAS,QAAQ,QAAQ,KACzB,OAAO,OAAO,QAAQ,QAAQ,CAAC,CAAC,OAAM,YAAWA,0CAAAA,SAAS,OAAO,KAAK,OAAO,QAAQ,WAAW,QAAQ;AAE5G;;AAGA,IAAa,qBAAqB;AAClC,IAAa,6BAA6B;AAC1C,IAAa,0BAA0B;;AAGvC,SAAgB,qBAAqB,SAA0C;CAC7E,MAAM,WAAW,OAAO,OAAO,QAAQ,QAAQ;CAC/C,IAAI,SAAS,SAAA,IAA6B,OAAO;CACjD,IACE,SAAS,MACP,YACE,OAAO,QAAQ,QAAQ,YAAY,YAAY,QAAQ,OAAO,QAAQ,SAAA,GAC1E,GAEA,OAAO;CAET,OAAO,KAAK,UAAU,QAAQ,QAAQ,CAAC,CAAC,SAAS;AACnD;;;;;AAMA,SAAgB,eACd,UACA,YACmC;CACnC,MAAM,cAAc,UAAU;CAC9B,IAAI,CAAC,aAAa,OAAO,KAAA;CACzB,OAAO,OAAO,OAAO,WAAW,CAAC,CAAC,MAAK,UAAS,OAAO,eAAe,UAAU;AAClF;;AAGA,SAAgB,yBACd,UACA,YACoC;CACpC,MAAM,UAAU,eAAe,UAAU,UAAU,CAAC,EAAE;CACtD,OAAO,kBAAkB,OAAO,IAAI,UAAU,KAAA;AAChD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../../../src/domains/chat/tools/mcp-input-request';
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { isRecord } from "../messages/signal-data.es.js";
|
|
2
|
+
// src/domains/chat/tools/mcp-input-request.ts
|
|
3
|
+
function isMcpInputRequest(payload) {
|
|
4
|
+
return isRecord(payload) && payload.type === "mcp-input-request" && typeof payload.serverName === "string" && typeof payload.toolName === "string" && typeof payload.taskId === "string" && typeof payload.createdAt === "string" && isRecord(payload.requests) && Object.values(payload.requests).every((request) => isRecord(request) && typeof request.method === "string");
|
|
5
|
+
}
|
|
6
|
+
/** More questions at once than any real task asks; the server decides these, so Studio bounds them. */
|
|
7
|
+
var MAX_INPUT_REQUESTS = 20;
|
|
8
|
+
var MAX_REQUEST_MESSAGE_LENGTH = 2e3;
|
|
9
|
+
var MAX_INPUT_REQUESTS_SIZE = 65536;
|
|
10
|
+
/** Whether the server sent more than Studio draws: too many questions, a huge message, or huge params. */
|
|
11
|
+
function inputRequestTooLarge(payload) {
|
|
12
|
+
const requests = Object.values(payload.requests);
|
|
13
|
+
if (requests.length > 20) return true;
|
|
14
|
+
if (requests.some((request) => typeof request.params?.message === "string" && request.params.message.length > 2e3)) return true;
|
|
15
|
+
return JSON.stringify(payload.requests).length > MAX_INPUT_REQUESTS_SIZE;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* This call's own suspension. Saved entries are keyed by call id, but a live run keys them by tool
|
|
19
|
+
* name (two calls of one tool share that key), so the entry's own `toolCallId` decides.
|
|
20
|
+
*/
|
|
21
|
+
function findSuspension(metadata, toolCallId) {
|
|
22
|
+
const suspensions = metadata?.suspendedTools;
|
|
23
|
+
if (!suspensions) return void 0;
|
|
24
|
+
return Object.values(suspensions).find((entry) => entry?.toolCallId === toolCallId);
|
|
25
|
+
}
|
|
26
|
+
/** The MCP input request this call is suspended on, if it is. */
|
|
27
|
+
function suspendedMcpInputRequest(metadata, toolCallId) {
|
|
28
|
+
const payload = findSuspension(metadata, toolCallId)?.suspendPayload;
|
|
29
|
+
return isMcpInputRequest(payload) ? payload : void 0;
|
|
30
|
+
}
|
|
31
|
+
export { MAX_INPUT_REQUESTS, MAX_INPUT_REQUESTS_SIZE, MAX_REQUEST_MESSAGE_LENGTH, findSuspension, inputRequestTooLarge, isMcpInputRequest, suspendedMcpInputRequest };
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=mcp-input-request.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-input-request.es.js","names":[],"sources":["../../../../src/domains/chat/tools/mcp-input-request.ts"],"sourcesContent":["import type { MessageMetadata, SuspendedToolMetadata } from '../messages/message-metadata';\nimport { isRecord } from '../messages/signal-data';\n\n/** An embedded request an MCP server sent while its task waits (`{ method, params }`). */\nexport interface McpInputRequest {\n method: string;\n params?: Record<string, unknown>;\n}\n\n/** What `@mastra/mcp` suspends a task-backed tool call with (`MCPInputRequestSuspendPayload`). */\nexport interface McpInputRequestPayload {\n type: 'mcp-input-request';\n serverName: string;\n toolName: string;\n taskId: string;\n createdAt: string;\n /** When the call suspended; new each time the same task asks again, unlike `createdAt`. */\n requestedAt?: string;\n requests: Record<string, McpInputRequest>;\n}\n\nexport type McpInputAction = 'accept' | 'decline' | 'cancel';\n\nexport interface McpInputResponse {\n action: McpInputAction;\n content?: Record<string, unknown>;\n}\n\n/** Resume data answering every request key (`MCPInputRequestResumeData`). */\nexport interface McpInputResumeData {\n inputResponses: Record<string, McpInputResponse>;\n}\n\nexport function isMcpInputRequest(payload: unknown): payload is McpInputRequestPayload {\n return (\n isRecord(payload) &&\n payload.type === 'mcp-input-request' &&\n typeof payload.serverName === 'string' &&\n typeof payload.toolName === 'string' &&\n typeof payload.taskId === 'string' &&\n typeof payload.createdAt === 'string' &&\n isRecord(payload.requests) &&\n Object.values(payload.requests).every(request => isRecord(request) && typeof request.method === 'string')\n );\n}\n\n/** More questions at once than any real task asks; the server decides these, so Studio bounds them. */\nexport const MAX_INPUT_REQUESTS = 20;\nexport const MAX_REQUEST_MESSAGE_LENGTH = 2_000;\nexport const MAX_INPUT_REQUESTS_SIZE = 64 * 1024;\n\n/** Whether the server sent more than Studio draws: too many questions, a huge message, or huge params. */\nexport function inputRequestTooLarge(payload: McpInputRequestPayload): boolean {\n const requests = Object.values(payload.requests);\n if (requests.length > MAX_INPUT_REQUESTS) return true;\n if (\n requests.some(\n request =>\n typeof request.params?.message === 'string' && request.params.message.length > MAX_REQUEST_MESSAGE_LENGTH,\n )\n ) {\n return true;\n }\n return JSON.stringify(payload.requests).length > MAX_INPUT_REQUESTS_SIZE;\n}\n\n/**\n * This call's own suspension. Saved entries are keyed by call id, but a live run keys them by tool\n * name (two calls of one tool share that key), so the entry's own `toolCallId` decides.\n */\nexport function findSuspension(\n metadata: MessageMetadata | undefined,\n toolCallId: string,\n): SuspendedToolMetadata | undefined {\n const suspensions = metadata?.suspendedTools;\n if (!suspensions) return undefined;\n return Object.values(suspensions).find(entry => entry?.toolCallId === toolCallId);\n}\n\n/** The MCP input request this call is suspended on, if it is. */\nexport function suspendedMcpInputRequest(\n metadata: MessageMetadata | undefined,\n toolCallId: string,\n): McpInputRequestPayload | undefined {\n const payload = findSuspension(metadata, toolCallId)?.suspendPayload;\n return isMcpInputRequest(payload) ? payload : undefined;\n}\n"],"mappings":";;AAiCA,SAAgB,kBAAkB,SAAqD;CACrF,OACE,SAAS,OAAO,KAChB,QAAQ,SAAS,uBACjB,OAAO,QAAQ,eAAe,YAC9B,OAAO,QAAQ,aAAa,YAC5B,OAAO,QAAQ,WAAW,YAC1B,OAAO,QAAQ,cAAc,YAC7B,SAAS,QAAQ,QAAQ,KACzB,OAAO,OAAO,QAAQ,QAAQ,CAAC,CAAC,OAAM,YAAW,SAAS,OAAO,KAAK,OAAO,QAAQ,WAAW,QAAQ;AAE5G;;AAGA,IAAa,qBAAqB;AAClC,IAAa,6BAA6B;AAC1C,IAAa,0BAA0B;;AAGvC,SAAgB,qBAAqB,SAA0C;CAC7E,MAAM,WAAW,OAAO,OAAO,QAAQ,QAAQ;CAC/C,IAAI,SAAS,SAAA,IAA6B,OAAO;CACjD,IACE,SAAS,MACP,YACE,OAAO,QAAQ,QAAQ,YAAY,YAAY,QAAQ,OAAO,QAAQ,SAAA,GAC1E,GAEA,OAAO;CAET,OAAO,KAAK,UAAU,QAAQ,QAAQ,CAAC,CAAC,SAAS;AACnD;;;;;AAMA,SAAgB,eACd,UACA,YACmC;CACnC,MAAM,cAAc,UAAU;CAC9B,IAAI,CAAC,aAAa,OAAO,KAAA;CACzB,OAAO,OAAO,OAAO,WAAW,CAAC,CAAC,MAAK,UAAS,OAAO,eAAe,UAAU;AAClF;;AAGA,SAAgB,yBACd,UACA,YACoC;CACpC,MAAM,UAAU,eAAe,UAAU,UAAU,CAAC,EAAE;CACtD,OAAO,kBAAkB,OAAO,IAAI,UAAU,KAAA;AAChD"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_tool_presentation = require("../../../tool-presentation-
|
|
2
|
+
const require_tool_presentation = require("../../../tool-presentation-D6nzVruN.cjs");
|
|
3
3
|
const require_domains_chat_messages_signal_data = require("../messages/signal-data.cjs.js");
|
|
4
4
|
const require_domains_chat_tools_badges_knowledge_tool_badge = require("./badges/knowledge-tool-badge.cjs.js");
|
|
5
5
|
const require_domains_chat_tools_code_mode = require("./code-mode.cjs.js");
|
|
6
6
|
require("./connect-prompt-tool-id.cjs.js");
|
|
7
|
+
const require_domains_chat_tools_mcp_input_request = require("./mcp-input-request.cjs.js");
|
|
7
8
|
require("./submit-plan-tool-id.cjs.js");
|
|
8
9
|
const require_domains_chat_tools_workspace_tool_constants = require("./workspace-tool-constants.cjs.js");
|
|
9
10
|
const require_domains_connect_types = require("../../connect/types.cjs.js");
|
|
@@ -18,6 +19,8 @@ var isNetworkFrom = (metadata, from) => metadata?.mode === "network" && metadata
|
|
|
18
19
|
var isAgentCall = (metadata, toolName) => isNetworkFrom(metadata, "AGENT") || toolName.startsWith("agent-");
|
|
19
20
|
var isWorkflowCall = (metadata, toolName) => isNetworkFrom(metadata, "WORKFLOW") || toolName.startsWith("workflow-");
|
|
20
21
|
var isSettledState = (state) => state === "output-available" || state === "result";
|
|
22
|
+
/** A call running as a Mastra background task. An awaited call's part also names its task, but holds the final result. */
|
|
23
|
+
var isDeferredCall = (backgroundTaskId, backgroundTaskStatus) => backgroundTaskId !== void 0 && backgroundTaskStatus !== "completed" && backgroundTaskStatus !== "failed";
|
|
21
24
|
/** A call neither settled nor carried by a live run reads as idle, so stale history never shimmers. */
|
|
22
25
|
function badgeStatus(state, chatRunning) {
|
|
23
26
|
if (state === "output-error") return "error";
|
|
@@ -39,13 +42,14 @@ function toolInteraction(metadata, toolName, toolCallId) {
|
|
|
39
42
|
function isHiddenTool(toolName) {
|
|
40
43
|
return toolName === "updateWorkingMemory" || require_tool_presentation.isTaskTool(toolName);
|
|
41
44
|
}
|
|
42
|
-
function toolCardKind({ toolName, toolCallId, input, output, state }, { metadata, mcpAppTools }) {
|
|
45
|
+
function toolCardKind({ toolName, toolCallId, input, output, state, backgroundTaskId, backgroundTaskStatus }, { metadata, mcpAppTools }) {
|
|
43
46
|
if (toolName === "mastra-memory-om-observation") return "observation";
|
|
44
47
|
if (isHiddenTool(toolName)) return "hidden";
|
|
45
48
|
if (toolName === "ask_user") return "ask_user";
|
|
46
|
-
if (toolName === "request_connection" && require_domains_connect_types.isConnectPromptPayload(output)) return "connect_prompt";
|
|
47
49
|
const { suspended } = toolInteraction(metadata, toolName, toolCallId);
|
|
50
|
+
if (toolName === "request_connection" && (require_domains_connect_types.isConnectPromptPayload(output) || require_domains_connect_types.isConnectPromptPayload(suspended?.suspendPayload))) return "connect_prompt";
|
|
48
51
|
if (toolName === "submit_plan" || hasSubmitPlanToolId(suspended?.suspendPayload) || hasSubmitPlanToolId(output)) return "submit_plan";
|
|
52
|
+
if (!isDeferredCall(backgroundTaskId, backgroundTaskStatus) && require_domains_chat_tools_mcp_input_request.suspendedMcpInputRequest(metadata, toolCallId)) return "mcp_input_request";
|
|
49
53
|
if (typeof output === "string" && output.toLowerCase().includes("background task")) return "background";
|
|
50
54
|
if (isAgentCall(metadata, toolName)) return "agent";
|
|
51
55
|
if (isWorkflowCall(metadata, toolName)) return "workflow";
|
|
@@ -53,12 +57,13 @@ function toolCardKind({ toolName, toolCallId, input, output, state }, { metadata
|
|
|
53
57
|
if (SANDBOX_TOOLS.has(toolName)) return "sandbox";
|
|
54
58
|
if (codeModeCall(input, output)) return "code_mode";
|
|
55
59
|
if (mcpAppTools?.[toolName]) return "mcp_app";
|
|
56
|
-
if (require_domains_chat_tools_badges_knowledge_tool_badge.KNOWLEDGE_TOOLS.has(toolName) && isSettledState(state) && require_domains_chat_tools_badges_knowledge_tool_badge.knowledgeCard(toolName, input, output)) return "knowledge";
|
|
60
|
+
if (require_domains_chat_tools_badges_knowledge_tool_badge.KNOWLEDGE_TOOLS.has(toolName) && (state === "output-error" || isSettledState(state) && require_domains_chat_tools_badges_knowledge_tool_badge.knowledgeCard(toolName, input, output))) return "knowledge";
|
|
57
61
|
return "plain";
|
|
58
62
|
}
|
|
59
63
|
exports.badgeStatus = badgeStatus;
|
|
60
64
|
exports.codeModeCall = codeModeCall;
|
|
61
65
|
exports.isAgentCall = isAgentCall;
|
|
66
|
+
exports.isDeferredCall = isDeferredCall;
|
|
62
67
|
exports.isHiddenTool = isHiddenTool;
|
|
63
68
|
exports.isSettledState = isSettledState;
|
|
64
69
|
exports.isWorkflowCall = isWorkflowCall;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-card-kind.cjs.js","names":["WORKSPACE_TOOLS","isRecord","getCodeModeCall","isTaskTool","isConnectPromptPayload","KNOWLEDGE_TOOLS","knowledgeCard"],"sources":["../../../../src/domains/chat/tools/tool-card-kind.ts"],"sourcesContent":["import type { MessageMetadata, SuspendedToolMetadata, ToolApprovalMetadata } from '../messages/message-metadata';\nimport type { ToolPartFields } from '../messages/renderers/tool-part';\nimport { isRecord } from '../messages/signal-data';\nimport { KNOWLEDGE_TOOLS, knowledgeCard } from './badges/knowledge-tool-badge';\nimport { getCodeModeCall } from './code-mode';\nimport { CONNECT_PROMPT_TOOL_NAME } from './connect-prompt-tool-id';\nimport { SUBMIT_PLAN_TOOL_ID } from './submit-plan-tool-id';\nimport { WORKSPACE_TOOLS } from './workspace-tool-constants';\nimport { isConnectPromptPayload } from '@/domains/connect/types';\nimport type { ActivityStatus } from '@/ds/components/ai/activity';\nimport { isTaskTool } from '@/ds/components/ai/tool-call';\n\n/** Which card draws a call. Decided once, shared by the dispatcher and the fold. */\nexport type ToolCardKind =\n | 'hidden'\n | 'observation'\n | 'ask_user'\n | 'connect_prompt'\n | 'submit_plan'\n | 'background'\n | 'agent'\n | 'workflow'\n | 'file_tree'\n | 'sandbox'\n | 'code_mode'\n | 'mcp_app'\n | 'knowledge'\n | 'plain';\n\nexport interface ToolCardContext {\n metadata?: MessageMetadata;\n mcpAppTools?: Record<string, unknown>;\n}\n\nexport interface ToolInteraction {\n approval?: ToolApprovalMetadata;\n suspended?: SuspendedToolMetadata;\n}\n\nconst SANDBOX_TOOLS = new Set<string>([\n WORKSPACE_TOOLS.SANDBOX.EXECUTE_COMMAND,\n WORKSPACE_TOOLS.SANDBOX.GET_PROCESS_OUTPUT,\n WORKSPACE_TOOLS.SANDBOX.KILL_PROCESS,\n]);\n\nconst hasSubmitPlanToolId = (value: unknown): boolean => isRecord(value) && value.toolId === SUBMIT_PLAN_TOOL_ID;\n\nconst isNetworkFrom = (metadata: MessageMetadata | undefined, from: string): boolean =>\n metadata?.mode === 'network' && metadata.from === from;\n\nexport const isAgentCall = (metadata: MessageMetadata | undefined, toolName: string): boolean =>\n isNetworkFrom(metadata, 'AGENT') || toolName.startsWith('agent-');\n\nexport const isWorkflowCall = (metadata: MessageMetadata | undefined, toolName: string): boolean =>\n isNetworkFrom(metadata, 'WORKFLOW') || toolName.startsWith('workflow-');\n\nexport const isSettledState = (state: string | undefined): boolean =>\n state === 'output-available' || state === 'result';\n\n/** A call neither settled nor carried by a live run reads as idle, so stale history never shimmers. */\nexport function badgeStatus(state: string | undefined, chatRunning: boolean): ActivityStatus {\n if (state === 'output-error') return 'error';\n if (isSettledState(state) || !chatRunning) return 'idle';\n return 'running';\n}\n\nexport const codeModeCall = (input: unknown, output: unknown) =>\n isRecord(input) || typeof input === 'string' ? getCodeModeCall(input, output) : null;\n\n/** Approval and suspension land keyed by tool name on older runs and by call id on newer ones. */\nexport function toolInteraction(\n metadata: MessageMetadata | undefined,\n toolName: string,\n toolCallId: string,\n): ToolInteraction {\n const approvals = metadata?.requireApprovalMetadata;\n const suspensions = metadata?.suspendedTools;\n const namedApproval = approvals?.[toolName];\n return {\n approval:\n metadata?.mode === 'network'\n ? namedApproval?.toolCallId === toolCallId\n ? namedApproval\n : approvals?.[toolCallId]\n : (approvals?.[toolCallId] ??\n Object.values(approvals ?? {}).find(approval => approval.toolCallId === toolCallId)),\n suspended: suspensions?.[toolName] ?? suspensions?.[toolCallId],\n };\n}\n\n/** Tools the transcript never draws: working memory updates and task tools (shown in the docked task list). */\nexport function isHiddenTool(toolName: string): boolean {\n return toolName === 'updateWorkingMemory' || isTaskTool(toolName);\n}\n\nexport function toolCardKind(\n { toolName, toolCallId, input, output, state }: ToolPartFields,\n { metadata, mcpAppTools }: ToolCardContext,\n): ToolCardKind {\n if (toolName === 'mastra-memory-om-observation') return 'observation';\n if (isHiddenTool(toolName)) return 'hidden';\n // A question read back in history draws as a plain badge, but it is still a question: never folded away.\n if (toolName === 'ask_user') return 'ask_user';\n // Built-in `request_connection` tool from `@mastra/connect`:
|
|
1
|
+
{"version":3,"file":"tool-card-kind.cjs.js","names":["WORKSPACE_TOOLS","isRecord","getCodeModeCall","isTaskTool","isConnectPromptPayload","suspendedMcpInputRequest","KNOWLEDGE_TOOLS","knowledgeCard"],"sources":["../../../../src/domains/chat/tools/tool-card-kind.ts"],"sourcesContent":["import type { MessageMetadata, SuspendedToolMetadata, ToolApprovalMetadata } from '../messages/message-metadata';\nimport type { ToolPartFields } from '../messages/renderers/tool-part';\nimport { isRecord } from '../messages/signal-data';\nimport { KNOWLEDGE_TOOLS, knowledgeCard } from './badges/knowledge-tool-badge';\nimport { getCodeModeCall } from './code-mode';\nimport { CONNECT_PROMPT_TOOL_NAME } from './connect-prompt-tool-id';\nimport { suspendedMcpInputRequest } from './mcp-input-request';\nimport { SUBMIT_PLAN_TOOL_ID } from './submit-plan-tool-id';\nimport { WORKSPACE_TOOLS } from './workspace-tool-constants';\nimport { isConnectPromptPayload } from '@/domains/connect/types';\nimport type { ActivityStatus } from '@/ds/components/ai/activity';\nimport { isTaskTool } from '@/ds/components/ai/tool-call';\n\n/** Which card draws a call. Decided once, shared by the dispatcher and the fold. */\nexport type ToolCardKind =\n | 'hidden'\n | 'observation'\n | 'ask_user'\n | 'connect_prompt'\n | 'submit_plan'\n | 'mcp_input_request'\n | 'background'\n | 'agent'\n | 'workflow'\n | 'file_tree'\n | 'sandbox'\n | 'code_mode'\n | 'mcp_app'\n | 'knowledge'\n | 'plain';\n\nexport interface ToolCardContext {\n metadata?: MessageMetadata;\n mcpAppTools?: Record<string, unknown>;\n}\n\nexport interface ToolInteraction {\n approval?: ToolApprovalMetadata;\n suspended?: SuspendedToolMetadata;\n}\n\nconst SANDBOX_TOOLS = new Set<string>([\n WORKSPACE_TOOLS.SANDBOX.EXECUTE_COMMAND,\n WORKSPACE_TOOLS.SANDBOX.GET_PROCESS_OUTPUT,\n WORKSPACE_TOOLS.SANDBOX.KILL_PROCESS,\n]);\n\nconst hasSubmitPlanToolId = (value: unknown): boolean => isRecord(value) && value.toolId === SUBMIT_PLAN_TOOL_ID;\n\nconst isNetworkFrom = (metadata: MessageMetadata | undefined, from: string): boolean =>\n metadata?.mode === 'network' && metadata.from === from;\n\nexport const isAgentCall = (metadata: MessageMetadata | undefined, toolName: string): boolean =>\n isNetworkFrom(metadata, 'AGENT') || toolName.startsWith('agent-');\n\nexport const isWorkflowCall = (metadata: MessageMetadata | undefined, toolName: string): boolean =>\n isNetworkFrom(metadata, 'WORKFLOW') || toolName.startsWith('workflow-');\n\nexport const isSettledState = (state: string | undefined): boolean =>\n state === 'output-available' || state === 'result';\n\n/** A call running as a Mastra background task. An awaited call's part also names its task, but holds the final result. */\nexport const isDeferredCall = (backgroundTaskId: string | undefined, backgroundTaskStatus: string | undefined) =>\n backgroundTaskId !== undefined && backgroundTaskStatus !== 'completed' && backgroundTaskStatus !== 'failed';\n\n/** A call neither settled nor carried by a live run reads as idle, so stale history never shimmers. */\nexport function badgeStatus(state: string | undefined, chatRunning: boolean): ActivityStatus {\n if (state === 'output-error') return 'error';\n if (isSettledState(state) || !chatRunning) return 'idle';\n return 'running';\n}\n\nexport const codeModeCall = (input: unknown, output: unknown) =>\n isRecord(input) || typeof input === 'string' ? getCodeModeCall(input, output) : null;\n\n/** Approval and suspension land keyed by tool name on older runs and by call id on newer ones. */\nexport function toolInteraction(\n metadata: MessageMetadata | undefined,\n toolName: string,\n toolCallId: string,\n): ToolInteraction {\n const approvals = metadata?.requireApprovalMetadata;\n const suspensions = metadata?.suspendedTools;\n const namedApproval = approvals?.[toolName];\n return {\n approval:\n metadata?.mode === 'network'\n ? namedApproval?.toolCallId === toolCallId\n ? namedApproval\n : approvals?.[toolCallId]\n : (approvals?.[toolCallId] ??\n Object.values(approvals ?? {}).find(approval => approval.toolCallId === toolCallId)),\n suspended: suspensions?.[toolName] ?? suspensions?.[toolCallId],\n };\n}\n\n/** Tools the transcript never draws: working memory updates and task tools (shown in the docked task list). */\nexport function isHiddenTool(toolName: string): boolean {\n return toolName === 'updateWorkingMemory' || isTaskTool(toolName);\n}\n\nexport function toolCardKind(\n { toolName, toolCallId, input, output, state, backgroundTaskId, backgroundTaskStatus }: ToolPartFields,\n { metadata, mcpAppTools }: ToolCardContext,\n): ToolCardKind {\n if (toolName === 'mastra-memory-om-observation') return 'observation';\n if (isHiddenTool(toolName)) return 'hidden';\n // A question read back in history draws as a plain badge, but it is still a question: never folded away.\n if (toolName === 'ask_user') return 'ask_user';\n // Built-in `request_connection` tool from `@mastra/connect`: the run pauses on it with\n // the prompt as its suspend payload, and the settled call keeps it as its result. Both\n // render the connect card; a call with neither falls back to a plain badge.\n const { suspended } = toolInteraction(metadata, toolName, toolCallId);\n if (\n toolName === CONNECT_PROMPT_TOOL_NAME &&\n (isConnectPromptPayload(output) || isConnectPromptPayload(suspended?.suspendPayload))\n ) {\n return 'connect_prompt';\n }\n if (\n toolName === SUBMIT_PLAN_TOOL_ID ||\n hasSubmitPlanToolId(suspended?.suspendPayload) ||\n hasSubmitPlanToolId(output)\n ) {\n return 'submit_plan';\n }\n // A foreground call parked on an MCP task's question: the run waits for the answer. A deferred\n // call's question lives on its background task instead, which the background card reads.\n if (!isDeferredCall(backgroundTaskId, backgroundTaskStatus) && suspendedMcpInputRequest(metadata, toolCallId)) {\n return 'mcp_input_request';\n }\n if (typeof output === 'string' && output.toLowerCase().includes('background task')) return 'background';\n if (isAgentCall(metadata, toolName)) return 'agent';\n if (isWorkflowCall(metadata, toolName)) return 'workflow';\n if (toolName === WORKSPACE_TOOLS.FILESYSTEM.LIST_FILES) return 'file_tree';\n if (SANDBOX_TOOLS.has(toolName)) return 'sandbox';\n if (codeModeCall(input, output)) return 'code_mode';\n if (mcpAppTools?.[toolName]) return 'mcp_app';\n // A settled or failed Knowledge call draws as a readable card; while running it stays a plain badge.\n if (\n KNOWLEDGE_TOOLS.has(toolName) &&\n (state === 'output-error' || (isSettledState(state) && knowledgeCard(toolName, input, output)))\n ) {\n return 'knowledge';\n }\n return 'plain';\n}\n"],"mappings":";;;;;;;;;;;AAyCA,IAAM,gCAAgB,IAAI,IAAY;CACpCA,oDAAAA,gBAAgB,QAAQ;CACxBA,oDAAAA,gBAAgB,QAAQ;CACxBA,oDAAAA,gBAAgB,QAAQ;AAC1B,CAAC;AAED,IAAM,uBAAuB,UAA4BC,0CAAAA,SAAS,KAAK,KAAK,MAAM,WAAA;AAElF,IAAM,iBAAiB,UAAuC,SAC5D,UAAU,SAAS,aAAa,SAAS,SAAS;AAEpD,IAAa,eAAe,UAAuC,aACjE,cAAc,UAAU,OAAO,KAAK,SAAS,WAAW,QAAQ;AAElE,IAAa,kBAAkB,UAAuC,aACpE,cAAc,UAAU,UAAU,KAAK,SAAS,WAAW,WAAW;AAExE,IAAa,kBAAkB,UAC7B,UAAU,sBAAsB,UAAU;;AAG5C,IAAa,kBAAkB,kBAAsC,yBACnE,qBAAqB,KAAA,KAAa,yBAAyB,eAAe,yBAAyB;;AAGrG,SAAgB,YAAY,OAA2B,aAAsC;CAC3F,IAAI,UAAU,gBAAgB,OAAO;CACrC,IAAI,eAAe,KAAK,KAAK,CAAC,aAAa,OAAO;CAClD,OAAO;AACT;AAEA,IAAa,gBAAgB,OAAgB,WAC3CA,0CAAAA,SAAS,KAAK,KAAK,OAAO,UAAU,WAAWC,qCAAAA,gBAAgB,OAAO,MAAM,IAAI;;AAGlF,SAAgB,gBACd,UACA,UACA,YACiB;CACjB,MAAM,YAAY,UAAU;CAC5B,MAAM,cAAc,UAAU;CAC9B,MAAM,gBAAgB,YAAY;CAClC,OAAO;EACL,UACE,UAAU,SAAS,YACf,eAAe,eAAe,aAC5B,gBACA,YAAY,cACb,YAAY,eACb,OAAO,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,MAAK,aAAY,SAAS,eAAe,UAAU;EACxF,WAAW,cAAc,aAAa,cAAc;CACtD;AACF;;AAGA,SAAgB,aAAa,UAA2B;CACtD,OAAO,aAAa,yBAAyBC,0BAAAA,WAAW,QAAQ;AAClE;AAEA,SAAgB,aACd,EAAE,UAAU,YAAY,OAAO,QAAQ,OAAO,kBAAkB,wBAChE,EAAE,UAAU,eACE;CACd,IAAI,aAAa,gCAAgC,OAAO;CACxD,IAAI,aAAa,QAAQ,GAAG,OAAO;CAEnC,IAAI,aAAa,YAAY,OAAO;CAIpC,MAAM,EAAE,cAAc,gBAAgB,UAAU,UAAU,UAAU;CACpE,IACE,aAAA,yBACCC,8BAAAA,uBAAuB,MAAM,KAAKA,8BAAAA,uBAAuB,WAAW,cAAc,IAEnF,OAAO;CAET,IACE,aAAA,iBACA,oBAAoB,WAAW,cAAc,KAC7C,oBAAoB,MAAM,GAE1B,OAAO;CAIT,IAAI,CAAC,eAAe,kBAAkB,oBAAoB,KAAKC,6CAAAA,yBAAyB,UAAU,UAAU,GAC1G,OAAO;CAET,IAAI,OAAO,WAAW,YAAY,OAAO,YAAY,CAAC,CAAC,SAAS,iBAAiB,GAAG,OAAO;CAC3F,IAAI,YAAY,UAAU,QAAQ,GAAG,OAAO;CAC5C,IAAI,eAAe,UAAU,QAAQ,GAAG,OAAO;CAC/C,IAAI,aAAaL,oDAAAA,gBAAgB,WAAW,YAAY,OAAO;CAC/D,IAAI,cAAc,IAAI,QAAQ,GAAG,OAAO;CACxC,IAAI,aAAa,OAAO,MAAM,GAAG,OAAO;CACxC,IAAI,cAAc,WAAW,OAAO;CAEpC,IACEM,uDAAAA,gBAAgB,IAAI,QAAQ,MAC3B,UAAU,kBAAmB,eAAe,KAAK,KAAKC,uDAAAA,cAAc,UAAU,OAAO,MAAM,IAE5F,OAAO;CAET,OAAO;AACT"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { n as isTaskTool } from "../../../tool-presentation-
|
|
1
|
+
import { n as isTaskTool } from "../../../tool-presentation-CvibOP1J.js";
|
|
2
2
|
import { isRecord } from "../messages/signal-data.es.js";
|
|
3
3
|
import { KNOWLEDGE_TOOLS, knowledgeCard } from "./badges/knowledge-tool-badge.es.js";
|
|
4
4
|
import { getCodeModeCall } from "./code-mode.es.js";
|
|
5
5
|
import "./connect-prompt-tool-id.es.js";
|
|
6
|
+
import { suspendedMcpInputRequest } from "./mcp-input-request.es.js";
|
|
6
7
|
import "./submit-plan-tool-id.es.js";
|
|
7
8
|
import { WORKSPACE_TOOLS } from "./workspace-tool-constants.es.js";
|
|
8
9
|
import { isConnectPromptPayload } from "../../connect/types.es.js";
|
|
@@ -17,6 +18,8 @@ var isNetworkFrom = (metadata, from) => metadata?.mode === "network" && metadata
|
|
|
17
18
|
var isAgentCall = (metadata, toolName) => isNetworkFrom(metadata, "AGENT") || toolName.startsWith("agent-");
|
|
18
19
|
var isWorkflowCall = (metadata, toolName) => isNetworkFrom(metadata, "WORKFLOW") || toolName.startsWith("workflow-");
|
|
19
20
|
var isSettledState = (state) => state === "output-available" || state === "result";
|
|
21
|
+
/** A call running as a Mastra background task. An awaited call's part also names its task, but holds the final result. */
|
|
22
|
+
var isDeferredCall = (backgroundTaskId, backgroundTaskStatus) => backgroundTaskId !== void 0 && backgroundTaskStatus !== "completed" && backgroundTaskStatus !== "failed";
|
|
20
23
|
/** A call neither settled nor carried by a live run reads as idle, so stale history never shimmers. */
|
|
21
24
|
function badgeStatus(state, chatRunning) {
|
|
22
25
|
if (state === "output-error") return "error";
|
|
@@ -38,13 +41,14 @@ function toolInteraction(metadata, toolName, toolCallId) {
|
|
|
38
41
|
function isHiddenTool(toolName) {
|
|
39
42
|
return toolName === "updateWorkingMemory" || isTaskTool(toolName);
|
|
40
43
|
}
|
|
41
|
-
function toolCardKind({ toolName, toolCallId, input, output, state }, { metadata, mcpAppTools }) {
|
|
44
|
+
function toolCardKind({ toolName, toolCallId, input, output, state, backgroundTaskId, backgroundTaskStatus }, { metadata, mcpAppTools }) {
|
|
42
45
|
if (toolName === "mastra-memory-om-observation") return "observation";
|
|
43
46
|
if (isHiddenTool(toolName)) return "hidden";
|
|
44
47
|
if (toolName === "ask_user") return "ask_user";
|
|
45
|
-
if (toolName === "request_connection" && isConnectPromptPayload(output)) return "connect_prompt";
|
|
46
48
|
const { suspended } = toolInteraction(metadata, toolName, toolCallId);
|
|
49
|
+
if (toolName === "request_connection" && (isConnectPromptPayload(output) || isConnectPromptPayload(suspended?.suspendPayload))) return "connect_prompt";
|
|
47
50
|
if (toolName === "submit_plan" || hasSubmitPlanToolId(suspended?.suspendPayload) || hasSubmitPlanToolId(output)) return "submit_plan";
|
|
51
|
+
if (!isDeferredCall(backgroundTaskId, backgroundTaskStatus) && suspendedMcpInputRequest(metadata, toolCallId)) return "mcp_input_request";
|
|
48
52
|
if (typeof output === "string" && output.toLowerCase().includes("background task")) return "background";
|
|
49
53
|
if (isAgentCall(metadata, toolName)) return "agent";
|
|
50
54
|
if (isWorkflowCall(metadata, toolName)) return "workflow";
|
|
@@ -52,9 +56,9 @@ function toolCardKind({ toolName, toolCallId, input, output, state }, { metadata
|
|
|
52
56
|
if (SANDBOX_TOOLS.has(toolName)) return "sandbox";
|
|
53
57
|
if (codeModeCall(input, output)) return "code_mode";
|
|
54
58
|
if (mcpAppTools?.[toolName]) return "mcp_app";
|
|
55
|
-
if (KNOWLEDGE_TOOLS.has(toolName) && isSettledState(state) && knowledgeCard(toolName, input, output)) return "knowledge";
|
|
59
|
+
if (KNOWLEDGE_TOOLS.has(toolName) && (state === "output-error" || isSettledState(state) && knowledgeCard(toolName, input, output))) return "knowledge";
|
|
56
60
|
return "plain";
|
|
57
61
|
}
|
|
58
|
-
export { badgeStatus, codeModeCall, isAgentCall, isHiddenTool, isSettledState, isWorkflowCall, toolCardKind, toolInteraction };
|
|
62
|
+
export { badgeStatus, codeModeCall, isAgentCall, isDeferredCall, isHiddenTool, isSettledState, isWorkflowCall, toolCardKind, toolInteraction };
|
|
59
63
|
|
|
60
64
|
//# sourceMappingURL=tool-card-kind.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-card-kind.es.js","names":[],"sources":["../../../../src/domains/chat/tools/tool-card-kind.ts"],"sourcesContent":["import type { MessageMetadata, SuspendedToolMetadata, ToolApprovalMetadata } from '../messages/message-metadata';\nimport type { ToolPartFields } from '../messages/renderers/tool-part';\nimport { isRecord } from '../messages/signal-data';\nimport { KNOWLEDGE_TOOLS, knowledgeCard } from './badges/knowledge-tool-badge';\nimport { getCodeModeCall } from './code-mode';\nimport { CONNECT_PROMPT_TOOL_NAME } from './connect-prompt-tool-id';\nimport { SUBMIT_PLAN_TOOL_ID } from './submit-plan-tool-id';\nimport { WORKSPACE_TOOLS } from './workspace-tool-constants';\nimport { isConnectPromptPayload } from '@/domains/connect/types';\nimport type { ActivityStatus } from '@/ds/components/ai/activity';\nimport { isTaskTool } from '@/ds/components/ai/tool-call';\n\n/** Which card draws a call. Decided once, shared by the dispatcher and the fold. */\nexport type ToolCardKind =\n | 'hidden'\n | 'observation'\n | 'ask_user'\n | 'connect_prompt'\n | 'submit_plan'\n | 'background'\n | 'agent'\n | 'workflow'\n | 'file_tree'\n | 'sandbox'\n | 'code_mode'\n | 'mcp_app'\n | 'knowledge'\n | 'plain';\n\nexport interface ToolCardContext {\n metadata?: MessageMetadata;\n mcpAppTools?: Record<string, unknown>;\n}\n\nexport interface ToolInteraction {\n approval?: ToolApprovalMetadata;\n suspended?: SuspendedToolMetadata;\n}\n\nconst SANDBOX_TOOLS = new Set<string>([\n WORKSPACE_TOOLS.SANDBOX.EXECUTE_COMMAND,\n WORKSPACE_TOOLS.SANDBOX.GET_PROCESS_OUTPUT,\n WORKSPACE_TOOLS.SANDBOX.KILL_PROCESS,\n]);\n\nconst hasSubmitPlanToolId = (value: unknown): boolean => isRecord(value) && value.toolId === SUBMIT_PLAN_TOOL_ID;\n\nconst isNetworkFrom = (metadata: MessageMetadata | undefined, from: string): boolean =>\n metadata?.mode === 'network' && metadata.from === from;\n\nexport const isAgentCall = (metadata: MessageMetadata | undefined, toolName: string): boolean =>\n isNetworkFrom(metadata, 'AGENT') || toolName.startsWith('agent-');\n\nexport const isWorkflowCall = (metadata: MessageMetadata | undefined, toolName: string): boolean =>\n isNetworkFrom(metadata, 'WORKFLOW') || toolName.startsWith('workflow-');\n\nexport const isSettledState = (state: string | undefined): boolean =>\n state === 'output-available' || state === 'result';\n\n/** A call neither settled nor carried by a live run reads as idle, so stale history never shimmers. */\nexport function badgeStatus(state: string | undefined, chatRunning: boolean): ActivityStatus {\n if (state === 'output-error') return 'error';\n if (isSettledState(state) || !chatRunning) return 'idle';\n return 'running';\n}\n\nexport const codeModeCall = (input: unknown, output: unknown) =>\n isRecord(input) || typeof input === 'string' ? getCodeModeCall(input, output) : null;\n\n/** Approval and suspension land keyed by tool name on older runs and by call id on newer ones. */\nexport function toolInteraction(\n metadata: MessageMetadata | undefined,\n toolName: string,\n toolCallId: string,\n): ToolInteraction {\n const approvals = metadata?.requireApprovalMetadata;\n const suspensions = metadata?.suspendedTools;\n const namedApproval = approvals?.[toolName];\n return {\n approval:\n metadata?.mode === 'network'\n ? namedApproval?.toolCallId === toolCallId\n ? namedApproval\n : approvals?.[toolCallId]\n : (approvals?.[toolCallId] ??\n Object.values(approvals ?? {}).find(approval => approval.toolCallId === toolCallId)),\n suspended: suspensions?.[toolName] ?? suspensions?.[toolCallId],\n };\n}\n\n/** Tools the transcript never draws: working memory updates and task tools (shown in the docked task list). */\nexport function isHiddenTool(toolName: string): boolean {\n return toolName === 'updateWorkingMemory' || isTaskTool(toolName);\n}\n\nexport function toolCardKind(\n { toolName, toolCallId, input, output, state }: ToolPartFields,\n { metadata, mcpAppTools }: ToolCardContext,\n): ToolCardKind {\n if (toolName === 'mastra-memory-om-observation') return 'observation';\n if (isHiddenTool(toolName)) return 'hidden';\n // A question read back in history draws as a plain badge, but it is still a question: never folded away.\n if (toolName === 'ask_user') return 'ask_user';\n // Built-in `request_connection` tool from `@mastra/connect`:
|
|
1
|
+
{"version":3,"file":"tool-card-kind.es.js","names":[],"sources":["../../../../src/domains/chat/tools/tool-card-kind.ts"],"sourcesContent":["import type { MessageMetadata, SuspendedToolMetadata, ToolApprovalMetadata } from '../messages/message-metadata';\nimport type { ToolPartFields } from '../messages/renderers/tool-part';\nimport { isRecord } from '../messages/signal-data';\nimport { KNOWLEDGE_TOOLS, knowledgeCard } from './badges/knowledge-tool-badge';\nimport { getCodeModeCall } from './code-mode';\nimport { CONNECT_PROMPT_TOOL_NAME } from './connect-prompt-tool-id';\nimport { suspendedMcpInputRequest } from './mcp-input-request';\nimport { SUBMIT_PLAN_TOOL_ID } from './submit-plan-tool-id';\nimport { WORKSPACE_TOOLS } from './workspace-tool-constants';\nimport { isConnectPromptPayload } from '@/domains/connect/types';\nimport type { ActivityStatus } from '@/ds/components/ai/activity';\nimport { isTaskTool } from '@/ds/components/ai/tool-call';\n\n/** Which card draws a call. Decided once, shared by the dispatcher and the fold. */\nexport type ToolCardKind =\n | 'hidden'\n | 'observation'\n | 'ask_user'\n | 'connect_prompt'\n | 'submit_plan'\n | 'mcp_input_request'\n | 'background'\n | 'agent'\n | 'workflow'\n | 'file_tree'\n | 'sandbox'\n | 'code_mode'\n | 'mcp_app'\n | 'knowledge'\n | 'plain';\n\nexport interface ToolCardContext {\n metadata?: MessageMetadata;\n mcpAppTools?: Record<string, unknown>;\n}\n\nexport interface ToolInteraction {\n approval?: ToolApprovalMetadata;\n suspended?: SuspendedToolMetadata;\n}\n\nconst SANDBOX_TOOLS = new Set<string>([\n WORKSPACE_TOOLS.SANDBOX.EXECUTE_COMMAND,\n WORKSPACE_TOOLS.SANDBOX.GET_PROCESS_OUTPUT,\n WORKSPACE_TOOLS.SANDBOX.KILL_PROCESS,\n]);\n\nconst hasSubmitPlanToolId = (value: unknown): boolean => isRecord(value) && value.toolId === SUBMIT_PLAN_TOOL_ID;\n\nconst isNetworkFrom = (metadata: MessageMetadata | undefined, from: string): boolean =>\n metadata?.mode === 'network' && metadata.from === from;\n\nexport const isAgentCall = (metadata: MessageMetadata | undefined, toolName: string): boolean =>\n isNetworkFrom(metadata, 'AGENT') || toolName.startsWith('agent-');\n\nexport const isWorkflowCall = (metadata: MessageMetadata | undefined, toolName: string): boolean =>\n isNetworkFrom(metadata, 'WORKFLOW') || toolName.startsWith('workflow-');\n\nexport const isSettledState = (state: string | undefined): boolean =>\n state === 'output-available' || state === 'result';\n\n/** A call running as a Mastra background task. An awaited call's part also names its task, but holds the final result. */\nexport const isDeferredCall = (backgroundTaskId: string | undefined, backgroundTaskStatus: string | undefined) =>\n backgroundTaskId !== undefined && backgroundTaskStatus !== 'completed' && backgroundTaskStatus !== 'failed';\n\n/** A call neither settled nor carried by a live run reads as idle, so stale history never shimmers. */\nexport function badgeStatus(state: string | undefined, chatRunning: boolean): ActivityStatus {\n if (state === 'output-error') return 'error';\n if (isSettledState(state) || !chatRunning) return 'idle';\n return 'running';\n}\n\nexport const codeModeCall = (input: unknown, output: unknown) =>\n isRecord(input) || typeof input === 'string' ? getCodeModeCall(input, output) : null;\n\n/** Approval and suspension land keyed by tool name on older runs and by call id on newer ones. */\nexport function toolInteraction(\n metadata: MessageMetadata | undefined,\n toolName: string,\n toolCallId: string,\n): ToolInteraction {\n const approvals = metadata?.requireApprovalMetadata;\n const suspensions = metadata?.suspendedTools;\n const namedApproval = approvals?.[toolName];\n return {\n approval:\n metadata?.mode === 'network'\n ? namedApproval?.toolCallId === toolCallId\n ? namedApproval\n : approvals?.[toolCallId]\n : (approvals?.[toolCallId] ??\n Object.values(approvals ?? {}).find(approval => approval.toolCallId === toolCallId)),\n suspended: suspensions?.[toolName] ?? suspensions?.[toolCallId],\n };\n}\n\n/** Tools the transcript never draws: working memory updates and task tools (shown in the docked task list). */\nexport function isHiddenTool(toolName: string): boolean {\n return toolName === 'updateWorkingMemory' || isTaskTool(toolName);\n}\n\nexport function toolCardKind(\n { toolName, toolCallId, input, output, state, backgroundTaskId, backgroundTaskStatus }: ToolPartFields,\n { metadata, mcpAppTools }: ToolCardContext,\n): ToolCardKind {\n if (toolName === 'mastra-memory-om-observation') return 'observation';\n if (isHiddenTool(toolName)) return 'hidden';\n // A question read back in history draws as a plain badge, but it is still a question: never folded away.\n if (toolName === 'ask_user') return 'ask_user';\n // Built-in `request_connection` tool from `@mastra/connect`: the run pauses on it with\n // the prompt as its suspend payload, and the settled call keeps it as its result. Both\n // render the connect card; a call with neither falls back to a plain badge.\n const { suspended } = toolInteraction(metadata, toolName, toolCallId);\n if (\n toolName === CONNECT_PROMPT_TOOL_NAME &&\n (isConnectPromptPayload(output) || isConnectPromptPayload(suspended?.suspendPayload))\n ) {\n return 'connect_prompt';\n }\n if (\n toolName === SUBMIT_PLAN_TOOL_ID ||\n hasSubmitPlanToolId(suspended?.suspendPayload) ||\n hasSubmitPlanToolId(output)\n ) {\n return 'submit_plan';\n }\n // A foreground call parked on an MCP task's question: the run waits for the answer. A deferred\n // call's question lives on its background task instead, which the background card reads.\n if (!isDeferredCall(backgroundTaskId, backgroundTaskStatus) && suspendedMcpInputRequest(metadata, toolCallId)) {\n return 'mcp_input_request';\n }\n if (typeof output === 'string' && output.toLowerCase().includes('background task')) return 'background';\n if (isAgentCall(metadata, toolName)) return 'agent';\n if (isWorkflowCall(metadata, toolName)) return 'workflow';\n if (toolName === WORKSPACE_TOOLS.FILESYSTEM.LIST_FILES) return 'file_tree';\n if (SANDBOX_TOOLS.has(toolName)) return 'sandbox';\n if (codeModeCall(input, output)) return 'code_mode';\n if (mcpAppTools?.[toolName]) return 'mcp_app';\n // A settled or failed Knowledge call draws as a readable card; while running it stays a plain badge.\n if (\n KNOWLEDGE_TOOLS.has(toolName) &&\n (state === 'output-error' || (isSettledState(state) && knowledgeCard(toolName, input, output)))\n ) {\n return 'knowledge';\n }\n return 'plain';\n}\n"],"mappings":";;;;;;;;;;AAyCA,IAAM,gCAAgB,IAAI,IAAY;CACpC,gBAAgB,QAAQ;CACxB,gBAAgB,QAAQ;CACxB,gBAAgB,QAAQ;AAC1B,CAAC;AAED,IAAM,uBAAuB,UAA4B,SAAS,KAAK,KAAK,MAAM,WAAA;AAElF,IAAM,iBAAiB,UAAuC,SAC5D,UAAU,SAAS,aAAa,SAAS,SAAS;AAEpD,IAAa,eAAe,UAAuC,aACjE,cAAc,UAAU,OAAO,KAAK,SAAS,WAAW,QAAQ;AAElE,IAAa,kBAAkB,UAAuC,aACpE,cAAc,UAAU,UAAU,KAAK,SAAS,WAAW,WAAW;AAExE,IAAa,kBAAkB,UAC7B,UAAU,sBAAsB,UAAU;;AAG5C,IAAa,kBAAkB,kBAAsC,yBACnE,qBAAqB,KAAA,KAAa,yBAAyB,eAAe,yBAAyB;;AAGrG,SAAgB,YAAY,OAA2B,aAAsC;CAC3F,IAAI,UAAU,gBAAgB,OAAO;CACrC,IAAI,eAAe,KAAK,KAAK,CAAC,aAAa,OAAO;CAClD,OAAO;AACT;AAEA,IAAa,gBAAgB,OAAgB,WAC3C,SAAS,KAAK,KAAK,OAAO,UAAU,WAAW,gBAAgB,OAAO,MAAM,IAAI;;AAGlF,SAAgB,gBACd,UACA,UACA,YACiB;CACjB,MAAM,YAAY,UAAU;CAC5B,MAAM,cAAc,UAAU;CAC9B,MAAM,gBAAgB,YAAY;CAClC,OAAO;EACL,UACE,UAAU,SAAS,YACf,eAAe,eAAe,aAC5B,gBACA,YAAY,cACb,YAAY,eACb,OAAO,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,MAAK,aAAY,SAAS,eAAe,UAAU;EACxF,WAAW,cAAc,aAAa,cAAc;CACtD;AACF;;AAGA,SAAgB,aAAa,UAA2B;CACtD,OAAO,aAAa,yBAAyB,WAAW,QAAQ;AAClE;AAEA,SAAgB,aACd,EAAE,UAAU,YAAY,OAAO,QAAQ,OAAO,kBAAkB,wBAChE,EAAE,UAAU,eACE;CACd,IAAI,aAAa,gCAAgC,OAAO;CACxD,IAAI,aAAa,QAAQ,GAAG,OAAO;CAEnC,IAAI,aAAa,YAAY,OAAO;CAIpC,MAAM,EAAE,cAAc,gBAAgB,UAAU,UAAU,UAAU;CACpE,IACE,aAAA,yBACC,uBAAuB,MAAM,KAAK,uBAAuB,WAAW,cAAc,IAEnF,OAAO;CAET,IACE,aAAA,iBACA,oBAAoB,WAAW,cAAc,KAC7C,oBAAoB,MAAM,GAE1B,OAAO;CAIT,IAAI,CAAC,eAAe,kBAAkB,oBAAoB,KAAK,yBAAyB,UAAU,UAAU,GAC1G,OAAO;CAET,IAAI,OAAO,WAAW,YAAY,OAAO,YAAY,CAAC,CAAC,SAAS,iBAAiB,GAAG,OAAO;CAC3F,IAAI,YAAY,UAAU,QAAQ,GAAG,OAAO;CAC5C,IAAI,eAAe,UAAU,QAAQ,GAAG,OAAO;CAC/C,IAAI,aAAa,gBAAgB,WAAW,YAAY,OAAO;CAC/D,IAAI,cAAc,IAAI,QAAQ,GAAG,OAAO;CACxC,IAAI,aAAa,OAAO,MAAM,GAAG,OAAO;CACxC,IAAI,cAAc,WAAW,OAAO;CAEpC,IACE,gBAAgB,IAAI,QAAQ,MAC3B,UAAU,kBAAmB,eAAe,KAAK,KAAK,cAAc,UAAU,OAAO,MAAM,IAE5F,OAAO;CAET,OAAO;AACT"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_tool_card = require("../../../tool-card-
|
|
2
|
+
const require_tool_card = require("../../../tool-card-BOLXeKIp.cjs");
|
|
3
3
|
exports.ToolCard = require_tool_card.ToolCard;
|
|
4
4
|
exports.ToolCardInner = require_tool_card.ToolCardInner;
|