@athenaintel/react 0.43.0 → 0.50.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 (746) hide show
  1. package/README.md +258 -8
  2. package/dist/agent-runtime/src/answer-label.cjs +137 -0
  3. package/dist/agent-runtime/src/answer-label.cjs.map +1 -0
  4. package/dist/agent-runtime/src/answer-label.d.ts +104 -0
  5. package/dist/agent-runtime/src/answer-label.js +137 -0
  6. package/dist/agent-runtime/src/answer-label.js.map +1 -0
  7. package/dist/agent-runtime/src/answer-rows.cjs +180 -0
  8. package/dist/agent-runtime/src/answer-rows.cjs.map +1 -0
  9. package/dist/agent-runtime/src/answer-rows.d.ts +86 -0
  10. package/dist/agent-runtime/src/answer-rows.js +180 -0
  11. package/dist/agent-runtime/src/answer-rows.js.map +1 -0
  12. package/dist/agent-runtime/src/call-recap.cjs +319 -0
  13. package/dist/agent-runtime/src/call-recap.cjs.map +1 -0
  14. package/dist/agent-runtime/src/call-recap.d.ts +142 -0
  15. package/dist/agent-runtime/src/call-recap.js +319 -0
  16. package/dist/agent-runtime/src/call-recap.js.map +1 -0
  17. package/dist/agent-runtime/src/chat-outbox-store.cjs +1 -0
  18. package/dist/agent-runtime/src/chat-outbox-store.cjs.map +1 -1
  19. package/dist/agent-runtime/src/chat-outbox-store.d.ts +7 -0
  20. package/dist/agent-runtime/src/chat-outbox-store.js +1 -0
  21. package/dist/agent-runtime/src/chat-outbox-store.js.map +1 -1
  22. package/dist/agent-runtime/src/chat-outbox.cjs +46 -5
  23. package/dist/agent-runtime/src/chat-outbox.cjs.map +1 -1
  24. package/dist/agent-runtime/src/chat-outbox.d.ts +29 -0
  25. package/dist/agent-runtime/src/chat-outbox.js +46 -5
  26. package/dist/agent-runtime/src/chat-outbox.js.map +1 -1
  27. package/dist/agent-runtime/src/client-tool-bridge.cjs +15 -15
  28. package/dist/agent-runtime/src/client-tool-bridge.cjs.map +1 -1
  29. package/dist/agent-runtime/src/conversation-index.cjs +8 -8
  30. package/dist/agent-runtime/src/conversation-index.cjs.map +1 -1
  31. package/dist/agent-runtime/src/conversation-index.d.ts +7 -0
  32. package/dist/agent-runtime/src/conversation-index.js.map +1 -1
  33. package/dist/agent-runtime/src/conversation-list.cjs +2 -1
  34. package/dist/agent-runtime/src/conversation-list.cjs.map +1 -1
  35. package/dist/agent-runtime/src/conversation-list.d.ts +19 -3
  36. package/dist/agent-runtime/src/conversation-list.js +2 -1
  37. package/dist/agent-runtime/src/conversation-list.js.map +1 -1
  38. package/dist/agent-runtime/src/decision-checks.cjs +207 -0
  39. package/dist/agent-runtime/src/decision-checks.cjs.map +1 -0
  40. package/dist/agent-runtime/src/decision-checks.d.ts +142 -0
  41. package/dist/agent-runtime/src/decision-checks.js +207 -0
  42. package/dist/agent-runtime/src/decision-checks.js.map +1 -0
  43. package/dist/agent-runtime/src/desktop-handoff.d.ts +12 -0
  44. package/dist/agent-runtime/src/errors.cjs +18 -0
  45. package/dist/agent-runtime/src/errors.cjs.map +1 -1
  46. package/dist/agent-runtime/src/errors.d.ts +7 -0
  47. package/dist/agent-runtime/src/errors.js +18 -0
  48. package/dist/agent-runtime/src/errors.js.map +1 -1
  49. package/dist/agent-runtime/src/generated/runconfig-contract.cjs +12 -0
  50. package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
  51. package/dist/agent-runtime/src/generated/runconfig-contract.d.ts +6 -6
  52. package/dist/agent-runtime/src/generated/runconfig-contract.js +12 -0
  53. package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
  54. package/dist/agent-runtime/src/handoff-arrival.cjs +60 -0
  55. package/dist/agent-runtime/src/handoff-arrival.cjs.map +1 -0
  56. package/dist/agent-runtime/src/handoff-arrival.d.ts +46 -0
  57. package/dist/agent-runtime/src/handoff-arrival.js +60 -0
  58. package/dist/agent-runtime/src/handoff-arrival.js.map +1 -0
  59. package/dist/agent-runtime/src/index.d.ts +16 -9
  60. package/dist/agent-runtime/src/interrupts.cjs +71 -19
  61. package/dist/agent-runtime/src/interrupts.cjs.map +1 -1
  62. package/dist/agent-runtime/src/interrupts.d.ts +40 -3
  63. package/dist/agent-runtime/src/interrupts.js +56 -4
  64. package/dist/agent-runtime/src/interrupts.js.map +1 -1
  65. package/dist/agent-runtime/src/lane-history.cjs +8 -8
  66. package/dist/agent-runtime/src/lane-history.cjs.map +1 -1
  67. package/dist/agent-runtime/src/messages.cjs +43 -8
  68. package/dist/agent-runtime/src/messages.cjs.map +1 -1
  69. package/dist/agent-runtime/src/messages.d.ts +25 -3
  70. package/dist/agent-runtime/src/messages.js +43 -8
  71. package/dist/agent-runtime/src/messages.js.map +1 -1
  72. package/dist/agent-runtime/src/model-context.cjs +3 -2
  73. package/dist/agent-runtime/src/model-context.cjs.map +1 -1
  74. package/dist/agent-runtime/src/model-context.d.ts +6 -1
  75. package/dist/agent-runtime/src/model-context.js +3 -2
  76. package/dist/agent-runtime/src/model-context.js.map +1 -1
  77. package/dist/agent-runtime/src/offline-status.cjs +36 -0
  78. package/dist/agent-runtime/src/offline-status.cjs.map +1 -0
  79. package/dist/agent-runtime/src/offline-status.d.ts +118 -3
  80. package/dist/agent-runtime/src/offline-status.js +36 -0
  81. package/dist/agent-runtime/src/offline-status.js.map +1 -0
  82. package/dist/agent-runtime/src/queue.cjs +0 -9
  83. package/dist/agent-runtime/src/queue.cjs.map +1 -1
  84. package/dist/agent-runtime/src/queue.js +0 -9
  85. package/dist/agent-runtime/src/queue.js.map +1 -1
  86. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs +9 -9
  87. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
  88. package/dist/agent-runtime/src/runtime-catalog.cjs +42 -0
  89. package/dist/agent-runtime/src/runtime-catalog.cjs.map +1 -0
  90. package/dist/agent-runtime/src/runtime-catalog.d.ts +35 -0
  91. package/dist/agent-runtime/src/runtime-catalog.js +42 -0
  92. package/dist/agent-runtime/src/runtime-catalog.js.map +1 -0
  93. package/dist/agent-runtime/src/runtime-messages.cjs.map +1 -1
  94. package/dist/agent-runtime/src/runtime-messages.d.ts +1 -1
  95. package/dist/agent-runtime/src/runtime-messages.js.map +1 -1
  96. package/dist/agent-runtime/src/runtime.d.ts +41 -0
  97. package/dist/agent-runtime/src/send-recovery.cjs +37 -3
  98. package/dist/agent-runtime/src/send-recovery.cjs.map +1 -1
  99. package/dist/agent-runtime/src/send-recovery.d.ts +19 -0
  100. package/dist/agent-runtime/src/send-recovery.js +37 -3
  101. package/dist/agent-runtime/src/send-recovery.js.map +1 -1
  102. package/dist/agent-runtime/src/statewire-suspended.cjs +3 -3
  103. package/dist/agent-runtime/src/statewire-suspended.cjs.map +1 -1
  104. package/dist/agent-runtime/src/subagents.cjs +32 -2
  105. package/dist/agent-runtime/src/subagents.cjs.map +1 -1
  106. package/dist/agent-runtime/src/subagents.d.ts +9 -0
  107. package/dist/agent-runtime/src/subagents.js +30 -0
  108. package/dist/agent-runtime/src/subagents.js.map +1 -1
  109. package/dist/agent-runtime/src/thread-driver.cjs +67 -0
  110. package/dist/agent-runtime/src/thread-driver.cjs.map +1 -0
  111. package/dist/agent-runtime/src/thread-driver.d.ts +49 -0
  112. package/dist/agent-runtime/src/thread-driver.js +67 -0
  113. package/dist/agent-runtime/src/thread-driver.js.map +1 -0
  114. package/dist/agent-runtime/src/thread-handoff-flow-machine.d.ts +172 -0
  115. package/dist/agent-runtime/src/thread-handoff-protocol.d.ts +868 -0
  116. package/dist/agent-runtime/src/thread-handoff-qr.d.ts +11 -0
  117. package/dist/agent-runtime/src/thread-handoff.d.ts +3 -364
  118. package/dist/agent-runtime/src/thread-status.cjs +3 -3
  119. package/dist/agent-runtime/src/thread-status.cjs.map +1 -1
  120. package/dist/agent-runtime/src/tool-metadata.cjs +210 -25
  121. package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
  122. package/dist/agent-runtime/src/tool-metadata.d.ts +12 -0
  123. package/dist/agent-runtime/src/tool-metadata.js +210 -25
  124. package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
  125. package/dist/agent-runtime/src/tool-names.cjs +2 -0
  126. package/dist/agent-runtime/src/tool-names.cjs.map +1 -1
  127. package/dist/agent-runtime/src/tool-names.d.ts +2 -0
  128. package/dist/agent-runtime/src/tool-names.js +2 -0
  129. package/dist/agent-runtime/src/tool-names.js.map +1 -1
  130. package/dist/agent-runtime/src/types.d.ts +10 -2
  131. package/dist/agent-runtime/src/use-conversation-list.cjs +14 -13
  132. package/dist/agent-runtime/src/use-conversation-list.cjs.map +1 -1
  133. package/dist/agent-runtime/src/use-conversation-list.d.ts +6 -0
  134. package/dist/agent-runtime/src/use-conversation-list.js +3 -2
  135. package/dist/agent-runtime/src/use-conversation-list.js.map +1 -1
  136. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs +45 -20
  137. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs.map +1 -1
  138. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.d.ts +10 -3
  139. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js +27 -2
  140. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js.map +1 -1
  141. package/dist/agent-runtime/src/use-deep-agent-config.cjs +14 -14
  142. package/dist/agent-runtime/src/use-deep-agent-config.cjs.map +1 -1
  143. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs +6 -6
  144. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -1
  145. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs +40 -22
  146. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
  147. package/dist/agent-runtime/src/use-deep-agent-runtime.d.ts +17 -0
  148. package/dist/agent-runtime/src/use-deep-agent-runtime.js +24 -6
  149. package/dist/agent-runtime/src/use-deep-agent-runtime.js.map +1 -1
  150. package/dist/agent-runtime/src/use-deep-agent-thread.cjs +45 -45
  151. package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
  152. package/dist/agent-runtime/src/use-deep-agent-voice.cjs +588 -130
  153. package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -1
  154. package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +162 -10
  155. package/dist/agent-runtime/src/use-deep-agent-voice.js +529 -71
  156. package/dist/agent-runtime/src/use-deep-agent-voice.js.map +1 -1
  157. package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs +26 -26
  158. package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs.map +1 -1
  159. package/dist/agent-runtime/src/use-historical-edit-attachments.cjs +4 -4
  160. package/dist/agent-runtime/src/use-historical-edit-attachments.cjs.map +1 -1
  161. package/dist/agent-runtime/src/use-thread-handoff-flow.d.ts +34 -26
  162. package/dist/agent-runtime/src/voice-earcon.cjs +139 -0
  163. package/dist/agent-runtime/src/voice-earcon.cjs.map +1 -0
  164. package/dist/agent-runtime/src/voice-earcon.d.ts +38 -0
  165. package/dist/agent-runtime/src/voice-earcon.js +139 -0
  166. package/dist/agent-runtime/src/voice-earcon.js.map +1 -0
  167. package/dist/agent-runtime/src/voice-media.cjs +117 -0
  168. package/dist/agent-runtime/src/voice-media.cjs.map +1 -0
  169. package/dist/agent-runtime/src/voice-media.d.ts +63 -0
  170. package/dist/agent-runtime/src/voice-media.js +117 -0
  171. package/dist/agent-runtime/src/voice-media.js.map +1 -0
  172. package/dist/agent-runtime/src/voice-presentation.cjs +2 -0
  173. package/dist/agent-runtime/src/voice-presentation.cjs.map +1 -1
  174. package/dist/agent-runtime/src/voice-presentation.js +2 -0
  175. package/dist/agent-runtime/src/voice-presentation.js.map +1 -1
  176. package/dist/agent-runtime/src/voice-wire-types.d.ts +32 -0
  177. package/dist/assets/AssetPanel.cjs +11 -11
  178. package/dist/assets/AssetPanel.cjs.map +1 -1
  179. package/dist/assets/AthenaAssetEmbed.cjs +11 -9
  180. package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
  181. package/dist/assets/AthenaAssetEmbed.d.ts +18 -5
  182. package/dist/assets/AthenaAssetEmbed.js +4 -2
  183. package/dist/assets/AthenaAssetEmbed.js.map +1 -1
  184. package/dist/assets/AthenaLayout.cjs +16 -16
  185. package/dist/assets/AthenaLayout.cjs.map +1 -1
  186. package/dist/assets/use-asset-content.cjs +4 -4
  187. package/dist/assets/use-asset-content.cjs.map +1 -1
  188. package/dist/assets/use-asset-embed.cjs +14 -7
  189. package/dist/assets/use-asset-embed.cjs.map +1 -1
  190. package/dist/assets/use-asset-embed.d.ts +23 -6
  191. package/dist/assets/use-asset-embed.js +10 -3
  192. package/dist/assets/use-asset-embed.js.map +1 -1
  193. package/dist/auth/AthenaAuthContext.cjs +3 -3
  194. package/dist/auth/AthenaAuthContext.cjs.map +1 -1
  195. package/dist/auth/AthenaAuthProvider.cjs +8 -8
  196. package/dist/auth/AthenaAuthProvider.cjs.map +1 -1
  197. package/dist/auth/AthenaCredentialSourceContext.cjs +5 -5
  198. package/dist/auth/AthenaCredentialSourceContext.cjs.map +1 -1
  199. package/dist/auth/AthenaSSOProvider.cjs +14 -14
  200. package/dist/auth/AthenaSSOProvider.cjs.map +1 -1
  201. package/dist/auth/credential-source.cjs +26 -13
  202. package/dist/auth/credential-source.cjs.map +1 -1
  203. package/dist/auth/credential-source.d.ts +8 -0
  204. package/dist/auth/credential-source.js +26 -13
  205. package/dist/auth/credential-source.js.map +1 -1
  206. package/dist/catalog/agent-model-options.cjs +25 -17
  207. package/dist/catalog/agent-model-options.cjs.map +1 -1
  208. package/dist/catalog/agent-model-options.d.ts +38 -5
  209. package/dist/catalog/agent-model-options.js +25 -17
  210. package/dist/catalog/agent-model-options.js.map +1 -1
  211. package/dist/catalog/channel-refusal.cjs +36 -0
  212. package/dist/catalog/channel-refusal.cjs.map +1 -0
  213. package/dist/catalog/channel-refusal.d.ts +29 -0
  214. package/dist/catalog/channel-refusal.js +36 -0
  215. package/dist/catalog/channel-refusal.js.map +1 -0
  216. package/dist/catalog/chat-pickers.cjs +60 -24
  217. package/dist/catalog/chat-pickers.cjs.map +1 -1
  218. package/dist/catalog/chat-pickers.d.ts +12 -2
  219. package/dist/catalog/chat-pickers.js +56 -20
  220. package/dist/catalog/chat-pickers.js.map +1 -1
  221. package/dist/catalog/runtime-catalog.cjs +89 -23
  222. package/dist/catalog/runtime-catalog.cjs.map +1 -1
  223. package/dist/catalog/runtime-catalog.d.ts +8 -2
  224. package/dist/catalog/runtime-catalog.js +83 -17
  225. package/dist/catalog/runtime-catalog.js.map +1 -1
  226. package/dist/catalog/use-athena-chat-mode.cjs +12 -12
  227. package/dist/catalog/use-athena-chat-mode.cjs.map +1 -1
  228. package/dist/chat/AthenaChat.cjs +155 -67
  229. package/dist/chat/AthenaChat.cjs.map +1 -1
  230. package/dist/chat/AthenaChat.d.ts +42 -2
  231. package/dist/chat/AthenaChat.js +106 -18
  232. package/dist/chat/AthenaChat.js.map +1 -1
  233. package/dist/chat/AthenaChatErrorBoundary.cjs +3 -3
  234. package/dist/chat/AthenaChatErrorBoundary.cjs.map +1 -1
  235. package/dist/chat/DrivingOnChip.cjs +23 -0
  236. package/dist/chat/DrivingOnChip.cjs.map +1 -0
  237. package/dist/chat/DrivingOnChip.d.ts +17 -0
  238. package/dist/chat/DrivingOnChip.js +23 -0
  239. package/dist/chat/DrivingOnChip.js.map +1 -0
  240. package/dist/chat/StatewireApprovalCard.cjs +166 -37
  241. package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
  242. package/dist/chat/StatewireApprovalCard.d.ts +91 -2
  243. package/dist/chat/StatewireApprovalCard.js +156 -27
  244. package/dist/chat/StatewireApprovalCard.js.map +1 -1
  245. package/dist/chat/StatewireClientToolBridge.cjs +2 -2
  246. package/dist/chat/StatewireClientToolBridge.cjs.map +1 -1
  247. package/dist/chat/StatewireQueuedMessages.cjs +81 -69
  248. package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
  249. package/dist/chat/StatewireQueuedMessages.d.ts +25 -13
  250. package/dist/chat/StatewireQueuedMessages.js +73 -61
  251. package/dist/chat/StatewireQueuedMessages.js.map +1 -1
  252. package/dist/chat/WaitingOnYouBanner.cjs +9 -5
  253. package/dist/chat/WaitingOnYouBanner.cjs.map +1 -1
  254. package/dist/chat/WaitingOnYouBanner.js +7 -3
  255. package/dist/chat/WaitingOnYouBanner.js.map +1 -1
  256. package/dist/chat/athena-chat-welcome.cjs +2 -2
  257. package/dist/chat/athena-chat-welcome.cjs.map +1 -1
  258. package/dist/chat/athena-citation-links.cjs +5 -5
  259. package/dist/chat/athena-citation-links.cjs.map +1 -1
  260. package/dist/chat/athena-composer-controls.cjs +26 -16
  261. package/dist/chat/athena-composer-controls.cjs.map +1 -1
  262. package/dist/chat/athena-composer-controls.d.ts +6 -0
  263. package/dist/chat/athena-composer-controls.js +26 -16
  264. package/dist/chat/athena-composer-controls.js.map +1 -1
  265. package/dist/chat/athena-turn-end-status.cjs +42 -0
  266. package/dist/chat/athena-turn-end-status.cjs.map +1 -0
  267. package/dist/chat/athena-turn-end-status.d.ts +24 -0
  268. package/dist/chat/athena-turn-end-status.js +42 -0
  269. package/dist/chat/athena-turn-end-status.js.map +1 -0
  270. package/dist/chat/browser-decision-check.cjs +131 -0
  271. package/dist/chat/browser-decision-check.cjs.map +1 -0
  272. package/dist/chat/browser-decision-check.d.ts +61 -0
  273. package/dist/chat/browser-decision-check.js +131 -0
  274. package/dist/chat/browser-decision-check.js.map +1 -0
  275. package/dist/chat/chat-outbox-rows.cjs +3 -3
  276. package/dist/chat/chat-outbox-rows.cjs.map +1 -1
  277. package/dist/chat/chat-voice-controls.cjs +96 -29
  278. package/dist/chat/chat-voice-controls.cjs.map +1 -1
  279. package/dist/chat/chat-voice-controls.d.ts +42 -3
  280. package/dist/chat/chat-voice-controls.js +92 -25
  281. package/dist/chat/chat-voice-controls.js.map +1 -1
  282. package/dist/chat/composer-keyboard-hint.cjs +5 -5
  283. package/dist/chat/composer-keyboard-hint.cjs.map +1 -1
  284. package/dist/chat/device-operation.cjs +29 -0
  285. package/dist/chat/device-operation.cjs.map +1 -0
  286. package/dist/chat/device-operation.d.ts +34 -0
  287. package/dist/chat/device-operation.js +29 -0
  288. package/dist/chat/device-operation.js.map +1 -0
  289. package/dist/chat/super-grouping/CollapsibleGroup.cjs +14 -14
  290. package/dist/chat/super-grouping/CollapsibleGroup.cjs.map +1 -1
  291. package/dist/chat/super-grouping/GroupedMessageParts.cjs +4 -4
  292. package/dist/chat/super-grouping/GroupedMessageParts.cjs.map +1 -1
  293. package/dist/chat/super-grouping/SuperGroupingCard.cjs +52 -36
  294. package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
  295. package/dist/chat/super-grouping/SuperGroupingCard.d.ts +19 -4
  296. package/dist/chat/super-grouping/SuperGroupingCard.js +29 -13
  297. package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
  298. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +32 -32
  299. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -1
  300. package/dist/chat/super-grouping/SuperGroupingTranscript.js +3 -3
  301. package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -1
  302. package/dist/chat/super-grouping/ToolTimeline.cjs +73 -40
  303. package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -1
  304. package/dist/chat/super-grouping/ToolTimeline.d.ts +10 -2
  305. package/dist/chat/super-grouping/ToolTimeline.js +69 -36
  306. package/dist/chat/super-grouping/ToolTimeline.js.map +1 -1
  307. package/dist/chat/super-grouping/activity-timeline.cjs +47 -12
  308. package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
  309. package/dist/chat/super-grouping/activity-timeline.d.ts +21 -0
  310. package/dist/chat/super-grouping/activity-timeline.js +47 -12
  311. package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
  312. package/dist/chat/super-grouping/grouping-function.cjs +4 -0
  313. package/dist/chat/super-grouping/grouping-function.cjs.map +1 -1
  314. package/dist/chat/super-grouping/grouping-function.d.ts +7 -0
  315. package/dist/chat/super-grouping/grouping-function.js +5 -1
  316. package/dist/chat/super-grouping/grouping-function.js.map +1 -1
  317. package/dist/chat/super-grouping/index.cjs +6 -0
  318. package/dist/chat/super-grouping/index.cjs.map +1 -1
  319. package/dist/chat/super-grouping/index.d.ts +5 -2
  320. package/dist/chat/super-grouping/index.js +7 -1
  321. package/dist/chat/super-grouping/index.js.map +1 -1
  322. package/dist/chat/super-grouping/tool-part-placement.cjs +17 -0
  323. package/dist/chat/super-grouping/tool-part-placement.cjs.map +1 -0
  324. package/dist/chat/super-grouping/tool-part-placement.d.ts +22 -0
  325. package/dist/chat/super-grouping/tool-part-placement.js +17 -0
  326. package/dist/chat/super-grouping/tool-part-placement.js.map +1 -0
  327. package/dist/chat/thread-scroll-to-bottom.cjs +2 -2
  328. package/dist/chat/thread-scroll-to-bottom.cjs.map +1 -1
  329. package/dist/chat/thread-scroll-to-bottom.d.ts +10 -7
  330. package/dist/chat/thread-scroll-to-bottom.js +2 -2
  331. package/dist/chat/thread-scroll-to-bottom.js.map +1 -1
  332. package/dist/chat/tooltip-icon-button.cjs +2 -2
  333. package/dist/chat/tooltip-icon-button.cjs.map +1 -1
  334. package/dist/chat/use-athena-voice-live.cjs +11 -0
  335. package/dist/chat/use-athena-voice-live.cjs.map +1 -0
  336. package/dist/chat/use-athena-voice-live.d.ts +11 -0
  337. package/dist/chat/use-athena-voice-live.js +11 -0
  338. package/dist/chat/use-athena-voice-live.js.map +1 -0
  339. package/dist/chat/use-statewire-approval-request.cjs +56 -24
  340. package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
  341. package/dist/chat/use-statewire-approval-request.d.ts +33 -4
  342. package/dist/chat/use-statewire-approval-request.js +41 -9
  343. package/dist/chat/use-statewire-approval-request.js.map +1 -1
  344. package/dist/chat-ui/auth/sign-in-card.cjs +2 -2
  345. package/dist/chat-ui/auth/sign-in-card.cjs.map +1 -1
  346. package/dist/chat-ui/composer/tiptap-composer.cjs +138 -107
  347. package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
  348. package/dist/chat-ui/composer/tiptap-composer.d.ts +20 -4
  349. package/dist/chat-ui/composer/tiptap-composer.js +85 -54
  350. package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
  351. package/dist/chat-ui/header/conversation-history-panel.cjs +49 -23
  352. package/dist/chat-ui/header/conversation-history-panel.cjs.map +1 -1
  353. package/dist/chat-ui/header/conversation-history-panel.d.ts +12 -1
  354. package/dist/chat-ui/header/conversation-history-panel.js +38 -12
  355. package/dist/chat-ui/header/conversation-history-panel.js.map +1 -1
  356. package/dist/chat-ui/index.cjs +21 -0
  357. package/dist/chat-ui/index.cjs.map +1 -1
  358. package/dist/chat-ui/index.d.ts +8 -1
  359. package/dist/chat-ui/index.js +21 -0
  360. package/dist/chat-ui/index.js.map +1 -1
  361. package/dist/chat-ui/mentions/mention-chip.cjs +4 -4
  362. package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
  363. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs +10 -9
  364. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs.map +1 -1
  365. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js +3 -2
  366. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js.map +1 -1
  367. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs +2 -2
  368. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs.map +1 -1
  369. package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs +29 -6
  370. package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs.map +1 -1
  371. package/dist/chat-ui/mentions/suggestions/components/menu-list.d.ts +7 -1
  372. package/dist/chat-ui/mentions/suggestions/components/menu-list.js +25 -2
  373. package/dist/chat-ui/mentions/suggestions/components/menu-list.js.map +1 -1
  374. package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs +2 -2
  375. package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs.map +1 -1
  376. package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs +2 -2
  377. package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs.map +1 -1
  378. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +3 -3
  379. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
  380. package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs +56 -2
  381. package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs.map +1 -1
  382. package/dist/chat-ui/mentions/suggestions/data/orchestrator.d.ts +12 -0
  383. package/dist/chat-ui/mentions/suggestions/data/orchestrator.js +56 -2
  384. package/dist/chat-ui/mentions/suggestions/data/orchestrator.js.map +1 -1
  385. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +24 -3
  386. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
  387. package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +7 -0
  388. package/dist/chat-ui/mentions/suggestions/data/sources/index.js +24 -3
  389. package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
  390. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs +35 -13
  391. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs.map +1 -1
  392. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.d.ts +15 -1
  393. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js +28 -6
  394. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js.map +1 -1
  395. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs +9 -6
  396. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs.map +1 -1
  397. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.d.ts +3 -0
  398. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js +5 -2
  399. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js.map +1 -1
  400. package/dist/chat-ui/mentions/use-account-workspace-id.cjs +45 -10
  401. package/dist/chat-ui/mentions/use-account-workspace-id.cjs.map +1 -1
  402. package/dist/chat-ui/mentions/use-account-workspace-id.d.ts +24 -1
  403. package/dist/chat-ui/mentions/use-account-workspace-id.js +46 -11
  404. package/dist/chat-ui/mentions/use-account-workspace-id.js.map +1 -1
  405. package/dist/chat-ui/mentions/use-member-avatar.cjs +4 -4
  406. package/dist/chat-ui/mentions/use-member-avatar.cjs.map +1 -1
  407. package/dist/chat-ui/mentions/use-mention-asset.cjs +3 -3
  408. package/dist/chat-ui/mentions/use-mention-asset.cjs.map +1 -1
  409. package/dist/chat-ui/messages/answer-label.cjs +42 -0
  410. package/dist/chat-ui/messages/answer-label.cjs.map +1 -0
  411. package/dist/chat-ui/messages/answer-label.d.ts +33 -0
  412. package/dist/chat-ui/messages/answer-label.js +42 -0
  413. package/dist/chat-ui/messages/answer-label.js.map +1 -0
  414. package/dist/chat-ui/messages/arrival-animation.cjs +13 -0
  415. package/dist/chat-ui/messages/arrival-animation.cjs.map +1 -0
  416. package/dist/chat-ui/messages/arrival-animation.d.ts +14 -0
  417. package/dist/chat-ui/messages/arrival-animation.js +13 -0
  418. package/dist/chat-ui/messages/arrival-animation.js.map +1 -0
  419. package/dist/chat-ui/messages/continue-pill.cjs +5 -5
  420. package/dist/chat-ui/messages/continue-pill.cjs.map +1 -1
  421. package/dist/chat-ui/messages/from-the-call-card.cjs +124 -0
  422. package/dist/chat-ui/messages/from-the-call-card.cjs.map +1 -0
  423. package/dist/chat-ui/messages/from-the-call-card.d.ts +17 -0
  424. package/dist/chat-ui/messages/from-the-call-card.js +124 -0
  425. package/dist/chat-ui/messages/from-the-call-card.js.map +1 -0
  426. package/dist/chat-ui/messages/handoff-arrival-divider.cjs +44 -0
  427. package/dist/chat-ui/messages/handoff-arrival-divider.cjs.map +1 -0
  428. package/dist/chat-ui/messages/handoff-arrival-divider.d.ts +17 -0
  429. package/dist/chat-ui/messages/handoff-arrival-divider.js +44 -0
  430. package/dist/chat-ui/messages/handoff-arrival-divider.js.map +1 -0
  431. package/dist/chat-ui/messages/message-actions-config.cjs +3 -3
  432. package/dist/chat-ui/messages/message-actions-config.cjs.map +1 -1
  433. package/dist/chat-ui/messages/message-components.cjs +8 -4
  434. package/dist/chat-ui/messages/message-components.cjs.map +1 -1
  435. package/dist/chat-ui/messages/message-components.js +5 -1
  436. package/dist/chat-ui/messages/message-components.js.map +1 -1
  437. package/dist/chat-ui/messages/message-images.cjs +66 -0
  438. package/dist/chat-ui/messages/message-images.cjs.map +1 -0
  439. package/dist/chat-ui/messages/message-images.d.ts +16 -0
  440. package/dist/chat-ui/messages/message-images.js +66 -0
  441. package/dist/chat-ui/messages/message-images.js.map +1 -0
  442. package/dist/chat-ui/messages/user-edit-composer.cjs +2 -2
  443. package/dist/chat-ui/messages/user-edit-composer.cjs.map +1 -1
  444. package/dist/chat-ui/messages/wake-marker.cjs +3 -3
  445. package/dist/chat-ui/messages/wake-marker.cjs.map +1 -1
  446. package/dist/chat-ui/rich-text/chat-link.cjs +3 -2
  447. package/dist/chat-ui/rich-text/chat-link.cjs.map +1 -1
  448. package/dist/chat-ui/rich-text/chat-link.d.ts +4 -0
  449. package/dist/chat-ui/rich-text/chat-link.js +4 -3
  450. package/dist/chat-ui/rich-text/chat-link.js.map +1 -1
  451. package/dist/chat-ui/rich-text/chat-message-body.cjs +9 -8
  452. package/dist/chat-ui/rich-text/chat-message-body.cjs.map +1 -1
  453. package/dist/chat-ui/rich-text/chat-message-body.d.ts +12 -0
  454. package/dist/chat-ui/rich-text/chat-message-body.js +2 -1
  455. package/dist/chat-ui/rich-text/chat-message-body.js.map +1 -1
  456. package/dist/chat-ui/rich-text/chat-node-views.cjs +6 -6
  457. package/dist/chat-ui/rich-text/chat-node-views.cjs.map +1 -1
  458. package/dist/chat-ui/rich-text/dom-output-spec.cjs +2 -2
  459. package/dist/chat-ui/rich-text/dom-output-spec.cjs.map +1 -1
  460. package/dist/chat-ui/statewire.cjs +3 -0
  461. package/dist/chat-ui/statewire.cjs.map +1 -1
  462. package/dist/chat-ui/statewire.d.ts +2 -1
  463. package/dist/chat-ui/statewire.js +3 -0
  464. package/dist/chat-ui/statewire.js.map +1 -1
  465. package/dist/chat-ui/thread/chat-thread-shell.cjs +45 -14
  466. package/dist/chat-ui/thread/chat-thread-shell.cjs.map +1 -1
  467. package/dist/chat-ui/thread/chat-thread-shell.d.ts +16 -2
  468. package/dist/chat-ui/thread/chat-thread-shell.js +37 -6
  469. package/dist/chat-ui/thread/chat-thread-shell.js.map +1 -1
  470. package/dist/chat-ui/thread/composer-send-or-stop.cjs +30 -20
  471. package/dist/chat-ui/thread/composer-send-or-stop.cjs.map +1 -1
  472. package/dist/chat-ui/thread/composer-send-or-stop.d.ts +8 -0
  473. package/dist/chat-ui/thread/composer-send-or-stop.js +29 -19
  474. package/dist/chat-ui/thread/composer-send-or-stop.js.map +1 -1
  475. package/dist/chat-ui/thread/statewire-history-edge.cjs +20 -21
  476. package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
  477. package/dist/chat-ui/thread/statewire-history-edge.js +3 -4
  478. package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
  479. package/dist/chat-ui/thread/thread-loading-overlay.cjs +5 -5
  480. package/dist/chat-ui/thread/thread-loading-overlay.cjs.map +1 -1
  481. package/dist/collab/client.cjs +52 -3
  482. package/dist/collab/client.cjs.map +1 -1
  483. package/dist/collab/client.d.ts +27 -0
  484. package/dist/collab/client.js +52 -3
  485. package/dist/collab/client.js.map +1 -1
  486. package/dist/collab/document-status.cjs +150 -0
  487. package/dist/collab/document-status.cjs.map +1 -0
  488. package/dist/collab/document-status.d.ts +68 -0
  489. package/dist/collab/document-status.js +150 -0
  490. package/dist/collab/document-status.js.map +1 -0
  491. package/dist/collab/index.cjs +7 -0
  492. package/dist/collab/index.cjs.map +1 -1
  493. package/dist/collab/index.d.ts +6 -1
  494. package/dist/collab/index.js +7 -0
  495. package/dist/collab/index.js.map +1 -1
  496. package/dist/collab/presence-react.cjs +11 -11
  497. package/dist/collab/presence-react.cjs.map +1 -1
  498. package/dist/collab/react.cjs +6 -6
  499. package/dist/collab/react.cjs.map +1 -1
  500. package/dist/composer/AttachmentContext.cjs +24 -11
  501. package/dist/composer/AttachmentContext.cjs.map +1 -1
  502. package/dist/composer/AttachmentContext.js +18 -5
  503. package/dist/composer/AttachmentContext.js.map +1 -1
  504. package/dist/composer/ComposerAttachmentPreview.cjs +78 -23
  505. package/dist/composer/ComposerAttachmentPreview.cjs.map +1 -1
  506. package/dist/composer/ComposerAttachmentPreview.d.ts +5 -3
  507. package/dist/composer/ComposerAttachmentPreview.js +79 -24
  508. package/dist/composer/ComposerAttachmentPreview.js.map +1 -1
  509. package/dist/composer/ComposerDropZone.cjs +7 -7
  510. package/dist/composer/ComposerDropZone.cjs.map +1 -1
  511. package/dist/composer/FileUploadButton.cjs +37 -22
  512. package/dist/composer/FileUploadButton.cjs.map +1 -1
  513. package/dist/composer/FileUploadButton.d.ts +6 -0
  514. package/dist/composer/FileUploadButton.js +34 -19
  515. package/dist/composer/FileUploadButton.js.map +1 -1
  516. package/dist/composer/QuoteContext.cjs +8 -8
  517. package/dist/composer/QuoteContext.cjs.map +1 -1
  518. package/dist/composer/composer-handoff.cjs +4 -4
  519. package/dist/composer/composer-handoff.cjs.map +1 -1
  520. package/dist/composer/index.d.ts +1 -1
  521. package/dist/composer/useAppendToComposer.cjs +4 -4
  522. package/dist/composer/useAppendToComposer.cjs.map +1 -1
  523. package/dist/composer/useAttachFiles.cjs +23 -6
  524. package/dist/composer/useAttachFiles.cjs.map +1 -1
  525. package/dist/composer/useAttachFiles.d.ts +15 -7
  526. package/dist/composer/useAttachFiles.js +22 -5
  527. package/dist/composer/useAttachFiles.js.map +1 -1
  528. package/dist/composer/useComposerAttachment.cjs +4 -4
  529. package/dist/composer/useComposerAttachment.cjs.map +1 -1
  530. package/dist/composer/useFileUpload.cjs +21 -16
  531. package/dist/composer/useFileUpload.cjs.map +1 -1
  532. package/dist/composer/useFileUpload.d.ts +12 -0
  533. package/dist/composer/useFileUpload.js +12 -7
  534. package/dist/composer/useFileUpload.js.map +1 -1
  535. package/dist/composer/useReadComposerDraft.cjs +27 -8
  536. package/dist/composer/useReadComposerDraft.cjs.map +1 -1
  537. package/dist/composer/useReadComposerDraft.d.ts +23 -1
  538. package/dist/composer/useReadComposerDraft.js +27 -8
  539. package/dist/composer/useReadComposerDraft.js.map +1 -1
  540. package/dist/composer/useSendMessage.cjs +4 -4
  541. package/dist/composer/useSendMessage.cjs.map +1 -1
  542. package/dist/diagnostics/useAthenaDiagnostics.cjs +4 -4
  543. package/dist/diagnostics/useAthenaDiagnostics.cjs.map +1 -1
  544. package/dist/dictation/audio-level-history.cjs +3 -3
  545. package/dist/dictation/audio-level-history.cjs.map +1 -1
  546. package/dist/dictation/dictation-controls.cjs +24 -20
  547. package/dist/dictation/dictation-controls.cjs.map +1 -1
  548. package/dist/dictation/dictation-controls.d.ts +6 -1
  549. package/dist/dictation/dictation-controls.js +24 -20
  550. package/dist/dictation/dictation-controls.js.map +1 -1
  551. package/dist/dictation/use-athena-dictation-engine.cjs +3 -3
  552. package/dist/dictation/use-athena-dictation-engine.cjs.map +1 -1
  553. package/dist/dictation/use-dictation.cjs +22 -22
  554. package/dist/dictation/use-dictation.cjs.map +1 -1
  555. package/dist/index.cjs +29 -2
  556. package/dist/index.cjs.map +1 -1
  557. package/dist/index.d.ts +18 -4
  558. package/dist/index.js +30 -3
  559. package/dist/index.js.map +1 -1
  560. package/dist/keryx-http/src/receive-only-socket.cjs +40 -0
  561. package/dist/keryx-http/src/receive-only-socket.cjs.map +1 -0
  562. package/dist/keryx-http/src/receive-only-socket.d.ts +27 -0
  563. package/dist/keryx-http/src/receive-only-socket.js +40 -0
  564. package/dist/keryx-http/src/receive-only-socket.js.map +1 -0
  565. package/dist/keryx-http/src/unconfirmed-update-attributions.cjs +190 -0
  566. package/dist/keryx-http/src/unconfirmed-update-attributions.cjs.map +1 -0
  567. package/dist/keryx-http/src/unconfirmed-update-attributions.d.ts +132 -0
  568. package/dist/keryx-http/src/unconfirmed-update-attributions.js +190 -0
  569. package/dist/keryx-http/src/unconfirmed-update-attributions.js.map +1 -0
  570. package/dist/keryx-http/src/update-attributions.cjs +141 -0
  571. package/dist/keryx-http/src/update-attributions.cjs.map +1 -0
  572. package/dist/keryx-http/src/update-attributions.d.ts +107 -0
  573. package/dist/keryx-http/src/update-attributions.js +141 -0
  574. package/dist/keryx-http/src/update-attributions.js.map +1 -0
  575. package/dist/lib/owner-document.cjs +6 -6
  576. package/dist/lib/owner-document.cjs.map +1 -1
  577. package/dist/lib/use-athena-rest-query.cjs +4 -4
  578. package/dist/lib/use-athena-rest-query.cjs.map +1 -1
  579. package/dist/lib/use-document-active.cjs +4 -4
  580. package/dist/lib/use-document-active.cjs.map +1 -1
  581. package/dist/lib/use-prefers-reduced-motion.cjs +2 -2
  582. package/dist/lib/use-prefers-reduced-motion.cjs.map +1 -1
  583. package/dist/offline/offline-history.cjs +7 -7
  584. package/dist/offline/offline-history.cjs.map +1 -1
  585. package/dist/provider/AthenaContext.cjs +3 -3
  586. package/dist/provider/AthenaContext.cjs.map +1 -1
  587. package/dist/provider/AthenaProvider.cjs +120 -79
  588. package/dist/provider/AthenaProvider.cjs.map +1 -1
  589. package/dist/provider/AthenaProvider.d.ts +11 -1
  590. package/dist/provider/AthenaProvider.js +44 -3
  591. package/dist/provider/AthenaProvider.js.map +1 -1
  592. package/dist/provider/PostHogProvider.cjs +2 -2
  593. package/dist/provider/PostHogProvider.cjs.map +1 -1
  594. package/dist/provider/agent-selection-context.cjs +2 -2
  595. package/dist/provider/agent-selection-context.cjs.map +1 -1
  596. package/dist/provider/chat-mode-context.cjs +2 -2
  597. package/dist/provider/chat-mode-context.cjs.map +1 -1
  598. package/dist/provider/session-persistence-context.cjs +10 -0
  599. package/dist/provider/session-persistence-context.cjs.map +1 -0
  600. package/dist/provider/session-persistence-context.d.ts +15 -0
  601. package/dist/provider/session-persistence-context.js +10 -0
  602. package/dist/provider/session-persistence-context.js.map +1 -0
  603. package/dist/provider/statewire-history-context.cjs +4 -4
  604. package/dist/provider/statewire-history-context.cjs.map +1 -1
  605. package/dist/provider/statewire-lifecycle-context.cjs +3 -3
  606. package/dist/provider/statewire-lifecycle-context.cjs.map +1 -1
  607. package/dist/provider/statewire-window-context.cjs +3 -3
  608. package/dist/provider/statewire-window-context.cjs.map +1 -1
  609. package/dist/provider/theme-style-context.cjs +3 -3
  610. package/dist/provider/theme-style-context.cjs.map +1 -1
  611. package/dist/react/package.json.cjs +1 -1
  612. package/dist/react/package.json.js +1 -1
  613. package/dist/runtime/StatewireThreadConfigLaneSync.cjs +10 -10
  614. package/dist/runtime/StatewireThreadConfigLaneSync.cjs.map +1 -1
  615. package/dist/runtime/auth-refusal-restart.cjs +7 -7
  616. package/dist/runtime/auth-refusal-restart.cjs.map +1 -1
  617. package/dist/runtime/auth.cjs +13 -13
  618. package/dist/runtime/auth.cjs.map +1 -1
  619. package/dist/runtime/statewire-lifecycle.cjs +1 -0
  620. package/dist/runtime/statewire-lifecycle.cjs.map +1 -1
  621. package/dist/runtime/statewire-lifecycle.d.ts +3 -1
  622. package/dist/runtime/statewire-lifecycle.js +2 -1
  623. package/dist/runtime/statewire-lifecycle.js.map +1 -1
  624. package/dist/runtime/statewire-server-lane-context.cjs +2 -2
  625. package/dist/runtime/statewire-server-lane-context.cjs.map +1 -1
  626. package/dist/runtime/statewire-session-lane.cjs +4 -4
  627. package/dist/runtime/statewire-session-lane.cjs.map +1 -1
  628. package/dist/runtime/useAthenaStatewireRuntime.cjs +10 -8
  629. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
  630. package/dist/runtime/useAthenaStatewireRuntime.d.ts +2 -0
  631. package/dist/runtime/useAthenaStatewireRuntime.js +2 -0
  632. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
  633. package/dist/styles.css +1 -1
  634. package/dist/threads/Inbox.cjs +8 -8
  635. package/dist/threads/Inbox.cjs.map +1 -1
  636. package/dist/threads/SessionList.cjs +9 -9
  637. package/dist/threads/SessionList.cjs.map +1 -1
  638. package/dist/threads/SessionsPage.cjs +11 -11
  639. package/dist/threads/SessionsPage.cjs.map +1 -1
  640. package/dist/threads/api.cjs.map +1 -1
  641. package/dist/threads/api.d.ts +15 -0
  642. package/dist/threads/api.js.map +1 -1
  643. package/dist/threads/conversation-list-fetcher.cjs +13 -5
  644. package/dist/threads/conversation-list-fetcher.cjs.map +1 -1
  645. package/dist/threads/conversation-list-fetcher.d.ts +4 -1
  646. package/dist/threads/conversation-list-fetcher.js +13 -5
  647. package/dist/threads/conversation-list-fetcher.js.map +1 -1
  648. package/dist/threads/index-triggered-refresh.cjs +10 -10
  649. package/dist/threads/index-triggered-refresh.cjs.map +1 -1
  650. package/dist/threads/mark-viewed-thread-read.cjs +12 -12
  651. package/dist/threads/mark-viewed-thread-read.cjs.map +1 -1
  652. package/dist/threads/offline-session-list.cjs +3 -3
  653. package/dist/threads/offline-session-list.cjs.map +1 -1
  654. package/dist/threads/session-list-tab-share.cjs +5 -5
  655. package/dist/threads/session-list-tab-share.cjs.map +1 -1
  656. package/dist/threads/statewire-thread-list.cjs +79 -57
  657. package/dist/threads/statewire-thread-list.cjs.map +1 -1
  658. package/dist/threads/statewire-thread-list.d.ts +20 -8
  659. package/dist/threads/statewire-thread-list.js +28 -6
  660. package/dist/threads/statewire-thread-list.js.map +1 -1
  661. package/dist/threads/thread-id-context.cjs +5 -5
  662. package/dist/threads/thread-id-context.cjs.map +1 -1
  663. package/dist/threads/use-athena-session-attention.cjs +2 -2
  664. package/dist/threads/use-athena-session-attention.cjs.map +1 -1
  665. package/dist/threads/use-athena-sessions.cjs +37 -15
  666. package/dist/threads/use-athena-sessions.cjs.map +1 -1
  667. package/dist/threads/use-athena-sessions.d.ts +10 -5
  668. package/dist/threads/use-athena-sessions.js +28 -6
  669. package/dist/threads/use-athena-sessions.js.map +1 -1
  670. package/dist/threads/use-athena-thread-model.cjs +3 -3
  671. package/dist/threads/use-athena-thread-model.cjs.map +1 -1
  672. package/dist/threads/use-rest-conversation-history.cjs +3 -3
  673. package/dist/threads/use-rest-conversation-history.cjs.map +1 -1
  674. package/dist/threads/use-rest-conversation-history.d.ts +1 -0
  675. package/dist/threads/use-statewire-conversation-history.cjs +8 -8
  676. package/dist/threads/use-statewire-conversation-history.cjs.map +1 -1
  677. package/dist/threads/use-thread-archive.cjs +9 -9
  678. package/dist/threads/use-thread-archive.cjs.map +1 -1
  679. package/dist/threads/use-thread-favorite.cjs +2 -2
  680. package/dist/threads/use-thread-favorite.cjs.map +1 -1
  681. package/dist/threads/use-thread-field-override.cjs +20 -20
  682. package/dist/threads/use-thread-field-override.cjs.map +1 -1
  683. package/dist/threads/use-thread-read-state.cjs +4 -4
  684. package/dist/threads/use-thread-read-state.cjs.map +1 -1
  685. package/dist/threads/use-thread-rename.cjs +2 -2
  686. package/dist/threads/use-thread-rename.cjs.map +1 -1
  687. package/dist/threads/useAthenaThreadManager.cjs +2 -2
  688. package/dist/threads/useAthenaThreadManager.cjs.map +1 -1
  689. package/dist/tools/NestedPtcMessages.cjs +6 -6
  690. package/dist/tools/NestedPtcMessages.cjs.map +1 -1
  691. package/dist/tools/append-document-tool-ui.cjs +7 -7
  692. package/dist/tools/append-document-tool-ui.cjs.map +1 -1
  693. package/dist/tools/file-tool-uis.cjs +2 -2
  694. package/dist/tools/file-tool-uis.cjs.map +1 -1
  695. package/dist/tools/misc-tool-uis.cjs +2 -2
  696. package/dist/tools/misc-tool-uis.cjs.map +1 -1
  697. package/dist/tools/primitives.cjs +6 -6
  698. package/dist/tools/primitives.cjs.map +1 -1
  699. package/dist/tools/read-asset-tool-ui.cjs +6 -6
  700. package/dist/tools/read-asset-tool-ui.cjs.map +1 -1
  701. package/dist/tools/subagent-task-tool-ui.cjs +21 -21
  702. package/dist/tools/subagent-task-tool-ui.cjs.map +1 -1
  703. package/dist/tools/test-recording-tool-uis.cjs +16 -16
  704. package/dist/tools/test-recording-tool-uis.cjs.map +1 -1
  705. package/dist/tools/todo-plan-store.cjs +4 -4
  706. package/dist/tools/todo-plan-store.cjs.map +1 -1
  707. package/dist/tools/tool-appearance.cjs +3 -3
  708. package/dist/tools/tool-appearance.cjs.map +1 -1
  709. package/dist/tools/tool-fallback.cjs +14 -14
  710. package/dist/tools/tool-fallback.cjs.map +1 -1
  711. package/dist/tools/tool-uis.cjs +74 -74
  712. package/dist/tools/tool-uis.cjs.map +1 -1
  713. package/dist/tools/use-elapsed-seconds.cjs +3 -3
  714. package/dist/tools/use-elapsed-seconds.cjs.map +1 -1
  715. package/dist/tools/write-todos-tool-ui.cjs +9 -9
  716. package/dist/tools/write-todos-tool-ui.cjs.map +1 -1
  717. package/dist/ui/image-viewer.cjs +382 -0
  718. package/dist/ui/image-viewer.cjs.map +1 -0
  719. package/dist/ui/image-viewer.d.ts +50 -0
  720. package/dist/ui/image-viewer.js +382 -0
  721. package/dist/ui/image-viewer.js.map +1 -0
  722. package/dist/voice/chat.cjs +6 -0
  723. package/dist/voice/chat.cjs.map +1 -1
  724. package/dist/voice/chat.d.ts +1 -1
  725. package/dist/voice/chat.js +8 -2
  726. package/dist/voice/livekit-join.cjs +52 -101
  727. package/dist/voice/livekit-join.cjs.map +1 -1
  728. package/dist/voice/livekit-join.d.ts +1 -6
  729. package/dist/voice/livekit-join.js +52 -101
  730. package/dist/voice/livekit-join.js.map +1 -1
  731. package/dist/voice/livekit.cjs.map +1 -1
  732. package/dist/voice/livekit.d.ts +11 -1
  733. package/dist/voice/livekit.js.map +1 -1
  734. package/dist/voice/use-athena-voice-session.cjs +34 -34
  735. package/dist/voice/use-athena-voice-session.cjs.map +1 -1
  736. package/dist/workbench/ComputerLiveDesktop.cjs +13 -13
  737. package/dist/workbench/ComputerLiveDesktop.cjs.map +1 -1
  738. package/dist/workbench/SessionWorkbench.cjs +22 -22
  739. package/dist/workbench/SessionWorkbench.cjs.map +1 -1
  740. package/dist/workbench/session-workbench-context.cjs +3 -3
  741. package/dist/workbench/session-workbench-context.cjs.map +1 -1
  742. package/dist/workbench/session-workbench-panes.cjs +8 -8
  743. package/dist/workbench/session-workbench-panes.cjs.map +1 -1
  744. package/dist/workbench/workbench-layout-context.cjs +3 -3
  745. package/dist/workbench/workbench-layout-context.cjs.map +1 -1
  746. package/package.json +2 -1
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
- const react = require("react");
4
+ const require$$0 = require("react");
5
5
  const format = require("../../references/src/anchors/format.cjs");
