@athenaintel/react 0.20.0 → 0.21.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 (347) hide show
  1. package/README.md +74 -0
  2. package/dist/assets/use-asset-embed.cjs +8 -0
  3. package/dist/assets/use-asset-embed.cjs.map +1 -1
  4. package/dist/assets/use-asset-embed.js +8 -0
  5. package/dist/assets/use-asset-embed.js.map +1 -1
  6. package/dist/chat/StatewireApprovalCard.cjs +22 -4
  7. package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
  8. package/dist/chat/StatewireApprovalCard.d.ts +14 -0
  9. package/dist/chat/StatewireApprovalCard.js +23 -5
  10. package/dist/chat/StatewireApprovalCard.js.map +1 -1
  11. package/dist/chat/StatewireClientToolBridge.cjs +2 -1
  12. package/dist/chat/StatewireClientToolBridge.cjs.map +1 -1
  13. package/dist/chat/StatewireClientToolBridge.js +2 -1
  14. package/dist/chat/StatewireClientToolBridge.js.map +1 -1
  15. package/dist/chat/StatewireQueuedMessages.cjs +2 -1
  16. package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
  17. package/dist/chat/StatewireQueuedMessages.js +2 -1
  18. package/dist/chat/StatewireQueuedMessages.js.map +1 -1
  19. package/dist/chat/athena-citation-links.cjs +17 -1
  20. package/dist/chat/athena-citation-links.cjs.map +1 -1
  21. package/dist/chat/athena-citation-links.js +17 -1
  22. package/dist/chat/athena-citation-links.js.map +1 -1
  23. package/dist/chat/statewire-client-tools.cjs +2 -1
  24. package/dist/chat/statewire-client-tools.cjs.map +1 -1
  25. package/dist/chat/statewire-client-tools.js +2 -1
  26. package/dist/chat/statewire-client-tools.js.map +1 -1
  27. package/dist/chat/super-grouping/SuperGroupingCard.cjs +69 -187
  28. package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
  29. package/dist/chat/super-grouping/SuperGroupingCard.d.ts +10 -6
  30. package/dist/chat/super-grouping/SuperGroupingCard.js +73 -191
  31. package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
  32. package/dist/chat/super-grouping/ToolTimeline.cjs +131 -0
  33. package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -0
  34. package/dist/chat/super-grouping/ToolTimeline.d.ts +16 -0
  35. package/dist/chat/super-grouping/ToolTimeline.js +131 -0
  36. package/dist/chat/super-grouping/ToolTimeline.js.map +1 -0
  37. package/dist/chat/super-grouping/activity-timeline.cjs +14 -8
  38. package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
  39. package/dist/chat/super-grouping/activity-timeline.d.ts +3 -0
  40. package/dist/chat/super-grouping/activity-timeline.js +14 -8
  41. package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
  42. package/dist/chat/super-grouping/timeline-step.cjs +65 -0
  43. package/dist/chat/super-grouping/timeline-step.cjs.map +1 -0
  44. package/dist/chat/super-grouping/timeline-step.d.ts +17 -0
  45. package/dist/chat/super-grouping/timeline-step.js +65 -0
  46. package/dist/chat/super-grouping/timeline-step.js.map +1 -0
  47. package/dist/chat/tiptap-text.cjs +8 -8
  48. package/dist/chat/tiptap-text.cjs.map +1 -1
  49. package/dist/chat/use-athena-run-live.cjs +2 -1
  50. package/dist/chat/use-athena-run-live.cjs.map +1 -1
  51. package/dist/chat/use-athena-run-live.js +2 -1
  52. package/dist/chat/use-athena-run-live.js.map +1 -1
  53. package/dist/chat/use-statewire-approval-request.cjs +7 -2
  54. package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
  55. package/dist/chat/use-statewire-approval-request.d.ts +12 -2
  56. package/dist/chat/use-statewire-approval-request.js +8 -3
  57. package/dist/chat/use-statewire-approval-request.js.map +1 -1
  58. package/dist/chat-ui/composer/tiptap-composer.cjs +24 -65
  59. package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
  60. package/dist/chat-ui/composer/tiptap-composer.js +24 -65
  61. package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
  62. package/dist/chat-ui/index.cjs +2 -1
  63. package/dist/chat-ui/index.cjs.map +1 -1
  64. package/dist/chat-ui/index.js +2 -1
  65. package/dist/chat-ui/index.js.map +1 -1
  66. package/dist/chat-ui/mentions/mention-chip.cjs +49 -4
  67. package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
  68. package/dist/chat-ui/mentions/mention-chip.d.ts +11 -0
  69. package/dist/chat-ui/mentions/mention-chip.js +50 -5
  70. package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
  71. package/dist/chat-ui/mentions/mention-extension.cjs +18 -6
  72. package/dist/chat-ui/mentions/mention-extension.cjs.map +1 -1
  73. package/dist/chat-ui/mentions/mention-extension.d.ts +2 -0
  74. package/dist/chat-ui/mentions/mention-extension.js +18 -6
  75. package/dist/chat-ui/mentions/mention-extension.js.map +1 -1
  76. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs +1 -1
  77. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs.map +1 -1
  78. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js +1 -1
  79. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js.map +1 -1
  80. package/dist/chat-ui/mentions/suggestions/components/menu-item.cjs +9 -6
  81. package/dist/chat-ui/mentions/suggestions/components/menu-item.cjs.map +1 -1
  82. package/dist/chat-ui/mentions/suggestions/components/menu-item.d.ts +2 -2
  83. package/dist/chat-ui/mentions/suggestions/components/menu-item.js +10 -7
  84. package/dist/chat-ui/mentions/suggestions/components/menu-item.js.map +1 -1
  85. package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs +2 -2
  86. package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs.map +1 -1
  87. package/dist/chat-ui/mentions/suggestions/components/menu-list.d.ts +2 -2
  88. package/dist/chat-ui/mentions/suggestions/components/menu-list.js +2 -2
  89. package/dist/chat-ui/mentions/suggestions/components/menu-list.js.map +1 -1
  90. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +2 -1
  91. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
  92. package/dist/chat-ui/mentions/suggestions/data/api-client.d.ts +3 -2
  93. package/dist/chat-ui/mentions/suggestions/data/api-client.js +2 -1
  94. package/dist/chat-ui/mentions/suggestions/data/api-client.js.map +1 -1
  95. package/dist/chat-ui/messages/message-components.cjs +6 -29
  96. package/dist/chat-ui/messages/message-components.cjs.map +1 -1
  97. package/dist/chat-ui/messages/message-components.d.ts +1 -13
  98. package/dist/chat-ui/messages/message-components.js +8 -31
  99. package/dist/chat-ui/messages/message-components.js.map +1 -1
  100. package/dist/chat-ui/messages/runtime-message.cjs +3 -2
  101. package/dist/chat-ui/messages/runtime-message.cjs.map +1 -1
  102. package/dist/chat-ui/messages/runtime-message.js +3 -2
  103. package/dist/chat-ui/messages/runtime-message.js.map +1 -1
  104. package/dist/chat-ui/messages/statewire-continue-run.cjs +23 -8
  105. package/dist/chat-ui/messages/statewire-continue-run.cjs.map +1 -1
  106. package/dist/chat-ui/messages/statewire-continue-run.d.ts +14 -4
  107. package/dist/chat-ui/messages/statewire-continue-run.js +23 -8
  108. package/dist/chat-ui/messages/statewire-continue-run.js.map +1 -1
  109. package/dist/chat-ui/messages/user-edit-composer.cjs +2 -1
  110. package/dist/chat-ui/messages/user-edit-composer.cjs.map +1 -1
  111. package/dist/chat-ui/messages/user-edit-composer.js +2 -1
  112. package/dist/chat-ui/messages/user-edit-composer.js.map +1 -1
  113. package/dist/chat-ui/rich-text/chat-message-body.cjs +76 -0
  114. package/dist/chat-ui/rich-text/chat-message-body.cjs.map +1 -0
  115. package/dist/chat-ui/rich-text/chat-message-body.d.ts +5 -0
  116. package/dist/chat-ui/rich-text/chat-message-body.js +76 -0
  117. package/dist/chat-ui/rich-text/chat-message-body.js.map +1 -0
  118. package/dist/chat-ui/rich-text/chat-node-views.cjs +51 -0
  119. package/dist/chat-ui/rich-text/chat-node-views.cjs.map +1 -0
  120. package/dist/chat-ui/rich-text/chat-node-views.d.ts +13 -0
  121. package/dist/chat-ui/rich-text/chat-node-views.js +51 -0
  122. package/dist/chat-ui/rich-text/chat-node-views.js.map +1 -0
  123. package/dist/chat-ui/rich-text/chat-text-schema.cjs +70 -0
  124. package/dist/chat-ui/rich-text/chat-text-schema.cjs.map +1 -0
  125. package/dist/chat-ui/rich-text/chat-text-schema.d.ts +7 -0
  126. package/dist/chat-ui/rich-text/chat-text-schema.js +70 -0
  127. package/dist/chat-ui/rich-text/chat-text-schema.js.map +1 -0
  128. package/dist/chat-ui/rich-text/dom-output-spec.cjs +83 -0
  129. package/dist/chat-ui/rich-text/dom-output-spec.cjs.map +1 -0
  130. package/dist/chat-ui/rich-text/dom-output-spec.d.ts +11 -0
  131. package/dist/chat-ui/rich-text/dom-output-spec.js +83 -0
  132. package/dist/chat-ui/rich-text/dom-output-spec.js.map +1 -0
  133. package/dist/chat-ui/statewire.cjs +2 -1
  134. package/dist/chat-ui/statewire.cjs.map +1 -1
  135. package/dist/chat-ui/statewire.js +2 -1
  136. package/dist/chat-ui/statewire.js.map +1 -1
  137. package/dist/chat-ui/thread/statewire-history-edge.cjs +2 -1
  138. package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
  139. package/dist/chat-ui/thread/statewire-history-edge.js +2 -1
  140. package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
  141. package/dist/index.cjs +2 -1
  142. package/dist/index.cjs.map +1 -1
  143. package/dist/index.js +2 -1
  144. package/dist/index.js.map +1 -1
  145. package/dist/node_modules/qrcode-generator/dist/qrcode.cjs +32 -0
  146. package/dist/node_modules/qrcode-generator/dist/qrcode.cjs.map +1 -0
  147. package/dist/node_modules/qrcode-generator/dist/qrcode.js +31 -0
  148. package/dist/node_modules/qrcode-generator/dist/qrcode.js.map +1 -0
  149. package/dist/node_modules/zod/v4/classic/errors.cjs +44 -0
  150. package/dist/node_modules/zod/v4/classic/errors.cjs.map +1 -0
  151. package/dist/node_modules/zod/v4/classic/errors.js +44 -0
  152. package/dist/node_modules/zod/v4/classic/errors.js.map +1 -0
  153. package/dist/node_modules/zod/v4/classic/iso.cjs +43 -0
  154. package/dist/node_modules/zod/v4/classic/iso.cjs.map +1 -0
  155. package/dist/node_modules/zod/v4/classic/iso.js +43 -0
  156. package/dist/node_modules/zod/v4/classic/iso.js.map +1 -0
  157. package/dist/node_modules/zod/v4/classic/parse.cjs +29 -0
  158. package/dist/node_modules/zod/v4/classic/parse.cjs.map +1 -0
  159. package/dist/node_modules/zod/v4/classic/parse.js +29 -0
  160. package/dist/node_modules/zod/v4/classic/parse.js.map +1 -0
  161. package/dist/node_modules/zod/v4/classic/schemas.cjs +871 -0
  162. package/dist/node_modules/zod/v4/classic/schemas.cjs.map +1 -0
  163. package/dist/node_modules/zod/v4/classic/schemas.js +871 -0
  164. package/dist/node_modules/zod/v4/classic/schemas.js.map +1 -0
  165. package/dist/node_modules/zod/v4/core/api.cjs +570 -0
  166. package/dist/node_modules/zod/v4/core/api.cjs.map +1 -0
  167. package/dist/node_modules/zod/v4/core/api.js +570 -0
  168. package/dist/node_modules/zod/v4/core/api.js.map +1 -0
  169. package/dist/node_modules/zod/v4/core/checks.cjs +411 -0
  170. package/dist/node_modules/zod/v4/core/checks.cjs.map +1 -0
  171. package/dist/node_modules/zod/v4/core/checks.js +411 -0
  172. package/dist/node_modules/zod/v4/core/checks.js.map +1 -0
  173. package/dist/node_modules/zod/v4/core/core.cjs +77 -0
  174. package/dist/node_modules/zod/v4/core/core.cjs.map +1 -0
  175. package/dist/node_modules/zod/v4/core/core.js +77 -0
  176. package/dist/node_modules/zod/v4/core/core.js.map +1 -0
  177. package/dist/node_modules/zod/v4/core/doc.cjs +38 -0
  178. package/dist/node_modules/zod/v4/core/doc.cjs.map +1 -0
  179. package/dist/node_modules/zod/v4/core/doc.js +38 -0
  180. package/dist/node_modules/zod/v4/core/doc.js.map +1 -0
  181. package/dist/node_modules/zod/v4/core/errors.cjs +76 -0
  182. package/dist/node_modules/zod/v4/core/errors.cjs.map +1 -0
  183. package/dist/node_modules/zod/v4/core/errors.js +76 -0
  184. package/dist/node_modules/zod/v4/core/errors.js.map +1 -0
  185. package/dist/node_modules/zod/v4/core/json-schema-processors.cjs +312 -0
  186. package/dist/node_modules/zod/v4/core/json-schema-processors.cjs.map +1 -0
  187. package/dist/node_modules/zod/v4/core/json-schema-processors.js +312 -0
  188. package/dist/node_modules/zod/v4/core/json-schema-processors.js.map +1 -0
  189. package/dist/node_modules/zod/v4/core/parse.cjs +96 -0
  190. package/dist/node_modules/zod/v4/core/parse.cjs.map +1 -0
  191. package/dist/node_modules/zod/v4/core/parse.js +96 -0
  192. package/dist/node_modules/zod/v4/core/parse.js.map +1 -0
  193. package/dist/node_modules/zod/v4/core/regexes.cjs +86 -0
  194. package/dist/node_modules/zod/v4/core/regexes.cjs.map +1 -0
  195. package/dist/node_modules/zod/v4/core/regexes.js +86 -0
  196. package/dist/node_modules/zod/v4/core/regexes.js.map +1 -0
  197. package/dist/node_modules/zod/v4/core/registries.cjs +52 -0
  198. package/dist/node_modules/zod/v4/core/registries.cjs.map +1 -0
  199. package/dist/node_modules/zod/v4/core/registries.js +52 -0
  200. package/dist/node_modules/zod/v4/core/registries.js.map +1 -0
  201. package/dist/node_modules/zod/v4/core/schemas.cjs +1412 -0
  202. package/dist/node_modules/zod/v4/core/schemas.cjs.map +1 -0
  203. package/dist/node_modules/zod/v4/core/schemas.js +1413 -0
  204. package/dist/node_modules/zod/v4/core/schemas.js.map +1 -0
  205. package/dist/node_modules/zod/v4/core/to-json-schema.cjs +370 -0
  206. package/dist/node_modules/zod/v4/core/to-json-schema.cjs.map +1 -0
  207. package/dist/node_modules/zod/v4/core/to-json-schema.js +370 -0
  208. package/dist/node_modules/zod/v4/core/to-json-schema.js.map +1 -0
  209. package/dist/node_modules/zod/v4/core/util.cjs +444 -0
  210. package/dist/node_modules/zod/v4/core/util.cjs.map +1 -0
  211. package/dist/node_modules/zod/v4/core/util.js +444 -0
  212. package/dist/node_modules/zod/v4/core/util.js.map +1 -0
  213. package/dist/node_modules/zod/v4/core/versions.cjs +9 -0
  214. package/dist/node_modules/zod/v4/core/versions.cjs.map +1 -0
  215. package/dist/node_modules/zod/v4/core/versions.js +9 -0
  216. package/dist/node_modules/zod/v4/core/versions.js.map +1 -0
  217. package/dist/packages/agent-runtime/src/client-tool-bridge.cjs +7 -1
  218. package/dist/packages/agent-runtime/src/client-tool-bridge.cjs.map +1 -1
  219. package/dist/packages/agent-runtime/src/client-tool-bridge.js +7 -1
  220. package/dist/packages/agent-runtime/src/client-tool-bridge.js.map +1 -1
  221. package/dist/packages/agent-runtime/src/conversation-list.cjs +4 -0
  222. package/dist/packages/agent-runtime/src/conversation-list.cjs.map +1 -1
  223. package/dist/packages/agent-runtime/src/conversation-list.js +4 -0
  224. package/dist/packages/agent-runtime/src/conversation-list.js.map +1 -1
  225. package/dist/packages/agent-runtime/src/edit-command.cjs.map +1 -1
  226. package/dist/packages/agent-runtime/src/edit-command.js.map +1 -1
  227. package/dist/packages/agent-runtime/src/generated/runconfig-contract.cjs +2 -0
  228. package/dist/packages/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
  229. package/dist/packages/agent-runtime/src/generated/runconfig-contract.js +2 -0
  230. package/dist/packages/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
  231. package/dist/packages/agent-runtime/src/interrupts.cjs +31 -7
  232. package/dist/packages/agent-runtime/src/interrupts.cjs.map +1 -1
  233. package/dist/packages/agent-runtime/src/interrupts.js +31 -7
  234. package/dist/packages/agent-runtime/src/interrupts.js.map +1 -1
  235. package/dist/packages/agent-runtime/src/messages.cjs +35 -5
  236. package/dist/packages/agent-runtime/src/messages.cjs.map +1 -1
  237. package/dist/packages/agent-runtime/src/messages.js +35 -5
  238. package/dist/packages/agent-runtime/src/messages.js.map +1 -1
  239. package/dist/packages/agent-runtime/src/protocol.cjs +4 -6
  240. package/dist/packages/agent-runtime/src/protocol.cjs.map +1 -1
  241. package/dist/packages/agent-runtime/src/protocol.js +4 -6
  242. package/dist/packages/agent-runtime/src/protocol.js.map +1 -1
  243. package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.cjs +296 -14
  244. package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
  245. package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.js +293 -11
  246. package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.js.map +1 -1
  247. package/dist/packages/agent-runtime/src/screen-point.cjs +68 -0
  248. package/dist/packages/agent-runtime/src/screen-point.cjs.map +1 -0
  249. package/dist/packages/agent-runtime/src/screen-point.js +68 -0
  250. package/dist/packages/agent-runtime/src/screen-point.js.map +1 -0
  251. package/dist/packages/agent-runtime/src/statewire-transport.cjs +6 -1
  252. package/dist/packages/agent-runtime/src/statewire-transport.cjs.map +1 -1
  253. package/dist/packages/agent-runtime/src/statewire-transport.js +6 -1
  254. package/dist/packages/agent-runtime/src/statewire-transport.js.map +1 -1
  255. package/dist/packages/agent-runtime/src/thread-handoff.cjs +85 -0
  256. package/dist/packages/agent-runtime/src/thread-handoff.cjs.map +1 -0
  257. package/dist/packages/agent-runtime/src/thread-handoff.js +85 -0
  258. package/dist/packages/agent-runtime/src/thread-handoff.js.map +1 -0
  259. package/dist/packages/agent-runtime/src/thread-snapshot-cache.cjs +1 -1
  260. package/dist/packages/agent-runtime/src/thread-snapshot-cache.cjs.map +1 -1
  261. package/dist/packages/agent-runtime/src/thread-snapshot-cache.js +1 -1
  262. package/dist/packages/agent-runtime/src/thread-snapshot-cache.js.map +1 -1
  263. package/dist/packages/agent-runtime/src/tool-metadata.cjs +0 -8
  264. package/dist/packages/agent-runtime/src/tool-metadata.cjs.map +1 -1
  265. package/dist/packages/agent-runtime/src/tool-metadata.js +0 -8
  266. package/dist/packages/agent-runtime/src/tool-metadata.js.map +1 -1
  267. package/dist/packages/agent-runtime/src/use-deep-agent-config.cjs +14 -0
  268. package/dist/packages/agent-runtime/src/use-deep-agent-config.cjs.map +1 -0
  269. package/dist/packages/agent-runtime/src/use-deep-agent-config.js +14 -0
  270. package/dist/packages/agent-runtime/src/use-deep-agent-config.js.map +1 -0
  271. package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.cjs +21 -5
  272. package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -1
  273. package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.js +21 -5
  274. package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.js.map +1 -1
  275. package/dist/packages/agent-runtime/src/use-deep-agent-runtime.cjs +13 -3
  276. package/dist/packages/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
  277. package/dist/packages/agent-runtime/src/use-deep-agent-runtime.js +14 -4
  278. package/dist/packages/agent-runtime/src/use-deep-agent-runtime.js.map +1 -1
  279. package/dist/packages/agent-runtime/src/use-deep-agent-thread.cjs +35 -15
  280. package/dist/packages/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
  281. package/dist/packages/agent-runtime/src/use-deep-agent-thread.js +35 -15
  282. package/dist/packages/agent-runtime/src/use-deep-agent-thread.js.map +1 -1
  283. package/dist/packages/agent-runtime/src/voice-presentation.cjs.map +1 -1
  284. package/dist/packages/agent-runtime/src/voice-presentation.js.map +1 -1
  285. package/dist/packages/react/package.json.cjs +1 -1
  286. package/dist/packages/react/package.json.js +1 -1
  287. package/dist/provider/AthenaProvider.cjs +2 -1
  288. package/dist/provider/AthenaProvider.cjs.map +1 -1
  289. package/dist/provider/AthenaProvider.js +2 -1
  290. package/dist/provider/AthenaProvider.js.map +1 -1
  291. package/dist/runtime/statewire-lifecycle.cjs +2 -1
  292. package/dist/runtime/statewire-lifecycle.cjs.map +1 -1
  293. package/dist/runtime/statewire-lifecycle.js +2 -1
  294. package/dist/runtime/statewire-lifecycle.js.map +1 -1
  295. package/dist/runtime/useAthenaStatewireRuntime.cjs +2 -1
  296. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
  297. package/dist/runtime/useAthenaStatewireRuntime.js +2 -1
  298. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
  299. package/dist/styles.css +1 -1
  300. package/dist/threads/conversation-list-fetcher.cjs +4 -0
  301. package/dist/threads/conversation-list-fetcher.cjs.map +1 -1
  302. package/dist/threads/conversation-list-fetcher.js +4 -0
  303. package/dist/threads/conversation-list-fetcher.js.map +1 -1
  304. package/dist/threads/statewire-thread-list.cjs +2 -1
  305. package/dist/threads/statewire-thread-list.cjs.map +1 -1
  306. package/dist/threads/statewire-thread-list.js +2 -1
  307. package/dist/threads/statewire-thread-list.js.map +1 -1
  308. package/dist/threads/use-rest-conversation-history.cjs +2 -1
  309. package/dist/threads/use-rest-conversation-history.cjs.map +1 -1
  310. package/dist/threads/use-rest-conversation-history.js +2 -1
  311. package/dist/threads/use-rest-conversation-history.js.map +1 -1
  312. package/dist/threads/use-statewire-conversation-history.cjs +2 -1
  313. package/dist/threads/use-statewire-conversation-history.cjs.map +1 -1
  314. package/dist/threads/use-statewire-conversation-history.d.ts +1 -0
  315. package/dist/threads/use-statewire-conversation-history.js +2 -1
  316. package/dist/threads/use-statewire-conversation-history.js.map +1 -1
  317. package/dist/tools/index.cjs +2 -1
  318. package/dist/tools/index.cjs.map +1 -1
  319. package/dist/tools/index.js +2 -1
  320. package/dist/tools/index.js.map +1 -1
  321. package/dist/tools/misc-tool-uis.cjs +2 -1
  322. package/dist/tools/misc-tool-uis.cjs.map +1 -1
  323. package/dist/tools/misc-tool-uis.js +2 -1
  324. package/dist/tools/misc-tool-uis.js.map +1 -1
  325. package/dist/tools/primitives.cjs +2 -1
  326. package/dist/tools/primitives.cjs.map +1 -1
  327. package/dist/tools/primitives.js +2 -1
  328. package/dist/tools/primitives.js.map +1 -1
  329. package/dist/tools/tool-fallback.cjs +2 -1
  330. package/dist/tools/tool-fallback.cjs.map +1 -1
  331. package/dist/tools/tool-fallback.js +2 -1
  332. package/dist/tools/tool-fallback.js.map +1 -1
  333. package/dist/tools/voice-update-tool-ui.cjs +2 -1
  334. package/dist/tools/voice-update-tool-ui.cjs.map +1 -1
  335. package/dist/tools/voice-update-tool-ui.js +2 -1
  336. package/dist/tools/voice-update-tool-ui.js.map +1 -1
  337. package/dist/voice/index.cjs +6 -0
  338. package/dist/voice/index.cjs.map +1 -0
  339. package/dist/voice/index.d.ts +2 -0
  340. package/dist/voice/index.js +6 -0
  341. package/dist/voice/index.js.map +1 -0
  342. package/dist/voice/use-athena-voice-session.cjs +315 -0
  343. package/dist/voice/use-athena-voice-session.cjs.map +1 -0
  344. package/dist/voice/use-athena-voice-session.d.ts +145 -0
  345. package/dist/voice/use-athena-voice-session.js +315 -0
  346. package/dist/voice/use-athena-voice-session.js.map +1 -0
  347. package/package.json +17 -3
