@athenaintel/react 0.57.2 → 0.60.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 (852) hide show
  1. package/README.md +795 -12
  2. package/dist/agent-runtime/src/addressed-agents.cjs +16 -0
  3. package/dist/agent-runtime/src/addressed-agents.cjs.map +1 -0
  4. package/dist/agent-runtime/src/addressed-agents.d.ts +30 -0
  5. package/dist/agent-runtime/src/addressed-agents.js +16 -0
  6. package/dist/agent-runtime/src/addressed-agents.js.map +1 -0
  7. package/dist/agent-runtime/src/answer-label.cjs +4 -3
  8. package/dist/agent-runtime/src/answer-label.cjs.map +1 -1
  9. package/dist/agent-runtime/src/answer-label.d.ts +13 -6
  10. package/dist/agent-runtime/src/answer-label.js +4 -3
  11. package/dist/agent-runtime/src/answer-label.js.map +1 -1
  12. package/dist/agent-runtime/src/chat-outbox-attachments.cjs.map +1 -1
  13. package/dist/agent-runtime/src/chat-outbox-attachments.d.ts +1 -1
  14. package/dist/agent-runtime/src/chat-outbox-attachments.js.map +1 -1
  15. package/dist/agent-runtime/src/chat-outbox-entry.cjs +101 -0
  16. package/dist/agent-runtime/src/chat-outbox-entry.cjs.map +1 -0
  17. package/dist/agent-runtime/src/chat-outbox-entry.d.ts +99 -0
  18. package/dist/agent-runtime/src/chat-outbox-entry.js +101 -0
  19. package/dist/agent-runtime/src/chat-outbox-entry.js.map +1 -0
  20. package/dist/agent-runtime/src/chat-outbox-legacy.cjs +252 -0
  21. package/dist/agent-runtime/src/chat-outbox-legacy.cjs.map +1 -0
  22. package/dist/agent-runtime/src/chat-outbox-legacy.d.ts +96 -0
  23. package/dist/agent-runtime/src/chat-outbox-legacy.js +252 -0
  24. package/dist/agent-runtime/src/chat-outbox-legacy.js.map +1 -0
  25. package/dist/agent-runtime/src/chat-outbox-policy.cjs +30 -0
  26. package/dist/agent-runtime/src/chat-outbox-policy.cjs.map +1 -0
  27. package/dist/agent-runtime/src/chat-outbox-policy.d.ts +42 -0
  28. package/dist/agent-runtime/src/chat-outbox-policy.js +30 -0
  29. package/dist/agent-runtime/src/chat-outbox-policy.js.map +1 -0
  30. package/dist/agent-runtime/src/chat-outbox-storage.cjs +306 -0
  31. package/dist/agent-runtime/src/chat-outbox-storage.cjs.map +1 -0
  32. package/dist/agent-runtime/src/chat-outbox-storage.d.ts +194 -0
  33. package/dist/agent-runtime/src/chat-outbox-storage.js +306 -0
  34. package/dist/agent-runtime/src/chat-outbox-storage.js.map +1 -0
  35. package/dist/agent-runtime/src/chat-outbox-thread.cjs +21 -94
  36. package/dist/agent-runtime/src/chat-outbox-thread.cjs.map +1 -1
  37. package/dist/agent-runtime/src/chat-outbox-thread.d.ts +22 -18
  38. package/dist/agent-runtime/src/chat-outbox-thread.js +21 -94
  39. package/dist/agent-runtime/src/chat-outbox-thread.js.map +1 -1
  40. package/dist/agent-runtime/src/chat-outbox.cjs +492 -547
  41. package/dist/agent-runtime/src/chat-outbox.cjs.map +1 -1
  42. package/dist/agent-runtime/src/chat-outbox.d.ts +110 -142
  43. package/dist/agent-runtime/src/chat-outbox.js +492 -547
  44. package/dist/agent-runtime/src/chat-outbox.js.map +1 -1
  45. package/dist/agent-runtime/src/composer-markdown.cjs +0 -16
  46. package/dist/agent-runtime/src/composer-markdown.cjs.map +1 -1
  47. package/dist/agent-runtime/src/composer-markdown.d.ts +1 -1
  48. package/dist/agent-runtime/src/composer-markdown.js +1 -17
  49. package/dist/agent-runtime/src/composer-markdown.js.map +1 -1
  50. package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs +3 -1
  51. package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs.map +1 -1
  52. package/dist/agent-runtime/src/deep-agent-transport-recipe.d.ts +8 -1
  53. package/dist/agent-runtime/src/deep-agent-transport-recipe.js +3 -1
  54. package/dist/agent-runtime/src/deep-agent-transport-recipe.js.map +1 -1
  55. package/dist/agent-runtime/src/dictation-preferences.d.ts +356 -0
  56. package/dist/agent-runtime/src/dictation-record.d.ts +279 -0
  57. package/dist/agent-runtime/src/dictation-session.d.ts +106 -7
  58. package/dist/agent-runtime/src/dictation-snippets.d.ts +9 -0
  59. package/dist/agent-runtime/src/dictation-transfer.d.ts +142 -0
  60. package/dist/agent-runtime/src/edit-command.cjs.map +1 -1
  61. package/dist/agent-runtime/src/edit-command.d.ts +1 -1
  62. package/dist/agent-runtime/src/edit-command.js.map +1 -1
  63. package/dist/agent-runtime/src/errors.cjs +1 -0
  64. package/dist/agent-runtime/src/errors.cjs.map +1 -1
  65. package/dist/agent-runtime/src/errors.js +1 -0
  66. package/dist/agent-runtime/src/errors.js.map +1 -1
  67. package/dist/agent-runtime/src/generated/runconfig-contract.cjs +24 -0
  68. package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
  69. package/dist/agent-runtime/src/generated/runconfig-contract.d.ts +3 -3
  70. package/dist/agent-runtime/src/generated/runconfig-contract.js +24 -0
  71. package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
  72. package/dist/agent-runtime/src/index.d.ts +14 -8
  73. package/dist/agent-runtime/src/lane-follow.cjs +289 -0
  74. package/dist/agent-runtime/src/lane-follow.cjs.map +1 -0
  75. package/dist/agent-runtime/src/lane-follow.js +289 -0
  76. package/dist/agent-runtime/src/lane-follow.js.map +1 -0
  77. package/dist/agent-runtime/src/lane-images.cjs +387 -0
  78. package/dist/agent-runtime/src/lane-images.cjs.map +1 -0
  79. package/dist/agent-runtime/src/lane-images.js +387 -0
  80. package/dist/agent-runtime/src/lane-images.js.map +1 -0
  81. package/dist/agent-runtime/src/message-window.js +1 -1
  82. package/dist/agent-runtime/src/messages.cjs +19 -1
  83. package/dist/agent-runtime/src/messages.cjs.map +1 -1
  84. package/dist/agent-runtime/src/messages.d.ts +8 -0
  85. package/dist/agent-runtime/src/messages.js +21 -3
  86. package/dist/agent-runtime/src/messages.js.map +1 -1
  87. package/dist/agent-runtime/src/named-agents.cjs +301 -0
  88. package/dist/agent-runtime/src/named-agents.cjs.map +1 -0
  89. package/dist/agent-runtime/src/named-agents.d.ts +246 -0
  90. package/dist/agent-runtime/src/named-agents.js +301 -0
  91. package/dist/agent-runtime/src/named-agents.js.map +1 -0
  92. package/dist/agent-runtime/src/offline-status.cjs.map +1 -1
  93. package/dist/agent-runtime/src/offline-status.d.ts +93 -2
  94. package/dist/agent-runtime/src/offline-status.js.map +1 -1
  95. package/dist/agent-runtime/src/ptc-subcalls.cjs +41 -0
  96. package/dist/agent-runtime/src/ptc-subcalls.cjs.map +1 -0
  97. package/dist/agent-runtime/src/ptc-subcalls.js +41 -0
  98. package/dist/agent-runtime/src/ptc-subcalls.js.map +1 -0
  99. package/dist/agent-runtime/src/queue.cjs +2 -2
  100. package/dist/agent-runtime/src/queue.cjs.map +1 -1
  101. package/dist/agent-runtime/src/queue.d.ts +20 -25
  102. package/dist/agent-runtime/src/queue.js +2 -2
  103. package/dist/agent-runtime/src/queue.js.map +1 -1
  104. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs +314 -84
  105. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
  106. package/dist/agent-runtime/src/quota-safe-local-storage-session.d.ts +137 -40
  107. package/dist/agent-runtime/src/quota-safe-local-storage-session.js +318 -88
  108. package/dist/agent-runtime/src/quota-safe-local-storage-session.js.map +1 -1
  109. package/dist/agent-runtime/src/run-send.cjs +54 -0
  110. package/dist/agent-runtime/src/run-send.cjs.map +1 -0
  111. package/dist/agent-runtime/src/run-send.d.ts +51 -0
  112. package/dist/agent-runtime/src/run-send.js +54 -0
  113. package/dist/agent-runtime/src/run-send.js.map +1 -0
  114. package/dist/agent-runtime/src/running-tool-placeholder.cjs +6 -0
  115. package/dist/agent-runtime/src/running-tool-placeholder.cjs.map +1 -1
  116. package/dist/agent-runtime/src/running-tool-placeholder.js +6 -0
  117. package/dist/agent-runtime/src/running-tool-placeholder.js.map +1 -1
  118. package/dist/agent-runtime/src/runtime.d.ts +9 -5
  119. package/dist/agent-runtime/src/sealed-idb.cjs +64 -0
  120. package/dist/agent-runtime/src/sealed-idb.cjs.map +1 -1
  121. package/dist/agent-runtime/src/sealed-idb.d.ts +16 -0
  122. package/dist/agent-runtime/src/sealed-idb.js +64 -0
  123. package/dist/agent-runtime/src/sealed-idb.js.map +1 -1
  124. package/dist/agent-runtime/src/send-recovery.cjs +90 -118
  125. package/dist/agent-runtime/src/send-recovery.cjs.map +1 -1
  126. package/dist/agent-runtime/src/send-recovery.d.ts +25 -29
  127. package/dist/agent-runtime/src/send-recovery.js +90 -118
  128. package/dist/agent-runtime/src/send-recovery.js.map +1 -1
  129. package/dist/agent-runtime/src/statewire-diagnostics.d.ts +4 -1
  130. package/dist/agent-runtime/src/statewire-held-sends.cjs +191 -0
  131. package/dist/agent-runtime/src/statewire-held-sends.cjs.map +1 -0
  132. package/dist/agent-runtime/src/statewire-held-sends.d.ts +119 -0
  133. package/dist/agent-runtime/src/statewire-held-sends.js +191 -0
  134. package/dist/agent-runtime/src/statewire-held-sends.js.map +1 -0
  135. package/dist/agent-runtime/src/statewire-state.cjs +4 -0
  136. package/dist/agent-runtime/src/statewire-state.cjs.map +1 -1
  137. package/dist/agent-runtime/src/statewire-state.js +4 -0
  138. package/dist/agent-runtime/src/statewire-state.js.map +1 -1
  139. package/dist/agent-runtime/src/statewire-transport.cjs +8 -2
  140. package/dist/agent-runtime/src/statewire-transport.cjs.map +1 -1
  141. package/dist/agent-runtime/src/statewire-transport.d.ts +14 -5
  142. package/dist/agent-runtime/src/statewire-transport.js +8 -2
  143. package/dist/agent-runtime/src/statewire-transport.js.map +1 -1
  144. package/dist/agent-runtime/src/subagent-transcripts.cjs +1 -23
  145. package/dist/agent-runtime/src/subagent-transcripts.cjs.map +1 -1
  146. package/dist/agent-runtime/src/subagent-transcripts.js +3 -25
  147. package/dist/agent-runtime/src/subagent-transcripts.js.map +1 -1
  148. package/dist/agent-runtime/src/subagents.cjs +22 -29
  149. package/dist/agent-runtime/src/subagents.cjs.map +1 -1
  150. package/dist/agent-runtime/src/subagents.js +23 -30
  151. package/dist/agent-runtime/src/subagents.js.map +1 -1
  152. package/dist/agent-runtime/src/thread-extras.cjs +27 -19
  153. package/dist/agent-runtime/src/thread-extras.cjs.map +1 -1
  154. package/dist/agent-runtime/src/thread-extras.d.ts +19 -6
  155. package/dist/agent-runtime/src/thread-extras.js +27 -19
  156. package/dist/agent-runtime/src/thread-extras.js.map +1 -1
  157. package/dist/agent-runtime/src/thread-handoff-flow-machine.d.ts +8 -8
  158. package/dist/agent-runtime/src/tool-metadata.cjs +19 -0
  159. package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
  160. package/dist/agent-runtime/src/tool-metadata.js +19 -0
  161. package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
  162. package/dist/agent-runtime/src/tool-names.cjs +21 -0
  163. package/dist/agent-runtime/src/tool-names.cjs.map +1 -1
  164. package/dist/agent-runtime/src/tool-names.d.ts +8 -0
  165. package/dist/agent-runtime/src/tool-names.js +21 -0
  166. package/dist/agent-runtime/src/tool-names.js.map +1 -1
  167. package/dist/agent-runtime/src/typed-interrupt-kinds.cjs +247 -0
  168. package/dist/agent-runtime/src/typed-interrupt-kinds.cjs.map +1 -0
  169. package/dist/agent-runtime/src/typed-interrupt-kinds.d.ts +173 -0
  170. package/dist/agent-runtime/src/typed-interrupt-kinds.js +247 -0
  171. package/dist/agent-runtime/src/typed-interrupt-kinds.js.map +1 -0
  172. package/dist/agent-runtime/src/typed-interrupts.cjs +48 -0
  173. package/dist/agent-runtime/src/typed-interrupts.cjs.map +1 -0
  174. package/dist/agent-runtime/src/typed-interrupts.d.ts +75 -0
  175. package/dist/agent-runtime/src/typed-interrupts.js +48 -0
  176. package/dist/agent-runtime/src/typed-interrupts.js.map +1 -0
  177. package/dist/agent-runtime/src/types.d.ts +1 -1
  178. package/dist/agent-runtime/src/use-conversation-list.cjs +1 -0
  179. package/dist/agent-runtime/src/use-conversation-list.cjs.map +1 -1
  180. package/dist/agent-runtime/src/use-conversation-list.d.ts +7 -0
  181. package/dist/agent-runtime/src/use-conversation-list.js +1 -0
  182. package/dist/agent-runtime/src/use-conversation-list.js.map +1 -1
  183. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs +46 -29
  184. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs.map +1 -1
  185. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.d.ts +14 -22
  186. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js +46 -29
  187. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js.map +1 -1
  188. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs +78 -14
  189. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
  190. package/dist/agent-runtime/src/use-deep-agent-runtime.d.ts +34 -7
  191. package/dist/agent-runtime/src/use-deep-agent-runtime.js +79 -15
  192. package/dist/agent-runtime/src/use-deep-agent-runtime.js.map +1 -1
  193. package/dist/agent-runtime/src/use-deep-agent-thread.cjs +16 -1
  194. package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
  195. package/dist/agent-runtime/src/use-deep-agent-thread.d.ts +7 -2
  196. package/dist/agent-runtime/src/use-deep-agent-thread.js +16 -1
  197. package/dist/agent-runtime/src/use-deep-agent-thread.js.map +1 -1
  198. package/dist/agent-runtime/src/use-deep-agent-voice.cjs +30 -4
  199. package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -1
  200. package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +22 -4
  201. package/dist/agent-runtime/src/use-deep-agent-voice.js +30 -4
  202. package/dist/agent-runtime/src/use-deep-agent-voice.js.map +1 -1
  203. package/dist/agent-runtime/src/withdrawn-turns.d.ts +5 -4
  204. package/dist/agent-runtime/src/word-device-fit.d.ts +174 -0
  205. package/dist/agent-runtime/src/work-in.d.ts +127 -0
  206. package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
  207. package/dist/assets/AthenaAssetEmbed.d.ts +6 -1
  208. package/dist/assets/AthenaAssetEmbed.js.map +1 -1
  209. package/dist/assets/asset-panel-store.cjs +13 -5
  210. package/dist/assets/asset-panel-store.cjs.map +1 -1
  211. package/dist/assets/asset-panel-store.d.ts +33 -2
  212. package/dist/assets/asset-panel-store.js +13 -5
  213. package/dist/assets/asset-panel-store.js.map +1 -1
  214. package/dist/auth/AthenaCredentialSourceContext.cjs +11 -0
  215. package/dist/auth/AthenaCredentialSourceContext.cjs.map +1 -1
  216. package/dist/auth/AthenaCredentialSourceContext.d.ts +6 -0
  217. package/dist/auth/AthenaCredentialSourceContext.js +11 -0
  218. package/dist/auth/AthenaCredentialSourceContext.js.map +1 -1
  219. package/dist/auth/account-identity.cjs +13 -2
  220. package/dist/auth/account-identity.cjs.map +1 -1
  221. package/dist/auth/account-identity.d.ts +9 -0
  222. package/dist/auth/account-identity.js +13 -2
  223. package/dist/auth/account-identity.js.map +1 -1
  224. package/dist/auth/credential-source.cjs +20 -4
  225. package/dist/auth/credential-source.cjs.map +1 -1
  226. package/dist/auth/credential-source.d.ts +9 -0
  227. package/dist/auth/credential-source.js +20 -4
  228. package/dist/auth/credential-source.js.map +1 -1
  229. package/dist/catalog/chat-pickers.cjs +31 -0
  230. package/dist/catalog/chat-pickers.cjs.map +1 -1
  231. package/dist/catalog/chat-pickers.d.ts +17 -0
  232. package/dist/catalog/chat-pickers.js +33 -2
  233. package/dist/catalog/chat-pickers.js.map +1 -1
  234. package/dist/catalog/runtime-catalog.cjs +63 -3
  235. package/dist/catalog/runtime-catalog.cjs.map +1 -1
  236. package/dist/catalog/runtime-catalog.d.ts +63 -3
  237. package/dist/catalog/runtime-catalog.js +64 -4
  238. package/dist/catalog/runtime-catalog.js.map +1 -1
  239. package/dist/chat/AthenaChat.cjs +301 -98
  240. package/dist/chat/AthenaChat.cjs.map +1 -1
  241. package/dist/chat/AthenaChat.d.ts +80 -4
  242. package/dist/chat/AthenaChat.js +302 -99
  243. package/dist/chat/AthenaChat.js.map +1 -1
  244. package/dist/chat/StatewireApprovalCard.cjs +35 -5
  245. package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
  246. package/dist/chat/StatewireApprovalCard.d.ts +55 -2
  247. package/dist/chat/StatewireApprovalCard.js +37 -7
  248. package/dist/chat/StatewireApprovalCard.js.map +1 -1
  249. package/dist/chat/StatewireQueuedMessages.cjs +17 -2
  250. package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
  251. package/dist/chat/StatewireQueuedMessages.d.ts +8 -45
  252. package/dist/chat/StatewireQueuedMessages.js +18 -3
  253. package/dist/chat/StatewireQueuedMessages.js.map +1 -1
  254. package/dist/chat/chat-agent-mentions.cjs +70 -0
  255. package/dist/chat/chat-agent-mentions.cjs.map +1 -0
  256. package/dist/chat/chat-agent-mentions.d.ts +13 -0
  257. package/dist/chat/chat-agent-mentions.js +70 -0
  258. package/dist/chat/chat-agent-mentions.js.map +1 -0
  259. package/dist/chat/composer-actions.cjs +12 -0
  260. package/dist/chat/composer-actions.cjs.map +1 -0
  261. package/dist/chat/composer-actions.d.ts +22 -0
  262. package/dist/chat/composer-actions.js +12 -0
  263. package/dist/chat/composer-actions.js.map +1 -0
  264. package/dist/chat/follow-up-suggestions.cjs +185 -0
  265. package/dist/chat/follow-up-suggestions.cjs.map +1 -0
  266. package/dist/chat/follow-up-suggestions.d.ts +64 -0
  267. package/dist/chat/follow-up-suggestions.js +185 -0
  268. package/dist/chat/follow-up-suggestions.js.map +1 -0
  269. package/dist/chat/super-grouping/ToolTimeline.cjs +4 -3
  270. package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -1
  271. package/dist/chat/super-grouping/ToolTimeline.d.ts +7 -3
  272. package/dist/chat/super-grouping/ToolTimeline.js +4 -3
  273. package/dist/chat/super-grouping/ToolTimeline.js.map +1 -1
  274. package/dist/chat/turn-changes.cjs +284 -0
  275. package/dist/chat/turn-changes.cjs.map +1 -0
  276. package/dist/chat/turn-changes.d.ts +130 -0
  277. package/dist/chat/turn-changes.js +284 -0
  278. package/dist/chat/turn-changes.js.map +1 -0
  279. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.cjs +31 -0
  280. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.cjs.map +1 -0
  281. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.d.ts +31 -0
  282. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.js +31 -0
  283. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.js.map +1 -0
  284. package/dist/chat/typed-interrupts/approval-cards.cjs +250 -0
  285. package/dist/chat/typed-interrupts/approval-cards.cjs.map +1 -0
  286. package/dist/chat/typed-interrupts/approval-cards.d.ts +22 -0
  287. package/dist/chat/typed-interrupts/approval-cards.js +250 -0
  288. package/dist/chat/typed-interrupts/approval-cards.js.map +1 -0
  289. package/dist/chat/typed-interrupts/form-cards.cjs +289 -0
  290. package/dist/chat/typed-interrupts/form-cards.cjs.map +1 -0
  291. package/dist/chat/typed-interrupts/form-cards.d.ts +6 -0
  292. package/dist/chat/typed-interrupts/form-cards.js +289 -0
  293. package/dist/chat/typed-interrupts/form-cards.js.map +1 -0
  294. package/dist/chat/typed-interrupts/interrupt-card-shell.cjs +182 -0
  295. package/dist/chat/typed-interrupts/interrupt-card-shell.cjs.map +1 -0
  296. package/dist/chat/typed-interrupts/interrupt-card-shell.d.ts +47 -0
  297. package/dist/chat/typed-interrupts/interrupt-card-shell.js +182 -0
  298. package/dist/chat/typed-interrupts/interrupt-card-shell.js.map +1 -0
  299. package/dist/chat/typed-interrupts/json-schema-form.cjs +388 -0
  300. package/dist/chat/typed-interrupts/json-schema-form.cjs.map +1 -0
  301. package/dist/chat/typed-interrupts/json-schema-form.d.ts +33 -0
  302. package/dist/chat/typed-interrupts/json-schema-form.js +388 -0
  303. package/dist/chat/typed-interrupts/json-schema-form.js.map +1 -0
  304. package/dist/chat/typed-interrupts/questionnaire-card.cjs +449 -0
  305. package/dist/chat/typed-interrupts/questionnaire-card.cjs.map +1 -0
  306. package/dist/chat/typed-interrupts/questionnaire-card.d.ts +20 -0
  307. package/dist/chat/typed-interrupts/questionnaire-card.js +449 -0
  308. package/dist/chat/typed-interrupts/questionnaire-card.js.map +1 -0
  309. package/dist/chat/typed-interrupts/request-file-card.cjs +159 -0
  310. package/dist/chat/typed-interrupts/request-file-card.cjs.map +1 -0
  311. package/dist/chat/typed-interrupts/request-file-card.d.ts +2 -0
  312. package/dist/chat/typed-interrupts/request-file-card.js +159 -0
  313. package/dist/chat/typed-interrupts/request-file-card.js.map +1 -0
  314. package/dist/chat/typed-interrupts/toolkit-selection-card.cjs +189 -0
  315. package/dist/chat/typed-interrupts/toolkit-selection-card.cjs.map +1 -0
  316. package/dist/chat/typed-interrupts/toolkit-selection-card.d.ts +23 -0
  317. package/dist/chat/typed-interrupts/toolkit-selection-card.js +189 -0
  318. package/dist/chat/typed-interrupts/toolkit-selection-card.js.map +1 -0
  319. package/dist/chat/typed-interrupts/typed-interrupt-body.cjs +26 -0
  320. package/dist/chat/typed-interrupts/typed-interrupt-body.cjs.map +1 -0
  321. package/dist/chat/typed-interrupts/typed-interrupt-body.d.ts +3 -0
  322. package/dist/chat/typed-interrupts/typed-interrupt-body.js +26 -0
  323. package/dist/chat/typed-interrupts/typed-interrupt-body.js.map +1 -0
  324. package/dist/chat/typed-interrupts/typed-interrupt-graphql.cjs +105 -0
  325. package/dist/chat/typed-interrupts/typed-interrupt-graphql.cjs.map +1 -0
  326. package/dist/chat/typed-interrupts/typed-interrupt-graphql.d.ts +29 -0
  327. package/dist/chat/typed-interrupts/typed-interrupt-graphql.js +105 -0
  328. package/dist/chat/typed-interrupts/typed-interrupt-graphql.js.map +1 -0
  329. package/dist/chat/typed-interrupts/typed-interrupt-notice.cjs +70 -0
  330. package/dist/chat/typed-interrupts/typed-interrupt-notice.cjs.map +1 -0
  331. package/dist/chat/typed-interrupts/typed-interrupt-notice.d.ts +45 -0
  332. package/dist/chat/typed-interrupts/typed-interrupt-notice.js +70 -0
  333. package/dist/chat/typed-interrupts/typed-interrupt-notice.js.map +1 -0
  334. package/dist/chat/typed-interrupts/typed-interrupt-panel.cjs +76 -0
  335. package/dist/chat/typed-interrupts/typed-interrupt-panel.cjs.map +1 -0
  336. package/dist/chat/typed-interrupts/typed-interrupt-panel.d.ts +11 -0
  337. package/dist/chat/typed-interrupts/typed-interrupt-panel.js +76 -0
  338. package/dist/chat/typed-interrupts/typed-interrupt-panel.js.map +1 -0
  339. package/dist/chat/typed-interrupts/typed-interrupt-types.d.ts +46 -0
  340. package/dist/chat/typed-interrupts/use-interrupt-draft.cjs +106 -0
  341. package/dist/chat/typed-interrupts/use-interrupt-draft.cjs.map +1 -0
  342. package/dist/chat/typed-interrupts/use-interrupt-draft.d.ts +29 -0
  343. package/dist/chat/typed-interrupts/use-interrupt-draft.js +106 -0
  344. package/dist/chat/typed-interrupts/use-interrupt-draft.js.map +1 -0
  345. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.cjs +231 -0
  346. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.cjs.map +1 -0
  347. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.d.ts +66 -0
  348. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.js +231 -0
  349. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.js.map +1 -0
  350. package/dist/chat-ui/composer/composer-named-agents.cjs +13 -0
  351. package/dist/chat-ui/composer/composer-named-agents.cjs.map +1 -0
  352. package/dist/chat-ui/composer/composer-named-agents.d.ts +20 -0
  353. package/dist/chat-ui/composer/composer-named-agents.js +13 -0
  354. package/dist/chat-ui/composer/composer-named-agents.js.map +1 -0
  355. package/dist/chat-ui/composer/slash-command-menu.cjs +143 -0
  356. package/dist/chat-ui/composer/slash-command-menu.cjs.map +1 -0
  357. package/dist/chat-ui/composer/slash-command-menu.d.ts +19 -0
  358. package/dist/chat-ui/composer/slash-command-menu.js +143 -0
  359. package/dist/chat-ui/composer/slash-command-menu.js.map +1 -0
  360. package/dist/chat-ui/composer/slash-commands-extension.cjs +51 -0
  361. package/dist/chat-ui/composer/slash-commands-extension.cjs.map +1 -0
  362. package/dist/chat-ui/composer/slash-commands-extension.d.ts +39 -0
  363. package/dist/chat-ui/composer/slash-commands-extension.js +51 -0
  364. package/dist/chat-ui/composer/slash-commands-extension.js.map +1 -0
  365. package/dist/chat-ui/composer/slash-commands.cjs +74 -0
  366. package/dist/chat-ui/composer/slash-commands.cjs.map +1 -0
  367. package/dist/chat-ui/composer/slash-commands.d.ts +82 -0
  368. package/dist/chat-ui/composer/slash-commands.js +74 -0
  369. package/dist/chat-ui/composer/slash-commands.js.map +1 -0
  370. package/dist/chat-ui/composer/tiptap-composer.cjs +135 -9
  371. package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
  372. package/dist/chat-ui/composer/tiptap-composer.d.ts +61 -2
  373. package/dist/chat-ui/composer/tiptap-composer.js +135 -9
  374. package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
  375. package/dist/chat-ui/index.cjs +5 -0
  376. package/dist/chat-ui/index.cjs.map +1 -1
  377. package/dist/chat-ui/index.d.ts +4 -2
  378. package/dist/chat-ui/index.js +5 -0
  379. package/dist/chat-ui/index.js.map +1 -1
  380. package/dist/chat-ui/mentions/mention-chip.cjs +10 -4
  381. package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
  382. package/dist/chat-ui/mentions/mention-chip.js +11 -5
  383. package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
  384. package/dist/chat-ui/mentions/mention-extension.cjs +8 -1
  385. package/dist/chat-ui/mentions/mention-extension.cjs.map +1 -1
  386. package/dist/chat-ui/mentions/mention-extension.js +8 -1
  387. package/dist/chat-ui/mentions/mention-extension.js.map +1 -1
  388. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.cjs +1 -0
  389. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.cjs.map +1 -1
  390. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.js +1 -0
  391. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.js.map +1 -1
  392. package/dist/chat-ui/mentions/suggestions/components/mention-icon.cjs +20 -2
  393. package/dist/chat-ui/mentions/suggestions/components/mention-icon.cjs.map +1 -1
  394. package/dist/chat-ui/mentions/suggestions/components/mention-icon.d.ts +10 -1
  395. package/dist/chat-ui/mentions/suggestions/components/mention-icon.js +22 -4
  396. package/dist/chat-ui/mentions/suggestions/components/mention-icon.js.map +1 -1
  397. package/dist/chat-ui/mentions/suggestions/components/menu-item.cjs +1 -1
  398. package/dist/chat-ui/mentions/suggestions/components/menu-item.cjs.map +1 -1
  399. package/dist/chat-ui/mentions/suggestions/components/menu-item.js +1 -1
  400. package/dist/chat-ui/mentions/suggestions/components/menu-item.js.map +1 -1
  401. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +45 -0
  402. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
  403. package/dist/chat-ui/mentions/suggestions/data/api-client.d.ts +48 -0
  404. package/dist/chat-ui/mentions/suggestions/data/api-client.js +45 -0
  405. package/dist/chat-ui/mentions/suggestions/data/api-client.js.map +1 -1
  406. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icon-names.generated.cjs +89 -0
  407. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icon-names.generated.cjs.map +1 -0
  408. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icon-names.generated.d.ts +8 -0
  409. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icon-names.generated.js +89 -0
  410. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icon-names.generated.js.map +1 -0
  411. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.cjs +140 -116
  412. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.cjs.map +1 -1
  413. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.d.ts +46 -12
  414. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.js +141 -117
  415. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.js.map +1 -1
  416. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +272 -25
  417. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
  418. package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +88 -10
  419. package/dist/chat-ui/mentions/suggestions/data/sources/index.js +274 -27
  420. package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
  421. package/dist/chat-ui/mentions/suggestions/data/types.cjs.map +1 -1
  422. package/dist/chat-ui/mentions/suggestions/data/types.d.ts +27 -1
  423. package/dist/chat-ui/mentions/suggestions/data/types.js.map +1 -1
  424. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs +56 -5
  425. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs.map +1 -1
  426. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.d.ts +26 -6
  427. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js +57 -6
  428. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js.map +1 -1
  429. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.cjs +34 -17
  430. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.cjs.map +1 -1
  431. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.d.ts +19 -1
  432. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.js +35 -18
  433. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.js.map +1 -1
  434. package/dist/chat-ui/mentions/use-asset-icon-app-url.cjs +12 -0
  435. package/dist/chat-ui/mentions/use-asset-icon-app-url.cjs.map +1 -0
  436. package/dist/chat-ui/mentions/use-asset-icon-app-url.d.ts +8 -0
  437. package/dist/chat-ui/mentions/use-asset-icon-app-url.js +12 -0
  438. package/dist/chat-ui/mentions/use-asset-icon-app-url.js.map +1 -0
  439. package/dist/chat-ui/statewire.d.ts +1 -1
  440. package/dist/chat-ui/thread/statewire-history-edge.cjs +15 -0
  441. package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
  442. package/dist/chat-ui/thread/statewire-history-edge.d.ts +4 -1
  443. package/dist/chat-ui/thread/statewire-history-edge.js +15 -0
  444. package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
  445. package/dist/collab/client.cjs +41 -6
  446. package/dist/collab/client.cjs.map +1 -1
  447. package/dist/collab/client.d.ts +38 -7
  448. package/dist/collab/client.js +41 -6
  449. package/dist/collab/client.js.map +1 -1
  450. package/dist/composer/ComposerAttachedReferences.cjs +119 -0
  451. package/dist/composer/ComposerAttachedReferences.cjs.map +1 -0
  452. package/dist/composer/ComposerAttachedReferences.d.ts +26 -0
  453. package/dist/composer/ComposerAttachedReferences.js +119 -0
  454. package/dist/composer/ComposerAttachedReferences.js.map +1 -0
  455. package/dist/composer/ComposerNamedAgents.cjs +63 -0
  456. package/dist/composer/ComposerNamedAgents.cjs.map +1 -0
  457. package/dist/composer/ComposerNamedAgents.d.ts +16 -0
  458. package/dist/composer/ComposerNamedAgents.js +63 -0
  459. package/dist/composer/ComposerNamedAgents.js.map +1 -0
  460. package/dist/composer/attached-references.cjs +159 -0
  461. package/dist/composer/attached-references.cjs.map +1 -0
  462. package/dist/composer/attached-references.d.ts +86 -0
  463. package/dist/composer/attached-references.js +159 -0
  464. package/dist/composer/attached-references.js.map +1 -0
  465. package/dist/composer/build-composed-message.cjs +14 -7
  466. package/dist/composer/build-composed-message.cjs.map +1 -1
  467. package/dist/composer/build-composed-message.d.ts +6 -1
  468. package/dist/composer/build-composed-message.js +14 -7
  469. package/dist/composer/build-composed-message.js.map +1 -1
  470. package/dist/composer/composer-handoff.cjs +6 -2
  471. package/dist/composer/composer-handoff.cjs.map +1 -1
  472. package/dist/composer/composer-handoff.d.ts +7 -1
  473. package/dist/composer/composer-handoff.js +6 -2
  474. package/dist/composer/composer-handoff.js.map +1 -1
  475. package/dist/composer/folder-upload.cjs +149 -0
  476. package/dist/composer/folder-upload.cjs.map +1 -0
  477. package/dist/composer/folder-upload.d.ts +79 -0
  478. package/dist/composer/folder-upload.js +149 -0
  479. package/dist/composer/folder-upload.js.map +1 -0
  480. package/dist/composer/index.d.ts +1 -1
  481. package/dist/composer/staged-message-metadata.cjs +12 -0
  482. package/dist/composer/staged-message-metadata.cjs.map +1 -0
  483. package/dist/composer/staged-message-metadata.d.ts +15 -0
  484. package/dist/composer/staged-message-metadata.js +12 -0
  485. package/dist/composer/staged-message-metadata.js.map +1 -0
  486. package/dist/composer/useAttachToChat.cjs +35 -0
  487. package/dist/composer/useAttachToChat.cjs.map +1 -0
  488. package/dist/composer/useAttachToChat.d.ts +54 -0
  489. package/dist/composer/useAttachToChat.js +35 -0
  490. package/dist/composer/useAttachToChat.js.map +1 -0
  491. package/dist/composer/useAttachedReferencesComposerProps.cjs +19 -0
  492. package/dist/composer/useAttachedReferencesComposerProps.cjs.map +1 -0
  493. package/dist/composer/useAttachedReferencesComposerProps.d.ts +12 -0
  494. package/dist/composer/useAttachedReferencesComposerProps.js +19 -0
  495. package/dist/composer/useAttachedReferencesComposerProps.js.map +1 -0
  496. package/dist/composer/useFileUpload.cjs +95 -7
  497. package/dist/composer/useFileUpload.cjs.map +1 -1
  498. package/dist/composer/useFileUpload.d.ts +21 -2
  499. package/dist/composer/useFileUpload.js +95 -7
  500. package/dist/composer/useFileUpload.js.map +1 -1
  501. package/dist/data/athena-api-error.cjs +125 -0
  502. package/dist/data/athena-api-error.cjs.map +1 -0
  503. package/dist/data/athena-api-error.d.ts +96 -0
  504. package/dist/data/athena-api-error.js +125 -0
  505. package/dist/data/athena-api-error.js.map +1 -0
  506. package/dist/data/athena-data-client.cjs +106 -0
  507. package/dist/data/athena-data-client.cjs.map +1 -0
  508. package/dist/data/athena-data-client.d.ts +74 -0
  509. package/dist/data/athena-data-client.js +106 -0
  510. package/dist/data/athena-data-client.js.map +1 -0
  511. package/dist/data/athena-member.cjs +93 -0
  512. package/dist/data/athena-member.cjs.map +1 -0
  513. package/dist/data/athena-member.d.ts +125 -0
  514. package/dist/data/athena-member.js +93 -0
  515. package/dist/data/athena-member.js.map +1 -0
  516. package/dist/data/athena-request.cjs +460 -0
  517. package/dist/data/athena-request.cjs.map +1 -0
  518. package/dist/data/athena-request.d.ts +120 -0
  519. package/dist/data/athena-request.js +460 -0
  520. package/dist/data/athena-request.js.map +1 -0
  521. package/dist/data/use-athena-fetch.cjs +14 -0
  522. package/dist/data/use-athena-fetch.cjs.map +1 -0
  523. package/dist/data/use-athena-fetch.d.ts +19 -0
  524. package/dist/data/use-athena-fetch.js +14 -0
  525. package/dist/data/use-athena-fetch.js.map +1 -0
  526. package/dist/data/use-athena-graphql.cjs +66 -0
  527. package/dist/data/use-athena-graphql.cjs.map +1 -0
  528. package/dist/data/use-athena-graphql.d.ts +56 -0
  529. package/dist/data/use-athena-graphql.js +66 -0
  530. package/dist/data/use-athena-graphql.js.map +1 -0
  531. package/dist/data/use-athena-rest.cjs +33 -0
  532. package/dist/data/use-athena-rest.cjs.map +1 -0
  533. package/dist/data/use-athena-rest.d.ts +21 -0
  534. package/dist/data/use-athena-rest.js +33 -0
  535. package/dist/data/use-athena-rest.js.map +1 -0
  536. package/dist/data/use-semantic-query.cjs +44 -0
  537. package/dist/data/use-semantic-query.cjs.map +1 -0
  538. package/dist/data/use-semantic-query.d.ts +92 -0
  539. package/dist/data/use-semantic-query.js +44 -0
  540. package/dist/data/use-semantic-query.js.map +1 -0
  541. package/dist/diagnostics/athena-diagnostics.cjs.map +1 -1
  542. package/dist/diagnostics/athena-diagnostics.d.ts +5 -1
  543. package/dist/diagnostics/athena-diagnostics.js.map +1 -1
  544. package/dist/diagnostics/errors.cjs +7 -0
  545. package/dist/diagnostics/errors.cjs.map +1 -1
  546. package/dist/diagnostics/errors.d.ts +7 -0
  547. package/dist/diagnostics/errors.js +7 -0
  548. package/dist/diagnostics/errors.js.map +1 -1
  549. package/dist/index.cjs +155 -11
  550. package/dist/index.cjs.map +1 -1
  551. package/dist/index.d.ts +72 -13
  552. package/dist/index.js +148 -4
  553. package/dist/index.js.map +1 -1
  554. package/dist/keryx-http/src/initial-sync.cjs +64 -16
  555. package/dist/keryx-http/src/initial-sync.cjs.map +1 -1
  556. package/dist/keryx-http/src/initial-sync.d.ts +31 -1
  557. package/dist/keryx-http/src/initial-sync.js +64 -16
  558. package/dist/keryx-http/src/initial-sync.js.map +1 -1
  559. package/dist/keryx-http/src/own-awareness.cjs +20 -0
  560. package/dist/keryx-http/src/own-awareness.cjs.map +1 -0
  561. package/dist/keryx-http/src/own-awareness.d.ts +50 -0
  562. package/dist/keryx-http/src/own-awareness.js +20 -0
  563. package/dist/keryx-http/src/own-awareness.js.map +1 -0
  564. package/dist/keryx-http/src/update-attributions.cjs +26 -1
  565. package/dist/keryx-http/src/update-attributions.cjs.map +1 -1
  566. package/dist/keryx-http/src/update-attributions.d.ts +10 -1
  567. package/dist/keryx-http/src/update-attributions.js +26 -1
  568. package/dist/keryx-http/src/update-attributions.js.map +1 -1
  569. package/dist/offline/chat-outbox.cjs +262 -26
  570. package/dist/offline/chat-outbox.cjs.map +1 -1
  571. package/dist/offline/chat-outbox.d.ts +90 -12
  572. package/dist/offline/chat-outbox.js +263 -27
  573. package/dist/offline/chat-outbox.js.map +1 -1
  574. package/dist/provider/AthenaProvider.cjs +60 -22
  575. package/dist/provider/AthenaProvider.cjs.map +1 -1
  576. package/dist/provider/AthenaProvider.d.ts +24 -8
  577. package/dist/provider/AthenaProvider.js +61 -23
  578. package/dist/provider/AthenaProvider.js.map +1 -1
  579. package/dist/react/package.json.cjs +1 -1
  580. package/dist/react/package.json.js +1 -1
  581. package/dist/references/src/anchors/parse.cjs +11 -1
  582. package/dist/references/src/anchors/parse.cjs.map +1 -1
  583. package/dist/references/src/anchors/parse.js +11 -1
  584. package/dist/references/src/anchors/parse.js.map +1 -1
  585. package/dist/references/src/anchors/schemas.d.ts +1 -0
  586. package/dist/references/src/anchors/serialize.cjs +1 -0
  587. package/dist/references/src/anchors/serialize.cjs.map +1 -1
  588. package/dist/references/src/anchors/serialize.js +1 -0
  589. package/dist/references/src/anchors/serialize.js.map +1 -1
  590. package/dist/references/src/anchors/types.cjs +5 -0
  591. package/dist/references/src/anchors/types.cjs.map +1 -1
  592. package/dist/references/src/anchors/types.d.ts +9 -0
  593. package/dist/references/src/anchors/types.js +5 -0
  594. package/dist/references/src/anchors/types.js.map +1 -1
  595. package/dist/references/src/attachable.cjs +149 -0
  596. package/dist/references/src/attachable.cjs.map +1 -0
  597. package/dist/references/src/attachable.d.ts +87 -0
  598. package/dist/references/src/attachable.js +149 -0
  599. package/dist/references/src/attachable.js.map +1 -0
  600. package/dist/references/src/schemas.d.ts +2 -0
  601. package/dist/runtime/StatewirePlanModeLaneSync.cjs +93 -0
  602. package/dist/runtime/StatewirePlanModeLaneSync.cjs.map +1 -0
  603. package/dist/runtime/StatewirePlanModeLaneSync.d.ts +34 -0
  604. package/dist/runtime/StatewirePlanModeLaneSync.js +93 -0
  605. package/dist/runtime/StatewirePlanModeLaneSync.js.map +1 -0
  606. package/dist/runtime/StatewireThreadConfigLaneSync.cjs +2 -0
  607. package/dist/runtime/StatewireThreadConfigLaneSync.cjs.map +1 -1
  608. package/dist/runtime/StatewireThreadConfigLaneSync.d.ts +4 -0
  609. package/dist/runtime/StatewireThreadConfigLaneSync.js +2 -0
  610. package/dist/runtime/StatewireThreadConfigLaneSync.js.map +1 -1
  611. package/dist/runtime/statewire-plan-mode.cjs +71 -0
  612. package/dist/runtime/statewire-plan-mode.cjs.map +1 -0
  613. package/dist/runtime/statewire-plan-mode.d.ts +88 -0
  614. package/dist/runtime/statewire-plan-mode.js +71 -0
  615. package/dist/runtime/statewire-plan-mode.js.map +1 -0
  616. package/dist/runtime/statewire-run-config.cjs +3 -1
  617. package/dist/runtime/statewire-run-config.cjs.map +1 -1
  618. package/dist/runtime/statewire-run-config.d.ts +7 -0
  619. package/dist/runtime/statewire-run-config.js +3 -1
  620. package/dist/runtime/statewire-run-config.js.map +1 -1
  621. package/dist/runtime/statewire-session-key.cjs +11 -5
  622. package/dist/runtime/statewire-session-key.cjs.map +1 -1
  623. package/dist/runtime/statewire-session-key.d.ts +22 -10
  624. package/dist/runtime/statewire-session-key.js +11 -5
  625. package/dist/runtime/statewire-session-key.js.map +1 -1
  626. package/dist/runtime/useAthenaStatewireRuntime.cjs +64 -9
  627. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
  628. package/dist/runtime/useAthenaStatewireRuntime.d.ts +26 -10
  629. package/dist/runtime/useAthenaStatewireRuntime.js +66 -11
  630. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
  631. package/dist/search/useAthenaAssets.cjs +394 -0
  632. package/dist/search/useAthenaAssets.cjs.map +1 -0
  633. package/dist/search/useAthenaAssets.d.ts +186 -0
  634. package/dist/search/useAthenaAssets.js +394 -0
  635. package/dist/search/useAthenaAssets.js.map +1 -0
  636. package/dist/sheet-range/index.cjs +4 -0
  637. package/dist/sheet-range/index.cjs.map +1 -1
  638. package/dist/sheet-range/index.d.ts +4 -2
  639. package/dist/sheet-range/index.js +4 -0
  640. package/dist/sheet-range/index.js.map +1 -1
  641. package/dist/sheet-range/query-range.cjs +102 -0
  642. package/dist/sheet-range/query-range.cjs.map +1 -0
  643. package/dist/sheet-range/query-range.d.ts +46 -0
  644. package/dist/sheet-range/query-range.js +102 -0
  645. package/dist/sheet-range/query-range.js.map +1 -0
  646. package/dist/styles.css +1 -1
  647. package/dist/subagents/index.cjs +49 -0
  648. package/dist/subagents/index.cjs.map +1 -0
  649. package/dist/subagents/index.d.ts +16 -0
  650. package/dist/subagents/index.js +49 -0
  651. package/dist/subagents/index.js.map +1 -0
  652. package/dist/subagents/lane-follow.cjs +19 -0
  653. package/dist/subagents/lane-follow.cjs.map +1 -0
  654. package/dist/subagents/lane-follow.d.ts +9 -0
  655. package/dist/subagents/lane-follow.js +19 -0
  656. package/dist/subagents/lane-follow.js.map +1 -0
  657. package/dist/subagents/lane-model.cjs +178 -0
  658. package/dist/subagents/lane-model.cjs.map +1 -0
  659. package/dist/subagents/lane-model.d.ts +140 -0
  660. package/dist/subagents/lane-model.js +178 -0
  661. package/dist/subagents/lane-model.js.map +1 -0
  662. package/dist/subagents/lane-parts.cjs +517 -0
  663. package/dist/subagents/lane-parts.cjs.map +1 -0
  664. package/dist/subagents/lane-parts.d.ts +130 -0
  665. package/dist/subagents/lane-parts.js +517 -0
  666. package/dist/subagents/lane-parts.js.map +1 -0
  667. package/dist/subagents/subagent-lane-group.cjs +215 -0
  668. package/dist/subagents/subagent-lane-group.cjs.map +1 -0
  669. package/dist/subagents/subagent-lane-group.d.ts +67 -0
  670. package/dist/subagents/subagent-lane-group.js +215 -0
  671. package/dist/subagents/subagent-lane-group.js.map +1 -0
  672. package/dist/subagents/subagent-transcript-drawer.cjs +431 -0
  673. package/dist/subagents/subagent-transcript-drawer.cjs.map +1 -0
  674. package/dist/subagents/subagent-transcript-drawer.d.ts +78 -0
  675. package/dist/subagents/subagent-transcript-drawer.js +431 -0
  676. package/dist/subagents/subagent-transcript-drawer.js.map +1 -0
  677. package/dist/subagents/task-subagent-group.cjs +115 -0
  678. package/dist/subagents/task-subagent-group.cjs.map +1 -0
  679. package/dist/subagents/task-subagent-group.d.ts +36 -0
  680. package/dist/subagents/task-subagent-group.js +115 -0
  681. package/dist/subagents/task-subagent-group.js.map +1 -0
  682. package/dist/subagents/use-omitted-images-in-view.cjs +68 -0
  683. package/dist/subagents/use-omitted-images-in-view.cjs.map +1 -0
  684. package/dist/subagents/use-omitted-images-in-view.d.ts +21 -0
  685. package/dist/subagents/use-omitted-images-in-view.js +68 -0
  686. package/dist/subagents/use-omitted-images-in-view.js.map +1 -0
  687. package/dist/threads/Inbox.cjs +2 -2
  688. package/dist/threads/Inbox.cjs.map +1 -1
  689. package/dist/threads/SessionList.cjs +6 -6
  690. package/dist/threads/SessionList.cjs.map +1 -1
  691. package/dist/threads/SessionsPage.cjs +13 -7
  692. package/dist/threads/SessionsPage.cjs.map +1 -1
  693. package/dist/threads/SessionsPage.d.ts +10 -1
  694. package/dist/threads/SessionsPage.js +9 -3
  695. package/dist/threads/SessionsPage.js.map +1 -1
  696. package/dist/threads/session-list-model.cjs.map +1 -1
  697. package/dist/threads/session-list-model.d.ts +2 -1
  698. package/dist/threads/session-list-model.js.map +1 -1
  699. package/dist/threads/session-row-parts.cjs +3 -3
  700. package/dist/threads/session-row-parts.cjs.map +1 -1
  701. package/dist/threads/sessions-page-model.cjs +13 -5
  702. package/dist/threads/sessions-page-model.cjs.map +1 -1
  703. package/dist/threads/sessions-page-model.d.ts +7 -0
  704. package/dist/threads/sessions-page-model.js +11 -3
  705. package/dist/threads/sessions-page-model.js.map +1 -1
  706. package/dist/threads/sessions-page-storage.cjs +8 -8
  707. package/dist/threads/sessions-page-storage.cjs.map +1 -1
  708. package/dist/threads/sessions-page-storage.d.ts +5 -1
  709. package/dist/threads/sessions-page-storage.js +8 -8
  710. package/dist/threads/sessions-page-storage.js.map +1 -1
  711. package/dist/threads/statewire-thread-list.cjs +14 -2
  712. package/dist/threads/statewire-thread-list.cjs.map +1 -1
  713. package/dist/threads/statewire-thread-list.d.ts +11 -2
  714. package/dist/threads/statewire-thread-list.js +14 -2
  715. package/dist/threads/statewire-thread-list.js.map +1 -1
  716. package/dist/threads/use-athena-sessions.cjs +1 -0
  717. package/dist/threads/use-athena-sessions.cjs.map +1 -1
  718. package/dist/threads/use-athena-sessions.d.ts +7 -0
  719. package/dist/threads/use-athena-sessions.js +1 -0
  720. package/dist/threads/use-athena-sessions.js.map +1 -1
  721. package/dist/threads/use-athena-thread-agent.cjs +31 -0
  722. package/dist/threads/use-athena-thread-agent.cjs.map +1 -0
  723. package/dist/threads/use-athena-thread-agent.d.ts +38 -0
  724. package/dist/threads/use-athena-thread-agent.js +31 -0
  725. package/dist/threads/use-athena-thread-agent.js.map +1 -0
  726. package/dist/threads/use-athena-thread-plan-mode.cjs +18 -0
  727. package/dist/threads/use-athena-thread-plan-mode.cjs.map +1 -0
  728. package/dist/threads/use-athena-thread-plan-mode.d.ts +18 -0
  729. package/dist/threads/use-athena-thread-plan-mode.js +18 -0
  730. package/dist/threads/use-athena-thread-plan-mode.js.map +1 -0
  731. package/dist/threads/use-rest-conversation-history.d.ts +1 -0
  732. package/dist/tools/agent-creations.cjs +97 -0
  733. package/dist/tools/agent-creations.cjs.map +1 -0
  734. package/dist/tools/agent-creations.d.ts +38 -0
  735. package/dist/tools/agent-creations.js +97 -0
  736. package/dist/tools/agent-creations.js.map +1 -0
  737. package/dist/tools/agent-highlights.cjs +100 -0
  738. package/dist/tools/agent-highlights.cjs.map +1 -0
  739. package/dist/tools/agent-highlights.d.ts +57 -0
  740. package/dist/tools/agent-highlights.js +100 -0
  741. package/dist/tools/agent-highlights.js.map +1 -0
  742. package/dist/tools/append-document-tool-ui.cjs +1 -0
  743. package/dist/tools/append-document-tool-ui.cjs.map +1 -1
  744. package/dist/tools/append-document-tool-ui.d.ts +7 -0
  745. package/dist/tools/append-document-tool-ui.js +2 -1
  746. package/dist/tools/append-document-tool-ui.js.map +1 -1
  747. package/dist/tools/auto-open-tools.cjs +144 -71
  748. package/dist/tools/auto-open-tools.cjs.map +1 -1
  749. package/dist/tools/auto-open-tools.d.ts +131 -1
  750. package/dist/tools/auto-open-tools.js +145 -72
  751. package/dist/tools/auto-open-tools.js.map +1 -1
  752. package/dist/tools/browser-tool-uis.cjs +594 -0
  753. package/dist/tools/browser-tool-uis.cjs.map +1 -0
  754. package/dist/tools/browser-tool-uis.d.ts +8 -0
  755. package/dist/tools/browser-tool-uis.js +594 -0
  756. package/dist/tools/browser-tool-uis.js.map +1 -0
  757. package/dist/tools/computer-asset-tool-uis.cjs +313 -0
  758. package/dist/tools/computer-asset-tool-uis.cjs.map +1 -0
  759. package/dist/tools/computer-asset-tool-uis.d.ts +5 -0
  760. package/dist/tools/computer-asset-tool-uis.js +313 -0
  761. package/dist/tools/computer-asset-tool-uis.js.map +1 -0
  762. package/dist/tools/document-edit-tool-uis.cjs +218 -0
  763. package/dist/tools/document-edit-tool-uis.cjs.map +1 -0
  764. package/dist/tools/document-edit-tool-uis.d.ts +40 -0
  765. package/dist/tools/document-edit-tool-uis.js +218 -0
  766. package/dist/tools/document-edit-tool-uis.js.map +1 -0
  767. package/dist/tools/drive-tool-uis.cjs +429 -0
  768. package/dist/tools/drive-tool-uis.cjs.map +1 -0
  769. package/dist/tools/drive-tool-uis.d.ts +121 -0
  770. package/dist/tools/drive-tool-uis.js +429 -0
  771. package/dist/tools/drive-tool-uis.js.map +1 -0
  772. package/dist/tools/email-calendar-tool-uis.cjs +789 -0
  773. package/dist/tools/email-calendar-tool-uis.cjs.map +1 -0
  774. package/dist/tools/email-calendar-tool-uis.d.ts +129 -0
  775. package/dist/tools/email-calendar-tool-uis.js +789 -0
  776. package/dist/tools/email-calendar-tool-uis.js.map +1 -0
  777. package/dist/tools/ontology-tool-uis.cjs +83 -0
  778. package/dist/tools/ontology-tool-uis.cjs.map +1 -0
  779. package/dist/tools/ontology-tool-uis.d.ts +9 -0
  780. package/dist/tools/ontology-tool-uis.js +83 -0
  781. package/dist/tools/ontology-tool-uis.js.map +1 -0
  782. package/dist/tools/orchestration-tool-uis.cjs +586 -0
  783. package/dist/tools/orchestration-tool-uis.cjs.map +1 -0
  784. package/dist/tools/orchestration-tool-uis.d.ts +141 -0
  785. package/dist/tools/orchestration-tool-uis.js +586 -0
  786. package/dist/tools/orchestration-tool-uis.js.map +1 -0
  787. package/dist/tools/presentation-edit-tool-uis.cjs +516 -0
  788. package/dist/tools/presentation-edit-tool-uis.cjs.map +1 -0
  789. package/dist/tools/presentation-edit-tool-uis.d.ts +73 -0
  790. package/dist/tools/presentation-edit-tool-uis.js +516 -0
  791. package/dist/tools/presentation-edit-tool-uis.js.map +1 -0
  792. package/dist/tools/project-tool-uis.cjs +213 -0
  793. package/dist/tools/project-tool-uis.cjs.map +1 -0
  794. package/dist/tools/project-tool-uis.d.ts +14 -0
  795. package/dist/tools/project-tool-uis.js +213 -0
  796. package/dist/tools/project-tool-uis.js.map +1 -0
  797. package/dist/tools/sandbox-tool-uis.cjs +491 -0
  798. package/dist/tools/sandbox-tool-uis.cjs.map +1 -0
  799. package/dist/tools/sandbox-tool-uis.d.ts +116 -0
  800. package/dist/tools/sandbox-tool-uis.js +491 -0
  801. package/dist/tools/sandbox-tool-uis.js.map +1 -0
  802. package/dist/tools/sheet-query-tool-ui.cjs +138 -0
  803. package/dist/tools/sheet-query-tool-ui.cjs.map +1 -0
  804. package/dist/tools/sheet-query-tool-ui.d.ts +15 -0
  805. package/dist/tools/sheet-query-tool-ui.js +138 -0
  806. package/dist/tools/sheet-query-tool-ui.js.map +1 -0
  807. package/dist/tools/studio-screenshot-tool-uis.cjs +262 -0
  808. package/dist/tools/studio-screenshot-tool-uis.cjs.map +1 -0
  809. package/dist/tools/studio-screenshot-tool-uis.d.ts +52 -0
  810. package/dist/tools/studio-screenshot-tool-uis.js +262 -0
  811. package/dist/tools/studio-screenshot-tool-uis.js.map +1 -0
  812. package/dist/tools/subagent-task-tool-ui.cjs +24 -475
  813. package/dist/tools/subagent-task-tool-ui.cjs.map +1 -1
  814. package/dist/tools/subagent-task-tool-ui.d.ts +19 -103
  815. package/dist/tools/subagent-task-tool-ui.js +28 -479
  816. package/dist/tools/subagent-task-tool-ui.js.map +1 -1
  817. package/dist/tools/tool-summary.cjs +36 -0
  818. package/dist/tools/tool-summary.cjs.map +1 -1
  819. package/dist/tools/tool-summary.js +36 -0
  820. package/dist/tools/tool-summary.js.map +1 -1
  821. package/dist/tools/tool-uis.cjs +181 -53
  822. package/dist/tools/tool-uis.cjs.map +1 -1
  823. package/dist/tools/tool-uis.d.ts +40 -0
  824. package/dist/tools/tool-uis.js +183 -55
  825. package/dist/tools/tool-uis.js.map +1 -1
  826. package/dist/typed-interrupts/index.cjs +15 -0
  827. package/dist/typed-interrupts/index.cjs.map +1 -0
  828. package/dist/typed-interrupts/index.d.ts +20 -0
  829. package/dist/typed-interrupts/index.js +15 -0
  830. package/dist/typed-interrupts/index.js.map +1 -0
  831. package/dist/version.cjs +4 -0
  832. package/dist/version.cjs.map +1 -1
  833. package/dist/version.d.ts +9 -0
  834. package/dist/version.js +4 -0
  835. package/dist/version.js.map +1 -1
  836. package/dist/workbench/live-desktop-api.cjs +2 -1
  837. package/dist/workbench/live-desktop-api.cjs.map +1 -1
  838. package/dist/workbench/live-desktop-api.js +2 -1
  839. package/dist/workbench/live-desktop-api.js.map +1 -1
  840. package/dist/workbench/session-workbench-panes.cjs +6 -6
  841. package/dist/workbench/session-workbench-panes.cjs.map +1 -1
  842. package/dist/workbench/session-workspace-api.cjs +7 -2
  843. package/dist/workbench/session-workspace-api.cjs.map +1 -1
  844. package/dist/workbench/session-workspace-api.d.ts +10 -0
  845. package/dist/workbench/session-workspace-api.js +7 -2
  846. package/dist/workbench/session-workspace-api.js.map +1 -1
  847. package/package.json +28 -6
  848. package/dist/agent-runtime/src/chat-outbox-store.cjs +0 -510
  849. package/dist/agent-runtime/src/chat-outbox-store.cjs.map +0 -1
  850. package/dist/agent-runtime/src/chat-outbox-store.d.ts +0 -210
  851. package/dist/agent-runtime/src/chat-outbox-store.js +0 -510
  852. package/dist/agent-runtime/src/chat-outbox-store.js.map +0 -1