6
6
  const assetMentionUri = require("../../references/src/formats/uri/asset-mention-uri.cjs");
7
7
  const assetSpacesUrl = require("../../references/src/formats/uri/asset-spaces-url.cjs");
@@ -152,7 +152,7 @@ function personEmailForMention(parsed) {
152
152
  function textOf(node) {
153
153
  if (typeof node === "string" || typeof node === "number") return String(node);
154
154
  if (Array.isArray(node)) return node.map(textOf).join("");
155
- if (react.isValidElement(node)) return textOf(node.props.children);
155
+ if (require$$0.isValidElement(node)) return textOf(node.props.children);
156
156
  return "";
157
157
  }
158
158
  const MentionLink = ({ href, children, interactive = true }) => {
@@ -221,9 +221,9 @@ const MentionChip = ({
221
221
  sourceHref,
222
222
  interactive = true
223
223
  }) => {
224
- const auth = react.useContext(apiClient.MentionAuthCtx);
224
+ const auth = require$$0.useContext(apiClient.MentionAuthCtx);
225
225
  const memberAvatarUrl = useMemberAvatar.useMemberAvatarUrl(personEmail);
226
- const [erroredAvatarUrl, setErroredAvatarUrl] = react.useState();
226
+ const [erroredAvatarUrl, setErroredAvatarUrl] = require$$0.useState();
227
227
  const excerpt = sourceHref ? readSourceExcerpt(sourceHref) : null;
228
228
  const repositoryFile = (citation == null ? void 0 : citation.anchorType) === "file_line_range" ? { ...splitFileLines(citation.label), label: citation.label } : null;
229
229
  const asset = useMentionAsset.useMentionAsset(
@@ -1 +1 @@
1
- {"version":3,"file":"mention-chip.cjs","sources":["../../../src/chat-ui/mentions/mention-chip.tsx"],"sourcesContent":["/**\n * Mention chip rendering for message display.\n *\n * Parses [@name](mention://type?...) markdown links and renders them\n * as styled inline chips matching the Olympus mention style.\n * Used in both user messages (inline text) and assistant messages (markdown links).\n */\n\nimport {\n isValidElement,\n useContext,\n useState,\n type FC,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport {\n formatScreenPoint,\n isScreenPointHref,\n parseScreenPointHref,\n} from \"@athenaintel/agent-runtime\";\nimport {\n type AssetReference,\n decodeFromAssetMentionUri,\n decodeFromAssetSpacesUrl,\n encodeToAssetSpacesUrl,\n formatReferenceAnchor,\n} from \"@athenaintel/references/asset-links\";\nimport {\n CrosshairIcon,\n DatabaseIcon,\n FileCodeIcon,\n FileIcon,\n FileTextIcon,\n FolderIcon,\n Globe2Icon,\n HeadphonesIcon,\n ImageIcon,\n type LucideIcon,\n MailIcon,\n MessageSquareIcon,\n MonitorIcon,\n PresentationIcon,\n SheetIcon,\n UserIcon,\n VideoIcon,\n} from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport { createOlympusAssetUrl } from \"../lib/asset-urls\";\nimport { MentionAuthCtx } from \"./suggestions/data/api-client\";\nimport { assetTypeToThumb } from \"./suggestions/data/sources/asset-type-icons\";\nimport { useMemberAvatarUrl } from \"./use-member-avatar\";\nimport { useMentionAsset } from \"./use-mention-asset\";\n\nconst SPACES_MENTION_PATH = /\\/dashboard\\/spaces\\/?\\?/;\n\nfunction isSpacesMentionUrl(url: string): boolean {\n return SPACES_MENTION_PATH.test(url);\n}\n\nfunction getSpacesAssetType(url: URL): string | null {\n const assetType =\n url.searchParams.get(\"assetType\") ||\n url.searchParams.get(\"asset_type\") ||\n url.searchParams.get(\"type\");\n return assetType === \"sheet\" ? \"spreadsheet\" : assetType;\n}\n\n/**\n * Where in the asset a citation points, as its chip shows it. The anchor is\n * read and labelled by `@athenaintel/references` — the same parser and labels\n * Olympus's mention chips use — so a chip reads `jwt.py:12-25`, `p.5` or\n * `Slide 3` in every Athena chat.\n */\nexport interface MentionChipCitation {\n /** The anchor type (`page`, `file_line_range`, `slide`, …). */\n anchorType: string;\n /** The short label drawn after the name (`p.5`, `jwt.py:12-25`). */\n label: string;\n /**\n * The place spelled out (`Page 5`, `agora/…/jwt.py:12-25`), without the\n * excerpt: the tooltip when the link carries no excerpt, and part of the\n * chip's accessible name when it holds a word.\n */\n description: string;\n}\n\n/** The citation an asset link's anchor names, or undefined for a plain mention or an anchor nobody can read. */\nfunction citationOf(reference: AssetReference): MentionChipCitation | undefined {\n const { anchor, meta } = reference;\n if (!anchor) return undefined;\n const label = formatReferenceAnchor(anchor, \"short\", meta);\n if (!label) return undefined;\n const { excerpt: _excerpt, ...place } = meta ?? {};\n return {\n anchorType: anchor.type,\n label,\n description: formatReferenceAnchor(anchor, \"long\", place) ?? label,\n };\n}\n\n/**\n * The chip's icon for an asset type when the host serves no asset-type SVGs.\n * A compact set on purpose: the chip renders in every message (and Olympus's\n * main layout reaches it through the queued-message tray), so it carries a\n * dozen icons rather than the `@` menu's whole map.\n */\nconst ASSET_CHIP_ICONS: Record<string, LucideIcon> = {\n document: FileTextIcon,\n word_document: FileTextIcon,\n markdown: FileTextIcon,\n txt: FileTextIcon,\n pdf: FileTextIcon,\n spreadsheet: SheetIcon,\n table: SheetIcon,\n presentation: PresentationIcon,\n powerpoint_deck: PresentationIcon,\n presentation_pptx_studio: PresentationIcon,\n pptx: PresentationIcon,\n image: ImageIcon,\n figure: ImageIcon,\n canvas: ImageIcon,\n video: VideoIcon,\n meeting: VideoIcon,\n video_session: VideoIcon,\n audio: HeadphonesIcon,\n voice_memo: HeadphonesIcon,\n phone_call: HeadphonesIcon,\n email: MailIcon,\n email_message: MailIcon,\n live_email_thread: MailIcon,\n live_calendar_event: MailIcon,\n python: FileCodeIcon,\n javascript: FileCodeIcon,\n typescript: FileCodeIcon,\n json: FileCodeIcon,\n yaml: FileCodeIcon,\n database: DatabaseIcon,\n catalog: DatabaseIcon,\n drive: DatabaseIcon,\n dataset: DatabaseIcon,\n semantic_model: DatabaseIcon,\n query_snippet: DatabaseIcon,\n folder: FolderIcon,\n gdrive_folder: FolderIcon,\n project: FolderIcon,\n collection: FolderIcon,\n session: MessageSquareIcon,\n computer: MonitorIcon,\n desktop_session: MonitorIcon,\n user_interface: MonitorIcon,\n application: MonitorIcon,\n html: Globe2Icon,\n web_page: Globe2Icon,\n browse_session: Globe2Icon,\n};\n\nfunction assetChipIcon(assetType: string | undefined): LucideIcon {\n return (assetType && ASSET_CHIP_ICONS[assetType.toLowerCase()]) || FileIcon;\n}\n\n/**\n * GitHub's mark (Octicons `mark-github`), drawn by a repository file's\n * citation. Lucide carries no brand icons and an SDK app serves none of\n * Olympus's, so the chip brings its own. Only a GitHub repository catalog\n * serves `file_line_range` anchors (`ASSET_ANCHOR_REGISTRY`; agora's\n * `_CATALOG_ANCHORS_BY_PROVIDER`), so the anchor alone names the provider.\n */\nfunction GitHubMarkIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n className={className}\n data-chip-icon=\"github\"\n >\n <path d=\"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z\" />\n </svg>\n );\n}\n\n/** Anchors only a session holds: its messages, blocks and tool calls. */\nconst SESSION_ANCHORS: ReadonlySet<string> = new Set([\n \"msg\",\n \"msg_range\",\n \"msg_block\",\n \"msg_section\",\n \"msg_text\",\n \"tool_call\",\n]);\n\n/** Whether a link names a session (its type, or an anchor only a session holds). */\nfunction isSessionLink(\n assetType: string | undefined,\n citation: MentionChipCitation | undefined,\n): boolean {\n return (\n assetType?.toLowerCase() === \"session\" ||\n (citation !== undefined && SESSION_ANCHORS.has(citation.anchorType))\n );\n}\n\n/** Past this many characters a place may not show whole in the chip, so the tooltip spells it out. */\nconst PLACE_FITS_CHARS = 20;\n\n/** `route.ts:18-24` as the file's name and its lines, so a long name shortens while its lines stay. */\nfunction splitFileLines(label: string): { file: string; lines: string } {\n const colon = label.lastIndexOf(\":\");\n return colon > 0\n ? { file: label.slice(0, colon), lines: label.slice(colon) }\n : { file: label, lines: \"\" };\n}\n\n/**\n * Whether a name already says where its citation points: the place's label or\n * its spelled-out form, or a name ending in the label (`Q4 report p.5`,\n * `olympus/…/route.ts:18-24`). The chip then draws the place once.\n */\nfunction restatesPlace(name: string, citation: MentionChipCitation): boolean {\n const said = name.trim().toLowerCase();\n const label = citation.label.toLowerCase();\n return said === label || said === citation.description.toLowerCase() || said.endsWith(label);\n}\n\n/**\n * The link's own label when it tells the reader something the chip does not\n * already show: not the place again (a path, `file:lines`), not the asset's\n * name. The tooltip keeps it, since the chip shows the asset and the place.\n */\nfunction informativeLabel({\n label,\n shown,\n citation,\n}: {\n label: string;\n shown: readonly (string | null | undefined)[];\n citation: MentionChipCitation | undefined;\n}): string | null {\n const trimmed = label.trim();\n if (!trimmed || !SPEAKABLE.test(trimmed)) return null;\n if (PLACEHOLDER_LABELS.has(trimmed.toLowerCase())) return null;\n if (citation && restatesPlace(trimmed, citation)) return null;\n // Every word of it already shown (`Tesla Q3 report` beside `Tesla Q3\n // Earnings Report`, `demo-app-monorepo` beside the repository's title).\n const shownWords = new Set(\n [...shown, citation?.description].flatMap((text) => (text ? wordsOf(text) : [])),\n );\n return wordsOf(trimmed).every((word) => shownWords.has(word)) ? null : trimmed;\n}\n\nfunction wordsOf(text: string): string[] {\n return text.toLowerCase().match(/[\\p{L}\\p{N}]+/gu) ?? [];\n}\n\n/** A label with a letter or digit in it; `§` or `•` alone says nothing read aloud. */\nconst SPEAKABLE = /[\\p{L}\\p{N}]/u;\n\n/** Labels that name nothing: agora's read_asset citations all read `Citation`. */\nconst PLACEHOLDER_LABELS: ReadonlySet<string> = new Set([\"citation\", \"source\", \"link\", \"here\"]);\n\n/** The asset reference an asset link decodes to, or null when it does not parse. */\nfunction decodeAssetLink(\n url: URL,\n decode: (url: URL) => AssetReference,\n): AssetReference | null {\n try {\n return decode(url);\n } catch {\n return null;\n }\n}\n\n// ── Mention link component for markdown renderer ──\n\n/**\n * Custom <a> renderer for MarkdownTextPrimitive.\n * Intercepts mention:// links and renders them as chips.\n * Falls through to a normal link for non-mention URLs.\n */\nfunction personEmailForMention(\n parsed: ReturnType<typeof parseMentionUrl>,\n): string | undefined {\n if (parsed.type !== \"person\") return undefined;\n return parsed.email || (parsed.id.includes(\"@\") ? parsed.id : undefined);\n}\n\n/**\n * The text a link's children read as. Markdown can hand a link several children, some of them\n * elements (an escaped `_` or a `*` in a URL splits its text), and stringifying an element gives\n * `[object Object]`.\n */\nfunction textOf(node: ReactNode): string {\n if (typeof node === \"string\" || typeof node === \"number\") return String(node);\n if (Array.isArray(node)) return node.map(textOf).join(\"\");\n if (isValidElement<{ children?: ReactNode }>(node)) return textOf(node.props.children);\n return \"\";\n}\n\nexport const MentionLink: FC<{\n href?: string;\n children?: ReactNode;\n interactive?: boolean;\n}> = ({ href, children, interactive = true }) => {\n if (\n href &&\n (href.startsWith(\"mention://\") || isSpacesMentionUrl(href))\n ) {\n const name = textOf(children).trim().replace(/^@/, \"\");\n\n const parsed = parseMentionUrl(href);\n\n return (\n <MentionChip\n name={name || parsed.name}\n type={parsed.type}\n personEmail={personEmailForMention(parsed)}\n assetIds={parsed.assetIds}\n assetType={parsed.assetType}\n citation={parsed.citation}\n thumbnailUrl={parsed.thumbnailUrl}\n sourceHref={isSpacesMentionUrl(href) ? href : parsed.sourceHref}\n interactive={interactive}\n />\n );\n }\n\n if (href?.startsWith(\"chrome-extension://\")) {\n return <span>{children}</span>;\n }\n\n if (isScreenPointHref(href)) {\n return <ScreenPointChip href={href}>{children}</ScreenPointChip>;\n }\n\n // Normal link — render as-is\n return (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n {children}\n </a>\n );\n};\n\n// ── The chip pill ──\n\n/**\n * Olympus's mention pill (`mentionPillClassName`: 20px high, 16px icon, the\n * place in `text-xs`) in the provider's theme tokens, so a dark theme keeps it\n * legible, and `box-border` so its height holds without a host's CSS reset.\n * Every chat chip draws it: an asset or citation chip, a web source, a screen\n * point. Only stock Tailwind sizes: Olympus renders these chips (the queued\n * message tray) with a stylesheet that does not scan this package, so an\n * arbitrary value would reach it unstyled. `not-prose` matters: assistant\n * messages render inside Tailwind Typography's `prose`, whose\n * zero-specificity `img` margins (~1.7em top/bottom) would otherwise inflate\n * the chip's icon into a tall card that breaks the sentence flow around it.\n */\nexport const CHIP_PILL_CLASS =\n \"not-prose box-border inline-flex h-5 items-center gap-1.5 whitespace-nowrap rounded-md border border-border bg-muted px-1 py-0.5 align-middle font-normal leading-none text-foreground no-underline\";\n/** A chip that opens something. */\nexport const CHIP_LINK_CLASS =\n \"cursor-pointer transition-colors hover:bg-accent hover:text-accent-foreground hover:no-underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-1\";\nexport const CHIP_ICON_CLASS = \"size-4 shrink-0\";\n\n// ── Inline screen-point chip ──\n\n/**\n * Renders an `athena-point://` link as a non-navigating coordinate chip.\n * Surfaces without screenshot context (extension side panel, SDK consumers)\n * get the label plus the coordinates; malformed points fall back to text.\n */\nexport const ScreenPointChip: FC<{\n href: string;\n children?: ReactNode;\n}> = ({ href, children }) => {\n const parsed = parseScreenPointHref(href);\n if (!parsed.ok) {\n return <span>{children}</span>;\n }\n const description = formatScreenPoint(parsed.point);\n return (\n <span\n className={cn(CHIP_PILL_CLASS, \"max-w-[260px]\")}\n title={description}\n aria-label={description}\n data-screen-point=\"valid\"\n >\n <CrosshairIcon className={CHIP_ICON_CLASS} aria-hidden=\"true\" />\n <span className=\"min-w-0 max-w-[180px] overflow-hidden text-ellipsis\">\n {children}\n </span>\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {parsed.point.x}, {parsed.point.y}\n </span>\n </span>\n );\n};\n\n// ── Inline mention chip ──\n\nexport const MentionChip: FC<{\n name: string;\n type?: string;\n assetIds?: string[];\n /** The asset's type (`document`, `catalog`, …): picks the icon until (or unless) the asset is looked up. */\n assetType?: string;\n /** Where in the asset the link points: its label follows the name. */\n citation?: MentionChipCitation;\n personEmail?: string;\n thumbnailUrl?: string;\n sourceHref?: string;\n interactive?: boolean;\n}> = ({\n name,\n type,\n assetIds,\n assetType,\n citation,\n personEmail,\n thumbnailUrl,\n sourceHref,\n interactive = true,\n}) => {\n const auth = useContext(MentionAuthCtx);\n const memberAvatarUrl = useMemberAvatarUrl(personEmail);\n const [erroredAvatarUrl, setErroredAvatarUrl] = useState<string>();\n const excerpt = sourceHref ? readSourceExcerpt(sourceHref) : null;\n // A repository file's lines read as the file (`route.ts:18-24`): the chip\n // opens that file, and every citation in a reply names the same repository,\n // whatever label the model wrote.\n const repositoryFile =\n citation?.anchorType === \"file_line_range\"\n ? { ...splitFileLines(citation.label), label: citation.label }\n : null;\n // The asset as agora has it, read the way Olympus's chips read it: its own\n // title and type. Until it answers, and for an asset the viewer cannot read,\n // the link's label and `type=` stand in. Asked only where it changes the\n // chip: a repository file reads as its file whatever the catalog is called,\n // and a session's row is too heavy to read for a name.\n const asset = useMentionAsset(\n type === \"asset\" &&\n assetIds?.length === 1 &&\n !repositoryFile &&\n !isSessionLink(assetType, citation)\n ? assetIds[0]\n : undefined,\n );\n const assetTitle = asset?.title || null;\n const chipName = repositoryFile?.label ?? assetTitle ?? name;\n // The place follows a name that does not already say it, as `[p.5]`.\n const placeLabel =\n citation && !repositoryFile && !restatesPlace(chipName, citation)\n ? citation.label\n : null;\n // The tooltip: what the model called it (when the chip does not show it),\n // the repository a file is in and the file's whole path, the cited passage.\n // The place spelled out stands in for a passage the citation does not carry,\n // and for a place too long to show whole (a long sheet name).\n const tooltip =\n citation || excerpt\n ? tooltipText({\n lines: [\n informativeLabel({ label: name, shown: [chipName, assetTitle], citation }),\n repositoryFile ? assetTitle : null,\n repositoryFile || !excerpt || (placeLabel?.length ?? 0) > PLACE_FITS_CHARS\n ? citation?.description\n : null,\n ],\n excerpt,\n })\n : null;\n const assetRootHref =\n type === \"asset\" && assetIds?.length\n ? createOlympusAssetUrl({\n appUrl: auth?.appUrl,\n backendUrl: auth?.backendUrl,\n assetIds,\n })\n : null;\n const href = (() => {\n if (!assetRootHref || !sourceHref) return assetRootHref;\n try {\n const source = new URL(sourceHref, \"https://app.athenaintel.com\");\n const destination = new URL(assetRootHref);\n for (const [key, value] of source.searchParams) {\n destination.searchParams.set(key, value);\n }\n destination.searchParams.set(\"asset_ids\", assetIds?.join(\",\") ?? \"\");\n return destination.toString();\n } catch {\n return assetRootHref;\n }\n })();\n const className = cn(CHIP_PILL_CLASS, \"max-w-[275px]\", href && CHIP_LINK_CLASS);\n // A host's asset-type SVG follows the looked-up type, when it serves them.\n const chipThumbnailUrl = repositoryFile\n ? undefined\n : (asset?.assetType && assetTypeToThumb(asset.assetType)) || thumbnailUrl;\n const AssetIcon = assetChipIcon(asset?.assetType || assetType);\n const contents = (\n <>\n {repositoryFile ? (\n <GitHubMarkIcon className={CHIP_ICON_CLASS} />\n ) : chipThumbnailUrl ? (\n <img\n src={chipThumbnailUrl}\n alt=\"\"\n className={CHIP_ICON_CLASS}\n draggable={false}\n />\n ) : type === \"asset\" || type === \"folder\" ? (\n // A host that bundles no asset-type SVGs (computer apps, most SDK\n // apps) still gets the type's icon.\n <AssetIcon className={CHIP_ICON_CLASS} aria-hidden=\"true\" />\n ) : type === \"webpage\" ? (\n <Globe2Icon className={CHIP_ICON_CLASS} aria-hidden=\"true\" />\n ) : type === \"person\" ? (\n memberAvatarUrl && erroredAvatarUrl !== memberAvatarUrl ? (\n <img\n src={memberAvatarUrl}\n alt=\"\"\n className={cn(CHIP_ICON_CLASS, \"rounded-full object-cover\")}\n draggable={false}\n onError={() => setErroredAvatarUrl(memberAvatarUrl)}\n />\n ) : (\n <UserIcon className={CHIP_ICON_CLASS} aria-hidden=\"true\" />\n )\n ) : null}\n {repositoryFile ? (\n <span\n className=\"flex min-w-0 items-center\"\n data-citation-anchor=\"file_line_range\"\n >\n <span className=\"min-w-0 overflow-hidden text-ellipsis\">\n {repositoryFile.file}\n </span>\n <span className=\"shrink-0 text-muted-foreground\">{repositoryFile.lines}</span>\n </span>\n ) : (\n <span\n className={cn(\n \"max-w-[180px] overflow-hidden text-ellipsis\",\n // A long place may shorten the name, never make it vanish.\n placeLabel && \"min-w-8\",\n )}\n >\n {chipName}\n </span>\n )}\n {citation && placeLabel && (\n <>\n {/* Copied or read as text, the place stays a word apart from the name; a flex row draws no space. */}{\" \"}\n <span\n className=\"flex min-w-0 items-center text-xs text-muted-foreground\"\n data-citation-anchor={citation.anchorType}\n >\n [<span className=\"min-w-0 overflow-hidden text-ellipsis\">{placeLabel}</span>]\n </span>\n </>\n )}\n </>\n );\n\n if (href && interactive) {\n const speakablePlace = citation && SPEAKABLE.test(citation.description);\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={className}\n aria-label={\n repositoryFile && citation\n ? `Open ${citation.description} in Spaces`\n : placeLabel && citation && speakablePlace\n ? `Open ${chipName} at ${citation.description} in Spaces`\n : `Open ${chipName} in Spaces`\n }\n title={tooltip ?? `Open ${chipName} in Spaces`}\n data-excerpt={excerpt ?? undefined}\n // The asset without its place: what a click names the opened asset.\n data-mention-name={repositoryFile ? (assetTitle ?? name) : chipName}\n >\n {contents}\n </a>\n );\n }\n\n return (\n <span\n className={className}\n title={tooltip ?? undefined}\n data-excerpt={excerpt ?? undefined}\n >\n {contents}\n </span>\n );\n};\n\n/**\n * A chip's tooltip: the lines that say something, each once, then the cited\n * passage, quoted when it shares the tooltip with other lines.\n */\nfunction tooltipText({\n lines,\n excerpt,\n}: {\n lines: readonly (string | null | undefined)[];\n excerpt: string | null;\n}): string | null {\n const kept: string[] = [];\n for (const line of lines) {\n const trimmed = line?.trim();\n if (trimmed && !kept.includes(trimmed)) kept.push(trimmed);\n }\n if (excerpt) kept.push(kept.length ? `“${excerpt}”` : excerpt);\n return kept.length ? kept.join(\"\\n\") : null;\n}\n\n/** The `excerpt` a Spaces citation URL carries, or null. */\nfunction readSourceExcerpt(href: string): string | null {\n try {\n const excerpt = new URL(href, \"https://app.athenaintel.com\").searchParams\n .get(\"excerpt\")\n ?.trim();\n return excerpt ? excerpt : null;\n } catch {\n return null;\n }\n}\n\n/**\n * The label an asset citation chip falls back to when the model wrote none\n * (`[](…/spaces/?asset_ids=…&page=5)`): the cited location, else \"Asset\" — a\n * chip must never render as an empty box.\n */\nfunction citationFallbackLabel(params: URLSearchParams): string {\n const start = params.get(\"start_page\") ?? params.get(\"page\");\n const end = params.get(\"end_page\");\n if (start && end && end !== start) return `Pages ${start}–${end}`;\n if (start) return `Page ${start}`;\n return \"Asset\";\n}\n\n// ── Parse mention:// URLs ──\n\nexport function parseMentionUrl(url: string): {\n type: string;\n name: string;\n id: string;\n email?: string;\n assetIds?: string[];\n assetType?: string;\n citation?: MentionChipCitation;\n /**\n * For a `mention://asset` citation, the Spaces link to its place (anchor and\n * excerpt), so the chip opens there; a Spaces mention is its own link.\n */\n sourceHref?: string;\n thumbnailUrl?: string;\n} {\n try {\n if (isSpacesMentionUrl(url)) {\n const parsed = new URL(url, \"https://app.athenaintel.com\");\n const assetIds = (parsed.searchParams.get(\"asset_ids\") ?? \"\")\n .split(\",\")\n .map((id) => id.trim())\n .filter(Boolean);\n const id = assetIds[0] ?? \"\";\n const assetType = getSpacesAssetType(parsed);\n // A link to several assets names no one place in any of them.\n const reference =\n assetIds.length === 1\n ? decodeAssetLink(parsed, decodeFromAssetSpacesUrl)\n : null;\n const citation = reference ? citationOf(reference) : undefined;\n return {\n type: \"asset\",\n name:\n assetIds.length > 1\n ? `${assetIds.length} assets`\n : (citation?.description ??\n citationFallbackLabel(parsed.searchParams)),\n id,\n assetIds,\n assetType: assetType ?? undefined,\n citation,\n thumbnailUrl: assetTypeToThumb(assetType),\n };\n }\n // mention://tool?name=...&description=...\n // mention://asset?id=...&assetType=project&thumb=../icons/files/ic-project.svg\n const u = new URL(url);\n const type = u.hostname || u.pathname.replace(/^\\/\\//, \"\").split(\"?\")[0];\n const isWebpage = type === \"webpage\";\n const id = isWebpage\n ? u.searchParams.get(\"tab_id\") || \"\"\n : u.searchParams.get(\"id\") || u.searchParams.get(\"name\") || \"\";\n const name = isWebpage\n ? u.searchParams.get(\"title\") || \"This webpage\"\n : u.searchParams.get(\"name\") || id;\n\n // Get thumbnail: prefer explicit thumb param, then derive from assetType\n let thumbnailUrl = u.searchParams.get(\"thumb\") || undefined;\n if (!thumbnailUrl) {\n const assetType = u.searchParams.get(\"assetType\");\n if (assetType) {\n thumbnailUrl = assetTypeToThumb(assetType);\n } else if (type === \"asset\" || type === \"folder\") {\n thumbnailUrl = assetTypeToThumb(type === \"folder\" ? \"folder\" : null);\n }\n }\n\n const reference =\n type === \"asset\" ? decodeAssetLink(u, decodeFromAssetMentionUri) : null;\n\n return {\n type,\n name,\n id,\n email: type === \"person\" ? u.searchParams.get(\"email\") || undefined : undefined,\n assetIds: type === \"asset\" && id ? [id] : undefined,\n assetType:\n type === \"asset\" || type === \"folder\"\n ? u.searchParams.get(\"assetType\") ||\n reference?.meta?.assetType ||\n (type === \"folder\" ? \"folder\" : undefined)\n : undefined,\n citation: reference ? citationOf(reference) : undefined,\n sourceHref:\n reference && (reference.anchor || reference.meta?.excerpt)\n ? encodeToAssetSpacesUrl(reference)\n : undefined,\n thumbnailUrl,\n };\n } catch {\n return { type: \"unknown\", name: \"\", id: \"\" };\n }\n}\n\nfunction htmlAttribute(attributes: string, name: string): string | null {\n const escapedName = name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const match = new RegExp(\n `(?:^|\\\\s)${escapedName}\\\\s*=\\\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\\\s>]+))`,\n \"i\",\n ).exec(attributes);\n return match?.[1] ?? match?.[2] ?? match?.[3] ?? null;\n}\n\nfunction decodeHtmlAttribute(value: string): string {\n return value\n .replace(/&amp;/gi, \"&\")\n .replace(/&quot;/gi, '\"')\n .replace(/&#39;|&apos;/gi, \"'\")\n .replace(/&lt;/gi, \"<\")\n .replace(/&gt;/gi, \">\");\n}\n\n/** Turn complete model-emitted URL citation anchors into safe Markdown links. */\nexport function normalizeAthenaMentionHtml(text: string): string {\n return text.replace(\n /<a\\b([^>]*)>([\\s\\S]*?)<\\/a>/gi,\n (original, attributes: string, rawLabel: string) => {\n const className = htmlAttribute(attributes, \"class\") ?? \"\";\n const type = htmlAttribute(attributes, \"data-type\") ?? \"\";\n if (!className.split(/\\s+/).includes(\"mention\") || type !== \"url\") {\n return original;\n }\n\n const rawUrl =\n htmlAttribute(attributes, \"data-url\") ??\n htmlAttribute(attributes, \"href\");\n if (!rawUrl) return original;\n const url = decodeHtmlAttribute(rawUrl);\n let normalizedUrl: string;\n try {\n const parsed = new URL(url);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n return original;\n }\n normalizedUrl = parsed.toString();\n } catch {\n return original;\n }\n\n const label = decodeHtmlAttribute(rawLabel.replace(/<[^>]*>/g, \"\"))\n .trim()\n .replace(/([\\\\[\\]])/g, \"\\\\$1\");\n return label ? `[${label}](<${normalizedUrl}>)` : original;\n },\n );\n}\n// ── Parse mention markdown in plain text ──\n\n// The label may hold balanced brackets one level deep (`[@Plan [Q3]](…)`) or a lone `[`.\nconst MENTION_RE =\n /\\[@((?:\\[[^[\\]]*\\](?!\\((?:[a-z][a-z0-9+.-]*:\\/\\/|\\/))|[^\\]])*)\\]\\(((?:mention:\\/\\/|(?:https?:\\/\\/[^)\\s]+)?\\/dashboard\\/spaces\\/?\\?)[^)]+)\\)/g;\n\n/**\n * Parse text containing [@name](mention://...) patterns into\n * an array of string segments and MentionChip elements.\n */\nexport function parseMentionsInText(text: string): (string | ReactElement)[] {\n const parts: (string | ReactElement)[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n MENTION_RE.lastIndex = 0;\n\n while ((match = MENTION_RE.exec(text)) !== null) {\n if (match.index > lastIndex) {\n parts.push(text.slice(lastIndex, match.index));\n }\n\n const name = match[1];\n const url = match[2];\n const parsed = parseMentionUrl(url);\n\n parts.push(\n <MentionChip\n key={`mention-${match.index}`}\n name={name || parsed.name}\n type={parsed.type}\n personEmail={personEmailForMention(parsed)}\n assetIds={parsed.assetIds}\n assetType={parsed.assetType}\n citation={parsed.citation}\n thumbnailUrl={parsed.thumbnailUrl}\n sourceHref={isSpacesMentionUrl(url) ? url : parsed.sourceHref}\n />\n );\n\n lastIndex = match.index + match[0].length;\n }\n\n if (lastIndex < text.length) {\n parts.push(text.slice(lastIndex));\n }\n\n return parts.length > 0 ? parts : [text];\n}\n\n/** The text as a reader sees it: each `[@name](…)` mention becomes `@name`. */\nexport function mentionsToPlainText(text: string): string {\n return text.replace(MENTION_RE, (_match, name: string, url: string) => {\n return `@${name || parseMentionUrl(url).name}`;\n });\n}\n"],"names":["formatReferenceAnchor","FileTextIcon","SheetIcon","PresentationIcon","ImageIcon","VideoIcon","HeadphonesIcon","MailIcon","FileCodeIcon","DatabaseIcon","FolderIcon","MessageSquareIcon","MonitorIcon","Globe2Icon","FileIcon","jsx","isValidElement","isScreenPointHref","parseScreenPointHref","formatScreenPoint","jsxs","cn","CrosshairIcon","useContext","MentionAuthCtx","useMemberAvatarUrl","useState","useMentionAsset","createOlympusAssetUrl","assetTypeToThumb","Fragment","UserIcon","id","reference","decodeFromAssetSpacesUrl","decodeFromAssetMentionUri","encodeToAssetSpacesUrl"],"mappings":"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"}
1
+ {"version":3,"file":"mention-chip.cjs","sources":["../../../src/chat-ui/mentions/mention-chip.tsx"],"sourcesContent":["/**\n * Mention chip rendering for message display.\n *\n * Parses [@name](mention://type?...) markdown links and renders them\n * as styled inline chips matching the Olympus mention style.\n * Used in both user messages (inline text) and assistant messages (markdown links).\n */\n\nimport {\n isValidElement,\n useContext,\n useState,\n type FC,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport {\n formatScreenPoint,\n isScreenPointHref,\n parseScreenPointHref,\n} from \"@athenaintel/agent-runtime\";\nimport {\n type AssetReference,\n decodeFromAssetMentionUri,\n decodeFromAssetSpacesUrl,\n encodeToAssetSpacesUrl,\n formatReferenceAnchor,\n} from \"@athenaintel/references/asset-links\";\nimport {\n CrosshairIcon,\n DatabaseIcon,\n FileCodeIcon,\n FileIcon,\n FileTextIcon,\n FolderIcon,\n Globe2Icon,\n HeadphonesIcon,\n ImageIcon,\n type LucideIcon,\n MailIcon,\n MessageSquareIcon,\n MonitorIcon,\n PresentationIcon,\n SheetIcon,\n UserIcon,\n VideoIcon,\n} from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport { createOlympusAssetUrl } from \"../lib/asset-urls\";\nimport { MentionAuthCtx } from \"./suggestions/data/api-client\";\nimport { assetTypeToThumb } from \"./suggestions/data/sources/asset-type-icons\";\nimport { useMemberAvatarUrl } from \"./use-member-avatar\";\nimport { useMentionAsset } from \"./use-mention-asset\";\n\nconst SPACES_MENTION_PATH = /\\/dashboard\\/spaces\\/?\\?/;\n\nfunction isSpacesMentionUrl(url: string): boolean {\n return SPACES_MENTION_PATH.test(url);\n}\n\nfunction getSpacesAssetType(url: URL): string | null {\n const assetType =\n url.searchParams.get(\"assetType\") ||\n url.searchParams.get(\"asset_type\") ||\n url.searchParams.get(\"type\");\n return assetType === \"sheet\" ? \"spreadsheet\" : assetType;\n}\n\n/**\n * Where in the asset a citation points, as its chip shows it. The anchor is\n * read and labelled by `@athenaintel/references` — the same parser and labels\n * Olympus's mention chips use — so a chip reads `jwt.py:12-25`, `p.5` or\n * `Slide 3` in every Athena chat.\n */\nexport interface MentionChipCitation {\n /** The anchor type (`page`, `file_line_range`, `slide`, …). */\n anchorType: string;\n /** The short label drawn after the name (`p.5`, `jwt.py:12-25`). */\n label: string;\n /**\n * The place spelled out (`Page 5`, `agora/…/jwt.py:12-25`), without the\n * excerpt: the tooltip when the link carries no excerpt, and part of the\n * chip's accessible name when it holds a word.\n */\n description: string;\n}\n\n/** The citation an asset link's anchor names, or undefined for a plain mention or an anchor nobody can read. */\nfunction citationOf(reference: AssetReference): MentionChipCitation | undefined {\n const { anchor, meta } = reference;\n if (!anchor) return undefined;\n const label = formatReferenceAnchor(anchor, \"short\", meta);\n if (!label) return undefined;\n const { excerpt: _excerpt, ...place } = meta ?? {};\n return {\n anchorType: anchor.type,\n label,\n description: formatReferenceAnchor(anchor, \"long\", place) ?? label,\n };\n}\n\n/**\n * The chip's icon for an asset type when the host serves no asset-type SVGs.\n * A compact set on purpose: the chip renders in every message (and Olympus's\n * main layout reaches it through the queued-message tray), so it carries a\n * dozen icons rather than the `@` menu's whole map.\n */\nconst ASSET_CHIP_ICONS: Record<string, LucideIcon> = {\n document: FileTextIcon,\n word_document: FileTextIcon,\n markdown: FileTextIcon,\n txt: FileTextIcon,\n pdf: FileTextIcon,\n spreadsheet: SheetIcon,\n table: SheetIcon,\n presentation: PresentationIcon,\n powerpoint_deck: PresentationIcon,\n presentation_pptx_studio: PresentationIcon,\n pptx: PresentationIcon,\n image: ImageIcon,\n figure: ImageIcon,\n canvas: ImageIcon,\n video: VideoIcon,\n meeting: VideoIcon,\n video_session: VideoIcon,\n audio: HeadphonesIcon,\n voice_memo: HeadphonesIcon,\n phone_call: HeadphonesIcon,\n email: MailIcon,\n email_message: MailIcon,\n live_email_thread: MailIcon,\n live_calendar_event: MailIcon,\n python: FileCodeIcon,\n javascript: FileCodeIcon,\n typescript: FileCodeIcon,\n json: FileCodeIcon,\n yaml: FileCodeIcon,\n database: DatabaseIcon,\n catalog: DatabaseIcon,\n drive: DatabaseIcon,\n dataset: DatabaseIcon,\n semantic_model: DatabaseIcon,\n query_snippet: DatabaseIcon,\n folder: FolderIcon,\n gdrive_folder: FolderIcon,\n project: FolderIcon,\n collection: FolderIcon,\n session: MessageSquareIcon,\n computer: MonitorIcon,\n desktop_session: MonitorIcon,\n user_interface: MonitorIcon,\n application: MonitorIcon,\n html: Globe2Icon,\n web_page: Globe2Icon,\n browse_session: Globe2Icon,\n};\n\nfunction assetChipIcon(assetType: string | undefined): LucideIcon {\n return (assetType && ASSET_CHIP_ICONS[assetType.toLowerCase()]) || FileIcon;\n}\n\n/**\n * GitHub's mark (Octicons `mark-github`), drawn by a repository file's\n * citation. Lucide carries no brand icons and an SDK app serves none of\n * Olympus's, so the chip brings its own. Only a GitHub repository catalog\n * serves `file_line_range` anchors (`ASSET_ANCHOR_REGISTRY`; agora's\n * `_CATALOG_ANCHORS_BY_PROVIDER`), so the anchor alone names the provider.\n */\nfunction GitHubMarkIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n className={className}\n data-chip-icon=\"github\"\n >\n <path d=\"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z\" />\n </svg>\n );\n}\n\n/** Anchors only a session holds: its messages, blocks and tool calls. */\nconst SESSION_ANCHORS: ReadonlySet<string> = new Set([\n \"msg\",\n \"msg_range\",\n \"msg_block\",\n \"msg_section\",\n \"msg_text\",\n \"tool_call\",\n]);\n\n/** Whether a link names a session (its type, or an anchor only a session holds). */\nfunction isSessionLink(\n assetType: string | undefined,\n citation: MentionChipCitation | undefined,\n): boolean {\n return (\n assetType?.toLowerCase() === \"session\" ||\n (citation !== undefined && SESSION_ANCHORS.has(citation.anchorType))\n );\n}\n\n/** Past this many characters a place may not show whole in the chip, so the tooltip spells it out. */\nconst PLACE_FITS_CHARS = 20;\n\n/** `route.ts:18-24` as the file's name and its lines, so a long name shortens while its lines stay. */\nfunction splitFileLines(label: string): { file: string; lines: string } {\n const colon = label.lastIndexOf(\":\");\n return colon > 0\n ? { file: label.slice(0, colon), lines: label.slice(colon) }\n : { file: label, lines: \"\" };\n}\n\n/**\n * Whether a name already says where its citation points: the place's label or\n * its spelled-out form, or a name ending in the label (`Q4 report p.5`,\n * `olympus/…/route.ts:18-24`). The chip then draws the place once.\n */\nfunction restatesPlace(name: string, citation: MentionChipCitation): boolean {\n const said = name.trim().toLowerCase();\n const label = citation.label.toLowerCase();\n return said === label || said === citation.description.toLowerCase() || said.endsWith(label);\n}\n\n/**\n * The link's own label when it tells the reader something the chip does not\n * already show: not the place again (a path, `file:lines`), not the asset's\n * name. The tooltip keeps it, since the chip shows the asset and the place.\n */\nfunction informativeLabel({\n label,\n shown,\n citation,\n}: {\n label: string;\n shown: readonly (string | null | undefined)[];\n citation: MentionChipCitation | undefined;\n}): string | null {\n const trimmed = label.trim();\n if (!trimmed || !SPEAKABLE.test(trimmed)) return null;\n if (PLACEHOLDER_LABELS.has(trimmed.toLowerCase())) return null;\n if (citation && restatesPlace(trimmed, citation)) return null;\n // Every word of it already shown (`Tesla Q3 report` beside `Tesla Q3\n // Earnings Report`, `demo-app-monorepo` beside the repository's title).\n const shownWords = new Set(\n [...shown, citation?.description].flatMap((text) => (text ? wordsOf(text) : [])),\n );\n return wordsOf(trimmed).every((word) => shownWords.has(word)) ? null : trimmed;\n}\n\nfunction wordsOf(text: string): string[] {\n return text.toLowerCase().match(/[\\p{L}\\p{N}]+/gu) ?? [];\n}\n\n/** A label with a letter or digit in it; `§` or `•` alone says nothing read aloud. */\nconst SPEAKABLE = /[\\p{L}\\p{N}]/u;\n\n/** Labels that name nothing: agora's read_asset citations all read `Citation`. */\nconst PLACEHOLDER_LABELS: ReadonlySet<string> = new Set([\"citation\", \"source\", \"link\", \"here\"]);\n\n/** The asset reference an asset link decodes to, or null when it does not parse. */\nfunction decodeAssetLink(\n url: URL,\n decode: (url: URL) => AssetReference,\n): AssetReference | null {\n try {\n return decode(url);\n } catch {\n return null;\n }\n}\n\n// ── Mention link component for markdown renderer ──\n\n/**\n * Custom <a> renderer for MarkdownTextPrimitive.\n * Intercepts mention:// links and renders them as chips.\n * Falls through to a normal link for non-mention URLs.\n */\nfunction personEmailForMention(\n parsed: ReturnType<typeof parseMentionUrl>,\n): string | undefined {\n if (parsed.type !== \"person\") return undefined;\n return parsed.email || (parsed.id.includes(\"@\") ? parsed.id : undefined);\n}\n\n/**\n * The text a link's children read as. Markdown can hand a link several children, some of them\n * elements (an escaped `_` or a `*` in a URL splits its text), and stringifying an element gives\n * `[object Object]`.\n */\nfunction textOf(node: ReactNode): string {\n if (typeof node === \"string\" || typeof node === \"number\") return String(node);\n if (Array.isArray(node)) return node.map(textOf).join(\"\");\n if (isValidElement<{ children?: ReactNode }>(node)) return textOf(node.props.children);\n return \"\";\n}\n\nexport const MentionLink: FC<{\n href?: string;\n children?: ReactNode;\n interactive?: boolean;\n}> = ({ href, children, interactive = true }) => {\n if (\n href &&\n (href.startsWith(\"mention://\") || isSpacesMentionUrl(href))\n ) {\n const name = textOf(children).trim().replace(/^@/, \"\");\n\n const parsed = parseMentionUrl(href);\n\n return (\n <MentionChip\n name={name || parsed.name}\n type={parsed.type}\n personEmail={personEmailForMention(parsed)}\n assetIds={parsed.assetIds}\n assetType={parsed.assetType}\n citation={parsed.citation}\n thumbnailUrl={parsed.thumbnailUrl}\n sourceHref={isSpacesMentionUrl(href) ? href : parsed.sourceHref}\n interactive={interactive}\n />\n );\n }\n\n if (href?.startsWith(\"chrome-extension://\")) {\n return <span>{children}</span>;\n }\n\n if (isScreenPointHref(href)) {\n return <ScreenPointChip href={href}>{children}</ScreenPointChip>;\n }\n\n // Normal link — render as-is\n return (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n {children}\n </a>\n );\n};\n\n// ── The chip pill ──\n\n/**\n * Olympus's mention pill (`mentionPillClassName`: 20px high, 16px icon, the\n * place in `text-xs`) in the provider's theme tokens, so a dark theme keeps it\n * legible, and `box-border` so its height holds without a host's CSS reset.\n * Every chat chip draws it: an asset or citation chip, a web source, a screen\n * point. Only stock Tailwind sizes: Olympus renders these chips (the queued\n * message tray) with a stylesheet that does not scan this package, so an\n * arbitrary value would reach it unstyled. `not-prose` matters: assistant\n * messages render inside Tailwind Typography's `prose`, whose\n * zero-specificity `img` margins (~1.7em top/bottom) would otherwise inflate\n * the chip's icon into a tall card that breaks the sentence flow around it.\n */\nexport const CHIP_PILL_CLASS =\n \"not-prose box-border inline-flex h-5 items-center gap-1.5 whitespace-nowrap rounded-md border border-border bg-muted px-1 py-0.5 align-middle font-normal leading-none text-foreground no-underline\";\n/** A chip that opens something. */\nexport const CHIP_LINK_CLASS =\n \"cursor-pointer transition-colors hover:bg-accent hover:text-accent-foreground hover:no-underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-1\";\nexport const CHIP_ICON_CLASS = \"size-4 shrink-0\";\n\n// ── Inline screen-point chip ──\n\n/**\n * Renders an `athena-point://` link as a non-navigating coordinate chip.\n * Surfaces without screenshot context (extension side panel, SDK consumers)\n * get the label plus the coordinates; malformed points fall back to text.\n */\nexport const ScreenPointChip: FC<{\n href: string;\n children?: ReactNode;\n}> = ({ href, children }) => {\n const parsed = parseScreenPointHref(href);\n if (!parsed.ok) {\n return <span>{children}</span>;\n }\n const description = formatScreenPoint(parsed.point);\n return (\n <span\n className={cn(CHIP_PILL_CLASS, \"max-w-[260px]\")}\n title={description}\n aria-label={description}\n data-screen-point=\"valid\"\n >\n <CrosshairIcon className={CHIP_ICON_CLASS} aria-hidden=\"true\" />\n <span className=\"min-w-0 max-w-[180px] overflow-hidden text-ellipsis\">\n {children}\n </span>\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {parsed.point.x}, {parsed.point.y}\n </span>\n </span>\n );\n};\n\n// ── Inline mention chip ──\n\nexport const MentionChip: FC<{\n name: string;\n type?: string;\n assetIds?: string[];\n /** The asset's type (`document`, `catalog`, …): picks the icon until (or unless) the asset is looked up. */\n assetType?: string;\n /** Where in the asset the link points: its label follows the name. */\n citation?: MentionChipCitation;\n personEmail?: string;\n thumbnailUrl?: string;\n sourceHref?: string;\n interactive?: boolean;\n}> = ({\n name,\n type,\n assetIds,\n assetType,\n citation,\n personEmail,\n thumbnailUrl,\n sourceHref,\n interactive = true,\n}) => {\n const auth = useContext(MentionAuthCtx);\n const memberAvatarUrl = useMemberAvatarUrl(personEmail);\n const [erroredAvatarUrl, setErroredAvatarUrl] = useState<string>();\n const excerpt = sourceHref ? readSourceExcerpt(sourceHref) : null;\n // A repository file's lines read as the file (`route.ts:18-24`): the chip\n // opens that file, and every citation in a reply names the same repository,\n // whatever label the model wrote.\n const repositoryFile =\n citation?.anchorType === \"file_line_range\"\n ? { ...splitFileLines(citation.label), label: citation.label }\n : null;\n // The asset as agora has it, read the way Olympus's chips read it: its own\n // title and type. Until it answers, and for an asset the viewer cannot read,\n // the link's label and `type=` stand in. Asked only where it changes the\n // chip: a repository file reads as its file whatever the catalog is called,\n // and a session's row is too heavy to read for a name.\n const asset = useMentionAsset(\n type === \"asset\" &&\n assetIds?.length === 1 &&\n !repositoryFile &&\n !isSessionLink(assetType, citation)\n ? assetIds[0]\n : undefined,\n );\n const assetTitle = asset?.title || null;\n const chipName = repositoryFile?.label ?? assetTitle ?? name;\n // The place follows a name that does not already say it, as `[p.5]`.\n const placeLabel =\n citation && !repositoryFile && !restatesPlace(chipName, citation)\n ? citation.label\n : null;\n // The tooltip: what the model called it (when the chip does not show it),\n // the repository a file is in and the file's whole path, the cited passage.\n // The place spelled out stands in for a passage the citation does not carry,\n // and for a place too long to show whole (a long sheet name).\n const tooltip =\n citation || excerpt\n ? tooltipText({\n lines: [\n informativeLabel({ label: name, shown: [chipName, assetTitle], citation }),\n repositoryFile ? assetTitle : null,\n repositoryFile || !excerpt || (placeLabel?.length ?? 0) > PLACE_FITS_CHARS\n ? citation?.description\n : null,\n ],\n excerpt,\n })\n : null;\n const assetRootHref =\n type === \"asset\" && assetIds?.length\n ? createOlympusAssetUrl({\n appUrl: auth?.appUrl,\n backendUrl: auth?.backendUrl,\n assetIds,\n })\n : null;\n const href = (() => {\n if (!assetRootHref || !sourceHref) return assetRootHref;\n try {\n const source = new URL(sourceHref, \"https://app.athenaintel.com\");\n const destination = new URL(assetRootHref);\n for (const [key, value] of source.searchParams) {\n destination.searchParams.set(key, value);\n }\n destination.searchParams.set(\"asset_ids\", assetIds?.join(\",\") ?? \"\");\n return destination.toString();\n } catch {\n return assetRootHref;\n }\n })();\n const className = cn(CHIP_PILL_CLASS, \"max-w-[275px]\", href && CHIP_LINK_CLASS);\n // A host's asset-type SVG follows the looked-up type, when it serves them.\n const chipThumbnailUrl = repositoryFile\n ? undefined\n : (asset?.assetType && assetTypeToThumb(asset.assetType)) || thumbnailUrl;\n const AssetIcon = assetChipIcon(asset?.assetType || assetType);\n const contents = (\n <>\n {repositoryFile ? (\n <GitHubMarkIcon className={CHIP_ICON_CLASS} />\n ) : chipThumbnailUrl ? (\n <img\n src={chipThumbnailUrl}\n alt=\"\"\n className={CHIP_ICON_CLASS}\n draggable={false}\n />\n ) : type === \"asset\" || type === \"folder\" ? (\n // A host that bundles no asset-type SVGs (computer apps, most SDK\n // apps) still gets the type's icon.\n <AssetIcon className={CHIP_ICON_CLASS} aria-hidden=\"true\" />\n ) : type === \"webpage\" ? (\n <Globe2Icon className={CHIP_ICON_CLASS} aria-hidden=\"true\" />\n ) : type === \"person\" ? (\n memberAvatarUrl && erroredAvatarUrl !== memberAvatarUrl ? (\n <img\n src={memberAvatarUrl}\n alt=\"\"\n className={cn(CHIP_ICON_CLASS, \"rounded-full object-cover\")}\n draggable={false}\n onError={() => setErroredAvatarUrl(memberAvatarUrl)}\n />\n ) : (\n <UserIcon className={CHIP_ICON_CLASS} aria-hidden=\"true\" />\n )\n ) : null}\n {repositoryFile ? (\n <span\n className=\"flex min-w-0 items-center\"\n data-citation-anchor=\"file_line_range\"\n >\n <span className=\"min-w-0 overflow-hidden text-ellipsis\">\n {repositoryFile.file}\n </span>\n <span className=\"shrink-0 text-muted-foreground\">{repositoryFile.lines}</span>\n </span>\n ) : (\n <span\n className={cn(\n \"max-w-[180px] overflow-hidden text-ellipsis\",\n // A long place may shorten the name, never make it vanish.\n placeLabel && \"min-w-8\",\n )}\n >\n {chipName}\n </span>\n )}\n {citation && placeLabel && (\n <>\n {/* Copied or read as text, the place stays a word apart from the name; a flex row draws no space. */}{\" \"}\n <span\n className=\"flex min-w-0 items-center text-xs text-muted-foreground\"\n data-citation-anchor={citation.anchorType}\n >\n [<span className=\"min-w-0 overflow-hidden text-ellipsis\">{placeLabel}</span>]\n </span>\n </>\n )}\n </>\n );\n\n if (href && interactive) {\n const speakablePlace = citation && SPEAKABLE.test(citation.description);\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={className}\n aria-label={\n repositoryFile && citation\n ? `Open ${citation.description} in Spaces`\n : placeLabel && citation && speakablePlace\n ? `Open ${chipName} at ${citation.description} in Spaces`\n : `Open ${chipName} in Spaces`\n }\n title={tooltip ?? `Open ${chipName} in Spaces`}\n data-excerpt={excerpt ?? undefined}\n // The asset without its place: what a click names the opened asset.\n data-mention-name={repositoryFile ? (assetTitle ?? name) : chipName}\n >\n {contents}\n </a>\n );\n }\n\n return (\n <span\n className={className}\n title={tooltip ?? undefined}\n data-excerpt={excerpt ?? undefined}\n >\n {contents}\n </span>\n );\n};\n\n/**\n * A chip's tooltip: the lines that say something, each once, then the cited\n * passage, quoted when it shares the tooltip with other lines.\n */\nfunction tooltipText({\n lines,\n excerpt,\n}: {\n lines: readonly (string | null | undefined)[];\n excerpt: string | null;\n}): string | null {\n const kept: string[] = [];\n for (const line of lines) {\n const trimmed = line?.trim();\n if (trimmed && !kept.includes(trimmed)) kept.push(trimmed);\n }\n if (excerpt) kept.push(kept.length ? `“${excerpt}”` : excerpt);\n return kept.length ? kept.join(\"\\n\") : null;\n}\n\n/** The `excerpt` a Spaces citation URL carries, or null. */\nfunction readSourceExcerpt(href: string): string | null {\n try {\n const excerpt = new URL(href, \"https://app.athenaintel.com\").searchParams\n .get(\"excerpt\")\n ?.trim();\n return excerpt ? excerpt : null;\n } catch {\n return null;\n }\n}\n\n/**\n * The label an asset citation chip falls back to when the model wrote none\n * (`[](…/spaces/?asset_ids=…&page=5)`): the cited location, else \"Asset\" — a\n * chip must never render as an empty box.\n */\nfunction citationFallbackLabel(params: URLSearchParams): string {\n const start = params.get(\"start_page\") ?? params.get(\"page\");\n const end = params.get(\"end_page\");\n if (start && end && end !== start) return `Pages ${start}–${end}`;\n if (start) return `Page ${start}`;\n return \"Asset\";\n}\n\n// ── Parse mention:// URLs ──\n\nexport function parseMentionUrl(url: string): {\n type: string;\n name: string;\n id: string;\n email?: string;\n assetIds?: string[];\n assetType?: string;\n citation?: MentionChipCitation;\n /**\n * For a `mention://asset` citation, the Spaces link to its place (anchor and\n * excerpt), so the chip opens there; a Spaces mention is its own link.\n */\n sourceHref?: string;\n thumbnailUrl?: string;\n} {\n try {\n if (isSpacesMentionUrl(url)) {\n const parsed = new URL(url, \"https://app.athenaintel.com\");\n const assetIds = (parsed.searchParams.get(\"asset_ids\") ?? \"\")\n .split(\",\")\n .map((id) => id.trim())\n .filter(Boolean);\n const id = assetIds[0] ?? \"\";\n const assetType = getSpacesAssetType(parsed);\n // A link to several assets names no one place in any of them.\n const reference =\n assetIds.length === 1\n ? decodeAssetLink(parsed, decodeFromAssetSpacesUrl)\n : null;\n const citation = reference ? citationOf(reference) : undefined;\n return {\n type: \"asset\",\n name:\n assetIds.length > 1\n ? `${assetIds.length} assets`\n : (citation?.description ??\n citationFallbackLabel(parsed.searchParams)),\n id,\n assetIds,\n assetType: assetType ?? undefined,\n citation,\n thumbnailUrl: assetTypeToThumb(assetType),\n };\n }\n // mention://tool?name=...&description=...\n // mention://asset?id=...&assetType=project&thumb=../icons/files/ic-project.svg\n const u = new URL(url);\n const type = u.hostname || u.pathname.replace(/^\\/\\//, \"\").split(\"?\")[0];\n const isWebpage = type === \"webpage\";\n const id = isWebpage\n ? u.searchParams.get(\"tab_id\") || \"\"\n : u.searchParams.get(\"id\") || u.searchParams.get(\"name\") || \"\";\n const name = isWebpage\n ? u.searchParams.get(\"title\") || \"This webpage\"\n : u.searchParams.get(\"name\") || id;\n\n // Get thumbnail: prefer explicit thumb param, then derive from assetType\n let thumbnailUrl = u.searchParams.get(\"thumb\") || undefined;\n if (!thumbnailUrl) {\n const assetType = u.searchParams.get(\"assetType\");\n if (assetType) {\n thumbnailUrl = assetTypeToThumb(assetType);\n } else if (type === \"asset\" || type === \"folder\") {\n thumbnailUrl = assetTypeToThumb(type === \"folder\" ? \"folder\" : null);\n }\n }\n\n const reference =\n type === \"asset\" ? decodeAssetLink(u, decodeFromAssetMentionUri) : null;\n\n return {\n type,\n name,\n id,\n email: type === \"person\" ? u.searchParams.get(\"email\") || undefined : undefined,\n assetIds: type === \"asset\" && id ? [id] : undefined,\n assetType:\n type === \"asset\" || type === \"folder\"\n ? u.searchParams.get(\"assetType\") ||\n reference?.meta?.assetType ||\n (type === \"folder\" ? \"folder\" : undefined)\n : undefined,\n citation: reference ? citationOf(reference) : undefined,\n sourceHref:\n reference && (reference.anchor || reference.meta?.excerpt)\n ? encodeToAssetSpacesUrl(reference)\n : undefined,\n thumbnailUrl,\n };\n } catch {\n return { type: \"unknown\", name: \"\", id: \"\" };\n }\n}\n\nfunction htmlAttribute(attributes: string, name: string): string | null {\n const escapedName = name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const match = new RegExp(\n `(?:^|\\\\s)${escapedName}\\\\s*=\\\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\\\s>]+))`,\n \"i\",\n ).exec(attributes);\n return match?.[1] ?? match?.[2] ?? match?.[3] ?? null;\n}\n\nfunction decodeHtmlAttribute(value: string): string {\n return value\n .replace(/&amp;/gi, \"&\")\n .replace(/&quot;/gi, '\"')\n .replace(/&#39;|&apos;/gi, \"'\")\n .replace(/&lt;/gi, \"<\")\n .replace(/&gt;/gi, \">\");\n}\n\n/** Turn complete model-emitted URL citation anchors into safe Markdown links. */\nexport function normalizeAthenaMentionHtml(text: string): string {\n return text.replace(\n /<a\\b([^>]*)>([\\s\\S]*?)<\\/a>/gi,\n (original, attributes: string, rawLabel: string) => {\n const className = htmlAttribute(attributes, \"class\") ?? \"\";\n const type = htmlAttribute(attributes, \"data-type\") ?? \"\";\n if (!className.split(/\\s+/).includes(\"mention\") || type !== \"url\") {\n return original;\n }\n\n const rawUrl =\n htmlAttribute(attributes, \"data-url\") ??\n htmlAttribute(attributes, \"href\");\n if (!rawUrl) return original;\n const url = decodeHtmlAttribute(rawUrl);\n let normalizedUrl: string;\n try {\n const parsed = new URL(url);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n return original;\n }\n normalizedUrl = parsed.toString();\n } catch {\n return original;\n }\n\n const label = decodeHtmlAttribute(rawLabel.replace(/<[^>]*>/g, \"\"))\n .trim()\n .replace(/([\\\\[\\]])/g, \"\\\\$1\");\n return label ? `[${label}](<${normalizedUrl}>)` : original;\n },\n );\n}\n// ── Parse mention markdown in plain text ──\n\n// The label may hold balanced brackets one level deep (`[@Plan [Q3]](…)`) or a lone `[`.\nconst MENTION_RE =\n /\\[@((?:\\[[^[\\]]*\\](?!\\((?:[a-z][a-z0-9+.-]*:\\/\\/|\\/))|[^\\]])*)\\]\\(((?:mention:\\/\\/|(?:https?:\\/\\/[^)\\s]+)?\\/dashboard\\/spaces\\/?\\?)[^)]+)\\)/g;\n\n/**\n * Parse text containing [@name](mention://...) patterns into\n * an array of string segments and MentionChip elements.\n */\nexport function parseMentionsInText(text: string): (string | ReactElement)[] {\n const parts: (string | ReactElement)[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n MENTION_RE.lastIndex = 0;\n\n while ((match = MENTION_RE.exec(text)) !== null) {\n if (match.index > lastIndex) {\n parts.push(text.slice(lastIndex, match.index));\n }\n\n const name = match[1];\n const url = match[2];\n const parsed = parseMentionUrl(url);\n\n parts.push(\n <MentionChip\n key={`mention-${match.index}`}\n name={name || parsed.name}\n type={parsed.type}\n personEmail={personEmailForMention(parsed)}\n assetIds={parsed.assetIds}\n assetType={parsed.assetType}\n citation={parsed.citation}\n thumbnailUrl={parsed.thumbnailUrl}\n sourceHref={isSpacesMentionUrl(url) ? url : parsed.sourceHref}\n />\n );\n\n lastIndex = match.index + match[0].length;\n }\n\n if (lastIndex < text.length) {\n parts.push(text.slice(lastIndex));\n }\n\n return parts.length > 0 ? parts : [text];\n}\n\n/** The text as a reader sees it: each `[@name](…)` mention becomes `@name`. */\nexport function mentionsToPlainText(text: string): string {\n return text.replace(MENTION_RE, (_match, name: string, url: string) => {\n return `@${name || parseMentionUrl(url).name}`;\n });\n}\n"],"names":["formatReferenceAnchor","FileTextIcon","SheetIcon","PresentationIcon","ImageIcon","VideoIcon","HeadphonesIcon","MailIcon","FileCodeIcon","DatabaseIcon","FolderIcon","MessageSquareIcon","MonitorIcon","Globe2Icon","FileIcon","jsx","isValidElement","isScreenPointHref","parseScreenPointHref","formatScreenPoint","jsxs","cn","CrosshairIcon","useContext","MentionAuthCtx","useMemberAvatarUrl","useState","useMentionAsset","createOlympusAssetUrl","assetTypeToThumb","Fragment","UserIcon","id","reference","decodeFromAssetSpacesUrl","decodeFromAssetMentionUri","encodeToAssetSpacesUrl"],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const reactStore = require("@tanstack/react-store");
5
- const react = require("react");
5
+ const require$$0 = require("react");
6
6
  const useMenuItems = require("../data/use-menu-items.cjs");
7
7
  const scopeRegistry = require("../data/scope-registry.cjs");
8
8
  const getScopeName = require("./get-scope-name.cjs");
@@ -11,8 +11,8 @@ const menuSummary = require("./menu-summary.cjs");
11
11
  const useKeyboardNavigation = require("./use-keyboard-navigation.cjs");
12
12
  const useMenuNavigation = require("./use-menu-navigation.cjs");
13
13
  const utils = require("./utils.cjs");
14
- const MentionSuggestionList = react.forwardRef(({ store, editor, query, command, closeMenu }, ref) => {
15
- const [selectedIndexOverride, setSelectedIndexOverride] = react.useState(null);
14
+ const MentionSuggestionList = require$$0.forwardRef(({ store, editor, query, command, closeMenu }, ref) => {
15
+ const [selectedIndexOverride, setSelectedIndexOverride] = require$$0.useState(null);
16
16
  const navStore = useMenuNavigation.useMenuNavigation();
17
17
  const currentScopeId = reactStore.useStore(navStore, (s) => useMenuNavigation.getCurrentScope(s));
18
18
  const navSelectedIndex = reactStore.useStore(navStore, (s) => useMenuNavigation.getSelectedIndex(s));
@@ -28,20 +28,20 @@ const MentionSuggestionList = react.forwardRef(({ store, editor, query, command,
28
28
  } catch {
29
29
  }
30
30
  }
31
- const { items, isFetching, hasMore, loadMore } = useMenuItems.useMenuItems(store, {
31
+ const { items, isFetching, hasMore, unavailable, loadMore } = useMenuItems.useMenuItems(store, {
32
32
  scope: effectiveScopeId,
33
33
  query,
34
34
  minItems: 50,
35
35
  parentScope: currentScopeId !== effectiveScopeId ? currentScopeId : void 0
36
36
  });
37
- react.useEffect(() => {
37
+ require$$0.useEffect(() => {
38
38
  setSelectedIndexOverride(null);
39
39
  }, [query, effectiveScopeId]);
40
40
  const scopePath = scopeStack.map((entry) => ({
41
41
  id: entry.scope,
42
42
  name: entry.breadcrumbLabel ?? getScopeName.getScopeName(entry.scope, store)
43
43
  }));
44
- const handleSelect = react.useCallback(
44
+ const handleSelect = require$$0.useCallback(
45
45
  (item) => {
46
46
  if (item.navigatesToScope) {
47
47
  navStore.navigateTo(item.navigatesToScope, selectedIndex, {
@@ -56,12 +56,12 @@ const MentionSuggestionList = react.forwardRef(({ store, editor, query, command,
56
56
  },
57
57
  [command, editor, navStore, selectedIndex, currentScopeId]
58
58
  );
59
- const handleBack = react.useCallback(() => {
59
+ const handleBack = require$$0.useCallback(() => {
60
60
  navStore.navigateBack();
61
61
  utils.clearTextAfterTrigger(editor);
62
62
  setSelectedIndexOverride(null);
63
63
  }, [editor, navStore]);
64
- const handleBreadcrumbNavigate = react.useCallback(
64
+ const handleBreadcrumbNavigate = require$$0.useCallback(
65
65
  (targetScopeId) => {
66
66
  const targetIdx = scopeStack.findIndex((entry) => entry.scope === targetScopeId);
67
67
  if (targetIdx >= 0) {
@@ -93,6 +93,7 @@ const MentionSuggestionList = react.forwardRef(({ store, editor, query, command,
93
93
  selectedIndex,
94
94
  isLoading: isFetching,
95
95
  hasMore,
96
+ unavailable,
96
97
  onSelect: handleSelect,
97
98
  onMouseMove: (idx) => {
98
99
  setSelectedIndexOverride(idx);
@@ -106,7 +107,7 @@ const MentionSuggestionList = react.forwardRef(({ store, editor, query, command,
106
107
  scopePath,
107
108
  onNavigate: handleBreadcrumbNavigate,
108
109
  onBackClick: currentScopeId !== "root" ? handleBack : void 0,
109
- isFetching
110
+ isFetching: isFetching && unavailable === null
110
111
  }
111
112
  )
112
113
  ] });
@@ -1 +1 @@
1
- {"version":3,"file":"mention-suggestion-list.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/mention-suggestion-list.tsx"],"sourcesContent":["/**\n * MentionSuggestionList — Main mention menu component.\n *\n * Composed of:\n * - Registry + cache backed data (async fetching)\n * - useMenuNavigation for scope stack management\n * - useKeyboardNavigation for keyboard handling\n * - MenuList for item rendering with loading states\n * - MenuSummary for breadcrumbs + back\n */\n\nimport { useStore } from \"@tanstack/react-store\";\nimport type { Editor } from \"@tiptap/core\";\nimport { forwardRef, useCallback, useEffect, useState } from \"react\";\nimport type { MenuItem } from \"../data/types\";\nimport type { MentionSuggestionsStore } from \"../data/use-mention-suggestions\";\nimport { useMenuItems } from \"../data/use-menu-items\";\nimport { getSearchScope } from \"../data/scope-registry\";\nimport { getScopeName } from \"./get-scope-name\";\nimport { MenuList } from \"./menu-list\";\nimport { MenuSummary } from \"./menu-summary\";\nimport { useKeyboardNavigation, type KeyboardNavigationHandle } from \"./use-keyboard-navigation\";\nimport {\n getCurrentScope,\n getSelectedIndex,\n useMenuNavigation,\n} from \"./use-menu-navigation\";\nimport { clearTextAfterTrigger } from \"./utils\";\n\nexport interface MentionSuggestionListProps {\n store: MentionSuggestionsStore;\n editor: Editor;\n query: string;\n command: (item: MenuItem) => void;\n closeMenu: (dismissedByUser?: boolean) => void;\n}\n\nexport const MentionSuggestionList = forwardRef<\n KeyboardNavigationHandle,\n MentionSuggestionListProps\n>(({ store, editor, query, command, closeMenu }, ref) => {\n const [selectedIndexOverride, setSelectedIndexOverride] = useState<number | null>(null);\n const navStore = useMenuNavigation();\n\n // Get current scope from navigation\n const currentScopeId = useStore(navStore, (s) => getCurrentScope(s));\n const navSelectedIndex = useStore(navStore, (s) => getSelectedIndex(s));\n const selectedIndex = selectedIndexOverride ?? navSelectedIndex;\n const scopeStack = useStore(navStore, (s) => s.scopeStack);\n\n let effectiveScopeId = currentScopeId;\n\n if (query) {\n try {\n const searchScope = getSearchScope(store.state.registry, currentScopeId);\n if (searchScope) {\n effectiveScopeId = searchScope;\n }\n } catch {\n // No search scope binding — use current\n }\n }\n\n // Get items from the data store (reactive, with async fetching)\n const { items, isFetching, hasMore, loadMore } = useMenuItems(store, {\n scope: effectiveScopeId,\n query,\n minItems: 50,\n parentScope: currentScopeId !== effectiveScopeId ? currentScopeId : undefined,\n });\n\n // Reset selection on query or scope change\n useEffect(() => {\n setSelectedIndexOverride(null);\n }, [query, effectiveScopeId]);\n\n // Build scope path for breadcrumbs from the navigation stack\n const scopePath = scopeStack.map((entry) => ({\n id: entry.scope,\n name: entry.breadcrumbLabel ?? getScopeName(entry.scope, store),\n }));\n\n // Handle item selection\n const handleSelect = useCallback(\n (item: MenuItem) => {\n if (item.navigatesToScope) {\n navStore.navigateTo(item.navigatesToScope, selectedIndex, {\n breadcrumbLabel: item.name,\n parentScope: currentScopeId,\n });\n clearTextAfterTrigger(editor);\n setSelectedIndexOverride(null);\n return;\n }\n // Insert mention\n command(item);\n },\n [command, editor, navStore, selectedIndex, currentScopeId],\n );\n\n // Handle back navigation\n const handleBack = useCallback(() => {\n navStore.navigateBack();\n clearTextAfterTrigger(editor);\n setSelectedIndexOverride(null);\n }, [editor, navStore]);\n\n // Handle breadcrumb navigation\n const handleBreadcrumbNavigate = useCallback(\n (targetScopeId: string) => {\n // Navigate to specific scope in the stack\n const targetIdx = scopeStack.findIndex((entry) => entry.scope === targetScopeId);\n\n if (targetIdx >= 0) {\n // Pop stack down to the target\n const popsNeeded = scopeStack.length - 1 - targetIdx;\n for (let i = 0; i < popsNeeded; i++) {\n navStore.navigateBack();\n }\n clearTextAfterTrigger(editor);\n setSelectedIndexOverride(null);\n }\n },\n [editor, navStore, scopeStack],\n );\n\n // Keyboard navigation\n useKeyboardNavigation(ref, {\n items,\n selectedIndex,\n onSelect: handleSelect,\n onBack: currentScopeId !== \"root\" ? handleBack : undefined,\n onClose: () => closeMenu(true),\n setSelectedIndex: (idx: number) => {\n setSelectedIndexOverride(idx);\n },\n });\n\n return (\n <div className=\"bg-white border border-gray-300 rounded shadow-lg min-w-[280px] max-w-[380px] max-h-[320px] flex flex-col\">\n {/* Scrollable items */}\n <div className=\"flex-1 overflow-y-auto\">\n <MenuList\n items={items}\n selectedIndex={selectedIndex}\n isLoading={isFetching}\n hasMore={hasMore}\n onSelect={handleSelect}\n onMouseMove={(idx) => {\n setSelectedIndexOverride(idx);\n }}\n onLoadMore={loadMore}\n />\n </div>\n\n {/* Bottom summary with breadcrumbs + back */}\n <MenuSummary\n scopePath={scopePath}\n onNavigate={handleBreadcrumbNavigate}\n onBackClick={currentScopeId !== \"root\" ? handleBack : undefined}\n isFetching={isFetching}\n />\n </div>\n );\n});\n\nMentionSuggestionList.displayName = \"MentionSuggestionList\";\n"],"names":["forwardRef","useState","useMenuNavigation","useStore","getCurrentScope","getSelectedIndex","getSearchScope","useMenuItems","useEffect","getScopeName","useCallback","clearTextAfterTrigger","useKeyboardNavigation","jsxs","jsx","MenuList","MenuSummary"],"mappings":"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"}
1
+ {"version":3,"file":"mention-suggestion-list.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/mention-suggestion-list.tsx"],"sourcesContent":["/**\n * MentionSuggestionList — Main mention menu component.\n *\n * Composed of:\n * - Registry + cache backed data (async fetching)\n * - useMenuNavigation for scope stack management\n * - useKeyboardNavigation for keyboard handling\n * - MenuList for item rendering with loading states\n * - MenuSummary for breadcrumbs + back\n */\n\nimport { useStore } from \"@tanstack/react-store\";\nimport type { Editor } from \"@tiptap/core\";\nimport { forwardRef, useCallback, useEffect, useState } from \"react\";\nimport type { MenuItem } from \"../data/types\";\nimport type { MentionSuggestionsStore } from \"../data/use-mention-suggestions\";\nimport { useMenuItems } from \"../data/use-menu-items\";\nimport { getSearchScope } from \"../data/scope-registry\";\nimport { getScopeName } from \"./get-scope-name\";\nimport { MenuList } from \"./menu-list\";\nimport { MenuSummary } from \"./menu-summary\";\nimport { useKeyboardNavigation, type KeyboardNavigationHandle } from \"./use-keyboard-navigation\";\nimport {\n getCurrentScope,\n getSelectedIndex,\n useMenuNavigation,\n} from \"./use-menu-navigation\";\nimport { clearTextAfterTrigger } from \"./utils\";\n\nexport interface MentionSuggestionListProps {\n store: MentionSuggestionsStore;\n editor: Editor;\n query: string;\n command: (item: MenuItem) => void;\n closeMenu: (dismissedByUser?: boolean) => void;\n}\n\nexport const MentionSuggestionList = forwardRef<\n KeyboardNavigationHandle,\n MentionSuggestionListProps\n>(({ store, editor, query, command, closeMenu }, ref) => {\n const [selectedIndexOverride, setSelectedIndexOverride] = useState<number | null>(null);\n const navStore = useMenuNavigation();\n\n // Get current scope from navigation\n const currentScopeId = useStore(navStore, (s) => getCurrentScope(s));\n const navSelectedIndex = useStore(navStore, (s) => getSelectedIndex(s));\n const selectedIndex = selectedIndexOverride ?? navSelectedIndex;\n const scopeStack = useStore(navStore, (s) => s.scopeStack);\n\n let effectiveScopeId = currentScopeId;\n\n if (query) {\n try {\n const searchScope = getSearchScope(store.state.registry, currentScopeId);\n if (searchScope) {\n effectiveScopeId = searchScope;\n }\n } catch {\n // No search scope binding — use current\n }\n }\n\n // Get items from the data store (reactive, with async fetching)\n const { items, isFetching, hasMore, unavailable, loadMore } = useMenuItems(store, {\n scope: effectiveScopeId,\n query,\n minItems: 50,\n parentScope: currentScopeId !== effectiveScopeId ? currentScopeId : undefined,\n });\n\n // Reset selection on query or scope change\n useEffect(() => {\n setSelectedIndexOverride(null);\n }, [query, effectiveScopeId]);\n\n // Build scope path for breadcrumbs from the navigation stack\n const scopePath = scopeStack.map((entry) => ({\n id: entry.scope,\n name: entry.breadcrumbLabel ?? getScopeName(entry.scope, store),\n }));\n\n // Handle item selection\n const handleSelect = useCallback(\n (item: MenuItem) => {\n if (item.navigatesToScope) {\n navStore.navigateTo(item.navigatesToScope, selectedIndex, {\n breadcrumbLabel: item.name,\n parentScope: currentScopeId,\n });\n clearTextAfterTrigger(editor);\n setSelectedIndexOverride(null);\n return;\n }\n // Insert mention\n command(item);\n },\n [command, editor, navStore, selectedIndex, currentScopeId],\n );\n\n // Handle back navigation\n const handleBack = useCallback(() => {\n navStore.navigateBack();\n clearTextAfterTrigger(editor);\n setSelectedIndexOverride(null);\n }, [editor, navStore]);\n\n // Handle breadcrumb navigation\n const handleBreadcrumbNavigate = useCallback(\n (targetScopeId: string) => {\n // Navigate to specific scope in the stack\n const targetIdx = scopeStack.findIndex((entry) => entry.scope === targetScopeId);\n\n if (targetIdx >= 0) {\n // Pop stack down to the target\n const popsNeeded = scopeStack.length - 1 - targetIdx;\n for (let i = 0; i < popsNeeded; i++) {\n navStore.navigateBack();\n }\n clearTextAfterTrigger(editor);\n setSelectedIndexOverride(null);\n }\n },\n [editor, navStore, scopeStack],\n );\n\n // Keyboard navigation\n useKeyboardNavigation(ref, {\n items,\n selectedIndex,\n onSelect: handleSelect,\n onBack: currentScopeId !== \"root\" ? handleBack : undefined,\n onClose: () => closeMenu(true),\n setSelectedIndex: (idx: number) => {\n setSelectedIndexOverride(idx);\n },\n });\n\n return (\n <div className=\"bg-white border border-gray-300 rounded shadow-lg min-w-[280px] max-w-[380px] max-h-[320px] flex flex-col\">\n {/* Scrollable items */}\n <div className=\"flex-1 overflow-y-auto\">\n <MenuList\n items={items}\n selectedIndex={selectedIndex}\n isLoading={isFetching}\n hasMore={hasMore}\n unavailable={unavailable}\n onSelect={handleSelect}\n onMouseMove={(idx) => {\n setSelectedIndexOverride(idx);\n }}\n onLoadMore={loadMore}\n />\n </div>\n\n {/* Bottom summary with breadcrumbs + back */}\n <MenuSummary\n scopePath={scopePath}\n onNavigate={handleBreadcrumbNavigate}\n onBackClick={currentScopeId !== \"root\" ? handleBack : undefined}\n isFetching={isFetching && unavailable === null}\n />\n </div>\n );\n});\n\nMentionSuggestionList.displayName = \"MentionSuggestionList\";\n"],"names":["forwardRef","useState","useMenuNavigation","useStore","getCurrentScope","getSelectedIndex","getSearchScope","useMenuItems","useEffect","getScopeName","useCallback","clearTextAfterTrigger","useKeyboardNavigation","jsxs","jsx","MenuList","MenuSummary"],"mappings":"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"}
@@ -26,7 +26,7 @@ const MentionSuggestionList = forwardRef(({ store, editor, query, command, close
26
26
  } catch {
27
27
  }
28
28
  }
29
- const { items, isFetching, hasMore, loadMore } = useMenuItems(store, {
29
+ const { items, isFetching, hasMore, unavailable, loadMore } = useMenuItems(store, {
30
30
  scope: effectiveScopeId,
31
31
  query,
32
32
  minItems: 50,
@@ -91,6 +91,7 @@ const MentionSuggestionList = forwardRef(({ store, editor, query, command, close
91
91
  selectedIndex,
92
92
  isLoading: isFetching,
93
93
  hasMore,
94
+ unavailable,
94
95
  onSelect: handleSelect,
95
96
  onMouseMove: (idx) => {
96
97
  setSelectedIndexOverride(idx);
@@ -104,7 +105,7 @@ const MentionSuggestionList = forwardRef(({ store, editor, query, command, close
104
105
  scopePath,
105
106
  onNavigate: handleBreadcrumbNavigate,
106
107
  onBackClick: currentScopeId !== "root" ? handleBack : void 0,
107
- isFetching
108
+ isFetching: isFetching && unavailable === null
108
109
  }
109
110
  )
110
111
  ] });
@@ -1 +1 @@
1
- {"version":3,"file":"mention-suggestion-list.js","sources":["../../../../../src/chat-ui/mentions/suggestions/components/mention-suggestion-list.tsx"],"sourcesContent":["/**\n * MentionSuggestionList — Main mention menu component.\n *\n * Composed of:\n * - Registry + cache backed data (async fetching)\n * - useMenuNavigation for scope stack management\n * - useKeyboardNavigation for keyboard handling\n * - MenuList for item rendering with loading states\n * - MenuSummary for breadcrumbs + back\n */\n\nimport { useStore } from \"@tanstack/react-store\";\nimport type { Editor } from \"@tiptap/core\";\nimport { forwardRef, useCallback, useEffect, useState } from \"react\";\nimport type { MenuItem } from \"../data/types\";\nimport type { MentionSuggestionsStore } from \"../data/use-mention-suggestions\";\nimport { useMenuItems } from \"../data/use-menu-items\";\nimport { getSearchScope } from \"../data/scope-registry\";\nimport { getScopeName } from \"./get-scope-name\";\nimport { MenuList } from \"./menu-list\";\nimport { MenuSummary } from \"./menu-summary\";\nimport { useKeyboardNavigation, type KeyboardNavigationHandle } from \"./use-keyboard-navigation\";\nimport {\n getCurrentScope,\n getSelectedIndex,\n useMenuNavigation,\n} from \"./use-menu-navigation\";\nimport { clearTextAfterTrigger } from \"./utils\";\n\nexport interface MentionSuggestionListProps {\n store: MentionSuggestionsStore;\n editor: Editor;\n query: string;\n command: (item: MenuItem) => void;\n closeMenu: (dismissedByUser?: boolean) => void;\n}\n\nexport const MentionSuggestionList = forwardRef<\n KeyboardNavigationHandle,\n MentionSuggestionListProps\n>(({ store, editor, query, command, closeMenu }, ref) => {\n const [selectedIndexOverride, setSelectedIndexOverride] = useState<number | null>(null);\n const navStore = useMenuNavigation();\n\n // Get current scope from navigation\n const currentScopeId = useStore(navStore, (s) => getCurrentScope(s));\n const navSelectedIndex = useStore(navStore, (s) => getSelectedIndex(s));\n const selectedIndex = selectedIndexOverride ?? navSelectedIndex;\n const scopeStack = useStore(navStore, (s) => s.scopeStack);\n\n let effectiveScopeId = currentScopeId;\n\n if (query) {\n try {\n const searchScope = getSearchScope(store.state.registry, currentScopeId);\n if (searchScope) {\n effectiveScopeId = searchScope;\n }\n } catch {\n // No search scope binding — use current\n }\n }\n\n // Get items from the data store (reactive, with async fetching)\n const { items, isFetching, hasMore, loadMore } = useMenuItems(store, {\n scope: effectiveScopeId,\n query,\n minItems: 50,\n parentScope: currentScopeId !== effectiveScopeId ? currentScopeId : undefined,\n });\n\n // Reset selection on query or scope change\n useEffect(() => {\n setSelectedIndexOverride(null);\n }, [query, effectiveScopeId]);\n\n // Build scope path for breadcrumbs from the navigation stack\n const scopePath = scopeStack.map((entry) => ({\n id: entry.scope,\n name: entry.breadcrumbLabel ?? getScopeName(entry.scope, store),\n }));\n\n // Handle item selection\n const handleSelect = useCallback(\n (item: MenuItem) => {\n if (item.navigatesToScope) {\n navStore.navigateTo(item.navigatesToScope, selectedIndex, {\n breadcrumbLabel: item.name,\n parentScope: currentScopeId,\n });\n clearTextAfterTrigger(editor);\n setSelectedIndexOverride(null);\n return;\n }\n // Insert mention\n command(item);\n },\n [command, editor, navStore, selectedIndex, currentScopeId],\n );\n\n // Handle back navigation\n const handleBack = useCallback(() => {\n navStore.navigateBack();\n clearTextAfterTrigger(editor);\n setSelectedIndexOverride(null);\n }, [editor, navStore]);\n\n // Handle breadcrumb navigation\n const handleBreadcrumbNavigate = useCallback(\n (targetScopeId: string) => {\n // Navigate to specific scope in the stack\n const targetIdx = scopeStack.findIndex((entry) => entry.scope === targetScopeId);\n\n if (targetIdx >= 0) {\n // Pop stack down to the target\n const popsNeeded = scopeStack.length - 1 - targetIdx;\n for (let i = 0; i < popsNeeded; i++) {\n navStore.navigateBack();\n }\n clearTextAfterTrigger(editor);\n setSelectedIndexOverride(null);\n }\n },\n [editor, navStore, scopeStack],\n );\n\n // Keyboard navigation\n useKeyboardNavigation(ref, {\n items,\n selectedIndex,\n onSelect: handleSelect,\n onBack: currentScopeId !== \"root\" ? handleBack : undefined,\n onClose: () => closeMenu(true),\n setSelectedIndex: (idx: number) => {\n setSelectedIndexOverride(idx);\n },\n });\n\n return (\n <div className=\"bg-white border border-gray-300 rounded shadow-lg min-w-[280px] max-w-[380px] max-h-[320px] flex flex-col\">\n {/* Scrollable items */}\n <div className=\"flex-1 overflow-y-auto\">\n <MenuList\n items={items}\n selectedIndex={selectedIndex}\n isLoading={isFetching}\n hasMore={hasMore}\n onSelect={handleSelect}\n onMouseMove={(idx) => {\n setSelectedIndexOverride(idx);\n }}\n onLoadMore={loadMore}\n />\n </div>\n\n {/* Bottom summary with breadcrumbs + back */}\n <MenuSummary\n scopePath={scopePath}\n onNavigate={handleBreadcrumbNavigate}\n onBackClick={currentScopeId !== \"root\" ? handleBack : undefined}\n isFetching={isFetching}\n />\n </div>\n );\n});\n\nMentionSuggestionList.displayName = \"MentionSuggestionList\";\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mention-suggestion-list.js","sources":["../../../../../src/chat-ui/mentions/suggestions/components/mention-suggestion-list.tsx"],"sourcesContent":["/**\n * MentionSuggestionList — Main mention menu component.\n *\n * Composed of:\n * - Registry + cache backed data (async fetching)\n * - useMenuNavigation for scope stack management\n * - useKeyboardNavigation for keyboard handling\n * - MenuList for item rendering with loading states\n * - MenuSummary for breadcrumbs + back\n */\n\nimport { useStore } from \"@tanstack/react-store\";\nimport type { Editor } from \"@tiptap/core\";\nimport { forwardRef, useCallback, useEffect, useState } from \"react\";\nimport type { MenuItem } from \"../data/types\";\nimport type { MentionSuggestionsStore } from \"../data/use-mention-suggestions\";\nimport { useMenuItems } from \"../data/use-menu-items\";\nimport { getSearchScope } from \"../data/scope-registry\";\nimport { getScopeName } from \"./get-scope-name\";\nimport { MenuList } from \"./menu-list\";\nimport { MenuSummary } from \"./menu-summary\";\nimport { useKeyboardNavigation, type KeyboardNavigationHandle } from \"./use-keyboard-navigation\";\nimport {\n getCurrentScope,\n getSelectedIndex,\n useMenuNavigation,\n} from \"./use-menu-navigation\";\nimport { clearTextAfterTrigger } from \"./utils\";\n\nexport interface MentionSuggestionListProps {\n store: MentionSuggestionsStore;\n editor: Editor;\n query: string;\n command: (item: MenuItem) => void;\n closeMenu: (dismissedByUser?: boolean) => void;\n}\n\nexport const MentionSuggestionList = forwardRef<\n KeyboardNavigationHandle,\n MentionSuggestionListProps\n>(({ store, editor, query, command, closeMenu }, ref) => {\n const [selectedIndexOverride, setSelectedIndexOverride] = useState<number | null>(null);\n const navStore = useMenuNavigation();\n\n // Get current scope from navigation\n const currentScopeId = useStore(navStore, (s) => getCurrentScope(s));\n const navSelectedIndex = useStore(navStore, (s) => getSelectedIndex(s));\n const selectedIndex = selectedIndexOverride ?? navSelectedIndex;\n const scopeStack = useStore(navStore, (s) => s.scopeStack);\n\n let effectiveScopeId = currentScopeId;\n\n if (query) {\n try {\n const searchScope = getSearchScope(store.state.registry, currentScopeId);\n if (searchScope) {\n effectiveScopeId = searchScope;\n }\n } catch {\n // No search scope binding — use current\n }\n }\n\n // Get items from the data store (reactive, with async fetching)\n const { items, isFetching, hasMore, unavailable, loadMore } = useMenuItems(store, {\n scope: effectiveScopeId,\n query,\n minItems: 50,\n parentScope: currentScopeId !== effectiveScopeId ? currentScopeId : undefined,\n });\n\n // Reset selection on query or scope change\n useEffect(() => {\n setSelectedIndexOverride(null);\n }, [query, effectiveScopeId]);\n\n // Build scope path for breadcrumbs from the navigation stack\n const scopePath = scopeStack.map((entry) => ({\n id: entry.scope,\n name: entry.breadcrumbLabel ?? getScopeName(entry.scope, store),\n }));\n\n // Handle item selection\n const handleSelect = useCallback(\n (item: MenuItem) => {\n if (item.navigatesToScope) {\n navStore.navigateTo(item.navigatesToScope, selectedIndex, {\n breadcrumbLabel: item.name,\n parentScope: currentScopeId,\n });\n clearTextAfterTrigger(editor);\n setSelectedIndexOverride(null);\n return;\n }\n // Insert mention\n command(item);\n },\n [command, editor, navStore, selectedIndex, currentScopeId],\n );\n\n // Handle back navigation\n const handleBack = useCallback(() => {\n navStore.navigateBack();\n clearTextAfterTrigger(editor);\n setSelectedIndexOverride(null);\n }, [editor, navStore]);\n\n // Handle breadcrumb navigation\n const handleBreadcrumbNavigate = useCallback(\n (targetScopeId: string) => {\n // Navigate to specific scope in the stack\n const targetIdx = scopeStack.findIndex((entry) => entry.scope === targetScopeId);\n\n if (targetIdx >= 0) {\n // Pop stack down to the target\n const popsNeeded = scopeStack.length - 1 - targetIdx;\n for (let i = 0; i < popsNeeded; i++) {\n navStore.navigateBack();\n }\n clearTextAfterTrigger(editor);\n setSelectedIndexOverride(null);\n }\n },\n [editor, navStore, scopeStack],\n );\n\n // Keyboard navigation\n useKeyboardNavigation(ref, {\n items,\n selectedIndex,\n onSelect: handleSelect,\n onBack: currentScopeId !== \"root\" ? handleBack : undefined,\n onClose: () => closeMenu(true),\n setSelectedIndex: (idx: number) => {\n setSelectedIndexOverride(idx);\n },\n });\n\n return (\n <div className=\"bg-white border border-gray-300 rounded shadow-lg min-w-[280px] max-w-[380px] max-h-[320px] flex flex-col\">\n {/* Scrollable items */}\n <div className=\"flex-1 overflow-y-auto\">\n <MenuList\n items={items}\n selectedIndex={selectedIndex}\n isLoading={isFetching}\n hasMore={hasMore}\n unavailable={unavailable}\n onSelect={handleSelect}\n onMouseMove={(idx) => {\n setSelectedIndexOverride(idx);\n }}\n onLoadMore={loadMore}\n />\n </div>\n\n {/* Bottom summary with breadcrumbs + back */}\n <MenuSummary\n scopePath={scopePath}\n onNavigate={handleBreadcrumbNavigate}\n onBackClick={currentScopeId !== \"root\" ? handleBack : undefined}\n isFetching={isFetching && unavailable === null}\n />\n </div>\n );\n});\n\nMentionSuggestionList.displayName = \"MentionSuggestionList\";\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
- const react$1 = require("react");
4
+ const require$$0 = require("react");
5
5
  const react = require("@floating-ui/react");
6
6
  const lib_ownerDocument = require("../../../../lib/owner-document.cjs");
7
7
  const MentionSuggestionPopup = ({ clientRect, children }) => {
@@ -11,7 +11,7 @@ const MentionSuggestionPopup = ({ clientRect, children }) => {
11
11
  middleware: [react.offset(10), react.flip(), react.shift({ padding: 8 })],
12
12
  whileElementsMounted: react.autoUpdate
13
13
  });
14
- react$1.useEffect(() => {
14
+ require$$0.useEffect(() => {
15
15
  if (clientRect) {
16
16
  refs.setPositionReference({
17
17
  getBoundingClientRect: () => clientRect() ?? new DOMRect()
@@ -1 +1 @@
1
- {"version":3,"file":"mention-suggestion-popup.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/mention-suggestion-popup.tsx"],"sourcesContent":["/**\n * Floating popup wrapper for the mention suggestion menu.\n * Uses Floating UI for positioning near the cursor.\n */\n\nimport { type FC, type ReactNode, useEffect } from \"react\";\nimport {\n useFloating,\n offset,\n flip,\n shift,\n autoUpdate,\n FloatingPortal,\n} from \"@floating-ui/react\";\nimport { usePortalContainer } from \"../../../../lib/owner-document\";\n\nexport const MentionSuggestionPopup: FC<{\n clientRect: (() => DOMRect | null) | null;\n children: ReactNode;\n}> = ({ clientRect, children }) => {\n const portalRoot = usePortalContainer();\n const { refs, floatingStyles } = useFloating({\n placement: \"bottom-start\",\n middleware: [offset(10), flip(), shift({ padding: 8 })],\n whileElementsMounted: autoUpdate,\n });\n\n // Use setPositionReference for virtual elements (cursor position)\n // instead of elements.reference which requires a real DOM element\n useEffect(() => {\n if (clientRect) {\n refs.setPositionReference({\n getBoundingClientRect: () => clientRect() ?? new DOMRect(),\n });\n }\n }, [clientRect, refs]);\n\n return (\n <FloatingPortal root={portalRoot}>\n <div\n ref={refs.setFloating}\n style={floatingStyles}\n className=\"z-[9999]\"\n onMouseDown={(e) => e.preventDefault()} // Prevent focus loss on click\n >\n {children}\n </div>\n </FloatingPortal>\n );\n};\n"],"names":["usePortalContainer","useFloating","offset","flip","shift","autoUpdate","useEffect","jsx","FloatingPortal"],"mappings":";;;;;;AAgBO,MAAM,yBAGR,CAAC,EAAE,YAAY,eAAe;AACjC,QAAM,aAAaA,kBAAAA,mBAAA;AACnB,QAAM,EAAE,MAAM,eAAA,IAAmBC,kBAAY;AAAA,IAC3C,WAAW;AAAA,IACX,YAAY,CAACC,aAAO,EAAE,GAAGC,MAAAA,QAAQC,MAAAA,MAAM,EAAE,SAAS,EAAA,CAAG,CAAC;AAAA,IACtD,sBAAsBC,MAAAA;AAAAA,EAAA,CACvB;AAIDC,UAAAA,UAAU,MAAM;AACd,QAAI,YAAY;AACd,WAAK,qBAAqB;AAAA,QACxB,uBAAuB,MAAM,WAAA,KAAgB,IAAI,QAAA;AAAA,MAAQ,CAC1D;AAAA,IACH;AAAA,EACF,GAAG,CAAC,YAAY,IAAI,CAAC;AAErB,SACEC,2BAAAA,IAACC,MAAAA,gBAAA,EAAe,MAAM,YACpB,UAAAD,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK,KAAK;AAAA,MACV,OAAO;AAAA,MACP,WAAU;AAAA,MACV,aAAa,CAAC,MAAM,EAAE,eAAA;AAAA,MAErB;AAAA,IAAA;AAAA,EAAA,GAEL;AAEJ;;"}
1
+ {"version":3,"file":"mention-suggestion-popup.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/mention-suggestion-popup.tsx"],"sourcesContent":["/**\n * Floating popup wrapper for the mention suggestion menu.\n * Uses Floating UI for positioning near the cursor.\n */\n\nimport { type FC, type ReactNode, useEffect } from \"react\";\nimport {\n useFloating,\n offset,\n flip,\n shift,\n autoUpdate,\n FloatingPortal,\n} from \"@floating-ui/react\";\nimport { usePortalContainer } from \"../../../../lib/owner-document\";\n\nexport const MentionSuggestionPopup: FC<{\n clientRect: (() => DOMRect | null) | null;\n children: ReactNode;\n}> = ({ clientRect, children }) => {\n const portalRoot = usePortalContainer();\n const { refs, floatingStyles } = useFloating({\n placement: \"bottom-start\",\n middleware: [offset(10), flip(), shift({ padding: 8 })],\n whileElementsMounted: autoUpdate,\n });\n\n // Use setPositionReference for virtual elements (cursor position)\n // instead of elements.reference which requires a real DOM element\n useEffect(() => {\n if (clientRect) {\n refs.setPositionReference({\n getBoundingClientRect: () => clientRect() ?? new DOMRect(),\n });\n }\n }, [clientRect, refs]);\n\n return (\n <FloatingPortal root={portalRoot}>\n <div\n ref={refs.setFloating}\n style={floatingStyles}\n className=\"z-[9999]\"\n onMouseDown={(e) => e.preventDefault()} // Prevent focus loss on click\n >\n {children}\n </div>\n </FloatingPortal>\n );\n};\n"],"names":["usePortalContainer","useFloating","offset","flip","shift","autoUpdate","useEffect","jsx","FloatingPortal"],"mappings":";;;;;;AAgBO,MAAM,yBAGR,CAAC,EAAE,YAAY,eAAe;AACjC,QAAM,aAAaA,kBAAAA,mBAAA;AACnB,QAAM,EAAE,MAAM,eAAA,IAAmBC,kBAAY;AAAA,IAC3C,WAAW;AAAA,IACX,YAAY,CAACC,aAAO,EAAE,GAAGC,MAAAA,QAAQC,MAAAA,MAAM,EAAE,SAAS,EAAA,CAAG,CAAC;AAAA,IACtD,sBAAsBC,MAAAA;AAAAA,EAAA,CACvB;AAIDC,aAAAA,UAAU,MAAM;AACd,QAAI,YAAY;AACd,WAAK,qBAAqB;AAAA,QACxB,uBAAuB,MAAM,WAAA,KAAgB,IAAI,QAAA;AAAA,MAAQ,CAC1D;AAAA,IACH;AAAA,EACF,GAAG,CAAC,YAAY,IAAI,CAAC;AAErB,SACEC,2BAAAA,IAACC,MAAAA,gBAAA,EAAe,MAAM,YACpB,UAAAD,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK,KAAK;AAAA,MACV,OAAO;AAAA,MACP,WAAU;AAAA,MACV,aAAa,CAAC,MAAM,EAAE,eAAA;AAAA,MAErB;AAAA,IAAA;AAAA,EAAA,GAEL;AAEJ;;"}
@@ -1,24 +1,46 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
- const react = require("react");
4
+ const require$$0 = require("react");
5
5
  const types = require("../data/types.cjs");
6
6
  const menuItem = require("./menu-item.cjs");
7
7
  const menuSkeleton = require("./menu-skeleton.cjs");
8
+ const cnfast = require("cnfast");
9
+ function UnavailableNotice({
10
+ reason,
11
+ compact = false
12
+ }) {
13
+ return /* @__PURE__ */ jsxRuntime.jsxs(
14
+ "div",
15
+ {
16
+ role: "status",
17
+ "data-testid": "mention-search-unavailable",
18
+ className: cnfast.cn("px-2 text-center", compact ? "py-2" : "py-9"),
19
+ children: [
20
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: cnfast.cn("text-gray-600", compact ? "text-xs" : "mb-1 text-sm"), children: reason.label }),
21
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs text-gray-400", children: reason.detail })
22
+ ]
23
+ }
24
+ );
25
+ }
8
26
  function MenuList({
9
27
  items,
10
28
  selectedIndex,
11
29
  isLoading,
12
30
  hasMore,
31
+ unavailable = null,
13
32
  onSelect,
14
33
  onMouseMove,
15
34
  onLoadMore
16
35
  }) {
17
- const selectedRef = react.useRef(null);
18
- react.useEffect(() => {
36
+ const selectedRef = require$$0.useRef(null);
37
+ require$$0.useEffect(() => {
19
38
  var _a;
20
39
  (_a = selectedRef.current) == null ? void 0 : _a.scrollIntoView({ block: "nearest" });
21
40
  }, [selectedIndex]);
41
+ if (unavailable && items.length === 0) {
42
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-1 py-1", children: /* @__PURE__ */ jsxRuntime.jsx(UnavailableNotice, { reason: unavailable }) });
43
+ }
22
44
  if (isLoading && items.length === 0) return /* @__PURE__ */ jsxRuntime.jsx(menuSkeleton.MenuSkeleton, {});
23
45
  if (items.length === 0) {
24
46
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-1 py-1", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-2 py-9 text-center text-sm text-gray-500", children: [
@@ -32,7 +54,7 @@ function MenuList({
32
54
  const previousSection = (_a = items[index - 1]) == null ? void 0 : _a.menuSection;
33
55
  const startsOtherWebpages = item.menuSection === types.MentionMenuSection.OTHER_WEBPAGES && previousSection !== types.MentionMenuSection.OTHER_WEBPAGES;
34
56
  const startsLibrary = item.menuSection === types.MentionMenuSection.LIBRARY && (previousSection === types.MentionMenuSection.CURRENT_WEBPAGE || previousSection === types.MentionMenuSection.OTHER_WEBPAGES);
35
- return /* @__PURE__ */ jsxRuntime.jsxs(react.Fragment, { children: [
57
+ return /* @__PURE__ */ jsxRuntime.jsxs(require$$0.Fragment, { children: [
36
58
  startsOtherWebpages && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 pb-1 pt-2 text-[11px] font-medium uppercase tracking-wide text-gray-400", children: "Other webpages in this group" }),
37
59
  startsLibrary && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-2 my-1 border-t border-gray-100" }),
38
60
  /* @__PURE__ */ jsxRuntime.jsx("div", { ref: index === selectedIndex ? selectedRef : void 0, children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -47,8 +69,9 @@ function MenuList({
47
69
  ) })
48
70
  ] }, item.id);
49
71
  }),
50
- isLoading && items.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-2 text-center", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-gray-400", children: "Loading more..." }) }),
51
- hasMore && !isLoading && onLoadMore && /* @__PURE__ */ jsxRuntime.jsx(
72
+ unavailable && hasMore && /* @__PURE__ */ jsxRuntime.jsx(UnavailableNotice, { reason: unavailable, compact: true }),
73
+ !unavailable && isLoading && items.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-2 text-center", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-gray-400", children: "Loading more..." }) }),
74
+ !unavailable && hasMore && !isLoading && onLoadMore && /* @__PURE__ */ jsxRuntime.jsx(
52
75
  "button",
53
76
  {
54
77
  type: "button",
@@ -1 +1 @@
1
- {"version":3,"file":"menu-list.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/menu-list.tsx"],"sourcesContent":["/**\n * Scrollable list of menu items with loading and empty states.\n */\n\nimport { Fragment, useEffect, useRef } from \"react\";\nimport { MentionMenuSection, type MenuItem } from \"../data/types\";\nimport { MenuItemRow } from \"./menu-item\";\nimport { MenuSkeleton } from \"./menu-skeleton\";\n\nexport function MenuList({\n items,\n selectedIndex,\n isLoading,\n hasMore,\n onSelect,\n onMouseMove,\n onLoadMore,\n}: {\n items: MenuItem[];\n selectedIndex: number;\n isLoading?: boolean;\n hasMore?: boolean;\n onSelect: (item: MenuItem) => void;\n onMouseMove: (index: number) => void;\n onLoadMore?: () => void;\n}) {\n const selectedRef = useRef<HTMLDivElement>(null);\n\n // Auto-scroll selected item into view\n useEffect(() => {\n selectedRef.current?.scrollIntoView({ block: \"nearest\" });\n }, [selectedIndex]);\n\n if (isLoading && items.length === 0) return <MenuSkeleton />;\n\n if (items.length === 0) {\n return (\n <div className=\"px-1 py-1\">\n <div className=\"px-2 py-9 text-center text-sm text-gray-500\">\n <div className=\"mb-1\">No results found</div>\n <div className=\"text-xs text-gray-400\">Try a different search or go back</div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"px-1 py-1\">\n {items.map((item, index) => {\n const previousSection = items[index - 1]?.menuSection;\n const startsOtherWebpages =\n item.menuSection === MentionMenuSection.OTHER_WEBPAGES &&\n previousSection !== MentionMenuSection.OTHER_WEBPAGES;\n const startsLibrary =\n item.menuSection === MentionMenuSection.LIBRARY &&\n (previousSection === MentionMenuSection.CURRENT_WEBPAGE ||\n previousSection === MentionMenuSection.OTHER_WEBPAGES);\n\n return (\n <Fragment key={item.id}>\n {startsOtherWebpages && (\n <div className=\"px-2 pb-1 pt-2 text-[11px] font-medium uppercase tracking-wide text-gray-400\">\n Other webpages in this group\n </div>\n )}\n {startsLibrary && <div className=\"mx-2 my-1 border-t border-gray-100\" />}\n <div ref={index === selectedIndex ? selectedRef : undefined}>\n <MenuItemRow\n item={item}\n isSelected={index === selectedIndex}\n onMouseMove={() => onMouseMove(index)}\n onClick={() => onSelect(item)}\n showArrow={!!item.navigatesToScope}\n />\n </div>\n </Fragment>\n );\n })}\n\n {/* Loading more indicator */}\n {isLoading && items.length > 0 && (\n <div className=\"px-2 py-2 text-center\">\n <span className=\"text-xs text-gray-400\">Loading more...</span>\n </div>\n )}\n\n {/* Load more sentinel */}\n {hasMore && !isLoading && onLoadMore && (\n <button\n type=\"button\"\n onClick={onLoadMore}\n className=\"w-full px-2 py-1.5 text-xs text-gray-500 hover:text-gray-700 hover:bg-gray-50 rounded transition-colors text-center\"\n >\n ··· Load more\n </button>\n )}\n </div>\n );\n}\n"],"names":["useRef","useEffect","MenuSkeleton","jsxs","jsx","MentionMenuSection","Fragment","MenuItemRow"],"mappings":";;;;;;;AASO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQG;AACD,QAAM,cAAcA,MAAAA,OAAuB,IAAI;AAG/CC,QAAAA,UAAU,MAAM;;AACd,sBAAY,YAAZ,mBAAqB,eAAe,EAAE,OAAO;EAC/C,GAAG,CAAC,aAAa,CAAC;AAElB,MAAI,aAAa,MAAM,WAAW,EAAG,uCAAQC,aAAAA,cAAA,EAAa;AAE1D,MAAI,MAAM,WAAW,GAAG;AACtB,0CACG,OAAA,EAAI,WAAU,aACb,UAAAC,2BAAAA,KAAC,OAAA,EAAI,WAAU,+CACb,UAAA;AAAA,MAAAC,2BAAAA,IAAC,OAAA,EAAI,WAAU,QAAO,UAAA,oBAAgB;AAAA,MACtCA,2BAAAA,IAAC,OAAA,EAAI,WAAU,yBAAwB,UAAA,oCAAA,CAAiC;AAAA,IAAA,EAAA,CAC1E,EAAA,CACF;AAAA,EAEJ;AAEA,SACED,2BAAAA,KAAC,OAAA,EAAI,WAAU,aACZ,UAAA;AAAA,IAAA,MAAM,IAAI,CAAC,MAAM,UAAU;;AAC1B,YAAM,mBAAkB,WAAM,QAAQ,CAAC,MAAf,mBAAkB;AAC1C,YAAM,sBACJ,KAAK,gBAAgBE,MAAAA,mBAAmB,kBACxC,oBAAoBA,MAAAA,mBAAmB;AACzC,YAAM,gBACJ,KAAK,gBAAgBA,MAAAA,mBAAmB,YACvC,oBAAoBA,MAAAA,mBAAmB,mBACtC,oBAAoBA,MAAAA,mBAAmB;AAE3C,6CACGC,gBAAA,EACE,UAAA;AAAA,QAAA,uBACCF,2BAAAA,IAAC,OAAA,EAAI,WAAU,gFAA+E,UAAA,gCAE9F;AAAA,QAED,iBAAiBA,2BAAAA,IAAC,OAAA,EAAI,WAAU,qCAAA,CAAqC;AAAA,uCACrE,OAAA,EAAI,KAAK,UAAU,gBAAgB,cAAc,QAChD,UAAAA,2BAAAA;AAAAA,UAACG,SAAAA;AAAAA,UAAA;AAAA,YACC;AAAA,YACA,YAAY,UAAU;AAAA,YACtB,aAAa,MAAM,YAAY,KAAK;AAAA,YACpC,SAAS,MAAM,SAAS,IAAI;AAAA,YAC5B,WAAW,CAAC,CAAC,KAAK;AAAA,UAAA;AAAA,QAAA,EACpB,CACF;AAAA,MAAA,EAAA,GAfa,KAAK,EAgBpB;AAAA,IAEJ,CAAC;AAAA,IAGA,aAAa,MAAM,SAAS,KAC3BH,2BAAAA,IAAC,OAAA,EAAI,WAAU,yBACb,UAAAA,2BAAAA,IAAC,QAAA,EAAK,WAAU,yBAAwB,6BAAe,GACzD;AAAA,IAID,WAAW,CAAC,aAAa,cACxBA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,WAAU;AAAA,QACX,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,GAEJ;AAEJ;;"}
1
+ {"version":3,"file":"menu-list.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/menu-list.tsx"],"sourcesContent":["/**\n * Scrollable list of menu items with loading and empty states.\n */\n\nimport type { LabelCopy } from \"@athenaintel/agent-runtime/offline-status\";\nimport { Fragment, useEffect, useRef } from \"react\";\nimport { cn } from \"../../../../lib/utils\";\nimport { MentionMenuSection, type MenuItem } from \"../data/types\";\nimport { MenuItemRow } from \"./menu-item\";\nimport { MenuSkeleton } from \"./menu-skeleton\";\n\n/** Why the list can't load from Athena right now, where results would otherwise be. */\nfunction UnavailableNotice({\n reason,\n compact = false,\n}: {\n reason: LabelCopy;\n compact?: boolean;\n}) {\n return (\n <div\n role=\"status\"\n data-testid=\"mention-search-unavailable\"\n className={cn(\"px-2 text-center\", compact ? \"py-2\" : \"py-9\")}\n >\n <div className={cn(\"text-gray-600\", compact ? \"text-xs\" : \"mb-1 text-sm\")}>\n {reason.label}\n </div>\n <div className=\"text-xs text-gray-400\">{reason.detail}</div>\n </div>\n );\n}\n\nexport function MenuList({\n items,\n selectedIndex,\n isLoading,\n hasMore,\n unavailable = null,\n onSelect,\n onMouseMove,\n onLoadMore,\n}: {\n items: MenuItem[];\n selectedIndex: number;\n isLoading?: boolean;\n hasMore?: boolean;\n /**\n * Why this list can't load from Athena right now: it says so instead of a\n * skeleton, \"No results found\" or \"Load more\"; what is already here still shows.\n */\n unavailable?: LabelCopy | null;\n onSelect: (item: MenuItem) => void;\n onMouseMove: (index: number) => void;\n onLoadMore?: () => void;\n}) {\n const selectedRef = useRef<HTMLDivElement>(null);\n\n // Auto-scroll selected item into view\n useEffect(() => {\n selectedRef.current?.scrollIntoView({ block: \"nearest\" });\n }, [selectedIndex]);\n\n if (unavailable && items.length === 0) {\n return (\n <div className=\"px-1 py-1\">\n <UnavailableNotice reason={unavailable} />\n </div>\n );\n }\n\n if (isLoading && items.length === 0) return <MenuSkeleton />;\n\n if (items.length === 0) {\n return (\n <div className=\"px-1 py-1\">\n <div className=\"px-2 py-9 text-center text-sm text-gray-500\">\n <div className=\"mb-1\">No results found</div>\n <div className=\"text-xs text-gray-400\">Try a different search or go back</div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"px-1 py-1\">\n {items.map((item, index) => {\n const previousSection = items[index - 1]?.menuSection;\n const startsOtherWebpages =\n item.menuSection === MentionMenuSection.OTHER_WEBPAGES &&\n previousSection !== MentionMenuSection.OTHER_WEBPAGES;\n const startsLibrary =\n item.menuSection === MentionMenuSection.LIBRARY &&\n (previousSection === MentionMenuSection.CURRENT_WEBPAGE ||\n previousSection === MentionMenuSection.OTHER_WEBPAGES);\n\n return (\n <Fragment key={item.id}>\n {startsOtherWebpages && (\n <div className=\"px-2 pb-1 pt-2 text-[11px] font-medium uppercase tracking-wide text-gray-400\">\n Other webpages in this group\n </div>\n )}\n {startsLibrary && <div className=\"mx-2 my-1 border-t border-gray-100\" />}\n <div ref={index === selectedIndex ? selectedRef : undefined}>\n <MenuItemRow\n item={item}\n isSelected={index === selectedIndex}\n onMouseMove={() => onMouseMove(index)}\n onClick={() => onSelect(item)}\n showArrow={!!item.navigatesToScope}\n />\n </div>\n </Fragment>\n );\n })}\n\n {/* More would come from Athena, which can't be reached: say so instead */}\n {unavailable && hasMore && <UnavailableNotice reason={unavailable} compact />}\n\n {/* Loading more indicator */}\n {!unavailable && isLoading && items.length > 0 && (\n <div className=\"px-2 py-2 text-center\">\n <span className=\"text-xs text-gray-400\">Loading more...</span>\n </div>\n )}\n\n {/* Load more sentinel */}\n {!unavailable && hasMore && !isLoading && onLoadMore && (\n <button\n type=\"button\"\n onClick={onLoadMore}\n className=\"w-full px-2 py-1.5 text-xs text-gray-500 hover:text-gray-700 hover:bg-gray-50 rounded transition-colors text-center\"\n >\n ··· Load more\n </button>\n )}\n </div>\n );\n}\n"],"names":["jsxs","cn","jsx","useRef","useEffect","MenuSkeleton","MentionMenuSection","Fragment","MenuItemRow"],"mappings":"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"}
@@ -1,12 +1,18 @@
1
1
  /**
2
2
  * Scrollable list of menu items with loading and empty states.
3
3
  */
4
+ import type { LabelCopy } from "../../../../agent-runtime/src/offline-status";
4
5
  import { type MenuItem } from "../data/types";
5
- export declare function MenuList({ items, selectedIndex, isLoading, hasMore, onSelect, onMouseMove, onLoadMore, }: {
6
+ export declare function MenuList({ items, selectedIndex, isLoading, hasMore, unavailable, onSelect, onMouseMove, onLoadMore, }: {
6
7
  items: MenuItem[];
7
8
  selectedIndex: number;
8
9
  isLoading?: boolean;
9
10
  hasMore?: boolean;
11
+ /**
12
+ * Why this list can't load from Athena right now: it says so instead of a
13
+ * skeleton, "No results found" or "Load more"; what is already here still shows.
14
+ */
15
+ unavailable?: LabelCopy | null;
10
16
  onSelect: (item: MenuItem) => void;
11
17
  onMouseMove: (index: number) => void;
12
18
  onLoadMore?: () => void;