@@ -7,22 +7,22 @@ const cnfast = require("cnfast");
7
7
  function MenuItemRow({
8
8
  item,
9
9
  isSelected,
10
- onMouseEnter,
10
+ onMouseMove,
11
11
  onClick,
12
12
  showArrow
13
13
  }) {
14
14
  var _a, _b, _c, _d;
15
15
  const hasTwoLines = item.type === "tool" && item.description || item.type === "user" && item.email || item.type === "workspace_item" && item.description || item.type === "tab" && item.description;
16
+ const nameContent = item.type === "tab" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 truncate", title: item.name, children: item.name }) : item.name;
16
17
  return /* @__PURE__ */ jsxRuntime.jsxs(
17
18
  "div",
18
19
  {
19
20
  role: "button",
20
21
  tabIndex: -1,
21
22
  onClick,
22
- onMouseEnter,
23
+ onMouseMove,
23
24
  className: cnfast.cn(
24
25
  "mention-item flex items-center justify-between gap-2 px-2 py-1.5 rounded cursor-pointer transition-colors",
25
- "hover:bg-gray-100",
26
26
  item.menuSection === types.MentionMenuSection.CURRENT_WEBPAGE && !isSelected && "bg-sky-50/70",
27
27
  isSelected && "bg-gray-100 is-selected"
28
28
  ),
@@ -30,7 +30,10 @@ function MenuItemRow({
30
30
  /* @__PURE__ */ jsxRuntime.jsx(
31
31
  "span",
32
32
  {
33
- className: `flex items-center flex-shrink-0 ${hasTwoLines ? "self-start mt-0.5" : ""}`,
33
+ className: cnfast.cn(
34
+ "flex items-center flex-shrink-0",
35
+ hasTwoLines && "self-start mt-0.5"
36
+ ),
34
37
  children: /* @__PURE__ */ jsxRuntime.jsx(
35
38
  mentionIcon.MentionIcon,
36
39
  {
@@ -43,13 +46,13 @@ function MenuItemRow({
43
46
  ),
44
47
  hasTwoLines ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 flex flex-col gap-0 min-w-0 -mt-0.5", children: [
45
48
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm leading-tight flex items-center gap-1.5", children: [
46
- item.name,
49
+ nameContent,
47
50
  ((_a = item.extra) == null ? void 0 : _a.isAdminOnly) && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-purple-400 flex-shrink-0" }),
48
51
  ((_b = item.extra) == null ? void 0 : _b.isExperimental) && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "rounded-full bg-blue-50 px-1.5 py-0.5 text-[9px] font-medium text-blue-700", children: "Experimental" })
49
52
  ] }),
50
53
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-gray-500 leading-tight mt-0.5 truncate", children: item.type === "user" ? item.email : item.description })
51
54
  ] }) : /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex-1 text-sm truncate min-w-0 flex items-center gap-1.5", children: [
52
- item.name,
55
+ nameContent,
53
56
  ((_c = item.extra) == null ? void 0 : _c.isAdminOnly) && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-purple-400 flex-shrink-0" }),
54
57
  ((_d = item.extra) == null ? void 0 : _d.isExperimental) && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "rounded-full bg-blue-50 px-1.5 py-0.5 text-[9px] font-medium text-blue-700", children: "Experimental" })
