@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.
Files changed (338) hide show
  1. package/dist/KnowledgePageGraph.css +55 -0
  2. package/dist/{MarkdownRenderer-2GOXQJEv.js → MarkdownRenderer-CI30RqdB.js} +19 -6
  3. package/dist/MarkdownRenderer-CI30RqdB.js.map +1 -0
  4. package/dist/{MarkdownRenderer-CB8Z_CHc.cjs → MarkdownRenderer-y65WGBhC.cjs} +19 -6
  5. package/dist/MarkdownRenderer-y65WGBhC.cjs.map +1 -0
  6. package/dist/{activity-rJ1NQl_2.js → activity-C8Ql81WM.js} +2 -2
  7. package/dist/{activity-rJ1NQl_2.js.map → activity-C8Ql81WM.js.map} +1 -1
  8. package/dist/{activity-DyB5H3gF.cjs → activity-CcQZeDYi.cjs} +2 -2
  9. package/dist/{activity-DyB5H3gF.cjs.map → activity-CcQZeDYi.cjs.map} +1 -1
  10. package/dist/components/MarkdownRenderer.cjs.js +1 -1
  11. package/dist/components/MarkdownRenderer.es.js +1 -1
  12. package/dist/components/SavedViews.cjs.js +1 -1
  13. package/dist/components/SavedViews.es.js +1 -1
  14. package/dist/components/ai/activity.cjs.js +1 -1
  15. package/dist/components/ai/activity.es.js +1 -1
  16. package/dist/components/ai/plan.cjs.js +1 -1
  17. package/dist/components/ai/plan.es.js +1 -1
  18. package/dist/components/ai/tool-approval.cjs.js +1 -1
  19. package/dist/components/ai/tool-approval.es.js +1 -1
  20. package/dist/components/ai/tool-call.cjs.js +2 -2
  21. package/dist/components/ai/tool-call.es.js +2 -2
  22. package/dist/domains/chat/activity/activity-stretch-line.cjs.js +1 -1
  23. package/dist/domains/chat/activity/activity-stretch-line.es.js +1 -1
  24. package/dist/domains/chat/activity/components/activity-fold.cjs.js +1 -1
  25. package/dist/domains/chat/activity/components/activity-fold.es.js +1 -1
  26. package/dist/domains/chat/activity/components/activity-timed-trigger.cjs.js +1 -1
  27. package/dist/domains/chat/activity/components/activity-timed-trigger.es.js +1 -1
  28. package/dist/domains/chat/activity/components/calls-panel.cjs.js +1 -1
  29. package/dist/domains/chat/activity/components/calls-panel.es.js +1 -1
  30. package/dist/domains/chat/activity/components/stretch-content.cjs.js +1 -1
  31. package/dist/domains/chat/activity/components/stretch-content.es.js +1 -1
  32. package/dist/domains/chat/activity/components/stretch-thought.cjs.js +1 -1
  33. package/dist/domains/chat/activity/components/stretch-thought.es.js +1 -1
  34. package/dist/domains/chat/activity/model/activity-segments.cjs.js +1 -1
  35. package/dist/domains/chat/activity/model/activity-segments.es.js +1 -1
  36. package/dist/domains/chat/activity/model/activity-words.cjs.js +2 -2
  37. package/dist/domains/chat/activity/model/activity-words.es.js +2 -2
  38. package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
  39. package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
  40. package/dist/domains/chat/knowledge/knowledge-links.cjs.js +52 -6
  41. package/dist/domains/chat/knowledge/knowledge-links.cjs.js.map +1 -1
  42. package/dist/domains/chat/knowledge/knowledge-links.es.js +53 -9
  43. package/dist/domains/chat/knowledge/knowledge-links.es.js.map +1 -1
  44. package/dist/domains/chat/knowledge/pinned-knowledge-data.cjs.js +10 -3
  45. package/dist/domains/chat/knowledge/pinned-knowledge-data.cjs.js.map +1 -1
  46. package/dist/domains/chat/knowledge/pinned-knowledge-data.es.js +10 -3
  47. package/dist/domains/chat/knowledge/pinned-knowledge-data.es.js.map +1 -1
  48. package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js +8 -3
  49. package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js.map +1 -1
  50. package/dist/domains/chat/knowledge/pinned-knowledge.es.js +8 -3
  51. package/dist/domains/chat/knowledge/pinned-knowledge.es.js.map +1 -1
  52. package/dist/domains/chat/knowledge.cjs.js +2 -0
  53. package/dist/domains/chat/knowledge.es.js +2 -2
  54. package/dist/domains/chat/messages/message-row.cjs.js +3 -3
  55. package/dist/domains/chat/messages/message-row.es.js +3 -3
  56. package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
  57. package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
  58. package/dist/domains/chat/messages/reasoning-content.cjs.js +1 -1
  59. package/dist/domains/chat/messages/reasoning-content.es.js +1 -1
  60. package/dist/domains/chat/messages/renderers/message-text.cjs.js +35 -1
  61. package/dist/domains/chat/messages/renderers/message-text.cjs.js.map +1 -1
  62. package/dist/domains/chat/messages/renderers/message-text.es.js +36 -2
  63. package/dist/domains/chat/messages/renderers/message-text.es.js.map +1 -1
  64. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.cjs.js +1 -1
  65. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.es.js +1 -1
  66. package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
  67. package/dist/domains/chat/messages/signal-badge.es.js +1 -1
  68. package/dist/domains/chat/messages/skill-message.cjs.js +2 -2
  69. package/dist/domains/chat/messages/skill-message.es.js +2 -2
  70. package/dist/domains/chat/messages/system-reminder-badge.cjs.js +1 -1
  71. package/dist/domains/chat/messages/system-reminder-badge.es.js +1 -1
  72. package/dist/domains/chat/tools/badges/agent-badge-wrapper.cjs.js +1 -1
  73. package/dist/domains/chat/tools/badges/agent-badge-wrapper.es.js +1 -1
  74. package/dist/domains/chat/tools/badges/agent-badge.cjs.js +1 -1
  75. package/dist/domains/chat/tools/badges/agent-badge.es.js +1 -1
  76. package/dist/domains/chat/tools/badges/file-tree-badge.cjs.js +2 -2
  77. package/dist/domains/chat/tools/badges/file-tree-badge.es.js +2 -2
  78. package/dist/domains/chat/tools/badges/knowledge-body-range.cjs.js +80 -0
  79. package/dist/domains/chat/tools/badges/knowledge-body-range.cjs.js.map +1 -0
  80. package/dist/domains/chat/tools/badges/knowledge-body-range.d.ts +1 -0
  81. package/dist/domains/chat/tools/badges/knowledge-body-range.es.js +78 -0
  82. package/dist/domains/chat/tools/badges/knowledge-body-range.es.js.map +1 -0
  83. package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js +163 -13
  84. package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js.map +1 -1
  85. package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js +165 -15
  86. package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js.map +1 -1
  87. package/dist/domains/chat/tools/badges/mcp-input-request-badge.cjs.js +51 -0
  88. package/dist/domains/chat/tools/badges/mcp-input-request-badge.cjs.js.map +1 -0
  89. package/dist/domains/chat/tools/badges/mcp-input-request-badge.d.ts +1 -0
  90. package/dist/domains/chat/tools/badges/mcp-input-request-badge.es.js +49 -0
  91. package/dist/domains/chat/tools/badges/mcp-input-request-badge.es.js.map +1 -0
  92. package/dist/domains/chat/tools/badges/mcp-task-chip.cjs.js +7 -2
  93. package/dist/domains/chat/tools/badges/mcp-task-chip.cjs.js.map +1 -1
  94. package/dist/domains/chat/tools/badges/mcp-task-chip.es.js +7 -2
  95. package/dist/domains/chat/tools/badges/mcp-task-chip.es.js.map +1 -1
  96. package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +2 -2
  97. package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +2 -2
  98. package/dist/domains/chat/tools/badges/observation-marker-details.cjs.js +2 -2
  99. package/dist/domains/chat/tools/badges/observation-marker-details.es.js +2 -2
  100. package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +1 -1
  101. package/dist/domains/chat/tools/badges/observation-renderer.es.js +1 -1
  102. package/dist/domains/chat/tools/badges/sandbox-execution-badge.cjs.js +2 -2
  103. package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js +2 -2
  104. package/dist/domains/chat/tools/badges/tool-approval-badge.cjs.js +1 -1
  105. package/dist/domains/chat/tools/badges/tool-approval-badge.es.js +1 -1
  106. package/dist/domains/chat/tools/badges/tool-badge.cjs.js +9 -4
  107. package/dist/domains/chat/tools/badges/tool-badge.cjs.js.map +1 -1
  108. package/dist/domains/chat/tools/badges/tool-badge.es.js +9 -4
  109. package/dist/domains/chat/tools/badges/tool-badge.es.js.map +1 -1
  110. package/dist/domains/chat/tools/badges/use-deferred-input-request.cjs.js +81 -0
  111. package/dist/domains/chat/tools/badges/use-deferred-input-request.cjs.js.map +1 -0
  112. package/dist/domains/chat/tools/badges/use-deferred-input-request.d.ts +1 -0
  113. package/dist/domains/chat/tools/badges/use-deferred-input-request.es.js +77 -0
  114. package/dist/domains/chat/tools/badges/use-deferred-input-request.es.js.map +1 -0
  115. package/dist/domains/chat/tools/badges/use-mcp-task-progress.cjs.js +11 -2
  116. package/dist/domains/chat/tools/badges/use-mcp-task-progress.cjs.js.map +1 -1
  117. package/dist/domains/chat/tools/badges/use-mcp-task-progress.es.js +11 -2
  118. package/dist/domains/chat/tools/badges/use-mcp-task-progress.es.js.map +1 -1
  119. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +1 -1
  120. package/dist/domains/chat/tools/badges/workflow-badge.es.js +1 -1
  121. package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js +240 -0
  122. package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js.map +1 -0
  123. package/dist/domains/chat/tools/mcp-input-request-tool.d.ts +1 -0
  124. package/dist/domains/chat/tools/mcp-input-request-tool.es.js +239 -0
  125. package/dist/domains/chat/tools/mcp-input-request-tool.es.js.map +1 -0
  126. package/dist/domains/chat/tools/mcp-input-request.cjs.js +40 -0
  127. package/dist/domains/chat/tools/mcp-input-request.cjs.js.map +1 -0
  128. package/dist/domains/chat/tools/mcp-input-request.d.ts +1 -0
  129. package/dist/domains/chat/tools/mcp-input-request.es.js +33 -0
  130. package/dist/domains/chat/tools/mcp-input-request.es.js.map +1 -0
  131. package/dist/domains/chat/tools/tool-card-kind.cjs.js +8 -3
  132. package/dist/domains/chat/tools/tool-card-kind.cjs.js.map +1 -1
  133. package/dist/domains/chat/tools/tool-card-kind.es.js +8 -4
  134. package/dist/domains/chat/tools/tool-card-kind.es.js.map +1 -1
  135. package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
  136. package/dist/domains/chat/tools/tool-card.es.js +1 -1
  137. package/dist/domains/chat/tools/tool-groups.cjs.js +1 -1
  138. package/dist/domains/chat/tools/tool-groups.es.js +1 -1
  139. package/dist/domains/chat.cjs.js +5 -3
  140. package/dist/domains/chat.es.js +4 -4
  141. package/dist/domains/knowledge/components/KnowledgePageCard.cjs.js +48 -0
  142. package/dist/domains/knowledge/components/KnowledgePageCard.cjs.js.map +1 -0
  143. package/dist/domains/knowledge/components/KnowledgePageCard.d.ts +1 -0
  144. package/dist/domains/knowledge/components/KnowledgePageCard.es.js +47 -0
  145. package/dist/domains/knowledge/components/KnowledgePageCard.es.js.map +1 -0
  146. package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js +63 -5
  147. package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js.map +1 -1
  148. package/dist/domains/knowledge/components/KnowledgePageDetail.es.js +64 -6
  149. package/dist/domains/knowledge/components/KnowledgePageDetail.es.js.map +1 -1
  150. package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js +485 -47
  151. package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js.map +1 -1
  152. package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js +487 -50
  153. package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js.map +1 -1
  154. package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js +1051 -123
  155. package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js.map +1 -1
  156. package/dist/domains/knowledge/components/KnowledgePageGraph.es.js +1054 -126
  157. package/dist/domains/knowledge/components/KnowledgePageGraph.es.js.map +1 -1
  158. package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js +75 -3
  159. package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js.map +1 -1
  160. package/dist/domains/knowledge/components/KnowledgePageTree.es.js +76 -4
  161. package/dist/domains/knowledge/components/KnowledgePageTree.es.js.map +1 -1
  162. package/dist/domains/knowledge/lib/circleText.cjs.js +9 -0
  163. package/dist/domains/knowledge/lib/circleText.cjs.js.map +1 -0
  164. package/dist/domains/knowledge/lib/circleText.d.ts +1 -0
  165. package/dist/domains/knowledge/lib/circleText.es.js +8 -0
  166. package/dist/domains/knowledge/lib/circleText.es.js.map +1 -0
  167. package/dist/domains/knowledge/lib/fitViewport.cjs.js +82 -0
  168. package/dist/domains/knowledge/lib/fitViewport.cjs.js.map +1 -0
  169. package/dist/domains/knowledge/lib/fitViewport.d.ts +1 -0
  170. package/dist/domains/knowledge/lib/fitViewport.es.js +73 -0
  171. package/dist/domains/knowledge/lib/fitViewport.es.js.map +1 -0
  172. package/dist/domains/knowledge/lib/graphShape.cjs.js +524 -0
  173. package/dist/domains/knowledge/lib/graphShape.cjs.js.map +1 -0
  174. package/dist/domains/knowledge/lib/graphShape.d.ts +1 -0
  175. package/dist/domains/knowledge/lib/graphShape.es.js +499 -0
  176. package/dist/domains/knowledge/lib/graphShape.es.js.map +1 -0
  177. package/dist/domains/knowledge/lib/linkCountsText.cjs.js +11 -0
  178. package/dist/domains/knowledge/lib/linkCountsText.cjs.js.map +1 -0
  179. package/dist/domains/knowledge/lib/linkCountsText.d.ts +1 -0
  180. package/dist/domains/knowledge/lib/linkCountsText.es.js +10 -0
  181. package/dist/domains/knowledge/lib/linkCountsText.es.js.map +1 -0
  182. package/dist/domains/knowledge/lib/pageAddress.cjs.js +29 -0
  183. package/dist/domains/knowledge/lib/pageAddress.cjs.js.map +1 -0
  184. package/dist/domains/knowledge/lib/pageAddress.d.ts +1 -0
  185. package/dist/domains/knowledge/lib/pageAddress.es.js +27 -0
  186. package/dist/domains/knowledge/lib/pageAddress.es.js.map +1 -0
  187. package/dist/domains/knowledge/lib/pageGraph.cjs.js +11 -11
  188. package/dist/domains/knowledge/lib/pageGraph.cjs.js.map +1 -1
  189. package/dist/domains/knowledge/lib/pageGraph.es.js +11 -11
  190. package/dist/domains/knowledge/lib/pageGraph.es.js.map +1 -1
  191. package/dist/domains/knowledge/lib/pageRefs.cjs.js +69 -0
  192. package/dist/domains/knowledge/lib/pageRefs.cjs.js.map +1 -0
  193. package/dist/domains/knowledge/lib/pageRefs.d.ts +1 -0
  194. package/dist/domains/knowledge/lib/pageRefs.es.js +66 -0
  195. package/dist/domains/knowledge/lib/pageRefs.es.js.map +1 -0
  196. package/dist/domains/knowledge/lib/pageTree.cjs.js +5 -0
  197. package/dist/domains/knowledge/lib/pageTree.cjs.js.map +1 -1
  198. package/dist/domains/knowledge/lib/pageTree.es.js +5 -1
  199. package/dist/domains/knowledge/lib/pageTree.es.js.map +1 -1
  200. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.cjs.js +82 -0
  201. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.cjs.js.map +1 -0
  202. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.d.ts +1 -0
  203. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.es.js +78 -0
  204. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.es.js.map +1 -0
  205. package/dist/domains/knowledge/lib/tooltipSide.cjs.js +77 -0
  206. package/dist/domains/knowledge/lib/tooltipSide.cjs.js.map +1 -0
  207. package/dist/domains/knowledge/lib/tooltipSide.d.ts +1 -0
  208. package/dist/domains/knowledge/lib/tooltipSide.es.js +75 -0
  209. package/dist/domains/knowledge/lib/tooltipSide.es.js.map +1 -0
  210. package/dist/domains/knowledge/lib/useLeavingNodes.cjs.js +65 -0
  211. package/dist/domains/knowledge/lib/useLeavingNodes.cjs.js.map +1 -0
  212. package/dist/domains/knowledge/lib/useLeavingNodes.d.ts +1 -0
  213. package/dist/domains/knowledge/lib/useLeavingNodes.es.js +62 -0
  214. package/dist/domains/knowledge/lib/useLeavingNodes.es.js.map +1 -0
  215. package/dist/domains/knowledge/lib/useStableWhile.cjs.js +15 -0
  216. package/dist/domains/knowledge/lib/useStableWhile.cjs.js.map +1 -0
  217. package/dist/domains/knowledge/lib/useStableWhile.d.ts +1 -0
  218. package/dist/domains/knowledge/lib/useStableWhile.es.js +14 -0
  219. package/dist/domains/knowledge/lib/useStableWhile.es.js.map +1 -0
  220. package/dist/domains/scores/components/trace-scores-list.cjs.js +2 -2
  221. package/dist/domains/scores/components/trace-scores-list.es.js +2 -2
  222. package/dist/domains/skills/skill-simple-form.cjs.js +1 -1
  223. package/dist/domains/skills/skill-simple-form.es.js +1 -1
  224. package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +1 -1
  225. package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +1 -1
  226. package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +1 -1
  227. package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +1 -1
  228. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +2 -2
  229. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +2 -2
  230. package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +2 -2
  231. package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +2 -2
  232. package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +1 -1
  233. package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +1 -1
  234. package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +1 -1
  235. package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +1 -1
  236. package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +1 -1
  237. package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +1 -1
  238. package/dist/domains/traces/components/span-payload/span-processor-mutations.cjs.js +1 -1
  239. package/dist/domains/traces/components/span-payload/span-processor-mutations.es.js +1 -1
  240. package/dist/domains/traces/components/span-payload/span-tools-section.cjs.js +1 -1
  241. package/dist/domains/traces/components/span-payload/span-tools-section.es.js +1 -1
  242. package/dist/domains/traces/components/span-timeline-row.cjs.js +1 -1
  243. package/dist/domains/traces/components/span-timeline-row.es.js +1 -1
  244. package/dist/domains/traces/components/span-timing-hover-card.cjs.js +1 -1
  245. package/dist/domains/traces/components/span-timing-hover-card.es.js +1 -1
  246. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +8 -2
  247. package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
  248. package/dist/domains/traces/components/trace-data-panel-view.es.js +8 -2
  249. package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
  250. package/dist/domains/traces/components/trace-error-cell.cjs.js +1 -1
  251. package/dist/domains/traces/components/trace-error-cell.es.js +1 -1
  252. package/dist/domains/workflows/runs/workflow-run-list.cjs.js +1 -1
  253. package/dist/domains/workflows/runs/workflow-run-list.es.js +1 -1
  254. package/dist/domains/workflows/workflow/input/workflow-processor-input.cjs.js +2 -2
  255. package/dist/domains/workflows/workflow/input/workflow-processor-input.es.js +2 -2
  256. package/dist/domains/workflows/workflow/use-workflow-trigger.cjs.js +3 -3
  257. package/dist/domains/workflows/workflow/use-workflow-trigger.es.js +3 -3
  258. package/dist/domains/workflows/workflow/workflow-input-data.cjs.js +1 -1
  259. package/dist/domains/workflows/workflow/workflow-input-data.es.js +1 -1
  260. package/dist/domains/workflows/workflow/workflow-suspended-steps.cjs.js +2 -2
  261. package/dist/domains/workflows/workflow/workflow-suspended-steps.es.js +2 -2
  262. package/dist/domains/workflows/workflow/workflow-time-travel-form.cjs.js +2 -2
  263. package/dist/domains/workflows/workflow/workflow-time-travel-form.es.js +2 -2
  264. package/dist/domains/workspace/components/workspace-add-skill-dialog.cjs.js +1 -1
  265. package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js +1 -1
  266. package/dist/domains/workspace/components/workspace-markdown-preview.cjs.js +1 -1
  267. package/dist/domains/workspace/components/workspace-markdown-preview.es.js +1 -1
  268. package/dist/lib/form/dynamic-form.cjs.js +2 -2
  269. package/dist/lib/form/dynamic-form.es.js +2 -2
  270. package/dist/lib/form/json-draft.cjs.js +1 -1
  271. package/dist/lib/form/json-draft.es.js +1 -1
  272. package/dist/lib/form/zod-provider.cjs.js +1 -1
  273. package/dist/lib/form/zod-provider.es.js +1 -1
  274. package/dist/{span-payload-primitives-B3RdahsC.js → span-payload-primitives-CKKIAVPJ.js} +4 -4
  275. package/dist/{span-payload-primitives-B3RdahsC.js.map → span-payload-primitives-CKKIAVPJ.js.map} +1 -1
  276. package/dist/{span-payload-primitives-_2d-pAOD.cjs → span-payload-primitives-D4tHWN2W.cjs} +4 -4
  277. package/dist/{span-payload-primitives-_2d-pAOD.cjs.map → span-payload-primitives-D4tHWN2W.cjs.map} +1 -1
  278. package/dist/src/domains/chat/knowledge/knowledge-links.d.ts +32 -4
  279. package/dist/src/domains/chat/knowledge/pinned-knowledge-data.d.ts +2 -0
  280. package/dist/src/domains/chat/tools/badges/knowledge-body-range.d.ts +12 -0
  281. package/dist/src/domains/chat/tools/badges/knowledge-tool-badge.d.ts +5 -2
  282. package/dist/src/domains/chat/tools/badges/mcp-input-request-badge.d.ts +18 -0
  283. package/dist/src/domains/chat/tools/badges/tool-badge.d.ts +4 -1
  284. package/dist/src/domains/chat/tools/badges/use-deferred-input-request.d.ts +44 -0
  285. package/dist/src/domains/chat/tools/badges/use-mcp-task-progress.d.ts +6 -1
  286. package/dist/src/domains/chat/tools/mcp-input-request-tool.d.ts +18 -0
  287. package/dist/src/domains/chat/tools/mcp-input-request.d.ts +40 -0
  288. package/dist/src/domains/chat/tools/tool-card-kind.d.ts +4 -2
  289. package/dist/src/domains/chat/tools/tool-card.d.ts +1 -1
  290. package/dist/src/domains/knowledge/components/KnowledgePageCard.d.ts +23 -0
  291. package/dist/src/domains/knowledge/components/KnowledgePageExplorer.d.ts +29 -0
  292. package/dist/src/domains/knowledge/components/KnowledgePageGraph.d.ts +27 -1
  293. package/dist/src/domains/knowledge/components/KnowledgePageTree.d.ts +2 -1
  294. package/dist/src/domains/knowledge/lib/circleText.d.ts +2 -0
  295. package/dist/src/domains/knowledge/lib/fitViewport.d.ts +67 -0
  296. package/dist/src/domains/knowledge/lib/graphShape.d.ts +131 -0
  297. package/dist/src/domains/knowledge/lib/linkCountsText.d.ts +5 -0
  298. package/dist/src/domains/knowledge/lib/pageAddress.d.ts +5 -0
  299. package/dist/src/domains/knowledge/lib/pageGraph.d.ts +4 -4
  300. package/dist/src/domains/knowledge/lib/pageRefs.d.ts +15 -0
  301. package/dist/src/domains/knowledge/lib/pageTree.d.ts +2 -0
  302. package/dist/src/domains/knowledge/lib/remarkKnowledgeLinks.d.ts +13 -0
  303. package/dist/src/domains/knowledge/lib/tooltipSide.d.ts +40 -0
  304. package/dist/src/domains/knowledge/lib/useLeavingNodes.d.ts +14 -0
  305. package/dist/src/domains/knowledge/lib/useStableWhile.d.ts +5 -0
  306. package/dist/src/domains/knowledge/pageTypes.d.ts +6 -1
  307. package/dist/src/ds/components/MarkdownRenderer/markdown-renderer.d.ts +8 -1
  308. package/dist/src/ds/components/ai/tool-call/tool-phrases.d.ts +6 -0
  309. package/dist/style.css +69 -2
  310. package/dist/{tool-approval-1qiB4hhG.cjs → tool-approval-CJvPDL7D.cjs} +4 -4
  311. package/dist/{tool-approval-1qiB4hhG.cjs.map → tool-approval-CJvPDL7D.cjs.map} +1 -1
  312. package/dist/{tool-approval-B6MFcaKV.js → tool-approval-DyN11vFA.js} +4 -4
  313. package/dist/{tool-approval-B6MFcaKV.js.map → tool-approval-DyN11vFA.js.map} +1 -1
  314. package/dist/{tool-call-Bu66PkD-.cjs → tool-call-DBn14X-3.cjs} +9 -3
  315. package/dist/{tool-call-Bu66PkD-.cjs.map → tool-call-DBn14X-3.cjs.map} +1 -1
  316. package/dist/{tool-call-Ch9-jjXU.js → tool-call-Dsj43lvJ.js} +9 -3
  317. package/dist/{tool-call-Ch9-jjXU.js.map → tool-call-Dsj43lvJ.js.map} +1 -1
  318. package/dist/{tool-card-DrqPZfPQ.cjs → tool-card-rxhTDpk_.cjs} +164 -126
  319. package/dist/tool-card-rxhTDpk_.cjs.map +1 -0
  320. package/dist/{tool-card-sO6P2Qj4.js → tool-card-toDgoZzJ.js} +165 -127
  321. package/dist/tool-card-toDgoZzJ.js.map +1 -0
  322. package/dist/{tool-presentation-DvCsb_kz.js → tool-presentation-CvibOP1J.js} +6 -1
  323. package/dist/tool-presentation-CvibOP1J.js.map +1 -0
  324. package/dist/{tool-presentation-CQlDEwgS.cjs → tool-presentation-D6nzVruN.cjs} +6 -1
  325. package/dist/tool-presentation-D6nzVruN.cjs.map +1 -0
  326. package/package.json +10 -10
  327. package/dist/MarkdownRenderer-2GOXQJEv.js.map +0 -1
  328. package/dist/MarkdownRenderer-CB8Z_CHc.cjs.map +0 -1
  329. package/dist/domains/knowledge/lib/pageLayout.cjs.js +0 -49
  330. package/dist/domains/knowledge/lib/pageLayout.cjs.js.map +0 -1
  331. package/dist/domains/knowledge/lib/pageLayout.d.ts +0 -1
  332. package/dist/domains/knowledge/lib/pageLayout.es.js +0 -48
  333. package/dist/domains/knowledge/lib/pageLayout.es.js.map +0 -1
  334. package/dist/src/domains/knowledge/lib/pageLayout.d.ts +0 -24
  335. package/dist/tool-card-DrqPZfPQ.cjs.map +0 -1
  336. package/dist/tool-card-sO6P2Qj4.js.map +0 -1
  337. package/dist/tool-presentation-CQlDEwgS.cjs.map +0 -1
  338. package/dist/tool-presentation-DvCsb_kz.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-input-request.cjs.js","names":["isRecord"],"sources":["../../../../src/domains/chat/tools/mcp-input-request.ts"],"sourcesContent":["import type { MessageMetadata, SuspendedToolMetadata } from '../messages/message-metadata';\nimport { isRecord } from '../messages/signal-data';\n\n/** An embedded request an MCP server sent while its task waits (`{ method, params }`). */\nexport interface McpInputRequest {\n method: string;\n params?: Record<string, unknown>;\n}\n\n/** What `@mastra/mcp` suspends a task-backed tool call with (`MCPInputRequestSuspendPayload`). */\nexport interface McpInputRequestPayload {\n type: 'mcp-input-request';\n serverName: string;\n toolName: string;\n taskId: string;\n createdAt: string;\n /** When the call suspended; new each time the same task asks again, unlike `createdAt`. */\n requestedAt?: string;\n requests: Record<string, McpInputRequest>;\n}\n\nexport type McpInputAction = 'accept' | 'decline' | 'cancel';\n\nexport interface McpInputResponse {\n action: McpInputAction;\n content?: Record<string, unknown>;\n}\n\n/** Resume data answering every request key (`MCPInputRequestResumeData`). */\nexport interface McpInputResumeData {\n inputResponses: Record<string, McpInputResponse>;\n}\n\nexport function isMcpInputRequest(payload: unknown): payload is McpInputRequestPayload {\n return (\n isRecord(payload) &&\n payload.type === 'mcp-input-request' &&\n typeof payload.serverName === 'string' &&\n typeof payload.toolName === 'string' &&\n typeof payload.taskId === 'string' &&\n typeof payload.createdAt === 'string' &&\n isRecord(payload.requests) &&\n Object.values(payload.requests).every(request => isRecord(request) && typeof request.method === 'string')\n );\n}\n\n/** More questions at once than any real task asks; the server decides these, so Studio bounds them. */\nexport const MAX_INPUT_REQUESTS = 20;\nexport const MAX_REQUEST_MESSAGE_LENGTH = 2_000;\nexport const MAX_INPUT_REQUESTS_SIZE = 64 * 1024;\n\n/** Whether the server sent more than Studio draws: too many questions, a huge message, or huge params. */\nexport function inputRequestTooLarge(payload: McpInputRequestPayload): boolean {\n const requests = Object.values(payload.requests);\n if (requests.length > MAX_INPUT_REQUESTS) return true;\n if (\n requests.some(\n request =>\n typeof request.params?.message === 'string' && request.params.message.length > MAX_REQUEST_MESSAGE_LENGTH,\n )\n ) {\n return true;\n }\n return JSON.stringify(payload.requests).length > MAX_INPUT_REQUESTS_SIZE;\n}\n\n/**\n * This call's own suspension. Saved entries are keyed by call id, but a live run keys them by tool\n * name (two calls of one tool share that key), so the entry's own `toolCallId` decides.\n */\nexport function findSuspension(\n metadata: MessageMetadata | undefined,\n toolCallId: string,\n): SuspendedToolMetadata | undefined {\n const suspensions = metadata?.suspendedTools;\n if (!suspensions) return undefined;\n return Object.values(suspensions).find(entry => entry?.toolCallId === toolCallId);\n}\n\n/** The MCP input request this call is suspended on, if it is. */\nexport function suspendedMcpInputRequest(\n metadata: MessageMetadata | undefined,\n toolCallId: string,\n): McpInputRequestPayload | undefined {\n const payload = findSuspension(metadata, toolCallId)?.suspendPayload;\n return isMcpInputRequest(payload) ? payload : undefined;\n}\n"],"mappings":";;;AAiCA,SAAgB,kBAAkB,SAAqD;CACrF,OACEA,0CAAAA,SAAS,OAAO,KAChB,QAAQ,SAAS,uBACjB,OAAO,QAAQ,eAAe,YAC9B,OAAO,QAAQ,aAAa,YAC5B,OAAO,QAAQ,WAAW,YAC1B,OAAO,QAAQ,cAAc,YAC7BA,0CAAAA,SAAS,QAAQ,QAAQ,KACzB,OAAO,OAAO,QAAQ,QAAQ,CAAC,CAAC,OAAM,YAAWA,0CAAAA,SAAS,OAAO,KAAK,OAAO,QAAQ,WAAW,QAAQ;AAE5G;;AAGA,IAAa,qBAAqB;AAClC,IAAa,6BAA6B;AAC1C,IAAa,0BAA0B;;AAGvC,SAAgB,qBAAqB,SAA0C;CAC7E,MAAM,WAAW,OAAO,OAAO,QAAQ,QAAQ;CAC/C,IAAI,SAAS,SAAA,IAA6B,OAAO;CACjD,IACE,SAAS,MACP,YACE,OAAO,QAAQ,QAAQ,YAAY,YAAY,QAAQ,OAAO,QAAQ,SAAA,GAC1E,GAEA,OAAO;CAET,OAAO,KAAK,UAAU,QAAQ,QAAQ,CAAC,CAAC,SAAS;AACnD;;;;;AAMA,SAAgB,eACd,UACA,YACmC;CACnC,MAAM,cAAc,UAAU;CAC9B,IAAI,CAAC,aAAa,OAAO,KAAA;CACzB,OAAO,OAAO,OAAO,WAAW,CAAC,CAAC,MAAK,UAAS,OAAO,eAAe,UAAU;AAClF;;AAGA,SAAgB,yBACd,UACA,YACoC;CACpC,MAAM,UAAU,eAAe,UAAU,UAAU,CAAC,EAAE;CACtD,OAAO,kBAAkB,OAAO,IAAI,UAAU,KAAA;AAChD"}
