@agent-native/core 0.110.3 → 0.111.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 (380) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +11 -0
  3. package/corpus/core/docs/content/components.mdx +7 -0
  4. package/corpus/core/docs/content/locales/ar-SA/components.mdx +4 -2
  5. package/corpus/core/docs/content/locales/de-DE/components.mdx +4 -2
  6. package/corpus/core/docs/content/locales/es-ES/components.mdx +4 -2
  7. package/corpus/core/docs/content/locales/fr-FR/components.mdx +4 -2
  8. package/corpus/core/docs/content/locales/hi-IN/components.mdx +3 -2
  9. package/corpus/core/docs/content/locales/ja-JP/components.mdx +3 -2
  10. package/corpus/core/docs/content/locales/ko-KR/components.mdx +3 -2
  11. package/corpus/core/docs/content/locales/pt-BR/components.mdx +4 -2
  12. package/corpus/core/docs/content/locales/zh-CN/components.mdx +3 -2
  13. package/corpus/core/docs/content/locales/zh-TW/components.mdx +3 -2
  14. package/corpus/core/docs/content/toolkit-agent-ux.mdx +8 -3
  15. package/corpus/core/migration-manifest.json +133 -266
  16. package/corpus/core/package.json +32 -33
  17. package/corpus/core/scripts/check-dist-imports.mjs +25 -1
  18. package/corpus/core/scripts/finalize-build.mjs +59 -2
  19. package/corpus/core/src/client/AgentAskPopover.tsx +1 -1
  20. package/corpus/core/src/client/AgentPanel.tsx +1 -1
  21. package/corpus/core/src/client/AssistantChat.tsx +12 -14
  22. package/corpus/core/src/client/NewWorkspaceAppFlow.tsx +1 -1
  23. package/corpus/core/src/client/agent-chat-adapter.ts +1 -1
  24. package/corpus/core/src/client/blocks/RegistryBlockDataProvider.tsx +121 -0
  25. package/corpus/core/src/client/blocks/index.ts +6 -0
  26. package/corpus/core/src/client/chat/attachment-adapters.ts +4 -5
  27. package/corpus/core/src/client/chat/index.ts +0 -1
  28. package/corpus/core/src/client/chat/message-components.tsx +2 -2
  29. package/corpus/core/src/client/code-agent-chat-adapter.ts +2 -2
  30. package/corpus/core/src/client/collab/index.ts +0 -22
  31. package/corpus/core/src/client/composer/index.ts +5 -66
  32. package/corpus/core/src/client/composer/runtime-adapters.tsx +123 -0
  33. package/corpus/core/src/client/composer/use-mention-search.ts +2 -79
  34. package/corpus/core/src/client/composer/wired-components.tsx +53 -0
  35. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +1 -1
  36. package/corpus/core/src/client/extensions/ExtensionsListPage.tsx +1 -1
  37. package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +1 -1
  38. package/corpus/core/src/client/index.ts +0 -156
  39. package/corpus/core/src/client/resources/ResourceEditor.tsx +29 -681
  40. package/corpus/core/src/client/resources/ResourcesPanel.tsx +1 -1
  41. package/corpus/core/src/client/settings/AutomationsSection.tsx +1 -1
  42. package/corpus/core/src/client/sharing/index.ts +0 -4
  43. package/corpus/core/src/client/tombstone/agent-presence-chip.ts +17 -0
  44. package/corpus/core/src/client/tombstone/editor.ts +265 -0
  45. package/corpus/core/src/client/tombstone/live-cursor-overlay.ts +21 -0
  46. package/corpus/core/src/client/tombstone/presence-bar.ts +17 -0
  47. package/corpus/core/src/client/tombstone/recent-edit-highlights.ts +17 -0
  48. package/corpus/core/src/client/tombstone/remote-selection-rings.ts +21 -0
  49. package/corpus/core/src/client/tombstone/rich-markdown-editor.ts +265 -0
  50. package/corpus/core/src/client/tombstone/ui-dialog.ts +49 -0
  51. package/corpus/core/src/client/tombstone/ui-dropdown-menu.ts +69 -0
  52. package/corpus/core/src/client/tombstone/ui-hover-card.ts +21 -0
  53. package/corpus/core/src/client/tombstone/ui-popover.ts +25 -0
  54. package/corpus/core/src/client/tombstone/ui-sheet.ts +49 -0
  55. package/corpus/core/src/client/tombstone/ui-tooltip.ts +29 -0
  56. package/corpus/core/src/client/tombstone/visual-style-controls.ts +61 -0
  57. package/corpus/core/src/client/uploads/index.ts +5 -0
  58. package/corpus/core/src/client/{rich-markdown-editor/uploadEditorImage.ts → uploads/upload-editor-image.ts} +11 -4
  59. package/corpus/core/src/package-lifecycle/tombstone.ts +16 -2
  60. package/corpus/core/src/package-lifecycle/upgrade-error.ts +23 -5
  61. package/corpus/core/src/testing.ts +1 -4
  62. package/corpus/core/src/vite/client.ts +62 -22
  63. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +2 -4
  64. package/corpus/templates/content/app/components/editor/extensions/registryBlocks.ts +1 -1
  65. package/corpus/templates/content/app/components/editor/registrySlashItems.ts +53 -52
  66. package/corpus/templates/plan/app/components/editor/PlanBlockNode.tsx +2 -2
  67. package/corpus/templates/plan/app/components/editor/planSlashCommands.ts +1 -1
  68. package/corpus/templates/plan/app/components/plan/DocumentArea.tsx +1 -1
  69. package/corpus/templates/plan/app/components/plan/PlanImageNode.tsx +1 -1
  70. package/corpus/templates/plan/app/components/plan/PlanMarkdownEditor.tsx +1 -1
  71. package/dist/catalog.json +1 -0
  72. package/dist/client/AgentAskPopover.js +1 -1
  73. package/dist/client/AgentAskPopover.js.map +1 -1
  74. package/dist/client/AgentPanel.js +1 -1
  75. package/dist/client/AgentPanel.js.map +1 -1
  76. package/dist/client/AssistantChat.d.ts +2 -2
  77. package/dist/client/AssistantChat.d.ts.map +1 -1
  78. package/dist/client/AssistantChat.js +5 -6
  79. package/dist/client/AssistantChat.js.map +1 -1
  80. package/dist/client/NewWorkspaceAppFlow.js +1 -1
  81. package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
  82. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  83. package/dist/client/agent-chat-adapter.js +1 -1
  84. package/dist/client/agent-chat-adapter.js.map +1 -1
  85. package/dist/client/blocks/RegistryBlockDataProvider.d.ts +7 -0
  86. package/dist/client/blocks/RegistryBlockDataProvider.d.ts.map +1 -0
  87. package/dist/client/blocks/RegistryBlockDataProvider.js +54 -0
  88. package/dist/client/blocks/RegistryBlockDataProvider.js.map +1 -0
  89. package/dist/client/blocks/index.d.ts +2 -0
  90. package/dist/client/blocks/index.d.ts.map +1 -1
  91. package/dist/client/blocks/index.js +1 -0
  92. package/dist/client/blocks/index.js.map +1 -1
  93. package/dist/client/chat/attachment-adapters.d.ts.map +1 -1
  94. package/dist/client/chat/attachment-adapters.js +1 -1
  95. package/dist/client/chat/attachment-adapters.js.map +1 -1
  96. package/dist/client/chat/index.d.ts +0 -1
  97. package/dist/client/chat/index.d.ts.map +1 -1
  98. package/dist/client/chat/index.js +0 -1
  99. package/dist/client/chat/index.js.map +1 -1
  100. package/dist/client/chat/message-components.d.ts.map +1 -1
  101. package/dist/client/chat/message-components.js +2 -2
  102. package/dist/client/chat/message-components.js.map +1 -1
  103. package/dist/client/code-agent-chat-adapter.d.ts.map +1 -1
  104. package/dist/client/code-agent-chat-adapter.js +1 -1
  105. package/dist/client/code-agent-chat-adapter.js.map +1 -1
  106. package/dist/client/collab/index.d.ts +0 -5
  107. package/dist/client/collab/index.d.ts.map +1 -1
  108. package/dist/client/collab/index.js +0 -5
  109. package/dist/client/collab/index.js.map +1 -1
  110. package/dist/client/composer/index.d.ts +3 -11
  111. package/dist/client/composer/index.d.ts.map +1 -1
  112. package/dist/client/composer/index.js +3 -10
  113. package/dist/client/composer/index.js.map +1 -1
  114. package/dist/client/composer/runtime-adapters.d.ts +5 -0
  115. package/dist/client/composer/runtime-adapters.d.ts.map +1 -0
  116. package/dist/client/composer/runtime-adapters.js +85 -0
  117. package/dist/client/composer/runtime-adapters.js.map +1 -0
  118. package/dist/client/composer/use-mention-search.d.ts +1 -2
  119. package/dist/client/composer/use-mention-search.d.ts.map +1 -1
  120. package/dist/client/composer/use-mention-search.js +2 -69
  121. package/dist/client/composer/use-mention-search.js.map +1 -1
  122. package/dist/client/composer/wired-components.d.ts +10 -0
  123. package/dist/client/composer/wired-components.d.ts.map +1 -0
  124. package/dist/client/composer/wired-components.js +20 -0
  125. package/dist/client/composer/wired-components.js.map +1 -0
  126. package/dist/client/extensions/ExtensionViewer.js +1 -1
  127. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  128. package/dist/client/extensions/ExtensionsListPage.js +1 -1
  129. package/dist/client/extensions/ExtensionsListPage.js.map +1 -1
  130. package/dist/client/extensions/ExtensionsSidebarSection.js +1 -1
  131. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  132. package/dist/client/index.d.ts +0 -10
  133. package/dist/client/index.d.ts.map +1 -1
  134. package/dist/client/index.js +0 -26
  135. package/dist/client/index.js.map +1 -1
  136. package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
  137. package/dist/client/resources/ResourceEditor.js +14 -532
  138. package/dist/client/resources/ResourceEditor.js.map +1 -1
  139. package/dist/client/resources/ResourcesPanel.js +1 -1
  140. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  141. package/dist/client/settings/AutomationsSection.js +1 -1
  142. package/dist/client/settings/AutomationsSection.js.map +1 -1
  143. package/dist/client/sharing/index.d.ts +0 -1
  144. package/dist/client/sharing/index.d.ts.map +1 -1
  145. package/dist/client/sharing/index.js +0 -1
  146. package/dist/client/sharing/index.js.map +1 -1
  147. package/dist/client/tombstone/agent-presence-chip.d.ts +6 -0
  148. package/dist/client/tombstone/agent-presence-chip.d.ts.map +1 -0
  149. package/dist/client/tombstone/agent-presence-chip.js +5 -0
  150. package/dist/client/tombstone/agent-presence-chip.js.map +1 -0
  151. package/dist/client/tombstone/editor.d.ts +128 -0
  152. package/dist/client/tombstone/editor.d.ts.map +1 -0
  153. package/dist/client/tombstone/editor.js +76 -0
  154. package/dist/client/tombstone/editor.js.map +1 -0
  155. package/dist/client/tombstone/live-cursor-overlay.d.ts +8 -0
  156. package/dist/client/tombstone/live-cursor-overlay.d.ts.map +1 -0
  157. package/dist/client/tombstone/live-cursor-overlay.js +5 -0
  158. package/dist/client/tombstone/live-cursor-overlay.js.map +1 -0
  159. package/dist/client/tombstone/presence-bar.d.ts +6 -0
  160. package/dist/client/tombstone/presence-bar.d.ts.map +1 -0
  161. package/dist/client/tombstone/presence-bar.js +5 -0
  162. package/dist/client/tombstone/presence-bar.js.map +1 -0
  163. package/dist/client/tombstone/recent-edit-highlights.d.ts +6 -0
  164. package/dist/client/tombstone/recent-edit-highlights.d.ts.map +1 -0
  165. package/dist/client/tombstone/recent-edit-highlights.js +5 -0
  166. package/dist/client/tombstone/recent-edit-highlights.js.map +1 -0
  167. package/dist/client/tombstone/remote-selection-rings.d.ts +8 -0
  168. package/dist/client/tombstone/remote-selection-rings.d.ts.map +1 -0
  169. package/dist/client/tombstone/remote-selection-rings.js +5 -0
  170. package/dist/client/tombstone/remote-selection-rings.js.map +1 -0
  171. package/dist/client/tombstone/rich-markdown-editor.d.ts +128 -0
  172. package/dist/client/tombstone/rich-markdown-editor.d.ts.map +1 -0
  173. package/dist/client/tombstone/rich-markdown-editor.js +76 -0
  174. package/dist/client/tombstone/rich-markdown-editor.js.map +1 -0
  175. package/dist/client/tombstone/ui-dialog.d.ts +22 -0
  176. package/dist/client/tombstone/ui-dialog.d.ts.map +1 -0
  177. package/dist/client/tombstone/ui-dialog.js +23 -0
  178. package/dist/client/tombstone/ui-dialog.js.map +1 -0
  179. package/dist/client/tombstone/ui-dropdown-menu.d.ts +32 -0
  180. package/dist/client/tombstone/ui-dropdown-menu.d.ts.map +1 -0
  181. package/dist/client/tombstone/ui-dropdown-menu.js +33 -0
  182. package/dist/client/tombstone/ui-dropdown-menu.js.map +1 -0
  183. package/dist/client/tombstone/ui-hover-card.d.ts +8 -0
  184. package/dist/client/tombstone/ui-hover-card.d.ts.map +1 -0
  185. package/dist/client/tombstone/ui-hover-card.js +9 -0
  186. package/dist/client/tombstone/ui-hover-card.js.map +1 -0
  187. package/dist/client/tombstone/ui-popover.d.ts +10 -0
  188. package/dist/client/tombstone/ui-popover.d.ts.map +1 -0
  189. package/dist/client/tombstone/ui-popover.js +11 -0
  190. package/dist/client/tombstone/ui-popover.js.map +1 -0
  191. package/dist/client/tombstone/ui-sheet.d.ts +22 -0
  192. package/dist/client/tombstone/ui-sheet.d.ts.map +1 -0
  193. package/dist/client/tombstone/ui-sheet.js +23 -0
  194. package/dist/client/tombstone/ui-sheet.js.map +1 -0
  195. package/dist/client/tombstone/ui-tooltip.d.ts +12 -0
  196. package/dist/client/tombstone/ui-tooltip.d.ts.map +1 -0
  197. package/dist/client/tombstone/ui-tooltip.js +13 -0
  198. package/dist/client/tombstone/ui-tooltip.js.map +1 -0
  199. package/dist/client/tombstone/visual-style-controls.d.ts +28 -0
  200. package/dist/client/tombstone/visual-style-controls.d.ts.map +1 -0
  201. package/dist/client/tombstone/visual-style-controls.js +23 -0
  202. package/dist/client/tombstone/visual-style-controls.js.map +1 -0
  203. package/dist/client/uploads/index.d.ts +1 -0
  204. package/dist/client/uploads/index.d.ts.map +1 -1
  205. package/dist/client/uploads/index.js +1 -0
  206. package/dist/client/uploads/index.js.map +1 -1
  207. package/dist/client/{rich-markdown-editor/uploadEditorImage.d.ts → uploads/upload-editor-image.d.ts} +8 -4
  208. package/dist/client/uploads/upload-editor-image.d.ts.map +1 -0
  209. package/dist/client/{rich-markdown-editor/uploadEditorImage.js → uploads/upload-editor-image.js} +2 -2
  210. package/dist/client/uploads/upload-editor-image.js.map +1 -0
  211. package/dist/collab/awareness.d.ts +2 -2
  212. package/dist/collab/awareness.d.ts.map +1 -1
  213. package/dist/notifications/routes.d.ts +3 -3
  214. package/dist/package-lifecycle/tombstone.d.ts.map +1 -1
  215. package/dist/package-lifecycle/tombstone.js +13 -3
  216. package/dist/package-lifecycle/tombstone.js.map +1 -1
  217. package/dist/package-lifecycle/upgrade-error.d.ts +2 -2
  218. package/dist/package-lifecycle/upgrade-error.d.ts.map +1 -1
  219. package/dist/package-lifecycle/upgrade-error.js +8 -5
  220. package/dist/package-lifecycle/upgrade-error.js.map +1 -1
  221. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  222. package/dist/server/transcribe-voice.d.ts +1 -1
  223. package/dist/testing.d.ts +1 -3
  224. package/dist/testing.d.ts.map +1 -1
  225. package/dist/testing.js +1 -3
  226. package/dist/testing.js.map +1 -1
  227. package/dist/vite/client.d.ts.map +1 -1
  228. package/dist/vite/client.js +26 -22
  229. package/dist/vite/client.js.map +1 -1
  230. package/docs/content/components.mdx +7 -0
  231. package/docs/content/locales/ar-SA/components.mdx +4 -2
  232. package/docs/content/locales/de-DE/components.mdx +4 -2
  233. package/docs/content/locales/es-ES/components.mdx +4 -2
  234. package/docs/content/locales/fr-FR/components.mdx +4 -2
  235. package/docs/content/locales/hi-IN/components.mdx +3 -2
  236. package/docs/content/locales/ja-JP/components.mdx +3 -2
  237. package/docs/content/locales/ko-KR/components.mdx +3 -2
  238. package/docs/content/locales/pt-BR/components.mdx +4 -2
  239. package/docs/content/locales/zh-CN/components.mdx +3 -2
  240. package/docs/content/locales/zh-TW/components.mdx +3 -2
  241. package/docs/content/toolkit-agent-ux.mdx +8 -3
  242. package/migration-manifest.json +133 -266
  243. package/package.json +31 -32
  244. package/corpus/core/src/client/composer/AgentComposerFrame.tsx +0 -59
  245. package/corpus/core/src/client/composer/ComposerPlusMenu.tsx +0 -988
  246. package/corpus/core/src/client/composer/MentionPopover.tsx +0 -412
  247. package/corpus/core/src/client/composer/PastedTextChip.tsx +0 -150
  248. package/corpus/core/src/client/composer/PromptComposer.tsx +0 -714
  249. package/corpus/core/src/client/composer/RealtimeVoiceMode.tsx +0 -860
  250. package/corpus/core/src/client/composer/TiptapComposer.tsx +0 -2928
  251. package/corpus/core/src/client/composer/VoiceButton.tsx +0 -262
  252. package/corpus/core/src/client/composer/asset-picker-url.ts +0 -80
  253. package/corpus/core/src/client/composer/attachment-accept.ts +0 -71
  254. package/corpus/core/src/client/composer/draft-key.ts +0 -7
  255. package/corpus/core/src/client/composer/extensions/FileReference.tsx +0 -55
  256. package/corpus/core/src/client/composer/extensions/MentionReference.tsx +0 -93
  257. package/corpus/core/src/client/composer/extensions/SkillReference.tsx +0 -56
  258. package/corpus/core/src/client/composer/pasted-text.ts +0 -160
  259. package/corpus/core/src/client/composer/prompt-attachments.ts +0 -70
  260. package/corpus/core/src/client/composer/realtime-voice-audio-level.ts +0 -64
  261. package/corpus/core/src/client/composer/realtime-voice-transcript.ts +0 -134
  262. package/corpus/core/src/client/composer/types.ts +0 -66
  263. package/corpus/core/src/client/composer/use-file-search.ts +0 -63
  264. package/corpus/core/src/client/composer/use-skills.ts +0 -44
  265. package/corpus/core/src/client/composer/useRealtimeVoiceMode.tsx +0 -2095
  266. package/corpus/core/src/client/composer/useVoiceDictation.ts +0 -1155
  267. package/corpus/core/src/client/editor/index.ts +0 -1
  268. package/corpus/core/src/client/rich-markdown-editor/RegistryBlockNode.tsx +0 -799
  269. package/corpus/core/src/client/rich-markdown-editor/index.ts +0 -70
  270. package/corpus/core/src/client/rich-markdown-editor/registrySlashCommands.ts +0 -112
  271. package/dist/client/composer/AgentComposerFrame.d.ts +0 -19
  272. package/dist/client/composer/AgentComposerFrame.d.ts.map +0 -1
  273. package/dist/client/composer/AgentComposerFrame.js +0 -14
  274. package/dist/client/composer/AgentComposerFrame.js.map +0 -1
  275. package/dist/client/composer/ComposerPlusMenu.d.ts +0 -17
  276. package/dist/client/composer/ComposerPlusMenu.d.ts.map +0 -1
  277. package/dist/client/composer/ComposerPlusMenu.js +0 -501
  278. package/dist/client/composer/ComposerPlusMenu.js.map +0 -1
  279. package/dist/client/composer/MentionPopover.d.ts +0 -29
  280. package/dist/client/composer/MentionPopover.d.ts.map +0 -1
  281. package/dist/client/composer/MentionPopover.js +0 -180
  282. package/dist/client/composer/MentionPopover.js.map +0 -1
  283. package/dist/client/composer/PastedTextChip.d.ts +0 -9
  284. package/dist/client/composer/PastedTextChip.d.ts.map +0 -1
  285. package/dist/client/composer/PastedTextChip.js +0 -47
  286. package/dist/client/composer/PastedTextChip.js.map +0 -1
  287. package/dist/client/composer/PromptComposer.d.ts +0 -115
  288. package/dist/client/composer/PromptComposer.d.ts.map +0 -1
  289. package/dist/client/composer/PromptComposer.js +0 -299
  290. package/dist/client/composer/PromptComposer.js.map +0 -1
  291. package/dist/client/composer/RealtimeVoiceMode.d.ts +0 -104
  292. package/dist/client/composer/RealtimeVoiceMode.d.ts.map +0 -1
  293. package/dist/client/composer/RealtimeVoiceMode.js +0 -245
  294. package/dist/client/composer/RealtimeVoiceMode.js.map +0 -1
  295. package/dist/client/composer/TiptapComposer.d.ts +0 -222
  296. package/dist/client/composer/TiptapComposer.d.ts.map +0 -1
  297. package/dist/client/composer/TiptapComposer.js +0 -1834
  298. package/dist/client/composer/TiptapComposer.js.map +0 -1
  299. package/dist/client/composer/VoiceButton.d.ts +0 -23
  300. package/dist/client/composer/VoiceButton.d.ts.map +0 -1
  301. package/dist/client/composer/VoiceButton.js +0 -100
  302. package/dist/client/composer/VoiceButton.js.map +0 -1
  303. package/dist/client/composer/asset-picker-url.d.ts +0 -16
  304. package/dist/client/composer/asset-picker-url.d.ts.map +0 -1
  305. package/dist/client/composer/asset-picker-url.js +0 -64
  306. package/dist/client/composer/asset-picker-url.js.map +0 -1
  307. package/dist/client/composer/attachment-accept.d.ts +0 -9
  308. package/dist/client/composer/attachment-accept.d.ts.map +0 -1
  309. package/dist/client/composer/attachment-accept.js +0 -65
  310. package/dist/client/composer/attachment-accept.js.map +0 -1
  311. package/dist/client/composer/draft-key.d.ts +0 -2
  312. package/dist/client/composer/draft-key.d.ts.map +0 -1
  313. package/dist/client/composer/draft-key.js +0 -8
  314. package/dist/client/composer/draft-key.js.map +0 -1
  315. package/dist/client/composer/extensions/FileReference.d.ts +0 -3
  316. package/dist/client/composer/extensions/FileReference.d.ts.map +0 -1
  317. package/dist/client/composer/extensions/FileReference.js +0 -36
  318. package/dist/client/composer/extensions/FileReference.js.map +0 -1
  319. package/dist/client/composer/extensions/MentionReference.d.ts +0 -3
  320. package/dist/client/composer/extensions/MentionReference.d.ts.map +0 -1
  321. package/dist/client/composer/extensions/MentionReference.js +0 -66
  322. package/dist/client/composer/extensions/MentionReference.js.map +0 -1
  323. package/dist/client/composer/extensions/SkillReference.d.ts +0 -3
  324. package/dist/client/composer/extensions/SkillReference.d.ts.map +0 -1
  325. package/dist/client/composer/extensions/SkillReference.js +0 -40
  326. package/dist/client/composer/extensions/SkillReference.js.map +0 -1
  327. package/dist/client/composer/pasted-text.d.ts +0 -31
  328. package/dist/client/composer/pasted-text.d.ts.map +0 -1
  329. package/dist/client/composer/pasted-text.js +0 -130
  330. package/dist/client/composer/pasted-text.js.map +0 -1
  331. package/dist/client/composer/prompt-attachments.d.ts +0 -11
  332. package/dist/client/composer/prompt-attachments.d.ts.map +0 -1
  333. package/dist/client/composer/prompt-attachments.js +0 -45
  334. package/dist/client/composer/prompt-attachments.js.map +0 -1
  335. package/dist/client/composer/realtime-voice-audio-level.d.ts +0 -14
  336. package/dist/client/composer/realtime-voice-audio-level.d.ts.map +0 -1
  337. package/dist/client/composer/realtime-voice-audio-level.js +0 -47
  338. package/dist/client/composer/realtime-voice-audio-level.js.map +0 -1
  339. package/dist/client/composer/realtime-voice-transcript.d.ts +0 -26
  340. package/dist/client/composer/realtime-voice-transcript.d.ts.map +0 -1
  341. package/dist/client/composer/realtime-voice-transcript.js +0 -103
  342. package/dist/client/composer/realtime-voice-transcript.js.map +0 -1
  343. package/dist/client/composer/types.d.ts +0 -60
  344. package/dist/client/composer/types.d.ts.map +0 -1
  345. package/dist/client/composer/types.js +0 -2
  346. package/dist/client/composer/types.js.map +0 -1
  347. package/dist/client/composer/use-file-search.d.ts +0 -6
  348. package/dist/client/composer/use-file-search.d.ts.map +0 -1
  349. package/dist/client/composer/use-file-search.js +0 -52
  350. package/dist/client/composer/use-file-search.js.map +0 -1
  351. package/dist/client/composer/use-skills.d.ts +0 -7
  352. package/dist/client/composer/use-skills.d.ts.map +0 -1
  353. package/dist/client/composer/use-skills.js +0 -39
  354. package/dist/client/composer/use-skills.js.map +0 -1
  355. package/dist/client/composer/useRealtimeVoiceMode.d.ts +0 -172
  356. package/dist/client/composer/useRealtimeVoiceMode.d.ts.map +0 -1
  357. package/dist/client/composer/useRealtimeVoiceMode.js +0 -1648
  358. package/dist/client/composer/useRealtimeVoiceMode.js.map +0 -1
  359. package/dist/client/composer/useVoiceDictation.d.ts +0 -57
  360. package/dist/client/composer/useVoiceDictation.d.ts.map +0 -1
  361. package/dist/client/composer/useVoiceDictation.js +0 -975
  362. package/dist/client/composer/useVoiceDictation.js.map +0 -1
  363. package/dist/client/editor/index.d.ts +0 -2
  364. package/dist/client/editor/index.d.ts.map +0 -1
  365. package/dist/client/editor/index.js +0 -2
  366. package/dist/client/editor/index.js.map +0 -1
  367. package/dist/client/rich-markdown-editor/RegistryBlockNode.d.ts +0 -130
  368. package/dist/client/rich-markdown-editor/RegistryBlockNode.d.ts.map +0 -1
  369. package/dist/client/rich-markdown-editor/RegistryBlockNode.js +0 -426
  370. package/dist/client/rich-markdown-editor/RegistryBlockNode.js.map +0 -1
  371. package/dist/client/rich-markdown-editor/index.d.ts +0 -5
  372. package/dist/client/rich-markdown-editor/index.d.ts.map +0 -1
  373. package/dist/client/rich-markdown-editor/index.js +0 -5
  374. package/dist/client/rich-markdown-editor/index.js.map +0 -1
  375. package/dist/client/rich-markdown-editor/registrySlashCommands.d.ts +0 -60
  376. package/dist/client/rich-markdown-editor/registrySlashCommands.d.ts.map +0 -1
  377. package/dist/client/rich-markdown-editor/registrySlashCommands.js +0 -51
  378. package/dist/client/rich-markdown-editor/registrySlashCommands.js.map +0 -1
  379. package/dist/client/rich-markdown-editor/uploadEditorImage.d.ts.map +0 -1
  380. package/dist/client/rich-markdown-editor/uploadEditorImage.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"ComposerPlusMenu.js","sourceRoot":"","sources":["../../../src/client/composer/ComposerPlusMenu.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useComposerRuntime } from \"@assistant-ui/react\";\nimport {\n IconPlus,\n IconUpload,\n IconBulb,\n IconClock,\n IconBolt,\n IconTool,\n IconPlugConnected,\n IconPhotoPlus,\n IconLoader2,\n IconArrowLeft,\n IconX,\n} from \"@tabler/icons-react\";\nimport React, {\n useState,\n useRef,\n useEffect,\n useMemo,\n useCallback,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { setAgentChatContextItem } from \"../agent-chat.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from \"../components/ui/popover.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { useT } from \"../i18n.js\";\nimport { useOrg } from \"../org/hooks.js\";\nimport { isMcpIntegrationCatalogAvailable } from \"../resources/mcp-integration-catalog.js\";\nimport { McpIntegrationDialog } from \"../resources/McpIntegrationDialog.js\";\nimport {\n useCreateMcpServer,\n type McpServerScope,\n} from \"../resources/use-mcp-servers.js\";\nimport { cn } from \"../utils.js\";\nimport {\n createAssetPickerHandoffId,\n isExternalAssetPickerUrl,\n standaloneAssetPickerUrl,\n} from \"./asset-picker-url.js\";\nimport type { ComposerMode } from \"./types.js\";\n\ninterface ComposerPlusMenuProps {\n onSelectMode?: (mode: ComposerMode) => void;\n onAttachmentError?: (message: string) => void;\n /**\n * \"full\" (default): full + menu with Upload File, Create Skill, Schedule Task,\n * Automation, Extension, MCP Server. \"upload-only\": clicking + opens the file\n * picker directly — no popover, no other modes. Use for prompt popovers\n * (create extension, create deck, create dashboard, etc.) where the only thing\n * to attach is a file.\n */\n mode?: \"full\" | \"upload-only\";\n}\n\ntype View = \"menu\" | \"skill-upload\";\n\nconst DEFAULT_ASSETS_PICKER_URL = \"https://assets.agent-native.com/picker\";\nconst EMBED_PROTOCOL = \"agent-native.embed\";\nconst EMBED_VERSION = 1;\n\ninterface EmbedEnvelope<TPayload = unknown> {\n protocol?: string;\n version?: number;\n type?: string;\n name?: string;\n payload?: TPayload;\n}\n\ninterface AssetPickerPayload {\n assetId?: unknown;\n handoffId?: unknown;\n url?: unknown;\n previewUrl?: unknown;\n downloadUrl?: unknown;\n embedUrl?: unknown;\n altText?: unknown;\n title?: unknown;\n prompt?: unknown;\n mediaType?: unknown;\n libraryId?: unknown;\n}\n\nfunction assetPickerUrl() {\n const env = (import.meta.env as Record<string, string | undefined>) ?? {};\n return env.VITE_AGENT_NATIVE_ASSETS_PICKER_URL || DEFAULT_ASSETS_PICKER_URL;\n}\n\nfunction withEmbeddedParams(url: string): string {\n try {\n const parsed = new URL(url, window.location.href);\n parsed.searchParams.set(\"embedded\", \"1\");\n parsed.searchParams.set(\"mediaType\", \"image\");\n return parsed.toString();\n } catch {\n const separator = url.includes(\"?\") ? \"&\" : \"?\";\n return `${url}${separator}embedded=1&mediaType=image`;\n }\n}\n\nfunction assetPickerOrigin(url: string): string | null {\n try {\n return new URL(url, window.location.href).origin;\n } catch {\n return null;\n }\n}\n\nfunction embedEnvelope(\n type: \"message\" | \"ready\",\n options: { name?: string; payload?: unknown } = {},\n): EmbedEnvelope {\n return {\n protocol: EMBED_PROTOCOL,\n version: EMBED_VERSION,\n type,\n ...options,\n };\n}\n\nfunction isEmbedEnvelope(value: unknown): value is EmbedEnvelope {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const candidate = value as EmbedEnvelope;\n return (\n candidate.protocol === EMBED_PROTOCOL &&\n candidate.version === EMBED_VERSION &&\n typeof candidate.type === \"string\"\n );\n}\n\nfunction assetString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction assetImageSource(payload: unknown): string | null {\n if (!payload || typeof payload !== \"object\") return null;\n const asset = payload as AssetPickerPayload;\n return (\n assetString(asset.url) ??\n assetString(asset.previewUrl) ??\n assetString(asset.downloadUrl) ??\n assetString(asset.embedUrl)\n );\n}\n\nfunction assetTitle(payload: unknown, url: string): string {\n if (payload && typeof payload === \"object\") {\n const title = assetString((payload as AssetPickerPayload).title);\n if (title) return title;\n const prompt = assetString((payload as AssetPickerPayload).prompt);\n if (prompt) return prompt.slice(0, 80);\n }\n try {\n const name = new URL(url).pathname.split(\"/\").filter(Boolean).pop();\n return name ? decodeURIComponent(name) : \"Generated image\";\n } catch {\n return \"Generated image\";\n }\n}\n\nfunction assetContext(payload: unknown, url: string): string {\n const lines = [`Image URL: ${url}`];\n if (payload && typeof payload === \"object\") {\n const asset = payload as AssetPickerPayload;\n const assetId = assetString(asset.assetId);\n const libraryId = assetString(asset.libraryId);\n const prompt = assetString(asset.prompt);\n const altText = assetString(asset.altText);\n if (assetId) lines.push(`Asset ID: ${assetId}`);\n if (libraryId) lines.push(`Library ID: ${libraryId}`);\n if (prompt) lines.push(`Prompt: ${prompt}`);\n if (altText) lines.push(`Alt text: ${altText}`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction slugifyName(value: string): string {\n return (\n value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"uploaded-skill\"\n );\n}\n\nfunction formatAttachmentError(error: unknown, fallback: string): string {\n return error instanceof Error ? error.message : fallback;\n}\n\nfunction UploadOnlyAttachButton({\n onAttachmentError,\n}: Pick<ComposerPlusMenuProps, \"onAttachmentError\">) {\n const composerRuntime = useComposerRuntime();\n const inputRef = useRef<HTMLInputElement>(null);\n const handleFilesSelected = async (files: FileList | null) => {\n if (!files || files.length === 0) return;\n try {\n await Promise.all(\n Array.from(files).map((file) => composerRuntime.addAttachment(file)),\n );\n } catch (error) {\n onAttachmentError?.(\n formatAttachmentError(error, \"Could not upload the selected file.\"),\n );\n }\n };\n\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n onChange={(event) => {\n void handleFilesSelected(event.target.files);\n event.target.value = \"\";\n }}\n />\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"inline-flex shrink-0\">\n <button\n type=\"button\"\n className=\"shrink-0 flex h-7 w-7 cursor-pointer items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n aria-label=\"Upload\"\n onClick={() => inputRef.current?.click()}\n >\n <IconPlus className=\"h-4 w-4\" />\n </button>\n </span>\n </TooltipTrigger>\n <TooltipContent>Upload</TooltipContent>\n </Tooltip>\n </>\n );\n}\n\nexport function ComposerPlusMenu({\n onSelectMode,\n onAttachmentError,\n mode = \"full\",\n}: ComposerPlusMenuProps) {\n if (mode === \"upload-only\") {\n return <UploadOnlyAttachButton onAttachmentError={onAttachmentError} />;\n }\n return (\n <ComposerPlusMenuFull\n onSelectMode={onSelectMode}\n onAttachmentError={onAttachmentError}\n />\n );\n}\n\nfunction ComposerPlusMenuFull({\n onSelectMode,\n onAttachmentError,\n}: Pick<ComposerPlusMenuProps, \"onSelectMode\" | \"onAttachmentError\">) {\n const t = useT();\n const composerRuntime = useComposerRuntime();\n const [open, setOpen] = useState(false);\n const [assetsPickerOpen, setAssetsPickerOpen] = useState(false);\n const [mcpDialogOpen, setMcpDialogOpen] = useState(false);\n const [view, setView] = useState<View>(\"menu\");\n const showMcpIntegrations = useMemo(\n () => isMcpIntegrationCatalogAvailable(),\n [],\n );\n\n const { data: org } = useOrg();\n const canCreateOrgMcp =\n !org?.orgId || org.role === \"owner\" || org.role === \"admin\";\n const hasOrg = !!org?.orgId;\n const defaultMcpScope: McpServerScope =\n hasOrg && canCreateOrgMcp ? \"org\" : \"user\";\n const createMcp = useCreateMcpServer();\n\n const fileUploadRef = useRef<HTMLInputElement>(null);\n const skillFileInputRef = useRef<HTMLInputElement>(null);\n const skillHoverTimerRef = useRef<number | null>(null);\n const [skillUploadSlug, setSkillUploadSlug] = useState(\"\");\n const [skillUploadContent, setSkillUploadContent] = useState(\"\");\n const [skillUploadFileName, setSkillUploadFileName] = useState(\"\");\n const [skillUploadStatus, setSkillUploadStatus] = useState<{\n kind: \"ok\" | \"err\";\n message: string;\n } | null>(null);\n const [skillUploadBusy, setSkillUploadBusy] = useState(false);\n const [skillFlyoutOpen, setSkillFlyoutOpen] = useState(false);\n const [skillFlyoutSide, setSkillFlyoutSide] = useState<\"right\" | \"left\">(\n \"right\",\n );\n const skillFlyoutCloseTimerRef = useRef<number | null>(null);\n const openSkillFlyout = (rowEl?: HTMLElement | null) => {\n if (skillFlyoutCloseTimerRef.current) {\n window.clearTimeout(skillFlyoutCloseTimerRef.current);\n skillFlyoutCloseTimerRef.current = null;\n }\n if (rowEl && typeof window !== \"undefined\") {\n const rect = rowEl.getBoundingClientRect();\n const FLYOUT_WIDTH = 248;\n setSkillFlyoutSide(\n window.innerWidth - rect.right < FLYOUT_WIDTH ? \"left\" : \"right\",\n );\n }\n setSkillFlyoutOpen(true);\n };\n const scheduleSkillFlyoutClose = () => {\n if (skillFlyoutCloseTimerRef.current)\n window.clearTimeout(skillFlyoutCloseTimerRef.current);\n skillFlyoutCloseTimerRef.current = window.setTimeout(() => {\n setSkillFlyoutOpen(false);\n }, 160);\n };\n\n useEffect(() => {\n if (open) {\n setView(\"menu\");\n setSkillUploadSlug(\"\");\n setSkillUploadContent(\"\");\n setSkillUploadFileName(\"\");\n setSkillUploadStatus(null);\n setSkillUploadBusy(false);\n setSkillFlyoutOpen(false);\n }\n }, [open]);\n\n const handleSkillFileSelected = async (files: FileList | null) => {\n if (!files || files.length === 0) return;\n const file = files[0];\n const text = await file.text();\n const baseName = file.name.replace(/\\.[^./]+$/, \"\");\n const slug = slugifyName(\n baseName.toLowerCase() === \"skill\" ? \"uploaded-skill\" : baseName,\n );\n setSkillUploadSlug(slug);\n setSkillUploadContent(text);\n setSkillUploadFileName(file.name);\n setSkillUploadStatus(null);\n setView(\"skill-upload\");\n };\n\n const handleFilesSelected = async (files: FileList | null) => {\n if (!files || files.length === 0) return;\n try {\n await Promise.all(\n Array.from(files).map((file) => composerRuntime.addAttachment(file)),\n );\n } catch (error) {\n onAttachmentError?.(\n formatAttachmentError(error, \"Could not upload the selected file.\"),\n );\n }\n };\n\n const submitSkillUpload = async () => {\n if (skillUploadBusy) return;\n const slug = slugifyName(skillUploadSlug || \"uploaded-skill\");\n const path = `skills/${slug}/SKILL.md`;\n setSkillUploadBusy(true);\n setSkillUploadStatus(null);\n try {\n const res = await fetch(agentNativePath(\"/_agent-native/resources\"), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n path,\n content: skillUploadContent,\n mimeType: \"text/markdown\",\n shared: false,\n }),\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(body || `Upload failed (${res.status})`);\n }\n setSkillUploadStatus({\n kind: \"ok\",\n message: `Skill \"${skillUploadFileName || `${slug}/SKILL.md`}\" added`,\n });\n window.setTimeout(() => setOpen(false), 1200);\n } catch (err: any) {\n setSkillUploadStatus({\n kind: \"err\",\n message: err?.message || \"Failed to save skill file\",\n });\n } finally {\n setSkillUploadBusy(false);\n }\n };\n\n const menuItems: {\n icon: React.ReactNode;\n label: string;\n desc: string;\n action: () => void;\n hoverAction?: () => void;\n }[] = [\n {\n icon: <IconUpload className=\"h-3.5 w-3.5\" />,\n label: \"Upload File\",\n desc: \"Images, PDFs, text/code, JSON, CSV\",\n action: () => {\n setOpen(false);\n setTimeout(() => fileUploadRef.current?.click(), 0);\n },\n },\n {\n icon: <IconPhotoPlus className=\"h-3.5 w-3.5\" />,\n label: \"Generate Image\",\n desc: \"Open the Assets image picker\",\n action: () => {\n setOpen(false);\n setAssetsPickerOpen(true);\n },\n },\n {\n icon: <IconClock className=\"h-3.5 w-3.5\" />,\n label: \"Schedule Task\",\n desc: \"Run something on a schedule\",\n action: () => {\n onSelectMode?.(\"job\");\n setOpen(false);\n },\n },\n {\n icon: <IconBolt className=\"h-3.5 w-3.5\" />,\n label: \"Create Automation\",\n desc: \"Set up a when-X-do-Y rule\",\n action: () => {\n onSelectMode?.(\"automation\");\n setOpen(false);\n },\n },\n {\n icon: <IconTool className=\"h-3.5 w-3.5\" />,\n label: \"Create Extension\",\n desc: \"Build a mini app extension\",\n action: () => {\n onSelectMode?.(\"extension\");\n setOpen(false);\n },\n },\n ...(showMcpIntegrations\n ? [\n {\n icon: <IconPlugConnected className=\"h-3.5 w-3.5\" />,\n label: t(\"mcpIntegrations.menuLabel\"),\n desc: t(\"mcpIntegrations.menuDescription\"),\n action: () => {\n setOpen(false);\n setMcpDialogOpen(true);\n },\n },\n ]\n : []),\n {\n icon: <IconBulb className=\"h-3.5 w-3.5\" />,\n label: \"Create Skill\",\n desc: \"Teach the agent a new ability\",\n action: openSkillFlyout,\n hoverAction: openSkillFlyout,\n },\n ];\n\n return (\n <>\n {/* Hidden input to trigger the native file upload with explicit errors. */}\n <input\n ref={fileUploadRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n onChange={(event) => {\n void handleFilesSelected(event.target.files);\n event.target.value = \"\";\n }}\n />\n <input\n ref={skillFileInputRef}\n type=\"file\"\n accept=\".md,text/markdown\"\n className=\"hidden\"\n onChange={(e) => {\n void handleSkillFileSelected(e.target.files);\n e.target.value = \"\";\n }}\n />\n\n <Popover open={open} onOpenChange={setOpen}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"shrink-0 flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50 disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n <IconPlus className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>Add...</TooltipContent>\n </Tooltip>\n <PopoverContent\n side=\"top\"\n align=\"start\"\n sideOffset={8}\n className={cn(\n \"p-0 rounded-lg\",\n view === \"skill-upload\"\n ? \"max-h-[70vh] w-[calc(100vw-24px)] max-w-[380px] overflow-y-auto\"\n : \"w-[260px]\",\n )}\n style={{ fontSize: 13, lineHeight: \"normal\" }}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n {view === \"menu\" && (\n <div className=\"py-1\">\n {menuItems.map((item) => {\n const isSkill = item.label === \"Create Skill\";\n return (\n <div\n key={item.label}\n className={cn(\"relative\", isSkill && \"group/skill\")}\n onMouseEnter={(e) => {\n if (isSkill) {\n openSkillFlyout(e.currentTarget);\n return;\n }\n if (!item.hoverAction) return;\n if (skillHoverTimerRef.current)\n window.clearTimeout(skillHoverTimerRef.current);\n skillHoverTimerRef.current = window.setTimeout(() => {\n item.hoverAction?.();\n }, 180);\n }}\n onMouseLeave={() => {\n if (isSkill) {\n scheduleSkillFlyoutClose();\n return;\n }\n if (skillHoverTimerRef.current) {\n window.clearTimeout(skillHoverTimerRef.current);\n skillHoverTimerRef.current = null;\n }\n }}\n >\n <button\n type=\"button\"\n onClick={item.action}\n className={cn(\n \"flex w-full items-center gap-2.5 px-3 py-2 text-start hover:bg-accent/50\",\n isSkill && skillFlyoutOpen && \"bg-accent/50\",\n )}\n >\n <span className=\"text-muted-foreground\">{item.icon}</span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-[12px] font-medium text-foreground\">\n {item.label}\n </div>\n <div className=\"mt-0.5 text-[10px] text-muted-foreground/60\">\n {item.desc}\n </div>\n </div>\n {isSkill && (\n <span className=\"ms-auto text-muted-foreground/60\">\n ›\n </span>\n )}\n </button>\n {isSkill && skillFlyoutOpen && (\n <div\n role=\"menu\"\n onMouseEnter={() => openSkillFlyout()}\n onMouseLeave={scheduleSkillFlyoutClose}\n className={cn(\n \"absolute top-0 z-20 w-[240px] rounded-lg border border-border bg-popover py-1 shadow-md\",\n skillFlyoutSide === \"right\"\n ? \"left-full ml-1\"\n : \"right-full mr-1\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => {\n onSelectMode?.(\"skill\");\n setSkillFlyoutOpen(false);\n setOpen(false);\n }}\n className=\"flex w-full items-center gap-2.5 px-3 py-2 text-start hover:bg-accent/50\"\n >\n <span className=\"text-muted-foreground\">\n <IconBulb className=\"h-3.5 w-3.5\" />\n </span>\n <div className=\"min-w-0\">\n <div className=\"text-[12px] font-medium text-foreground\">\n Create new skill\n </div>\n <div className=\"mt-0.5 text-[10px] text-muted-foreground/60\">\n Describe a skill and let the agent draft it\n </div>\n </div>\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setSkillFlyoutOpen(false);\n skillFileInputRef.current?.click();\n }}\n className=\"flex w-full items-center gap-2.5 px-3 py-2 text-start hover:bg-accent/50\"\n >\n <span className=\"text-muted-foreground\">\n <IconUpload className=\"h-3.5 w-3.5\" />\n </span>\n <div className=\"min-w-0\">\n <div className=\"text-[12px] font-medium text-foreground\">\n Upload skill file\n </div>\n <div className=\"mt-0.5 text-[10px] text-muted-foreground/60\">\n Import an existing SKILL.md file\n </div>\n </div>\n </button>\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {view === \"skill-upload\" && (\n <div className=\"p-3\">\n <button\n type=\"button\"\n onClick={() => setView(\"menu\")}\n className=\"mb-1.5 flex items-center gap-1 text-[11px] text-muted-foreground hover:text-foreground\"\n >\n <IconArrowLeft className=\"h-3 w-3 rtl:-scale-x-100\" />\n Back\n </button>\n <label className=\"mb-1 block text-[11px] font-semibold text-foreground\">\n Upload skill file\n </label>\n <p className=\"mb-2 text-[10px] leading-relaxed text-muted-foreground/60\">\n Review the content from{\" \"}\n <span className=\"font-mono\">\n {skillUploadFileName || \"the selected file\"}\n </span>{\" \"}\n before saving.\n </p>\n <label className=\"mb-1 block text-[10px] font-medium text-muted-foreground\">\n Skill name\n </label>\n <input\n value={skillUploadSlug}\n onChange={(e) => setSkillUploadSlug(e.target.value)}\n className=\"mb-2 w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[12px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent\"\n placeholder=\"my-skill\"\n />\n <p className=\"mb-2 text-[10px] text-muted-foreground/60\">\n Saved at{\" \"}\n <span className=\"font-mono\">\n skills/{slugifyName(skillUploadSlug || \"uploaded-skill\")}\n /SKILL.md\n </span>\n </p>\n <label className=\"mb-1 block text-[10px] font-medium text-muted-foreground\">\n Content\n </label>\n <textarea\n value={skillUploadContent}\n onChange={(e) => setSkillUploadContent(e.target.value)}\n rows={10}\n className=\"w-full rounded-md border border-border bg-background px-2.5 py-1.5 font-mono text-[11px] leading-relaxed text-foreground outline-none focus:ring-1 focus:ring-accent\"\n />\n {skillUploadStatus && (\n <div\n className={cn(\n \"mt-2 text-[11px] leading-snug\",\n skillUploadStatus.kind === \"ok\"\n ? \"text-green-600 dark:text-green-400\"\n : \"text-red-600 dark:text-red-400\",\n )}\n >\n {skillUploadStatus.message}\n </div>\n )}\n <div className=\"mt-2.5 flex justify-end gap-2\">\n <button\n type=\"button\"\n onClick={() => setView(\"menu\")}\n className=\"rounded-md px-3 py-1.5 text-[12px] font-medium text-muted-foreground hover:bg-accent/40\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={submitSkillUpload}\n disabled={\n skillUploadBusy ||\n !skillUploadContent.trim() ||\n !skillUploadSlug.trim()\n }\n className=\"rounded-md bg-accent px-3 py-1.5 text-[12px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40 disabled:pointer-events-none\"\n >\n {skillUploadBusy ? (\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n ) : (\n \"Save\"\n )}\n </button>\n </div>\n </div>\n )}\n </PopoverContent>\n </Popover>\n <McpIntegrationDialog\n open={mcpDialogOpen}\n onOpenChange={setMcpDialogOpen}\n defaultScope={defaultMcpScope}\n canCreateOrgMcp={canCreateOrgMcp}\n hasOrg={hasOrg}\n onCreateMcpServer={(args) => createMcp.mutateAsync(args)}\n />\n <AssetsPickerModal\n open={assetsPickerOpen}\n onOpenChange={setAssetsPickerOpen}\n />\n </>\n );\n}\n\nfunction AssetsPickerModal({\n open,\n onOpenChange,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const standaloneWindowRef = useRef<Window | null>(null);\n const [pickerReady, setPickerReady] = useState(false);\n const [standaloneHandoffId, setStandaloneHandoffId] = useState<string | null>(\n null,\n );\n const sourceUrl = useMemo(() => assetPickerUrl(), []);\n const externalPicker = useMemo(\n () =>\n typeof window !== \"undefined\" &&\n isExternalAssetPickerUrl(sourceUrl, window.location.origin),\n [sourceUrl],\n );\n const standaloneUrl = useMemo(\n () =>\n standaloneAssetPickerUrl(\n sourceUrl,\n typeof window !== \"undefined\" ? window.location.href : undefined,\n {\n handoffId: standaloneHandoffId ?? undefined,\n returnOrigin:\n typeof window !== \"undefined\" ? window.location.origin : undefined,\n },\n ),\n [sourceUrl, standaloneHandoffId],\n );\n const iframeUrl = useMemo(() => withEmbeddedParams(sourceUrl), [sourceUrl]);\n const targetOrigin = useMemo(() => assetPickerOrigin(iframeUrl), [iframeUrl]);\n const configurePicker = useCallback(() => {\n if (!targetOrigin) return;\n iframeRef.current?.contentWindow?.postMessage(\n embedEnvelope(\"message\", {\n name: \"configure\",\n payload: { mediaType: \"image\", count: 3 },\n }),\n targetOrigin,\n );\n }, [targetOrigin]);\n\n useEffect(() => {\n if (open) {\n setPickerReady(false);\n if (externalPicker) {\n standaloneWindowRef.current = null;\n setStandaloneHandoffId(createAssetPickerHandoffId());\n } else {\n setStandaloneHandoffId(null);\n }\n return;\n }\n if (!standaloneWindowRef.current) setStandaloneHandoffId(null);\n }, [externalPicker, iframeUrl, open]);\n\n useEffect(() => {\n if (\n !targetOrigin ||\n (!open && !standaloneWindowRef.current) ||\n (externalPicker && !standaloneHandoffId)\n )\n return;\n\n const handleMessage = (event: MessageEvent) => {\n const expectedSource = externalPicker\n ? standaloneWindowRef.current\n : iframeRef.current?.contentWindow;\n if (!expectedSource || event.source !== expectedSource) return;\n if (event.origin !== targetOrigin) return;\n if (!isEmbedEnvelope(event.data)) return;\n\n if (event.data.type === \"ready\") {\n setPickerReady(true);\n configurePicker();\n return;\n }\n\n if (event.data.type !== \"message\") return;\n if (externalPicker) {\n const payload = event.data.payload;\n const handoffId =\n payload && typeof payload === \"object\"\n ? assetString((payload as AssetPickerPayload).handoffId)\n : null;\n if (handoffId !== standaloneHandoffId) return;\n }\n if (event.data.name === \"close\") {\n onOpenChange(false);\n return;\n }\n if (\n event.data.name !== \"chooseImage\" &&\n event.data.name !== \"chooseAsset\"\n )\n return;\n\n const url = assetImageSource(event.data.payload);\n if (!url) return;\n const title = assetTitle(event.data.payload, url);\n const assetId =\n event.data.payload && typeof event.data.payload === \"object\"\n ? assetString((event.data.payload as AssetPickerPayload).assetId)\n : null;\n setAgentChatContextItem({\n key: `asset-image:${assetId ?? url}`,\n title: `Image: ${title}`,\n context: assetContext(event.data.payload, url),\n });\n standaloneWindowRef.current = null;\n setStandaloneHandoffId(null);\n onOpenChange(false);\n };\n\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") onOpenChange(false);\n };\n\n window.addEventListener(\"message\", handleMessage);\n window.addEventListener(\"keydown\", handleKey);\n return () => {\n window.removeEventListener(\"message\", handleMessage);\n window.removeEventListener(\"keydown\", handleKey);\n };\n }, [\n configurePicker,\n externalPicker,\n onOpenChange,\n open,\n standaloneHandoffId,\n targetOrigin,\n ]);\n\n const openStandalonePicker = useCallback(\n (event: React.MouseEvent<HTMLAnchorElement>) => {\n if (!standaloneHandoffId) return;\n event.preventDefault();\n const pickerWindow = window.open(standaloneUrl, \"_blank\");\n if (!pickerWindow) return;\n standaloneWindowRef.current = pickerWindow;\n onOpenChange(false);\n },\n [onOpenChange, standaloneHandoffId, standaloneUrl],\n );\n\n if (!open || typeof document === \"undefined\") return null;\n\n return createPortal(\n <div\n className=\"fixed inset-0 z-[280] flex items-center justify-center bg-black/50 p-3\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"composer-assets-picker-title\"\n onMouseDown={(event) => {\n if (event.target === event.currentTarget) onOpenChange(false);\n }}\n >\n <div className=\"flex h-[min(86vh,760px)] w-[min(96vw,1040px)] flex-col overflow-hidden rounded-xl border border-border bg-background shadow-2xl\">\n <div className=\"flex h-12 shrink-0 items-center justify-between border-b border-border px-4\">\n <div\n id=\"composer-assets-picker-title\"\n className=\"text-sm font-medium text-foreground\"\n >\n Generate image\n </div>\n <button\n type=\"button\"\n onClick={() => onOpenChange(false)}\n className=\"flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground\"\n aria-label=\"Close image picker\"\n >\n <IconX className=\"h-4 w-4\" />\n </button>\n </div>\n {externalPicker ? (\n <div className=\"flex min-h-0 flex-1 flex-col items-center justify-center gap-3 p-8 text-center\">\n <div className=\"max-w-md text-sm text-muted-foreground\">\n Open Assets in a new tab to sign in and choose an image securely.\n </div>\n <a\n href={standaloneUrl}\n target=\"_blank\"\n onClick={openStandalonePicker}\n className=\"inline-flex h-9 items-center justify-center rounded-md bg-primary px-4 text-sm font-medium text-primary-foreground hover:bg-primary/90\"\n >\n Open Assets image picker\n </a>\n </div>\n ) : targetOrigin ? (\n <div className=\"relative min-h-0 flex-1 overflow-hidden bg-background\">\n {!pickerReady && <AssetsPickerLoadingSkeleton />}\n <iframe\n ref={iframeRef}\n src={iframeUrl}\n title=\"Assets image picker\"\n className={cn(\n \"absolute inset-0 h-full w-full border-0 bg-background transition-opacity duration-150\",\n pickerReady ? \"opacity-100\" : \"pointer-events-none opacity-0\",\n )}\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups allow-downloads\"\n allow=\"clipboard-read; clipboard-write; microphone; fullscreen\"\n referrerPolicy=\"strict-origin-when-cross-origin\"\n onLoad={() => {\n configurePicker();\n setPickerReady(true);\n }}\n />\n </div>\n ) : (\n <div className=\"flex min-h-0 flex-1 items-center justify-center p-8 text-center text-sm text-muted-foreground\">\n The configured image picker URL is not valid.\n </div>\n )}\n </div>\n </div>,\n document.body,\n );\n}\n\nfunction AssetsPickerLoadingSkeleton() {\n return (\n <div\n className=\"absolute inset-0 flex flex-col gap-5 p-5\"\n role=\"status\"\n aria-label=\"Loading Assets picker\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"h-9 flex-1 animate-pulse rounded-md bg-muted\" />\n <div className=\"h-9 w-24 animate-pulse rounded-md bg-muted\" />\n </div>\n <div className=\"grid min-h-0 flex-1 grid-cols-2 gap-4 sm:grid-cols-3 lg:grid-cols-4\">\n {Array.from({ length: 8 }).map((_, index) => (\n <div key={index} className=\"flex min-w-0 flex-col gap-2\">\n <div className=\"aspect-square w-full animate-pulse rounded-lg bg-muted\" />\n <div className=\"h-3 w-3/4 animate-pulse rounded bg-muted\" />\n <div className=\"h-3 w-1/2 animate-pulse rounded bg-muted\" />\n </div>\n ))}\n </div>\n </div>\n );\n}\n"]}
