@mastra/playground-ui 67.0.0 → 68.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/dist/KnowledgePageGraph.css +11 -0
  2. package/dist/components/ai/tool-approval.cjs.js +1 -1
  3. package/dist/components/ai/tool-approval.es.js +1 -1
  4. package/dist/components/ai/tool-call.cjs.js +2 -2
  5. package/dist/components/ai/tool-call.es.js +2 -2
  6. package/dist/domains/chat/activity/model/activity-segments.cjs.js +1 -1
  7. package/dist/domains/chat/activity/model/activity-segments.es.js +1 -1
  8. package/dist/domains/chat/activity/model/activity-words.cjs.js +2 -2
  9. package/dist/domains/chat/activity/model/activity-words.es.js +2 -2
  10. package/dist/domains/chat/knowledge/knowledge-links.cjs.js +40 -0
  11. package/dist/domains/chat/knowledge/knowledge-links.cjs.js.map +1 -0
  12. package/dist/domains/chat/knowledge/knowledge-links.d.ts +1 -0
  13. package/dist/domains/chat/knowledge/knowledge-links.es.js +38 -0
  14. package/dist/domains/chat/knowledge/knowledge-links.es.js.map +1 -0
  15. package/dist/domains/chat/knowledge/pinned-knowledge-data.cjs.js +79 -0
  16. package/dist/domains/chat/knowledge/pinned-knowledge-data.cjs.js.map +1 -0
  17. package/dist/domains/chat/knowledge/pinned-knowledge-data.d.ts +1 -0
  18. package/dist/domains/chat/knowledge/pinned-knowledge-data.es.js +77 -0
  19. package/dist/domains/chat/knowledge/pinned-knowledge-data.es.js.map +1 -0
  20. package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js +124 -0
  21. package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js.map +1 -0
  22. package/dist/domains/chat/knowledge/pinned-knowledge.d.ts +1 -0
  23. package/dist/domains/chat/knowledge/pinned-knowledge.es.js +123 -0
  24. package/dist/domains/chat/knowledge/pinned-knowledge.es.js.map +1 -0
  25. package/dist/domains/chat/knowledge.cjs.js +12 -0
  26. package/dist/domains/chat/knowledge.d.ts +1 -0
  27. package/dist/domains/chat/knowledge.es.js +5 -0
  28. package/dist/domains/chat/messages/message-row.cjs.js +2 -2
  29. package/dist/domains/chat/messages/message-row.es.js +2 -2
  30. package/dist/domains/chat/messages/signal-badge.cjs.js +7 -0
  31. package/dist/domains/chat/messages/signal-badge.cjs.js.map +1 -1
  32. package/dist/domains/chat/messages/signal-badge.es.js +7 -0
  33. package/dist/domains/chat/messages/signal-badge.es.js.map +1 -1
  34. package/dist/domains/chat/tools/badges/agent-badge-wrapper.cjs.js +1 -1
  35. package/dist/domains/chat/tools/badges/agent-badge-wrapper.es.js +1 -1
  36. package/dist/domains/chat/tools/badges/agent-badge.cjs.js +1 -1
  37. package/dist/domains/chat/tools/badges/agent-badge.es.js +1 -1
  38. package/dist/domains/chat/tools/badges/file-tree-badge.cjs.js +2 -2
  39. package/dist/domains/chat/tools/badges/file-tree-badge.es.js +2 -2
  40. package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js +273 -0
  41. package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js.map +1 -0
  42. package/dist/domains/chat/tools/badges/knowledge-tool-badge.d.ts +1 -0
  43. package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js +270 -0
  44. package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js.map +1 -0
  45. package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +1 -1
  46. package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +1 -1
  47. package/dist/domains/chat/tools/badges/sandbox-execution-badge.cjs.js +2 -2
  48. package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js +2 -2
  49. package/dist/domains/chat/tools/badges/tool-approval-badge.cjs.js +1 -1
  50. package/dist/domains/chat/tools/badges/tool-approval-badge.es.js +1 -1
  51. package/dist/domains/chat/tools/badges/tool-badge.cjs.js +3 -3
  52. package/dist/domains/chat/tools/badges/tool-badge.es.js +3 -3
  53. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +2 -2
  54. package/dist/domains/chat/tools/badges/workflow-badge.es.js +2 -2
  55. package/dist/domains/chat/tools/tool-card-kind.cjs.js +4 -2
  56. package/dist/domains/chat/tools/tool-card-kind.cjs.js.map +1 -1
  57. package/dist/domains/chat/tools/tool-card-kind.es.js +4 -2
  58. package/dist/domains/chat/tools/tool-card-kind.es.js.map +1 -1
  59. package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
  60. package/dist/domains/chat/tools/tool-card.es.js +1 -1
  61. package/dist/domains/chat/tools/tool-groups.cjs.js +3 -2
  62. package/dist/domains/chat/tools/tool-groups.cjs.js.map +1 -1
  63. package/dist/domains/chat/tools/tool-groups.es.js +3 -2
  64. package/dist/domains/chat/tools/tool-groups.es.js.map +1 -1
  65. package/dist/domains/chat.cjs.js +11 -0
  66. package/dist/domains/chat.es.js +5 -1
  67. package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js +438 -0
  68. package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js.map +1 -0
  69. package/dist/domains/knowledge/components/KnowledgePageDetail.d.ts +1 -0
  70. package/dist/domains/knowledge/components/KnowledgePageDetail.es.js +436 -0
  71. package/dist/domains/knowledge/components/KnowledgePageDetail.es.js.map +1 -0
  72. package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js +521 -0
  73. package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js.map +1 -0
  74. package/dist/domains/knowledge/components/KnowledgePageExplorer.d.ts +1 -0
  75. package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js +520 -0
  76. package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js.map +1 -0
  77. package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js +626 -0
  78. package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js.map +1 -0
  79. package/dist/domains/knowledge/components/KnowledgePageGraph.d.ts +1 -0
  80. package/dist/domains/knowledge/components/KnowledgePageGraph.es.js +625 -0
  81. package/dist/domains/knowledge/components/KnowledgePageGraph.es.js.map +1 -0
  82. package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js +170 -0
  83. package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js.map +1 -0
  84. package/dist/domains/knowledge/components/KnowledgePageTree.d.ts +1 -0
  85. package/dist/domains/knowledge/components/KnowledgePageTree.es.js +168 -0
  86. package/dist/domains/knowledge/components/KnowledgePageTree.es.js.map +1 -0
  87. package/dist/domains/knowledge/hooks/useInteractionIdle.cjs.js +37 -0
  88. package/dist/domains/knowledge/hooks/useInteractionIdle.cjs.js.map +1 -0
  89. package/dist/domains/knowledge/hooks/useInteractionIdle.d.ts +1 -0
  90. package/dist/domains/knowledge/hooks/useInteractionIdle.es.js +35 -0
  91. package/dist/domains/knowledge/hooks/useInteractionIdle.es.js.map +1 -0
  92. package/dist/domains/knowledge/lib/layout.cjs.js +93 -0
  93. package/dist/domains/knowledge/lib/layout.cjs.js.map +1 -0
  94. package/dist/domains/knowledge/lib/layout.d.ts +1 -0
  95. package/dist/domains/knowledge/lib/layout.es.js +92 -0
  96. package/dist/domains/knowledge/lib/layout.es.js.map +1 -0
  97. package/dist/domains/knowledge/lib/pageGraph.cjs.js +135 -0
  98. package/dist/domains/knowledge/lib/pageGraph.cjs.js.map +1 -0
  99. package/dist/domains/knowledge/lib/pageGraph.d.ts +1 -0
  100. package/dist/domains/knowledge/lib/pageGraph.es.js +128 -0
  101. package/dist/domains/knowledge/lib/pageGraph.es.js.map +1 -0
  102. package/dist/domains/knowledge/lib/pageLayout.cjs.js +49 -0
  103. package/dist/domains/knowledge/lib/pageLayout.cjs.js.map +1 -0
  104. package/dist/domains/knowledge/lib/pageLayout.d.ts +1 -0
  105. package/dist/domains/knowledge/lib/pageLayout.es.js +48 -0
  106. package/dist/domains/knowledge/lib/pageLayout.es.js.map +1 -0
  107. package/dist/domains/knowledge/lib/pageTree.cjs.js +98 -0
  108. package/dist/domains/knowledge/lib/pageTree.cjs.js.map +1 -0
  109. package/dist/domains/knowledge/lib/pageTree.d.ts +1 -0
  110. package/dist/domains/knowledge/lib/pageTree.es.js +94 -0
  111. package/dist/domains/knowledge/lib/pageTree.es.js.map +1 -0
  112. package/dist/domains/knowledge/lib/popupPlacement.cjs.js +22 -0
  113. package/dist/domains/knowledge/lib/popupPlacement.cjs.js.map +1 -0
  114. package/dist/domains/knowledge/lib/popupPlacement.d.ts +1 -0
  115. package/dist/domains/knowledge/lib/popupPlacement.es.js +21 -0
  116. package/dist/domains/knowledge/lib/popupPlacement.es.js.map +1 -0
  117. package/dist/domains/knowledge/lib/recordText.cjs.js +26 -0
  118. package/dist/domains/knowledge/lib/recordText.cjs.js.map +1 -0
  119. package/dist/domains/knowledge/lib/recordText.d.ts +1 -0
  120. package/dist/domains/knowledge/lib/recordText.es.js +25 -0
  121. package/dist/domains/knowledge/lib/recordText.es.js.map +1 -0
  122. package/dist/domains/knowledge/pageTypes.cjs.js +0 -0
  123. package/dist/domains/knowledge/pageTypes.d.ts +1 -0
  124. package/dist/domains/knowledge/pageTypes.es.js +0 -0
  125. package/dist/domains/logs/components/logs-saved-views.cjs.js +1 -1
  126. package/dist/domains/logs/components/logs-saved-views.es.js +1 -1
  127. package/dist/domains/observability/saved-views/observability-saved-views.cjs.js +1 -1
  128. package/dist/domains/observability/saved-views/observability-saved-views.es.js +1 -1
  129. package/dist/domains/observability/saved-views/saved-views-provider.cjs.js +3 -2
  130. package/dist/domains/observability/saved-views/saved-views-provider.cjs.js.map +1 -1
  131. package/dist/domains/observability/saved-views/saved-views-provider.es.js +3 -2
  132. package/dist/domains/observability/saved-views/saved-views-provider.es.js.map +1 -1
  133. package/dist/domains/observability/saved-views/saved-views-source.cjs.js.map +1 -1
  134. package/dist/domains/observability/saved-views/saved-views-source.es.js.map +1 -1
  135. package/dist/domains/observability/saved-views/use-hosted-saved-views.cjs.js +3 -2
  136. package/dist/domains/observability/saved-views/use-hosted-saved-views.cjs.js.map +1 -1
  137. package/dist/domains/observability/saved-views/use-hosted-saved-views.es.js +3 -2
  138. package/dist/domains/observability/saved-views/use-hosted-saved-views.es.js.map +1 -1
  139. package/dist/domains/observability/saved-views.cjs.js +1 -1
  140. package/dist/domains/observability/saved-views.es.js +1 -1
  141. package/dist/domains/observability.cjs.js +1 -1
  142. package/dist/domains/observability.es.js +1 -1
  143. package/dist/domains/skills/skill-simple-form.cjs.js +2 -2
  144. package/dist/domains/skills/skill-simple-form.cjs.js.map +1 -1
  145. package/dist/domains/skills/skill-simple-form.es.js +2 -2
  146. package/dist/domains/skills/skill-simple-form.es.js.map +1 -1
  147. package/dist/domains/spans/components/spans-explorer-body.cjs.js +1 -1
  148. package/dist/domains/spans/components/spans-explorer-body.es.js +1 -1
  149. package/dist/domains/threads/components/threads-explorer-body.cjs.js +1 -1
  150. package/dist/domains/threads/components/threads-explorer-body.es.js +1 -1
  151. package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +1 -1
  152. package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +1 -1
  153. package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +1 -1
  154. package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +1 -1
  155. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +1 -1
  156. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +1 -1
  157. package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +1 -1
  158. package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +1 -1
  159. package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +1 -1
  160. package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +1 -1
  161. package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +1 -1
  162. package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +1 -1
  163. package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +1 -1
  164. package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +1 -1
  165. package/dist/domains/traces/components/span-payload/span-processor-mutations.cjs.js +1 -1
  166. package/dist/domains/traces/components/span-payload/span-processor-mutations.es.js +1 -1
  167. package/dist/domains/traces/components/span-payload/span-tools-section.cjs.js +1 -1
  168. package/dist/domains/traces/components/span-payload/span-tools-section.es.js +1 -1
  169. package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.cjs.js +1 -1
  170. package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.es.js +1 -1
  171. package/dist/domains/workflows/workflow/use-workflow-trigger.cjs.js +2 -1
  172. package/dist/domains/workflows/workflow/use-workflow-trigger.cjs.js.map +1 -1
  173. package/dist/domains/workflows/workflow/use-workflow-trigger.es.js +2 -1
  174. package/dist/domains/workflows/workflow/use-workflow-trigger.es.js.map +1 -1
  175. package/dist/lib/form/dynamic-form.cjs.js +2 -2
  176. package/dist/lib/form/dynamic-form.cjs.js.map +1 -1
  177. package/dist/lib/form/dynamic-form.es.js +2 -2
  178. package/dist/lib/form/dynamic-form.es.js.map +1 -1
  179. package/dist/lib/form/json-draft.cjs.js +1 -1
  180. package/dist/lib/form/json-draft.es.js +1 -1
  181. package/dist/lib/form/zod-provider/compat.cjs.js +8 -0
  182. package/dist/lib/form/zod-provider/compat.cjs.js.map +1 -1
  183. package/dist/lib/form/zod-provider/compat.es.js +8 -1
  184. package/dist/lib/form/zod-provider/compat.es.js.map +1 -1
  185. package/dist/lib/form/zod-provider.cjs.js +1 -1
  186. package/dist/lib/form/zod-provider.es.js +1 -1
  187. package/dist/{observability-saved-views-CwCii7hh.cjs → observability-saved-views-BNU3GkK6.cjs} +8 -6
  188. package/dist/observability-saved-views-BNU3GkK6.cjs.map +1 -0
  189. package/dist/{observability-saved-views-Bo5kLN20.js → observability-saved-views-Zlz74syw.js} +8 -6
  190. package/dist/observability-saved-views-Zlz74syw.js.map +1 -0
  191. package/dist/{span-payload-primitives-Dyhbqaa7.js → span-payload-primitives-ChvD2RrN.js} +2 -2
  192. package/dist/{span-payload-primitives-Dyhbqaa7.js.map → span-payload-primitives-ChvD2RrN.js.map} +1 -1
  193. package/dist/{span-payload-primitives-B10Xxmx7.cjs → span-payload-primitives-w1vtAXAw.cjs} +2 -2
  194. package/dist/{span-payload-primitives-B10Xxmx7.cjs.map → span-payload-primitives-w1vtAXAw.cjs.map} +1 -1
  195. package/dist/src/domains/chat/index.d.ts +1 -0
  196. package/dist/src/domains/chat/knowledge/index.d.ts +5 -0
  197. package/dist/src/domains/chat/knowledge/knowledge-links.d.ts +21 -0
  198. package/dist/src/domains/chat/knowledge/pinned-knowledge-data.d.ts +22 -0
  199. package/dist/src/domains/chat/knowledge/pinned-knowledge.d.ts +9 -0
  200. package/dist/src/domains/chat/tools/badges/knowledge-tool-badge.d.ts +19 -0
  201. package/dist/src/domains/chat/tools/tool-card-kind.d.ts +2 -2
  202. package/dist/src/domains/knowledge/components/KnowledgePageDetail.d.ts +42 -0
  203. package/dist/src/domains/knowledge/components/KnowledgePageExplorer.d.ts +80 -0
  204. package/dist/src/domains/knowledge/components/KnowledgePageGraph.d.ts +35 -0
  205. package/dist/src/domains/knowledge/components/KnowledgePageTree.d.ts +27 -0
  206. package/dist/src/domains/knowledge/hooks/useInteractionIdle.d.ts +12 -0
  207. package/dist/src/domains/knowledge/lib/layout.d.ts +35 -0
  208. package/dist/src/domains/knowledge/lib/pageGraph.d.ts +45 -0
  209. package/dist/src/domains/knowledge/lib/pageLayout.d.ts +24 -0
  210. package/dist/src/domains/knowledge/lib/pageTree.d.ts +28 -0
  211. package/dist/src/domains/knowledge/lib/popupPlacement.d.ts +12 -0
  212. package/dist/src/domains/knowledge/lib/recordText.d.ts +9 -0
  213. package/dist/src/domains/knowledge/pageTypes.d.ts +96 -0
  214. package/dist/src/domains/observability/saved-views/saved-views-provider.d.ts +6 -1
  215. package/dist/src/domains/observability/saved-views/saved-views-source.d.ts +1 -0
  216. package/dist/src/domains/observability/saved-views/use-hosted-saved-views.d.ts +1 -1
  217. package/dist/src/domains/skills/skill-simple-form.d.ts +3 -1
  218. package/dist/src/ds/components/SavedViews/saved-view-picker.d.ts +3 -1
  219. package/dist/src/ds/components/ai/tool-call/tool-phrases.d.ts +30 -0
  220. package/dist/src/lib/form/zod-provider/compat.d.ts +5 -0
  221. package/dist/style.css +63 -1
  222. package/dist/{tool-approval-FeuyUUcL.js → tool-approval-DHeCkWHT.js} +3 -3
  223. package/dist/{tool-approval-FeuyUUcL.js.map → tool-approval-DHeCkWHT.js.map} +1 -1
  224. package/dist/{tool-approval-BfjoSNOC.cjs → tool-approval-Dfi0uAKU.cjs} +3 -3
  225. package/dist/{tool-approval-BfjoSNOC.cjs.map → tool-approval-Dfi0uAKU.cjs.map} +1 -1
  226. package/dist/{tool-call-CvilN9ti.cjs → tool-call-BCsDhIhs.cjs} +32 -2
  227. package/dist/{tool-call-CvilN9ti.cjs.map → tool-call-BCsDhIhs.cjs.map} +1 -1
  228. package/dist/{tool-call-BxYXs9w0.js → tool-call-CILZa3tn.js} +32 -2
  229. package/dist/{tool-call-BxYXs9w0.js.map → tool-call-CILZa3tn.js.map} +1 -1
  230. package/dist/{tool-card-ELW898uw.js → tool-card-C3sDFUWc.js} +18 -4
  231. package/dist/tool-card-C3sDFUWc.js.map +1 -0
  232. package/dist/{tool-card-B7O8AsRl.cjs → tool-card-CJ7Kxi-U.cjs} +18 -4
  233. package/dist/tool-card-CJ7Kxi-U.cjs.map +1 -0
  234. package/dist/{tool-presentation-BLErsb7c.cjs → tool-presentation-CQlDEwgS.cjs} +26 -1
  235. package/dist/tool-presentation-CQlDEwgS.cjs.map +1 -0
  236. package/dist/{tool-presentation-BSZYIWx2.js → tool-presentation-DvCsb_kz.js} +26 -1
  237. package/dist/tool-presentation-DvCsb_kz.js.map +1 -0
  238. package/package.json +11 -9
  239. package/dist/observability-saved-views-Bo5kLN20.js.map +0 -1
  240. package/dist/observability-saved-views-CwCii7hh.cjs.map +0 -1
  241. package/dist/tool-card-B7O8AsRl.cjs.map +0 -1
  242. package/dist/tool-card-ELW898uw.js.map +0 -1
  243. package/dist/tool-presentation-BLErsb7c.cjs.map +0 -1
  244. package/dist/tool-presentation-BSZYIWx2.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tool-groups.cjs.js","names":["readToolPart","toolCardKind","toolInteraction","isSignalData","isToolPart","groupConsecutive"],"sources":["../../../../src/domains/chat/tools/tool-groups.ts"],"sourcesContent":["import type { DataPart, MessageFactoryPart } from '@mastra/react/ui';\n\nimport { isToolPart, readToolPart } from '../messages/renderers/tool-part';\nimport type { ToolPart } from '../messages/renderers/tool-part';\nimport { isSignalData } from '../messages/signal-data';\nimport { toolCardKind, toolInteraction } from './tool-card-kind';\nimport type { ToolCardContext, ToolCardKind } from './tool-card-kind';\nimport { groupConsecutive } from '@/ds/components/ai/tool-call';\nimport type { ConsecutiveGroups } from '@/ds/components/ai/tool-call';\n\n/** Cards that only draw: nothing in them waits on the reader. */\nconst FOLDABLE_KINDS = new Set<ToolCardKind>(['plain', 'background', 'file_tree', 'sandbox', 'code_mode']);\n\nexport function foldsIntoGroup(part: ToolPart, context: ToolCardContext): boolean {\n const fields = readToolPart(part);\n if (fields.toolCallId === '' || !FOLDABLE_KINDS.has(toolCardKind(fields, context))) return false;\n const { approval, suspended } = toolInteraction(context.metadata, fields.toolName, fields.toolCallId);\n return approval === undefined && suspended === undefined;\n}\n\nconst isDataPart = (part: MessageFactoryPart): part is DataPart => part.type.startsWith('data-');\n\n/** Mirrors the renderers: step markers, non-signal data and hidden tools put nothing on screen. */\nconst drawsNothing = (part: MessageFactoryPart, context: ToolCardContext): boolean => {\n if (part.type === 'step-start') return true;\n if (isDataPart(part)) return !(part.type === 'data-signal' && isSignalData(part.data));\n return isToolPart(part) && toolCardKind(readToolPart(part), context) === 'hidden';\n};\n\n/** Runs of plain calls fold under their first call id. A part that draws nothing neither joins nor breaks a run. */\nexport function collectToolGroups(\n parts: readonly MessageFactoryPart[],\n context: ToolCardContext,\n): ConsecutiveGroups<ToolPart> {\n return groupConsecutive(\n parts.filter(part => !drawsNothing(part, context)),\n {\n key: part => readToolPart(part).toolCallId,\n joins: (part): part is ToolPart => isToolPart(part) && foldsIntoGroup(part, context),\n },\n );\n}\n"],"mappings":";;;;;;;AAWA,IAAM,iCAAiB,IAAI,IAAkB;CAAC;CAAS;CAAc;CAAa;CAAW;AAAW,CAAC;AAEzG,SAAgB,eAAe,MAAgB,SAAmC;CAChF,MAAM,SAASA,kDAAAA,aAAa,IAAI;CAChC,IAAI,OAAO,eAAe,MAAM,CAAC,eAAe,IAAIC,0CAAAA,aAAa,QAAQ,OAAO,CAAC,GAAG,OAAO;CAC3F,MAAM,EAAE,UAAU,cAAcC,0CAAAA,gBAAgB,QAAQ,UAAU,OAAO,UAAU,OAAO,UAAU;CACpG,OAAO,aAAa,KAAA,KAAa,cAAc,KAAA;AACjD;AAEA,IAAM,cAAc,SAA+C,KAAK,KAAK,WAAW,OAAO;;AAG/F,IAAM,gBAAgB,MAA0B,YAAsC;CACpF,IAAI,KAAK,SAAS,cAAc,OAAO;CACvC,IAAI,WAAW,IAAI,GAAG,OAAO,EAAE,KAAK,SAAS,iBAAiBC,0CAAAA,aAAa,KAAK,IAAI;CACpF,OAAOC,kDAAAA,WAAW,IAAI,KAAKH,0CAAAA,aAAaD,kDAAAA,aAAa,IAAI,GAAG,OAAO,MAAM;AAC3E;;AAGA,SAAgB,kBACd,OACA,SAC6B;CAC7B,OAAOK,kBAAAA,iBACL,MAAM,QAAO,SAAQ,CAAC,aAAa,MAAM,OAAO,CAAC,GACjD;EACE,MAAK,SAAQL,kDAAAA,aAAa,IAAI,CAAC,CAAC;EAChC,QAAQ,SAA2BI,kDAAAA,WAAW,IAAI,KAAK,eAAe,MAAM,OAAO;CACrF,CACF;AACF"}
