@flamingo-stack/openframe-frontend-core 0.0.710 → 0.0.712

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 (534) hide show
  1. package/dist/chunk-2NASBO7O.js +1137 -0
  2. package/dist/{chunk-RQRX4YC3.cjs → chunk-2RKFMUNW.cjs} +46 -46
  3. package/dist/chunk-2Y7QZAB2.cjs +158 -0
  4. package/dist/chunk-34I6XI3N.js +136 -0
  5. package/dist/chunk-3K5ZLZE7.js +292 -0
  6. package/dist/chunk-3LU4UFPS.cjs +14 -0
  7. package/dist/{chunk-YBUT4AMG.cjs → chunk-3RKBJT6K.cjs} +8 -6
  8. package/dist/{chunk-LNW45N2C.js → chunk-3SEEGNRE.js} +35 -27
  9. package/dist/{chunk-L6Y6OOKG.cjs → chunk-3UAJLO5U.cjs} +41 -39
  10. package/dist/chunk-4HJRHEXD.cjs +1612 -0
  11. package/dist/{chunk-JPG7OHEG.js → chunk-4QFWGLZO.js} +1 -1
  12. package/dist/chunk-4R2L3DSA.js +14 -0
  13. package/dist/{chunk-36BCTE7D.js → chunk-4UYKNOZG.js} +12 -10
  14. package/dist/{chunk-DA5UDTLG.js → chunk-5SDELRH3.js} +5 -5
  15. package/dist/{chunk-CZSZSDD4.js → chunk-5Y72YQEK.js} +22 -113
  16. package/dist/{chunk-KUC673HM.js → chunk-6T3BTD6Q.js} +204 -982
  17. package/dist/{chunk-F57ECE2I.js → chunk-6YPTUHM7.js} +4 -4
  18. package/dist/{chunk-TDYIREDJ.js → chunk-7HNYYNKE.js} +28 -22
  19. package/dist/{chunk-2G7UYK35.cjs → chunk-7NSU5EQD.cjs} +57 -148
  20. package/dist/chunk-AAYNCJMW.cjs +48 -0
  21. package/dist/{chunk-FXJ3WWUB.js → chunk-ADBE7QF3.js} +5 -252
  22. package/dist/chunk-AECTRMGQ.cjs +334 -0
  23. package/dist/chunk-AGVXKD4K.js +334 -0
  24. package/dist/chunk-AL2GUHAJ.cjs +18 -0
  25. package/dist/{chunk-WMX26HB5.js → chunk-APJZBDQN.js} +12 -12
  26. package/dist/chunk-AUMKE74M.cjs +16 -0
  27. package/dist/chunk-B4NCVYEQ.cjs +292 -0
  28. package/dist/{chunk-2RNB5DTN.cjs → chunk-BXSRTBLU.cjs} +82 -54
  29. package/dist/chunk-CMGFZHCN.js +233 -0
  30. package/dist/chunk-CMZ3QTFQ.js +1207 -0
  31. package/dist/chunk-CPA2CKRZ.cjs +125 -0
  32. package/dist/{chunk-B73373AG.cjs → chunk-CSCJU6YC.cjs} +35 -33
  33. package/dist/chunk-CYUUHFXL.js +41 -0
  34. package/dist/chunk-DC4RTYWK.cjs +1122 -0
  35. package/dist/{chunk-6YKAT7NV.js → chunk-DDWFCWOE.js} +5 -7
  36. package/dist/{chunk-F5FF4DME.js → chunk-EFNKS5W4.js} +322 -428
  37. package/dist/{chunk-2KXTOP6G.cjs → chunk-EOKSKJSS.cjs} +25 -83
  38. package/dist/{chunk-6NTPY5QA.cjs → chunk-ETYLOZOB.cjs} +978 -2413
  39. package/dist/chunk-F5BPGWGT.cjs +931 -0
  40. package/dist/{chunk-4L6XCMOU.js → chunk-FCAVAEHF.js} +8277 -9990
  41. package/dist/chunk-FFT56TYB.cjs +401 -0
  42. package/dist/chunk-FYEJTF5Y.js +125 -0
  43. package/dist/chunk-G3GRYDMS.js +16 -0
  44. package/dist/{chunk-MR3A4MZV.js → chunk-G3OMVCID.js} +13 -7
  45. package/dist/chunk-G6OHIX5C.cjs +100 -0
  46. package/dist/{chunk-UDFRUKLC.cjs → chunk-GEDY7HQI.cjs} +2 -2
  47. package/dist/chunk-GQ7JJUIT.cjs +1207 -0
  48. package/dist/chunk-H3PKYE4N.js +18 -0
  49. package/dist/{chunk-CNWOMQQJ.js → chunk-H5R7U2D2.js} +206 -5
  50. package/dist/{chunk-SEXWHIMS.cjs → chunk-HETQETPV.cjs} +9648 -9680
  51. package/dist/{chunk-Y2GSOUCS.cjs → chunk-HWVUR735.cjs} +2 -2
  52. package/dist/chunk-II4QMH26.cjs +35 -0
  53. package/dist/chunk-ILNN6QRW.js +1612 -0
  54. package/dist/chunk-IYVFSLWJ.js +931 -0
  55. package/dist/{chunk-3AHTOSXJ.cjs → chunk-JGCFRTND.cjs} +23 -17
  56. package/dist/chunk-JHQ334WS.js +655 -0
  57. package/dist/{chunk-WCVZCGK5.cjs → chunk-JO5TLJPM.cjs} +129 -907
  58. package/dist/{chunk-JRU2CXLB.cjs → chunk-JVCAK4W3.cjs} +210 -9
  59. package/dist/chunk-KBJJQFYU.js +1122 -0
  60. package/dist/chunk-KEKCQENI.js +48 -0
  61. package/dist/chunk-KHXZFLIN.cjs +41 -0
  62. package/dist/chunk-KT3U3ZRP.cjs +1137 -0
  63. package/dist/chunk-L2VUINHN.js +35 -0
  64. package/dist/{chunk-P42V6N34.cjs → chunk-L6ZQGWCX.cjs} +4521 -6234
  65. package/dist/{chunk-PLYEKV3N.cjs → chunk-MA4Q5RBP.cjs} +6 -6
  66. package/dist/{chunk-SS5MBHDP.js → chunk-N67XG5GY.js} +10 -8
  67. package/dist/chunk-NPAQSMRY.js +2087 -0
  68. package/dist/{chunk-I3ST4PLM.js → chunk-NQWJAOHO.js} +6 -4
  69. package/dist/{chunk-QAOFMK2A.cjs → chunk-OBZJICEA.cjs} +8 -8
  70. package/dist/{chunk-6IW7TWPV.js → chunk-OPYODNV2.js} +3 -3
  71. package/dist/chunk-P3JMAMHP.js +401 -0
  72. package/dist/chunk-PPXR22YC.cjs +2087 -0
  73. package/dist/chunk-PSVSEN4J.cjs +655 -0
  74. package/dist/{chunk-4UM2ETLM.js → chunk-RBYVFPER.js} +74 -46
  75. package/dist/{chunk-PO33GZVY.js → chunk-ROBQ5TR7.js} +10549 -10581
  76. package/dist/{chunk-ZCLBYT2V.cjs → chunk-T3CLXR43.cjs} +114 -220
  77. package/dist/{chunk-FI6GMDO7.js → chunk-TTVOLEUS.js} +3605 -5040
  78. package/dist/{chunk-LM7TXMLU.cjs → chunk-ULWVKHSI.cjs} +8 -255
  79. package/dist/{chunk-6I4ZAFO2.cjs → chunk-UT3ODMBU.cjs} +15 -15
  80. package/dist/chunk-WANCBTUE.js +71 -0
  81. package/dist/{chunk-BIZNSF3U.cjs → chunk-WBNAEYTQ.cjs} +2 -51
  82. package/dist/chunk-WFPCCBOM.cjs +71 -0
  83. package/dist/chunk-WI6FHKD7.js +158 -0
  84. package/dist/chunk-WMNCVLES.js +100 -0
  85. package/dist/{chunk-UT4YHQZW.js → chunk-WSDT7LYL.js} +0 -49
  86. package/dist/chunk-WVOTC7HW.cjs +136 -0
  87. package/dist/{chunk-AOWDNSTM.cjs → chunk-WWJG4GVG.cjs} +93 -87
  88. package/dist/chunk-XXBLN4BP.cjs +233 -0
  89. package/dist/{chunk-4IBPRIQH.js → chunk-YBQQNDC7.js} +1 -1
  90. package/dist/{chunk-LFFB6EMB.js → chunk-YBS5QGON.js} +70 -128
  91. package/dist/{chunk-NSGXARGJ.cjs → chunk-Z5SWJW5Q.cjs} +125 -117
  92. package/dist/{chunk-OJLR5MEO.cjs → chunk-ZX7SCPLO.cjs} +6 -8
  93. package/dist/cloud-tenants-KZUZGD4A.cjs +117 -0
  94. package/dist/cloud-tenants-OGLVVQ7X.js +117 -0
  95. package/dist/components/case-studies/index.cjs +45 -29
  96. package/dist/components/case-studies/index.js +32 -16
  97. package/dist/components/chat/ask-prompts.d.ts +64 -0
  98. package/dist/components/chat/ask-prompts.d.ts.map +1 -0
  99. package/dist/components/chat/entity-cards/case-study-card.d.ts +6 -3
  100. package/dist/components/chat/entity-cards/case-study-card.d.ts.map +1 -1
  101. package/dist/components/chat/hooks/use-chat-dialog-manager.d.ts +4 -1
  102. package/dist/components/chat/hooks/use-chat-dialog-manager.d.ts.map +1 -1
  103. package/dist/components/chat/hooks/use-unified-chat.d.ts.map +1 -1
  104. package/dist/components/chat/index.cjs +27 -8
  105. package/dist/components/chat/index.d.ts +1 -0
  106. package/dist/components/chat/index.d.ts.map +1 -1
  107. package/dist/components/chat/index.js +57 -38
  108. package/dist/components/chat/quick-action-chip.d.ts +7 -3
  109. package/dist/components/chat/quick-action-chip.d.ts.map +1 -1
  110. package/dist/components/chat/types/component.types.d.ts +4 -0
  111. package/dist/components/chat/types/component.types.d.ts.map +1 -1
  112. package/dist/components/chat/types/unified-chat-state.types.d.ts +12 -0
  113. package/dist/components/chat/types/unified-chat-state.types.d.ts.map +1 -1
  114. package/dist/components/contact/index.cjs +29 -13
  115. package/dist/components/contact/index.js +28 -12
  116. package/dist/components/docs/index.cjs +33 -16
  117. package/dist/components/docs/index.js +33 -16
  118. package/dist/components/docs/use-scroll-spy.d.ts +23 -1
  119. package/dist/components/docs/use-scroll-spy.d.ts.map +1 -1
  120. package/dist/components/embeds/index.cjs +29 -13
  121. package/dist/components/embeds/index.js +28 -12
  122. package/dist/components/faq/faq-section.d.ts +8 -1
  123. package/dist/components/faq/faq-section.d.ts.map +1 -1
  124. package/dist/components/faq/index.cjs +30 -14
  125. package/dist/components/faq/index.js +29 -13
  126. package/dist/components/features/array-entry-manager.d.ts +5 -1
  127. package/dist/components/features/array-entry-manager.d.ts.map +1 -1
  128. package/dist/components/features/board/board.d.ts +2 -0
  129. package/dist/components/features/board/board.d.ts.map +1 -1
  130. package/dist/components/features/board/ticket-card.d.ts.map +1 -1
  131. package/dist/components/features/board/touch-board.d.ts +1 -1
  132. package/dist/components/features/board/touch-board.d.ts.map +1 -1
  133. package/dist/components/features/board/types.d.ts +3 -0
  134. package/dist/components/features/board/types.d.ts.map +1 -1
  135. package/dist/components/features/board/use-board-collapse.d.ts +6 -1
  136. package/dist/components/features/board/use-board-collapse.d.ts.map +1 -1
  137. package/dist/components/features/capability-explorer.d.ts +94 -0
  138. package/dist/components/features/capability-explorer.d.ts.map +1 -0
  139. package/dist/components/features/cloud-tenants/index.d.ts +14 -0
  140. package/dist/components/features/cloud-tenants/index.d.ts.map +1 -0
  141. package/dist/components/features/cloud-tenants/tenant-access-cell.d.ts +9 -0
  142. package/dist/components/features/cloud-tenants/tenant-access-cell.d.ts.map +1 -0
  143. package/dist/components/features/cloud-tenants/tenant-cell.d.ts +8 -0
  144. package/dist/components/features/cloud-tenants/tenant-cell.d.ts.map +1 -0
  145. package/dist/components/features/cloud-tenants/tenant-customer-cell.d.ts +9 -0
  146. package/dist/components/features/cloud-tenants/tenant-customer-cell.d.ts.map +1 -0
  147. package/dist/components/features/cloud-tenants/tenant-presentation.d.ts +42 -0
  148. package/dist/components/features/cloud-tenants/tenant-presentation.d.ts.map +1 -0
  149. package/dist/components/features/cloud-tenants/tenant-row.d.ts +22 -0
  150. package/dist/components/features/cloud-tenants/tenant-row.d.ts.map +1 -0
  151. package/dist/components/features/cloud-tenants/tenants-table-columns.d.ts +42 -0
  152. package/dist/components/features/cloud-tenants/tenants-table-columns.d.ts.map +1 -0
  153. package/dist/components/features/cloud-tenants/tenants-table-view.d.ts +26 -0
  154. package/dist/components/features/cloud-tenants/tenants-table-view.d.ts.map +1 -0
  155. package/dist/components/features/devices/device-last-online.d.ts +3 -0
  156. package/dist/components/features/devices/device-last-online.d.ts.map +1 -0
  157. package/dist/components/features/devices/device-name.d.ts +42 -0
  158. package/dist/components/features/devices/device-name.d.ts.map +1 -0
  159. package/dist/components/features/devices/device-selector/device-selection-mode-radio.d.ts +26 -0
  160. package/dist/components/features/devices/device-selector/device-selection-mode-radio.d.ts.map +1 -0
  161. package/dist/components/features/devices/device-selector/device-selector-skeleton.d.ts +25 -0
  162. package/dist/components/features/devices/device-selector/device-selector-skeleton.d.ts.map +1 -0
  163. package/dist/components/features/devices/device-selector/device-selector.d.ts +38 -0
  164. package/dist/components/features/devices/device-selector/device-selector.d.ts.map +1 -0
  165. package/dist/components/features/devices/device-selector/device-selector.types.d.ts +133 -0
  166. package/dist/components/features/devices/device-selector/device-selector.types.d.ts.map +1 -0
  167. package/dist/components/features/devices/device-selector/narrowing.d.ts +13 -0
  168. package/dist/components/features/devices/device-selector/narrowing.d.ts.map +1 -0
  169. package/dist/components/features/devices/device-selector/use-device-selector.d.ts +17 -0
  170. package/dist/components/features/devices/device-selector/use-device-selector.d.ts.map +1 -0
  171. package/dist/components/features/devices/device-status.d.ts +23 -0
  172. package/dist/components/features/devices/device-status.d.ts.map +1 -0
  173. package/dist/components/features/devices/device-statuses.d.ts +40 -0
  174. package/dist/components/features/devices/device-statuses.d.ts.map +1 -0
  175. package/dist/components/features/devices/device-tags-filter-button.d.ts +22 -0
  176. package/dist/components/features/devices/device-tags-filter-button.d.ts.map +1 -0
  177. package/dist/components/features/devices/device-type-icon.d.ts +11 -0
  178. package/dist/components/features/devices/device-type-icon.d.ts.map +1 -0
  179. package/dist/components/features/devices/device-type-tile.d.ts +9 -0
  180. package/dist/components/features/devices/device-type-tile.d.ts.map +1 -0
  181. package/dist/components/features/devices/devices-filter-toolbar.d.ts +46 -0
  182. package/dist/components/features/devices/devices-filter-toolbar.d.ts.map +1 -0
  183. package/dist/components/features/devices/devices-grid-filters.d.ts +25 -0
  184. package/dist/components/features/devices/devices-grid-filters.d.ts.map +1 -0
  185. package/dist/components/features/devices/devices-grid.d.ts +12 -0
  186. package/dist/components/features/devices/devices-grid.d.ts.map +1 -0
  187. package/dist/components/features/devices/devices-list.d.ts +131 -0
  188. package/dist/components/features/devices/devices-list.d.ts.map +1 -0
  189. package/dist/components/features/devices/devices-panel-header.d.ts +46 -0
  190. package/dist/components/features/devices/devices-panel-header.d.ts.map +1 -0
  191. package/dist/components/features/devices/devices-panel-view.d.ts +79 -0
  192. package/dist/components/features/devices/devices-panel-view.d.ts.map +1 -0
  193. package/dist/components/features/devices/devices-table-columns.d.ts +76 -0
  194. package/dist/components/features/devices/devices-table-columns.d.ts.map +1 -0
  195. package/dist/components/features/devices/devices-view-config.d.ts +25 -0
  196. package/dist/components/features/devices/devices-view-config.d.ts.map +1 -0
  197. package/dist/components/features/devices/index.d.ts +24 -0
  198. package/dist/components/features/devices/index.d.ts.map +1 -0
  199. package/dist/components/features/devices/types.d.ts +68 -0
  200. package/dist/components/features/devices/types.d.ts.map +1 -0
  201. package/dist/components/features/devices/use-tag-filter-modal.d.ts +50 -0
  202. package/dist/components/features/devices/use-tag-filter-modal.d.ts.map +1 -0
  203. package/dist/components/features/index.cjs +227 -12
  204. package/dist/components/features/index.d.ts +7 -0
  205. package/dist/components/features/index.d.ts.map +1 -1
  206. package/dist/components/features/index.js +266 -51
  207. package/dist/components/features/knowledge-base/index.d.ts +7 -0
  208. package/dist/components/features/knowledge-base/index.d.ts.map +1 -0
  209. package/dist/components/features/knowledge-base/knowledge-base-article-view.d.ts +44 -0
  210. package/dist/components/features/knowledge-base/knowledge-base-article-view.d.ts.map +1 -0
  211. package/dist/components/features/knowledge-base/knowledge-base-item-icon.d.ts +13 -0
  212. package/dist/components/features/knowledge-base/knowledge-base-item-icon.d.ts.map +1 -0
  213. package/dist/components/features/knowledge-base/knowledge-base-status.d.ts +8 -0
  214. package/dist/components/features/knowledge-base/knowledge-base-status.d.ts.map +1 -0
  215. package/dist/components/features/knowledge-base/knowledge-base-table.d.ts +52 -0
  216. package/dist/components/features/knowledge-base/knowledge-base-table.d.ts.map +1 -0
  217. package/dist/components/features/logs/index.d.ts +12 -0
  218. package/dist/components/features/logs/index.d.ts.map +1 -0
  219. package/dist/components/features/logs/log-drawer.d.ts +29 -0
  220. package/dist/components/features/logs/log-drawer.d.ts.map +1 -0
  221. package/dist/components/features/logs/log-source-labels.d.ts +11 -0
  222. package/dist/components/features/logs/log-source-labels.d.ts.map +1 -0
  223. package/dist/components/features/logs/logs-page-view.d.ts +32 -0
  224. package/dist/components/features/logs/logs-page-view.d.ts.map +1 -0
  225. package/dist/components/features/logs/logs-table-columns.d.ts +15 -0
  226. package/dist/components/features/logs/logs-table-columns.d.ts.map +1 -0
  227. package/dist/components/features/logs/logs-table-view.d.ts +64 -0
  228. package/dist/components/features/logs/logs-table-view.d.ts.map +1 -0
  229. package/dist/components/features/logs/types.d.ts +52 -0
  230. package/dist/components/features/logs/types.d.ts.map +1 -0
  231. package/dist/components/features/policies/compute-policy-summary.d.ts +37 -0
  232. package/dist/components/features/policies/compute-policy-summary.d.ts.map +1 -0
  233. package/dist/components/features/policies/index.d.ts +8 -0
  234. package/dist/components/features/policies/index.d.ts.map +1 -0
  235. package/dist/components/features/policies/policies-table.d.ts +34 -0
  236. package/dist/components/features/policies/policies-table.d.ts.map +1 -0
  237. package/dist/components/features/policies/policy-summary-cards.d.ts +17 -0
  238. package/dist/components/features/policies/policy-summary-cards.d.ts.map +1 -0
  239. package/dist/components/features/policies/policy-table-row.d.ts +37 -0
  240. package/dist/components/features/policies/policy-table-row.d.ts.map +1 -0
  241. package/dist/components/features/remote-session/index.d.ts +8 -0
  242. package/dist/components/features/remote-session/index.d.ts.map +1 -1
  243. package/dist/components/features/remote-session/remote-desktop-chat-message-row.d.ts +21 -0
  244. package/dist/components/features/remote-session/remote-desktop-chat-message-row.d.ts.map +1 -0
  245. package/dist/components/features/remote-session/remote-desktop-chat-panel.d.ts +31 -0
  246. package/dist/components/features/remote-session/remote-desktop-chat-panel.d.ts.map +1 -0
  247. package/dist/components/features/remote-session/remote-desktop-fullscreen-toolbar.d.ts +21 -0
  248. package/dist/components/features/remote-session/remote-desktop-fullscreen-toolbar.d.ts.map +1 -0
  249. package/dist/components/features/remote-session/remote-desktop-view.d.ts +50 -0
  250. package/dist/components/features/remote-session/remote-desktop-view.d.ts.map +1 -0
  251. package/dist/components/features/software/index.d.ts +8 -0
  252. package/dist/components/features/software/index.d.ts.map +1 -0
  253. package/dist/components/features/software/package-managers.d.ts +30 -0
  254. package/dist/components/features/software/package-managers.d.ts.map +1 -0
  255. package/dist/components/features/software/package-search-field-placeholder.d.ts +7 -0
  256. package/dist/components/features/software/package-search-field-placeholder.d.ts.map +1 -0
  257. package/dist/components/features/software/schedule-fields.d.ts +34 -0
  258. package/dist/components/features/software/schedule-fields.d.ts.map +1 -0
  259. package/dist/components/features/software/software-action-copy.d.ts +25 -0
  260. package/dist/components/features/software/software-action-copy.d.ts.map +1 -0
  261. package/dist/components/features/software/software-action-form.d.ts +71 -0
  262. package/dist/components/features/software/software-action-form.d.ts.map +1 -0
  263. package/dist/components/features/software/software-row-fields.d.ts +23 -0
  264. package/dist/components/features/software/software-row-fields.d.ts.map +1 -0
  265. package/dist/components/features/software/software-row.d.ts +18 -0
  266. package/dist/components/features/software/software-row.d.ts.map +1 -0
  267. package/dist/components/features/sortable-list/index.d.ts +1 -0
  268. package/dist/components/features/sortable-list/index.d.ts.map +1 -1
  269. package/dist/components/features/sortable-list/sortable-drag-handle.d.ts +21 -0
  270. package/dist/components/features/sortable-list/sortable-drag-handle.d.ts.map +1 -0
  271. package/dist/components/help-center-pages/index.cjs +133 -114
  272. package/dist/components/help-center-pages/index.js +58 -39
  273. package/dist/components/index.cjs +320 -82
  274. package/dist/components/index.js +451 -213
  275. package/dist/components/layout/page-heading.d.ts +12 -3
  276. package/dist/components/layout/page-heading.d.ts.map +1 -1
  277. package/dist/components/meeting-scheduler/index.cjs +120 -98
  278. package/dist/components/meeting-scheduler/index.js +50 -28
  279. package/dist/components/navigation/index.cjs +36 -17
  280. package/dist/components/navigation/index.d.ts +3 -0
  281. package/dist/components/navigation/index.d.ts.map +1 -1
  282. package/dist/components/navigation/index.js +36 -17
  283. package/dist/components/navigation/mingo-ai-button.d.ts +23 -10
  284. package/dist/components/navigation/mingo-ai-button.d.ts.map +1 -1
  285. package/dist/components/navigation/sticky-section-nav.d.ts +14 -1
  286. package/dist/components/navigation/sticky-section-nav.d.ts.map +1 -1
  287. package/dist/components/onboarding-guides/index.cjs +32 -16
  288. package/dist/components/onboarding-guides/index.js +31 -15
  289. package/dist/components/product-demo/cast.d.ts +58 -0
  290. package/dist/components/product-demo/cast.d.ts.map +1 -0
  291. package/dist/components/product-demo/fixtures/cloud-tenants.d.ts +10 -0
  292. package/dist/components/product-demo/fixtures/cloud-tenants.d.ts.map +1 -0
  293. package/dist/components/product-demo/fixtures/devices.d.ts +14 -0
  294. package/dist/components/product-demo/fixtures/devices.d.ts.map +1 -0
  295. package/dist/components/product-demo/fixtures/knowledge.d.ts +14 -0
  296. package/dist/components/product-demo/fixtures/knowledge.d.ts.map +1 -0
  297. package/dist/components/product-demo/fixtures/logs.d.ts +15 -0
  298. package/dist/components/product-demo/fixtures/logs.d.ts.map +1 -0
  299. package/dist/components/product-demo/fixtures/policies.d.ts +13 -0
  300. package/dist/components/product-demo/fixtures/policies.d.ts.map +1 -0
  301. package/dist/components/product-demo/fixtures/remote-session.d.ts +20 -0
  302. package/dist/components/product-demo/fixtures/remote-session.d.ts.map +1 -0
  303. package/dist/components/product-demo/fixtures/shared.d.ts +156 -0
  304. package/dist/components/product-demo/fixtures/shared.d.ts.map +1 -0
  305. package/dist/components/product-demo/fixtures/software-update.d.ts +19 -0
  306. package/dist/components/product-demo/fixtures/software-update.d.ts.map +1 -0
  307. package/dist/components/product-demo/fixtures/tickets-board.d.ts +8 -0
  308. package/dist/components/product-demo/fixtures/tickets-board.d.ts.map +1 -0
  309. package/dist/components/product-demo/index.cjs +112 -0
  310. package/dist/components/product-demo/index.d.ts +6 -0
  311. package/dist/components/product-demo/index.d.ts.map +1 -0
  312. package/dist/components/product-demo/index.js +112 -0
  313. package/dist/components/product-demo/product-screen.d.ts +22 -0
  314. package/dist/components/product-demo/product-screen.d.ts.map +1 -0
  315. package/dist/components/product-demo/registry.d.ts +13 -0
  316. package/dist/components/product-demo/registry.d.ts.map +1 -0
  317. package/dist/components/product-demo/screen-keys.cjs +25 -0
  318. package/dist/components/product-demo/screen-keys.d.ts +27 -0
  319. package/dist/components/product-demo/screen-keys.d.ts.map +1 -0
  320. package/dist/components/product-demo/screen-keys.js +20 -0
  321. package/dist/components/product-demo/screens/cloud-tenants.d.ts +8 -0
  322. package/dist/components/product-demo/screens/cloud-tenants.d.ts.map +1 -0
  323. package/dist/components/product-demo/screens/devices.d.ts +10 -0
  324. package/dist/components/product-demo/screens/devices.d.ts.map +1 -0
  325. package/dist/components/product-demo/screens/knowledge.d.ts +9 -0
  326. package/dist/components/product-demo/screens/knowledge.d.ts.map +1 -0
  327. package/dist/components/product-demo/screens/logs.d.ts +4 -0
  328. package/dist/components/product-demo/screens/logs.d.ts.map +1 -0
  329. package/dist/components/product-demo/screens/policies.d.ts +8 -0
  330. package/dist/components/product-demo/screens/policies.d.ts.map +1 -0
  331. package/dist/components/product-demo/screens/remote-desktop-picture.d.ts +11 -0
  332. package/dist/components/product-demo/screens/remote-desktop-picture.d.ts.map +1 -0
  333. package/dist/components/product-demo/screens/remote-session.d.ts +8 -0
  334. package/dist/components/product-demo/screens/remote-session.d.ts.map +1 -0
  335. package/dist/components/product-demo/screens/software-update.d.ts +12 -0
  336. package/dist/components/product-demo/screens/software-update.d.ts.map +1 -0
  337. package/dist/components/product-demo/screens/tickets-board.d.ts +4 -0
  338. package/dist/components/product-demo/screens/tickets-board.d.ts.map +1 -0
  339. package/dist/components/product-demo/types.d.ts +9 -0
  340. package/dist/components/product-demo/types.d.ts.map +1 -0
  341. package/dist/components/related-content/index.cjs +14 -8
  342. package/dist/components/related-content/index.js +13 -7
  343. package/dist/components/tickets/index.cjs +36 -20
  344. package/dist/components/tickets/index.js +35 -19
  345. package/dist/components/ui/file-manager/index.cjs +38 -34
  346. package/dist/components/ui/file-manager/index.js +8 -4
  347. package/dist/components/ui/index.cjs +57 -17
  348. package/dist/components/ui/index.d.ts +1 -0
  349. package/dist/components/ui/index.d.ts.map +1 -1
  350. package/dist/components/ui/index.js +141 -101
  351. package/dist/components/ui/product-screen-frame.d.ts +45 -0
  352. package/dist/components/ui/product-screen-frame.d.ts.map +1 -0
  353. package/dist/components/ui/radio-group.d.ts +5 -0
  354. package/dist/components/ui/radio-group.d.ts.map +1 -1
  355. package/dist/components/ui/snap-carousel.d.ts +11 -1
  356. package/dist/components/ui/snap-carousel.d.ts.map +1 -1
  357. package/dist/components/ui/tag.d.ts +1 -1
  358. package/dist/components/ui/tag.d.ts.map +1 -1
  359. package/dist/devices-LBMG42K6.js +81 -0
  360. package/dist/devices-YGYJIXQY.cjs +81 -0
  361. package/dist/hooks/index.cjs +17 -8
  362. package/dist/hooks/index.js +32 -23
  363. package/dist/hooks/ui/index.d.ts +1 -0
  364. package/dist/hooks/ui/index.d.ts.map +1 -1
  365. package/dist/hooks/ui/use-header-height.d.ts +12 -0
  366. package/dist/hooks/ui/use-header-height.d.ts.map +1 -1
  367. package/dist/hooks/ui/use-sticky-toolbar.d.ts +29 -0
  368. package/dist/hooks/ui/use-sticky-toolbar.d.ts.map +1 -0
  369. package/dist/hooks/use-location-hash.d.ts +2 -2
  370. package/dist/hooks/use-location-hash.d.ts.map +1 -1
  371. package/dist/hooks/use-scroll-to-hash.d.ts +7 -0
  372. package/dist/hooks/use-scroll-to-hash.d.ts.map +1 -1
  373. package/dist/index.cjs +276 -25
  374. package/dist/index.js +729 -478
  375. package/dist/knowledge-H5BIWJVI.js +108 -0
  376. package/dist/knowledge-KTCVJIWN.cjs +108 -0
  377. package/dist/logs-DB5Z7M5Q.js +216 -0
  378. package/dist/logs-RVCC2UQW.cjs +216 -0
  379. package/dist/policies-EWUULFBR.js +121 -0
  380. package/dist/policies-HV4IQCBV.cjs +121 -0
  381. package/dist/remote-session-GSGZOFDX.js +196 -0
  382. package/dist/remote-session-R6VAFESR.cjs +196 -0
  383. package/dist/software-update-6PXKRKBT.js +179 -0
  384. package/dist/software-update-D4OVSWSG.cjs +179 -0
  385. package/dist/tickets-board-BHLPAVNJ.cjs +137 -0
  386. package/dist/tickets-board-PYDNELSK.js +137 -0
  387. package/dist/types/case-study.d.ts +15 -1
  388. package/dist/types/case-study.d.ts.map +1 -1
  389. package/dist/utils/date-utils.d.ts +5 -0
  390. package/dist/utils/date-utils.d.ts.map +1 -1
  391. package/dist/utils/index.cjs +45 -2
  392. package/dist/utils/index.d.ts +2 -1
  393. package/dist/utils/index.d.ts.map +1 -1
  394. package/dist/utils/index.js +41 -3
  395. package/dist/utils/open-in-new-tab.d.ts +7 -0
  396. package/dist/utils/open-in-new-tab.d.ts.map +1 -0
  397. package/dist/utils/same-page-hash-nav.d.ts +31 -0
  398. package/dist/utils/same-page-hash-nav.d.ts.map +1 -1
  399. package/dist/utils/scroll-into-view.d.ts +14 -1
  400. package/dist/utils/scroll-into-view.d.ts.map +1 -1
  401. package/package.json +13 -1
  402. package/src/components/chat/ask-prompts.tsx +226 -0
  403. package/src/components/chat/embeddable-chat.tsx +38 -2
  404. package/src/components/chat/entity-cards/case-study-card.tsx +122 -46
  405. package/src/components/chat/hooks/use-chat-dialog-manager.ts +22 -4
  406. package/src/components/chat/hooks/use-unified-chat.ts +1 -0
  407. package/src/components/chat/index.ts +1 -0
  408. package/src/components/chat/quick-action-chip.tsx +33 -9
  409. package/src/components/chat/types/component.types.ts +4 -0
  410. package/src/components/chat/types/unified-chat-state.types.ts +13 -0
  411. package/src/components/docs/use-scroll-spy.ts +93 -18
  412. package/src/components/faq/faq-section.tsx +82 -43
  413. package/src/components/features/array-entry-manager.tsx +10 -1
  414. package/src/components/features/board/board.tsx +4 -1
  415. package/src/components/features/board/ticket-card.tsx +11 -1
  416. package/src/components/features/board/touch-board.tsx +2 -1
  417. package/src/components/features/board/types.ts +3 -0
  418. package/src/components/features/board/use-board-collapse.ts +7 -2
  419. package/src/components/features/capability-explorer.tsx +412 -0
  420. package/src/components/features/cloud-tenants/index.ts +28 -0
  421. package/src/components/features/cloud-tenants/tenant-access-cell.tsx +24 -0
  422. package/src/components/features/cloud-tenants/tenant-cell.tsx +26 -0
  423. package/src/components/features/cloud-tenants/tenant-customer-cell.tsx +27 -0
  424. package/src/components/features/cloud-tenants/tenant-presentation.ts +111 -0
  425. package/src/components/features/cloud-tenants/tenant-row.ts +21 -0
  426. package/src/components/features/cloud-tenants/tenants-table-columns.ts +30 -0
  427. package/src/components/features/cloud-tenants/tenants-table-view.tsx +142 -0
  428. package/src/components/features/devices/device-last-online.ts +6 -0
  429. package/src/components/features/devices/device-name.ts +51 -0
  430. package/src/components/features/devices/device-selector/device-selection-mode-radio.tsx +107 -0
  431. package/src/components/features/devices/device-selector/device-selector-skeleton.tsx +32 -0
  432. package/src/components/features/devices/device-selector/device-selector.tsx +799 -0
  433. package/src/components/features/devices/device-selector/device-selector.types.ts +138 -0
  434. package/src/components/features/devices/device-selector/narrowing.ts +33 -0
  435. package/src/components/features/devices/device-selector/use-device-selector.ts +51 -0
  436. package/src/components/features/devices/device-status.ts +102 -0
  437. package/src/components/features/devices/device-statuses.ts +88 -0
  438. package/src/components/features/devices/device-tags-filter-button.tsx +49 -0
  439. package/src/components/features/devices/device-type-icon.tsx +29 -0
  440. package/src/components/features/devices/device-type-tile.tsx +17 -0
  441. package/src/components/features/devices/devices-filter-toolbar.tsx +114 -0
  442. package/src/components/features/devices/devices-grid-filters.tsx +99 -0
  443. package/src/components/features/devices/devices-grid.tsx +86 -0
  444. package/src/components/features/devices/devices-list.tsx +357 -0
  445. package/src/components/features/devices/devices-panel-header.tsx +97 -0
  446. package/src/components/features/devices/devices-panel-view.tsx +261 -0
  447. package/src/components/features/devices/devices-table-columns.tsx +356 -0
  448. package/src/components/features/devices/devices-view-config.tsx +38 -0
  449. package/src/components/features/devices/index.ts +89 -0
  450. package/src/components/features/devices/types.ts +74 -0
  451. package/src/components/features/devices/use-tag-filter-modal.ts +109 -0
  452. package/src/components/features/index.ts +9 -0
  453. package/src/components/features/knowledge-base/index.ts +19 -0
  454. package/src/components/features/knowledge-base/knowledge-base-article-view.tsx +134 -0
  455. package/src/components/features/knowledge-base/knowledge-base-item-icon.ts +14 -0
  456. package/src/components/features/knowledge-base/knowledge-base-status.ts +12 -0
  457. package/src/components/features/knowledge-base/knowledge-base-table.tsx +180 -0
  458. package/src/components/features/logs/index.ts +20 -0
  459. package/src/components/features/logs/log-drawer.tsx +138 -0
  460. package/src/components/features/logs/log-source-labels.ts +25 -0
  461. package/src/components/features/logs/logs-page-view.tsx +100 -0
  462. package/src/components/features/logs/logs-table-columns.ts +16 -0
  463. package/src/components/features/logs/logs-table-view.tsx +509 -0
  464. package/src/components/features/logs/types.ts +71 -0
  465. package/src/components/features/policies/compute-policy-summary.ts +115 -0
  466. package/src/components/features/policies/index.ts +14 -0
  467. package/src/components/features/policies/policies-table.tsx +235 -0
  468. package/src/components/features/policies/policy-summary-cards.tsx +69 -0
  469. package/src/components/features/policies/policy-table-row.ts +37 -0
  470. package/src/components/features/remote-session/index.ts +8 -0
  471. package/src/components/features/remote-session/remote-desktop-chat-message-row.tsx +56 -0
  472. package/src/components/features/remote-session/remote-desktop-chat-panel.tsx +102 -0
  473. package/src/components/features/remote-session/remote-desktop-fullscreen-toolbar.tsx +119 -0
  474. package/src/components/features/remote-session/remote-desktop-view.tsx +209 -0
  475. package/src/components/features/software/index.ts +39 -0
  476. package/src/components/features/software/package-managers.ts +54 -0
  477. package/src/components/features/software/package-search-field-placeholder.tsx +23 -0
  478. package/src/components/features/software/schedule-fields.tsx +105 -0
  479. package/src/components/features/software/software-action-copy.ts +70 -0
  480. package/src/components/features/software/software-action-form.tsx +199 -0
  481. package/src/components/features/software/software-row-fields.tsx +105 -0
  482. package/src/components/features/software/software-row.ts +22 -0
  483. package/src/components/features/sortable-list/index.ts +1 -0
  484. package/src/components/features/sortable-list/sortable-drag-handle.tsx +41 -0
  485. package/src/components/layout/page-heading.tsx +23 -6
  486. package/src/components/navigation/index.ts +5 -0
  487. package/src/components/navigation/mingo-ai-button.tsx +37 -13
  488. package/src/components/navigation/sticky-section-nav.tsx +99 -1
  489. package/src/components/product-demo/cast.tsx +78 -0
  490. package/src/components/product-demo/fixtures/cloud-tenants.ts +63 -0
  491. package/src/components/product-demo/fixtures/devices.ts +87 -0
  492. package/src/components/product-demo/fixtures/knowledge.ts +48 -0
  493. package/src/components/product-demo/fixtures/logs.ts +103 -0
  494. package/src/components/product-demo/fixtures/policies.ts +77 -0
  495. package/src/components/product-demo/fixtures/remote-session.ts +65 -0
  496. package/src/components/product-demo/fixtures/shared.ts +53 -0
  497. package/src/components/product-demo/fixtures/software-update.ts +63 -0
  498. package/src/components/product-demo/fixtures/tickets-board.ts +100 -0
  499. package/src/components/product-demo/index.ts +7 -0
  500. package/src/components/product-demo/product-screen.tsx +94 -0
  501. package/src/components/product-demo/registry.ts +20 -0
  502. package/src/components/product-demo/screen-keys.ts +31 -0
  503. package/src/components/product-demo/screens/cloud-tenants.tsx +23 -0
  504. package/src/components/product-demo/screens/devices.tsx +41 -0
  505. package/src/components/product-demo/screens/knowledge.tsx +27 -0
  506. package/src/components/product-demo/screens/logs.tsx +113 -0
  507. package/src/components/product-demo/screens/policies.tsx +29 -0
  508. package/src/components/product-demo/screens/remote-desktop-picture.tsx +118 -0
  509. package/src/components/product-demo/screens/remote-session.tsx +46 -0
  510. package/src/components/product-demo/screens/software-update.tsx +97 -0
  511. package/src/components/product-demo/screens/tickets-board.tsx +28 -0
  512. package/src/components/product-demo/types.ts +10 -0
  513. package/src/components/ui/index.ts +1 -0
  514. package/src/components/ui/product-screen-frame.tsx +136 -0
  515. package/src/components/ui/radio-group.tsx +16 -4
  516. package/src/components/ui/snap-carousel.tsx +26 -1
  517. package/src/components/ui/tag.tsx +5 -0
  518. package/src/hooks/ui/index.ts +1 -0
  519. package/src/hooks/ui/use-header-height.ts +51 -2
  520. package/src/hooks/ui/use-sticky-toolbar.ts +60 -0
  521. package/src/hooks/use-location-hash.ts +9 -5
  522. package/src/hooks/use-scroll-to-hash.ts +9 -1
  523. package/src/types/case-study.ts +21 -1
  524. package/src/utils/date-utils.ts +8 -1
  525. package/src/utils/index.ts +5 -0
  526. package/src/utils/open-in-new-tab.ts +12 -0
  527. package/src/utils/same-page-hash-nav.ts +57 -0
  528. package/src/utils/scroll-into-view.ts +21 -5
  529. package/dist/chunk-BM5MVGH3.cjs +0 -499
  530. package/dist/chunk-CUME3VTQ.js +0 -144
  531. package/dist/chunk-CZ7Y7UG4.js +0 -732
  532. package/dist/chunk-FLKJYMVB.js +0 -499
  533. package/dist/chunk-OF6GEI5A.cjs +0 -144
  534. package/dist/chunk-UVTD52MD.cjs +0 -732