55
58
  ] }),
@@ -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 onMouseEnter,\n onClick,\n showArrow,\n}: {\n item: MenuItem;\n isSelected: boolean;\n onMouseEnter: () => 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\n return (\n <div\n role=\"button\"\n tabIndex={-1}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n className={cn(\n \"mention-item flex items-center justify-between gap-2 px-2 py-1.5 rounded cursor-pointer transition-colors\",\n \"hover:bg-gray-100\",\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={`flex items-center flex-shrink-0 ${hasTwoLines ? \"self-start mt-0.5\" : \"\"}`}\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 {item.name}\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 {item.name}\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;AAE/B,SACEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,WAAWC,OAAAA;AAAAA,QACT;AAAA,QACA;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,WAAW,mCAAmC,cAAc,sBAAsB,EAAE;AAAA,YAEpF,UAAAA,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,KAAK;AAAA,cACL,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,KAAK;AAAA,YACL,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 === \"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;;"}
@@ -3,10 +3,10 @@
3
3
  * Supports: tools (with description), users (with email), assets, categories.
4
4
  */
5
5
  import type { MenuItem } from "../data/types";
6
- export declare function MenuItemRow({ item, isSelected, onMouseEnter, onClick, showArrow, }: {
6
+ export declare function MenuItemRow({ item, isSelected, onMouseMove, onClick, showArrow, }: {
7
7
  item: MenuItem;
8
8
  isSelected: boolean;
9
- onMouseEnter: () => void;
9
+ onMouseMove: () => void;
10
10
  onClick: () => void;
11
11
  showArrow?: boolean;
12
12
  }): import("react/jsx-runtime").JSX.Element;
@@ -1,26 +1,26 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { MentionMenuSection } from "../data/types.js";
3
3
  import { MentionIcon } from "./mention-icon.js";
4
4
  import { cn } from "cnfast";
5
5
  function MenuItemRow({
6
6
  item,
7
7
  isSelected,
8
- onMouseEnter,
8
+ onMouseMove,
9
9
  onClick,
10
10
  showArrow
11
11
  }) {
12
12
  var _a, _b, _c, _d;
13
13
  const hasTwoLines = item.type === "tool" && item.description || item.type === "user" && item.email || item.type === "workspace_item" && item.description || item.type === "tab" && item.description;
14
+ const nameContent = item.type === "tab" ? /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate", title: item.name, children: item.name }) : item.name;
14
15
  return /* @__PURE__ */ jsxs(
15
16
  "div",
16
17
  {
17
18
  role: "button",
18
19
  tabIndex: -1,
19
20
  onClick,
20
- onMouseEnter,
21
+ onMouseMove,
21
22
  className: cn(
22
23
  "mention-item flex items-center justify-between gap-2 px-2 py-1.5 rounded cursor-pointer transition-colors",
23
- "hover:bg-gray-100",
24
24
  item.menuSection === MentionMenuSection.CURRENT_WEBPAGE && !isSelected && "bg-sky-50/70",
25
25
  isSelected && "bg-gray-100 is-selected"
26
26
  ),
@@ -28,7 +28,10 @@ function MenuItemRow({
28
28
  /* @__PURE__ */ jsx(
29
29
  "span",
30
30
  {
31
- className: `flex items-center flex-shrink-0 ${hasTwoLines ? "self-start mt-0.5" : ""}`,
31
+ className: cn(
32
+ "flex items-center flex-shrink-0",
33
+ hasTwoLines && "self-start mt-0.5"
34
+ ),
32
35
  children: /* @__PURE__ */ jsx(
33
36
  MentionIcon,
34
37
  {
@@ -41,13 +44,13 @@ function MenuItemRow({
41
44
  ),
42
45
  hasTwoLines ? /* @__PURE__ */ jsxs("div", { className: "flex-1 flex flex-col gap-0 min-w-0 -mt-0.5", children: [
43
46
  /* @__PURE__ */ jsxs("span", { className: "text-sm leading-tight flex items-center gap-1.5", children: [
44
- item.name,
47
+ nameContent,
45
48
  ((_a = item.extra) == null ? void 0 : _a.isAdminOnly) && /* @__PURE__ */ jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-purple-400 flex-shrink-0" }),
46
49
  ((_b = item.extra) == null ? void 0 : _b.isExperimental) && /* @__PURE__ */ jsx("span", { className: "rounded-full bg-blue-50 px-1.5 py-0.5 text-[9px] font-medium text-blue-700", children: "Experimental" })
47
50
  ] }),
48
51
  /* @__PURE__ */ jsx("span", { className: "text-xs text-gray-500 leading-tight mt-0.5 truncate", children: item.type === "user" ? item.email : item.description })
49
52
  ] }) : /* @__PURE__ */ jsxs("span", { className: "flex-1 text-sm truncate min-w-0 flex items-center gap-1.5", children: [
50
- item.name,
53
+ nameContent,
51
54
  ((_c = item.extra) == null ? void 0 : _c.isAdminOnly) && /* @__PURE__ */ jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-purple-400 flex-shrink-0" }),
52
55
  ((_d = item.extra) == null ? void 0 : _d.isExperimental) && /* @__PURE__ */ jsx("span", { className: "rounded-full bg-blue-50 px-1.5 py-0.5 text-[9px] font-medium text-blue-700", children: "Experimental" })
53
56
  ] }),
@@ -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 onMouseEnter,\n onClick,\n showArrow,\n}: {\n item: MenuItem;\n isSelected: boolean;\n onMouseEnter: () => 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\n return (\n <div\n role=\"button\"\n tabIndex={-1}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n className={cn(\n \"mention-item flex items-center justify-between gap-2 px-2 py-1.5 rounded cursor-pointer transition-colors\",\n \"hover:bg-gray-100\",\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={`flex items-center flex-shrink-0 ${hasTwoLines ? \"self-start mt-0.5\" : \"\"}`}\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 {item.name}\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 {item.name}\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;AAE/B,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;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,mCAAmC,cAAc,sBAAsB,EAAE;AAAA,YAEpF,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,KAAK;AAAA,cACL,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,KAAK;AAAA,YACL,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 === \"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;"}
@@ -11,7 +11,7 @@ function MenuList({
11
11
  isLoading,
12
12
  hasMore,
13
13
  onSelect,
14
- onMouseEnter,
14
+ onMouseMove,
15
15
  onLoadMore
16
16
  }) {
17
17
  const selectedRef = react.useRef(null);
@@ -40,7 +40,7 @@ function MenuList({
40
40
  {
41
41
  item,
42
42
  isSelected: index === selectedIndex,
43
- onMouseEnter: () => onMouseEnter(index),
43
+ onMouseMove: () => onMouseMove(index),
44
44
  onClick: () => onSelect(item),
45
45
  showArrow: !!item.navigatesToScope
46
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"menu-list.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/menu-list.tsx"],"sourcesContent":["/**\n * Scrollable list of menu items with loading and empty states.\n */\n\nimport { Fragment, useEffect, useRef } from \"react\";\nimport { MentionMenuSection, type MenuItem } from \"../data/types\";\nimport { MenuItemRow } from \"./menu-item\";\nimport { MenuSkeleton } from \"./menu-skeleton\";\n\nexport function MenuList({\n items,\n selectedIndex,\n isLoading,\n hasMore,\n onSelect,\n onMouseEnter,\n onLoadMore,\n}: {\n items: MenuItem[];\n selectedIndex: number;\n isLoading?: boolean;\n hasMore?: boolean;\n onSelect: (item: MenuItem) => void;\n onMouseEnter: (index: number) => void;\n onLoadMore?: () => void;\n}) {\n const selectedRef = useRef<HTMLDivElement>(null);\n\n // Auto-scroll selected item into view\n useEffect(() => {\n selectedRef.current?.scrollIntoView({ block: \"nearest\" });\n }, [selectedIndex]);\n\n if (isLoading && items.length === 0) return <MenuSkeleton />;\n\n if (items.length === 0) {\n return (\n <div className=\"px-1 py-1\">\n <div className=\"px-2 py-9 text-center text-sm text-gray-500\">\n <div className=\"mb-1\">No results found</div>\n <div className=\"text-xs text-gray-400\">Try a different search or go back</div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"px-1 py-1\">\n {items.map((item, index) => {\n const previousSection = items[index - 1]?.menuSection;\n const startsOtherWebpages =\n item.menuSection === MentionMenuSection.OTHER_WEBPAGES &&\n previousSection !== MentionMenuSection.OTHER_WEBPAGES;\n const startsLibrary =\n item.menuSection === MentionMenuSection.LIBRARY &&\n (previousSection === MentionMenuSection.CURRENT_WEBPAGE ||\n previousSection === MentionMenuSection.OTHER_WEBPAGES);\n\n return (\n <Fragment key={item.id}>\n {startsOtherWebpages && (\n <div className=\"px-2 pb-1 pt-2 text-[11px] font-medium uppercase tracking-wide text-gray-400\">\n Other webpages in this group\n </div>\n )}\n {startsLibrary && <div className=\"mx-2 my-1 border-t border-gray-100\" />}\n <div ref={index === selectedIndex ? selectedRef : undefined}>\n <MenuItemRow\n item={item}\n isSelected={index === selectedIndex}\n onMouseEnter={() => onMouseEnter(index)}\n onClick={() => onSelect(item)}\n showArrow={!!item.navigatesToScope}\n />\n </div>\n </Fragment>\n );\n })}\n\n {/* Loading more indicator */}\n {isLoading && items.length > 0 && (\n <div className=\"px-2 py-2 text-center\">\n <span className=\"text-xs text-gray-400\">Loading more...</span>\n </div>\n )}\n\n {/* Load more sentinel */}\n {hasMore && !isLoading && onLoadMore && (\n <button\n type=\"button\"\n onClick={onLoadMore}\n className=\"w-full px-2 py-1.5 text-xs text-gray-500 hover:text-gray-700 hover:bg-gray-50 rounded transition-colors text-center\"\n >\n ··· Load more\n </button>\n )}\n </div>\n );\n}\n"],"names":["useRef","useEffect","MenuSkeleton","jsxs","jsx","MentionMenuSection","Fragment","MenuItemRow"],"mappings":";;;;;;;AASO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQG;AACD,QAAM,cAAcA,MAAAA,OAAuB,IAAI;AAG/CC,QAAAA,UAAU,MAAM;;AACd,sBAAY,YAAZ,mBAAqB,eAAe,EAAE,OAAO;EAC/C,GAAG,CAAC,aAAa,CAAC;AAElB,MAAI,aAAa,MAAM,WAAW,EAAG,uCAAQC,aAAAA,cAAA,EAAa;AAE1D,MAAI,MAAM,WAAW,GAAG;AACtB,0CACG,OAAA,EAAI,WAAU,aACb,UAAAC,2BAAAA,KAAC,OAAA,EAAI,WAAU,+CACb,UAAA;AAAA,MAAAC,2BAAAA,IAAC,OAAA,EAAI,WAAU,QAAO,UAAA,oBAAgB;AAAA,MACtCA,2BAAAA,IAAC,OAAA,EAAI,WAAU,yBAAwB,UAAA,oCAAA,CAAiC;AAAA,IAAA,EAAA,CAC1E,EAAA,CACF;AAAA,EAEJ;AAEA,SACED,2BAAAA,KAAC,OAAA,EAAI,WAAU,aACZ,UAAA;AAAA,IAAA,MAAM,IAAI,CAAC,MAAM,UAAU;;AAC1B,YAAM,mBAAkB,WAAM,QAAQ,CAAC,MAAf,mBAAkB;AAC1C,YAAM,sBACJ,KAAK,gBAAgBE,MAAAA,mBAAmB,kBACxC,oBAAoBA,MAAAA,mBAAmB;AACzC,YAAM,gBACJ,KAAK,gBAAgBA,MAAAA,mBAAmB,YACvC,oBAAoBA,MAAAA,mBAAmB,mBACtC,oBAAoBA,MAAAA,mBAAmB;AAE3C,6CACGC,gBAAA,EACE,UAAA;AAAA,QAAA,uBACCF,2BAAAA,IAAC,OAAA,EAAI,WAAU,gFAA+E,UAAA,gCAE9F;AAAA,QAED,iBAAiBA,2BAAAA,IAAC,OAAA,EAAI,WAAU,qCAAA,CAAqC;AAAA,uCACrE,OAAA,EAAI,KAAK,UAAU,gBAAgB,cAAc,QAChD,UAAAA,2BAAAA;AAAAA,UAACG,SAAAA;AAAAA,UAAA;AAAA,YACC;AAAA,YACA,YAAY,UAAU;AAAA,YACtB,cAAc,MAAM,aAAa,KAAK;AAAA,YACtC,SAAS,MAAM,SAAS,IAAI;AAAA,YAC5B,WAAW,CAAC,CAAC,KAAK;AAAA,UAAA;AAAA,QAAA,EACpB,CACF;AAAA,MAAA,EAAA,GAfa,KAAK,EAgBpB;AAAA,IAEJ,CAAC;AAAA,IAGA,aAAa,MAAM,SAAS,KAC3BH,2BAAAA,IAAC,OAAA,EAAI,WAAU,yBACb,UAAAA,2BAAAA,IAAC,QAAA,EAAK,WAAU,yBAAwB,6BAAe,GACzD;AAAA,IAID,WAAW,CAAC,aAAa,cACxBA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,WAAU;AAAA,QACX,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,GAEJ;AAEJ;;"}
1
+ {"version":3,"file":"menu-list.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/menu-list.tsx"],"sourcesContent":["/**\n * Scrollable list of menu items with loading and empty states.\n */\n\nimport { Fragment, useEffect, useRef } from \"react\";\nimport { MentionMenuSection, type MenuItem } from \"../data/types\";\nimport { MenuItemRow } from \"./menu-item\";\nimport { MenuSkeleton } from \"./menu-skeleton\";\n\nexport function MenuList({\n items,\n selectedIndex,\n isLoading,\n hasMore,\n onSelect,\n onMouseMove,\n onLoadMore,\n}: {\n items: MenuItem[];\n selectedIndex: number;\n isLoading?: boolean;\n hasMore?: boolean;\n onSelect: (item: MenuItem) => void;\n onMouseMove: (index: number) => void;\n onLoadMore?: () => void;\n}) {\n const selectedRef = useRef<HTMLDivElement>(null);\n\n // Auto-scroll selected item into view\n useEffect(() => {\n selectedRef.current?.scrollIntoView({ block: \"nearest\" });\n }, [selectedIndex]);\n\n if (isLoading && items.length === 0) return <MenuSkeleton />;\n\n if (items.length === 0) {\n return (\n <div className=\"px-1 py-1\">\n <div className=\"px-2 py-9 text-center text-sm text-gray-500\">\n <div className=\"mb-1\">No results found</div>\n <div className=\"text-xs text-gray-400\">Try a different search or go back</div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"px-1 py-1\">\n {items.map((item, index) => {\n const previousSection = items[index - 1]?.menuSection;\n const startsOtherWebpages =\n item.menuSection === MentionMenuSection.OTHER_WEBPAGES &&\n previousSection !== MentionMenuSection.OTHER_WEBPAGES;\n const startsLibrary =\n item.menuSection === MentionMenuSection.LIBRARY &&\n (previousSection === MentionMenuSection.CURRENT_WEBPAGE ||\n previousSection === MentionMenuSection.OTHER_WEBPAGES);\n\n return (\n <Fragment key={item.id}>\n {startsOtherWebpages && (\n <div className=\"px-2 pb-1 pt-2 text-[11px] font-medium uppercase tracking-wide text-gray-400\">\n Other webpages in this group\n </div>\n )}\n {startsLibrary && <div className=\"mx-2 my-1 border-t border-gray-100\" />}\n <div ref={index === selectedIndex ? selectedRef : undefined}>\n <MenuItemRow\n item={item}\n isSelected={index === selectedIndex}\n onMouseMove={() => onMouseMove(index)}\n onClick={() => onSelect(item)}\n showArrow={!!item.navigatesToScope}\n />\n </div>\n </Fragment>\n );\n })}\n\n {/* Loading more indicator */}\n {isLoading && items.length > 0 && (\n <div className=\"px-2 py-2 text-center\">\n <span className=\"text-xs text-gray-400\">Loading more...</span>\n </div>\n )}\n\n {/* Load more sentinel */}\n {hasMore && !isLoading && onLoadMore && (\n <button\n type=\"button\"\n onClick={onLoadMore}\n className=\"w-full px-2 py-1.5 text-xs text-gray-500 hover:text-gray-700 hover:bg-gray-50 rounded transition-colors text-center\"\n >\n ··· Load more\n </button>\n )}\n </div>\n );\n}\n"],"names":["useRef","useEffect","MenuSkeleton","jsxs","jsx","MentionMenuSection","Fragment","MenuItemRow"],"mappings":";;;;;;;AASO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQG;AACD,QAAM,cAAcA,MAAAA,OAAuB,IAAI;AAG/CC,QAAAA,UAAU,MAAM;;AACd,sBAAY,YAAZ,mBAAqB,eAAe,EAAE,OAAO;EAC/C,GAAG,CAAC,aAAa,CAAC;AAElB,MAAI,aAAa,MAAM,WAAW,EAAG,uCAAQC,aAAAA,cAAA,EAAa;AAE1D,MAAI,MAAM,WAAW,GAAG;AACtB,0CACG,OAAA,EAAI,WAAU,aACb,UAAAC,2BAAAA,KAAC,OAAA,EAAI,WAAU,+CACb,UAAA;AAAA,MAAAC,2BAAAA,IAAC,OAAA,EAAI,WAAU,QAAO,UAAA,oBAAgB;AAAA,MACtCA,2BAAAA,IAAC,OAAA,EAAI,WAAU,yBAAwB,UAAA,oCAAA,CAAiC;AAAA,IAAA,EAAA,CAC1E,EAAA,CACF;AAAA,EAEJ;AAEA,SACED,2BAAAA,KAAC,OAAA,EAAI,WAAU,aACZ,UAAA;AAAA,IAAA,MAAM,IAAI,CAAC,MAAM,UAAU;;AAC1B,YAAM,mBAAkB,WAAM,QAAQ,CAAC,MAAf,mBAAkB;AAC1C,YAAM,sBACJ,KAAK,gBAAgBE,MAAAA,mBAAmB,kBACxC,oBAAoBA,MAAAA,mBAAmB;AACzC,YAAM,gBACJ,KAAK,gBAAgBA,MAAAA,mBAAmB,YACvC,oBAAoBA,MAAAA,mBAAmB,mBACtC,oBAAoBA,MAAAA,mBAAmB;AAE3C,6CACGC,gBAAA,EACE,UAAA;AAAA,QAAA,uBACCF,2BAAAA,IAAC,OAAA,EAAI,WAAU,gFAA+E,UAAA,gCAE9F;AAAA,QAED,iBAAiBA,2BAAAA,IAAC,OAAA,EAAI,WAAU,qCAAA,CAAqC;AAAA,uCACrE,OAAA,EAAI,KAAK,UAAU,gBAAgB,cAAc,QAChD,UAAAA,2BAAAA;AAAAA,UAACG,SAAAA;AAAAA,UAAA;AAAA,YACC;AAAA,YACA,YAAY,UAAU;AAAA,YACtB,aAAa,MAAM,YAAY,KAAK;AAAA,YACpC,SAAS,MAAM,SAAS,IAAI;AAAA,YAC5B,WAAW,CAAC,CAAC,KAAK;AAAA,UAAA;AAAA,QAAA,EACpB,CACF;AAAA,MAAA,EAAA,GAfa,KAAK,EAgBpB;AAAA,IAEJ,CAAC;AAAA,IAGA,aAAa,MAAM,SAAS,KAC3BH,2BAAAA,IAAC,OAAA,EAAI,WAAU,yBACb,UAAAA,2BAAAA,IAAC,QAAA,EAAK,WAAU,yBAAwB,6BAAe,GACzD;AAAA,IAID,WAAW,CAAC,aAAa,cACxBA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,WAAU;AAAA,QACX,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,GAEJ;AAEJ;;"}
@@ -2,12 +2,12 @@
2
2
  * Scrollable list of menu items with loading and empty states.
3
3
  */
4
4
  import { type MenuItem } from "../data/types";
5
- export declare function MenuList({ items, selectedIndex, isLoading, hasMore, onSelect, onMouseEnter, onLoadMore, }: {
5
+ export declare function MenuList({ items, selectedIndex, isLoading, hasMore, onSelect, onMouseMove, onLoadMore, }: {
6
6
  items: MenuItem[];
7
7
  selectedIndex: number;
8
8
  isLoading?: boolean;
9
9
  hasMore?: boolean;
10
10
  onSelect: (item: MenuItem) => void;
11
- onMouseEnter: (index: number) => void;
11
+ onMouseMove: (index: number) => void;
12
12
  onLoadMore?: () => void;
13
13
  }): import("react/jsx-runtime").JSX.Element;
@@ -9,7 +9,7 @@ function MenuList({
9
9
  isLoading,
10
10
  hasMore,
11
11
  onSelect,
12
- onMouseEnter,
12
+ onMouseMove,
13
13
  onLoadMore
14
14
  }) {
15
15
  const selectedRef = useRef(null);
@@ -38,7 +38,7 @@ function MenuList({
38
38
  {
39
39
  item,
40
40
  isSelected: index === selectedIndex,
41
- onMouseEnter: () => onMouseEnter(index),
41
+ onMouseMove: () => onMouseMove(index),
42
42
  onClick: () => onSelect(item),
43
43
  showArrow: !!item.navigatesToScope
44
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"menu-list.js","sources":["../../../../../src/chat-ui/mentions/suggestions/components/menu-list.tsx"],"sourcesContent":["/**\n * Scrollable list of menu items with loading and empty states.\n */\n\nimport { Fragment, useEffect, useRef } from \"react\";\nimport { MentionMenuSection, type MenuItem } from \"../data/types\";\nimport { MenuItemRow } from \"./menu-item\";\nimport { MenuSkeleton } from \"./menu-skeleton\";\n\nexport function MenuList({\n items,\n selectedIndex,\n isLoading,\n hasMore,\n onSelect,\n onMouseEnter,\n onLoadMore,\n}: {\n items: MenuItem[];\n selectedIndex: number;\n isLoading?: boolean;\n hasMore?: boolean;\n onSelect: (item: MenuItem) => void;\n onMouseEnter: (index: number) => void;\n onLoadMore?: () => void;\n}) {\n const selectedRef = useRef<HTMLDivElement>(null);\n\n // Auto-scroll selected item into view\n useEffect(() => {\n selectedRef.current?.scrollIntoView({ block: \"nearest\" });\n }, [selectedIndex]);\n\n if (isLoading && items.length === 0) return <MenuSkeleton />;\n\n if (items.length === 0) {\n return (\n <div className=\"px-1 py-1\">\n <div className=\"px-2 py-9 text-center text-sm text-gray-500\">\n <div className=\"mb-1\">No results found</div>\n <div className=\"text-xs text-gray-400\">Try a different search or go back</div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"px-1 py-1\">\n {items.map((item, index) => {\n const previousSection = items[index - 1]?.menuSection;\n const startsOtherWebpages =\n item.menuSection === MentionMenuSection.OTHER_WEBPAGES &&\n previousSection !== MentionMenuSection.OTHER_WEBPAGES;\n const startsLibrary =\n item.menuSection === MentionMenuSection.LIBRARY &&\n (previousSection === MentionMenuSection.CURRENT_WEBPAGE ||\n previousSection === MentionMenuSection.OTHER_WEBPAGES);\n\n return (\n <Fragment key={item.id}>\n {startsOtherWebpages && (\n <div className=\"px-2 pb-1 pt-2 text-[11px] font-medium uppercase tracking-wide text-gray-400\">\n Other webpages in this group\n </div>\n )}\n {startsLibrary && <div className=\"mx-2 my-1 border-t border-gray-100\" />}\n <div ref={index === selectedIndex ? selectedRef : undefined}>\n <MenuItemRow\n item={item}\n isSelected={index === selectedIndex}\n onMouseEnter={() => onMouseEnter(index)}\n onClick={() => onSelect(item)}\n showArrow={!!item.navigatesToScope}\n />\n </div>\n </Fragment>\n );\n })}\n\n {/* Loading more indicator */}\n {isLoading && items.length > 0 && (\n <div className=\"px-2 py-2 text-center\">\n <span className=\"text-xs text-gray-400\">Loading more...</span>\n </div>\n )}\n\n {/* Load more sentinel */}\n {hasMore && !isLoading && onLoadMore && (\n <button\n type=\"button\"\n onClick={onLoadMore}\n className=\"w-full px-2 py-1.5 text-xs text-gray-500 hover:text-gray-700 hover:bg-gray-50 rounded transition-colors text-center\"\n >\n ··· Load more\n </button>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;AASO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQG;AACD,QAAM,cAAc,OAAuB,IAAI;AAG/C,YAAU,MAAM;;AACd,sBAAY,YAAZ,mBAAqB,eAAe,EAAE,OAAO;EAC/C,GAAG,CAAC,aAAa,CAAC;AAElB,MAAI,aAAa,MAAM,WAAW,EAAG,4BAAQ,cAAA,EAAa;AAE1D,MAAI,MAAM,WAAW,GAAG;AACtB,+BACG,OAAA,EAAI,WAAU,aACb,UAAA,qBAAC,OAAA,EAAI,WAAU,+CACb,UAAA;AAAA,MAAA,oBAAC,OAAA,EAAI,WAAU,QAAO,UAAA,oBAAgB;AAAA,MACtC,oBAAC,OAAA,EAAI,WAAU,yBAAwB,UAAA,oCAAA,CAAiC;AAAA,IAAA,EAAA,CAC1E,EAAA,CACF;AAAA,EAEJ;AAEA,SACE,qBAAC,OAAA,EAAI,WAAU,aACZ,UAAA;AAAA,IAAA,MAAM,IAAI,CAAC,MAAM,UAAU;;AAC1B,YAAM,mBAAkB,WAAM,QAAQ,CAAC,MAAf,mBAAkB;AAC1C,YAAM,sBACJ,KAAK,gBAAgB,mBAAmB,kBACxC,oBAAoB,mBAAmB;AACzC,YAAM,gBACJ,KAAK,gBAAgB,mBAAmB,YACvC,oBAAoB,mBAAmB,mBACtC,oBAAoB,mBAAmB;AAE3C,kCACG,UAAA,EACE,UAAA;AAAA,QAAA,uBACC,oBAAC,OAAA,EAAI,WAAU,gFAA+E,UAAA,gCAE9F;AAAA,QAED,iBAAiB,oBAAC,OAAA,EAAI,WAAU,qCAAA,CAAqC;AAAA,4BACrE,OAAA,EAAI,KAAK,UAAU,gBAAgB,cAAc,QAChD,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA,YAAY,UAAU;AAAA,YACtB,cAAc,MAAM,aAAa,KAAK;AAAA,YACtC,SAAS,MAAM,SAAS,IAAI;AAAA,YAC5B,WAAW,CAAC,CAAC,KAAK;AAAA,UAAA;AAAA,QAAA,EACpB,CACF;AAAA,MAAA,EAAA,GAfa,KAAK,EAgBpB;AAAA,IAEJ,CAAC;AAAA,IAGA,aAAa,MAAM,SAAS,KAC3B,oBAAC,OAAA,EAAI,WAAU,yBACb,UAAA,oBAAC,QAAA,EAAK,WAAU,yBAAwB,6BAAe,GACzD;AAAA,IAID,WAAW,CAAC,aAAa,cACxB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,WAAU;AAAA,QACX,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,GAEJ;AAEJ;"}
1
+ {"version":3,"file":"menu-list.js","sources":["../../../../../src/chat-ui/mentions/suggestions/components/menu-list.tsx"],"sourcesContent":["/**\n * Scrollable list of menu items with loading and empty states.\n */\n\nimport { Fragment, useEffect, useRef } from \"react\";\nimport { MentionMenuSection, type MenuItem } from \"../data/types\";\nimport { MenuItemRow } from \"./menu-item\";\nimport { MenuSkeleton } from \"./menu-skeleton\";\n\nexport function MenuList({\n items,\n selectedIndex,\n isLoading,\n hasMore,\n onSelect,\n onMouseMove,\n onLoadMore,\n}: {\n items: MenuItem[];\n selectedIndex: number;\n isLoading?: boolean;\n hasMore?: boolean;\n onSelect: (item: MenuItem) => void;\n onMouseMove: (index: number) => void;\n onLoadMore?: () => void;\n}) {\n const selectedRef = useRef<HTMLDivElement>(null);\n\n // Auto-scroll selected item into view\n useEffect(() => {\n selectedRef.current?.scrollIntoView({ block: \"nearest\" });\n }, [selectedIndex]);\n\n if (isLoading && items.length === 0) return <MenuSkeleton />;\n\n if (items.length === 0) {\n return (\n <div className=\"px-1 py-1\">\n <div className=\"px-2 py-9 text-center text-sm text-gray-500\">\n <div className=\"mb-1\">No results found</div>\n <div className=\"text-xs text-gray-400\">Try a different search or go back</div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"px-1 py-1\">\n {items.map((item, index) => {\n const previousSection = items[index - 1]?.menuSection;\n const startsOtherWebpages =\n item.menuSection === MentionMenuSection.OTHER_WEBPAGES &&\n previousSection !== MentionMenuSection.OTHER_WEBPAGES;\n const startsLibrary =\n item.menuSection === MentionMenuSection.LIBRARY &&\n (previousSection === MentionMenuSection.CURRENT_WEBPAGE ||\n previousSection === MentionMenuSection.OTHER_WEBPAGES);\n\n return (\n <Fragment key={item.id}>\n {startsOtherWebpages && (\n <div className=\"px-2 pb-1 pt-2 text-[11px] font-medium uppercase tracking-wide text-gray-400\">\n Other webpages in this group\n </div>\n )}\n {startsLibrary && <div className=\"mx-2 my-1 border-t border-gray-100\" />}\n <div ref={index === selectedIndex ? selectedRef : undefined}>\n <MenuItemRow\n item={item}\n isSelected={index === selectedIndex}\n onMouseMove={() => onMouseMove(index)}\n onClick={() => onSelect(item)}\n showArrow={!!item.navigatesToScope}\n />\n </div>\n </Fragment>\n );\n })}\n\n {/* Loading more indicator */}\n {isLoading && items.length > 0 && (\n <div className=\"px-2 py-2 text-center\">\n <span className=\"text-xs text-gray-400\">Loading more...</span>\n </div>\n )}\n\n {/* Load more sentinel */}\n {hasMore && !isLoading && onLoadMore && (\n <button\n type=\"button\"\n onClick={onLoadMore}\n className=\"w-full px-2 py-1.5 text-xs text-gray-500 hover:text-gray-700 hover:bg-gray-50 rounded transition-colors text-center\"\n >\n ··· Load more\n </button>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;AASO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQG;AACD,QAAM,cAAc,OAAuB,IAAI;AAG/C,YAAU,MAAM;;AACd,sBAAY,YAAZ,mBAAqB,eAAe,EAAE,OAAO;EAC/C,GAAG,CAAC,aAAa,CAAC;AAElB,MAAI,aAAa,MAAM,WAAW,EAAG,4BAAQ,cAAA,EAAa;AAE1D,MAAI,MAAM,WAAW,GAAG;AACtB,+BACG,OAAA,EAAI,WAAU,aACb,UAAA,qBAAC,OAAA,EAAI,WAAU,+CACb,UAAA;AAAA,MAAA,oBAAC,OAAA,EAAI,WAAU,QAAO,UAAA,oBAAgB;AAAA,MACtC,oBAAC,OAAA,EAAI,WAAU,yBAAwB,UAAA,oCAAA,CAAiC;AAAA,IAAA,EAAA,CAC1E,EAAA,CACF;AAAA,EAEJ;AAEA,SACE,qBAAC,OAAA,EAAI,WAAU,aACZ,UAAA;AAAA,IAAA,MAAM,IAAI,CAAC,MAAM,UAAU;;AAC1B,YAAM,mBAAkB,WAAM,QAAQ,CAAC,MAAf,mBAAkB;AAC1C,YAAM,sBACJ,KAAK,gBAAgB,mBAAmB,kBACxC,oBAAoB,mBAAmB;AACzC,YAAM,gBACJ,KAAK,gBAAgB,mBAAmB,YACvC,oBAAoB,mBAAmB,mBACtC,oBAAoB,mBAAmB;AAE3C,kCACG,UAAA,EACE,UAAA;AAAA,QAAA,uBACC,oBAAC,OAAA,EAAI,WAAU,gFAA+E,UAAA,gCAE9F;AAAA,QAED,iBAAiB,oBAAC,OAAA,EAAI,WAAU,qCAAA,CAAqC;AAAA,4BACrE,OAAA,EAAI,KAAK,UAAU,gBAAgB,cAAc,QAChD,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA,YAAY,UAAU;AAAA,YACtB,aAAa,MAAM,YAAY,KAAK;AAAA,YACpC,SAAS,MAAM,SAAS,IAAI;AAAA,YAC5B,WAAW,CAAC,CAAC,KAAK;AAAA,UAAA;AAAA,QAAA,EACpB,CACF;AAAA,MAAA,EAAA,GAfa,KAAK,EAgBpB;AAAA,IAEJ,CAAC;AAAA,IAGA,aAAa,MAAM,SAAS,KAC3B,oBAAC,OAAA,EAAI,WAAU,yBACb,UAAA,oBAAC,QAAA,EAAK,WAAU,yBAAwB,6BAAe,GACzD;AAAA,IAID,WAAW,CAAC,aAAa,cACxB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,WAAU;AAAA,QACX,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,GAEJ;AAEJ;"}
@@ -18,7 +18,8 @@ function useMentionAuth() {
18
18
  async function fetchGraphQL(auth, query, variables = {}) {
19
19
  var _a;
20
20
  const url = `${auth.backendUrl.replace(/\/+$/, "")}/graphql`;
21
- const { headers, credentials } = mentionRequestInit(auth);
21
+ const requestAuth = auth.getAccessToken ? { ...auth, accessToken: await auth.getAccessToken() } : auth;
22
+ const { headers, credentials } = mentionRequestInit(requestAuth);
22
23
  const response = await fetch(url, {
23
24
  method: "POST",
24
25
  headers: {
@@ -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 (Chrome extension) or a workspace API key (Microsoft 365\n * add-in); 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 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\nexport async function fetchGraphQL<T = any>(\n auth: MentionAuthContext,\n query: string,\n variables: Record<string, any> = {},\n): Promise<T> {\n const url = `${auth.backendUrl.replace(/\\/+$/, \"\")}/graphql`;\n const { headers, credentials } = mentionRequestInit(auth);\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n ...(credentials ? { credentials } : {}),\n body: JSON.stringify({ query, variables }),\n });\n\n if (!response.ok) {\n throw new Error(`GraphQL HTTP ${response.status}: ${response.statusText}`);\n }\n\n const result = await response.json();\n if (result.errors?.length) {\n throw new Error(`GraphQL error: ${result.errors[0].message}`);\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"],"mappings":";;;AA+BO,SAAS,mBACd,MAC8C;AAC9C,MAAI,KAAK,aAAa;AACpB,WAAO,EAAE,SAAS,EAAE,eAAe,UAAU,KAAK,WAAW,KAAG;AAAA,EAClE;AACA,MAAI,KAAK,OAAQ,QAAO,EAAE,SAAS,EAAE,aAAa,KAAK,SAAO;AAC9D,MAAI,KAAK,YAAa,QAAO,EAAE,SAAS,CAAA,GAAI,aAAa,KAAK,YAAA;AAC9D,QAAM,IAAI,MAAM,yDAAyD;AAC3E;AAEO,MAAM,iBAAiBA,MAAAA,cAAyC,IAAI;AAEpE,SAAS,iBAAqC;AACnD,QAAM,MAAMC,MAAAA,WAAW,cAAc;AACrC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,6BAA6B;AACvD,SAAO;AACT;AAIA,eAAsB,aACpB,MACA,OACA,YAAiC,CAAA,GACrB;;AACZ,QAAM,MAAM,GAAG,KAAK,WAAW,QAAQ,QAAQ,EAAE,CAAC;AAClD,QAAM,EAAE,SAAS,gBAAgB,mBAAmB,IAAI;AACxD,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,GAAG;AAAA,IAAA;AAAA,IAEL,GAAI,cAAc,EAAE,YAAA,IAAgB,CAAA;AAAA,IACpC,MAAM,KAAK,UAAU,EAAE,OAAO,WAAW;AAAA,EAAA,CAC1C;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,gBAAgB,SAAS,MAAM,KAAK,SAAS,UAAU,EAAE;AAAA,EAC3E;AAEA,QAAM,SAAS,MAAM,SAAS,KAAA;AAC9B,OAAI,YAAO,WAAP,mBAAe,QAAQ;AACzB,UAAM,IAAI,MAAM,kBAAkB,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE;AAAA,EAC9D;AAEA,SAAO,OAAO;AAChB;AAQA,MAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYtB,MAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA,UAIzB,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAOvB,MAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAe9B,oBAAoB;AAAA;AAAA;AAAA;AAKrB,MAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAahC,MAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;"}
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 /** Resolve a current bearer before each query (for rotating Office sessions). */\n getAccessToken?: () => Promise<string>;\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\nexport async function fetchGraphQL<T = any>(\n auth: MentionAuthContext,\n query: string,\n variables: Record<string, any> = {},\n): Promise<T> {\n const url = `${auth.backendUrl.replace(/\\/+$/, \"\")}/graphql`;\n const requestAuth = auth.getAccessToken\n ? { ...auth, accessToken: await auth.getAccessToken() }\n : auth;\n const { headers, credentials } = mentionRequestInit(requestAuth);\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n ...(credentials ? { credentials } : {}),\n body: JSON.stringify({ query, variables }),\n });\n\n if (!response.ok) {\n throw new Error(`GraphQL HTTP ${response.status}: ${response.statusText}`);\n }\n\n const result = await response.json();\n if (result.errors?.length) {\n throw new Error(`GraphQL error: ${result.errors[0].message}`);\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"],"mappings":";;;AAgCO,SAAS,mBACd,MAC8C;AAC9C,MAAI,KAAK,aAAa;AACpB,WAAO,EAAE,SAAS,EAAE,eAAe,UAAU,KAAK,WAAW,KAAG;AAAA,EAClE;AACA,MAAI,KAAK,OAAQ,QAAO,EAAE,SAAS,EAAE,aAAa,KAAK,SAAO;AAC9D,MAAI,KAAK,YAAa,QAAO,EAAE,SAAS,CAAA,GAAI,aAAa,KAAK,YAAA;AAC9D,QAAM,IAAI,MAAM,yDAAyD;AAC3E;AAEO,MAAM,iBAAiBA,MAAAA,cAAyC,IAAI;AAEpE,SAAS,iBAAqC;AACnD,QAAM,MAAMC,MAAAA,WAAW,cAAc;AACrC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,6BAA6B;AACvD,SAAO;AACT;AAIA,eAAsB,aACpB,MACA,OACA,YAAiC,CAAA,GACrB;;AACZ,QAAM,MAAM,GAAG,KAAK,WAAW,QAAQ,QAAQ,EAAE,CAAC;AAClD,QAAM,cAAc,KAAK,iBACrB,EAAE,GAAG,MAAM,aAAa,MAAM,KAAK,eAAA,EAAe,IAClD;AACJ,QAAM,EAAE,SAAS,gBAAgB,mBAAmB,WAAW;AAC/D,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,GAAG;AAAA,IAAA;AAAA,IAEL,GAAI,cAAc,EAAE,YAAA,IAAgB,CAAA;AAAA,IACpC,MAAM,KAAK,UAAU,EAAE,OAAO,WAAW;AAAA,EAAA,CAC1C;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,gBAAgB,SAAS,MAAM,KAAK,SAAS,UAAU,EAAE;AAAA,EAC3E;AAEA,QAAM,SAAS,MAAM,SAAS,KAAA;AAC9B,OAAI,YAAO,WAAP,mBAAe,QAAQ;AACzB,UAAM,IAAI,MAAM,kBAAkB,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE;AAAA,EAC9D;AAEA,SAAO,OAAO;AAChB;AAQA,MAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYtB,MAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA,UAIzB,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAOvB,MAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAe9B,oBAAoB;AAAA;AAAA;AAAA;AAKrB,MAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAahC,MAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;"}
@@ -2,14 +2,15 @@
2
2
  * API client for mention data fetching.
3
3
  *
4
4
  * Wraps raw fetch() with GraphQL support. Hosts authenticate with either a
5
- * bearer token (Chrome extension) or a workspace API key (Microsoft 365
6
- * add-in); agora's /graphql accepts both.
5
+ * bearer token or a workspace API key; agora's /graphql accepts both.
7
6
  */
8
7
  export interface MentionAuthContext {
9
8
  backendUrl: string;
10
9
  appUrl?: string;
11
10
  /** Bearer credential; hosts without one authenticate with `apiKey`. */
12
11
  accessToken?: string;
12
+ /** Resolve a current bearer before each query (for rotating Office sessions). */
13
+ getAccessToken?: () => Promise<string>;
13
14
  apiKey?: string;
14
15
  /**
15
16
  * With neither credential, ride the browser's same-origin session cookie
@@ -16,7 +16,8 @@ function useMentionAuth() {
16
16
  async function fetchGraphQL(auth, query, variables = {}) {
17
17
  var _a;
18
18
  const url = `${auth.backendUrl.replace(/\/+$/, "")}/graphql`;
19
- const { headers, credentials } = mentionRequestInit(auth);
19
+ const requestAuth = auth.getAccessToken ? { ...auth, accessToken: await auth.getAccessToken() } : auth;
20
+ const { headers, credentials } = mentionRequestInit(requestAuth);
20
21
  const response = await fetch(url, {
21
22
  method: "POST",
22
23
  headers: {
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.js","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 (Chrome extension) or a workspace API key (Microsoft 365\n * add-in); 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 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\nexport async function fetchGraphQL<T = any>(\n auth: MentionAuthContext,\n query: string,\n variables: Record<string, any> = {},\n): Promise<T> {\n const url = `${auth.backendUrl.replace(/\\/+$/, \"\")}/graphql`;\n const { headers, credentials } = mentionRequestInit(auth);\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n ...(credentials ? { credentials } : {}),\n body: JSON.stringify({ query, variables }),\n });\n\n if (!response.ok) {\n throw new Error(`GraphQL HTTP ${response.status}: ${response.statusText}`);\n }\n\n const result = await response.json();\n if (result.errors?.length) {\n throw new Error(`GraphQL error: ${result.errors[0].message}`);\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":[],"mappings":";AA+BO,SAAS,mBACd,MAC8C;AAC9C,MAAI,KAAK,aAAa;AACpB,WAAO,EAAE,SAAS,EAAE,eAAe,UAAU,KAAK,WAAW,KAAG;AAAA,EAClE;AACA,MAAI,KAAK,OAAQ,QAAO,EAAE,SAAS,EAAE,aAAa,KAAK,SAAO;AAC9D,MAAI,KAAK,YAAa,QAAO,EAAE,SAAS,CAAA,GAAI,aAAa,KAAK,YAAA;AAC9D,QAAM,IAAI,MAAM,yDAAyD;AAC3E;AAEO,MAAM,iBAAiB,cAAyC,IAAI;AAEpE,SAAS,iBAAqC;AACnD,QAAM,MAAM,WAAW,cAAc;AACrC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,6BAA6B;AACvD,SAAO;AACT;AAIA,eAAsB,aACpB,MACA,OACA,YAAiC,CAAA,GACrB;;AACZ,QAAM,MAAM,GAAG,KAAK,WAAW,QAAQ,QAAQ,EAAE,CAAC;AAClD,QAAM,EAAE,SAAS,gBAAgB,mBAAmB,IAAI;AACxD,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,GAAG;AAAA,IAAA;AAAA,IAEL,GAAI,cAAc,EAAE,YAAA,IAAgB,CAAA;AAAA,IACpC,MAAM,KAAK,UAAU,EAAE,OAAO,WAAW;AAAA,EAAA,CAC1C;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,gBAAgB,SAAS,MAAM,KAAK,SAAS,UAAU,EAAE;AAAA,EAC3E;AAEA,QAAM,SAAS,MAAM,SAAS,KAAA;AAC9B,OAAI,YAAO,WAAP,mBAAe,QAAQ;AACzB,UAAM,IAAI,MAAM,kBAAkB,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE;AAAA,EAC9D;AAEA,SAAO,OAAO;AAChB;AAQA,MAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYtB,MAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA,UAIzB,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAOvB,MAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAe9B,oBAAoB;AAAA;AAAA;AAAA;AAKrB,MAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAahC,MAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;"}
1
+ {"version":3,"file":"api-client.js","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 /** Resolve a current bearer before each query (for rotating Office sessions). */\n getAccessToken?: () => Promise<string>;\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\nexport async function fetchGraphQL<T = any>(\n auth: MentionAuthContext,\n query: string,\n variables: Record<string, any> = {},\n): Promise<T> {\n const url = `${auth.backendUrl.replace(/\\/+$/, \"\")}/graphql`;\n const requestAuth = auth.getAccessToken\n ? { ...auth, accessToken: await auth.getAccessToken() }\n : auth;\n const { headers, credentials } = mentionRequestInit(requestAuth);\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n ...(credentials ? { credentials } : {}),\n body: JSON.stringify({ query, variables }),\n });\n\n if (!response.ok) {\n throw new Error(`GraphQL HTTP ${response.status}: ${response.statusText}`);\n }\n\n const result = await response.json();\n if (result.errors?.length) {\n throw new Error(`GraphQL error: ${result.errors[0].message}`);\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":[],"mappings":";AAgCO,SAAS,mBACd,MAC8C;AAC9C,MAAI,KAAK,aAAa;AACpB,WAAO,EAAE,SAAS,EAAE,eAAe,UAAU,KAAK,WAAW,KAAG;AAAA,EAClE;AACA,MAAI,KAAK,OAAQ,QAAO,EAAE,SAAS,EAAE,aAAa,KAAK,SAAO;AAC9D,MAAI,KAAK,YAAa,QAAO,EAAE,SAAS,CAAA,GAAI,aAAa,KAAK,YAAA;AAC9D,QAAM,IAAI,MAAM,yDAAyD;AAC3E;AAEO,MAAM,iBAAiB,cAAyC,IAAI;AAEpE,SAAS,iBAAqC;AACnD,QAAM,MAAM,WAAW,cAAc;AACrC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,6BAA6B;AACvD,SAAO;AACT;AAIA,eAAsB,aACpB,MACA,OACA,YAAiC,CAAA,GACrB;;AACZ,QAAM,MAAM,GAAG,KAAK,WAAW,QAAQ,QAAQ,EAAE,CAAC;AAClD,QAAM,cAAc,KAAK,iBACrB,EAAE,GAAG,MAAM,aAAa,MAAM,KAAK,eAAA,EAAe,IAClD;AACJ,QAAM,EAAE,SAAS,gBAAgB,mBAAmB,WAAW;AAC/D,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,GAAG;AAAA,IAAA;AAAA,IAEL,GAAI,cAAc,EAAE,YAAA,IAAgB,CAAA;AAAA,IACpC,MAAM,KAAK,UAAU,EAAE,OAAO,WAAW;AAAA,EAAA,CAC1C;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,gBAAgB,SAAS,MAAM,KAAK,SAAS,UAAU,EAAE;AAAA,EAC3E;AAEA,QAAM,SAAS,MAAM,SAAS,KAAA;AAC9B,OAAI,YAAO,WAAP,mBAAe,QAAQ;AACzB,UAAM,IAAI,MAAM,kBAAkB,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE;AAAA,EAC9D;AAEA,SAAO,OAAO;AAChB;AAQA,MAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYtB,MAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA,UAIzB,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAOvB,MAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAe9B,oBAAoB;AAAA;AAAA;AAAA;AAKrB,MAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAahC,MAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;"}
@@ -13,17 +13,16 @@ require("../../packages/agent-runtime/src/messages.cjs");
13
13
  require("@assistant-ui/react-statewire");
14
14
  require("@assistant-ui/store");
15
15
  const streamingMarkdown = require("../../packages/agent-runtime/src/streaming-markdown.cjs");
16
- require("@assistant-ui/react-statewire/local-storage");
16
+ require("../../packages/agent-runtime/src/quota-safe-local-storage-session.cjs");
17
17
  require("../../packages/agent-runtime/src/statewire-attach-observer.cjs");
18
18
  require("../../packages/agent-runtime/src/thread-status.cjs");
19
19
  const voicePresentation = require("../../packages/agent-runtime/src/voice-presentation.cjs");
20
20
  const runtimeMessages = require("../../packages/agent-runtime/src/runtime-messages.cjs");
21
- const reactMarkdown = require("@assistant-ui/react-markdown");
21
+ require("../../packages/agent-runtime/src/thread-handoff.cjs");
22
22
  require("@assistant-ui/react-markdown/styles/dot.css");
23
23
  const lucideReact = require("lucide-react");
24
- const remarkGfm = require("remark-gfm");
25
24
  const useAthenaRunLive = require("../../chat/use-athena-run-live.cjs");
26
- const mentionChip = require("../mentions/mention-chip.cjs");
25
+ const chatMessageBody = require("../rich-text/chat-message-body.cjs");
27
26
  const messageActionsConfig = require("./message-actions-config.cjs");
28
27
  const runtimeMessage = require("./runtime-message.cjs");
29
28
  const runningIndicator = require("./running-indicator.cjs");
@@ -112,34 +111,12 @@ const RegenerateActionButton = () => {
112
111
  return /* @__PURE__ */ jsxRuntime.jsx(react.ActionBarPrimitive.Reload, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(SmallIconButton, { tooltip: "Regenerate", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.RefreshCwIcon, { className: "size-3" }) }) });
113
112
  };
114
113
  const ACTION_BAR_REVEAL_CLASS = "pointer-events-none opacity-0 transition-opacity focus-within:pointer-events-auto focus-within:opacity-100";
115
- function CodeBlock({ language, code }) {
116
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "not-prose my-2 overflow-hidden rounded-lg border border-border bg-muted/30", children: [
117
- language && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-b border-border bg-muted/50 px-3 py-1 text-[10px] font-medium text-muted-foreground", children: language }),
118
- /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "overflow-x-auto p-3", children: /* @__PURE__ */ jsxRuntime.jsx("code", { className: "font-mono text-xs leading-relaxed text-foreground", children: code }) })
119
- ] });
120
- }
121
- const MARKDOWN_CLASS = "aui-md prose prose-sm max-w-none text-foreground prose-p:my-1.5 prose-p:leading-relaxed prose-headings:mt-3 prose-headings:mb-1.5 prose-headings:font-semibold prose-h1:text-sm prose-h2:text-sm prose-h3:text-xs prose-ul:my-1.5 prose-ol:my-1.5 prose-li:my-0.5 prose-blockquote:border-l-2 prose-blockquote:border-border prose-blockquote:text-muted-foreground prose-code:rounded prose-code:bg-muted prose-code:px-1 prose-code:py-0.5 prose-code:text-xs prose-code:font-mono prose-code:before:content-none prose-code:after:content-none prose-pre:my-0 prose-pre:p-0 prose-pre:bg-transparent prose-pre:border-0 prose-a:text-primary prose-a:no-underline hover:prose-a:underline prose-strong:font-semibold prose-hr:border-border";
122
- const MARKDOWN_REMARK_PLUGINS = [remarkGfm];
123
- const MARKDOWN_COMPONENTS = {
124
- SyntaxHighlighter: CodeBlock,
125
- a: mentionChip.MentionLink
126
- };
127
114
  const MarkdownText = () => {
128
115
  const revealed = react.useSmooth(react.useMessagePartText(), true);
129
116
  const isRunning = revealed.status.type === "running";
130
117
  const text = isRunning ? streamingMarkdown.hideUnterminatedMarkdownLink(revealed.text) : revealed.text;
131
- return /* @__PURE__ */ jsxRuntime.jsx(react.TextMessagePartProvider, { text, isRunning, children: /* @__PURE__ */ jsxRuntime.jsx(
132
- reactMarkdown.MarkdownTextPrimitive,
133
- {
134
- className: MARKDOWN_CLASS,
135
- remarkPlugins: MARKDOWN_REMARK_PLUGINS,
136
- smooth: false,
137
- preprocess: mentionChip.normalizeAthenaMentionHtml,
138
- components: MARKDOWN_COMPONENTS
139
- }
140
- ) });
118
+ return /* @__PURE__ */ jsxRuntime.jsx(chatMessageBody.ChatMessageBody, { text, isRunning });
141
119
  };
142
- const UserMessageText = ({ text }) => /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: mentionChip.parseMentionsInText(text) });
143
120
  const UserActionBar = () => /* @__PURE__ */ jsxRuntime.jsxs(
144
121
  react.ActionBarPrimitive.Root,
145
122
  {
@@ -170,8 +147,8 @@ const UserMessage = () => {
170
147
  {
171
148
  "data-message-role": "user",
172
149
  className: "group/user-message mb-3 flex justify-end",
173
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex max-w-[85%] flex-col items-end gap-1", children: [
174
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-2xl rounded-br-md bg-muted px-3.5 py-2 text-sm text-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(react.MessagePrimitive.Content, { components: { Text: UserMessageText } }) }),
150
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 max-w-[85%] flex-col items-end gap-1", children: [
151
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 max-w-full rounded-2xl rounded-br-md bg-muted px-3.5 py-2 text-sm text-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(react.MessagePrimitive.Content, { components: { Text: MarkdownText } }) }),
175
152
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-h-6 items-center gap-1", children: [
176
153
  /* @__PURE__ */ jsxRuntime.jsx(BranchPicker, {}),
177
154
  /* @__PURE__ */ jsxRuntime.jsx(UserActionBar, {})