@mastra/playground-ui 68.0.0-alpha.2 → 68.0.0-alpha.3
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/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/{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/MarkdownRenderer.cjs.js +1 -1
- package/dist/components/MarkdownRenderer.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/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/mcp-input-request-tool.cjs.js +240 -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 +239 -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 +8 -3
- package/dist/domains/chat/tools/tool-card-kind.cjs.js.map +1 -1
- package/dist/domains/chat/tools/tool-card-kind.es.js +8 -4
- 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/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/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/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/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/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/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/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/MarkdownRenderer/markdown-renderer.d.ts +8 -1
- package/dist/src/ds/components/ai/tool-call/tool-phrases.d.ts +6 -0
- package/dist/style.css +69 -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-rxhTDpk_.cjs} +164 -126
- package/dist/tool-card-rxhTDpk_.cjs.map +1 -0
- package/dist/{tool-card-sO6P2Qj4.js → tool-card-toDgoZzJ.js} +165 -127
- package/dist/tool-card-toDgoZzJ.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 +10 -10
- package/dist/MarkdownRenderer-2GOXQJEv.js.map +0 -1
- package/dist/MarkdownRenderer-CB8Z_CHc.cjs.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
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { t as Txt } from "../../../../Txt-BM6TVV_c.js";
|
|
2
|
-
import {
|
|
2
|
+
import { r as ToolCallOutput } from "../../../../tool-call-Dsj43lvJ.js";
|
|
3
|
+
import { t as MarkdownRenderer } from "../../../../MarkdownRenderer-CI30RqdB.js";
|
|
3
4
|
import { isRecord } from "../../messages/signal-data.es.js";
|
|
4
5
|
import { KnowledgePageLink } from "../../knowledge/knowledge-links.es.js";
|
|
6
|
+
import { KNOWLEDGE_REF_PROPERTY, remarkKnowledgeLinks } from "../../../knowledge/lib/remarkKnowledgeLinks.es.js";
|
|
7
|
+
import { readExtent, writeExtent } from "./knowledge-body-range.es.js";
|
|
5
8
|
import { ToolApprovalBadge } from "./tool-approval-badge.es.js";
|
|
6
|
-
import {
|
|
9
|
+
import { createContext, useContext } from "react";
|
|
10
|
+
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
7
11
|
import { BookOpen } from "lucide-react";
|
|
8
12
|
// src/domains/chat/tools/badges/knowledge-tool-badge.tsx
|
|
9
13
|
/** The tools `Knowledge.createTools()` gives an agent. */
|
|
@@ -12,7 +16,8 @@ var KNOWLEDGE_TOOLS = /* @__PURE__ */ new Set([
|
|
|
12
16
|
"knowledge_read",
|
|
13
17
|
"knowledge_page",
|
|
14
18
|
"knowledge_note",
|
|
15
|
-
"knowledge_pin"
|
|
19
|
+
"knowledge_pin",
|
|
20
|
+
"knowledge_list"
|
|
16
21
|
]);
|
|
17
22
|
var str = (value) => typeof value === "string" && value ? value : void 0;
|
|
18
23
|
function asPage(value) {
|
|
@@ -22,6 +27,21 @@ function asPage(value) {
|
|
|
22
27
|
function asNotes(value) {
|
|
23
28
|
return Array.isArray(value) ? value.filter((note) => isRecord(note) && typeof note.text === "string") : [];
|
|
24
29
|
}
|
|
30
|
+
/** The collapsed row's detail: the page name, then which part of it was read or written. */
|
|
31
|
+
var withExtent = (name, extent) => extent?.row ? `${name} · ${extent.row}` : name;
|
|
32
|
+
/** The numbered lines of a part read: a window, or each match, under the range it covers. */
|
|
33
|
+
function ReadLines({ page }) {
|
|
34
|
+
if (!isRecord(page)) return null;
|
|
35
|
+
const lines = (Array.isArray(page.matches) ? page.matches.filter(isRecord).map((match) => str(match.lines)) : [str(page.lines)]).filter((part) => part !== void 0);
|
|
36
|
+
if (!lines.length) return null;
|
|
37
|
+
return /* @__PURE__ */ jsx(Txt, {
|
|
38
|
+
as: "p",
|
|
39
|
+
variant: "meta",
|
|
40
|
+
font: "mono",
|
|
41
|
+
className: "whitespace-pre-wrap",
|
|
42
|
+
children: lines.join("\n⋯\n")
|
|
43
|
+
});
|
|
44
|
+
}
|
|
25
45
|
var where = (page) => page.address ?? page.scope;
|
|
26
46
|
function PageLink({ page }) {
|
|
27
47
|
return /* @__PURE__ */ jsx(KnowledgePageLink, {
|
|
@@ -46,14 +66,59 @@ function PageLine({ page, linked = true }) {
|
|
|
46
66
|
as: "span",
|
|
47
67
|
variant: "label",
|
|
48
68
|
children: linked ? /* @__PURE__ */ jsx(PageLink, { page }) : page.name
|
|
49
|
-
}), scope ? /* @__PURE__ */ jsx(Meta, { children: page.key ? `${scope}#${page.key}` : scope }) : null]
|
|
69
|
+
}), page.ref ? /* @__PURE__ */ jsx(Meta, { children: page.ref }) : scope ? /* @__PURE__ */ jsx(Meta, { children: page.key ? `${scope}#${page.key}` : scope }) : null]
|
|
50
70
|
});
|
|
51
71
|
}
|
|
52
|
-
|
|
72
|
+
var MENTION_LINK_CLASS = "text-foreground underline decoration-dotted underline-offset-2 hover:decoration-solid";
|
|
73
|
+
/**
|
|
74
|
+
* The refs a tool result resolves: the page's own id and ref, and every ref a note in the result
|
|
75
|
+
* mentions (the server resolved those to page ids). A page body's links usually reappear in a note's
|
|
76
|
+
* mentions; any that don't stay plain, since a chat has no page store to look them up in.
|
|
77
|
+
*/
|
|
78
|
+
function resultRefIds(page, notes) {
|
|
79
|
+
const ids = /* @__PURE__ */ new Map();
|
|
80
|
+
if (page) {
|
|
81
|
+
ids.set(page.id, page.id);
|
|
82
|
+
if (page.ref) ids.set(page.ref, page.id);
|
|
83
|
+
}
|
|
84
|
+
for (const note of notes) {
|
|
85
|
+
if (!isRecord(note.mentions)) continue;
|
|
86
|
+
for (const [ref, id] of Object.entries(note.mentions)) if (typeof id === "string" && id) ids.set(ref, id);
|
|
87
|
+
}
|
|
88
|
+
return ids;
|
|
89
|
+
}
|
|
90
|
+
var BodyRefs = createContext(/* @__PURE__ */ new Map());
|
|
91
|
+
/** A `[[ref]]` in a card body: a link when the result resolves it, the ref as quiet text when not. */
|
|
92
|
+
function BodyRef({ node, ...props }) {
|
|
93
|
+
const refIds = useContext(BodyRefs);
|
|
94
|
+
const raw = node?.properties[KNOWLEDGE_REF_PROPERTY];
|
|
95
|
+
if (typeof raw !== "string") return /* @__PURE__ */ jsx("span", { ...props });
|
|
96
|
+
const ref = raw.trim();
|
|
97
|
+
const pageId = refIds.get(ref);
|
|
98
|
+
return pageId ? /* @__PURE__ */ jsx(KnowledgePageLink, {
|
|
99
|
+
pageId,
|
|
100
|
+
className: MENTION_LINK_CLASS,
|
|
101
|
+
children: ref
|
|
102
|
+
}) : /* @__PURE__ */ jsx("span", {
|
|
103
|
+
className: "text-foreground",
|
|
104
|
+
"data-testid": "knowledge-unresolved-mention",
|
|
105
|
+
children: ref
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
var BODY_REMARK_PLUGINS = [remarkKnowledgeLinks];
|
|
109
|
+
var BODY_COMPONENTS = { span: BodyRef };
|
|
110
|
+
function Body({ markdown, refIds = /* @__PURE__ */ new Map() }) {
|
|
53
111
|
return /* @__PURE__ */ jsx("div", {
|
|
54
112
|
className: "border-border1 max-h-64 overflow-auto rounded-md border p-2",
|
|
55
113
|
"data-testid": "knowledge-tool-body",
|
|
56
|
-
children: /* @__PURE__ */ jsx(
|
|
114
|
+
children: /* @__PURE__ */ jsx(BodyRefs.Provider, {
|
|
115
|
+
value: refIds,
|
|
116
|
+
children: /* @__PURE__ */ jsx(MarkdownRenderer, {
|
|
117
|
+
remarkPlugins: BODY_REMARK_PLUGINS,
|
|
118
|
+
components: BODY_COMPONENTS,
|
|
119
|
+
children: markdown
|
|
120
|
+
})
|
|
121
|
+
})
|
|
57
122
|
});
|
|
58
123
|
}
|
|
59
124
|
var MENTION = /\[\[([^\]]+)\]\]/g;
|
|
@@ -68,7 +133,7 @@ function NoteText({ note }) {
|
|
|
68
133
|
parts.push(note.text.slice(last, match.index));
|
|
69
134
|
parts.push(pageId ? /* @__PURE__ */ jsx(KnowledgePageLink, {
|
|
70
135
|
pageId,
|
|
71
|
-
className:
|
|
136
|
+
className: MENTION_LINK_CLASS,
|
|
72
137
|
children: ref
|
|
73
138
|
}, match.index) : /* @__PURE__ */ jsx("span", {
|
|
74
139
|
className: "text-foreground",
|
|
@@ -78,7 +143,7 @@ function NoteText({ note }) {
|
|
|
78
143
|
last = match.index + match[0].length;
|
|
79
144
|
}
|
|
80
145
|
parts.push(note.text.slice(last));
|
|
81
|
-
return /* @__PURE__ */ jsx(Fragment, { children: parts });
|
|
146
|
+
return /* @__PURE__ */ jsx(Fragment$1, { children: parts });
|
|
82
147
|
}
|
|
83
148
|
function NoteList({ notes }) {
|
|
84
149
|
return /* @__PURE__ */ jsx("ul", {
|
|
@@ -97,10 +162,70 @@ function NoteList({ notes }) {
|
|
|
97
162
|
}, note.id))
|
|
98
163
|
});
|
|
99
164
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
if (
|
|
165
|
+
function asListEntry(value) {
|
|
166
|
+
if (!isRecord(value) || !str(value.ref) || typeof value.name !== "string") return void 0;
|
|
167
|
+
if (typeof value.depth !== "number" || typeof value.children !== "number") return void 0;
|
|
168
|
+
return value;
|
|
169
|
+
}
|
|
170
|
+
var DEPTH_INDENT = [
|
|
171
|
+
"",
|
|
172
|
+
"pl-4",
|
|
173
|
+
"pl-8"
|
|
174
|
+
];
|
|
175
|
+
/** A `knowledge_list` result as an indented tree: each name links to its page (scopes to their scope page), with its ref and child count. */
|
|
176
|
+
function ListTree({ entries }) {
|
|
177
|
+
return /* @__PURE__ */ jsx("ul", {
|
|
178
|
+
className: "flex max-h-64 flex-col gap-1 overflow-auto",
|
|
179
|
+
"data-testid": "knowledge-list-entries",
|
|
180
|
+
children: entries.map((entry, index) => /* @__PURE__ */ jsxs("li", {
|
|
181
|
+
className: `flex min-w-0 flex-col ${DEPTH_INDENT[Math.min(Math.max(entry.depth, 1), 3) - 1]}`,
|
|
182
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
183
|
+
className: "flex min-w-0 items-baseline gap-2",
|
|
184
|
+
children: [
|
|
185
|
+
/* @__PURE__ */ jsx(Txt, {
|
|
186
|
+
as: "span",
|
|
187
|
+
variant: "label",
|
|
188
|
+
className: "truncate",
|
|
189
|
+
children: /* @__PURE__ */ jsx(KnowledgePageLink, {
|
|
190
|
+
pageRef: entry.ref,
|
|
191
|
+
children: entry.name
|
|
192
|
+
})
|
|
193
|
+
}),
|
|
194
|
+
entry.ref !== entry.name ? /* @__PURE__ */ jsx(Meta, { children: entry.ref }) : null,
|
|
195
|
+
entry.children ? /* @__PURE__ */ jsxs(Meta, { children: [
|
|
196
|
+
entry.children,
|
|
197
|
+
" ",
|
|
198
|
+
entry.children === 1 ? "child" : "children"
|
|
199
|
+
] }) : null
|
|
200
|
+
]
|
|
201
|
+
}), entry.description ? /* @__PURE__ */ jsx(Meta, { children: entry.description }) : null]
|
|
202
|
+
}, `${entry.ref}-${index}`))
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
var FAILED_TITLES = {
|
|
206
|
+
knowledge_search: "Couldn't search Knowledge",
|
|
207
|
+
knowledge_read: "Couldn't read",
|
|
208
|
+
knowledge_page: "Couldn't change page",
|
|
209
|
+
knowledge_note: "Couldn't change note",
|
|
210
|
+
knowledge_pin: "Couldn't change pin"
|
|
211
|
+
};
|
|
212
|
+
/**
|
|
213
|
+
* What each Knowledge tool's settled result says, or null when the shape isn't one we know.
|
|
214
|
+
* A failed call (`errorText` set) gets a card naming what it tried and the error it got.
|
|
215
|
+
*/
|
|
216
|
+
function knowledgeCard(toolName, input, output, errorText) {
|
|
103
217
|
const args = isRecord(input) ? input : {};
|
|
218
|
+
const failedTitle = FAILED_TITLES[toolName];
|
|
219
|
+
if (errorText !== void 0 && failedTitle) return {
|
|
220
|
+
title: failedTitle,
|
|
221
|
+
detail: str(args.page) ?? str(args.query),
|
|
222
|
+
body: /* @__PURE__ */ jsx(ToolCallOutput, {
|
|
223
|
+
text: errorText || "The tool call failed.",
|
|
224
|
+
error: true,
|
|
225
|
+
"data-testid": "knowledge-tool-error"
|
|
226
|
+
})
|
|
227
|
+
};
|
|
228
|
+
if (!isRecord(output)) return null;
|
|
104
229
|
switch (toolName) {
|
|
105
230
|
case "knowledge_search": {
|
|
106
231
|
if (!Array.isArray(output.results)) return null;
|
|
@@ -142,19 +267,25 @@ function knowledgeCard(toolName, input, output) {
|
|
|
142
267
|
})
|
|
143
268
|
};
|
|
144
269
|
}
|
|
270
|
+
const extent = readExtent(output, args);
|
|
145
271
|
const notes = asNotes(output.notes);
|
|
146
272
|
const children = Array.isArray(output.children) ? output.children.map(asPage).filter((child) => child !== void 0) : [];
|
|
147
273
|
const mentionedIn = asNotes(output.mentionedIn);
|
|
148
274
|
const childScopes = Array.isArray(output.childScopes) ? output.childScopes.filter(isRecord) : [];
|
|
149
275
|
return {
|
|
150
276
|
title: "Read",
|
|
151
|
-
detail: page.name,
|
|
277
|
+
detail: withExtent(page.name, extent),
|
|
152
278
|
body: /* @__PURE__ */ jsxs("div", {
|
|
153
279
|
className: "flex flex-col gap-2",
|
|
154
280
|
children: [
|
|
155
281
|
/* @__PURE__ */ jsx(PageLine, { page }),
|
|
282
|
+
extent ? /* @__PURE__ */ jsx(Meta, { children: extent.summary }) : null,
|
|
156
283
|
page.description ? /* @__PURE__ */ jsx(Meta, { children: page.description }) : null,
|
|
157
|
-
page.body ? /* @__PURE__ */ jsx(Body, {
|
|
284
|
+
page.body ? /* @__PURE__ */ jsx(Body, {
|
|
285
|
+
markdown: page.body,
|
|
286
|
+
refIds: resultRefIds(page, [...notes, ...mentionedIn])
|
|
287
|
+
}) : null,
|
|
288
|
+
/* @__PURE__ */ jsx(ReadLines, { page: output.page }),
|
|
158
289
|
notes.length ? /* @__PURE__ */ jsx(NoteList, { notes }) : null,
|
|
159
290
|
children.length ? /* @__PURE__ */ jsxs(Meta, { children: ["Child pages: ", children.map((child) => child.name).join(", ")] }) : null,
|
|
160
291
|
childScopes.length ? /* @__PURE__ */ jsxs(Meta, { children: [
|
|
@@ -185,13 +316,15 @@ function knowledgeCard(toolName, input, output) {
|
|
|
185
316
|
const title = op === "move" ? "Moved page" : op === "merge" ? "Merged page" : args.page ? "Updated page" : "Created page";
|
|
186
317
|
const body = str(args.body);
|
|
187
318
|
const description = str(args.description);
|
|
319
|
+
const extent = writeExtent(args);
|
|
188
320
|
return {
|
|
189
321
|
title,
|
|
190
|
-
detail: page.name,
|
|
322
|
+
detail: withExtent(page.name, extent),
|
|
191
323
|
body: /* @__PURE__ */ jsxs("div", {
|
|
192
324
|
className: "flex flex-col gap-2",
|
|
193
325
|
children: [
|
|
194
326
|
/* @__PURE__ */ jsx(PageLine, { page }),
|
|
327
|
+
extent ? /* @__PURE__ */ jsx(Meta, { children: extent.summary }) : null,
|
|
195
328
|
op === "merge" && str(args.page) ? /* @__PURE__ */ jsxs(Meta, { children: [
|
|
196
329
|
"Merged ",
|
|
197
330
|
str(args.page),
|
|
@@ -199,7 +332,10 @@ function knowledgeCard(toolName, input, output) {
|
|
|
199
332
|
] }) : null,
|
|
200
333
|
typeof page.version === "number" ? /* @__PURE__ */ jsxs(Meta, { children: ["Version ", page.version] }) : null,
|
|
201
334
|
description ? /* @__PURE__ */ jsx(Meta, { children: description }) : null,
|
|
202
|
-
body ? /* @__PURE__ */ jsx(Body, {
|
|
335
|
+
body ? /* @__PURE__ */ jsx(Body, {
|
|
336
|
+
markdown: body,
|
|
337
|
+
refIds: resultRefIds(page, [])
|
|
338
|
+
}) : null
|
|
203
339
|
]
|
|
204
340
|
})
|
|
205
341
|
};
|
|
@@ -246,6 +382,20 @@ function knowledgeCard(toolName, input, output) {
|
|
|
246
382
|
})
|
|
247
383
|
};
|
|
248
384
|
}
|
|
385
|
+
case "knowledge_list": {
|
|
386
|
+
if (!Array.isArray(output.entries)) return null;
|
|
387
|
+
const entries = output.entries.map(asListEntry).filter((entry) => entry !== void 0);
|
|
388
|
+
const from = str(args.from);
|
|
389
|
+
const more = str(output.nextCursor) || output.more !== void 0;
|
|
390
|
+
return {
|
|
391
|
+
title: from ? "Listed pages" : "Listed Knowledge scopes",
|
|
392
|
+
detail: from,
|
|
393
|
+
body: /* @__PURE__ */ jsxs("div", {
|
|
394
|
+
className: "flex flex-col gap-2",
|
|
395
|
+
children: [entries.length ? /* @__PURE__ */ jsx(ListTree, { entries }) : /* @__PURE__ */ jsx(Meta, { children: from ? "No pages under it" : "No scopes" }), more ? /* @__PURE__ */ jsx(Meta, { children: "More entries not shown" }) : null]
|
|
396
|
+
})
|
|
397
|
+
};
|
|
398
|
+
}
|
|
249
399
|
default: return null;
|
|
250
400
|
}
|
|
251
401
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge-tool-badge.es.js","names":["_Fragment"],"sources":["../../../../../src/domains/chat/tools/badges/knowledge-tool-badge.tsx"],"sourcesContent":["import { BookOpen } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { KnowledgePageLink } from '../../knowledge/knowledge-links';\nimport { isRecord } from '../../messages/signal-data';\nimport type { MessageMetadata } from '@/domains/chat';\nimport type { ToolApprovalRequest } from '@/domains/chat/tools/badges/tool-approval-badge';\nimport { ToolApprovalBadge } from '@/domains/chat/tools/badges/tool-approval-badge';\nimport type { ActivityStatus } from '@/ds/components/ai/activity';\nimport { MarkdownRenderer } from '@/ds/components/MarkdownRenderer';\nimport { Txt } from '@/ds/components/Txt';\n\n/** The tools `Knowledge.createTools()` gives an agent. */\nexport const KNOWLEDGE_TOOLS = new Set([\n 'knowledge_search',\n 'knowledge_read',\n 'knowledge_page',\n 'knowledge_note',\n 'knowledge_pin',\n]);\n\ninterface PageSummary {\n id: string;\n name: string;\n address?: string;\n scope?: string;\n key?: string;\n description?: string;\n version?: number;\n body?: string;\n}\n\ninterface NoteSummary {\n id: string;\n text: string;\n author?: string;\n page?: PageSummary;\n /** Which `[[ref]]` in `text` links to which page id; refs the server couldn't resolve aren't here. */\n mentions?: Record<string, string>;\n}\n\nconst str = (value: unknown): string | undefined => (typeof value === 'string' && value ? value : undefined);\n\nfunction asPage(value: unknown): PageSummary | undefined {\n if (!isRecord(value) || !str(value.id) || typeof value.name !== 'string') return undefined;\n return value as unknown as PageSummary;\n}\n\nfunction asNotes(value: unknown): NoteSummary[] {\n return Array.isArray(value)\n ? value.filter((note): note is NoteSummary => isRecord(note) && typeof note.text === 'string')\n : [];\n}\n\nconst where = (page: PageSummary) => page.address ?? page.scope;\n\nfunction PageLink({ page }: { page: PageSummary }) {\n return <KnowledgePageLink pageId={page.id}>{page.name}</KnowledgePageLink>;\n}\n\nfunction Meta({ children }: { children: ReactNode }) {\n return (\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\" className=\"truncate\">\n {children}\n </Txt>\n );\n}\n\nfunction PageLine({ page, linked = true }: { page: PageSummary; linked?: boolean }) {\n const scope = where(page);\n return (\n <div className=\"flex min-w-0 items-baseline gap-2\">\n <Txt as=\"span\" variant=\"label\">\n {linked ? <PageLink page={page} /> : page.name}\n </Txt>\n {scope ? <Meta>{page.key ? `${scope}#${page.key}` : scope}</Meta> : null}\n </div>\n );\n}\n\nfunction Body({ markdown }: { markdown: string }) {\n return (\n <div className=\"border-border1 max-h-64 overflow-auto rounded-md border p-2\" data-testid=\"knowledge-tool-body\">\n <MarkdownRenderer>{markdown}</MarkdownRenderer>\n </div>\n );\n}\n\nconst MENTION = /\\[\\[([^\\]]+)\\]\\]/g;\n\n/** A note's text with each resolved `[[Page Name]]` linking to its page; unresolved names stay plain. */\nfunction NoteText({ note }: { note: NoteSummary }) {\n const parts: ReactNode[] = [];\n let last = 0;\n for (const match of note.text.matchAll(MENTION)) {\n const ref = (match[1] ?? '').trim();\n // Own string values only: `[[constructor]]` must not read Object.prototype.\n const mentioned = note.mentions && Object.hasOwn(note.mentions, ref) ? note.mentions[ref] : undefined;\n const pageId = typeof mentioned === 'string' ? mentioned : undefined;\n parts.push(note.text.slice(last, match.index));\n parts.push(\n pageId ? (\n <KnowledgePageLink\n key={match.index}\n pageId={pageId}\n className=\"text-foreground underline decoration-dotted underline-offset-2 hover:decoration-solid\"\n >\n {ref}\n </KnowledgePageLink>\n ) : (\n <span key={match.index} className=\"text-foreground\" data-testid=\"knowledge-unresolved-mention\">\n {ref}\n </span>\n ),\n );\n last = match.index + match[0].length;\n }\n parts.push(note.text.slice(last));\n return <>{parts}</>;\n}\n\nfunction NoteList({ notes }: { notes: NoteSummary[] }) {\n return (\n <ul className=\"flex flex-col gap-1\">\n {notes.map(note => (\n <li key={note.id} className=\"flex flex-col\">\n <Txt as=\"span\" variant=\"body\">\n <NoteText note={note} />\n </Txt>\n {note.page || note.author ? (\n <Meta>\n {note.page ? <PageLink page={note.page} /> : null}\n {note.page && note.author ? ' · ' : null}\n {note.author}\n </Meta>\n ) : null}\n </li>\n ))}\n </ul>\n );\n}\n\nexport interface KnowledgeCard {\n title: string;\n detail?: string;\n body: ReactNode;\n}\n\n/** What each Knowledge tool's settled result says, or null when the shape isn't one we know. */\nexport function knowledgeCard(toolName: string, input: unknown, output: unknown): KnowledgeCard | null {\n if (!isRecord(output)) return null;\n const args = isRecord(input) ? input : {};\n switch (toolName) {\n case 'knowledge_search': {\n if (!Array.isArray(output.results)) return null;\n const hits = output.results.filter(isRecord);\n return {\n title: 'Searched Knowledge',\n detail: str(args.query),\n body: hits.length ? (\n <ul className=\"flex flex-col gap-1.5\">\n {hits.map((hit, index) => {\n const page = asPage(hit.page);\n const [note] = asNotes([hit.note]);\n return page ? (\n <li key={`${page.id}-${note?.id ?? index}`} className=\"flex flex-col\">\n <PageLine page={page} />\n {note ? (\n <Meta>\n <NoteText note={note} />\n </Meta>\n ) : null}\n </li>\n ) : null;\n })}\n </ul>\n ) : (\n <Meta>No matches</Meta>\n ),\n };\n }\n case 'knowledge_read': {\n const page = asPage(output.page);\n if (!page) {\n if (!Array.isArray(output.scopes)) return null;\n const scopes = output.scopes.filter(isRecord);\n return {\n title: 'Listed Knowledge scopes',\n body: (\n <ul className=\"flex flex-col gap-1\">\n {scopes.map(scope => (\n <li key={String(scope.address)}>\n <Txt as=\"span\" variant=\"body\">\n {String(scope.name)}\n </Txt>{' '}\n <Meta>{String(scope.address)}</Meta>\n </li>\n ))}\n </ul>\n ),\n };\n }\n const notes = asNotes(output.notes);\n const children = Array.isArray(output.children)\n ? output.children.map(asPage).filter((child): child is PageSummary => child !== undefined)\n : [];\n const mentionedIn = asNotes(output.mentionedIn);\n const childScopes = Array.isArray(output.childScopes) ? output.childScopes.filter(isRecord) : [];\n return {\n title: 'Read',\n detail: page.name,\n body: (\n <div className=\"flex flex-col gap-2\">\n <PageLine page={page} />\n {page.description ? <Meta>{page.description}</Meta> : null}\n {page.body ? <Body markdown={page.body} /> : null}\n {notes.length ? <NoteList notes={notes} /> : null}\n {children.length ? <Meta>Child pages: {children.map(child => child.name).join(', ')}</Meta> : null}\n {childScopes.length ? (\n <Meta>\n Child scopes:{' '}\n {childScopes\n .map(scope =>\n scope.address ? `${String(scope.name)} (${String(scope.address)})` : String(scope.name),\n )\n .join(', ')}\n </Meta>\n ) : null}\n {mentionedIn.length ? (\n <div className=\"flex flex-col gap-1\">\n <Meta>Mentioned in</Meta>\n <NoteList notes={mentionedIn} />\n </div>\n ) : null}\n </div>\n ),\n };\n }\n case 'knowledge_page': {\n const page = asPage(output.page);\n if (!page) return null;\n const op = str(args.op);\n if (op === 'delete') {\n // The page no longer exists, so name it without a link.\n return { title: 'Deleted page', detail: page.name, body: <PageLine page={page} linked={false} /> };\n }\n const title =\n op === 'move' ? 'Moved page' : op === 'merge' ? 'Merged page' : args.page ? 'Updated page' : 'Created page';\n const body = str(args.body);\n const description = str(args.description);\n return {\n title,\n detail: page.name,\n body: (\n <div className=\"flex flex-col gap-2\">\n <PageLine page={page} />\n {op === 'merge' && str(args.page) ? <Meta>Merged {str(args.page)} into this page</Meta> : null}\n {typeof page.version === 'number' ? <Meta>Version {page.version}</Meta> : null}\n {description ? <Meta>{description}</Meta> : null}\n {body ? <Body markdown={body} /> : null}\n </div>\n ),\n };\n }\n case 'knowledge_note': {\n if (str(output.removed)) return { title: 'Removed note', body: <Meta>Note {String(output.removed)}</Meta> };\n const [note] = asNotes([output.note]);\n if (!note) return null;\n const pageRef = str(args.page);\n const pageId = str(output.page);\n return {\n title: str(args.op) === 'restamp' ? 'Restamped note' : 'Added note',\n detail: pageRef,\n body: (\n <div className=\"flex flex-col gap-1\">\n <Txt as=\"span\" variant=\"body\">\n <NoteText note={note} />\n </Txt>\n {pageId ? (\n <Meta>\n On <PageLink page={{ id: pageId, name: pageRef ?? 'the page' }} />\n </Meta>\n ) : null}\n </div>\n ),\n };\n }\n case 'knowledge_pin': {\n const pageId = str(output.page);\n if (!pageId || !Array.isArray(output.audience)) return null;\n const pageRef = str(args.page);\n const audience = output.audience.filter((entry): entry is string => typeof entry === 'string');\n return {\n title: str(args.op) === 'unpin' ? 'Unpinned page' : 'Pinned page',\n detail: pageRef,\n body: (\n <div className=\"flex flex-col gap-1\">\n <Meta>\n <PageLink page={{ id: pageId, name: pageRef ?? 'the page' }} />\n </Meta>\n <Meta>{audience.length ? `Pinned for ${audience.join(', ')}` : 'No longer pinned for anyone'}</Meta>\n </div>\n ),\n };\n }\n default:\n return null;\n }\n}\n\nexport interface KnowledgeToolBadgeProps extends Omit<ToolApprovalRequest, 'toolCalled'> {\n card: KnowledgeCard;\n metadata?: MessageMetadata;\n status?: ActivityStatus;\n}\n\nexport const KnowledgeToolBadge = ({\n card,\n toolName,\n metadata,\n toolCallId,\n toolApprovalMetadata,\n isNetwork,\n status = 'idle',\n}: KnowledgeToolBadgeProps) => (\n <ToolApprovalBadge\n approval={{\n toolCalled: true,\n toolCallId,\n toolApprovalMetadata,\n toolName,\n isNetwork,\n isGenerateMode: metadata?.mode === 'generate',\n }}\n data-testid=\"knowledge-tool-badge\"\n icon={<BookOpen aria-hidden />}\n title={card.title}\n detail={card.detail}\n status={status}\n >\n {card.body}\n </ToolApprovalBadge>\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"knowledge-tool-badge.es.js","names":["_Fragment"],"sources":["../../../../../src/domains/chat/tools/badges/knowledge-tool-badge.tsx"],"sourcesContent":["import { BookOpen } from 'lucide-react';\nimport { createContext, useContext } from 'react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport type { Components, ExtraProps } from 'react-markdown';\nimport { KnowledgePageLink } from '../../knowledge/knowledge-links';\nimport { isRecord } from '../../messages/signal-data';\nimport type { BodyExtent } from './knowledge-body-range';\nimport { readExtent, writeExtent } from './knowledge-body-range';\nimport type { MessageMetadata } from '@/domains/chat';\nimport type { ToolApprovalRequest } from '@/domains/chat/tools/badges/tool-approval-badge';\nimport { ToolApprovalBadge } from '@/domains/chat/tools/badges/tool-approval-badge';\nimport { KNOWLEDGE_REF_PROPERTY, remarkKnowledgeLinks } from '@/domains/knowledge/lib/remarkKnowledgeLinks';\nimport type { ActivityStatus } from '@/ds/components/ai/activity';\nimport { ToolCallOutput } from '@/ds/components/ai/tool-call';\nimport { MarkdownRenderer } from '@/ds/components/MarkdownRenderer';\nimport { Txt } from '@/ds/components/Txt';\n\n/** The tools `Knowledge.createTools()` gives an agent. */\nexport const KNOWLEDGE_TOOLS = new Set([\n 'knowledge_search',\n 'knowledge_read',\n 'knowledge_page',\n 'knowledge_note',\n 'knowledge_pin',\n 'knowledge_list',\n]);\n\ninterface PageSummary {\n id: string;\n name: string;\n address?: string;\n scope?: string;\n /** The full readable ref (`docs:mastra#observability/logging`); older cores send only the last `key`. */\n ref?: string;\n key?: string;\n description?: string;\n version?: number;\n body?: string;\n}\n\ninterface NoteSummary {\n id: string;\n text: string;\n author?: string;\n page?: PageSummary;\n /** Which `[[ref]]` in `text` links to which page id; refs the server couldn't resolve aren't here. */\n mentions?: Record<string, string>;\n}\n\nconst str = (value: unknown): string | undefined => (typeof value === 'string' && value ? value : undefined);\n\nfunction asPage(value: unknown): PageSummary | undefined {\n if (!isRecord(value) || !str(value.id) || typeof value.name !== 'string') return undefined;\n return value as unknown as PageSummary;\n}\n\nfunction asNotes(value: unknown): NoteSummary[] {\n return Array.isArray(value)\n ? value.filter((note): note is NoteSummary => isRecord(note) && typeof note.text === 'string')\n : [];\n}\n\n/** The collapsed row's detail: the page name, then which part of it was read or written. */\nconst withExtent = (name: string, extent: BodyExtent | undefined) => (extent?.row ? `${name} · ${extent.row}` : name);\n\n/** The numbered lines of a part read: a window, or each match, under the range it covers. */\nfunction ReadLines({ page }: { page: unknown }) {\n if (!isRecord(page)) return null;\n const parts = Array.isArray(page.matches)\n ? page.matches.filter(isRecord).map(match => str(match.lines))\n : [str(page.lines)];\n const lines = parts.filter((part): part is string => part !== undefined);\n if (!lines.length) return null;\n return (\n <Txt as=\"p\" variant=\"meta\" font=\"mono\" className=\"whitespace-pre-wrap\">\n {lines.join('\\n⋯\\n')}\n </Txt>\n );\n}\n\nconst where = (page: PageSummary) => page.address ?? page.scope;\n\nfunction PageLink({ page }: { page: PageSummary }) {\n return <KnowledgePageLink pageId={page.id}>{page.name}</KnowledgePageLink>;\n}\n\nfunction Meta({ children }: { children: ReactNode }) {\n return (\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\" className=\"truncate\">\n {children}\n </Txt>\n );\n}\n\nfunction PageLine({ page, linked = true }: { page: PageSummary; linked?: boolean }) {\n const scope = where(page);\n return (\n <div className=\"flex min-w-0 items-baseline gap-2\">\n <Txt as=\"span\" variant=\"label\">\n {linked ? <PageLink page={page} /> : page.name}\n </Txt>\n {page.ref ? <Meta>{page.ref}</Meta> : scope ? <Meta>{page.key ? `${scope}#${page.key}` : scope}</Meta> : null}\n </div>\n );\n}\n\nconst MENTION_LINK_CLASS = 'text-foreground underline decoration-dotted underline-offset-2 hover:decoration-solid';\n\n/** Which page id each `[[ref]]` a card shows answers to, as far as this tool result says. */\ntype RefIds = ReadonlyMap<string, string>;\n\n/**\n * The refs a tool result resolves: the page's own id and ref, and every ref a note in the result\n * mentions (the server resolved those to page ids). A page body's links usually reappear in a note's\n * mentions; any that don't stay plain, since a chat has no page store to look them up in.\n */\nfunction resultRefIds(page: PageSummary | undefined, notes: NoteSummary[]): RefIds {\n const ids = new Map<string, string>();\n if (page) {\n ids.set(page.id, page.id);\n if (page.ref) ids.set(page.ref, page.id);\n }\n for (const note of notes) {\n if (!isRecord(note.mentions)) continue;\n for (const [ref, id] of Object.entries(note.mentions)) {\n if (typeof id === 'string' && id) ids.set(ref, id);\n }\n }\n return ids;\n}\n\nconst BodyRefs = createContext<RefIds>(new Map());\n\n/** A `[[ref]]` in a card body: a link when the result resolves it, the ref as quiet text when not. */\nfunction BodyRef({ node, ...props }: ComponentProps<'span'> & ExtraProps) {\n const refIds = useContext(BodyRefs);\n const raw = node?.properties[KNOWLEDGE_REF_PROPERTY];\n if (typeof raw !== 'string') return <span {...props} />;\n const ref = raw.trim();\n const pageId = refIds.get(ref);\n return pageId ? (\n <KnowledgePageLink pageId={pageId} className={MENTION_LINK_CLASS}>\n {ref}\n </KnowledgePageLink>\n ) : (\n <span className=\"text-foreground\" data-testid=\"knowledge-unresolved-mention\">\n {ref}\n </span>\n );\n}\n\nconst BODY_REMARK_PLUGINS = [remarkKnowledgeLinks];\nconst BODY_COMPONENTS: Components = { span: BodyRef };\n\nfunction Body({ markdown, refIds = new Map() }: { markdown: string; refIds?: RefIds }) {\n return (\n <div className=\"border-border1 max-h-64 overflow-auto rounded-md border p-2\" data-testid=\"knowledge-tool-body\">\n <BodyRefs.Provider value={refIds}>\n <MarkdownRenderer remarkPlugins={BODY_REMARK_PLUGINS} components={BODY_COMPONENTS}>\n {markdown}\n </MarkdownRenderer>\n </BodyRefs.Provider>\n </div>\n );\n}\n\nconst MENTION = /\\[\\[([^\\]]+)\\]\\]/g;\n\n/** A note's text with each resolved `[[Page Name]]` linking to its page; unresolved names stay plain. */\nfunction NoteText({ note }: { note: NoteSummary }) {\n const parts: ReactNode[] = [];\n let last = 0;\n for (const match of note.text.matchAll(MENTION)) {\n const ref = (match[1] ?? '').trim();\n // Own string values only: `[[constructor]]` must not read Object.prototype.\n const mentioned = note.mentions && Object.hasOwn(note.mentions, ref) ? note.mentions[ref] : undefined;\n const pageId = typeof mentioned === 'string' ? mentioned : undefined;\n parts.push(note.text.slice(last, match.index));\n parts.push(\n pageId ? (\n <KnowledgePageLink key={match.index} pageId={pageId} className={MENTION_LINK_CLASS}>\n {ref}\n </KnowledgePageLink>\n ) : (\n <span key={match.index} className=\"text-foreground\" data-testid=\"knowledge-unresolved-mention\">\n {ref}\n </span>\n ),\n );\n last = match.index + match[0].length;\n }\n parts.push(note.text.slice(last));\n return <>{parts}</>;\n}\n\nfunction NoteList({ notes }: { notes: NoteSummary[] }) {\n return (\n <ul className=\"flex flex-col gap-1\">\n {notes.map(note => (\n <li key={note.id} className=\"flex flex-col\">\n <Txt as=\"span\" variant=\"body\">\n <NoteText note={note} />\n </Txt>\n {note.page || note.author ? (\n <Meta>\n {note.page ? <PageLink page={note.page} /> : null}\n {note.page && note.author ? ' · ' : null}\n {note.author}\n </Meta>\n ) : null}\n </li>\n ))}\n </ul>\n );\n}\n\n/** One entry of a `knowledge_list` result: a page or scope at some depth below the starting point. */\ninterface ListEntry {\n ref: string;\n name: string;\n description?: string;\n depth: number;\n children: number;\n scope?: boolean;\n}\n\nfunction asListEntry(value: unknown): ListEntry | undefined {\n if (!isRecord(value) || !str(value.ref) || typeof value.name !== 'string') return undefined;\n if (typeof value.depth !== 'number' || typeof value.children !== 'number') return undefined;\n return value as unknown as ListEntry;\n}\n\nconst DEPTH_INDENT = ['', 'pl-4', 'pl-8'] as const;\n\n/** A `knowledge_list` result as an indented tree: each name links to its page (scopes to their scope page), with its ref and child count. */\nfunction ListTree({ entries }: { entries: ListEntry[] }) {\n return (\n <ul className=\"flex max-h-64 flex-col gap-1 overflow-auto\" data-testid=\"knowledge-list-entries\">\n {entries.map((entry, index) => (\n <li\n key={`${entry.ref}-${index}`}\n className={`flex min-w-0 flex-col ${DEPTH_INDENT[Math.min(Math.max(entry.depth, 1), 3) - 1]}`}\n >\n <div className=\"flex min-w-0 items-baseline gap-2\">\n <Txt as=\"span\" variant=\"label\" className=\"truncate\">\n <KnowledgePageLink pageRef={entry.ref}>{entry.name}</KnowledgePageLink>\n </Txt>\n {entry.ref !== entry.name ? <Meta>{entry.ref}</Meta> : null}\n {entry.children ? (\n <Meta>\n {entry.children} {entry.children === 1 ? 'child' : 'children'}\n </Meta>\n ) : null}\n </div>\n {entry.description ? <Meta>{entry.description}</Meta> : null}\n </li>\n ))}\n </ul>\n );\n}\n\nexport interface KnowledgeCard {\n title: string;\n detail?: string;\n body: ReactNode;\n}\n\nconst FAILED_TITLES: Record<string, string> = {\n knowledge_search: \"Couldn't search Knowledge\",\n knowledge_read: \"Couldn't read\",\n knowledge_page: \"Couldn't change page\",\n knowledge_note: \"Couldn't change note\",\n knowledge_pin: \"Couldn't change pin\",\n};\n\n/**\n * What each Knowledge tool's settled result says, or null when the shape isn't one we know.\n * A failed call (`errorText` set) gets a card naming what it tried and the error it got.\n */\nexport function knowledgeCard(\n toolName: string,\n input: unknown,\n output: unknown,\n errorText?: string,\n): KnowledgeCard | null {\n const args = isRecord(input) ? input : {};\n const failedTitle = FAILED_TITLES[toolName];\n if (errorText !== undefined && failedTitle) {\n return {\n title: failedTitle,\n detail: str(args.page) ?? str(args.query),\n body: <ToolCallOutput text={errorText || 'The tool call failed.'} error data-testid=\"knowledge-tool-error\" />,\n };\n }\n if (!isRecord(output)) return null;\n switch (toolName) {\n case 'knowledge_search': {\n if (!Array.isArray(output.results)) return null;\n const hits = output.results.filter(isRecord);\n return {\n title: 'Searched Knowledge',\n detail: str(args.query),\n body: hits.length ? (\n <ul className=\"flex flex-col gap-1.5\">\n {hits.map((hit, index) => {\n const page = asPage(hit.page);\n const [note] = asNotes([hit.note]);\n return page ? (\n <li key={`${page.id}-${note?.id ?? index}`} className=\"flex flex-col\">\n <PageLine page={page} />\n {note ? (\n <Meta>\n <NoteText note={note} />\n </Meta>\n ) : null}\n </li>\n ) : null;\n })}\n </ul>\n ) : (\n <Meta>No matches</Meta>\n ),\n };\n }\n case 'knowledge_read': {\n const page = asPage(output.page);\n if (!page) {\n if (!Array.isArray(output.scopes)) return null;\n const scopes = output.scopes.filter(isRecord);\n return {\n title: 'Listed Knowledge scopes',\n body: (\n <ul className=\"flex flex-col gap-1\">\n {scopes.map(scope => (\n <li key={String(scope.address)}>\n <Txt as=\"span\" variant=\"body\">\n {String(scope.name)}\n </Txt>{' '}\n <Meta>{String(scope.address)}</Meta>\n </li>\n ))}\n </ul>\n ),\n };\n }\n const extent = readExtent(output, args);\n const notes = asNotes(output.notes);\n const children = Array.isArray(output.children)\n ? output.children.map(asPage).filter((child): child is PageSummary => child !== undefined)\n : [];\n const mentionedIn = asNotes(output.mentionedIn);\n const childScopes = Array.isArray(output.childScopes) ? output.childScopes.filter(isRecord) : [];\n return {\n title: 'Read',\n detail: withExtent(page.name, extent),\n body: (\n <div className=\"flex flex-col gap-2\">\n <PageLine page={page} />\n {extent ? <Meta>{extent.summary}</Meta> : null}\n {page.description ? <Meta>{page.description}</Meta> : null}\n {page.body ? <Body markdown={page.body} refIds={resultRefIds(page, [...notes, ...mentionedIn])} /> : null}\n <ReadLines page={output.page} />\n {notes.length ? <NoteList notes={notes} /> : null}\n {children.length ? <Meta>Child pages: {children.map(child => child.name).join(', ')}</Meta> : null}\n {childScopes.length ? (\n <Meta>\n Child scopes:{' '}\n {childScopes\n .map(scope =>\n scope.address ? `${String(scope.name)} (${String(scope.address)})` : String(scope.name),\n )\n .join(', ')}\n </Meta>\n ) : null}\n {mentionedIn.length ? (\n <div className=\"flex flex-col gap-1\">\n <Meta>Mentioned in</Meta>\n <NoteList notes={mentionedIn} />\n </div>\n ) : null}\n </div>\n ),\n };\n }\n case 'knowledge_page': {\n const page = asPage(output.page);\n if (!page) return null;\n const op = str(args.op);\n if (op === 'delete') {\n // The page no longer exists, so name it without a link.\n return { title: 'Deleted page', detail: page.name, body: <PageLine page={page} linked={false} /> };\n }\n const title =\n op === 'move' ? 'Moved page' : op === 'merge' ? 'Merged page' : args.page ? 'Updated page' : 'Created page';\n const body = str(args.body);\n const description = str(args.description);\n const extent = writeExtent(args);\n return {\n title,\n detail: withExtent(page.name, extent),\n body: (\n <div className=\"flex flex-col gap-2\">\n <PageLine page={page} />\n {extent ? <Meta>{extent.summary}</Meta> : null}\n {op === 'merge' && str(args.page) ? <Meta>Merged {str(args.page)} into this page</Meta> : null}\n {typeof page.version === 'number' ? <Meta>Version {page.version}</Meta> : null}\n {description ? <Meta>{description}</Meta> : null}\n {body ? <Body markdown={body} refIds={resultRefIds(page, [])} /> : null}\n </div>\n ),\n };\n }\n case 'knowledge_note': {\n if (str(output.removed)) return { title: 'Removed note', body: <Meta>Note {String(output.removed)}</Meta> };\n const [note] = asNotes([output.note]);\n if (!note) return null;\n const pageRef = str(args.page);\n const pageId = str(output.page);\n return {\n title: str(args.op) === 'restamp' ? 'Restamped note' : 'Added note',\n detail: pageRef,\n body: (\n <div className=\"flex flex-col gap-1\">\n <Txt as=\"span\" variant=\"body\">\n <NoteText note={note} />\n </Txt>\n {pageId ? (\n <Meta>\n On <PageLink page={{ id: pageId, name: pageRef ?? 'the page' }} />\n </Meta>\n ) : null}\n </div>\n ),\n };\n }\n case 'knowledge_pin': {\n const pageId = str(output.page);\n if (!pageId || !Array.isArray(output.audience)) return null;\n const pageRef = str(args.page);\n const audience = output.audience.filter((entry): entry is string => typeof entry === 'string');\n return {\n title: str(args.op) === 'unpin' ? 'Unpinned page' : 'Pinned page',\n detail: pageRef,\n body: (\n <div className=\"flex flex-col gap-1\">\n <Meta>\n <PageLink page={{ id: pageId, name: pageRef ?? 'the page' }} />\n </Meta>\n <Meta>{audience.length ? `Pinned for ${audience.join(', ')}` : 'No longer pinned for anyone'}</Meta>\n </div>\n ),\n };\n }\n case 'knowledge_list': {\n if (!Array.isArray(output.entries)) return null;\n const entries = output.entries.map(asListEntry).filter((entry): entry is ListEntry => entry !== undefined);\n const from = str(args.from);\n const more = str(output.nextCursor) || output.more !== undefined;\n return {\n title: from ? 'Listed pages' : 'Listed Knowledge scopes',\n detail: from,\n body: (\n <div className=\"flex flex-col gap-2\">\n {entries.length ? <ListTree entries={entries} /> : <Meta>{from ? 'No pages under it' : 'No scopes'}</Meta>}\n {more ? <Meta>More entries not shown</Meta> : null}\n </div>\n ),\n };\n }\n default:\n return null;\n }\n}\n\nexport interface KnowledgeToolBadgeProps extends Omit<ToolApprovalRequest, 'toolCalled'> {\n card: KnowledgeCard;\n metadata?: MessageMetadata;\n status?: ActivityStatus;\n}\n\nexport const KnowledgeToolBadge = ({\n card,\n toolName,\n metadata,\n toolCallId,\n toolApprovalMetadata,\n isNetwork,\n status = 'idle',\n}: KnowledgeToolBadgeProps) => (\n <ToolApprovalBadge\n approval={{\n toolCalled: true,\n toolCallId,\n toolApprovalMetadata,\n toolName,\n isNetwork,\n isGenerateMode: metadata?.mode === 'generate',\n }}\n data-testid=\"knowledge-tool-badge\"\n icon={<BookOpen aria-hidden />}\n title={card.title}\n detail={card.detail}\n status={status}\n >\n {card.body}\n </ToolApprovalBadge>\n);\n"],"mappings":";;;;;;;;;;;;;AAkBA,IAAa,kCAAkB,IAAI,IAAI;CACrC;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAwBD,IAAM,OAAO,UAAwC,OAAO,UAAU,YAAY,QAAQ,QAAQ,KAAA;AAElG,SAAS,OAAO,OAAyC;CACvD,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,IAAI,MAAM,EAAE,KAAK,OAAO,MAAM,SAAS,UAAU,OAAO,KAAA;CACjF,OAAO;AACT;AAEA,SAAS,QAAQ,OAA+B;CAC9C,OAAO,MAAM,QAAQ,KAAK,IACtB,MAAM,QAAQ,SAA8B,SAAS,IAAI,KAAK,OAAO,KAAK,SAAS,QAAQ,IAC3F,CAAC;AACP;;AAGA,IAAM,cAAc,MAAc,WAAoC,QAAQ,MAAM,GAAG,KAAK,KAAK,OAAO,QAAQ;;AAGhH,SAAS,UAAU,EAAE,QAA2B;CAC9C,IAAI,CAAC,SAAS,IAAI,GAAG,OAAO;CAI5B,MAAM,SAHQ,MAAM,QAAQ,KAAK,OAAO,IACpC,KAAK,QAAQ,OAAO,QAAQ,CAAC,CAAC,KAAI,UAAS,IAAI,MAAM,KAAK,CAAC,IAC3D,CAAC,IAAI,KAAK,KAAK,CAAC,EAAA,CACA,QAAQ,SAAyB,SAAS,KAAA,CAAS;CACvE,IAAI,CAAC,MAAM,QAAQ,OAAO;CAC1B,OACE,oBAAC,KAAD;EAAK,IAAG;EAAI,SAAQ;EAAO,MAAK;EAAO,WAAU;EAC9C,UAAA,MAAM,KAAK,OAAO;CAChB,CAAA;AAET;AAEA,IAAM,SAAS,SAAsB,KAAK,WAAW,KAAK;AAE1D,SAAS,SAAS,EAAE,QAA+B;CACjD,OAAO,oBAAC,mBAAD;EAAmB,QAAQ,KAAK;EAAK,UAAA,KAAK;CAAwB,CAAA;AAC3E;AAEA,SAAS,KAAK,EAAE,YAAqC;CACnD,OACE,oBAAC,KAAD;EAAK,IAAG;EAAO,SAAQ;EAAO,MAAK;EAAQ,WAAU;EAClD;CACE,CAAA;AAET;AAEA,SAAS,SAAS,EAAE,MAAM,SAAS,QAAiD;CAClF,MAAM,QAAQ,MAAM,IAAI;CACxB,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,oBAAC,KAAD;GAAK,IAAG;GAAO,SAAQ;GACpB,UAAA,SAAS,oBAAC,UAAD,EAAgB,KAAO,CAAA,IAAI,KAAK;EACvC,CAAA,GACJ,KAAK,MAAM,oBAAC,MAAD,EAAA,UAAO,KAAK,IAAU,CAAA,IAAI,QAAQ,oBAAC,MAAD,EAAA,UAAO,KAAK,MAAM,GAAG,MAAM,GAAG,KAAK,QAAQ,MAAY,CAAA,IAAI,IACtG;;AAET;AAEA,IAAM,qBAAqB;;;;;;AAU3B,SAAS,aAAa,MAA+B,OAA8B;CACjF,MAAM,sBAAM,IAAI,IAAoB;CACpC,IAAI,MAAM;EACR,IAAI,IAAI,KAAK,IAAI,KAAK,EAAE;EACxB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,EAAE;CACzC;CACA,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,CAAC,SAAS,KAAK,QAAQ,GAAG;EAC9B,KAAK,MAAM,CAAC,KAAK,OAAO,OAAO,QAAQ,KAAK,QAAQ,GAClD,IAAI,OAAO,OAAO,YAAY,IAAI,IAAI,IAAI,KAAK,EAAE;CAErD;CACA,OAAO;AACT;AAEA,IAAM,WAAW,8BAAsB,IAAI,IAAI,CAAC;;AAGhD,SAAS,QAAQ,EAAE,MAAM,GAAG,SAA8C;CACxE,MAAM,SAAS,WAAW,QAAQ;CAClC,MAAM,MAAM,MAAM,WAAW;CAC7B,IAAI,OAAO,QAAQ,UAAU,OAAO,oBAAC,QAAD,EAAM,GAAI,MAAQ,CAAA;CACtD,MAAM,MAAM,IAAI,KAAK;CACrB,MAAM,SAAS,OAAO,IAAI,GAAG;CAC7B,OAAO,SACL,oBAAC,mBAAD;EAA2B;EAAQ,WAAW;EAC3C,UAAA;CACgB,CAAA,IAEnB,oBAAC,QAAD;EAAM,WAAU;EAAkB,eAAY;EAC3C,UAAA;CACG,CAAA;AAEV;AAEA,IAAM,sBAAsB,CAAC,oBAAoB;AACjD,IAAM,kBAA8B,EAAE,MAAM,QAAQ;AAEpD,SAAS,KAAK,EAAE,UAAU,yBAAS,IAAI,IAAI,KAA4C;CACrF,OACE,oBAAC,OAAD;EAAK,WAAU;EAA8D,eAAY;EACvF,UAAA,oBAAC,SAAS,UAAV;GAAmB,OAAO;GACxB,UAAA,oBAAC,kBAAD;IAAkB,eAAe;IAAqB,YAAY;IAC/D,UAAA;GACe,CAAA;EACD,CAAA;CAChB,CAAA;AAET;AAEA,IAAM,UAAU;;AAGhB,SAAS,SAAS,EAAE,QAA+B;CACjD,MAAM,QAAqB,CAAC;CAC5B,IAAI,OAAO;CACX,KAAK,MAAM,SAAS,KAAK,KAAK,SAAS,OAAO,GAAG;EAC/C,MAAM,OAAO,MAAM,MAAM,GAAA,CAAI,KAAK;EAElC,MAAM,YAAY,KAAK,YAAY,OAAO,OAAO,KAAK,UAAU,GAAG,IAAI,KAAK,SAAS,OAAO,KAAA;EAC5F,MAAM,SAAS,OAAO,cAAc,WAAW,YAAY,KAAA;EAC3D,MAAM,KAAK,KAAK,KAAK,MAAM,MAAM,MAAM,KAAK,CAAC;EAC7C,MAAM,KACJ,SACE,oBAAC,mBAAD;GAA6C;GAAQ,WAAW;GAC7D,UAAA;EACgB,GAFK,MAAM,KAEX,IAEnB,oBAAC,QAAD;GAAwB,WAAU;GAAkB,eAAY;GAC7D,UAAA;EACG,GAFK,MAAM,KAEX,CAEV;EACA,OAAO,MAAM,QAAQ,MAAM,EAAE,CAAC;CAChC;CACA,MAAM,KAAK,KAAK,KAAK,MAAM,IAAI,CAAC;CAChC,OAAO,oBAAAA,YAAA,EAAA,UAAG,MAAQ,CAAA;AACpB;AAEA,SAAS,SAAS,EAAE,SAAmC;CACrD,OACE,oBAAC,MAAD;EAAI,WAAU;EACX,UAAA,MAAM,KAAI,SACT,qBAAC,MAAD;GAAkB,WAAU;GAA5B,UAAA,CACE,oBAAC,KAAD;IAAK,IAAG;IAAO,SAAQ;IACrB,UAAA,oBAAC,UAAD,EAAgB,KAAO,CAAA;GACpB,CAAA,GACJ,KAAK,QAAQ,KAAK,SACjB,qBAAC,MAAD,EAAA,UAAA;IACG,KAAK,OAAO,oBAAC,UAAD,EAAU,MAAM,KAAK,KAAO,CAAA,IAAI;IAC5C,KAAK,QAAQ,KAAK,SAAS,QAAQ;IACnC,KAAK;GACF,EAAA,CAAA,IACJ,IACF;EAXK,GAAA,KAAK,EAWV,CACL;CACC,CAAA;AAER;AAYA,SAAS,YAAY,OAAuC;CAC1D,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,IAAI,MAAM,GAAG,KAAK,OAAO,MAAM,SAAS,UAAU,OAAO,KAAA;CAClF,IAAI,OAAO,MAAM,UAAU,YAAY,OAAO,MAAM,aAAa,UAAU,OAAO,KAAA;CAClF,OAAO;AACT;AAEA,IAAM,eAAe;CAAC;CAAI;CAAQ;AAAM;;AAGxC,SAAS,SAAS,EAAE,WAAqC;CACvD,OACE,oBAAC,MAAD;EAAI,WAAU;EAA6C,eAAY;EACpE,UAAA,QAAQ,KAAK,OAAO,UACnB,qBAAC,MAAD;GAEE,WAAW,yBAAyB,aAAa,KAAK,IAAI,KAAK,IAAI,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI;GAF3F,UAAA,CAIE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,oBAAC,KAAD;MAAK,IAAG;MAAO,SAAQ;MAAQ,WAAU;MACvC,UAAA,oBAAC,mBAAD;OAAmB,SAAS,MAAM;OAAM,UAAA,MAAM;MAAwB,CAAA;KACnE,CAAA;KACJ,MAAM,QAAQ,MAAM,OAAO,oBAAC,MAAD,EAAA,UAAO,MAAM,IAAU,CAAA,IAAI;KACtD,MAAM,WACL,qBAAC,MAAD,EAAA,UAAA;MACG,MAAM;MAAS;MAAE,MAAM,aAAa,IAAI,UAAU;KAC/C,EAAA,CAAA,IACJ;IACD;GACJ,CAAA,GAAA,MAAM,cAAc,oBAAC,MAAD,EAAA,UAAO,MAAM,YAAkB,CAAA,IAAI,IACtD;EAfG,GAAA,GAAG,MAAM,IAAI,GAAG,OAenB,CACL;CACC,CAAA;AAER;AAQA,IAAM,gBAAwC;CAC5C,kBAAkB;CAClB,gBAAgB;CAChB,gBAAgB;CAChB,gBAAgB;CAChB,eAAe;AACjB;;;;;AAMA,SAAgB,cACd,UACA,OACA,QACA,WACsB;CACtB,MAAM,OAAO,SAAS,KAAK,IAAI,QAAQ,CAAC;CACxC,MAAM,cAAc,cAAc;CAClC,IAAI,cAAc,KAAA,KAAa,aAC7B,OAAO;EACL,OAAO;EACP,QAAQ,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK;EACxC,MAAM,oBAAC,gBAAD;GAAgB,MAAM,aAAa;GAAyB,OAAA;GAAM,eAAY;EAAwB,CAAA;CAC9G;CAEF,IAAI,CAAC,SAAS,MAAM,GAAG,OAAO;CAC9B,QAAQ,UAAR;EACE,KAAK,oBAAoB;GACvB,IAAI,CAAC,MAAM,QAAQ,OAAO,OAAO,GAAG,OAAO;GAC3C,MAAM,OAAO,OAAO,QAAQ,OAAO,QAAQ;GAC3C,OAAO;IACL,OAAO;IACP,QAAQ,IAAI,KAAK,KAAK;IACtB,MAAM,KAAK,SACT,oBAAC,MAAD;KAAI,WAAU;KACX,UAAA,KAAK,KAAK,KAAK,UAAU;MACxB,MAAM,OAAO,OAAO,IAAI,IAAI;MAC5B,MAAM,CAAC,QAAQ,QAAQ,CAAC,IAAI,IAAI,CAAC;MACjC,OAAO,OACL,qBAAC,MAAD;OAA4C,WAAU;OAAtD,UAAA,CACE,oBAAC,UAAD,EAAgB,KAAO,CAAA,GACtB,OACC,oBAAC,MAAD,EAAA,UACE,oBAAC,UAAD,EAAgB,KAAO,CAAA,EACnB,CAAA,IACJ,IACF;MAPK,GAAA,GAAG,KAAK,GAAG,GAAG,MAAM,MAAM,OAO/B,IACF;KACN,CAAC;IACC,CAAA,IAEJ,oBAAC,MAAD,EAAA,UAAM,aAAgB,CAAA;GAE1B;EACF;EACA,KAAK,kBAAkB;GACrB,MAAM,OAAO,OAAO,OAAO,IAAI;GAC/B,IAAI,CAAC,MAAM;IACT,IAAI,CAAC,MAAM,QAAQ,OAAO,MAAM,GAAG,OAAO;IAC1C,MAAM,SAAS,OAAO,OAAO,OAAO,QAAQ;IAC5C,OAAO;KACL,OAAO;KACP,MACE,oBAAC,MAAD;MAAI,WAAU;MACX,UAAA,OAAO,KAAI,UACV,qBAAC,MAAD,EAAA,UAAA;OACE,oBAAC,KAAD;QAAK,IAAG;QAAO,SAAQ;QACpB,UAAA,OAAO,MAAM,IAAI;OACf,CAAA;OAAE;OACP,oBAAC,MAAD,EAAA,UAAO,OAAO,MAAM,OAAO,EAAQ,CAAA;MACjC,EAAA,GALK,OAAO,MAAM,OAAO,CAKzB,CACL;KACC,CAAA;IAER;GACF;GACA,MAAM,SAAS,WAAW,QAAQ,IAAI;GACtC,MAAM,QAAQ,QAAQ,OAAO,KAAK;GAClC,MAAM,WAAW,MAAM,QAAQ,OAAO,QAAQ,IAC1C,OAAO,SAAS,IAAI,MAAM,CAAC,CAAC,QAAQ,UAAgC,UAAU,KAAA,CAAS,IACvF,CAAC;GACL,MAAM,cAAc,QAAQ,OAAO,WAAW;GAC9C,MAAM,cAAc,MAAM,QAAQ,OAAO,WAAW,IAAI,OAAO,YAAY,OAAO,QAAQ,IAAI,CAAC;GAC/F,OAAO;IACL,OAAO;IACP,QAAQ,WAAW,KAAK,MAAM,MAAM;IACpC,MACE,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACE,oBAAC,UAAD,EAAgB,KAAO,CAAA;MACtB,SAAS,oBAAC,MAAD,EAAA,UAAO,OAAO,QAAc,CAAA,IAAI;MACzC,KAAK,cAAc,oBAAC,MAAD,EAAA,UAAO,KAAK,YAAkB,CAAA,IAAI;MACrD,KAAK,OAAO,oBAAC,MAAD;OAAM,UAAU,KAAK;OAAM,QAAQ,aAAa,MAAM,CAAC,GAAG,OAAO,GAAG,WAAW,CAAC;MAAI,CAAA,IAAI;MACrG,oBAAC,WAAD,EAAW,MAAM,OAAO,KAAO,CAAA;MAC9B,MAAM,SAAS,oBAAC,UAAD,EAAiB,MAAQ,CAAA,IAAI;MAC5C,SAAS,SAAS,qBAAC,MAAD,EAAA,UAAA,CAAM,iBAAc,SAAS,KAAI,UAAS,MAAM,IAAI,CAAC,CAAC,KAAK,IAAI,CAAQ,EAAA,CAAA,IAAI;MAC7F,YAAY,SACX,qBAAC,MAAD,EAAA,UAAA;OAAM;OACU;OACb,YACE,KAAI,UACH,MAAM,UAAU,GAAG,OAAO,MAAM,IAAI,EAAE,IAAI,OAAO,MAAM,OAAO,EAAE,KAAK,OAAO,MAAM,IAAI,CACxF,CAAC,CACA,KAAK,IAAI;MACR,EAAA,CAAA,IACJ;MACH,YAAY,SACX,qBAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACE,oBAAC,MAAD,EAAA,UAAM,eAAkB,CAAA,GACxB,oBAAC,UAAD,EAAU,OAAO,YAAc,CAAA,CAC5B;MACH,CAAA,IAAA;KACD;;GAET;EACF;EACA,KAAK,kBAAkB;GACrB,MAAM,OAAO,OAAO,OAAO,IAAI;GAC/B,IAAI,CAAC,MAAM,OAAO;GAClB,MAAM,KAAK,IAAI,KAAK,EAAE;GACtB,IAAI,OAAO,UAET,OAAO;IAAE,OAAO;IAAgB,QAAQ,KAAK;IAAM,MAAM,oBAAC,UAAD;KAAgB;KAAM,QAAQ;IAAQ,CAAA;GAAE;GAEnG,MAAM,QACJ,OAAO,SAAS,eAAe,OAAO,UAAU,gBAAgB,KAAK,OAAO,iBAAiB;GAC/F,MAAM,OAAO,IAAI,KAAK,IAAI;GAC1B,MAAM,cAAc,IAAI,KAAK,WAAW;GACxC,MAAM,SAAS,YAAY,IAAI;GAC/B,OAAO;IACL;IACA,QAAQ,WAAW,KAAK,MAAM,MAAM;IACpC,MACE,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACE,oBAAC,UAAD,EAAgB,KAAO,CAAA;MACtB,SAAS,oBAAC,MAAD,EAAA,UAAO,OAAO,QAAc,CAAA,IAAI;MACzC,OAAO,WAAW,IAAI,KAAK,IAAI,IAAI,qBAAC,MAAD,EAAA,UAAA;OAAM;OAAQ,IAAI,KAAK,IAAI;OAAE;MAAqB,EAAA,CAAA,IAAI;MACzF,OAAO,KAAK,YAAY,WAAW,qBAAC,MAAD,EAAA,UAAA,CAAM,YAAS,KAAK,OAAc,EAAA,CAAA,IAAI;MACzE,cAAc,oBAAC,MAAD,EAAA,UAAO,YAAkB,CAAA,IAAI;MAC3C,OAAO,oBAAC,MAAD;OAAM,UAAU;OAAM,QAAQ,aAAa,MAAM,CAAC,CAAC;MAAI,CAAA,IAAI;KAChE;;GAET;EACF;EACA,KAAK,kBAAkB;GACrB,IAAI,IAAI,OAAO,OAAO,GAAG,OAAO;IAAE,OAAO;IAAgB,MAAM,qBAAC,MAAD,EAAA,UAAA,CAAM,SAAM,OAAO,OAAO,OAAO,CAAQ,EAAA,CAAA;GAAE;GAC1G,MAAM,CAAC,QAAQ,QAAQ,CAAC,OAAO,IAAI,CAAC;GACpC,IAAI,CAAC,MAAM,OAAO;GAClB,MAAM,UAAU,IAAI,KAAK,IAAI;GAC7B,MAAM,SAAS,IAAI,OAAO,IAAI;GAC9B,OAAO;IACL,OAAO,IAAI,KAAK,EAAE,MAAM,YAAY,mBAAmB;IACvD,QAAQ;IACR,MACE,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,oBAAC,KAAD;MAAK,IAAG;MAAO,SAAQ;MACrB,UAAA,oBAAC,UAAD,EAAgB,KAAO,CAAA;KACpB,CAAA,GACJ,SACC,qBAAC,MAAD,EAAA,UAAA,CAAM,OACD,oBAAC,UAAD,EAAU,MAAM;MAAE,IAAI;MAAQ,MAAM,WAAW;KAAW,EAAI,CAAA,CAC7D,EAAA,CAAA,IACJ,IACD;;GAET;EACF;EACA,KAAK,iBAAiB;GACpB,MAAM,SAAS,IAAI,OAAO,IAAI;GAC9B,IAAI,CAAC,UAAU,CAAC,MAAM,QAAQ,OAAO,QAAQ,GAAG,OAAO;GACvD,MAAM,UAAU,IAAI,KAAK,IAAI;GAC7B,MAAM,WAAW,OAAO,SAAS,QAAQ,UAA2B,OAAO,UAAU,QAAQ;GAC7F,OAAO;IACL,OAAO,IAAI,KAAK,EAAE,MAAM,UAAU,kBAAkB;IACpD,QAAQ;IACR,MACE,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,oBAAC,MAAD,EAAA,UACE,oBAAC,UAAD,EAAU,MAAM;MAAE,IAAI;MAAQ,MAAM,WAAW;KAAW,EAAI,CAAA,EAC1D,CAAA,GACN,oBAAC,MAAD,EAAA,UAAO,SAAS,SAAS,cAAc,SAAS,KAAK,IAAI,MAAM,8BAAoC,CAAA,CAChG;;GAET;EACF;EACA,KAAK,kBAAkB;GACrB,IAAI,CAAC,MAAM,QAAQ,OAAO,OAAO,GAAG,OAAO;GAC3C,MAAM,UAAU,OAAO,QAAQ,IAAI,WAAW,CAAC,CAAC,QAAQ,UAA8B,UAAU,KAAA,CAAS;GACzG,MAAM,OAAO,IAAI,KAAK,IAAI;GAC1B,MAAM,OAAO,IAAI,OAAO,UAAU,KAAK,OAAO,SAAS,KAAA;GACvD,OAAO;IACL,OAAO,OAAO,iBAAiB;IAC/B,QAAQ;IACR,MACE,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACG,QAAQ,SAAS,oBAAC,UAAD,EAAmB,QAAU,CAAA,IAAI,oBAAC,MAAD,EAAA,UAAO,OAAO,sBAAsB,YAAkB,CAAA,GACxG,OAAO,oBAAC,MAAD,EAAA,UAAM,yBAA4B,CAAA,IAAI,IAC3C;;GAET;EACF;EACA,SACE,OAAO;CACX;AACF;AAQA,IAAa,sBAAsB,EACjC,MACA,UACA,UACA,YACA,sBACA,WACA,SAAS,aAET,oBAAC,mBAAD;CACE,UAAU;EACR,YAAY;EACZ;EACA;EACA;EACA;EACA,gBAAgB,UAAU,SAAS;CACrC;CACA,eAAY;CACZ,MAAM,oBAAC,UAAD,EAAU,eAAA,KAAa,CAAA;CAC7B,OAAO,KAAK;CACZ,QAAQ,KAAK;CACL;CAEP,UAAA,KAAK;AACW,CAAA"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_domains_chat_context_tool_call_context = require("../../context/tool-call-context.cjs.js");
|
|
3
|
+
const require_domains_chat_tools_mcp_input_request_tool = require("../mcp-input-request-tool.cjs.js");
|
|
4
|
+
const require_domains_chat_tools_badges_use_deferred_input_request = require("./use-deferred-input-request.cjs.js");
|
|
5
|
+
let react = require("react");
|
|
6
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
|
+
// src/domains/chat/tools/badges/mcp-input-request-badge.tsx
|
|
8
|
+
/** A call the run is parked on: answering resumes the run, like any other suspended tool. */
|
|
9
|
+
function ForegroundMcpInputRequest({ toolCallId, payload, readOnly, isNetwork }) {
|
|
10
|
+
const { approveToolcall, isRunning } = require_domains_chat_context_tool_call_context.useToolCall();
|
|
11
|
+
const [sent, setSent] = (0, react.useState)(false);
|
|
12
|
+
const [error, setError] = (0, react.useState)();
|
|
13
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_chat_tools_mcp_input_request_tool.McpInputRequestTool, {
|
|
14
|
+
payload,
|
|
15
|
+
readOnly: readOnly || isNetwork,
|
|
16
|
+
notice: isNetwork ? "Studio can't answer this request in a network run yet." : void 0,
|
|
17
|
+
isSubmitting: isRunning || sent,
|
|
18
|
+
error,
|
|
19
|
+
onSubmit: async (resumeData) => {
|
|
20
|
+
setSent(true);
|
|
21
|
+
setError(void 0);
|
|
22
|
+
try {
|
|
23
|
+
await approveToolcall(toolCallId, resumeData);
|
|
24
|
+
} catch (failure) {
|
|
25
|
+
setSent(false);
|
|
26
|
+
setError(failure instanceof Error && failure.message ? failure.message : "Couldn't send the answer.");
|
|
27
|
+
throw failure;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* A deferred call whose background task waits on the question. The agent's turn already ended, so
|
|
34
|
+
* the answer goes to the task directly and the chat stays free for other messages meanwhile.
|
|
35
|
+
*/
|
|
36
|
+
function DeferredMcpInputRequest({ backgroundTaskId, request }) {
|
|
37
|
+
const resume = require_domains_chat_tools_badges_use_deferred_input_request.useResumeBackgroundTask(backgroundTaskId);
|
|
38
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_chat_tools_mcp_input_request_tool.McpInputRequestTool, {
|
|
39
|
+
payload: request.payload,
|
|
40
|
+
isSubmitting: resume.isPending,
|
|
41
|
+
error: resume.error ? require_domains_chat_tools_badges_use_deferred_input_request.resumeErrorMessage(resume.error) : void 0,
|
|
42
|
+
onSubmit: (resumeData) => resume.mutateAsync({
|
|
43
|
+
resumeData,
|
|
44
|
+
suspendedAt: request.suspendedAt
|
|
45
|
+
})
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
exports.DeferredMcpInputRequest = DeferredMcpInputRequest;
|
|
49
|
+
exports.ForegroundMcpInputRequest = ForegroundMcpInputRequest;
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=mcp-input-request-badge.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-input-request-badge.cjs.js","names":["useToolCall","useState","McpInputRequestTool","useResumeBackgroundTask","resumeErrorMessage"],"sources":["../../../../../src/domains/chat/tools/badges/mcp-input-request-badge.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useToolCall } from '../../context/tool-call-context';\nimport type { McpInputRequestPayload } from '../mcp-input-request';\nimport { McpInputRequestTool } from '../mcp-input-request-tool';\nimport { resumeErrorMessage, useResumeBackgroundTask } from './use-deferred-input-request';\nimport type { OpenInputRequest } from './use-deferred-input-request';\n\n/** A call the run is parked on: answering resumes the run, like any other suspended tool. */\nexport function ForegroundMcpInputRequest({\n toolCallId,\n payload,\n readOnly,\n isNetwork,\n}: {\n toolCallId: string;\n payload: McpInputRequestPayload;\n readOnly?: boolean;\n /** A network run resumes through its own route, which can't carry these answers yet. */\n isNetwork?: boolean;\n}) {\n const { approveToolcall, isRunning } = useToolCall();\n // Not `toolCallApprovals`: it keeps the call approved after the first answer, which would lock the\n // form when the same call suspends again. This state starts over with each suspension's key.\n const [sent, setSent] = useState(false);\n const [error, setError] = useState<string>();\n return (\n <McpInputRequestTool\n payload={payload}\n readOnly={readOnly || isNetwork}\n notice={isNetwork ? \"Studio can't answer this request in a network run yet.\" : undefined}\n isSubmitting={isRunning || sent}\n error={error}\n onSubmit={async resumeData => {\n setSent(true);\n setError(undefined);\n try {\n await approveToolcall(toolCallId, resumeData);\n } catch (failure) {\n setSent(false);\n setError(failure instanceof Error && failure.message ? failure.message : \"Couldn't send the answer.\");\n throw failure;\n }\n }}\n />\n );\n}\n\n/**\n * A deferred call whose background task waits on the question. The agent's turn already ended, so\n * the answer goes to the task directly and the chat stays free for other messages meanwhile.\n */\nexport function DeferredMcpInputRequest({\n backgroundTaskId,\n request,\n}: {\n backgroundTaskId: string;\n request: OpenInputRequest;\n}) {\n const resume = useResumeBackgroundTask(backgroundTaskId);\n return (\n <McpInputRequestTool\n payload={request.payload}\n isSubmitting={resume.isPending}\n error={resume.error ? resumeErrorMessage(resume.error) : undefined}\n onSubmit={resumeData => resume.mutateAsync({ resumeData, suspendedAt: request.suspendedAt })}\n />\n );\n}\n"],"mappings":";;;;;;;;AAQA,SAAgB,0BAA0B,EACxC,YACA,SACA,UACA,aAOC;CACD,MAAM,EAAE,iBAAiB,cAAcA,+CAAAA,YAAY;CAGnD,MAAM,CAAC,MAAM,YAAA,GAAWC,MAAAA,SAAAA,CAAS,KAAK;CACtC,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAiB;CAC3C,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,kDAAAA,qBAAD;EACW;EACT,UAAU,YAAY;EACtB,QAAQ,YAAY,2DAA2D,KAAA;EAC/E,cAAc,aAAa;EACpB;EACP,UAAU,OAAM,eAAc;GAC5B,QAAQ,IAAI;GACZ,SAAS,KAAA,CAAS;GAClB,IAAI;IACF,MAAM,gBAAgB,YAAY,UAAU;GAC9C,SAAS,SAAS;IAChB,QAAQ,KAAK;IACb,SAAS,mBAAmB,SAAS,QAAQ,UAAU,QAAQ,UAAU,2BAA2B;IACpG,MAAM;GACR;EACF;CACD,CAAA;AAEL;;;;;AAMA,SAAgB,wBAAwB,EACtC,kBACA,WAIC;CACD,MAAM,SAASC,6DAAAA,wBAAwB,gBAAgB;CACvD,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACD,kDAAAA,qBAAD;EACE,SAAS,QAAQ;EACjB,cAAc,OAAO;EACrB,OAAO,OAAO,QAAQE,6DAAAA,mBAAmB,OAAO,KAAK,IAAI,KAAA;EACzD,WAAU,eAAc,OAAO,YAAY;GAAE;GAAY,aAAa,QAAQ;EAAY,CAAC;CAC5F,CAAA;AAEL"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../../../../src/domains/chat/tools/badges/mcp-input-request-badge';
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { useToolCall } from "../../context/tool-call-context.es.js";
|
|
2
|
+
import { McpInputRequestTool } from "../mcp-input-request-tool.es.js";
|
|
3
|
+
import { resumeErrorMessage, useResumeBackgroundTask } from "./use-deferred-input-request.es.js";
|
|
4
|
+
import { useState } from "react";
|
|
5
|
+
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
// src/domains/chat/tools/badges/mcp-input-request-badge.tsx
|
|
7
|
+
/** A call the run is parked on: answering resumes the run, like any other suspended tool. */
|
|
8
|
+
function ForegroundMcpInputRequest({ toolCallId, payload, readOnly, isNetwork }) {
|
|
9
|
+
const { approveToolcall, isRunning } = useToolCall();
|
|
10
|
+
const [sent, setSent] = useState(false);
|
|
11
|
+
const [error, setError] = useState();
|
|
12
|
+
return /* @__PURE__ */ jsx(McpInputRequestTool, {
|
|
13
|
+
payload,
|
|
14
|
+
readOnly: readOnly || isNetwork,
|
|
15
|
+
notice: isNetwork ? "Studio can't answer this request in a network run yet." : void 0,
|
|
16
|
+
isSubmitting: isRunning || sent,
|
|
17
|
+
error,
|
|
18
|
+
onSubmit: async (resumeData) => {
|
|
19
|
+
setSent(true);
|
|
20
|
+
setError(void 0);
|
|
21
|
+
try {
|
|
22
|
+
await approveToolcall(toolCallId, resumeData);
|
|
23
|
+
} catch (failure) {
|
|
24
|
+
setSent(false);
|
|
25
|
+
setError(failure instanceof Error && failure.message ? failure.message : "Couldn't send the answer.");
|
|
26
|
+
throw failure;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* A deferred call whose background task waits on the question. The agent's turn already ended, so
|
|
33
|
+
* the answer goes to the task directly and the chat stays free for other messages meanwhile.
|
|
34
|
+
*/
|
|
35
|
+
function DeferredMcpInputRequest({ backgroundTaskId, request }) {
|
|
36
|
+
const resume = useResumeBackgroundTask(backgroundTaskId);
|
|
37
|
+
return /* @__PURE__ */ jsx(McpInputRequestTool, {
|
|
38
|
+
payload: request.payload,
|
|
39
|
+
isSubmitting: resume.isPending,
|
|
40
|
+
error: resume.error ? resumeErrorMessage(resume.error) : void 0,
|
|
41
|
+
onSubmit: (resumeData) => resume.mutateAsync({
|
|
42
|
+
resumeData,
|
|
43
|
+
suspendedAt: request.suspendedAt
|
|
44
|
+
})
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
export { DeferredMcpInputRequest, ForegroundMcpInputRequest };
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=mcp-input-request-badge.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-input-request-badge.es.js","names":[],"sources":["../../../../../src/domains/chat/tools/badges/mcp-input-request-badge.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useToolCall } from '../../context/tool-call-context';\nimport type { McpInputRequestPayload } from '../mcp-input-request';\nimport { McpInputRequestTool } from '../mcp-input-request-tool';\nimport { resumeErrorMessage, useResumeBackgroundTask } from './use-deferred-input-request';\nimport type { OpenInputRequest } from './use-deferred-input-request';\n\n/** A call the run is parked on: answering resumes the run, like any other suspended tool. */\nexport function ForegroundMcpInputRequest({\n toolCallId,\n payload,\n readOnly,\n isNetwork,\n}: {\n toolCallId: string;\n payload: McpInputRequestPayload;\n readOnly?: boolean;\n /** A network run resumes through its own route, which can't carry these answers yet. */\n isNetwork?: boolean;\n}) {\n const { approveToolcall, isRunning } = useToolCall();\n // Not `toolCallApprovals`: it keeps the call approved after the first answer, which would lock the\n // form when the same call suspends again. This state starts over with each suspension's key.\n const [sent, setSent] = useState(false);\n const [error, setError] = useState<string>();\n return (\n <McpInputRequestTool\n payload={payload}\n readOnly={readOnly || isNetwork}\n notice={isNetwork ? \"Studio can't answer this request in a network run yet.\" : undefined}\n isSubmitting={isRunning || sent}\n error={error}\n onSubmit={async resumeData => {\n setSent(true);\n setError(undefined);\n try {\n await approveToolcall(toolCallId, resumeData);\n } catch (failure) {\n setSent(false);\n setError(failure instanceof Error && failure.message ? failure.message : \"Couldn't send the answer.\");\n throw failure;\n }\n }}\n />\n );\n}\n\n/**\n * A deferred call whose background task waits on the question. The agent's turn already ended, so\n * the answer goes to the task directly and the chat stays free for other messages meanwhile.\n */\nexport function DeferredMcpInputRequest({\n backgroundTaskId,\n request,\n}: {\n backgroundTaskId: string;\n request: OpenInputRequest;\n}) {\n const resume = useResumeBackgroundTask(backgroundTaskId);\n return (\n <McpInputRequestTool\n payload={request.payload}\n isSubmitting={resume.isPending}\n error={resume.error ? resumeErrorMessage(resume.error) : undefined}\n onSubmit={resumeData => resume.mutateAsync({ resumeData, suspendedAt: request.suspendedAt })}\n />\n );\n}\n"],"mappings":";;;;;;;AAQA,SAAgB,0BAA0B,EACxC,YACA,SACA,UACA,aAOC;CACD,MAAM,EAAE,iBAAiB,cAAc,YAAY;CAGnD,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,CAAC,OAAO,YAAY,SAAiB;CAC3C,OACE,oBAAC,qBAAD;EACW;EACT,UAAU,YAAY;EACtB,QAAQ,YAAY,2DAA2D,KAAA;EAC/E,cAAc,aAAa;EACpB;EACP,UAAU,OAAM,eAAc;GAC5B,QAAQ,IAAI;GACZ,SAAS,KAAA,CAAS;GAClB,IAAI;IACF,MAAM,gBAAgB,YAAY,UAAU;GAC9C,SAAS,SAAS;IAChB,QAAQ,KAAK;IACb,SAAS,mBAAmB,SAAS,QAAQ,UAAU,QAAQ,UAAU,2BAA2B;IACpG,MAAM;GACR;EACF;CACD,CAAA;AAEL;;;;;AAMA,SAAgB,wBAAwB,EACtC,kBACA,WAIC;CACD,MAAM,SAAS,wBAAwB,gBAAgB;CACvD,OACE,oBAAC,qBAAD;EACE,SAAS,QAAQ;EACjB,cAAc,OAAO;EACrB,OAAO,OAAO,QAAQ,mBAAmB,OAAO,KAAK,IAAI,KAAA;EACzD,WAAU,eAAc,OAAO,YAAY;GAAE;GAAY,aAAa,QAAQ;EAAY,CAAC;CAC5F,CAAA;AAEL"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_copy_button = require("../../../../copy-button-DJAQ6_3o.cjs");
|
|
3
3
|
const require_Badge = require("../../../../Badge-DZ6r6bcw.cjs");
|
|
4
|
+
const require_domains_chat_tools_badges_use_deferred_input_request = require("./use-deferred-input-request.cjs.js");
|
|
4
5
|
const require_domains_chat_tools_badges_use_mcp_task_progress = require("./use-mcp-task-progress.cjs.js");
|
|
5
6
|
let react = require("react");
|
|
6
7
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
@@ -92,18 +93,22 @@ function BackgroundMcpTaskChip({ task, backgroundTaskId }) {
|
|
|
92
93
|
const client = (0, _mastra_react.useMastraClient)();
|
|
93
94
|
const ended = require_domains_chat_tools_badges_use_mcp_task_progress.isTerminalMcpTaskStatus(task.status);
|
|
94
95
|
const { data, dataUpdatedAt } = (0, _tanstack_react_query.useQuery)({
|
|
95
|
-
queryKey:
|
|
96
|
+
queryKey: require_domains_chat_tools_badges_use_deferred_input_request.backgroundTaskQueryKey(backgroundTaskId),
|
|
96
97
|
queryFn: () => client.getBackgroundTask(backgroundTaskId),
|
|
97
98
|
enabled: !ended,
|
|
98
99
|
refetchInterval: (query) => BACKGROUND_END[query.state.data?.status ?? ""] ? false : BACKGROUND_POLL_MS
|
|
99
100
|
});
|
|
100
101
|
const backgroundEnd = ended ? void 0 : BACKGROUND_END[data?.status ?? ""];
|
|
101
102
|
const completedAt = data?.completedAt ? new Date(data.completedAt).getTime() : void 0;
|
|
103
|
+
const waiting = data?.status === "suspended" ? "input_required" : data?.status === "running" ? "working" : task.status;
|
|
102
104
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(McpTaskChip, { task: backgroundEnd ? {
|
|
103
105
|
...task,
|
|
104
106
|
status: backgroundEnd,
|
|
105
107
|
endedAt: completedAt ?? task.endedAt ?? dataUpdatedAt
|
|
106
|
-
} : task
|
|
108
|
+
} : ended ? task : {
|
|
109
|
+
...task,
|
|
110
|
+
status: waiting
|
|
111
|
+
} });
|
|
107
112
|
}
|
|
108
113
|
exports.BackgroundMcpTaskChip = BackgroundMcpTaskChip;
|
|
109
114
|
exports.McpTaskChip = McpTaskChip;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-task-chip.cjs.js","names":["useState","isTerminalMcpTaskStatus","Badge","CopyButton","useMastraClient","useQuery"],"sources":["../../../../../src/domains/chat/tools/badges/mcp-task-chip.tsx"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { useEffect, useState } from 'react';\nimport { isTerminalMcpTaskStatus } from './use-mcp-task-progress';\nimport type { McpTaskStatus, McpTaskView } from './use-mcp-task-progress';\nimport { Badge } from '@/ds/components/Badge';\nimport type { BadgeIndicator, BadgeVariant } from '@/ds/components/Badge';\nimport { CopyButton } from '@/ds/components/CopyButton';\n\nconst STATUS: Record<McpTaskStatus, { label: string; variant: BadgeVariant; indicator?: BadgeIndicator }> = {\n working: { label: 'working', variant: 'info', indicator: 'pulse' },\n input_required: { label: 'input required', variant: 'warning', indicator: 'dot' },\n completed: { label: 'completed', variant: 'success' },\n failed: { label: 'failed', variant: 'destructive' },\n cancelled: { label: 'cancelled', variant: 'neutral' },\n};\n\n/** Now, every second, until `endedAt` is known. */\nfunction useClock(endedAt: number | undefined) {\n const [now, setNow] = useState(Date.now);\n useEffect(() => {\n if (endedAt !== undefined) return;\n const timer = setInterval(() => setNow(Date.now()), 1_000);\n return () => clearInterval(timer);\n }, [endedAt]);\n return endedAt ?? now;\n}\n\nconst formatElapsed = (ms: number) => {\n // A server may send a valid ISO 8601 `createdAt` that `Date.parse` can't read, like `20261029T120000Z`.\n if (Number.isNaN(ms)) return '--:--';\n const seconds = Math.max(0, Math.floor(ms / 1000));\n return `${Math.floor(seconds / 60)}:${String(seconds % 60).padStart(2, '0')}`;\n};\n\n/** `task · working · 0:42` for a tool call that continued as an MCP task, with its task id to copy. */\nexport function McpTaskChip({ task }: { task: McpTaskView }) {\n const { label, variant, indicator } = STATUS[task.status];\n const terminal = isTerminalMcpTaskStatus(task.status);\n const elapsed = useClock(terminal ? task.endedAt : undefined) - Date.parse(task.createdAt);\n\n return (\n <span className=\"inline-flex items-center gap-1\" data-testid=\"mcp-task-chip\">\n <Badge\n size=\"sm\"\n variant={variant}\n emphasis=\"subtle\"\n indicator={indicator}\n title={`MCP task ${task.taskId} on ${task.serverName}`}\n >\n task · {label} · <span className=\"font-mono tabular-nums\">{formatElapsed(elapsed)}</span>\n </Badge>\n <CopyButton content={task.taskId} tooltip=\"Copy MCP task id\" copyMessage=\"Copied MCP task id\" />\n </span>\n );\n}\n\nconst BACKGROUND_POLL_MS = 2_000;\n\n/** How the Mastra background task ended, as the MCP task's status; undefined while it runs. */\nconst BACKGROUND_END: Record<string, McpTaskStatus | undefined> = {\n completed: 'completed',\n failed: 'failed',\n timed_out: 'failed',\n cancelled: 'cancelled',\n};\n\n/**\n * The chip for a call deferred to a Mastra background task. The chat stream ends with the turn, so\n * the task's later progress and its end never reach this card; until the progress shows the task\n * ended, the background task is polled for how it ended.\n */\nexport function BackgroundMcpTaskChip({ task, backgroundTaskId }: { task: McpTaskView; backgroundTaskId: string }) {\n const client = useMastraClient();\n const ended = isTerminalMcpTaskStatus(task.status);\n const { data, dataUpdatedAt } = useQuery({\n queryKey:
|
|
1
|
+
{"version":3,"file":"mcp-task-chip.cjs.js","names":["useState","isTerminalMcpTaskStatus","Badge","CopyButton","useMastraClient","useQuery","backgroundTaskQueryKey"],"sources":["../../../../../src/domains/chat/tools/badges/mcp-task-chip.tsx"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { useEffect, useState } from 'react';\nimport { backgroundTaskQueryKey } from './use-deferred-input-request';\nimport { isTerminalMcpTaskStatus } from './use-mcp-task-progress';\nimport type { McpTaskStatus, McpTaskView } from './use-mcp-task-progress';\nimport { Badge } from '@/ds/components/Badge';\nimport type { BadgeIndicator, BadgeVariant } from '@/ds/components/Badge';\nimport { CopyButton } from '@/ds/components/CopyButton';\n\nconst STATUS: Record<McpTaskStatus, { label: string; variant: BadgeVariant; indicator?: BadgeIndicator }> = {\n working: { label: 'working', variant: 'info', indicator: 'pulse' },\n input_required: { label: 'input required', variant: 'warning', indicator: 'dot' },\n completed: { label: 'completed', variant: 'success' },\n failed: { label: 'failed', variant: 'destructive' },\n cancelled: { label: 'cancelled', variant: 'neutral' },\n};\n\n/** Now, every second, until `endedAt` is known. */\nfunction useClock(endedAt: number | undefined) {\n const [now, setNow] = useState(Date.now);\n useEffect(() => {\n if (endedAt !== undefined) return;\n const timer = setInterval(() => setNow(Date.now()), 1_000);\n return () => clearInterval(timer);\n }, [endedAt]);\n return endedAt ?? now;\n}\n\nconst formatElapsed = (ms: number) => {\n // A server may send a valid ISO 8601 `createdAt` that `Date.parse` can't read, like `20261029T120000Z`.\n if (Number.isNaN(ms)) return '--:--';\n const seconds = Math.max(0, Math.floor(ms / 1000));\n return `${Math.floor(seconds / 60)}:${String(seconds % 60).padStart(2, '0')}`;\n};\n\n/** `task · working · 0:42` for a tool call that continued as an MCP task, with its task id to copy. */\nexport function McpTaskChip({ task }: { task: McpTaskView }) {\n const { label, variant, indicator } = STATUS[task.status];\n const terminal = isTerminalMcpTaskStatus(task.status);\n const elapsed = useClock(terminal ? task.endedAt : undefined) - Date.parse(task.createdAt);\n\n return (\n <span className=\"inline-flex items-center gap-1\" data-testid=\"mcp-task-chip\">\n <Badge\n size=\"sm\"\n variant={variant}\n emphasis=\"subtle\"\n indicator={indicator}\n title={`MCP task ${task.taskId} on ${task.serverName}`}\n >\n task · {label} · <span className=\"font-mono tabular-nums\">{formatElapsed(elapsed)}</span>\n </Badge>\n <CopyButton content={task.taskId} tooltip=\"Copy MCP task id\" copyMessage=\"Copied MCP task id\" />\n </span>\n );\n}\n\nconst BACKGROUND_POLL_MS = 2_000;\n\n/** How the Mastra background task ended, as the MCP task's status; undefined while it runs. */\nconst BACKGROUND_END: Record<string, McpTaskStatus | undefined> = {\n completed: 'completed',\n failed: 'failed',\n timed_out: 'failed',\n cancelled: 'cancelled',\n};\n\n/**\n * The chip for a call deferred to a Mastra background task. The chat stream ends with the turn, so\n * the task's later progress and its end never reach this card; until the progress shows the task\n * ended, the background task is polled for how it ended.\n */\nexport function BackgroundMcpTaskChip({ task, backgroundTaskId }: { task: McpTaskView; backgroundTaskId: string }) {\n const client = useMastraClient();\n const ended = isTerminalMcpTaskStatus(task.status);\n const { data, dataUpdatedAt } = useQuery({\n queryKey: backgroundTaskQueryKey(backgroundTaskId),\n queryFn: () => client.getBackgroundTask(backgroundTaskId),\n enabled: !ended,\n refetchInterval: query => (BACKGROUND_END[query.state.data?.status ?? ''] ? false : BACKGROUND_POLL_MS),\n });\n const backgroundEnd = ended ? undefined : BACKGROUND_END[data?.status ?? ''];\n const completedAt = data?.completedAt ? new Date(data.completedAt).getTime() : undefined;\n // The call's progress stops reaching the chat with the turn, so a question answered later still\n // reads `input_required` there; the background task says whether it is waiting or working.\n const waiting =\n data?.status === 'suspended' ? 'input_required' : data?.status === 'running' ? 'working' : task.status;\n\n return (\n <McpTaskChip\n task={\n backgroundEnd\n ? { ...task, status: backgroundEnd, endedAt: completedAt ?? task.endedAt ?? dataUpdatedAt }\n : ended\n ? task\n : { ...task, status: waiting }\n }\n />\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { t as CopyButton } from "../../../../copy-button-BXrbevLn.js";
|
|
2
2
|
import { t as Badge } from "../../../../Badge-aVu5iGAF.js";
|
|
3
|
+
import { backgroundTaskQueryKey } from "./use-deferred-input-request.es.js";
|
|
3
4
|
import { isTerminalMcpTaskStatus } from "./use-mcp-task-progress.es.js";
|
|
4
5
|
import { useEffect, useState } from "react";
|
|
5
6
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -91,18 +92,22 @@ function BackgroundMcpTaskChip({ task, backgroundTaskId }) {
|
|
|
91
92
|
const client = useMastraClient();
|
|
92
93
|
const ended = isTerminalMcpTaskStatus(task.status);
|
|
93
94
|
const { data, dataUpdatedAt } = useQuery({
|
|
94
|
-
queryKey:
|
|
95
|
+
queryKey: backgroundTaskQueryKey(backgroundTaskId),
|
|
95
96
|
queryFn: () => client.getBackgroundTask(backgroundTaskId),
|
|
96
97
|
enabled: !ended,
|
|
97
98
|
refetchInterval: (query) => BACKGROUND_END[query.state.data?.status ?? ""] ? false : BACKGROUND_POLL_MS
|
|
98
99
|
});
|
|
99
100
|
const backgroundEnd = ended ? void 0 : BACKGROUND_END[data?.status ?? ""];
|
|
100
101
|
const completedAt = data?.completedAt ? new Date(data.completedAt).getTime() : void 0;
|
|
102
|
+
const waiting = data?.status === "suspended" ? "input_required" : data?.status === "running" ? "working" : task.status;
|
|
101
103
|
return /* @__PURE__ */ jsx(McpTaskChip, { task: backgroundEnd ? {
|
|
102
104
|
...task,
|
|
103
105
|
status: backgroundEnd,
|
|
104
106
|
endedAt: completedAt ?? task.endedAt ?? dataUpdatedAt
|
|
105
|
-
} : task
|
|
107
|
+
} : ended ? task : {
|
|
108
|
+
...task,
|
|
109
|
+
status: waiting
|
|
110
|
+
} });
|
|
106
111
|
}
|
|
107
112
|
export { BackgroundMcpTaskChip, McpTaskChip };
|
|
108
113
|
|