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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (338) hide show
  1. package/dist/KnowledgePageGraph.css +55 -0
  2. package/dist/{MarkdownRenderer-2GOXQJEv.js → MarkdownRenderer-CI30RqdB.js} +19 -6
  3. package/dist/MarkdownRenderer-CI30RqdB.js.map +1 -0
  4. package/dist/{MarkdownRenderer-CB8Z_CHc.cjs → MarkdownRenderer-y65WGBhC.cjs} +19 -6
  5. package/dist/MarkdownRenderer-y65WGBhC.cjs.map +1 -0
  6. package/dist/{activity-rJ1NQl_2.js → activity-C8Ql81WM.js} +2 -2
  7. package/dist/{activity-rJ1NQl_2.js.map → activity-C8Ql81WM.js.map} +1 -1
  8. package/dist/{activity-DyB5H3gF.cjs → activity-CcQZeDYi.cjs} +2 -2
  9. package/dist/{activity-DyB5H3gF.cjs.map → activity-CcQZeDYi.cjs.map} +1 -1
  10. package/dist/components/MarkdownRenderer.cjs.js +1 -1
  11. package/dist/components/MarkdownRenderer.es.js +1 -1
  12. package/dist/components/SavedViews.cjs.js +1 -1
  13. package/dist/components/SavedViews.es.js +1 -1
  14. package/dist/components/ai/activity.cjs.js +1 -1
  15. package/dist/components/ai/activity.es.js +1 -1
  16. package/dist/components/ai/plan.cjs.js +1 -1
  17. package/dist/components/ai/plan.es.js +1 -1
  18. package/dist/components/ai/tool-approval.cjs.js +1 -1
  19. package/dist/components/ai/tool-approval.es.js +1 -1
  20. package/dist/components/ai/tool-call.cjs.js +2 -2
  21. package/dist/components/ai/tool-call.es.js +2 -2
  22. package/dist/domains/chat/activity/activity-stretch-line.cjs.js +1 -1
  23. package/dist/domains/chat/activity/activity-stretch-line.es.js +1 -1
  24. package/dist/domains/chat/activity/components/activity-fold.cjs.js +1 -1
  25. package/dist/domains/chat/activity/components/activity-fold.es.js +1 -1
  26. package/dist/domains/chat/activity/components/activity-timed-trigger.cjs.js +1 -1
  27. package/dist/domains/chat/activity/components/activity-timed-trigger.es.js +1 -1
  28. package/dist/domains/chat/activity/components/calls-panel.cjs.js +1 -1
  29. package/dist/domains/chat/activity/components/calls-panel.es.js +1 -1
  30. package/dist/domains/chat/activity/components/stretch-content.cjs.js +1 -1
  31. package/dist/domains/chat/activity/components/stretch-content.es.js +1 -1
  32. package/dist/domains/chat/activity/components/stretch-thought.cjs.js +1 -1
  33. package/dist/domains/chat/activity/components/stretch-thought.es.js +1 -1
  34. package/dist/domains/chat/activity/model/activity-segments.cjs.js +1 -1
  35. package/dist/domains/chat/activity/model/activity-segments.es.js +1 -1
  36. package/dist/domains/chat/activity/model/activity-words.cjs.js +2 -2
  37. package/dist/domains/chat/activity/model/activity-words.es.js +2 -2
  38. package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
  39. package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
  40. package/dist/domains/chat/knowledge/knowledge-links.cjs.js +52 -6
  41. package/dist/domains/chat/knowledge/knowledge-links.cjs.js.map +1 -1
  42. package/dist/domains/chat/knowledge/knowledge-links.es.js +53 -9
  43. package/dist/domains/chat/knowledge/knowledge-links.es.js.map +1 -1
  44. package/dist/domains/chat/knowledge/pinned-knowledge-data.cjs.js +10 -3
  45. package/dist/domains/chat/knowledge/pinned-knowledge-data.cjs.js.map +1 -1
  46. package/dist/domains/chat/knowledge/pinned-knowledge-data.es.js +10 -3
  47. package/dist/domains/chat/knowledge/pinned-knowledge-data.es.js.map +1 -1
  48. package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js +8 -3
  49. package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js.map +1 -1
  50. package/dist/domains/chat/knowledge/pinned-knowledge.es.js +8 -3
  51. package/dist/domains/chat/knowledge/pinned-knowledge.es.js.map +1 -1
  52. package/dist/domains/chat/knowledge.cjs.js +2 -0
  53. package/dist/domains/chat/knowledge.es.js +2 -2
  54. package/dist/domains/chat/messages/message-row.cjs.js +3 -3
  55. package/dist/domains/chat/messages/message-row.es.js +3 -3
  56. package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
  57. package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
  58. package/dist/domains/chat/messages/reasoning-content.cjs.js +1 -1
  59. package/dist/domains/chat/messages/reasoning-content.es.js +1 -1
  60. package/dist/domains/chat/messages/renderers/message-text.cjs.js +35 -1
  61. package/dist/domains/chat/messages/renderers/message-text.cjs.js.map +1 -1
  62. package/dist/domains/chat/messages/renderers/message-text.es.js +36 -2
  63. package/dist/domains/chat/messages/renderers/message-text.es.js.map +1 -1
  64. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.cjs.js +1 -1
  65. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.es.js +1 -1
  66. package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
  67. package/dist/domains/chat/messages/signal-badge.es.js +1 -1
  68. package/dist/domains/chat/messages/skill-message.cjs.js +2 -2
  69. package/dist/domains/chat/messages/skill-message.es.js +2 -2
  70. package/dist/domains/chat/messages/system-reminder-badge.cjs.js +1 -1
  71. package/dist/domains/chat/messages/system-reminder-badge.es.js +1 -1
  72. package/dist/domains/chat/tools/badges/agent-badge-wrapper.cjs.js +1 -1
  73. package/dist/domains/chat/tools/badges/agent-badge-wrapper.es.js +1 -1
  74. package/dist/domains/chat/tools/badges/agent-badge.cjs.js +1 -1
  75. package/dist/domains/chat/tools/badges/agent-badge.es.js +1 -1
  76. package/dist/domains/chat/tools/badges/file-tree-badge.cjs.js +2 -2
  77. package/dist/domains/chat/tools/badges/file-tree-badge.es.js +2 -2
  78. package/dist/domains/chat/tools/badges/knowledge-body-range.cjs.js +80 -0
  79. package/dist/domains/chat/tools/badges/knowledge-body-range.cjs.js.map +1 -0
  80. package/dist/domains/chat/tools/badges/knowledge-body-range.d.ts +1 -0
  81. package/dist/domains/chat/tools/badges/knowledge-body-range.es.js +78 -0
  82. package/dist/domains/chat/tools/badges/knowledge-body-range.es.js.map +1 -0
  83. package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js +163 -13
  84. package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js.map +1 -1
  85. package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js +165 -15
  86. package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js.map +1 -1
  87. package/dist/domains/chat/tools/badges/mcp-input-request-badge.cjs.js +51 -0
  88. package/dist/domains/chat/tools/badges/mcp-input-request-badge.cjs.js.map +1 -0
  89. package/dist/domains/chat/tools/badges/mcp-input-request-badge.d.ts +1 -0
  90. package/dist/domains/chat/tools/badges/mcp-input-request-badge.es.js +49 -0
  91. package/dist/domains/chat/tools/badges/mcp-input-request-badge.es.js.map +1 -0
  92. package/dist/domains/chat/tools/badges/mcp-task-chip.cjs.js +7 -2
  93. package/dist/domains/chat/tools/badges/mcp-task-chip.cjs.js.map +1 -1
  94. package/dist/domains/chat/tools/badges/mcp-task-chip.es.js +7 -2
  95. package/dist/domains/chat/tools/badges/mcp-task-chip.es.js.map +1 -1
  96. package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +2 -2
  97. package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +2 -2
  98. package/dist/domains/chat/tools/badges/observation-marker-details.cjs.js +2 -2
  99. package/dist/domains/chat/tools/badges/observation-marker-details.es.js +2 -2
  100. package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +1 -1
  101. package/dist/domains/chat/tools/badges/observation-renderer.es.js +1 -1
  102. package/dist/domains/chat/tools/badges/sandbox-execution-badge.cjs.js +2 -2
  103. package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js +2 -2
  104. package/dist/domains/chat/tools/badges/tool-approval-badge.cjs.js +1 -1
  105. package/dist/domains/chat/tools/badges/tool-approval-badge.es.js +1 -1
  106. package/dist/domains/chat/tools/badges/tool-badge.cjs.js +9 -4
  107. package/dist/domains/chat/tools/badges/tool-badge.cjs.js.map +1 -1
  108. package/dist/domains/chat/tools/badges/tool-badge.es.js +9 -4
  109. package/dist/domains/chat/tools/badges/tool-badge.es.js.map +1 -1
  110. package/dist/domains/chat/tools/badges/use-deferred-input-request.cjs.js +81 -0
  111. package/dist/domains/chat/tools/badges/use-deferred-input-request.cjs.js.map +1 -0
  112. package/dist/domains/chat/tools/badges/use-deferred-input-request.d.ts +1 -0
  113. package/dist/domains/chat/tools/badges/use-deferred-input-request.es.js +77 -0
  114. package/dist/domains/chat/tools/badges/use-deferred-input-request.es.js.map +1 -0
  115. package/dist/domains/chat/tools/badges/use-mcp-task-progress.cjs.js +11 -2
  116. package/dist/domains/chat/tools/badges/use-mcp-task-progress.cjs.js.map +1 -1
  117. package/dist/domains/chat/tools/badges/use-mcp-task-progress.es.js +11 -2
  118. package/dist/domains/chat/tools/badges/use-mcp-task-progress.es.js.map +1 -1
  119. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +1 -1
  120. package/dist/domains/chat/tools/badges/workflow-badge.es.js +1 -1
  121. package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js +240 -0
  122. package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js.map +1 -0
  123. package/dist/domains/chat/tools/mcp-input-request-tool.d.ts +1 -0
  124. package/dist/domains/chat/tools/mcp-input-request-tool.es.js +239 -0
  125. package/dist/domains/chat/tools/mcp-input-request-tool.es.js.map +1 -0
  126. package/dist/domains/chat/tools/mcp-input-request.cjs.js +40 -0
  127. package/dist/domains/chat/tools/mcp-input-request.cjs.js.map +1 -0
  128. package/dist/domains/chat/tools/mcp-input-request.d.ts +1 -0
  129. package/dist/domains/chat/tools/mcp-input-request.es.js +33 -0
  130. package/dist/domains/chat/tools/mcp-input-request.es.js.map +1 -0
  131. package/dist/domains/chat/tools/tool-card-kind.cjs.js +8 -3
  132. package/dist/domains/chat/tools/tool-card-kind.cjs.js.map +1 -1
  133. package/dist/domains/chat/tools/tool-card-kind.es.js +8 -4
  134. package/dist/domains/chat/tools/tool-card-kind.es.js.map +1 -1
  135. package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
  136. package/dist/domains/chat/tools/tool-card.es.js +1 -1
  137. package/dist/domains/chat/tools/tool-groups.cjs.js +1 -1
  138. package/dist/domains/chat/tools/tool-groups.es.js +1 -1
  139. package/dist/domains/chat.cjs.js +5 -3
  140. package/dist/domains/chat.es.js +4 -4
  141. package/dist/domains/knowledge/components/KnowledgePageCard.cjs.js +48 -0
  142. package/dist/domains/knowledge/components/KnowledgePageCard.cjs.js.map +1 -0
  143. package/dist/domains/knowledge/components/KnowledgePageCard.d.ts +1 -0
  144. package/dist/domains/knowledge/components/KnowledgePageCard.es.js +47 -0
  145. package/dist/domains/knowledge/components/KnowledgePageCard.es.js.map +1 -0
  146. package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js +63 -5
  147. package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js.map +1 -1
  148. package/dist/domains/knowledge/components/KnowledgePageDetail.es.js +64 -6
  149. package/dist/domains/knowledge/components/KnowledgePageDetail.es.js.map +1 -1
  150. package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js +485 -47
  151. package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js.map +1 -1
  152. package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js +487 -50
  153. package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js.map +1 -1
  154. package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js +1051 -123
  155. package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js.map +1 -1
  156. package/dist/domains/knowledge/components/KnowledgePageGraph.es.js +1054 -126
  157. package/dist/domains/knowledge/components/KnowledgePageGraph.es.js.map +1 -1
  158. package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js +75 -3
  159. package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js.map +1 -1
  160. package/dist/domains/knowledge/components/KnowledgePageTree.es.js +76 -4
  161. package/dist/domains/knowledge/components/KnowledgePageTree.es.js.map +1 -1
  162. package/dist/domains/knowledge/lib/circleText.cjs.js +9 -0
  163. package/dist/domains/knowledge/lib/circleText.cjs.js.map +1 -0
  164. package/dist/domains/knowledge/lib/circleText.d.ts +1 -0
  165. package/dist/domains/knowledge/lib/circleText.es.js +8 -0
  166. package/dist/domains/knowledge/lib/circleText.es.js.map +1 -0
  167. package/dist/domains/knowledge/lib/fitViewport.cjs.js +82 -0
  168. package/dist/domains/knowledge/lib/fitViewport.cjs.js.map +1 -0
  169. package/dist/domains/knowledge/lib/fitViewport.d.ts +1 -0
  170. package/dist/domains/knowledge/lib/fitViewport.es.js +73 -0
  171. package/dist/domains/knowledge/lib/fitViewport.es.js.map +1 -0
  172. package/dist/domains/knowledge/lib/graphShape.cjs.js +524 -0
  173. package/dist/domains/knowledge/lib/graphShape.cjs.js.map +1 -0
  174. package/dist/domains/knowledge/lib/graphShape.d.ts +1 -0
  175. package/dist/domains/knowledge/lib/graphShape.es.js +499 -0
  176. package/dist/domains/knowledge/lib/graphShape.es.js.map +1 -0
  177. package/dist/domains/knowledge/lib/linkCountsText.cjs.js +11 -0
  178. package/dist/domains/knowledge/lib/linkCountsText.cjs.js.map +1 -0
  179. package/dist/domains/knowledge/lib/linkCountsText.d.ts +1 -0
  180. package/dist/domains/knowledge/lib/linkCountsText.es.js +10 -0
  181. package/dist/domains/knowledge/lib/linkCountsText.es.js.map +1 -0
  182. package/dist/domains/knowledge/lib/pageAddress.cjs.js +29 -0
  183. package/dist/domains/knowledge/lib/pageAddress.cjs.js.map +1 -0
  184. package/dist/domains/knowledge/lib/pageAddress.d.ts +1 -0
  185. package/dist/domains/knowledge/lib/pageAddress.es.js +27 -0
  186. package/dist/domains/knowledge/lib/pageAddress.es.js.map +1 -0
  187. package/dist/domains/knowledge/lib/pageGraph.cjs.js +11 -11
  188. package/dist/domains/knowledge/lib/pageGraph.cjs.js.map +1 -1
  189. package/dist/domains/knowledge/lib/pageGraph.es.js +11 -11
  190. package/dist/domains/knowledge/lib/pageGraph.es.js.map +1 -1
  191. package/dist/domains/knowledge/lib/pageRefs.cjs.js +69 -0
  192. package/dist/domains/knowledge/lib/pageRefs.cjs.js.map +1 -0
  193. package/dist/domains/knowledge/lib/pageRefs.d.ts +1 -0
  194. package/dist/domains/knowledge/lib/pageRefs.es.js +66 -0
  195. package/dist/domains/knowledge/lib/pageRefs.es.js.map +1 -0
  196. package/dist/domains/knowledge/lib/pageTree.cjs.js +5 -0
  197. package/dist/domains/knowledge/lib/pageTree.cjs.js.map +1 -1
  198. package/dist/domains/knowledge/lib/pageTree.es.js +5 -1
  199. package/dist/domains/knowledge/lib/pageTree.es.js.map +1 -1
  200. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.cjs.js +82 -0
  201. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.cjs.js.map +1 -0
  202. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.d.ts +1 -0
  203. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.es.js +78 -0
  204. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.es.js.map +1 -0
  205. package/dist/domains/knowledge/lib/tooltipSide.cjs.js +77 -0
  206. package/dist/domains/knowledge/lib/tooltipSide.cjs.js.map +1 -0
  207. package/dist/domains/knowledge/lib/tooltipSide.d.ts +1 -0
  208. package/dist/domains/knowledge/lib/tooltipSide.es.js +75 -0
  209. package/dist/domains/knowledge/lib/tooltipSide.es.js.map +1 -0
  210. package/dist/domains/knowledge/lib/useLeavingNodes.cjs.js +65 -0
  211. package/dist/domains/knowledge/lib/useLeavingNodes.cjs.js.map +1 -0
  212. package/dist/domains/knowledge/lib/useLeavingNodes.d.ts +1 -0
  213. package/dist/domains/knowledge/lib/useLeavingNodes.es.js +62 -0
  214. package/dist/domains/knowledge/lib/useLeavingNodes.es.js.map +1 -0
  215. package/dist/domains/knowledge/lib/useStableWhile.cjs.js +15 -0
  216. package/dist/domains/knowledge/lib/useStableWhile.cjs.js.map +1 -0
  217. package/dist/domains/knowledge/lib/useStableWhile.d.ts +1 -0
  218. package/dist/domains/knowledge/lib/useStableWhile.es.js +14 -0
  219. package/dist/domains/knowledge/lib/useStableWhile.es.js.map +1 -0
  220. package/dist/domains/scores/components/trace-scores-list.cjs.js +2 -2
  221. package/dist/domains/scores/components/trace-scores-list.es.js +2 -2
  222. package/dist/domains/skills/skill-simple-form.cjs.js +1 -1
  223. package/dist/domains/skills/skill-simple-form.es.js +1 -1
  224. package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +1 -1
  225. package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +1 -1
  226. package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +1 -1
  227. package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +1 -1
  228. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +2 -2
  229. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +2 -2
  230. package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +2 -2
  231. package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +2 -2
  232. package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +1 -1
  233. package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +1 -1
  234. package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +1 -1
  235. package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +1 -1
  236. package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +1 -1
  237. package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +1 -1
  238. package/dist/domains/traces/components/span-payload/span-processor-mutations.cjs.js +1 -1
  239. package/dist/domains/traces/components/span-payload/span-processor-mutations.es.js +1 -1
  240. package/dist/domains/traces/components/span-payload/span-tools-section.cjs.js +1 -1
  241. package/dist/domains/traces/components/span-payload/span-tools-section.es.js +1 -1
  242. package/dist/domains/traces/components/span-timeline-row.cjs.js +1 -1
  243. package/dist/domains/traces/components/span-timeline-row.es.js +1 -1
  244. package/dist/domains/traces/components/span-timing-hover-card.cjs.js +1 -1
  245. package/dist/domains/traces/components/span-timing-hover-card.es.js +1 -1
  246. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +8 -2
  247. package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
  248. package/dist/domains/traces/components/trace-data-panel-view.es.js +8 -2
  249. package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
  250. package/dist/domains/traces/components/trace-error-cell.cjs.js +1 -1
  251. package/dist/domains/traces/components/trace-error-cell.es.js +1 -1
  252. package/dist/domains/workflows/runs/workflow-run-list.cjs.js +1 -1
  253. package/dist/domains/workflows/runs/workflow-run-list.es.js +1 -1
  254. package/dist/domains/workflows/workflow/input/workflow-processor-input.cjs.js +2 -2
  255. package/dist/domains/workflows/workflow/input/workflow-processor-input.es.js +2 -2
  256. package/dist/domains/workflows/workflow/use-workflow-trigger.cjs.js +3 -3
  257. package/dist/domains/workflows/workflow/use-workflow-trigger.es.js +3 -3
  258. package/dist/domains/workflows/workflow/workflow-input-data.cjs.js +1 -1
  259. package/dist/domains/workflows/workflow/workflow-input-data.es.js +1 -1
  260. package/dist/domains/workflows/workflow/workflow-suspended-steps.cjs.js +2 -2
  261. package/dist/domains/workflows/workflow/workflow-suspended-steps.es.js +2 -2
  262. package/dist/domains/workflows/workflow/workflow-time-travel-form.cjs.js +2 -2
  263. package/dist/domains/workflows/workflow/workflow-time-travel-form.es.js +2 -2
  264. package/dist/domains/workspace/components/workspace-add-skill-dialog.cjs.js +1 -1
  265. package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js +1 -1
  266. package/dist/domains/workspace/components/workspace-markdown-preview.cjs.js +1 -1
  267. package/dist/domains/workspace/components/workspace-markdown-preview.es.js +1 -1
  268. package/dist/lib/form/dynamic-form.cjs.js +2 -2
  269. package/dist/lib/form/dynamic-form.es.js +2 -2
  270. package/dist/lib/form/json-draft.cjs.js +1 -1
  271. package/dist/lib/form/json-draft.es.js +1 -1
  272. package/dist/lib/form/zod-provider.cjs.js +1 -1
  273. package/dist/lib/form/zod-provider.es.js +1 -1
  274. package/dist/{span-payload-primitives-B3RdahsC.js → span-payload-primitives-CKKIAVPJ.js} +4 -4
  275. package/dist/{span-payload-primitives-B3RdahsC.js.map → span-payload-primitives-CKKIAVPJ.js.map} +1 -1
  276. package/dist/{span-payload-primitives-_2d-pAOD.cjs → span-payload-primitives-D4tHWN2W.cjs} +4 -4
  277. package/dist/{span-payload-primitives-_2d-pAOD.cjs.map → span-payload-primitives-D4tHWN2W.cjs.map} +1 -1
  278. package/dist/src/domains/chat/knowledge/knowledge-links.d.ts +32 -4
  279. package/dist/src/domains/chat/knowledge/pinned-knowledge-data.d.ts +2 -0
  280. package/dist/src/domains/chat/tools/badges/knowledge-body-range.d.ts +12 -0
  281. package/dist/src/domains/chat/tools/badges/knowledge-tool-badge.d.ts +5 -2
  282. package/dist/src/domains/chat/tools/badges/mcp-input-request-badge.d.ts +18 -0
  283. package/dist/src/domains/chat/tools/badges/tool-badge.d.ts +4 -1
  284. package/dist/src/domains/chat/tools/badges/use-deferred-input-request.d.ts +44 -0
  285. package/dist/src/domains/chat/tools/badges/use-mcp-task-progress.d.ts +6 -1
  286. package/dist/src/domains/chat/tools/mcp-input-request-tool.d.ts +18 -0
  287. package/dist/src/domains/chat/tools/mcp-input-request.d.ts +40 -0
  288. package/dist/src/domains/chat/tools/tool-card-kind.d.ts +4 -2
  289. package/dist/src/domains/chat/tools/tool-card.d.ts +1 -1
  290. package/dist/src/domains/knowledge/components/KnowledgePageCard.d.ts +23 -0
  291. package/dist/src/domains/knowledge/components/KnowledgePageExplorer.d.ts +29 -0
  292. package/dist/src/domains/knowledge/components/KnowledgePageGraph.d.ts +27 -1
  293. package/dist/src/domains/knowledge/components/KnowledgePageTree.d.ts +2 -1
  294. package/dist/src/domains/knowledge/lib/circleText.d.ts +2 -0
  295. package/dist/src/domains/knowledge/lib/fitViewport.d.ts +67 -0
  296. package/dist/src/domains/knowledge/lib/graphShape.d.ts +131 -0
  297. package/dist/src/domains/knowledge/lib/linkCountsText.d.ts +5 -0
  298. package/dist/src/domains/knowledge/lib/pageAddress.d.ts +5 -0
  299. package/dist/src/domains/knowledge/lib/pageGraph.d.ts +4 -4
  300. package/dist/src/domains/knowledge/lib/pageRefs.d.ts +15 -0
  301. package/dist/src/domains/knowledge/lib/pageTree.d.ts +2 -0
  302. package/dist/src/domains/knowledge/lib/remarkKnowledgeLinks.d.ts +13 -0
  303. package/dist/src/domains/knowledge/lib/tooltipSide.d.ts +40 -0
  304. package/dist/src/domains/knowledge/lib/useLeavingNodes.d.ts +14 -0
  305. package/dist/src/domains/knowledge/lib/useStableWhile.d.ts +5 -0
  306. package/dist/src/domains/knowledge/pageTypes.d.ts +6 -1
  307. package/dist/src/ds/components/MarkdownRenderer/markdown-renderer.d.ts +8 -1
  308. package/dist/src/ds/components/ai/tool-call/tool-phrases.d.ts +6 -0
  309. package/dist/style.css +69 -2
  310. package/dist/{tool-approval-1qiB4hhG.cjs → tool-approval-CJvPDL7D.cjs} +4 -4
  311. package/dist/{tool-approval-1qiB4hhG.cjs.map → tool-approval-CJvPDL7D.cjs.map} +1 -1
  312. package/dist/{tool-approval-B6MFcaKV.js → tool-approval-DyN11vFA.js} +4 -4
  313. package/dist/{tool-approval-B6MFcaKV.js.map → tool-approval-DyN11vFA.js.map} +1 -1
  314. package/dist/{tool-call-Bu66PkD-.cjs → tool-call-DBn14X-3.cjs} +9 -3
  315. package/dist/{tool-call-Bu66PkD-.cjs.map → tool-call-DBn14X-3.cjs.map} +1 -1
  316. package/dist/{tool-call-Ch9-jjXU.js → tool-call-Dsj43lvJ.js} +9 -3
  317. package/dist/{tool-call-Ch9-jjXU.js.map → tool-call-Dsj43lvJ.js.map} +1 -1
  318. package/dist/{tool-card-DrqPZfPQ.cjs → tool-card-rxhTDpk_.cjs} +164 -126
  319. package/dist/tool-card-rxhTDpk_.cjs.map +1 -0
  320. package/dist/{tool-card-sO6P2Qj4.js → tool-card-toDgoZzJ.js} +165 -127
  321. package/dist/tool-card-toDgoZzJ.js.map +1 -0
  322. package/dist/{tool-presentation-DvCsb_kz.js → tool-presentation-CvibOP1J.js} +6 -1
  323. package/dist/tool-presentation-CvibOP1J.js.map +1 -0
  324. package/dist/{tool-presentation-CQlDEwgS.cjs → tool-presentation-D6nzVruN.cjs} +6 -1
  325. package/dist/tool-presentation-D6nzVruN.cjs.map +1 -0
  326. package/package.json +10 -10
  327. package/dist/MarkdownRenderer-2GOXQJEv.js.map +0 -1
  328. package/dist/MarkdownRenderer-CB8Z_CHc.cjs.map +0 -1
  329. package/dist/domains/knowledge/lib/pageLayout.cjs.js +0 -49
  330. package/dist/domains/knowledge/lib/pageLayout.cjs.js.map +0 -1
  331. package/dist/domains/knowledge/lib/pageLayout.d.ts +0 -1
  332. package/dist/domains/knowledge/lib/pageLayout.es.js +0 -48
  333. package/dist/domains/knowledge/lib/pageLayout.es.js.map +0 -1
  334. package/dist/src/domains/knowledge/lib/pageLayout.d.ts +0 -24
  335. package/dist/tool-card-DrqPZfPQ.cjs.map +0 -1
  336. package/dist/tool-card-sO6P2Qj4.js.map +0 -1
  337. package/dist/tool-presentation-CQlDEwgS.cjs.map +0 -1
  338. package/dist/tool-presentation-DvCsb_kz.js.map +0 -1