@@ -0,0 +1 @@
1
+ export * from '../../../src/domains/chat/tools/mcp-input-request';
@@ -0,0 +1,33 @@
1
+ import { isRecord } from "../messages/signal-data.es.js";
2
+ // src/domains/chat/tools/mcp-input-request.ts
3
+ function isMcpInputRequest(payload) {
4
+ return isRecord(payload) && payload.type === "mcp-input-request" && typeof payload.serverName === "string" && typeof payload.toolName === "string" && typeof payload.taskId === "string" && typeof payload.createdAt === "string" && isRecord(payload.requests) && Object.values(payload.requests).every((request) => isRecord(request) && typeof request.method === "string");
5
+ }
6
+ /** More questions at once than any real task asks; the server decides these, so Studio bounds them. */
7
+ var MAX_INPUT_REQUESTS = 20;
8
+ var MAX_REQUEST_MESSAGE_LENGTH = 2e3;
9
+ var MAX_INPUT_REQUESTS_SIZE = 65536;
10
+ /** Whether the server sent more than Studio draws: too many questions, a huge message, or huge params. */
11
+ function inputRequestTooLarge(payload) {
12
+ const requests = Object.values(payload.requests);
13
+ if (requests.length > 20) return true;
14
+ if (requests.some((request) => typeof request.params?.message === "string" && request.params.message.length > 2e3)) return true;
15
+ return JSON.stringify(payload.requests).length > MAX_INPUT_REQUESTS_SIZE;
16
+ }
17
+ /**
18
+ * This call's own suspension. Saved entries are keyed by call id, but a live run keys them by tool
19
+ * name (two calls of one tool share that key), so the entry's own `toolCallId` decides.
20
+ */
21
+ function findSuspension(metadata, toolCallId) {
22
+ const suspensions = metadata?.suspendedTools;
23
+ if (!suspensions) return void 0;
24
+ return Object.values(suspensions).find((entry) => entry?.toolCallId === toolCallId);
25
+ }
26
+ /** The MCP input request this call is suspended on, if it is. */
27
+ function suspendedMcpInputRequest(metadata, toolCallId) {
28
+ const payload = findSuspension(metadata, toolCallId)?.suspendPayload;
29
+ return isMcpInputRequest(payload) ? payload : void 0;
30
+ }
31
+ export { MAX_INPUT_REQUESTS, MAX_INPUT_REQUESTS_SIZE, MAX_REQUEST_MESSAGE_LENGTH, findSuspension, inputRequestTooLarge, isMcpInputRequest, suspendedMcpInputRequest };
32
+
33
+ //# sourceMappingURL=mcp-input-request.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-input-request.es.js","names":[],"sources":["../../../../src/domains/chat/tools/mcp-input-request.ts"],"sourcesContent":["import type { MessageMetadata, SuspendedToolMetadata } from '../messages/message-metadata';\nimport { isRecord } from '../messages/signal-data';\n\n/** An embedded request an MCP server sent while its task waits (`{ method, params }`). */\nexport interface McpInputRequest {\n method: string;\n params?: Record<string, unknown>;\n}\n\n/** What `@mastra/mcp` suspends a task-backed tool call with (`MCPInputRequestSuspendPayload`). */\nexport interface McpInputRequestPayload {\n type: 'mcp-input-request';\n serverName: string;\n toolName: string;\n taskId: string;\n createdAt: string;\n /** When the call suspended; new each time the same task asks again, unlike `createdAt`. */\n requestedAt?: string;\n requests: Record<string, McpInputRequest>;\n}\n\nexport type McpInputAction = 'accept' | 'decline' | 'cancel';\n\nexport interface McpInputResponse {\n action: McpInputAction;\n content?: Record<string, unknown>;\n}\n\n/** Resume data answering every request key (`MCPInputRequestResumeData`). */\nexport interface McpInputResumeData {\n inputResponses: Record<string, McpInputResponse>;\n}\n\nexport function isMcpInputRequest(payload: unknown): payload is McpInputRequestPayload {\n return (\n isRecord(payload) &&\n payload.type === 'mcp-input-request' &&\n typeof payload.serverName === 'string' &&\n typeof payload.toolName === 'string' &&\n typeof payload.taskId === 'string' &&\n typeof payload.createdAt === 'string' &&\n isRecord(payload.requests) &&\n Object.values(payload.requests).every(request => isRecord(request) && typeof request.method === 'string')\n );\n}\n\n/** More questions at once than any real task asks; the server decides these, so Studio bounds them. */\nexport const MAX_INPUT_REQUESTS = 20;\nexport const MAX_REQUEST_MESSAGE_LENGTH = 2_000;\nexport const MAX_INPUT_REQUESTS_SIZE = 64 * 1024;\n\n/** Whether the server sent more than Studio draws: too many questions, a huge message, or huge params. */\nexport function inputRequestTooLarge(payload: McpInputRequestPayload): boolean {\n const requests = Object.values(payload.requests);\n if (requests.length > MAX_INPUT_REQUESTS) return true;\n if (\n requests.some(\n request =>\n typeof request.params?.message === 'string' && request.params.message.length > MAX_REQUEST_MESSAGE_LENGTH,\n )\n ) {\n return true;\n }\n return JSON.stringify(payload.requests).length > MAX_INPUT_REQUESTS_SIZE;\n}\n\n/**\n * This call's own suspension. Saved entries are keyed by call id, but a live run keys them by tool\n * name (two calls of one tool share that key), so the entry's own `toolCallId` decides.\n */\nexport function findSuspension(\n metadata: MessageMetadata | undefined,\n toolCallId: string,\n): SuspendedToolMetadata | undefined {\n const suspensions = metadata?.suspendedTools;\n if (!suspensions) return undefined;\n return Object.values(suspensions).find(entry => entry?.toolCallId === toolCallId);\n}\n\n/** The MCP input request this call is suspended on, if it is. */\nexport function suspendedMcpInputRequest(\n metadata: MessageMetadata | undefined,\n toolCallId: string,\n): McpInputRequestPayload | undefined {\n const payload = findSuspension(metadata, toolCallId)?.suspendPayload;\n return isMcpInputRequest(payload) ? payload : undefined;\n}\n"],"mappings":";;AAiCA,SAAgB,kBAAkB,SAAqD;CACrF,OACE,SAAS,OAAO,KAChB,QAAQ,SAAS,uBACjB,OAAO,QAAQ,eAAe,YAC9B,OAAO,QAAQ,aAAa,YAC5B,OAAO,QAAQ,WAAW,YAC1B,OAAO,QAAQ,cAAc,YAC7B,SAAS,QAAQ,QAAQ,KACzB,OAAO,OAAO,QAAQ,QAAQ,CAAC,CAAC,OAAM,YAAW,SAAS,OAAO,KAAK,OAAO,QAAQ,WAAW,QAAQ;AAE5G;;AAGA,IAAa,qBAAqB;AAClC,IAAa,6BAA6B;AAC1C,IAAa,0BAA0B;;AAGvC,SAAgB,qBAAqB,SAA0C;CAC7E,MAAM,WAAW,OAAO,OAAO,QAAQ,QAAQ;CAC/C,IAAI,SAAS,SAAA,IAA6B,OAAO;CACjD,IACE,SAAS,MACP,YACE,OAAO,QAAQ,QAAQ,YAAY,YAAY,QAAQ,OAAO,QAAQ,SAAA,GAC1E,GAEA,OAAO;CAET,OAAO,KAAK,UAAU,QAAQ,QAAQ,CAAC,CAAC,SAAS;AACnD;;;;;AAMA,SAAgB,eACd,UACA,YACmC;CACnC,MAAM,cAAc,UAAU;CAC9B,IAAI,CAAC,aAAa,OAAO,KAAA;CACzB,OAAO,OAAO,OAAO,WAAW,CAAC,CAAC,MAAK,UAAS,OAAO,eAAe,UAAU;AAClF;;AAGA,SAAgB,yBACd,UACA,YACoC;CACpC,MAAM,UAAU,eAAe,UAAU,UAAU,CAAC,EAAE;CACtD,OAAO,kBAAkB,OAAO,IAAI,UAAU,KAAA;AAChD"}
@@ -1,9 +1,10 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_tool_presentation = require("../../../tool-presentation-CQlDEwgS.cjs");
2
+ const require_tool_presentation = require("../../../tool-presentation-D6nzVruN.cjs");
3
3
  const require_domains_chat_messages_signal_data = require("../messages/signal-data.cjs.js");