@@ -1,29 +0,0 @@
1
- import React from "react";
2
- import type { MentionItem, SkillResult, SlashCommand } from "./types.js";
3
- export interface MentionPopoverRef {
4
- moveUp: () => void;
5
- moveDown: () => void;
6
- getSelectedIndex: () => number;
7
- getSelectedMention: () => MentionItem | null;
8
- getSelectedCommand: () => SlashCommand | null;
9
- }
10
- interface MentionPopoverProps {
11
- type: "@" | "/";
12
- position: {
13
- top: number;
14
- left: number;
15
- } | null;
16
- mentionItems: MentionItem[];
17
- skills: SkillResult[];
18
- commands?: SlashCommand[];
19
- hint?: string;
20
- isLoading: boolean;
21
- query: string;
22
- onSelectMention: (item: MentionItem) => void;
23
- onSelectSkill: (skill: SkillResult) => void;
24
- onSelectCommand?: (command: SlashCommand) => void;
25
- onClose: () => void;
26
- }
27
- export declare const MentionPopover: React.ForwardRefExoticComponent<MentionPopoverProps & React.RefAttributes<MentionPopoverRef>>;
28
- export {};
29
- //# sourceMappingURL=MentionPopover.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MentionPopover.d.ts","sourceRoot":"","sources":["../../../src/client/composer/MentionPopover.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAMN,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEzE,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,gBAAgB,EAAE,MAAM,MAAM,CAAC;IAC/B,kBAAkB,EAAE,MAAM,WAAW,GAAG,IAAI,CAAC;IAC7C,kBAAkB,EAAE,MAAM,YAAY,GAAG,IAAI,CAAC;CAC/C;AAED,UAAU,mBAAmB;IAC3B,IAAI,EAAE,GAAG,GAAG,GAAG,CAAC;IAChB,QAAQ,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC/C,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IAC7C,aAAa,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAC5C,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;IAClD,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AA4FD,eAAO,MAAM,cAAc,+FA6QzB,CAAC"}
@@ -1,180 +0,0 @@
1
- import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { IconFile, IconFolder, IconStack2, IconFileText, IconCheckbox, IconMail, IconUser, IconPresentation, IconMessageChatbot, IconTrash, IconPlus, IconHelp, IconHistory, IconTerminal2, IconClipboardList, IconPencil, } from "@tabler/icons-react";
3
- import React, { useState, useEffect, useRef, useImperativeHandle, forwardRef, } from "react";
4
- import { createPortal } from "react-dom";
5
- const iconProps = { size: 14, className: "shrink-0 text-muted-foreground" };
6
- function MentionItemIcon({ icon }) {
7
- switch (icon) {
8
- case "folder":
9
- return _jsx(IconFolder, { ...iconProps });
10
- case "document":
11
- return _jsx(IconFileText, { ...iconProps });
12
- case "form":
13
- return _jsx(IconCheckbox, { ...iconProps });
14
- case "email":
15
- return _jsx(IconMail, { ...iconProps });
16
- case "user":
17
- return _jsx(IconUser, { ...iconProps });
18
- case "deck":
19
- return _jsx(IconPresentation, { ...iconProps });
20
- case "agent":
21
- return _jsx(IconMessageChatbot, { ...iconProps });
22
- case "file":
23
- return _jsx(IconFile, { ...iconProps });
24
- default:
25
- return _jsx(IconFile, { ...iconProps });
26
- }
27
- }
28
- function CommandIcon({ icon }) {
29
- switch (icon) {
30
- case "clear":
31
- return _jsx(IconTrash, { ...iconProps });
32
- case "new":
33
- return _jsx(IconPlus, { ...iconProps });
34
- case "help":
35
- return _jsx(IconHelp, { ...iconProps });
36
- case "history":
37
- return _jsx(IconHistory, { ...iconProps });
38
- case "plan":
39
- return _jsx(IconClipboardList, { ...iconProps });
40
- case "act":
41
- return _jsx(IconPencil, { ...iconProps });
42
- default:
43
- return _jsx(IconTerminal2, { ...iconProps });
44
- }
45
- }
46
- function HintWithLink({ hint }) {
47
- // If hint contains a URL, split it and render the URL as a link
48
- const urlMatch = hint.match(/(https?:\/\/\S+)/);
49
- if (!urlMatch)
50
- return _jsx(_Fragment, { children: hint });
51
- const before = hint.slice(0, urlMatch.index);
52
- const url = urlMatch[1];
53
- return (_jsxs(_Fragment, { children: [before, _jsx("a", { href: url, target: "_blank", rel: "noopener noreferrer", className: "underline hover:text-foreground", children: "Learn more" })] }));
54
- }
55
- function LoadingSkeleton() {
56
- return (_jsx("div", { className: "space-y-1 p-1", children: [1, 2, 3].map((i) => (_jsxs("div", { className: "flex items-center gap-2 rounded px-2 py-1.5", children: [_jsx("div", { className: "h-3.5 w-3.5 rounded bg-muted animate-pulse" }), _jsx("div", { className: "h-3 rounded bg-muted animate-pulse", style: { width: `${60 + i * 20}px` } })] }, i))) }));
57
- }
58
- function LoadingSkeletonRow() {
59
- return (_jsxs("div", { className: "flex items-center gap-2 rounded px-2 py-1.5", children: [_jsx("div", { className: "h-3.5 w-3.5 rounded bg-muted animate-pulse" }), _jsx("div", { className: "h-3 w-24 rounded bg-muted animate-pulse" })] }));
60
- }
61
- export const MentionPopover = forwardRef(function MentionPopover(props, ref) {
62
- const { type, position, mentionItems, skills, commands = [], hint, isLoading, query, onSelectMention, onSelectSkill, onSelectCommand, onClose, } = props;
63
- const [selectedIndex, setSelectedIndex] = useState(0);
64
- const listRef = useRef(null);
65
- const itemCount = type === "@" ? mentionItems.length : commands.length + skills.length;
66
- // Group mention items by section for @ popover
67
- const groupedMentions = React.useMemo(() => {
68
- if (type !== "@")
69
- return [];
70
- const groups = new Map();
71
- for (const item of mentionItems) {
72
- const section = item.section || "Other";
73
- if (!groups.has(section))
74
- groups.set(section, []);
75
- groups.get(section).push(item);
76
- }
77
- // Sort: Agents first, then Connected Agents, then template-specific,
78
- // then Files, then Other
79
- const sorted = [];
80
- const knownSections = new Set([
81
- "Agents",
82
- "Connected Agents",
83
- "Files",
84
- "Other",
85
- ]);
86
- // Agents first
87
- if (groups.has("Agents")) {
88
- sorted.push({ section: "Agents", items: groups.get("Agents") });
89
- groups.delete("Agents");
90
- }
91
- if (groups.has("Connected Agents")) {
92
- sorted.push({
93
- section: "Connected Agents",
94
- items: groups.get("Connected Agents"),
95
- });
96
- groups.delete("Connected Agents");
97
- }
98
- // Template-specific sections (anything not in knownSections)
99
- for (const [section, items] of groups) {
100
- if (!knownSections.has(section)) {
101
- sorted.push({ section, items });
102
- }
103
- }
104
- // Files
105
- if (groups.has("Files")) {
106
- sorted.push({ section: "Files", items: groups.get("Files") });
107
- }
108
- // Other
109
- if (groups.has("Other")) {
110
- sorted.push({ section: "Other", items: groups.get("Other") });
111
- }
112
- return sorted;
113
- }, [type, mentionItems]);
114
- // Flat list of mention items in section order for keyboard index tracking
115
- const flatMentionItems = React.useMemo(() => {
116
- return groupedMentions.flatMap((g) => g.items);
117
- }, [groupedMentions]);
118
- // Reset selection when items change
119
- useEffect(() => {
120
- setSelectedIndex(0);
121
- }, [commands, mentionItems, skills, query]);
122
- // Scroll selected item into view
123
- useEffect(() => {
124
- const container = listRef.current;
125
- if (!container)
126
- return;
127
- // Find the actual item element by data attribute
128
- const selected = container.querySelector(`[data-mention-index="${selectedIndex}"]`);
129
- if (selected) {
130
- selected.scrollIntoView({ block: "nearest" });
131
- }
132
- }, [selectedIndex]);
133
- useImperativeHandle(ref, () => ({
134
- moveUp: () => {
135
- setSelectedIndex((prev) => prev <= 0 ? Math.max(0, itemCount - 1) : prev - 1);
136
- },
137
- moveDown: () => {
138
- setSelectedIndex((prev) => (prev >= itemCount - 1 ? 0 : prev + 1));
139
- },
140
- getSelectedIndex: () => selectedIndex,
141
- getSelectedMention: () => flatMentionItems[selectedIndex] ?? null,
142
- getSelectedCommand: () => {
143
- if (type !== "/" || selectedIndex >= commands.length)
144
- return null;
145
- return commands[selectedIndex] ?? null;
146
- },
147
- }));
148
- if (!position)
149
- return null;
150
- const content = (_jsxs(_Fragment, { children: [_jsx("div", { className: "fixed inset-0 z-[9998]", onClick: onClose }), _jsx("div", { "data-agent-native-composer-popover": "true", className: "fixed z-[9999] w-[320px] overflow-y-auto rounded-lg border border-border bg-popover shadow-lg", style: {
151
- bottom: `calc(100vh - ${position.top}px + 4px)`,
152
- left: Math.max(8, Math.min(position.left, window.innerWidth - 336)),
153
- maxHeight: Math.min(320, position.top - 8),
154
- }, children: isLoading && itemCount === 0 ? (_jsx(LoadingSkeleton, {})) : itemCount === 0 ? (_jsx("div", { className: "px-3 py-4 text-center text-xs text-muted-foreground", children: type === "@" ? (query ? ("No results found") : ("Type to search...")) : hint ? (_jsx(HintWithLink, { hint: hint })) : ("No skills available") })) : (_jsxs("div", { ref: listRef, className: "p-1", children: [isLoading && _jsx(LoadingSkeletonRow, {}), type === "@"
155
- ? (() => {
156
- let flatIndex = 0;
157
- return groupedMentions.map((group) => (_jsxs("div", { children: [_jsx("div", { className: "px-2 pt-2 pb-1 text-[10px] font-medium text-muted-foreground/70 uppercase tracking-wider", children: group.section }), group.items.map((item) => {
158
- const idx = flatIndex++;
159
- return (_jsxs("button", { "data-mention-index": idx, className: `flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm ${idx === selectedIndex
160
- ? "bg-accent text-accent-foreground"
161
- : "hover:bg-accent/50"}`, onMouseEnter: () => setSelectedIndex(idx), onClick: () => onSelectMention(item), children: [_jsx(MentionItemIcon, { icon: item.icon }), _jsx("span", { className: "truncate text-sm", children: item.label }), item.description && (_jsx("span", { className: "ms-auto shrink-0 truncate max-w-[160px] text-xs text-muted-foreground", children: item.description }))] }, item.id));
162
- })] }, group.section)));
163
- })()
164
- : (() => {
165
- let idx = 0;
166
- return (_jsxs(_Fragment, { children: [commands.length > 0 && (_jsxs("div", { children: [_jsx("div", { className: "px-2 pt-2 pb-1 text-[10px] font-medium text-muted-foreground/70 uppercase tracking-wider", children: "Commands" }), commands.map((cmd) => {
167
- const i = idx++;
168
- return (_jsxs("button", { "data-mention-index": i, className: `flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm ${i === selectedIndex
169
- ? "bg-accent text-accent-foreground"
170
- : "hover:bg-accent/50"}`, onMouseEnter: () => setSelectedIndex(i), onClick: () => onSelectCommand?.(cmd), children: [_jsx(CommandIcon, { icon: cmd.icon }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsxs("span", { className: "block truncate text-sm", children: ["/", cmd.name] }), cmd.description && (_jsx("span", { className: "block truncate text-xs text-muted-foreground", children: cmd.description }))] })] }, cmd.name));
171
- })] })), skills.length > 0 && (_jsxs("div", { children: [commands.length > 0 && (_jsx("div", { className: "px-2 pt-2 pb-1 text-[10px] font-medium text-muted-foreground/70 uppercase tracking-wider", children: "Skills" })), skills.map((skill) => {
172
- const i = idx++;
173
- return (_jsxs("button", { "data-mention-index": i, className: `flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm ${i === selectedIndex
174
- ? "bg-accent text-accent-foreground"
175
- : "hover:bg-accent/50"}`, onMouseEnter: () => setSelectedIndex(i), onClick: () => onSelectSkill(skill), children: [_jsx(IconStack2, { ...iconProps }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "block truncate text-sm", children: skill.name }), skill.description && (_jsx("span", { className: "block truncate text-xs text-muted-foreground", children: skill.description }))] })] }, skill.path));
176
- })] }))] }));
177
- })()] })) })] }));
178
- return createPortal(content, document.body);
179
- });
180
- //# sourceMappingURL=MentionPopover.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MentionPopover.js","sourceRoot":"","sources":["../../../src/client/composer/MentionPopover.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconFile,\n IconFolder,\n IconStack2,\n IconFileText,\n IconCheckbox,\n IconMail,\n IconUser,\n IconPresentation,\n IconMessageChatbot,\n IconTrash,\n IconPlus,\n IconHelp,\n IconHistory,\n IconTerminal2,\n IconClipboardList,\n IconPencil,\n} from \"@tabler/icons-react\";\nimport React, {\n useState,\n useEffect,\n useRef,\n useImperativeHandle,\n forwardRef,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport type { MentionItem, SkillResult, SlashCommand } from \"./types.js\";\n\nexport interface MentionPopoverRef {\n moveUp: () => void;\n moveDown: () => void;\n getSelectedIndex: () => number;\n getSelectedMention: () => MentionItem | null;\n getSelectedCommand: () => SlashCommand | null;\n}\n\ninterface MentionPopoverProps {\n type: \"@\" | \"/\";\n position: { top: number; left: number } | null;\n mentionItems: MentionItem[];\n skills: SkillResult[];\n commands?: SlashCommand[];\n hint?: string;\n isLoading: boolean;\n query: string;\n onSelectMention: (item: MentionItem) => void;\n onSelectSkill: (skill: SkillResult) => void;\n onSelectCommand?: (command: SlashCommand) => void;\n onClose: () => void;\n}\n\nconst iconProps = { size: 14, className: \"shrink-0 text-muted-foreground\" };\n\nfunction MentionItemIcon({ icon }: { icon?: string }) {\n switch (icon) {\n case \"folder\":\n return <IconFolder {...iconProps} />;\n case \"document\":\n return <IconFileText {...iconProps} />;\n case \"form\":\n return <IconCheckbox {...iconProps} />;\n case \"email\":\n return <IconMail {...iconProps} />;\n case \"user\":\n return <IconUser {...iconProps} />;\n case \"deck\":\n return <IconPresentation {...iconProps} />;\n case \"agent\":\n return <IconMessageChatbot {...iconProps} />;\n case \"file\":\n return <IconFile {...iconProps} />;\n default:\n return <IconFile {...iconProps} />;\n }\n}\n\nfunction CommandIcon({ icon }: { icon?: string }) {\n switch (icon) {\n case \"clear\":\n return <IconTrash {...iconProps} />;\n case \"new\":\n return <IconPlus {...iconProps} />;\n case \"help\":\n return <IconHelp {...iconProps} />;\n case \"history\":\n return <IconHistory {...iconProps} />;\n case \"plan\":\n return <IconClipboardList {...iconProps} />;\n case \"act\":\n return <IconPencil {...iconProps} />;\n default:\n return <IconTerminal2 {...iconProps} />;\n }\n}\n\nfunction HintWithLink({ hint }: { hint: string }) {\n // If hint contains a URL, split it and render the URL as a link\n const urlMatch = hint.match(/(https?:\\/\\/\\S+)/);\n if (!urlMatch) return <>{hint}</>;\n const before = hint.slice(0, urlMatch.index);\n const url = urlMatch[1];\n return (\n <>\n {before}\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"underline hover:text-foreground\"\n >\n Learn more\n </a>\n </>\n );\n}\n\nfunction LoadingSkeleton() {\n return (\n <div className=\"space-y-1 p-1\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"flex items-center gap-2 rounded px-2 py-1.5\">\n <div className=\"h-3.5 w-3.5 rounded bg-muted animate-pulse\" />\n <div\n className=\"h-3 rounded bg-muted animate-pulse\"\n style={{ width: `${60 + i * 20}px` }}\n />\n </div>\n ))}\n </div>\n );\n}\n\nfunction LoadingSkeletonRow() {\n return (\n <div className=\"flex items-center gap-2 rounded px-2 py-1.5\">\n <div className=\"h-3.5 w-3.5 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-24 rounded bg-muted animate-pulse\" />\n </div>\n );\n}\n\nexport const MentionPopover = forwardRef<\n MentionPopoverRef,\n MentionPopoverProps\n>(function MentionPopover(props, ref) {\n const {\n type,\n position,\n mentionItems,\n skills,\n commands = [],\n hint,\n isLoading,\n query,\n onSelectMention,\n onSelectSkill,\n onSelectCommand,\n onClose,\n } = props;\n\n const [selectedIndex, setSelectedIndex] = useState(0);\n const listRef = useRef<HTMLDivElement>(null);\n\n const itemCount =\n type === \"@\" ? mentionItems.length : commands.length + skills.length;\n\n // Group mention items by section for @ popover\n const groupedMentions = React.useMemo(() => {\n if (type !== \"@\") return [];\n const groups = new Map<string, MentionItem[]>();\n for (const item of mentionItems) {\n const section = item.section || \"Other\";\n if (!groups.has(section)) groups.set(section, []);\n groups.get(section)!.push(item);\n }\n // Sort: Agents first, then Connected Agents, then template-specific,\n // then Files, then Other\n const sorted: { section: string; items: MentionItem[] }[] = [];\n const knownSections = new Set([\n \"Agents\",\n \"Connected Agents\",\n \"Files\",\n \"Other\",\n ]);\n // Agents first\n if (groups.has(\"Agents\")) {\n sorted.push({ section: \"Agents\", items: groups.get(\"Agents\")! });\n groups.delete(\"Agents\");\n }\n if (groups.has(\"Connected Agents\")) {\n sorted.push({\n section: \"Connected Agents\",\n items: groups.get(\"Connected Agents\")!,\n });\n groups.delete(\"Connected Agents\");\n }\n // Template-specific sections (anything not in knownSections)\n for (const [section, items] of groups) {\n if (!knownSections.has(section)) {\n sorted.push({ section, items });\n }\n }\n // Files\n if (groups.has(\"Files\")) {\n sorted.push({ section: \"Files\", items: groups.get(\"Files\")! });\n }\n // Other\n if (groups.has(\"Other\")) {\n sorted.push({ section: \"Other\", items: groups.get(\"Other\")! });\n }\n return sorted;\n }, [type, mentionItems]);\n\n // Flat list of mention items in section order for keyboard index tracking\n const flatMentionItems = React.useMemo(() => {\n return groupedMentions.flatMap((g) => g.items);\n }, [groupedMentions]);\n\n // Reset selection when items change\n useEffect(() => {\n setSelectedIndex(0);\n }, [commands, mentionItems, skills, query]);\n\n // Scroll selected item into view\n useEffect(() => {\n const container = listRef.current;\n if (!container) return;\n // Find the actual item element by data attribute\n const selected = container.querySelector(\n `[data-mention-index=\"${selectedIndex}\"]`,\n ) as HTMLElement | undefined;\n if (selected) {\n selected.scrollIntoView({ block: \"nearest\" });\n }\n }, [selectedIndex]);\n\n useImperativeHandle(ref, () => ({\n moveUp: () => {\n setSelectedIndex((prev) =>\n prev <= 0 ? Math.max(0, itemCount - 1) : prev - 1,\n );\n },\n moveDown: () => {\n setSelectedIndex((prev) => (prev >= itemCount - 1 ? 0 : prev + 1));\n },\n getSelectedIndex: () => selectedIndex,\n getSelectedMention: () => flatMentionItems[selectedIndex] ?? null,\n getSelectedCommand: () => {\n if (type !== \"/\" || selectedIndex >= commands.length) return null;\n return commands[selectedIndex] ?? null;\n },\n }));\n\n if (!position) return null;\n\n const content = (\n <>\n {/* Backdrop to capture outside clicks */}\n <div className=\"fixed inset-0 z-[9998]\" onClick={onClose} />\n <div\n data-agent-native-composer-popover=\"true\"\n className=\"fixed z-[9999] w-[320px] overflow-y-auto rounded-lg border border-border bg-popover shadow-lg\"\n style={{\n bottom: `calc(100vh - ${position.top}px + 4px)`,\n left: Math.max(8, Math.min(position.left, window.innerWidth - 336)),\n maxHeight: Math.min(320, position.top - 8),\n }}\n >\n {isLoading && itemCount === 0 ? (\n <LoadingSkeleton />\n ) : itemCount === 0 ? (\n <div className=\"px-3 py-4 text-center text-xs text-muted-foreground\">\n {type === \"@\" ? (\n query ? (\n \"No results found\"\n ) : (\n \"Type to search...\"\n )\n ) : hint ? (\n <HintWithLink hint={hint} />\n ) : (\n \"No skills available\"\n )}\n </div>\n ) : (\n <div ref={listRef} className=\"p-1\">\n {isLoading && <LoadingSkeletonRow />}\n {type === \"@\"\n ? (() => {\n let flatIndex = 0;\n return groupedMentions.map((group) => (\n <div key={group.section}>\n <div className=\"px-2 pt-2 pb-1 text-[10px] font-medium text-muted-foreground/70 uppercase tracking-wider\">\n {group.section}\n </div>\n {group.items.map((item) => {\n const idx = flatIndex++;\n return (\n <button\n key={item.id}\n data-mention-index={idx}\n className={`flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm ${\n idx === selectedIndex\n ? \"bg-accent text-accent-foreground\"\n : \"hover:bg-accent/50\"\n }`}\n onMouseEnter={() => setSelectedIndex(idx)}\n onClick={() => onSelectMention(item)}\n >\n <MentionItemIcon icon={item.icon} />\n <span className=\"truncate text-sm\">\n {item.label}\n </span>\n {item.description && (\n <span className=\"ms-auto shrink-0 truncate max-w-[160px] text-xs text-muted-foreground\">\n {item.description}\n </span>\n )}\n </button>\n );\n })}\n </div>\n ));\n })()\n : (() => {\n let idx = 0;\n return (\n <>\n {commands.length > 0 && (\n <div>\n <div className=\"px-2 pt-2 pb-1 text-[10px] font-medium text-muted-foreground/70 uppercase tracking-wider\">\n Commands\n </div>\n {commands.map((cmd) => {\n const i = idx++;\n return (\n <button\n key={cmd.name}\n data-mention-index={i}\n className={`flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm ${\n i === selectedIndex\n ? \"bg-accent text-accent-foreground\"\n : \"hover:bg-accent/50\"\n }`}\n onMouseEnter={() => setSelectedIndex(i)}\n onClick={() => onSelectCommand?.(cmd)}\n >\n <CommandIcon icon={cmd.icon} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm\">\n /{cmd.name}\n </span>\n {cmd.description && (\n <span className=\"block truncate text-xs text-muted-foreground\">\n {cmd.description}\n </span>\n )}\n </span>\n </button>\n );\n })}\n </div>\n )}\n {skills.length > 0 && (\n <div>\n {commands.length > 0 && (\n <div className=\"px-2 pt-2 pb-1 text-[10px] font-medium text-muted-foreground/70 uppercase tracking-wider\">\n Skills\n </div>\n )}\n {(skills as SkillResult[]).map((skill) => {\n const i = idx++;\n return (\n <button\n key={skill.path}\n data-mention-index={i}\n className={`flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm ${\n i === selectedIndex\n ? \"bg-accent text-accent-foreground\"\n : \"hover:bg-accent/50\"\n }`}\n onMouseEnter={() => setSelectedIndex(i)}\n onClick={() => onSelectSkill(skill)}\n >\n <IconStack2 {...iconProps} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm\">\n {skill.name}\n </span>\n {skill.description && (\n <span className=\"block truncate text-xs text-muted-foreground\">\n {skill.description}\n </span>\n )}\n </span>\n </button>\n );\n })}\n </div>\n )}\n </>\n );\n })()}\n </div>\n )}\n </div>\n </>\n );\n\n return createPortal(content, document.body);\n});\n"]}
@@ -1,9 +0,0 @@
1
- import type { Attachment } from "@assistant-ui/react";
2
- export interface PastedTextChipProps {
3
- attachment: Attachment;
4
- onRemove?: (id: string) => void;
5
- /** Compact variant rendered inside sent user messages. */
6
- compact?: boolean;
7
- }
8
- export declare function PastedTextChip({ attachment, onRemove, compact, }: PastedTextChipProps): import("react").JSX.Element;
9
- //# sourceMappingURL=PastedTextChip.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PastedTextChip.d.ts","sourceRoot":"","sources":["../../../src/client/composer/PastedTextChip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AA8CtD,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,0DAA0D;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,cAAc,CAAC,EAC7B,UAAU,EACV,QAAQ,EACR,OAAe,GAChB,EAAE,mBAAmB,+BA4FrB"}
@@ -1,47 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import * as PopoverPrimitive from "@radix-ui/react-popover";
3
- import { IconClipboardText, IconX } from "@tabler/icons-react";
4
- import { useCallback, useEffect, useState } from "react";
5
- import { cn } from "../utils.js";
6
- import { countLines, unwrapAttachmentEnvelope } from "./pasted-text.js";
7
- function readAttachmentText(attachment) {
8
- if ("file" in attachment && attachment.file instanceof File) {
9
- return attachment.file.text();
10
- }
11
- const textPart = attachment.content?.find((p) => p.type === "text" && "text" in p && typeof p.text === "string");
12
- return textPart ? unwrapAttachmentEnvelope(textPart.text) : "";
13
- }
14
- function usePastedAttachmentText(attachment) {
15
- const [text, setText] = useState("");
16
- useEffect(() => {
17
- let cancelled = false;
18
- const result = readAttachmentText(attachment);
19
- if (typeof result === "string") {
20
- setText(result);
21
- return;
22
- }
23
- result
24
- .then((value) => {
25
- if (!cancelled)
26
- setText(value);
27
- })
28
- .catch(() => { });
29
- return () => {
30
- cancelled = true;
31
- };
32
- }, [attachment]);
33
- return { text, lines: countLines(text), chars: text.length };
34
- }
35
- export function PastedTextChip({ attachment, onRemove, compact = false, }) {
36
- const [open, setOpen] = useState(false);
37
- const { text, lines, chars } = usePastedAttachmentText(attachment);
38
- const handleRemove = useCallback((event) => {
39
- event.stopPropagation();
40
- onRemove?.(attachment.id);
41
- }, [attachment.id, onRemove]);
42
- const summary = lines > 0 ? `${lines} lines` : `${chars} chars`;
43
- return (_jsxs(PopoverPrimitive.Root, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverPrimitive.Trigger, { asChild: true, children: _jsxs("button", { type: "button", className: cn("group relative inline-flex items-center gap-2 rounded-md border border-border/70 bg-muted/50 text-start text-foreground hover:bg-muted/70 cursor-pointer", compact
44
- ? "max-w-[220px] px-2 py-1.5 text-xs"
45
- : "max-w-[260px] px-2.5 py-2 text-xs", onRemove && !compact && "pe-7"), "aria-label": "Preview pasted text", children: [_jsx("span", { className: cn("flex shrink-0 items-center justify-center rounded bg-background text-muted-foreground", compact ? "h-6 w-6" : "h-8 w-8"), children: _jsx(IconClipboardText, { className: compact ? "h-3.5 w-3.5" : "h-4 w-4" }) }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "block truncate font-medium", children: "Pasted text" }), _jsx("span", { className: "block text-[11px] text-muted-foreground", children: summary })] }), onRemove && (_jsx("span", { role: "button", tabIndex: -1, onClick: handleRemove, "aria-label": "Remove pasted text", className: cn("flex h-5 w-5 shrink-0 cursor-pointer items-center justify-center rounded text-muted-foreground hover:text-foreground", compact ? "" : "absolute end-1.5 top-1.5"), children: _jsx(IconX, { className: "h-3 w-3" }) }))] }) }), _jsx(PopoverPrimitive.Portal, { children: _jsxs(PopoverPrimitive.Content, { side: "top", align: "start", sideOffset: 6, collisionPadding: 12, className: "z-50 w-[min(560px,calc(100vw-32px))] rounded-lg border border-border bg-popover text-popover-foreground shadow-lg origin-[var(--radix-popover-content-transform-origin)] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0 data-[state=open]:zoom-in-95 data-[state=closed]:zoom-out-95", children: [_jsxs("div", { className: "flex items-center justify-between gap-2 border-b border-border px-3 py-2", children: [_jsxs("div", { className: "flex items-center gap-2 min-w-0", children: [_jsx(IconClipboardText, { className: "h-4 w-4 shrink-0 text-muted-foreground" }), _jsx("span", { className: "text-sm font-medium truncate", children: "Pasted text" }), _jsxs("span", { className: "text-[11px] text-muted-foreground shrink-0", children: [lines, " lines \u00B7 ", chars, " chars"] })] }), _jsx("button", { type: "button", onClick: () => setOpen(false), "aria-label": "Close preview", className: "flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center rounded text-muted-foreground hover:text-foreground", children: _jsx(IconX, { className: "h-3.5 w-3.5" }) })] }), _jsx("pre", { className: "max-h-[60vh] overflow-auto px-3 py-2 text-[12px] leading-[1.5] whitespace-pre-wrap break-words font-mono text-foreground", children: text })] }) })] }));
46
- }
47
- //# sourceMappingURL=PastedTextChip.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PastedTextChip.js","sourceRoot":"","sources":["../../../src/client/composer/PastedTextChip.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { Attachment } from \"@assistant-ui/react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { IconClipboardText, IconX } from \"@tabler/icons-react\";\nimport { useCallback, useEffect, useState } from \"react\";\n\nimport { cn } from \"../utils.js\";\nimport { countLines, unwrapAttachmentEnvelope } from \"./pasted-text.js\";\n\nfunction readAttachmentText(attachment: Attachment): Promise<string> | string {\n if (\"file\" in attachment && attachment.file instanceof File) {\n return attachment.file.text();\n }\n const textPart = attachment.content?.find(\n (p): p is { type: \"text\"; text: string } =>\n p.type === \"text\" && \"text\" in p && typeof p.text === \"string\",\n );\n return textPart ? unwrapAttachmentEnvelope(textPart.text) : \"\";\n}\n\nfunction usePastedAttachmentText(attachment: Attachment): {\n text: string;\n lines: number;\n chars: number;\n} {\n const [text, setText] = useState(\"\");\n\n useEffect(() => {\n let cancelled = false;\n const result = readAttachmentText(attachment);\n if (typeof result === \"string\") {\n setText(result);\n return;\n }\n result\n .then((value) => {\n if (!cancelled) setText(value);\n })\n .catch(() => {});\n return () => {\n cancelled = true;\n };\n }, [attachment]);\n\n return { text, lines: countLines(text), chars: text.length };\n}\n\nexport interface PastedTextChipProps {\n attachment: Attachment;\n onRemove?: (id: string) => void;\n /** Compact variant rendered inside sent user messages. */\n compact?: boolean;\n}\n\nexport function PastedTextChip({\n attachment,\n onRemove,\n compact = false,\n}: PastedTextChipProps) {\n const [open, setOpen] = useState(false);\n const { text, lines, chars } = usePastedAttachmentText(attachment);\n\n const handleRemove = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation();\n onRemove?.(attachment.id);\n },\n [attachment.id, onRemove],\n );\n\n const summary = lines > 0 ? `${lines} lines` : `${chars} chars`;\n\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <PopoverPrimitive.Trigger asChild>\n <button\n type=\"button\"\n className={cn(\n \"group relative inline-flex items-center gap-2 rounded-md border border-border/70 bg-muted/50 text-start text-foreground hover:bg-muted/70 cursor-pointer\",\n compact\n ? \"max-w-[220px] px-2 py-1.5 text-xs\"\n : \"max-w-[260px] px-2.5 py-2 text-xs\",\n onRemove && !compact && \"pe-7\",\n )}\n aria-label=\"Preview pasted text\"\n >\n <span\n className={cn(\n \"flex shrink-0 items-center justify-center rounded bg-background text-muted-foreground\",\n compact ? \"h-6 w-6\" : \"h-8 w-8\",\n )}\n >\n <IconClipboardText\n className={compact ? \"h-3.5 w-3.5\" : \"h-4 w-4\"}\n />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate font-medium\">Pasted text</span>\n <span className=\"block text-[11px] text-muted-foreground\">\n {summary}\n </span>\n </span>\n {onRemove && (\n <span\n role=\"button\"\n tabIndex={-1}\n onClick={handleRemove}\n aria-label=\"Remove pasted text\"\n className={cn(\n \"flex h-5 w-5 shrink-0 cursor-pointer items-center justify-center rounded text-muted-foreground hover:text-foreground\",\n compact ? \"\" : \"absolute end-1.5 top-1.5\",\n )}\n >\n <IconX className=\"h-3 w-3\" />\n </span>\n )}\n </button>\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n side=\"top\"\n align=\"start\"\n sideOffset={6}\n collisionPadding={12}\n className=\"z-50 w-[min(560px,calc(100vw-32px))] rounded-lg border border-border bg-popover text-popover-foreground shadow-lg origin-[var(--radix-popover-content-transform-origin)] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0 data-[state=open]:zoom-in-95 data-[state=closed]:zoom-out-95\"\n >\n <div className=\"flex items-center justify-between gap-2 border-b border-border px-3 py-2\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <IconClipboardText className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"text-sm font-medium truncate\">Pasted text</span>\n <span className=\"text-[11px] text-muted-foreground shrink-0\">\n {lines} lines · {chars} chars\n </span>\n </div>\n <button\n type=\"button\"\n onClick={() => setOpen(false)}\n aria-label=\"Close preview\"\n className=\"flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center rounded text-muted-foreground hover:text-foreground\"\n >\n <IconX className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n <pre className=\"max-h-[60vh] overflow-auto px-3 py-2 text-[12px] leading-[1.5] whitespace-pre-wrap break-words font-mono text-foreground\">\n {text}\n </pre>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n}\n"]}