@@ -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",
@@ -1 +1 @@
1
- {"version":3,"file":"KnowledgePageDetail.es.js","names":[],"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":";;;;;;;;AAiBA,IAAM,kBAA2D;CAC/D,iBAAiB;CACjB,gBAAgB;CAChB,gBAAgB;CAChB,cAAc;CACd,eAAe;CACf,gBAAgB;CAChB,cAAc;CACd,kBAAkB;CAClB,gBAAgB;CAChB,iBAAiB;CACjB,aAAa;CACb,eAAe;AACjB;AAEA,SAAS,WAAW,KAAqB;CACvC,MAAM,OAAO,IAAI,KAAK,GAAG;CACzB,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,IAC9B,MACA,KAAK,eAAe,KAAA,GAAW;EAAE,WAAW;EAAU,WAAW;CAAQ,CAAC;AAChF;AAEA,IAAM,iBAA+D;CACnE,CAAC,UAAU,EAAE;CACb,CAAC,UAAU,EAAE;CACb,CAAC,QAAQ,EAAE;CACX,CAAC,OAAO,CAAC;CACT,CAAC,QAAQ,IAAI;CACb,CAAC,SAAS,EAAE;CACZ,CAAC,QAAQ,QAAQ;AACnB;;AAGA,SAAS,UAAU,KAAa,MAAM,KAAK,IAAI,GAAW;CACxD,MAAM,OAAO,IAAI,KAAK,GAAG,CAAC,CAAC,QAAQ;CACnC,IAAI,OAAO,MAAM,IAAI,GAAG,OAAO;CAC/B,IAAI,SAAS,OAAO,OAAO;CAC3B,MAAM,SAAS,IAAI,KAAK,mBAAmB,KAAA,GAAW,EAAE,SAAS,OAAO,CAAC;CACzE,KAAK,MAAM,CAAC,MAAM,SAAS,gBAAgB;EACzC,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,OAAO,OAAO,OAAO,KAAK,MAAM,KAAK,GAAG,IAAI;EACxE,SAAS;CACX;CACA,OAAO,WAAW,GAAG;AACvB;AAEA,SAAS,KAAK,EAAE,OAAwB;CACtC,OACE,oBAAC,QAAD;EAAM,UAAU;EAAK,OAAO,WAAW,GAAG;EACvC,UAAA,UAAU,GAAG;CACV,CAAA;AAEV;;AAGA,SAAS,WAAW,EAAE,UAA8B;CAClD,MAAM,OAAO,OAAO,SAAS,GAAG,IAAI,OAAO,MAAM,OAAO,QAAQ,GAAG,IAAI,CAAC,IAAI;CAC5E,IAAI,OAAO;CACX,KAAK,MAAM,QAAQ,QAAQ,OAAQ,OAAO,KAAK,KAAK,WAAW,CAAC,IAAK;CACrE,MAAM,OAAO;EAAC;EAAgB;EAAkB;EAAiB;EAAkB;CAAc;CACjG,MAAM,MAAM,KAAK,KAAK,IAAI,IAAI,IAAI,KAAK;CACvC,OACE,oBAAC,QAAD;EACE,eAAA;EACA,WAAU;EACV,OAAO,EAAE,YAAY,2BAA2B,IAAI,qBAAqB;EAEzE,UAAA,oBAAC,KAAD;GAAK,IAAG;GAAO,SAAQ;GAAO,MAAK;GAC/B,WAAA,KAAK,KAAK,CAAC,CAAC,MAAM,IAAA,CAAK,YAAY;EAClC,CAAA;CACD,CAAA;AAEV;;;;;AAMA,SAAS,kBAAkB,MAA4B,WAAkD;CACvG,IAAI,KAAK,SAAS,OAAO,KAAK,WAAW;CACzC,MAAM,QAAQ,UAAU,MAAK,cAAa,UAAU,OAAO,KAAK,OAAO;CACvE,IAAI,CAAC,OAAO,SAAS,OAAO;CAE5B,MAAM,OAAO,CAAC,GADA,UAAU,MAAM,UAAU,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,QAAO,cAAa,CAAC,UAAU,OAC1E,GAAO,IAAI,CAAC,CAAC,KAAI,cAAa,UAAU,GAAG;CAC5D,IAAI,KAAK,MAAK,QAAO,CAAC,GAAG,GAAG,OAAO;CACnC,OAAO,GAAG,MAAM,QAAQ,GAAG,KAAK,KAAK,GAAG;AAC1C;AAEA,SAAS,QAAQ,EAAE,OAAO,OAAO,YAAoE;CACnG,OACE,qBAAC,WAAD;EAAS,cAAY;EAAO,WAAU;EAAtC,UAAA,CACE,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,oBAAC,KAAD;IAAK,IAAG;IAAK,SAAQ;IAAU,MAAK;IAAQ,WAAU;IACnD,UAAA;GACE,CAAA,GACJ,UAAU,KAAA,IACT,oBAAC,OAAD;IAAO,SAAQ;IAAU,MAAK;IAC3B,UAAA;GACI,CAAA,IACL,IACD;EACJ,CAAA,GAAA,QACM;;AAEb;AAEA,SAAS,SAAS,EAChB,MACA,eAIC;CACD,OACE,oBAAC,UAAD;EACE,MAAK;EACL,WAAU;EACV,eAAe,YAAY,IAAI;EAE9B,UAAA,KAAK;CACA,CAAA;AAEZ;;AAGA,SAAgB,kBAAkB,EAChC,MACA,WACA,aACA,aACA,SACA,UACA,WAWC;CACD,MAAM,YAAY,KAAK,SAAS,KAAI,OAAM,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,QAAO,cAAa,cAAc,KAAA,CAAS;CACxG,MAAM,cAAc,OAAe;EACjC,MAAM,YAAY,UAAU,IAAI,EAAE;EAClC,OAAO,WAAW,WAAW,WAAW,QAAQ;CAClD;CACA,MAAM,SAAS,WAAW,UAAU,IAAI,KAAK,MAAM,IAAI,KAAA;CACvD,OACE,qBAAC,MAAD;EACE,KAAK;EACL,oBAAkB,eAAe,KAAA;EACjC,WAAW,sDAAsD,UAAU,QAAQ;EACnF,OAAO,cAAc;GAAE,aAAa;GAAqB,WAAW;EAA8B,IAAI,KAAA;EAJxG,UAAA,CAMG,UAAU,OAAO,oBAAC,YAAD,EAAY,QAAQ,KAAK,WAAW,OAAS,CAAA,GAC/D,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACE,oBAAC,KAAD;OAAK,IAAG;OAAO,SAAQ;OAAQ,MAAK;OACjC,UAAA,KAAK,WAAW;MACd,CAAA;MACL,oBAAC,KAAD;OAAK,IAAG;OAAO,SAAQ;OAAU,MAAK;OACpC,UAAA,oBAAC,MAAD,EAAM,KAAK,KAAK,UAAY,CAAA;MACzB,CAAA;MACJ,SACC,qBAAC,KAAD;OAAK,IAAG;OAAO,SAAQ;OAAU,MAAK;OAAtC,UAAA,CAA8C,OACzC,oBAAC,UAAD;QAAU,MAAM;QAAqB;OAAc,CAAA,CACnD;MACH,CAAA,IAAA;KACD;;IACL,oBAAC,KAAD;KAAG,WAAU;KACV,UAAA,oBAAoB,KAAK,IAAI,CAAC,CAAC,KAAK,SAAS,UAAU;MACtD,IAAI,QAAQ,SAAS,QAAQ,OAAO,oBAAC,QAAD,EAAA,UAAmB,QAAQ,MAAY,GAA5B,KAA4B;MAC3E,MAAM,OAAO,QAAQ,MAAM,KAAK,CAAC,CAAC,kBAAkB;MACpD,MAAM,SAAS,UAAU,MAAK,cAAa,UAAU,KAAK,KAAK,CAAC,CAAC,kBAAkB,MAAM,IAAI;MAC7F,OAAO,SACL,oBAAC,UAAD;OAEE,MAAK;OACL,WAAU;OACV,eAAe,YAAY,MAAM;OAEhC,UAAA,QAAQ;MACH,GAND,KAMC,IAER,oBAAC,QAAD;OAAkB,WAAU;OACzB,UAAA,QAAQ;MACL,GAFK,KAEL;KAEV,CAAC;IACA,CAAA;IACF,KAAK,cAAc,SAAS,IAC3B,oBAAC,OAAD;KAAK,WAAU;KAAuB,cAAW;KAC9C,UAAA,KAAK,cAAc,KAAI,OACtB,oBAAC,OAAD;MAAgB,SAAQ;MAAU,MAAK;MACpC,UAAA,WAAW,EAAE;KACT,GAFK,EAEL,CACR;IACE,CAAA,IACH;GACD;EACH,CAAA,CAAA;;AAER;;;;;;;;;;AAWA,SAAgB,oBAAoB,EAClC,MACA,OACA,KACA,WACA,aACA,oBACA,YAAY,CAAC,GACb,cAAc,CAAC,GACf,WACA,YACA,YAmBC;CACD,MAAM,mBAAmB,OAA6B,IAAI;CAC1D,gBAAgB;EACd,iBAAiB,SAAS,iBAAiB,EAAE,OAAO,UAAU,CAAC;CACjE,GAAG,CAAC,oBAAoB,KAAK,CAAC;CAC9B,IAAI,kBAAkB;CACtB,MAAM,QAAQ,KAAK,UACf,OACC,UAAU,MAAK,cAAa,UAAU,OAAO,KAAK,OAAO,KAAK,UAAU,IAAI,KAAK,OAAO;CAC7F,MAAM,OAAO,kBAAkB,MAAM,SAAS;CAE9C,MAAM,OAAO,KAAK,UAAW,KAAK,gBAAgB,UAAW;CAE7D,OACE,qBAAC,WAAD;EAAS,cAAY,KAAK;EAAM,WAAU;EAA1C,UAAA,CACE,qBAAC,UAAD;GAAQ,WAAU;GAAlB,UAAA;IACG,UAAU,SAAS,IAClB,oBAAC,OAAD;KAAK,cAAW;KACd,UAAA,oBAAC,MAAD;MAAI,WAAU;MACX,UAAA,UAAU,KAAI,aACb,qBAAC,MAAD;OAAsB,WAAU;OAAhC,UAAA,CACE,oBAAC,UAAD;QACE,MAAK;QACL,WAAU;QACV,eAAe,YAAY,QAAQ;QAElC,UAAA,SAAS;OACJ,CAAA,GACR,oBAAC,cAAD;QAAc,MAAM;QAAI,WAAU;QAAwB,eAAA;OAAa,CAAA,CACrE;MATK,GAAA,SAAS,EASd,CACL;KACC,CAAA;IACD,CAAA,IACH;IACJ,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACE,qBAAC,OAAD;OAAK,WAAU;OAAf,UAAA;QACE,oBAAC,OAAD;SAAO,SAAS,KAAK,UAAU,SAAS;SAAW,MAAK;SACrD,UAAA;QACI,CAAA;QACN,KAAK,UAAU,OACd,qBAAC,KAAD;SAAK,IAAG;SAAO,SAAQ;SAAU,MAAK;SAAtC,UAAA,CAA8C,OACxC,OAAO,WAAW,OAAO,QAAQ,KAAK,OACvC;;QAEN,MACC,oBAAC,OAAD;SAAO,SAAQ;SAAU,MAAK;SAAK,MAAM,oBAAC,KAAD;UAAK,MAAM;UAAI,eAAA;SAAa,CAAA;SAClE,UAAA,IAAI,SAAS,SAAS,IAAI,cAAc,IAAI,SAAS,KAAK,IAAI,MAAM;QAChE,CAAA,IACL;OACD;;MACL,oBAAC,KAAD;OAAK,IAAG;OAAK,SAAQ;OAAQ,WAAU;OACpC,UAAA,KAAK;MACH,CAAA;MACJ,KAAK,cACJ,oBAAC,KAAD;OAAK,SAAQ;OAAO,MAAK;OACtB,UAAA,KAAK;MACH,CAAA,IACH;KACD;;IACL,qBAAC,MAAD;KAAI,WAAU;KAAd,UAAA;MACG,KAAK,WAAW,KAAK,UACpB,qBAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACE,oBAAC,MAAD;QAAI,WAAU;QAAU,UAAA;OAAW,CAAA,GACnC,oBAAC,MAAD,EAAA,UACE,oBAAC,KAAD;QAAK,IAAG;QAAO,SAAQ;QAAU,MAAK;QAAQ,MAAK;QAChD,UAAA,KAAK;OACH,CAAA,EACH,CAAA,CACD;MACH,CAAA,IAAA;MACH,QAAQ,CAAC,KAAK,UACb,qBAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACE,oBAAC,MAAD;QAAI,WAAU;QAAU,UAAA;OAAQ,CAAA,GAChC,oBAAC,MAAD,EAAA,UACE,oBAAC,KAAD;QAAK,IAAG;QAAO,SAAQ;QAAU,MAAK;QAAQ,MAAK;QAAO,eAAY;QACnE,UAAA;OACE,CAAA,EACH,CAAA,CACD;MACH,CAAA,IAAA;MACJ,qBAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACE,oBAAC,MAAD;QAAI,WAAU;QAAU,UAAA;OAAW,CAAA,GACnC,oBAAC,MAAD,EAAA,UACE,qBAAC,KAAD;QAAK,IAAG;QAAO,SAAQ;QAAU,MAAK;QAAQ,eAAY;QAA1D,UAAA;SAAmF;SACxE,KAAK;SAAQ;SAAW,oBAAC,MAAD,EAAM,KAAK,KAAK,UAAY,CAAA;SAAC;SAAK,KAAK,UAAU;QAC/E;OACH,CAAA,EAAA,CAAA,CACD;;KACH;;GACE;EAER,CAAA,GAAA,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACG,KAAK,OACJ,oBAAC,OAAD;KAAK,eAAY;KAAsB,WAAU;KAC/C,UAAA,oBAAC,kBAAD,EAAA,UAAmB,KAAK,KAAuB,CAAA;IAC5C,CAAA,IAEL,qBAAC,KAAD;KAAK,SAAQ;KAAO,MAAK;KAAQ,WAAU;KAA3C,UAAA;MAAoD;MAC5C,KAAK,UAAU,UAAU;MAAO;KACnC;IAGP,CAAA,GAAA,qBAAC,SAAD;KAAS,OAAM;KAAQ,OAAO,YAAY,KAAA,IAAY,MAAM;KAA5D,UAAA,CACG,MAAM,WAAW,IAChB,oBAAC,KAAD;MAAK,SAAQ;MAAO,MAAK;MAAQ,UAAA;KAE5B,CAAA,IAEL,oBAAC,MAAD;MAAI,WAAU;MACX,UAAA,MAAM,KAAI,SAAQ;OACjB,MAAM,cAAc,CAAC,CAAC,sBAAsB,KAAK,SAAS,SAAS,kBAAkB;OACrF,MAAM,UAAU,eAAe,CAAC;OAChC,IAAI,SAAS,kBAAkB;OAC/B,OACE,oBAAC,mBAAD;QAEQ;QACK;QACE;QACA;QACb,SACE,WACI,YAAW;SACT,iBAAiB,UAAU;QAC7B,IACA,KAAA;OAEP,GAZM,KAAK,EAYX;MAEL,CAAC;KACC,CAAA,GAEL,SACM;IACN,CAAA,CAAA;GAEL,CAAA,GAAA,qBAAC,SAAD;IAAO,WAAU;IAAjB,UAAA;KACG,aAAa,oBAAC,SAAD;MAAS,OAAM;MAAS,UAAA;KAAoB,CAAA,IAAI;KAE7D,YAAY,SAAS,IACpB,oBAAC,SAAD;MAAS,OAAM;MAAe,OAAO,YAAY;MAC/C,UAAA,oBAAC,MAAD;OAAI,WAAU;OACX,UAAA,YAAY,KAAI,SACf,oBAAC,mBAAD;QAEQ;QACK;QACE;QACb,UAAA;QACA,SAAA;OACD,GANM,KAAK,EAMX,CACF;MACC,CAAA;KACG,CAAA,IACP;KAEH,YAAY,SAAS,SAAS,IAC7B,oBAAC,SAAD;MAAS,OAAM;MACb,UAAA,oBAAC,MAAD;OAAI,WAAU;OACX,UAAA,SAAS,KAAI,UACZ,qBAAC,MAAD;QAAmB,WAAU;QAA7B,UAAA;SACE,oBAAC,QAAD;UACE,eAAA;UACA,WAAU;SACX,CAAA;SACD,oBAAC,KAAD;UAAK,IAAG;UAAO,SAAQ;UAAU,MAAK;UACnC,UAAA,gBAAgB,MAAM,WAAW,MAAM;SACrC,CAAA;SACL,qBAAC,KAAD;UAAK,IAAG;UAAO,SAAQ;UAAU,MAAK;UAAtC,UAAA;WACG,MAAM,WAAW;WAAO;WAAG,oBAAC,MAAD,EAAM,KAAK,MAAM,UAAY,CAAA;UACtD;;QACH;OAXK,GAAA,MAAM,EAWX,CACL;MACC,CAAA;KACG,CAAA,IACP;IACC;GACJ,CAAA,CAAA;EACE,CAAA,CAAA;;AAEb"}
1
+ {"version":3,"file":"KnowledgePageDetail.es.js","names":[],"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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"}