@messenger-box/tailwind-ui-inbox 10.0.3-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (415) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/LICENSE +21 -0
  3. package/jest.config.js +9 -0
  4. package/lib/cdm-locales/en/translations.json +31 -0
  5. package/lib/cdm-locales/es/translations.json +31 -0
  6. package/lib/components/AIAgent/AIAgent.d.ts +32 -0
  7. package/lib/components/AIAgent/AIAgent.d.ts.map +1 -0
  8. package/lib/components/AIAgent/AIAgent.js +1135 -0
  9. package/lib/components/AIAgent/AIAgent.js.map +1 -0
  10. package/lib/components/AIAgent/InputComponent.d.ts +84 -0
  11. package/lib/components/AIAgent/InputComponent.d.ts.map +1 -0
  12. package/lib/components/AIAgent/InputComponent.js +417 -0
  13. package/lib/components/AIAgent/InputComponent.js.map +1 -0
  14. package/lib/components/AIAgent/index.d.ts +2 -0
  15. package/lib/components/AIAgent/index.d.ts.map +1 -0
  16. package/lib/components/InboxMessage/CommonMessage.d.ts +8 -0
  17. package/lib/components/InboxMessage/CommonMessage.d.ts.map +1 -0
  18. package/lib/components/InboxMessage/CommonMessage.js +35 -0
  19. package/lib/components/InboxMessage/CommonMessage.js.map +1 -0
  20. package/lib/components/InboxMessage/ConversationItem.d.ts +14 -0
  21. package/lib/components/InboxMessage/ConversationItem.d.ts.map +1 -0
  22. package/lib/components/InboxMessage/ConversationItem.js +200 -0
  23. package/lib/components/InboxMessage/ConversationItem.js.map +1 -0
  24. package/lib/components/InboxMessage/InputComponent.d.ts +20 -0
  25. package/lib/components/InboxMessage/InputComponent.d.ts.map +1 -0
  26. package/lib/components/InboxMessage/InputComponent.js +148 -0
  27. package/lib/components/InboxMessage/InputComponent.js.map +1 -0
  28. package/lib/components/InboxMessage/LeftSidebar.d.ts +20 -0
  29. package/lib/components/InboxMessage/LeftSidebar.d.ts.map +1 -0
  30. package/lib/components/InboxMessage/LeftSidebar.js +102 -0
  31. package/lib/components/InboxMessage/LeftSidebar.js.map +1 -0
  32. package/lib/components/InboxMessage/MessageInput.d.ts +9 -0
  33. package/lib/components/InboxMessage/MessageInput.d.ts.map +1 -0
  34. package/lib/components/InboxMessage/MessageInput.js +154 -0
  35. package/lib/components/InboxMessage/MessageInput.js.map +1 -0
  36. package/lib/components/InboxMessage/MessageInputComponent.d.ts +9 -0
  37. package/lib/components/InboxMessage/MessageInputComponent.d.ts.map +1 -0
  38. package/lib/components/InboxMessage/Messages.d.ts +17 -0
  39. package/lib/components/InboxMessage/Messages.d.ts.map +1 -0
  40. package/lib/components/InboxMessage/Messages.js +99 -0
  41. package/lib/components/InboxMessage/Messages.js.map +1 -0
  42. package/lib/components/InboxMessage/MessagesBuilderUi.d.ts +17 -0
  43. package/lib/components/InboxMessage/MessagesBuilderUi.d.ts.map +1 -0
  44. package/lib/components/InboxMessage/Popover.d.ts +3 -0
  45. package/lib/components/InboxMessage/Popover.d.ts.map +1 -0
  46. package/lib/components/InboxMessage/Popover.js +31 -0
  47. package/lib/components/InboxMessage/Popover.js.map +1 -0
  48. package/lib/components/InboxMessage/RightSidebar.d.ts +9 -0
  49. package/lib/components/InboxMessage/RightSidebar.d.ts.map +1 -0
  50. package/lib/components/InboxMessage/RightSidebar.js +9 -0
  51. package/lib/components/InboxMessage/RightSidebar.js.map +1 -0
  52. package/lib/components/InboxMessage/RightSidebarAi.d.ts +37 -0
  53. package/lib/components/InboxMessage/RightSidebarAi.d.ts.map +1 -0
  54. package/lib/components/InboxMessage/RightSidebarAi.js +9 -0
  55. package/lib/components/InboxMessage/RightSidebarAi.js.map +1 -0
  56. package/lib/components/InboxMessage/ServiceConversationItem.d.ts +12 -0
  57. package/lib/components/InboxMessage/ServiceConversationItem.d.ts.map +1 -0
  58. package/lib/components/InboxMessage/ServiceConversationItem.js +185 -0
  59. package/lib/components/InboxMessage/ServiceConversationItem.js.map +1 -0
  60. package/lib/components/InboxMessage/ServiceInboxItem.d.ts +12 -0
  61. package/lib/components/InboxMessage/ServiceInboxItem.d.ts.map +1 -0
  62. package/lib/components/InboxMessage/ServiceInboxItem.js +182 -0
  63. package/lib/components/InboxMessage/ServiceInboxItem.js.map +1 -0
  64. package/lib/components/InboxMessage/StreamingMessageBubble.d.ts +18 -0
  65. package/lib/components/InboxMessage/StreamingMessageBubble.d.ts.map +1 -0
  66. package/lib/components/InboxMessage/SubscriptionHandler.d.ts +19 -0
  67. package/lib/components/InboxMessage/SubscriptionHandler.d.ts.map +1 -0
  68. package/lib/components/InboxMessage/SubscriptionHandler.js +41 -0
  69. package/lib/components/InboxMessage/SubscriptionHandler.js.map +1 -0
  70. package/lib/components/InboxMessage/TypingIndicator.d.ts +11 -0
  71. package/lib/components/InboxMessage/TypingIndicator.d.ts.map +1 -0
  72. package/lib/components/InboxMessage/UploadImageButton.d.ts +7 -0
  73. package/lib/components/InboxMessage/UploadImageButton.d.ts.map +1 -0
  74. package/lib/components/InboxMessage/UploadImageButton.js +30 -0
  75. package/lib/components/InboxMessage/UploadImageButton.js.map +1 -0
  76. package/lib/components/InboxMessage/UserModalContent.d.ts +3 -0
  77. package/lib/components/InboxMessage/UserModalContent.d.ts.map +1 -0
  78. package/lib/components/InboxMessage/UserModalContent.js +60 -0
  79. package/lib/components/InboxMessage/UserModalContent.js.map +1 -0
  80. package/lib/components/InboxMessage/index.d.ts +19 -0
  81. package/lib/components/InboxMessage/index.d.ts.map +1 -0
  82. package/lib/components/InboxMessage/message-widgets/CommonMessage.d.ts +11 -0
  83. package/lib/components/InboxMessage/message-widgets/CommonMessage.d.ts.map +1 -0
  84. package/lib/components/InboxMessage/message-widgets/CommonMessage.js +44 -0
  85. package/lib/components/InboxMessage/message-widgets/CommonMessage.js.map +1 -0
  86. package/lib/components/InboxMessage/message-widgets/ErrorFixCard.d.ts +10 -0
  87. package/lib/components/InboxMessage/message-widgets/ErrorFixCard.d.ts.map +1 -0
  88. package/lib/components/InboxMessage/message-widgets/ErrorFixCard.js +194 -0
  89. package/lib/components/InboxMessage/message-widgets/ErrorFixCard.js.map +1 -0
  90. package/lib/components/InboxMessage/message-widgets/MessageCard.d.ts +8 -0
  91. package/lib/components/InboxMessage/message-widgets/MessageCard.d.ts.map +1 -0
  92. package/lib/components/InboxMessage/message-widgets/MessageSliceRenderer.d.ts +12 -0
  93. package/lib/components/InboxMessage/message-widgets/MessageSliceRenderer.d.ts.map +1 -0
  94. package/lib/components/InboxMessage/message-widgets/MessageSliceRenderer.js +37 -0
  95. package/lib/components/InboxMessage/message-widgets/MessageSliceRenderer.js.map +1 -0
  96. package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.d.ts +42 -0
  97. package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.d.ts.map +1 -0
  98. package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.js +1339 -0
  99. package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.js.map +1 -0
  100. package/lib/components/InboxMessage/message-widgets/PlainMessage.d.ts +8 -0
  101. package/lib/components/InboxMessage/message-widgets/PlainMessage.d.ts.map +1 -0
  102. package/lib/components/InboxMessage/message-widgets/PlainMessage.js +14 -0
  103. package/lib/components/InboxMessage/message-widgets/PlainMessage.js.map +1 -0
  104. package/lib/components/InboxMessage/message-widgets/PropertyMessageWidget.d.ts +9 -0
  105. package/lib/components/InboxMessage/message-widgets/PropertyMessageWidget.d.ts.map +1 -0
  106. package/lib/components/InboxMessage/message-widgets/SlackLikeMessageGroup.d.ts +14 -0
  107. package/lib/components/InboxMessage/message-widgets/SlackLikeMessageGroup.d.ts.map +1 -0
  108. package/lib/components/InboxMessage/message-widgets/SlackLikeMessageGroup.js +333 -0
  109. package/lib/components/InboxMessage/message-widgets/SlackLikeMessageGroup.js.map +1 -0
  110. package/lib/components/InboxMessage/message-widgets/index.d.ts +4 -0
  111. package/lib/components/InboxMessage/message-widgets/index.d.ts.map +1 -0
  112. package/lib/components/ModelConfigPanel.d.ts +74 -0
  113. package/lib/components/ModelConfigPanel.d.ts.map +1 -0
  114. package/lib/components/ModelConfigPanel.js +1152 -0
  115. package/lib/components/ModelConfigPanel.js.map +1 -0
  116. package/lib/components/filler-components/RightSiderBar.d.ts +3 -0
  117. package/lib/components/filler-components/RightSiderBar.d.ts.map +1 -0
  118. package/lib/components/filler-components/RightSiderBar.js +532 -0
  119. package/lib/components/filler-components/RightSiderBar.js.map +1 -0
  120. package/lib/components/inbox/FilesList.d.ts +20 -0
  121. package/lib/components/inbox/FilesList.d.ts.map +1 -0
  122. package/lib/components/inbox/FilesList.js +68 -0
  123. package/lib/components/inbox/FilesList.js.map +1 -0
  124. package/lib/components/inbox/MessageItem.d.ts +17 -0
  125. package/lib/components/inbox/MessageItem.d.ts.map +1 -0
  126. package/lib/components/inbox/MessageItem.js +50 -0
  127. package/lib/components/inbox/MessageItem.js.map +1 -0
  128. package/lib/components/inbox/ThreadItem.d.ts +11 -0
  129. package/lib/components/inbox/ThreadItem.d.ts.map +1 -0
  130. package/lib/components/inbox/ThreadItem.js +147 -0
  131. package/lib/components/inbox/ThreadItem.js.map +1 -0
  132. package/lib/components/inbox/index.d.ts +4 -0
  133. package/lib/components/inbox/index.d.ts.map +1 -0
  134. package/lib/components/index.d.ts +10 -0
  135. package/lib/components/index.d.ts.map +1 -0
  136. package/lib/components/live-code-editor/hybrid-live-editor.d.ts +20 -0
  137. package/lib/components/live-code-editor/hybrid-live-editor.d.ts.map +1 -0
  138. package/lib/components/live-code-editor/index.d.ts +4 -0
  139. package/lib/components/live-code-editor/index.d.ts.map +1 -0
  140. package/lib/components/live-code-editor/live-code-editor.d.ts +14 -0
  141. package/lib/components/live-code-editor/live-code-editor.d.ts.map +1 -0
  142. package/lib/components/messages-container-ui/MessagesContainerUI.d.ts +81 -0
  143. package/lib/components/messages-container-ui/MessagesContainerUI.d.ts.map +1 -0
  144. package/lib/components/messages-container-ui/MessagesContainerUI.js +77 -0
  145. package/lib/components/messages-container-ui/MessagesContainerUI.js.map +1 -0
  146. package/lib/components/messages-container-ui/PlanModeView.d.ts +82 -0
  147. package/lib/components/messages-container-ui/PlanModeView.d.ts.map +1 -0
  148. package/lib/components/messages-container-ui/PlanModeView.js +267 -0
  149. package/lib/components/messages-container-ui/PlanModeView.js.map +1 -0
  150. package/lib/components/messages-container-ui/index.d.ts +6 -0
  151. package/lib/components/messages-container-ui/index.d.ts.map +1 -0
  152. package/lib/components/messages-container-ui/types.d.ts +38 -0
  153. package/lib/components/messages-container-ui/types.d.ts.map +1 -0
  154. package/lib/components/slot-fill/chat-message-filler.d.ts +4 -0
  155. package/lib/components/slot-fill/chat-message-filler.d.ts.map +1 -0
  156. package/lib/components/slot-fill/chat-message-filler.js +5 -0
  157. package/lib/components/slot-fill/chat-message-filler.js.map +1 -0
  158. package/lib/components/slot-fill/chat-message-slot.d.ts +11 -0
  159. package/lib/components/slot-fill/chat-message-slot.d.ts.map +1 -0
  160. package/lib/components/slot-fill/chat-message-slot.js +6 -0
  161. package/lib/components/slot-fill/chat-message-slot.js.map +1 -0
  162. package/lib/components/slot-fill/index.d.ts +4 -0
  163. package/lib/components/slot-fill/index.d.ts.map +1 -0
  164. package/lib/components/slot-fill/right-sidebar-filler.d.ts +4 -0
  165. package/lib/components/slot-fill/right-sidebar-filler.d.ts.map +1 -0
  166. package/lib/components/slot-fill/right-sidebar-filler.js +13 -0
  167. package/lib/components/slot-fill/right-sidebar-filler.js.map +1 -0
  168. package/lib/components/ui/button.d.ts +9 -0
  169. package/lib/components/ui/button.d.ts.map +1 -0
  170. package/lib/compute.d.ts +8 -0
  171. package/lib/compute.d.ts.map +1 -0
  172. package/lib/compute.js +264 -0
  173. package/lib/compute.js.map +1 -0
  174. package/lib/config/env-config.d.ts +20 -0
  175. package/lib/config/env-config.d.ts.map +1 -0
  176. package/lib/config/env-config.js +55 -0
  177. package/lib/config/env-config.js.map +1 -0
  178. package/lib/config/index.d.ts +2 -0
  179. package/lib/config/index.d.ts.map +1 -0
  180. package/lib/constants/breakpoints.d.ts +8 -0
  181. package/lib/constants/breakpoints.d.ts.map +1 -0
  182. package/lib/constants/index.d.ts +3 -0
  183. package/lib/constants/index.d.ts.map +1 -0
  184. package/lib/container/AiInbox.d.ts +15 -0
  185. package/lib/container/AiInbox.d.ts.map +1 -0
  186. package/lib/container/AiInboxWithLoader.d.ts +36 -0
  187. package/lib/container/AiInboxWithLoader.d.ts.map +1 -0
  188. package/lib/container/AiLandingInput.d.ts +27 -0
  189. package/lib/container/AiLandingInput.d.ts.map +1 -0
  190. package/lib/container/AiLandingInput.js +149 -0
  191. package/lib/container/AiLandingInput.js.map +1 -0
  192. package/lib/container/Inbox.d.ts +15 -0
  193. package/lib/container/Inbox.d.ts.map +1 -0
  194. package/lib/container/Inbox.js +964 -0
  195. package/lib/container/Inbox.js.map +1 -0
  196. package/lib/container/InboxAiMessagesLoader.d.ts +45 -0
  197. package/lib/container/InboxAiMessagesLoader.d.ts.map +1 -0
  198. package/lib/container/InboxAiMessagesLoader.js +80 -0
  199. package/lib/container/InboxAiMessagesLoader.js.map +1 -0
  200. package/lib/container/InboxContainer.d.ts +41 -0
  201. package/lib/container/InboxContainer.d.ts.map +1 -0
  202. package/lib/container/InboxContainer.js +27 -0
  203. package/lib/container/InboxContainer.js.map +1 -0
  204. package/lib/container/InboxTemplate1.d.ts +15 -0
  205. package/lib/container/InboxTemplate1.d.ts.map +1 -0
  206. package/lib/container/InboxTemplate1WithLoader.d.ts +36 -0
  207. package/lib/container/InboxTemplate1WithLoader.d.ts.map +1 -0
  208. package/lib/container/InboxTemplate2.d.ts +15 -0
  209. package/lib/container/InboxTemplate2.d.ts.map +1 -0
  210. package/lib/container/InboxWithAiLoader.d.ts +47 -0
  211. package/lib/container/InboxWithAiLoader.d.ts.map +1 -0
  212. package/lib/container/InboxWithAiLoader.js +118 -0
  213. package/lib/container/InboxWithAiLoader.js.map +1 -0
  214. package/lib/container/InboxWithLoader.d.ts +36 -0
  215. package/lib/container/InboxWithLoader.d.ts.map +1 -0
  216. package/lib/container/InboxWithLoader.js +277 -0
  217. package/lib/container/InboxWithLoader.js.map +1 -0
  218. package/lib/container/ServiceInbox.d.ts +9 -0
  219. package/lib/container/ServiceInbox.d.ts.map +1 -0
  220. package/lib/container/ServiceInbox.js +141 -0
  221. package/lib/container/ServiceInbox.js.map +1 -0
  222. package/lib/container/TestInboxWithAiLoader.d.ts +7 -0
  223. package/lib/container/TestInboxWithAiLoader.d.ts.map +1 -0
  224. package/lib/container/TestInboxWithAiLoader.js +135 -0
  225. package/lib/container/TestInboxWithAiLoader.js.map +1 -0
  226. package/lib/container/ThreadMessages.d.ts +13 -0
  227. package/lib/container/ThreadMessages.d.ts.map +1 -0
  228. package/lib/container/ThreadMessages.js +320 -0
  229. package/lib/container/ThreadMessages.js.map +1 -0
  230. package/lib/container/ThreadMessagesInbox.d.ts +14 -0
  231. package/lib/container/ThreadMessagesInbox.d.ts.map +1 -0
  232. package/lib/container/ThreadMessagesInbox.js +347 -0
  233. package/lib/container/ThreadMessagesInbox.js.map +1 -0
  234. package/lib/container/Threads.d.ts +8 -0
  235. package/lib/container/Threads.d.ts.map +1 -0
  236. package/lib/container/Threads.js +231 -0
  237. package/lib/container/Threads.js.map +1 -0
  238. package/lib/container/ThreadsInbox.d.ts +21 -0
  239. package/lib/container/ThreadsInbox.d.ts.map +1 -0
  240. package/lib/container/ThreadsInbox.js +243 -0
  241. package/lib/container/ThreadsInbox.js.map +1 -0
  242. package/lib/container/apply-footer-styles.d.ts +2 -0
  243. package/lib/container/apply-footer-styles.d.ts.map +1 -0
  244. package/lib/container/apply-footer-styles.js +16 -0
  245. package/lib/container/apply-footer-styles.js.map +1 -0
  246. package/lib/container/index.d.ts +13 -0
  247. package/lib/container/index.d.ts.map +1 -0
  248. package/lib/enums/index.d.ts +2 -0
  249. package/lib/enums/index.d.ts.map +1 -0
  250. package/lib/enums/messenger-slot-fill-name-enum.d.ts +11 -0
  251. package/lib/enums/messenger-slot-fill-name-enum.d.ts.map +1 -0
  252. package/lib/enums/messenger-slot-fill-name-enum.js +11 -0
  253. package/lib/enums/messenger-slot-fill-name-enum.js.map +1 -0
  254. package/lib/hooks/index.d.ts +4 -0
  255. package/lib/hooks/index.d.ts.map +1 -0
  256. package/lib/hooks/usePersistentModelConfig.d.ts +33 -0
  257. package/lib/hooks/usePersistentModelConfig.d.ts.map +1 -0
  258. package/lib/hooks/usePersistentModelConfig.js +123 -0
  259. package/lib/hooks/usePersistentModelConfig.js.map +1 -0
  260. package/lib/hooks/useStreamAssembler.d.ts +8 -0
  261. package/lib/hooks/useStreamAssembler.d.ts.map +1 -0
  262. package/lib/hooks/useTemplates.d.ts +14 -0
  263. package/lib/hooks/useTemplates.d.ts.map +1 -0
  264. package/lib/hooks/useTemplates.js +59 -0
  265. package/lib/hooks/useTemplates.js.map +1 -0
  266. package/lib/index.d.ts +14 -0
  267. package/lib/index.d.ts.map +1 -0
  268. package/lib/index.js +1 -0
  269. package/lib/index.js.map +1 -0
  270. package/lib/interfaces/index.d.ts +2 -0
  271. package/lib/interfaces/index.d.ts.map +1 -0
  272. package/lib/interfaces/message-widgets.interface.d.ts +21 -0
  273. package/lib/interfaces/message-widgets.interface.d.ts.map +1 -0
  274. package/lib/machines/aiAgentMachine.d.ts +3 -0
  275. package/lib/machines/aiAgentMachine.d.ts.map +1 -0
  276. package/lib/machines/aiAgentMachine.js +1083 -0
  277. package/lib/machines/aiAgentMachine.js.map +1 -0
  278. package/lib/machines/aiAgentMachine.simple.d.ts +3 -0
  279. package/lib/machines/aiAgentMachine.simple.d.ts.map +1 -0
  280. package/lib/machines/aiAgentMachine.simple.js +108 -0
  281. package/lib/machines/aiAgentMachine.simple.js.map +1 -0
  282. package/lib/machines/index.d.ts +3 -0
  283. package/lib/machines/index.d.ts.map +1 -0
  284. package/lib/machines/types.d.ts +77 -0
  285. package/lib/machines/types.d.ts.map +1 -0
  286. package/lib/module.d.ts +7 -0
  287. package/lib/module.d.ts.map +1 -0
  288. package/lib/module.js +26 -0
  289. package/lib/module.js.map +1 -0
  290. package/lib/routes.json +251 -0
  291. package/lib/styles/responsive.css +76 -0
  292. package/lib/templates/InboxWithAi.d.ts +44 -0
  293. package/lib/templates/InboxWithAi.d.ts.map +1 -0
  294. package/lib/templates/InboxWithAi.js +651 -0
  295. package/lib/templates/InboxWithAi.js.map +1 -0
  296. package/lib/templates/InboxWithAi.tsx +844 -0
  297. package/lib/templates/index.d.ts +2 -0
  298. package/lib/templates/index.d.ts.map +1 -0
  299. package/lib/templates/index.ts +1 -0
  300. package/lib/types/templates.d.ts +35 -0
  301. package/lib/types/templates.d.ts.map +1 -0
  302. package/lib/utils/utils.d.ts +2 -0
  303. package/lib/utils/utils.d.ts.map +1 -0
  304. package/lib/xstate/index.d.ts +3 -0
  305. package/lib/xstate/index.d.ts.map +1 -0
  306. package/lib/xstate/rightSidebar.machine.d.ts +4 -0
  307. package/lib/xstate/rightSidebar.machine.d.ts.map +1 -0
  308. package/lib/xstate/rightSidebar.types.d.ts +57 -0
  309. package/lib/xstate/rightSidebar.types.d.ts.map +1 -0
  310. package/package.json +69 -0
  311. package/rollup.config.mjs +47 -0
  312. package/src/cdm-locales/en/translations.json +31 -0
  313. package/src/cdm-locales/es/translations.json +31 -0
  314. package/src/components/AIAgent/AIAgent.tsx +1468 -0
  315. package/src/components/AIAgent/AIAgent.tsx.bk +1365 -0
  316. package/src/components/AIAgent/InputComponent.tsx +608 -0
  317. package/src/components/AIAgent/README.md +174 -0
  318. package/src/components/AIAgent/index.ts +1 -0
  319. package/src/components/InboxMessage/CommonMessage.tsx +40 -0
  320. package/src/components/InboxMessage/ConversationItem.tsx +255 -0
  321. package/src/components/InboxMessage/InputComponent.tsx +198 -0
  322. package/src/components/InboxMessage/LeftSidebar.tsx +140 -0
  323. package/src/components/InboxMessage/MessageInput.tsx +209 -0
  324. package/src/components/InboxMessage/MessageInputComponent.tsx +245 -0
  325. package/src/components/InboxMessage/Messages.tsx +137 -0
  326. package/src/components/InboxMessage/MessagesBuilderUi.tsx +205 -0
  327. package/src/components/InboxMessage/Popover.tsx +42 -0
  328. package/src/components/InboxMessage/RightSidebar.tsx +22 -0
  329. package/src/components/InboxMessage/RightSidebarAi.tsx +47 -0
  330. package/src/components/InboxMessage/ServiceConversationItem.tsx +234 -0
  331. package/src/components/InboxMessage/ServiceInboxItem.tsx +223 -0
  332. package/src/components/InboxMessage/StreamingMessageBubble.tsx +270 -0
  333. package/src/components/InboxMessage/SubscriptionHandler.tsx +55 -0
  334. package/src/components/InboxMessage/TypingIndicator.tsx +38 -0
  335. package/src/components/InboxMessage/UploadImageButton.tsx +46 -0
  336. package/src/components/InboxMessage/UserModalContent.tsx +60 -0
  337. package/src/components/InboxMessage/index.ts +18 -0
  338. package/src/components/InboxMessage/message-widgets/CommonMessage.tsx +69 -0
  339. package/src/components/InboxMessage/message-widgets/ErrorFixCard.tsx +239 -0
  340. package/src/components/InboxMessage/message-widgets/MessageCard.tsx +127 -0
  341. package/src/components/InboxMessage/message-widgets/MessageSliceRenderer.tsx +40 -0
  342. package/src/components/InboxMessage/message-widgets/ModernMessageGroup.tsx +1733 -0
  343. package/src/components/InboxMessage/message-widgets/PlainMessage.tsx +18 -0
  344. package/src/components/InboxMessage/message-widgets/PropertyMessageWidget.tsx +29 -0
  345. package/src/components/InboxMessage/message-widgets/SlackLikeMessageGroup.tsx +492 -0
  346. package/src/components/InboxMessage/message-widgets/index.ts +8 -0
  347. package/src/components/ModelConfigPanel.tsx +1357 -0
  348. package/src/components/filler-components/RightSiderBar.tsx +572 -0
  349. package/src/components/inbox/FilesList.tsx +89 -0
  350. package/src/components/inbox/MessageItem.tsx +50 -0
  351. package/src/components/inbox/ThreadItem.tsx +295 -0
  352. package/src/components/inbox/index.ts +3 -0
  353. package/src/components/index.ts +29 -0
  354. package/src/components/live-code-editor/hybrid-live-editor.tsx +105 -0
  355. package/src/components/live-code-editor/index.ts +3 -0
  356. package/src/components/live-code-editor/live-code-editor.tsx +257 -0
  357. package/src/components/messages-container-ui/MessagesContainerUI.tsx +151 -0
  358. package/src/components/messages-container-ui/PlanModeView.tsx +426 -0
  359. package/src/components/messages-container-ui/README.md +91 -0
  360. package/src/components/messages-container-ui/index.ts +5 -0
  361. package/src/components/messages-container-ui/types.ts +40 -0
  362. package/src/components/slot-fill/chat-message-filler.tsx +18 -0
  363. package/src/components/slot-fill/chat-message-slot.tsx +18 -0
  364. package/src/components/slot-fill/index.ts +3 -0
  365. package/src/components/slot-fill/right-sidebar-filler.tsx +48 -0
  366. package/src/components/ui/button.tsx +32 -0
  367. package/src/compute.ts +271 -0
  368. package/src/config/env-config.ts +24 -0
  369. package/src/config/index.ts +1 -0
  370. package/src/constants/breakpoints.ts +7 -0
  371. package/src/constants/index.ts +5 -0
  372. package/src/container/AiInbox.tsx +1879 -0
  373. package/src/container/AiInboxWithLoader.tsx +356 -0
  374. package/src/container/AiLandingInput.tsx +200 -0
  375. package/src/container/Inbox.tsx +1095 -0
  376. package/src/container/InboxAiMessagesLoader.tsx +129 -0
  377. package/src/container/InboxContainer.tsx +61 -0
  378. package/src/container/InboxTemplate1.tsx +1553 -0
  379. package/src/container/InboxTemplate1WithLoader.tsx +338 -0
  380. package/src/container/InboxTemplate2.tsx +1617 -0
  381. package/src/container/InboxWithAiLoader.tsx +177 -0
  382. package/src/container/InboxWithLoader.tsx +341 -0
  383. package/src/container/ServiceInbox.tsx +188 -0
  384. package/src/container/TestInboxWithAiLoader.tsx +147 -0
  385. package/src/container/ThreadMessages.tsx +378 -0
  386. package/src/container/ThreadMessagesInbox.tsx +457 -0
  387. package/src/container/Threads.tsx +270 -0
  388. package/src/container/ThreadsInbox.tsx +351 -0
  389. package/src/container/apply-footer-styles.ts +17 -0
  390. package/src/container/index.ts +31 -0
  391. package/src/enums/index.ts +1 -0
  392. package/src/enums/messenger-slot-fill-name-enum.ts +10 -0
  393. package/src/hooks/index.ts +3 -0
  394. package/src/hooks/usePersistentModelConfig.ts +166 -0
  395. package/src/hooks/useStreamAssembler.ts +7 -0
  396. package/src/hooks/useTemplates.ts +75 -0
  397. package/src/index.ts +49 -0
  398. package/src/interfaces/index.ts +1 -0
  399. package/src/interfaces/message-widgets.interface.ts +21 -0
  400. package/src/machines/aiAgentMachine.simple.ts +89 -0
  401. package/src/machines/aiAgentMachine.ts +1296 -0
  402. package/src/machines/aiAgentMachine.ts.bk +1296 -0
  403. package/src/machines/index.ts +2 -0
  404. package/src/machines/types.ts +59 -0
  405. package/src/module.tsx +32 -0
  406. package/src/styles/responsive.css +76 -0
  407. package/src/templates/InboxWithAi.tsx +844 -0
  408. package/src/templates/index.ts +1 -0
  409. package/src/types/templates.ts +35 -0
  410. package/src/utils/utils.ts +3 -0
  411. package/src/xstate/index.ts +2 -0
  412. package/src/xstate/rightSidebar.machine.ts +304 -0
  413. package/src/xstate/rightSidebar.types.ts +58 -0
  414. package/tsconfig.json +14 -0
  415. package/webpack.config.js +92 -0
