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 +1 @@
1
- {"version":3,"sources":["../../../components/Chat/useChatStream.ts"],"sourcesContent":["'use client';\n\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useCallback, useEffect, useReducer, useRef } from 'react';\n\nimport { acceptProposalAction, rejectProposalAction } from '../../admin/actions/agent';\nimport { invalidateAfterMutationAsync } from '../../admin/query/invalidate';\n\nimport type { AttachmentDiagnostic } from '../../agent/attachments';\nimport type { ChatEvent } from '../../agent/chat';\nimport type { NormalizedMessage } from '../../agent/providers/types';\nimport type { Proposal } from '../../agent/proposals';\n\nimport type { ChatEntry, ChatMeta, ChatToolCall, ProposalStatus, ProposalUiState, UsageSummary } from './types';\n\ntype State = {\n entries: ChatEntry[];\n /** Wire history — what we send back to the server on the next request. */\n history: NormalizedMessage[];\n meta: ChatMeta | null;\n usage: UsageSummary;\n status: 'idle' | 'streaming' | 'error' | 'budget_exceeded' | 'stopped';\n error: string | null;\n /** Reason for budget_exceeded if any. */\n budgetReason: 'input_tokens' | 'output_tokens' | 'spend' | 'max_turns' | 'proposal_cap' | null;\n /** All proposals seen this conversation, keyed by `proposal.id`. */\n proposals: Record<string, ProposalUiState>;\n /** Latest attachment outcomes — replaced (not accumulated) on each turn. */\n attachmentDiagnostics: AttachmentDiagnostic[];\n};\n\ntype Action =\n | { type: 'reset' }\n | {\n type: 'submit';\n userText: string;\n entryId: string;\n assistantId: string;\n /** Filenames of attachments shown inline on the user bubble. */\n attachmentNames?: string[];\n }\n | { type: 'submit_system'; text: string; entryId: string; assistantId: string; wireText: string }\n | { type: 'meta'; meta: ChatMeta }\n | { type: 'attachments'; diagnostics: AttachmentDiagnostic[] }\n | { type: 'event'; assistantId: string; event: ChatEvent }\n | { type: 'finish'; assistantId: string; appendedHistory: NormalizedMessage[] }\n | { type: 'errored'; message: string }\n | { type: 'stopped'; assistantId: string }\n | { type: 'proposal_status'; proposalId: string; status: ProposalStatus };\n\nconst ZERO_USAGE: UsageSummary = { inputTokens: 0, outputTokens: 0, cachedInputTokens: 0, totalCostUSD: 0 };\n\nconst initial: State = {\n entries: [],\n history: [],\n meta: null,\n usage: ZERO_USAGE,\n status: 'idle',\n error: null,\n budgetReason: null,\n proposals: {},\n attachmentDiagnostics: [],\n};\n\nfunction reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'reset':\n return { ...initial, meta: state.meta };\n case 'submit': {\n const userEntry: ChatEntry = {\n id: action.entryId,\n kind: 'user',\n text: action.userText,\n ...(action.attachmentNames && action.attachmentNames.length > 0\n ? { attachmentNames: action.attachmentNames }\n : {}),\n };\n const assistantEntry: ChatEntry = {\n id: action.assistantId,\n kind: 'assistant',\n text: '',\n toolCalls: [],\n proposalIds: [],\n streaming: true,\n };\n return {\n ...state,\n status: 'streaming',\n error: null,\n budgetReason: null,\n attachmentDiagnostics: [],\n entries: [...state.entries, userEntry, assistantEntry],\n history: [...state.history, { role: 'user', content: action.userText }],\n };\n }\n case 'attachments':\n return { ...state, attachmentDiagnostics: action.diagnostics };\n case 'submit_system': {\n const systemEntry: ChatEntry = { id: action.entryId, kind: 'system', text: action.text };\n const assistantEntry: ChatEntry = {\n id: action.assistantId,\n kind: 'assistant',\n text: '',\n toolCalls: [],\n proposalIds: [],\n streaming: true,\n };\n return {\n ...state,\n status: 'streaming',\n error: null,\n budgetReason: null,\n entries: [...state.entries, systemEntry, assistantEntry],\n history: [...state.history, { role: 'user', content: action.wireText }],\n };\n }\n case 'meta':\n return { ...state, meta: action.meta };\n case 'event':\n return applyEvent(state, action.assistantId, action.event);\n case 'finish':\n return {\n ...state,\n status: state.status === 'streaming' ? 'idle' : state.status,\n history: [...state.history, ...action.appendedHistory],\n entries: state.entries.map((e) =>\n e.id === action.assistantId && e.kind === 'assistant' ? { ...e, streaming: false } : e,\n ),\n };\n case 'errored':\n return { ...state, status: 'error', error: action.message };\n case 'stopped':\n return {\n ...state,\n status: 'stopped',\n entries: state.entries.map((e) =>\n e.id === action.assistantId && e.kind === 'assistant' ? { ...e, streaming: false } : e,\n ),\n };\n case 'proposal_status': {\n const existing = state.proposals[action.proposalId];\n if (!existing) return state;\n return {\n ...state,\n proposals: {\n ...state.proposals,\n [action.proposalId]: { ...existing, status: action.status },\n },\n };\n }\n }\n}\n\nfunction applyEvent(state: State, assistantId: string, event: ChatEvent): State {\n const entries = [...state.entries];\n const idx = entries.findIndex((e) => e.id === assistantId && e.kind === 'assistant');\n if (idx === -1) return state;\n const current = entries[idx] as Extract<ChatEntry, { kind: 'assistant' }>;\n let next = current;\n\n switch (event.type) {\n case 'text_delta':\n next = { ...current, text: current.text + event.text };\n break;\n case 'tool_use_start': {\n const tc: ChatToolCall = { id: event.id, name: event.name, inputJson: '' };\n next = { ...current, toolCalls: [...current.toolCalls, tc] };\n break;\n }\n case 'tool_use_input_delta': {\n next = {\n ...current,\n toolCalls: current.toolCalls.map((tc) =>\n tc.id === event.id ? { ...tc, inputJson: tc.inputJson + event.partialJson } : tc,\n ),\n };\n break;\n }\n case 'tool_use_complete': {\n next = {\n ...current,\n toolCalls: current.toolCalls.map((tc) => (tc.id === event.id ? { ...tc, parsedInput: event.input } : tc)),\n };\n break;\n }\n case 'tool_result': {\n next = {\n ...current,\n toolCalls: current.toolCalls.map((tc) =>\n tc.id === event.toolUseId\n ? { ...tc, result: { content: event.result, isError: Boolean(event.isError) } }\n : tc,\n ),\n };\n break;\n }\n case 'proposal': {\n next = { ...current, proposalIds: [...current.proposalIds, event.proposal.id] };\n entries[idx] = next;\n const proposalState: ProposalUiState = {\n proposal: event.proposal,\n assistantEntryId: assistantId,\n status: { kind: 'pending' },\n };\n return {\n ...state,\n entries,\n proposals: { ...state.proposals, [event.proposal.id]: proposalState },\n };\n }\n case 'usage': {\n const usage: UsageSummary = {\n inputTokens: state.usage.inputTokens + event.inputTokens,\n outputTokens: state.usage.outputTokens + event.outputTokens,\n cachedInputTokens: state.usage.cachedInputTokens + (event.cachedInputTokens ?? 0),\n totalCostUSD: event.totalCostUSD,\n };\n entries[idx] = current;\n return { ...state, entries, usage };\n }\n case 'budget_exceeded':\n return { ...state, status: 'budget_exceeded', budgetReason: event.reason };\n case 'error':\n return { ...state, status: 'error', error: event.message };\n case 'turn_stop':\n case 'done':\n // Note: full assistant content (text + tool calls + tool results) is folded\n // back into history when the SSE stream completes — see `finalizeHistory`.\n break;\n }\n\n entries[idx] = next;\n return { ...state, entries };\n}\n\n/** Build the new history slice (assistant + tool messages) from the assistant entry. */\nfunction buildAppendedHistory(state: State, assistantId: string): NormalizedMessage[] {\n const entry = state.entries.find((e) => e.id === assistantId && e.kind === 'assistant');\n if (!entry || entry.kind !== 'assistant') return [];\n const blocks: import('../../agent/providers/types').NormalizedContentBlock[] = [];\n if (entry.text) blocks.push({ type: 'text', text: entry.text });\n for (const tc of entry.toolCalls) {\n blocks.push({ type: 'tool_use', id: tc.id, name: tc.name, input: tc.parsedInput ?? {} });\n }\n const out: NormalizedMessage[] = [{ role: 'assistant', content: blocks }];\n for (const tc of entry.toolCalls) {\n if (tc.result) {\n out.push({\n role: 'tool',\n toolUseId: tc.id,\n content: tc.result.content,\n ...(tc.result.isError ? { isError: true } : {}),\n });\n }\n }\n return out;\n}\n\nexport type UseChatStreamReturn = {\n entries: ChatEntry[];\n meta: ChatMeta | null;\n usage: UsageSummary;\n status: State['status'];\n error: string | null;\n budgetReason: State['budgetReason'];\n proposals: Record<string, ProposalUiState>;\n attachmentDiagnostics: AttachmentDiagnostic[];\n send(text: string, files?: File[]): Promise<void>;\n reset(): void;\n /**\n * Abort the in-flight chat request. The streamed-so-far assistant content\n * is kept in the transcript and folded into history (so the next turn sees\n * a coherent conversation); status flips to `'stopped'` until the next\n * `send`. No-op when nothing is streaming.\n */\n stop(): void;\n acceptProposal(proposalId: string): Promise<void>;\n rejectProposal(proposalId: string, reason?: string): Promise<void>;\n acceptAllPending(assistantEntryId: string): Promise<void>;\n};\n\nexport function useChatStream(endpoint: string = '/api/agent'): UseChatStreamReturn {\n const queryClient = useQueryClient();\n const [state, dispatch] = useReducer(reducer, initial);\n const stateRef = useRef(state);\n stateRef.current = state;\n /**\n * Holds the in-flight request controller + the assistant-entry id it\n * belongs to. `stop()` aborts the controller and finalises that entry.\n * Set on submit, cleared on completion or abort.\n */\n const inFlightRef = useRef<{ controller: AbortController; assistantId: string } | null>(null);\n\n const reset = useCallback(() => {\n // Cancel any in-flight stream so a \"New conversation\" click really starts fresh.\n if (inFlightRef.current) {\n inFlightRef.current.controller.abort();\n inFlightRef.current = null;\n }\n dispatch({ type: 'reset' });\n }, []);\n\n // Abort any pending stream when the hook unmounts (page navigation, etc.)\n // so we don't leak the connection.\n useEffect(() => {\n return () => {\n inFlightRef.current?.controller.abort();\n inFlightRef.current = null;\n };\n }, []);\n\n const stop = useCallback(() => {\n const inFlight = inFlightRef.current;\n if (!inFlight) return;\n inFlight.controller.abort();\n inFlightRef.current = null;\n // Persist whatever assistant content we've already streamed back into history\n // so the next turn sees a coherent transcript, then mark the entry stopped.\n const appendedHistory = buildAppendedHistory(stateRef.current, inFlight.assistantId);\n if (appendedHistory.length > 0) {\n dispatch({ type: 'finish', assistantId: inFlight.assistantId, appendedHistory });\n }\n dispatch({ type: 'stopped', assistantId: inFlight.assistantId });\n }, []);\n\n /**\n * Run the streaming chat request. Used by `send` (user messages) and\n * `submitSystemMessage` (auto-followup after accept/reject).\n *\n * When `files` is non-empty, sends the request as multipart/form-data so the\n * server can parse uploads. Otherwise sends JSON. Either way, history is\n * always serialised in the `messages` field.\n */\n const runRequest = useCallback(\n async (assistantId: string, historyToSend: NormalizedMessage[], files?: File[]) => {\n const controller = new AbortController();\n inFlightRef.current = { controller, assistantId };\n try {\n const init: RequestInit =\n files && files.length > 0\n ? {\n method: 'POST',\n body: buildMultipartBody(historyToSend, files),\n signal: controller.signal,\n }\n : {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ messages: historyToSend }),\n signal: controller.signal,\n };\n const res = await fetch(endpoint, init);\n if (!res.ok) {\n const message = res.status === 404 ? 'Chat is not enabled in this deploy.' : `HTTP ${res.status}`;\n dispatch({ type: 'errored', message });\n return;\n }\n if (!res.body) {\n dispatch({ type: 'errored', message: 'Server returned an empty body.' });\n return;\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n // Parse SSE blocks separated by \\n\\n. Each may be `event: meta` or `data:`.\n let sepIdx;\n while ((sepIdx = buffer.indexOf('\\n\\n')) !== -1) {\n const block = buffer.slice(0, sepIdx);\n buffer = buffer.slice(sepIdx + 2);\n handleSseBlock(block, assistantId, dispatch);\n }\n }\n } catch (err) {\n // AbortError (from `stop()` / `reset()` / unmount) is expected — `stop`\n // already dispatched its own state transition, so swallow it here.\n const aborted =\n (err instanceof DOMException && err.name === 'AbortError') ||\n (err instanceof Error && err.name === 'AbortError') ||\n controller.signal.aborted;\n if (aborted) return;\n dispatch({ type: 'errored', message: err instanceof Error ? err.message : 'Network error' });\n return;\n } finally {\n // Clear in-flight only if it's still pointing at *this* request.\n if (inFlightRef.current?.controller === controller) {\n inFlightRef.current = null;\n }\n }\n\n const appendedHistory = buildAppendedHistory(stateRef.current, assistantId);\n dispatch({ type: 'finish', assistantId, appendedHistory });\n },\n [endpoint],\n );\n\n const send = useCallback(\n async (text: string, files: File[] = []) => {\n const trimmed = text.trim();\n // Allow empty text when there are attachments — the model can still\n // reason about the document. Default the wire prompt so the model has\n // something to anchor on.\n const wireText = trimmed || (files.length > 0 ? 'Please review the attached document.' : '');\n if (!wireText || stateRef.current.status === 'streaming') return;\n const entryId = `e_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n const assistantId = `a_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n\n dispatch({\n type: 'submit',\n userText: trimmed,\n entryId,\n assistantId,\n ...(files.length > 0 ? { attachmentNames: files.map((f) => f.name) } : {}),\n });\n\n // Build the request body from the SAME state we're dispatching into,\n // so the server sees the full history including the new user message.\n const historyToSend: NormalizedMessage[] = [...stateRef.current.history, { role: 'user', content: wireText }];\n\n await runRequest(assistantId, historyToSend, files);\n },\n [runRequest],\n );\n\n /**\n * Internal: post a synthetic system-style message to continue the conversation\n * after the user accepts or rejects a proposal. The entry shows in the\n * transcript as a `system` bubble (no avatar); on the wire it's a `user`\n * message tagged `[System notification]` so the model picks it up.\n */\n const submitSystemMessage = useCallback(\n async (visibleText: string, wireText: string) => {\n if (stateRef.current.status === 'streaming') return;\n const entryId = `s_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n const assistantId = `a_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n dispatch({ type: 'submit_system', text: visibleText, entryId, assistantId, wireText });\n\n const historyToSend: NormalizedMessage[] = [...stateRef.current.history, { role: 'user', content: wireText }];\n await runRequest(assistantId, historyToSend);\n },\n [runRequest],\n );\n\n const acceptProposal = useCallback(\n async (proposalId: string) => {\n const ps = stateRef.current.proposals[proposalId];\n if (!ps || ps.status.kind !== 'pending') return;\n\n dispatch({ type: 'proposal_status', proposalId, status: { kind: 'accepting' } });\n\n let result: Awaited<ReturnType<typeof acceptProposalAction>>;\n try {\n result = await acceptProposalAction(ps.proposal);\n } catch (err) {\n dispatch({\n type: 'proposal_status',\n proposalId,\n status: { kind: 'error', message: err instanceof Error ? err.message : 'Accept failed' },\n });\n return;\n }\n\n if (!result.ok) {\n dispatch({\n type: 'proposal_status',\n proposalId,\n status: {\n kind: 'error',\n message: result.error,\n ...(result.fieldErrors ? { fieldErrors: result.fieldErrors } : {}),\n },\n });\n return;\n }\n dispatch({\n type: 'proposal_status',\n proposalId,\n status: { kind: 'accepted', entryPath: result.entryPath },\n });\n\n await invalidateAfterMutationAsync(queryClient, ['entries']);\n\n // Auto-followup so the model sees the result and can continue naturally.\n await submitSystemMessage(\n `Accepted: ${ps.proposal.summary} → saved at ${result.entryPath}.`,\n `[System notification] The user ACCEPTED proposal ${ps.proposal.id} (${ps.proposal.summary}). The entry was saved at ${result.entryPath}. Continue the conversation — do NOT propose the same change again.`,\n );\n },\n [queryClient, submitSystemMessage],\n );\n\n const rejectProposal = useCallback(\n async (proposalId: string, reason?: string) => {\n const ps = stateRef.current.proposals[proposalId];\n if (!ps || ps.status.kind !== 'pending') return;\n\n dispatch({ type: 'proposal_status', proposalId, status: { kind: 'rejecting' } });\n try {\n await rejectProposalAction(reason ?? null);\n } catch {\n /* reject is informational; still mark rejected even if the action throws */\n }\n dispatch({\n type: 'proposal_status',\n proposalId,\n status: { kind: 'rejected', ...(reason ? { reason } : {}) },\n });\n\n const reasonClause = reason ? ` Reason: ${reason}` : '';\n await submitSystemMessage(\n `Rejected: ${ps.proposal.summary}.${reasonClause}`,\n `[System notification] The user REJECTED proposal ${ps.proposal.id} (${ps.proposal.summary}).${reasonClause} Acknowledge briefly and ask if they want a different change — do NOT re-propose the same thing.`,\n );\n },\n [submitSystemMessage],\n );\n\n const acceptAllPending = useCallback(\n async (assistantEntryId: string) => {\n // Snapshot the pending proposals on this assistant turn at click time.\n const all = Object.values(stateRef.current.proposals).filter(\n (p) => p.assistantEntryId === assistantEntryId && p.status.kind === 'pending',\n );\n for (const p of all) {\n // After each accept, the auto-followup triggers a fresh assistant turn.\n // We wait for it to finish before accepting the next so we don't race.\n await acceptProposal(p.proposal.id);\n // Halt on first failure — matches the Phase 4 plan's \"halt on first failure\".\n const updated = stateRef.current.proposals[p.proposal.id];\n if (!updated || updated.status.kind !== 'accepted') break;\n }\n },\n [acceptProposal],\n );\n\n return {\n entries: state.entries,\n meta: state.meta,\n usage: state.usage,\n status: state.status,\n error: state.error,\n budgetReason: state.budgetReason,\n proposals: state.proposals,\n attachmentDiagnostics: state.attachmentDiagnostics,\n send,\n reset,\n stop,\n acceptProposal,\n rejectProposal,\n acceptAllPending,\n };\n}\n\n/**\n * Build a multipart FormData body. The chat history is JSON-serialised into\n * a `messages` field; uploads go in repeated `files` fields. The server-side\n * route handler (`src/app/api/agent/route.ts`) parses the same shape.\n */\nfunction buildMultipartBody(messages: NormalizedMessage[], files: File[]): FormData {\n const fd = new FormData();\n fd.append('messages', JSON.stringify(messages));\n for (const f of files) fd.append('files', f, f.name);\n return fd;\n}\n\nfunction handleSseBlock(block: string, assistantId: string, dispatch: (a: Action) => void): void {\n // SSE block: lines starting with `event:` or `data:`.\n const lines = block.split('\\n');\n let eventName: string | null = null;\n const dataLines: string[] = [];\n for (const line of lines) {\n if (line.startsWith('event:')) eventName = line.slice(6).trim();\n else if (line.startsWith('data:')) dataLines.push(line.slice(5).trim());\n }\n if (dataLines.length === 0) return;\n const payload = dataLines.join('\\n');\n try {\n const json = JSON.parse(payload);\n if (eventName === 'meta') {\n dispatch({ type: 'meta', meta: json as ChatMeta });\n return;\n }\n if (eventName === 'attachments') {\n const diagnostics = (json as { diagnostics?: AttachmentDiagnostic[] }).diagnostics ?? [];\n dispatch({ type: 'attachments', diagnostics });\n return;\n }\n dispatch({ type: 'event', assistantId, event: json as ChatEvent });\n } catch {\n // Ignore malformed chunks — stream continues.\n }\n}\n\n// Re-export so consumers don't need to also reach into ./types\nexport type { Proposal };\n"],"mappings":";;;;;AAEA,SAAS,sBAAsB;AAC/B,SAAS,aAAa,WAAW,YAAY,cAAc;AAE3D,SAAS,sBAAsB,4BAA4B;AAC3D,SAAS,oCAAoC;AA4C7C,MAAM,aAA2B,EAAE,aAAa,GAAG,cAAc,GAAG,mBAAmB,GAAG,cAAc,EAAE;AAE1G,MAAM,UAAiB;AAAA,EACrB,SAAS,CAAC;AAAA,EACV,SAAS,CAAC;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,cAAc;AAAA,EACd,WAAW,CAAC;AAAA,EACZ,uBAAuB,CAAC;AAC1B;AAEA,SAAS,QAAQ,OAAc,QAAuB;AACpD,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,iCAAK,UAAL,EAAc,MAAM,MAAM,KAAK;AAAA,IACxC,KAAK,UAAU;AACb,YAAM,YAAuB;AAAA,QAC3B,IAAI,OAAO;AAAA,QACX,MAAM;AAAA,QACN,MAAM,OAAO;AAAA,SACT,OAAO,mBAAmB,OAAO,gBAAgB,SAAS,IAC1D,EAAE,iBAAiB,OAAO,gBAAgB,IAC1C,CAAC;AAEP,YAAM,iBAA4B;AAAA,QAChC,IAAI,OAAO;AAAA,QACX,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,CAAC;AAAA,QACZ,aAAa,CAAC;AAAA,QACd,WAAW;AAAA,MACb;AACA,aAAO,iCACF,QADE;AAAA,QAEL,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,cAAc;AAAA,QACd,uBAAuB,CAAC;AAAA,QACxB,SAAS,CAAC,GAAG,MAAM,SAAS,WAAW,cAAc;AAAA,QACrD,SAAS,CAAC,GAAG,MAAM,SAAS,EAAE,MAAM,QAAQ,SAAS,OAAO,SAAS,CAAC;AAAA,MACxE;AAAA,IACF;AAAA,IACA,KAAK;AACH,aAAO,iCAAK,QAAL,EAAY,uBAAuB,OAAO,YAAY;AAAA,IAC/D,KAAK,iBAAiB;AACpB,YAAM,cAAyB,EAAE,IAAI,OAAO,SAAS,MAAM,UAAU,MAAM,OAAO,KAAK;AACvF,YAAM,iBAA4B;AAAA,QAChC,IAAI,OAAO;AAAA,QACX,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,CAAC;AAAA,QACZ,aAAa,CAAC;AAAA,QACd,WAAW;AAAA,MACb;AACA,aAAO,iCACF,QADE;AAAA,QAEL,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,cAAc;AAAA,QACd,SAAS,CAAC,GAAG,MAAM,SAAS,aAAa,cAAc;AAAA,QACvD,SAAS,CAAC,GAAG,MAAM,SAAS,EAAE,MAAM,QAAQ,SAAS,OAAO,SAAS,CAAC;AAAA,MACxE;AAAA,IACF;AAAA,IACA,KAAK;AACH,aAAO,iCAAK,QAAL,EAAY,MAAM,OAAO,KAAK;AAAA,IACvC,KAAK;AACH,aAAO,WAAW,OAAO,OAAO,aAAa,OAAO,KAAK;AAAA,IAC3D,KAAK;AACH,aAAO,iCACF,QADE;AAAA,QAEL,QAAQ,MAAM,WAAW,cAAc,SAAS,MAAM;AAAA,QACtD,SAAS,CAAC,GAAG,MAAM,SAAS,GAAG,OAAO,eAAe;AAAA,QACrD,SAAS,MAAM,QAAQ;AAAA,UAAI,CAAC,MAC1B,EAAE,OAAO,OAAO,eAAe,EAAE,SAAS,cAAc,iCAAK,IAAL,EAAQ,WAAW,MAAM,KAAI;AAAA,QACvF;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO,iCAAK,QAAL,EAAY,QAAQ,SAAS,OAAO,OAAO,QAAQ;AAAA,IAC5D,KAAK;AACH,aAAO,iCACF,QADE;AAAA,QAEL,QAAQ;AAAA,QACR,SAAS,MAAM,QAAQ;AAAA,UAAI,CAAC,MAC1B,EAAE,OAAO,OAAO,eAAe,EAAE,SAAS,cAAc,iCAAK,IAAL,EAAQ,WAAW,MAAM,KAAI;AAAA,QACvF;AAAA,MACF;AAAA,IACF,KAAK,mBAAmB;AACtB,YAAM,WAAW,MAAM,UAAU,OAAO,UAAU;AAClD,UAAI,CAAC,SAAU,QAAO;AACtB,aAAO,iCACF,QADE;AAAA,QAEL,WAAW,iCACN,MAAM,YADA;AAAA,UAET,CAAC,OAAO,UAAU,GAAG,iCAAK,WAAL,EAAe,QAAQ,OAAO,OAAO;AAAA,QAC5D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,WAAW,OAAc,aAAqB,OAAyB;AAzJhF;AA0JE,QAAM,UAAU,CAAC,GAAG,MAAM,OAAO;AACjC,QAAM,MAAM,QAAQ,UAAU,CAAC,MAAM,EAAE,OAAO,eAAe,EAAE,SAAS,WAAW;AACnF,MAAI,QAAQ,GAAI,QAAO;AACvB,QAAM,UAAU,QAAQ,GAAG;AAC3B,MAAI,OAAO;AAEX,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,iCAAK,UAAL,EAAc,MAAM,QAAQ,OAAO,MAAM,KAAK;AACrD;AAAA,IACF,KAAK,kBAAkB;AACrB,YAAM,KAAmB,EAAE,IAAI,MAAM,IAAI,MAAM,MAAM,MAAM,WAAW,GAAG;AACzE,aAAO,iCAAK,UAAL,EAAc,WAAW,CAAC,GAAG,QAAQ,WAAW,EAAE,EAAE;AAC3D;AAAA,IACF;AAAA,IACA,KAAK,wBAAwB;AAC3B,aAAO,iCACF,UADE;AAAA,QAEL,WAAW,QAAQ,UAAU;AAAA,UAAI,CAAC,OAChC,GAAG,OAAO,MAAM,KAAK,iCAAK,KAAL,EAAS,WAAW,GAAG,YAAY,MAAM,YAAY,KAAI;AAAA,QAChF;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA,KAAK,qBAAqB;AACxB,aAAO,iCACF,UADE;AAAA,QAEL,WAAW,QAAQ,UAAU,IAAI,CAAC,OAAQ,GAAG,OAAO,MAAM,KAAK,iCAAK,KAAL,EAAS,aAAa,MAAM,MAAM,KAAI,EAAG;AAAA,MAC1G;AACA;AAAA,IACF;AAAA,IACA,KAAK,eAAe;AAClB,aAAO,iCACF,UADE;AAAA,QAEL,WAAW,QAAQ,UAAU;AAAA,UAAI,CAAC,OAChC,GAAG,OAAO,MAAM,YACZ,iCAAK,KAAL,EAAS,QAAQ,EAAE,SAAS,MAAM,QAAQ,SAAS,QAAQ,MAAM,OAAO,EAAE,EAAE,KAC5E;AAAA,QACN;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA,KAAK,YAAY;AACf,aAAO,iCAAK,UAAL,EAAc,aAAa,CAAC,GAAG,QAAQ,aAAa,MAAM,SAAS,EAAE,EAAE;AAC9E,cAAQ,GAAG,IAAI;AACf,YAAM,gBAAiC;AAAA,QACrC,UAAU,MAAM;AAAA,QAChB,kBAAkB;AAAA,QAClB,QAAQ,EAAE,MAAM,UAAU;AAAA,MAC5B;AACA,aAAO,iCACF,QADE;AAAA,QAEL;AAAA,QACA,WAAW,iCAAK,MAAM,YAAX,EAAsB,CAAC,MAAM,SAAS,EAAE,GAAG,cAAc;AAAA,MACtE;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AACZ,YAAM,QAAsB;AAAA,QAC1B,aAAa,MAAM,MAAM,cAAc,MAAM;AAAA,QAC7C,cAAc,MAAM,MAAM,eAAe,MAAM;AAAA,QAC/C,mBAAmB,MAAM,MAAM,sBAAqB,WAAM,sBAAN,YAA2B;AAAA,QAC/E,cAAc,MAAM;AAAA,MACtB;AACA,cAAQ,GAAG,IAAI;AACf,aAAO,iCAAK,QAAL,EAAY,SAAS,MAAM;AAAA,IACpC;AAAA,IACA,KAAK;AACH,aAAO,iCAAK,QAAL,EAAY,QAAQ,mBAAmB,cAAc,MAAM,OAAO;AAAA,IAC3E,KAAK;AACH,aAAO,iCAAK,QAAL,EAAY,QAAQ,SAAS,OAAO,MAAM,QAAQ;AAAA,IAC3D,KAAK;AAAA,IACL,KAAK;AAGH;AAAA,EACJ;AAEA,UAAQ,GAAG,IAAI;AACf,SAAO,iCAAK,QAAL,EAAY,QAAQ;AAC7B;AAGA,SAAS,qBAAqB,OAAc,aAA0C;AA5OtF;AA6OE,QAAM,QAAQ,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,eAAe,EAAE,SAAS,WAAW;AACtF,MAAI,CAAC,SAAS,MAAM,SAAS,YAAa,QAAO,CAAC;AAClD,QAAM,SAAyE,CAAC;AAChF,MAAI,MAAM,KAAM,QAAO,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,KAAK,CAAC;AAC9D,aAAW,MAAM,MAAM,WAAW;AAChC,WAAO,KAAK,EAAE,MAAM,YAAY,IAAI,GAAG,IAAI,MAAM,GAAG,MAAM,QAAO,QAAG,gBAAH,YAAkB,CAAC,EAAE,CAAC;AAAA,EACzF;AACA,QAAM,MAA2B,CAAC,EAAE,MAAM,aAAa,SAAS,OAAO,CAAC;AACxE,aAAW,MAAM,MAAM,WAAW;AAChC,QAAI,GAAG,QAAQ;AACb,UAAI,KAAK;AAAA,QACP,MAAM;AAAA,QACN,WAAW,GAAG;AAAA,QACd,SAAS,GAAG,OAAO;AAAA,SACf,GAAG,OAAO,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC,EAC9C;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAyBO,SAAS,cAAc,WAAmB,cAAmC;AAClF,QAAM,cAAc,eAAe;AACnC,QAAM,CAAC,OAAO,QAAQ,IAAI,WAAW,SAAS,OAAO;AACrD,QAAM,WAAW,OAAO,KAAK;AAC7B,WAAS,UAAU;AAMnB,QAAM,cAAc,OAAoE,IAAI;AAE5F,QAAM,QAAQ,YAAY,MAAM;AAE9B,QAAI,YAAY,SAAS;AACvB,kBAAY,QAAQ,WAAW,MAAM;AACrC,kBAAY,UAAU;AAAA,IACxB;AACA,aAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,EAC5B,GAAG,CAAC,CAAC;AAIL,YAAU,MAAM;AACd,WAAO,MAAM;AAjTjB;AAkTM,wBAAY,YAAZ,mBAAqB,WAAW;AAChC,kBAAY,UAAU;AAAA,IACxB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,OAAO,YAAY,MAAM;AAC7B,UAAM,WAAW,YAAY;AAC7B,QAAI,CAAC,SAAU;AACf,aAAS,WAAW,MAAM;AAC1B,gBAAY,UAAU;AAGtB,UAAM,kBAAkB,qBAAqB,SAAS,SAAS,SAAS,WAAW;AACnF,QAAI,gBAAgB,SAAS,GAAG;AAC9B,eAAS,EAAE,MAAM,UAAU,aAAa,SAAS,aAAa,gBAAgB,CAAC;AAAA,IACjF;AACA,aAAS,EAAE,MAAM,WAAW,aAAa,SAAS,YAAY,CAAC;AAAA,EACjE,GAAG,CAAC,CAAC;AAUL,QAAM,aAAa;AAAA,IACjB,OAAO,aAAqB,eAAoC,UAAmB;AA9UvF;AA+UM,YAAM,aAAa,IAAI,gBAAgB;AACvC,kBAAY,UAAU,EAAE,YAAY,YAAY;AAChD,UAAI;AACF,cAAM,OACJ,SAAS,MAAM,SAAS,IACpB;AAAA,UACE,QAAQ;AAAA,UACR,MAAM,mBAAmB,eAAe,KAAK;AAAA,UAC7C,QAAQ,WAAW;AAAA,QACrB,IACA;AAAA,UACE,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU,EAAE,UAAU,cAAc,CAAC;AAAA,UAChD,QAAQ,WAAW;AAAA,QACrB;AACN,cAAM,MAAM,MAAM,MAAM,UAAU,IAAI;AACtC,YAAI,CAAC,IAAI,IAAI;AACX,gBAAM,UAAU,IAAI,WAAW,MAAM,wCAAwC,QAAQ,IAAI,MAAM;AAC/F,mBAAS,EAAE,MAAM,WAAW,QAAQ,CAAC;AACrC;AAAA,QACF;AACA,YAAI,CAAC,IAAI,MAAM;AACb,mBAAS,EAAE,MAAM,WAAW,SAAS,iCAAiC,CAAC;AACvE;AAAA,QACF;AAEA,cAAM,SAAS,IAAI,KAAK,UAAU;AAClC,cAAM,UAAU,IAAI,YAAY;AAChC,YAAI,SAAS;AAEb,eAAO,MAAM;AACX,gBAAM,EAAE,OAAO,KAAK,IAAI,MAAM,OAAO,KAAK;AAC1C,cAAI,KAAM;AACV,oBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAGhD,cAAI;AACJ,kBAAQ,SAAS,OAAO,QAAQ,MAAM,OAAO,IAAI;AAC/C,kBAAM,QAAQ,OAAO,MAAM,GAAG,MAAM;AACpC,qBAAS,OAAO,MAAM,SAAS,CAAC;AAChC,2BAAe,OAAO,aAAa,QAAQ;AAAA,UAC7C;AAAA,QACF;AAAA,MACF,SAAS,KAAK;AAGZ,cAAM,UACH,eAAe,gBAAgB,IAAI,SAAS,gBAC5C,eAAe,SAAS,IAAI,SAAS,gBACtC,WAAW,OAAO;AACpB,YAAI,QAAS;AACb,iBAAS,EAAE,MAAM,WAAW,SAAS,eAAe,QAAQ,IAAI,UAAU,gBAAgB,CAAC;AAC3F;AAAA,MACF,UAAE;AAEA,cAAI,iBAAY,YAAZ,mBAAqB,gBAAe,YAAY;AAClD,sBAAY,UAAU;AAAA,QACxB;AAAA,MACF;AAEA,YAAM,kBAAkB,qBAAqB,SAAS,SAAS,WAAW;AAC1E,eAAS,EAAE,MAAM,UAAU,aAAa,gBAAgB,CAAC;AAAA,IAC3D;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,OAAO;AAAA,IACX,OAAO,MAAc,QAAgB,CAAC,MAAM;AAC1C,YAAM,UAAU,KAAK,KAAK;AAI1B,YAAM,WAAW,YAAY,MAAM,SAAS,IAAI,yCAAyC;AACzF,UAAI,CAAC,YAAY,SAAS,QAAQ,WAAW,YAAa;AAC1D,YAAM,UAAU,KAAK,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACzE,YAAM,cAAc,KAAK,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAE7E,eAAS;AAAA,QACP,MAAM;AAAA,QACN,UAAU;AAAA,QACV;AAAA,QACA;AAAA,SACI,MAAM,SAAS,IAAI,EAAE,iBAAiB,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,EACzE;AAID,YAAM,gBAAqC,CAAC,GAAG,SAAS,QAAQ,SAAS,EAAE,MAAM,QAAQ,SAAS,SAAS,CAAC;AAE5G,YAAM,WAAW,aAAa,eAAe,KAAK;AAAA,IACpD;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AAQA,QAAM,sBAAsB;AAAA,IAC1B,OAAO,aAAqB,aAAqB;AAC/C,UAAI,SAAS,QAAQ,WAAW,YAAa;AAC7C,YAAM,UAAU,KAAK,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACzE,YAAM,cAAc,KAAK,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC7E,eAAS,EAAE,MAAM,iBAAiB,MAAM,aAAa,SAAS,aAAa,SAAS,CAAC;AAErF,YAAM,gBAAqC,CAAC,GAAG,SAAS,QAAQ,SAAS,EAAE,MAAM,QAAQ,SAAS,SAAS,CAAC;AAC5G,YAAM,WAAW,aAAa,aAAa;AAAA,IAC7C;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AAEA,QAAM,iBAAiB;AAAA,IACrB,OAAO,eAAuB;AAC5B,YAAM,KAAK,SAAS,QAAQ,UAAU,UAAU;AAChD,UAAI,CAAC,MAAM,GAAG,OAAO,SAAS,UAAW;AAEzC,eAAS,EAAE,MAAM,mBAAmB,YAAY,QAAQ,EAAE,MAAM,YAAY,EAAE,CAAC;AAE/E,UAAI;AACJ,UAAI;AACF,iBAAS,MAAM,qBAAqB,GAAG,QAAQ;AAAA,MACjD,SAAS,KAAK;AACZ,iBAAS;AAAA,UACP,MAAM;AAAA,UACN;AAAA,UACA,QAAQ,EAAE,MAAM,SAAS,SAAS,eAAe,QAAQ,IAAI,UAAU,gBAAgB;AAAA,QACzF,CAAC;AACD;AAAA,MACF;AAEA,UAAI,CAAC,OAAO,IAAI;AACd,iBAAS;AAAA,UACP,MAAM;AAAA,UACN;AAAA,UACA,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,SAAS,OAAO;AAAA,aACZ,OAAO,cAAc,EAAE,aAAa,OAAO,YAAY,IAAI,CAAC;AAAA,QAEpE,CAAC;AACD;AAAA,MACF;AACA,eAAS;AAAA,QACP,MAAM;AAAA,QACN;AAAA,QACA,QAAQ,EAAE,MAAM,YAAY,WAAW,OAAO,UAAU;AAAA,MAC1D,CAAC;AAED,YAAM,6BAA6B,aAAa,CAAC,SAAS,CAAC;AAG3D,YAAM;AAAA,QACJ,aAAa,GAAG,SAAS,OAAO,oBAAe,OAAO,SAAS;AAAA,QAC/D,oDAAoD,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,OAAO,6BAA6B,OAAO,SAAS;AAAA,MACzI;AAAA,IACF;AAAA,IACA,CAAC,aAAa,mBAAmB;AAAA,EACnC;AAEA,QAAM,iBAAiB;AAAA,IACrB,OAAO,YAAoB,WAAoB;AAC7C,YAAM,KAAK,SAAS,QAAQ,UAAU,UAAU;AAChD,UAAI,CAAC,MAAM,GAAG,OAAO,SAAS,UAAW;AAEzC,eAAS,EAAE,MAAM,mBAAmB,YAAY,QAAQ,EAAE,MAAM,YAAY,EAAE,CAAC;AAC/E,UAAI;AACF,cAAM,qBAAqB,0BAAU,IAAI;AAAA,MAC3C,SAAQ;AAAA,MAER;AACA,eAAS;AAAA,QACP,MAAM;AAAA,QACN;AAAA,QACA,QAAQ,iBAAE,MAAM,cAAgB,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,MACzD,CAAC;AAED,YAAM,eAAe,SAAS,YAAY,MAAM,KAAK;AACrD,YAAM;AAAA,QACJ,aAAa,GAAG,SAAS,OAAO,IAAI,YAAY;AAAA,QAChD,oDAAoD,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,OAAO,KAAK,YAAY;AAAA,MAC7G;AAAA,IACF;AAAA,IACA,CAAC,mBAAmB;AAAA,EACtB;AAEA,QAAM,mBAAmB;AAAA,IACvB,OAAO,qBAA6B;AAElC,YAAM,MAAM,OAAO,OAAO,SAAS,QAAQ,SAAS,EAAE;AAAA,QACpD,CAAC,MAAM,EAAE,qBAAqB,oBAAoB,EAAE,OAAO,SAAS;AAAA,MACtE;AACA,iBAAW,KAAK,KAAK;AAGnB,cAAM,eAAe,EAAE,SAAS,EAAE;AAElC,cAAM,UAAU,SAAS,QAAQ,UAAU,EAAE,SAAS,EAAE;AACxD,YAAI,CAAC,WAAW,QAAQ,OAAO,SAAS,WAAY;AAAA,MACtD;AAAA,IACF;AAAA,IACA,CAAC,cAAc;AAAA,EACjB;AAEA,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IACf,MAAM,MAAM;AAAA,IACZ,OAAO,MAAM;AAAA,IACb,QAAQ,MAAM;AAAA,IACd,OAAO,MAAM;AAAA,IACb,cAAc,MAAM;AAAA,IACpB,WAAW,MAAM;AAAA,IACjB,uBAAuB,MAAM;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAOA,SAAS,mBAAmB,UAA+B,OAAyB;AAClF,QAAM,KAAK,IAAI,SAAS;AACxB,KAAG,OAAO,YAAY,KAAK,UAAU,QAAQ,CAAC;AAC9C,aAAW,KAAK,MAAO,IAAG,OAAO,SAAS,GAAG,EAAE,IAAI;AACnD,SAAO;AACT;AAEA,SAAS,eAAe,OAAe,aAAqB,UAAqC;AA3jBjG;AA6jBE,QAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,MAAI,YAA2B;AAC/B,QAAM,YAAsB,CAAC;AAC7B,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,WAAW,QAAQ,EAAG,aAAY,KAAK,MAAM,CAAC,EAAE,KAAK;AAAA,aACrD,KAAK,WAAW,OAAO,EAAG,WAAU,KAAK,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC;AAAA,EACxE;AACA,MAAI,UAAU,WAAW,EAAG;AAC5B,QAAM,UAAU,UAAU,KAAK,IAAI;AACnC,MAAI;AACF,UAAM,OAAO,KAAK,MAAM,OAAO;AAC/B,QAAI,cAAc,QAAQ;AACxB,eAAS,EAAE,MAAM,QAAQ,MAAM,KAAiB,CAAC;AACjD;AAAA,IACF;AACA,QAAI,cAAc,eAAe;AAC/B,YAAM,eAAe,UAAkD,gBAAlD,YAAiE,CAAC;AACvF,eAAS,EAAE,MAAM,eAAe,YAAY,CAAC;AAC7C;AAAA,IACF;AACA,aAAS,EAAE,MAAM,SAAS,aAAa,OAAO,KAAkB,CAAC;AAAA,EACnE,SAAQ;AAAA,EAER;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../components/Chat/useChatStream.ts"],"sourcesContent":["'use client';\n\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useCallback, useEffect, useReducer, useRef } from 'react';\n\nimport { acceptProposalAction, rejectProposalAction } from '../../admin/actions/agent';\nimport { invalidateAfterMutationAsync } from '../../admin/query/invalidate';\n\nimport type { AttachmentDiagnostic } from '../../agent/attachments';\nimport type { ChatEvent } from '../../agent/chat';\nimport type { NormalizedMessage } from '../../agent/providers/types';\nimport type { Proposal } from '../../agent/proposals';\n\nimport type { PersistedChatState } from './chatStorage';\nimport { toPersistedState } from './chatStorage';\nimport type { ChatEntry, ChatMeta, ChatToolCall, ProposalStatus, ProposalUiState, UsageSummary } from './types';\n\ntype State = {\n entries: ChatEntry[];\n /** Wire history — what we send back to the server on the next request. */\n history: NormalizedMessage[];\n meta: ChatMeta | null;\n usage: UsageSummary;\n status: 'idle' | 'streaming' | 'error' | 'budget_exceeded' | 'stopped';\n error: string | null;\n /** Reason for budget_exceeded if any. */\n budgetReason: 'input_tokens' | 'output_tokens' | 'spend' | 'max_turns' | 'proposal_cap' | null;\n /** All proposals seen this conversation, keyed by `proposal.id`. */\n proposals: Record<string, ProposalUiState>;\n /** Latest attachment outcomes — replaced (not accumulated) on each turn. */\n attachmentDiagnostics: AttachmentDiagnostic[];\n};\n\ntype Action =\n | { type: 'reset' }\n | {\n type: 'submit';\n userText: string;\n entryId: string;\n assistantId: string;\n /** Filenames of attachments shown inline on the user bubble. */\n attachmentNames?: string[];\n }\n | { type: 'submit_system'; text: string; entryId: string; assistantId: string; wireText: string }\n | { type: 'meta'; meta: ChatMeta }\n | { type: 'attachments'; diagnostics: AttachmentDiagnostic[] }\n | { type: 'event'; assistantId: string; event: ChatEvent }\n | { type: 'finish'; assistantId: string; appendedHistory: NormalizedMessage[] }\n | { type: 'errored'; message: string }\n | { type: 'stopped'; assistantId: string }\n | { type: 'proposal_status'; proposalId: string; status: ProposalStatus }\n | { type: 'hydrate'; snapshot: PersistedChatState };\n\nconst ZERO_USAGE: UsageSummary = { inputTokens: 0, outputTokens: 0, cachedInputTokens: 0, totalCostUSD: 0 };\n\nconst initial: State = {\n entries: [],\n history: [],\n meta: null,\n usage: ZERO_USAGE,\n status: 'idle',\n error: null,\n budgetReason: null,\n proposals: {},\n attachmentDiagnostics: [],\n};\n\nfunction reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'reset':\n return { ...initial, meta: state.meta };\n case 'hydrate':\n return {\n ...initial,\n entries: action.snapshot.entries,\n history: action.snapshot.history,\n meta: action.snapshot.meta,\n usage: action.snapshot.usage,\n status: action.snapshot.status,\n error: action.snapshot.error,\n budgetReason: action.snapshot.budgetReason,\n proposals: action.snapshot.proposals,\n attachmentDiagnostics: [],\n };\n case 'submit': {\n const userEntry: ChatEntry = {\n id: action.entryId,\n kind: 'user',\n text: action.userText,\n ...(action.attachmentNames && action.attachmentNames.length > 0\n ? { attachmentNames: action.attachmentNames }\n : {}),\n };\n const assistantEntry: ChatEntry = {\n id: action.assistantId,\n kind: 'assistant',\n text: '',\n toolCalls: [],\n proposalIds: [],\n streaming: true,\n };\n return {\n ...state,\n status: 'streaming',\n error: null,\n budgetReason: null,\n attachmentDiagnostics: [],\n entries: [...state.entries, userEntry, assistantEntry],\n history: [...state.history, { role: 'user', content: action.userText }],\n };\n }\n case 'attachments':\n return { ...state, attachmentDiagnostics: action.diagnostics };\n case 'submit_system': {\n const systemEntry: ChatEntry = { id: action.entryId, kind: 'system', text: action.text };\n const assistantEntry: ChatEntry = {\n id: action.assistantId,\n kind: 'assistant',\n text: '',\n toolCalls: [],\n proposalIds: [],\n streaming: true,\n };\n return {\n ...state,\n status: 'streaming',\n error: null,\n budgetReason: null,\n entries: [...state.entries, systemEntry, assistantEntry],\n history: [...state.history, { role: 'user', content: action.wireText }],\n };\n }\n case 'meta':\n return { ...state, meta: action.meta };\n case 'event':\n return applyEvent(state, action.assistantId, action.event);\n case 'finish':\n return {\n ...state,\n status: state.status === 'streaming' ? 'idle' : state.status,\n history: [...state.history, ...action.appendedHistory],\n entries: state.entries.map((e) =>\n e.id === action.assistantId && e.kind === 'assistant' ? { ...e, streaming: false } : e,\n ),\n };\n case 'errored':\n return { ...state, status: 'error', error: action.message };\n case 'stopped':\n return {\n ...state,\n status: 'stopped',\n entries: state.entries.map((e) =>\n e.id === action.assistantId && e.kind === 'assistant' ? { ...e, streaming: false } : e,\n ),\n };\n case 'proposal_status': {\n const existing = state.proposals[action.proposalId];\n if (!existing) return state;\n return {\n ...state,\n proposals: {\n ...state.proposals,\n [action.proposalId]: { ...existing, status: action.status },\n },\n };\n }\n }\n}\n\nfunction applyEvent(state: State, assistantId: string, event: ChatEvent): State {\n const entries = [...state.entries];\n const idx = entries.findIndex((e) => e.id === assistantId && e.kind === 'assistant');\n if (idx === -1) return state;\n const current = entries[idx] as Extract<ChatEntry, { kind: 'assistant' }>;\n let next = current;\n\n switch (event.type) {\n case 'text_delta':\n next = { ...current, text: current.text + event.text };\n break;\n case 'tool_use_start': {\n const tc: ChatToolCall = { id: event.id, name: event.name, inputJson: '' };\n next = { ...current, toolCalls: [...current.toolCalls, tc] };\n break;\n }\n case 'tool_use_input_delta': {\n next = {\n ...current,\n toolCalls: current.toolCalls.map((tc) =>\n tc.id === event.id ? { ...tc, inputJson: tc.inputJson + event.partialJson } : tc,\n ),\n };\n break;\n }\n case 'tool_use_complete': {\n next = {\n ...current,\n toolCalls: current.toolCalls.map((tc) => (tc.id === event.id ? { ...tc, parsedInput: event.input } : tc)),\n };\n break;\n }\n case 'tool_result': {\n next = {\n ...current,\n toolCalls: current.toolCalls.map((tc) =>\n tc.id === event.toolUseId\n ? { ...tc, result: { content: event.result, isError: Boolean(event.isError) } }\n : tc,\n ),\n };\n break;\n }\n case 'proposal': {\n next = { ...current, proposalIds: [...current.proposalIds, event.proposal.id] };\n entries[idx] = next;\n const proposalState: ProposalUiState = {\n proposal: event.proposal,\n assistantEntryId: assistantId,\n status: { kind: 'pending' },\n };\n return {\n ...state,\n entries,\n proposals: { ...state.proposals, [event.proposal.id]: proposalState },\n };\n }\n case 'usage': {\n const usage: UsageSummary = {\n inputTokens: state.usage.inputTokens + event.inputTokens,\n outputTokens: state.usage.outputTokens + event.outputTokens,\n cachedInputTokens: state.usage.cachedInputTokens + (event.cachedInputTokens ?? 0),\n totalCostUSD: event.totalCostUSD,\n };\n entries[idx] = current;\n return { ...state, entries, usage };\n }\n case 'budget_exceeded':\n return { ...state, status: 'budget_exceeded', budgetReason: event.reason };\n case 'error':\n return { ...state, status: 'error', error: event.message };\n case 'turn_stop':\n case 'done':\n // Note: full assistant content (text + tool calls + tool results) is folded\n // back into history when the SSE stream completes — see `finalizeHistory`.\n break;\n }\n\n entries[idx] = next;\n return { ...state, entries };\n}\n\n/** Build the new history slice (assistant + tool messages) from the assistant entry. */\nfunction buildAppendedHistory(state: State, assistantId: string): NormalizedMessage[] {\n const entry = state.entries.find((e) => e.id === assistantId && e.kind === 'assistant');\n if (!entry || entry.kind !== 'assistant') return [];\n const blocks: import('../../agent/providers/types').NormalizedContentBlock[] = [];\n if (entry.text) blocks.push({ type: 'text', text: entry.text });\n for (const tc of entry.toolCalls) {\n blocks.push({ type: 'tool_use', id: tc.id, name: tc.name, input: tc.parsedInput ?? {} });\n }\n const out: NormalizedMessage[] = [{ role: 'assistant', content: blocks }];\n for (const tc of entry.toolCalls) {\n if (tc.result) {\n out.push({\n role: 'tool',\n toolUseId: tc.id,\n content: tc.result.content,\n ...(tc.result.isError ? { isError: true } : {}),\n });\n }\n }\n return out;\n}\n\nexport type UseChatStreamReturn = {\n entries: ChatEntry[];\n /** Wire history sent to the chat API on the next request. */\n history: NormalizedMessage[];\n meta: ChatMeta | null;\n usage: UsageSummary;\n status: State['status'];\n error: string | null;\n budgetReason: State['budgetReason'];\n proposals: Record<string, ProposalUiState>;\n attachmentDiagnostics: AttachmentDiagnostic[];\n send(text: string, files?: File[]): Promise<void>;\n reset(): void;\n /**\n * Abort the in-flight chat request. The streamed-so-far assistant content\n * is kept in the transcript and folded into history (so the next turn sees\n * a coherent conversation); status flips to `'stopped'` until the next\n * `send`. No-op when nothing is streaming.\n */\n stop(): void;\n acceptProposal(proposalId: string): Promise<void>;\n rejectProposal(proposalId: string, reason?: string): Promise<void>;\n acceptAllPending(assistantEntryId: string): Promise<void>;\n hydrate(snapshot: PersistedChatState): void;\n getSnapshot(): PersistedChatState | null;\n};\n\nexport function useChatStream(endpoint: string = '/api/agent'): UseChatStreamReturn {\n const queryClient = useQueryClient();\n const [state, dispatch] = useReducer(reducer, initial);\n const stateRef = useRef(state);\n stateRef.current = state;\n /**\n * Holds the in-flight request controller + the assistant-entry id it\n * belongs to. `stop()` aborts the controller and finalises that entry.\n * Set on submit, cleared on completion or abort.\n */\n const inFlightRef = useRef<{ controller: AbortController; assistantId: string } | null>(null);\n\n const abortInFlight = useCallback(() => {\n if (inFlightRef.current) {\n inFlightRef.current.controller.abort();\n inFlightRef.current = null;\n }\n }, []);\n\n const reset = useCallback(() => {\n abortInFlight();\n dispatch({ type: 'reset' });\n }, [abortInFlight]);\n\n const hydrate = useCallback(\n (snapshot: PersistedChatState) => {\n abortInFlight();\n dispatch({ type: 'hydrate', snapshot });\n },\n [abortInFlight],\n );\n\n const getSnapshot = useCallback((): PersistedChatState | null => {\n return toPersistedState(stateRef.current);\n }, []);\n\n // Abort any pending stream when the hook unmounts (page navigation, etc.)\n // so we don't leak the connection.\n useEffect(() => {\n return () => {\n inFlightRef.current?.controller.abort();\n inFlightRef.current = null;\n };\n }, []);\n\n const stop = useCallback(() => {\n const inFlight = inFlightRef.current;\n if (!inFlight) return;\n inFlight.controller.abort();\n inFlightRef.current = null;\n // Persist whatever assistant content we've already streamed back into history\n // so the next turn sees a coherent transcript, then mark the entry stopped.\n const appendedHistory = buildAppendedHistory(stateRef.current, inFlight.assistantId);\n if (appendedHistory.length > 0) {\n dispatch({ type: 'finish', assistantId: inFlight.assistantId, appendedHistory });\n }\n dispatch({ type: 'stopped', assistantId: inFlight.assistantId });\n }, []);\n\n /**\n * Run the streaming chat request. Used by `send` (user messages) and\n * `submitSystemMessage` (auto-followup after accept/reject).\n *\n * When `files` is non-empty, sends the request as multipart/form-data so the\n * server can parse uploads. Otherwise sends JSON. Either way, history is\n * always serialised in the `messages` field.\n */\n const runRequest = useCallback(\n async (assistantId: string, historyToSend: NormalizedMessage[], files?: File[]) => {\n const controller = new AbortController();\n inFlightRef.current = { controller, assistantId };\n try {\n const init: RequestInit =\n files && files.length > 0\n ? {\n method: 'POST',\n body: buildMultipartBody(historyToSend, files),\n signal: controller.signal,\n }\n : {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ messages: historyToSend }),\n signal: controller.signal,\n };\n const res = await fetch(endpoint, init);\n if (!res.ok) {\n const message = res.status === 404 ? 'Chat is not enabled in this deploy.' : `HTTP ${res.status}`;\n dispatch({ type: 'errored', message });\n return;\n }\n if (!res.body) {\n dispatch({ type: 'errored', message: 'Server returned an empty body.' });\n return;\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n // Parse SSE blocks separated by \\n\\n. Each may be `event: meta` or `data:`.\n let sepIdx;\n while ((sepIdx = buffer.indexOf('\\n\\n')) !== -1) {\n const block = buffer.slice(0, sepIdx);\n buffer = buffer.slice(sepIdx + 2);\n handleSseBlock(block, assistantId, dispatch);\n }\n }\n } catch (err) {\n // AbortError (from `stop()` / `reset()` / unmount) is expected — `stop`\n // already dispatched its own state transition, so swallow it here.\n const aborted =\n (err instanceof DOMException && err.name === 'AbortError') ||\n (err instanceof Error && err.name === 'AbortError') ||\n controller.signal.aborted;\n if (aborted) return;\n dispatch({ type: 'errored', message: err instanceof Error ? err.message : 'Network error' });\n return;\n } finally {\n // Clear in-flight only if it's still pointing at *this* request.\n if (inFlightRef.current?.controller === controller) {\n inFlightRef.current = null;\n }\n }\n\n const appendedHistory = buildAppendedHistory(stateRef.current, assistantId);\n dispatch({ type: 'finish', assistantId, appendedHistory });\n },\n [endpoint],\n );\n\n const send = useCallback(\n async (text: string, files: File[] = []) => {\n const trimmed = text.trim();\n // Allow empty text when there are attachments — the model can still\n // reason about the document. Default the wire prompt so the model has\n // something to anchor on.\n const wireText = trimmed || (files.length > 0 ? 'Please review the attached document.' : '');\n if (!wireText || stateRef.current.status === 'streaming') return;\n const entryId = `e_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n const assistantId = `a_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n\n dispatch({\n type: 'submit',\n userText: trimmed,\n entryId,\n assistantId,\n ...(files.length > 0 ? { attachmentNames: files.map((f) => f.name) } : {}),\n });\n\n // Build the request body from the SAME state we're dispatching into,\n // so the server sees the full history including the new user message.\n const historyToSend: NormalizedMessage[] = [...stateRef.current.history, { role: 'user', content: wireText }];\n\n await runRequest(assistantId, historyToSend, files);\n },\n [runRequest],\n );\n\n /**\n * Internal: post a synthetic system-style message to continue the conversation\n * after the user accepts or rejects a proposal. The entry shows in the\n * transcript as a `system` bubble (no avatar); on the wire it's a `user`\n * message tagged `[System notification]` so the model picks it up.\n */\n const submitSystemMessage = useCallback(\n async (visibleText: string, wireText: string) => {\n if (stateRef.current.status === 'streaming') return;\n const entryId = `s_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n const assistantId = `a_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n dispatch({ type: 'submit_system', text: visibleText, entryId, assistantId, wireText });\n\n const historyToSend: NormalizedMessage[] = [...stateRef.current.history, { role: 'user', content: wireText }];\n await runRequest(assistantId, historyToSend);\n },\n [runRequest],\n );\n\n const acceptProposal = useCallback(\n async (proposalId: string) => {\n const ps = stateRef.current.proposals[proposalId];\n if (!ps || ps.status.kind !== 'pending') return;\n\n dispatch({ type: 'proposal_status', proposalId, status: { kind: 'accepting' } });\n\n let result: Awaited<ReturnType<typeof acceptProposalAction>>;\n try {\n result = await acceptProposalAction(ps.proposal);\n } catch (err) {\n dispatch({\n type: 'proposal_status',\n proposalId,\n status: { kind: 'error', message: err instanceof Error ? err.message : 'Accept failed' },\n });\n return;\n }\n\n if (!result.ok) {\n dispatch({\n type: 'proposal_status',\n proposalId,\n status: {\n kind: 'error',\n message: result.error,\n ...(result.fieldErrors ? { fieldErrors: result.fieldErrors } : {}),\n },\n });\n return;\n }\n dispatch({\n type: 'proposal_status',\n proposalId,\n status: { kind: 'accepted', entryPath: result.entryPath },\n });\n\n await invalidateAfterMutationAsync(queryClient, ['entries']);\n\n // Auto-followup so the model sees the result and can continue naturally.\n await submitSystemMessage(\n `Accepted: ${ps.proposal.summary} → saved at ${result.entryPath}.`,\n `[System notification] The user ACCEPTED proposal ${ps.proposal.id} (${ps.proposal.summary}). The entry was saved at ${result.entryPath}. Continue the conversation — do NOT propose the same change again.`,\n );\n },\n [queryClient, submitSystemMessage],\n );\n\n const rejectProposal = useCallback(\n async (proposalId: string, reason?: string) => {\n const ps = stateRef.current.proposals[proposalId];\n if (!ps || ps.status.kind !== 'pending') return;\n\n dispatch({ type: 'proposal_status', proposalId, status: { kind: 'rejecting' } });\n try {\n await rejectProposalAction(reason ?? null);\n } catch {\n /* reject is informational; still mark rejected even if the action throws */\n }\n dispatch({\n type: 'proposal_status',\n proposalId,\n status: { kind: 'rejected', ...(reason ? { reason } : {}) },\n });\n\n const reasonClause = reason ? ` Reason: ${reason}` : '';\n await submitSystemMessage(\n `Rejected: ${ps.proposal.summary}.${reasonClause}`,\n `[System notification] The user REJECTED proposal ${ps.proposal.id} (${ps.proposal.summary}).${reasonClause} Acknowledge briefly and ask if they want a different change — do NOT re-propose the same thing.`,\n );\n },\n [submitSystemMessage],\n );\n\n const acceptAllPending = useCallback(\n async (assistantEntryId: string) => {\n // Snapshot the pending proposals on this assistant turn at click time.\n const all = Object.values(stateRef.current.proposals).filter(\n (p) => p.assistantEntryId === assistantEntryId && p.status.kind === 'pending',\n );\n for (const p of all) {\n // After each accept, the auto-followup triggers a fresh assistant turn.\n // We wait for it to finish before accepting the next so we don't race.\n await acceptProposal(p.proposal.id);\n // Halt on first failure — matches the Phase 4 plan's \"halt on first failure\".\n const updated = stateRef.current.proposals[p.proposal.id];\n if (!updated || updated.status.kind !== 'accepted') break;\n }\n },\n [acceptProposal],\n );\n\n return {\n entries: state.entries,\n history: state.history,\n meta: state.meta,\n usage: state.usage,\n status: state.status,\n error: state.error,\n budgetReason: state.budgetReason,\n proposals: state.proposals,\n attachmentDiagnostics: state.attachmentDiagnostics,\n send,\n reset,\n stop,\n acceptProposal,\n rejectProposal,\n acceptAllPending,\n hydrate,\n getSnapshot,\n };\n}\n\nexport type { PersistedChatState };\n\n/**\n * Build a multipart FormData body. The chat history is JSON-serialised into\n * a `messages` field; uploads go in repeated `files` fields. The server-side\n * route handler (`src/app/api/agent/route.ts`) parses the same shape.\n */\nfunction buildMultipartBody(messages: NormalizedMessage[], files: File[]): FormData {\n const fd = new FormData();\n fd.append('messages', JSON.stringify(messages));\n for (const f of files) fd.append('files', f, f.name);\n return fd;\n}\n\nfunction handleSseBlock(block: string, assistantId: string, dispatch: (a: Action) => void): void {\n // SSE block: lines starting with `event:` or `data:`.\n const lines = block.split('\\n');\n let eventName: string | null = null;\n const dataLines: string[] = [];\n for (const line of lines) {\n if (line.startsWith('event:')) eventName = line.slice(6).trim();\n else if (line.startsWith('data:')) dataLines.push(line.slice(5).trim());\n }\n if (dataLines.length === 0) return;\n const payload = dataLines.join('\\n');\n try {\n const json = JSON.parse(payload);\n if (eventName === 'meta') {\n dispatch({ type: 'meta', meta: json as ChatMeta });\n return;\n }\n if (eventName === 'attachments') {\n const diagnostics = (json as { diagnostics?: AttachmentDiagnostic[] }).diagnostics ?? [];\n dispatch({ type: 'attachments', diagnostics });\n return;\n }\n dispatch({ type: 'event', assistantId, event: json as ChatEvent });\n } catch {\n // Ignore malformed chunks — stream continues.\n }\n}\n\n// Re-export so consumers don't need to also reach into ./types\nexport type { Proposal };\n"],"mappings":"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","names":[]}
@@ -7,6 +7,6 @@ export declare function useCommandK(): {
7
7
  open: boolean;
8
8
  setOpen: React.Dispatch<React.SetStateAction<boolean>>;
9
9
  };