4
4
  const require_domains_chat_tools_badges_knowledge_tool_badge = require("./badges/knowledge-tool-badge.cjs.js");
5
5
  const require_domains_chat_tools_code_mode = require("./code-mode.cjs.js");
6
6
  require("./connect-prompt-tool-id.cjs.js");
7
+ const require_domains_chat_tools_mcp_input_request = require("./mcp-input-request.cjs.js");
7
8
  require("./submit-plan-tool-id.cjs.js");
8
9
  const require_domains_chat_tools_workspace_tool_constants = require("./workspace-tool-constants.cjs.js");
9
10
  const require_domains_connect_types = require("../../connect/types.cjs.js");
@@ -18,6 +19,8 @@ var isNetworkFrom = (metadata, from) => metadata?.mode === "network" && metadata
18
19
  var isAgentCall = (metadata, toolName) => isNetworkFrom(metadata, "AGENT") || toolName.startsWith("agent-");
19
20
  var isWorkflowCall = (metadata, toolName) => isNetworkFrom(metadata, "WORKFLOW") || toolName.startsWith("workflow-");
20
21
  var isSettledState = (state) => state === "output-available" || state === "result";
22
+ /** A call running as a Mastra background task. An awaited call's part also names its task, but holds the final result. */
23
+ var isDeferredCall = (backgroundTaskId, backgroundTaskStatus) => backgroundTaskId !== void 0 && backgroundTaskStatus !== "completed" && backgroundTaskStatus !== "failed";
21
24
  /** A call neither settled nor carried by a live run reads as idle, so stale history never shimmers. */
