octocms 0.4.13 → 0.4.16

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 (796) hide show
  1. package/dist/admin/AdminApp.d.ts +1 -1
  2. package/dist/admin/AdminApp.js +2 -2
  3. package/dist/admin/AdminApp.js.map +1 -1
  4. package/dist/admin/actions/agent.d.ts +3 -3
  5. package/dist/admin/actions/agent.js.map +1 -1
  6. package/dist/admin/actions/media.d.ts.map +1 -1
  7. package/dist/admin/actions/media.js +3 -1
  8. package/dist/admin/actions/media.js.map +1 -1
  9. package/dist/admin/pages/AdminErrorView.d.ts.map +1 -1
  10. package/dist/admin/pages/AdminErrorView.js +9 -9
  11. package/dist/admin/pages/AdminErrorView.js.map +1 -1
  12. package/dist/admin/pages/AdminLayout.d.ts +1 -1
  13. package/dist/admin/pages/AdminLayout.d.ts.map +1 -1
  14. package/dist/admin/pages/AdminLayout.js +2 -2
  15. package/dist/admin/pages/AdminLayout.js.map +1 -1
  16. package/dist/admin/pages/ChatPage.d.ts +3 -3
  17. package/dist/admin/pages/ChatPage.d.ts.map +1 -1
  18. package/dist/admin/pages/ChatPage.js +8 -5
  19. package/dist/admin/pages/ChatPage.js.map +1 -1
  20. package/dist/admin/pages/CollectionPage.d.ts.map +1 -1
  21. package/dist/admin/pages/CollectionPage.js +5 -1
  22. package/dist/admin/pages/CollectionPage.js.map +1 -1
  23. package/dist/admin/pages/ContentModelPage.d.ts.map +1 -1
  24. package/dist/admin/pages/ContentModelPage.js +5 -1
  25. package/dist/admin/pages/ContentModelPage.js.map +1 -1
  26. package/dist/admin/pages/ContentPage.d.ts.map +1 -1
  27. package/dist/admin/pages/ContentPage.js +5 -1
  28. package/dist/admin/pages/ContentPage.js.map +1 -1
  29. package/dist/admin/pages/ContentTypePage.d.ts.map +1 -1
  30. package/dist/admin/pages/ContentTypePage.js +6 -2
  31. package/dist/admin/pages/ContentTypePage.js.map +1 -1
  32. package/dist/admin/pages/EntryPage.d.ts.map +1 -1
  33. package/dist/admin/pages/EntryPage.js +5 -1
  34. package/dist/admin/pages/EntryPage.js.map +1 -1
  35. package/dist/admin/pages/MediaAssetPage.d.ts.map +1 -1
  36. package/dist/admin/pages/MediaAssetPage.js +6 -2
  37. package/dist/admin/pages/MediaAssetPage.js.map +1 -1
  38. package/dist/admin/pages/MediaPage.d.ts.map +1 -1
  39. package/dist/admin/pages/MediaPage.js +6 -2
  40. package/dist/admin/pages/MediaPage.js.map +1 -1
  41. package/dist/admin/theme/toggle.d.ts.map +1 -1
  42. package/dist/admin/theme/toggle.js +27 -27
  43. package/dist/admin/theme/toggle.js.map +1 -1
  44. package/dist/agent/chatSetup.d.ts +19 -0
  45. package/dist/agent/chatSetup.d.ts.map +1 -0
  46. package/dist/agent/chatSetup.js +119 -0
  47. package/dist/agent/chatSetup.js.map +1 -0
  48. package/dist/agent/featureFlag.d.ts +3 -3
  49. package/dist/agent/featureFlag.js.map +1 -1
  50. package/dist/agent/index.cjs +75 -5309
  51. package/dist/agent/index.cjs.map +1 -1
  52. package/dist/{agentDocs-M3R2CPUQ.js → agentDocs-QZ4NOQVH.js} +2 -2
  53. package/dist/{chunk-DCDFWNC6.js → chunk-I7VNI2IG.js} +4 -7
  54. package/dist/{chunk-DCDFWNC6.js.map → chunk-I7VNI2IG.js.map} +1 -1
  55. package/dist/chunk-TOUAHFDW.js +7 -0
  56. package/dist/{chunk-NAHOP7TG.js.map → chunk-TOUAHFDW.js.map} +1 -1
  57. package/dist/cli/index.js +4 -4
  58. package/dist/cli/lib/templates.js +3 -6
  59. package/dist/cli/lib/templates.js.map +1 -1
  60. package/dist/components/Chat/ChatAgentSetup.d.ts +7 -0
  61. package/dist/components/Chat/ChatAgentSetup.d.ts.map +1 -0
  62. package/dist/components/Chat/ChatAgentSetup.js +37 -0
  63. package/dist/components/Chat/ChatAgentSetup.js.map +1 -0
  64. package/dist/components/Chat/ChatPage.d.ts +6 -1
  65. package/dist/components/Chat/ChatPage.d.ts.map +1 -1
  66. package/dist/components/Chat/ChatPage.js +123 -128
  67. package/dist/components/Chat/ChatPage.js.map +1 -1
  68. package/dist/components/Chat/ChatSidebar.d.ts +10 -0
  69. package/dist/components/Chat/ChatSidebar.d.ts.map +1 -0
  70. package/dist/components/Chat/ChatSidebar.js +45 -0
  71. package/dist/components/Chat/ChatSidebar.js.map +1 -0
  72. package/dist/components/Chat/Composer.d.ts.map +1 -1
  73. package/dist/components/Chat/Composer.js +28 -45
  74. package/dist/components/Chat/Composer.js.map +1 -1
  75. package/dist/components/Chat/Message.d.ts.map +1 -1
  76. package/dist/components/Chat/Message.js +40 -39
  77. package/dist/components/Chat/Message.js.map +1 -1
  78. package/dist/components/Chat/ProposalCard.d.ts.map +1 -1
  79. package/dist/components/Chat/ProposalCard.js +56 -67
  80. package/dist/components/Chat/ProposalCard.js.map +1 -1
  81. package/dist/components/Chat/ToolCallCard.d.ts.map +1 -1
  82. package/dist/components/Chat/ToolCallCard.js +29 -38
  83. package/dist/components/Chat/ToolCallCard.js.map +1 -1
  84. package/dist/components/Chat/chatStorage.d.ts +64 -0
  85. package/dist/components/Chat/chatStorage.d.ts.map +1 -0
  86. package/dist/components/Chat/chatStorage.js +154 -0
  87. package/dist/components/Chat/chatStorage.js.map +1 -0
  88. package/dist/components/Chat/useChatHistory.d.ts +12 -0
  89. package/dist/components/Chat/useChatHistory.d.ts.map +1 -0
  90. package/dist/components/Chat/useChatHistory.js +196 -0
  91. package/dist/components/Chat/useChatHistory.js.map +1 -0
  92. package/dist/components/Chat/useChatStream.d.ts +6 -0
  93. package/dist/components/Chat/useChatStream.d.ts.map +1 -1
  94. package/dist/components/Chat/useChatStream.js +31 -2
  95. package/dist/components/Chat/useChatStream.js.map +1 -1
  96. package/dist/components/CommandK/CommandK.d.ts +1 -1
  97. package/dist/components/CommandK/CommandK.d.ts.map +1 -1
  98. package/dist/components/CommandK/CommandK.js +100 -116
  99. package/dist/components/CommandK/CommandK.js.map +1 -1
  100. package/dist/components/CommandK/parts.d.ts.map +1 -1
  101. package/dist/components/CommandK/parts.js +9 -11
  102. package/dist/components/CommandK/parts.js.map +1 -1
  103. package/dist/components/ContentModel/ConditionalBranchesEditor.d.ts.map +1 -1
  104. package/dist/components/ContentModel/ConditionalBranchesEditor.js +40 -45
  105. package/dist/components/ContentModel/ConditionalBranchesEditor.js.map +1 -1
  106. package/dist/components/ContentModel/ContentModelList.d.ts.map +1 -1
  107. package/dist/components/ContentModel/ContentModelList.js +65 -80
  108. package/dist/components/ContentModel/ContentModelList.js.map +1 -1
  109. package/dist/components/ContentModel/ContentTypeDetail.d.ts.map +1 -1
  110. package/dist/components/ContentModel/ContentTypeDetail.js +253 -280
  111. package/dist/components/ContentModel/ContentTypeDetail.js.map +1 -1
  112. package/dist/components/ContentModel/CreateContentTypeDialog.d.ts.map +1 -1
  113. package/dist/components/ContentModel/CreateContentTypeDialog.js +42 -30
  114. package/dist/components/ContentModel/CreateContentTypeDialog.js.map +1 -1
  115. package/dist/components/ContentModel/DeleteContentTypeDialog.d.ts.map +1 -1
  116. package/dist/components/ContentModel/DeleteContentTypeDialog.js +14 -15
  117. package/dist/components/ContentModel/DeleteContentTypeDialog.js.map +1 -1
  118. package/dist/components/ContentModel/DeleteFieldDialog.d.ts.map +1 -1
  119. package/dist/components/ContentModel/DeleteFieldDialog.js +27 -20
  120. package/dist/components/ContentModel/DeleteFieldDialog.js.map +1 -1
  121. package/dist/components/ContentModel/EditContentTypeDialog.d.ts.map +1 -1
  122. package/dist/components/ContentModel/EditContentTypeDialog.js +46 -34
  123. package/dist/components/ContentModel/EditContentTypeDialog.js.map +1 -1
  124. package/dist/components/ContentModel/FieldDialog.d.ts.map +1 -1
  125. package/dist/components/ContentModel/FieldDialog.js +95 -84
  126. package/dist/components/ContentModel/FieldDialog.js.map +1 -1
  127. package/dist/components/ContentModel/RichTextOptionsEditor.d.ts.map +1 -1
  128. package/dist/components/ContentModel/RichTextOptionsEditor.js +90 -81
  129. package/dist/components/ContentModel/RichTextOptionsEditor.js.map +1 -1
  130. package/dist/components/ContentModel/SchemaImpactList.d.ts.map +1 -1
  131. package/dist/components/ContentModel/SchemaImpactList.js +19 -36
  132. package/dist/components/ContentModel/SchemaImpactList.js.map +1 -1
  133. package/dist/components/ContentModel/SchemaOptionFieldInput.d.ts.map +1 -1
  134. package/dist/components/ContentModel/SchemaOptionFieldInput.js +63 -84
  135. package/dist/components/ContentModel/SchemaOptionFieldInput.js.map +1 -1
  136. package/dist/components/ContentModel/skeletons/ContentModelListPageSkeleton.d.ts +3 -0
  137. package/dist/components/ContentModel/skeletons/ContentModelListPageSkeleton.d.ts.map +1 -0
  138. package/dist/components/ContentModel/skeletons/ContentModelListPageSkeleton.js +15 -0
  139. package/dist/components/ContentModel/skeletons/ContentModelListPageSkeleton.js.map +1 -0
  140. package/dist/components/ContentModel/skeletons/ContentTypeDetailPageSkeleton.d.ts +3 -0
  141. package/dist/components/ContentModel/skeletons/ContentTypeDetailPageSkeleton.d.ts.map +1 -0
  142. package/dist/components/ContentModel/skeletons/ContentTypeDetailPageSkeleton.js +11 -0
  143. package/dist/components/ContentModel/skeletons/ContentTypeDetailPageSkeleton.js.map +1 -0
  144. package/dist/components/ContentModel/skeletons/FieldTableSkeleton.js +3 -3
  145. package/dist/components/ContentModel/skeletons/FieldTableSkeleton.js.map +1 -1
  146. package/dist/components/ContentModel/skeletons/SchemaTableSkeleton.d.ts.map +1 -1
  147. package/dist/components/ContentModel/skeletons/SchemaTableSkeleton.js +4 -12
  148. package/dist/components/ContentModel/skeletons/SchemaTableSkeleton.js.map +1 -1
  149. package/dist/components/Dashboard/DashboardContent.d.ts.map +1 -1
  150. package/dist/components/Dashboard/DashboardContent.js +87 -114
  151. package/dist/components/Dashboard/DashboardContent.js.map +1 -1
  152. package/dist/components/Dashboard/RecentPullRequests.d.ts.map +1 -1
  153. package/dist/components/Dashboard/RecentPullRequests.js +33 -45
  154. package/dist/components/Dashboard/RecentPullRequests.js.map +1 -1
  155. package/dist/components/Dashboard/skeletons/ContentPageChromeSkeleton.d.ts +2 -7
  156. package/dist/components/Dashboard/skeletons/ContentPageChromeSkeleton.d.ts.map +1 -1
  157. package/dist/components/Dashboard/skeletons/ContentPageChromeSkeleton.js +5 -20
  158. package/dist/components/Dashboard/skeletons/ContentPageChromeSkeleton.js.map +1 -1
  159. package/dist/components/Dashboard/skeletons/ContentTableSkeleton.js +9 -9
  160. package/dist/components/Dashboard/skeletons/ContentTableSkeleton.js.map +1 -1
  161. package/dist/components/Dashboard/skeletons/DashboardCollectionPageSkeleton.d.ts +3 -0
  162. package/dist/components/Dashboard/skeletons/DashboardCollectionPageSkeleton.d.ts.map +1 -0
  163. package/dist/components/Dashboard/skeletons/DashboardCollectionPageSkeleton.js +10 -0
  164. package/dist/components/Dashboard/skeletons/DashboardCollectionPageSkeleton.js.map +1 -0
  165. package/dist/components/Dashboard/skeletons/DashboardPageSkeleton.d.ts +9 -0
  166. package/dist/components/Dashboard/skeletons/DashboardPageSkeleton.d.ts.map +1 -0
  167. package/dist/components/Dashboard/skeletons/DashboardPageSkeleton.js +16 -0
  168. package/dist/components/Dashboard/skeletons/DashboardPageSkeleton.js.map +1 -0
  169. package/dist/components/Dashboard/skeletons/LeftPanelSkeleton.d.ts.map +1 -1
  170. package/dist/components/Dashboard/skeletons/LeftPanelSkeleton.js +7 -18
  171. package/dist/components/Dashboard/skeletons/LeftPanelSkeleton.js.map +1 -1
  172. package/dist/components/DiffView/DiffHunk.d.ts.map +1 -1
  173. package/dist/components/DiffView/DiffHunk.js +12 -40
  174. package/dist/components/DiffView/DiffHunk.js.map +1 -1
  175. package/dist/components/DiffView/DiffView.d.ts.map +1 -1
  176. package/dist/components/DiffView/DiffView.js +33 -52
  177. package/dist/components/DiffView/DiffView.js.map +1 -1
  178. package/dist/components/EditPost/EditPost.d.ts.map +1 -1
  179. package/dist/components/EditPost/EditPost.js +139 -200
  180. package/dist/components/EditPost/EditPost.js.map +1 -1
  181. package/dist/components/EditPost/skeletons/EditPostPageSkeleton.d.ts +3 -0
  182. package/dist/components/EditPost/skeletons/EditPostPageSkeleton.d.ts.map +1 -0
  183. package/dist/components/EditPost/skeletons/EditPostPageSkeleton.js +21 -0
  184. package/dist/components/EditPost/skeletons/EditPostPageSkeleton.js.map +1 -0
  185. package/dist/components/EditPost/skeletons/EntryFormSkeleton.d.ts.map +1 -1
  186. package/dist/components/EditPost/skeletons/EntryFormSkeleton.js +1 -9
  187. package/dist/components/EditPost/skeletons/EntryFormSkeleton.js.map +1 -1
  188. package/dist/components/EditPost/skeletons/EntrySidebarSkeleton.d.ts.map +1 -1
  189. package/dist/components/EditPost/skeletons/EntrySidebarSkeleton.js +12 -20
  190. package/dist/components/EditPost/skeletons/EntrySidebarSkeleton.js.map +1 -1
  191. package/dist/components/ErrorBoundary/ErrorBoundary.d.ts.map +1 -0
  192. package/dist/components/{ErrorBoundary.js → ErrorBoundary/ErrorBoundary.js} +15 -21
  193. package/dist/components/ErrorBoundary/ErrorBoundary.js.map +1 -0
  194. package/dist/components/HistorySection/HistorySection.d.ts.map +1 -1
  195. package/dist/components/HistorySection/HistorySection.js +23 -42
  196. package/dist/components/HistorySection/HistorySection.js.map +1 -1
  197. package/dist/components/InlineEntryEditor/InlineEntryEditor.d.ts.map +1 -1
  198. package/dist/components/InlineEntryEditor/InlineEntryEditor.js +120 -123
  199. package/dist/components/InlineEntryEditor/InlineEntryEditor.js.map +1 -1
  200. package/dist/components/Layout/BranchSelectorDialog.d.ts +9 -0
  201. package/dist/components/Layout/BranchSelectorDialog.d.ts.map +1 -0
  202. package/dist/components/Layout/BranchSelectorDialog.js +130 -0
  203. package/dist/components/Layout/BranchSelectorDialog.js.map +1 -0
  204. package/dist/components/Layout/CreateBranchDialog.d.ts.map +1 -0
  205. package/dist/components/{CreateBranchDialog.js → Layout/CreateBranchDialog.js} +16 -16
  206. package/dist/components/Layout/CreateBranchDialog.js.map +1 -0
  207. package/dist/components/Layout/Layout.d.ts.map +1 -1
  208. package/dist/components/Layout/Layout.js +18 -26
  209. package/dist/components/Layout/Layout.js.map +1 -1
  210. package/dist/components/Layout/LeftNavItem.d.ts.map +1 -1
  211. package/dist/components/Layout/LeftNavItem.js +7 -7
  212. package/dist/components/Layout/LeftNavItem.js.map +1 -1
  213. package/dist/components/Layout/Page.d.ts +16 -0
  214. package/dist/components/Layout/Page.d.ts.map +1 -0
  215. package/dist/components/Layout/Page.js +47 -0
  216. package/dist/components/Layout/Page.js.map +1 -0
  217. package/dist/components/Layout/TopHeader.d.ts +1 -1
  218. package/dist/components/Layout/TopHeader.d.ts.map +1 -1
  219. package/dist/components/Layout/TopHeader.js +70 -165
  220. package/dist/components/Layout/TopHeader.js.map +1 -1
  221. package/dist/components/Layout/UserAccountDialog.d.ts +12 -0
  222. package/dist/components/Layout/UserAccountDialog.d.ts.map +1 -0
  223. package/dist/components/Layout/UserAccountDialog.js +48 -0
  224. package/dist/components/Layout/UserAccountDialog.js.map +1 -0
  225. package/dist/components/Layout/skeletons/AgentNavSkeleton.js +1 -1
  226. package/dist/components/Layout/skeletons/AgentNavSkeleton.js.map +1 -1
  227. package/dist/components/Layout/skeletons/BranchChipSkeleton.d.ts.map +1 -1
  228. package/dist/components/Layout/skeletons/BranchChipSkeleton.js +1 -8
  229. package/dist/components/Layout/skeletons/BranchChipSkeleton.js.map +1 -1
  230. package/dist/components/Layout/skeletons/NeutralPageSkeleton.d.ts +3 -0
  231. package/dist/components/Layout/skeletons/NeutralPageSkeleton.d.ts.map +1 -0
  232. package/dist/components/Layout/skeletons/NeutralPageSkeleton.js +11 -0
  233. package/dist/components/Layout/skeletons/NeutralPageSkeleton.js.map +1 -0
  234. package/dist/components/Layout/skeletons/PageChromeSkeleton.d.ts +19 -0
  235. package/dist/components/Layout/skeletons/PageChromeSkeleton.d.ts.map +1 -0
  236. package/dist/components/Layout/skeletons/PageChromeSkeleton.js +31 -0
  237. package/dist/components/Layout/skeletons/PageChromeSkeleton.js.map +1 -0
  238. package/dist/components/Layout/skeletons/RouteMainSlotSkeleton.d.ts +9 -0
  239. package/dist/components/Layout/skeletons/RouteMainSlotSkeleton.d.ts.map +1 -0
  240. package/dist/components/Layout/skeletons/RouteMainSlotSkeleton.js +15 -0
  241. package/dist/components/Layout/skeletons/RouteMainSlotSkeleton.js.map +1 -0
  242. package/dist/components/Layout/skeletons/TopHeaderSkeleton.d.ts.map +1 -1
  243. package/dist/components/Layout/skeletons/TopHeaderSkeleton.js +10 -17
  244. package/dist/components/Layout/skeletons/TopHeaderSkeleton.js.map +1 -1
  245. package/dist/components/Layout/skeletons/routeSkeletons.d.ts +16 -0
  246. package/dist/components/Layout/skeletons/routeSkeletons.d.ts.map +1 -0
  247. package/dist/components/Layout/skeletons/routeSkeletons.js +48 -0
  248. package/dist/components/Layout/skeletons/routeSkeletons.js.map +1 -0
  249. package/dist/components/LinkedBySection/LinkedBySection.js +13 -13
  250. package/dist/components/LinkedBySection/LinkedBySection.js.map +1 -1
  251. package/dist/components/MediaAsset/MediaAsset.d.ts +1 -1
  252. package/dist/components/MediaAsset/MediaAsset.d.ts.map +1 -1
  253. package/dist/components/MediaAsset/MediaAsset.js +126 -136
  254. package/dist/components/MediaAsset/MediaAsset.js.map +1 -1
  255. package/dist/components/MediaAsset/skeletons/MediaAssetPageSkeleton.d.ts +3 -0
  256. package/dist/components/MediaAsset/skeletons/MediaAssetPageSkeleton.d.ts.map +1 -0
  257. package/dist/components/MediaAsset/skeletons/MediaAssetPageSkeleton.js +21 -0
  258. package/dist/components/MediaAsset/skeletons/MediaAssetPageSkeleton.js.map +1 -0
  259. package/dist/components/MediaAsset/skeletons/MediaMetadataFormSkeleton.d.ts.map +1 -1
  260. package/dist/components/MediaAsset/skeletons/MediaMetadataFormSkeleton.js +26 -22
  261. package/dist/components/MediaAsset/skeletons/MediaMetadataFormSkeleton.js.map +1 -1
  262. package/dist/components/MediaAsset/skeletons/MediaPreviewSkeleton.d.ts.map +1 -1
  263. package/dist/components/MediaAsset/skeletons/MediaPreviewSkeleton.js +1 -9
  264. package/dist/components/MediaAsset/skeletons/MediaPreviewSkeleton.js.map +1 -1
  265. package/dist/components/MediaManager/CreateFolderDialog.d.ts.map +1 -1
  266. package/dist/components/MediaManager/CreateFolderDialog.js +15 -8
  267. package/dist/components/MediaManager/CreateFolderDialog.js.map +1 -1
  268. package/dist/components/MediaManager/DeleteFolderDialog.d.ts.map +1 -1
  269. package/dist/components/MediaManager/DeleteFolderDialog.js +1 -2
  270. package/dist/components/MediaManager/DeleteFolderDialog.js.map +1 -1
  271. package/dist/components/MediaManager/MarkdownImageEditToolbar.d.ts.map +1 -1
  272. package/dist/components/MediaManager/MarkdownImageEditToolbar.js +7 -9
  273. package/dist/components/MediaManager/MarkdownImageEditToolbar.js.map +1 -1
  274. package/dist/components/MediaManager/MarkdownInsertImageDialog.d.ts.map +1 -1
  275. package/dist/components/MediaManager/MarkdownInsertImageDialog.js +6 -9
  276. package/dist/components/MediaManager/MarkdownInsertImageDialog.js.map +1 -1
  277. package/dist/components/MediaManager/MediaLeftPanel.d.ts.map +1 -1
  278. package/dist/components/MediaManager/MediaLeftPanel.js +21 -23
  279. package/dist/components/MediaManager/MediaLeftPanel.js.map +1 -1
  280. package/dist/components/MediaManager/MediaListTable.d.ts.map +1 -1
  281. package/dist/components/MediaManager/MediaListTable.js +15 -21
  282. package/dist/components/MediaManager/MediaListTable.js.map +1 -1
  283. package/dist/components/MediaManager/MediaManager.d.ts.map +1 -1
  284. package/dist/components/MediaManager/MediaManager.js +101 -151
  285. package/dist/components/MediaManager/MediaManager.js.map +1 -1
  286. package/dist/components/MediaManager/MediaSelectDialog.js +22 -64
  287. package/dist/components/MediaManager/MediaSelectDialog.js.map +1 -1
  288. package/dist/components/MediaManager/MediaUploadBar.d.ts.map +1 -1
  289. package/dist/components/MediaManager/MediaUploadBar.js +9 -10
  290. package/dist/components/MediaManager/MediaUploadBar.js.map +1 -1
  291. package/dist/components/MediaManager/MediaUploadDialog.d.ts.map +1 -1
  292. package/dist/components/MediaManager/MediaUploadDialog.js +18 -11
  293. package/dist/components/MediaManager/MediaUploadDialog.js.map +1 -1
  294. package/dist/components/MediaManager/MediaViewModeSwitcher.d.ts +8 -0
  295. package/dist/components/MediaManager/MediaViewModeSwitcher.d.ts.map +1 -0
  296. package/dist/components/MediaManager/MediaViewModeSwitcher.js +14 -0
  297. package/dist/components/MediaManager/MediaViewModeSwitcher.js.map +1 -0
  298. package/dist/components/MediaManager/skeletons/MediaGridSkeleton.d.ts.map +1 -1
  299. package/dist/components/MediaManager/skeletons/MediaGridSkeleton.js +4 -12
  300. package/dist/components/MediaManager/skeletons/MediaGridSkeleton.js.map +1 -1
  301. package/dist/components/MediaManager/skeletons/MediaLeftPanelSkeleton.d.ts.map +1 -1
  302. package/dist/components/MediaManager/skeletons/MediaLeftPanelSkeleton.js +5 -13
  303. package/dist/components/MediaManager/skeletons/MediaLeftPanelSkeleton.js.map +1 -1
  304. package/dist/components/MediaManager/skeletons/MediaListTableSkeleton.d.ts.map +1 -1
  305. package/dist/components/MediaManager/skeletons/MediaListTableSkeleton.js +7 -15
  306. package/dist/components/MediaManager/skeletons/MediaListTableSkeleton.js.map +1 -1
  307. package/dist/components/MediaManager/skeletons/MediaManagerMainSkeleton.d.ts +3 -0
  308. package/dist/components/MediaManager/skeletons/MediaManagerMainSkeleton.d.ts.map +1 -0
  309. package/dist/components/MediaManager/skeletons/MediaManagerMainSkeleton.js +15 -0
  310. package/dist/components/MediaManager/skeletons/MediaManagerMainSkeleton.js.map +1 -0
  311. package/dist/components/MediaManager/skeletons/MediaManagerPageSkeleton.d.ts +3 -0
  312. package/dist/components/MediaManager/skeletons/MediaManagerPageSkeleton.d.ts.map +1 -0
  313. package/dist/components/MediaManager/skeletons/MediaManagerPageSkeleton.js +21 -0
  314. package/dist/components/MediaManager/skeletons/MediaManagerPageSkeleton.js.map +1 -0
  315. package/dist/components/public/MarkdownContent.d.ts.map +1 -1
  316. package/dist/components/public/MarkdownContent.js +1 -2
  317. package/dist/components/public/MarkdownContent.js.map +1 -1
  318. package/dist/components/public/RichTextContent.d.ts.map +1 -1
  319. package/dist/components/public/RichTextContent.js +19 -8
  320. package/dist/components/public/RichTextContent.js.map +1 -1
  321. package/dist/components/public/SearchBox.d.ts.map +1 -1
  322. package/dist/components/public/SearchBox.js +32 -60
  323. package/dist/components/public/SearchBox.js.map +1 -1
  324. package/dist/components/public/index.cjs +6 -413
  325. package/dist/components/public/index.cjs.map +1 -1
  326. package/dist/components/skeletons/MainSlotSkeleton.d.ts +0 -7
  327. package/dist/components/skeletons/MainSlotSkeleton.d.ts.map +1 -1
  328. package/dist/components/skeletons/MainSlotSkeleton.js +4 -17
  329. package/dist/components/skeletons/MainSlotSkeleton.js.map +1 -1
  330. package/dist/components/skeletons/blocks.d.ts.map +1 -1
  331. package/dist/components/skeletons/blocks.js +15 -7
  332. package/dist/components/skeletons/blocks.js.map +1 -1
  333. package/dist/components/skeletons/index.d.ts +4 -4
  334. package/dist/components/skeletons/index.d.ts.map +1 -1
  335. package/dist/components/skeletons/index.js +1 -2
  336. package/dist/components/skeletons/index.js.map +1 -1
  337. package/dist/components/skeletons/primitives.d.ts +2 -2
  338. package/dist/components/skeletons/primitives.d.ts.map +1 -1
  339. package/dist/components/skeletons/primitives.js +3 -3
  340. package/dist/components/skeletons/primitives.js.map +1 -1
  341. package/dist/components/test/dndTestUtils.d.ts +7 -0
  342. package/dist/components/test/dndTestUtils.d.ts.map +1 -0
  343. package/dist/components/test/dndTestUtils.js +15 -0
  344. package/dist/components/test/dndTestUtils.js.map +1 -0
  345. package/dist/components/ui/Avatar/Avatar.d.ts +5 -0
  346. package/dist/components/ui/Avatar/Avatar.d.ts.map +1 -0
  347. package/dist/components/ui/Avatar/Avatar.js +63 -0
  348. package/dist/components/ui/Avatar/Avatar.js.map +1 -0
  349. package/dist/components/ui/{branch-chip.d.ts → BranchChip/BranchChip.d.ts} +2 -5
  350. package/dist/components/ui/BranchChip/BranchChip.d.ts.map +1 -0
  351. package/dist/components/ui/BranchChip/BranchChip.js +47 -0
  352. package/dist/components/ui/BranchChip/BranchChip.js.map +1 -0
  353. package/dist/components/ui/Button/Button.d.ts +15 -0
  354. package/dist/components/ui/Button/Button.d.ts.map +1 -0
  355. package/dist/components/ui/Button/Button.js +49 -0
  356. package/dist/components/ui/Button/Button.js.map +1 -0
  357. package/dist/components/ui/Card/Card.d.ts +6 -0
  358. package/dist/components/ui/Card/Card.d.ts.map +1 -0
  359. package/dist/components/ui/{card.js → Card/Card.js} +12 -22
  360. package/dist/components/ui/Card/Card.js.map +1 -0
  361. package/dist/components/ui/{chip.d.ts → Chip/Chip.d.ts} +1 -1
  362. package/dist/components/ui/Chip/Chip.d.ts.map +1 -0
  363. package/dist/components/ui/Chip/Chip.js +24 -0
  364. package/dist/components/ui/Chip/Chip.js.map +1 -0
  365. package/dist/components/ui/Dialog/Dialog.d.ts +32 -0
  366. package/dist/components/ui/Dialog/Dialog.d.ts.map +1 -0
  367. package/dist/components/ui/Dialog/Dialog.js +194 -0
  368. package/dist/components/ui/Dialog/Dialog.js.map +1 -0
  369. package/dist/components/ui/DropdownMenu/DropdownMenu.d.ts +66 -0
  370. package/dist/components/ui/DropdownMenu/DropdownMenu.d.ts.map +1 -0
  371. package/dist/components/ui/DropdownMenu/DropdownMenu.js +308 -0
  372. package/dist/components/ui/DropdownMenu/DropdownMenu.js.map +1 -0
  373. package/dist/components/ui/{field.d.ts → FormField/Field.d.ts} +1 -1
  374. package/dist/components/ui/FormField/Field.d.ts.map +1 -0
  375. package/dist/components/ui/FormField/Field.js +41 -0
  376. package/dist/components/ui/FormField/Field.js.map +1 -0
  377. package/dist/components/{FieldShell.d.ts → ui/FormField/FieldShell.d.ts} +2 -2
  378. package/dist/components/ui/FormField/FieldShell.d.ts.map +1 -0
  379. package/dist/components/ui/FormField/FieldShell.js +29 -0
  380. package/dist/components/ui/FormField/FieldShell.js.map +1 -0
  381. package/dist/components/ui/FormField/FormBooleanField.d.ts.map +1 -0
  382. package/dist/components/ui/FormField/FormBooleanField.js +56 -0
  383. package/dist/components/ui/FormField/FormBooleanField.js.map +1 -0
  384. package/dist/components/ui/FormField/FormColorField.d.ts.map +1 -0
  385. package/dist/components/{FormColorField.js → ui/FormField/FormColorField.js} +10 -13
  386. package/dist/components/ui/FormField/FormColorField.js.map +1 -0
  387. package/dist/components/{FormConditionalField.d.ts → ui/FormField/FormConditionalField.d.ts} +1 -1
  388. package/dist/components/ui/FormField/FormConditionalField.d.ts.map +1 -0
  389. package/dist/components/{FormConditionalField.js → ui/FormField/FormConditionalField.js} +61 -58
  390. package/dist/components/ui/FormField/FormConditionalField.js.map +1 -0
  391. package/dist/components/ui/FormField/FormDatetimeField.d.ts.map +1 -0
  392. package/dist/components/ui/FormField/FormDatetimeField.js +48 -0
  393. package/dist/components/ui/FormField/FormDatetimeField.js.map +1 -0
  394. package/dist/components/{FormFields.d.ts → ui/FormField/FormFields.d.ts} +1 -1
  395. package/dist/components/ui/FormField/FormFields.d.ts.map +1 -0
  396. package/dist/components/{FormFields.js → ui/FormField/FormFields.js} +6 -6
  397. package/dist/components/ui/FormField/FormFields.js.map +1 -0
  398. package/dist/components/{FormImageField.d.ts → ui/FormField/FormImageField.d.ts} +1 -1
  399. package/dist/components/ui/FormField/FormImageField.d.ts.map +1 -0
  400. package/dist/components/{FormImageField.js → ui/FormField/FormImageField.js} +25 -30
  401. package/dist/components/ui/FormField/FormImageField.js.map +1 -0
  402. package/dist/components/ui/FormField/FormJsonField.d.ts.map +1 -0
  403. package/dist/components/{FormJsonField.js → ui/FormField/FormJsonField.js} +7 -10
  404. package/dist/components/ui/FormField/FormJsonField.js.map +1 -0
  405. package/dist/components/ui/FormField/FormMarkdownField.d.ts.map +1 -0
  406. package/dist/components/{FormMarkdownField.js → ui/FormField/FormMarkdownField.js} +11 -20
  407. package/dist/components/ui/FormField/FormMarkdownField.js.map +1 -0
  408. package/dist/components/ui/FormField/FormNumberField.d.ts.map +1 -0
  409. package/dist/components/ui/FormField/FormNumberField.js +38 -0
  410. package/dist/components/ui/FormField/FormNumberField.js.map +1 -0
  411. package/dist/components/{FormReferenceField.d.ts → ui/FormField/FormReferenceField.d.ts} +1 -1
  412. package/dist/components/ui/FormField/FormReferenceField.d.ts.map +1 -0
  413. package/dist/components/{FormReferenceField.js → ui/FormField/FormReferenceField.js} +109 -118
  414. package/dist/components/ui/FormField/FormReferenceField.js.map +1 -0
  415. package/dist/components/{FormRichTextField.d.ts → ui/FormField/FormRichTextField.d.ts} +1 -1
  416. package/dist/components/ui/FormField/FormRichTextField.d.ts.map +1 -0
  417. package/dist/components/{FormRichTextField.js → ui/FormField/FormRichTextField.js} +28 -33
  418. package/dist/components/ui/FormField/FormRichTextField.js.map +1 -0
  419. package/dist/components/{FormSelectField.d.ts → ui/FormField/FormSelectField.d.ts} +1 -1
  420. package/dist/components/ui/FormField/FormSelectField.d.ts.map +1 -0
  421. package/dist/components/{FormSelectField.js → ui/FormField/FormSelectField.js} +11 -23
  422. package/dist/components/ui/FormField/FormSelectField.js.map +1 -0
  423. package/dist/components/ui/FormField/FormSlugField.d.ts.map +1 -0
  424. package/dist/components/{FormSlugField.js → ui/FormField/FormSlugField.js} +21 -26
  425. package/dist/components/ui/FormField/FormSlugField.js.map +1 -0
  426. package/dist/components/ui/FormField/FormStringField.d.ts.map +1 -0
  427. package/dist/components/ui/FormField/FormStringField.js +23 -0
  428. package/dist/components/ui/FormField/FormStringField.js.map +1 -0
  429. package/dist/components/ui/FormField/FormStringListField.d.ts.map +1 -0
  430. package/dist/components/{FormStringListField.js → ui/FormField/FormStringListField.js} +14 -25
  431. package/dist/components/ui/FormField/FormStringListField.js.map +1 -0
  432. package/dist/components/ui/FormField/FormTextField.d.ts.map +1 -0
  433. package/dist/components/ui/FormField/FormTextField.js +35 -0
  434. package/dist/components/ui/FormField/FormTextField.js.map +1 -0
  435. package/dist/components/ui/FormField/FormUrlField.d.ts.map +1 -0
  436. package/dist/components/ui/FormField/FormUrlField.js +26 -0
  437. package/dist/components/ui/FormField/FormUrlField.js.map +1 -0
  438. package/dist/components/{richtext → ui/FormField/richtext}/ComponentEmbedEditor.d.ts +1 -1
  439. package/dist/components/ui/FormField/richtext/ComponentEmbedEditor.d.ts.map +1 -0
  440. package/dist/components/ui/FormField/richtext/ComponentEmbedEditor.js +165 -0
  441. package/dist/components/ui/FormField/richtext/ComponentEmbedEditor.js.map +1 -0
  442. package/dist/components/ui/FormField/richtext/ConditionEmbedEditor.d.ts.map +1 -0
  443. package/dist/components/{richtext → ui/FormField/richtext}/ConditionEmbedEditor.js +25 -39
  444. package/dist/components/ui/FormField/richtext/ConditionEmbedEditor.js.map +1 -0
  445. package/dist/components/ui/FormField/richtext/ImageEmbedEditor.d.ts.map +1 -0
  446. package/dist/components/{richtext → ui/FormField/richtext}/ImageEmbedEditor.js +77 -56
  447. package/dist/components/ui/FormField/richtext/ImageEmbedEditor.js.map +1 -0
  448. package/dist/components/ui/FormField/richtext/ReferenceEmbedEditor.d.ts.map +1 -0
  449. package/dist/components/{richtext → ui/FormField/richtext}/ReferenceEmbedEditor.js +55 -43
  450. package/dist/components/ui/FormField/richtext/ReferenceEmbedEditor.js.map +1 -0
  451. package/dist/components/ui/FormField/richtext/SlashCommandMenu.d.ts.map +1 -0
  452. package/dist/components/{richtext → ui/FormField/richtext}/SlashCommandMenu.js +21 -33
  453. package/dist/components/ui/FormField/richtext/SlashCommandMenu.js.map +1 -0
  454. package/dist/components/ui/FormField/richtext/VariableEmbedEditor.d.ts.map +1 -0
  455. package/dist/components/ui/FormField/richtext/VariableEmbedEditor.js +61 -0
  456. package/dist/components/ui/FormField/richtext/VariableEmbedEditor.js.map +1 -0
  457. package/dist/components/ui/Icon/Icon.d.ts +77 -0
  458. package/dist/components/ui/Icon/Icon.d.ts.map +1 -0
  459. package/dist/components/ui/Icon/Icon.js +618 -0
  460. package/dist/components/ui/Icon/Icon.js.map +1 -0
  461. package/dist/components/ui/{input.d.ts → Input/Input.d.ts} +1 -1
  462. package/dist/components/ui/Input/Input.d.ts.map +1 -0
  463. package/dist/components/ui/Input/Input.js +25 -0
  464. package/dist/components/ui/Input/Input.js.map +1 -0
  465. package/dist/components/ui/{kbd.d.ts → Kbd/Kbd.d.ts} +1 -1
  466. package/dist/components/ui/Kbd/Kbd.d.ts.map +1 -0
  467. package/dist/components/ui/Kbd/Kbd.js +19 -0
  468. package/dist/components/ui/Kbd/Kbd.js.map +1 -0
  469. package/dist/components/ui/Label/Label.d.ts +3 -0
  470. package/dist/components/ui/Label/Label.d.ts.map +1 -0
  471. package/dist/components/ui/Label/Label.js +20 -0
  472. package/dist/components/ui/Label/Label.js.map +1 -0
  473. package/dist/components/ui/Portal/Portal.d.ts +8 -0
  474. package/dist/components/ui/Portal/Portal.d.ts.map +1 -0
  475. package/dist/components/ui/Portal/Portal.js +14 -0
  476. package/dist/components/ui/Portal/Portal.js.map +1 -0
  477. package/dist/components/ui/Select/Select.d.ts +33 -0
  478. package/dist/components/ui/Select/Select.d.ts.map +1 -0
  479. package/dist/components/ui/Select/Select.js +280 -0
  480. package/dist/components/ui/Select/Select.js.map +1 -0
  481. package/dist/components/ui/Slot/Slot.d.ts +6 -0
  482. package/dist/components/ui/Slot/Slot.d.ts.map +1 -0
  483. package/dist/components/ui/Slot/Slot.js +39 -0
  484. package/dist/components/ui/Slot/Slot.js.map +1 -0
  485. package/dist/components/ui/{status-badge.d.ts → StatusBadge/StatusBadge.d.ts} +2 -2
  486. package/dist/components/ui/StatusBadge/StatusBadge.d.ts.map +1 -0
  487. package/dist/components/ui/{status-badge.js → StatusBadge/StatusBadge.js} +8 -9
  488. package/dist/components/ui/StatusBadge/StatusBadge.js.map +1 -0
  489. package/dist/components/ui/Switcher/Switcher.d.ts +9 -0
  490. package/dist/components/ui/Switcher/Switcher.d.ts.map +1 -0
  491. package/dist/components/ui/Switcher/Switcher.js +75 -0
  492. package/dist/components/ui/Switcher/Switcher.js.map +1 -0
  493. package/dist/components/ui/{table.d.ts → Table/Table.d.ts} +1 -1
  494. package/dist/components/ui/Table/Table.d.ts.map +1 -0
  495. package/dist/components/ui/{table.js → Table/Table.js} +11 -29
  496. package/dist/components/ui/Table/Table.js.map +1 -0
  497. package/dist/components/ui/Tabs/Tabs.d.ts +16 -0
  498. package/dist/components/ui/Tabs/Tabs.d.ts.map +1 -0
  499. package/dist/components/ui/Tabs/Tabs.js +96 -0
  500. package/dist/components/ui/Tabs/Tabs.js.map +1 -0
  501. package/dist/components/ui/{textarea.d.ts → Textarea/Textarea.d.ts} +1 -1
  502. package/dist/components/ui/Textarea/Textarea.d.ts.map +1 -0
  503. package/dist/components/ui/Textarea/Textarea.js +16 -0
  504. package/dist/components/ui/Textarea/Textarea.js.map +1 -0
  505. package/dist/components/ui/Toast/Toast.d.ts +21 -0
  506. package/dist/components/ui/Toast/Toast.d.ts.map +1 -0
  507. package/dist/components/ui/Toast/Toast.js +98 -0
  508. package/dist/components/ui/Toast/Toast.js.map +1 -0
  509. package/dist/components/ui/{toaster.d.ts → Toaster/Toaster.d.ts} +1 -1
  510. package/dist/components/ui/Toaster/Toaster.d.ts.map +1 -0
  511. package/dist/components/ui/Toaster/Toaster.js +27 -0
  512. package/dist/components/ui/Toaster/Toaster.js.map +1 -0
  513. package/dist/components/ui/index.d.ts +45 -31
  514. package/dist/components/ui/index.d.ts.map +1 -1
  515. package/dist/components/ui/index.js +76 -36
  516. package/dist/components/ui/index.js.map +1 -1
  517. package/dist/config.cjs +4 -99
  518. package/dist/config.cjs.map +1 -1
  519. package/dist/defineConfig.cjs +0 -2
  520. package/dist/defineConfig.cjs.map +1 -1
  521. package/dist/globals.css +9648 -430
  522. package/dist/hooks/useComposedRefs.d.ts +5 -0
  523. package/dist/hooks/useComposedRefs.d.ts.map +1 -0
  524. package/dist/hooks/useComposedRefs.js +23 -0
  525. package/dist/hooks/useComposedRefs.js.map +1 -0
  526. package/dist/hooks/useControllableState.d.ts +8 -0
  527. package/dist/hooks/useControllableState.d.ts.map +1 -0
  528. package/dist/hooks/useControllableState.js +28 -0
  529. package/dist/hooks/useControllableState.js.map +1 -0
  530. package/dist/hooks/usePopoverContent.d.ts +26 -0
  531. package/dist/hooks/usePopoverContent.d.ts.map +1 -0
  532. package/dist/hooks/usePopoverContent.js +44 -0
  533. package/dist/hooks/usePopoverContent.js.map +1 -0
  534. package/dist/hooks/useToast.d.ts +4 -4
  535. package/dist/hooks/useToast.d.ts.map +1 -1
  536. package/dist/hooks/useToast.js +1 -3
  537. package/dist/hooks/useToast.js.map +1 -1
  538. package/dist/index.cjs +11 -9506
  539. package/dist/index.cjs.map +1 -1
  540. package/dist/{init-KWH66PKY.js → init-KNIWQGJL.js} +3 -18
  541. package/dist/init-KNIWQGJL.js.map +1 -0
  542. package/dist/lib/configStore.cjs +1 -3
  543. package/dist/lib/configStore.cjs.map +1 -1
  544. package/dist/lib/slugField.d.ts.map +1 -1
  545. package/dist/lib/slugField.js +3 -3
  546. package/dist/lib/slugField.js.map +1 -1
  547. package/dist/lib/slugify.d.ts +13 -0
  548. package/dist/lib/slugify.d.ts.map +1 -0
  549. package/dist/lib/slugify.js +8 -0
  550. package/dist/lib/slugify.js.map +1 -0
  551. package/dist/lib/utils.d.ts +5 -9
  552. package/dist/lib/utils.d.ts.map +1 -1
  553. package/dist/lib/utils.js +29 -3
  554. package/dist/lib/utils.js.map +1 -1
  555. package/dist/query.cjs +58 -9011
  556. package/dist/query.cjs.map +1 -1
  557. package/dist/types.cjs +0 -2
  558. package/dist/types.cjs.map +1 -1
  559. package/dist/types.d.ts +3 -1
  560. package/dist/types.d.ts.map +1 -1
  561. package/dist/{update-QNJRYPMC.js → update-QALIQG76.js} +2 -2
  562. package/dist/withOctoCMS.cjs +2 -36
  563. package/dist/withOctoCMS.cjs.map +1 -1
  564. package/globals.css +9648 -430
  565. package/package.json +1 -16
  566. package/dist/chunk-NAHOP7TG.js +0 -7
  567. package/dist/components/ContentModel/ContentModelList.skeleton.d.ts +0 -5
  568. package/dist/components/ContentModel/ContentModelList.skeleton.d.ts.map +0 -1
  569. package/dist/components/ContentModel/ContentModelList.skeleton.js +0 -16
  570. package/dist/components/ContentModel/ContentModelList.skeleton.js.map +0 -1
  571. package/dist/components/ContentModel/ContentTypeDetail.skeleton.d.ts +0 -5
  572. package/dist/components/ContentModel/ContentTypeDetail.skeleton.d.ts.map +0 -1
  573. package/dist/components/ContentModel/ContentTypeDetail.skeleton.js +0 -22
  574. package/dist/components/ContentModel/ContentTypeDetail.skeleton.js.map +0 -1
  575. package/dist/components/ContentTypes.d.ts +0 -7
  576. package/dist/components/ContentTypes.d.ts.map +0 -1
  577. package/dist/components/ContentTypes.js +0 -132
  578. package/dist/components/ContentTypes.js.map +0 -1
  579. package/dist/components/CreateBranchDialog.d.ts.map +0 -1
  580. package/dist/components/CreateBranchDialog.js.map +0 -1
  581. package/dist/components/Dashboard/DashboardContent.collection.skeleton.d.ts +0 -3
  582. package/dist/components/Dashboard/DashboardContent.collection.skeleton.d.ts.map +0 -1
  583. package/dist/components/Dashboard/DashboardContent.collection.skeleton.js +0 -10
  584. package/dist/components/Dashboard/DashboardContent.collection.skeleton.js.map +0 -1
  585. package/dist/components/Dashboard/DashboardContent.list.skeleton.d.ts +0 -7
  586. package/dist/components/Dashboard/DashboardContent.list.skeleton.d.ts.map +0 -1
  587. package/dist/components/Dashboard/DashboardContent.list.skeleton.js +0 -22
  588. package/dist/components/Dashboard/DashboardContent.list.skeleton.js.map +0 -1
  589. package/dist/components/Dashboard/DashboardContent.skeleton.d.ts +0 -2
  590. package/dist/components/Dashboard/DashboardContent.skeleton.d.ts.map +0 -1
  591. package/dist/components/Dashboard/DashboardContent.skeleton.js +0 -13
  592. package/dist/components/Dashboard/DashboardContent.skeleton.js.map +0 -1
  593. package/dist/components/EditPost/EditPost.skeleton.d.ts +0 -5
  594. package/dist/components/EditPost/EditPost.skeleton.d.ts.map +0 -1
  595. package/dist/components/EditPost/EditPost.skeleton.js +0 -34
  596. package/dist/components/EditPost/EditPost.skeleton.js.map +0 -1
  597. package/dist/components/ErrorBoundary.d.ts.map +0 -1
  598. package/dist/components/ErrorBoundary.js.map +0 -1
  599. package/dist/components/FieldHintAndError.d.ts +0 -8
  600. package/dist/components/FieldHintAndError.d.ts.map +0 -1
  601. package/dist/components/FieldHintAndError.js +0 -14
  602. package/dist/components/FieldHintAndError.js.map +0 -1
  603. package/dist/components/FieldLabel.d.ts +0 -11
  604. package/dist/components/FieldLabel.d.ts.map +0 -1
  605. package/dist/components/FieldLabel.js +0 -17
  606. package/dist/components/FieldLabel.js.map +0 -1
  607. package/dist/components/FieldShell.d.ts.map +0 -1
  608. package/dist/components/FieldShell.js +0 -29
  609. package/dist/components/FieldShell.js.map +0 -1
  610. package/dist/components/FileExplorer/FileExplorer.d.ts +0 -8
  611. package/dist/components/FileExplorer/FileExplorer.d.ts.map +0 -1
  612. package/dist/components/FileExplorer/FileExplorer.js +0 -68
  613. package/dist/components/FileExplorer/FileExplorer.js.map +0 -1
  614. package/dist/components/FormBooleanField.d.ts.map +0 -1
  615. package/dist/components/FormBooleanField.js +0 -52
  616. package/dist/components/FormBooleanField.js.map +0 -1
  617. package/dist/components/FormColorField.d.ts.map +0 -1
  618. package/dist/components/FormColorField.js.map +0 -1
  619. package/dist/components/FormConditionalField.d.ts.map +0 -1
  620. package/dist/components/FormConditionalField.js.map +0 -1
  621. package/dist/components/FormDatetimeField.d.ts.map +0 -1
  622. package/dist/components/FormDatetimeField.js +0 -42
  623. package/dist/components/FormDatetimeField.js.map +0 -1
  624. package/dist/components/FormFields.d.ts.map +0 -1
  625. package/dist/components/FormFields.js.map +0 -1
  626. package/dist/components/FormImageField.d.ts.map +0 -1
  627. package/dist/components/FormImageField.js.map +0 -1
  628. package/dist/components/FormJsonField.d.ts.map +0 -1
  629. package/dist/components/FormJsonField.js.map +0 -1
  630. package/dist/components/FormMarkdownField.d.ts.map +0 -1
  631. package/dist/components/FormMarkdownField.js.map +0 -1
  632. package/dist/components/FormNumberField.d.ts.map +0 -1
  633. package/dist/components/FormNumberField.js +0 -43
  634. package/dist/components/FormNumberField.js.map +0 -1
  635. package/dist/components/FormReferenceField.d.ts.map +0 -1
  636. package/dist/components/FormReferenceField.js.map +0 -1
  637. package/dist/components/FormRichTextField.d.ts.map +0 -1
  638. package/dist/components/FormRichTextField.js.map +0 -1
  639. package/dist/components/FormSelectField.d.ts.map +0 -1
  640. package/dist/components/FormSelectField.js.map +0 -1
  641. package/dist/components/FormSlugField.d.ts.map +0 -1
  642. package/dist/components/FormSlugField.js.map +0 -1
  643. package/dist/components/FormStringField.d.ts.map +0 -1
  644. package/dist/components/FormStringField.js +0 -28
  645. package/dist/components/FormStringField.js.map +0 -1
  646. package/dist/components/FormStringListField.d.ts.map +0 -1
  647. package/dist/components/FormStringListField.js.map +0 -1
  648. package/dist/components/FormTextField.d.ts.map +0 -1
  649. package/dist/components/FormTextField.js +0 -40
  650. package/dist/components/FormTextField.js.map +0 -1
  651. package/dist/components/FormUrlField.d.ts.map +0 -1
  652. package/dist/components/FormUrlField.js +0 -31
  653. package/dist/components/FormUrlField.js.map +0 -1
  654. package/dist/components/Layout/PageBar.d.ts +0 -10
  655. package/dist/components/Layout/PageBar.d.ts.map +0 -1
  656. package/dist/components/Layout/PageBar.js +0 -43
  657. package/dist/components/Layout/PageBar.js.map +0 -1
  658. package/dist/components/Layout/PageShell.d.ts +0 -30
  659. package/dist/components/Layout/PageShell.d.ts.map +0 -1
  660. package/dist/components/Layout/PageShell.js +0 -33
  661. package/dist/components/Layout/PageShell.js.map +0 -1
  662. package/dist/components/MediaAsset/MediaAsset.skeleton.d.ts +0 -3
  663. package/dist/components/MediaAsset/MediaAsset.skeleton.d.ts.map +0 -1
  664. package/dist/components/MediaAsset/MediaAsset.skeleton.js +0 -42
  665. package/dist/components/MediaAsset/MediaAsset.skeleton.js.map +0 -1
  666. package/dist/components/MediaManager/MediaManager.skeleton.d.ts +0 -3
  667. package/dist/components/MediaManager/MediaManager.skeleton.d.ts.map +0 -1
  668. package/dist/components/MediaManager/MediaManager.skeleton.js +0 -30
  669. package/dist/components/MediaManager/MediaManager.skeleton.js.map +0 -1
  670. package/dist/components/StatusBadge.d.ts +0 -2
  671. package/dist/components/StatusBadge.d.ts.map +0 -1
  672. package/dist/components/StatusBadge.js +0 -7
  673. package/dist/components/StatusBadge.js.map +0 -1
  674. package/dist/components/richtext/ComponentEmbedEditor.d.ts.map +0 -1
  675. package/dist/components/richtext/ComponentEmbedEditor.js +0 -153
  676. package/dist/components/richtext/ComponentEmbedEditor.js.map +0 -1
  677. package/dist/components/richtext/ConditionEmbedEditor.d.ts.map +0 -1
  678. package/dist/components/richtext/ConditionEmbedEditor.js.map +0 -1
  679. package/dist/components/richtext/ImageEmbedEditor.d.ts.map +0 -1
  680. package/dist/components/richtext/ImageEmbedEditor.js.map +0 -1
  681. package/dist/components/richtext/ReferenceEmbedEditor.d.ts.map +0 -1
  682. package/dist/components/richtext/ReferenceEmbedEditor.js.map +0 -1
  683. package/dist/components/richtext/SlashCommandMenu.d.ts.map +0 -1
  684. package/dist/components/richtext/SlashCommandMenu.js.map +0 -1
  685. package/dist/components/richtext/VariableEmbedEditor.d.ts.map +0 -1
  686. package/dist/components/richtext/VariableEmbedEditor.js +0 -58
  687. package/dist/components/richtext/VariableEmbedEditor.js.map +0 -1
  688. package/dist/components/ui/avatar-stack.d.ts +0 -13
  689. package/dist/components/ui/avatar-stack.d.ts.map +0 -1
  690. package/dist/components/ui/avatar-stack.js +0 -27
  691. package/dist/components/ui/avatar-stack.js.map +0 -1
  692. package/dist/components/ui/avatar.d.ts +0 -7
  693. package/dist/components/ui/avatar.d.ts.map +0 -1
  694. package/dist/components/ui/avatar.js +0 -45
  695. package/dist/components/ui/avatar.js.map +0 -1
  696. package/dist/components/ui/banner.d.ts +0 -13
  697. package/dist/components/ui/banner.d.ts.map +0 -1
  698. package/dist/components/ui/banner.js +0 -24
  699. package/dist/components/ui/banner.js.map +0 -1
  700. package/dist/components/ui/branch-chip.d.ts.map +0 -1
  701. package/dist/components/ui/branch-chip.js +0 -58
  702. package/dist/components/ui/branch-chip.js.map +0 -1
  703. package/dist/components/ui/button.d.ts +0 -14
  704. package/dist/components/ui/button.d.ts.map +0 -1
  705. package/dist/components/ui/button.js +0 -65
  706. package/dist/components/ui/button.js.map +0 -1
  707. package/dist/components/ui/card.d.ts +0 -7
  708. package/dist/components/ui/card.d.ts.map +0 -1
  709. package/dist/components/ui/card.js.map +0 -1
  710. package/dist/components/ui/chip.d.ts.map +0 -1
  711. package/dist/components/ui/chip.js +0 -44
  712. package/dist/components/ui/chip.js.map +0 -1
  713. package/dist/components/ui/dialog.d.ts +0 -20
  714. package/dist/components/ui/dialog.d.ts.map +0 -1
  715. package/dist/components/ui/dialog.js +0 -93
  716. package/dist/components/ui/dialog.js.map +0 -1
  717. package/dist/components/ui/dropdown-menu.d.ts +0 -28
  718. package/dist/components/ui/dropdown-menu.d.ts.map +0 -1
  719. package/dist/components/ui/dropdown-menu.js +0 -165
  720. package/dist/components/ui/dropdown-menu.js.map +0 -1
  721. package/dist/components/ui/empty.d.ts +0 -11
  722. package/dist/components/ui/empty.d.ts.map +0 -1
  723. package/dist/components/ui/empty.js +0 -24
  724. package/dist/components/ui/empty.js.map +0 -1
  725. package/dist/components/ui/field.d.ts.map +0 -1
  726. package/dist/components/ui/field.js +0 -52
  727. package/dist/components/ui/field.js.map +0 -1
  728. package/dist/components/ui/input.d.ts.map +0 -1
  729. package/dist/components/ui/input.js +0 -51
  730. package/dist/components/ui/input.js.map +0 -1
  731. package/dist/components/ui/kbd.d.ts.map +0 -1
  732. package/dist/components/ui/kbd.js +0 -30
  733. package/dist/components/ui/kbd.js.map +0 -1
  734. package/dist/components/ui/label.d.ts +0 -6
  735. package/dist/components/ui/label.d.ts.map +0 -1
  736. package/dist/components/ui/label.js +0 -20
  737. package/dist/components/ui/label.js.map +0 -1
  738. package/dist/components/ui/publish-button.d.ts +0 -7
  739. package/dist/components/ui/publish-button.d.ts.map +0 -1
  740. package/dist/components/ui/publish-button.js +0 -50
  741. package/dist/components/ui/publish-button.js.map +0 -1
  742. package/dist/components/ui/select.d.ts +0 -14
  743. package/dist/components/ui/select.d.ts.map +0 -1
  744. package/dist/components/ui/select.js +0 -132
  745. package/dist/components/ui/select.js.map +0 -1
  746. package/dist/components/ui/sonner.d.ts +0 -6
  747. package/dist/components/ui/sonner.d.ts.map +0 -1
  748. package/dist/components/ui/sonner.js +0 -37
  749. package/dist/components/ui/sonner.js.map +0 -1
  750. package/dist/components/ui/status-badge.d.ts.map +0 -1
  751. package/dist/components/ui/status-badge.js.map +0 -1
  752. package/dist/components/ui/table.d.ts.map +0 -1
  753. package/dist/components/ui/table.js.map +0 -1
  754. package/dist/components/ui/tabs-pill.d.ts +0 -17
  755. package/dist/components/ui/tabs-pill.d.ts.map +0 -1
  756. package/dist/components/ui/tabs-pill.js +0 -67
  757. package/dist/components/ui/tabs-pill.js.map +0 -1
  758. package/dist/components/ui/tabs.d.ts +0 -8
  759. package/dist/components/ui/tabs.d.ts.map +0 -1
  760. package/dist/components/ui/tabs.js +0 -59
  761. package/dist/components/ui/tabs.js.map +0 -1
  762. package/dist/components/ui/textarea.d.ts.map +0 -1
  763. package/dist/components/ui/textarea.js +0 -25
  764. package/dist/components/ui/textarea.js.map +0 -1
  765. package/dist/components/ui/toast-card.d.ts +0 -15
  766. package/dist/components/ui/toast-card.d.ts.map +0 -1
  767. package/dist/components/ui/toast-card.js +0 -90
  768. package/dist/components/ui/toast-card.js.map +0 -1
  769. package/dist/components/ui/toast.d.ts +0 -16
  770. package/dist/components/ui/toast.d.ts.map +0 -1
  771. package/dist/components/ui/toast.js +0 -95
  772. package/dist/components/ui/toast.js.map +0 -1
  773. package/dist/components/ui/toaster.d.ts.map +0 -1
  774. package/dist/components/ui/toaster.js +0 -30
  775. package/dist/components/ui/toaster.js.map +0 -1
  776. package/dist/init-KWH66PKY.js.map +0 -1
  777. /package/dist/{agentDocs-M3R2CPUQ.js.map → agentDocs-QZ4NOQVH.js.map} +0 -0
  778. /package/dist/components/{ErrorBoundary.d.ts → ErrorBoundary/ErrorBoundary.d.ts} +0 -0
  779. /package/dist/components/{CreateBranchDialog.d.ts → Layout/CreateBranchDialog.d.ts} +0 -0
  780. /package/dist/components/{FormBooleanField.d.ts → ui/FormField/FormBooleanField.d.ts} +0 -0
  781. /package/dist/components/{FormColorField.d.ts → ui/FormField/FormColorField.d.ts} +0 -0
  782. /package/dist/components/{FormDatetimeField.d.ts → ui/FormField/FormDatetimeField.d.ts} +0 -0
  783. /package/dist/components/{FormJsonField.d.ts → ui/FormField/FormJsonField.d.ts} +0 -0
  784. /package/dist/components/{FormMarkdownField.d.ts → ui/FormField/FormMarkdownField.d.ts} +0 -0
  785. /package/dist/components/{FormNumberField.d.ts → ui/FormField/FormNumberField.d.ts} +0 -0
  786. /package/dist/components/{FormSlugField.d.ts → ui/FormField/FormSlugField.d.ts} +0 -0
  787. /package/dist/components/{FormStringField.d.ts → ui/FormField/FormStringField.d.ts} +0 -0
  788. /package/dist/components/{FormStringListField.d.ts → ui/FormField/FormStringListField.d.ts} +0 -0
  789. /package/dist/components/{FormTextField.d.ts → ui/FormField/FormTextField.d.ts} +0 -0
  790. /package/dist/components/{FormUrlField.d.ts → ui/FormField/FormUrlField.d.ts} +0 -0
  791. /package/dist/components/{richtext → ui/FormField/richtext}/ConditionEmbedEditor.d.ts +0 -0
  792. /package/dist/components/{richtext → ui/FormField/richtext}/ImageEmbedEditor.d.ts +0 -0
  793. /package/dist/components/{richtext → ui/FormField/richtext}/ReferenceEmbedEditor.d.ts +0 -0
  794. /package/dist/components/{richtext → ui/FormField/richtext}/SlashCommandMenu.d.ts +0 -0
  795. /package/dist/components/{richtext → ui/FormField/richtext}/VariableEmbedEditor.d.ts +0 -0
  796. /package/dist/{update-QNJRYPMC.js.map → update-QALIQG76.js.map} +0 -0