1
+ {"version":3,"file":"tool-groups.cjs.js","names":["readToolPart","toolCardKind","toolInteraction","isSignalData","isToolPart","groupConsecutive"],"sources":["../../../../src/domains/chat/tools/tool-groups.ts"],"sourcesContent":["import type { DataPart, MessageFactoryPart } from '@mastra/react/ui';\n\nimport { isToolPart, readToolPart } from '../messages/renderers/tool-part';\nimport type { ToolPart } from '../messages/renderers/tool-part';\nimport { isSignalData } from '../messages/signal-data';\nimport { toolCardKind, toolInteraction } from './tool-card-kind';\nimport type { ToolCardContext, ToolCardKind } from './tool-card-kind';\nimport { groupConsecutive } from '@/ds/components/ai/tool-call';\nimport type { ConsecutiveGroups } from '@/ds/components/ai/tool-call';\n\n/** Cards that only draw: nothing in them waits on the reader. */\nconst FOLDABLE_KINDS = new Set<ToolCardKind>(['plain', 'background', 'file_tree', 'sandbox', 'code_mode', 'knowledge']);\n\nexport function foldsIntoGroup(part: ToolPart, context: ToolCardContext): boolean {\n const fields = readToolPart(part);\n if (fields.toolCallId === '' || !FOLDABLE_KINDS.has(toolCardKind(fields, context))) return false;\n const { approval, suspended } = toolInteraction(context.metadata, fields.toolName, fields.toolCallId);\n return approval === undefined && suspended === undefined;\n}\n\nconst isDataPart = (part: MessageFactoryPart): part is DataPart => part.type.startsWith('data-');\n\n/** Mirrors the renderers: step markers, non-signal data and hidden tools put nothing on screen. */\nconst drawsNothing = (part: MessageFactoryPart, context: ToolCardContext): boolean => {\n if (part.type === 'step-start') return true;\n if (isDataPart(part)) return !(part.type === 'data-signal' && isSignalData(part.data));\n return isToolPart(part) && toolCardKind(readToolPart(part), context) === 'hidden';\n};\n\n/** Runs of plain calls fold under their first call id. A part that draws nothing neither joins nor breaks a run. */\nexport function collectToolGroups(\n parts: readonly MessageFactoryPart[],\n context: ToolCardContext,\n): ConsecutiveGroups<ToolPart> {\n return groupConsecutive(\n parts.filter(part => !drawsNothing(part, context)),\n {\n key: part => readToolPart(part).toolCallId,\n joins: (part): part is ToolPart => isToolPart(part) && foldsIntoGroup(part, context),\n },\n );\n}\n"],"mappings":";;;;;;;AAWA,IAAM,iCAAiB,IAAI,IAAkB;CAAC;CAAS;CAAc;CAAa;CAAW;CAAa;AAAW,CAAC;AAEtH,SAAgB,eAAe,MAAgB,SAAmC;CAChF,MAAM,SAASA,kDAAAA,aAAa,IAAI;CAChC,IAAI,OAAO,eAAe,MAAM,CAAC,eAAe,IAAIC,0CAAAA,aAAa,QAAQ,OAAO,CAAC,GAAG,OAAO;CAC3F,MAAM,EAAE,UAAU,cAAcC,0CAAAA,gBAAgB,QAAQ,UAAU,OAAO,UAAU,OAAO,UAAU;CACpG,OAAO,aAAa,KAAA,KAAa,cAAc,KAAA;AACjD;AAEA,IAAM,cAAc,SAA+C,KAAK,KAAK,WAAW,OAAO;;AAG/F,IAAM,gBAAgB,MAA0B,YAAsC;CACpF,IAAI,KAAK,SAAS,cAAc,OAAO;CACvC,IAAI,WAAW,IAAI,GAAG,OAAO,EAAE,KAAK,SAAS,iBAAiBC,0CAAAA,aAAa,KAAK,IAAI;CACpF,OAAOC,kDAAAA,WAAW,IAAI,KAAKH,0CAAAA,aAAaD,kDAAAA,aAAa,IAAI,GAAG,OAAO,MAAM;AAC3E;;AAGA,SAAgB,kBACd,OACA,SAC6B;CAC7B,OAAOK,kBAAAA,iBACL,MAAM,QAAO,SAAQ,CAAC,aAAa,MAAM,OAAO,CAAC,GACjD;EACE,MAAK,SAAQL,kDAAAA,aAAa,IAAI,CAAC,CAAC;EAChC,QAAQ,SAA2BI,kDAAAA,WAAW,IAAI,KAAK,eAAe,MAAM,OAAO;CACrF,CACF;AACF"}
@@ -1,4 +1,4 @@
1
- import { u as groupConsecutive } from "../../../tool-call-BxYXs9w0.js";
1
+ import { u as groupConsecutive } from "../../../tool-call-CILZa3tn.js";
2
2
  import { isSignalData } from "../messages/signal-data.es.js";