22
25
  function badgeStatus(state, chatRunning) {
23
26
  if (state === "output-error") return "error";
@@ -39,13 +42,14 @@ function toolInteraction(metadata, toolName, toolCallId) {
39
42
  function isHiddenTool(toolName) {
40
43
  return toolName === "updateWorkingMemory" || require_tool_presentation.isTaskTool(toolName);
41
44
  }
42
- function toolCardKind({ toolName, toolCallId, input, output, state }, { metadata, mcpAppTools }) {
45
+ function toolCardKind({ toolName, toolCallId, input, output, state, backgroundTaskId, backgroundTaskStatus }, { metadata, mcpAppTools }) {
43
46
  if (toolName === "mastra-memory-om-observation") return "observation";
44
47
  if (isHiddenTool(toolName)) return "hidden";
45
48
  if (toolName === "ask_user") return "ask_user";
46
49
  if (toolName === "request_connection" && require_domains_connect_types.isConnectPromptPayload(output)) return "connect_prompt";
47
50
  const { suspended } = toolInteraction(metadata, toolName, toolCallId);
48
51
  if (toolName === "submit_plan" || hasSubmitPlanToolId(suspended?.suspendPayload) || hasSubmitPlanToolId(output)) return "submit_plan";
52
+ if (!isDeferredCall(backgroundTaskId, backgroundTaskStatus) && require_domains_chat_tools_mcp_input_request.suspendedMcpInputRequest(metadata, toolCallId)) return "mcp_input_request";
49
53
  if (typeof output === "string" && output.toLowerCase().includes("background task")) return "background";
50
54
  if (isAgentCall(metadata, toolName)) return "agent";
51
55
  if (isWorkflowCall(metadata, toolName)) return "workflow";
@@ -53,12 +57,13 @@ function toolCardKind({ toolName, toolCallId, input, output, state }, { metadata
53
57
  if (SANDBOX_TOOLS.has(toolName)) return "sandbox";
54
58
  if (codeModeCall(input, output)) return "code_mode";
55
59
  if (mcpAppTools?.[toolName]) return "mcp_app";
56
- if (require_domains_chat_tools_badges_knowledge_tool_badge.KNOWLEDGE_TOOLS.has(toolName) && isSettledState(state) && require_domains_chat_tools_badges_knowledge_tool_badge.knowledgeCard(toolName, input, output)) return "knowledge";
60
+ if (require_domains_chat_tools_badges_knowledge_tool_badge.KNOWLEDGE_TOOLS.has(toolName) && (state === "output-error" || isSettledState(state) && require_domains_chat_tools_badges_knowledge_tool_badge.knowledgeCard(toolName, input, output))) return "knowledge";
57
61
  return "plain";
58
62
  }
59
63
  exports.badgeStatus = badgeStatus;
60
64
  exports.codeModeCall = codeModeCall;
61
65
  exports.isAgentCall = isAgentCall;
66
+ exports.isDeferredCall = isDeferredCall;
62
67
  exports.isHiddenTool = isHiddenTool;
63
68
  exports.isSettledState = isSettledState;
64
69
  exports.isWorkflowCall = isWorkflowCall;
@@ -1 +1 @@
1
- {"version":3,"file":"tool-card-kind.cjs.js","names":["WORKSPACE_TOOLS","isRecord","getCodeModeCall","isTaskTool","isConnectPromptPayload","KNOWLEDGE_TOOLS","knowledgeCard"],"sources":["../../../../src/domains/chat/tools/tool-card-kind.ts"],"sourcesContent":["import type { MessageMetadata, SuspendedToolMetadata, ToolApprovalMetadata } from '../messages/message-metadata';\nimport type { ToolPartFields } from '../messages/renderers/tool-part';\nimport { isRecord } from '../messages/signal-data';\nimport { KNOWLEDGE_TOOLS, knowledgeCard } from './badges/knowledge-tool-badge';\nimport { getCodeModeCall } from './code-mode';\nimport { CONNECT_PROMPT_TOOL_NAME } from './connect-prompt-tool-id';\nimport { SUBMIT_PLAN_TOOL_ID } from './submit-plan-tool-id';\nimport { WORKSPACE_TOOLS } from './workspace-tool-constants';\nimport { isConnectPromptPayload } from '@/domains/connect/types';\nimport type { ActivityStatus } from '@/ds/components/ai/activity';\nimport { isTaskTool } from '@/ds/components/ai/tool-call';\n\n/** Which card draws a call. Decided once, shared by the dispatcher and the fold. */\nexport type ToolCardKind =\n | 'hidden'\n | 'observation'\n | 'ask_user'\n | 'connect_prompt'\n | 'submit_plan'\n | 'background'\n | 'agent'\n | 'workflow'\n | 'file_tree'\n | 'sandbox'\n | 'code_mode'\n | 'mcp_app'\n | 'knowledge'\n | 'plain';\n\nexport interface ToolCardContext {\n metadata?: MessageMetadata;\n mcpAppTools?: Record<string, unknown>;\n}\n\nexport interface ToolInteraction {\n approval?: ToolApprovalMetadata;\n suspended?: SuspendedToolMetadata;\n}\n\nconst SANDBOX_TOOLS = new Set<string>([\n WORKSPACE_TOOLS.SANDBOX.EXECUTE_COMMAND,\n WORKSPACE_TOOLS.SANDBOX.GET_PROCESS_OUTPUT,\n WORKSPACE_TOOLS.SANDBOX.KILL_PROCESS,\n]);\n\nconst hasSubmitPlanToolId = (value: unknown): boolean => isRecord(value) && value.toolId === SUBMIT_PLAN_TOOL_ID;\n\nconst isNetworkFrom = (metadata: MessageMetadata | undefined, from: string): boolean =>\n metadata?.mode === 'network' && metadata.from === from;\n\nexport const isAgentCall = (metadata: MessageMetadata | undefined, toolName: string): boolean =>\n isNetworkFrom(metadata, 'AGENT') || toolName.startsWith('agent-');\n\nexport const isWorkflowCall = (metadata: MessageMetadata | undefined, toolName: string): boolean =>\n isNetworkFrom(metadata, 'WORKFLOW') || toolName.startsWith('workflow-');\n\nexport const isSettledState = (state: string | undefined): boolean =>\n state === 'output-available' || state === 'result';\n\n/** A call neither settled nor carried by a live run reads as idle, so stale history never shimmers. */\nexport function badgeStatus(state: string | undefined, chatRunning: boolean): ActivityStatus {\n if (state === 'output-error') return 'error';\n if (isSettledState(state) || !chatRunning) return 'idle';\n return 'running';\n}\n\nexport const codeModeCall = (input: unknown, output: unknown) =>\n isRecord(input) || typeof input === 'string' ? getCodeModeCall(input, output) : null;\n\n/** Approval and suspension land keyed by tool name on older runs and by call id on newer ones. */\nexport function toolInteraction(\n metadata: MessageMetadata | undefined,\n toolName: string,\n toolCallId: string,\n): ToolInteraction {\n const approvals = metadata?.requireApprovalMetadata;\n const suspensions = metadata?.suspendedTools;\n const namedApproval = approvals?.[toolName];\n return {\n approval:\n metadata?.mode === 'network'\n ? namedApproval?.toolCallId === toolCallId\n ? namedApproval\n : approvals?.[toolCallId]\n : (approvals?.[toolCallId] ??\n Object.values(approvals ?? {}).find(approval => approval.toolCallId === toolCallId)),\n suspended: suspensions?.[toolName] ?? suspensions?.[toolCallId],\n };\n}\n\n/** Tools the transcript never draws: working memory updates and task tools (shown in the docked task list). */\nexport function isHiddenTool(toolName: string): boolean {\n return toolName === 'updateWorkingMemory' || isTaskTool(toolName);\n}\n\nexport function toolCardKind(\n { toolName, toolCallId, input, output, state }: ToolPartFields,\n { metadata, mcpAppTools }: ToolCardContext,\n): ToolCardKind {\n if (toolName === 'mastra-memory-om-observation') return 'observation';\n if (isHiddenTool(toolName)) return 'hidden';\n // A question read back in history draws as a plain badge, but it is still a question: never folded away.\n if (toolName === 'ask_user') return 'ask_user';\n // Built-in `request_connection` tool from `@mastra/connect`: a settled call renders\n // as an interactive connect card; while running it falls back to a plain badge.\n if (toolName === CONNECT_PROMPT_TOOL_NAME && isConnectPromptPayload(output)) return 'connect_prompt';\n const { suspended } = toolInteraction(metadata, toolName, toolCallId);\n if (\n toolName === SUBMIT_PLAN_TOOL_ID ||\n hasSubmitPlanToolId(suspended?.suspendPayload) ||\n hasSubmitPlanToolId(output)\n ) {\n return 'submit_plan';\n }\n if (typeof output === 'string' && output.toLowerCase().includes('background task')) return 'background';\n if (isAgentCall(metadata, toolName)) return 'agent';\n if (isWorkflowCall(metadata, toolName)) return 'workflow';\n if (toolName === WORKSPACE_TOOLS.FILESYSTEM.LIST_FILES) return 'file_tree';\n if (SANDBOX_TOOLS.has(toolName)) return 'sandbox';\n if (codeModeCall(input, output)) return 'code_mode';\n if (mcpAppTools?.[toolName]) return 'mcp_app';\n // A settled Knowledge result draws as a readable card; while running or failed it stays a plain badge.\n if (KNOWLEDGE_TOOLS.has(toolName) && isSettledState(state) && knowledgeCard(toolName, input, output)) {\n return 'knowledge';\n }\n return 'plain';\n}\n"],"mappings":";;;;;;;;;;AAuCA,IAAM,gCAAgB,IAAI,IAAY;CACpCA,oDAAAA,gBAAgB,QAAQ;CACxBA,oDAAAA,gBAAgB,QAAQ;CACxBA,oDAAAA,gBAAgB,QAAQ;AAC1B,CAAC;AAED,IAAM,uBAAuB,UAA4BC,0CAAAA,SAAS,KAAK,KAAK,MAAM,WAAA;AAElF,IAAM,iBAAiB,UAAuC,SAC5D,UAAU,SAAS,aAAa,SAAS,SAAS;AAEpD,IAAa,eAAe,UAAuC,aACjE,cAAc,UAAU,OAAO,KAAK,SAAS,WAAW,QAAQ;AAElE,IAAa,kBAAkB,UAAuC,aACpE,cAAc,UAAU,UAAU,KAAK,SAAS,WAAW,WAAW;AAExE,IAAa,kBAAkB,UAC7B,UAAU,sBAAsB,UAAU;;AAG5C,SAAgB,YAAY,OAA2B,aAAsC;CAC3F,IAAI,UAAU,gBAAgB,OAAO;CACrC,IAAI,eAAe,KAAK,KAAK,CAAC,aAAa,OAAO;CAClD,OAAO;AACT;AAEA,IAAa,gBAAgB,OAAgB,WAC3CA,0CAAAA,SAAS,KAAK,KAAK,OAAO,UAAU,WAAWC,qCAAAA,gBAAgB,OAAO,MAAM,IAAI;;AAGlF,SAAgB,gBACd,UACA,UACA,YACiB;CACjB,MAAM,YAAY,UAAU;CAC5B,MAAM,cAAc,UAAU;CAC9B,MAAM,gBAAgB,YAAY;CAClC,OAAO;EACL,UACE,UAAU,SAAS,YACf,eAAe,eAAe,aAC5B,gBACA,YAAY,cACb,YAAY,eACb,OAAO,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,MAAK,aAAY,SAAS,eAAe,UAAU;EACxF,WAAW,cAAc,aAAa,cAAc;CACtD;AACF;;AAGA,SAAgB,aAAa,UAA2B;CACtD,OAAO,aAAa,yBAAyBC,0BAAAA,WAAW,QAAQ;AAClE;AAEA,SAAgB,aACd,EAAE,UAAU,YAAY,OAAO,QAAQ,SACvC,EAAE,UAAU,eACE;CACd,IAAI,aAAa,gCAAgC,OAAO;CACxD,IAAI,aAAa,QAAQ,GAAG,OAAO;CAEnC,IAAI,aAAa,YAAY,OAAO;CAGpC,IAAI,aAAA,wBAAyCC,8BAAAA,uBAAuB,MAAM,GAAG,OAAO;CACpF,MAAM,EAAE,cAAc,gBAAgB,UAAU,UAAU,UAAU;CACpE,IACE,aAAA,iBACA,oBAAoB,WAAW,cAAc,KAC7C,oBAAoB,MAAM,GAE1B,OAAO;CAET,IAAI,OAAO,WAAW,YAAY,OAAO,YAAY,CAAC,CAAC,SAAS,iBAAiB,GAAG,OAAO;CAC3F,IAAI,YAAY,UAAU,QAAQ,GAAG,OAAO;CAC5C,IAAI,eAAe,UAAU,QAAQ,GAAG,OAAO;CAC/C,IAAI,aAAaJ,oDAAAA,gBAAgB,WAAW,YAAY,OAAO;CAC/D,IAAI,cAAc,IAAI,QAAQ,GAAG,OAAO;CACxC,IAAI,aAAa,OAAO,MAAM,GAAG,OAAO;CACxC,IAAI,cAAc,WAAW,OAAO;CAEpC,IAAIK,uDAAAA,gBAAgB,IAAI,QAAQ,KAAK,eAAe,KAAK,KAAKC,uDAAAA,cAAc,UAAU,OAAO,MAAM,GACjG,OAAO;CAET,OAAO;AACT"}
1
+ {"version":3,"file":"tool-card-kind.cjs.js","names":["WORKSPACE_TOOLS","isRecord","getCodeModeCall","isTaskTool","isConnectPromptPayload","suspendedMcpInputRequest","KNOWLEDGE_TOOLS","knowledgeCard"],"sources":["../../../../src/domains/chat/tools/tool-card-kind.ts"],"sourcesContent":["import type { MessageMetadata, SuspendedToolMetadata, ToolApprovalMetadata } from '../messages/message-metadata';\nimport type { ToolPartFields } from '../messages/renderers/tool-part';\nimport { isRecord } from '../messages/signal-data';\nimport { KNOWLEDGE_TOOLS, knowledgeCard } from './badges/knowledge-tool-badge';\nimport { getCodeModeCall } from './code-mode';\nimport { CONNECT_PROMPT_TOOL_NAME } from './connect-prompt-tool-id';\nimport { suspendedMcpInputRequest } from './mcp-input-request';\nimport { SUBMIT_PLAN_TOOL_ID } from './submit-plan-tool-id';\nimport { WORKSPACE_TOOLS } from './workspace-tool-constants';\nimport { isConnectPromptPayload } from '@/domains/connect/types';\nimport type { ActivityStatus } from '@/ds/components/ai/activity';\nimport { isTaskTool } from '@/ds/components/ai/tool-call';\n\n/** Which card draws a call. Decided once, shared by the dispatcher and the fold. */\nexport type ToolCardKind =\n | 'hidden'\n | 'observation'\n | 'ask_user'\n | 'connect_prompt'\n | 'submit_plan'\n | 'mcp_input_request'\n | 'background'\n | 'agent'\n | 'workflow'\n | 'file_tree'\n | 'sandbox'\n | 'code_mode'\n | 'mcp_app'\n | 'knowledge'\n | 'plain';\n\nexport interface ToolCardContext {\n metadata?: MessageMetadata;\n mcpAppTools?: Record<string, unknown>;\n}\n\nexport interface ToolInteraction {\n approval?: ToolApprovalMetadata;\n suspended?: SuspendedToolMetadata;\n}\n\nconst SANDBOX_TOOLS = new Set<string>([\n WORKSPACE_TOOLS.SANDBOX.EXECUTE_COMMAND,\n WORKSPACE_TOOLS.SANDBOX.GET_PROCESS_OUTPUT,\n WORKSPACE_TOOLS.SANDBOX.KILL_PROCESS,\n]);\n\nconst hasSubmitPlanToolId = (value: unknown): boolean => isRecord(value) && value.toolId === SUBMIT_PLAN_TOOL_ID;\n\nconst isNetworkFrom = (metadata: MessageMetadata | undefined, from: string): boolean =>\n metadata?.mode === 'network' && metadata.from === from;\n\nexport const isAgentCall = (metadata: MessageMetadata | undefined, toolName: string): boolean =>\n isNetworkFrom(metadata, 'AGENT') || toolName.startsWith('agent-');\n\nexport const isWorkflowCall = (metadata: MessageMetadata | undefined, toolName: string): boolean =>\n isNetworkFrom(metadata, 'WORKFLOW') || toolName.startsWith('workflow-');\n\nexport const isSettledState = (state: string | undefined): boolean =>\n state === 'output-available' || state === 'result';\n\n/** A call running as a Mastra background task. An awaited call's part also names its task, but holds the final result. */\nexport const isDeferredCall = (backgroundTaskId: string | undefined, backgroundTaskStatus: string | undefined) =>\n backgroundTaskId !== undefined && backgroundTaskStatus !== 'completed' && backgroundTaskStatus !== 'failed';\n\n/** A call neither settled nor carried by a live run reads as idle, so stale history never shimmers. */\nexport function badgeStatus(state: string | undefined, chatRunning: boolean): ActivityStatus {\n if (state === 'output-error') return 'error';\n if (isSettledState(state) || !chatRunning) return 'idle';\n return 'running';\n}\n\nexport const codeModeCall = (input: unknown, output: unknown) =>\n isRecord(input) || typeof input === 'string' ? getCodeModeCall(input, output) : null;\n\n/** Approval and suspension land keyed by tool name on older runs and by call id on newer ones. */\nexport function toolInteraction(\n metadata: MessageMetadata | undefined,\n toolName: string,\n toolCallId: string,\n): ToolInteraction {\n const approvals = metadata?.requireApprovalMetadata;\n const suspensions = metadata?.suspendedTools;\n const namedApproval = approvals?.[toolName];\n return {\n approval:\n metadata?.mode === 'network'\n ? namedApproval?.toolCallId === toolCallId\n ? namedApproval\n : approvals?.[toolCallId]\n : (approvals?.[toolCallId] ??\n Object.values(approvals ?? {}).find(approval => approval.toolCallId === toolCallId)),\n suspended: suspensions?.[toolName] ?? suspensions?.[toolCallId],\n };\n}\n\n/** Tools the transcript never draws: working memory updates and task tools (shown in the docked task list). */\nexport function isHiddenTool(toolName: string): boolean {\n return toolName === 'updateWorkingMemory' || isTaskTool(toolName);\n}\n\nexport function toolCardKind(\n { toolName, toolCallId, input, output, state, backgroundTaskId, backgroundTaskStatus }: ToolPartFields,\n { metadata, mcpAppTools }: ToolCardContext,\n): ToolCardKind {\n if (toolName === 'mastra-memory-om-observation') return 'observation';\n if (isHiddenTool(toolName)) return 'hidden';\n // A question read back in history draws as a plain badge, but it is still a question: never folded away.\n if (toolName === 'ask_user') return 'ask_user';\n // Built-in `request_connection` tool from `@mastra/connect`: a settled call renders\n // as an interactive connect card; while running it falls back to a plain badge.\n if (toolName === CONNECT_PROMPT_TOOL_NAME && isConnectPromptPayload(output)) return 'connect_prompt';\n const { suspended } = toolInteraction(metadata, toolName, toolCallId);\n if (\n toolName === SUBMIT_PLAN_TOOL_ID ||\n hasSubmitPlanToolId(suspended?.suspendPayload) ||\n hasSubmitPlanToolId(output)\n ) {\n return 'submit_plan';\n }\n // A foreground call parked on an MCP task's question: the run waits for the answer. A deferred\n // call's question lives on its background task instead, which the background card reads.\n if (!isDeferredCall(backgroundTaskId, backgroundTaskStatus) && suspendedMcpInputRequest(metadata, toolCallId)) {\n return 'mcp_input_request';\n }\n if (typeof output === 'string' && output.toLowerCase().includes('background task')) return 'background';\n if (isAgentCall(metadata, toolName)) return 'agent';\n if (isWorkflowCall(metadata, toolName)) return 'workflow';\n if (toolName === WORKSPACE_TOOLS.FILESYSTEM.LIST_FILES) return 'file_tree';\n if (SANDBOX_TOOLS.has(toolName)) return 'sandbox';\n if (codeModeCall(input, output)) return 'code_mode';\n if (mcpAppTools?.[toolName]) return 'mcp_app';\n // A settled or failed Knowledge call draws as a readable card; while running it stays a plain badge.\n if (\n KNOWLEDGE_TOOLS.has(toolName) &&\n (state === 'output-error' || (isSettledState(state) && knowledgeCard(toolName, input, output)))\n ) {\n return 'knowledge';\n }\n return 'plain';\n}\n"],"mappings":";;;;;;;;;;;AAyCA,IAAM,gCAAgB,IAAI,IAAY;CACpCA,oDAAAA,gBAAgB,QAAQ;CACxBA,oDAAAA,gBAAgB,QAAQ;CACxBA,oDAAAA,gBAAgB,QAAQ;AAC1B,CAAC;AAED,IAAM,uBAAuB,UAA4BC,0CAAAA,SAAS,KAAK,KAAK,MAAM,WAAA;AAElF,IAAM,iBAAiB,UAAuC,SAC5D,UAAU,SAAS,aAAa,SAAS,SAAS;AAEpD,IAAa,eAAe,UAAuC,aACjE,cAAc,UAAU,OAAO,KAAK,SAAS,WAAW,QAAQ;AAElE,IAAa,kBAAkB,UAAuC,aACpE,cAAc,UAAU,UAAU,KAAK,SAAS,WAAW,WAAW;AAExE,IAAa,kBAAkB,UAC7B,UAAU,sBAAsB,UAAU;;AAG5C,IAAa,kBAAkB,kBAAsC,yBACnE,qBAAqB,KAAA,KAAa,yBAAyB,eAAe,yBAAyB;;AAGrG,SAAgB,YAAY,OAA2B,aAAsC;CAC3F,IAAI,UAAU,gBAAgB,OAAO;CACrC,IAAI,eAAe,KAAK,KAAK,CAAC,aAAa,OAAO;CAClD,OAAO;AACT;AAEA,IAAa,gBAAgB,OAAgB,WAC3CA,0CAAAA,SAAS,KAAK,KAAK,OAAO,UAAU,WAAWC,qCAAAA,gBAAgB,OAAO,MAAM,IAAI;;AAGlF,SAAgB,gBACd,UACA,UACA,YACiB;CACjB,MAAM,YAAY,UAAU;CAC5B,MAAM,cAAc,UAAU;CAC9B,MAAM,gBAAgB,YAAY;CAClC,OAAO;EACL,UACE,UAAU,SAAS,YACf,eAAe,eAAe,aAC5B,gBACA,YAAY,cACb,YAAY,eACb,OAAO,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,MAAK,aAAY,SAAS,eAAe,UAAU;EACxF,WAAW,cAAc,aAAa,cAAc;CACtD;AACF;;AAGA,SAAgB,aAAa,UAA2B;CACtD,OAAO,aAAa,yBAAyBC,0BAAAA,WAAW,QAAQ;AAClE;AAEA,SAAgB,aACd,EAAE,UAAU,YAAY,OAAO,QAAQ,OAAO,kBAAkB,wBAChE,EAAE,UAAU,eACE;CACd,IAAI,aAAa,gCAAgC,OAAO;CACxD,IAAI,aAAa,QAAQ,GAAG,OAAO;CAEnC,IAAI,aAAa,YAAY,OAAO;CAGpC,IAAI,aAAA,wBAAyCC,8BAAAA,uBAAuB,MAAM,GAAG,OAAO;CACpF,MAAM,EAAE,cAAc,gBAAgB,UAAU,UAAU,UAAU;CACpE,IACE,aAAA,iBACA,oBAAoB,WAAW,cAAc,KAC7C,oBAAoB,MAAM,GAE1B,OAAO;CAIT,IAAI,CAAC,eAAe,kBAAkB,oBAAoB,KAAKC,6CAAAA,yBAAyB,UAAU,UAAU,GAC1G,OAAO;CAET,IAAI,OAAO,WAAW,YAAY,OAAO,YAAY,CAAC,CAAC,SAAS,iBAAiB,GAAG,OAAO;CAC3F,IAAI,YAAY,UAAU,QAAQ,GAAG,OAAO;CAC5C,IAAI,eAAe,UAAU,QAAQ,GAAG,OAAO;CAC/C,IAAI,aAAaL,oDAAAA,gBAAgB,WAAW,YAAY,OAAO;CAC/D,IAAI,cAAc,IAAI,QAAQ,GAAG,OAAO;CACxC,IAAI,aAAa,OAAO,MAAM,GAAG,OAAO;CACxC,IAAI,cAAc,WAAW,OAAO;CAEpC,IACEM,uDAAAA,gBAAgB,IAAI,QAAQ,MAC3B,UAAU,kBAAmB,eAAe,KAAK,KAAKC,uDAAAA,cAAc,UAAU,OAAO,MAAM,IAE5F,OAAO;CAET,OAAO;AACT"}
@@ -1,8 +1,9 @@
1
- import { n as isTaskTool } from "../../../tool-presentation-DvCsb_kz.js";
1
+ import { n as isTaskTool } from "../../../tool-presentation-CvibOP1J.js";
2
2
  import { isRecord } from "../messages/signal-data.es.js";
3
3
  import { KNOWLEDGE_TOOLS, knowledgeCard } from "./badges/knowledge-tool-badge.es.js";
4
4
  import { getCodeModeCall } from "./code-mode.es.js";
5
5
  import "./connect-prompt-tool-id.es.js";
6
+ import { suspendedMcpInputRequest } from "./mcp-input-request.es.js";
6
7
  import "./submit-plan-tool-id.es.js";
7
8
  import { WORKSPACE_TOOLS } from "./workspace-tool-constants.es.js";
8
9
  import { isConnectPromptPayload } from "../../connect/types.es.js";
@@ -17,6 +18,8 @@ var isNetworkFrom = (metadata, from) => metadata?.mode === "network" && metadata
17
18
  var isAgentCall = (metadata, toolName) => isNetworkFrom(metadata, "AGENT") || toolName.startsWith("agent-");
18
19
  var isWorkflowCall = (metadata, toolName) => isNetworkFrom(metadata, "WORKFLOW") || toolName.startsWith("workflow-");
19
20
  var isSettledState = (state) => state === "output-available" || state === "result";
21
+ /** A call running as a Mastra background task. An awaited call's part also names its task, but holds the final result. */
22
+ var isDeferredCall = (backgroundTaskId, backgroundTaskStatus) => backgroundTaskId !== void 0 && backgroundTaskStatus !== "completed" && backgroundTaskStatus !== "failed";
20
23
  /** A call neither settled nor carried by a live run reads as idle, so stale history never shimmers. */
21
24
  function badgeStatus(state, chatRunning) {
22
25
  if (state === "output-error") return "error";
@@ -38,13 +41,14 @@ function toolInteraction(metadata, toolName, toolCallId) {
38
41
  function isHiddenTool(toolName) {
39
42
  return toolName === "updateWorkingMemory" || isTaskTool(toolName);
40
43
  }
41
- function toolCardKind({ toolName, toolCallId, input, output, state }, { metadata, mcpAppTools }) {
44
+ function toolCardKind({ toolName, toolCallId, input, output, state, backgroundTaskId, backgroundTaskStatus }, { metadata, mcpAppTools }) {
42
45
  if (toolName === "mastra-memory-om-observation") return "observation";
43
46
  if (isHiddenTool(toolName)) return "hidden";
44
47
  if (toolName === "ask_user") return "ask_user";
45
48
  if (toolName === "request_connection" && isConnectPromptPayload(output)) return "connect_prompt";
46
49
  const { suspended } = toolInteraction(metadata, toolName, toolCallId);
47
50
  if (toolName === "submit_plan" || hasSubmitPlanToolId(suspended?.suspendPayload) || hasSubmitPlanToolId(output)) return "submit_plan";
51
+ if (!isDeferredCall(backgroundTaskId, backgroundTaskStatus) && suspendedMcpInputRequest(metadata, toolCallId)) return "mcp_input_request";
48
52
  if (typeof output === "string" && output.toLowerCase().includes("background task")) return "background";
49
53
  if (isAgentCall(metadata, toolName)) return "agent";
50
54
  if (isWorkflowCall(metadata, toolName)) return "workflow";
@@ -52,9 +56,9 @@ function toolCardKind({ toolName, toolCallId, input, output, state }, { metadata
52
56
  if (SANDBOX_TOOLS.has(toolName)) return "sandbox";
53
57
  if (codeModeCall(input, output)) return "code_mode";
54
58
  if (mcpAppTools?.[toolName]) return "mcp_app";
55
- if (KNOWLEDGE_TOOLS.has(toolName) && isSettledState(state) && knowledgeCard(toolName, input, output)) return "knowledge";
59
+ if (KNOWLEDGE_TOOLS.has(toolName) && (state === "output-error" || isSettledState(state) && knowledgeCard(toolName, input, output))) return "knowledge";
56
60
  return "plain";
57
61
  }
58
- export { badgeStatus, codeModeCall, isAgentCall, isHiddenTool, isSettledState, isWorkflowCall, toolCardKind, toolInteraction };
62
+ export { badgeStatus, codeModeCall, isAgentCall, isDeferredCall, isHiddenTool, isSettledState, isWorkflowCall, toolCardKind, toolInteraction };
59
63
 
60
64
  //# sourceMappingURL=tool-card-kind.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-card-kind.es.js","names":[],"sources":["../../../../src/domains/chat/tools/tool-card-kind.ts"],"sourcesContent":["import type { MessageMetadata, SuspendedToolMetadata, ToolApprovalMetadata } from '../messages/message-metadata';\nimport type { ToolPartFields } from '../messages/renderers/tool-part';\nimport { isRecord } from '../messages/signal-data';\nimport { KNOWLEDGE_TOOLS, knowledgeCard } from './badges/knowledge-tool-badge';\nimport { getCodeModeCall } from './code-mode';\nimport { CONNECT_PROMPT_TOOL_NAME } from './connect-prompt-tool-id';\nimport { SUBMIT_PLAN_TOOL_ID } from './submit-plan-tool-id';\nimport { WORKSPACE_TOOLS } from './workspace-tool-constants';\nimport { isConnectPromptPayload } from '@/domains/connect/types';\nimport type { ActivityStatus } from '@/ds/components/ai/activity';\nimport { isTaskTool } from '@/ds/components/ai/tool-call';\n\n/** Which card draws a call. Decided once, shared by the dispatcher and the fold. */\nexport type ToolCardKind =\n | 'hidden'\n | 'observation'\n | 'ask_user'\n | 'connect_prompt'\n | 'submit_plan'\n | 'background'\n | 'agent'\n | 'workflow'\n | 'file_tree'\n | 'sandbox'\n | 'code_mode'\n | 'mcp_app'\n | 'knowledge'\n | 'plain';\n\nexport interface ToolCardContext {\n metadata?: MessageMetadata;\n mcpAppTools?: Record<string, unknown>;\n}\n\nexport interface ToolInteraction {\n approval?: ToolApprovalMetadata;\n suspended?: SuspendedToolMetadata;\n}\n\nconst SANDBOX_TOOLS = new Set<string>([\n WORKSPACE_TOOLS.SANDBOX.EXECUTE_COMMAND,\n WORKSPACE_TOOLS.SANDBOX.GET_PROCESS_OUTPUT,\n WORKSPACE_TOOLS.SANDBOX.KILL_PROCESS,\n]);\n\nconst hasSubmitPlanToolId = (value: unknown): boolean => isRecord(value) && value.toolId === SUBMIT_PLAN_TOOL_ID;\n\nconst isNetworkFrom = (metadata: MessageMetadata | undefined, from: string): boolean =>\n metadata?.mode === 'network' && metadata.from === from;\n\nexport const isAgentCall = (metadata: MessageMetadata | undefined, toolName: string): boolean =>\n isNetworkFrom(metadata, 'AGENT') || toolName.startsWith('agent-');\n\nexport const isWorkflowCall = (metadata: MessageMetadata | undefined, toolName: string): boolean =>\n isNetworkFrom(metadata, 'WORKFLOW') || toolName.startsWith('workflow-');\n\nexport const isSettledState = (state: string | undefined): boolean =>\n state === 'output-available' || state === 'result';\n\n/** A call neither settled nor carried by a live run reads as idle, so stale history never shimmers. */\nexport function badgeStatus(state: string | undefined, chatRunning: boolean): ActivityStatus {\n if (state === 'output-error') return 'error';\n if (isSettledState(state) || !chatRunning) return 'idle';\n return 'running';\n}\n\nexport const codeModeCall = (input: unknown, output: unknown) =>\n isRecord(input) || typeof input === 'string' ? getCodeModeCall(input, output) : null;\n\n/** Approval and suspension land keyed by tool name on older runs and by call id on newer ones. */\nexport function toolInteraction(\n metadata: MessageMetadata | undefined,\n toolName: string,\n toolCallId: string,\n): ToolInteraction {\n const approvals = metadata?.requireApprovalMetadata;\n const suspensions = metadata?.suspendedTools;\n const namedApproval = approvals?.[toolName];\n return {\n approval:\n metadata?.mode === 'network'\n ? namedApproval?.toolCallId === toolCallId\n ? namedApproval\n : approvals?.[toolCallId]\n : (approvals?.[toolCallId] ??\n Object.values(approvals ?? {}).find(approval => approval.toolCallId === toolCallId)),\n suspended: suspensions?.[toolName] ?? suspensions?.[toolCallId],\n };\n}\n\n/** Tools the transcript never draws: working memory updates and task tools (shown in the docked task list). */\nexport function isHiddenTool(toolName: string): boolean {\n return toolName === 'updateWorkingMemory' || isTaskTool(toolName);\n}\n\nexport function toolCardKind(\n { toolName, toolCallId, input, output, state }: ToolPartFields,\n { metadata, mcpAppTools }: ToolCardContext,\n): ToolCardKind {\n if (toolName === 'mastra-memory-om-observation') return 'observation';\n if (isHiddenTool(toolName)) return 'hidden';\n // A question read back in history draws as a plain badge, but it is still a question: never folded away.\n if (toolName === 'ask_user') return 'ask_user';\n // Built-in `request_connection` tool from `@mastra/connect`: a settled call renders\n // as an interactive connect card; while running it falls back to a plain badge.\n if (toolName === CONNECT_PROMPT_TOOL_NAME && isConnectPromptPayload(output)) return 'connect_prompt';\n const { suspended } = toolInteraction(metadata, toolName, toolCallId);\n if (\n toolName === SUBMIT_PLAN_TOOL_ID ||\n hasSubmitPlanToolId(suspended?.suspendPayload) ||\n hasSubmitPlanToolId(output)\n ) {\n return 'submit_plan';\n }\n if (typeof output === 'string' && output.toLowerCase().includes('background task')) return 'background';\n if (isAgentCall(metadata, toolName)) return 'agent';\n if (isWorkflowCall(metadata, toolName)) return 'workflow';\n if (toolName === WORKSPACE_TOOLS.FILESYSTEM.LIST_FILES) return 'file_tree';\n if (SANDBOX_TOOLS.has(toolName)) return 'sandbox';\n if (codeModeCall(input, output)) return 'code_mode';\n if (mcpAppTools?.[toolName]) return 'mcp_app';\n // A settled Knowledge result draws as a readable card; while running or failed it stays a plain badge.\n if (KNOWLEDGE_TOOLS.has(toolName) && isSettledState(state) && knowledgeCard(toolName, input, output)) {\n return 'knowledge';\n }\n return 'plain';\n}\n"],"mappings":";;;;;;;;;AAuCA,IAAM,gCAAgB,IAAI,IAAY;CACpC,gBAAgB,QAAQ;CACxB,gBAAgB,QAAQ;CACxB,gBAAgB,QAAQ;AAC1B,CAAC;AAED,IAAM,uBAAuB,UAA4B,SAAS,KAAK,KAAK,MAAM,WAAA;AAElF,IAAM,iBAAiB,UAAuC,SAC5D,UAAU,SAAS,aAAa,SAAS,SAAS;AAEpD,IAAa,eAAe,UAAuC,aACjE,cAAc,UAAU,OAAO,KAAK,SAAS,WAAW,QAAQ;AAElE,IAAa,kBAAkB,UAAuC,aACpE,cAAc,UAAU,UAAU,KAAK,SAAS,WAAW,WAAW;AAExE,IAAa,kBAAkB,UAC7B,UAAU,sBAAsB,UAAU;;AAG5C,SAAgB,YAAY,OAA2B,aAAsC;CAC3F,IAAI,UAAU,gBAAgB,OAAO;CACrC,IAAI,eAAe,KAAK,KAAK,CAAC,aAAa,OAAO;CAClD,OAAO;AACT;AAEA,IAAa,gBAAgB,OAAgB,WAC3C,SAAS,KAAK,KAAK,OAAO,UAAU,WAAW,gBAAgB,OAAO,MAAM,IAAI;;AAGlF,SAAgB,gBACd,UACA,UACA,YACiB;CACjB,MAAM,YAAY,UAAU;CAC5B,MAAM,cAAc,UAAU;CAC9B,MAAM,gBAAgB,YAAY;CAClC,OAAO;EACL,UACE,UAAU,SAAS,YACf,eAAe,eAAe,aAC5B,gBACA,YAAY,cACb,YAAY,eACb,OAAO,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,MAAK,aAAY,SAAS,eAAe,UAAU;EACxF,WAAW,cAAc,aAAa,cAAc;CACtD;AACF;;AAGA,SAAgB,aAAa,UAA2B;CACtD,OAAO,aAAa,yBAAyB,WAAW,QAAQ;AAClE;AAEA,SAAgB,aACd,EAAE,UAAU,YAAY,OAAO,QAAQ,SACvC,EAAE,UAAU,eACE;CACd,IAAI,aAAa,gCAAgC,OAAO;CACxD,IAAI,aAAa,QAAQ,GAAG,OAAO;CAEnC,IAAI,aAAa,YAAY,OAAO;CAGpC,IAAI,aAAA,wBAAyC,uBAAuB,MAAM,GAAG,OAAO;CACpF,MAAM,EAAE,cAAc,gBAAgB,UAAU,UAAU,UAAU;CACpE,IACE,aAAA,iBACA,oBAAoB,WAAW,cAAc,KAC7C,oBAAoB,MAAM,GAE1B,OAAO;CAET,IAAI,OAAO,WAAW,YAAY,OAAO,YAAY,CAAC,CAAC,SAAS,iBAAiB,GAAG,OAAO;CAC3F,IAAI,YAAY,UAAU,QAAQ,GAAG,OAAO;CAC5C,IAAI,eAAe,UAAU,QAAQ,GAAG,OAAO;CAC/C,IAAI,aAAa,gBAAgB,WAAW,YAAY,OAAO;CAC/D,IAAI,cAAc,IAAI,QAAQ,GAAG,OAAO;CACxC,IAAI,aAAa,OAAO,MAAM,GAAG,OAAO;CACxC,IAAI,cAAc,WAAW,OAAO;CAEpC,IAAI,gBAAgB,IAAI,QAAQ,KAAK,eAAe,KAAK,KAAK,cAAc,UAAU,OAAO,MAAM,GACjG,OAAO;CAET,OAAO;AACT"}
1
+ {"version":3,"file":"tool-card-kind.es.js","names":[],"sources":["../../../../src/domains/chat/tools/tool-card-kind.ts"],"sourcesContent":["import type { MessageMetadata, SuspendedToolMetadata, ToolApprovalMetadata } from '../messages/message-metadata';\nimport type { ToolPartFields } from '../messages/renderers/tool-part';\nimport { isRecord } from '../messages/signal-data';\nimport { KNOWLEDGE_TOOLS, knowledgeCard } from './badges/knowledge-tool-badge';\nimport { getCodeModeCall } from './code-mode';\nimport { CONNECT_PROMPT_TOOL_NAME } from './connect-prompt-tool-id';\nimport { suspendedMcpInputRequest } from './mcp-input-request';\nimport { SUBMIT_PLAN_TOOL_ID } from './submit-plan-tool-id';\nimport { WORKSPACE_TOOLS } from './workspace-tool-constants';\nimport { isConnectPromptPayload } from '@/domains/connect/types';\nimport type { ActivityStatus } from '@/ds/components/ai/activity';\nimport { isTaskTool } from '@/ds/components/ai/tool-call';\n\n/** Which card draws a call. Decided once, shared by the dispatcher and the fold. */\nexport type ToolCardKind =\n | 'hidden'\n | 'observation'\n | 'ask_user'\n | 'connect_prompt'\n | 'submit_plan'\n | 'mcp_input_request'\n | 'background'\n | 'agent'\n | 'workflow'\n | 'file_tree'\n | 'sandbox'\n | 'code_mode'\n | 'mcp_app'\n | 'knowledge'\n | 'plain';\n\nexport interface ToolCardContext {\n metadata?: MessageMetadata;\n mcpAppTools?: Record<string, unknown>;\n}\n\nexport interface ToolInteraction {\n approval?: ToolApprovalMetadata;\n suspended?: SuspendedToolMetadata;\n}\n\nconst SANDBOX_TOOLS = new Set<string>([\n WORKSPACE_TOOLS.SANDBOX.EXECUTE_COMMAND,\n WORKSPACE_TOOLS.SANDBOX.GET_PROCESS_OUTPUT,\n WORKSPACE_TOOLS.SANDBOX.KILL_PROCESS,\n]);\n\nconst hasSubmitPlanToolId = (value: unknown): boolean => isRecord(value) && value.toolId === SUBMIT_PLAN_TOOL_ID;\n\nconst isNetworkFrom = (metadata: MessageMetadata | undefined, from: string): boolean =>\n metadata?.mode === 'network' && metadata.from === from;\n\nexport const isAgentCall = (metadata: MessageMetadata | undefined, toolName: string): boolean =>\n isNetworkFrom(metadata, 'AGENT') || toolName.startsWith('agent-');\n\nexport const isWorkflowCall = (metadata: MessageMetadata | undefined, toolName: string): boolean =>\n isNetworkFrom(metadata, 'WORKFLOW') || toolName.startsWith('workflow-');\n\nexport const isSettledState = (state: string | undefined): boolean =>\n state === 'output-available' || state === 'result';\n\n/** A call running as a Mastra background task. An awaited call's part also names its task, but holds the final result. */\nexport const isDeferredCall = (backgroundTaskId: string | undefined, backgroundTaskStatus: string | undefined) =>\n backgroundTaskId !== undefined && backgroundTaskStatus !== 'completed' && backgroundTaskStatus !== 'failed';\n\n/** A call neither settled nor carried by a live run reads as idle, so stale history never shimmers. */\nexport function badgeStatus(state: string | undefined, chatRunning: boolean): ActivityStatus {\n if (state === 'output-error') return 'error';\n if (isSettledState(state) || !chatRunning) return 'idle';\n return 'running';\n}\n\nexport const codeModeCall = (input: unknown, output: unknown) =>\n isRecord(input) || typeof input === 'string' ? getCodeModeCall(input, output) : null;\n\n/** Approval and suspension land keyed by tool name on older runs and by call id on newer ones. */\nexport function toolInteraction(\n metadata: MessageMetadata | undefined,\n toolName: string,\n toolCallId: string,\n): ToolInteraction {\n const approvals = metadata?.requireApprovalMetadata;\n const suspensions = metadata?.suspendedTools;\n const namedApproval = approvals?.[toolName];\n return {\n approval:\n metadata?.mode === 'network'\n ? namedApproval?.toolCallId === toolCallId\n ? namedApproval\n : approvals?.[toolCallId]\n : (approvals?.[toolCallId] ??\n Object.values(approvals ?? {}).find(approval => approval.toolCallId === toolCallId)),\n suspended: suspensions?.[toolName] ?? suspensions?.[toolCallId],\n };\n}\n\n/** Tools the transcript never draws: working memory updates and task tools (shown in the docked task list). */\nexport function isHiddenTool(toolName: string): boolean {\n return toolName === 'updateWorkingMemory' || isTaskTool(toolName);\n}\n\nexport function toolCardKind(\n { toolName, toolCallId, input, output, state, backgroundTaskId, backgroundTaskStatus }: ToolPartFields,\n { metadata, mcpAppTools }: ToolCardContext,\n): ToolCardKind {\n if (toolName === 'mastra-memory-om-observation') return 'observation';\n if (isHiddenTool(toolName)) return 'hidden';\n // A question read back in history draws as a plain badge, but it is still a question: never folded away.\n if (toolName === 'ask_user') return 'ask_user';\n // Built-in `request_connection` tool from `@mastra/connect`: a settled call renders\n // as an interactive connect card; while running it falls back to a plain badge.\n if (toolName === CONNECT_PROMPT_TOOL_NAME && isConnectPromptPayload(output)) return 'connect_prompt';\n const { suspended } = toolInteraction(metadata, toolName, toolCallId);\n if (\n toolName === SUBMIT_PLAN_TOOL_ID ||\n hasSubmitPlanToolId(suspended?.suspendPayload) ||\n hasSubmitPlanToolId(output)\n ) {\n return 'submit_plan';\n }\n // A foreground call parked on an MCP task's question: the run waits for the answer. A deferred\n // call's question lives on its background task instead, which the background card reads.\n if (!isDeferredCall(backgroundTaskId, backgroundTaskStatus) && suspendedMcpInputRequest(metadata, toolCallId)) {\n return 'mcp_input_request';\n }\n if (typeof output === 'string' && output.toLowerCase().includes('background task')) return 'background';\n if (isAgentCall(metadata, toolName)) return 'agent';\n if (isWorkflowCall(metadata, toolName)) return 'workflow';\n if (toolName === WORKSPACE_TOOLS.FILESYSTEM.LIST_FILES) return 'file_tree';\n if (SANDBOX_TOOLS.has(toolName)) return 'sandbox';\n if (codeModeCall(input, output)) return 'code_mode';\n if (mcpAppTools?.[toolName]) return 'mcp_app';\n // A settled or failed Knowledge call draws as a readable card; while running it stays a plain badge.\n if (\n KNOWLEDGE_TOOLS.has(toolName) &&\n (state === 'output-error' || (isSettledState(state) && knowledgeCard(toolName, input, output)))\n ) {\n return 'knowledge';\n }\n return 'plain';\n}\n"],"mappings":";;;;;;;;;;AAyCA,IAAM,gCAAgB,IAAI,IAAY;CACpC,gBAAgB,QAAQ;CACxB,gBAAgB,QAAQ;CACxB,gBAAgB,QAAQ;AAC1B,CAAC;AAED,IAAM,uBAAuB,UAA4B,SAAS,KAAK,KAAK,MAAM,WAAA;AAElF,IAAM,iBAAiB,UAAuC,SAC5D,UAAU,SAAS,aAAa,SAAS,SAAS;AAEpD,IAAa,eAAe,UAAuC,aACjE,cAAc,UAAU,OAAO,KAAK,SAAS,WAAW,QAAQ;AAElE,IAAa,kBAAkB,UAAuC,aACpE,cAAc,UAAU,UAAU,KAAK,SAAS,WAAW,WAAW;AAExE,IAAa,kBAAkB,UAC7B,UAAU,sBAAsB,UAAU;;AAG5C,IAAa,kBAAkB,kBAAsC,yBACnE,qBAAqB,KAAA,KAAa,yBAAyB,eAAe,yBAAyB;;AAGrG,SAAgB,YAAY,OAA2B,aAAsC;CAC3F,IAAI,UAAU,gBAAgB,OAAO;CACrC,IAAI,eAAe,KAAK,KAAK,CAAC,aAAa,OAAO;CAClD,OAAO;AACT;AAEA,IAAa,gBAAgB,OAAgB,WAC3C,SAAS,KAAK,KAAK,OAAO,UAAU,WAAW,gBAAgB,OAAO,MAAM,IAAI;;AAGlF,SAAgB,gBACd,UACA,UACA,YACiB;CACjB,MAAM,YAAY,UAAU;CAC5B,MAAM,cAAc,UAAU;CAC9B,MAAM,gBAAgB,YAAY;CAClC,OAAO;EACL,UACE,UAAU,SAAS,YACf,eAAe,eAAe,aAC5B,gBACA,YAAY,cACb,YAAY,eACb,OAAO,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,MAAK,aAAY,SAAS,eAAe,UAAU;EACxF,WAAW,cAAc,aAAa,cAAc;CACtD;AACF;;AAGA,SAAgB,aAAa,UAA2B;CACtD,OAAO,aAAa,yBAAyB,WAAW,QAAQ;AAClE;AAEA,SAAgB,aACd,EAAE,UAAU,YAAY,OAAO,QAAQ,OAAO,kBAAkB,wBAChE,EAAE,UAAU,eACE;CACd,IAAI,aAAa,gCAAgC,OAAO;CACxD,IAAI,aAAa,QAAQ,GAAG,OAAO;CAEnC,IAAI,aAAa,YAAY,OAAO;CAGpC,IAAI,aAAA,wBAAyC,uBAAuB,MAAM,GAAG,OAAO;CACpF,MAAM,EAAE,cAAc,gBAAgB,UAAU,UAAU,UAAU;CACpE,IACE,aAAA,iBACA,oBAAoB,WAAW,cAAc,KAC7C,oBAAoB,MAAM,GAE1B,OAAO;CAIT,IAAI,CAAC,eAAe,kBAAkB,oBAAoB,KAAK,yBAAyB,UAAU,UAAU,GAC1G,OAAO;CAET,IAAI,OAAO,WAAW,YAAY,OAAO,YAAY,CAAC,CAAC,SAAS,iBAAiB,GAAG,OAAO;CAC3F,IAAI,YAAY,UAAU,QAAQ,GAAG,OAAO;CAC5C,IAAI,eAAe,UAAU,QAAQ,GAAG,OAAO;CAC/C,IAAI,aAAa,gBAAgB,WAAW,YAAY,OAAO;CAC/D,IAAI,cAAc,IAAI,QAAQ,GAAG,OAAO;CACxC,IAAI,aAAa,OAAO,MAAM,GAAG,OAAO;CACxC,IAAI,cAAc,WAAW,OAAO;CAEpC,IACE,gBAAgB,IAAI,QAAQ,MAC3B,UAAU,kBAAmB,eAAe,KAAK,KAAK,cAAc,UAAU,OAAO,MAAM,IAE5F,OAAO;CAET,OAAO;AACT"}
@@ -1,4 +1,4 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_tool_card = require("../../../tool-card-DrqPZfPQ.cjs");
2
+ const require_tool_card = require("../../../tool-card-rxhTDpk_.cjs");
3
3
  exports.ToolCard = require_tool_card.ToolCard;
4
4
  exports.ToolCardInner = require_tool_card.ToolCardInner;
@@ -1 +1 @@
1
- export { t as ToolCard, n as ToolCardInner } from "../../../tool-card-sO6P2Qj4.js";
1
+ export { t as ToolCard, n as ToolCardInner } from "../../../tool-card-toDgoZzJ.js";
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_tool_call = require("../../../tool-call-Bu66PkD-.cjs");
2
+ const require_tool_call = require("../../../tool-call-DBn14X-3.cjs");
3
3
  const require_domains_chat_messages_signal_data = require("../messages/signal-data.cjs.js");
4
4
  const require_domains_chat_messages_renderers_tool_part = require("../messages/renderers/tool-part.cjs.js");
5
5
  const require_domains_chat_tools_tool_card_kind = require("./tool-card-kind.cjs.js");
@@ -1,4 +1,4 @@
1
- import { u as groupConsecutive } from "../../../tool-call-Ch9-jjXU.js";
1
+ import { u as groupConsecutive } from "../../../tool-call-Dsj43lvJ.js";
2
2
  import { isSignalData } from "../messages/signal-data.es.js";
3
3
  import { isToolPart, readToolPart } from "../messages/renderers/tool-part.es.js";
4
4
  import { toolCardKind, toolInteraction } from "./tool-card-kind.es.js";
@@ -1,4 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_domains_chat_messages_signal_data = require("./chat/messages/signal-data.cjs.js");
3
+ const require_domains_chat_knowledge_pinned_knowledge_data = require("./chat/knowledge/pinned-knowledge-data.cjs.js");
4
+ const require_domains_chat_knowledge_knowledge_links = require("./chat/knowledge/knowledge-links.cjs.js");
2
5
  const require_domains_chat_context_chat_context = require("./chat/context/chat-context.cjs.js");
3
6
  const require_domains_chat_components_badge_wrapper = require("./chat/components/badge-wrapper.cjs.js");
4
7
  const require_domains_chat_components_loading_badge = require("./chat/components/loading-badge.cjs.js");
@@ -7,9 +10,6 @@ const require_domains_chat_components_section_label = require("./chat/components
7
10
  const require_domains_chat_context_dataset_save_context_value = require("./chat/context/dataset-save-context-value.cjs.js");
8
11
  const require_domains_chat_context_dataset_save_context = require("./chat/context/dataset-save-context.cjs.js");
9
12
  const require_domains_chat_context_tool_call_context = require("./chat/context/tool-call-context.cjs.js");
10
- const require_domains_chat_messages_signal_data = require("./chat/messages/signal-data.cjs.js");
11
- const require_domains_chat_knowledge_pinned_knowledge_data = require("./chat/knowledge/pinned-knowledge-data.cjs.js");
12
- const require_domains_chat_knowledge_knowledge_links = require("./chat/knowledge/knowledge-links.cjs.js");
13
13
  const require_domains_chat_knowledge_pinned_knowledge = require("./chat/knowledge/pinned-knowledge.cjs.js");
14
14
  const require_domains_chat_tools_badges_knowledge_tool_badge = require("./chat/tools/badges/knowledge-tool-badge.cjs.js");
15
15
  const require_domains_chat_messages_renderers_tool_part = require("./chat/messages/renderers/tool-part.cjs.js");
@@ -52,5 +52,7 @@ exports.useChatRunning = require_domains_chat_context_chat_context.useChatRunnin
52
52
  exports.useChatSend = require_domains_chat_context_chat_context.useChatSend;
53
53
  exports.useChatTasks = require_domains_chat_context_chat_context.useChatTasks;
54
54
  exports.useDatasetSaveContext = require_domains_chat_context_dataset_save_context_value.useDatasetSaveContext;
55
+ exports.useHasKnowledgeLinks = require_domains_chat_knowledge_knowledge_links.useHasKnowledgeLinks;
56
+ exports.useKnowledgeLinksContext = require_domains_chat_knowledge_knowledge_links.useKnowledgeLinksContext;
55
57
  exports.useOptionalToolCall = require_domains_chat_context_tool_call_context.useOptionalToolCall;
56
58
  exports.useToolCall = require_domains_chat_context_tool_call_context.useToolCall;
@@ -1,3 +1,6 @@
1
+ import { formatSignalValue, getMcpEventSignalInfo, getNotificationMetadata, getSignalType, isRecord, isSignalData, isUserSignalType, signalContentsToText, toReactiveSignalData } from "./chat/messages/signal-data.es.js";
2
+ import { knowledgePageHref, pinnedKnowledgeFromSignal } from "./chat/knowledge/pinned-knowledge-data.es.js";
3
+ import { KnowledgeLinksProvider, KnowledgePageLink, useHasKnowledgeLinks, useKnowledgeLinksContext } from "./chat/knowledge/knowledge-links.es.js";
1
4
  import { ChatAgentContext, ChatMessagesContext, ChatRunningContext, ChatSendContext, ChatTasksContext, useChatMessages, useChatRunning, useChatSend, useChatTasks } from "./chat/context/chat-context.es.js";
2
5
  import { BadgeWrapper } from "./chat/components/badge-wrapper.es.js";
3
6
  import { LoadingBadge } from "./chat/components/loading-badge.es.js";
@@ -6,12 +9,9 @@ import { SectionLabel } from "./chat/components/section-label.es.js";
6
9
  import { useDatasetSaveContext } from "./chat/context/dataset-save-context-value.es.js";
7
10
  import { DatasetSaveProvider } from "./chat/context/dataset-save-context.es.js";
8
11
  import { ToolCallProvider, useOptionalToolCall, useToolCall } from "./chat/context/tool-call-context.es.js";
9
- import { formatSignalValue, getMcpEventSignalInfo, getNotificationMetadata, getSignalType, isRecord, isSignalData, isUserSignalType, signalContentsToText, toReactiveSignalData } from "./chat/messages/signal-data.es.js";
10
- import { knowledgePageHref, pinnedKnowledgeFromSignal } from "./chat/knowledge/pinned-knowledge-data.es.js";
11
- import { KnowledgeLinksProvider, KnowledgePageLink } from "./chat/knowledge/knowledge-links.es.js";
12
12
  import { PinnedKnowledgeActivity } from "./chat/knowledge/pinned-knowledge.es.js";
13
13
  import { KNOWLEDGE_TOOLS, knowledgeCard } from "./chat/tools/badges/knowledge-tool-badge.es.js";
14
14
  import { isToolPart, readToolPart } from "./chat/messages/renderers/tool-part.es.js";
15
15
  import { DatasetSaveAction, SaveFullConversationAction } from "./chat/messages/dataset-save-action.es.js";
16
16
  import { AssistantMessageActions } from "./chat/messages/assistant-message-actions.es.js";
17
- export { AssistantMessageActions, BadgeWrapper, ChatAgentContext, ChatMessagesContext, ChatRunningContext, ChatSendContext, ChatTasksContext, DatasetSaveAction, DatasetSaveProvider, KNOWLEDGE_TOOLS, KnowledgeLinksProvider, KnowledgePageLink, LoadingBadge, NetworkChoiceMetadataDialogTrigger, PinnedKnowledgeActivity, SaveFullConversationAction, SectionLabel, ToolCallProvider, formatSignalValue, getMcpEventSignalInfo, getNotificationMetadata, getSignalType, isRecord, isSignalData, isToolPart, isUserSignalType, knowledgeCard, knowledgePageHref, pinnedKnowledgeFromSignal, readToolPart, signalContentsToText, toReactiveSignalData, useChatMessages, useChatRunning, useChatSend, useChatTasks, useDatasetSaveContext, useOptionalToolCall, useToolCall };
17
+ export { AssistantMessageActions, BadgeWrapper, ChatAgentContext, ChatMessagesContext, ChatRunningContext, ChatSendContext, ChatTasksContext, DatasetSaveAction, DatasetSaveProvider, KNOWLEDGE_TOOLS, KnowledgeLinksProvider, KnowledgePageLink, LoadingBadge, NetworkChoiceMetadataDialogTrigger, PinnedKnowledgeActivity, SaveFullConversationAction, SectionLabel, ToolCallProvider, formatSignalValue, getMcpEventSignalInfo, getNotificationMetadata, getSignalType, isRecord, isSignalData, isToolPart, isUserSignalType, knowledgeCard, knowledgePageHref, pinnedKnowledgeFromSignal, readToolPart, signalContentsToText, toReactiveSignalData, useChatMessages, useChatRunning, useChatSend, useChatTasks, useDatasetSaveContext, useHasKnowledgeLinks, useKnowledgeLinksContext, useOptionalToolCall, useToolCall };
@@ -0,0 +1,48 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_Txt = require("../../../Txt-BnoSqxKE.cjs");
3
+ const require_domains_knowledge_lib_linkCountsText = require("../lib/linkCountsText.cjs.js");
4
+ let react_jsx_runtime = require("react/jsx-runtime");
5
+ // src/domains/knowledge/components/KnowledgePageCard.tsx
6
+ /**
7
+ * What the explorer's graph tooltip says about a page: name, kind and ref, children, links. The graph's
8
+ * dots and the hover cards on page links in chat both draw it.
9
+ */
10
+ function KnowledgePageCard({ name, kind, pageRef, path, childCount, links, notShown }) {
11
+ const children = childCount && childCount !== "0" ? `${childCount} ${childCount === "1" ? "child" : "children"}` : null;
12
+ const linkText = links && (links.in > 0 || links.out > 0) ? require_domains_knowledge_lib_linkCountsText.linkCountsText(links, notShown) : null;
13
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
14
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Txt.Txt, {
15
+ as: "span",
16
+ variant: "label",
17
+ tone: "ink",
18
+ children: name
19
+ }),
20
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Txt.Txt, {
21
+ as: "span",
22
+ variant: "meta",
23
+ tone: "muted",
24
+ children: pageRef ? `${kind} · ${pageRef}` : kind
25
+ }),
26
+ path ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Txt.Txt, {
27
+ as: "span",
28
+ variant: "meta",
29
+ tone: "muted",
30
+ children: path
31
+ }) : null,
32
+ children ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Txt.Txt, {
33
+ as: "span",
34
+ variant: "meta",
35
+ tone: "muted",
36
+ children
37
+ }) : null,
38
+ linkText ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Txt.Txt, {
39
+ as: "span",
40
+ variant: "meta",
41
+ tone: "muted",
42
+ children: linkText
43
+ }) : null
44
+ ] });
45
+ }
46
+ exports.KnowledgePageCard = KnowledgePageCard;
47
+
48
+ //# sourceMappingURL=KnowledgePageCard.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KnowledgePageCard.cjs.js","names":["linkCountsText","_Fragment","Txt"],"sources":["../../../../src/domains/knowledge/components/KnowledgePageCard.tsx"],"sourcesContent":["import { linkCountsText } from '../lib/linkCountsText';\nimport { Txt } from '@/ds/components/Txt';\n\nexport interface KnowledgePageCardProps {\n name: string;\n /** `Page`, `Scope` or a scope's display label. */\n kind: string;\n /** Where the page is addressed, e.g. `org:acme#policies/refunds`. */\n pageRef?: string;\n /** Where the page sits, from its root scope down. */\n path?: string;\n /** Already formatted (`1000+` when the server capped the count); left out when unknown or zero. */\n childCount?: string;\n /** Left out when unknown or both zero. */\n links?: { in: number; out: number };\n /** Of `links`, how many go to pages the graph doesn't draw. */\n notShown?: number;\n}\n\n/**\n * What the explorer's graph tooltip says about a page: name, kind and ref, children, links. The graph's\n * dots and the hover cards on page links in chat both draw it.\n */\nexport function KnowledgePageCard({ name, kind, pageRef, path, childCount, links, notShown }: KnowledgePageCardProps) {\n const children =\n childCount && childCount !== '0' ? `${childCount} ${childCount === '1' ? 'child' : 'children'}` : null;\n const linkText = links && (links.in > 0 || links.out > 0) ? linkCountsText(links, notShown) : null;\n return (\n <>\n <Txt as=\"span\" variant=\"label\" tone=\"ink\">\n {name}\n </Txt>\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n {pageRef ? `${kind} · ${pageRef}` : kind}\n </Txt>\n {path ? (\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n {path}\n </Txt>\n ) : null}\n {children ? (\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n {children}\n </Txt>\n ) : null}\n {linkText ? (\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n {linkText}\n </Txt>\n ) : null}\n </>\n );\n}\n"],"mappings":";;;;;;;;;AAuBA,SAAgB,kBAAkB,EAAE,MAAM,MAAM,SAAS,MAAM,YAAY,OAAO,YAAoC;CACpH,MAAM,WACJ,cAAc,eAAe,MAAM,GAAG,WAAW,GAAG,eAAe,MAAM,UAAU,eAAe;CACpG,MAAM,WAAW,UAAU,MAAM,KAAK,KAAK,MAAM,MAAM,KAAKA,6CAAAA,eAAe,OAAO,QAAQ,IAAI;CAC9F,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAAC,kBAAAA,UAAA,EAAA,UAAA;EACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,YAAAA,KAAD;GAAK,IAAG;GAAO,SAAQ;GAAQ,MAAK;GACjC,UAAA;EACE,CAAA;EACL,iBAAA,GAAA,kBAAA,IAAA,CAACA,YAAAA,KAAD;GAAK,IAAG;GAAO,SAAQ;GAAO,MAAK;GAChC,UAAA,UAAU,GAAG,KAAK,KAAK,YAAY;EACjC,CAAA;EACJ,OACC,iBAAA,GAAA,kBAAA,IAAA,CAACA,YAAAA,KAAD;GAAK,IAAG;GAAO,SAAQ;GAAO,MAAK;GAChC,UAAA;EACE,CAAA,IACH;EACH,WACC,iBAAA,GAAA,kBAAA,IAAA,CAACA,YAAAA,KAAD;GAAK,IAAG;GAAO,SAAQ;GAAO,MAAK;GAChC;EACE,CAAA,IACH;EACH,WACC,iBAAA,GAAA,kBAAA,IAAA,CAACA,YAAAA,KAAD;GAAK,IAAG;GAAO,SAAQ;GAAO,MAAK;GAChC,UAAA;EACE,CAAA,IACH;CACJ,EAAA,CAAA;AAEN"}
@@ -0,0 +1 @@
1
+ export * from '../../../src/domains/knowledge/components/KnowledgePageCard';
@@ -0,0 +1,47 @@
1
+ import { t as Txt } from "../../../Txt-BM6TVV_c.js";
2
+ import { linkCountsText } from "../lib/linkCountsText.es.js";
3
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
4
+ // src/domains/knowledge/components/KnowledgePageCard.tsx
5
+ /**
6
+ * What the explorer's graph tooltip says about a page: name, kind and ref, children, links. The graph's
7
+ * dots and the hover cards on page links in chat both draw it.
8
+ */
9
+ function KnowledgePageCard({ name, kind, pageRef, path, childCount, links, notShown }) {
10
+ const children = childCount && childCount !== "0" ? `${childCount} ${childCount === "1" ? "child" : "children"}` : null;
11
+ const linkText = links && (links.in > 0 || links.out > 0) ? linkCountsText(links, notShown) : null;
12
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
13
+ /* @__PURE__ */ jsx(Txt, {
14
+ as: "span",
15
+ variant: "label",
16
+ tone: "ink",
17
+ children: name
18
+ }),
19
+ /* @__PURE__ */ jsx(Txt, {
20
+ as: "span",
21
+ variant: "meta",
22
+ tone: "muted",
23
+ children: pageRef ? `${kind} · ${pageRef}` : kind
24
+ }),
25
+ path ? /* @__PURE__ */ jsx(Txt, {
26
+ as: "span",
27
+ variant: "meta",
28
+ tone: "muted",
29
+ children: path
30
+ }) : null,
31
+ children ? /* @__PURE__ */ jsx(Txt, {
32
+ as: "span",
33
+ variant: "meta",
34
+ tone: "muted",
35
+ children
36
+ }) : null,
37
+ linkText ? /* @__PURE__ */ jsx(Txt, {
38
+ as: "span",
39
+ variant: "meta",
40
+ tone: "muted",
41
+ children: linkText
42
+ }) : null
43
+ ] });
44
+ }
45
+ export { KnowledgePageCard };
46
+
47
+ //# sourceMappingURL=KnowledgePageCard.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KnowledgePageCard.es.js","names":["_Fragment"],"sources":["../../../../src/domains/knowledge/components/KnowledgePageCard.tsx"],"sourcesContent":["import { linkCountsText } from '../lib/linkCountsText';\nimport { Txt } from '@/ds/components/Txt';\n\nexport interface KnowledgePageCardProps {\n name: string;\n /** `Page`, `Scope` or a scope's display label. */\n kind: string;\n /** Where the page is addressed, e.g. `org:acme#policies/refunds`. */\n pageRef?: string;\n /** Where the page sits, from its root scope down. */\n path?: string;\n /** Already formatted (`1000+` when the server capped the count); left out when unknown or zero. */\n childCount?: string;\n /** Left out when unknown or both zero. */\n links?: { in: number; out: number };\n /** Of `links`, how many go to pages the graph doesn't draw. */\n notShown?: number;\n}\n\n/**\n * What the explorer's graph tooltip says about a page: name, kind and ref, children, links. The graph's\n * dots and the hover cards on page links in chat both draw it.\n */\nexport function KnowledgePageCard({ name, kind, pageRef, path, childCount, links, notShown }: KnowledgePageCardProps) {\n const children =\n childCount && childCount !== '0' ? `${childCount} ${childCount === '1' ? 'child' : 'children'}` : null;\n const linkText = links && (links.in > 0 || links.out > 0) ? linkCountsText(links, notShown) : null;\n return (\n <>\n <Txt as=\"span\" variant=\"label\" tone=\"ink\">\n {name}\n </Txt>\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n {pageRef ? `${kind} · ${pageRef}` : kind}\n </Txt>\n {path ? (\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n {path}\n </Txt>\n ) : null}\n {children ? (\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n {children}\n </Txt>\n ) : null}\n {linkText ? (\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n {linkText}\n </Txt>\n ) : null}\n </>\n );\n}\n"],"mappings":";;;;;;;;AAuBA,SAAgB,kBAAkB,EAAE,MAAM,MAAM,SAAS,MAAM,YAAY,OAAO,YAAoC;CACpH,MAAM,WACJ,cAAc,eAAe,MAAM,GAAG,WAAW,GAAG,eAAe,MAAM,UAAU,eAAe;CACpG,MAAM,WAAW,UAAU,MAAM,KAAK,KAAK,MAAM,MAAM,KAAK,eAAe,OAAO,QAAQ,IAAI;CAC9F,OACE,qBAAAA,UAAA,EAAA,UAAA;EACE,oBAAC,KAAD;GAAK,IAAG;GAAO,SAAQ;GAAQ,MAAK;GACjC,UAAA;EACE,CAAA;EACL,oBAAC,KAAD;GAAK,IAAG;GAAO,SAAQ;GAAO,MAAK;GAChC,UAAA,UAAU,GAAG,KAAK,KAAK,YAAY;EACjC,CAAA;EACJ,OACC,oBAAC,KAAD;GAAK,IAAG;GAAO,SAAQ;GAAO,MAAK;GAChC,UAAA;EACE,CAAA,IACH;EACH,WACC,oBAAC,KAAD;GAAK,IAAG;GAAO,SAAQ;GAAO,MAAK;GAChC;EACE,CAAA,IACH;EACH,WACC,oBAAC,KAAD;GAAK,IAAG;GAAO,SAAQ;GAAO,MAAK;GAChC,UAAA;EACE,CAAA,IACH;CACJ,EAAA,CAAA;AAEN"}
@@ -1,7 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_Txt = require("../../../Txt-BnoSqxKE.cjs");
3
3
  const require_Badge = require("../../../Badge-DZ6r6bcw.cjs");
