@mastra/playground-ui 68.0.0-alpha.2 → 68.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (479) hide show
  1. package/dist/{FilterBar-CQl04O6t.cjs → FilterBar-BSP2UTjc.cjs} +2 -2
  2. package/dist/{FilterBar-CQl04O6t.cjs.map → FilterBar-BSP2UTjc.cjs.map} +1 -1
  3. package/dist/{FilterBar-BgW2dqRQ.js → FilterBar-PSQ1OwqH.js} +2 -2
  4. package/dist/{FilterBar-BgW2dqRQ.js.map → FilterBar-PSQ1OwqH.js.map} +1 -1
  5. package/dist/KnowledgePageGraph.css +55 -0
  6. package/dist/{MarkdownRenderer-2GOXQJEv.js → MarkdownRenderer-CI30RqdB.js} +19 -6
  7. package/dist/MarkdownRenderer-CI30RqdB.js.map +1 -0
  8. package/dist/{MarkdownRenderer-CB8Z_CHc.cjs → MarkdownRenderer-y65WGBhC.cjs} +19 -6
  9. package/dist/MarkdownRenderer-y65WGBhC.cjs.map +1 -0
  10. package/dist/{MetricsCard-CEB-f2sv.cjs → MetricsCard-BEwiS7Pe.cjs} +8 -8
  11. package/dist/MetricsCard-BEwiS7Pe.cjs.map +1 -0
  12. package/dist/{MetricsCard-M8awJ2B_.js → MetricsCard-ua6C6b8a.js} +10 -10
  13. package/dist/MetricsCard-ua6C6b8a.js.map +1 -0
  14. package/dist/{MetricsLineChart-BhHoduO0.js → MetricsLineChart-4SwxBbQx.js} +14 -3
  15. package/dist/MetricsLineChart-4SwxBbQx.js.map +1 -0
  16. package/dist/{MetricsLineChart-CjBm4IXu.cjs → MetricsLineChart-tZxsauau.cjs} +13 -2
  17. package/dist/MetricsLineChart-tZxsauau.cjs.map +1 -0
  18. package/dist/{MetricsStackedBarChart-BdMlKv6G.cjs → MetricsStackedBarChart-CDLE76IB.cjs} +2 -2
  19. package/dist/{MetricsStackedBarChart-BdMlKv6G.cjs.map → MetricsStackedBarChart-CDLE76IB.cjs.map} +1 -1
  20. package/dist/{MetricsStackedBarChart-BRuA6MTE.js → MetricsStackedBarChart-D2QyS4-z.js} +2 -2
  21. package/dist/{MetricsStackedBarChart-BRuA6MTE.js.map → MetricsStackedBarChart-D2QyS4-z.js.map} +1 -1
  22. package/dist/{activity-rJ1NQl_2.js → activity-C8Ql81WM.js} +2 -2
  23. package/dist/{activity-rJ1NQl_2.js.map → activity-C8Ql81WM.js.map} +1 -1
  24. package/dist/{activity-DyB5H3gF.cjs → activity-CcQZeDYi.cjs} +2 -2
  25. package/dist/{activity-DyB5H3gF.cjs.map → activity-CcQZeDYi.cjs.map} +1 -1
  26. package/dist/components/DateTimeRangePicker.cjs.js +1 -1
  27. package/dist/components/DateTimeRangePicker.es.js +1 -1
  28. package/dist/components/FilterBar.cjs.js +2 -2
  29. package/dist/components/FilterBar.es.js +2 -2
  30. package/dist/components/MarkdownRenderer.cjs.js +1 -1
  31. package/dist/components/MarkdownRenderer.es.js +1 -1
  32. package/dist/components/MetricsCard.cjs.js +1 -1
  33. package/dist/components/MetricsCard.es.js +1 -1
  34. package/dist/components/MetricsLineChart.cjs.js +1 -1
  35. package/dist/components/MetricsLineChart.es.js +1 -1
  36. package/dist/components/MetricsStackedBarChart.cjs.js +1 -1
  37. package/dist/components/MetricsStackedBarChart.es.js +1 -1
  38. package/dist/components/SavedViews.cjs.js +1 -1
  39. package/dist/components/SavedViews.es.js +1 -1
  40. package/dist/components/ai/activity.cjs.js +1 -1
  41. package/dist/components/ai/activity.es.js +1 -1
  42. package/dist/components/ai/plan.cjs.js +1 -1
  43. package/dist/components/ai/plan.es.js +1 -1
  44. package/dist/components/ai/tool-approval.cjs.js +1 -1
  45. package/dist/components/ai/tool-approval.es.js +1 -1
  46. package/dist/components/ai/tool-call.cjs.js +2 -2
  47. package/dist/components/ai/tool-call.es.js +2 -2
  48. package/dist/{date-time-range-picker-CTt7Od0P.cjs → date-time-range-picker-CWGjoR3j.cjs} +40 -13
  49. package/dist/date-time-range-picker-CWGjoR3j.cjs.map +1 -0
  50. package/dist/{date-time-range-picker-DKh1K9Iy.js → date-time-range-picker-CdSiXwB4.js} +40 -13
  51. package/dist/date-time-range-picker-CdSiXwB4.js.map +1 -0
  52. package/dist/domains/chat/activity/activity-stretch-line.cjs.js +1 -1
  53. package/dist/domains/chat/activity/activity-stretch-line.es.js +1 -1
  54. package/dist/domains/chat/activity/components/activity-fold.cjs.js +1 -1
  55. package/dist/domains/chat/activity/components/activity-fold.es.js +1 -1
  56. package/dist/domains/chat/activity/components/activity-timed-trigger.cjs.js +1 -1
  57. package/dist/domains/chat/activity/components/activity-timed-trigger.es.js +1 -1
  58. package/dist/domains/chat/activity/components/calls-panel.cjs.js +1 -1
  59. package/dist/domains/chat/activity/components/calls-panel.es.js +1 -1
  60. package/dist/domains/chat/activity/components/stretch-content.cjs.js +1 -1
  61. package/dist/domains/chat/activity/components/stretch-content.es.js +1 -1
  62. package/dist/domains/chat/activity/components/stretch-thought.cjs.js +1 -1
  63. package/dist/domains/chat/activity/components/stretch-thought.es.js +1 -1
  64. package/dist/domains/chat/activity/model/activity-segments.cjs.js +1 -1
  65. package/dist/domains/chat/activity/model/activity-segments.es.js +1 -1
  66. package/dist/domains/chat/activity/model/activity-words.cjs.js +2 -2
  67. package/dist/domains/chat/activity/model/activity-words.es.js +2 -2
  68. package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
  69. package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
  70. package/dist/domains/chat/knowledge/knowledge-links.cjs.js +52 -6
  71. package/dist/domains/chat/knowledge/knowledge-links.cjs.js.map +1 -1
  72. package/dist/domains/chat/knowledge/knowledge-links.es.js +53 -9
  73. package/dist/domains/chat/knowledge/knowledge-links.es.js.map +1 -1
  74. package/dist/domains/chat/knowledge/pinned-knowledge-data.cjs.js +10 -3
  75. package/dist/domains/chat/knowledge/pinned-knowledge-data.cjs.js.map +1 -1
  76. package/dist/domains/chat/knowledge/pinned-knowledge-data.es.js +10 -3
  77. package/dist/domains/chat/knowledge/pinned-knowledge-data.es.js.map +1 -1
  78. package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js +8 -3
  79. package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js.map +1 -1
  80. package/dist/domains/chat/knowledge/pinned-knowledge.es.js +8 -3
  81. package/dist/domains/chat/knowledge/pinned-knowledge.es.js.map +1 -1
  82. package/dist/domains/chat/knowledge.cjs.js +2 -0
  83. package/dist/domains/chat/knowledge.es.js +2 -2
  84. package/dist/domains/chat/messages/message-row.cjs.js +3 -3
  85. package/dist/domains/chat/messages/message-row.es.js +3 -3
  86. package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
  87. package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
  88. package/dist/domains/chat/messages/reasoning-content.cjs.js +1 -1
  89. package/dist/domains/chat/messages/reasoning-content.es.js +1 -1
  90. package/dist/domains/chat/messages/renderers/message-text.cjs.js +35 -1
  91. package/dist/domains/chat/messages/renderers/message-text.cjs.js.map +1 -1
  92. package/dist/domains/chat/messages/renderers/message-text.es.js +36 -2
  93. package/dist/domains/chat/messages/renderers/message-text.es.js.map +1 -1
  94. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.cjs.js +1 -1
  95. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.es.js +1 -1
  96. package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
  97. package/dist/domains/chat/messages/signal-badge.es.js +1 -1
  98. package/dist/domains/chat/messages/skill-message.cjs.js +2 -2
  99. package/dist/domains/chat/messages/skill-message.es.js +2 -2
  100. package/dist/domains/chat/messages/system-reminder-badge.cjs.js +1 -1
  101. package/dist/domains/chat/messages/system-reminder-badge.es.js +1 -1
  102. package/dist/domains/chat/tools/badges/agent-badge-wrapper.cjs.js +1 -1
  103. package/dist/domains/chat/tools/badges/agent-badge-wrapper.es.js +1 -1
  104. package/dist/domains/chat/tools/badges/agent-badge.cjs.js +1 -1
  105. package/dist/domains/chat/tools/badges/agent-badge.es.js +1 -1
  106. package/dist/domains/chat/tools/badges/file-tree-badge.cjs.js +2 -2
  107. package/dist/domains/chat/tools/badges/file-tree-badge.es.js +2 -2
  108. package/dist/domains/chat/tools/badges/knowledge-body-range.cjs.js +80 -0
  109. package/dist/domains/chat/tools/badges/knowledge-body-range.cjs.js.map +1 -0
  110. package/dist/domains/chat/tools/badges/knowledge-body-range.d.ts +1 -0
  111. package/dist/domains/chat/tools/badges/knowledge-body-range.es.js +78 -0
  112. package/dist/domains/chat/tools/badges/knowledge-body-range.es.js.map +1 -0
  113. package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js +163 -13
  114. package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js.map +1 -1
  115. package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js +165 -15
  116. package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js.map +1 -1
  117. package/dist/domains/chat/tools/badges/mcp-input-request-badge.cjs.js +51 -0
  118. package/dist/domains/chat/tools/badges/mcp-input-request-badge.cjs.js.map +1 -0
  119. package/dist/domains/chat/tools/badges/mcp-input-request-badge.d.ts +1 -0
  120. package/dist/domains/chat/tools/badges/mcp-input-request-badge.es.js +49 -0
  121. package/dist/domains/chat/tools/badges/mcp-input-request-badge.es.js.map +1 -0
  122. package/dist/domains/chat/tools/badges/mcp-task-chip.cjs.js +7 -2
  123. package/dist/domains/chat/tools/badges/mcp-task-chip.cjs.js.map +1 -1
  124. package/dist/domains/chat/tools/badges/mcp-task-chip.es.js +7 -2
  125. package/dist/domains/chat/tools/badges/mcp-task-chip.es.js.map +1 -1
  126. package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +2 -2
  127. package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +2 -2
  128. package/dist/domains/chat/tools/badges/observation-marker-details.cjs.js +2 -2
  129. package/dist/domains/chat/tools/badges/observation-marker-details.es.js +2 -2
  130. package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +1 -1
  131. package/dist/domains/chat/tools/badges/observation-renderer.es.js +1 -1
  132. package/dist/domains/chat/tools/badges/sandbox-execution-badge.cjs.js +2 -2
  133. package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js +2 -2
  134. package/dist/domains/chat/tools/badges/tool-approval-badge.cjs.js +1 -1
  135. package/dist/domains/chat/tools/badges/tool-approval-badge.es.js +1 -1
  136. package/dist/domains/chat/tools/badges/tool-badge.cjs.js +9 -4
  137. package/dist/domains/chat/tools/badges/tool-badge.cjs.js.map +1 -1
  138. package/dist/domains/chat/tools/badges/tool-badge.es.js +9 -4
  139. package/dist/domains/chat/tools/badges/tool-badge.es.js.map +1 -1
  140. package/dist/domains/chat/tools/badges/use-deferred-input-request.cjs.js +81 -0
  141. package/dist/domains/chat/tools/badges/use-deferred-input-request.cjs.js.map +1 -0
  142. package/dist/domains/chat/tools/badges/use-deferred-input-request.d.ts +1 -0
  143. package/dist/domains/chat/tools/badges/use-deferred-input-request.es.js +77 -0
  144. package/dist/domains/chat/tools/badges/use-deferred-input-request.es.js.map +1 -0
  145. package/dist/domains/chat/tools/badges/use-mcp-task-progress.cjs.js +11 -2
  146. package/dist/domains/chat/tools/badges/use-mcp-task-progress.cjs.js.map +1 -1
  147. package/dist/domains/chat/tools/badges/use-mcp-task-progress.es.js +11 -2
  148. package/dist/domains/chat/tools/badges/use-mcp-task-progress.es.js.map +1 -1
  149. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +1 -1
  150. package/dist/domains/chat/tools/badges/workflow-badge.es.js +1 -1
  151. package/dist/domains/chat/tools/connect-prompt-tool.cjs.js +79 -4
  152. package/dist/domains/chat/tools/connect-prompt-tool.cjs.js.map +1 -1
  153. package/dist/domains/chat/tools/connect-prompt-tool.es.js +79 -4
  154. package/dist/domains/chat/tools/connect-prompt-tool.es.js.map +1 -1
  155. package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js +238 -0
  156. package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js.map +1 -0
  157. package/dist/domains/chat/tools/mcp-input-request-tool.d.ts +1 -0
  158. package/dist/domains/chat/tools/mcp-input-request-tool.es.js +237 -0
  159. package/dist/domains/chat/tools/mcp-input-request-tool.es.js.map +1 -0
  160. package/dist/domains/chat/tools/mcp-input-request.cjs.js +40 -0
  161. package/dist/domains/chat/tools/mcp-input-request.cjs.js.map +1 -0
  162. package/dist/domains/chat/tools/mcp-input-request.d.ts +1 -0
  163. package/dist/domains/chat/tools/mcp-input-request.es.js +33 -0
  164. package/dist/domains/chat/tools/mcp-input-request.es.js.map +1 -0
  165. package/dist/domains/chat/tools/tool-card-kind.cjs.js +9 -4
  166. package/dist/domains/chat/tools/tool-card-kind.cjs.js.map +1 -1
  167. package/dist/domains/chat/tools/tool-card-kind.es.js +9 -5
  168. package/dist/domains/chat/tools/tool-card-kind.es.js.map +1 -1
  169. package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
  170. package/dist/domains/chat/tools/tool-card.es.js +1 -1
  171. package/dist/domains/chat/tools/tool-groups.cjs.js +1 -1
  172. package/dist/domains/chat/tools/tool-groups.es.js +1 -1
  173. package/dist/domains/chat.cjs.js +5 -3
  174. package/dist/domains/chat.es.js +4 -4
  175. package/dist/domains/connect/types.cjs.js.map +1 -1
  176. package/dist/domains/connect/types.es.js.map +1 -1
  177. package/dist/domains/connect/use-user-connect.cjs.js +19 -2
  178. package/dist/domains/connect/use-user-connect.cjs.js.map +1 -1
  179. package/dist/domains/connect/use-user-connect.es.js +19 -2
  180. package/dist/domains/connect/use-user-connect.es.js.map +1 -1
  181. package/dist/domains/dashboards/components/dashboard-renderer.cjs.js +4 -3
  182. package/dist/domains/dashboards/components/dashboard-renderer.cjs.js.map +1 -1
  183. package/dist/domains/dashboards/components/dashboard-renderer.es.js +4 -3
  184. package/dist/domains/dashboards/components/dashboard-renderer.es.js.map +1 -1
  185. package/dist/domains/dashboards/components/widget-chrome.cjs.js +1 -1
  186. package/dist/domains/dashboards/components/widget-chrome.es.js +1 -1
  187. package/dist/domains/dashboards/components/widget-error.cjs.js +1 -1
  188. package/dist/domains/dashboards/components/widget-error.es.js +1 -1
  189. package/dist/domains/dashboards/hooks/use-widget-views.cjs.js +4 -3
  190. package/dist/domains/dashboards/hooks/use-widget-views.cjs.js.map +1 -1
  191. package/dist/domains/dashboards/hooks/use-widget-views.es.js +4 -3
  192. package/dist/domains/dashboards/hooks/use-widget-views.es.js.map +1 -1
  193. package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js +9 -6
  194. package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js.map +1 -1
  195. package/dist/domains/dashboards/kinds/scores/scores-widget.es.js +9 -6
  196. package/dist/domains/dashboards/kinds/scores/scores-widget.es.js.map +1 -1
  197. package/dist/domains/dashboards/kinds/table/table-tabs.cjs.js +2 -2
  198. package/dist/domains/dashboards/kinds/table/table-tabs.es.js +2 -2
  199. package/dist/domains/dashboards/kinds/table/table-widget.cjs.js +1 -1
  200. package/dist/domains/dashboards/kinds/table/table-widget.es.js +1 -1
  201. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js +6 -5
  202. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js.map +1 -1
  203. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js +6 -5
  204. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js.map +1 -1
  205. package/dist/domains/dashboards/lib/chrome.cjs.js +9 -2
  206. package/dist/domains/dashboards/lib/chrome.cjs.js.map +1 -1
  207. package/dist/domains/dashboards/lib/chrome.es.js +9 -2
  208. package/dist/domains/dashboards/lib/chrome.es.js.map +1 -1
  209. package/dist/domains/dashboards/widget-kind.cjs.js.map +1 -1
  210. package/dist/domains/dashboards/widget-kind.es.js.map +1 -1
  211. package/dist/domains/knowledge/components/KnowledgePageCard.cjs.js +48 -0
  212. package/dist/domains/knowledge/components/KnowledgePageCard.cjs.js.map +1 -0
  213. package/dist/domains/knowledge/components/KnowledgePageCard.d.ts +1 -0
  214. package/dist/domains/knowledge/components/KnowledgePageCard.es.js +47 -0
  215. package/dist/domains/knowledge/components/KnowledgePageCard.es.js.map +1 -0
  216. package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js +63 -5
  217. package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js.map +1 -1
  218. package/dist/domains/knowledge/components/KnowledgePageDetail.es.js +64 -6
  219. package/dist/domains/knowledge/components/KnowledgePageDetail.es.js.map +1 -1
  220. package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js +485 -47
  221. package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js.map +1 -1
  222. package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js +487 -50
  223. package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js.map +1 -1
  224. package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js +1051 -123
  225. package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js.map +1 -1
  226. package/dist/domains/knowledge/components/KnowledgePageGraph.es.js +1054 -126
  227. package/dist/domains/knowledge/components/KnowledgePageGraph.es.js.map +1 -1
  228. package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js +75 -3
  229. package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js.map +1 -1
  230. package/dist/domains/knowledge/components/KnowledgePageTree.es.js +76 -4
  231. package/dist/domains/knowledge/components/KnowledgePageTree.es.js.map +1 -1
  232. package/dist/domains/knowledge/lib/circleText.cjs.js +9 -0
  233. package/dist/domains/knowledge/lib/circleText.cjs.js.map +1 -0
  234. package/dist/domains/knowledge/lib/circleText.d.ts +1 -0
  235. package/dist/domains/knowledge/lib/circleText.es.js +8 -0
  236. package/dist/domains/knowledge/lib/circleText.es.js.map +1 -0
  237. package/dist/domains/knowledge/lib/fitViewport.cjs.js +82 -0
  238. package/dist/domains/knowledge/lib/fitViewport.cjs.js.map +1 -0
  239. package/dist/domains/knowledge/lib/fitViewport.d.ts +1 -0
  240. package/dist/domains/knowledge/lib/fitViewport.es.js +73 -0
  241. package/dist/domains/knowledge/lib/fitViewport.es.js.map +1 -0
  242. package/dist/domains/knowledge/lib/graphShape.cjs.js +524 -0
  243. package/dist/domains/knowledge/lib/graphShape.cjs.js.map +1 -0
  244. package/dist/domains/knowledge/lib/graphShape.d.ts +1 -0
  245. package/dist/domains/knowledge/lib/graphShape.es.js +499 -0
  246. package/dist/domains/knowledge/lib/graphShape.es.js.map +1 -0
  247. package/dist/domains/knowledge/lib/linkCountsText.cjs.js +11 -0
  248. package/dist/domains/knowledge/lib/linkCountsText.cjs.js.map +1 -0
  249. package/dist/domains/knowledge/lib/linkCountsText.d.ts +1 -0
  250. package/dist/domains/knowledge/lib/linkCountsText.es.js +10 -0
  251. package/dist/domains/knowledge/lib/linkCountsText.es.js.map +1 -0
  252. package/dist/domains/knowledge/lib/pageAddress.cjs.js +29 -0
  253. package/dist/domains/knowledge/lib/pageAddress.cjs.js.map +1 -0
  254. package/dist/domains/knowledge/lib/pageAddress.d.ts +1 -0
  255. package/dist/domains/knowledge/lib/pageAddress.es.js +27 -0
  256. package/dist/domains/knowledge/lib/pageAddress.es.js.map +1 -0
  257. package/dist/domains/knowledge/lib/pageGraph.cjs.js +11 -11
  258. package/dist/domains/knowledge/lib/pageGraph.cjs.js.map +1 -1
  259. package/dist/domains/knowledge/lib/pageGraph.es.js +11 -11
  260. package/dist/domains/knowledge/lib/pageGraph.es.js.map +1 -1
  261. package/dist/domains/knowledge/lib/pageRefs.cjs.js +69 -0
  262. package/dist/domains/knowledge/lib/pageRefs.cjs.js.map +1 -0
  263. package/dist/domains/knowledge/lib/pageRefs.d.ts +1 -0
  264. package/dist/domains/knowledge/lib/pageRefs.es.js +66 -0
  265. package/dist/domains/knowledge/lib/pageRefs.es.js.map +1 -0
  266. package/dist/domains/knowledge/lib/pageTree.cjs.js +5 -0
  267. package/dist/domains/knowledge/lib/pageTree.cjs.js.map +1 -1
  268. package/dist/domains/knowledge/lib/pageTree.es.js +5 -1
  269. package/dist/domains/knowledge/lib/pageTree.es.js.map +1 -1
  270. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.cjs.js +82 -0
  271. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.cjs.js.map +1 -0
  272. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.d.ts +1 -0
  273. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.es.js +78 -0
  274. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.es.js.map +1 -0
  275. package/dist/domains/knowledge/lib/tooltipSide.cjs.js +77 -0
  276. package/dist/domains/knowledge/lib/tooltipSide.cjs.js.map +1 -0
  277. package/dist/domains/knowledge/lib/tooltipSide.d.ts +1 -0
  278. package/dist/domains/knowledge/lib/tooltipSide.es.js +75 -0
  279. package/dist/domains/knowledge/lib/tooltipSide.es.js.map +1 -0
  280. package/dist/domains/knowledge/lib/useLeavingNodes.cjs.js +65 -0
  281. package/dist/domains/knowledge/lib/useLeavingNodes.cjs.js.map +1 -0
  282. package/dist/domains/knowledge/lib/useLeavingNodes.d.ts +1 -0
  283. package/dist/domains/knowledge/lib/useLeavingNodes.es.js +62 -0
  284. package/dist/domains/knowledge/lib/useLeavingNodes.es.js.map +1 -0
  285. package/dist/domains/knowledge/lib/useStableWhile.cjs.js +15 -0
  286. package/dist/domains/knowledge/lib/useStableWhile.cjs.js.map +1 -0
  287. package/dist/domains/knowledge/lib/useStableWhile.d.ts +1 -0
  288. package/dist/domains/knowledge/lib/useStableWhile.es.js +14 -0
  289. package/dist/domains/knowledge/lib/useStableWhile.es.js.map +1 -0
  290. package/dist/domains/metrics/components/agent-runs-card.cjs.js +3 -3
  291. package/dist/domains/metrics/components/agent-runs-card.es.js +3 -3
  292. package/dist/domains/metrics/components/breakdown/breakdown-tab-body.cjs.js +1 -1
  293. package/dist/domains/metrics/components/breakdown/breakdown-tab-body.es.js +1 -1
  294. package/dist/domains/metrics/components/breakdown-card.cjs.js +1 -1
  295. package/dist/domains/metrics/components/breakdown-card.es.js +1 -1
  296. package/dist/domains/metrics/components/chart-area.cjs.js +1 -1
  297. package/dist/domains/metrics/components/chart-area.es.js +1 -1
  298. package/dist/domains/metrics/components/chart-card-error.cjs.js +1 -1
  299. package/dist/domains/metrics/components/chart-card-error.es.js +1 -1
  300. package/dist/domains/metrics/components/chart-card.cjs.js +1 -1
  301. package/dist/domains/metrics/components/chart-card.es.js +1 -1
  302. package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
  303. package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
  304. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js +3 -2
  305. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js.map +1 -1
  306. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js +3 -2
  307. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js.map +1 -1
  308. package/dist/domains/metrics/components/failure-rate-card.cjs.js +3 -2
  309. package/dist/domains/metrics/components/failure-rate-card.cjs.js.map +1 -1
  310. package/dist/domains/metrics/components/failure-rate-card.es.js +3 -2
  311. package/dist/domains/metrics/components/failure-rate-card.es.js.map +1 -1
  312. package/dist/domains/metrics/components/latency-card.cjs.js +3 -2
  313. package/dist/domains/metrics/components/latency-card.cjs.js.map +1 -1
  314. package/dist/domains/metrics/components/latency-card.es.js +3 -2
  315. package/dist/domains/metrics/components/latency-card.es.js.map +1 -1
  316. package/dist/domains/metrics/components/metrics-time-range-chip.cjs.js +1 -1
  317. package/dist/domains/metrics/components/metrics-time-range-chip.es.js +1 -1
  318. package/dist/domains/metrics/components/scores-card.cjs.js +2 -1
  319. package/dist/domains/metrics/components/scores-card.cjs.js.map +1 -1
  320. package/dist/domains/metrics/components/scores-card.es.js +2 -1
  321. package/dist/domains/metrics/components/scores-card.es.js.map +1 -1
  322. package/dist/domains/metrics/components/token-usage-card.cjs.js +3 -3
  323. package/dist/domains/metrics/components/token-usage-card.es.js +3 -3
  324. package/dist/domains/metrics/components/trace-aggregate-card.cjs.js +1 -1
  325. package/dist/domains/metrics/components/trace-aggregate-card.es.js +1 -1
  326. package/dist/domains/observability/components/observability-histogram.cjs.js +1 -1
  327. package/dist/domains/observability/components/observability-histogram.es.js +1 -1
  328. package/dist/domains/scores/components/trace-scores-list.cjs.js +2 -2
  329. package/dist/domains/scores/components/trace-scores-list.es.js +2 -2
  330. package/dist/domains/skills/skill-simple-form.cjs.js +1 -1
  331. package/dist/domains/skills/skill-simple-form.es.js +1 -1
  332. package/dist/domains/spans/components/spans-filter-bar.cjs.js +2 -2
  333. package/dist/domains/spans/components/spans-filter-bar.es.js +2 -2
  334. package/dist/domains/spans/hooks/use-spans-filter-bar.cjs.js +1 -1
  335. package/dist/domains/spans/hooks/use-spans-filter-bar.es.js +1 -1
  336. package/dist/domains/threads/components/threads-filter-bar.cjs.js +2 -2
  337. package/dist/domains/threads/components/threads-filter-bar.es.js +2 -2
  338. package/dist/domains/threads/hooks/use-threads-filter-bar.cjs.js +1 -1
  339. package/dist/domains/threads/hooks/use-threads-filter-bar.es.js +1 -1
  340. package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +1 -1
  341. package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +1 -1
  342. package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +1 -1
  343. package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +1 -1
  344. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +2 -2
  345. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +2 -2
  346. package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +2 -2
  347. package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +2 -2
  348. package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +1 -1
  349. package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +1 -1
  350. package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +1 -1
  351. package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +1 -1
  352. package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +1 -1
  353. package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +1 -1
  354. package/dist/domains/traces/components/span-payload/span-processor-mutations.cjs.js +1 -1
  355. package/dist/domains/traces/components/span-payload/span-processor-mutations.es.js +1 -1
  356. package/dist/domains/traces/components/span-payload/span-tools-section.cjs.js +1 -1
  357. package/dist/domains/traces/components/span-payload/span-tools-section.es.js +1 -1
  358. package/dist/domains/traces/components/span-timeline-row.cjs.js +1 -1
  359. package/dist/domains/traces/components/span-timeline-row.es.js +1 -1
  360. package/dist/domains/traces/components/span-timing-hover-card.cjs.js +1 -1
  361. package/dist/domains/traces/components/span-timing-hover-card.es.js +1 -1
  362. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +8 -2
  363. package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
  364. package/dist/domains/traces/components/trace-data-panel-view.es.js +8 -2
  365. package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
  366. package/dist/domains/traces/components/trace-error-cell.cjs.js +1 -1
  367. package/dist/domains/traces/components/trace-error-cell.es.js +1 -1
  368. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js +2 -2
  369. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js +2 -2
  370. package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.cjs.js +1 -1
  371. package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.es.js +1 -1
  372. package/dist/domains/workflows/runs/workflow-run-list.cjs.js +1 -1
  373. package/dist/domains/workflows/runs/workflow-run-list.es.js +1 -1
  374. package/dist/domains/workflows/workflow/input/workflow-processor-input.cjs.js +2 -2
  375. package/dist/domains/workflows/workflow/input/workflow-processor-input.es.js +2 -2
  376. package/dist/domains/workflows/workflow/use-workflow-trigger.cjs.js +3 -3
  377. package/dist/domains/workflows/workflow/use-workflow-trigger.es.js +3 -3
  378. package/dist/domains/workflows/workflow/workflow-input-data.cjs.js +1 -1
  379. package/dist/domains/workflows/workflow/workflow-input-data.es.js +1 -1
  380. package/dist/domains/workflows/workflow/workflow-suspended-steps.cjs.js +2 -2
  381. package/dist/domains/workflows/workflow/workflow-suspended-steps.es.js +2 -2
  382. package/dist/domains/workflows/workflow/workflow-time-travel-form.cjs.js +2 -2
  383. package/dist/domains/workflows/workflow/workflow-time-travel-form.es.js +2 -2
  384. package/dist/domains/workspace/components/workspace-add-skill-dialog.cjs.js +1 -1
  385. package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js +1 -1
  386. package/dist/domains/workspace/components/workspace-markdown-preview.cjs.js +1 -1
  387. package/dist/domains/workspace/components/workspace-markdown-preview.es.js +1 -1
  388. package/dist/{filter-bar-time-range-mg9JeYue.js → filter-bar-time-range-qlV8p7hp.js} +2 -2
  389. package/dist/{filter-bar-time-range-mg9JeYue.js.map → filter-bar-time-range-qlV8p7hp.js.map} +1 -1
  390. package/dist/{filter-bar-time-range-BA-pXMlo.cjs → filter-bar-time-range-zdM024JD.cjs} +2 -2
  391. package/dist/{filter-bar-time-range-BA-pXMlo.cjs.map → filter-bar-time-range-zdM024JD.cjs.map} +1 -1
  392. package/dist/lib/form/dynamic-form.cjs.js +2 -2
  393. package/dist/lib/form/dynamic-form.es.js +2 -2
  394. package/dist/lib/form/json-draft.cjs.js +1 -1
  395. package/dist/lib/form/json-draft.es.js +1 -1
  396. package/dist/lib/form/zod-provider.cjs.js +1 -1
  397. package/dist/lib/form/zod-provider.es.js +1 -1
  398. package/dist/{span-payload-primitives-B3RdahsC.js → span-payload-primitives-CKKIAVPJ.js} +4 -4
  399. package/dist/{span-payload-primitives-B3RdahsC.js.map → span-payload-primitives-CKKIAVPJ.js.map} +1 -1
  400. package/dist/{span-payload-primitives-_2d-pAOD.cjs → span-payload-primitives-D4tHWN2W.cjs} +4 -4
  401. package/dist/{span-payload-primitives-_2d-pAOD.cjs.map → span-payload-primitives-D4tHWN2W.cjs.map} +1 -1
  402. package/dist/src/domains/chat/knowledge/knowledge-links.d.ts +32 -4
  403. package/dist/src/domains/chat/knowledge/pinned-knowledge-data.d.ts +2 -0
  404. package/dist/src/domains/chat/tools/badges/knowledge-body-range.d.ts +12 -0
  405. package/dist/src/domains/chat/tools/badges/knowledge-tool-badge.d.ts +5 -2
  406. package/dist/src/domains/chat/tools/badges/mcp-input-request-badge.d.ts +18 -0
  407. package/dist/src/domains/chat/tools/badges/tool-badge.d.ts +4 -1
  408. package/dist/src/domains/chat/tools/badges/use-deferred-input-request.d.ts +44 -0
  409. package/dist/src/domains/chat/tools/badges/use-mcp-task-progress.d.ts +6 -1
  410. package/dist/src/domains/chat/tools/connect-prompt-tool.d.ts +10 -1
  411. package/dist/src/domains/chat/tools/mcp-input-request-tool.d.ts +18 -0
  412. package/dist/src/domains/chat/tools/mcp-input-request.d.ts +40 -0
  413. package/dist/src/domains/chat/tools/tool-card-kind.d.ts +4 -2
  414. package/dist/src/domains/chat/tools/tool-card.d.ts +1 -1
  415. package/dist/src/domains/connect/types.d.ts +16 -0
  416. package/dist/src/domains/dashboards/components/dashboard-renderer.d.ts +4 -2
  417. package/dist/src/domains/dashboards/hooks/use-widget-views.d.ts +4 -3
  418. package/dist/src/domains/dashboards/index.d.ts +1 -1
  419. package/dist/src/domains/dashboards/kinds/scores/scores-widget.d.ts +1 -1
  420. package/dist/src/domains/dashboards/lib/chrome.d.ts +6 -4
  421. package/dist/src/domains/dashboards/widget-kind.d.ts +12 -0
  422. package/dist/src/domains/knowledge/components/KnowledgePageCard.d.ts +23 -0
  423. package/dist/src/domains/knowledge/components/KnowledgePageExplorer.d.ts +29 -0
  424. package/dist/src/domains/knowledge/components/KnowledgePageGraph.d.ts +27 -1
  425. package/dist/src/domains/knowledge/components/KnowledgePageTree.d.ts +2 -1
  426. package/dist/src/domains/knowledge/lib/circleText.d.ts +2 -0
  427. package/dist/src/domains/knowledge/lib/fitViewport.d.ts +67 -0
  428. package/dist/src/domains/knowledge/lib/graphShape.d.ts +131 -0
  429. package/dist/src/domains/knowledge/lib/linkCountsText.d.ts +5 -0
  430. package/dist/src/domains/knowledge/lib/pageAddress.d.ts +5 -0
  431. package/dist/src/domains/knowledge/lib/pageGraph.d.ts +4 -4
  432. package/dist/src/domains/knowledge/lib/pageRefs.d.ts +15 -0
  433. package/dist/src/domains/knowledge/lib/pageTree.d.ts +2 -0
  434. package/dist/src/domains/knowledge/lib/remarkKnowledgeLinks.d.ts +13 -0
  435. package/dist/src/domains/knowledge/lib/tooltipSide.d.ts +40 -0
  436. package/dist/src/domains/knowledge/lib/useLeavingNodes.d.ts +14 -0
  437. package/dist/src/domains/knowledge/lib/useStableWhile.d.ts +5 -0
  438. package/dist/src/domains/knowledge/pageTypes.d.ts +6 -1
  439. package/dist/src/ds/components/DateTimeRangePicker/date-time-range-picker.d.ts +12 -1
  440. package/dist/src/ds/components/MarkdownRenderer/markdown-renderer.d.ts +8 -1
  441. package/dist/src/ds/components/MetricsCard/metrics-card-headline.d.ts +1 -1
  442. package/dist/src/ds/components/MetricsLineChart/metrics-line-chart.d.ts +8 -0
  443. package/dist/src/ds/components/ai/tool-call/tool-phrases.d.ts +6 -0
  444. package/dist/style.css +73 -2
  445. package/dist/{tool-approval-1qiB4hhG.cjs → tool-approval-CJvPDL7D.cjs} +4 -4
  446. package/dist/{tool-approval-1qiB4hhG.cjs.map → tool-approval-CJvPDL7D.cjs.map} +1 -1
  447. package/dist/{tool-approval-B6MFcaKV.js → tool-approval-DyN11vFA.js} +4 -4
  448. package/dist/{tool-approval-B6MFcaKV.js.map → tool-approval-DyN11vFA.js.map} +1 -1
  449. package/dist/{tool-call-Bu66PkD-.cjs → tool-call-DBn14X-3.cjs} +9 -3
  450. package/dist/{tool-call-Bu66PkD-.cjs.map → tool-call-DBn14X-3.cjs.map} +1 -1
  451. package/dist/{tool-call-Ch9-jjXU.js → tool-call-Dsj43lvJ.js} +9 -3
  452. package/dist/{tool-call-Ch9-jjXU.js.map → tool-call-Dsj43lvJ.js.map} +1 -1
  453. package/dist/{tool-card-DrqPZfPQ.cjs → tool-card-BOLXeKIp.cjs} +167 -126
  454. package/dist/tool-card-BOLXeKIp.cjs.map +1 -0
  455. package/dist/{tool-card-sO6P2Qj4.js → tool-card-HZ5bm7ue.js} +168 -127
  456. package/dist/tool-card-HZ5bm7ue.js.map +1 -0
  457. package/dist/{tool-presentation-DvCsb_kz.js → tool-presentation-CvibOP1J.js} +6 -1
  458. package/dist/tool-presentation-CvibOP1J.js.map +1 -0
  459. package/dist/{tool-presentation-CQlDEwgS.cjs → tool-presentation-D6nzVruN.cjs} +6 -1
  460. package/dist/tool-presentation-D6nzVruN.cjs.map +1 -0
  461. package/package.json +11 -11
  462. package/dist/MarkdownRenderer-2GOXQJEv.js.map +0 -1
  463. package/dist/MarkdownRenderer-CB8Z_CHc.cjs.map +0 -1
  464. package/dist/MetricsCard-CEB-f2sv.cjs.map +0 -1
  465. package/dist/MetricsCard-M8awJ2B_.js.map +0 -1
  466. package/dist/MetricsLineChart-BhHoduO0.js.map +0 -1
  467. package/dist/MetricsLineChart-CjBm4IXu.cjs.map +0 -1
  468. package/dist/date-time-range-picker-CTt7Od0P.cjs.map +0 -1
  469. package/dist/date-time-range-picker-DKh1K9Iy.js.map +0 -1
  470. package/dist/domains/knowledge/lib/pageLayout.cjs.js +0 -49
  471. package/dist/domains/knowledge/lib/pageLayout.cjs.js.map +0 -1
  472. package/dist/domains/knowledge/lib/pageLayout.d.ts +0 -1
  473. package/dist/domains/knowledge/lib/pageLayout.es.js +0 -48
  474. package/dist/domains/knowledge/lib/pageLayout.es.js.map +0 -1
  475. package/dist/src/domains/knowledge/lib/pageLayout.d.ts +0 -24
  476. package/dist/tool-card-DrqPZfPQ.cjs.map +0 -1
  477. package/dist/tool-card-sO6P2Qj4.js.map +0 -1
  478. package/dist/tool-presentation-CQlDEwgS.cjs.map +0 -1
  479. package/dist/tool-presentation-DvCsb_kz.js.map +0 -1