10
- export declare function CommandK({ open, onOpenChange }: CommandKProps): import("react/jsx-runtime").JSX.Element | null;
10
+ export declare function CommandK({ open, onOpenChange }: CommandKProps): import("react/jsx-runtime").JSX.Element;
11
11
  export {};
12
12
  //# sourceMappingURL=CommandK.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CommandK.d.ts","sourceRoot":"","sources":["../../../components/CommandK/CommandK.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAc/B,KAAK,aAAa,GAAG;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC,CAAC;AAEF,wBAAgB,WAAW;;;EAe1B;AAoBD,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,aAAa,kDAqP7D"}
1
+ {"version":3,"file":"CommandK.d.ts","sourceRoot":"","sources":["../../../components/CommandK/CommandK.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAa/B,KAAK,aAAa,GAAG;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC,CAAC;AAEF,wBAAgB,WAAW;;;EAe1B;AAoBD,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,aAAa,2CAuO7D"}
@@ -4,14 +4,13 @@ import { jsx, jsxs } from "react/jsx-runtime";
4
4
  import * as React from "react";
5
5
  import { useQueryClient } from "@tanstack/react-query";
6
6
  import { useRouter } from "next/navigation";
7
- import { Bot, FileText, GitBranch, Plus, Search } from "lucide-react";
7
+ import { Dialog, DialogContent, Icon, Kbd } from "../ui";
8
8
  import { getEntryList } from "../../admin/actions/entries";
9
9
  import { getFile } from "../../admin/actions/files";
10
10
  import { listCMSBranches, searchEntries } from "../../admin/actions";
11
11
  import { queryKeys } from "../../admin/query/keys";
12
12
  import { useConfig } from "../../hooks/useConfig";
13
13
  import { entryAdminHref } from "../../lib/searchIndex";
14
- import { Kbd } from "../ui";
15
14
  import { RowItem, Section } from "./parts";
16
15
  function useCommandK() {
17
16
  const [open, setOpen] = React.useState(false);
@@ -30,8 +29,8 @@ function useCommandK() {
30
29
  return { open, setOpen };
31
30
  }
32
31
  const ACTIONS = [
33
- { id: "new-entry", label: "New entry", icon: /* @__PURE__ */ jsx(Plus, { size: 14 }), href: "/cms/content", kbd: ["\u2318", "N"] },
34
- { id: "agent", label: "Ask the agent", icon: /* @__PURE__ */ jsx(Bot, { size: 14 }), href: "/cms/chat", kbd: ["\u2318", "J"] }
32
+ { id: "new-entry", label: "New entry", icon: /* @__PURE__ */ jsx(Icon.Plus, { size: 14 }), href: "/cms/content", kbd: ["\u2318", "N"] },
33
+ { id: "agent", label: "Ask the agent", icon: /* @__PURE__ */ jsx(Icon.Bot, { size: 14 }), href: "/cms/chat", kbd: ["\u2318", "J"] }
35
34
  ];
36
35
  function CommandK({ open, onOpenChange }) {
37
36
  const router = useRouter();
@@ -137,121 +136,106 @@ function CommandK({ open, onOpenChange }) {
137
136
  if (row) runRow(row, e.metaKey || e.ctrlKey);
138
137
  }
139
138
  };
140
- if (!open) return null;
141
139
  let runningIndex = -1;
142
- return /* @__PURE__ */ jsx(
143
- "div",
140
+ return /* @__PURE__ */ jsx(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs(
141
+ DialogContent,
144
142
  {
145
- className: "fixed inset-0 z-[200] flex items-start justify-center bg-black/40 px-4 pt-[12vh] backdrop-blur-sm",
146
- role: "dialog",
147
- "aria-modal": "true",
148
- onClick: () => onOpenChange(false),
149
- onKeyDown: (e) => {
150
- if (e.key === "Escape") onOpenChange(false);
151
- },
152
- children: /* @__PURE__ */ jsxs(
153
- "div",
154
- {
155
- className: "w-full max-w-[720px] overflow-hidden rounded-xl border border-[var(--border)] bg-[var(--surface-1)]",
156
- style: { boxShadow: "var(--shadow-3)" },
157
- onClick: (e) => e.stopPropagation(),
158
- onKeyDown: (e) => e.stopPropagation(),
159
- children: [
160
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 border-b border-[var(--border)] px-4 py-3.5", children: [
161
- /* @__PURE__ */ jsx(Search, { size: 18, className: "text-[var(--muted)]" }),
162
- /* @__PURE__ */ jsx(
163
- "input",
164
- {
165
- ref: inputRef,
166
- value: query,
167
- onChange: (e) => setQuery(e.target.value),
168
- onKeyDown,
169
- placeholder: "Search entries, branches\u2026",
170
- className: "flex-1 border-0 bg-transparent text-base text-[var(--text)] outline-none"
171
- }
172
- ),
173
- /* @__PURE__ */ jsx(Kbd, { children: "Esc" })
174
- ] }),
175
- /* @__PURE__ */ jsxs("div", { className: "max-h-[60vh] overflow-y-auto py-2", children: [
176
- entries.length > 0 && /* @__PURE__ */ jsx(Section, { label: `Entries \xB7 ${entries.length}`, children: entries.map((r) => {
177
- runningIndex += 1;
178
- const idx = runningIndex;
179
- const adminHref = entryAdminHref(r);
180
- return /* @__PURE__ */ jsx(
181
- RowItem,
182
- {
183
- icon: /* @__PURE__ */ jsx(FileText, { size: 14 }),
184
- title: r.title,
185
- sub: adminHref,
186
- badge: r.typeLabel,
187
- active: idx === activeIndex,
188
- href: adminHref,
189
- onMouseEnter: () => {
190
- setActiveIndex(idx);
191
- prefetchEntryHit(r);
192
- },
193
- onClick: () => onOpenChange(false)
194
- },
195
- `e-${r.id}`
196
- );
197
- }) }),
198
- matchingBranches.length > 0 && /* @__PURE__ */ jsx(Section, { label: `Branches \xB7 ${matchingBranches.length}`, children: matchingBranches.map((b) => {
199
- runningIndex += 1;
200
- const idx = runningIndex;
201
- return /* @__PURE__ */ jsx(
202
- RowItem,
203
- {
204
- icon: /* @__PURE__ */ jsx(GitBranch, { size: 14 }),
205
- title: b.branch,
206
- sub: b.isPublished ? "Published \xB7 live" : b.prUrl ? "Open PR" : "Branch",
207
- mono: true,
208
- active: idx === activeIndex,
209
- onMouseEnter: () => setActiveIndex(idx),
210
- onClick: (e) => runRow({ kind: "branch", branch: b }, e.metaKey || e.ctrlKey)
211
- },
212
- `b-${b.branch}`
213
- );
214
- }) }),
215
- matchingActions.length > 0 && /* @__PURE__ */ jsx(Section, { label: "Actions", children: matchingActions.map((a) => {
216
- runningIndex += 1;
217
- const idx = runningIndex;
218
- return /* @__PURE__ */ jsx(
219
- RowItem,
220
- {
221
- icon: a.icon,
222
- title: a.label,
223
- kbd: a.kbd,
224
- active: idx === activeIndex,
225
- href: a.href,
226
- onMouseEnter: () => setActiveIndex(idx),
227
- onClick: () => onOpenChange(false)
228
- },
229
- `a-${a.id}`
230
- );
231
- }) }),
232
- rows.length === 0 && /* @__PURE__ */ jsx("div", { className: "px-4 py-8 text-center text-sm text-[var(--muted)]", children: query.trim() ? "No results" : "Start typing to search\u2026" })
233
- ] }),
234
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4 border-t border-[var(--border)] bg-[var(--surface-2)] px-4 py-2.5 text-xs text-[var(--muted)]", children: [
235
- /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
236
- /* @__PURE__ */ jsx(Kbd, { children: "\u2191" }),
237
- /* @__PURE__ */ jsx(Kbd, { children: "\u2193" }),
238
- " navigate"
239
- ] }),
240
- /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
241
- /* @__PURE__ */ jsx(Kbd, { children: "\u21B5" }),
242
- " open"
243
- ] }),
244
- /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
245
- /* @__PURE__ */ jsx(Kbd, { children: "\u2318" }),
246
- /* @__PURE__ */ jsx(Kbd, { children: "\u21B5" }),
247
- " open in new tab"
248
- ] })
249
- ] })
250
- ]
251
- }
252
- )
143
+ className: "octo-cmdk__dialog octo-dialog-content octo-dialog-content--3xl octo-dialog-content--no-padding octo-dialog-content--overflow-hidden",
144
+ "aria-label": "Command palette",
145
+ children: [
146
+ /* @__PURE__ */ jsxs("div", { className: "octo-cmdk__input-row", children: [
147
+ /* @__PURE__ */ jsx(Icon.Search, { size: 18, className: "octo-cmdk__input-icon" }),
148
+ /* @__PURE__ */ jsx(
149
+ "input",
150
+ {
151
+ ref: inputRef,
152
+ value: query,
153
+ onChange: (e) => setQuery(e.target.value),
154
+ onKeyDown,
155
+ placeholder: "Search entries, branches\u2026",
156
+ className: "octo-cmdk__input"
157
+ }
158
+ ),
159
+ /* @__PURE__ */ jsx(Kbd, { children: "Esc" })
160
+ ] }),
161
+ /* @__PURE__ */ jsxs("div", { className: "octo-cmdk__results", children: [
162
+ entries.length > 0 && /* @__PURE__ */ jsx(Section, { label: `Entries \xB7 ${entries.length}`, children: entries.map((r) => {
163
+ runningIndex += 1;
164
+ const idx = runningIndex;
165
+ const adminHref = entryAdminHref(r);
166
+ return /* @__PURE__ */ jsx(
167
+ RowItem,
168
+ {
169
+ icon: /* @__PURE__ */ jsx(Icon.FileText, { size: 14 }),
170
+ title: r.title,
171
+ sub: adminHref,
172
+ badge: r.typeLabel,
173
+ active: idx === activeIndex,
174
+ href: adminHref,
175
+ onMouseEnter: () => {
176
+ setActiveIndex(idx);
177
+ prefetchEntryHit(r);
178
+ },
179
+ onClick: () => onOpenChange(false)
180
+ },
181
+ `e-${r.id}`
182
+ );
183
+ }) }),
184
+ matchingBranches.length > 0 && /* @__PURE__ */ jsx(Section, { label: `Branches \xB7 ${matchingBranches.length}`, children: matchingBranches.map((b) => {
185
+ runningIndex += 1;
186
+ const idx = runningIndex;
187
+ return /* @__PURE__ */ jsx(
188
+ RowItem,
189
+ {
190
+ icon: /* @__PURE__ */ jsx(Icon.GitBranch, { size: 14 }),
191
+ title: b.branch,
192
+ sub: b.isPublished ? "Published \xB7 live" : b.prUrl ? "Open PR" : "Branch",
193
+ mono: true,
194
+ active: idx === activeIndex,
195
+ onMouseEnter: () => setActiveIndex(idx),
196
+ onClick: (e) => runRow({ kind: "branch", branch: b }, e.metaKey || e.ctrlKey)
197
+ },
198
+ `b-${b.branch}`
199
+ );
200
+ }) }),
201
+ matchingActions.length > 0 && /* @__PURE__ */ jsx(Section, { label: "Actions", children: matchingActions.map((a) => {
202
+ runningIndex += 1;
203
+ const idx = runningIndex;
204
+ return /* @__PURE__ */ jsx(
205
+ RowItem,
206
+ {
207
+ icon: a.icon,
208
+ title: a.label,
209
+ kbd: a.kbd,
210
+ active: idx === activeIndex,
211
+ href: a.href,
212
+ onMouseEnter: () => setActiveIndex(idx),
213
+ onClick: () => onOpenChange(false)
214
+ },
215
+ `a-${a.id}`
216
+ );
217
+ }) }),
218
+ rows.length === 0 && /* @__PURE__ */ jsx("div", { className: "octo-cmdk__empty", children: query.trim() ? "No results" : "Start typing to search\u2026" })
219
+ ] }),
220
+ /* @__PURE__ */ jsxs("div", { className: "octo-cmdk__footer", children: [
221
+ /* @__PURE__ */ jsxs("span", { className: "octo-cmdk__footer-hint", children: [
222
+ /* @__PURE__ */ jsx(Kbd, { children: "\u2191" }),
223
+ /* @__PURE__ */ jsx(Kbd, { children: "\u2193" }),
224
+ " navigate"
225
+ ] }),
226
+ /* @__PURE__ */ jsxs("span", { className: "octo-cmdk__footer-hint", children: [
227
+ /* @__PURE__ */ jsx(Kbd, { children: "\u21B5" }),
228
+ " open"
229
+ ] }),
230
+ /* @__PURE__ */ jsxs("span", { className: "octo-cmdk__footer-hint", children: [
231
+ /* @__PURE__ */ jsx(Kbd, { children: "\u2318" }),
232
+ /* @__PURE__ */ jsx(Kbd, { children: "\u21B5" }),
233
+ " open in new tab"
234
+ ] })
235
+ ] })
236
+ ]
253
237
  }