4
- const require_MarkdownRenderer = require("../../../MarkdownRenderer-CB8Z_CHc.cjs");
4
+ const require_MarkdownRenderer = require("../../../MarkdownRenderer-y65WGBhC.cjs");
5
+ const require_domains_knowledge_lib_remarkKnowledgeLinks = require("../lib/remarkKnowledgeLinks.cjs.js");
6
+ const require_domains_knowledge_lib_pageRefs = require("../lib/pageRefs.cjs.js");
5
7
  const require_domains_knowledge_lib_recordText = require("../lib/recordText.cjs.js");
6
8
  let react = require("react");
7
9
  let react_jsx_runtime = require("react/jsx-runtime");
@@ -93,6 +95,32 @@ function knowledgePagePath(page, ancestors) {
93
95
  if (keys.some((key) => !key)) return null;
94
96
  return `${scope.address}#${keys.join("/")}`;
95
97
  }
98
+ var BodyLinks = (0, react.createContext)(null);
99
+ /**
100
+ * A `[[ref]]` from a page body: the page's name as a link when a loaded page answers to the ref, the ref
101
+ * itself in a quiet style when none does. Every other `<span>` the markdown makes passes through.
102
+ */
103
+ function BodySpan({ node, ...props }) {
104
+ const links = (0, react.useContext)(BodyLinks);
105
+ const ref = node?.properties[require_domains_knowledge_lib_remarkKnowledgeLinks.KNOWLEDGE_REF_PROPERTY];
106
+ if (typeof ref !== "string" || !links) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { ...props });
107
+ const target = links.index.resolve(ref);
108
+ return target ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
109
+ type: "button",
110
+ "data-testid": "knowledge-body-link",
111
+ title: ref,
112
+ className: "rounded bg-badge-blue-subtle px-1 font-medium text-badge-blue-foreground hover:underline",
113
+ onClick: () => links.onPageClick(target),
114
+ children: target.name
115
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
116
+ "data-testid": "knowledge-body-link-unresolved",
117
+ title: "No loaded page has this address",
118
+ className: "rounded border border-dashed border-border px-1 text-muted-foreground",
119
+ children: ref
120
+ });
121
+ }
122
+ var BODY_REMARK_PLUGINS = [require_domains_knowledge_lib_remarkKnowledgeLinks.remarkKnowledgeLinks];
123
+ var BODY_COMPONENTS = { span: BodySpan };
96
124
  function Section({ label, count, children }) {
97
125
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
98
126
  "aria-label": label,
@@ -121,9 +149,20 @@ function PageLink({ page, onPageClick }) {
121
149
  children: page.name
122
150
  });