3
3
  import { isToolPart, readToolPart } from "../messages/renderers/tool-part.es.js";
4
4
  import { toolCardKind, toolInteraction } from "./tool-card-kind.es.js";
@@ -9,7 +9,8 @@ var FOLDABLE_KINDS = /* @__PURE__ */ new Set([
9
9
  "background",
10
10
  "file_tree",
11
11
  "sandbox",
12
- "code_mode"
12
+ "code_mode",
13
+ "knowledge"
13
14
  ]);
14
15
  function foldsIntoGroup(part, context) {
15
16
  const fields = readToolPart(part);
@@ -1 +1 @@
1
- {"version":3,"file":"tool-groups.es.js","names":[],"sources":["../../../../src/domains/chat/tools/tool-groups.ts"],"sourcesContent":["import type { DataPart, MessageFactoryPart } from '@mastra/react/ui';\n\nimport { isToolPart, readToolPart } from '../messages/renderers/tool-part';\nimport type { ToolPart } from '../messages/renderers/tool-part';\nimport { isSignalData } from '../messages/signal-data';\nimport { toolCardKind, toolInteraction } from './tool-card-kind';\nimport type { ToolCardContext, ToolCardKind } from './tool-card-kind';\nimport { groupConsecutive } from '@/ds/components/ai/tool-call';\nimport type { ConsecutiveGroups } from '@/ds/components/ai/tool-call';\n\n/** Cards that only draw: nothing in them waits on the reader. */\nconst FOLDABLE_KINDS = new Set<ToolCardKind>(['plain', 'background', 'file_tree', 'sandbox', 'code_mode']);\n\nexport function foldsIntoGroup(part: ToolPart, context: ToolCardContext): boolean {\n const fields = readToolPart(part);\n if (fields.toolCallId === '' || !FOLDABLE_KINDS.has(toolCardKind(fields, context))) return false;\n const { approval, suspended } = toolInteraction(context.metadata, fields.toolName, fields.toolCallId);\n return approval === undefined && suspended === undefined;\n}\n\nconst isDataPart = (part: MessageFactoryPart): part is DataPart => part.type.startsWith('data-');\n\n/** Mirrors the renderers: step markers, non-signal data and hidden tools put nothing on screen. */\nconst drawsNothing = (part: MessageFactoryPart, context: ToolCardContext): boolean => {\n if (part.type === 'step-start') return true;\n if (isDataPart(part)) return !(part.type === 'data-signal' && isSignalData(part.data));\n return isToolPart(part) && toolCardKind(readToolPart(part), context) === 'hidden';\n};\n\n/** Runs of plain calls fold under their first call id. A part that draws nothing neither joins nor breaks a run. */\nexport function collectToolGroups(\n parts: readonly MessageFactoryPart[],\n context: ToolCardContext,\n): ConsecutiveGroups<ToolPart> {\n return groupConsecutive(\n parts.filter(part => !drawsNothing(part, context)),\n {\n key: part => readToolPart(part).toolCallId,\n joins: (part): part is ToolPart => isToolPart(part) && foldsIntoGroup(part, context),\n },\n );\n}\n"],"mappings":";;;;;;AAWA,IAAM,iCAAiB,IAAI,IAAkB;CAAC;CAAS;CAAc;CAAa;CAAW;AAAW,CAAC;AAEzG,SAAgB,eAAe,MAAgB,SAAmC;CAChF,MAAM,SAAS,aAAa,IAAI;CAChC,IAAI,OAAO,eAAe,MAAM,CAAC,eAAe,IAAI,aAAa,QAAQ,OAAO,CAAC,GAAG,OAAO;CAC3F,MAAM,EAAE,UAAU,cAAc,gBAAgB,QAAQ,UAAU,OAAO,UAAU,OAAO,UAAU;CACpG,OAAO,aAAa,KAAA,KAAa,cAAc,KAAA;AACjD;AAEA,IAAM,cAAc,SAA+C,KAAK,KAAK,WAAW,OAAO;;AAG/F,IAAM,gBAAgB,MAA0B,YAAsC;CACpF,IAAI,KAAK,SAAS,cAAc,OAAO;CACvC,IAAI,WAAW,IAAI,GAAG,OAAO,EAAE,KAAK,SAAS,iBAAiB,aAAa,KAAK,IAAI;CACpF,OAAO,WAAW,IAAI,KAAK,aAAa,aAAa,IAAI,GAAG,OAAO,MAAM;AAC3E;;AAGA,SAAgB,kBACd,OACA,SAC6B;CAC7B,OAAO,iBACL,MAAM,QAAO,SAAQ,CAAC,aAAa,MAAM,OAAO,CAAC,GACjD;EACE,MAAK,SAAQ,aAAa,IAAI,CAAC,CAAC;EAChC,QAAQ,SAA2B,WAAW,IAAI,KAAK,eAAe,MAAM,OAAO;CACrF,CACF;AACF"}
1
+ {"version":3,"file":"tool-groups.es.js","names":[],"sources":["../../../../src/domains/chat/tools/tool-groups.ts"],"sourcesContent":["import type { DataPart, MessageFactoryPart } from '@mastra/react/ui';\n\nimport { isToolPart, readToolPart } from '../messages/renderers/tool-part';\nimport type { ToolPart } from '../messages/renderers/tool-part';\nimport { isSignalData } from '../messages/signal-data';\nimport { toolCardKind, toolInteraction } from './tool-card-kind';\nimport type { ToolCardContext, ToolCardKind } from './tool-card-kind';\nimport { groupConsecutive } from '@/ds/components/ai/tool-call';\nimport type { ConsecutiveGroups } from '@/ds/components/ai/tool-call';\n\n/** Cards that only draw: nothing in them waits on the reader. */\nconst FOLDABLE_KINDS = new Set<ToolCardKind>(['plain', 'background', 'file_tree', 'sandbox', 'code_mode', 'knowledge']);\n\nexport function foldsIntoGroup(part: ToolPart, context: ToolCardContext): boolean {\n const fields = readToolPart(part);\n if (fields.toolCallId === '' || !FOLDABLE_KINDS.has(toolCardKind(fields, context))) return false;\n const { approval, suspended } = toolInteraction(context.metadata, fields.toolName, fields.toolCallId);\n return approval === undefined && suspended === undefined;\n}\n\nconst isDataPart = (part: MessageFactoryPart): part is DataPart => part.type.startsWith('data-');\n\n/** Mirrors the renderers: step markers, non-signal data and hidden tools put nothing on screen. */\nconst drawsNothing = (part: MessageFactoryPart, context: ToolCardContext): boolean => {\n if (part.type === 'step-start') return true;\n if (isDataPart(part)) return !(part.type === 'data-signal' && isSignalData(part.data));\n return isToolPart(part) && toolCardKind(readToolPart(part), context) === 'hidden';\n};\n\n/** Runs of plain calls fold under their first call id. A part that draws nothing neither joins nor breaks a run. */\nexport function collectToolGroups(\n parts: readonly MessageFactoryPart[],\n context: ToolCardContext,\n): ConsecutiveGroups<ToolPart> {\n return groupConsecutive(\n parts.filter(part => !drawsNothing(part, context)),\n {\n key: part => readToolPart(part).toolCallId,\n joins: (part): part is ToolPart => isToolPart(part) && foldsIntoGroup(part, context),\n },\n );\n}\n"],"mappings":";;;;;;AAWA,IAAM,iCAAiB,IAAI,IAAkB;CAAC;CAAS;CAAc;CAAa;CAAW;CAAa;AAAW,CAAC;AAEtH,SAAgB,eAAe,MAAgB,SAAmC;CAChF,MAAM,SAAS,aAAa,IAAI;CAChC,IAAI,OAAO,eAAe,MAAM,CAAC,eAAe,IAAI,aAAa,QAAQ,OAAO,CAAC,GAAG,OAAO;CAC3F,MAAM,EAAE,UAAU,cAAc,gBAAgB,QAAQ,UAAU,OAAO,UAAU,OAAO,UAAU;CACpG,OAAO,aAAa,KAAA,KAAa,cAAc,KAAA;AACjD;AAEA,IAAM,cAAc,SAA+C,KAAK,KAAK,WAAW,OAAO;;AAG/F,IAAM,gBAAgB,MAA0B,YAAsC;CACpF,IAAI,KAAK,SAAS,cAAc,OAAO;CACvC,IAAI,WAAW,IAAI,GAAG,OAAO,EAAE,KAAK,SAAS,iBAAiB,aAAa,KAAK,IAAI;CACpF,OAAO,WAAW,IAAI,KAAK,aAAa,aAAa,IAAI,GAAG,OAAO,MAAM;AAC3E;;AAGA,SAAgB,kBACd,OACA,SAC6B;CAC7B,OAAO,iBACL,MAAM,QAAO,SAAQ,CAAC,aAAa,MAAM,OAAO,CAAC,GACjD;EACE,MAAK,SAAQ,aAAa,IAAI,CAAC,CAAC;EAChC,QAAQ,SAA2B,WAAW,IAAI,KAAK,eAAe,MAAM,OAAO;CACrF,CACF;AACF"}
@@ -8,6 +8,10 @@ const require_domains_chat_context_dataset_save_context_value = require("./chat/
8
8
  const require_domains_chat_context_dataset_save_context = require("./chat/context/dataset-save-context.cjs.js");
9
9
  const require_domains_chat_context_tool_call_context = require("./chat/context/tool-call-context.cjs.js");
10
10
  const require_domains_chat_messages_signal_data = require("./chat/messages/signal-data.cjs.js");
11
+ const require_domains_chat_knowledge_pinned_knowledge_data = require("./chat/knowledge/pinned-knowledge-data.cjs.js");
12
+ const require_domains_chat_knowledge_knowledge_links = require("./chat/knowledge/knowledge-links.cjs.js");
13
+ const require_domains_chat_knowledge_pinned_knowledge = require("./chat/knowledge/pinned-knowledge.cjs.js");
14
+ const require_domains_chat_tools_badges_knowledge_tool_badge = require("./chat/tools/badges/knowledge-tool-badge.cjs.js");
11
15
  const require_domains_chat_messages_renderers_tool_part = require("./chat/messages/renderers/tool-part.cjs.js");
12
16
  const require_domains_chat_messages_dataset_save_action = require("./chat/messages/dataset-save-action.cjs.js");
13
17
  const require_domains_chat_messages_assistant_message_actions = require("./chat/messages/assistant-message-actions.cjs.js");
@@ -20,8 +24,12 @@ exports.ChatSendContext = require_domains_chat_context_chat_context.ChatSendCont
20
24
  exports.ChatTasksContext = require_domains_chat_context_chat_context.ChatTasksContext;
21
25
  exports.DatasetSaveAction = require_domains_chat_messages_dataset_save_action.DatasetSaveAction;
22
26
  exports.DatasetSaveProvider = require_domains_chat_context_dataset_save_context.DatasetSaveProvider;
27
+ exports.KNOWLEDGE_TOOLS = require_domains_chat_tools_badges_knowledge_tool_badge.KNOWLEDGE_TOOLS;
28
+ exports.KnowledgeLinksProvider = require_domains_chat_knowledge_knowledge_links.KnowledgeLinksProvider;
29
+ exports.KnowledgePageLink = require_domains_chat_knowledge_knowledge_links.KnowledgePageLink;
23
30
  exports.LoadingBadge = require_domains_chat_components_loading_badge.LoadingBadge;
24
31
  exports.NetworkChoiceMetadataDialogTrigger = require_domains_chat_components_network_choice_metadata_dialog.NetworkChoiceMetadataDialogTrigger;
32
+ exports.PinnedKnowledgeActivity = require_domains_chat_knowledge_pinned_knowledge.PinnedKnowledgeActivity;
25
33
  exports.SaveFullConversationAction = require_domains_chat_messages_dataset_save_action.SaveFullConversationAction;
26
34
  exports.SectionLabel = require_domains_chat_components_section_label.SectionLabel;
27
35
  exports.ToolCallProvider = require_domains_chat_context_tool_call_context.ToolCallProvider;
@@ -33,6 +41,9 @@ exports.isRecord = require_domains_chat_messages_signal_data.isRecord;
33
41
  exports.isSignalData = require_domains_chat_messages_signal_data.isSignalData;
34
42
  exports.isToolPart = require_domains_chat_messages_renderers_tool_part.isToolPart;
35
43
  exports.isUserSignalType = require_domains_chat_messages_signal_data.isUserSignalType;
44
+ exports.knowledgeCard = require_domains_chat_tools_badges_knowledge_tool_badge.knowledgeCard;
45
+ exports.knowledgePageHref = require_domains_chat_knowledge_pinned_knowledge_data.knowledgePageHref;
46
+ exports.pinnedKnowledgeFromSignal = require_domains_chat_knowledge_pinned_knowledge_data.pinnedKnowledgeFromSignal;
36
47
  exports.readToolPart = require_domains_chat_messages_renderers_tool_part.readToolPart;
37
48
  exports.signalContentsToText = require_domains_chat_messages_signal_data.signalContentsToText;
38
49
  exports.toReactiveSignalData = require_domains_chat_messages_signal_data.toReactiveSignalData;
@@ -7,7 +7,11 @@ import { useDatasetSaveContext } from "./chat/context/dataset-save-context-value
7
7
  import { DatasetSaveProvider } from "./chat/context/dataset-save-context.es.js";
8
8
  import { ToolCallProvider, useOptionalToolCall, useToolCall } from "./chat/context/tool-call-context.es.js";
9
9
  import { formatSignalValue, getMcpEventSignalInfo, getNotificationMetadata, getSignalType, isRecord, isSignalData, isUserSignalType, signalContentsToText, toReactiveSignalData } from "./chat/messages/signal-data.es.js";
10
+ import { knowledgePageHref, pinnedKnowledgeFromSignal } from "./chat/knowledge/pinned-knowledge-data.es.js";
11
+ import { KnowledgeLinksProvider, KnowledgePageLink } from "./chat/knowledge/knowledge-links.es.js";
12
+ import { PinnedKnowledgeActivity } from "./chat/knowledge/pinned-knowledge.es.js";
13
+ import { KNOWLEDGE_TOOLS, knowledgeCard } from "./chat/tools/badges/knowledge-tool-badge.es.js";
10
14
  import { isToolPart, readToolPart } from "./chat/messages/renderers/tool-part.es.js";
11
15
  import { DatasetSaveAction, SaveFullConversationAction } from "./chat/messages/dataset-save-action.es.js";
12
16
  import { AssistantMessageActions } from "./chat/messages/assistant-message-actions.es.js";
13
- export { AssistantMessageActions, BadgeWrapper, ChatAgentContext, ChatMessagesContext, ChatRunningContext, ChatSendContext, ChatTasksContext, DatasetSaveAction, DatasetSaveProvider, LoadingBadge, NetworkChoiceMetadataDialogTrigger, SaveFullConversationAction, SectionLabel, ToolCallProvider, formatSignalValue, getMcpEventSignalInfo, getNotificationMetadata, getSignalType, isRecord, isSignalData, isToolPart, isUserSignalType, readToolPart, signalContentsToText, toReactiveSignalData, useChatMessages, useChatRunning, useChatSend, useChatTasks, useDatasetSaveContext, useOptionalToolCall, useToolCall };
17
+ export { AssistantMessageActions, BadgeWrapper, ChatAgentContext, ChatMessagesContext, ChatRunningContext, ChatSendContext, ChatTasksContext, DatasetSaveAction, DatasetSaveProvider, KNOWLEDGE_TOOLS, KnowledgeLinksProvider, KnowledgePageLink, LoadingBadge, NetworkChoiceMetadataDialogTrigger, PinnedKnowledgeActivity, SaveFullConversationAction, SectionLabel, ToolCallProvider, formatSignalValue, getMcpEventSignalInfo, getNotificationMetadata, getSignalType, isRecord, isSignalData, isToolPart, isUserSignalType, knowledgeCard, knowledgePageHref, pinnedKnowledgeFromSignal, readToolPart, signalContentsToText, toReactiveSignalData, useChatMessages, useChatRunning, useChatSend, useChatTasks, useDatasetSaveContext, useOptionalToolCall, useToolCall };
@@ -0,0 +1,438 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_Txt = require("../../../Txt-BnoSqxKE.cjs");
3
+ const require_Badge = require("../../../Badge-DZ6r6bcw.cjs");
4
+ const require_MarkdownRenderer = require("../../../MarkdownRenderer-CS6u5drO.cjs");
5
+ const require_domains_knowledge_lib_recordText = require("../lib/recordText.cjs.js");
6
+ let react = require("react");
7
+ let react_jsx_runtime = require("react/jsx-runtime");
8
+ let lucide_react = require("lucide-react");
9
+ // src/domains/knowledge/components/KnowledgePageDetail.tsx
10
+ var ACTIVITY_LABELS = {
11
+ "scope-created": "Scope created",
12
+ "page-created": "Page created",
13
+ "page-updated": "Page edited",
14
+ "page-moved": "Page moved",
15
+ "page-merged": "Page merged",
16
+ "page-deleted": "Page deleted",
17
+ "note-added": "Note added",
18
+ "note-restamped": "Note restamped",
19
+ "note-removed": "Note removed",
20
+ "note-restored": "Note restored",
21
+ "pin-added": "Pinned",
22
+ "pin-removed": "Unpinned"
23
+ };
24
+ function formatWhen(iso) {
25
+ const date = new Date(iso);
26
+ return Number.isNaN(date.getTime()) ? iso : date.toLocaleString(void 0, {
27
+ dateStyle: "medium",
28
+ timeStyle: "short"
29
+ });
30
+ }
31
+ var RELATIVE_STEPS = [
32
+ ["second", 60],
33
+ ["minute", 60],
34
+ ["hour", 24],
35
+ ["day", 7],
36
+ ["week", 4.35],
37
+ ["month", 12],
38
+ ["year", Infinity]
39
+ ];
40
+ /** "3 minutes ago", with the exact time left to a tooltip. */
41
+ function formatAgo(iso, now = Date.now()) {
42
+ const time = new Date(iso).getTime();
43
+ if (Number.isNaN(time)) return iso;
44
+ let value = (time - now) / 1e3;
45
+ const format = new Intl.RelativeTimeFormat(void 0, { numeric: "auto" });
46
+ for (const [unit, size] of RELATIVE_STEPS) {
47
+ if (Math.abs(value) < size) return format.format(Math.round(value), unit);
48
+ value /= size;
49
+ }
50
+ return formatWhen(iso);
51
+ }
52
+ function When({ iso }) {
53
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("time", {
54
+ dateTime: iso,
55
+ title: formatWhen(iso),
56
+ children: formatAgo(iso)
57
+ });
58
+ }
59
+ /** A small round mark with the author's initial, tinted per author so a page's writers tell apart. */
60
+ function AuthorMark({ author }) {
61
+ const name = author.includes(":") ? author.slice(author.indexOf(":") + 1) : author;
62
+ let hash = 0;
63
+ for (const char of author) hash = hash * 31 + char.charCodeAt(0) | 0;
64
+ const hues = [
65
+ "--chart-blue",
66
+ "--chart-purple",
67
+ "--chart-green",
68
+ "--chart-orange",
69
+ "--chart-pink"
70
+ ];
71
+ const hue = hues[Math.abs(hash) % hues.length];
72
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
73
+ "aria-hidden": true,
74
+ className: "flex size-6 shrink-0 items-center justify-center rounded-full border border-border",
75
+ style: { background: `color-mix(in oklab, var(${hue}) 28%, var(--card))` },
76
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Txt.Txt, {
77
+ as: "span",
78
+ variant: "meta",
79
+ tone: "ink",
80
+ children: (name.trim()[0] ?? "?").toUpperCase()
81
+ })
82
+ });
83
+ }
84
+ /**
85
+ * The page's address: its home scope, then the keys from that scope down to it
86
+ * (`org:acme#policies/refund`). Null when a page on the way has no key.
87
+ */
88
+ function knowledgePagePath(page, ancestors) {
89
+ if (page.isScope) return page.address ?? null;
90
+ const scope = ancestors.find((candidate) => candidate.id === page.scopeId);
91
+ if (!scope?.address) return null;
92
+ const keys = [...ancestors.slice(ancestors.indexOf(scope) + 1).filter((candidate) => !candidate.isScope), page].map((candidate) => candidate.key);
93
+ if (keys.some((key) => !key)) return null;
94
+ return `${scope.address}#${keys.join("/")}`;
95
+ }
96
+ function Section({ label, count, children }) {
97
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
98
+ "aria-label": label,
99
+ className: "flex flex-col gap-3",
100
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
101
+ className: "flex items-center gap-2 border-b border-border pb-2",
102
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Txt.Txt, {
103
+ as: "h3",
104
+ variant: "eyebrow",
105
+ tone: "muted",
106
+ className: "uppercase",
107
+ children: label
108
+ }), count !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Badge.Badge, {
109
+ variant: "neutral",
110
+ size: "xs",
111
+ children: count
112
+ }) : null]
113
+ }), children]
114
+ });
115
+ }
116
+ function PageLink({ page, onPageClick }) {
117
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
118
+ type: "button",
119
+ className: "text-left font-medium text-info-indicator hover:underline",
120
+ onClick: () => onPageClick(page),
121
+ children: page.name
122
+ });
123
+ }
124
+ /** One note: who wrote it and when, its text with `[[mentions]]` linked when the page is known, and the scopes it is stamped to. */
125
+ function KnowledgeNoteItem({ note, pagesById, onPageClick, highlighted, itemRef, showPage, compact }) {
126
+ const mentioned = note.mentions.map((id) => pagesById.get(id)).filter((candidate) => candidate !== void 0);
127
+ const scopeLabel = (id) => {
128
+ const scopePage = pagesById.get(id);
129
+ return scopePage?.address ?? scopePage?.name ?? id;
130
+ };
131
+ const onPage = showPage ? pagesById.get(note.pageId) : void 0;
132
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", {
133
+ ref: itemRef,
134
+ "data-highlighted": highlighted || void 0,
135
+ className: `flex gap-3 rounded-lg border border-border bg-card ${compact ? "p-2" : "p-3"}`,
136
+ style: highlighted ? {
137
+ borderColor: "var(--chart-blue)",
138
+ boxShadow: "0 0 0 1px var(--chart-blue)"
139
+ } : void 0,
140
+ children: [compact ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AuthorMark, { author: note.provenance.author }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
141
+ className: "flex min-w-0 flex-1 flex-col gap-1.5",
142
+ children: [
143
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
144
+ className: "flex flex-wrap items-baseline gap-x-2 gap-y-0.5",
145
+ children: [
146
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Txt.Txt, {
147
+ as: "span",
148
+ variant: "label",
149
+ tone: "ink",
150
+ children: note.provenance.author
151
+ }),
152
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Txt.Txt, {
153
+ as: "span",
154
+ variant: "caption",
155
+ tone: "muted",
156
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(When, { iso: note.updatedAt })
157
+ }),
158
+ onPage ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_Txt.Txt, {
159
+ as: "span",
160
+ variant: "caption",
161
+ tone: "muted",
162
+ children: ["on ", /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PageLink, {
163
+ page: onPage,
164
+ onPageClick
165
+ })]
166
+ }) : null
167
+ ]
168
+ }),
169
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
170
+ className: "text-ui-md break-words text-foreground",
171
+ children: require_domains_knowledge_lib_recordText.parseRecordSegments(note.text).map((segment, index) => {
172
+ if (segment.type === "text") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: segment.value }, index);
173
+ const name = segment.value.trim().toLocaleLowerCase();
174
+ const target = mentioned.find((candidate) => candidate.name.trim().toLocaleLowerCase() === name);
175
+ return target ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
176
+ type: "button",
177
+ className: "rounded bg-badge-blue-subtle px-1 font-medium text-badge-blue-foreground hover:underline",
178
+ onClick: () => onPageClick(target),
179
+ children: segment.value
180
+ }, index) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
181
+ className: "font-medium",
182
+ children: segment.value
183
+ }, index);
184
+ })
185
+ }),
186
+ note.stampScopeIds.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
187
+ className: "flex flex-wrap gap-1",
188
+ "aria-label": "Stamped to",
189
+ children: note.stampScopeIds.map((id) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Badge.Badge, {
190
+ variant: "neutral",
191
+ size: "xs",
192
+ children: scopeLabel(id)
193
+ }, id))
194
+ }) : null
195
+ ]
196
+ })]
197
+ });
198
+ }
199
+ /**
200
+ * The selected page as a page: where it sits, its body as markdown, its child
201
+ * pages, its notes (each with the scopes it is stamped to and who wrote it),
202
+ * the notes elsewhere that mention it, and its recent activity. Bodies are
203
+ * agent-written, so they render through {@link MarkdownRenderer}, which escapes
204
+ * raw HTML and drops unsafe link schemes.
205
+ *
206
+ * Paged lists take a `…More` slot the host fills with the next page's loader.
207
+ */
208
+ function KnowledgePageDetail({ page, notes, pin, pagesById, onPageClick, highlightMentionOf, ancestors = [], mentionedBy = [], notesMore, childPages, activity }) {
209
+ const firstHighlighted = (0, react.useRef)(null);
210
+ (0, react.useEffect)(() => {
211
+ firstHighlighted.current?.scrollIntoView?.({ block: "nearest" });
212
+ }, [highlightMentionOf, notes]);
213
+ let highlightRefSet = false;
214
+ const scope = page.isScope ? page : ancestors.find((candidate) => candidate.id === page.scopeId) ?? pagesById.get(page.scopeId);
215
+ const path = knowledgePagePath(page, ancestors);
216
+ const kind = page.isScope ? page.displayLabel ?? "Scope" : "Page";
217
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("article", {
218
+ "aria-label": page.name,
219
+ className: "flex min-h-0 flex-col overflow-y-auto",
220
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", {
221
+ className: "flex flex-col gap-3 border-b border-border bg-fill-subtle px-6 pt-5 pb-4",
222
+ children: [
223
+ ancestors.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("nav", {
224
+ "aria-label": "Breadcrumb",
225
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ol", {
226
+ className: "flex flex-wrap items-center gap-1",
227
+ children: ancestors.map((ancestor) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", {
228
+ className: "flex items-center gap-1",
229
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
230
+ type: "button",
231
+ className: "text-ui-sm rounded px-1 py-0.5 text-muted-foreground hover:bg-fill hover:text-foreground",
232
+ onClick: () => onPageClick(ancestor),
233
+ children: ancestor.name
234
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.ChevronRight, {
235
+ size: 12,
236
+ className: "text-muted-foreground",
237
+ "aria-hidden": true
238
+ })]
239
+ }, ancestor.id))
240
+ })
241
+ }) : null,
242
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
243
+ className: "flex flex-col gap-1.5",
244
+ children: [
245
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
246
+ className: "flex flex-wrap items-center gap-2",
247
+ children: [
248
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Badge.Badge, {
249
+ variant: page.isScope ? "info" : "neutral",
250
+ size: "sm",
251
+ children: kind
252
+ }),
253
+ page.isScope ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_Txt.Txt, {
254
+ as: "span",
255
+ variant: "caption",
256
+ tone: "muted",
257
+ children: ["in ", scope?.address ?? scope?.name ?? page.scopeId]
258
+ }),
259
+ pin ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Badge.Badge, {
260
+ variant: "warning",
261
+ size: "sm",
262
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.Pin, {
263
+ size: 10,
264
+ "aria-hidden": true
265
+ }),
266
+ children: pin.audience.length > 0 ? `Pinned for ${pin.audience.join(", ")}` : "Pinned"
267
+ }) : null
268
+ ]
269
+ }),
270
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Txt.Txt, {
271
+ as: "h2",
272
+ variant: "title",
273
+ className: "break-words",
274
+ children: page.name
275
+ }),
276
+ page.description ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Txt.Txt, {
277
+ variant: "body",
278
+ tone: "muted",
279
+ children: page.description
280
+ }) : null
281
+ ]
282
+ }),
283
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("dl", {
284
+ className: "flex flex-wrap items-center gap-x-4 gap-y-1",
285
+ children: [
286
+ page.isScope && page.address ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
287
+ className: "flex items-center gap-1.5",
288
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("dt", {
289
+ className: "sr-only",
290
+ children: "Address"
291
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("dd", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Txt.Txt, {
292
+ as: "span",
293
+ variant: "caption",
294
+ tone: "muted",
295
+ font: "mono",
296
+ children: page.address
297
+ }) })]
298
+ }) : null,
299
+ path && !page.isScope ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
300
+ className: "flex items-center gap-1.5",
301
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("dt", {
302
+ className: "sr-only",
303
+ children: "Path"
304
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("dd", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Txt.Txt, {
305
+ as: "span",
306
+ variant: "caption",
307
+ tone: "muted",
308
+ font: "mono",
309
+ "data-testid": "knowledge-page-path",
310
+ children: path
311
+ }) })]
312
+ }) : null,
313
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
314
+ className: "flex items-center gap-1.5",
315
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("dt", {
316
+ className: "sr-only",
317
+ children: "Version"
318
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("dd", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_Txt.Txt, {
319
+ as: "span",
320
+ variant: "caption",
321
+ tone: "muted",
322
+ "data-testid": "knowledge-page-version",
323
+ children: [
324
+ "Version ",
325
+ page.version,
326
+ " · updated ",
327
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(When, { iso: page.updatedAt }),
328
+ " by ",
329
+ page.updatedBy.author
330
+ ]
331
+ }) })]
332
+ })
333
+ ]
334
+ })
335
+ ]
336
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
337
+ className: "grid gap-8 p-6 xl:grid-cols-[minmax(0,1fr)_18rem]",
338
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
339
+ className: "flex min-w-0 flex-col gap-8",
340
+ children: [page.body ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
341
+ "data-testid": "knowledge-page-body",
342
+ className: "max-w-3xl",
343
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MarkdownRenderer.MarkdownRenderer, { children: page.body })
344
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_Txt.Txt, {
345
+ variant: "body",
346
+ tone: "muted",
347
+ className: "italic",
348
+ children: [
349
+ "This ",
350
+ page.isScope ? "scope" : "page",
351
+ " has no body yet."
352
+ ]
353
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(Section, {
354
+ label: "Notes",
355
+ count: notesMore ? void 0 : notes.length,
356
+ children: [notes.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Txt.Txt, {
357
+ variant: "body",
358
+ tone: "muted",
359
+ children: "No notes on this page."
360
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
361
+ className: "flex flex-col gap-2",
362
+ children: notes.map((note) => {
363
+ const highlighted = !!highlightMentionOf && note.mentions.includes(highlightMentionOf);
364
+ const takeRef = highlighted && !highlightRefSet;
365
+ if (takeRef) highlightRefSet = true;
366
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(KnowledgeNoteItem, {
367
+ note,
368
+ pagesById,
369
+ onPageClick,
370
+ highlighted,
371
+ itemRef: takeRef ? (element) => {
372
+ firstHighlighted.current = element;
373
+ } : void 0
374
+ }, note.id);
375
+ })
376
+ }), notesMore]
377
+ })]
378
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("aside", {
379
+ className: "flex min-w-0 flex-col gap-8",
380
+ children: [
381
+ childPages ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Section, {
382
+ label: "Pages",
383
+ children: childPages
384
+ }) : null,
385
+ mentionedBy.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Section, {
386
+ label: "Mentioned in",
387
+ count: mentionedBy.length,
388
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
389
+ className: "flex flex-col gap-2",
390
+ children: mentionedBy.map((note) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(KnowledgeNoteItem, {
391
+ note,
392
+ pagesById,
393
+ onPageClick,
394
+ showPage: true,
395
+ compact: true
396
+ }, note.id))
397
+ })
398
+ }) : null,
399
+ activity && activity.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Section, {
400
+ label: "Activity",
401
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ol", {
402
+ className: "relative flex flex-col gap-3 border-l border-border pl-4",
403
+ children: activity.map((event) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", {
404
+ className: "relative flex flex-col",
405
+ children: [
406
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
407
+ "aria-hidden": true,
408
+ className: "absolute top-1.5 -left-5 size-2 rounded-full border border-border bg-card"
409
+ }),
410
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Txt.Txt, {
411
+ as: "span",
412
+ variant: "body-sm",
413
+ tone: "ink",
414
+ children: ACTIVITY_LABELS[event.action] ?? event.action
415
+ }),
416
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_Txt.Txt, {
417
+ as: "span",
418
+ variant: "caption",
419
+ tone: "muted",
420
+ children: [
421
+ event.provenance.author,
422
+ " · ",
423
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(When, { iso: event.createdAt })
424
+ ]
425
+ })
426
+ ]
427
+ }, event.id))
428
+ })
429
+ }) : null
430
+ ]
431
+ })]
432
+ })]
433
+ });
434
+ }
435
+ exports.KnowledgeNoteItem = KnowledgeNoteItem;
436
+ exports.KnowledgePageDetail = KnowledgePageDetail;
437
+
438
+ //# sourceMappingURL=KnowledgePageDetail.cjs.js.map
@@ -0,0 +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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"}
@@ -0,0 +1 @@
1
+ export * from '../../../src/domains/knowledge/components/KnowledgePageDetail';