@@ -0,0 +1,1137 @@
1
+ "use client";
2
+ import {
3
+ ActionsMenuDropdown,
4
+ Tooltip,
5
+ TooltipContent,
6
+ TooltipProvider,
7
+ TooltipTrigger
8
+ } from "./chunk-P3JMAMHP.js";
9
+ import {
10
+ ToolIcon,
11
+ clamp
12
+ } from "./chunk-34I6XI3N.js";
13
+ import {
14
+ Tag,
15
+ formatDateWithTimezone,
16
+ tagVariants
17
+ } from "./chunk-IYVFSLWJ.js";
18
+ import {
19
+ PLATFORM_THEME,
20
+ getPlatformAccentColor,
21
+ getPlatformDisplayName
22
+ } from "./chunk-ADBE7QF3.js";
23
+ import {
24
+ CheckCircleIcon,
25
+ Chevron02DownIcon,
26
+ DotsLoaderIcon,
27
+ XmarkCircleIcon
28
+ } from "./chunk-NCPTID44.js";
29
+ import {
30
+ Button
31
+ } from "./chunk-YDPKUAP4.js";
32
+ import {
33
+ cn
34
+ } from "./chunk-7RXWKTAP.js";
35
+
36
+ // src/utils/date-utils.ts
37
+ var ZONED_DATE_FIELDS_MEDIUM_DATETIME = {
38
+ year: "numeric",
39
+ month: "short",
40
+ day: "numeric",
41
+ hour: "numeric",
42
+ minute: "2-digit"
43
+ };
44
+ function formatTicketRelativeTime(iso) {
45
+ const now = /* @__PURE__ */ new Date();
46
+ const date = new Date(iso);
47
+ if (Number.isNaN(date.getTime())) return "";
48
+ const diffMs = now.getTime() - date.getTime();
49
+ const diffMin = Math.floor(diffMs / 6e4);
50
+ if (diffMin < 1) return "Just now";
51
+ if (diffMin < 60) return `${diffMin} min ago`;
52
+ const diffHours = Math.floor(diffMin / 60);
53
+ if (diffHours < 24) return diffHours === 1 ? "1 hour ago" : `${diffHours} hours ago`;
54
+ return formatDateWithTimezone(date, null, "numeric");
55
+ }
56
+ function formatTicketFullTimestamp(iso) {
57
+ return formatDateWithTimezone(iso, null, "numericDateTime");
58
+ }
59
+ function formatRelativeTime(timestamp) {
60
+ return formatRelativeTimeFrom(timestamp, /* @__PURE__ */ new Date());
61
+ }
62
+ function formatRelativeTimeFrom(timestamp, now) {
63
+ const targetTime = typeof timestamp === "string" ? new Date(timestamp) : timestamp;
64
+ if (isNaN(targetTime.getTime())) {
65
+ console.warn("\u26A0\uFE0F Invalid timestamp in formatRelativeTime:", timestamp);
66
+ return "Unknown time";
67
+ }
68
+ const diffInMs = now.getTime() - targetTime.getTime();
69
+ const diffInMinutes = Math.floor(diffInMs / (1e3 * 60));
70
+ if (diffInMinutes < 0) {
71
+ return "Just now";
72
+ }
73
+ if (diffInMinutes < 1) return "Just now";
74
+ if (diffInMinutes < 60) return `${diffInMinutes}m ago`;
75
+ const diffInHours = Math.floor(diffInMinutes / 60);
76
+ if (diffInHours < 24) return `${diffInHours}h ago`;
77
+ const diffInDays = Math.floor(diffInHours / 24);
78
+ if (diffInDays < 7) return `${diffInDays}d ago`;
79
+ if (diffInDays < 30) {
80
+ const weeks = Math.floor(diffInDays / 7);
81
+ return `${weeks}w ago`;
82
+ }
83
+ return formatDateWithTimezone(targetTime, null, {
84
+ month: "short",
85
+ day: "numeric",
86
+ year: targetTime.getUTCFullYear() !== now.getUTCFullYear() ? "numeric" : void 0
87
+ });
88
+ }
89
+ function formatAbsoluteDate(timestamp, options = {}) {
90
+ const targetTime = typeof timestamp === "string" ? new Date(timestamp) : timestamp;
91
+ if (isNaN(targetTime.getTime())) {
92
+ console.warn("\u26A0\uFE0F Invalid timestamp in formatAbsoluteDate:", timestamp);
93
+ return "Invalid date";
94
+ }
95
+ return formatDateWithTimezone(targetTime, options.timeZone ?? null, {
96
+ year: "numeric",
97
+ month: "short",
98
+ day: "numeric",
99
+ ...options
100
+ });
101
+ }
102
+ function formatDateTime(timestamp, options = {}) {
103
+ const targetTime = typeof timestamp === "string" ? new Date(timestamp) : timestamp;
104
+ if (isNaN(targetTime.getTime())) {
105
+ console.warn("\u26A0\uFE0F Invalid timestamp in formatDateTime:", timestamp);
106
+ return "Invalid date";
107
+ }
108
+ return formatDateWithTimezone(targetTime, options.timeZone ?? null, {
109
+ ...ZONED_DATE_FIELDS_MEDIUM_DATETIME,
110
+ ...options
111
+ });
112
+ }
113
+ function getDetailedTimeDifference(timestamp) {
114
+ const now = /* @__PURE__ */ new Date();
115
+ const targetTime = typeof timestamp === "string" ? new Date(timestamp) : timestamp;
116
+ if (isNaN(targetTime.getTime())) {
117
+ return "Invalid date";
118
+ }
119
+ const diffInMs = now.getTime() - targetTime.getTime();
120
+ const diffInSeconds = Math.floor(diffInMs / 1e3);
121
+ const diffInMinutes = Math.floor(diffInSeconds / 60);
122
+ const diffInHours = Math.floor(diffInMinutes / 60);
123
+ const diffInDays = Math.floor(diffInHours / 24);
124
+ if (diffInSeconds < 60) return `${diffInSeconds} seconds ago`;
125
+ if (diffInMinutes < 60) return `${diffInMinutes} minutes ago`;
126
+ if (diffInHours < 24) return `${diffInHours} hours ago`;
127
+ if (diffInDays < 30) return `${diffInDays} days ago`;
128
+ const diffInMonths = Math.floor(diffInDays / 30);
129
+ if (diffInMonths < 12) return `${diffInMonths} months ago`;
130
+ const diffInYears = Math.floor(diffInDays / 365);
131
+ return `${diffInYears} years ago`;
132
+ }
133
+ function isToday(timestamp) {
134
+ const today = /* @__PURE__ */ new Date();
135
+ const targetTime = typeof timestamp === "string" ? new Date(timestamp) : timestamp;
136
+ return today.toDateString() === targetTime.toDateString();
137
+ }
138
+ function isWithinMinutes(timestamp, minutes) {
139
+ const now = /* @__PURE__ */ new Date();
140
+ const targetTime = typeof timestamp === "string" ? new Date(timestamp) : timestamp;
141
+ const diffInMs = now.getTime() - targetTime.getTime();
142
+ const diffInMinutes = diffInMs / (1e3 * 60);
143
+ return diffInMinutes <= minutes && diffInMinutes >= 0;
144
+ }
145
+ function createUTCTimestamp() {
146
+ return (/* @__PURE__ */ new Date()).toISOString();
147
+ }
148
+
149
+ // src/utils/color-analysis.ts
150
+ var DESIGN_PALETTE = [
151
+ { name: "yellow", hex: "#FFC008", rgb: [255, 192, 8] },
152
+ { name: "black", hex: "#161616", rgb: [22, 22, 22] },
153
+ { name: "gray", hex: "#888888", rgb: [136, 136, 136] }
154
+ ];
155
+ function hexToRgb(hex) {
156
+ const normalized = hex.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i, (_, r, g, b) => `${r}${r}${g}${g}${b}${b}`);
157
+ const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(normalized);
158
+ return result ? [parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)] : [0, 0, 0];
159
+ }
160
+ function getLuminance(rgb) {
161
+ const [r, g, b] = rgb.map((channel) => {
162
+ const c = channel / 255;
163
+ return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
164
+ });
165
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b;
166
+ }
167
+ function getContrastRatio(color1, color2) {
168
+ const lum1 = getLuminance(color1);
169
+ const lum2 = getLuminance(color2);
170
+ const brightest = Math.max(lum1, lum2);
171
+ const darkest = Math.min(lum1, lum2);
172
+ return (brightest + 0.05) / (darkest + 0.05);
173
+ }
174
+ function pickReadableTextColor(bgHex) {
175
+ const bg = hexToRgb(bgHex);
176
+ const darkContrast = getContrastRatio(bg, [26, 26, 26]);
177
+ const lightContrast = getContrastRatio(bg, [250, 250, 250]);
178
+ return darkContrast >= lightContrast ? "dark" : "light";
179
+ }
180
+ function extractDominantColor(canvas) {
181
+ const ctx = canvas.getContext("2d");
182
+ if (!ctx) return [128, 128, 128];
183
+ const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
184
+ const data = imageData.data;
185
+ const sampleSize = Math.max(1, Math.floor(data.length / (4 * 1e3)));
186
+ const colorCounts = {};
187
+ for (let i = 0; i < data.length; i += 4 * sampleSize) {
188
+ const r = data[i];
189
+ const g = data[i + 1];
190
+ const b = data[i + 2];
191
+ const alpha = data[i + 3];
192
+ if (alpha < 128) continue;
193
+ const bucketR = Math.round(r / 32) * 32;
194
+ const bucketG = Math.round(g / 32) * 32;
195
+ const bucketB = Math.round(b / 32) * 32;
196
+ const key = `${bucketR},${bucketG},${bucketB}`;
197
+ colorCounts[key] = (colorCounts[key] || 0) + 1;
198
+ }
199
+ let maxCount = 0;
200
+ let dominantColor = [128, 128, 128];
201
+ for (const [colorKey, count] of Object.entries(colorCounts)) {
202
+ if (count > maxCount) {
203
+ maxCount = count;
204
+ const [r, g, b] = colorKey.split(",").map(Number);
205
+ dominantColor = [r, g, b];
206
+ }
207
+ }
208
+ return dominantColor;
209
+ }
210
+ function getBestContrastColor(imageColor) {
211
+ let bestColor = DESIGN_PALETTE[0];
212
+ let bestContrast = 0;
213
+ for (const color of DESIGN_PALETTE) {
214
+ const contrast = getContrastRatio(imageColor, color.rgb);
215
+ if (contrast > bestContrast) {
216
+ bestContrast = contrast;
217
+ bestColor = color;
218
+ }
219
+ }
220
+ return bestContrast >= 3 ? bestColor : DESIGN_PALETTE.find((c) => c.name === "black") || bestColor;
221
+ }
222
+ function analyzeImageColor(imageSrc) {
223
+ return new Promise((resolve, reject) => {
224
+ const img = new Image();
225
+ img.crossOrigin = "anonymous";
226
+ img.onload = () => {
227
+ try {
228
+ const canvas = document.createElement("canvas");
229
+ const ctx = canvas.getContext("2d");
230
+ if (!ctx) {
231
+ reject(new Error("Could not get canvas context"));
232
+ return;
233
+ }
234
+ const maxSize = 100;
235
+ const scale = Math.min(maxSize / img.width, maxSize / img.height);
236
+ canvas.width = img.width * scale;
237
+ canvas.height = img.height * scale;
238
+ ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
239
+ const dominantColor = extractDominantColor(canvas);
240
+ const bestContrastColor = getBestContrastColor(dominantColor);
241
+ resolve(bestContrastColor);
242
+ } catch (error) {
243
+ reject(error);
244
+ }
245
+ };
246
+ img.onerror = () => reject(new Error("Failed to load image"));
247
+ img.src = imageSrc;
248
+ });
249
+ }
250
+ async function extractImageEdgeColorAsync(imageUrl) {
251
+ return new Promise((resolve) => {
252
+ if (typeof window === "undefined") {
253
+ resolve("#000000");
254
+ return;
255
+ }
256
+ const img = new Image();
257
+ img.crossOrigin = "anonymous";
258
+ img.onload = () => {
259
+ try {
260
+ const canvas = document.createElement("canvas");
261
+ const ctx = canvas.getContext("2d");
262
+ if (!ctx) {
263
+ resolve("#000000");
264
+ return;
265
+ }
266
+ const maxSize = 50;
267
+ const scale = Math.min(maxSize / img.naturalWidth, maxSize / img.naturalHeight);
268
+ const w = Math.round(img.naturalWidth * scale);
269
+ const h = Math.round(img.naturalHeight * scale);
270
+ canvas.width = w;
271
+ canvas.height = h;
272
+ ctx.drawImage(img, 0, 0, w, h);
273
+ const data = ctx.getImageData(0, 0, w, h).data;
274
+ const edgeW = Math.max(2, Math.round(w * 0.15));
275
+ const edgeH = Math.max(2, Math.round(h * 0.15));
276
+ const bucketSize = 32;
277
+ const buckets = /* @__PURE__ */ new Map();
278
+ for (let y = 0; y < h; y++) {
279
+ for (let x = 0; x < w; x++) {
280
+ if (!(x < edgeW || x >= w - edgeW || y < edgeH || y >= h - edgeH)) continue;
281
+ const i = (y * w + x) * 4;
282
+ if (data[i + 3] < 128) continue;
283
+ const br = Math.floor(data[i] / bucketSize) * bucketSize;
284
+ const bg = Math.floor(data[i + 1] / bucketSize) * bucketSize;
285
+ const bb = Math.floor(data[i + 2] / bucketSize) * bucketSize;
286
+ const key = `${br},${bg},${bb}`;
287
+ const existing = buckets.get(key);
288
+ if (existing) {
289
+ existing.r += data[i];
290
+ existing.g += data[i + 1];
291
+ existing.b += data[i + 2];
292
+ existing.count++;
293
+ } else {
294
+ buckets.set(key, { r: data[i], g: data[i + 1], b: data[i + 2], count: 1 });
295
+ }
296
+ }
297
+ }
298
+ let best = { r: 0, g: 0, b: 0, count: 0 };
299
+ for (const b2 of buckets.values()) {
300
+ if (b2.count > best.count) best = b2;
301
+ }
302
+ if (best.count === 0) {
303
+ resolve("#000000");
304
+ return;
305
+ }
306
+ const r = Math.round(best.r / best.count), g = Math.round(best.g / best.count), b = Math.round(best.b / best.count);
307
+ resolve(
308
+ `#${r.toString(16).padStart(2, "0")}${g.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`
309
+ );
310
+ } catch {
311
+ resolve("#000000");
312
+ }
313
+ };
314
+ img.onerror = () => resolve("#000000");
315
+ img.src = imageUrl;
316
+ });
317
+ }
318
+
319
+ // src/utils/ods-color-tokens-stub.ts
320
+ var colorTokens = {
321
+ primary: "#FFC008",
322
+ secondary: "#161616",
323
+ background: "#FAFAFA",
324
+ surface: "#FFFFFF",
325
+ text: {
326
+ primary: "#161616",
327
+ secondary: "#666666",
328
+ inverse: "#FFFFFF"
329
+ },
330
+ border: "#E5E5E5"
331
+ };
332
+
333
+ // src/utils/ods-color-utils.ts
334
+ var TOKEN_MAP = colorTokens;
335
+ function lookupToken(tokenKey) {
336
+ const value = TOKEN_MAP[tokenKey];
337
+ return typeof value === "string" ? value : void 0;
338
+ }
339
+ function getODSToken(category, color, variant = "base") {
340
+ const tokenKey = `${category}-${color}-${variant}`;
341
+ return lookupToken(tokenKey);
342
+ }
343
+ function getCurrentPlatform() {
344
+ if (typeof window === "undefined") {
345
+ return process.env.NEXT_PUBLIC_APP_TYPE || "openmsp";
346
+ }
347
+ const domPlatform = document.documentElement.getAttribute("data-app-type");
348
+ if (domPlatform) {
349
+ return domPlatform;
350
+ }
351
+ return process.env.NEXT_PUBLIC_APP_TYPE || "openmsp";
352
+ }
353
+ function switchPlatformTheme(platform) {
354
+ if (typeof window === "undefined") return;
355
+ const root = document.documentElement;
356
+ root.setAttribute("data-app-type", platform);
357
+ window.dispatchEvent(
358
+ new CustomEvent("platformThemeChanged", {
359
+ detail: { platform }
360
+ })
361
+ );
362
+ }
363
+ function getSemanticColor(semanticName, platform) {
364
+ if (typeof window === "undefined") return void 0;
365
+ const currentPlatform = platform || getCurrentPlatform();
366
+ const originalPlatform = getCurrentPlatform();
367
+ if (currentPlatform !== originalPlatform) {
368
+ switchPlatformTheme(currentPlatform);
369
+ }
370
+ const testElement = document.createElement("div");
371
+ document.body.appendChild(testElement);
372
+ const computedStyle = getComputedStyle(testElement);
373
+ const colorValue = computedStyle.getPropertyValue(`--color-${semanticName}`);
374
+ document.body.removeChild(testElement);
375
+ if (currentPlatform !== originalPlatform) {
376
+ switchPlatformTheme(originalPlatform);
377
+ }
378
+ return colorValue.trim() || void 0;
379
+ }
380
+ function getPlatformConfig(platform) {
381
+ const currentPlatform = platform || getCurrentPlatform();
382
+ const isDarkTheme = PLATFORM_THEME === "dark";
383
+ return {
384
+ platform: currentPlatform,
385
+ accentColor: getPlatformAccentColor(currentPlatform),
386
+ isDarkTheme,
387
+ isLightTheme: !isDarkTheme,
388
+ brandName: getPlatformDisplayName(currentPlatform)
389
+ };
390
+ }
391
+ function usePlatformColors(platform) {
392
+ const currentPlatform = platform || getCurrentPlatform();
393
+ const config = getPlatformConfig(currentPlatform);
394
+ return {
395
+ platform: currentPlatform,
396
+ accentColor: config.accentColor,
397
+ isDarkTheme: config.isDarkTheme,
398
+ isLightTheme: config.isLightTheme,
399
+ brandName: config.brandName,
400
+ getToken: (category, color, variant) => getODSToken(category, color, variant),
401
+ switchTheme: (newPlatform) => switchPlatformTheme(newPlatform),
402
+ getSemanticColor: (semanticName) => getSemanticColor(semanticName, currentPlatform)
403
+ };
404
+ }
405
+ function getReadableTextColor(hex) {
406
+ return pickReadableTextColor(hex) === "dark" ? "#212121" : "#fafafa";
407
+ }
408
+ var HEX_PATTERN = /^#[0-9a-fA-F]{6}$/;
409
+ function hexToRgb2(hex) {
410
+ if (!HEX_PATTERN.test(hex)) return null;
411
+ const n = Number.parseInt(hex.slice(1), 16);
412
+ return { r: n >> 16 & 255, g: n >> 8 & 255, b: n & 255 };
413
+ }
414
+ function rgbToHex(r, g, b) {
415
+ const to = (n) => clamp(Math.round(n), 0, 255).toString(16).padStart(2, "0");
416
+ return `#${to(r)}${to(g)}${to(b)}`;
417
+ }
418
+ var HOVER_DARKEN_STEP = 10;
419
+ var ACTIVE_DARKEN_STEP = 20;
420
+ function darkenByStep(hex, step) {
421
+ const rgb = hexToRgb2(hex);
422
+ if (!rgb) return hex;
423
+ return rgbToHex(rgb.r - step, rgb.g - step, rgb.b - step);
424
+ }
425
+ function deriveHoverColor(hex) {
426
+ return darkenByStep(hex, HOVER_DARKEN_STEP);
427
+ }
428
+ function deriveActiveColor(hex) {
429
+ return darkenByStep(hex, ACTIVE_DARKEN_STEP);
430
+ }
431
+ function rgbToHsl(r, g, b) {
432
+ const rn = r / 255;
433
+ const gn = g / 255;
434
+ const bn = b / 255;
435
+ const max = Math.max(rn, gn, bn);
436
+ const min = Math.min(rn, gn, bn);
437
+ const l = (max + min) / 2;
438
+ if (max === min) return { h: 0, s: 0, l: Math.round(l * 100) };
439
+ const d = max - min;
440
+ const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
441
+ let h;
442
+ if (max === rn) h = (gn - bn) / d + (gn < bn ? 6 : 0);
443
+ else if (max === gn) h = (bn - rn) / d + 2;
444
+ else h = (rn - gn) / d + 4;
445
+ h *= 60;
446
+ return { h: Math.round(h), s: Math.round(s * 100), l: Math.round(l * 100) };
447
+ }
448
+ function hslToRgb(h, s, l) {
449
+ const sn = clamp(s, 0, 100) / 100;
450
+ const ln = clamp(l, 0, 100) / 100;
451
+ const hn = (h % 360 + 360) % 360;
452
+ if (sn === 0) {
453
+ const v = Math.round(ln * 255);
454
+ return { r: v, g: v, b: v };
455
+ }
456
+ const q = ln < 0.5 ? ln * (1 + sn) : ln + sn - ln * sn;
457
+ const p = 2 * ln - q;
458
+ const hue2rgb = (t) => {
459
+ let tn = t;
460
+ if (tn < 0) tn += 1;
461
+ if (tn > 1) tn -= 1;
462
+ if (tn < 1 / 6) return p + (q - p) * 6 * tn;
463
+ if (tn < 1 / 2) return q;
464
+ if (tn < 2 / 3) return p + (q - p) * (2 / 3 - tn) * 6;
465
+ return p;
466
+ };
467
+ const hk = hn / 360;
468
+ return {
469
+ r: Math.round(hue2rgb(hk + 1 / 3) * 255),
470
+ g: Math.round(hue2rgb(hk) * 255),
471
+ b: Math.round(hue2rgb(hk - 1 / 3) * 255)
472
+ };
473
+ }
474
+
475
+ // src/components/ui/color-swatch.tsx
476
+ import { jsx } from "react/jsx-runtime";
477
+ function ColorSwatch({ color, className }) {
478
+ return /* @__PURE__ */ jsx(
479
+ "span",
480
+ {
481
+ "aria-hidden": true,
482
+ className: cn("inline-block size-4 shrink-0 rounded-sm", className),
483
+ style: { backgroundColor: color }
484
+ }
485
+ );
486
+ }
487
+
488
+ // src/components/ui/ticket-status-tag.tsx
489
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
490
+ var STATUS_CONFIG = {
491
+ ACTIVE: {
492
+ label: "Active",
493
+ variant: "success"
494
+ },
495
+ AI_ASSISTANCE: {
496
+ label: "AI Handling",
497
+ variant: "outline"
498
+ },
499
+ TECH_REQUIRED: {
500
+ label: "Tech Required",
501
+ variant: "warning"
502
+ },
503
+ ON_HOLD: {
504
+ label: "On Hold",
505
+ variant: "error"
506
+ },
507
+ RESOLVED: {
508
+ label: "Resolved",
509
+ variant: "outline",
510
+ icon: /* @__PURE__ */ jsx2(CheckCircleIcon, { size: 16, color: "var(--color-success)" })
511
+ },
512
+ ARCHIVED: {
513
+ label: "Archived",
514
+ variant: "grey"
515
+ }
516
+ };
517
+ var STATUS_ALIASES = {
518
+ // Canonical (backend enum)
519
+ ACTIVE: "ACTIVE",
520
+ AI_ASSISTANCE: "AI_ASSISTANCE",
521
+ ai_assistance: "AI_ASSISTANCE",
522
+ TECH_REQUIRED: "TECH_REQUIRED",
523
+ ON_HOLD: "ON_HOLD",
524
+ RESOLVED: "RESOLVED",
525
+ ARCHIVED: "ARCHIVED",
526
+ // Dialog-layer alias
527
+ ACTION_REQUIRED: "TECH_REQUIRED",
528
+ // HubSpot canonical (OPEN/CLOSED) — drives color + icon variant. The
529
+ // user-facing label still comes from `pipeline_stage_label` when the
530
+ // caller passes <TicketStatusTag label={…}>, so the badge can read
531
+ // "New" / "Working" / "Waiting on contact" while the canonical status
532
+ // remains OPEN.
533
+ OPEN: "ACTIVE",
534
+ open: "ACTIVE",
535
+ CLOSED: "RESOLVED",
536
+ closed: "RESOLVED",
537
+ // Chat lowercase variants
538
+ active: "ACTIVE",
539
+ tech_required: "TECH_REQUIRED",
540
+ on_hold: "ON_HOLD",
541
+ resolved: "RESOLVED",
542
+ archived: "ARCHIVED",
543
+ action_required: "TECH_REQUIRED"
544
+ };
545
+ function resolveTicketStatus(status) {
546
+ return STATUS_ALIASES[status] ?? null;
547
+ }
548
+ function getTicketStatusConfig(status) {
549
+ const canonical = resolveTicketStatus(status);
550
+ if (!canonical) {
551
+ return { label: status.replace(/_/g, " "), variant: "outline" };
552
+ }
553
+ return STATUS_CONFIG[canonical];
554
+ }
555
+ function getTicketStatusTag(status) {
556
+ const config = getTicketStatusConfig(status);
557
+ return { label: config.label, variant: config.variant, icon: config.icon };
558
+ }
559
+ var KIND_TO_CANONICAL = {
560
+ AI_ASSISTANCE: "AI_ASSISTANCE",
561
+ TECH_REQUIRED: "TECH_REQUIRED",
562
+ RESOLVED: "RESOLVED",
563
+ ARCHIVED: "ARCHIVED"
564
+ };
565
+ function kindToCanonicalStatus(kind) {
566
+ if (kind == null || kind === "CUSTOM") return void 0;
567
+ return KIND_TO_CANONICAL[kind];
568
+ }
569
+ function usesCanonicalStatusStyle(kind) {
570
+ return kind != null && kind !== "CUSTOM" && kind !== "TECH_REQUIRED";
571
+ }
572
+ function resolveStatusTagProps(input) {
573
+ const canonical = usesCanonicalStatusStyle(input.statusKind) ? kindToCanonicalStatus(input.statusKind) : void 0;
574
+ return {
575
+ status: canonical ?? input.status ?? "",
576
+ label: input.statusName ?? void 0,
577
+ color: canonical ? void 0 : input.statusColor ?? void 0
578
+ };
579
+ }
580
+ function TicketStatusTag({
581
+ status,
582
+ label,
583
+ color,
584
+ variant,
585
+ className,
586
+ showIcon = true,
587
+ options,
588
+ onSelect,
589
+ isPending = false,
590
+ disabled = false,
591
+ disabledReason
592
+ }) {
593
+ const config = getTicketStatusConfig(status);
594
+ const customStyle = color ? {
595
+ "--tag-bg": color,
596
+ "--tag-bg-hover": deriveHoverColor(color),
597
+ "--tag-bg-active": deriveActiveColor(color),
598
+ color: getReadableTextColor(color)
599
+ } : void 0;
600
+ const customColorClasses = color ? "bg-[var(--tag-bg)] hover:bg-[var(--tag-bg-hover)] active:bg-[var(--tag-bg-active)]" : void 0;
601
+ const tag = /* @__PURE__ */ jsx2(
602
+ Tag,
603
+ {
604
+ label: label ?? config.label,
605
+ variant: variant ?? config.variant,
606
+ icon: showIcon ? config.icon : void 0,
607
+ className: cn("w-fit shrink-0", customColorClasses, className),
608
+ style: customStyle
609
+ }
610
+ );
611
+ if (disabled || !options || options.length === 0 || !onSelect) {
612
+ if (disabled && disabledReason) {
613
+ return /* @__PURE__ */ jsx2(TooltipProvider, { delayDuration: 0, children: /* @__PURE__ */ jsxs(Tooltip, { children: [
614
+ /* @__PURE__ */ jsx2(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx2("span", { className: "w-fit shrink-0 cursor-not-allowed", children: tag }) }),
615
+ /* @__PURE__ */ jsx2(TooltipContent, { children: disabledReason })
616
+ ] }) });
617
+ }
618
+ return tag;
619
+ }
620
+ return /* @__PURE__ */ jsx2(
621
+ ActionsMenuDropdown,
622
+ {
623
+ align: "start",
624
+ groups: [
625
+ {
626
+ items: options.map((option) => ({
627
+ id: option.id,
628
+ label: option.name,
629
+ icon: /* @__PURE__ */ jsx2(ColorSwatch, { color: option.color }),
630
+ onClick: () => onSelect(option.id),
631
+ disabled: isPending
632
+ }))
633
+ }
634
+ ],
635
+ customTrigger: /* @__PURE__ */ jsxs(
636
+ "button",
637
+ {
638
+ type: "button",
639
+ disabled: isPending,
640
+ "aria-label": "Change status",
641
+ style: customStyle,
642
+ className: cn(
643
+ // Reuse the tag's variant styling, but split into a label section and a
644
+ // separated chevron section (the common dropdown-button seam).
645
+ tagVariants({ variant: variant ?? config.variant }),
646
+ "w-fit shrink-0 items-stretch justify-start gap-0 overflow-hidden p-0",
647
+ "disabled:cursor-not-allowed disabled:opacity-60",
648
+ // Custom color: bg/hover/active from the CSS vars set above.
649
+ customColorClasses,
650
+ className
651
+ ),
652
+ children: [
653
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-[var(--spacing-system-xxs)] px-[var(--spacing-system-xsf)]", children: [
654
+ showIcon && config.icon && /* @__PURE__ */ jsx2("span", { className: "flex size-5 shrink-0 items-center justify-center", children: config.icon }),
655
+ /* @__PURE__ */ jsx2("span", { className: "truncate", children: label ?? config.label })
656
+ ] }),
657
+ /* @__PURE__ */ jsx2("span", { className: "flex items-center justify-center self-stretch border-l border-ods-border px-[var(--spacing-system-xsf)]", children: /* @__PURE__ */ jsx2(Chevron02DownIcon, { className: "size-4 shrink-0" }) })
658
+ ]
659
+ }
660
+ )
661
+ }
662
+ );
663
+ }
664
+
665
+ // src/components/ui/status-line.tsx
666
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
667
+ function StatusLine({ tone, label, className }) {
668
+ return /* @__PURE__ */ jsxs2(
669
+ "span",
670
+ {
671
+ className: cn(
672
+ "inline-flex items-center gap-1.5 whitespace-nowrap text-h6",
673
+ tone === "waiting" ? "text-ods-warning" : tone === "error" ? "text-ods-error" : tone === "muted" ? "text-ods-text-secondary" : "text-ods-text-primary",
674
+ className
675
+ ),
676
+ children: [
677
+ tone === "working" && /* @__PURE__ */ jsx3(
678
+ "span",
679
+ {
680
+ className: "h-2 w-2 shrink-0 animate-pulse rounded-full bg-ods-flamingo-cyan motion-reduce:animate-none",
681
+ "aria-hidden": true
682
+ }
683
+ ),
684
+ tone === "success" && /* @__PURE__ */ jsx3(CheckCircleIcon, { size: 16, className: "shrink-0 text-ods-success", "aria-hidden": true }),
685
+ tone === "error" && /* @__PURE__ */ jsx3(XmarkCircleIcon, { size: 16, className: "shrink-0 text-ods-error", "aria-hidden": true }),
686
+ label
687
+ ]
688
+ }
689
+ );
690
+ }
691
+
692
+ // src/components/chat/expand-chevron.tsx
693
+ import { jsx as jsx4 } from "react/jsx-runtime";
694
+ function ExpandChevron({ expanded, className }) {
695
+ return /* @__PURE__ */ jsx4(
696
+ Chevron02DownIcon,
697
+ {
698
+ className: cn(
699
+ "h-4 w-4 shrink-0 text-ods-text-secondary transition-transform duration-200",
700
+ expanded && "rotate-180",
701
+ className
702
+ )
703
+ }
704
+ );
705
+ }
706
+
707
+ // src/components/chat/hooks/use-collapsible.ts
708
+ import { useLayoutEffect, useState } from "react";
709
+ function useCollapsible({
710
+ expanded,
711
+ collapsedHeight = 0,
712
+ disableTransition = false,
713
+ durationMs = 200
714
+ }) {
715
+ const [element, setElement] = useState(null);
716
+ const [contentHeight, setContentHeight] = useState(0);
717
+ const [collapsedPx, setCollapsedPx] = useState(0);
718
+ useLayoutEffect(() => {
719
+ if (!element) return void 0;
720
+ const measure = () => {
721
+ setContentHeight(element.scrollHeight);
722
+ setCollapsedPx(collapsedHeight === "1lh" ? parseFloat(getComputedStyle(element).lineHeight) : collapsedHeight);
723
+ };
724
+ measure();
725
+ const observer = new ResizeObserver(measure);
726
+ observer.observe(element);
727
+ return () => observer.disconnect();
728
+ }, [element, collapsedHeight]);
729
+ const collapsedValue = collapsedHeight === "1lh" ? collapsedPx || collapsedHeight : collapsedHeight;
730
+ const containerStyle = {
731
+ overflow: "hidden",
732
+ maxHeight: expanded ? contentHeight : collapsedValue,
733
+ transition: disableTransition ? "none" : `max-height ${durationMs}ms ease-in-out`
734
+ };
735
+ return {
736
+ innerRef: setElement,
737
+ isOverflowing: contentHeight > collapsedPx,
738
+ containerStyle
739
+ };
740
+ }
741
+
742
+ // src/components/chat/utils/tool-call-helpers.ts
743
+ var COMMAND_BODY_ARG_KEYS = ["command", "query", "script", "scriptContent", "code"];
744
+ function getToolCallTitle(opts) {
745
+ const { args, title, name } = opts;
746
+ if (args && typeof args === "object") {
747
+ for (const key of COMMAND_BODY_ARG_KEYS) {
748
+ const candidate = args[key];
749
+ if (typeof candidate === "string" && candidate.trim()) return candidate;
750
+ }
751
+ }
752
+ return title || name || "Tool call";
753
+ }
754
+ function getCommandText(call) {
755
+ return getToolCallTitle({
756
+ args: call.toolCallArguments,
757
+ title: call.toolTitle,
758
+ name: call.toolName
759
+ });
760
+ }
761
+ var INLINE_STRING_MAX = 80;
762
+ function expandJson(value, indent) {
763
+ const pad = (n) => " ".repeat(n);
764
+ if (value === null) return "null";
765
+ const t = typeof value;
766
+ if (t === "number" || t === "boolean" || t === "bigint") return String(value);
767
+ if (t === "string") {
768
+ const s = value.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
769
+ if (!s.includes("\n")) return JSON.stringify(s);
770
+ return s.replace(/^\n+/, "").replace(/\n+$/, "").split("\n").map((line) => pad(indent) + line).join("\n");
771
+ }
772
+ if (Array.isArray(value)) {
773
+ if (value.length === 0) return "[]";
774
+ const items = value.map(
775
+ (v) => typeof v === "string" && /[\r\n]/.test(v) ? expandJson(v, indent + 1) : pad(indent + 1) + expandJson(v, indent + 1)
776
+ );
777
+ return "[\n" + items.join(",\n") + "\n" + pad(indent) + "]";
778
+ }
779
+ if (t === "object") {
780
+ const entries = Object.entries(value);
781
+ if (entries.length === 0) return "{}";
782
+ const items = entries.map(([k, v]) => {
783
+ const key = JSON.stringify(k);
784
+ if (typeof v === "string" && /[\r\n]/.test(v)) {
785
+ return pad(indent + 1) + key + ":\n" + expandJson(v, indent + 2);
786
+ }
787
+ return pad(indent + 1) + key + ": " + expandJson(v, indent + 1);
788
+ });
789
+ return "{\n" + items.join(",\n") + "\n" + pad(indent) + "}";
790
+ }
791
+ return JSON.stringify(value);
792
+ }
793
+ function expandedJsonStringify(value) {
794
+ try {
795
+ return expandJson(value, 0);
796
+ } catch {
797
+ return String(value);
798
+ }
799
+ }
800
+ function formatToolArgValue(value) {
801
+ if (value === null || value === void 0) return { kind: "inline", text: "" };
802
+ if (typeof value === "object") {
803
+ return { kind: "block", text: safeStringify(value), language: "json" };
804
+ }
805
+ if (typeof value === "string") {
806
+ const trimmed = value.trim();
807
+ if (trimmed.startsWith("{") && trimmed.endsWith("}") || trimmed.startsWith("[") && trimmed.endsWith("]")) {
808
+ try {
809
+ return { kind: "block", text: expandedJsonStringify(JSON.parse(trimmed)), language: "json" };
810
+ } catch {
811
+ }
812
+ }
813
+ if (value.includes("\n") || value.length > INLINE_STRING_MAX) {
814
+ return { kind: "block", text: value, language: "text" };
815
+ }
816
+ return { kind: "inline", text: value };
817
+ }
818
+ return { kind: "inline", text: String(value) };
819
+ }
820
+ function safeStringify(value) {
821
+ return expandedJsonStringify(value);
822
+ }
823
+ function formatToolResult(value) {
824
+ if (typeof value !== "string") return { kind: "inline", text: "" };
825
+ const fenced = value.match(/^\s*```(?:[a-zA-Z0-9_-]*)\n([\s\S]*?)\n```\s*$/);
826
+ const body = fenced ? fenced[1] : value;
827
+ const trimmed = body.trim();
828
+ if (trimmed.startsWith("{") && trimmed.endsWith("}") || trimmed.startsWith("[") && trimmed.endsWith("]")) {
829
+ try {
830
+ return { kind: "block", text: expandedJsonStringify(JSON.parse(trimmed)), language: "json" };
831
+ } catch {
832
+ }
833
+ }
834
+ if (body.includes("\n") || body.length > INLINE_STRING_MAX) {
835
+ return { kind: "block", text: body, language: "text" };
836
+ }
837
+ return { kind: "inline", text: body };
838
+ }
839
+
840
+ // src/components/chat/tool-call-blocks.tsx
841
+ import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
842
+ var CODE_PRE_CLASS = "bg-ods-bg border border-ods-border rounded-md p-[var(--spacing-system-sf)] w-full max-h-64 overflow-auto overscroll-contain text-code text-ods-text-primary whitespace-pre";
843
+ function ArgRow({ argKey, value }) {
844
+ const formatted = formatToolArgValue(value);
845
+ if (formatted.kind === "inline") {
846
+ return /* @__PURE__ */ jsxs3("div", { className: "flex w-full items-start gap-[var(--spacing-system-xxs)]", children: [
847
+ /* @__PURE__ */ jsxs3("span", { className: "shrink-0 text-ods-text-secondary", children: [
848
+ argKey,
849
+ ":"
850
+ ] }),
851
+ /* @__PURE__ */ jsx5("span", { className: "min-w-0 flex-1 break-all text-ods-text-primary", children: formatted.text })
852
+ ] });
853
+ }
854
+ return /* @__PURE__ */ jsxs3("div", { className: "flex w-full flex-col items-start gap-[var(--spacing-system-xxs)]", children: [
855
+ /* @__PURE__ */ jsxs3("span", { className: "text-ods-text-secondary", children: [
856
+ argKey,
857
+ ":"
858
+ ] }),
859
+ /* @__PURE__ */ jsx5("pre", { className: CODE_PRE_CLASS, children: /* @__PURE__ */ jsx5("code", { children: formatted.text }) })
860
+ ] });
861
+ }
862
+ function ResultBlock({ result, className }) {
863
+ const formatted = formatToolResult(result);
864
+ if (!formatted.text) return null;
865
+ if (formatted.kind === "inline") {
866
+ return /* @__PURE__ */ jsxs3("div", { className: cn("flex w-full flex-col items-start gap-[var(--spacing-system-xxs)]", className), children: [
867
+ /* @__PURE__ */ jsx5("span", { className: "text-ods-text-secondary", children: "Result:" }),
868
+ /* @__PURE__ */ jsx5("span", { className: "break-all text-ods-text-primary", children: formatted.text })
869
+ ] });
870
+ }
871
+ return /* @__PURE__ */ jsxs3("div", { className: cn("flex w-full flex-col items-start gap-[var(--spacing-system-xxs)]", className), children: [
872
+ /* @__PURE__ */ jsx5("span", { className: "text-ods-text-secondary", children: "Result:" }),
873
+ /* @__PURE__ */ jsx5("pre", { className: CODE_PRE_CLASS, children: /* @__PURE__ */ jsx5("code", { children: formatted.text }) })
874
+ ] });
875
+ }
876
+ function CommandBlock({ command, className }) {
877
+ if (!command) return null;
878
+ return /* @__PURE__ */ jsx5("pre", { className: cn(CODE_PRE_CLASS, className), children: /* @__PURE__ */ jsx5("code", { children: command }) });
879
+ }
880
+
881
+ // src/components/chat/approval-batch-message.tsx
882
+ import { forwardRef, useState as useState2 } from "react";
883
+
884
+ // src/components/chat/chat-block-frame.ts
885
+ var CHAT_BLOCK_FRAME_CLASS = "rounded-lg border border-ods-border bg-ods-bg";
886
+ var CHAT_BLOCK_CLASS = `${CHAT_BLOCK_FRAME_CLASS} flex flex-col gap-[var(--spacing-system-xsf)] p-[var(--spacing-system-sf)]`;
887
+
888
+ // src/components/chat/approval-batch-message.tsx
889
+ import { Fragment, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
890
+ var COMMAND_BODY_KEYS = new Set(COMMAND_BODY_ARG_KEYS);
891
+ function ApprovalStatusTag({ status, resolvedByName, inlineResolver = false }) {
892
+ const suffix = inlineResolver && resolvedByName ? ` by ${resolvedByName}` : "";
893
+ if (status === "approved") return /* @__PURE__ */ jsx6(StatusLine, { tone: "success", label: `Approved${suffix}` });
894
+ if (status === "cancelled") return /* @__PURE__ */ jsx6(StatusLine, { tone: "muted", label: `Canceled${suffix}` });
895
+ if (status === "rejected") return /* @__PURE__ */ jsx6(StatusLine, { tone: "error", label: `Rejected${suffix}` });
896
+ return null;
897
+ }
898
+ function ApprovalWaitingLine() {
899
+ return /* @__PURE__ */ jsx6(StatusLine, { tone: "waiting", label: "Waiting for you" });
900
+ }
901
+ function getArgEntries(call) {
902
+ const args = call.toolCallArguments;
903
+ if (!args || typeof args !== "object") return [];
904
+ return Object.entries(args).filter(
905
+ ([k, v]) => !COMMAND_BODY_KEYS.has(k) && v !== null && v !== void 0 && v !== ""
906
+ );
907
+ }
908
+ function ExecutionStatusIcon({
909
+ batchStatus,
910
+ execution
911
+ }) {
912
+ if (batchStatus !== "approved") return null;
913
+ if (!execution || execution.status === "executing")
914
+ return /* @__PURE__ */ jsx6(DotsLoaderIcon, { size: 16, className: "text-ods-text-secondary" });
915
+ if (execution.success === false) return /* @__PURE__ */ jsx6(XmarkCircleIcon, { className: "h-4 w-4 text-ods-error" });
916
+ return /* @__PURE__ */ jsx6(CheckCircleIcon, { className: "h-4 w-4 text-ods-success" });
917
+ }
918
+ function ToolCallRow({ call, expanded, onToggle, batchStatus, execution, showExecutionStatus }) {
919
+ const command = getCommandText(call);
920
+ const args = getArgEntries(call);
921
+ const toolType = call.toolType || "OPENFRAME";
922
+ const { innerRef, containerStyle } = useCollapsible({ expanded });
923
+ const result = execution?.status === "done" ? execution.result : void 0;
924
+ const hasExpandableBody = args.length > 0 || typeof result === "string" && result.length > 0;
925
+ return /* @__PURE__ */ jsxs4("div", { className: "flex w-full flex-col items-start border-b border-ods-border bg-ods-card last:border-b-0", children: [
926
+ /* @__PURE__ */ jsxs4(
927
+ "button",
928
+ {
929
+ type: "button",
930
+ onClick: onToggle,
931
+ className: "flex w-full cursor-pointer items-start gap-[var(--spacing-system-xsf)] p-[var(--spacing-system-sf)] text-left",
932
+ children: [
933
+ /* @__PURE__ */ jsx6("div", { className: "flex h-5 w-5 shrink-0 items-center justify-center text-ods-text-secondary", children: /* @__PURE__ */ jsx6(ToolIcon, { toolType, size: 16 }) }),
934
+ /* @__PURE__ */ jsx6(
935
+ "div",
936
+ {
937
+ className: cn(
938
+ "min-w-0 flex-1 text-h6",
939
+ expanded ? "whitespace-pre-wrap break-all text-ods-text-primary" : "line-clamp-2 max-h-10 break-all text-ods-text-secondary"
940
+ ),
941
+ children: command
942
+ }
943
+ ),
944
+ showExecutionStatus && /* @__PURE__ */ jsx6("div", { className: "flex h-5 w-5 shrink-0 items-center justify-center", children: /* @__PURE__ */ jsx6(ExecutionStatusIcon, { batchStatus, execution }) }),
945
+ /* @__PURE__ */ jsx6("div", { className: "flex h-5 w-5 shrink-0 items-center justify-center", children: /* @__PURE__ */ jsx6(ExpandChevron, { expanded }) })
946
+ ]
947
+ }
948
+ ),
949
+ /* @__PURE__ */ jsx6("div", { className: "w-full", style: containerStyle, children: /* @__PURE__ */ jsx6("div", { ref: innerRef, children: hasExpandableBody && /* @__PURE__ */ jsxs4("div", { className: "flex w-full flex-col items-start gap-0 bg-ods-card px-[var(--spacing-system-sf)] pb-[var(--spacing-system-sf)] text-h6", children: [
950
+ args.map(([key, value]) => /* @__PURE__ */ jsx6(ArgRow, { argKey: key, value }, key)),
951
+ result && /* @__PURE__ */ jsx6(
952
+ ResultBlock,
953
+ {
954
+ result,
955
+ className: args.length > 0 ? "mt-[var(--spacing-system-xsf)]" : void 0
956
+ }
957
+ )
958
+ ] }) }) })
959
+ ] });
960
+ }
961
+ var ApprovalBatchMessage = forwardRef(
962
+ ({
963
+ className,
964
+ data,
965
+ onApprove,
966
+ onReject,
967
+ status = "pending",
968
+ maxBodyHeight,
969
+ resolvedByName,
970
+ showExecutionStatus = true,
971
+ assistantType: _assistantType,
972
+ variant = "admin",
973
+ showFooterActions = true,
974
+ ...props
975
+ }, ref) => {
976
+ const [expandedId, setExpandedId] = useState2(null);
977
+ const [isProcessing, setIsProcessing] = useState2(false);
978
+ const isClient = variant === "client";
979
+ const explanations = data.toolCalls.map((c) => c.toolExplanation?.trim()).filter((s) => !!s);
980
+ const handleApprove = async () => {
981
+ setIsProcessing(true);
982
+ try {
983
+ await onApprove?.(data.approvalRequestId);
984
+ } finally {
985
+ setIsProcessing(false);
986
+ }
987
+ };
988
+ const handleReject = async () => {
989
+ setIsProcessing(true);
990
+ try {
991
+ await onReject?.(data.approvalRequestId);
992
+ } finally {
993
+ setIsProcessing(false);
994
+ }
995
+ };
996
+ const actionButtons = /* @__PURE__ */ jsxs4(Fragment, { children: [
997
+ /* @__PURE__ */ jsx6(
998
+ Button,
999
+ {
1000
+ size: "small-legacy",
1001
+ variant: "accent",
1002
+ onClick: handleApprove,
1003
+ disabled: isProcessing,
1004
+ className: cn(
1005
+ "bg-ods-accent hover:bg-ods-accent/90",
1006
+ "text-ods-bg text-h5",
1007
+ "h-8 px-[var(--spacing-system-xsf)]"
1008
+ ),
1009
+ children: "Approve"
1010
+ }
1011
+ ),
1012
+ /* @__PURE__ */ jsx6(
1013
+ Button,
1014
+ {
1015
+ size: "small-legacy",
1016
+ variant: "outline",
1017
+ onClick: handleReject,
1018
+ disabled: isProcessing,
1019
+ className: cn(
1020
+ "border-ods-border bg-ods-card",
1021
+ "text-ods-text-primary text-h5",
1022
+ "h-8 px-[var(--spacing-system-xsf)] hover:bg-ods-bg"
1023
+ ),
1024
+ children: "Reject"
1025
+ }
1026
+ )
1027
+ ] });
1028
+ if (isClient) {
1029
+ const titles = data.toolCalls.map((c) => c.toolExplanation?.trim() || c.toolTitle?.trim()).filter((s) => !!s);
1030
+ return /* @__PURE__ */ jsxs4("div", { ref, className: cn("mb-[var(--spacing-system-xsf)]", CHAT_BLOCK_CLASS, className), ...props, children: [
1031
+ titles.length > 0 ? titles.map((title, i) => /* @__PURE__ */ jsx6("p", { className: "w-full whitespace-pre-line break-words text-ods-text-primary text-h4", children: title }, i)) : /* @__PURE__ */ jsx6("p", { className: "w-full text-ods-text-primary text-h4", children: "Approval required" }),
1032
+ showFooterActions && status === "pending" && /* @__PURE__ */ jsx6(ApprovalWaitingLine, {}),
1033
+ showFooterActions && (status === "pending" ? /* @__PURE__ */ jsx6("div", { className: "flex w-full items-center gap-[var(--spacing-system-xsf)]", children: actionButtons }) : /* @__PURE__ */ jsx6("div", { className: "flex w-full", children: /* @__PURE__ */ jsx6(ApprovalStatusTag, { status, resolvedByName, inlineResolver: true }) }))
1034
+ ] });
1035
+ }
1036
+ const showFooterBlock = explanations.length > 0 || showFooterActions;
1037
+ return /* @__PURE__ */ jsxs4(
1038
+ "div",
1039
+ {
1040
+ ref,
1041
+ className: cn(
1042
+ "mb-[var(--spacing-system-xsf)] flex flex-col overflow-hidden",
1043
+ CHAT_BLOCK_FRAME_CLASS,
1044
+ className
1045
+ ),
1046
+ ...props,
1047
+ children: [
1048
+ /* @__PURE__ */ jsx6(
1049
+ "div",
1050
+ {
1051
+ className: cn("flex flex-col", maxBodyHeight != null && "overflow-y-auto overscroll-contain"),
1052
+ style: maxBodyHeight != null ? { maxHeight: maxBodyHeight } : void 0,
1053
+ children: data.toolCalls.map((call) => /* @__PURE__ */ jsx6(
1054
+ ToolCallRow,
1055
+ {
1056
+ call,
1057
+ expanded: expandedId === call.toolExecutionRequestId,
1058
+ onToggle: () => setExpandedId((prev) => prev === call.toolExecutionRequestId ? null : call.toolExecutionRequestId),
1059
+ batchStatus: status,
1060
+ execution: data.executions?.[call.toolExecutionRequestId],
1061
+ showExecutionStatus
1062
+ },
1063
+ call.toolExecutionRequestId
1064
+ ))
1065
+ }
1066
+ ),
1067
+ showFooterBlock && /* @__PURE__ */ jsxs4("div", { className: "flex flex-col items-start justify-center gap-[var(--spacing-system-xsf)] border-t border-ods-border p-[var(--spacing-system-sf)]", children: [
1068
+ explanations.length > 0 && /* @__PURE__ */ jsx6("ul", { className: "w-full list-disc pl-5 text-ods-text-primary text-h6", children: explanations.map((expl, i) => /* @__PURE__ */ jsx6("li", { children: expl }, i)) }),
1069
+ showFooterActions && status === "pending" && /* @__PURE__ */ jsx6(ApprovalWaitingLine, {}),
1070
+ showFooterActions && (status === "pending" ? /* @__PURE__ */ jsx6("div", { className: "flex items-center gap-[var(--spacing-system-xsf)]", children: actionButtons }) : /* @__PURE__ */ jsxs4("div", { className: "flex items-center gap-[var(--spacing-system-xsf)]", children: [
1071
+ /* @__PURE__ */ jsx6(ApprovalStatusTag, { status, resolvedByName }),
1072
+ resolvedByName && /* @__PURE__ */ jsxs4("span", { className: "text-ods-text-secondary text-h6", children: [
1073
+ "by ",
1074
+ resolvedByName
1075
+ ] })
1076
+ ] }))
1077
+ ] })
1078
+ ]
1079
+ }
1080
+ );
1081
+ }
1082
+ );
1083
+ ApprovalBatchMessage.displayName = "ApprovalBatchMessage";
1084
+
1085
+ export {
1086
+ formatTicketRelativeTime,
1087
+ formatTicketFullTimestamp,
1088
+ formatRelativeTime,
1089
+ formatRelativeTimeFrom,
1090
+ formatAbsoluteDate,
1091
+ formatDateTime,
1092
+ getDetailedTimeDifference,
1093
+ isToday,
1094
+ isWithinMinutes,
1095
+ createUTCTimestamp,
1096
+ DESIGN_PALETTE,
1097
+ getContrastRatio,
1098
+ pickReadableTextColor,
1099
+ extractDominantColor,
1100
+ getBestContrastColor,
1101
+ analyzeImageColor,
1102
+ extractImageEdgeColorAsync,
1103
+ getCurrentPlatform,
1104
+ switchPlatformTheme,
1105
+ getSemanticColor,
1106
+ getPlatformConfig,
1107
+ usePlatformColors,
1108
+ getReadableTextColor,
1109
+ HEX_PATTERN,
1110
+ hexToRgb2 as hexToRgb,
1111
+ rgbToHex,
1112
+ deriveHoverColor,
1113
+ deriveActiveColor,
1114
+ rgbToHsl,
1115
+ hslToRgb,
1116
+ ColorSwatch,
1117
+ resolveTicketStatus,
1118
+ getTicketStatusConfig,
1119
+ getTicketStatusTag,
1120
+ kindToCanonicalStatus,
1121
+ usesCanonicalStatusStyle,
1122
+ resolveStatusTagProps,
1123
+ TicketStatusTag,
1124
+ StatusLine,
1125
+ CHAT_BLOCK_FRAME_CLASS,
1126
+ CHAT_BLOCK_CLASS,
1127
+ ExpandChevron,
1128
+ useCollapsible,
1129
+ COMMAND_BODY_ARG_KEYS,
1130
+ getCommandText,
1131
+ ArgRow,
1132
+ ResultBlock,
1133
+ CommandBlock,
1134
+ ApprovalStatusTag,
1135
+ ApprovalWaitingLine,
1136
+ ApprovalBatchMessage
1137
+ };