123
151
  }
152
+ var refIndexes = /* @__PURE__ */ new WeakMap();
153
+ /** One ref index per loaded-pages map, shared by every note drawn from it. */
154
+ function loadedRefIndex(pagesById) {
155
+ let index = refIndexes.get(pagesById);
156
+ if (!index) refIndexes.set(pagesById, index = require_domains_knowledge_lib_pageRefs.knowledgePageRefIndex(pagesById.values()));
157
+ return index;
158
+ }
124
159
  /** One note: who wrote it and when, its text with `[[mentions]]` linked when the page is known, and the scopes it is stamped to. */
125
160
  function KnowledgeNoteItem({ note, pagesById, onPageClick, highlighted, itemRef, showPage, compact }) {
126
- const mentioned = note.mentions.map((id) => pagesById.get(id)).filter((candidate) => candidate !== void 0);
161
+ const refIndex = loadedRefIndex(pagesById);
162
+ const mentionTarget = (ref) => {
163
+ const target = refIndex.resolve(ref);
164
+ return target && note.mentions.includes(target.id) ? target : void 0;
165
+ };
127
166
  const scopeLabel = (id) => {
128
167
  const scopePage = pagesById.get(id);
129
168
  return scopePage?.address ?? scopePage?.name ?? id;
@@ -170,8 +209,7 @@ function KnowledgeNoteItem({ note, pagesById, onPageClick, highlighted, itemRef,
170
209
  className: "text-ui-md break-words text-foreground",
171
210
  children: require_domains_knowledge_lib_recordText.parseRecordSegments(note.text).map((segment, index) => {
172
211
  if (segment.type === "text") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: segment.value }, index);
173
- const name = segment.value.trim().toLocaleLowerCase();
174
- const target = mentioned.find((candidate) => candidate.name.trim().toLocaleLowerCase() === name);
212
+ const target = mentionTarget(segment.value);
175
213
  return target ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
176
214
  type: "button",
177
215
  className: "rounded bg-badge-blue-subtle px-1 font-medium text-badge-blue-foreground hover:underline",
@@ -214,6 +252,19 @@ function KnowledgePageDetail({ page, notes, pin, pagesById, onPageClick, highlig
214
252
  const scope = page.isScope ? page : ancestors.find((candidate) => candidate.id === page.scopeId) ?? pagesById.get(page.scopeId);
215
253
  const path = knowledgePagePath(page, ancestors);
216
254
  const kind = page.isScope ? page.displayLabel ?? "Scope" : "Page";
255
+ const refIndex = (0, react.useMemo)(() => require_domains_knowledge_lib_pageRefs.knowledgePageRefIndex([
256
+ ...pagesById.values(),
257
+ ...ancestors,
258
+ page
259
+ ]), [
260
+ pagesById,
261
+ ancestors,
262
+ page
263
+ ]);
264
+ const bodyLinks = (0, react.useMemo)(() => ({
265
+ index: refIndex,
266
+ onPageClick
267
+ }), [refIndex, onPageClick]);
217
268
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("article", {
218
269
  "aria-label": page.name,
219
270
  className: "flex min-h-0 flex-col overflow-y-auto",
@@ -340,7 +391,14 @@ function KnowledgePageDetail({ page, notes, pin, pagesById, onPageClick, highlig
340
391
  children: [page.body ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
341
392
  "data-testid": "knowledge-page-body",
342
393
  className: "max-w-3xl",
343
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MarkdownRenderer.MarkdownRenderer, { children: page.body })
394
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(BodyLinks.Provider, {
395
+ value: bodyLinks,
396
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MarkdownRenderer.MarkdownRenderer, {
397
+ remarkPlugins: BODY_REMARK_PLUGINS,
398
+ components: BODY_COMPONENTS,
399
+ children: page.body
400
+ })
401
+ })
344
402
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_Txt.Txt, {
345
403
  variant: "body",
346
404
  tone: "muted",