@@ -15,9 +15,16 @@ var viewValue = (label, index) => {
15
15
  var viewLabel = (label, index) => label?.trim() || `View ${index + 1}`;
16
16
  /**
17
17
  * The card title for the open view: the widget's title for a single view; with several, the open
18
- * view's label, as a menu of every view (as the metrics cards switch views).
18
+ * view's label, as a menu of every view (as the metrics cards switch views). With somewhere to
19
+ * expand to, the widget's title links there instead.
19
20
  */
20
- function viewTitle(widget, views, index, onChoose) {
21
+ function viewTitle(widget, views, index, onChoose, expand) {
22
+ const href = expand?.href(widget);
23
+ if (href) return {
24
+ title: widget.title?.trim() ? widget.title : viewLabel(views[0]?.label, 0),
25
+ href,
26
+ LinkComponent: expand?.LinkComponent
27
+ };
21
28
  if (views.length < 2) return { title: widget.title ?? "" };
22
29
  const options = views.map((v, i) => ({
23
30
  value: viewValue(v.label, i),
@@ -1 +1 @@
1
- {"version":3,"file":"chrome.es.js","names":[],"sources":["../../../../src/domains/dashboards/lib/chrome.ts"],"sourcesContent":["import type { DashboardWidget, DashboardWidgetView } from '@mastra/client-js';\nimport type { ChartCardProps } from '../../metrics/components/chart-card';\n\n/** What a widget's card shows as its title: `title`, and `titleMenu` with several views. */\nexport type ViewHeading = Pick<ChartCardProps, 'title' | 'titleMenu'>;\n\n/** Filters a gate can't apply, named as the filter bar names them. */\nconst FILTER_NAMES: Record<string, string> = {\n serviceName: 'service',\n requestId: 'request ID',\n experimentId: 'experiment',\n};\n\nexport const unsupportedMessage = (fields: string[], names: Record<string, string> = FILTER_NAMES) =>\n `Not available with a ${fields.map(f => names[f] ?? f).join(' or ')} filter.`;\n\n/** A view's value in the card's menu: its label in kebab case (`Token usage` → `token-usage`), or its position when unlabelled or blank. */\nexport const viewValue = (label: string | undefined, index: number) => {\n const trimmed = label?.trim();\n return trimmed ? trimmed.toLowerCase().replace(/\\s+/g, '-') : String(index);\n};\n\n/** A view's visible name: its label, or `View n` when unlabelled or blank, so every option has an accessible name. */\nexport const viewLabel = (label: string | undefined, index: number) => label?.trim() || `View ${index + 1}`;\n\n/**\n * The card title for the open view: the widget's title for a single view; with several, the open\n * view's label, as a menu of every view (as the metrics cards switch views).\n */\nexport function viewTitle(\n widget: DashboardWidget,\n views: readonly DashboardWidgetView[],\n index: number,\n onChoose: (index: number) => void,\n): ViewHeading {\n if (views.length < 2) return { title: widget.title ?? '' };\n const options = views.map((v, i) => ({ value: viewValue(v.label, i), label: viewLabel(v.label, i) }));\n return {\n title: options[index]?.label ?? '',\n titleMenu: {\n value: options[index]?.value ?? '',\n onValueChange: (value: string) => onChoose(options.findIndex(o => o.value === value)),\n options,\n },\n };\n}\n"],"mappings":";;AAOA,IAAM,eAAuC;CAC3C,aAAa;CACb,WAAW;CACX,cAAc;AAChB;AAEA,IAAa,sBAAsB,QAAkB,QAAgC,iBACnF,wBAAwB,OAAO,KAAI,MAAK,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE;;AAGtE,IAAa,aAAa,OAA2B,UAAkB;CACrE,MAAM,UAAU,OAAO,KAAK;CAC5B,OAAO,UAAU,QAAQ,YAAY,CAAC,CAAC,QAAQ,QAAQ,GAAG,IAAI,OAAO,KAAK;AAC5E;;AAGA,IAAa,aAAa,OAA2B,UAAkB,OAAO,KAAK,KAAK,QAAQ,QAAQ;;;;;AAMxG,SAAgB,UACd,QACA,OACA,OACA,UACa;CACb,IAAI,MAAM,SAAS,GAAG,OAAO,EAAE,OAAO,OAAO,SAAS,GAAG;CACzD,MAAM,UAAU,MAAM,KAAK,GAAG,OAAO;EAAE,OAAO,UAAU,EAAE,OAAO,CAAC;EAAG,OAAO,UAAU,EAAE,OAAO,CAAC;CAAE,EAAE;CACpG,OAAO;EACL,OAAO,QAAQ,MAAM,EAAE,SAAS;EAChC,WAAW;GACT,OAAO,QAAQ,MAAM,EAAE,SAAS;GAChC,gBAAgB,UAAkB,SAAS,QAAQ,WAAU,MAAK,EAAE,UAAU,KAAK,CAAC;GACpF;EACF;CACF;AACF"}
1
+ {"version":3,"file":"chrome.es.js","names":[],"sources":["../../../../src/domains/dashboards/lib/chrome.ts"],"sourcesContent":["import type { DashboardWidget, DashboardWidgetView } from '@mastra/client-js';\nimport type { ChartCardProps } from '../../metrics/components/chart-card';\nimport type { DashboardExpand } from '../widget-kind';\n\n/** What a widget's card shows as its title: `title`, and `titleMenu` with several views or an expand link. */\nexport type ViewHeading = Pick<ChartCardProps, 'title' | 'titleMenu' | 'href' | 'LinkComponent'>;\n\n/** Filters a gate can't apply, named as the filter bar names them. */\nconst FILTER_NAMES: Record<string, string> = {\n serviceName: 'service',\n requestId: 'request ID',\n experimentId: 'experiment',\n};\n\nexport const unsupportedMessage = (fields: string[], names: Record<string, string> = FILTER_NAMES) =>\n `Not available with a ${fields.map(f => names[f] ?? f).join(' or ')} filter.`;\n\n/** A view's value in the card's menu: its label in kebab case (`Token usage` → `token-usage`), or its position when unlabelled or blank. */\nexport const viewValue = (label: string | undefined, index: number) => {\n const trimmed = label?.trim();\n return trimmed ? trimmed.toLowerCase().replace(/\\s+/g, '-') : String(index);\n};\n\n/** A view's visible name: its label, or `View n` when unlabelled or blank, so every option has an accessible name. */\nexport const viewLabel = (label: string | undefined, index: number) => label?.trim() || `View ${index + 1}`;\n\n/**\n * The card title for the open view: the widget's title for a single view; with several, the open\n * view's label, as a menu of every view (as the metrics cards switch views). With somewhere to\n * expand to, the widget's title links there instead.\n */\nexport function viewTitle(\n widget: DashboardWidget,\n views: readonly DashboardWidgetView[],\n index: number,\n onChoose: (index: number) => void,\n expand?: DashboardExpand,\n): ViewHeading {\n const href = expand?.href(widget);\n if (href) {\n // A link needs a name: a blank title falls back to the first view's label.\n const title = widget.title?.trim() ? widget.title : viewLabel(views[0]?.label, 0);\n return { title, href, LinkComponent: expand?.LinkComponent };\n }\n if (views.length < 2) return { title: widget.title ?? '' };\n const options = views.map((v, i) => ({ value: viewValue(v.label, i), label: viewLabel(v.label, i) }));\n return {\n title: options[index]?.label ?? '',\n titleMenu: {\n value: options[index]?.value ?? '',\n onValueChange: (value: string) => onChoose(options.findIndex(o => o.value === value)),\n options,\n },\n };\n}\n"],"mappings":";;AAQA,IAAM,eAAuC;CAC3C,aAAa;CACb,WAAW;CACX,cAAc;AAChB;AAEA,IAAa,sBAAsB,QAAkB,QAAgC,iBACnF,wBAAwB,OAAO,KAAI,MAAK,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE;;AAGtE,IAAa,aAAa,OAA2B,UAAkB;CACrE,MAAM,UAAU,OAAO,KAAK;CAC5B,OAAO,UAAU,QAAQ,YAAY,CAAC,CAAC,QAAQ,QAAQ,GAAG,IAAI,OAAO,KAAK;AAC5E;;AAGA,IAAa,aAAa,OAA2B,UAAkB,OAAO,KAAK,KAAK,QAAQ,QAAQ;;;;;;AAOxG,SAAgB,UACd,QACA,OACA,OACA,UACA,QACa;CACb,MAAM,OAAO,QAAQ,KAAK,MAAM;CAChC,IAAI,MAGF,OAAO;EAAE,OADK,OAAO,OAAO,KAAK,IAAI,OAAO,QAAQ,UAAU,MAAM,EAAE,EAAE,OAAO,CAAC;EAChE;EAAM,eAAe,QAAQ;CAAc;CAE7D,IAAI,MAAM,SAAS,GAAG,OAAO,EAAE,OAAO,OAAO,SAAS,GAAG;CACzD,MAAM,UAAU,MAAM,KAAK,GAAG,OAAO;EAAE,OAAO,UAAU,EAAE,OAAO,CAAC;EAAG,OAAO,UAAU,EAAE,OAAO,CAAC;CAAE,EAAE;CACpG,OAAO;EACL,OAAO,QAAQ,MAAM,EAAE,SAAS;EAChC,WAAW;GACT,OAAO,QAAQ,MAAM,EAAE,SAAS;GAChC,gBAAgB,UAAkB,SAAS,QAAQ,WAAU,MAAK,EAAE,UAAU,KAAK,CAAC;GACpF;EACF;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"widget-kind.cjs.js","names":[],"sources":["../../../src/domains/dashboards/widget-kind.ts"],"sourcesContent":["import type { DashboardWidget, DashboardWidgetView } from '@mastra/client-js';\nimport type { ComponentType } from 'react';\nimport type { z } from 'zod/v4';\nimport type { DashboardScope, OnDashboardDrilldown } from './lib/definition';\n\n/** A view whose options passed its kind's schema. */\nexport type ResolvedView<Options> = DashboardWidgetView & { options: Options };\n\nexport type WidgetKindProps<Options> = {\n widget: DashboardWidget;\n /** The views at the page's scope, options parsed. Never empty. */\n views: [ResolvedView<Options>, ...ResolvedView<Options>[]];\n scope: DashboardScope;\n onDrilldown?: OnDashboardDrilldown;\n};\n\n/**\n * One kind of widget, self-contained: the renderer only looks it up by name, checks each view's\n * options against `optionsSchema`, and renders `component`.\n */\nexport type WidgetKind<Options = unknown> = {\n kind: string;\n /** Each view's `options`, parsed before the widget renders. */\n optionsSchema: z.ZodType<Options>;\n /** Further problems with a view, e.g. options naming a query the view doesn't have. */\n issues?: (view: ResolvedView<Options>) => string[];\n component: ComponentType<WidgetKindProps<Options>>;\n};\n\n/** Keeps a kind's options type while it joins a list of kinds of different options. */\nexport const defineWidgetKind = <Options>(kind: WidgetKind<Options>): WidgetKind<Options> => kind;\n\n/** A registry entry, whatever its options. */\nexport type AnyWidgetKind = WidgetKind<any>;\n"],"mappings":";;;AA8BA,IAAa,oBAA6B,SAAmD"}
1
+ {"version":3,"file":"widget-kind.cjs.js","names":[],"sources":["../../../src/domains/dashboards/widget-kind.ts"],"sourcesContent":["import type { DashboardWidget, DashboardWidgetView } from '@mastra/client-js';\nimport type { ComponentType } from 'react';\nimport type { z } from 'zod/v4';\nimport type { ChartCardProps } from '../metrics/components/chart-card';\nimport type { DashboardScope, OnDashboardDrilldown } from './lib/definition';\n\n/** A view whose options passed its kind's schema. */\nexport type ResolvedView<Options> = DashboardWidgetView & { options: Options };\n\nexport type WidgetKindProps<Options> = {\n widget: DashboardWidget;\n /** The views at the page's scope, options parsed. Never empty. */\n views: [ResolvedView<Options>, ...ResolvedView<Options>[]];\n scope: DashboardScope;\n onDrilldown?: OnDashboardDrilldown;\n /** Where a chart card expands to; see `DashboardExpand`. */\n expand?: DashboardExpand;\n};\n\n/**\n * Where a chart widget expands to (a host's query page), as the Gateway Overview's cards do: the card\n * shows its title with an expand icon linking there, in place of its views menu, on its first view.\n * `href` returns `undefined` for a widget with nowhere to go; that card keeps its menu.\n */\nexport type DashboardExpand = {\n href: (widget: DashboardWidget) => string | undefined;\n LinkComponent: NonNullable<ChartCardProps['LinkComponent']>;\n};\n\n/**\n * One kind of widget, self-contained: the renderer only looks it up by name, checks each view's\n * options against `optionsSchema`, and renders `component`.\n */\nexport type WidgetKind<Options = unknown> = {\n kind: string;\n /** Each view's `options`, parsed before the widget renders. */\n optionsSchema: z.ZodType<Options>;\n /** Further problems with a view, e.g. options naming a query the view doesn't have. */\n issues?: (view: ResolvedView<Options>) => string[];\n component: ComponentType<WidgetKindProps<Options>>;\n};\n\n/** Keeps a kind's options type while it joins a list of kinds of different options. */\nexport const defineWidgetKind = <Options>(kind: WidgetKind<Options>): WidgetKind<Options> => kind;\n\n/** A registry entry, whatever its options. */\nexport type AnyWidgetKind = WidgetKind<any>;\n"],"mappings":";;;AA2CA,IAAa,oBAA6B,SAAmD"}
@@ -1 +1 @@
1
- {"version":3,"file":"widget-kind.es.js","names":[],"sources":["../../../src/domains/dashboards/widget-kind.ts"],"sourcesContent":["import type { DashboardWidget, DashboardWidgetView } from '@mastra/client-js';\nimport type { ComponentType } from 'react';\nimport type { z } from 'zod/v4';\nimport type { DashboardScope, OnDashboardDrilldown } from './lib/definition';\n\n/** A view whose options passed its kind's schema. */\nexport type ResolvedView<Options> = DashboardWidgetView & { options: Options };\n\nexport type WidgetKindProps<Options> = {\n widget: DashboardWidget;\n /** The views at the page's scope, options parsed. Never empty. */\n views: [ResolvedView<Options>, ...ResolvedView<Options>[]];\n scope: DashboardScope;\n onDrilldown?: OnDashboardDrilldown;\n};\n\n/**\n * One kind of widget, self-contained: the renderer only looks it up by name, checks each view's\n * options against `optionsSchema`, and renders `component`.\n */\nexport type WidgetKind<Options = unknown> = {\n kind: string;\n /** Each view's `options`, parsed before the widget renders. */\n optionsSchema: z.ZodType<Options>;\n /** Further problems with a view, e.g. options naming a query the view doesn't have. */\n issues?: (view: ResolvedView<Options>) => string[];\n component: ComponentType<WidgetKindProps<Options>>;\n};\n\n/** Keeps a kind's options type while it joins a list of kinds of different options. */\nexport const defineWidgetKind = <Options>(kind: WidgetKind<Options>): WidgetKind<Options> => kind;\n\n/** A registry entry, whatever its options. */\nexport type AnyWidgetKind = WidgetKind<any>;\n"],"mappings":";;AA8BA,IAAa,oBAA6B,SAAmD"}
1
+ {"version":3,"file":"widget-kind.es.js","names":[],"sources":["../../../src/domains/dashboards/widget-kind.ts"],"sourcesContent":["import type { DashboardWidget, DashboardWidgetView } from '@mastra/client-js';\nimport type { ComponentType } from 'react';\nimport type { z } from 'zod/v4';\nimport type { ChartCardProps } from '../metrics/components/chart-card';\nimport type { DashboardScope, OnDashboardDrilldown } from './lib/definition';\n\n/** A view whose options passed its kind's schema. */\nexport type ResolvedView<Options> = DashboardWidgetView & { options: Options };\n\nexport type WidgetKindProps<Options> = {\n widget: DashboardWidget;\n /** The views at the page's scope, options parsed. Never empty. */\n views: [ResolvedView<Options>, ...ResolvedView<Options>[]];\n scope: DashboardScope;\n onDrilldown?: OnDashboardDrilldown;\n /** Where a chart card expands to; see `DashboardExpand`. */\n expand?: DashboardExpand;\n};\n\n/**\n * Where a chart widget expands to (a host's query page), as the Gateway Overview's cards do: the card\n * shows its title with an expand icon linking there, in place of its views menu, on its first view.\n * `href` returns `undefined` for a widget with nowhere to go; that card keeps its menu.\n */\nexport type DashboardExpand = {\n href: (widget: DashboardWidget) => string | undefined;\n LinkComponent: NonNullable<ChartCardProps['LinkComponent']>;\n};\n\n/**\n * One kind of widget, self-contained: the renderer only looks it up by name, checks each view's\n * options against `optionsSchema`, and renders `component`.\n */\nexport type WidgetKind<Options = unknown> = {\n kind: string;\n /** Each view's `options`, parsed before the widget renders. */\n optionsSchema: z.ZodType<Options>;\n /** Further problems with a view, e.g. options naming a query the view doesn't have. */\n issues?: (view: ResolvedView<Options>) => string[];\n component: ComponentType<WidgetKindProps<Options>>;\n};\n\n/** Keeps a kind's options type while it joins a list of kinds of different options. */\nexport const defineWidgetKind = <Options>(kind: WidgetKind<Options>): WidgetKind<Options> => kind;\n\n/** A registry entry, whatever its options. */\nexport type AnyWidgetKind = WidgetKind<any>;\n"],"mappings":";;AA2CA,IAAa,oBAA6B,SAAmD"}
@@ -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",
@@ -1 +1 @@
1
- {"version":3,"file":"KnowledgePageDetail.cjs.js","names":["Txt","Badge","parseRecordSegments","useRef","ChevronRight","Pin","MarkdownRenderer"],"sources":["../../../../src/domains/knowledge/components/KnowledgePageDetail.tsx"],"sourcesContent":["import { ChevronRight, Pin } from 'lucide-react';\nimport { useEffect, useRef } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { parseRecordSegments } from '../lib/recordText';\nimport type {\n KnowledgeActivityAction,\n KnowledgePageActivityPayload,\n KnowledgeNotePayload,\n KnowledgePagePayload,\n KnowledgePinPayload,\n} from '../pageTypes';\n\nimport { Badge } from '@/ds/components/Badge';\nimport { MarkdownRenderer } from '@/ds/components/MarkdownRenderer';\nimport { Txt } from '@/ds/components/Txt';\n\nconst ACTIVITY_LABELS: Record<KnowledgeActivityAction, string> = {\n 'scope-created': 'Scope created',\n 'page-created': 'Page created',\n 'page-updated': 'Page edited',\n 'page-moved': 'Page moved',\n 'page-merged': 'Page merged',\n 'page-deleted': 'Page deleted',\n 'note-added': 'Note added',\n 'note-restamped': 'Note restamped',\n 'note-removed': 'Note removed',\n 'note-restored': 'Note restored',\n 'pin-added': 'Pinned',\n 'pin-removed': 'Unpinned',\n};\n\nfunction formatWhen(iso: string): string {\n const date = new Date(iso);\n return Number.isNaN(date.getTime())\n ? iso\n : date.toLocaleString(undefined, { dateStyle: 'medium', timeStyle: 'short' });\n}\n\nconst RELATIVE_STEPS: Array<[Intl.RelativeTimeFormatUnit, number]> = [\n ['second', 60],\n ['minute', 60],\n ['hour', 24],\n ['day', 7],\n ['week', 4.35],\n ['month', 12],\n ['year', Infinity],\n];\n\n/** \"3 minutes ago\", with the exact time left to a tooltip. */\nfunction formatAgo(iso: string, now = Date.now()): string {\n const time = new Date(iso).getTime();\n if (Number.isNaN(time)) return iso;\n let value = (time - now) / 1000;\n const format = new Intl.RelativeTimeFormat(undefined, { numeric: 'auto' });\n for (const [unit, size] of RELATIVE_STEPS) {\n if (Math.abs(value) < size) return format.format(Math.round(value), unit);\n value /= size;\n }\n return formatWhen(iso);\n}\n\nfunction When({ iso }: { iso: string }) {\n return (\n <time dateTime={iso} title={formatWhen(iso)}>\n {formatAgo(iso)}\n </time>\n );\n}\n\n/** A small round mark with the author's initial, tinted per author so a page's writers tell apart. */\nfunction AuthorMark({ author }: { author: string }) {\n const name = author.includes(':') ? author.slice(author.indexOf(':') + 1) : author;\n let hash = 0;\n for (const char of author) hash = (hash * 31 + char.charCodeAt(0)) | 0;\n const hues = ['--chart-blue', '--chart-purple', '--chart-green', '--chart-orange', '--chart-pink'];\n const hue = hues[Math.abs(hash) % hues.length];\n return (\n <span\n aria-hidden\n className=\"flex size-6 shrink-0 items-center justify-center rounded-full border border-border\"\n style={{ background: `color-mix(in oklab, var(${hue}) 28%, var(--card))` }}\n >\n <Txt as=\"span\" variant=\"meta\" tone=\"ink\">\n {(name.trim()[0] ?? '?').toUpperCase()}\n </Txt>\n </span>\n );\n}\n\n/**\n * The page's address: its home scope, then the keys from that scope down to it\n * (`org:acme#policies/refund`). Null when a page on the way has no key.\n */\nfunction knowledgePagePath(page: KnowledgePagePayload, ancestors: KnowledgePagePayload[]): string | null {\n if (page.isScope) return page.address ?? null;\n const scope = ancestors.find(candidate => candidate.id === page.scopeId);\n if (!scope?.address) return null;\n const below = ancestors.slice(ancestors.indexOf(scope) + 1).filter(candidate => !candidate.isScope);\n const keys = [...below, page].map(candidate => candidate.key);\n if (keys.some(key => !key)) return null;\n return `${scope.address}#${keys.join('/')}`;\n}\n\nfunction Section({ label, count, children }: { label: string; count?: number; children: ReactNode }) {\n return (\n <section aria-label={label} className=\"flex flex-col gap-3\">\n <div className=\"flex items-center gap-2 border-b border-border pb-2\">\n <Txt as=\"h3\" variant=\"eyebrow\" tone=\"muted\" className=\"uppercase\">\n {label}\n </Txt>\n {count !== undefined ? (\n <Badge variant=\"neutral\" size=\"xs\">\n {count}\n </Badge>\n ) : null}\n </div>\n {children}\n </section>\n );\n}\n\nfunction PageLink({\n page,\n onPageClick,\n}: {\n page: KnowledgePagePayload;\n onPageClick: (page: KnowledgePagePayload) => void;\n}) {\n return (\n <button\n type=\"button\"\n className=\"text-left font-medium text-info-indicator hover:underline\"\n onClick={() => onPageClick(page)}\n >\n {page.name}\n </button>\n );\n}\n\n/** One note: who wrote it and when, its text with `[[mentions]]` linked when the page is known, and the scopes it is stamped to. */\nexport function KnowledgeNoteItem({\n note,\n pagesById,\n onPageClick,\n highlighted,\n itemRef,\n showPage,\n compact,\n}: {\n note: KnowledgeNotePayload;\n pagesById: ReadonlyMap<string, KnowledgePagePayload>;\n onPageClick: (page: KnowledgePagePayload) => void;\n highlighted?: boolean;\n itemRef?: (element: HTMLLIElement | null) => void;\n /** Name the page the note sits on, for notes listed away from it. */\n showPage?: boolean;\n /** A tighter layout for popups. */\n compact?: boolean;\n}) {\n const mentioned = note.mentions.map(id => pagesById.get(id)).filter(candidate => candidate !== undefined);\n const scopeLabel = (id: string) => {\n const scopePage = pagesById.get(id);\n return scopePage?.address ?? scopePage?.name ?? id;\n };\n const onPage = showPage ? pagesById.get(note.pageId) : undefined;\n return (\n <li\n ref={itemRef}\n data-highlighted={highlighted || undefined}\n className={`flex gap-3 rounded-lg border border-border bg-card ${compact ? 'p-2' : 'p-3'}`}\n style={highlighted ? { borderColor: 'var(--chart-blue)', boxShadow: '0 0 0 1px var(--chart-blue)' } : undefined}\n >\n {compact ? null : <AuthorMark author={note.provenance.author} />}\n <div className=\"flex min-w-0 flex-1 flex-col gap-1.5\">\n <div className=\"flex flex-wrap items-baseline gap-x-2 gap-y-0.5\">\n <Txt as=\"span\" variant=\"label\" tone=\"ink\">\n {note.provenance.author}\n </Txt>\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\">\n <When iso={note.updatedAt} />\n </Txt>\n {onPage ? (\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\">\n on <PageLink page={onPage} onPageClick={onPageClick} />\n </Txt>\n ) : null}\n </div>\n <p className=\"text-ui-md break-words text-foreground\">\n {parseRecordSegments(note.text).map((segment, index) => {\n if (segment.type === 'text') return <span key={index}>{segment.value}</span>;\n const name = segment.value.trim().toLocaleLowerCase();\n const target = mentioned.find(candidate => candidate.name.trim().toLocaleLowerCase() === name);\n return target ? (\n <button\n key={index}\n type=\"button\"\n className=\"rounded bg-badge-blue-subtle px-1 font-medium text-badge-blue-foreground hover:underline\"\n onClick={() => onPageClick(target)}\n >\n {segment.value}\n </button>\n ) : (\n <span key={index} className=\"font-medium\">\n {segment.value}\n </span>\n );\n })}\n </p>\n {note.stampScopeIds.length > 0 ? (\n <div className=\"flex flex-wrap gap-1\" aria-label=\"Stamped to\">\n {note.stampScopeIds.map(id => (\n <Badge key={id} variant=\"neutral\" size=\"xs\">\n {scopeLabel(id)}\n </Badge>\n ))}\n </div>\n ) : null}\n </div>\n </li>\n );\n}\n\n/**\n * The selected page as a page: where it sits, its body as markdown, its child\n * pages, its notes (each with the scopes it is stamped to and who wrote it),\n * the notes elsewhere that mention it, and its recent activity. Bodies are\n * agent-written, so they render through {@link MarkdownRenderer}, which escapes\n * raw HTML and drops unsafe link schemes.\n *\n * Paged lists take a `…More` slot the host fills with the next page's loader.\n */\nexport function KnowledgePageDetail({\n page,\n notes,\n pin,\n pagesById,\n onPageClick,\n highlightMentionOf,\n ancestors = [],\n mentionedBy = [],\n notesMore,\n childPages,\n activity,\n}: {\n page: KnowledgePagePayload;\n notes: KnowledgeNotePayload[];\n pin?: KnowledgePinPayload;\n /** Loaded pages, for scope names and mention links. */\n pagesById: ReadonlyMap<string, KnowledgePagePayload>;\n onPageClick: (page: KnowledgePagePayload) => void;\n /** Marks the notes that mention this page, e.g. after a mention line in the graph was clicked. */\n highlightMentionOf?: string;\n /** Readable ancestors, root first: a breadcrumb and the page's path. */\n ancestors?: KnowledgePagePayload[];\n /** Notes on other pages that mention this one. */\n mentionedBy?: KnowledgeNotePayload[];\n /** Rendered after the notes: the host's loader for the next page of notes. */\n notesMore?: ReactNode;\n /** The page's children, when the host can list them. */\n childPages?: ReactNode;\n activity?: KnowledgePageActivityPayload[];\n}) {\n const firstHighlighted = useRef<HTMLLIElement | null>(null);\n useEffect(() => {\n firstHighlighted.current?.scrollIntoView?.({ block: 'nearest' });\n }, [highlightMentionOf, notes]);\n let highlightRefSet = false;\n const scope = page.isScope\n ? page\n : (ancestors.find(candidate => candidate.id === page.scopeId) ?? pagesById.get(page.scopeId));\n const path = knowledgePagePath(page, ancestors);\n\n const kind = page.isScope ? (page.displayLabel ?? 'Scope') : 'Page';\n\n return (\n <article aria-label={page.name} className=\"flex min-h-0 flex-col overflow-y-auto\">\n <header className=\"flex flex-col gap-3 border-b border-border bg-fill-subtle px-6 pt-5 pb-4\">\n {ancestors.length > 0 ? (\n <nav aria-label=\"Breadcrumb\">\n <ol className=\"flex flex-wrap items-center gap-1\">\n {ancestors.map(ancestor => (\n <li key={ancestor.id} className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n className=\"text-ui-sm rounded px-1 py-0.5 text-muted-foreground hover:bg-fill hover:text-foreground\"\n onClick={() => onPageClick(ancestor)}\n >\n {ancestor.name}\n </button>\n <ChevronRight size={12} className=\"text-muted-foreground\" aria-hidden />\n </li>\n ))}\n </ol>\n </nav>\n ) : null}\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant={page.isScope ? 'info' : 'neutral'} size=\"sm\">\n {kind}\n </Badge>\n {page.isScope ? null : (\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\">\n in {scope?.address ?? scope?.name ?? page.scopeId}\n </Txt>\n )}\n {pin ? (\n <Badge variant=\"warning\" size=\"sm\" icon={<Pin size={10} aria-hidden />}>\n {pin.audience.length > 0 ? `Pinned for ${pin.audience.join(', ')}` : 'Pinned'}\n </Badge>\n ) : null}\n </div>\n <Txt as=\"h2\" variant=\"title\" className=\"break-words\">\n {page.name}\n </Txt>\n {page.description ? (\n <Txt variant=\"body\" tone=\"muted\">\n {page.description}\n </Txt>\n ) : null}\n </div>\n <dl className=\"flex flex-wrap items-center gap-x-4 gap-y-1\">\n {page.isScope && page.address ? (\n <div className=\"flex items-center gap-1.5\">\n <dt className=\"sr-only\">Address</dt>\n <dd>\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\" font=\"mono\">\n {page.address}\n </Txt>\n </dd>\n </div>\n ) : null}\n {path && !page.isScope ? (\n <div className=\"flex items-center gap-1.5\">\n <dt className=\"sr-only\">Path</dt>\n <dd>\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\" font=\"mono\" data-testid=\"knowledge-page-path\">\n {path}\n </Txt>\n </dd>\n </div>\n ) : null}\n <div className=\"flex items-center gap-1.5\">\n <dt className=\"sr-only\">Version</dt>\n <dd>\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\" data-testid=\"knowledge-page-version\">\n Version {page.version} · updated <When iso={page.updatedAt} /> by {page.updatedBy.author}\n </Txt>\n </dd>\n </div>\n </dl>\n </header>\n\n <div className=\"grid gap-8 p-6 xl:grid-cols-[minmax(0,1fr)_18rem]\">\n <div className=\"flex min-w-0 flex-col gap-8\">\n {page.body ? (\n <div data-testid=\"knowledge-page-body\" className=\"max-w-3xl\">\n <MarkdownRenderer>{page.body}</MarkdownRenderer>\n </div>\n ) : (\n <Txt variant=\"body\" tone=\"muted\" className=\"italic\">\n This {page.isScope ? 'scope' : 'page'} has no body yet.\n </Txt>\n )}\n\n <Section label=\"Notes\" count={notesMore ? undefined : notes.length}>\n {notes.length === 0 ? (\n <Txt variant=\"body\" tone=\"muted\">\n No notes on this page.\n </Txt>\n ) : (\n <ul className=\"flex flex-col gap-2\">\n {notes.map(note => {\n const highlighted = !!highlightMentionOf && note.mentions.includes(highlightMentionOf);\n const takeRef = highlighted && !highlightRefSet;\n if (takeRef) highlightRefSet = true;\n return (\n <KnowledgeNoteItem\n key={note.id}\n note={note}\n pagesById={pagesById}\n onPageClick={onPageClick}\n highlighted={highlighted}\n itemRef={\n takeRef\n ? element => {\n firstHighlighted.current = element;\n }\n : undefined\n }\n />\n );\n })}\n </ul>\n )}\n {notesMore}\n </Section>\n </div>\n\n <aside className=\"flex min-w-0 flex-col gap-8\">\n {childPages ? <Section label=\"Pages\">{childPages}</Section> : null}\n\n {mentionedBy.length > 0 ? (\n <Section label=\"Mentioned in\" count={mentionedBy.length}>\n <ul className=\"flex flex-col gap-2\">\n {mentionedBy.map(note => (\n <KnowledgeNoteItem\n key={note.id}\n note={note}\n pagesById={pagesById}\n onPageClick={onPageClick}\n showPage\n compact\n />\n ))}\n </ul>\n </Section>\n ) : null}\n\n {activity && activity.length > 0 ? (\n <Section label=\"Activity\">\n <ol className=\"relative flex flex-col gap-3 border-l border-border pl-4\">\n {activity.map(event => (\n <li key={event.id} className=\"relative flex flex-col\">\n <span\n aria-hidden\n className=\"absolute top-1.5 -left-5 size-2 rounded-full border border-border bg-card\"\n />\n <Txt as=\"span\" variant=\"body-sm\" tone=\"ink\">\n {ACTIVITY_LABELS[event.action] ?? event.action}\n </Txt>\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\">\n {event.provenance.author} · <When iso={event.createdAt} />\n </Txt>\n </li>\n ))}\n </ol>\n </Section>\n ) : null}\n </aside>\n </div>\n </article>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"KnowledgePageDetail.cjs.js","names":["Txt","createContext","useContext","KNOWLEDGE_REF_PROPERTY","remarkKnowledgeLinks","Badge","knowledgePageRefIndex","parseRecordSegments","useRef","useMemo","ChevronRight","Pin","MarkdownRenderer"],"sources":["../../../../src/domains/knowledge/components/KnowledgePageDetail.tsx"],"sourcesContent":["import { ChevronRight, Pin } from 'lucide-react';\nimport { createContext, useContext, useEffect, useMemo, useRef } from 'react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport type { Components, ExtraProps } from 'react-markdown';\n\nimport { knowledgePageRefIndex } from '../lib/pageRefs';\nimport type { KnowledgePageRefIndex } from '../lib/pageRefs';\nimport { parseRecordSegments } from '../lib/recordText';\nimport { KNOWLEDGE_REF_PROPERTY, remarkKnowledgeLinks } from '../lib/remarkKnowledgeLinks';\nimport type {\n KnowledgeActivityAction,\n KnowledgePageActivityPayload,\n KnowledgeNotePayload,\n KnowledgePagePayload,\n KnowledgePinPayload,\n} from '../pageTypes';\n\nimport { Badge } from '@/ds/components/Badge';\nimport { MarkdownRenderer } from '@/ds/components/MarkdownRenderer';\nimport { Txt } from '@/ds/components/Txt';\n\nconst ACTIVITY_LABELS: Record<KnowledgeActivityAction, string> = {\n 'scope-created': 'Scope created',\n 'page-created': 'Page created',\n 'page-updated': 'Page edited',\n 'page-moved': 'Page moved',\n 'page-merged': 'Page merged',\n 'page-deleted': 'Page deleted',\n 'note-added': 'Note added',\n 'note-restamped': 'Note restamped',\n 'note-removed': 'Note removed',\n 'note-restored': 'Note restored',\n 'pin-added': 'Pinned',\n 'pin-removed': 'Unpinned',\n};\n\nfunction formatWhen(iso: string): string {\n const date = new Date(iso);\n return Number.isNaN(date.getTime())\n ? iso\n : date.toLocaleString(undefined, { dateStyle: 'medium', timeStyle: 'short' });\n}\n\nconst RELATIVE_STEPS: Array<[Intl.RelativeTimeFormatUnit, number]> = [\n ['second', 60],\n ['minute', 60],\n ['hour', 24],\n ['day', 7],\n ['week', 4.35],\n ['month', 12],\n ['year', Infinity],\n];\n\n/** \"3 minutes ago\", with the exact time left to a tooltip. */\nfunction formatAgo(iso: string, now = Date.now()): string {\n const time = new Date(iso).getTime();\n if (Number.isNaN(time)) return iso;\n let value = (time - now) / 1000;\n const format = new Intl.RelativeTimeFormat(undefined, { numeric: 'auto' });\n for (const [unit, size] of RELATIVE_STEPS) {\n if (Math.abs(value) < size) return format.format(Math.round(value), unit);\n value /= size;\n }\n return formatWhen(iso);\n}\n\nfunction When({ iso }: { iso: string }) {\n return (\n <time dateTime={iso} title={formatWhen(iso)}>\n {formatAgo(iso)}\n </time>\n );\n}\n\n/** A small round mark with the author's initial, tinted per author so a page's writers tell apart. */\nfunction AuthorMark({ author }: { author: string }) {\n const name = author.includes(':') ? author.slice(author.indexOf(':') + 1) : author;\n let hash = 0;\n for (const char of author) hash = (hash * 31 + char.charCodeAt(0)) | 0;\n const hues = ['--chart-blue', '--chart-purple', '--chart-green', '--chart-orange', '--chart-pink'];\n const hue = hues[Math.abs(hash) % hues.length];\n return (\n <span\n aria-hidden\n className=\"flex size-6 shrink-0 items-center justify-center rounded-full border border-border\"\n style={{ background: `color-mix(in oklab, var(${hue}) 28%, var(--card))` }}\n >\n <Txt as=\"span\" variant=\"meta\" tone=\"ink\">\n {(name.trim()[0] ?? '?').toUpperCase()}\n </Txt>\n </span>\n );\n}\n\n/**\n * The page's address: its home scope, then the keys from that scope down to it\n * (`org:acme#policies/refund`). Null when a page on the way has no key.\n */\nfunction knowledgePagePath(page: KnowledgePagePayload, ancestors: KnowledgePagePayload[]): string | null {\n if (page.isScope) return page.address ?? null;\n const scope = ancestors.find(candidate => candidate.id === page.scopeId);\n if (!scope?.address) return null;\n const below = ancestors.slice(ancestors.indexOf(scope) + 1).filter(candidate => !candidate.isScope);\n const keys = [...below, page].map(candidate => candidate.key);\n if (keys.some(key => !key)) return null;\n return `${scope.address}#${keys.join('/')}`;\n}\n\nconst BodyLinks = createContext<{\n index: KnowledgePageRefIndex;\n onPageClick: (page: KnowledgePagePayload) => void;\n} | null>(null);\n\n/**\n * A `[[ref]]` from a page body: the page's name as a link when a loaded page answers to the ref, the ref\n * itself in a quiet style when none does. Every other `<span>` the markdown makes passes through.\n */\nfunction BodySpan({ node, ...props }: ComponentProps<'span'> & ExtraProps) {\n const links = useContext(BodyLinks);\n const ref = node?.properties[KNOWLEDGE_REF_PROPERTY];\n if (typeof ref !== 'string' || !links) return <span {...props} />;\n const target = links.index.resolve(ref);\n return target ? (\n <button\n type=\"button\"\n data-testid=\"knowledge-body-link\"\n title={ref}\n className=\"rounded bg-badge-blue-subtle px-1 font-medium text-badge-blue-foreground hover:underline\"\n onClick={() => links.onPageClick(target)}\n >\n {target.name}\n </button>\n ) : (\n <span\n data-testid=\"knowledge-body-link-unresolved\"\n title=\"No loaded page has this address\"\n className=\"rounded border border-dashed border-border px-1 text-muted-foreground\"\n >\n {ref}\n </span>\n );\n}\n\nconst BODY_REMARK_PLUGINS = [remarkKnowledgeLinks];\nconst BODY_COMPONENTS: Components = { span: BodySpan };\n\nfunction Section({ label, count, children }: { label: string; count?: number; children: ReactNode }) {\n return (\n <section aria-label={label} className=\"flex flex-col gap-3\">\n <div className=\"flex items-center gap-2 border-b border-border pb-2\">\n <Txt as=\"h3\" variant=\"eyebrow\" tone=\"muted\" className=\"uppercase\">\n {label}\n </Txt>\n {count !== undefined ? (\n <Badge variant=\"neutral\" size=\"xs\">\n {count}\n </Badge>\n ) : null}\n </div>\n {children}\n </section>\n );\n}\n\nfunction PageLink({\n page,\n onPageClick,\n}: {\n page: KnowledgePagePayload;\n onPageClick: (page: KnowledgePagePayload) => void;\n}) {\n return (\n <button\n type=\"button\"\n className=\"text-left font-medium text-info-indicator hover:underline\"\n onClick={() => onPageClick(page)}\n >\n {page.name}\n </button>\n );\n}\n\nconst refIndexes = new WeakMap<ReadonlyMap<string, KnowledgePagePayload>, KnowledgePageRefIndex>();\n\n/** One ref index per loaded-pages map, shared by every note drawn from it. */\nfunction loadedRefIndex(pagesById: ReadonlyMap<string, KnowledgePagePayload>): KnowledgePageRefIndex {\n let index = refIndexes.get(pagesById);\n if (!index) refIndexes.set(pagesById, (index = knowledgePageRefIndex(pagesById.values())));\n return index;\n}\n\n/** One note: who wrote it and when, its text with `[[mentions]]` linked when the page is known, and the scopes it is stamped to. */\nexport function KnowledgeNoteItem({\n note,\n pagesById,\n onPageClick,\n highlighted,\n itemRef,\n showPage,\n compact,\n}: {\n note: KnowledgeNotePayload;\n pagesById: ReadonlyMap<string, KnowledgePagePayload>;\n onPageClick: (page: KnowledgePagePayload) => void;\n highlighted?: boolean;\n itemRef?: (element: HTMLLIElement | null) => void;\n /** Name the page the note sits on, for notes listed away from it. */\n showPage?: boolean;\n /** A tighter layout for popups. */\n compact?: boolean;\n}) {\n const refIndex = loadedRefIndex(pagesById);\n // Only a page the server resolved the mention to is linked, however the ref is written.\n const mentionTarget = (ref: string) => {\n const target = refIndex.resolve(ref);\n return target && note.mentions.includes(target.id) ? target : undefined;\n };\n const scopeLabel = (id: string) => {\n const scopePage = pagesById.get(id);\n return scopePage?.address ?? scopePage?.name ?? id;\n };\n const onPage = showPage ? pagesById.get(note.pageId) : undefined;\n return (\n <li\n ref={itemRef}\n data-highlighted={highlighted || undefined}\n className={`flex gap-3 rounded-lg border border-border bg-card ${compact ? 'p-2' : 'p-3'}`}\n style={highlighted ? { borderColor: 'var(--chart-blue)', boxShadow: '0 0 0 1px var(--chart-blue)' } : undefined}\n >\n {compact ? null : <AuthorMark author={note.provenance.author} />}\n <div className=\"flex min-w-0 flex-1 flex-col gap-1.5\">\n <div className=\"flex flex-wrap items-baseline gap-x-2 gap-y-0.5\">\n <Txt as=\"span\" variant=\"label\" tone=\"ink\">\n {note.provenance.author}\n </Txt>\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\">\n <When iso={note.updatedAt} />\n </Txt>\n {onPage ? (\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\">\n on <PageLink page={onPage} onPageClick={onPageClick} />\n </Txt>\n ) : null}\n </div>\n <p className=\"text-ui-md break-words text-foreground\">\n {parseRecordSegments(note.text).map((segment, index) => {\n if (segment.type === 'text') return <span key={index}>{segment.value}</span>;\n const target = mentionTarget(segment.value);\n return target ? (\n <button\n key={index}\n type=\"button\"\n className=\"rounded bg-badge-blue-subtle px-1 font-medium text-badge-blue-foreground hover:underline\"\n onClick={() => onPageClick(target)}\n >\n {segment.value}\n </button>\n ) : (\n <span key={index} className=\"font-medium\">\n {segment.value}\n </span>\n );\n })}\n </p>\n {note.stampScopeIds.length > 0 ? (\n <div className=\"flex flex-wrap gap-1\" aria-label=\"Stamped to\">\n {note.stampScopeIds.map(id => (\n <Badge key={id} variant=\"neutral\" size=\"xs\">\n {scopeLabel(id)}\n </Badge>\n ))}\n </div>\n ) : null}\n </div>\n </li>\n );\n}\n\n/**\n * The selected page as a page: where it sits, its body as markdown, its child\n * pages, its notes (each with the scopes it is stamped to and who wrote it),\n * the notes elsewhere that mention it, and its recent activity. Bodies are\n * agent-written, so they render through {@link MarkdownRenderer}, which escapes\n * raw HTML and drops unsafe link schemes.\n *\n * Paged lists take a `…More` slot the host fills with the next page's loader.\n */\nexport function KnowledgePageDetail({\n page,\n notes,\n pin,\n pagesById,\n onPageClick,\n highlightMentionOf,\n ancestors = [],\n mentionedBy = [],\n notesMore,\n childPages,\n activity,\n}: {\n page: KnowledgePagePayload;\n notes: KnowledgeNotePayload[];\n pin?: KnowledgePinPayload;\n /** Loaded pages, for scope names and mention links. */\n pagesById: ReadonlyMap<string, KnowledgePagePayload>;\n onPageClick: (page: KnowledgePagePayload) => void;\n /** Marks the notes that mention this page, e.g. after a mention line in the graph was clicked. */\n highlightMentionOf?: string;\n /** Readable ancestors, root first: a breadcrumb and the page's path. */\n ancestors?: KnowledgePagePayload[];\n /** Notes on other pages that mention this one. */\n mentionedBy?: KnowledgeNotePayload[];\n /** Rendered after the notes: the host's loader for the next page of notes. */\n notesMore?: ReactNode;\n /** The page's children, when the host can list them. */\n childPages?: ReactNode;\n activity?: KnowledgePageActivityPayload[];\n}) {\n const firstHighlighted = useRef<HTMLLIElement | null>(null);\n useEffect(() => {\n firstHighlighted.current?.scrollIntoView?.({ block: 'nearest' });\n }, [highlightMentionOf, notes]);\n let highlightRefSet = false;\n const scope = page.isScope\n ? page\n : (ancestors.find(candidate => candidate.id === page.scopeId) ?? pagesById.get(page.scopeId));\n const path = knowledgePagePath(page, ancestors);\n\n const kind = page.isScope ? (page.displayLabel ?? 'Scope') : 'Page';\n const refIndex = useMemo(\n () => knowledgePageRefIndex([...pagesById.values(), ...ancestors, page]),\n [pagesById, ancestors, page],\n );\n const bodyLinks = useMemo(() => ({ index: refIndex, onPageClick }), [refIndex, onPageClick]);\n\n return (\n <article aria-label={page.name} className=\"flex min-h-0 flex-col overflow-y-auto\">\n <header className=\"flex flex-col gap-3 border-b border-border bg-fill-subtle px-6 pt-5 pb-4\">\n {ancestors.length > 0 ? (\n <nav aria-label=\"Breadcrumb\">\n <ol className=\"flex flex-wrap items-center gap-1\">\n {ancestors.map(ancestor => (\n <li key={ancestor.id} className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n className=\"text-ui-sm rounded px-1 py-0.5 text-muted-foreground hover:bg-fill hover:text-foreground\"\n onClick={() => onPageClick(ancestor)}\n >\n {ancestor.name}\n </button>\n <ChevronRight size={12} className=\"text-muted-foreground\" aria-hidden />\n </li>\n ))}\n </ol>\n </nav>\n ) : null}\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant={page.isScope ? 'info' : 'neutral'} size=\"sm\">\n {kind}\n </Badge>\n {page.isScope ? null : (\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\">\n in {scope?.address ?? scope?.name ?? page.scopeId}\n </Txt>\n )}\n {pin ? (\n <Badge variant=\"warning\" size=\"sm\" icon={<Pin size={10} aria-hidden />}>\n {pin.audience.length > 0 ? `Pinned for ${pin.audience.join(', ')}` : 'Pinned'}\n </Badge>\n ) : null}\n </div>\n <Txt as=\"h2\" variant=\"title\" className=\"break-words\">\n {page.name}\n </Txt>\n {page.description ? (\n <Txt variant=\"body\" tone=\"muted\">\n {page.description}\n </Txt>\n ) : null}\n </div>\n <dl className=\"flex flex-wrap items-center gap-x-4 gap-y-1\">\n {page.isScope && page.address ? (\n <div className=\"flex items-center gap-1.5\">\n <dt className=\"sr-only\">Address</dt>\n <dd>\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\" font=\"mono\">\n {page.address}\n </Txt>\n </dd>\n </div>\n ) : null}\n {path && !page.isScope ? (\n <div className=\"flex items-center gap-1.5\">\n <dt className=\"sr-only\">Path</dt>\n <dd>\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\" font=\"mono\" data-testid=\"knowledge-page-path\">\n {path}\n </Txt>\n </dd>\n </div>\n ) : null}\n <div className=\"flex items-center gap-1.5\">\n <dt className=\"sr-only\">Version</dt>\n <dd>\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\" data-testid=\"knowledge-page-version\">\n Version {page.version} · updated <When iso={page.updatedAt} /> by {page.updatedBy.author}\n </Txt>\n </dd>\n </div>\n </dl>\n </header>\n\n <div className=\"grid gap-8 p-6 xl:grid-cols-[minmax(0,1fr)_18rem]\">\n <div className=\"flex min-w-0 flex-col gap-8\">\n {page.body ? (\n <div data-testid=\"knowledge-page-body\" className=\"max-w-3xl\">\n <BodyLinks.Provider value={bodyLinks}>\n <MarkdownRenderer remarkPlugins={BODY_REMARK_PLUGINS} components={BODY_COMPONENTS}>\n {page.body}\n </MarkdownRenderer>\n </BodyLinks.Provider>\n </div>\n ) : (\n <Txt variant=\"body\" tone=\"muted\" className=\"italic\">\n This {page.isScope ? 'scope' : 'page'} has no body yet.\n </Txt>\n )}\n\n <Section label=\"Notes\" count={notesMore ? undefined : notes.length}>\n {notes.length === 0 ? (\n <Txt variant=\"body\" tone=\"muted\">\n No notes on this page.\n </Txt>\n ) : (\n <ul className=\"flex flex-col gap-2\">\n {notes.map(note => {\n const highlighted = !!highlightMentionOf && note.mentions.includes(highlightMentionOf);\n const takeRef = highlighted && !highlightRefSet;\n if (takeRef) highlightRefSet = true;\n return (\n <KnowledgeNoteItem\n key={note.id}\n note={note}\n pagesById={pagesById}\n onPageClick={onPageClick}\n highlighted={highlighted}\n itemRef={\n takeRef\n ? element => {\n firstHighlighted.current = element;\n }\n : undefined\n }\n />\n );\n })}\n </ul>\n )}\n {notesMore}\n </Section>\n </div>\n\n <aside className=\"flex min-w-0 flex-col gap-8\">\n {childPages ? <Section label=\"Pages\">{childPages}</Section> : null}\n\n {mentionedBy.length > 0 ? (\n <Section label=\"Mentioned in\" count={mentionedBy.length}>\n <ul className=\"flex flex-col gap-2\">\n {mentionedBy.map(note => (\n <KnowledgeNoteItem\n key={note.id}\n note={note}\n pagesById={pagesById}\n onPageClick={onPageClick}\n showPage\n compact\n />\n ))}\n </ul>\n </Section>\n ) : null}\n\n {activity && activity.length > 0 ? (\n <Section label=\"Activity\">\n <ol className=\"relative flex flex-col gap-3 border-l border-border pl-4\">\n {activity.map(event => (\n <li key={event.id} className=\"relative flex flex-col\">\n <span\n aria-hidden\n className=\"absolute top-1.5 -left-5 size-2 rounded-full border border-border bg-card\"\n />\n <Txt as=\"span\" variant=\"body-sm\" tone=\"ink\">\n {ACTIVITY_LABELS[event.action] ?? event.action}\n </Txt>\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\">\n {event.provenance.author} · <When iso={event.createdAt} />\n </Txt>\n </li>\n ))}\n </ol>\n </Section>\n ) : null}\n </aside>\n </div>\n </article>\n );\n}\n"],"mappings":"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"}
@@ -1,8 +1,10 @@
1
1
  import { t as Txt } from "../../../Txt-BM6TVV_c.js";
2
2
  import { t as Badge } from "../../../Badge-aVu5iGAF.js";
3
- import { t as MarkdownRenderer } from "../../../MarkdownRenderer-2GOXQJEv.js";
3
+ import { t as MarkdownRenderer } from "../../../MarkdownRenderer-CI30RqdB.js";
4
+ import { KNOWLEDGE_REF_PROPERTY, remarkKnowledgeLinks } from "../lib/remarkKnowledgeLinks.es.js";
5
+ import { knowledgePageRefIndex } from "../lib/pageRefs.es.js";
4
6
  import { parseRecordSegments } from "../lib/recordText.es.js";
5
- import { useEffect, useRef } from "react";
7
+ import { createContext, useContext, useEffect, useMemo, useRef } from "react";
6
8
  import { jsx, jsxs } from "react/jsx-runtime";
7
9
  import { ChevronRight, Pin } from "lucide-react";
8
10
  // src/domains/knowledge/components/KnowledgePageDetail.tsx
@@ -92,6 +94,32 @@ function knowledgePagePath(page, ancestors) {
92
94
  if (keys.some((key) => !key)) return null;
93
95
  return `${scope.address}#${keys.join("/")}`;
94
96
  }
97
+ var BodyLinks = createContext(null);
98
+ /**
99
+ * A `[[ref]]` from a page body: the page's name as a link when a loaded page answers to the ref, the ref
100
+ * itself in a quiet style when none does. Every other `<span>` the markdown makes passes through.
101
+ */
102
+ function BodySpan({ node, ...props }) {
103
+ const links = useContext(BodyLinks);
104
+ const ref = node?.properties[KNOWLEDGE_REF_PROPERTY];
105
+ if (typeof ref !== "string" || !links) return /* @__PURE__ */ jsx("span", { ...props });
106
+ const target = links.index.resolve(ref);
107
+ return target ? /* @__PURE__ */ jsx("button", {
108
+ type: "button",
109
+ "data-testid": "knowledge-body-link",
110
+ title: ref,
111
+ className: "rounded bg-badge-blue-subtle px-1 font-medium text-badge-blue-foreground hover:underline",
112
+ onClick: () => links.onPageClick(target),
113
+ children: target.name
114
+ }) : /* @__PURE__ */ jsx("span", {
115
+ "data-testid": "knowledge-body-link-unresolved",
116
+ title: "No loaded page has this address",
117
+ className: "rounded border border-dashed border-border px-1 text-muted-foreground",
118
+ children: ref
119
+ });
120
+ }
121
+ var BODY_REMARK_PLUGINS = [remarkKnowledgeLinks];
122
+ var BODY_COMPONENTS = { span: BodySpan };
95
123
  function Section({ label, count, children }) {
96
124
  return /* @__PURE__ */ jsxs("section", {
97
125
  "aria-label": label,
@@ -120,9 +148,20 @@ function PageLink({ page, onPageClick }) {
120
148
  children: page.name
121
149
  });
122
150
  }
151
+ var refIndexes = /* @__PURE__ */ new WeakMap();
152
+ /** One ref index per loaded-pages map, shared by every note drawn from it. */
153
+ function loadedRefIndex(pagesById) {
154
+ let index = refIndexes.get(pagesById);
155
+ if (!index) refIndexes.set(pagesById, index = knowledgePageRefIndex(pagesById.values()));
156
+ return index;
157
+ }
123
158
  /** One note: who wrote it and when, its text with `[[mentions]]` linked when the page is known, and the scopes it is stamped to. */
124
159
  function KnowledgeNoteItem({ note, pagesById, onPageClick, highlighted, itemRef, showPage, compact }) {
125
- const mentioned = note.mentions.map((id) => pagesById.get(id)).filter((candidate) => candidate !== void 0);
160
+ const refIndex = loadedRefIndex(pagesById);
161
+ const mentionTarget = (ref) => {
162
+ const target = refIndex.resolve(ref);
163
+ return target && note.mentions.includes(target.id) ? target : void 0;
164
+ };
126
165
  const scopeLabel = (id) => {
127
166
  const scopePage = pagesById.get(id);
128
167
  return scopePage?.address ?? scopePage?.name ?? id;
@@ -169,8 +208,7 @@ function KnowledgeNoteItem({ note, pagesById, onPageClick, highlighted, itemRef,
169
208
  className: "text-ui-md break-words text-foreground",
170
209
  children: parseRecordSegments(note.text).map((segment, index) => {
171
210
  if (segment.type === "text") return /* @__PURE__ */ jsx("span", { children: segment.value }, index);
172
- const name = segment.value.trim().toLocaleLowerCase();
173
- const target = mentioned.find((candidate) => candidate.name.trim().toLocaleLowerCase() === name);
211
+ const target = mentionTarget(segment.value);
174
212
  return target ? /* @__PURE__ */ jsx("button", {
175
213
  type: "button",
176
214
  className: "rounded bg-badge-blue-subtle px-1 font-medium text-badge-blue-foreground hover:underline",
@@ -213,6 +251,19 @@ function KnowledgePageDetail({ page, notes, pin, pagesById, onPageClick, highlig
213
251
  const scope = page.isScope ? page : ancestors.find((candidate) => candidate.id === page.scopeId) ?? pagesById.get(page.scopeId);
214
252
  const path = knowledgePagePath(page, ancestors);
215
253
  const kind = page.isScope ? page.displayLabel ?? "Scope" : "Page";
254
+ const refIndex = useMemo(() => knowledgePageRefIndex([
255
+ ...pagesById.values(),
256
+ ...ancestors,
257
+ page
258
+ ]), [
259
+ pagesById,
260
+ ancestors,
261
+ page
262
+ ]);
263
+ const bodyLinks = useMemo(() => ({
264
+ index: refIndex,
265
+ onPageClick
266
+ }), [refIndex, onPageClick]);
216
267
  return /* @__PURE__ */ jsxs("article", {
217
268
  "aria-label": page.name,
218
269
  className: "flex min-h-0 flex-col overflow-y-auto",
@@ -339,7 +390,14 @@ function KnowledgePageDetail({ page, notes, pin, pagesById, onPageClick, highlig
339
390
  children: [page.body ? /* @__PURE__ */ jsx("div", {
340
391
  "data-testid": "knowledge-page-body",
341
392
  className: "max-w-3xl",
342
- children: /* @__PURE__ */ jsx(MarkdownRenderer, { children: page.body })
393
+ children: /* @__PURE__ */ jsx(BodyLinks.Provider, {
394
+ value: bodyLinks,
395
+ children: /* @__PURE__ */ jsx(MarkdownRenderer, {
396
+ remarkPlugins: BODY_REMARK_PLUGINS,
397
+ components: BODY_COMPONENTS,
398
+ children: page.body
399
+ })
400
+ })
343
401
  }) : /* @__PURE__ */ jsxs(Txt, {
344
402
  variant: "body",
345
403
  tone: "muted",