@@ -0,0 +1,1152 @@
1
+ import React__default,{useState,useRef,useEffect,useMemo,useCallback}from'react';import ReactDOM from'react-dom';import {UploadImageButton}from'./InboxMessage/UploadImageButton.js';const providerIcons = {
2
+ openai: '🤖',
3
+ anthropic: '🧠',
4
+ gemini: '✨',
5
+ groq: '⚡'
6
+ };
7
+ const templateOptions = [{
8
+ value: 'vite-react',
9
+ label: 'Vite React',
10
+ icon: '⚡',
11
+ description: 'Vite + React 18 with Visual Editor'
12
+ }, {
13
+ value: 'nextjs',
14
+ label: 'Next.js',
15
+ icon: '⚛️',
16
+ description: 'React + Next.js 15 with Shadcn UI'
17
+ }, {
18
+ value: 'vue',
19
+ label: 'Vue.js',
20
+ icon: '🟢',
21
+ description: 'Vue 3 + Nuxt 3 with Tailwind CSS'
22
+ }];
23
+ const modelOptions = {
24
+ openai: [{
25
+ value: 'gpt-4o',
26
+ label: 'GPT-4o',
27
+ description: 'Latest multimodal model'
28
+ }, {
29
+ value: 'gpt-4o-mini',
30
+ label: 'GPT-4o mini',
31
+ description: 'Fast and efficient'
32
+ }, {
33
+ value: 'gpt-4-turbo',
34
+ label: 'GPT-4 Turbo',
35
+ description: 'Enhanced GPT-4'
36
+ }, {
37
+ value: 'gpt-4',
38
+ label: 'GPT-4',
39
+ description: 'Most capable model'
40
+ }, {
41
+ value: 'o1',
42
+ label: 'o1',
43
+ description: 'Reasoning model'
44
+ }, {
45
+ value: 'o1-mini',
46
+ label: 'o1-mini',
47
+ description: 'Faster reasoning'
48
+ }],
49
+ anthropic: [{
50
+ value: 'claude-sonnet-4-5-20250929',
51
+ label: 'Claude Sonnet 4.5',
52
+ description: 'Most intelligent model'
53
+ }, {
54
+ value: 'claude-haiku-4-5-20251001',
55
+ label: 'Claude Haiku 4.5',
56
+ description: 'Fast and accurate'
57
+ }, {
58
+ value: 'claude-opus-4-1-20250805',
59
+ label: 'Claude Opus 4.1',
60
+ description: 'Powerful reasoning'
61
+ }],
62
+ gemini: [{
63
+ value: 'gemini-2.5-flash-preview-05-20',
64
+ label: 'Gemini 2.5 Flash Preview 05-20',
65
+ description: 'Latest preview model'
66
+ }, {
67
+ value: 'gemini-2.5-pro-preview-05-06',
68
+ label: 'Gemini 2.5 Pro Preview 05-06',
69
+ description: 'Advanced reasoning'
70
+ }, {
71
+ value: 'gemini-2.0-flash',
72
+ label: 'Gemini 2.0 Flash',
73
+ description: 'Fast generation'
74
+ }, {
75
+ value: 'gemini-2.0-flash-lite',
76
+ label: 'Gemini 2.0 Flash Lite',
77
+ description: 'Lightweight version'
78
+ }, {
79
+ value: 'gemini-1.5-pro',
80
+ label: 'Gemini 1.5 Pro',
81
+ description: 'Most capable'
82
+ }, {
83
+ value: 'gemini-1.5-flash',
84
+ label: 'Gemini 1.5 Flash',
85
+ description: 'Fast and efficient'
86
+ }],
87
+ groq: [{
88
+ value: 'llama-3.3-70b-versatile',
89
+ label: 'Llama 3.3 70B Versatile',
90
+ description: 'Plan agent default'
91
+ }, {
92
+ value: 'llama-3.1-70b-versatile',
93
+ label: 'Llama 3.1 70B Versatile',
94
+ description: 'Fast inference'
95
+ }, {
96
+ value: 'llama-3.1-8b-instant',
97
+ label: 'Llama 3.1 8B Instant',
98
+ description: 'Lightweight'
99
+ }, {
100
+ value: 'mixtral-8x7b-32768',
101
+ label: 'Mixtral 8x7B',
102
+ description: 'MoE model'
103
+ }]
104
+ };
105
+ const providerDetails = {
106
+ openai: {
107
+ name: 'OpenAI'
108
+ },
109
+ anthropic: {
110
+ name: 'Anthropic'
111
+ },
112
+ gemini: {
113
+ name: 'Google Vertex AI'
114
+ },
115
+ groq: {
116
+ name: 'Groq'
117
+ }
118
+ };
119
+ // Helper function to get all models from all providers (includes provider for correct config update)
120
+ const getAllModels = () => {
121
+ const allModels = [];
122
+ Object.keys(modelOptions).forEach(provider => {
123
+ modelOptions[provider].forEach(model => {
124
+ allModels.push({
125
+ value: model.value,
126
+ label: model.label,
127
+ provider
128
+ });
129
+ });
130
+ });
131
+ return allModels;
132
+ };
133
+ const ModelConfigPanel = ({
134
+ config,
135
+ onConfigChange,
136
+ isVisible,
137
+ onToggleVisibility,
138
+ showTemplate = true
139
+ }) => {
140
+ const [showApiKey, setShowApiKey] = useState(false);
141
+ const [showModelDropdown, setShowModelDropdown] = useState(false);
142
+ const [showApiKeyDropdown, setShowApiKeyDropdown] = useState(false);
143
+ const [showTemplateDropdown, setShowTemplateDropdown] = useState(false);
144
+ const modelDropdownRef = useRef(null);
145
+ const apiKeyDropdownRef = useRef(null);
146
+ const templateDropdownRef = useRef(null);
147
+ useEffect(() => {
148
+ const handleClickOutside = event => {
149
+ const target = event.target;
150
+ // If the click is inside any floating dropdown rendered via portal,
151
+ // do not treat it as an outside click.
152
+ if (target?.closest?.('[data-model-dropdown]')) {
153
+ return;
154
+ }
155
+ if (modelDropdownRef.current && !modelDropdownRef.current.contains(target)) {
156
+ setShowModelDropdown(false);
157
+ }
158
+ if (apiKeyDropdownRef.current && !apiKeyDropdownRef.current.contains(target)) {
159
+ setShowApiKeyDropdown(false);
160
+ }
161
+ if (templateDropdownRef.current && !templateDropdownRef.current.contains(target)) {
162
+ setShowTemplateDropdown(false);
163
+ }
164
+ };
165
+ document.addEventListener('mousedown', handleClickOutside);
166
+ return () => document.removeEventListener('mousedown', handleClickOutside);
167
+ }, []);
168
+ const handleProviderChange = useCallback(provider => {
169
+ const defaultModel = modelOptions[provider][0].value;
170
+ onConfigChange({
171
+ ...config,
172
+ provider,
173
+ model: defaultModel
174
+ });
175
+ }, [config, onConfigChange]);
176
+ const handleModelChange = useCallback(model => {
177
+ onConfigChange({
178
+ ...config,
179
+ model
180
+ });
181
+ }, [config, onConfigChange]);
182
+ const handleApiKeyChange = useCallback(e => {
183
+ onConfigChange({
184
+ ...config,
185
+ apiKey: e.target.value
186
+ });
187
+ }, [config, onConfigChange]);
188
+ const handleTemplateChange = useCallback(template => {
189
+ onConfigChange({
190
+ ...config,
191
+ template
192
+ });
193
+ }, [config, onConfigChange]);
194
+ const getApiKeyPlaceholder = () => {
195
+ switch (config.provider) {
196
+ case 'openai':
197
+ return 'sk-...';
198
+ case 'anthropic':
199
+ return 'sk-ant-...';
200
+ case 'gemini':
201
+ return 'AI...';
202
+ case 'groq':
203
+ return 'gsk_...';
204
+ default:
205
+ return 'Enter API key';
206
+ }
207
+ };
208
+ const currentModels = modelOptions[config.provider] || [];
209
+ const currentModel = currentModels.find(m => m.value === config.model);
210
+ const currentTemplate = templateOptions.find(t => t.value === config.template);
211
+ return React__default.createElement("div", {
212
+ className: "relative"
213
+ }, isVisible && React__default.createElement("div", {
214
+ className: "py-2 bg-gray-50 rounded-lg grid grid-cols-1 md:grid-cols-3 gap-2"
215
+ }, showTemplate && React__default.createElement("div", {
216
+ className: "space-y-1 md:col-span-1"
217
+ }, React__default.createElement("div", {
218
+ className: "relative",
219
+ ref: templateDropdownRef
220
+ }, React__default.createElement("input", {
221
+ type: "text",
222
+ readOnly: true,
223
+ value: `${currentTemplate?.icon || '🔧'} ${currentTemplate?.label || 'Select Template'}`,
224
+ onClick: () => setShowTemplateDropdown(!showTemplateDropdown),
225
+ className: "w-full px-2 py-1 border border-gray-300 rounded cursor-pointer"
226
+ }), React__default.createElement("span", {
227
+ className: "absolute right-2 top-1/2 -translate-y-1/2 text-gray-400 text-xs pointer-events-none"
228
+ }, "\u25BC"), showTemplateDropdown && React__default.createElement("div", {
229
+ className: "absolute z-10 mt-1 w-full bg-white border border-gray-300 rounded shadow"
230
+ }, templateOptions.map(template => React__default.createElement("button", {
231
+ key: template.value,
232
+ type: "button",
233
+ onClick: () => {
234
+ handleTemplateChange(template.value);
235
+ setShowTemplateDropdown(false);
236
+ },
237
+ className: `w-full text-left px-3 py-2 hover:bg-gray-50 ${config.template === template.value ? 'bg-blue-50' : ''}`
238
+ }, React__default.createElement("span", {
239
+ className: "mr-2"
240
+ }, template.icon), React__default.createElement("span", {
241
+ className: "text-sm"
242
+ }, template.label)))))), React__default.createElement("div", {
243
+ className: "space-y-1 md:col-span-1"
244
+ }, React__default.createElement("div", {
245
+ className: "relative",
246
+ ref: modelDropdownRef
247
+ }, React__default.createElement("input", {
248
+ type: "text",
249
+ readOnly: true,
250
+ value: `${providerIcons[config.provider]} ${currentModel?.label || 'Select Model'}`,
251
+ onClick: () => setShowModelDropdown(!showModelDropdown),
252
+ className: "w-full px-2 py-1 border border-gray-300 rounded cursor-pointer"
253
+ }), React__default.createElement("span", {
254
+ className: "absolute right-2 top-1/2 -translate-y-1/2 text-gray-400 text-xs pointer-events-none"
255
+ }, "\u25BC"), showModelDropdown && React__default.createElement("div", {
256
+ className: "absolute z-10 mt-1 w-full bg-white border border-gray-300 rounded shadow max-h-60 overflow-y-auto"
257
+ }, currentModels.map(model => React__default.createElement("button", {
258
+ key: model.value,
259
+ type: "button",
260
+ onClick: () => {
261
+ handleModelChange(model.value);
262
+ setShowModelDropdown(false);
263
+ },
264
+ className: `w-full text-left px-3 py-2 hover:bg-gray-50 ${config.model === model.value ? 'bg-blue-50' : ''}`
265
+ }, React__default.createElement("span", {
266
+ className: "mr-2"
267
+ }, providerIcons[config.provider]), React__default.createElement("span", {
268
+ className: "text-sm"
269
+ }, model.label))), React__default.createElement("div", {
270
+ className: "p-2 border-t border-gray-100 flex gap-2"
271
+ }, Object.keys(providerDetails).map(p => React__default.createElement("button", {
272
+ key: p,
273
+ type: "button",
274
+ onClick: () => handleProviderChange(p),
275
+ className: `px-2 py-1 text-xs rounded ${config.provider === p ? 'bg-blue-500 text-white' : 'bg-white border'}`
276
+ }, providerDetails[p].name)))))), React__default.createElement("div", {
277
+ className: "space-y-1 md:col-span-1"
278
+ }, React__default.createElement("div", {
279
+ className: "relative",
280
+ ref: apiKeyDropdownRef
281
+ }, React__default.createElement("input", {
282
+ type: "text",
283
+ readOnly: true,
284
+ value: config.apiKey ? 'API Key ••••••••••••••••' : 'API Key',
285
+ onClick: () => setShowApiKeyDropdown(!showApiKeyDropdown),
286
+ className: "w-full px-2 py-1 border border-gray-300 rounded cursor-pointer"
287
+ }), React__default.createElement("span", {
288
+ className: "absolute right-2 top-1/2 -translate-y-1/2 text-gray-400 text-xs pointer-events-none"
289
+ }, "\u25BC"), showApiKeyDropdown && React__default.createElement("div", {
290
+ className: "absolute right-0 z-10 mt-1 w-80 bg-white border border-gray-300 rounded shadow"
291
+ }, React__default.createElement("div", {
292
+ className: "p-3"
293
+ }, React__default.createElement("div", {
294
+ className: "mb-2"
295
+ }, React__default.createElement("label", {
296
+ className: "block text-xs text-gray-600 mb-1"
297
+ }, "API Key"), React__default.createElement("div", {
298
+ className: "relative"
299
+ }, React__default.createElement("input", {
300
+ type: showApiKey ? 'text' : 'password',
301
+ value: config.apiKey,
302
+ onChange: handleApiKeyChange,
303
+ placeholder: getApiKeyPlaceholder(),
304
+ className: "w-full px-2 py-1 border border-gray-300 rounded pr-8"
305
+ }), React__default.createElement("button", {
306
+ type: "button",
307
+ onClick: () => setShowApiKey(!showApiKey),
308
+ className: "absolute right-2 top-1/2 -translate-y-1/2 text-gray-400"
309
+ }, showApiKey ? 'Hide' : 'Show'))), React__default.createElement("div", null, React__default.createElement("h4", {
310
+ className: "text-xs font-medium text-gray-700 mb-1"
311
+ }, "Parameters"), React__default.createElement("div", {
312
+ className: "space-y-1 text-xs text-gray-600"
313
+ }, React__default.createElement("div", {
314
+ className: "flex justify-between"
315
+ }, React__default.createElement("span", null, "Output tokens"), React__default.createElement("span", {
316
+ className: "bg-gray-100 px-2 rounded"
317
+ }, "Auto")), React__default.createElement("div", {
318
+ className: "flex justify-between"
319
+ }, React__default.createElement("span", null, "Temperature"), React__default.createElement("span", {
320
+ className: "bg-gray-100 px-2 rounded"
321
+ }, "Auto")), React__default.createElement("div", {
322
+ className: "flex justify-between"
323
+ }, React__default.createElement("span", null, "Top P"), React__default.createElement("span", {
324
+ className: "bg-gray-100 px-2 rounded"
325
+ }, "Auto")), React__default.createElement("div", {
326
+ className: "flex justify-between"
327
+ }, React__default.createElement("span", null, "Top K"), React__default.createElement("span", {
328
+ className: "bg-gray-100 px-2 rounded"
329
+ }, "Auto")), React__default.createElement("div", {
330
+ className: "flex justify-between"
331
+ }, React__default.createElement("span", null, "Frequency penalty"), React__default.createElement("span", {
332
+ className: "bg-gray-100 px-2 rounded"
333
+ }, "Auto")), React__default.createElement("div", {
334
+ className: "flex justify-between"
335
+ }, React__default.createElement("span", null, "Presence penalty"), React__default.createElement("span", {
336
+ className: "bg-gray-100 px-2 rounded"
337
+ }, "Auto"))))))))));
338
+ };
339
+ ModelConfigPanel.displayName = 'ModelConfigPanel';
340
+ const projectMetadataFields = [{
341
+ key: 'formExtensionE2BAPIKey',
342
+ label: 'E2B API Key'
343
+ }, {
344
+ key: 'formExtensionE2BClaudeTemplateId',
345
+ label: 'E2B Claude Template ID'
346
+ }, {
347
+ key: 'formExtensionE2BDomain',
348
+ label: 'E2B Domain'
349
+ }, {
350
+ key: 'formExtensionE2BTemplateId',
351
+ label: 'E2B Template ID'
352
+ }, {
353
+ key: 'formExtensionE2BViteReactTemplateId',
354
+ label: 'E2B Vite React Template ID'
355
+ }, {
356
+ key: 'formExtensionE2BVueTemplateId',
357
+ label: 'E2B Vue Template ID'
358
+ }, {
359
+ key: 'formExtensionGithubOrg',
360
+ label: 'GitHub Org'
361
+ }, {
362
+ key: 'formExtensionGithubReactBase',
363
+ label: 'GitHub React Base'
364
+ }, {
365
+ key: 'formExtensionGithubToken',
366
+ label: 'GitHub Token'
367
+ }];
368
+ const FloatingDropdown = ({
369
+ anchorRef,
370
+ open,
371
+ onClose,
372
+ minWidth = 224,
373
+ children
374
+ }) => {
375
+ const [style, setStyle] = useState(null);
376
+ useEffect(() => {
377
+ if (!open) return;
378
+ const update = () => {
379
+ const el = anchorRef.current;
380
+ if (!el) return;
381
+ const rect = el.getBoundingClientRect();
382
+ const width = Math.max(minWidth, rect.width);
383
+ // Heuristic expected dropdown height (px). Matches header + max-h-60 (15rem = 240px) + paddings.
384
+ const expectedHeight = 320;
385
+ const viewportHeight = window.innerHeight;
386
+ const spaceBelow = viewportHeight - rect.bottom;
387
+ const spaceAbove = rect.top;
388
+ const openAbove = spaceBelow < expectedHeight && spaceAbove > spaceBelow;
389
+ const top = openAbove ? Math.max(8, rect.top - expectedHeight - 8) : rect.bottom + 8;
390
+ const left = Math.min(Math.max(8, rect.left), window.innerWidth - width - 8);
391
+ setStyle({
392
+ top,
393
+ left,
394
+ width
395
+ });
396
+ };
397
+ update();
398
+ window.addEventListener('scroll', update, true);
399
+ window.addEventListener('resize', update);
400
+ return () => {
401
+ window.removeEventListener('scroll', update, true);
402
+ window.removeEventListener('resize', update);
403
+ };
404
+ }, [open, anchorRef, minWidth]);
405
+ useEffect(() => {
406
+ if (!open) return;
407
+ const onKey = e => {
408
+ if (e.key === 'Escape') onClose?.();
409
+ };
410
+ document.addEventListener('keydown', onKey);
411
+ return () => document.removeEventListener('keydown', onKey);
412
+ }, [open, onClose]);
413
+ if (!open || !style) return null;
414
+ return ReactDOM.createPortal(React__default.createElement("div", {
415
+ "data-model-dropdown": true,
416
+ style: {
417
+ position: 'fixed',
418
+ top: style.top,
419
+ left: style.left,
420
+ width: style.width,
421
+ zIndex: 9999
422
+ },
423
+ className: "bg-white border border-gray-200 rounded-lg shadow-lg"
424
+ }, children), document.body);
425
+ };
426
+ const ProjectSettingsModal = ({
427
+ modelConfig,
428
+ onModelConfigChange,
429
+ onClose,
430
+ isShowMeta = false
431
+ }) => {
432
+ const [settingsActiveTab, setSettingsActiveTab] = useState('model');
433
+ const [showModelDropdown, setShowModelDropdown] = useState(false);
434
+ const [showTemplateDropdown, setShowTemplateDropdown] = useState(false);
435
+ const [modelSearch, setModelSearch] = useState('');
436
+ const [templateSearch, setTemplateSearch] = useState('');
437
+ const modelDropdownRef = useRef(null);
438
+ const templateDropdownRef = useRef(null);
439
+ useEffect(() => {
440
+ const handleClickOutside = event => {
441
+ const target = event.target;
442
+ if (target.closest('[data-model-dropdown]')) return;
443
+ if (modelDropdownRef.current && !modelDropdownRef.current.contains(target)) {
444
+ setShowModelDropdown(false);
445
+ }
446
+ if (templateDropdownRef.current && !templateDropdownRef.current.contains(target)) {
447
+ setShowTemplateDropdown(false);
448
+ }
449
+ };
450
+ document.addEventListener('mousedown', handleClickOutside);
451
+ return () => document.removeEventListener('mousedown', handleClickOutside);
452
+ }, []);
453
+ const allModelOptions = useMemo(() => getAllModels(), []);
454
+ const templateOptionsList = useMemo(() => templateOptions.map(t => ({
455
+ value: t.value,
456
+ label: t.label,
457
+ icon: t.icon
458
+ })), []);
459
+ const filteredTemplates = useMemo(() => {
460
+ if (!templateSearch) return templateOptionsList;
461
+ const q = templateSearch.toLowerCase();
462
+ return templateOptionsList.filter(o => o.label.toLowerCase().includes(q) || String(o.value).toLowerCase().includes(q));
463
+ }, [templateOptionsList, templateSearch]);
464
+ const filteredModels = useMemo(() => {
465
+ if (!modelSearch) return allModelOptions;
466
+ const q = modelSearch.toLowerCase();
467
+ return allModelOptions.filter(o => o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q));
468
+ }, [allModelOptions, modelSearch]);
469
+ const handleModelSelect = useCallback((modelValue, provider) => {
470
+ const update = {
471
+ model: modelValue
472
+ };
473
+ if (provider) update.provider = provider;
474
+ onModelConfigChange({
475
+ ...modelConfig,
476
+ ...update
477
+ });
478
+ setShowModelDropdown(false);
479
+ }, [modelConfig, onModelConfigChange]);
480
+ const handleTemplateSelect = useCallback(templateValue => {
481
+ onModelConfigChange({
482
+ ...modelConfig,
483
+ template: templateValue
484
+ });
485
+ setShowTemplateDropdown(false);
486
+ }, [modelConfig, onModelConfigChange]);
487
+ const handleMetadataChange = useCallback((field, value) => {
488
+ onModelConfigChange({
489
+ ...modelConfig,
490
+ metadata: {
491
+ ...(modelConfig.metadata || {}),
492
+ [field]: value
493
+ }
494
+ });
495
+ }, [modelConfig, onModelConfigChange]);
496
+ return React__default.createElement("div", {
497
+ className: "fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50 overflow-y-auto py-12 px-4",
498
+ onClick: e => e.target === e.currentTarget && onClose()
499
+ }, React__default.createElement("div", {
500
+ className: "bg-white rounded-lg shadow-xl w-full max-w-md max-h-[calc(100vh-6rem)] overflow-hidden flex flex-col",
501
+ onClick: e => e.stopPropagation()
502
+ }, React__default.createElement("div", {
503
+ className: "p-6 flex flex-col flex-1 overflow-hidden"
504
+ }, React__default.createElement("div", {
505
+ className: "flex items-center justify-between pb-4"
506
+ }, React__default.createElement("h3", {
507
+ className: "text-lg font-semibold text-gray-900"
508
+ }, "Project Settings"), React__default.createElement("button", {
509
+ type: "button",
510
+ onClick: onClose,
511
+ className: "text-gray-400 hover:text-gray-600 transition-colors p-1",
512
+ "aria-label": "Close"
513
+ }, React__default.createElement("svg", {
514
+ className: "w-6 h-6",
515
+ fill: "none",
516
+ stroke: "currentColor",
517
+ viewBox: "0 0 24 24"
518
+ }, React__default.createElement("path", {
519
+ strokeLinecap: "round",
520
+ strokeLinejoin: "round",
521
+ strokeWidth: 2,
522
+ d: "M6 18L18 6M6 6l12 12"
523
+ })))), React__default.createElement("div", {
524
+ className: "mb-4"
525
+ }, React__default.createElement("div", {
526
+ className: "flex border-b border-gray-200"
527
+ }, React__default.createElement("button", {
528
+ type: "button",
529
+ className: `px-3 py-2 text-sm -mb-px border-b-2 transition-colors ${settingsActiveTab === 'model' ? 'border-blue-500 text-blue-600' : 'border-transparent text-gray-600 hover:text-gray-800'}`,
530
+ onClick: () => setSettingsActiveTab('model')
531
+ }, "Configuration"), React__default.createElement("button", {
532
+ type: "button",
533
+ className: `ml-2 px-3 py-2 text-sm -mb-px border-b-2 transition-colors ${settingsActiveTab === 'other_settings' ? 'border-blue-500 text-blue-600' : 'border-transparent text-gray-600 hover:text-gray-800'}`,
534
+ onClick: () => setSettingsActiveTab('other_settings')
535
+ }, "Other Settings"), React__default.createElement("button", {
536
+ type: "button",
537
+ className: `ml-2 px-3 py-2 text-sm -mb-px border-b-2 transition-colors ${settingsActiveTab === 'secret' ? 'border-blue-500 text-blue-600' : 'border-transparent text-gray-600 hover:text-gray-800'}`,
538
+ onClick: () => setSettingsActiveTab('secret')
539
+ }, "Secret"))), React__default.createElement("div", {
540
+ className: "flex-1 overflow-y-auto pr-1"
541
+ }, settingsActiveTab === 'model' && React__default.createElement("div", {
542
+ className: "space-y-4 pb-2"
543
+ }, React__default.createElement("div", {
544
+ className: "space-y-2"
545
+ }, React__default.createElement("label", {
546
+ className: "block text-sm font-medium text-gray-700"
547
+ }, "Model"), React__default.createElement("div", {
548
+ className: "relative",
549
+ ref: modelDropdownRef
550
+ }, React__default.createElement("button", {
551
+ type: "button",
552
+ onClick: () => setShowModelDropdown(!showModelDropdown),
553
+ className: "w-full flex items-center gap-2 px-3 py-2 text-sm rounded-lg border border-gray-300 bg-white hover:bg-gray-50 transition-colors overflow-hidden"
554
+ }, allModelOptions.find(o => o.value === modelConfig.model)?.label || React__default.createElement("span", {
555
+ className: "text-gray-500"
556
+ }, "Model"), React__default.createElement("svg", {
557
+ className: "w-4 h-4 text-gray-500 ml-auto",
558
+ fill: "none",
559
+ stroke: "currentColor",
560
+ viewBox: "0 0 24 24"
561
+ }, React__default.createElement("path", {
562
+ strokeLinecap: "round",
563
+ strokeLinejoin: "round",
564
+ strokeWidth: 2,
565
+ d: "M19 9l-7 7-7-7"
566
+ }))), React__default.createElement(FloatingDropdown, {
567
+ anchorRef: modelDropdownRef,
568
+ open: showModelDropdown,
569
+ onClose: () => setShowModelDropdown(false),
570
+ minWidth: 320
571
+ }, React__default.createElement("div", {
572
+ className: "p-2 border-b border-gray-100"
573
+ }, React__default.createElement("input", {
574
+ autoFocus: true,
575
+ value: modelSearch,
576
+ onChange: e => setModelSearch(e.target.value),
577
+ placeholder: "Search model...",
578
+ className: "w-full px-2 py-1 text-xs border border-gray-200 rounded"
579
+ })), React__default.createElement("div", {
580
+ className: "py-1 max-h-60 overflow-y-auto"
581
+ }, filteredModels.map(option => React__default.createElement("button", {
582
+ key: option.value,
583
+ type: "button",
584
+ onClick: () => handleModelSelect(option.value, option.provider),
585
+ className: `w-full px-3 py-2 text-left text-xs hover:bg-gray-50 transition-colors ${modelConfig?.model === option.value ? 'bg-blue-50' : ''}`
586
+ }, React__default.createElement("div", {
587
+ className: "font-medium text-gray-900 truncate"
588
+ }, option.label))))))), React__default.createElement("div", {
589
+ className: "space-y-2"
590
+ }, React__default.createElement("label", {
591
+ className: "block text-sm font-medium text-gray-700"
592
+ }, "Template"), React__default.createElement("div", {
593
+ className: "relative",
594
+ ref: templateDropdownRef
595
+ }, React__default.createElement("button", {
596
+ type: "button",
597
+ onClick: () => setShowTemplateDropdown(!showTemplateDropdown),
598
+ className: "w-full flex items-center gap-2 px-3 py-2 text-sm rounded-lg border border-gray-300 bg-white hover:bg-gray-50 transition-colors overflow-hidden"
599
+ }, templateOptionsList.find(o => o.value === modelConfig.template) ? React__default.createElement(React__default.Fragment, null, React__default.createElement("span", {
600
+ className: "text-base"
601
+ }, templateOptionsList.find(o => o.value === modelConfig.template)?.icon), React__default.createElement("span", {
602
+ className: "text-gray-700 truncate"
603
+ }, templateOptionsList.find(o => o.value === modelConfig.template)?.label)) : React__default.createElement(React__default.Fragment, null, React__default.createElement("span", {
604
+ className: "text-base"
605
+ }, "\uD83D\uDCDD"), React__default.createElement("span", {
606
+ className: "text-gray-500 truncate"
607
+ }, "Template")), React__default.createElement("svg", {
608
+ className: "w-4 h-4 text-gray-500 ml-auto",
609
+ fill: "none",
610
+ stroke: "currentColor",
611
+ viewBox: "0 0 24 24"
612
+ }, React__default.createElement("path", {
613
+ strokeLinecap: "round",
614
+ strokeLinejoin: "round",
615
+ strokeWidth: 2,
616
+ d: "M19 9l-7 7-7-7"
617
+ }))), React__default.createElement(FloatingDropdown, {
618
+ anchorRef: templateDropdownRef,
619
+ open: showTemplateDropdown,
620
+ onClose: () => setShowTemplateDropdown(false),
621
+ minWidth: 320
622
+ }, React__default.createElement("div", {
623
+ className: "p-2 border-b border-gray-100"
624
+ }, React__default.createElement("input", {
625
+ autoFocus: true,
626
+ value: templateSearch,
627
+ onChange: e => setTemplateSearch(e.target.value),
628
+ placeholder: "Search template...",
629
+ className: "w-full px-2 py-1 text-xs border border-gray-200 rounded"
630
+ })), React__default.createElement("div", {
631
+ className: "py-1 max-h-60 overflow-y-auto"
632
+ }, filteredTemplates.map(option => React__default.createElement("button", {
633
+ key: option.value,
634
+ type: "button",
635
+ onClick: () => handleTemplateSelect(option.value),
636
+ className: `w-full px-3 py-2 text-left text-xs hover:bg-gray-50 transition-colors flex items-center gap-2 ${modelConfig?.template === option.value ? 'bg-blue-50' : ''}`
637
+ }, React__default.createElement("span", {
638
+ className: "text-sm"
639
+ }, option.icon), React__default.createElement("span", {
640
+ className: "font-medium text-gray-900 truncate"
641
+ }, option.label))))))), React__default.createElement("div", {
642
+ className: "space-y-2"
643
+ }, React__default.createElement("label", {
644
+ className: "block text-sm font-medium text-gray-700"
645
+ }, "Domain ", React__default.createElement("span", {
646
+ className: "text-gray-500 text-xs"
647
+ }, "(optional)")), React__default.createElement("input", {
648
+ type: "text",
649
+ value: modelConfig.domain || '',
650
+ onChange: e => onModelConfigChange({
651
+ ...modelConfig,
652
+ domain: e.target.value
653
+ }),
654
+ className: "w-full px-3 py-2 text-sm rounded-lg border border-gray-300 focus:ring-2 focus:ring-blue-500 focus:border-blue-500",
655
+ placeholder: "e.g. https://example.com"
656
+ }))), settingsActiveTab === 'other_settings' && React__default.createElement("div", {
657
+ className: "space-y-4 pb-2"
658
+ }, React__default.createElement("div", null, React__default.createElement("label", {
659
+ className: "block text-sm font-medium text-gray-700 mb-2"
660
+ }, modelConfig.provider === 'groq' ? 'Groq API Key' : modelConfig.provider === 'openai' ? 'OpenAI API Key' : modelConfig.provider === 'anthropic' ? 'Anthropic API Key' : modelConfig.provider === 'gemini' ? 'Google / Gemini API Key' : 'API Key', ' ', React__default.createElement("span", {
661
+ className: "text-red-500"
662
+ }, "*")), React__default.createElement("input", {
663
+ type: "password",
664
+ value: modelConfig.apiKey || '',
665
+ onChange: e => onModelConfigChange({
666
+ ...modelConfig,
667
+ apiKey: e.target.value
668
+ }),
669
+ className: "w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",
670
+ placeholder: modelConfig.provider === 'groq' ? 'gsk_... (Groq API key from console.groq.com)' : modelConfig.provider === 'openai' ? 'sk-...' : modelConfig.provider === 'anthropic' ? 'sk-ant-...' : modelConfig.provider === 'gemini' ? 'AI...' : 'Enter your API key'
671
+ })), React__default.createElement("div", null, React__default.createElement("label", {
672
+ className: "block text-sm font-medium text-gray-700 mb-2"
673
+ }, "Extension ID ", React__default.createElement("span", {
674
+ className: "text-red-500"
675
+ }, "*")), React__default.createElement("input", {
676
+ type: "text",
677
+ value: modelConfig.extensionId || '',
678
+ onChange: e => onModelConfigChange({
679
+ ...modelConfig,
680
+ extensionId: e.target.value
681
+ }),
682
+ className: "w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",
683
+ placeholder: "Enter your extension ID"
684
+ })), React__default.createElement("div", null, React__default.createElement("label", {
685
+ className: "block text-sm font-medium text-gray-700 mb-2"
686
+ }, "Form ID ", React__default.createElement("span", {
687
+ className: "text-red-500"
688
+ }, "*")), React__default.createElement("input", {
689
+ type: "text",
690
+ value: modelConfig.formId || '',
691
+ onChange: e => onModelConfigChange({
692
+ ...modelConfig,
693
+ formId: e.target.value
694
+ }),
695
+ className: "w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",
696
+ placeholder: "Enter form ID"
697
+ })), React__default.createElement("div", null, React__default.createElement("label", {
698
+ className: "block text-sm font-medium text-gray-700 mb-2"
699
+ }, "Function ID ", React__default.createElement("span", {
700
+ className: "text-red-500"
701
+ }, "*")), React__default.createElement("input", {
702
+ type: "text",
703
+ value: modelConfig.functionId || '',
704
+ onChange: e => onModelConfigChange({
705
+ ...modelConfig,
706
+ functionId: e.target.value
707
+ }),
708
+ className: "w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",
709
+ placeholder: "Enter function ID"
710
+ })), React__default.createElement("div", null, React__default.createElement("label", {
711
+ className: "block text-sm font-medium text-gray-700 mb-2"
712
+ }, "Step Name ", React__default.createElement("span", {
713
+ className: "text-gray-500 text-xs"
714
+ }, "(optional)")), React__default.createElement("input", {
715
+ type: "text",
716
+ value: modelConfig.stepName || '',
717
+ onChange: e => onModelConfigChange({
718
+ ...modelConfig,
719
+ stepName: e.target.value
720
+ }),
721
+ className: "w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",
722
+ placeholder: "Enter step name (optional)"
723
+ }))), settingsActiveTab === 'secret' && React__default.createElement("div", {
724
+ className: "space-y-4 pb-2"
725
+ }, isShowMeta ? React__default.createElement("div", null, React__default.createElement("h4", {
726
+ className: "text-sm font-semibold text-gray-800 mb-3"
727
+ }, "Secret Metadata"), React__default.createElement("div", {
728
+ className: "space-y-3"
729
+ }, projectMetadataFields.map(field => React__default.createElement("div", {
730
+ key: field.key
731
+ }, React__default.createElement("label", {
732
+ className: "block text-xs font-medium text-gray-600 mb-1"
733
+ }, field.label), React__default.createElement("input", {
734
+ type: "text",
735
+ value: modelConfig.metadata?.[field.key] || '',
736
+ onChange: e => handleMetadataChange(field.key, e.target.value),
737
+ className: "w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm",
738
+ placeholder: `Enter ${field.label.toLowerCase()}`
739
+ }))))) : React__default.createElement("div", {
740
+ className: "text-sm text-gray-600"
741
+ }, "Secret metadata configuration is disabled for this environment."))))));
742
+ };
743
+ ProjectSettingsModal.displayName = 'ProjectSettingsModal';
744
+ const ModelToolbar = ({
745
+ modelConfig,
746
+ onModelConfigChange,
747
+ sending,
748
+ canSend,
749
+ onSend,
750
+ onUploadImageChange,
751
+ showProjectSettings = true,
752
+ isShowMeta = false,
753
+ showModeSelector = false,
754
+ showStopButton = false,
755
+ onStop
756
+ }) => {
757
+ const [showModelDropdown, setShowModelDropdown] = useState(false);
758
+ const [showToolbarModelDropdown, setShowToolbarModelDropdown] = useState(false);
759
+ const [showTemplateDropdown, setShowTemplateDropdown] = useState(false);
760
+ const [showSettingsModal, setShowSettingsModal] = useState(false);
761
+ const [settingsActiveTab, setSettingsActiveTab] = useState('model');
762
+ const [templateSearch, setTemplateSearch] = useState('');
763
+ const [modelSearch, setModelSearch] = useState('');
764
+ const [toolbarModelSearch, setToolbarModelSearch] = useState('');
765
+ const [mode, setMode] = useState(modelConfig?.mode || 'plan');
766
+ const [showPlanTooltip, setShowPlanTooltip] = useState(false);
767
+ const [showBuildTooltip, setShowBuildTooltip] = useState(false);
768
+ const planButtonRef = useRef(null);
769
+ const buildButtonRef = useRef(null);
770
+ const modelDropdownRef = useRef(null);
771
+ const toolbarModelButtonRef = useRef(null);
772
+ const templateDropdownRef = useRef(null);
773
+ // Sync mode with modelConfig
774
+ useEffect(() => {
775
+ if (modelConfig?.mode && modelConfig.mode !== mode) {
776
+ setMode(modelConfig.mode);
777
+ }
778
+ }, [modelConfig?.mode, mode]);
779
+ useEffect(() => {
780
+ const handleClickOutside = event => {
781
+ const target = event.target;
782
+ // If click is inside any floating dropdown rendered via portal,
783
+ // ignore it for outside-click logic (both toolbar & modal dropdowns).
784
+ if (target.closest('[data-model-dropdown]')) {
785
+ return;
786
+ }
787
+ if (modelDropdownRef.current && !modelDropdownRef.current.contains(target)) {
788
+ setShowModelDropdown(false);
789
+ }
790
+ if (showToolbarModelDropdown) {
791
+ const isClickInsideButton = toolbarModelButtonRef.current?.contains(target);
792
+ if (!isClickInsideButton) {
793
+ setShowToolbarModelDropdown(false);
794
+ setToolbarModelSearch('');
795
+ }
796
+ }
797
+ if (templateDropdownRef.current && !templateDropdownRef.current.contains(target)) {
798
+ setShowTemplateDropdown(false);
799
+ }
800
+ };
801
+ document.addEventListener('mousedown', handleClickOutside);
802
+ return () => document.removeEventListener('mousedown', handleClickOutside);
803
+ }, [showToolbarModelDropdown]);
804
+ const allModelOptions = useMemo(() => {
805
+ return getAllModels();
806
+ }, []);
807
+ const templateOptionsList = useMemo(() => {
808
+ return templateOptions.map(t => ({
809
+ value: t.value,
810
+ label: t.label,
811
+ icon: t.icon
812
+ }));
813
+ }, []);
814
+ useMemo(() => {
815
+ if (!templateSearch) return templateOptionsList;
816
+ const q = templateSearch.toLowerCase();
817
+ return templateOptionsList.filter(o => o.label.toLowerCase().includes(q) || String(o.value).toLowerCase().includes(q));
818
+ }, [templateOptionsList, templateSearch]);
819
+ useMemo(() => {
820
+ if (!modelSearch) return allModelOptions;
821
+ const q = modelSearch.toLowerCase();
822
+ return allModelOptions.filter(o => o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q));
823
+ }, [allModelOptions, modelSearch]);
824
+ const filteredToolbarModels = useMemo(() => {
825
+ if (!toolbarModelSearch) return allModelOptions;
826
+ const q = toolbarModelSearch.toLowerCase();
827
+ return allModelOptions.filter(o => o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q));
828
+ }, [allModelOptions, toolbarModelSearch]);
829
+ useCallback(modelValue => {
830
+ if (onModelConfigChange && modelConfig) {
831
+ onModelConfigChange({
832
+ ...modelConfig,
833
+ model: modelValue
834
+ });
835
+ }
836
+ setShowModelDropdown(false);
837
+ }, [modelConfig, onModelConfigChange]);
838
+ const handleToolbarModelSelect = useCallback((modelValue, provider) => {
839
+ if (onModelConfigChange && modelConfig) {
840
+ const update = {
841
+ model: modelValue
842
+ };
843
+ if (provider) update.provider = provider;
844
+ onModelConfigChange({
845
+ ...modelConfig,
846
+ ...update
847
+ });
848
+ }
849
+ setShowToolbarModelDropdown(false);
850
+ setToolbarModelSearch('');
851
+ }, [modelConfig, onModelConfigChange]);
852
+ useCallback(templateValue => {
853
+ if (onModelConfigChange && modelConfig) {
854
+ onModelConfigChange({
855
+ ...modelConfig,
856
+ template: templateValue
857
+ });
858
+ }
859
+ setShowTemplateDropdown(false);
860
+ }, [modelConfig, onModelConfigChange]);
861
+ useCallback((field, value) => {
862
+ if (!onModelConfigChange || !modelConfig) return;
863
+ onModelConfigChange({
864
+ ...modelConfig,
865
+ metadata: {
866
+ ...(modelConfig.metadata || {}),
867
+ [field]: value
868
+ }
869
+ });
870
+ }, [modelConfig, onModelConfigChange]);
871
+ const handleModeChange = useCallback(newMode => {
872
+ setMode(newMode);
873
+ if (onModelConfigChange && modelConfig) {
874
+ onModelConfigChange({
875
+ ...modelConfig,
876
+ mode: newMode
877
+ });
878
+ }
879
+ }, [modelConfig, onModelConfigChange]);
880
+ return React__default.createElement(React__default.Fragment, null, React__default.createElement("div", {
881
+ className: "flex items-center gap-2 overflow-x-auto overflow-y-visible whitespace-nowrap py-1 px-2 sm:px-0"
882
+ }, showModeSelector && React__default.createElement("div", {
883
+ className: "flex items-center gap-2 mr-2"
884
+ }, React__default.createElement("div", {
885
+ className: "relative",
886
+ style: {
887
+ overflow: 'visible'
888
+ }
889
+ }, React__default.createElement("button", {
890
+ ref: planButtonRef,
891
+ type: "button",
892
+ onClick: () => handleModeChange('plan'),
893
+ onMouseEnter: () => setShowPlanTooltip(true),
894
+ onMouseLeave: () => setShowPlanTooltip(false),
895
+ className: `w-7 h-7 rounded-full border border-gray-300 flex items-center justify-center transition-colors ${mode === 'plan' ? 'bg-gray-800 text-white' : 'bg-white text-gray-900 hover:bg-gray-50'}`,
896
+ "aria-label": "Plan mode"
897
+ }, React__default.createElement("svg", {
898
+ className: "w-4 h-4",
899
+ fill: "none",
900
+ stroke: "currentColor",
901
+ viewBox: "0 0 24 24"
902
+ }, React__default.createElement("path", {
903
+ strokeLinecap: "round",
904
+ strokeLinejoin: "round",
905
+ strokeWidth: 2,
906
+ d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"
907
+ }))), showPlanTooltip && planButtonRef.current && ReactDOM.createPortal(React__default.createElement("div", {
908
+ role: "tooltip",
909
+ className: "fixed z-[9999] inline-block px-3 py-2 text-sm font-medium text-white bg-gray-800 rounded-lg shadow-sm whitespace-nowrap pointer-events-none",
910
+ style: {
911
+ top: planButtonRef.current.getBoundingClientRect().top - 40,
912
+ left: planButtonRef.current.getBoundingClientRect().left + planButtonRef.current.offsetWidth / 2,
913
+ transform: 'translateX(-50%)'
914
+ }
915
+ }, "Plan", React__default.createElement("div", {
916
+ className: "absolute top-full left-1/2 -translate-x-1/2 -mt-1"
917
+ }, React__default.createElement("div", {
918
+ className: "w-2 h-2 bg-gray-800 rotate-45"
919
+ }))), document.body)), React__default.createElement("div", {
920
+ className: "relative",
921
+ style: {
922
+ overflow: 'visible'
923
+ }
924
+ }, React__default.createElement("button", {
925
+ ref: buildButtonRef,
926
+ type: "button",
927
+ onClick: () => handleModeChange('build'),
928
+ onMouseEnter: () => setShowBuildTooltip(true),
929
+ onMouseLeave: () => setShowBuildTooltip(false),
930
+ className: `w-7 h-7 rounded-full border border-gray-300 flex items-center justify-center transition-colors ${mode === 'build' ? 'bg-gray-800 text-white' : 'bg-white text-gray-900 hover:bg-gray-50'}`,
931
+ "aria-label": "Build mode"
932
+ }, React__default.createElement("svg", {
933
+ className: "w-4 h-4",
934
+ fill: "none",
935
+ stroke: "currentColor",
936
+ strokeWidth: "2",
937
+ strokeLinecap: "round",
938
+ strokeLinejoin: "round",
939
+ viewBox: "0 0 24 24"
940
+ }, React__default.createElement("path", {
941
+ d: "M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"
942
+ }), React__default.createElement("path", {
943
+ d: "M9 18h6"
944
+ }), React__default.createElement("path", {
945
+ d: "M10 22h4"
946
+ }))), showBuildTooltip && buildButtonRef.current && ReactDOM.createPortal(React__default.createElement("div", {
947
+ role: "tooltip",
948
+ className: "fixed z-[9999] inline-block px-3 py-2 text-sm font-medium text-white bg-gray-800 rounded-lg shadow-sm whitespace-nowrap pointer-events-none",
949
+ style: {
950
+ top: buildButtonRef.current.getBoundingClientRect().top - 40,
951
+ left: buildButtonRef.current.getBoundingClientRect().left + buildButtonRef.current.offsetWidth / 2,
952
+ transform: 'translateX(-50%)'
953
+ }
954
+ }, "Build", React__default.createElement("div", {
955
+ className: "absolute top-full left-1/2 -translate-x-1/2 -mt-1"
956
+ }, React__default.createElement("div", {
957
+ className: "w-2 h-2 bg-gray-800 rotate-45"
958
+ }))), document.body))), React__default.createElement("div", {
959
+ className: "flex-1"
960
+ }), showProjectSettings && React__default.createElement("button", {
961
+ onClick: () => setShowSettingsModal(true),
962
+ className: "flex items-center justify-center w-7 h-7 sm:w-7 sm:h-7 rounded-lg border border-gray-300 bg-white hover:bg-gray-50 transition-colors shrink-0"
963
+ }, React__default.createElement("svg", {
964
+ className: "w-4 h-4 text-gray-600",
965
+ fill: "none",
966
+ stroke: "currentColor",
967
+ viewBox: "0 0 24 24"
968
+ }, React__default.createElement("path", {
969
+ strokeLinecap: "round",
970
+ strokeLinejoin: "round",
971
+ strokeWidth: 2,
972
+ d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"
973
+ }), React__default.createElement("path", {
974
+ strokeLinecap: "round",
975
+ strokeLinejoin: "round",
976
+ strokeWidth: 2,
977
+ d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z"
978
+ }))), React__default.createElement("div", {
979
+ className: "relative shrink-0"
980
+ }, React__default.createElement("button", {
981
+ ref: toolbarModelButtonRef,
982
+ onClick: () => setShowToolbarModelDropdown(!showToolbarModelDropdown),
983
+ className: "flex items-center justify-center w-7 h-7 sm:w-7 sm:h-7 rounded-lg border border-gray-300 bg-white hover:bg-gray-50 transition-colors shrink-0",
984
+ title: modelConfig?.model ? allModelOptions.find(o => o.value === modelConfig.model)?.label || 'Choose a model' : 'Choose a model'
985
+ }, React__default.createElement("svg", {
986
+ className: "w-4 h-4 text-gray-600",
987
+ fill: "none",
988
+ stroke: "currentColor",
989
+ viewBox: "0 0 24 24"
990
+ }, React__default.createElement("rect", {
991
+ x: "4",
992
+ y: "4",
993
+ width: "16",
994
+ height: "16",
995
+ rx: "1",
996
+ strokeWidth: "2"
997
+ }), React__default.createElement("rect", {
998
+ x: "8",
999
+ y: "8",
1000
+ width: "8",
1001
+ height: "8",
1002
+ rx: "0.5",
1003
+ strokeWidth: "2"
1004
+ }), React__default.createElement("line", {
1005
+ x1: "10",
1006
+ y1: "4",
1007
+ x2: "10",
1008
+ y2: "2",
1009
+ strokeWidth: "2"
1010
+ }), React__default.createElement("line", {
1011
+ x1: "14",
1012
+ y1: "4",
1013
+ x2: "14",
1014
+ y2: "2",
1015
+ strokeWidth: "2"
1016
+ }), React__default.createElement("line", {
1017
+ x1: "10",
1018
+ y1: "20",
1019
+ x2: "10",
1020
+ y2: "22",
1021
+ strokeWidth: "2"
1022
+ }), React__default.createElement("line", {
1023
+ x1: "14",
1024
+ y1: "20",
1025
+ x2: "14",
1026
+ y2: "22",
1027
+ strokeWidth: "2"
1028
+ }), React__default.createElement("line", {
1029
+ x1: "4",
1030
+ y1: "10",
1031
+ x2: "2",
1032
+ y2: "10",
1033
+ strokeWidth: "2"
1034
+ }), React__default.createElement("line", {
1035
+ x1: "4",
1036
+ y1: "14",
1037
+ x2: "2",
1038
+ y2: "14",
1039
+ strokeWidth: "2"
1040
+ }), React__default.createElement("line", {
1041
+ x1: "20",
1042
+ y1: "10",
1043
+ x2: "22",
1044
+ y2: "10",
1045
+ strokeWidth: "2"
1046
+ }), React__default.createElement("line", {
1047
+ x1: "20",
1048
+ y1: "14",
1049
+ x2: "22",
1050
+ y2: "14",
1051
+ strokeWidth: "2"
1052
+ }))), React__default.createElement(FloatingDropdown, {
1053
+ anchorRef: toolbarModelButtonRef,
1054
+ open: showToolbarModelDropdown,
1055
+ onClose: () => {
1056
+ setShowToolbarModelDropdown(false);
1057
+ setToolbarModelSearch('');
1058
+ },
1059
+ minWidth: 280
1060
+ }, React__default.createElement("div", {
1061
+ "data-model-dropdown": true,
1062
+ className: "bg-white"
1063
+ }, React__default.createElement("div", {
1064
+ className: "p-2 border-b border-gray-100"
1065
+ }, React__default.createElement("input", {
1066
+ autoFocus: true,
1067
+ value: toolbarModelSearch,
1068
+ onChange: e => setToolbarModelSearch(e.target.value),
1069
+ placeholder: "Search model...",
1070
+ className: "w-full px-2 py-1.5 text-xs border border-gray-200 rounded focus:outline-none focus:ring-1 focus:ring-blue-500"
1071
+ })), React__default.createElement("div", {
1072
+ className: "py-1 max-h-60 overflow-y-auto"
1073
+ }, filteredToolbarModels.map(option => React__default.createElement("button", {
1074
+ key: option.value,
1075
+ onClick: () => handleToolbarModelSelect(option.value, option.provider),
1076
+ className: `w-full px-3 py-2 text-left text-sm hover:bg-gray-50 transition-colors flex items-center justify-between ${modelConfig?.model === option.value ? 'bg-blue-50' : ''}`
1077
+ }, React__default.createElement("span", {
1078
+ className: "text-gray-900"
1079
+ }, option.label), modelConfig?.model === option.value && React__default.createElement("svg", {
1080
+ className: "w-4 h-4 text-blue-600",
1081
+ fill: "none",
1082
+ stroke: "currentColor",
1083
+ viewBox: "0 0 24 24"
1084
+ }, React__default.createElement("path", {
1085
+ strokeLinecap: "round",
1086
+ strokeLinejoin: "round",
1087
+ strokeWidth: 2,
1088
+ d: "M5 13l4 4L19 7"
1089
+ })))))))), React__default.createElement(UploadImageButton, {
1090
+ onChange: onUploadImageChange
1091
+ }, React__default.createElement("div", {
1092
+ className: "flex items-center justify-center w-7 h-7 sm:w-7 sm:h-7 rounded-lg border border-gray-300 bg-white shrink-0 ml-1"
1093
+ }, React__default.createElement("svg", {
1094
+ className: "w-3 h-3 text-gray-600",
1095
+ fill: "none",
1096
+ stroke: "currentColor",
1097
+ viewBox: "0 0 24 24"
1098
+ }, React__default.createElement("path", {
1099
+ strokeLinecap: "round",
1100
+ strokeLinejoin: "round",
1101
+ strokeWidth: 2,
1102
+ d: "M21.44 11.05l-9.19 9.19a6 6 0 11-8.49-8.49l9.19-9.19a4 4 0 115.66 5.66l-9.19 9.19a2 2 0 11-2.83-2.83l8.49-8.49"
1103
+ })))), showStopButton ? React__default.createElement("button", {
1104
+ className: "flex items-center justify-center w-7 h-7 sm:w-7 sm:h-7 rounded-lg border border-red-500 bg-red-500 hover:bg-red-600 text-white transition-colors shrink-0",
1105
+ onClick: onStop,
1106
+ type: "button"
1107
+ }, React__default.createElement("svg", {
1108
+ className: "w-3 h-3",
1109
+ fill: "currentColor",
1110
+ viewBox: "0 0 24 24"
1111
+ }, React__default.createElement("circle", {
1112
+ cx: "12",
1113
+ cy: "12",
1114
+ r: "8",
1115
+ fill: "white"
1116
+ }))) : React__default.createElement("button", {
1117
+ className: `flex items-center justify-center w-7 h-7 sm:w-7 sm:h-7 rounded-lg border transition-colors shrink-0 ${canSend && !sending ? 'border-blue-500 bg-blue-500 hover:bg-blue-600 text-white' : 'border-gray-300 bg-gray-100 text-gray-400 cursor-not-allowed'}`,
1118
+ onClick: onSend,
1119
+ disabled: !canSend || sending,
1120
+ type: "button"
1121
+ }, sending ? React__default.createElement("svg", {
1122
+ className: "w-4 h-4 animate-spin",
1123
+ fill: "none",
1124
+ viewBox: "0 0 24 24"
1125
+ }, React__default.createElement("circle", {
1126
+ className: "opacity-25",
1127
+ cx: "12",
1128
+ cy: "12",
1129
+ r: "10",
1130
+ stroke: "currentColor",
1131
+ strokeWidth: "4"
1132
+ }), React__default.createElement("path", {
1133
+ className: "opacity-75",
1134
+ fill: "currentColor",
1135
+ d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
1136
+ })) : React__default.createElement("svg", {
1137
+ className: "w-4 h-4",
1138
+ fill: "none",
1139
+ stroke: "currentColor",
1140
+ viewBox: "0 0 24 24"
1141
+ }, React__default.createElement("path", {
1142
+ strokeLinecap: "round",
1143
+ strokeLinejoin: "round",
1144
+ strokeWidth: 2,
1145
+ d: "M12 19l9 2-9-18-9 18 9-2zm0 0v-8"
1146
+ })))), showProjectSettings && showSettingsModal && modelConfig && onModelConfigChange && React__default.createElement(ProjectSettingsModal, {
1147
+ modelConfig: modelConfig,
1148
+ onModelConfigChange: onModelConfigChange,
1149
+ onClose: () => setShowSettingsModal(false),
1150
+ isShowMeta: isShowMeta
1151
+ }));
1152
+ };export{ModelConfigPanel,ModelToolbar,ProjectSettingsModal,getAllModels,modelOptions,templateOptions};//# sourceMappingURL=ModelConfigPanel.js.map