@@ -1,20 +1,30 @@
1
1
  "use client";
2
- import "../../chunk-B5LE2OEC.js";
3
- import { jsx, jsxs } from "react/jsx-runtime";
2
+ import {
3
+ __spreadValues
4
+ } from "../../chunk-B5LE2OEC.js";
5
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
4
6
  import { useEffect, useMemo, useRef } from "react";
5
- import { Bot, CheckCheck, RefreshCw, StopCircle } from "lucide-react";
6
- import { Button } from "../ui/button";
7
- import { ErrorBoundary } from "../ErrorBoundary";
7
+ import { Button, Icon } from "../ui";
8
+ import { ErrorBoundary } from "../ErrorBoundary/ErrorBoundary";
9
+ import { Page } from "../Layout/Page";
10
+ import { ChatAgentSetup } from "./ChatAgentSetup";
11
+ import { ChatSidebar } from "./ChatSidebar";
8
12
  import { Composer } from "./Composer";
9
13
  import { Message } from "./Message";
10
- import { useChatStream } from "./useChatStream";
11
- const PROVIDER_LABEL = {
12
- anthropic: "Anthropic",
13
- openai: "OpenAI",
14
- local: "Local"
15
- };
16
- function ChatPage({ initialMeta, attachmentLimits }) {
14
+ import { useChatHistory } from "./useChatHistory";
15
+ function ChatPage(props) {
16
+ if (props.mode === "setup") {
17
+ return /* @__PURE__ */ jsx(ChatAgentSetup, { setup: props.setup });
18
+ }
19
+ return /* @__PURE__ */ jsx(ChatPageReady, __spreadValues({}, props));
20
+ }
21
+ function ChatPageReady({ initialMeta, attachmentLimits }) {
17
22
  var _a, _b;
23
+ const PROVIDER_LABEL = {
24
+ anthropic: "Anthropic",
25
+ openai: "OpenAI",
26
+ local: "Local"
27
+ };
18
28
  const {
19
29
  entries,
20
30
  meta,
@@ -25,12 +35,16 @@ function ChatPage({ initialMeta, attachmentLimits }) {
25
35
  proposals,
26
36
  attachmentDiagnostics,
27
37
  send,
28
- reset,
29
38
  stop,
30
39
  acceptProposal,
31
40
  rejectProposal,
32
- acceptAllPending
33
- } = useChatStream();
41
+ acceptAllPending,
42
+ sessions,
43
+ activeId,
44
+ newConversation,
45
+ selectSession,
46
+ deleteSession
47
+ } = useChatHistory();
34
48
  const scrollerRef = useRef(null);
35
49
  useEffect(() => {
36
50
  const el = scrollerRef.current;
@@ -51,19 +65,13 @@ function ChatPage({ initialMeta, attachmentLimits }) {
51
65
  (p) => p.assistantEntryId === latestAssistantId && p.status.kind === "pending"
52
66
  );
53
67
  }, [proposals, latestAssistantId]);
54
- return /* @__PURE__ */ jsxs("div", { className: "flex h-[calc(100dvh-3.5rem)] flex-1 flex-col", children: [
55
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-b border-border px-4 py-2", children: [
56
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm", children: [
57
- /* @__PURE__ */ jsx(Bot, { className: "h-4 w-4 text-muted-foreground" }),
58
- /* @__PURE__ */ jsx("span", { className: "font-medium", children: "Chat" }),
59
- /* @__PURE__ */ jsxs("span", { className: "text-muted-foreground", children: [
60
- "\xB7 ",
61
- PROVIDER_LABEL[provider],
62
- " \xB7 ",
63
- /* @__PURE__ */ jsx("span", { className: "font-mono text-xs", children: model })
64
- ] })
65
- ] }),
66
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
68
+ return /* @__PURE__ */ jsx(
69
+ Page,
70
+ {
71
+ className: "octo-chat-page",
72
+ title: "Chat",
73
+ breadcrumbs: [{ label: `${PROVIDER_LABEL[provider]} \xB7 ${model}` }],
74
+ actions: /* @__PURE__ */ jsxs(Fragment, { children: [
67
75
  /* @__PURE__ */ jsx(
68
76
  UsageBadge,
69
77
  {
@@ -76,106 +84,100 @@ function ChatPage({ initialMeta, attachmentLimits }) {
76
84
  Button,
77
85
  {
78
86
  variant: "destructive",
79
- size: "sm",
80
87
  onClick: stop,
81
- className: "gap-1.5",
88
+ className: "octo-u-gap-1-5",
82
89
  "data-testid": "chat-stop-button",
83
90
  "aria-label": "Stop generating",
84
91
  title: "Stop the assistant \u2014 keeps whatever it has streamed so far",
85
92
  children: [
86
- /* @__PURE__ */ jsx(StopCircle, { className: "h-3.5 w-3.5" }),
93
+ /* @__PURE__ */ jsx(Icon.StopCircle, { className: "octo-icon-sm" }),
87
94
  "Stop"
88
95
  ]
89
96
  }
90
- ) : /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: reset, disabled: entries.length === 0, className: "gap-1.5", children: [
91
- /* @__PURE__ */ jsx(RefreshCw, { className: "h-3.5 w-3.5" }),
97
+ ) : /* @__PURE__ */ jsxs(Button, { variant: "primary", onClick: newConversation, children: [
98
+ /* @__PURE__ */ jsx(Icon.Plus, { className: "octo-icon-sm" }),
92
99
  "New conversation"
93
100
  ] })
94
- ] })
95
- ] }),
96
- /* @__PURE__ */ jsx("div", { ref: scrollerRef, className: "flex-1 overflow-y-auto px-4", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-3xl py-4", children: [
97
- entries.length === 0 && /* @__PURE__ */ jsxs("div", { className: "mt-12 text-center text-sm text-muted-foreground", children: [
98
- /* @__PURE__ */ jsx(Bot, { className: "mx-auto mb-3 h-8 w-8 opacity-50" }),
99
- /* @__PURE__ */ jsx("div", { className: "font-medium", children: "Ask your CMS anything." }),
100
- /* @__PURE__ */ jsxs("div", { className: "mt-1", children: [
101
- "Try: ",
102
- /* @__PURE__ */ jsx("em", { children: '"show me posts about caching"' }),
103
- " or ",
104
- /* @__PURE__ */ jsx("em", { children: `"fix the typo 'recieve' in any post"` }),
105
- "."
106
- ] })
107
101
  ] }),
108
- entries.map((e) => /* @__PURE__ */ jsx(ErrorBoundary, { label: "message", resetKeys: [e.id], children: /* @__PURE__ */ jsx(
109
- Message,
110
- {
111
- entry: e,
112
- proposals,
113
- onAcceptProposal: acceptProposal,
114
- onRejectProposal: rejectProposal
115
- }
116
- ) }, e.id)),
117
- pendingForLatest.length >= 2 && status !== "streaming" && /* @__PURE__ */ jsxs("div", { className: "my-3 flex items-center justify-between rounded-md border border-border bg-muted/40 px-3 py-2 text-xs", children: [
118
- /* @__PURE__ */ jsxs("span", { children: [
119
- /* @__PURE__ */ jsx("strong", { children: pendingForLatest.length }),
120
- " proposals pending in this turn."
121
- ] }),
122
- /* @__PURE__ */ jsxs(
123
- Button,
102
+ leftBar: /* @__PURE__ */ jsx(ChatSidebar, { sessions, activeId, onSelect: selectSession, onDelete: deleteSession }),
103
+ children: /* @__PURE__ */ jsxs("div", { className: "octo-chat", children: [
104
+ /* @__PURE__ */ jsx("div", { ref: scrollerRef, className: "octo-chat__scroller", children: /* @__PURE__ */ jsxs("div", { className: "octo-chat__transcript", children: [
105
+ entries.length === 0 && /* @__PURE__ */ jsxs("div", { className: "octo-chat__empty", children: [
106
+ /* @__PURE__ */ jsx(Icon.Bot, { className: "octo-chat__empty-icon octo-icon-xl" }),
107
+ /* @__PURE__ */ jsx("div", { className: "octo-chat__empty-title", children: "Ask your CMS anything." }),
108
+ /* @__PURE__ */ jsxs("div", { className: "octo-chat__empty-hint", children: [
109
+ "Try: ",
110
+ /* @__PURE__ */ jsx("em", { children: '"show me posts about caching"' }),
111
+ " or ",
112
+ /* @__PURE__ */ jsx("em", { children: `"fix the typo 'recieve' in any post"` }),
113
+ "."
114
+ ] })
115
+ ] }),
116
+ entries.map((e) => /* @__PURE__ */ jsx(ErrorBoundary, { label: "message", resetKeys: [e.id], children: /* @__PURE__ */ jsx(
117
+ Message,
118
+ {
119
+ entry: e,
120
+ proposals,
121
+ onAcceptProposal: acceptProposal,
122
+ onRejectProposal: rejectProposal
123
+ }
124
+ ) }, e.id)),
125
+ pendingForLatest.length >= 2 && status !== "streaming" && /* @__PURE__ */ jsxs("div", { className: "octo-chat__accept-all-bar", children: [
126
+ /* @__PURE__ */ jsxs("span", { children: [
127
+ /* @__PURE__ */ jsx("strong", { children: pendingForLatest.length }),
128
+ " proposals pending in this turn."
129
+ ] }),
130
+ /* @__PURE__ */ jsxs(
131
+ Button,
132
+ {
133
+ onClick: () => latestAssistantId && acceptAllPending(latestAssistantId),
134
+ className: "octo-u-gap-1-5",
135
+ children: [
136
+ /* @__PURE__ */ jsx(Icon.CheckCheck, { className: "octo-icon-sm" }),
137
+ "Accept all pending"
138
+ ]
139
+ }
140
+ )
141
+ ] }),
142
+ attachmentDiagnostics.length > 0 && /* @__PURE__ */ jsxs("div", { className: "octo-chat__attachment-diag", children: [
143
+ /* @__PURE__ */ jsx("div", { className: "octo-chat__attachment-diag-title", children: "Attachments" }),
144
+ /* @__PURE__ */ jsx("ul", { className: "octo-chat__attachment-diag-list", children: attachmentDiagnostics.map((d, i) => /* @__PURE__ */ jsx("li", { children: d.status === "ok" ? /* @__PURE__ */ jsxs("span", { children: [
145
+ "\u2713 ",
146
+ /* @__PURE__ */ jsx("span", { className: "octo-u-mono", children: d.filename }),
147
+ " (",
148
+ d.kind,
149
+ ")"
150
+ ] }) : /* @__PURE__ */ jsxs("span", { className: "octo-chat__attachment-diag-error", children: [
151
+ "\u2717 ",
152
+ /* @__PURE__ */ jsx("span", { className: "octo-u-mono", children: d.filename }),
153
+ " \u2014 ",
154
+ d.reason
155
+ ] }) }, i)) })
156
+ ] }),
157
+ status === "stopped" && /* @__PURE__ */ jsx("div", { className: "octo-chat__status-bar", role: "status", children: "Stopped \u2014 the assistant was interrupted. Send another message to continue." }),
158
+ status === "error" && error && /* @__PURE__ */ jsx("div", { className: "octo-chat__error-bar", children: error }),
159
+ status === "budget_exceeded" && /* @__PURE__ */ jsxs("div", { className: "octo-chat__budget-bar", children: [
160
+ "Budget reached (",
161
+ budgetReason != null ? budgetReason : "unknown",
162
+ "). Click ",
163
+ /* @__PURE__ */ jsx("strong", { children: "New conversation" }),
164
+ " to start over, or raise the caps in ",
165
+ /* @__PURE__ */ jsx("code", { children: "cms/octocms.config.ts" }),
166
+ "."
167
+ ] })
168
+ ] }) }),
169
+ /* @__PURE__ */ jsx(ErrorBoundary, { label: "composer", children: /* @__PURE__ */ jsx(
170
+ Composer,
124
171
  {
125
- size: "sm",
126
- onClick: () => latestAssistantId && acceptAllPending(latestAssistantId),
127
- className: "gap-1.5",
128
- children: [
129
- /* @__PURE__ */ jsx(CheckCheck, { className: "h-3.5 w-3.5" }),
130
- "Accept all pending"
131
- ]
172
+ disabled: status === "streaming" || status === "budget_exceeded",
173
+ maxAttachmentBytes: attachmentLimits.maxAttachmentBytes,
174
+ maxAttachmentsPerTurn: attachmentLimits.maxAttachmentsPerTurn,
175
+ onSubmit: send
132
176
  }
133
- )
134
- ] }),
135
- attachmentDiagnostics.length > 0 && /* @__PURE__ */ jsxs("div", { className: "my-3 rounded-md border border-border bg-muted/40 px-3 py-2 text-xs", children: [
136
- /* @__PURE__ */ jsx("div", { className: "font-medium mb-1", children: "Attachments" }),
137
- /* @__PURE__ */ jsx("ul", { className: "space-y-0.5", children: attachmentDiagnostics.map((d, i) => /* @__PURE__ */ jsx("li", { children: d.status === "ok" ? /* @__PURE__ */ jsxs("span", { children: [
138
- "\u2713 ",
139
- /* @__PURE__ */ jsx("span", { className: "font-mono", children: d.filename }),
140
- " (",
141
- d.kind,
142
- ")"
143
- ] }) : /* @__PURE__ */ jsxs("span", { className: "text-destructive", children: [
144
- "\u2717 ",
145
- /* @__PURE__ */ jsx("span", { className: "font-mono", children: d.filename }),
146
- " \u2014 ",
147
- d.reason
148
- ] }) }, i)) })
149
- ] }),
150
- status === "stopped" && /* @__PURE__ */ jsx(
151
- "div",
152
- {
153
- className: "my-3 rounded-md border border-border bg-muted/40 px-3 py-2 text-xs text-muted-foreground",
154
- role: "status",
155
- children: "Stopped \u2014 the assistant was interrupted. Send another message to continue."
156
- }
157
- ),
158
- status === "error" && error && /* @__PURE__ */ jsx("div", { className: "my-3 rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive", children: error }),
159
- status === "budget_exceeded" && /* @__PURE__ */ jsxs("div", { className: "my-3 rounded-md border border-amber-300 bg-amber-50 px-3 py-2 text-xs text-amber-900", children: [
160
- "Budget reached (",
161
- budgetReason != null ? budgetReason : "unknown",
162
- "). Click ",
163
- /* @__PURE__ */ jsx("strong", { children: "New conversation" }),
164
- " to start over, or raise the caps in ",
165
- /* @__PURE__ */ jsx("code", { children: "cms/octocms.config.ts" }),
166
- "."
177
+ ) })
167
178
  ] })
168
- ] }) }),
169
- /* @__PURE__ */ jsx(ErrorBoundary, { label: "composer", children: /* @__PURE__ */ jsx(
170
- Composer,
171
- {
172
- disabled: status === "streaming" || status === "budget_exceeded",
173
- maxAttachmentBytes: attachmentLimits.maxAttachmentBytes,
174
- maxAttachmentsPerTurn: attachmentLimits.maxAttachmentsPerTurn,
175
- onSubmit: send
176
- }
177
- ) })
178
- ] });
179
+ }
180
+ );
179
181
  }