@@ -14,8 +14,14 @@ function makeMentionUrl(attrs) {
14
14
  if (attrs.type === "user") {
15
15
  const params2 = new URLSearchParams({ id: attrs.id });
16
16
  if (attrs.id.includes("@")) params2.set("email", attrs.id);
17
+ if (attrs.name) params2.set("name", attrs.name);
17
18
  return `mention://person?${params2.toString()}`;
18
19
  }
20
+ if (attrs.type === "group") {
21
+ const params2 = new URLSearchParams({ id: attrs.id });
22
+ if (attrs.name) params2.set("name", attrs.name);
23
+ return `mention://group?${params2.toString()}`;
24
+ }
19
25
  if (attrs.type === "tab") {
20
26
  const params2 = new URLSearchParams({
21
27
  tab_id: attrs.id,
@@ -40,11 +46,12 @@ function parseMentionAnchorAttributes({
40
46
  const url = new URL(href);
41
47
  const isWebpage = url.hostname === "webpage";
42
48
  const isPerson = url.hostname === "person";
49
+ const isGroup = url.hostname === "group";
43
50
  return {
44
51
  href,
45
52
  type: isWebpage ? "tab" : isPerson ? "user" : url.hostname || "tool",
46
53
  name: (textContent == null ? void 0 : textContent.replace(/^@/, "")) || "",
47
- id: isWebpage ? url.searchParams.get("tab_id") || "" : isPerson ? url.searchParams.get("id") || url.searchParams.get("email") || "" : url.searchParams.get("name") || url.searchParams.get("id") || "",
54
+ id: isWebpage ? url.searchParams.get("tab_id") || "" : isPerson ? url.searchParams.get("id") || url.searchParams.get("email") || "" : isGroup ? url.searchParams.get("id") || "" : url.searchParams.get("name") || url.searchParams.get("id") || "",
48
55
  title: url.searchParams.get("title") || "",
49
56
  url: url.searchParams.get("url") || "",
50
57
  description: url.searchParams.get("description") || "",
@@ -1 +1 @@
1
- {"version":3,"file":"mention-extension.js","sources":["../../../src/chat-ui/mentions/mention-extension.ts"],"sourcesContent":["/**\n * Tiptap Mention Node Extension\n *\n * Defines the mention node type used in the editor. When a mention is\n * inserted, it creates a non-editable inline node with metadata.\n *\n * Renders as a chip with: [icon] Name. Serializes — to plain text and to\n * Markdown alike — as `[@Name](url)`, and parses that link back into a chip.\n */\n\nimport { mergeAttributes, Node } from \"@tiptap/core\";\nimport type { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\n\nexport function makeMentionUrl(attrs: { id: string; type: string; name: string; title?: string; url?: string; description?: string; thumbnailUrl?: string; assetType?: string; href?: string }): string {\n if (attrs.href && (attrs.href.startsWith(\"mention://\") || ASSET_MENTION_HREF.test(attrs.href))) {\n return attrs.href;\n }\n if (attrs.type === \"tool\" || attrs.type === \"toolkit\") {\n return `mention://${attrs.type}?name=${encodeURIComponent(attrs.id)}&description=${encodeURIComponent(attrs.description ?? \"\")}`;\n }\n if (attrs.type === \"asset\") {\n const params = new URLSearchParams({ asset_ids: attrs.id });\n if (attrs.assetType) params.set(\"assetType\", attrs.assetType);\n return `/dashboard/spaces?${params.toString()}`;\n }\n if (attrs.type === \"user\") {\n // The canonical person reference Olympus writes (packages/references\n // `encodeToPersonMentionUri`); members are keyed on their email.\n const params = new URLSearchParams({ id: attrs.id });\n if (attrs.id.includes(\"@\")) params.set(\"email\", attrs.id);\n return `mention://person?${params.toString()}`;\n }\n if (attrs.type === \"tab\") {\n const params = new URLSearchParams({\n tab_id: attrs.id,\n url: attrs.url ?? \"\",\n title: attrs.title ?? attrs.name,\n });\n return `mention://webpage?${params.toString()}`;\n }\n // Include athenaOriginalType and thumbnailUrl so the chip can be reconstructed\n const params = new URLSearchParams();\n params.set(\"id\", attrs.id);\n if (attrs.assetType) params.set(\"assetType\", attrs.assetType);\n if (attrs.thumbnailUrl) params.set(\"thumb\", attrs.thumbnailUrl);\n return `mention://${encodeURIComponent(attrs.type)}?${params.toString()}`;\n}\n\nexport interface MentionNodeAttrs {\n type: string;\n name: string;\n id: string;\n title?: string;\n url?: string;\n description?: string;\n thumbnailUrl?: string;\n fallbackIcon?: string;\n assetType?: string;\n displayAsPreview?: boolean;\n href?: string;\n}\n\n/** The `[@Name](url)` form a mention takes in the outgoing text. */\nexport function serializeMention(attrs: MentionNodeAttrs): string {\n return `[@${attrs.name}](${makeMentionUrl(attrs)})`;\n}\n\nexport function parseMentionAnchorAttributes({\n href,\n textContent,\n}: {\n href: string;\n textContent: string | null;\n}): MentionNodeAttrs {\n const url = new URL(href);\n const isWebpage = url.hostname === \"webpage\";\n const isPerson = url.hostname === \"person\";\n return {\n href,\n type: isWebpage ? \"tab\" : isPerson ? \"user\" : url.hostname || \"tool\",\n name: textContent?.replace(/^@/, \"\") || \"\",\n id: isWebpage\n ? url.searchParams.get(\"tab_id\") || \"\"\n : isPerson\n ? url.searchParams.get(\"id\") || url.searchParams.get(\"email\") || \"\"\n : url.searchParams.get(\"name\") || url.searchParams.get(\"id\") || \"\",\n title: url.searchParams.get(\"title\") || \"\",\n url: url.searchParams.get(\"url\") || \"\",\n description: url.searchParams.get(\"description\") || \"\",\n thumbnailUrl: url.searchParams.get(\"thumb\") || \"\",\n fallbackIcon: \"\",\n assetType: url.searchParams.get(\"assetType\") || \"\",\n };\n}\n\n/** The asset link `makeMentionUrl` writes (`/dashboard/spaces?asset_ids=…`). */\nconst ASSET_MENTION_HREF = /^(?:https?:\\/\\/[^/]+)?\\/dashboard\\/spaces\\/?\\?/;\n\n/**\n * Attributes of an asset mention from its `/dashboard/spaces?asset_ids=…`\n * link, or null for a spaces link that names no asset.\n */\nexport function parseAssetAnchorAttributes({\n href,\n textContent,\n}: {\n href: string;\n textContent: string | null;\n}): MentionNodeAttrs | null {\n if (!ASSET_MENTION_HREF.test(href)) return null;\n const params = new URLSearchParams(href.slice(href.indexOf(\"?\") + 1));\n const id = params.get(\"asset_ids\");\n if (!id) return null;\n return {\n type: \"asset\",\n href,\n name: textContent?.replace(/^@/, \"\") || \"\",\n id,\n assetType: params.get(\"assetType\") || \"\",\n };\n}\n\ninterface MarkdownSerializerState {\n write(text: string): void;\n}\n\n/**\n * ProseMirror tries parse rules by rule priority (default 50), mark rules\n * before node rules at a tie: a serialized mention is an anchor, so its rules\n * must outrank the Link mark's `a[href]` rule or the chip comes back as a\n * plain link.\n */\nconst ANCHOR_RULE_PRIORITY = 100;\n\nexport const MentionExtension = Node.create({\n name: \"mention\",\n group: \"inline\",\n inline: true,\n selectable: false,\n atom: true,\n\n addAttributes() {\n return {\n href: { default: null },\n type: { default: \"tool\" },\n name: { default: \"\" },\n id: { default: \"\" },\n title: { default: \"\" },\n url: { default: \"\" },\n description: { default: \"\" },\n thumbnailUrl: { default: \"\" },\n fallbackIcon: { default: \"\" },\n assetType: { default: \"\" },\n displayAsPreview: { default: false },\n };\n },\n\n /** tiptap-markdown reads this spec so `getMarkdown()` writes the mention, not HTML. */\n addStorage() {\n return {\n markdown: {\n serialize(state: MarkdownSerializerState, node: ProseMirrorNode) {\n state.write(serializeMention(node.attrs as MentionNodeAttrs));\n },\n parse: {\n // The Markdown parser renders the link to an anchor; parseHTML takes it from there.\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: \"span[data-mention]\",\n getAttrs: (dom) => {\n const el = dom as HTMLElement;\n return {\n href: el.getAttribute(\"data-href\"),\n type: el.getAttribute(\"data-type\") || \"tool\",\n name: el.getAttribute(\"data-name\") || el.textContent?.replace(/^@/, \"\") || \"\",\n id: el.getAttribute(\"data-id\") || \"\",\n title: el.getAttribute(\"data-title\") || \"\",\n url: el.getAttribute(\"data-url\") || \"\",\n description: el.getAttribute(\"data-description\") || \"\",\n thumbnailUrl: el.getAttribute(\"data-thumbnail-url\") || \"\",\n fallbackIcon: el.getAttribute(\"data-fallback-icon\") || \"\",\n assetType: el.getAttribute(\"data-asset-type\") || \"\",\n displayAsPreview:\n el.getAttribute(\"data-display-as-preview\") === \"true\",\n };\n },\n },\n {\n tag: \"a[href^='mention://']\",\n priority: ANCHOR_RULE_PRIORITY,\n getAttrs: (dom) => {\n const el = dom as HTMLAnchorElement;\n try {\n return parseMentionAnchorAttributes({\n href: el.getAttribute(\"href\") ?? el.href,\n textContent: el.textContent,\n });\n } catch {\n return false;\n }\n },\n },\n {\n tag: \"a[href]\",\n priority: ANCHOR_RULE_PRIORITY,\n getAttrs: (dom) => {\n const el = dom as HTMLAnchorElement;\n return (\n parseAssetAnchorAttributes({\n href: el.getAttribute(\"href\") ?? \"\",\n textContent: el.textContent,\n }) ?? false\n );\n },\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const thumbnailUrl = node.attrs.thumbnailUrl;\n\n // Build child elements: [icon] name\n const children: any[] = [];\n\n if (thumbnailUrl) {\n // Render SVG thumbnail as an img element inside the chip\n children.push([\n \"img\",\n {\n src: thumbnailUrl,\n alt: \"\",\n class:\n node.attrs.type === \"user\"\n ? \"mention-chip-icon mention-chip-avatar\"\n : \"mention-chip-icon\",\n draggable: \"false\",\n },\n ]);\n }\n\n children.push([\"span\", { class: \"mention-chip-text\" }, node.attrs.name]);\n\n return [\n \"span\",\n mergeAttributes(HTMLAttributes, {\n \"data-mention\": \"\",\n \"data-href\": node.attrs.href || \"\",\n \"data-type\": node.attrs.type,\n \"data-name\": node.attrs.name,\n \"data-id\": node.attrs.id,\n \"data-title\": node.attrs.title || \"\",\n \"data-url\": node.attrs.url || \"\",\n \"data-thumbnail-url\": node.attrs.thumbnailUrl || \"\",\n \"data-asset-type\": node.attrs.assetType || \"\",\n \"data-display-as-preview\": String(node.attrs.displayAsPreview === true),\n class: \"mention-chip\",\n }),\n ...children,\n ];\n },\n\n renderText({ node }) {\n return serializeMention(node.attrs as MentionNodeAttrs);\n },\n});\n"],"names":["params"],"mappings":"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"}
1
+ {"version":3,"file":"mention-extension.js","sources":["../../../src/chat-ui/mentions/mention-extension.ts"],"sourcesContent":["/**\n * Tiptap Mention Node Extension\n *\n * Defines the mention node type used in the editor. When a mention is\n * inserted, it creates a non-editable inline node with metadata.\n *\n * Renders as a chip with: [icon] Name. Serializes — to plain text and to\n * Markdown alike — as `[@Name](url)`, and parses that link back into a chip.\n */\n\nimport { mergeAttributes, Node } from \"@tiptap/core\";\nimport type { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\n\nexport function makeMentionUrl(attrs: { id: string; type: string; name: string; title?: string; url?: string; description?: string; thumbnailUrl?: string; assetType?: string; href?: string }): string {\n if (attrs.href && (attrs.href.startsWith(\"mention://\") || ASSET_MENTION_HREF.test(attrs.href))) {\n return attrs.href;\n }\n if (attrs.type === \"tool\" || attrs.type === \"toolkit\") {\n return `mention://${attrs.type}?name=${encodeURIComponent(attrs.id)}&description=${encodeURIComponent(attrs.description ?? \"\")}`;\n }\n if (attrs.type === \"asset\") {\n const params = new URLSearchParams({ asset_ids: attrs.id });\n if (attrs.assetType) params.set(\"assetType\", attrs.assetType);\n return `/dashboard/spaces?${params.toString()}`;\n }\n if (attrs.type === \"user\") {\n // The canonical person reference Olympus writes (packages/references\n // `encodeToPersonMentionUri`): `id`, `email`, then the name the menu showed.\n // Members are keyed on their email.\n const params = new URLSearchParams({ id: attrs.id });\n if (attrs.id.includes(\"@\")) params.set(\"email\", attrs.id);\n if (attrs.name) params.set(\"name\", attrs.name);\n return `mention://person?${params.toString()}`;\n }\n if (attrs.type === \"group\") {\n // A pointer to the group, not to its members (`encodeToGroupMentionUri`):\n // it shares nothing and notifies nobody.\n const params = new URLSearchParams({ id: attrs.id });\n if (attrs.name) params.set(\"name\", attrs.name);\n return `mention://group?${params.toString()}`;\n }\n if (attrs.type === \"tab\") {\n const params = new URLSearchParams({\n tab_id: attrs.id,\n url: attrs.url ?? \"\",\n title: attrs.title ?? attrs.name,\n });\n return `mention://webpage?${params.toString()}`;\n }\n // Include athenaOriginalType and thumbnailUrl so the chip can be reconstructed\n const params = new URLSearchParams();\n params.set(\"id\", attrs.id);\n if (attrs.assetType) params.set(\"assetType\", attrs.assetType);\n if (attrs.thumbnailUrl) params.set(\"thumb\", attrs.thumbnailUrl);\n return `mention://${encodeURIComponent(attrs.type)}?${params.toString()}`;\n}\n\nexport interface MentionNodeAttrs {\n type: string;\n name: string;\n id: string;\n title?: string;\n url?: string;\n description?: string;\n thumbnailUrl?: string;\n fallbackIcon?: string;\n assetType?: string;\n displayAsPreview?: boolean;\n href?: string;\n}\n\n/** The `[@Name](url)` form a mention takes in the outgoing text. */\nexport function serializeMention(attrs: MentionNodeAttrs): string {\n return `[@${attrs.name}](${makeMentionUrl(attrs)})`;\n}\n\nexport function parseMentionAnchorAttributes({\n href,\n textContent,\n}: {\n href: string;\n textContent: string | null;\n}): MentionNodeAttrs {\n const url = new URL(href);\n const isWebpage = url.hostname === \"webpage\";\n const isPerson = url.hostname === \"person\";\n // A group's `name` is only its label; it is named by its id.\n const isGroup = url.hostname === \"group\";\n return {\n href,\n type: isWebpage ? \"tab\" : isPerson ? \"user\" : url.hostname || \"tool\",\n name: textContent?.replace(/^@/, \"\") || \"\",\n id: isWebpage\n ? url.searchParams.get(\"tab_id\") || \"\"\n : isPerson\n ? url.searchParams.get(\"id\") || url.searchParams.get(\"email\") || \"\"\n : isGroup\n ? url.searchParams.get(\"id\") || \"\"\n : url.searchParams.get(\"name\") || url.searchParams.get(\"id\") || \"\",\n title: url.searchParams.get(\"title\") || \"\",\n url: url.searchParams.get(\"url\") || \"\",\n description: url.searchParams.get(\"description\") || \"\",\n thumbnailUrl: url.searchParams.get(\"thumb\") || \"\",\n fallbackIcon: \"\",\n assetType: url.searchParams.get(\"assetType\") || \"\",\n };\n}\n\n/** The asset link `makeMentionUrl` writes (`/dashboard/spaces?asset_ids=…`). */\nconst ASSET_MENTION_HREF = /^(?:https?:\\/\\/[^/]+)?\\/dashboard\\/spaces\\/?\\?/;\n\n/**\n * Attributes of an asset mention from its `/dashboard/spaces?asset_ids=…`\n * link, or null for a spaces link that names no asset.\n */\nexport function parseAssetAnchorAttributes({\n href,\n textContent,\n}: {\n href: string;\n textContent: string | null;\n}): MentionNodeAttrs | null {\n if (!ASSET_MENTION_HREF.test(href)) return null;\n const params = new URLSearchParams(href.slice(href.indexOf(\"?\") + 1));\n const id = params.get(\"asset_ids\");\n if (!id) return null;\n return {\n type: \"asset\",\n href,\n name: textContent?.replace(/^@/, \"\") || \"\",\n id,\n assetType: params.get(\"assetType\") || \"\",\n };\n}\n\ninterface MarkdownSerializerState {\n write(text: string): void;\n}\n\n/**\n * ProseMirror tries parse rules by rule priority (default 50), mark rules\n * before node rules at a tie: a serialized mention is an anchor, so its rules\n * must outrank the Link mark's `a[href]` rule or the chip comes back as a\n * plain link.\n */\nconst ANCHOR_RULE_PRIORITY = 100;\n\nexport const MentionExtension = Node.create({\n name: \"mention\",\n group: \"inline\",\n inline: true,\n selectable: false,\n atom: true,\n\n addAttributes() {\n return {\n href: { default: null },\n type: { default: \"tool\" },\n name: { default: \"\" },\n id: { default: \"\" },\n title: { default: \"\" },\n url: { default: \"\" },\n description: { default: \"\" },\n thumbnailUrl: { default: \"\" },\n fallbackIcon: { default: \"\" },\n assetType: { default: \"\" },\n displayAsPreview: { default: false },\n };\n },\n\n /** tiptap-markdown reads this spec so `getMarkdown()` writes the mention, not HTML. */\n addStorage() {\n return {\n markdown: {\n serialize(state: MarkdownSerializerState, node: ProseMirrorNode) {\n state.write(serializeMention(node.attrs as MentionNodeAttrs));\n },\n parse: {\n // The Markdown parser renders the link to an anchor; parseHTML takes it from there.\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: \"span[data-mention]\",\n getAttrs: (dom) => {\n const el = dom as HTMLElement;\n return {\n href: el.getAttribute(\"data-href\"),\n type: el.getAttribute(\"data-type\") || \"tool\",\n name: el.getAttribute(\"data-name\") || el.textContent?.replace(/^@/, \"\") || \"\",\n id: el.getAttribute(\"data-id\") || \"\",\n title: el.getAttribute(\"data-title\") || \"\",\n url: el.getAttribute(\"data-url\") || \"\",\n description: el.getAttribute(\"data-description\") || \"\",\n thumbnailUrl: el.getAttribute(\"data-thumbnail-url\") || \"\",\n fallbackIcon: el.getAttribute(\"data-fallback-icon\") || \"\",\n assetType: el.getAttribute(\"data-asset-type\") || \"\",\n displayAsPreview:\n el.getAttribute(\"data-display-as-preview\") === \"true\",\n };\n },\n },\n {\n tag: \"a[href^='mention://']\",\n priority: ANCHOR_RULE_PRIORITY,\n getAttrs: (dom) => {\n const el = dom as HTMLAnchorElement;\n try {\n return parseMentionAnchorAttributes({\n href: el.getAttribute(\"href\") ?? el.href,\n textContent: el.textContent,\n });\n } catch {\n return false;\n }\n },\n },\n {\n tag: \"a[href]\",\n priority: ANCHOR_RULE_PRIORITY,\n getAttrs: (dom) => {\n const el = dom as HTMLAnchorElement;\n return (\n parseAssetAnchorAttributes({\n href: el.getAttribute(\"href\") ?? \"\",\n textContent: el.textContent,\n }) ?? false\n );\n },\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const thumbnailUrl = node.attrs.thumbnailUrl;\n\n // Build child elements: [icon] name\n const children: any[] = [];\n\n if (thumbnailUrl) {\n // Render SVG thumbnail as an img element inside the chip\n children.push([\n \"img\",\n {\n src: thumbnailUrl,\n alt: \"\",\n class:\n node.attrs.type === \"user\"\n ? \"mention-chip-icon mention-chip-avatar\"\n : \"mention-chip-icon\",\n draggable: \"false\",\n },\n ]);\n }\n\n children.push([\"span\", { class: \"mention-chip-text\" }, node.attrs.name]);\n\n return [\n \"span\",\n mergeAttributes(HTMLAttributes, {\n \"data-mention\": \"\",\n \"data-href\": node.attrs.href || \"\",\n \"data-type\": node.attrs.type,\n \"data-name\": node.attrs.name,\n \"data-id\": node.attrs.id,\n \"data-title\": node.attrs.title || \"\",\n \"data-url\": node.attrs.url || \"\",\n \"data-thumbnail-url\": node.attrs.thumbnailUrl || \"\",\n \"data-asset-type\": node.attrs.assetType || \"\",\n \"data-display-as-preview\": String(node.attrs.displayAsPreview === true),\n class: \"mention-chip\",\n }),\n ...children,\n ];\n },\n\n renderText({ node }) {\n return serializeMention(node.attrs as MentionNodeAttrs);\n },\n});\n"],"names":["params"],"mappings":"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"}
@@ -11,6 +11,7 @@ const KNOWN_SCOPE_NAMES = {
11
11
  tools: "Tools",
12
12
  toolkits: "Toolkits",
13
13
  team: "Team",
14
+ athena_chat_agents: "Agents",
14
15
  workspace: "Workspace",
15
16
  drive_catalogs: "Drives",
16
17
  athena_projects: "Projects",
@@ -1 +1 @@
1
- {"version":3,"file":"get-scope-name.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/get-scope-name.ts"],"sourcesContent":["import type { MenuScope } from '../data/types';\nimport type { MentionSuggestionsStore } from '../data/use-mention-suggestions';\n\n/**\n * Known category scope names\n *\n * These are the top-level menu categories that have stable IDs.\n */\nconst KNOWN_SCOPE_NAMES: Record<MenuScope, string> = {\n root: 'All',\n global_search: 'Search',\n // Legacy order: my_spaces, favorites, assets, folders, tools, toolkits, team, workspace, drives\n my_spaces: 'My Spaces',\n favorites: 'Favorites',\n athena_assets: 'Assets',\n athena_folders: 'Folders',\n tools: 'Tools',\n toolkits: 'Toolkits',\n team: 'Team',\n workspace: 'Workspace',\n drive_catalogs: 'Drives',\n athena_projects: 'Projects',\n athena_browse_profiles: 'Browse Profiles',\n // Additional scopes\n asset_search: 'Search',\n};\n\n/**\n * getScopeName - Get friendly display name for a scope\n *\n * Strategy:\n * 1. Check known category names (fast path)\n * 2. Look up dynamic item in cache (folders, assets, etc.)\n * 3. Fall back to scope ID itself\n *\n * @param scope - The scope ID to look up\n * @param store - The mention suggestions store (to access cache)\n * @returns Friendly display name\n */\nexport function getScopeName(scope: MenuScope, store: MentionSuggestionsStore): string {\n // Fast path: known category\n const knownName = KNOWN_SCOPE_NAMES[scope];\n if (knownName) {\n return knownName;\n }\n\n // Dynamic path: look up item in cache\n // This handles folders, assets, SharePoint sites, etc.\n const { cache } = store.state;\n const allItems = Object.values(cache.items);\n\n // Find item that navigates to this scope\n const item = allItems.find((item) => item.navigatesToScope === scope);\n if (item) {\n return item.name;\n }\n\n // Fallback: format scope ID\n // folder_123 → Folder 123\n // sharepoint_abc → Sharepoint Abc\n return scope\n .split('_')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(' ');\n}\n"],"names":["item"],"mappings":";;AAQA,MAAM,oBAA+C;AAAA,EACnD,MAAM;AAAA,EACN,eAAe;AAAA;AAAA,EAEf,WAAW;AAAA,EACX,WAAW;AAAA,EACX,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,UAAU;AAAA,EACV,MAAM;AAAA,EACN,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,wBAAwB;AAAA;AAAA,EAExB,cAAc;AAChB;AAcO,SAAS,aAAa,OAAkB,OAAwC;AAErF,QAAM,YAAY,kBAAkB,KAAK;AACzC,MAAI,WAAW;AACb,WAAO;AAAA,EACT;AAIA,QAAM,EAAE,UAAU,MAAM;AACxB,QAAM,WAAW,OAAO,OAAO,MAAM,KAAK;AAG1C,QAAM,OAAO,SAAS,KAAK,CAACA,UAASA,MAAK,qBAAqB,KAAK;AACpE,MAAI,MAAM;AACR,WAAO,KAAK;AAAA,EACd;AAKA,SAAO,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAA,IAAgB,KAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,GAAG;AACb;;"}
1
+ {"version":3,"file":"get-scope-name.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/get-scope-name.ts"],"sourcesContent":["import type { MenuScope } from '../data/types';\nimport type { MentionSuggestionsStore } from '../data/use-mention-suggestions';\n\n/**\n * Known category scope names\n *\n * These are the top-level menu categories that have stable IDs.\n */\nconst KNOWN_SCOPE_NAMES: Record<MenuScope, string> = {\n root: 'All',\n global_search: 'Search',\n // Legacy order: my_spaces, favorites, assets, folders, tools, toolkits, team, workspace, drives\n my_spaces: 'My Spaces',\n favorites: 'Favorites',\n athena_assets: 'Assets',\n athena_folders: 'Folders',\n tools: 'Tools',\n toolkits: 'Toolkits',\n team: 'Team',\n athena_chat_agents: 'Agents',\n workspace: 'Workspace',\n drive_catalogs: 'Drives',\n athena_projects: 'Projects',\n athena_browse_profiles: 'Browse Profiles',\n // Additional scopes\n asset_search: 'Search',\n};\n\n/**\n * getScopeName - Get friendly display name for a scope\n *\n * Strategy:\n * 1. Check known category names (fast path)\n * 2. Look up dynamic item in cache (folders, assets, etc.)\n * 3. Fall back to scope ID itself\n *\n * @param scope - The scope ID to look up\n * @param store - The mention suggestions store (to access cache)\n * @returns Friendly display name\n */\nexport function getScopeName(scope: MenuScope, store: MentionSuggestionsStore): string {\n // Fast path: known category\n const knownName = KNOWN_SCOPE_NAMES[scope];\n if (knownName) {\n return knownName;\n }\n\n // Dynamic path: look up item in cache\n // This handles folders, assets, SharePoint sites, etc.\n const { cache } = store.state;\n const allItems = Object.values(cache.items);\n\n // Find item that navigates to this scope\n const item = allItems.find((item) => item.navigatesToScope === scope);\n if (item) {\n return item.name;\n }\n\n // Fallback: format scope ID\n // folder_123 → Folder 123\n // sharepoint_abc → Sharepoint Abc\n return scope\n .split('_')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(' ');\n}\n"],"names":["item"],"mappings":";;AAQA,MAAM,oBAA+C;AAAA,EACnD,MAAM;AAAA,EACN,eAAe;AAAA;AAAA,EAEf,WAAW;AAAA,EACX,WAAW;AAAA,EACX,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,UAAU;AAAA,EACV,MAAM;AAAA,EACN,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,wBAAwB;AAAA;AAAA,EAExB,cAAc;AAChB;AAcO,SAAS,aAAa,OAAkB,OAAwC;AAErF,QAAM,YAAY,kBAAkB,KAAK;AACzC,MAAI,WAAW;AACb,WAAO;AAAA,EACT;AAIA,QAAM,EAAE,UAAU,MAAM;AACxB,QAAM,WAAW,OAAO,OAAO,MAAM,KAAK;AAG1C,QAAM,OAAO,SAAS,KAAK,CAACA,UAASA,MAAK,qBAAqB,KAAK;AACpE,MAAI,MAAM;AACR,WAAO,KAAK;AAAA,EACd;AAKA,SAAO,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAA,IAAgB,KAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,GAAG;AACb;;"}
@@ -9,6 +9,7 @@ const KNOWN_SCOPE_NAMES = {
9
9
  tools: "Tools",
10
10
  toolkits: "Toolkits",
11
11
  team: "Team",
12
+ athena_chat_agents: "Agents",
12
13
  workspace: "Workspace",
13
14
  drive_catalogs: "Drives",
14
15
  athena_projects: "Projects",
@@ -1 +1 @@
1
- {"version":3,"file":"get-scope-name.js","sources":["../../../../../src/chat-ui/mentions/suggestions/components/get-scope-name.ts"],"sourcesContent":["import type { MenuScope } from '../data/types';\nimport type { MentionSuggestionsStore } from '../data/use-mention-suggestions';\n\n/**\n * Known category scope names\n *\n * These are the top-level menu categories that have stable IDs.\n */\nconst KNOWN_SCOPE_NAMES: Record<MenuScope, string> = {\n root: 'All',\n global_search: 'Search',\n // Legacy order: my_spaces, favorites, assets, folders, tools, toolkits, team, workspace, drives\n my_spaces: 'My Spaces',\n favorites: 'Favorites',\n athena_assets: 'Assets',\n athena_folders: 'Folders',\n tools: 'Tools',\n toolkits: 'Toolkits',\n team: 'Team',\n workspace: 'Workspace',\n drive_catalogs: 'Drives',\n athena_projects: 'Projects',\n athena_browse_profiles: 'Browse Profiles',\n // Additional scopes\n asset_search: 'Search',\n};\n\n/**\n * getScopeName - Get friendly display name for a scope\n *\n * Strategy:\n * 1. Check known category names (fast path)\n * 2. Look up dynamic item in cache (folders, assets, etc.)\n * 3. Fall back to scope ID itself\n *\n * @param scope - The scope ID to look up\n * @param store - The mention suggestions store (to access cache)\n * @returns Friendly display name\n */\nexport function getScopeName(scope: MenuScope, store: MentionSuggestionsStore): string {\n // Fast path: known category\n const knownName = KNOWN_SCOPE_NAMES[scope];\n if (knownName) {\n return knownName;\n }\n\n // Dynamic path: look up item in cache\n // This handles folders, assets, SharePoint sites, etc.\n const { cache } = store.state;\n const allItems = Object.values(cache.items);\n\n // Find item that navigates to this scope\n const item = allItems.find((item) => item.navigatesToScope === scope);\n if (item) {\n return item.name;\n }\n\n // Fallback: format scope ID\n // folder_123 → Folder 123\n // sharepoint_abc → Sharepoint Abc\n return scope\n .split('_')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(' ');\n}\n"],"names":["item"],"mappings":"AAQA,MAAM,oBAA+C;AAAA,EACnD,MAAM;AAAA,EACN,eAAe;AAAA;AAAA,EAEf,WAAW;AAAA,EACX,WAAW;AAAA,EACX,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,UAAU;AAAA,EACV,MAAM;AAAA,EACN,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,wBAAwB;AAAA;AAAA,EAExB,cAAc;AAChB;AAcO,SAAS,aAAa,OAAkB,OAAwC;AAErF,QAAM,YAAY,kBAAkB,KAAK;AACzC,MAAI,WAAW;AACb,WAAO;AAAA,EACT;AAIA,QAAM,EAAE,UAAU,MAAM;AACxB,QAAM,WAAW,OAAO,OAAO,MAAM,KAAK;AAG1C,QAAM,OAAO,SAAS,KAAK,CAACA,UAASA,MAAK,qBAAqB,KAAK;AACpE,MAAI,MAAM;AACR,WAAO,KAAK;AAAA,EACd;AAKA,SAAO,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAA,IAAgB,KAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,GAAG;AACb;"}
1
+ {"version":3,"file":"get-scope-name.js","sources":["../../../../../src/chat-ui/mentions/suggestions/components/get-scope-name.ts"],"sourcesContent":["import type { MenuScope } from '../data/types';\nimport type { MentionSuggestionsStore } from '../data/use-mention-suggestions';\n\n/**\n * Known category scope names\n *\n * These are the top-level menu categories that have stable IDs.\n */\nconst KNOWN_SCOPE_NAMES: Record<MenuScope, string> = {\n root: 'All',\n global_search: 'Search',\n // Legacy order: my_spaces, favorites, assets, folders, tools, toolkits, team, workspace, drives\n my_spaces: 'My Spaces',\n favorites: 'Favorites',\n athena_assets: 'Assets',\n athena_folders: 'Folders',\n tools: 'Tools',\n toolkits: 'Toolkits',\n team: 'Team',\n athena_chat_agents: 'Agents',\n workspace: 'Workspace',\n drive_catalogs: 'Drives',\n athena_projects: 'Projects',\n athena_browse_profiles: 'Browse Profiles',\n // Additional scopes\n asset_search: 'Search',\n};\n\n/**\n * getScopeName - Get friendly display name for a scope\n *\n * Strategy:\n * 1. Check known category names (fast path)\n * 2. Look up dynamic item in cache (folders, assets, etc.)\n * 3. Fall back to scope ID itself\n *\n * @param scope - The scope ID to look up\n * @param store - The mention suggestions store (to access cache)\n * @returns Friendly display name\n */\nexport function getScopeName(scope: MenuScope, store: MentionSuggestionsStore): string {\n // Fast path: known category\n const knownName = KNOWN_SCOPE_NAMES[scope];\n if (knownName) {\n return knownName;\n }\n\n // Dynamic path: look up item in cache\n // This handles folders, assets, SharePoint sites, etc.\n const { cache } = store.state;\n const allItems = Object.values(cache.items);\n\n // Find item that navigates to this scope\n const item = allItems.find((item) => item.navigatesToScope === scope);\n if (item) {\n return item.name;\n }\n\n // Fallback: format scope ID\n // folder_123 → Folder 123\n // sharepoint_abc → Sharepoint Abc\n return scope\n .split('_')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(' ');\n}\n"],"names":["item"],"mappings":"AAQA,MAAM,oBAA+C;AAAA,EACnD,MAAM;AAAA,EACN,eAAe;AAAA;AAAA,EAEf,WAAW;AAAA,EACX,WAAW;AAAA,EACX,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,UAAU;AAAA,EACV,MAAM;AAAA,EACN,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,wBAAwB;AAAA;AAAA,EAExB,cAAc;AAChB;AAcO,SAAS,aAAa,OAAkB,OAAwC;AAErF,QAAM,YAAY,kBAAkB,KAAK;AACzC,MAAI,WAAW;AACb,WAAO;AAAA,EACT;AAIA,QAAM,EAAE,UAAU,MAAM;AACxB,QAAM,WAAW,OAAO,OAAO,MAAM,KAAK;AAG1C,QAAM,OAAO,SAAS,KAAK,CAACA,UAASA,MAAK,qBAAqB,KAAK;AACpE,MAAI,MAAM;AACR,WAAO,KAAK;AAAA,EACd;AAKA,SAAO,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAA,IAAgB,KAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,GAAG;AACb;"}
@@ -1,6 +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 require$$0 = require("react");
4
5
  const lucideReact = require("lucide-react");
5
6
  const ICON_MAP = {
6
7
  // General
@@ -14,6 +15,8 @@ const ICON_MAP = {
14
15
  star: lucideReact.StarIcon,
15
16
  users: lucideReact.UsersIcon,
16
17
  user: lucideReact.UserIcon,
18
+ // The agents a message can name (the Agents section).
19
+ bot: lucideReact.BotIcon,
17
20
  wrench: lucideReact.WrenchIcon,
18
21
  package: lucideReact.PackageIcon,
19
22
  building2: lucideReact.Building2Icon,
@@ -74,14 +77,28 @@ function resolveMentionIcon(name) {
74
77
  return ICON_MAP[name] ?? ICON_MAP[toKebabIconName(name)];
75
78
  }
76
79
  const ICON_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9-]*$/;
80
+ function useThumbnailLoadFailure(url) {
81
+ const [failedUrl, setFailedUrl] = require$$0.useState();
82
+ const imageRef = require$$0.useCallback(
83
+ (image) => {
84
+ if (!image || !url) return void 0;
85
+ const fail = () => setFailedUrl(url);
86
+ image.addEventListener("error", fail);
87
+ return () => image.removeEventListener("error", fail);
88
+ },
89
+ [url]
90
+ );
91
+ return { failed: !!url && failedUrl === url, imageRef };
92
+ }
77
93
  function MentionIcon({
78
94
  fallbackIcon,
79
95
  thumbnailUrl,
80
96
  alt,
81
97
  className = "w-4 h-4 flex-shrink-0"
82
98
  }) {
83
- if (thumbnailUrl) {
84
- return /* @__PURE__ */ jsxRuntime.jsx("img", { src: thumbnailUrl, alt: alt ?? "", className });
99
+ const thumbnail = useThumbnailLoadFailure(thumbnailUrl);
100
+ if (thumbnailUrl && !thumbnail.failed) {
101
+ return /* @__PURE__ */ jsxRuntime.jsx("img", { ref: thumbnail.imageRef, src: thumbnailUrl, alt: alt ?? "", className });
85
102
  }
86
103
  const Icon = fallbackIcon ? resolveMentionIcon(fallbackIcon) : void 0;
87
104
  if (Icon) return /* @__PURE__ */ jsxRuntime.jsx(Icon, { className });
@@ -92,4 +109,5 @@ function MentionIcon({
92
109
  }
93
110
  exports.MentionIcon = MentionIcon;
94
111
  exports.resolveMentionIcon = resolveMentionIcon;
112
+ exports.useThumbnailLoadFailure = useThumbnailLoadFailure;
95
113
  //# sourceMappingURL=mention-icon.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"mention-icon.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/mention-icon.tsx"],"sourcesContent":["/**\n * Mention icon component.\n * Maps string icon names to Lucide icon components.\n */\n\nimport type { FC } from \"react\";\nimport {\n BookOpenIcon,\n BoxesIcon,\n BriefcaseBusinessIcon,\n Building2Icon,\n CableIcon,\n CalendarIcon,\n CameraIcon,\n ChartBarIcon,\n CheckSquareIcon,\n Code2Icon,\n FileSpreadsheetIcon,\n MegaphoneIcon,\n MessageSquareIcon,\n PanelTopIcon,\n PresentationIcon,\n ServerIcon,\n SettingsIcon,\n Table2Icon,\n TerminalIcon,\n CloudIcon,\n CodeIcon,\n DatabaseIcon,\n EyeIcon,\n FileCodeIcon,\n FileIcon,\n FileTextIcon,\n FolderIcon,\n FolderKanbanIcon,\n GlobeIcon,\n HardDriveIcon,\n HeadphonesIcon,\n ImageIcon,\n KeyIcon,\n KeyboardIcon,\n LayoutDashboardIcon,\n LayoutGridIcon,\n LayoutIcon,\n LibraryIcon,\n MailIcon,\n MicIcon,\n MonitorIcon,\n PackageIcon,\n PaletteIcon,\n PenToolIcon,\n PhoneIcon,\n SearchIcon,\n SheetIcon,\n SmartphoneIcon,\n SparklesIcon,\n StarIcon,\n TableIcon,\n UserIcon,\n UsersIcon,\n VideoIcon,\n WrenchIcon,\n ZapIcon,\n WorkflowIcon,\n} from \"lucide-react\";\n\nconst ICON_MAP: Record<string, FC<{ className?: string }>> = {\n // General\n file: FileIcon,\n \"file-text\": FileTextIcon,\n \"file-code\": FileCodeIcon,\n folder: FolderIcon,\n \"folder-kanban\": FolderKanbanIcon,\n globe: GlobeIcon,\n search: SearchIcon,\n star: StarIcon,\n users: UsersIcon,\n user: UserIcon,\n wrench: WrenchIcon,\n package: PackageIcon,\n building2: Building2Icon,\n \"hard-drive\": HardDriveIcon,\n \"layout-grid\": LayoutGridIcon,\n zap: ZapIcon,\n eye: EyeIcon,\n\n // Chrome tools\n camera: CameraIcon,\n keyboard: KeyboardIcon,\n code: CodeIcon,\n monitor: MonitorIcon,\n\n // Asset types\n image: ImageIcon,\n video: VideoIcon,\n headphones: HeadphonesIcon,\n mic: MicIcon,\n mail: MailIcon,\n calendar: CalendarIcon,\n phone: PhoneIcon,\n database: DatabaseIcon,\n table: TableIcon,\n sheet: SheetIcon,\n palette: PaletteIcon,\n \"pen-tool\": PenToolIcon,\n layout: LayoutIcon,\n \"layout-dashboard\": LayoutDashboardIcon,\n library: LibraryIcon,\n \"book-open\": BookOpenIcon,\n sparkles: SparklesIcon,\n \"check-square\": CheckSquareIcon,\n key: KeyIcon,\n smartphone: SmartphoneIcon,\n cloud: CloudIcon,\n workflow: WorkflowIcon,\n // The presentation asset type and the presentation toolkits share this key.\n presentation: PresentationIcon,\n\n // Toolkit icons (the SDK's toolkit display info names these in PascalCase;\n // the digit-suffixed ones kebab-case to `code2` / `table2`)\n boxes: BoxesIcon,\n \"briefcase-business\": BriefcaseBusinessIcon,\n cable: CableIcon,\n \"chart-bar\": ChartBarIcon,\n code2: Code2Icon,\n \"file-spreadsheet\": FileSpreadsheetIcon,\n megaphone: MegaphoneIcon,\n \"message-square\": MessageSquareIcon,\n \"panel-top\": PanelTopIcon,\n server: ServerIcon,\n settings: SettingsIcon,\n table2: Table2Icon,\n terminal: TerminalIcon,\n};\n\n/** Backend icon names arrive as Lucide PascalCase (`FolderKanban`). */\nfunction toKebabIconName(name: string): string {\n return name\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1-$2\")\n .toLowerCase();\n}\n\n/** The Lucide component for an icon name (kebab or PascalCase), or undefined for an unknown name. */\nexport function resolveMentionIcon(name: string): FC<{ className?: string }> | undefined {\n return ICON_MAP[name] ?? ICON_MAP[toKebabIconName(name)];\n}\n\nconst ICON_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9-]*$/;\n\nexport function MentionIcon({\n fallbackIcon,\n thumbnailUrl,\n alt,\n className = \"w-4 h-4 flex-shrink-0\",\n}: {\n fallbackIcon?: string;\n thumbnailUrl?: string;\n alt?: string;\n className?: string;\n}) {\n if (thumbnailUrl) {\n return <img src={thumbnailUrl} alt={alt ?? \"\"} className={className} />;\n }\n const Icon = fallbackIcon ? resolveMentionIcon(fallbackIcon) : undefined;\n if (Icon) return <Icon className={className} />;\n // Emoji fallback; unmapped icon names render as the generic file icon\n if (fallbackIcon && !ICON_NAME_PATTERN.test(fallbackIcon)) {\n return <span className=\"text-sm flex-shrink-0\">{fallbackIcon}</span>;\n }\n return <FileIcon className={className} />;\n}\n"],"names":["FileIcon","FileTextIcon","FileCodeIcon","FolderIcon","FolderKanbanIcon","GlobeIcon","SearchIcon","StarIcon","UsersIcon","UserIcon","WrenchIcon","PackageIcon","Building2Icon","HardDriveIcon","LayoutGridIcon","ZapIcon","EyeIcon","CameraIcon","KeyboardIcon","CodeIcon","MonitorIcon","ImageIcon","VideoIcon","HeadphonesIcon","MicIcon","MailIcon","CalendarIcon","PhoneIcon","DatabaseIcon","TableIcon","SheetIcon","PaletteIcon","PenToolIcon","LayoutIcon","LayoutDashboardIcon","LibraryIcon","BookOpenIcon","SparklesIcon","CheckSquareIcon","KeyIcon","SmartphoneIcon","CloudIcon","WorkflowIcon","PresentationIcon","BoxesIcon","BriefcaseBusinessIcon","CableIcon","ChartBarIcon","Code2Icon","FileSpreadsheetIcon","MegaphoneIcon","MessageSquareIcon","PanelTopIcon","ServerIcon","SettingsIcon","Table2Icon","TerminalIcon","jsx"],"mappings":";;;;AAkEA,MAAM,WAAuD;AAAA;AAAA,EAE3D,MAAMA,YAAAA;AAAAA,EACN,aAAaC,YAAAA;AAAAA,EACb,aAAaC,YAAAA;AAAAA,EACb,QAAQC,YAAAA;AAAAA,EACR,iBAAiBC,YAAAA;AAAAA,EACjB,OAAOC,YAAAA;AAAAA,EACP,QAAQC,YAAAA;AAAAA,EACR,MAAMC,YAAAA;AAAAA,EACN,OAAOC,YAAAA;AAAAA,EACP,MAAMC,YAAAA;AAAAA,EACN,QAAQC,YAAAA;AAAAA,EACR,SAASC,YAAAA;AAAAA,EACT,WAAWC,YAAAA;AAAAA,EACX,cAAcC,YAAAA;AAAAA,EACd,eAAeC,YAAAA;AAAAA,EACf,KAAKC,YAAAA;AAAAA,EACL,KAAKC,YAAAA;AAAAA;AAAAA,EAGL,QAAQC,YAAAA;AAAAA,EACR,UAAUC,YAAAA;AAAAA,EACV,MAAMC,YAAAA;AAAAA,EACN,SAASC,YAAAA;AAAAA;AAAAA,EAGT,OAAOC,YAAAA;AAAAA,EACP,OAAOC,YAAAA;AAAAA,EACP,YAAYC,YAAAA;AAAAA,EACZ,KAAKC,YAAAA;AAAAA,EACL,MAAMC,YAAAA;AAAAA,EACN,UAAUC,YAAAA;AAAAA,EACV,OAAOC,YAAAA;AAAAA,EACP,UAAUC,YAAAA;AAAAA,EACV,OAAOC,YAAAA;AAAAA,EACP,OAAOC,YAAAA;AAAAA,EACP,SAASC,YAAAA;AAAAA,EACT,YAAYC,YAAAA;AAAAA,EACZ,QAAQC,YAAAA;AAAAA,EACR,oBAAoBC,YAAAA;AAAAA,EACpB,SAASC,YAAAA;AAAAA,EACT,aAAaC,YAAAA;AAAAA,EACb,UAAUC,YAAAA;AAAAA,EACV,gBAAgBC,YAAAA;AAAAA,EAChB,KAAKC,YAAAA;AAAAA,EACL,YAAYC,YAAAA;AAAAA,EACZ,OAAOC,YAAAA;AAAAA,EACP,UAAUC,YAAAA;AAAAA;AAAAA,EAEV,cAAcC,YAAAA;AAAAA;AAAAA;AAAAA,EAId,OAAOC,YAAAA;AAAAA,EACP,sBAAsBC,YAAAA;AAAAA,EACtB,OAAOC,YAAAA;AAAAA,EACP,aAAaC,YAAAA;AAAAA,EACb,OAAOC,YAAAA;AAAAA,EACP,oBAAoBC,YAAAA;AAAAA,EACpB,WAAWC,YAAAA;AAAAA,EACX,kBAAkBC,YAAAA;AAAAA,EAClB,aAAaC,YAAAA;AAAAA,EACb,QAAQC,YAAAA;AAAAA,EACR,UAAUC,YAAAA;AAAAA,EACV,QAAQC,YAAAA;AAAAA,EACR,UAAUC,YAAAA;AACZ;AAGA,SAAS,gBAAgB,MAAsB;AAC7C,SAAO,KACJ,QAAQ,sBAAsB,OAAO,EACrC,QAAQ,yBAAyB,OAAO,EACxC,YAAA;AACL;AAGO,SAAS,mBAAmB,MAAsD;AACvF,SAAO,SAAS,IAAI,KAAK,SAAS,gBAAgB,IAAI,CAAC;AACzD;AAEA,MAAM,oBAAoB;AAEnB,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,GAKG;AACD,MAAI,cAAc;AAChB,0CAAQ,OAAA,EAAI,KAAK,cAAc,KAAK,OAAO,IAAI,WAAsB;AAAA,EACvE;AACA,QAAM,OAAO,eAAe,mBAAmB,YAAY,IAAI;AAC/D,MAAI,KAAM,QAAOC,2BAAAA,IAAC,MAAA,EAAK,UAAA,CAAsB;AAE7C,MAAI,gBAAgB,CAAC,kBAAkB,KAAK,YAAY,GAAG;AACzD,WAAOA,2BAAAA,IAAC,QAAA,EAAK,WAAU,yBAAyB,UAAA,cAAa;AAAA,EAC/D;AACA,SAAOA,+BAACzD,YAAAA,YAAS,WAAsB;AACzC;;;"}
1
+ {"version":3,"file":"mention-icon.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/mention-icon.tsx"],"sourcesContent":["/**\n * Mention icon component.\n * Maps string icon names to Lucide icon components.\n */\n\nimport { useCallback, useState, type FC } from \"react\";\nimport {\n BookOpenIcon,\n BotIcon,\n BoxesIcon,\n BriefcaseBusinessIcon,\n Building2Icon,\n CableIcon,\n CalendarIcon,\n CameraIcon,\n ChartBarIcon,\n CheckSquareIcon,\n Code2Icon,\n FileSpreadsheetIcon,\n MegaphoneIcon,\n MessageSquareIcon,\n PanelTopIcon,\n PresentationIcon,\n ServerIcon,\n SettingsIcon,\n Table2Icon,\n TerminalIcon,\n CloudIcon,\n CodeIcon,\n DatabaseIcon,\n EyeIcon,\n FileCodeIcon,\n FileIcon,\n FileTextIcon,\n FolderIcon,\n FolderKanbanIcon,\n GlobeIcon,\n HardDriveIcon,\n HeadphonesIcon,\n ImageIcon,\n KeyIcon,\n KeyboardIcon,\n LayoutDashboardIcon,\n LayoutGridIcon,\n LayoutIcon,\n LibraryIcon,\n MailIcon,\n MicIcon,\n MonitorIcon,\n PackageIcon,\n PaletteIcon,\n PenToolIcon,\n PhoneIcon,\n SearchIcon,\n SheetIcon,\n SmartphoneIcon,\n SparklesIcon,\n StarIcon,\n TableIcon,\n UserIcon,\n UsersIcon,\n VideoIcon,\n WrenchIcon,\n ZapIcon,\n WorkflowIcon,\n} from \"lucide-react\";\n\nconst ICON_MAP: Record<string, FC<{ className?: string }>> = {\n // General\n file: FileIcon,\n \"file-text\": FileTextIcon,\n \"file-code\": FileCodeIcon,\n folder: FolderIcon,\n \"folder-kanban\": FolderKanbanIcon,\n globe: GlobeIcon,\n search: SearchIcon,\n star: StarIcon,\n users: UsersIcon,\n user: UserIcon,\n // The agents a message can name (the Agents section).\n bot: BotIcon,\n wrench: WrenchIcon,\n package: PackageIcon,\n building2: Building2Icon,\n \"hard-drive\": HardDriveIcon,\n \"layout-grid\": LayoutGridIcon,\n zap: ZapIcon,\n eye: EyeIcon,\n\n // Chrome tools\n camera: CameraIcon,\n keyboard: KeyboardIcon,\n code: CodeIcon,\n monitor: MonitorIcon,\n\n // Asset types\n image: ImageIcon,\n video: VideoIcon,\n headphones: HeadphonesIcon,\n mic: MicIcon,\n mail: MailIcon,\n calendar: CalendarIcon,\n phone: PhoneIcon,\n database: DatabaseIcon,\n table: TableIcon,\n sheet: SheetIcon,\n palette: PaletteIcon,\n \"pen-tool\": PenToolIcon,\n layout: LayoutIcon,\n \"layout-dashboard\": LayoutDashboardIcon,\n library: LibraryIcon,\n \"book-open\": BookOpenIcon,\n sparkles: SparklesIcon,\n \"check-square\": CheckSquareIcon,\n key: KeyIcon,\n smartphone: SmartphoneIcon,\n cloud: CloudIcon,\n workflow: WorkflowIcon,\n // The presentation asset type and the presentation toolkits share this key.\n presentation: PresentationIcon,\n\n // Toolkit icons (the SDK's toolkit display info names these in PascalCase;\n // the digit-suffixed ones kebab-case to `code2` / `table2`)\n boxes: BoxesIcon,\n \"briefcase-business\": BriefcaseBusinessIcon,\n cable: CableIcon,\n \"chart-bar\": ChartBarIcon,\n code2: Code2Icon,\n \"file-spreadsheet\": FileSpreadsheetIcon,\n megaphone: MegaphoneIcon,\n \"message-square\": MessageSquareIcon,\n \"panel-top\": PanelTopIcon,\n server: ServerIcon,\n settings: SettingsIcon,\n table2: Table2Icon,\n terminal: TerminalIcon,\n};\n\n/** Backend icon names arrive as Lucide PascalCase (`FolderKanban`). */\nfunction toKebabIconName(name: string): string {\n return name\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1-$2\")\n .toLowerCase();\n}\n\n/** The Lucide component for an icon name (kebab or PascalCase), or undefined for an unknown name. */\nexport function resolveMentionIcon(name: string): FC<{ className?: string }> | undefined {\n return ICON_MAP[name] ?? ICON_MAP[toKebabIconName(name)];\n}\n\nconst ICON_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9-]*$/;\n\n/**\n * Whether the thumbnail at `url` failed to load (a strict CSP, offline, a\n * host copy without that file), read from the image's own `error` event:\n * attach `imageRef` to the `<img>`. A new `url` is tried afresh.\n */\nexport function useThumbnailLoadFailure(url: string | undefined): {\n failed: boolean;\n imageRef: (image: HTMLImageElement | null) => (() => void) | undefined;\n} {\n const [failedUrl, setFailedUrl] = useState<string>();\n const imageRef = useCallback(\n (image: HTMLImageElement | null) => {\n if (!image || !url) return undefined;\n const fail = () => setFailedUrl(url);\n image.addEventListener(\"error\", fail);\n return () => image.removeEventListener(\"error\", fail);\n },\n [url],\n );\n return { failed: !!url && failedUrl === url, imageRef };\n}\n\nexport function MentionIcon({\n fallbackIcon,\n thumbnailUrl,\n alt,\n className = \"w-4 h-4 flex-shrink-0\",\n}: {\n fallbackIcon?: string;\n thumbnailUrl?: string;\n alt?: string;\n className?: string;\n}) {\n // A thumbnail that cannot load gives way to the fallback icon rather than a\n // broken image.\n const thumbnail = useThumbnailLoadFailure(thumbnailUrl);\n if (thumbnailUrl && !thumbnail.failed) {\n return <img ref={thumbnail.imageRef} src={thumbnailUrl} alt={alt ?? \"\"} className={className} />;\n }\n const Icon = fallbackIcon ? resolveMentionIcon(fallbackIcon) : undefined;\n if (Icon) return <Icon className={className} />;\n // Emoji fallback; unmapped icon names render as the generic file icon\n if (fallbackIcon && !ICON_NAME_PATTERN.test(fallbackIcon)) {\n return <span className=\"text-sm flex-shrink-0\">{fallbackIcon}</span>;\n }\n return <FileIcon className={className} />;\n}\n"],"names":["FileIcon","FileTextIcon","FileCodeIcon","FolderIcon","FolderKanbanIcon","GlobeIcon","SearchIcon","StarIcon","UsersIcon","UserIcon","BotIcon","WrenchIcon","PackageIcon","Building2Icon","HardDriveIcon","LayoutGridIcon","ZapIcon","EyeIcon","CameraIcon","KeyboardIcon","CodeIcon","MonitorIcon","ImageIcon","VideoIcon","HeadphonesIcon","MicIcon","MailIcon","CalendarIcon","PhoneIcon","DatabaseIcon","TableIcon","SheetIcon","PaletteIcon","PenToolIcon","LayoutIcon","LayoutDashboardIcon","LibraryIcon","BookOpenIcon","SparklesIcon","CheckSquareIcon","KeyIcon","SmartphoneIcon","CloudIcon","WorkflowIcon","PresentationIcon","BoxesIcon","BriefcaseBusinessIcon","CableIcon","ChartBarIcon","Code2Icon","FileSpreadsheetIcon","MegaphoneIcon","MessageSquareIcon","PanelTopIcon","ServerIcon","SettingsIcon","Table2Icon","TerminalIcon","useState","useCallback","jsx"],"mappings":"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"}
@@ -2,11 +2,20 @@
2
2
  * Mention icon component.
3
3
  * Maps string icon names to Lucide icon components.
4
4
  */
5
- import type { FC } from "react";
5
+ import { type FC } from "react";
6
6
  /** The Lucide component for an icon name (kebab or PascalCase), or undefined for an unknown name. */
7
7
  export declare function resolveMentionIcon(name: string): FC<{
8
8
  className?: string;
9
9
  }> | undefined;
10
+ /**
11
+ * Whether the thumbnail at `url` failed to load (a strict CSP, offline, a
12
+ * host copy without that file), read from the image's own `error` event:
13
+ * attach `imageRef` to the `<img>`. A new `url` is tried afresh.
14
+ */
15
+ export declare function useThumbnailLoadFailure(url: string | undefined): {
16
+ failed: boolean;
17
+ imageRef: (image: HTMLImageElement | null) => (() => void) | undefined;
18
+ };
10
19
  export declare function MentionIcon({ fallbackIcon, thumbnailUrl, alt, className, }: {
11
20
  fallbackIcon?: string;
12
21
  thumbnailUrl?: string;
@@ -1,5 +1,6 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
- import { FileIcon, TerminalIcon, Table2Icon, SettingsIcon, ServerIcon, PanelTopIcon, MessageSquareIcon, MegaphoneIcon, FileSpreadsheetIcon, Code2Icon, ChartBarIcon, CableIcon, BriefcaseBusinessIcon, BoxesIcon, PresentationIcon, WorkflowIcon, CloudIcon, SmartphoneIcon, KeyIcon, CheckSquareIcon, SparklesIcon, BookOpenIcon, LibraryIcon, LayoutDashboardIcon, LayoutIcon, PenToolIcon, PaletteIcon, SheetIcon, TableIcon, DatabaseIcon, PhoneIcon, CalendarIcon, MailIcon, MicIcon, HeadphonesIcon, VideoIcon, ImageIcon, MonitorIcon, CodeIcon, KeyboardIcon, CameraIcon, EyeIcon, ZapIcon, LayoutGridIcon, HardDriveIcon, Building2Icon, PackageIcon, WrenchIcon, UserIcon, UsersIcon, StarIcon, SearchIcon, GlobeIcon, FolderKanbanIcon, FolderIcon, FileCodeIcon, FileTextIcon } from "lucide-react";
2
+ import { useState, useCallback } from "react";
3
+ import { FileIcon, TerminalIcon, Table2Icon, SettingsIcon, ServerIcon, PanelTopIcon, MessageSquareIcon, MegaphoneIcon, FileSpreadsheetIcon, Code2Icon, ChartBarIcon, CableIcon, BriefcaseBusinessIcon, BoxesIcon, PresentationIcon, WorkflowIcon, CloudIcon, SmartphoneIcon, KeyIcon, CheckSquareIcon, SparklesIcon, BookOpenIcon, LibraryIcon, LayoutDashboardIcon, LayoutIcon, PenToolIcon, PaletteIcon, SheetIcon, TableIcon, DatabaseIcon, PhoneIcon, CalendarIcon, MailIcon, MicIcon, HeadphonesIcon, VideoIcon, ImageIcon, MonitorIcon, CodeIcon, KeyboardIcon, CameraIcon, EyeIcon, ZapIcon, LayoutGridIcon, HardDriveIcon, Building2Icon, PackageIcon, WrenchIcon, BotIcon, UserIcon, UsersIcon, StarIcon, SearchIcon, GlobeIcon, FolderKanbanIcon, FolderIcon, FileCodeIcon, FileTextIcon } from "lucide-react";
3
4
  const ICON_MAP = {
4
5
  // General
5
6
  file: FileIcon,
@@ -12,6 +13,8 @@ const ICON_MAP = {
12
13
  star: StarIcon,
13
14
  users: UsersIcon,
14
15
  user: UserIcon,
16
+ // The agents a message can name (the Agents section).
17
+ bot: BotIcon,
15
18
  wrench: WrenchIcon,
16
19
  package: PackageIcon,
17
20
  building2: Building2Icon,
@@ -72,14 +75,28 @@ function resolveMentionIcon(name) {
72
75
  return ICON_MAP[name] ?? ICON_MAP[toKebabIconName(name)];
73
76
  }
74
77
  const ICON_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9-]*$/;
78
+ function useThumbnailLoadFailure(url) {
79
+ const [failedUrl, setFailedUrl] = useState();
80
+ const imageRef = useCallback(
81
+ (image) => {
82
+ if (!image || !url) return void 0;
83
+ const fail = () => setFailedUrl(url);
84
+ image.addEventListener("error", fail);
85
+ return () => image.removeEventListener("error", fail);
86
+ },
87
+ [url]
88
+ );
89
+ return { failed: !!url && failedUrl === url, imageRef };
90
+ }
75
91
  function MentionIcon({
76
92
  fallbackIcon,
77
93
  thumbnailUrl,
78
94
  alt,
79
95
  className = "w-4 h-4 flex-shrink-0"
80
96
  }) {
81
- if (thumbnailUrl) {
82
- return /* @__PURE__ */ jsx("img", { src: thumbnailUrl, alt: alt ?? "", className });
97
+ const thumbnail = useThumbnailLoadFailure(thumbnailUrl);
98
+ if (thumbnailUrl && !thumbnail.failed) {
99
+ return /* @__PURE__ */ jsx("img", { ref: thumbnail.imageRef, src: thumbnailUrl, alt: alt ?? "", className });
83
100
  }
84
101
  const Icon = fallbackIcon ? resolveMentionIcon(fallbackIcon) : void 0;
85
102
  if (Icon) return /* @__PURE__ */ jsx(Icon, { className });
@@ -90,6 +107,7 @@ function MentionIcon({
90
107
  }
91
108
  export {
92
109
  MentionIcon,
93
- resolveMentionIcon
110
+ resolveMentionIcon,
111
+ useThumbnailLoadFailure
94
112
  };
95
113
  //# sourceMappingURL=mention-icon.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mention-icon.js","sources":["../../../../../src/chat-ui/mentions/suggestions/components/mention-icon.tsx"],"sourcesContent":["/**\n * Mention icon component.\n * Maps string icon names to Lucide icon components.\n */\n\nimport type { FC } from \"react\";\nimport {\n BookOpenIcon,\n BoxesIcon,\n BriefcaseBusinessIcon,\n Building2Icon,\n CableIcon,\n CalendarIcon,\n CameraIcon,\n ChartBarIcon,\n CheckSquareIcon,\n Code2Icon,\n FileSpreadsheetIcon,\n MegaphoneIcon,\n MessageSquareIcon,\n PanelTopIcon,\n PresentationIcon,\n ServerIcon,\n SettingsIcon,\n Table2Icon,\n TerminalIcon,\n CloudIcon,\n CodeIcon,\n DatabaseIcon,\n EyeIcon,\n FileCodeIcon,\n FileIcon,\n FileTextIcon,\n FolderIcon,\n FolderKanbanIcon,\n GlobeIcon,\n HardDriveIcon,\n HeadphonesIcon,\n ImageIcon,\n KeyIcon,\n KeyboardIcon,\n LayoutDashboardIcon,\n LayoutGridIcon,\n LayoutIcon,\n LibraryIcon,\n MailIcon,\n MicIcon,\n MonitorIcon,\n PackageIcon,\n PaletteIcon,\n PenToolIcon,\n PhoneIcon,\n SearchIcon,\n SheetIcon,\n SmartphoneIcon,\n SparklesIcon,\n StarIcon,\n TableIcon,\n UserIcon,\n UsersIcon,\n VideoIcon,\n WrenchIcon,\n ZapIcon,\n WorkflowIcon,\n} from \"lucide-react\";\n\nconst ICON_MAP: Record<string, FC<{ className?: string }>> = {\n // General\n file: FileIcon,\n \"file-text\": FileTextIcon,\n \"file-code\": FileCodeIcon,\n folder: FolderIcon,\n \"folder-kanban\": FolderKanbanIcon,\n globe: GlobeIcon,\n search: SearchIcon,\n star: StarIcon,\n users: UsersIcon,\n user: UserIcon,\n wrench: WrenchIcon,\n package: PackageIcon,\n building2: Building2Icon,\n \"hard-drive\": HardDriveIcon,\n \"layout-grid\": LayoutGridIcon,\n zap: ZapIcon,\n eye: EyeIcon,\n\n // Chrome tools\n camera: CameraIcon,\n keyboard: KeyboardIcon,\n code: CodeIcon,\n monitor: MonitorIcon,\n\n // Asset types\n image: ImageIcon,\n video: VideoIcon,\n headphones: HeadphonesIcon,\n mic: MicIcon,\n mail: MailIcon,\n calendar: CalendarIcon,\n phone: PhoneIcon,\n database: DatabaseIcon,\n table: TableIcon,\n sheet: SheetIcon,\n palette: PaletteIcon,\n \"pen-tool\": PenToolIcon,\n layout: LayoutIcon,\n \"layout-dashboard\": LayoutDashboardIcon,\n library: LibraryIcon,\n \"book-open\": BookOpenIcon,\n sparkles: SparklesIcon,\n \"check-square\": CheckSquareIcon,\n key: KeyIcon,\n smartphone: SmartphoneIcon,\n cloud: CloudIcon,\n workflow: WorkflowIcon,\n // The presentation asset type and the presentation toolkits share this key.\n presentation: PresentationIcon,\n\n // Toolkit icons (the SDK's toolkit display info names these in PascalCase;\n // the digit-suffixed ones kebab-case to `code2` / `table2`)\n boxes: BoxesIcon,\n \"briefcase-business\": BriefcaseBusinessIcon,\n cable: CableIcon,\n \"chart-bar\": ChartBarIcon,\n code2: Code2Icon,\n \"file-spreadsheet\": FileSpreadsheetIcon,\n megaphone: MegaphoneIcon,\n \"message-square\": MessageSquareIcon,\n \"panel-top\": PanelTopIcon,\n server: ServerIcon,\n settings: SettingsIcon,\n table2: Table2Icon,\n terminal: TerminalIcon,\n};\n\n/** Backend icon names arrive as Lucide PascalCase (`FolderKanban`). */\nfunction toKebabIconName(name: string): string {\n return name\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1-$2\")\n .toLowerCase();\n}\n\n/** The Lucide component for an icon name (kebab or PascalCase), or undefined for an unknown name. */\nexport function resolveMentionIcon(name: string): FC<{ className?: string }> | undefined {\n return ICON_MAP[name] ?? ICON_MAP[toKebabIconName(name)];\n}\n\nconst ICON_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9-]*$/;\n\nexport function MentionIcon({\n fallbackIcon,\n thumbnailUrl,\n alt,\n className = \"w-4 h-4 flex-shrink-0\",\n}: {\n fallbackIcon?: string;\n thumbnailUrl?: string;\n alt?: string;\n className?: string;\n}) {\n if (thumbnailUrl) {\n return <img src={thumbnailUrl} alt={alt ?? \"\"} className={className} />;\n }\n const Icon = fallbackIcon ? resolveMentionIcon(fallbackIcon) : undefined;\n if (Icon) return <Icon className={className} />;\n // Emoji fallback; unmapped icon names render as the generic file icon\n if (fallbackIcon && !ICON_NAME_PATTERN.test(fallbackIcon)) {\n return <span className=\"text-sm flex-shrink-0\">{fallbackIcon}</span>;\n }\n return <FileIcon className={className} />;\n}\n"],"names":[],"mappings":";;AAkEA,MAAM,WAAuD;AAAA;AAAA,EAE3D,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,WAAW;AAAA,EACX,cAAc;AAAA,EACd,eAAe;AAAA,EACf,KAAK;AAAA,EACL,KAAK;AAAA;AAAA,EAGL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA;AAAA,EAGT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,oBAAoB;AAAA,EACpB,SAAS;AAAA,EACT,aAAa;AAAA,EACb,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,UAAU;AAAA;AAAA,EAEV,cAAc;AAAA;AAAA;AAAA,EAId,OAAO;AAAA,EACP,sBAAsB;AAAA,EACtB,OAAO;AAAA,EACP,aAAa;AAAA,EACb,OAAO;AAAA,EACP,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,UAAU;AACZ;AAGA,SAAS,gBAAgB,MAAsB;AAC7C,SAAO,KACJ,QAAQ,sBAAsB,OAAO,EACrC,QAAQ,yBAAyB,OAAO,EACxC,YAAA;AACL;AAGO,SAAS,mBAAmB,MAAsD;AACvF,SAAO,SAAS,IAAI,KAAK,SAAS,gBAAgB,IAAI,CAAC;AACzD;AAEA,MAAM,oBAAoB;AAEnB,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,GAKG;AACD,MAAI,cAAc;AAChB,+BAAQ,OAAA,EAAI,KAAK,cAAc,KAAK,OAAO,IAAI,WAAsB;AAAA,EACvE;AACA,QAAM,OAAO,eAAe,mBAAmB,YAAY,IAAI;AAC/D,MAAI,KAAM,QAAO,oBAAC,MAAA,EAAK,UAAA,CAAsB;AAE7C,MAAI,gBAAgB,CAAC,kBAAkB,KAAK,YAAY,GAAG;AACzD,WAAO,oBAAC,QAAA,EAAK,WAAU,yBAAyB,UAAA,cAAa;AAAA,EAC/D;AACA,SAAO,oBAAC,YAAS,WAAsB;AACzC;"}
1
+ {"version":3,"file":"mention-icon.js","sources":["../../../../../src/chat-ui/mentions/suggestions/components/mention-icon.tsx"],"sourcesContent":["/**\n * Mention icon component.\n * Maps string icon names to Lucide icon components.\n */\n\nimport { useCallback, useState, type FC } from \"react\";\nimport {\n BookOpenIcon,\n BotIcon,\n BoxesIcon,\n BriefcaseBusinessIcon,\n Building2Icon,\n CableIcon,\n CalendarIcon,\n CameraIcon,\n ChartBarIcon,\n CheckSquareIcon,\n Code2Icon,\n FileSpreadsheetIcon,\n MegaphoneIcon,\n MessageSquareIcon,\n PanelTopIcon,\n PresentationIcon,\n ServerIcon,\n SettingsIcon,\n Table2Icon,\n TerminalIcon,\n CloudIcon,\n CodeIcon,\n DatabaseIcon,\n EyeIcon,\n FileCodeIcon,\n FileIcon,\n FileTextIcon,\n FolderIcon,\n FolderKanbanIcon,\n GlobeIcon,\n HardDriveIcon,\n HeadphonesIcon,\n ImageIcon,\n KeyIcon,\n KeyboardIcon,\n LayoutDashboardIcon,\n LayoutGridIcon,\n LayoutIcon,\n LibraryIcon,\n MailIcon,\n MicIcon,\n MonitorIcon,\n PackageIcon,\n PaletteIcon,\n PenToolIcon,\n PhoneIcon,\n SearchIcon,\n SheetIcon,\n SmartphoneIcon,\n SparklesIcon,\n StarIcon,\n TableIcon,\n UserIcon,\n UsersIcon,\n VideoIcon,\n WrenchIcon,\n ZapIcon,\n WorkflowIcon,\n} from \"lucide-react\";\n\nconst ICON_MAP: Record<string, FC<{ className?: string }>> = {\n // General\n file: FileIcon,\n \"file-text\": FileTextIcon,\n \"file-code\": FileCodeIcon,\n folder: FolderIcon,\n \"folder-kanban\": FolderKanbanIcon,\n globe: GlobeIcon,\n search: SearchIcon,\n star: StarIcon,\n users: UsersIcon,\n user: UserIcon,\n // The agents a message can name (the Agents section).\n bot: BotIcon,\n wrench: WrenchIcon,\n package: PackageIcon,\n building2: Building2Icon,\n \"hard-drive\": HardDriveIcon,\n \"layout-grid\": LayoutGridIcon,\n zap: ZapIcon,\n eye: EyeIcon,\n\n // Chrome tools\n camera: CameraIcon,\n keyboard: KeyboardIcon,\n code: CodeIcon,\n monitor: MonitorIcon,\n\n // Asset types\n image: ImageIcon,\n video: VideoIcon,\n headphones: HeadphonesIcon,\n mic: MicIcon,\n mail: MailIcon,\n calendar: CalendarIcon,\n phone: PhoneIcon,\n database: DatabaseIcon,\n table: TableIcon,\n sheet: SheetIcon,\n palette: PaletteIcon,\n \"pen-tool\": PenToolIcon,\n layout: LayoutIcon,\n \"layout-dashboard\": LayoutDashboardIcon,\n library: LibraryIcon,\n \"book-open\": BookOpenIcon,\n sparkles: SparklesIcon,\n \"check-square\": CheckSquareIcon,\n key: KeyIcon,\n smartphone: SmartphoneIcon,\n cloud: CloudIcon,\n workflow: WorkflowIcon,\n // The presentation asset type and the presentation toolkits share this key.\n presentation: PresentationIcon,\n\n // Toolkit icons (the SDK's toolkit display info names these in PascalCase;\n // the digit-suffixed ones kebab-case to `code2` / `table2`)\n boxes: BoxesIcon,\n \"briefcase-business\": BriefcaseBusinessIcon,\n cable: CableIcon,\n \"chart-bar\": ChartBarIcon,\n code2: Code2Icon,\n \"file-spreadsheet\": FileSpreadsheetIcon,\n megaphone: MegaphoneIcon,\n \"message-square\": MessageSquareIcon,\n \"panel-top\": PanelTopIcon,\n server: ServerIcon,\n settings: SettingsIcon,\n table2: Table2Icon,\n terminal: TerminalIcon,\n};\n\n/** Backend icon names arrive as Lucide PascalCase (`FolderKanban`). */\nfunction toKebabIconName(name: string): string {\n return name\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1-$2\")\n .toLowerCase();\n}\n\n/** The Lucide component for an icon name (kebab or PascalCase), or undefined for an unknown name. */\nexport function resolveMentionIcon(name: string): FC<{ className?: string }> | undefined {\n return ICON_MAP[name] ?? ICON_MAP[toKebabIconName(name)];\n}\n\nconst ICON_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9-]*$/;\n\n/**\n * Whether the thumbnail at `url` failed to load (a strict CSP, offline, a\n * host copy without that file), read from the image's own `error` event:\n * attach `imageRef` to the `<img>`. A new `url` is tried afresh.\n */\nexport function useThumbnailLoadFailure(url: string | undefined): {\n failed: boolean;\n imageRef: (image: HTMLImageElement | null) => (() => void) | undefined;\n} {\n const [failedUrl, setFailedUrl] = useState<string>();\n const imageRef = useCallback(\n (image: HTMLImageElement | null) => {\n if (!image || !url) return undefined;\n const fail = () => setFailedUrl(url);\n image.addEventListener(\"error\", fail);\n return () => image.removeEventListener(\"error\", fail);\n },\n [url],\n );\n return { failed: !!url && failedUrl === url, imageRef };\n}\n\nexport function MentionIcon({\n fallbackIcon,\n thumbnailUrl,\n alt,\n className = \"w-4 h-4 flex-shrink-0\",\n}: {\n fallbackIcon?: string;\n thumbnailUrl?: string;\n alt?: string;\n className?: string;\n}) {\n // A thumbnail that cannot load gives way to the fallback icon rather than a\n // broken image.\n const thumbnail = useThumbnailLoadFailure(thumbnailUrl);\n if (thumbnailUrl && !thumbnail.failed) {\n return <img ref={thumbnail.imageRef} src={thumbnailUrl} alt={alt ?? \"\"} className={className} />;\n }\n const Icon = fallbackIcon ? resolveMentionIcon(fallbackIcon) : undefined;\n if (Icon) return <Icon className={className} />;\n // Emoji fallback; unmapped icon names render as the generic file icon\n if (fallbackIcon && !ICON_NAME_PATTERN.test(fallbackIcon)) {\n return <span className=\"text-sm flex-shrink-0\">{fallbackIcon}</span>;\n }\n return <FileIcon className={className} />;\n}\n"],"names":[],"mappings":";;;AAmEA,MAAM,WAAuD;AAAA;AAAA,EAE3D,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA;AAAA,EAEN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,WAAW;AAAA,EACX,cAAc;AAAA,EACd,eAAe;AAAA,EACf,KAAK;AAAA,EACL,KAAK;AAAA;AAAA,EAGL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA;AAAA,EAGT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,oBAAoB;AAAA,EACpB,SAAS;AAAA,EACT,aAAa;AAAA,EACb,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,UAAU;AAAA;AAAA,EAEV,cAAc;AAAA;AAAA;AAAA,EAId,OAAO;AAAA,EACP,sBAAsB;AAAA,EACtB,OAAO;AAAA,EACP,aAAa;AAAA,EACb,OAAO;AAAA,EACP,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,UAAU;AACZ;AAGA,SAAS,gBAAgB,MAAsB;AAC7C,SAAO,KACJ,QAAQ,sBAAsB,OAAO,EACrC,QAAQ,yBAAyB,OAAO,EACxC,YAAA;AACL;AAGO,SAAS,mBAAmB,MAAsD;AACvF,SAAO,SAAS,IAAI,KAAK,SAAS,gBAAgB,IAAI,CAAC;AACzD;AAEA,MAAM,oBAAoB;AAOnB,SAAS,wBAAwB,KAGtC;AACA,QAAM,CAAC,WAAW,YAAY,IAAI,SAAA;AAClC,QAAM,WAAW;AAAA,IACf,CAAC,UAAmC;AAClC,UAAI,CAAC,SAAS,CAAC,IAAK,QAAO;AAC3B,YAAM,OAAO,MAAM,aAAa,GAAG;AACnC,YAAM,iBAAiB,SAAS,IAAI;AACpC,aAAO,MAAM,MAAM,oBAAoB,SAAS,IAAI;AAAA,IACtD;AAAA,IACA,CAAC,GAAG;AAAA,EAAA;AAEN,SAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,cAAc,KAAK,SAAA;AAC/C;AAEO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,GAKG;AAGD,QAAM,YAAY,wBAAwB,YAAY;AACtD,MAAI,gBAAgB,CAAC,UAAU,QAAQ;AACrC,WAAO,oBAAC,OAAA,EAAI,KAAK,UAAU,UAAU,KAAK,cAAc,KAAK,OAAO,IAAI,UAAA,CAAsB;AAAA,EAChG;AACA,QAAM,OAAO,eAAe,mBAAmB,YAAY,IAAI;AAC/D,MAAI,KAAM,QAAO,oBAAC,MAAA,EAAK,UAAA,CAAsB;AAE7C,MAAI,gBAAgB,CAAC,kBAAkB,KAAK,YAAY,GAAG;AACzD,WAAO,oBAAC,QAAA,EAAK,WAAU,yBAAyB,UAAA,cAAa;AAAA,EAC/D;AACA,SAAO,oBAAC,YAAS,WAAsB;AACzC;"}
@@ -12,7 +12,7 @@ function MenuItemRow({
12
12
  showArrow
13
13
  }) {
14
14
  var _a, _b, _c, _d;
15
- const hasTwoLines = item.type === "tool" && item.description || item.type === "user" && item.email || item.type === "workspace_item" && item.description || item.type === "tab" && item.description;
15
+ const hasTwoLines = item.type === "tool" && item.description || item.type === "user" && item.email || item.type === "group" && item.description || item.type === "workspace_item" && item.description || item.type === "tab" && item.description;
16
16
  const nameContent = item.type === "tab" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 truncate", title: item.name, children: item.name }) : item.name;
17
17
  return /* @__PURE__ */ jsxRuntime.jsxs(
18
18
  "div",
@@ -1 +1 @@
1
- {"version":3,"file":"menu-item.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/menu-item.tsx"],"sourcesContent":["/**\n * Individual menu item in the mention popup.\n * Supports: tools (with description), users (with email), assets, categories.\n */\n\nimport type { MenuItem } from \"../data/types\";\nimport { MentionMenuSection } from \"../data/types\";\nimport { MentionIcon } from \"./mention-icon\";\nimport { cn } from \"../../../../lib/utils\";\n\nexport function MenuItemRow({\n item,\n isSelected,\n onMouseMove,\n onClick,\n showArrow,\n}: {\n item: MenuItem;\n isSelected: boolean;\n onMouseMove: () => void;\n onClick: () => void;\n showArrow?: boolean;\n}) {\n const hasTwoLines =\n (item.type === \"tool\" && item.description) ||\n (item.type === \"user\" && item.email) ||\n (item.type === \"workspace_item\" && item.description) ||\n (item.type === \"tab\" && item.description);\n const nameContent = item.type === \"tab\" ? (\n <span className=\"min-w-0 truncate\" title={item.name}>\n {item.name}\n </span>\n ) : (\n item.name\n );\n\n return (\n <div\n role=\"button\"\n tabIndex={-1}\n onClick={onClick}\n // Opening or scrolling the popup can place a row under a stationary\n // cursor. Only mouse movement should override the keyboard selection.\n onMouseMove={onMouseMove}\n className={cn(\n \"mention-item flex items-center justify-between gap-2 px-2 py-1.5 rounded cursor-pointer transition-colors\",\n item.menuSection === MentionMenuSection.CURRENT_WEBPAGE &&\n !isSelected &&\n \"bg-sky-50/70\",\n isSelected && \"bg-gray-100 is-selected\",\n )}\n >\n {/* Icon */}\n <span\n className={cn(\n \"flex items-center flex-shrink-0\",\n hasTwoLines && \"self-start mt-0.5\",\n )}\n >\n <MentionIcon\n fallbackIcon={item.fallbackIcon}\n thumbnailUrl={item.thumbnailUrl}\n alt={item.name}\n />\n </span>\n\n {/* Content */}\n {hasTwoLines ? (\n <div className=\"flex-1 flex flex-col gap-0 min-w-0 -mt-0.5\">\n <span className=\"text-sm leading-tight flex items-center gap-1.5\">\n {nameContent}\n {item.extra?.isAdminOnly && (\n <span className=\"w-1.5 h-1.5 rounded-full bg-purple-400 flex-shrink-0\" />\n )}\n {item.extra?.isExperimental && (\n <span className=\"rounded-full bg-blue-50 px-1.5 py-0.5 text-[9px] font-medium text-blue-700\">\n Experimental\n </span>\n )}\n </span>\n <span className=\"text-xs text-gray-500 leading-tight mt-0.5 truncate\">\n {item.type === \"user\" ? item.email : item.description}\n </span>\n </div>\n ) : (\n <span className=\"flex-1 text-sm truncate min-w-0 flex items-center gap-1.5\">\n {nameContent}\n {item.extra?.isAdminOnly && (\n <span className=\"w-1.5 h-1.5 rounded-full bg-purple-400 flex-shrink-0\" />\n )}\n {item.extra?.isExperimental && (\n <span className=\"rounded-full bg-blue-50 px-1.5 py-0.5 text-[9px] font-medium text-blue-700\">\n Experimental\n </span>\n )}\n </span>\n )}\n\n {/* Navigation arrow */}\n {showArrow && (\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n <span className=\"text-gray-400 text-sm px-1 rounded transition-all cursor-pointer hover:text-gray-600 hover:bg-gray-200\">\n →\n </span>\n </div>\n )}\n </div>\n );\n}\n"],"names":["jsxs","cn","MentionMenuSection","jsx","MentionIcon"],"mappings":";;;;;;AAUO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;;AACD,QAAM,cACH,KAAK,SAAS,UAAU,KAAK,eAC7B,KAAK,SAAS,UAAU,KAAK,SAC7B,KAAK,SAAS,oBAAoB,KAAK,eACvC,KAAK,SAAS,SAAS,KAAK;AAC/B,QAAM,cAAc,KAAK,SAAS,uCAC/B,QAAA,EAAK,WAAU,oBAAmB,OAAO,KAAK,MAC5C,UAAA,KAAK,KAAA,CACR,IAEA,KAAK;AAGP,SACEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,UAAU;AAAA,MACV;AAAA,MAGA;AAAA,MACA,WAAWC,OAAAA;AAAAA,QACT;AAAA,QACA,KAAK,gBAAgBC,MAAAA,mBAAmB,mBACtC,CAAC,cACD;AAAA,QACF,cAAc;AAAA,MAAA;AAAA,MAIhB,UAAA;AAAA,QAAAC,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWF,OAAAA;AAAAA,cACT;AAAA,cACA,eAAe;AAAA,YAAA;AAAA,YAGjB,UAAAE,2BAAAA;AAAAA,cAACC,YAAAA;AAAAA,cAAA;AAAA,gBACC,cAAc,KAAK;AAAA,gBACnB,cAAc,KAAK;AAAA,gBACnB,KAAK,KAAK;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ;AAAA,QAAA;AAAA,QAID,cACCJ,2BAAAA,KAAC,OAAA,EAAI,WAAU,8CACb,UAAA;AAAA,UAAAA,2BAAAA,KAAC,QAAA,EAAK,WAAU,mDACb,UAAA;AAAA,YAAA;AAAA,cACA,UAAK,UAAL,mBAAY,gBACXG,2BAAAA,IAAC,QAAA,EAAK,WAAU,wDAAuD;AAAA,cAExE,UAAK,UAAL,mBAAY,kDACV,QAAA,EAAK,WAAU,8EAA6E,UAAA,eAAA,CAE7F;AAAA,UAAA,GAEJ;AAAA,UACAA,2BAAAA,IAAC,QAAA,EAAK,WAAU,uDACb,UAAA,KAAK,SAAS,SAAS,KAAK,QAAQ,KAAK,YAAA,CAC5C;AAAA,QAAA,EAAA,CACF,IAEAH,2BAAAA,KAAC,QAAA,EAAK,WAAU,6DACb,UAAA;AAAA,UAAA;AAAA,YACA,UAAK,UAAL,mBAAY,gBACXG,2BAAAA,IAAC,QAAA,EAAK,WAAU,wDAAuD;AAAA,YAExE,UAAK,UAAL,mBAAY,kDACV,QAAA,EAAK,WAAU,8EAA6E,UAAA,eAAA,CAE7F;AAAA,QAAA,GAEJ;AAAA,QAID,aACCA,2BAAAA,IAAC,OAAA,EAAI,WAAU,yCACb,yCAAC,QAAA,EAAK,WAAU,0GAAyG,UAAA,IAAA,CAEzH,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;;"}
1
+ {"version":3,"file":"menu-item.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/menu-item.tsx"],"sourcesContent":["/**\n * Individual menu item in the mention popup.\n * Supports: tools (with description), users (with email), assets, categories.\n */\n\nimport type { MenuItem } from \"../data/types\";\nimport { MentionMenuSection } from \"../data/types\";\nimport { MentionIcon } from \"./mention-icon\";\nimport { cn } from \"../../../../lib/utils\";\n\nexport function MenuItemRow({\n item,\n isSelected,\n onMouseMove,\n onClick,\n showArrow,\n}: {\n item: MenuItem;\n isSelected: boolean;\n onMouseMove: () => void;\n onClick: () => void;\n showArrow?: boolean;\n}) {\n const hasTwoLines =\n (item.type === \"tool\" && item.description) ||\n (item.type === \"user\" && item.email) ||\n (item.type === \"group\" && item.description) ||\n (item.type === \"workspace_item\" && item.description) ||\n (item.type === \"tab\" && item.description);\n const nameContent = item.type === \"tab\" ? (\n <span className=\"min-w-0 truncate\" title={item.name}>\n {item.name}\n </span>\n ) : (\n item.name\n );\n\n return (\n <div\n role=\"button\"\n tabIndex={-1}\n onClick={onClick}\n // Opening or scrolling the popup can place a row under a stationary\n // cursor. Only mouse movement should override the keyboard selection.\n onMouseMove={onMouseMove}\n className={cn(\n \"mention-item flex items-center justify-between gap-2 px-2 py-1.5 rounded cursor-pointer transition-colors\",\n item.menuSection === MentionMenuSection.CURRENT_WEBPAGE &&\n !isSelected &&\n \"bg-sky-50/70\",\n isSelected && \"bg-gray-100 is-selected\",\n )}\n >\n {/* Icon */}\n <span\n className={cn(\n \"flex items-center flex-shrink-0\",\n hasTwoLines && \"self-start mt-0.5\",\n )}\n >\n <MentionIcon\n fallbackIcon={item.fallbackIcon}\n thumbnailUrl={item.thumbnailUrl}\n alt={item.name}\n />\n </span>\n\n {/* Content */}\n {hasTwoLines ? (\n <div className=\"flex-1 flex flex-col gap-0 min-w-0 -mt-0.5\">\n <span className=\"text-sm leading-tight flex items-center gap-1.5\">\n {nameContent}\n {item.extra?.isAdminOnly && (\n <span className=\"w-1.5 h-1.5 rounded-full bg-purple-400 flex-shrink-0\" />\n )}\n {item.extra?.isExperimental && (\n <span className=\"rounded-full bg-blue-50 px-1.5 py-0.5 text-[9px] font-medium text-blue-700\">\n Experimental\n </span>\n )}\n </span>\n <span className=\"text-xs text-gray-500 leading-tight mt-0.5 truncate\">\n {item.type === \"user\" ? item.email : item.description}\n </span>\n </div>\n ) : (\n <span className=\"flex-1 text-sm truncate min-w-0 flex items-center gap-1.5\">\n {nameContent}\n {item.extra?.isAdminOnly && (\n <span className=\"w-1.5 h-1.5 rounded-full bg-purple-400 flex-shrink-0\" />\n )}\n {item.extra?.isExperimental && (\n <span className=\"rounded-full bg-blue-50 px-1.5 py-0.5 text-[9px] font-medium text-blue-700\">\n Experimental\n </span>\n )}\n </span>\n )}\n\n {/* Navigation arrow */}\n {showArrow && (\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n <span className=\"text-gray-400 text-sm px-1 rounded transition-all cursor-pointer hover:text-gray-600 hover:bg-gray-200\">\n →\n </span>\n </div>\n )}\n </div>\n );\n}\n"],"names":["jsxs","cn","MentionMenuSection","jsx","MentionIcon"],"mappings":";;;;;;AAUO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;;AACD,QAAM,cACH,KAAK,SAAS,UAAU,KAAK,eAC7B,KAAK,SAAS,UAAU,KAAK,SAC7B,KAAK,SAAS,WAAW,KAAK,eAC9B,KAAK,SAAS,oBAAoB,KAAK,eACvC,KAAK,SAAS,SAAS,KAAK;AAC/B,QAAM,cAAc,KAAK,SAAS,uCAC/B,QAAA,EAAK,WAAU,oBAAmB,OAAO,KAAK,MAC5C,UAAA,KAAK,KAAA,CACR,IAEA,KAAK;AAGP,SACEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,UAAU;AAAA,MACV;AAAA,MAGA;AAAA,MACA,WAAWC,OAAAA;AAAAA,QACT;AAAA,QACA,KAAK,gBAAgBC,MAAAA,mBAAmB,mBACtC,CAAC,cACD;AAAA,QACF,cAAc;AAAA,MAAA;AAAA,MAIhB,UAAA;AAAA,QAAAC,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWF,OAAAA;AAAAA,cACT;AAAA,cACA,eAAe;AAAA,YAAA;AAAA,YAGjB,UAAAE,2BAAAA;AAAAA,cAACC,YAAAA;AAAAA,cAAA;AAAA,gBACC,cAAc,KAAK;AAAA,gBACnB,cAAc,KAAK;AAAA,gBACnB,KAAK,KAAK;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ;AAAA,QAAA;AAAA,QAID,cACCJ,2BAAAA,KAAC,OAAA,EAAI,WAAU,8CACb,UAAA;AAAA,UAAAA,2BAAAA,KAAC,QAAA,EAAK,WAAU,mDACb,UAAA;AAAA,YAAA;AAAA,cACA,UAAK,UAAL,mBAAY,gBACXG,2BAAAA,IAAC,QAAA,EAAK,WAAU,wDAAuD;AAAA,cAExE,UAAK,UAAL,mBAAY,kDACV,QAAA,EAAK,WAAU,8EAA6E,UAAA,eAAA,CAE7F;AAAA,UAAA,GAEJ;AAAA,UACAA,2BAAAA,IAAC,QAAA,EAAK,WAAU,uDACb,UAAA,KAAK,SAAS,SAAS,KAAK,QAAQ,KAAK,YAAA,CAC5C;AAAA,QAAA,EAAA,CACF,IAEAH,2BAAAA,KAAC,QAAA,EAAK,WAAU,6DACb,UAAA;AAAA,UAAA;AAAA,YACA,UAAK,UAAL,mBAAY,gBACXG,2BAAAA,IAAC,QAAA,EAAK,WAAU,wDAAuD;AAAA,YAExE,UAAK,UAAL,mBAAY,kDACV,QAAA,EAAK,WAAU,8EAA6E,UAAA,eAAA,CAE7F;AAAA,QAAA,GAEJ;AAAA,QAID,aACCA,2BAAAA,IAAC,OAAA,EAAI,WAAU,yCACb,yCAAC,QAAA,EAAK,WAAU,0GAAyG,UAAA,IAAA,CAEzH,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;;"}
@@ -10,7 +10,7 @@ function MenuItemRow({
10
10
  showArrow
11
11
  }) {
12
12
  var _a, _b, _c, _d;
13
- const hasTwoLines = item.type === "tool" && item.description || item.type === "user" && item.email || item.type === "workspace_item" && item.description || item.type === "tab" && item.description;
13
+ const hasTwoLines = item.type === "tool" && item.description || item.type === "user" && item.email || item.type === "group" && item.description || item.type === "workspace_item" && item.description || item.type === "tab" && item.description;
14
14
  const nameContent = item.type === "tab" ? /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate", title: item.name, children: item.name }) : item.name;
15
15
  return /* @__PURE__ */ jsxs(
16
16
  "div",
@@ -1 +1 @@
1
- {"version":3,"file":"menu-item.js","sources":["../../../../../src/chat-ui/mentions/suggestions/components/menu-item.tsx"],"sourcesContent":["/**\n * Individual menu item in the mention popup.\n * Supports: tools (with description), users (with email), assets, categories.\n */\n\nimport type { MenuItem } from \"../data/types\";\nimport { MentionMenuSection } from \"../data/types\";\nimport { MentionIcon } from \"./mention-icon\";\nimport { cn } from \"../../../../lib/utils\";\n\nexport function MenuItemRow({\n item,\n isSelected,\n onMouseMove,\n onClick,\n showArrow,\n}: {\n item: MenuItem;\n isSelected: boolean;\n onMouseMove: () => void;\n onClick: () => void;\n showArrow?: boolean;\n}) {\n const hasTwoLines =\n (item.type === \"tool\" && item.description) ||\n (item.type === \"user\" && item.email) ||\n (item.type === \"workspace_item\" && item.description) ||\n (item.type === \"tab\" && item.description);\n const nameContent = item.type === \"tab\" ? (\n <span className=\"min-w-0 truncate\" title={item.name}>\n {item.name}\n </span>\n ) : (\n item.name\n );\n\n return (\n <div\n role=\"button\"\n tabIndex={-1}\n onClick={onClick}\n // Opening or scrolling the popup can place a row under a stationary\n // cursor. Only mouse movement should override the keyboard selection.\n onMouseMove={onMouseMove}\n className={cn(\n \"mention-item flex items-center justify-between gap-2 px-2 py-1.5 rounded cursor-pointer transition-colors\",\n item.menuSection === MentionMenuSection.CURRENT_WEBPAGE &&\n !isSelected &&\n \"bg-sky-50/70\",\n isSelected && \"bg-gray-100 is-selected\",\n )}\n >\n {/* Icon */}\n <span\n className={cn(\n \"flex items-center flex-shrink-0\",\n hasTwoLines && \"self-start mt-0.5\",\n )}\n >\n <MentionIcon\n fallbackIcon={item.fallbackIcon}\n thumbnailUrl={item.thumbnailUrl}\n alt={item.name}\n />\n </span>\n\n {/* Content */}\n {hasTwoLines ? (\n <div className=\"flex-1 flex flex-col gap-0 min-w-0 -mt-0.5\">\n <span className=\"text-sm leading-tight flex items-center gap-1.5\">\n {nameContent}\n {item.extra?.isAdminOnly && (\n <span className=\"w-1.5 h-1.5 rounded-full bg-purple-400 flex-shrink-0\" />\n )}\n {item.extra?.isExperimental && (\n <span className=\"rounded-full bg-blue-50 px-1.5 py-0.5 text-[9px] font-medium text-blue-700\">\n Experimental\n </span>\n )}\n </span>\n <span className=\"text-xs text-gray-500 leading-tight mt-0.5 truncate\">\n {item.type === \"user\" ? item.email : item.description}\n </span>\n </div>\n ) : (\n <span className=\"flex-1 text-sm truncate min-w-0 flex items-center gap-1.5\">\n {nameContent}\n {item.extra?.isAdminOnly && (\n <span className=\"w-1.5 h-1.5 rounded-full bg-purple-400 flex-shrink-0\" />\n )}\n {item.extra?.isExperimental && (\n <span className=\"rounded-full bg-blue-50 px-1.5 py-0.5 text-[9px] font-medium text-blue-700\">\n Experimental\n </span>\n )}\n </span>\n )}\n\n {/* Navigation arrow */}\n {showArrow && (\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n <span className=\"text-gray-400 text-sm px-1 rounded transition-all cursor-pointer hover:text-gray-600 hover:bg-gray-200\">\n →\n </span>\n </div>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;AAUO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;;AACD,QAAM,cACH,KAAK,SAAS,UAAU,KAAK,eAC7B,KAAK,SAAS,UAAU,KAAK,SAC7B,KAAK,SAAS,oBAAoB,KAAK,eACvC,KAAK,SAAS,SAAS,KAAK;AAC/B,QAAM,cAAc,KAAK,SAAS,4BAC/B,QAAA,EAAK,WAAU,oBAAmB,OAAO,KAAK,MAC5C,UAAA,KAAK,KAAA,CACR,IAEA,KAAK;AAGP,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,UAAU;AAAA,MACV;AAAA,MAGA;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,KAAK,gBAAgB,mBAAmB,mBACtC,CAAC,cACD;AAAA,QACF,cAAc;AAAA,MAAA;AAAA,MAIhB,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,eAAe;AAAA,YAAA;AAAA,YAGjB,UAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,cAAc,KAAK;AAAA,gBACnB,cAAc,KAAK;AAAA,gBACnB,KAAK,KAAK;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ;AAAA,QAAA;AAAA,QAID,cACC,qBAAC,OAAA,EAAI,WAAU,8CACb,UAAA;AAAA,UAAA,qBAAC,QAAA,EAAK,WAAU,mDACb,UAAA;AAAA,YAAA;AAAA,cACA,UAAK,UAAL,mBAAY,gBACX,oBAAC,QAAA,EAAK,WAAU,wDAAuD;AAAA,cAExE,UAAK,UAAL,mBAAY,uCACV,QAAA,EAAK,WAAU,8EAA6E,UAAA,eAAA,CAE7F;AAAA,UAAA,GAEJ;AAAA,UACA,oBAAC,QAAA,EAAK,WAAU,uDACb,UAAA,KAAK,SAAS,SAAS,KAAK,QAAQ,KAAK,YAAA,CAC5C;AAAA,QAAA,EAAA,CACF,IAEA,qBAAC,QAAA,EAAK,WAAU,6DACb,UAAA;AAAA,UAAA;AAAA,YACA,UAAK,UAAL,mBAAY,gBACX,oBAAC,QAAA,EAAK,WAAU,wDAAuD;AAAA,YAExE,UAAK,UAAL,mBAAY,uCACV,QAAA,EAAK,WAAU,8EAA6E,UAAA,eAAA,CAE7F;AAAA,QAAA,GAEJ;AAAA,QAID,aACC,oBAAC,OAAA,EAAI,WAAU,yCACb,8BAAC,QAAA,EAAK,WAAU,0GAAyG,UAAA,IAAA,CAEzH,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;"}
1
+ {"version":3,"file":"menu-item.js","sources":["../../../../../src/chat-ui/mentions/suggestions/components/menu-item.tsx"],"sourcesContent":["/**\n * Individual menu item in the mention popup.\n * Supports: tools (with description), users (with email), assets, categories.\n */\n\nimport type { MenuItem } from \"../data/types\";\nimport { MentionMenuSection } from \"../data/types\";\nimport { MentionIcon } from \"./mention-icon\";\nimport { cn } from \"../../../../lib/utils\";\n\nexport function MenuItemRow({\n item,\n isSelected,\n onMouseMove,\n onClick,\n showArrow,\n}: {\n item: MenuItem;\n isSelected: boolean;\n onMouseMove: () => void;\n onClick: () => void;\n showArrow?: boolean;\n}) {\n const hasTwoLines =\n (item.type === \"tool\" && item.description) ||\n (item.type === \"user\" && item.email) ||\n (item.type === \"group\" && item.description) ||\n (item.type === \"workspace_item\" && item.description) ||\n (item.type === \"tab\" && item.description);\n const nameContent = item.type === \"tab\" ? (\n <span className=\"min-w-0 truncate\" title={item.name}>\n {item.name}\n </span>\n ) : (\n item.name\n );\n\n return (\n <div\n role=\"button\"\n tabIndex={-1}\n onClick={onClick}\n // Opening or scrolling the popup can place a row under a stationary\n // cursor. Only mouse movement should override the keyboard selection.\n onMouseMove={onMouseMove}\n className={cn(\n \"mention-item flex items-center justify-between gap-2 px-2 py-1.5 rounded cursor-pointer transition-colors\",\n item.menuSection === MentionMenuSection.CURRENT_WEBPAGE &&\n !isSelected &&\n \"bg-sky-50/70\",\n isSelected && \"bg-gray-100 is-selected\",\n )}\n >\n {/* Icon */}\n <span\n className={cn(\n \"flex items-center flex-shrink-0\",\n hasTwoLines && \"self-start mt-0.5\",\n )}\n >\n <MentionIcon\n fallbackIcon={item.fallbackIcon}\n thumbnailUrl={item.thumbnailUrl}\n alt={item.name}\n />\n </span>\n\n {/* Content */}\n {hasTwoLines ? (\n <div className=\"flex-1 flex flex-col gap-0 min-w-0 -mt-0.5\">\n <span className=\"text-sm leading-tight flex items-center gap-1.5\">\n {nameContent}\n {item.extra?.isAdminOnly && (\n <span className=\"w-1.5 h-1.5 rounded-full bg-purple-400 flex-shrink-0\" />\n )}\n {item.extra?.isExperimental && (\n <span className=\"rounded-full bg-blue-50 px-1.5 py-0.5 text-[9px] font-medium text-blue-700\">\n Experimental\n </span>\n )}\n </span>\n <span className=\"text-xs text-gray-500 leading-tight mt-0.5 truncate\">\n {item.type === \"user\" ? item.email : item.description}\n </span>\n </div>\n ) : (\n <span className=\"flex-1 text-sm truncate min-w-0 flex items-center gap-1.5\">\n {nameContent}\n {item.extra?.isAdminOnly && (\n <span className=\"w-1.5 h-1.5 rounded-full bg-purple-400 flex-shrink-0\" />\n )}\n {item.extra?.isExperimental && (\n <span className=\"rounded-full bg-blue-50 px-1.5 py-0.5 text-[9px] font-medium text-blue-700\">\n Experimental\n </span>\n )}\n </span>\n )}\n\n {/* Navigation arrow */}\n {showArrow && (\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n <span className=\"text-gray-400 text-sm px-1 rounded transition-all cursor-pointer hover:text-gray-600 hover:bg-gray-200\">\n →\n </span>\n </div>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;AAUO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;;AACD,QAAM,cACH,KAAK,SAAS,UAAU,KAAK,eAC7B,KAAK,SAAS,UAAU,KAAK,SAC7B,KAAK,SAAS,WAAW,KAAK,eAC9B,KAAK,SAAS,oBAAoB,KAAK,eACvC,KAAK,SAAS,SAAS,KAAK;AAC/B,QAAM,cAAc,KAAK,SAAS,4BAC/B,QAAA,EAAK,WAAU,oBAAmB,OAAO,KAAK,MAC5C,UAAA,KAAK,KAAA,CACR,IAEA,KAAK;AAGP,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,UAAU;AAAA,MACV;AAAA,MAGA;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,KAAK,gBAAgB,mBAAmB,mBACtC,CAAC,cACD;AAAA,QACF,cAAc;AAAA,MAAA;AAAA,MAIhB,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,eAAe;AAAA,YAAA;AAAA,YAGjB,UAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,cAAc,KAAK;AAAA,gBACnB,cAAc,KAAK;AAAA,gBACnB,KAAK,KAAK;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ;AAAA,QAAA;AAAA,QAID,cACC,qBAAC,OAAA,EAAI,WAAU,8CACb,UAAA;AAAA,UAAA,qBAAC,QAAA,EAAK,WAAU,mDACb,UAAA;AAAA,YAAA;AAAA,cACA,UAAK,UAAL,mBAAY,gBACX,oBAAC,QAAA,EAAK,WAAU,wDAAuD;AAAA,cAExE,UAAK,UAAL,mBAAY,uCACV,QAAA,EAAK,WAAU,8EAA6E,UAAA,eAAA,CAE7F;AAAA,UAAA,GAEJ;AAAA,UACA,oBAAC,QAAA,EAAK,WAAU,uDACb,UAAA,KAAK,SAAS,SAAS,KAAK,QAAQ,KAAK,YAAA,CAC5C;AAAA,QAAA,EAAA,CACF,IAEA,qBAAC,QAAA,EAAK,WAAU,6DACb,UAAA;AAAA,UAAA;AAAA,YACA,UAAK,UAAL,mBAAY,gBACX,oBAAC,QAAA,EAAK,WAAU,wDAAuD;AAAA,YAExE,UAAK,UAAL,mBAAY,uCACV,QAAA,EAAK,WAAU,8EAA6E,UAAA,eAAA,CAE7F;AAAA,QAAA,GAEJ;AAAA,QAID,aACC,oBAAC,OAAA,EAAI,WAAU,yCACb,8BAAC,QAAA,EAAK,WAAU,0GAAyG,UAAA,IAAA,CAEzH,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;"}
@@ -118,6 +118,14 @@ const PAGINATED_ASSETS_QUERY = `
118
118
  }
119
119
  }
120
120
  `;
121
+ const MENTION_EMAIL_METADATA_QUERY = `
122
+ query MentionEmailMetadata($assetIds: [String!]!) {
123
+ getAssetsByIds(assetIds: $assetIds, withMetadata: true) {
124
+ id
125
+ athenaMetadata
126
+ }
127
+ }
128
+ `;
121
129
  const WORKSPACE_MEMBERS_QUERY = `
122
130
  query GetUsersInWorkspace($workspaceId: String!) {
123
131
  getUsersInWorkspace(workspaceId: $workspaceId) {
@@ -130,6 +138,38 @@ const WORKSPACE_MEMBERS_QUERY = `
130
138
  }
131
139
  }
132
140
  `;
141
+ const WORKSPACE_GROUPS_QUERY = `
142
+ query MentionWorkspaceGroups($workspaceId: String!) {
143
+ getWorkspaceGroups(workspaceId: $workspaceId) {
144
+ id
145
+ name
146
+ slug
147
+ memberCount
148
+ archivedAt
149
+ }
150
+ }
151
+ `;
152
+ const PERSON_MENTION_CANDIDATES_QUERY = `
153
+ query PersonMentionCandidates($limit: Int) {
154
+ personMentionCandidates(limit: $limit) {
155
+ email
156
+ displayName
157
+ userId
158
+ savedPersonAssetId
159
+ photoUrl
160
+ lastInteractionAt
161
+ }
162
+ }
163
+ `;
164
+ const VIEWER_IS_ADMIN_QUERY = `
165
+ query MentionViewerIsAdmin {
166
+ getCurrentUserWithWorkspace {
167
+ user {
168
+ isAdmin
169
+ }
170
+ }
171
+ }
172
+ `;
133
173
  const TOOL_CATALOG_QUERY = `
134
174
  query MentionToolCatalog {
135
175
  getToolkitToToolsMapping {
@@ -154,10 +194,15 @@ const TOOL_CATALOG_QUERY = `
154
194
  }
155
195
  `;
156
196
  exports.AthenaGraphQLError = AthenaGraphQLError;
197
+ exports.MENTION_ASSET_FIELDS = MENTION_ASSET_FIELDS;
198
+ exports.MENTION_EMAIL_METADATA_QUERY = MENTION_EMAIL_METADATA_QUERY;
157
199
  exports.MentionAuthCtx = MentionAuthCtx;
158
200
  exports.PAGINATED_ASSETS_QUERY = PAGINATED_ASSETS_QUERY;
201
+ exports.PERSON_MENTION_CANDIDATES_QUERY = PERSON_MENTION_CANDIDATES_QUERY;
159
202
  exports.SIMPLE_SEARCH_QUERY = SIMPLE_SEARCH_QUERY;
160
203
  exports.TOOL_CATALOG_QUERY = TOOL_CATALOG_QUERY;
204
+ exports.VIEWER_IS_ADMIN_QUERY = VIEWER_IS_ADMIN_QUERY;
205
+ exports.WORKSPACE_GROUPS_QUERY = WORKSPACE_GROUPS_QUERY;
161
206
  exports.WORKSPACE_MEMBERS_QUERY = WORKSPACE_MEMBERS_QUERY;
162
207
  exports.fetchGraphQL = fetchGraphQL;
163
208
  exports.mentionRequestInit = mentionRequestInit;
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/data/api-client.ts"],"sourcesContent":["/**\n * API client for mention data fetching.\n *\n * Wraps raw fetch() with GraphQL support. Hosts authenticate with either a\n * bearer token or a workspace API key; agora's /graphql accepts both.\n */\n\nimport { createContext, useContext } from \"react\";\n\n// ── Auth context ──\n\nexport interface MentionAuthContext {\n backendUrl: string;\n appUrl?: string;\n /** Bearer credential; hosts without one authenticate with `apiKey`. */\n accessToken?: string;\n /**\n * Resolve a current bearer before each query (for rotating Office sessions).\n * Resolving nothing falls back to `accessToken`, then the API key.\n */\n getAccessToken?: () => Promise<string | null | undefined>;\n /**\n * Renew the bearer after the backend refused it (401), for one resend of\n * the query. Without it, or when it resolves nothing, a refused query fails\n * as before.\n */\n renewAccessToken?: () => Promise<string | null | undefined>;\n apiKey?: string;\n /**\n * With neither credential, ride the browser's same-origin session cookie\n * instead of failing — the SDK's AthenaChat, whose REST helpers make the\n * same choice for a host that configured no token and no API key. Hosts\n * that always hold a credential leave this unset so an accidental anonymous\n * query fails loudly.\n */\n credentials?: \"include\";\n workspaceId?: string;\n userId?: string;\n}\n\n/** Credential headers (or the cookie lane) for a mention fetch. */\nexport function mentionRequestInit(\n auth: MentionAuthContext,\n): Pick<RequestInit, \"headers\" | \"credentials\"> {\n if (auth.accessToken) {\n return { headers: { Authorization: `Bearer ${auth.accessToken}` } };\n }\n if (auth.apiKey) return { headers: { \"X-API-KEY\": auth.apiKey } };\n if (auth.credentials) return { headers: {}, credentials: auth.credentials };\n throw new Error(\"MentionAuthCtx needs either an accessToken or an apiKey\");\n}\n\nexport const MentionAuthCtx = createContext<MentionAuthContext | null>(null);\n\nexport function useMentionAuth(): MentionAuthContext {\n const ctx = useContext(MentionAuthCtx);\n if (!ctx) throw new Error(\"MentionAuthCtx not provided\");\n return ctx;\n}\n\n// ── GraphQL client ──\n\n/**\n * What {@link fetchGraphQL} throws: an HTTP failure (`status`) or the first\n * GraphQL error of the response (`code`, its `extensions.code`, e.g. agora's\n * `UNAUTHORIZED` for an asset the caller cannot read).\n */\nexport class AthenaGraphQLError extends Error {\n readonly status: number | null;\n readonly code: string | null;\n\n constructor({\n message,\n status = null,\n code = null,\n }: {\n message: string;\n status?: number | null;\n code?: string | null;\n }) {\n super(message);\n this.name = \"AthenaGraphQLError\";\n this.status = status;\n this.code = code;\n }\n}\n\n/** The `extensions.code` of a GraphQL error entry, when it carries a string one. */\nfunction graphQLErrorCode(entry: unknown): string | null {\n if (typeof entry !== \"object\" || entry === null) return null;\n const extensions: unknown = Reflect.get(entry, \"extensions\");\n if (typeof extensions !== \"object\" || extensions === null) return null;\n const code: unknown = Reflect.get(extensions, \"code\");\n return typeof code === \"string\" ? code : null;\n}\n\nexport async function fetchGraphQL<T = any>(\n auth: MentionAuthContext,\n query: string,\n variables: Record<string, any> = {},\n options: { signal?: AbortSignal } = {},\n): Promise<T> {\n const url = `${auth.backendUrl.replace(/\\/+$/, \"\")}/graphql`;\n const send = (requestAuth: MentionAuthContext) => {\n const { headers, credentials } = mentionRequestInit(requestAuth);\n return fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n ...(credentials ? { credentials } : {}),\n signal: options.signal,\n body: JSON.stringify({ query, variables }),\n });\n };\n const requestAuth = auth.getAccessToken\n ? { ...auth, accessToken: (await auth.getAccessToken()) ?? auth.accessToken }\n : auth;\n let response = await send(requestAuth);\n // A refused bearer gets one renewal and a resend (the statewire transport's\n // `staleAuth` contract); an API-key or cookie request has nothing to renew.\n if (response.status === 401 && requestAuth.accessToken && auth.renewAccessToken) {\n const renewed = await auth.renewAccessToken();\n // The same token again (a static one) would only be refused again.\n if (renewed && renewed !== requestAuth.accessToken) {\n response = await send({ ...auth, accessToken: renewed });\n }\n }\n\n if (!response.ok) {\n throw new AthenaGraphQLError({\n message: `GraphQL HTTP ${response.status}: ${response.statusText}`,\n status: response.status,\n });\n }\n\n const result = await response.json();\n if (result.errors?.length) {\n throw new AthenaGraphQLError({\n message: `GraphQL error: ${result.errors[0].message}`,\n code: graphQLErrorCode(result.errors[0]),\n });\n }\n\n return result.data as T;\n}\n\n// ── GraphQL Queries ──\n\n/**\n * Lightweight asset fragment for mention menu items.\n * Only fetches fields needed for display + navigation.\n */\nconst MENTION_ASSET_FIELDS = `\n id\n title\n athenaOriginalType\n athenaConvertedType\n parentFolderId\n updatedAt\n isFavorited\n isArchived\n isHidden\n`;\n\nexport const SIMPLE_SEARCH_QUERY = `\n query SimpleSearch($input: SimpleSearchRequestInput!) {\n simpleSearch(input: $input) {\n assets {\n ${MENTION_ASSET_FIELDS}\n }\n totalCount\n }\n }\n`;\n\nexport const PAGINATED_ASSETS_QUERY = `\n query GetPaginatedAssetsForWorkspace(\n $limit: Int!\n $offset: Int!\n $parentFolderId: String\n $filterTypes: [String!]\n $filterColumns: ColumnFilter\n ) {\n getPaginatedAssetsForWorkspace(\n limit: $limit\n offset: $offset\n parentFolderId: $parentFolderId\n filterTypes: $filterTypes\n filterColumns: $filterColumns\n ) {\n ${MENTION_ASSET_FIELDS}\n }\n }\n`;\n\nexport const WORKSPACE_MEMBERS_QUERY = `\n query GetUsersInWorkspace($workspaceId: String!) {\n getUsersInWorkspace(workspaceId: $workspaceId) {\n id\n email\n firstName\n lastName\n isAdmin\n avatarUrl\n }\n }\n`;\n\nexport const TOOL_CATALOG_QUERY = `\n query MentionToolCatalog {\n getToolkitToToolsMapping {\n tools {\n id\n name\n description\n icon\n adminOnly\n isMentionable\n }\n toolkits {\n name\n displayName\n description\n icon\n onlyAdmin\n hideFromMenu\n isMentionable\n }\n }\n }\n`;\n\n// ── Response types ──\n\nexport interface ToolCatalogTool {\n id: string;\n name: string;\n description: string | null;\n icon: string;\n adminOnly: boolean;\n isMentionable: boolean;\n}\n\nexport interface ToolCatalogToolkit {\n name: string;\n displayName: string;\n description: string;\n icon: string;\n onlyAdmin: boolean;\n hideFromMenu: boolean;\n isMentionable: boolean;\n}\n\nexport interface ToolCatalogResult {\n getToolkitToToolsMapping: {\n tools: ToolCatalogTool[];\n toolkits: ToolCatalogToolkit[];\n };\n}\n\nexport interface AssetResult {\n id: string;\n title: string | null;\n athenaOriginalType: string | null;\n athenaConvertedType: string | null;\n parentFolderId: string | null;\n updatedAt: string | null;\n isFavorited: boolean | null;\n isArchived: boolean | null;\n isHidden: boolean | null;\n}\n\nexport interface WorkspaceMember {\n id: string;\n email: string | null;\n firstName: string | null;\n lastName: string | null;\n isAdmin: boolean;\n avatarUrl: string | null;\n}\n"],"names":["createContext","useContext","requestAuth"],"mappings":"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"}
1
+ {"version":3,"file":"api-client.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/data/api-client.ts"],"sourcesContent":["/**\n * API client for mention data fetching.\n *\n * Wraps raw fetch() with GraphQL support. Hosts authenticate with either a\n * bearer token or a workspace API key; agora's /graphql accepts both.\n */\n\nimport { createContext, useContext } from \"react\";\n\n// ── Auth context ──\n\nexport interface MentionAuthContext {\n backendUrl: string;\n appUrl?: string;\n /** Bearer credential; hosts without one authenticate with `apiKey`. */\n accessToken?: string;\n /**\n * Resolve a current bearer before each query (for rotating Office sessions).\n * Resolving nothing falls back to `accessToken`, then the API key.\n */\n getAccessToken?: () => Promise<string | null | undefined>;\n /**\n * Renew the bearer after the backend refused it (401), for one resend of\n * the query. Without it, or when it resolves nothing, a refused query fails\n * as before.\n */\n renewAccessToken?: () => Promise<string | null | undefined>;\n apiKey?: string;\n /**\n * With neither credential, ride the browser's same-origin session cookie\n * instead of failing — the SDK's AthenaChat, whose REST helpers make the\n * same choice for a host that configured no token and no API key. Hosts\n * that always hold a credential leave this unset so an accidental anonymous\n * query fails loudly.\n */\n credentials?: \"include\";\n workspaceId?: string;\n userId?: string;\n}\n\n/** Credential headers (or the cookie lane) for a mention fetch. */\nexport function mentionRequestInit(\n auth: MentionAuthContext,\n): Pick<RequestInit, \"headers\" | \"credentials\"> {\n if (auth.accessToken) {\n return { headers: { Authorization: `Bearer ${auth.accessToken}` } };\n }\n if (auth.apiKey) return { headers: { \"X-API-KEY\": auth.apiKey } };\n if (auth.credentials) return { headers: {}, credentials: auth.credentials };\n throw new Error(\"MentionAuthCtx needs either an accessToken or an apiKey\");\n}\n\nexport const MentionAuthCtx = createContext<MentionAuthContext | null>(null);\n\nexport function useMentionAuth(): MentionAuthContext {\n const ctx = useContext(MentionAuthCtx);\n if (!ctx) throw new Error(\"MentionAuthCtx not provided\");\n return ctx;\n}\n\n// ── GraphQL client ──\n\n/**\n * What {@link fetchGraphQL} throws: an HTTP failure (`status`) or the first\n * GraphQL error of the response (`code`, its `extensions.code`, e.g. agora's\n * `UNAUTHORIZED` for an asset the caller cannot read).\n */\nexport class AthenaGraphQLError extends Error {\n readonly status: number | null;\n readonly code: string | null;\n\n constructor({\n message,\n status = null,\n code = null,\n }: {\n message: string;\n status?: number | null;\n code?: string | null;\n }) {\n super(message);\n this.name = \"AthenaGraphQLError\";\n this.status = status;\n this.code = code;\n }\n}\n\n/** The `extensions.code` of a GraphQL error entry, when it carries a string one. */\nfunction graphQLErrorCode(entry: unknown): string | null {\n if (typeof entry !== \"object\" || entry === null) return null;\n const extensions: unknown = Reflect.get(entry, \"extensions\");\n if (typeof extensions !== \"object\" || extensions === null) return null;\n const code: unknown = Reflect.get(extensions, \"code\");\n return typeof code === \"string\" ? code : null;\n}\n\nexport async function fetchGraphQL<T = any>(\n auth: MentionAuthContext,\n query: string,\n variables: Record<string, any> = {},\n options: { signal?: AbortSignal } = {},\n): Promise<T> {\n const url = `${auth.backendUrl.replace(/\\/+$/, \"\")}/graphql`;\n const send = (requestAuth: MentionAuthContext) => {\n const { headers, credentials } = mentionRequestInit(requestAuth);\n return fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n ...(credentials ? { credentials } : {}),\n signal: options.signal,\n body: JSON.stringify({ query, variables }),\n });\n };\n const requestAuth = auth.getAccessToken\n ? { ...auth, accessToken: (await auth.getAccessToken()) ?? auth.accessToken }\n : auth;\n let response = await send(requestAuth);\n // A refused bearer gets one renewal and a resend (the statewire transport's\n // `staleAuth` contract); an API-key or cookie request has nothing to renew.\n if (response.status === 401 && requestAuth.accessToken && auth.renewAccessToken) {\n const renewed = await auth.renewAccessToken();\n // The same token again (a static one) would only be refused again.\n if (renewed && renewed !== requestAuth.accessToken) {\n response = await send({ ...auth, accessToken: renewed });\n }\n }\n\n if (!response.ok) {\n throw new AthenaGraphQLError({\n message: `GraphQL HTTP ${response.status}: ${response.statusText}`,\n status: response.status,\n });\n }\n\n const result = await response.json();\n if (result.errors?.length) {\n throw new AthenaGraphQLError({\n message: `GraphQL error: ${result.errors[0].message}`,\n code: graphQLErrorCode(result.errors[0]),\n });\n }\n\n return result.data as T;\n}\n\n// ── GraphQL Queries ──\n\n/**\n * Lightweight asset fragment for mention menu items.\n * Only fetches fields needed for display + navigation.\n */\nexport const MENTION_ASSET_FIELDS = `\n id\n title\n athenaOriginalType\n athenaConvertedType\n parentFolderId\n updatedAt\n isFavorited\n isArchived\n isHidden\n`;\n\nexport const SIMPLE_SEARCH_QUERY = `\n query SimpleSearch($input: SimpleSearchRequestInput!) {\n simpleSearch(input: $input) {\n assets {\n ${MENTION_ASSET_FIELDS}\n }\n totalCount\n }\n }\n`;\n\nexport const PAGINATED_ASSETS_QUERY = `\n query GetPaginatedAssetsForWorkspace(\n $limit: Int!\n $offset: Int!\n $parentFolderId: String\n $filterTypes: [String!]\n $filterColumns: ColumnFilter\n ) {\n getPaginatedAssetsForWorkspace(\n limit: $limit\n offset: $offset\n parentFolderId: $parentFolderId\n filterTypes: $filterTypes\n filterColumns: $filterColumns\n ) {\n ${MENTION_ASSET_FIELDS}\n }\n }\n`;\n\n/**\n * The metadata of the email rows a page lists, read for those rows alone so\n * the search stays slim: it names their mailbox, whose logo the row draws\n * (`emailProviderThumb`). Ids the caller may not read are left out.\n */\nexport const MENTION_EMAIL_METADATA_QUERY = `\n query MentionEmailMetadata($assetIds: [String!]!) {\n getAssetsByIds(assetIds: $assetIds, withMetadata: true) {\n id\n athenaMetadata\n }\n }\n`;\n\nexport const WORKSPACE_MEMBERS_QUERY = `\n query GetUsersInWorkspace($workspaceId: String!) {\n getUsersInWorkspace(workspaceId: $workspaceId) {\n id\n email\n firstName\n lastName\n isAdmin\n avatarUrl\n }\n }\n`;\n\n/**\n * The workspace's groups, listed under Team after the members (Olympus's\n * `MentionWorkspaceGroups`). An agora that predates groups refuses the query;\n * Team then lists the members alone.\n */\nexport const WORKSPACE_GROUPS_QUERY = `\n query MentionWorkspaceGroups($workspaceId: String!) {\n getWorkspaceGroups(workspaceId: $workspaceId) {\n id\n name\n slug\n memberCount\n archivedAt\n }\n }\n`;\n\n/**\n * The viewer's people, most recently talked to first: teammates and the people\n * they saved (Olympus's `PersonMentionCandidates`, docs/PERSON_GUIDE.md). Asked\n * for admins only while Person is in preview; agora's Person gate refuses\n * everyone else.\n */\nexport const PERSON_MENTION_CANDIDATES_QUERY = `\n query PersonMentionCandidates($limit: Int) {\n personMentionCandidates(limit: $limit) {\n email\n displayName\n userId\n savedPersonAssetId\n photoUrl\n lastInteractionAt\n }\n }\n`;\n\n/** Whether the viewer is an Athena admin: who the Agents section and the ranked people are offered to. */\nexport const VIEWER_IS_ADMIN_QUERY = `\n query MentionViewerIsAdmin {\n getCurrentUserWithWorkspace {\n user {\n isAdmin\n }\n }\n }\n`;\n\nexport const TOOL_CATALOG_QUERY = `\n query MentionToolCatalog {\n getToolkitToToolsMapping {\n tools {\n id\n name\n description\n icon\n adminOnly\n isMentionable\n }\n toolkits {\n name\n displayName\n description\n icon\n onlyAdmin\n hideFromMenu\n isMentionable\n }\n }\n }\n`;\n\n// ── Response types ──\n\nexport interface ToolCatalogTool {\n id: string;\n name: string;\n description: string | null;\n icon: string;\n adminOnly: boolean;\n isMentionable: boolean;\n}\n\nexport interface ToolCatalogToolkit {\n name: string;\n displayName: string;\n description: string;\n icon: string;\n onlyAdmin: boolean;\n hideFromMenu: boolean;\n isMentionable: boolean;\n}\n\nexport interface ToolCatalogResult {\n getToolkitToToolsMapping: {\n tools: ToolCatalogTool[];\n toolkits: ToolCatalogToolkit[];\n };\n}\n\nexport interface AssetResult {\n id: string;\n title: string | null;\n athenaOriginalType: string | null;\n athenaConvertedType: string | null;\n parentFolderId: string | null;\n updatedAt: string | null;\n isFavorited: boolean | null;\n isArchived: boolean | null;\n isHidden: boolean | null;\n}\n\nexport interface WorkspaceMember {\n id: string;\n email: string | null;\n firstName: string | null;\n lastName: string | null;\n isAdmin: boolean;\n avatarUrl: string | null;\n}\n\nexport interface WorkspaceGroup {\n id: string;\n name: string;\n slug: string | null;\n memberCount: number;\n archivedAt: string | null;\n}\n\nexport interface PersonMentionCandidate {\n email: string;\n displayName: string;\n userId: string | null;\n savedPersonAssetId: string | null;\n photoUrl: string | null;\n lastInteractionAt: string | null;\n}\n\nexport interface ViewerIsAdminResult {\n getCurrentUserWithWorkspace: { user: { isAdmin: boolean } } | null;\n}\n"],"names":["createContext","useContext","requestAuth"],"mappings":"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"}