254
- );
238
+ ) });
255
239
  }
256
240
  export {
257
241
  CommandK,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../components/CommandK/CommandK.tsx"],"sourcesContent":["// CommandK — global ⌘K palette overlay.\n// Result sections: entries (`searchEntries`) + branches (`listCMSBranches`)\n// + a static Actions list. Media + Content Model search are out of scope.\n'use client';\n\nimport * as React from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useRouter } from 'next/navigation';\nimport { Bot, FileText, GitBranch, Plus, Search } from 'lucide-react';\n\nimport { getEntryList } from '../../admin/actions/entries';\nimport { getFile } from '../../admin/actions/files';\nimport { listCMSBranches, searchEntries, type CMSBranch, type SearchResult } from '../../admin/actions';\nimport { queryKeys } from '../../admin/query/keys';\nimport { useConfig } from '../../hooks/useConfig';\nimport { entryAdminHref } from '../../lib/searchIndex';\nimport { Kbd } from '../ui';\nimport { RowItem, Section } from './parts';\n\ntype CommandKProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n};\n\nexport function useCommandK() {\n const [open, setOpen] = React.useState(false);\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const isMac = navigator.platform.toLowerCase().includes('mac');\n const mod = isMac ? e.metaKey : e.ctrlKey;\n if (mod && e.key.toLowerCase() === 'k') {\n e.preventDefault();\n setOpen((v) => !v);\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, []);\n return { open, setOpen };\n}\n\ntype Action = {\n id: string;\n label: string;\n icon: React.ReactNode;\n href?: string;\n kbd?: string[];\n};\n\nconst ACTIONS: Action[] = [\n { id: 'new-entry', label: 'New entry', icon: <Plus size={14} />, href: '/cms/content', kbd: ['⌘', 'N'] },\n { id: 'agent', label: 'Ask the agent', icon: <Bot size={14} />, href: '/cms/chat', kbd: ['⌘', 'J'] },\n];\n\ntype Row =\n | { kind: 'entry'; result: SearchResult }\n | { kind: 'branch'; branch: CMSBranch }\n | { kind: 'action'; action: Action };\n\nexport function CommandK({ open, onOpenChange }: CommandKProps) {\n const router = useRouter();\n const queryClient = useQueryClient();\n const config = useConfig();\n const [query, setQuery] = React.useState('');\n const [entries, setEntries] = React.useState<SearchResult[]>([]);\n const [branches, setBranches] = React.useState<CMSBranch[]>([]);\n const [activeIndex, setActiveIndex] = React.useState(0);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // Reset state when palette opens; focus input.\n React.useEffect(() => {\n if (!open) return;\n setQuery('');\n setEntries([]);\n setActiveIndex(0);\n listCMSBranches()\n .then(setBranches)\n .catch(() => setBranches([]));\n requestAnimationFrame(() => inputRef.current?.focus());\n }, [open]);\n\n // Debounced entry search.\n React.useEffect(() => {\n if (!open) return;\n const q = query.trim();\n if (!q) {\n setEntries([]);\n return;\n }\n const timer = setTimeout(() => {\n searchEntries(q)\n .then(setEntries)\n .catch(() => setEntries([]));\n }, 120);\n return () => clearTimeout(timer);\n }, [query, open]);\n\n // Build flat row list for keyboard navigation.\n const matchingBranches = React.useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return branches.slice(0, 5);\n return branches.filter((b) => b.branch.toLowerCase().includes(q)).slice(0, 5);\n }, [branches, query]);\n\n const matchingActions = React.useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return ACTIONS;\n return ACTIONS.filter((a) => a.label.toLowerCase().includes(q));\n }, [query]);\n\n const rows: Row[] = React.useMemo(\n () => [\n ...entries.map((r): Row => ({ kind: 'entry', result: r })),\n ...matchingBranches.map((b): Row => ({ kind: 'branch', branch: b })),\n ...matchingActions.map((a): Row => ({ kind: 'action', action: a })),\n ],\n [entries, matchingBranches, matchingActions],\n );\n\n const prefetchEntryHit = React.useCallback(\n (r: SearchResult) => {\n const [type, ...rest] = r.id.split('/');\n const stem = rest.join('/');\n if (!type || !stem) return;\n const filePath = `${config.contentFolder}/${type}/${stem}.json`;\n void queryClient.prefetchQuery({\n queryKey: queryKeys.entries.detail(filePath),\n queryFn: () => getFile(filePath),\n });\n void queryClient.prefetchQuery({\n queryKey: queryKeys.entries.list(type),\n queryFn: () => getEntryList(type),\n });\n },\n [config.contentFolder, queryClient],\n );\n\n React.useEffect(() => {\n if (activeIndex >= rows.length) setActiveIndex(0);\n }, [rows.length, activeIndex]);\n\n React.useEffect(() => {\n const row = rows[activeIndex];\n if (row?.kind === 'entry') prefetchEntryHit(row.result);\n }, [activeIndex, rows, prefetchEntryHit]);\n\n const runRow = React.useCallback(\n (row: Row, modifier?: boolean) => {\n onOpenChange(false);\n if (row.kind === 'entry') {\n // Always open the entry editor — never the public URL.\n router.push(entryAdminHref(row.result));\n } else if (row.kind === 'branch') {\n if (row.branch.prUrl && modifier) window.open(row.branch.prUrl, '_blank');\n } else if (row.action.href) {\n router.push(row.action.href);\n }\n },\n [onOpenChange, router],\n );\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Escape') {\n onOpenChange(false);\n return;\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setActiveIndex((i) => Math.min(i + 1, rows.length - 1));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setActiveIndex((i) => Math.max(i - 1, 0));\n } else if (e.key === 'Enter') {\n e.preventDefault();\n const row = rows[activeIndex];\n if (row) runRow(row, e.metaKey || e.ctrlKey);\n }\n };\n\n if (!open) return null;\n\n let runningIndex = -1;\n\n return (\n <div\n className=\"fixed inset-0 z-[200] flex items-start justify-center bg-black/40 px-4 pt-[12vh] backdrop-blur-sm\"\n role=\"dialog\"\n aria-modal=\"true\"\n onClick={() => onOpenChange(false)}\n onKeyDown={(e) => {\n if (e.key === 'Escape') onOpenChange(false);\n }}\n >\n <div\n className=\"w-full max-w-[720px] overflow-hidden rounded-xl border border-[var(--border)] bg-[var(--surface-1)]\"\n style={{ boxShadow: 'var(--shadow-3)' }}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n >\n <div className=\"flex items-center gap-3 border-b border-[var(--border)] px-4 py-3.5\">\n <Search size={18} className=\"text-[var(--muted)]\" />\n <input\n ref={inputRef}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder=\"Search entries, branches…\"\n className=\"flex-1 border-0 bg-transparent text-base text-[var(--text)] outline-none\"\n />\n <Kbd>Esc</Kbd>\n </div>\n\n <div className=\"max-h-[60vh] overflow-y-auto py-2\">\n {entries.length > 0 && (\n <Section label={`Entries · ${entries.length}`}>\n {entries.map((r) => {\n runningIndex += 1;\n const idx = runningIndex;\n const adminHref = entryAdminHref(r);\n return (\n <RowItem\n key={`e-${r.id}`}\n icon={<FileText size={14} />}\n title={r.title}\n sub={adminHref}\n badge={r.typeLabel}\n active={idx === activeIndex}\n href={adminHref}\n onMouseEnter={() => {\n setActiveIndex(idx);\n prefetchEntryHit(r);\n }}\n onClick={() => onOpenChange(false)}\n />\n );\n })}\n </Section>\n )}\n\n {matchingBranches.length > 0 && (\n <Section label={`Branches · ${matchingBranches.length}`}>\n {matchingBranches.map((b) => {\n runningIndex += 1;\n const idx = runningIndex;\n return (\n <RowItem\n key={`b-${b.branch}`}\n icon={<GitBranch size={14} />}\n title={b.branch}\n sub={b.isPublished ? 'Published · live' : b.prUrl ? 'Open PR' : 'Branch'}\n mono\n active={idx === activeIndex}\n onMouseEnter={() => setActiveIndex(idx)}\n onClick={(e) => runRow({ kind: 'branch', branch: b }, e.metaKey || e.ctrlKey)}\n />\n );\n })}\n </Section>\n )}\n\n {matchingActions.length > 0 && (\n <Section label=\"Actions\">\n {matchingActions.map((a) => {\n runningIndex += 1;\n const idx = runningIndex;\n return (\n <RowItem\n key={`a-${a.id}`}\n icon={a.icon}\n title={a.label}\n kbd={a.kbd}\n active={idx === activeIndex}\n href={a.href}\n onMouseEnter={() => setActiveIndex(idx)}\n onClick={() => onOpenChange(false)}\n />\n );\n })}\n </Section>\n )}\n\n {rows.length === 0 && (\n <div className=\"px-4 py-8 text-center text-sm text-[var(--muted)]\">\n {query.trim() ? 'No results' : 'Start typing to search…'}\n </div>\n )}\n </div>\n\n <div className=\"flex items-center gap-4 border-t border-[var(--border)] bg-[var(--surface-2)] px-4 py-2.5 text-xs text-[var(--muted)]\">\n <span className=\"inline-flex items-center gap-1\">\n <Kbd>↑</Kbd>\n <Kbd>↓</Kbd> navigate\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <Kbd>↵</Kbd> open\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <Kbd>⌘</Kbd>\n <Kbd>↵</Kbd> open in new tab\n </span>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../components/CommandK/CommandK.tsx"],"sourcesContent":["// CommandK — global ⌘K palette overlay.\n// Result sections: entries (`searchEntries`) + branches (`listCMSBranches`)\n// + a static Actions list. Media + Content Model search are out of scope.\n'use client';\n\nimport * as React from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useRouter } from 'next/navigation';\nimport { Dialog, DialogContent, Icon, Kbd } from '../ui';\n\nimport { getEntryList } from '../../admin/actions/entries';\nimport { getFile } from '../../admin/actions/files';\nimport { listCMSBranches, searchEntries, type CMSBranch, type SearchResult } from '../../admin/actions';\nimport { queryKeys } from '../../admin/query/keys';\nimport { useConfig } from '../../hooks/useConfig';\nimport { entryAdminHref } from '../../lib/searchIndex';\nimport { RowItem, Section } from './parts';\n\ntype CommandKProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n};\n\nexport function useCommandK() {\n const [open, setOpen] = React.useState(false);\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const isMac = navigator.platform.toLowerCase().includes('mac');\n const mod = isMac ? e.metaKey : e.ctrlKey;\n if (mod && e.key.toLowerCase() === 'k') {\n e.preventDefault();\n setOpen((v) => !v);\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, []);\n return { open, setOpen };\n}\n\ntype Action = {\n id: string;\n label: string;\n icon: React.ReactNode;\n href?: string;\n kbd?: string[];\n};\n\nconst ACTIONS: Action[] = [\n { id: 'new-entry', label: 'New entry', icon: <Icon.Plus size={14} />, href: '/cms/content', kbd: ['⌘', 'N'] },\n { id: 'agent', label: 'Ask the agent', icon: <Icon.Bot size={14} />, href: '/cms/chat', kbd: ['⌘', 'J'] },\n];\n\ntype Row =\n | { kind: 'entry'; result: SearchResult }\n | { kind: 'branch'; branch: CMSBranch }\n | { kind: 'action'; action: Action };\n\nexport function CommandK({ open, onOpenChange }: CommandKProps) {\n const router = useRouter();\n const queryClient = useQueryClient();\n const config = useConfig();\n const [query, setQuery] = React.useState('');\n const [entries, setEntries] = React.useState<SearchResult[]>([]);\n const [branches, setBranches] = React.useState<CMSBranch[]>([]);\n const [activeIndex, setActiveIndex] = React.useState(0);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // Reset state when palette opens; focus input.\n React.useEffect(() => {\n if (!open) return;\n setQuery('');\n setEntries([]);\n setActiveIndex(0);\n listCMSBranches()\n .then(setBranches)\n .catch(() => setBranches([]));\n requestAnimationFrame(() => inputRef.current?.focus());\n }, [open]);\n\n // Debounced entry search.\n React.useEffect(() => {\n if (!open) return;\n const q = query.trim();\n if (!q) {\n setEntries([]);\n return;\n }\n const timer = setTimeout(() => {\n searchEntries(q)\n .then(setEntries)\n .catch(() => setEntries([]));\n }, 120);\n return () => clearTimeout(timer);\n }, [query, open]);\n\n // Build flat row list for keyboard navigation.\n const matchingBranches = React.useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return branches.slice(0, 5);\n return branches.filter((b) => b.branch.toLowerCase().includes(q)).slice(0, 5);\n }, [branches, query]);\n\n const matchingActions = React.useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return ACTIONS;\n return ACTIONS.filter((a) => a.label.toLowerCase().includes(q));\n }, [query]);\n\n const rows: Row[] = React.useMemo(\n () => [\n ...entries.map((r): Row => ({ kind: 'entry', result: r })),\n ...matchingBranches.map((b): Row => ({ kind: 'branch', branch: b })),\n ...matchingActions.map((a): Row => ({ kind: 'action', action: a })),\n ],\n [entries, matchingBranches, matchingActions],\n );\n\n const prefetchEntryHit = React.useCallback(\n (r: SearchResult) => {\n const [type, ...rest] = r.id.split('/');\n const stem = rest.join('/');\n if (!type || !stem) return;\n const filePath = `${config.contentFolder}/${type}/${stem}.json`;\n void queryClient.prefetchQuery({\n queryKey: queryKeys.entries.detail(filePath),\n queryFn: () => getFile(filePath),\n });\n void queryClient.prefetchQuery({\n queryKey: queryKeys.entries.list(type),\n queryFn: () => getEntryList(type),\n });\n },\n [config.contentFolder, queryClient],\n );\n\n React.useEffect(() => {\n if (activeIndex >= rows.length) setActiveIndex(0);\n }, [rows.length, activeIndex]);\n\n React.useEffect(() => {\n const row = rows[activeIndex];\n if (row?.kind === 'entry') prefetchEntryHit(row.result);\n }, [activeIndex, rows, prefetchEntryHit]);\n\n const runRow = React.useCallback(\n (row: Row, modifier?: boolean) => {\n onOpenChange(false);\n if (row.kind === 'entry') {\n // Always open the entry editor — never the public URL.\n router.push(entryAdminHref(row.result));\n } else if (row.kind === 'branch') {\n if (row.branch.prUrl && modifier) window.open(row.branch.prUrl, '_blank');\n } else if (row.action.href) {\n router.push(row.action.href);\n }\n },\n [onOpenChange, router],\n );\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Escape') {\n onOpenChange(false);\n return;\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setActiveIndex((i) => Math.min(i + 1, rows.length - 1));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setActiveIndex((i) => Math.max(i - 1, 0));\n } else if (e.key === 'Enter') {\n e.preventDefault();\n const row = rows[activeIndex];\n if (row) runRow(row, e.metaKey || e.ctrlKey);\n }\n };\n\n let runningIndex = -1;\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className=\"octo-cmdk__dialog octo-dialog-content octo-dialog-content--3xl octo-dialog-content--no-padding octo-dialog-content--overflow-hidden\"\n aria-label=\"Command palette\"\n >\n <div className=\"octo-cmdk__input-row\">\n <Icon.Search size={18} className=\"octo-cmdk__input-icon\" />\n <input\n ref={inputRef}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder=\"Search entries, branches…\"\n className=\"octo-cmdk__input\"\n />\n <Kbd>Esc</Kbd>\n </div>\n\n <div className=\"octo-cmdk__results\">\n {entries.length > 0 && (\n <Section label={`Entries · ${entries.length}`}>\n {entries.map((r) => {\n runningIndex += 1;\n const idx = runningIndex;\n const adminHref = entryAdminHref(r);\n return (\n <RowItem\n key={`e-${r.id}`}\n icon={<Icon.FileText size={14} />}\n title={r.title}\n sub={adminHref}\n badge={r.typeLabel}\n active={idx === activeIndex}\n href={adminHref}\n onMouseEnter={() => {\n setActiveIndex(idx);\n prefetchEntryHit(r);\n }}\n onClick={() => onOpenChange(false)}\n />\n );\n })}\n </Section>\n )}\n\n {matchingBranches.length > 0 && (\n <Section label={`Branches · ${matchingBranches.length}`}>\n {matchingBranches.map((b) => {\n runningIndex += 1;\n const idx = runningIndex;\n return (\n <RowItem\n key={`b-${b.branch}`}\n icon={<Icon.GitBranch size={14} />}\n title={b.branch}\n sub={b.isPublished ? 'Published · live' : b.prUrl ? 'Open PR' : 'Branch'}\n mono\n active={idx === activeIndex}\n onMouseEnter={() => setActiveIndex(idx)}\n onClick={(e) => runRow({ kind: 'branch', branch: b }, e.metaKey || e.ctrlKey)}\n />\n );\n })}\n </Section>\n )}\n\n {matchingActions.length > 0 && (\n <Section label=\"Actions\">\n {matchingActions.map((a) => {\n runningIndex += 1;\n const idx = runningIndex;\n return (\n <RowItem\n key={`a-${a.id}`}\n icon={a.icon}\n title={a.label}\n kbd={a.kbd}\n active={idx === activeIndex}\n href={a.href}\n onMouseEnter={() => setActiveIndex(idx)}\n onClick={() => onOpenChange(false)}\n />\n );\n })}\n </Section>\n )}\n\n {rows.length === 0 && (\n <div className=\"octo-cmdk__empty\">{query.trim() ? 'No results' : 'Start typing to search…'}</div>\n )}\n </div>\n\n <div className=\"octo-cmdk__footer\">\n <span className=\"octo-cmdk__footer-hint\">\n <Kbd>↑</Kbd>\n <Kbd>↓</Kbd> navigate\n </span>\n <span className=\"octo-cmdk__footer-hint\">\n <Kbd>↵</Kbd> open\n </span>\n <span className=\"octo-cmdk__footer-hint\">\n <Kbd>⌘</Kbd>\n <Kbd>↵</Kbd> open in new tab\n </span>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../../../components/CommandK/parts.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAOxF;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mFAAmF;IACnF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;CACzC,CAAC;AAKF,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,YAAY,2CAsChH"}
1
+ {"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../../../components/CommandK/parts.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAOxF;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mFAAmF;IACnF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;CACzC,CAAC;AAEF,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,YAAY,2CAoChH"}
@@ -2,26 +2,24 @@
2
2
  import "../../chunk-B5LE2OEC.js";
3
3
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
4
4
  import Link from "next/link";
5
- import { cn } from "../../lib/utils";
6
5
  import { Kbd } from "../ui";
7
6
  function Section({ label, children }) {
8
- return /* @__PURE__ */ jsxs("div", { className: "py-1.5", children: [
9
- /* @__PURE__ */ jsx("div", { className: "px-4 py-1.5 text-[10px] font-semibold uppercase tracking-widest text-[var(--muted)]", children: label }),
7
+ return /* @__PURE__ */ jsxs("div", { className: "octo-cmdk__section", children: [
8
+ /* @__PURE__ */ jsx("div", { className: "octo-cmdk__section-label", children: label }),
10
9
  children
11
10
  ] });
12
11
  }
13
- const ROW_CLASSES = "flex w-full cursor-pointer items-center gap-3 border-0 bg-transparent px-4 py-2.5 text-left no-underline";
14
12
  function RowItem({ icon, title, sub, badge, kbd, mono, active, href, onMouseEnter, onClick }) {
13
+ const className = `octo-cmdk__item${active ? " octo-cmdk__item octo-cmdk__item--active" : ""}`;
15
14
  const inner = /* @__PURE__ */ jsxs(Fragment, { children: [
16
- /* @__PURE__ */ jsx("span", { className: "flex-none text-[var(--muted)]", children: icon }),
17
- /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
18
- /* @__PURE__ */ jsx("div", { className: cn("truncate text-sm font-medium text-[var(--text)]", mono && "font-mono"), children: title }),
19
- sub && /* @__PURE__ */ jsx("div", { className: "mt-0.5 truncate font-mono text-xs text-[var(--muted)]", children: sub })
15
+ /* @__PURE__ */ jsx("span", { className: "octo-cmdk__item-icon", children: icon }),
16
+ /* @__PURE__ */ jsxs("div", { className: "octo-cmdk__item-body", children: [
17
+ /* @__PURE__ */ jsx("div", { className: `octo-cmdk__item-label${mono ? " octo-cmdk__item-label octo-cmdk__item-label--mono" : ""}`, children: title }),
18
+ sub && /* @__PURE__ */ jsx("div", { className: "octo-cmdk__item-meta", children: sub })
20
19
  ] }),
21
- badge && /* @__PURE__ */ jsx("span", { className: "rounded-[4px] bg-[var(--surface-2)] px-2 py-0.5 font-mono text-[10px] uppercase tracking-wider text-[var(--muted)]", children: badge }),
22
- kbd && /* @__PURE__ */ jsx("span", { className: "inline-flex gap-1", children: kbd.map((k, i) => /* @__PURE__ */ jsx(Kbd, { children: k }, i)) })
20
+ badge && /* @__PURE__ */ jsx("span", { className: "octo-cmdk__item-badge", children: badge }),
21
+ kbd && /* @__PURE__ */ jsx("span", { className: "octo-cmdk__item-kbd", children: kbd.map((k, i) => /* @__PURE__ */ jsx(Kbd, { children: k }, i)) })
23
22
  ] });
24
- const className = cn(ROW_CLASSES, active && "bg-[var(--surface-2)]");
25
23
  if (href) {
26
24
  return /* @__PURE__ */ jsx(Link, { href, className, onMouseEnter, onClick, children: inner });
27
25
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../components/CommandK/parts.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport Link from 'next/link';\n\nimport { cn } from '../../lib/utils';\nimport { Kbd } from '../ui';\n\nexport function Section({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <div className=\"py-1.5\">\n <div className=\"px-4 py-1.5 text-[10px] font-semibold uppercase tracking-widest text-[var(--muted)]\">{label}</div>\n {children}\n </div>\n );\n}\n\nexport type RowItemProps = {\n icon: React.ReactNode;\n title: string;\n sub?: string;\n badge?: string;\n kbd?: string[];\n mono?: boolean;\n active?: boolean;\n /** When provided, the row renders as a `<Link>` so the browser owns navigation. */\n href?: string;\n onMouseEnter?: () => void;\n onClick?: (e: React.MouseEvent) => void;\n};\n\nconst ROW_CLASSES =\n 'flex w-full cursor-pointer items-center gap-3 border-0 bg-transparent px-4 py-2.5 text-left no-underline';\n\nexport function RowItem({ icon, title, sub, badge, kbd, mono, active, href, onMouseEnter, onClick }: RowItemProps) {\n const inner = (\n <>\n <span className=\"flex-none text-[var(--muted)]\">{icon}</span>\n <div className=\"min-w-0 flex-1\">\n <div className={cn('truncate text-sm font-medium text-[var(--text)]', mono && 'font-mono')}>{title}</div>\n {sub && <div className=\"mt-0.5 truncate font-mono text-xs text-[var(--muted)]\">{sub}</div>}\n </div>\n {badge && (\n <span className=\"rounded-[4px] bg-[var(--surface-2)] px-2 py-0.5 font-mono text-[10px] uppercase tracking-wider text-[var(--muted)]\">\n {badge}\n </span>\n )}\n {kbd && (\n <span className=\"inline-flex gap-1\">\n {kbd.map((k, i) => (\n <Kbd key={i}>{k}</Kbd>\n ))}\n </span>\n )}\n </>\n );\n\n const className = cn(ROW_CLASSES, active && 'bg-[var(--surface-2)]');\n\n if (href) {\n return (\n <Link href={href} className={className} onMouseEnter={onMouseEnter} onClick={onClick}>\n {inner}\n </Link>\n );\n }\n\n return (\n <button type=\"button\" className={className} onMouseEnter={onMouseEnter} onClick={onClick}>\n {inner}\n </button>\n );\n}\n"],"mappings":";;AAUI,SA0BA,UAzBE,KADF;AAPJ,OAAO,UAAU;AAEjB,SAAS,UAAU;AACnB,SAAS,WAAW;AAEb,SAAS,QAAQ,EAAE,OAAO,SAAS,GAAiD;AACzF,SACE,qBAAC,SAAI,WAAU,UACb;AAAA,wBAAC,SAAI,WAAU,uFAAuF,iBAAM;AAAA,IAC3G;AAAA,KACH;AAEJ;AAgBA,MAAM,cACJ;AAEK,SAAS,QAAQ,EAAE,MAAM,OAAO,KAAK,OAAO,KAAK,MAAM,QAAQ,MAAM,cAAc,QAAQ,GAAiB;AACjH,QAAM,QACJ,iCACE;AAAA,wBAAC,UAAK,WAAU,iCAAiC,gBAAK;AAAA,IACtD,qBAAC,SAAI,WAAU,kBACb;AAAA,0BAAC,SAAI,WAAW,GAAG,mDAAmD,QAAQ,WAAW,GAAI,iBAAM;AAAA,MAClG,OAAO,oBAAC,SAAI,WAAU,yDAAyD,eAAI;AAAA,OACtF;AAAA,IACC,SACC,oBAAC,UAAK,WAAU,sHACb,iBACH;AAAA,IAED,OACC,oBAAC,UAAK,WAAU,qBACb,cAAI,IAAI,CAAC,GAAG,MACX,oBAAC,OAAa,eAAJ,CAAM,CACjB,GACH;AAAA,KAEJ;AAGF,QAAM,YAAY,GAAG,aAAa,UAAU,uBAAuB;AAEnE,MAAI,MAAM;AACR,WACE,oBAAC,QAAK,MAAY,WAAsB,cAA4B,SACjE,iBACH;AAAA,EAEJ;AAEA,SACE,oBAAC,YAAO,MAAK,UAAS,WAAsB,cAA4B,SACrE,iBACH;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../components/CommandK/parts.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport Link from 'next/link';\n\nimport { Kbd } from '../ui';\n\nexport function Section({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <div className=\"octo-cmdk__section\">\n <div className=\"octo-cmdk__section-label\">{label}</div>\n {children}\n </div>\n );\n}\n\nexport type RowItemProps = {\n icon: React.ReactNode;\n title: string;\n sub?: string;\n badge?: string;\n kbd?: string[];\n mono?: boolean;\n active?: boolean;\n /** When provided, the row renders as a `<Link>` so the browser owns navigation. */\n href?: string;\n onMouseEnter?: () => void;\n onClick?: (e: React.MouseEvent) => void;\n};\n\nexport function RowItem({ icon, title, sub, badge, kbd, mono, active, href, onMouseEnter, onClick }: RowItemProps) {\n const className = `octo-cmdk__item${active ? ' octo-cmdk__item octo-cmdk__item--active' : ''}`;\n\n const inner = (\n <>\n <span className=\"octo-cmdk__item-icon\">{icon}</span>\n <div className=\"octo-cmdk__item-body\">\n <div className={`octo-cmdk__item-label${mono ? ' octo-cmdk__item-label octo-cmdk__item-label--mono' : ''}`}>\n {title}\n </div>\n {sub && <div className=\"octo-cmdk__item-meta\">{sub}</div>}\n </div>\n {badge && <span className=\"octo-cmdk__item-badge\">{badge}</span>}\n {kbd && (\n <span className=\"octo-cmdk__item-kbd\">\n {kbd.map((k, i) => (\n <Kbd key={i}>{k}</Kbd>\n ))}\n </span>\n )}\n </>\n );\n\n if (href) {\n return (\n <Link href={href} className={className} onMouseEnter={onMouseEnter} onClick={onClick}>\n {inner}\n </Link>\n );\n }\n\n return (\n <button type=\"button\" className={className} onMouseEnter={onMouseEnter} onClick={onClick}>\n {inner}\n </button>\n );\n}\n"],"mappings":";;AASI,SAyBA,UAxBE,KADF;AANJ,OAAO,UAAU;AAEjB,SAAS,WAAW;AAEb,SAAS,QAAQ,EAAE,OAAO,SAAS,GAAiD;AACzF,SACE,qBAAC,SAAI,WAAU,sBACb;AAAA,wBAAC,SAAI,WAAU,4BAA4B,iBAAM;AAAA,IAChD;AAAA,KACH;AAEJ;AAgBO,SAAS,QAAQ,EAAE,MAAM,OAAO,KAAK,OAAO,KAAK,MAAM,QAAQ,MAAM,cAAc,QAAQ,GAAiB;AACjH,QAAM,YAAY,kBAAkB,SAAS,6CAA6C,EAAE;AAE5F,QAAM,QACJ,iCACE;AAAA,wBAAC,UAAK,WAAU,wBAAwB,gBAAK;AAAA,IAC7C,qBAAC,SAAI,WAAU,wBACb;AAAA,0BAAC,SAAI,WAAW,wBAAwB,OAAO,uDAAuD,EAAE,IACrG,iBACH;AAAA,MACC,OAAO,oBAAC,SAAI,WAAU,wBAAwB,eAAI;AAAA,OACrD;AAAA,IACC,SAAS,oBAAC,UAAK,WAAU,yBAAyB,iBAAM;AAAA,IACxD,OACC,oBAAC,UAAK,WAAU,uBACb,cAAI,IAAI,CAAC,GAAG,MACX,oBAAC,OAAa,eAAJ,CAAM,CACjB,GACH;AAAA,KAEJ;AAGF,MAAI,MAAM;AACR,WACE,oBAAC,QAAK,MAAY,WAAsB,cAA4B,SACjE,iBACH;AAAA,EAEJ;AAEA,SACE,oBAAC,YAAO,MAAK,UAAS,WAAsB,cAA4B,SACrE,iBACH;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"ConditionalBranchesEditor.d.ts","sourceRoot":"","sources":["../../../components/ContentModel/ConditionalBranchesEditor.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAQ5E,UAAU,KAAK;IACb,QAAQ,EAAE,uBAAuB,EAAE,CAAC;IACpC,QAAQ,EAAE,CAAC,IAAI,EAAE,uBAAuB,EAAE,KAAK,IAAI,CAAC;IACpD,iEAAiE;IACjE,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC;+CAC2C;IAC3C,iBAAiB,EAAE,CACjB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,EAAE,eAAe,GAAG,IAAI,EAC/B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,KAAK,IAAI,KAChD,IAAI,CAAC;IACV,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAAC,EAChD,QAAQ,EACR,QAAQ,EACR,oBAAoB,EACpB,iBAAiB,EACjB,QAAQ,GACT,EAAE,KAAK,2CA0LP;AAsGD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD"}
1
+ {"version":3,"file":"ConditionalBranchesEditor.d.ts","sourceRoot":"","sources":["../../../components/ContentModel/ConditionalBranchesEditor.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAK5E,UAAU,KAAK;IACb,QAAQ,EAAE,uBAAuB,EAAE,CAAC;IACpC,QAAQ,EAAE,CAAC,IAAI,EAAE,uBAAuB,EAAE,KAAK,IAAI,CAAC;IACpD,iEAAiE;IACjE,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC;+CAC2C;IAC3C,iBAAiB,EAAE,CACjB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,EAAE,eAAe,GAAG,IAAI,EAC/B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,KAAK,IAAI,KAChD,IAAI,CAAC;IACV,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAAC,EAChD,QAAQ,EACR,QAAQ,EACR,oBAAoB,EACpB,iBAAiB,EACjB,QAAQ,GACT,EAAE,KAAK,2CA6LP;AAiGD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD"}