180
182
  function UsageBadge({
181
183
  totalCostUSD,
@@ -183,21 +185,14 @@ function UsageBadge({
183
185
  outputTokens
184
186
  }) {
185
187
  const cost = totalCostUSD > 0 ? `$${totalCostUSD.toFixed(4)}` : "free";
186
- return /* @__PURE__ */ jsxs(
187
- "span",
188
- {
189
- className: "rounded-full border border-border bg-muted/50 px-2.5 py-0.5 font-mono text-[11px] text-muted-foreground",
190
- title: `Input: ${inputTokens} tokens \xB7 Output: ${outputTokens} tokens`,
191
- children: [
192
- cost,
193
- " \xB7 ",
194
- inputTokens + outputTokens,
195
- " tok"
196
- ]
197
- }
198
- );
188
+ return /* @__PURE__ */ jsxs("span", { className: "octo-chat__usage-badge", title: `Input: ${inputTokens} tokens \xB7 Output: ${outputTokens} tokens`, children: [
189
+ cost,
190
+ " \xB7 ",
191
+ inputTokens + outputTokens,
192
+ " tok"
193
+ ] });
199
194
  }
200
195
  export {
201
- ChatPage
196
+ ChatPage as default
202
197
  };
203
198
  //# sourceMappingURL=ChatPage.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../components/Chat/ChatPage.tsx"],"sourcesContent":["'use client';\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { Bot, CheckCheck, RefreshCw, StopCircle } from 'lucide-react';\n\nimport { Button } from '../ui/button';\nimport { ErrorBoundary } from '../ErrorBoundary';\n\nimport { Composer } from './Composer';\nimport { Message } from './Message';\nimport { useChatStream } from './useChatStream';\n\ntype Props = {\n /** Initial provider info — used until the SSE `meta` event arrives. */\n initialMeta: { provider: 'anthropic' | 'openai' | 'local'; model: string };\n /** Attachment caps from `agentConfig` — drive Composer UI validation. */\n attachmentLimits: { maxAttachmentBytes: number; maxAttachmentsPerTurn: number };\n};\n\nconst PROVIDER_LABEL: Record<'anthropic' | 'openai' | 'local', string> = {\n anthropic: 'Anthropic',\n openai: 'OpenAI',\n local: 'Local',\n};\n\nexport function ChatPage({ initialMeta, attachmentLimits }: Props) {\n const {\n entries,\n meta,\n usage,\n status,\n error,\n budgetReason,\n proposals,\n attachmentDiagnostics,\n send,\n reset,\n stop,\n acceptProposal,\n rejectProposal,\n acceptAllPending,\n } = useChatStream();\n const scrollerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const el = scrollerRef.current;\n if (!el) return;\n el.scrollTo({ top: el.scrollHeight, behavior: 'smooth' });\n }, [entries, status]);\n\n const provider = meta?.provider ?? initialMeta.provider;\n const model = meta?.model ?? initialMeta.model;\n\n // Identify the latest assistant turn so we can show \"Accept all pending\"\n // when ≥2 proposals are outstanding for it.\n const latestAssistantId = useMemo(() => {\n for (let i = entries.length - 1; i >= 0; i--) {\n if (entries[i].kind === 'assistant') return entries[i].id;\n }\n return null;\n }, [entries]);\n const pendingForLatest = useMemo(() => {\n if (!latestAssistantId) return [];\n return Object.values(proposals).filter(\n (p) => p.assistantEntryId === latestAssistantId && p.status.kind === 'pending',\n );\n }, [proposals, latestAssistantId]);\n\n return (\n <div className=\"flex h-[calc(100dvh-3.5rem)] flex-1 flex-col\">\n {/* Top bar */}\n <div className=\"flex items-center justify-between border-b border-border px-4 py-2\">\n <div className=\"flex items-center gap-2 text-sm\">\n <Bot className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"font-medium\">Chat</span>\n <span className=\"text-muted-foreground\">\n · {PROVIDER_LABEL[provider]} · <span className=\"font-mono text-xs\">{model}</span>\n </span>\n </div>\n <div className=\"flex items-center gap-3\">\n <UsageBadge\n totalCostUSD={usage.totalCostUSD}\n inputTokens={usage.inputTokens}\n outputTokens={usage.outputTokens}\n />\n {status === 'streaming' ? (\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={stop}\n className=\"gap-1.5\"\n data-testid=\"chat-stop-button\"\n aria-label=\"Stop generating\"\n title=\"Stop the assistant — keeps whatever it has streamed so far\"\n >\n <StopCircle className=\"h-3.5 w-3.5\" />\n Stop\n </Button>\n ) : (\n <Button variant=\"outline\" size=\"sm\" onClick={reset} disabled={entries.length === 0} className=\"gap-1.5\">\n <RefreshCw className=\"h-3.5 w-3.5\" />\n New conversation\n </Button>\n )}\n </div>\n </div>\n\n {/* Transcript */}\n <div ref={scrollerRef} className=\"flex-1 overflow-y-auto px-4\">\n <div className=\"mx-auto max-w-3xl py-4\">\n {entries.length === 0 && (\n <div className=\"mt-12 text-center text-sm text-muted-foreground\">\n <Bot className=\"mx-auto mb-3 h-8 w-8 opacity-50\" />\n <div className=\"font-medium\">Ask your CMS anything.</div>\n <div className=\"mt-1\">\n Try: <em>\"show me posts about caching\"</em> or <em>\"fix the typo 'recieve' in any post\"</em>.\n </div>\n </div>\n )}\n {entries.map((e) => (\n <ErrorBoundary key={e.id} label=\"message\" resetKeys={[e.id]}>\n <Message\n entry={e}\n proposals={proposals}\n onAcceptProposal={acceptProposal}\n onRejectProposal={rejectProposal}\n />\n </ErrorBoundary>\n ))}\n\n {pendingForLatest.length >= 2 && status !== 'streaming' && (\n <div className=\"my-3 flex items-center justify-between rounded-md border border-border bg-muted/40 px-3 py-2 text-xs\">\n <span>\n <strong>{pendingForLatest.length}</strong> proposals pending in this turn.\n </span>\n <Button\n size=\"sm\"\n onClick={() => latestAssistantId && acceptAllPending(latestAssistantId)}\n className=\"gap-1.5\"\n >\n <CheckCheck className=\"h-3.5 w-3.5\" />\n Accept all pending\n </Button>\n </div>\n )}\n\n {attachmentDiagnostics.length > 0 && (\n <div className=\"my-3 rounded-md border border-border bg-muted/40 px-3 py-2 text-xs\">\n <div className=\"font-medium mb-1\">Attachments</div>\n <ul className=\"space-y-0.5\">\n {attachmentDiagnostics.map((d, i) => (\n <li key={i}>\n {d.status === 'ok' ? (\n <span>\n ✓ <span className=\"font-mono\">{d.filename}</span> ({d.kind})\n </span>\n ) : (\n <span className=\"text-destructive\">\n ✗ <span className=\"font-mono\">{d.filename}</span> — {d.reason}\n </span>\n )}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {status === 'stopped' && (\n <div\n className=\"my-3 rounded-md border border-border bg-muted/40 px-3 py-2 text-xs text-muted-foreground\"\n role=\"status\"\n >\n Stopped — the assistant was interrupted. Send another message to continue.\n </div>\n )}\n\n {status === 'error' && error && (\n <div className=\"my-3 rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive\">\n {error}\n </div>\n )}\n {status === 'budget_exceeded' && (\n <div className=\"my-3 rounded-md border border-amber-300 bg-amber-50 px-3 py-2 text-xs text-amber-900\">\n Budget reached ({budgetReason ?? 'unknown'}). Click <strong>New conversation</strong> to start over, or\n raise the caps in <code>cms/octocms.config.ts</code>.\n </div>\n )}\n </div>\n </div>\n\n {/* Composer — disabled while streaming or after budget hit, but enabled\n after a Stop click so the user can immediately follow up. */}\n <ErrorBoundary label=\"composer\">\n <Composer\n disabled={status === 'streaming' || status === 'budget_exceeded'}\n maxAttachmentBytes={attachmentLimits.maxAttachmentBytes}\n maxAttachmentsPerTurn={attachmentLimits.maxAttachmentsPerTurn}\n onSubmit={send}\n />\n </ErrorBoundary>\n </div>\n );\n}\n\nfunction UsageBadge({\n totalCostUSD,\n inputTokens,\n outputTokens,\n}: {\n totalCostUSD: number;\n inputTokens: number;\n outputTokens: number;\n}) {\n const cost = totalCostUSD > 0 ? `$${totalCostUSD.toFixed(4)}` : 'free';\n return (\n <span\n className=\"rounded-full border border-border bg-muted/50 px-2.5 py-0.5 font-mono text-[11px] text-muted-foreground\"\n title={`Input: ${inputTokens} tokens · Output: ${outputTokens} tokens`}\n >\n {cost} · {inputTokens + outputTokens} tok\n </span>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../components/Chat/ChatPage.tsx"],"sourcesContent":["'use client';\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { Button, Icon } from '../ui';\n\nimport type { ChatSetupInfo } from '../../agent/chatSetup';\nimport { ErrorBoundary } from '../ErrorBoundary/ErrorBoundary';\nimport { Page } from '../Layout/Page';\n\nimport { ChatAgentSetup } from './ChatAgentSetup';\nimport { ChatSidebar } from './ChatSidebar';\nimport { Composer } from './Composer';\nimport { Message } from './Message';\nimport { useChatHistory } from './useChatHistory';\n\ntype Props =\n | {\n mode: 'setup';\n setup: ChatSetupInfo;\n }\n | {\n mode: 'ready';\n /** Initial provider info — used until the SSE `meta` event arrives. */\n initialMeta: { provider: 'anthropic' | 'openai' | 'local'; model: string };\n /** Attachment caps from `agentConfig` — drive Composer UI validation. */\n attachmentLimits: { maxAttachmentBytes: number; maxAttachmentsPerTurn: number };\n };\n\nexport default function ChatPage(props: Props) {\n if (props.mode === 'setup') {\n return <ChatAgentSetup setup={props.setup} />;\n }\n return <ChatPageReady {...props} />;\n}\n\ntype ReadyProps = Extract<Props, { mode: 'ready' }>;\n\nfunction ChatPageReady({ initialMeta, attachmentLimits }: ReadyProps) {\n const PROVIDER_LABEL: Record<'anthropic' | 'openai' | 'local', string> = {\n anthropic: 'Anthropic',\n openai: 'OpenAI',\n local: 'Local',\n };\n\n const {\n entries,\n meta,\n usage,\n status,\n error,\n budgetReason,\n proposals,\n attachmentDiagnostics,\n send,\n stop,\n acceptProposal,\n rejectProposal,\n acceptAllPending,\n sessions,\n activeId,\n newConversation,\n selectSession,\n deleteSession,\n } = useChatHistory();\n const scrollerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const el = scrollerRef.current;\n if (!el) return;\n el.scrollTo({ top: el.scrollHeight, behavior: 'smooth' });\n }, [entries, status]);\n\n const provider = meta?.provider ?? initialMeta.provider;\n const model = meta?.model ?? initialMeta.model;\n\n // Identify the latest assistant turn so we can show \"Accept all pending\"\n // when ≥2 proposals are outstanding for it.\n const latestAssistantId = useMemo(() => {\n for (let i = entries.length - 1; i >= 0; i--) {\n if (entries[i].kind === 'assistant') return entries[i].id;\n }\n return null;\n }, [entries]);\n const pendingForLatest = useMemo(() => {\n if (!latestAssistantId) return [];\n return Object.values(proposals).filter(\n (p) => p.assistantEntryId === latestAssistantId && p.status.kind === 'pending',\n );\n }, [proposals, latestAssistantId]);\n\n return (\n <Page\n className=\"octo-chat-page\"\n title=\"Chat\"\n breadcrumbs={[{ label: `${PROVIDER_LABEL[provider]} · ${model}` }]}\n actions={\n <>\n <UsageBadge\n totalCostUSD={usage.totalCostUSD}\n inputTokens={usage.inputTokens}\n outputTokens={usage.outputTokens}\n />\n {status === 'streaming' ? (\n <Button\n variant=\"destructive\"\n onClick={stop}\n className=\"octo-u-gap-1-5\"\n data-testid=\"chat-stop-button\"\n aria-label=\"Stop generating\"\n title=\"Stop the assistant — keeps whatever it has streamed so far\"\n >\n <Icon.StopCircle className=\"octo-icon-sm\" />\n Stop\n </Button>\n ) : (\n <Button variant=\"primary\" onClick={newConversation}>\n <Icon.Plus className=\"octo-icon-sm\" />\n New conversation\n </Button>\n )}\n </>\n }\n leftBar={\n <ChatSidebar sessions={sessions} activeId={activeId} onSelect={selectSession} onDelete={deleteSession} />\n }\n >\n <div className=\"octo-chat\">\n <div ref={scrollerRef} className=\"octo-chat__scroller\">\n <div className=\"octo-chat__transcript\">\n {entries.length === 0 && (\n <div className=\"octo-chat__empty\">\n <Icon.Bot className=\"octo-chat__empty-icon octo-icon-xl\" />\n <div className=\"octo-chat__empty-title\">Ask your CMS anything.</div>\n <div className=\"octo-chat__empty-hint\">\n Try: <em>\"show me posts about caching\"</em> or <em>\"fix the typo 'recieve' in any post\"</em>.\n </div>\n </div>\n )}\n {entries.map((e) => (\n <ErrorBoundary key={e.id} label=\"message\" resetKeys={[e.id]}>\n <Message\n entry={e}\n proposals={proposals}\n onAcceptProposal={acceptProposal}\n onRejectProposal={rejectProposal}\n />\n </ErrorBoundary>\n ))}\n\n {pendingForLatest.length >= 2 && status !== 'streaming' && (\n <div className=\"octo-chat__accept-all-bar\">\n <span>\n <strong>{pendingForLatest.length}</strong> proposals pending in this turn.\n </span>\n <Button\n onClick={() => latestAssistantId && acceptAllPending(latestAssistantId)}\n className=\"octo-u-gap-1-5\"\n >\n <Icon.CheckCheck className=\"octo-icon-sm\" />\n Accept all pending\n </Button>\n </div>\n )}\n\n {attachmentDiagnostics.length > 0 && (\n <div className=\"octo-chat__attachment-diag\">\n <div className=\"octo-chat__attachment-diag-title\">Attachments</div>\n <ul className=\"octo-chat__attachment-diag-list\">\n {attachmentDiagnostics.map((d, i) => (\n <li key={i}>\n {d.status === 'ok' ? (\n <span>\n ✓ <span className=\"octo-u-mono\">{d.filename}</span> ({d.kind})\n </span>\n ) : (\n <span className=\"octo-chat__attachment-diag-error\">\n ✗ <span className=\"octo-u-mono\">{d.filename}</span> — {d.reason}\n </span>\n )}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {status === 'stopped' && (\n <div className=\"octo-chat__status-bar\" role=\"status\">\n Stopped — the assistant was interrupted. Send another message to continue.\n </div>\n )}\n\n {status === 'error' && error && <div className=\"octo-chat__error-bar\">{error}</div>}\n {status === 'budget_exceeded' && (\n <div className=\"octo-chat__budget-bar\">\n Budget reached ({budgetReason ?? 'unknown'}). Click <strong>New conversation</strong> to start over, or\n raise the caps in <code>cms/octocms.config.ts</code>.\n </div>\n )}\n </div>\n </div>\n\n <ErrorBoundary label=\"composer\">\n <Composer\n disabled={status === 'streaming' || status === 'budget_exceeded'}\n maxAttachmentBytes={attachmentLimits.maxAttachmentBytes}\n maxAttachmentsPerTurn={attachmentLimits.maxAttachmentsPerTurn}\n onSubmit={send}\n />\n </ErrorBoundary>\n </div>\n </Page>\n );\n}\n\nfunction UsageBadge({\n totalCostUSD,\n inputTokens,\n outputTokens,\n}: {\n totalCostUSD: number;\n inputTokens: number;\n outputTokens: number;\n}) {\n const cost = totalCostUSD > 0 ? `$${totalCostUSD.toFixed(4)}` : 'free';\n return (\n <span className=\"octo-chat__usage-badge\" title={`Input: ${inputTokens} tokens · Output: ${outputTokens} tokens`}>\n {cost} · {inputTokens + outputTokens} tok\n </span>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,10 @@
1
+ import type { ChatSessionListItem } from './chatStorage';
2
+ type Props = {
3
+ sessions: ChatSessionListItem[];
4
+ activeId: string | null;
5
+ onSelect: (id: string) => void;
6
+ onDelete: (id: string) => void;
7
+ };
8
+ export declare function ChatSidebar({ sessions, activeId, onSelect, onDelete }: Props): import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=ChatSidebar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatSidebar.d.ts","sourceRoot":"","sources":["../../../components/Chat/ChatSidebar.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEzD,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,KAAK,2CAyC5E"}
@@ -0,0 +1,45 @@
1
+ "use client";
2
+ import "../../chunk-B5LE2OEC.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { relativeTime } from "../../lib/relativeTime";
5
+ import { Icon } from "../ui";
6
+ function ChatSidebar({ sessions, activeId, onSelect, onDelete }) {
7
+ return /* @__PURE__ */ jsxs("div", { className: "octo-page-sidebar__section", children: [
8
+ /* @__PURE__ */ jsx("span", { className: "octo-page-sidebar__section-label", children: "Conversations" }),
9
+ /* @__PURE__ */ jsx("nav", { className: "octo-page-sidebar__nav", "aria-label": "Saved conversations", children: sessions.length === 0 ? /* @__PURE__ */ jsx("p", { className: "octo-chat-session__empty", children: "No saved chats yet. Send a message to save one here." }) : sessions.map((session) => {
10
+ const active = session.id === activeId;
11
+ return /* @__PURE__ */ jsxs("div", { className: "octo-chat-session", children: [
12
+ /* @__PURE__ */ jsxs(
13
+ "button",
14
+ {
15
+ type: "button",
16
+ className: "octo-chat-session__button",
17
+ onClick: () => onSelect(session.id),
18
+ "aria-current": active ? "true" : void 0,
19
+ children: [
20
+ /* @__PURE__ */ jsx("span", { className: "octo-chat-session__title", children: session.title }),
21
+ /* @__PURE__ */ jsx("span", { className: "octo-chat-session__time", children: relativeTime(new Date(session.updatedAt).toISOString()) })
22
+ ]
23
+ }
24
+ ),
25
+ /* @__PURE__ */ jsx(
26
+ "button",
27
+ {
28
+ type: "button",
29
+ className: "octo-chat-session__delete",
30
+ onClick: (e) => {
31
+ e.stopPropagation();
32
+ if (window.confirm(`Delete "${session.title}"?`)) onDelete(session.id);
33
+ },
34
+ "aria-label": `Delete ${session.title}`,
35
+ children: /* @__PURE__ */ jsx(Icon.Trash2, { className: "octo-icon-xs" })
36
+ }
37
+ )
38
+ ] }, session.id);
39
+ }) })
40
+ ] });
41
+ }
42
+ export {
43
+ ChatSidebar
44
+ };
45
+ //# sourceMappingURL=ChatSidebar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../components/Chat/ChatSidebar.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\n\nimport { relativeTime } from '../../lib/relativeTime';\nimport { Icon } from '../ui';\n\nimport type { ChatSessionListItem } from './chatStorage';\n\ntype Props = {\n sessions: ChatSessionListItem[];\n activeId: string | null;\n onSelect: (id: string) => void;\n onDelete: (id: string) => void;\n};\n\nexport function ChatSidebar({ sessions, activeId, onSelect, onDelete }: Props) {\n return (\n <div className=\"octo-page-sidebar__section\">\n <span className=\"octo-page-sidebar__section-label\">Conversations</span>\n <nav className=\"octo-page-sidebar__nav\" aria-label=\"Saved conversations\">\n {sessions.length === 0 ? (\n <p className=\"octo-chat-session__empty\">No saved chats yet. Send a message to save one here.</p>\n ) : (\n sessions.map((session) => {\n const active = session.id === activeId;\n return (\n <div key={session.id} className=\"octo-chat-session\">\n <button\n type=\"button\"\n className=\"octo-chat-session__button\"\n onClick={() => onSelect(session.id)}\n aria-current={active ? 'true' : undefined}\n >\n <span className=\"octo-chat-session__title\">{session.title}</span>\n <span className=\"octo-chat-session__time\">\n {relativeTime(new Date(session.updatedAt).toISOString())}\n </span>\n </button>\n <button\n type=\"button\"\n className=\"octo-chat-session__delete\"\n onClick={(e) => {\n e.stopPropagation();\n if (window.confirm(`Delete \"${session.title}\"?`)) onDelete(session.id);\n }}\n aria-label={`Delete ${session.title}`}\n >\n <Icon.Trash2 className=\"octo-icon-xs\" />\n </button>\n </div>\n );\n })\n )}\n </nav>\n </div>\n );\n}\n"],"mappings":";;AAmBM,cASU,YATV;AAfN,SAAS,oBAAoB;AAC7B,SAAS,YAAY;AAWd,SAAS,YAAY,EAAE,UAAU,UAAU,UAAU,SAAS,GAAU;AAC7E,SACE,qBAAC,SAAI,WAAU,8BACb;AAAA,wBAAC,UAAK,WAAU,oCAAmC,2BAAa;AAAA,IAChE,oBAAC,SAAI,WAAU,0BAAyB,cAAW,uBAChD,mBAAS,WAAW,IACnB,oBAAC,OAAE,WAAU,4BAA2B,kEAAoD,IAE5F,SAAS,IAAI,CAAC,YAAY;AACxB,YAAM,SAAS,QAAQ,OAAO;AAC9B,aACE,qBAAC,SAAqB,WAAU,qBAC9B;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM,SAAS,QAAQ,EAAE;AAAA,YAClC,gBAAc,SAAS,SAAS;AAAA,YAEhC;AAAA,kCAAC,UAAK,WAAU,4BAA4B,kBAAQ,OAAM;AAAA,cAC1D,oBAAC,UAAK,WAAU,2BACb,uBAAa,IAAI,KAAK,QAAQ,SAAS,EAAE,YAAY,CAAC,GACzD;AAAA;AAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,CAAC,MAAM;AACd,gBAAE,gBAAgB;AAClB,kBAAI,OAAO,QAAQ,WAAW,QAAQ,KAAK,IAAI,EAAG,UAAS,QAAQ,EAAE;AAAA,YACvE;AAAA,YACA,cAAY,UAAU,QAAQ,KAAK;AAAA,YAEnC,8BAAC,KAAK,QAAL,EAAY,WAAU,gBAAe;AAAA;AAAA,QACxC;AAAA,WAtBQ,QAAQ,EAuBlB;AAAA,IAEJ,CAAC,GAEL;AAAA,KACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../../../components/Chat/Composer.tsx"],"names":[],"mappings":"AAWA,KAAK,KAAK,GAAG;IACX,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yFAAyF;IACzF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sEAAsE;IACtE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;CAC7C,CAAC;AAEF,wBAAgB,QAAQ,CAAC,EACvB,QAAgB,EAChB,kBAAqC,EACrC,qBAAyB,EACzB,QAAQ,GACT,EAAE,KAAK,2CA6JP"}
1
+ {"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../../../components/Chat/Composer.tsx"],"names":[],"mappings":"AAUA,KAAK,KAAK,GAAG;IACX,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yFAAyF;IACzF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sEAAsE;IACtE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;CAC7C,CAAC;AAEF,wBAAgB,QAAQ,CAAC,EACvB,QAAgB,EAChB,kBAAqC,EACrC,qBAAyB,EACzB,QAAQ,GACT,EAAE,KAAK,2CAoJP"}
@@ -2,8 +2,8 @@
2
2
  import "../../chunk-B5LE2OEC.js";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  import { useRef, useState } from "react";
5
- import { Paperclip, Send, X } from "lucide-react";
6
- import { Button } from "../ui/button";
5
+ import { cn } from "../../lib/utils";
6
+ import { Button, Icon } from "../ui";
7
7
  const ACCEPTED_TYPES = ".pdf,.docx,.txt,.md,.markdown,application/pdf,application/vnd.openxmlformats-officedocument.wordprocessingml.document,text/plain,text/markdown";
8
8
  function Composer({
9
9
  disabled = false,
@@ -67,7 +67,7 @@ function Composer({
67
67
  return /* @__PURE__ */ jsxs(
68
68
  "div",
69
69
  {
70
- className: `border-t border-border bg-background ${dragOver ? "ring-2 ring-ring" : ""}`,
70
+ className: cn("octo-chat-composer", dragOver && "octo-chat-composer--dragover"),
71
71
  onDragOver: (e) => {
72
72
  e.preventDefault();
73
73
  if (!disabled) setDragOver(true);
@@ -76,33 +76,25 @@ function Composer({
76
76
  onDrop,
77
77
  "data-testid": "chat-composer",
78
78
  children: [
79
- (files.length > 0 || error) && /* @__PURE__ */ jsxs("div", { className: "px-4 pt-3 flex flex-wrap gap-2 items-center", children: [
80
- files.map((f, i) => /* @__PURE__ */ jsxs(
81
- "div",
82
- {
83
- className: "inline-flex items-center gap-2 rounded-full border border-input bg-muted px-3 py-1 text-xs",
84
- "data-testid": "chat-attachment-chip",
85
- children: [
86
- /* @__PURE__ */ jsx(Paperclip, { className: "h-3 w-3" }),
87
- /* @__PURE__ */ jsx("span", { className: "max-w-[180px] truncate", children: f.name }),
88
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: formatSize(f.size) }),
89
- /* @__PURE__ */ jsx(
90
- "button",
91
- {
92
- type: "button",
93
- onClick: () => removeFile(i),
94
- "aria-label": `Remove ${f.name}`,
95
- className: "text-muted-foreground hover:text-foreground",
96
- children: /* @__PURE__ */ jsx(X, { className: "h-3 w-3" })
97
- }
98
- )
99
- ]
100
- },
101
- `${f.name}-${i}`
102
- )),
103
- error && /* @__PURE__ */ jsx("span", { className: "text-xs text-destructive", role: "alert", children: error })
79
+ (files.length > 0 || error) && /* @__PURE__ */ jsxs("div", { className: "octo-chat-composer__attachments", children: [
80
+ files.map((f, i) => /* @__PURE__ */ jsxs("div", { className: "octo-chat-composer__chip", "data-testid": "chat-attachment-chip", children: [
81
+ /* @__PURE__ */ jsx(Icon.Paperclip, { className: "octo-icon-xs" }),
82
+ /* @__PURE__ */ jsx("span", { className: "octo-chat-composer__chip-name", children: f.name }),
83
+ /* @__PURE__ */ jsx("span", { className: "octo-chat-composer__chip-size", children: formatSize(f.size) }),
84
+ /* @__PURE__ */ jsx(
85
+ "button",
86
+ {
87
+ type: "button",
88
+ onClick: () => removeFile(i),
89
+ "aria-label": `Remove ${f.name}`,
90
+ className: "octo-chat-composer__chip-remove",
91
+ children: /* @__PURE__ */ jsx(Icon.X, { className: "octo-icon-xs" })
92
+ }
93
+ )
94
+ ] }, `${f.name}-${i}`)),
95
+ error && /* @__PURE__ */ jsx("span", { className: "octo-chat-composer__attach-error", role: "alert", children: error })
104
96
  ] }),
105
- /* @__PURE__ */ jsxs("div", { className: "flex items-end gap-2 px-4 py-3", children: [
97
+ /* @__PURE__ */ jsxs("div", { className: "octo-chat-composer__row", children: [
106
98
  /* @__PURE__ */ jsx(
107
99
  "input",
108
100
  {
@@ -110,7 +102,7 @@ function Composer({
110
102
  type: "file",
111
103
  multiple: true,
112
104
  accept: ACCEPTED_TYPES,
113
- className: "hidden",
105
+ className: "octo-chat-composer__file-input",
114
106
  onChange: (e) => e.target.files && addFiles(e.target.files),
115
107
  "data-testid": "chat-file-input"
116
108
  }
@@ -128,7 +120,7 @@ function Composer({
128
120
  var _a;
129
121
  return (_a = fileRef.current) == null ? void 0 : _a.click();
130
122
  },
131
- children: /* @__PURE__ */ jsx(Paperclip, { className: "h-4 w-4" })
123
+ children: /* @__PURE__ */ jsx(Icon.Paperclip, { className: "octo-icon-md" })
132
124
  }
133
125
  ),
134
126
  /* @__PURE__ */ jsx(
@@ -142,7 +134,7 @@ function Composer({
142
134
  disabled,
143
135
  placeholder: files.length > 0 ? "Describe what to do with the attachment(s) \u2014 or press Send." : "Ask about your content \u2014 e.g. 'show me posts about caching'",
144
136
  "aria-label": "Chat message",
145
- className: "flex-1 resize-none rounded-lg border border-input bg-background px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:opacity-50 max-h-40",
137
+ className: "octo-chat-composer__textarea",
146
138
  onInput: (e) => {
147
139
  const el = e.currentTarget;
148
140
  el.style.height = "auto";
@@ -150,19 +142,10 @@ function Composer({
150
142
  }
151
143
  }
152
144
  ),
153
- /* @__PURE__ */ jsxs(
154
- Button,
155
- {
156
- onClick: send,
157
- disabled: disabled || !value.trim() && files.length === 0,
158
- size: "sm",
159
- className: "gap-1.5",
160
- children: [
161
- /* @__PURE__ */ jsx(Send, { className: "h-4 w-4" }),
162
- "Send"
163
- ]
164
- }
165
- )
145
+ /* @__PURE__ */ jsxs(Button, { onClick: send, disabled: disabled || !value.trim() && files.length === 0, className: "octo-u-gap-1-5", children: [
146
+ /* @__PURE__ */ jsx(Icon.Send, { className: "octo-icon-md" }),
147
+ "Send"
148
+ ] })
166
149
  ] })
167
150
  ]
168
151
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../components/Chat/Composer.tsx"],"sourcesContent":["'use client';\n\nimport React, { useRef, useState } from 'react';\nimport { Paperclip, Send, X } from 'lucide-react';\n\nimport { Button } from '../ui/button';\n\n/** Allowed file types for chat attachments — kept in sync with `classifyAttachment`. */\nconst ACCEPTED_TYPES =\n '.pdf,.docx,.txt,.md,.markdown,application/pdf,application/vnd.openxmlformats-officedocument.wordprocessingml.document,text/plain,text/markdown';\n\ntype Props = {\n disabled?: boolean;\n /** Per-attachment size limit in bytes — used to reject oversized files in the picker. */\n maxAttachmentBytes?: number;\n /** Per-turn attachment cap — used to disable the picker once full. */\n maxAttachmentsPerTurn?: number;\n /**\n * Called with the trimmed text and the user's selected attachments. The hook\n * decides whether to send JSON or multipart based on whether `files` is empty.\n */\n onSubmit(text: string, files: File[]): void;\n};\n\nexport function Composer({\n disabled = false,\n maxAttachmentBytes = 25 * 1024 * 1024,\n maxAttachmentsPerTurn = 3,\n onSubmit,\n}: Props) {\n const [value, setValue] = useState('');\n const [files, setFiles] = useState<File[]>([]);\n const [error, setError] = useState<string | null>(null);\n const [dragOver, setDragOver] = useState(false);\n const taRef = useRef<HTMLTextAreaElement>(null);\n const fileRef = useRef<HTMLInputElement>(null);\n\n const send = () => {\n const text = value.trim();\n // Allow empty text when files are attached — the model can still reason\n // over the document with a default prompt set on the client side later.\n if ((!text && files.length === 0) || disabled) return;\n onSubmit(text, files);\n setValue('');\n setFiles([]);\n setError(null);\n requestAnimationFrame(() => taRef.current?.focus());\n };\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n send();\n }\n };\n\n const addFiles = (incoming: FileList | File[]) => {\n setError(null);\n const list = Array.from(incoming);\n const next: File[] = [...files];\n for (const f of list) {\n if (next.length >= maxAttachmentsPerTurn) {\n setError(`Attachment limit reached (${maxAttachmentsPerTurn} per turn).`);\n break;\n }\n if (f.size > maxAttachmentBytes) {\n setError(`\"${f.name}\" exceeds the ${(maxAttachmentBytes / (1024 * 1024)).toFixed(0)} MB per-file limit.`);\n continue;\n }\n next.push(f);\n }\n setFiles(next);\n if (fileRef.current) fileRef.current.value = '';\n };\n\n const removeFile = (idx: number) => {\n setFiles(files.filter((_, i) => i !== idx));\n setError(null);\n };\n\n const onDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setDragOver(false);\n if (disabled) return;\n if (e.dataTransfer.files && e.dataTransfer.files.length > 0) addFiles(e.dataTransfer.files);\n };\n\n const atCapacity = files.length >= maxAttachmentsPerTurn;\n\n return (\n <div\n className={`border-t border-border bg-background ${dragOver ? 'ring-2 ring-ring' : ''}`}\n onDragOver={(e) => {\n e.preventDefault();\n if (!disabled) setDragOver(true);\n }}\n onDragLeave={() => setDragOver(false)}\n onDrop={onDrop}\n data-testid=\"chat-composer\"\n >\n {(files.length > 0 || error) && (\n <div className=\"px-4 pt-3 flex flex-wrap gap-2 items-center\">\n {files.map((f, i) => (\n <div\n key={`${f.name}-${i}`}\n className=\"inline-flex items-center gap-2 rounded-full border border-input bg-muted px-3 py-1 text-xs\"\n data-testid=\"chat-attachment-chip\"\n >\n <Paperclip className=\"h-3 w-3\" />\n <span className=\"max-w-[180px] truncate\">{f.name}</span>\n <span className=\"text-muted-foreground\">{formatSize(f.size)}</span>\n <button\n type=\"button\"\n onClick={() => removeFile(i)}\n aria-label={`Remove ${f.name}`}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </div>\n ))}\n {error && (\n <span className=\"text-xs text-destructive\" role=\"alert\">\n {error}\n </span>\n )}\n </div>\n )}\n\n <div className=\"flex items-end gap-2 px-4 py-3\">\n <input\n ref={fileRef}\n type=\"file\"\n multiple\n accept={ACCEPTED_TYPES}\n className=\"hidden\"\n onChange={(e) => e.target.files && addFiles(e.target.files)}\n data-testid=\"chat-file-input\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n disabled={disabled || atCapacity}\n aria-label=\"Attach files\"\n title={\n atCapacity\n ? `Attachment limit reached (${maxAttachmentsPerTurn})`\n : 'Attach files (PDF / DOCX / .txt / .md)'\n }\n onClick={() => fileRef.current?.click()}\n >\n <Paperclip className=\"h-4 w-4\" />\n </Button>\n <textarea\n ref={taRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={onKeyDown}\n rows={1}\n disabled={disabled}\n placeholder={\n files.length > 0\n ? 'Describe what to do with the attachment(s) — or press Send.'\n : \"Ask about your content — e.g. 'show me posts about caching'\"\n }\n aria-label=\"Chat message\"\n className=\"flex-1 resize-none rounded-lg border border-input bg-background px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:opacity-50 max-h-40\"\n onInput={(e) => {\n const el = e.currentTarget;\n el.style.height = 'auto';\n el.style.height = `${Math.min(el.scrollHeight, 160)}px`;\n }}\n />\n <Button\n onClick={send}\n disabled={disabled || (!value.trim() && files.length === 0)}\n size=\"sm\"\n className=\"gap-1.5\"\n >\n <Send className=\"h-4 w-4\" />\n Send\n </Button>\n </div>\n </div>\n );\n}\n\nfunction formatSize(n: number): string {\n if (n >= 1024 * 1024) return `${(n / (1024 * 1024)).toFixed(1)} MB`;\n if (n >= 1024) return `${(n / 1024).toFixed(1)} KB`;\n return `${n} B`;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../components/Chat/Composer.tsx"],"sourcesContent":["'use client';\n\nimport React, { useRef, useState } from 'react';\nimport { cn } from '../../lib/utils';\nimport { Button, Icon } from '../ui';\n\n/** Allowed file types for chat attachments — kept in sync with `classifyAttachment`. */\nconst ACCEPTED_TYPES =\n '.pdf,.docx,.txt,.md,.markdown,application/pdf,application/vnd.openxmlformats-officedocument.wordprocessingml.document,text/plain,text/markdown';\n\ntype Props = {\n disabled?: boolean;\n /** Per-attachment size limit in bytes — used to reject oversized files in the picker. */\n maxAttachmentBytes?: number;\n /** Per-turn attachment cap — used to disable the picker once full. */\n maxAttachmentsPerTurn?: number;\n /**\n * Called with the trimmed text and the user's selected attachments. The hook\n * decides whether to send JSON or multipart based on whether `files` is empty.\n */\n onSubmit(text: string, files: File[]): void;\n};\n\nexport function Composer({\n disabled = false,\n maxAttachmentBytes = 25 * 1024 * 1024,\n maxAttachmentsPerTurn = 3,\n onSubmit,\n}: Props) {\n const [value, setValue] = useState('');\n const [files, setFiles] = useState<File[]>([]);\n const [error, setError] = useState<string | null>(null);\n const [dragOver, setDragOver] = useState(false);\n const taRef = useRef<HTMLTextAreaElement>(null);\n const fileRef = useRef<HTMLInputElement>(null);\n\n const send = () => {\n const text = value.trim();\n // Allow empty text when files are attached — the model can still reason\n // over the document with a default prompt set on the client side later.\n if ((!text && files.length === 0) || disabled) return;\n onSubmit(text, files);\n setValue('');\n setFiles([]);\n setError(null);\n requestAnimationFrame(() => taRef.current?.focus());\n };\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n send();\n }\n };\n\n const addFiles = (incoming: FileList | File[]) => {\n setError(null);\n const list = Array.from(incoming);\n const next: File[] = [...files];\n for (const f of list) {\n if (next.length >= maxAttachmentsPerTurn) {\n setError(`Attachment limit reached (${maxAttachmentsPerTurn} per turn).`);\n break;\n }\n if (f.size > maxAttachmentBytes) {\n setError(`\"${f.name}\" exceeds the ${(maxAttachmentBytes / (1024 * 1024)).toFixed(0)} MB per-file limit.`);\n continue;\n }\n next.push(f);\n }\n setFiles(next);\n if (fileRef.current) fileRef.current.value = '';\n };\n\n const removeFile = (idx: number) => {\n setFiles(files.filter((_, i) => i !== idx));\n setError(null);\n };\n\n const onDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setDragOver(false);\n if (disabled) return;\n if (e.dataTransfer.files && e.dataTransfer.files.length > 0) addFiles(e.dataTransfer.files);\n };\n\n const atCapacity = files.length >= maxAttachmentsPerTurn;\n\n return (\n <div\n className={cn('octo-chat-composer', dragOver && 'octo-chat-composer--dragover')}\n onDragOver={(e) => {\n e.preventDefault();\n if (!disabled) setDragOver(true);\n }}\n onDragLeave={() => setDragOver(false)}\n onDrop={onDrop}\n data-testid=\"chat-composer\"\n >\n {(files.length > 0 || error) && (\n <div className=\"octo-chat-composer__attachments\">\n {files.map((f, i) => (\n <div key={`${f.name}-${i}`} className=\"octo-chat-composer__chip\" data-testid=\"chat-attachment-chip\">\n <Icon.Paperclip className=\"octo-icon-xs\" />\n <span className=\"octo-chat-composer__chip-name\">{f.name}</span>\n <span className=\"octo-chat-composer__chip-size\">{formatSize(f.size)}</span>\n <button\n type=\"button\"\n onClick={() => removeFile(i)}\n aria-label={`Remove ${f.name}`}\n className=\"octo-chat-composer__chip-remove\"\n >\n <Icon.X className=\"octo-icon-xs\" />\n </button>\n </div>\n ))}\n {error && (\n <span className=\"octo-chat-composer__attach-error\" role=\"alert\">\n {error}\n </span>\n )}\n </div>\n )}\n\n <div className=\"octo-chat-composer__row\">\n <input\n ref={fileRef}\n type=\"file\"\n multiple\n accept={ACCEPTED_TYPES}\n className=\"octo-chat-composer__file-input\"\n onChange={(e) => e.target.files && addFiles(e.target.files)}\n data-testid=\"chat-file-input\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n disabled={disabled || atCapacity}\n aria-label=\"Attach files\"\n title={\n atCapacity\n ? `Attachment limit reached (${maxAttachmentsPerTurn})`\n : 'Attach files (PDF / DOCX / .txt / .md)'\n }\n onClick={() => fileRef.current?.click()}\n >\n <Icon.Paperclip className=\"octo-icon-md\" />\n </Button>\n <textarea\n ref={taRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={onKeyDown}\n rows={1}\n disabled={disabled}\n placeholder={\n files.length > 0\n ? 'Describe what to do with the attachment(s) — or press Send.'\n : \"Ask about your content — e.g. 'show me posts about caching'\"\n }\n aria-label=\"Chat message\"\n className=\"octo-chat-composer__textarea\"\n onInput={(e) => {\n const el = e.currentTarget;\n el.style.height = 'auto';\n el.style.height = `${Math.min(el.scrollHeight, 160)}px`;\n }}\n />\n <Button onClick={send} disabled={disabled || (!value.trim() && files.length === 0)} className=\"octo-u-gap-1-5\">\n <Icon.Send className=\"octo-icon-md\" />\n Send\n </Button>\n </div>\n </div>\n );\n}\n\nfunction formatSize(n: number): string {\n if (n >= 1024 * 1024) return `${(n / (1024 * 1024)).toFixed(1)} MB`;\n if (n >= 1024) return `${(n / 1024).toFixed(1)} KB`;\n return `${n} B`;\n}\n"],"mappings":"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","names":[]}