@hotmeshio/long-tail 0.10.2 → 0.10.4

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 (397) hide show
  1. package/README.md +1 -0
  2. package/build/api/bot-accounts.d.ts +4 -0
  3. package/build/api/bot-accounts.js +3 -1
  4. package/build/api/escalations/metadata.js +21 -1
  5. package/build/api/escalations/resolve.d.ts +8 -0
  6. package/build/api/escalations/resolve.js +82 -3
  7. package/build/api/roles.d.ts +2 -0
  8. package/build/api/roles.js +4 -0
  9. package/build/bin/ltc.js +10 -1
  10. package/build/index.js +7 -1
  11. package/build/lib/cli/client.d.ts +4 -1
  12. package/build/lib/cli/client.js +4 -2
  13. package/build/lib/db/schemas/023_role_enforce_schema.sql +18 -0
  14. package/build/lib/typed-resolution.d.ts +35 -0
  15. package/build/lib/typed-resolution.js +37 -0
  16. package/build/modules/branding.d.ts +21 -2
  17. package/build/modules/branding.js +22 -1
  18. package/build/modules/config.d.ts +1 -0
  19. package/build/modules/config.js +5 -0
  20. package/build/routes/bot-accounts.js +3 -1
  21. package/build/routes/settings.js +21 -0
  22. package/build/sdk/index.d.ts +4 -0
  23. package/build/sdk/index.js +14 -0
  24. package/build/services/escalation/crud.d.ts +18 -6
  25. package/build/services/escalation/crud.js +18 -2
  26. package/build/services/escalation/index.d.ts +1 -0
  27. package/build/services/escalation/index.js +1 -0
  28. package/build/services/escalation/resolver-validation.d.ts +28 -0
  29. package/build/services/escalation/resolver-validation.js +95 -0
  30. package/build/services/escalation/sql.d.ts +12 -2
  31. package/build/services/escalation/sql.js +22 -2
  32. package/build/services/iam/bots.d.ts +4 -1
  33. package/build/services/iam/bots.js +5 -3
  34. package/build/services/iam/sql.d.ts +2 -2
  35. package/build/services/iam/sql.js +15 -1
  36. package/build/services/role/enforcement-cache.d.ts +21 -0
  37. package/build/services/role/enforcement-cache.js +0 -0
  38. package/build/services/role/index.js +5 -0
  39. package/build/services/role/sql.d.ts +12 -2
  40. package/build/services/role/sql.js +15 -2
  41. package/build/services/role/types.d.ts +9 -0
  42. package/build/shared/form-validation/derive-field-label.d.ts +14 -0
  43. package/build/shared/form-validation/derive-field-label.js +31 -0
  44. package/build/shared/form-validation/field-validator.d.ts +45 -0
  45. package/build/shared/form-validation/field-validator.js +214 -0
  46. package/build/shared/form-validation/index.d.ts +12 -0
  47. package/build/shared/form-validation/index.js +28 -0
  48. package/build/shared/form-validation/validate-resolver-payload.d.ts +41 -0
  49. package/build/shared/form-validation/validate-resolver-payload.js +62 -0
  50. package/build/shared/form-validation/x-lt-bind.d.ts +41 -0
  51. package/build/shared/form-validation/x-lt-bind.js +110 -0
  52. package/build/shared/form-validation/x-lt-help.d.ts +21 -0
  53. package/build/shared/form-validation/x-lt-help.js +91 -0
  54. package/build/shared/form-validation/x-lt-show-if.d.ts +7 -0
  55. package/build/shared/form-validation/x-lt-show-if.js +84 -0
  56. package/build/system/mcp-servers/admin/schemas.d.ts +3 -0
  57. package/build/system/mcp-servers/admin/schemas.js +1 -0
  58. package/build/system/mcp-servers/admin/users.js +3 -1
  59. package/build/system/mcp-servers/human-queue-schemas.d.ts +4 -4
  60. package/build/system/mcp-servers/human-queue-schemas.js +4 -1
  61. package/build/system/mcp-servers/human-queue.js +41 -2
  62. package/build/tsconfig.tsbuildinfo +1 -1
  63. package/build/types/sdk.d.ts +6 -1
  64. package/build/types/startup.d.ts +26 -0
  65. package/build/types/validation.d.ts +43 -0
  66. package/build/types/validation.js +28 -0
  67. package/dashboard/dist/assets/{AdminDashboard-Dy031e9g.js → AdminDashboard-Cma2NGsF.js} +2 -2
  68. package/dashboard/dist/assets/{AdminDashboard-Dy031e9g.js.map → AdminDashboard-Cma2NGsF.js.map} +1 -1
  69. package/dashboard/dist/assets/AgentConfigPage-CbIhM-fa.js +16 -0
  70. package/dashboard/dist/assets/AgentConfigPage-CbIhM-fa.js.map +1 -0
  71. package/dashboard/dist/assets/AgentDetailPage-DuLEKzRT.js +4 -0
  72. package/dashboard/dist/assets/AgentDetailPage-DuLEKzRT.js.map +1 -0
  73. package/dashboard/dist/assets/AgentsPage-DZO9i7Nl.js +2 -0
  74. package/dashboard/dist/assets/AgentsPage-DZO9i7Nl.js.map +1 -0
  75. package/dashboard/dist/assets/AvailableEscalationsPage-DlVoNd8B.js +2 -0
  76. package/dashboard/dist/assets/AvailableEscalationsPage-DlVoNd8B.js.map +1 -0
  77. package/dashboard/dist/assets/{BotPicker-2QEIpc-K.js → BotPicker-CidlGr6f.js} +2 -2
  78. package/dashboard/dist/assets/{BotPicker-2QEIpc-K.js.map → BotPicker-CidlGr6f.js.map} +1 -1
  79. package/dashboard/dist/assets/CapabilitiesPage-BMNNTa0D.js +2 -0
  80. package/dashboard/dist/assets/{CapabilitiesPage-lQJGZ_-t.js.map → CapabilitiesPage-BMNNTa0D.js.map} +1 -1
  81. package/dashboard/dist/assets/{CollapsibleSection-CHWP0WI6.js → CollapsibleSection-W9F9lziT.js} +2 -2
  82. package/dashboard/dist/assets/{CollapsibleSection-CHWP0WI6.js.map → CollapsibleSection-W9F9lziT.js.map} +1 -1
  83. package/dashboard/dist/assets/ConfirmDeleteModal-BUh-Dzba.js +2 -0
  84. package/dashboard/dist/assets/{ConfirmDeleteModal-C0x0HcHX.js.map → ConfirmDeleteModal-BUh-Dzba.js.map} +1 -1
  85. package/dashboard/dist/assets/{CopyableId-uot2mE_g.js → CopyableId-B1mxKfVb.js} +2 -2
  86. package/dashboard/dist/assets/{CopyableId-uot2mE_g.js.map → CopyableId-B1mxKfVb.js.map} +1 -1
  87. package/dashboard/dist/assets/CountdownTimer-lkv_7msa.js +2 -0
  88. package/dashboard/dist/assets/{CountdownTimer-TXsRlTU4.js.map → CountdownTimer-lkv_7msa.js.map} +1 -1
  89. package/dashboard/dist/assets/{CredentialsPage-BKxS-1sA.js → CredentialsPage-DyOgfnPB.js} +2 -2
  90. package/dashboard/dist/assets/CredentialsPage-DyOgfnPB.js.map +1 -0
  91. package/dashboard/dist/assets/{CronLabel-Bd2G0Rap.js → CronLabel-geum95dj.js} +2 -2
  92. package/dashboard/dist/assets/{CronLabel-Bd2G0Rap.js.map → CronLabel-geum95dj.js.map} +1 -1
  93. package/dashboard/dist/assets/CustomDurationPicker-ClufO2ew.js +2 -0
  94. package/dashboard/dist/assets/CustomDurationPicker-ClufO2ew.js.map +1 -0
  95. package/dashboard/dist/assets/DataTable-BTu2AaEl.js +2 -0
  96. package/dashboard/dist/assets/DataTable-BTu2AaEl.js.map +1 -0
  97. package/dashboard/dist/assets/{DropZone-DNDEgMpJ.js → DropZone-C3hOjJtC.js} +2 -2
  98. package/dashboard/dist/assets/{DropZone-DNDEgMpJ.js.map → DropZone-C3hOjJtC.js.map} +1 -1
  99. package/dashboard/dist/assets/{ElapsedCell-g7GO7f8L.js → ElapsedCell-DFOW9T4b.js} +2 -2
  100. package/dashboard/dist/assets/{ElapsedCell-g7GO7f8L.js.map → ElapsedCell-DFOW9T4b.js.map} +1 -1
  101. package/dashboard/dist/assets/EscalationListSchemaPage-_IhqXIQu.js +20 -0
  102. package/dashboard/dist/assets/EscalationListSchemaPage-_IhqXIQu.js.map +1 -0
  103. package/dashboard/dist/assets/EscalationSchemaPage-BCC7iscN.js +9 -0
  104. package/dashboard/dist/assets/EscalationSchemaPage-BCC7iscN.js.map +1 -0
  105. package/dashboard/dist/assets/EscalationsOverview-CvIdOtoP.js +2 -0
  106. package/dashboard/dist/assets/EscalationsOverview-CvIdOtoP.js.map +1 -0
  107. package/dashboard/dist/assets/EventTable-DJWJ7J0m.js +2 -0
  108. package/dashboard/dist/assets/EventTable-DJWJ7J0m.js.map +1 -0
  109. package/dashboard/dist/assets/FilterBar-BR3ztZ8y.js +2 -0
  110. package/dashboard/dist/assets/FilterBar-BR3ztZ8y.js.map +1 -0
  111. package/dashboard/dist/assets/GraphInvokePage-Cwn-8Glr.js +2 -0
  112. package/dashboard/dist/assets/GraphInvokePage-Cwn-8Glr.js.map +1 -0
  113. package/dashboard/dist/assets/HomePage-D8RVntg0.js +2 -0
  114. package/dashboard/dist/assets/HomePage-D8RVntg0.js.map +1 -0
  115. package/dashboard/dist/assets/ListToolbar-DuoEdVtK.js +2 -0
  116. package/dashboard/dist/assets/ListToolbar-DuoEdVtK.js.map +1 -0
  117. package/dashboard/dist/assets/McpOverview-NXKsGiWU.js +2 -0
  118. package/dashboard/dist/assets/McpOverview-NXKsGiWU.js.map +1 -0
  119. package/dashboard/dist/assets/McpQueryDetailPage-BC-iXfIx.js +5 -0
  120. package/dashboard/dist/assets/McpQueryDetailPage-BC-iXfIx.js.map +1 -0
  121. package/dashboard/dist/assets/{McpQueryPage-CsKNXUhb.js → McpQueryPage-BPJmFYOY.js} +2 -2
  122. package/dashboard/dist/assets/{McpQueryPage-CsKNXUhb.js.map → McpQueryPage-BPJmFYOY.js.map} +1 -1
  123. package/dashboard/dist/assets/McpRunDetailPage-B49nUXEl.js +2 -0
  124. package/dashboard/dist/assets/McpRunDetailPage-B49nUXEl.js.map +1 -0
  125. package/dashboard/dist/assets/McpRunsPage-Ce_XIYpP.js +2 -0
  126. package/dashboard/dist/assets/McpRunsPage-Ce_XIYpP.js.map +1 -0
  127. package/dashboard/dist/assets/NamespacePill-LWvZXt_g.js +2 -0
  128. package/dashboard/dist/assets/NamespacePill-LWvZXt_g.js.map +1 -0
  129. package/dashboard/dist/assets/OperationsPage-DI7AQO9f.js +2 -0
  130. package/dashboard/dist/assets/OperationsPage-DI7AQO9f.js.map +1 -0
  131. package/dashboard/dist/assets/OperatorDashboard-DpXjhs-3.js +2 -0
  132. package/dashboard/dist/assets/{OperatorDashboard-_axS17fp.js.map → OperatorDashboard-DpXjhs-3.js.map} +1 -1
  133. package/dashboard/dist/assets/PageHeader-DvEmMMP6.js +2 -0
  134. package/dashboard/dist/assets/PageHeader-DvEmMMP6.js.map +1 -0
  135. package/dashboard/dist/assets/PageHeaderWithStats-X0eAmu-x.js +2 -0
  136. package/dashboard/dist/assets/PageHeaderWithStats-X0eAmu-x.js.map +1 -0
  137. package/dashboard/dist/assets/{PriorityBadge-B4ykBH7f.js → PriorityBadge-CCERr9vQ.js} +2 -2
  138. package/dashboard/dist/assets/PriorityBadge-CCERr9vQ.js.map +1 -0
  139. package/dashboard/dist/assets/ProcessDetailPage-DpYSMRj1.js +2 -0
  140. package/dashboard/dist/assets/ProcessDetailPage-DpYSMRj1.js.map +1 -0
  141. package/dashboard/dist/assets/{ProcessesListPage-CoQEi_Su.js → ProcessesListPage-CQ9tSw7U.js} +2 -2
  142. package/dashboard/dist/assets/{ProcessesListPage-CoQEi_Su.js.map → ProcessesListPage-CQ9tSw7U.js.map} +1 -1
  143. package/dashboard/dist/assets/RoleDetailPage-DKeQKDkW.js +8 -0
  144. package/dashboard/dist/assets/RoleDetailPage-DKeQKDkW.js.map +1 -0
  145. package/dashboard/dist/assets/RolePill-CWhoLwef.js +2 -0
  146. package/dashboard/dist/assets/RolePill-CWhoLwef.js.map +1 -0
  147. package/dashboard/dist/assets/RolesPage-D-6kIact.js +2 -0
  148. package/dashboard/dist/assets/RolesPage-D-6kIact.js.map +1 -0
  149. package/dashboard/dist/assets/RunAsSelector-DzYcpQTm.js +2 -0
  150. package/dashboard/dist/assets/RunAsSelector-DzYcpQTm.js.map +1 -0
  151. package/dashboard/dist/assets/StatCard-DBANWIss.js +2 -0
  152. package/dashboard/dist/assets/StatCard-DBANWIss.js.map +1 -0
  153. package/dashboard/dist/assets/StatusBadge-BbqghFMi.js +2 -0
  154. package/dashboard/dist/assets/StatusBadge-BbqghFMi.js.map +1 -0
  155. package/dashboard/dist/assets/{StickyPagination-Cd83AHd_.js → StickyPagination-BTGfmGV3.js} +2 -2
  156. package/dashboard/dist/assets/{StickyPagination-Cd83AHd_.js.map → StickyPagination-BTGfmGV3.js.map} +1 -1
  157. package/dashboard/dist/assets/StreamMessageDetail-DqRpzA_6.js +2 -0
  158. package/dashboard/dist/assets/StreamMessageDetail-DqRpzA_6.js.map +1 -0
  159. package/dashboard/dist/assets/SwimlaneTimeline-CA106TYo.js +2 -0
  160. package/dashboard/dist/assets/SwimlaneTimeline-CA106TYo.js.map +1 -0
  161. package/dashboard/dist/assets/TagInput-CoR4MzsW.js +2 -0
  162. package/dashboard/dist/assets/TagInput-CoR4MzsW.js.map +1 -0
  163. package/dashboard/dist/assets/{TaskDetailPage-DnjhW7qv.js → TaskDetailPage-BRg-w2Ev.js} +2 -2
  164. package/dashboard/dist/assets/{TaskDetailPage-DnjhW7qv.js.map → TaskDetailPage-BRg-w2Ev.js.map} +1 -1
  165. package/dashboard/dist/assets/TaskQueuePill-Dw3YN8M-.js +2 -0
  166. package/dashboard/dist/assets/TaskQueuePill-Dw3YN8M-.js.map +1 -0
  167. package/dashboard/dist/assets/{TasksListPage-DySfZFgs.js → TasksListPage-kB_j9G8o.js} +2 -2
  168. package/dashboard/dist/assets/{TasksListPage-DySfZFgs.js.map → TasksListPage-kB_j9G8o.js.map} +1 -1
  169. package/dashboard/dist/assets/{TimeAgo-BKOl-7Tt.js → TimeAgo-D7dSIY7-.js} +2 -2
  170. package/dashboard/dist/assets/{TimeAgo-BKOl-7Tt.js.map → TimeAgo-D7dSIY7-.js.map} +1 -1
  171. package/dashboard/dist/assets/TimestampCell-BZe6bx18.js +2 -0
  172. package/dashboard/dist/assets/TimestampCell-BZe6bx18.js.map +1 -0
  173. package/dashboard/dist/assets/ToolPill-xX-buQtY.js +2 -0
  174. package/dashboard/dist/assets/ToolPill-xX-buQtY.js.map +1 -0
  175. package/dashboard/dist/assets/ToolTestPanel-U3NaF_T_.js +2 -0
  176. package/dashboard/dist/assets/ToolTestPanel-U3NaF_T_.js.map +1 -0
  177. package/dashboard/dist/assets/TopicDetailPage-BpALvXP1.js +9 -0
  178. package/dashboard/dist/assets/TopicDetailPage-BpALvXP1.js.map +1 -0
  179. package/dashboard/dist/assets/TopicsPage-Cy3chaca.js +2 -0
  180. package/dashboard/dist/assets/{TopicsPage-5yW63ELl.js.map → TopicsPage-Cy3chaca.js.map} +1 -1
  181. package/dashboard/dist/assets/{UserName-DcXhOSVm.js → UserName-VXM1oHMC.js} +2 -2
  182. package/dashboard/dist/assets/{UserName-DcXhOSVm.js.map → UserName-VXM1oHMC.js.map} +1 -1
  183. package/dashboard/dist/assets/WorkflowExecutionPage-BCq2cR1V.js +2 -0
  184. package/dashboard/dist/assets/WorkflowExecutionPage-BCq2cR1V.js.map +1 -0
  185. package/dashboard/dist/assets/WorkflowPill-CQ1AmhlC.js +2 -0
  186. package/dashboard/dist/assets/WorkflowPill-CQ1AmhlC.js.map +1 -0
  187. package/dashboard/dist/assets/{WorkflowsDashboard-C0Bbrd5M.js → WorkflowsDashboard-BbM69MnB.js} +2 -2
  188. package/dashboard/dist/assets/{WorkflowsDashboard-C0Bbrd5M.js.map → WorkflowsDashboard-BbM69MnB.js.map} +1 -1
  189. package/dashboard/dist/assets/WorkflowsOverview-D5HthpAW.js +2 -0
  190. package/dashboard/dist/assets/WorkflowsOverview-D5HthpAW.js.map +1 -0
  191. package/dashboard/dist/assets/{YamlWorkflowDetailPage-BcbrYhDI.js → YamlWorkflowDetailPage-CDDVMYWi.js} +10 -10
  192. package/dashboard/dist/assets/{YamlWorkflowDetailPage-BcbrYhDI.js.map → YamlWorkflowDetailPage-CDDVMYWi.js.map} +1 -1
  193. package/dashboard/dist/assets/YamlWorkflowsPage-FFjWwydj.js +2 -0
  194. package/dashboard/dist/assets/YamlWorkflowsPage-FFjWwydj.js.map +1 -0
  195. package/dashboard/dist/assets/{agents-CopQ3t5o.js → agents-BwiSNu73.js} +2 -2
  196. package/dashboard/dist/assets/{agents-CopQ3t5o.js.map → agents-BwiSNu73.js.map} +1 -1
  197. package/dashboard/dist/assets/bots-ClgSrxel.js +2 -0
  198. package/dashboard/dist/assets/bots-ClgSrxel.js.map +1 -0
  199. package/dashboard/dist/assets/{capabilities-5JRieYUy.js → capabilities-JUaKsby4.js} +2 -2
  200. package/dashboard/dist/assets/{capabilities-5JRieYUy.js.map → capabilities-JUaKsby4.js.map} +1 -1
  201. package/dashboard/dist/assets/{controlplane-B4rT6tIw.js → controlplane-CuTQ7eUE.js} +2 -2
  202. package/dashboard/dist/assets/{controlplane-B4rT6tIw.js.map → controlplane-CuTQ7eUE.js.map} +1 -1
  203. package/dashboard/dist/assets/escalation-columns-CS0c7cAr.js +2 -0
  204. package/dashboard/dist/assets/escalation-columns-CS0c7cAr.js.map +1 -0
  205. package/dashboard/dist/assets/index-BBA4AxmL.js +2 -0
  206. package/dashboard/dist/assets/index-BBA4AxmL.js.map +1 -0
  207. package/dashboard/dist/assets/index-C-8xXyvr.js +63 -0
  208. package/dashboard/dist/assets/index-C-8xXyvr.js.map +1 -0
  209. package/dashboard/dist/assets/index-C1t0YIXC.js +5 -0
  210. package/dashboard/dist/assets/index-C1t0YIXC.js.map +1 -0
  211. package/dashboard/dist/assets/index-C9o2UNhC.js +2 -0
  212. package/dashboard/dist/assets/index-C9o2UNhC.js.map +1 -0
  213. package/dashboard/dist/assets/index-CBj-vstO.js +2 -0
  214. package/dashboard/dist/assets/{index-Dd1RxGNw.js.map → index-CBj-vstO.js.map} +1 -1
  215. package/dashboard/dist/assets/index-CUguKMXZ.js +2 -0
  216. package/dashboard/dist/assets/index-CUguKMXZ.js.map +1 -0
  217. package/dashboard/dist/assets/index-Cavwd8UU.js +6 -0
  218. package/dashboard/dist/assets/index-Cavwd8UU.js.map +1 -0
  219. package/dashboard/dist/assets/index-CnsPBTXL.js +2 -0
  220. package/dashboard/dist/assets/index-CnsPBTXL.js.map +1 -0
  221. package/dashboard/dist/assets/index-CoPWHo_H.js +2 -0
  222. package/dashboard/dist/assets/index-CoPWHo_H.js.map +1 -0
  223. package/dashboard/dist/assets/index-CwQVaa7x.js +2 -0
  224. package/dashboard/dist/assets/index-CwQVaa7x.js.map +1 -0
  225. package/dashboard/dist/assets/index-DSa-6Ux8.js +2 -0
  226. package/dashboard/dist/assets/index-DSa-6Ux8.js.map +1 -0
  227. package/dashboard/dist/assets/index-DeMs_aBT.css +1 -0
  228. package/dashboard/dist/assets/index-Ikj_NTuy.js +5 -0
  229. package/dashboard/dist/assets/index-Ikj_NTuy.js.map +1 -0
  230. package/dashboard/dist/assets/index-Xd1jcHe7.js +2 -0
  231. package/dashboard/dist/assets/index-Xd1jcHe7.js.map +1 -0
  232. package/dashboard/dist/assets/{knowledge-B9bmoXOe.js → knowledge-BHBt-6kW.js} +2 -2
  233. package/dashboard/dist/assets/{knowledge-B9bmoXOe.js.map → knowledge-BHBt-6kW.js.map} +1 -1
  234. package/dashboard/dist/assets/{mcp-DYMFBOFz.js → mcp-CBcz4BCS.js} +2 -2
  235. package/dashboard/dist/assets/{mcp-DYMFBOFz.js.map → mcp-CBcz4BCS.js.map} +1 -1
  236. package/dashboard/dist/assets/{mcp-query-wloSpyPM.js → mcp-query-C4fKTOYo.js} +2 -2
  237. package/dashboard/dist/assets/{mcp-query-wloSpyPM.js.map → mcp-query-C4fKTOYo.js.map} +1 -1
  238. package/dashboard/dist/assets/{pipelines-DBXX6TEi.js → pipelines-CmAAH3B6.js} +2 -2
  239. package/dashboard/dist/assets/{pipelines-DBXX6TEi.js.map → pipelines-CmAAH3B6.js.map} +1 -1
  240. package/dashboard/dist/assets/role-display-Dvo2lDpU.js +2 -0
  241. package/dashboard/dist/assets/role-display-Dvo2lDpU.js.map +1 -0
  242. package/dashboard/dist/assets/task-queues-7-sHKPsN.js +2 -0
  243. package/dashboard/dist/assets/task-queues-7-sHKPsN.js.map +1 -0
  244. package/dashboard/dist/assets/{tasks-CD3-C7tP.js → tasks-BAEsqcz2.js} +2 -2
  245. package/dashboard/dist/assets/{tasks-CD3-C7tP.js.map → tasks-BAEsqcz2.js.map} +1 -1
  246. package/dashboard/dist/assets/{topics-D8pKi6zA.js → topics-CY0pJ6_o.js} +2 -2
  247. package/dashboard/dist/assets/{topics-D8pKi6zA.js.map → topics-CY0pJ6_o.js.map} +1 -1
  248. package/dashboard/dist/assets/{useEventHooks-DV9pLDOW.js → useEventHooks-BlpwRvHO.js} +2 -2
  249. package/dashboard/dist/assets/{useEventHooks-DV9pLDOW.js.map → useEventHooks-BlpwRvHO.js.map} +1 -1
  250. package/dashboard/dist/assets/{useNamespace-DykYhZY9.js → useNamespace-CoNUlZ6Z.js} +2 -2
  251. package/dashboard/dist/assets/{useNamespace-DykYhZY9.js.map → useNamespace-CoNUlZ6Z.js.map} +1 -1
  252. package/dashboard/dist/assets/{useYamlActivityEvents-By044UAv.js → useYamlActivityEvents-8GUn5Wie.js} +2 -2
  253. package/dashboard/dist/assets/{useYamlActivityEvents-By044UAv.js.map → useYamlActivityEvents-8GUn5Wie.js.map} +1 -1
  254. package/dashboard/dist/assets/{users-mI9goDjj.js → users-uGtDRGxR.js} +2 -2
  255. package/dashboard/dist/assets/{users-mI9goDjj.js.map → users-uGtDRGxR.js.map} +1 -1
  256. package/dashboard/dist/assets/{vendor-icons-ihWGa7_d.js → vendor-icons-DKCAtTJ9.js} +135 -130
  257. package/dashboard/dist/assets/vendor-icons-DKCAtTJ9.js.map +1 -0
  258. package/dashboard/dist/assets/{workflows-DCUilz68.js → workflows-DoX-AtHN.js} +2 -2
  259. package/dashboard/dist/assets/{workflows-DCUilz68.js.map → workflows-DoX-AtHN.js.map} +1 -1
  260. package/dashboard/dist/assets/{yaml-workflows-DWNMP1PT.js → yaml-workflows-DM3jVem2.js} +2 -2
  261. package/dashboard/dist/assets/{yaml-workflows-DWNMP1PT.js.map → yaml-workflows-DM3jVem2.js.map} +1 -1
  262. package/dashboard/dist/index.html +3 -3
  263. package/docs/api/http/escalations.md +15 -1
  264. package/docs/api/http/roles.md +2 -0
  265. package/docs/design-principles.md +234 -0
  266. package/docs/hitl/design.md +228 -0
  267. package/docs/hitl/form.md +21 -1
  268. package/docs/hitl/iframe.md +1 -1
  269. package/docs/hitl/x-lt-display.md +56 -0
  270. package/docs/hitl/x-lt-layout.md +20 -1
  271. package/docs/hitl/x-lt-list-schema.md +8 -1
  272. package/docs/hitl/x-lt-widget.md +23 -0
  273. package/docs/hitl-guide.md +4 -2
  274. package/docs/schema-enforcement.md +149 -0
  275. package/package.json +1 -1
  276. package/dashboard/dist/assets/AgentConfigPage-CqmtYBbC.js +0 -16
  277. package/dashboard/dist/assets/AgentConfigPage-CqmtYBbC.js.map +0 -1
  278. package/dashboard/dist/assets/AgentDetailPage-oYLBrN74.js +0 -4
  279. package/dashboard/dist/assets/AgentDetailPage-oYLBrN74.js.map +0 -1
  280. package/dashboard/dist/assets/AgentsPage-CHczRx5N.js +0 -2
  281. package/dashboard/dist/assets/AgentsPage-CHczRx5N.js.map +0 -1
  282. package/dashboard/dist/assets/AvailableEscalationsPage-DDVuivEE.js +0 -2
  283. package/dashboard/dist/assets/AvailableEscalationsPage-DDVuivEE.js.map +0 -1
  284. package/dashboard/dist/assets/CapabilitiesPage-lQJGZ_-t.js +0 -2
  285. package/dashboard/dist/assets/ConfirmDeleteModal-C0x0HcHX.js +0 -2
  286. package/dashboard/dist/assets/CountdownTimer-TXsRlTU4.js +0 -2
  287. package/dashboard/dist/assets/CredentialsPage-BKxS-1sA.js.map +0 -1
  288. package/dashboard/dist/assets/CustomDurationPicker-j4bBrDJ6.js +0 -2
  289. package/dashboard/dist/assets/CustomDurationPicker-j4bBrDJ6.js.map +0 -1
  290. package/dashboard/dist/assets/DataTable-Byn3oyT9.js +0 -2
  291. package/dashboard/dist/assets/DataTable-Byn3oyT9.js.map +0 -1
  292. package/dashboard/dist/assets/EscalationListSchemaPage-CIJ-OgVC.js +0 -20
  293. package/dashboard/dist/assets/EscalationListSchemaPage-CIJ-OgVC.js.map +0 -1
  294. package/dashboard/dist/assets/EscalationSchemaPage-C7dHgG8e.js +0 -9
  295. package/dashboard/dist/assets/EscalationSchemaPage-C7dHgG8e.js.map +0 -1
  296. package/dashboard/dist/assets/EscalationsOverview-D8NrATg2.js +0 -2
  297. package/dashboard/dist/assets/EscalationsOverview-D8NrATg2.js.map +0 -1
  298. package/dashboard/dist/assets/EventTable-DBV1P2ME.js +0 -2
  299. package/dashboard/dist/assets/EventTable-DBV1P2ME.js.map +0 -1
  300. package/dashboard/dist/assets/FilterBar-B5Vk5tBF.js +0 -2
  301. package/dashboard/dist/assets/FilterBar-B5Vk5tBF.js.map +0 -1
  302. package/dashboard/dist/assets/GraphInvokePage-DbHvggQ_.js +0 -2
  303. package/dashboard/dist/assets/GraphInvokePage-DbHvggQ_.js.map +0 -1
  304. package/dashboard/dist/assets/HomePage-BpexnDO_.js +0 -2
  305. package/dashboard/dist/assets/HomePage-BpexnDO_.js.map +0 -1
  306. package/dashboard/dist/assets/ListToolbar-KC6LGtKP.js +0 -2
  307. package/dashboard/dist/assets/ListToolbar-KC6LGtKP.js.map +0 -1
  308. package/dashboard/dist/assets/McpOverview-BDZC9Hvl.js +0 -2
  309. package/dashboard/dist/assets/McpOverview-BDZC9Hvl.js.map +0 -1
  310. package/dashboard/dist/assets/McpQueryDetailPage-CXhgX1pS.js +0 -5
  311. package/dashboard/dist/assets/McpQueryDetailPage-CXhgX1pS.js.map +0 -1
  312. package/dashboard/dist/assets/McpRunDetailPage-BM3mUSlH.js +0 -2
  313. package/dashboard/dist/assets/McpRunDetailPage-BM3mUSlH.js.map +0 -1
  314. package/dashboard/dist/assets/McpRunsPage-f5hDbpLo.js +0 -2
  315. package/dashboard/dist/assets/McpRunsPage-f5hDbpLo.js.map +0 -1
  316. package/dashboard/dist/assets/NamespacePill-C4u6Go1W.js +0 -2
  317. package/dashboard/dist/assets/NamespacePill-C4u6Go1W.js.map +0 -1
  318. package/dashboard/dist/assets/OperationsPage-D37cZ8Qh.js +0 -2
  319. package/dashboard/dist/assets/OperationsPage-D37cZ8Qh.js.map +0 -1
  320. package/dashboard/dist/assets/OperatorDashboard-_axS17fp.js +0 -2
  321. package/dashboard/dist/assets/PageHeader-Bxa1XFz0.js +0 -2
  322. package/dashboard/dist/assets/PageHeader-Bxa1XFz0.js.map +0 -1
  323. package/dashboard/dist/assets/PageHeaderWithStats-D_sO0MqJ.js +0 -2
  324. package/dashboard/dist/assets/PageHeaderWithStats-D_sO0MqJ.js.map +0 -1
  325. package/dashboard/dist/assets/PriorityBadge-B4ykBH7f.js.map +0 -1
  326. package/dashboard/dist/assets/ProcessDetailPage-D8pAWUXx.js +0 -2
  327. package/dashboard/dist/assets/ProcessDetailPage-D8pAWUXx.js.map +0 -1
  328. package/dashboard/dist/assets/RoleDetailPage-ufbypNNR.js +0 -8
  329. package/dashboard/dist/assets/RoleDetailPage-ufbypNNR.js.map +0 -1
  330. package/dashboard/dist/assets/RolePill-DLwmVMam.js +0 -2
  331. package/dashboard/dist/assets/RolePill-DLwmVMam.js.map +0 -1
  332. package/dashboard/dist/assets/RolesPage-CxpXm4Sw.js +0 -2
  333. package/dashboard/dist/assets/RolesPage-CxpXm4Sw.js.map +0 -1
  334. package/dashboard/dist/assets/RunAsSelector-BebF8Lib.js +0 -2
  335. package/dashboard/dist/assets/RunAsSelector-BebF8Lib.js.map +0 -1
  336. package/dashboard/dist/assets/SlidePanel-BDVDuwIf.js +0 -2
  337. package/dashboard/dist/assets/SlidePanel-BDVDuwIf.js.map +0 -1
  338. package/dashboard/dist/assets/StatCard-DrdlUeQz.js +0 -2
  339. package/dashboard/dist/assets/StatCard-DrdlUeQz.js.map +0 -1
  340. package/dashboard/dist/assets/StatusBadge-CEQMRmSQ.js +0 -2
  341. package/dashboard/dist/assets/StatusBadge-CEQMRmSQ.js.map +0 -1
  342. package/dashboard/dist/assets/StreamMessageDetail-BIXbrZM0.js +0 -2
  343. package/dashboard/dist/assets/StreamMessageDetail-BIXbrZM0.js.map +0 -1
  344. package/dashboard/dist/assets/SwimlaneTimeline-CC5qZjYo.js +0 -2
  345. package/dashboard/dist/assets/SwimlaneTimeline-CC5qZjYo.js.map +0 -1
  346. package/dashboard/dist/assets/TagInput-C2gi47M8.js +0 -2
  347. package/dashboard/dist/assets/TagInput-C2gi47M8.js.map +0 -1
  348. package/dashboard/dist/assets/TaskQueuePill-BPP0Almh.js +0 -2
  349. package/dashboard/dist/assets/TaskQueuePill-BPP0Almh.js.map +0 -1
  350. package/dashboard/dist/assets/TimestampCell-DGOsba-A.js +0 -2
  351. package/dashboard/dist/assets/TimestampCell-DGOsba-A.js.map +0 -1
  352. package/dashboard/dist/assets/ToolPill-D74TkYB-.js +0 -2
  353. package/dashboard/dist/assets/ToolPill-D74TkYB-.js.map +0 -1
  354. package/dashboard/dist/assets/ToolTestPanel-Bez6OyRL.js +0 -2
  355. package/dashboard/dist/assets/ToolTestPanel-Bez6OyRL.js.map +0 -1
  356. package/dashboard/dist/assets/TopicDetailPage-BHccgkU_.js +0 -9
  357. package/dashboard/dist/assets/TopicDetailPage-BHccgkU_.js.map +0 -1
  358. package/dashboard/dist/assets/TopicsPage-5yW63ELl.js +0 -2
  359. package/dashboard/dist/assets/WorkflowExecutionPage-CDDLled5.js +0 -2
  360. package/dashboard/dist/assets/WorkflowExecutionPage-CDDLled5.js.map +0 -1
  361. package/dashboard/dist/assets/WorkflowPill-Fjc2q9U9.js +0 -2
  362. package/dashboard/dist/assets/WorkflowPill-Fjc2q9U9.js.map +0 -1
  363. package/dashboard/dist/assets/WorkflowsOverview-D8MkSMex.js +0 -2
  364. package/dashboard/dist/assets/WorkflowsOverview-D8MkSMex.js.map +0 -1
  365. package/dashboard/dist/assets/YamlWorkflowsPage-9Ki54d-9.js +0 -2
  366. package/dashboard/dist/assets/YamlWorkflowsPage-9Ki54d-9.js.map +0 -1
  367. package/dashboard/dist/assets/bots-CAYJYL9E.js +0 -2
  368. package/dashboard/dist/assets/bots-CAYJYL9E.js.map +0 -1
  369. package/dashboard/dist/assets/escalation-columns-BbS5X61l.js +0 -2
  370. package/dashboard/dist/assets/escalation-columns-BbS5X61l.js.map +0 -1
  371. package/dashboard/dist/assets/index-B68A3v-S.js +0 -2
  372. package/dashboard/dist/assets/index-B68A3v-S.js.map +0 -1
  373. package/dashboard/dist/assets/index-BAi89Xpm.js +0 -2
  374. package/dashboard/dist/assets/index-BAi89Xpm.js.map +0 -1
  375. package/dashboard/dist/assets/index-BJ0jjFsI.js +0 -5
  376. package/dashboard/dist/assets/index-BJ0jjFsI.js.map +0 -1
  377. package/dashboard/dist/assets/index-BOJMUk4F.js +0 -2
  378. package/dashboard/dist/assets/index-BOJMUk4F.js.map +0 -1
  379. package/dashboard/dist/assets/index-BrgYykPV.js +0 -2
  380. package/dashboard/dist/assets/index-BrgYykPV.js.map +0 -1
  381. package/dashboard/dist/assets/index-BxgtIqvl.js +0 -2
  382. package/dashboard/dist/assets/index-BxgtIqvl.js.map +0 -1
  383. package/dashboard/dist/assets/index-C0cHXaX-.css +0 -1
  384. package/dashboard/dist/assets/index-CDHDoHYz.js +0 -6
  385. package/dashboard/dist/assets/index-CDHDoHYz.js.map +0 -1
  386. package/dashboard/dist/assets/index-CUZJHXew.js +0 -2
  387. package/dashboard/dist/assets/index-CUZJHXew.js.map +0 -1
  388. package/dashboard/dist/assets/index-D5n_e59T.js +0 -2
  389. package/dashboard/dist/assets/index-D5n_e59T.js.map +0 -1
  390. package/dashboard/dist/assets/index-DIgiIoou.js +0 -63
  391. package/dashboard/dist/assets/index-DIgiIoou.js.map +0 -1
  392. package/dashboard/dist/assets/index-Dd1RxGNw.js +0 -2
  393. package/dashboard/dist/assets/index-iOb3sGsC.js +0 -5
  394. package/dashboard/dist/assets/index-iOb3sGsC.js.map +0 -1
  395. package/dashboard/dist/assets/index-mcAkQblr.js +0 -2
  396. package/dashboard/dist/assets/index-mcAkQblr.js.map +0 -1
  397. package/dashboard/dist/assets/vendor-icons-ihWGa7_d.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CwQVaa7x.js","sources":["../../src/api/files.ts","../../src/pages/files/FileBreadcrumbs.tsx","../../src/pages/files/FilePreviewContent.tsx","../../src/pages/files/FileListViews.tsx","../../src/pages/files/FilePreviewPanel.tsx","../../src/pages/files/FilesPage.tsx"],"sourcesContent":["import { useQuery, useMutation } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport { LT_BASE } from '../lib/base-path';\n\nexport interface FileEntry {\n path: string;\n size: number;\n modified_at: string;\n}\n\nexport interface BrowseResponse {\n files: FileEntry[];\n directories: string[];\n nextToken?: string;\n}\n\nexport interface FileMetadata {\n path: string;\n size: number;\n modified_at: string;\n content_type: string;\n}\n\nexport interface SignedUrlResponse {\n url: string;\n expiresAt: string;\n}\n\nexport function useFileBrowse(prefix: string, pageSize = 100, continuationToken?: string) {\n const params = new URLSearchParams();\n if (prefix) params.set('prefix', prefix);\n params.set('pageSize', String(pageSize));\n if (continuationToken) params.set('continuationToken', continuationToken);\n const qs = params.toString();\n\n return useQuery<BrowseResponse>({\n queryKey: ['fileBrowse', prefix, pageSize, continuationToken],\n queryFn: () => apiFetch(`/file-browser/browse?${qs}`),\n });\n}\n\nexport function useFileMetadata(filePath: string | null) {\n return useQuery<FileMetadata>({\n queryKey: ['fileMetadata', filePath],\n queryFn: () => apiFetch(`/file-browser/metadata/${filePath}`),\n enabled: !!filePath,\n });\n}\n\nexport function useGenerateSignedUrl() {\n return useMutation<SignedUrlResponse, Error, { path: string; expiresIn: number }>({\n mutationFn: (data) =>\n apiFetch('/file-browser/signed-url', {\n method: 'POST',\n body: JSON.stringify(data),\n }),\n });\n}\n\nexport function useDeleteFile() {\n return useMutation<{ deleted: boolean; path: string }, Error, string>({\n mutationFn: (filePath) =>\n apiFetch(`/file-browser/delete/${filePath}`, { method: 'DELETE' }),\n });\n}\n\nexport function useUploadFile() {\n return useMutation<{ path: string; size: number; content_type: string }, Error, { path: string; file: File }>({\n mutationFn: async ({ path, file }) => {\n const buffer = await file.arrayBuffer();\n // Always send as octet-stream to bypass Express JSON body parser\n return apiFetch(`/file-browser/upload?path=${encodeURIComponent(path)}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/octet-stream' },\n body: buffer,\n });\n },\n });\n}\n\nexport function useFilePreviewUrl(filePath: string | null) {\n return useQuery<string>({\n queryKey: ['filePreviewUrl', filePath],\n queryFn: async () => {\n const result = await apiFetch<SignedUrlResponse>('/file-browser/signed-url', {\n method: 'POST',\n body: JSON.stringify({ path: filePath, expiresIn: 3600 }),\n });\n return result.url;\n },\n enabled: !!filePath,\n staleTime: 50 * 60 * 1000, // cache for 50 min (token valid for 60)\n });\n}\n\n/** @deprecated Use useFilePreviewUrl() for signed access */\nexport function getFilePreviewUrl(filePath: string): string {\n return `${LT_BASE}/api/files/${filePath.replace(/^\\/+/, '')}`;\n}\n\nexport function getFileDownloadUrl(filePath: string): string {\n return `${LT_BASE}/api/file-browser/download/${filePath.replace(/^\\/+/, '')}`;\n}\n","import { ChevronRight, FolderOpen } from 'lucide-react';\n\ninterface FileBreadcrumbsProps {\n prefix: string;\n onNavigate: (prefix: string) => void;\n}\n\nexport function FileBreadcrumbs({ prefix, onNavigate }: FileBreadcrumbsProps) {\n const segments = prefix ? prefix.replace(/\\/+$/, '').split('/').filter(Boolean) : [];\n\n return (\n <nav className=\"flex items-center gap-1 text-sm mb-6 min-h-[28px]\">\n <button\n onClick={() => onNavigate('')}\n className={`flex items-center gap-1.5 px-1.5 py-0.5 rounded transition-colors ${\n segments.length === 0\n ? 'text-text-primary font-medium'\n : 'text-text-secondary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n <FolderOpen className=\"w-4 h-4 text-accent/75\" strokeWidth={1.5} />\n <span>Root</span>\n </button>\n\n {segments.map((segment, i) => {\n const isLast = i === segments.length - 1;\n const targetPrefix = segments.slice(0, i + 1).join('/') + '/';\n return (\n <span key={targetPrefix} className=\"flex items-center gap-1\">\n <ChevronRight className=\"w-3.5 h-3.5 text-text-tertiary\" />\n <button\n onClick={() => onNavigate(targetPrefix)}\n className={`px-1.5 py-0.5 rounded transition-colors ${\n isLast\n ? 'text-text-primary font-medium'\n : 'text-text-secondary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {segment}\n </button>\n </span>\n );\n })}\n </nav>\n );\n}\n","import { useState } from 'react';\nimport { Copy, Check } from 'lucide-react';\nimport { TimeAgo } from '../../components/common/display/TimeAgo';\n\ninterface FileMetadata {\n path: string;\n content_type: string;\n size: number;\n modified_at: string;\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\nexport function fileName(filePath: string): string {\n return filePath.split('/').pop() || filePath;\n}\n\nexport function MetaRow({ label, value, mono, children }: {\n label: string;\n value?: string;\n mono?: boolean;\n children?: React.ReactNode;\n}) {\n return (\n <div>\n <dt className=\"text-2xs uppercase tracking-wider text-text-tertiary mb-0.5\">{label}</dt>\n <dd className={`text-sm text-text-secondary ${mono ? 'font-mono text-xs break-all' : ''}`}>\n {children || value}\n </dd>\n </div>\n );\n}\n\nexport function TextPreview({ url }: { url: string }) {\n const [content, setContent] = useState<string | null>(null);\n const [error, setError] = useState(false);\n\n if (content === null && !error) {\n fetch(url)\n .then((res) => {\n if (!res.ok) throw new Error();\n return res.text();\n })\n .then((text) => setContent(text.slice(0, 100_000)))\n .catch(() => setError(true));\n }\n\n if (error) return <p className=\"text-xs text-text-tertiary\">Could not load preview</p>;\n if (content === null) {\n return <div className=\"animate-pulse h-32 bg-surface-sunken rounded\" />;\n }\n\n return (\n <pre className=\"font-mono text-xs text-text-secondary bg-surface-sunken rounded-md p-3 overflow-x-auto max-h-[400px] overflow-y-auto whitespace-pre-wrap break-words\">\n {content}\n </pre>\n );\n}\n\nexport function FileMetadataDisplay({ metadata }: {\n metadata: FileMetadata;\n}) {\n const [copied, setCopied] = useState<string | null>(null);\n\n async function copyToClipboard(text: string, label: string) {\n await navigator.clipboard.writeText(text);\n setCopied(label);\n setTimeout(() => setCopied(null), 2000);\n }\n\n return (\n <div className=\"space-y-3\">\n <div>\n <dt className=\"text-2xs uppercase tracking-wider text-text-tertiary mb-0.5\">Path</dt>\n <dd\n onClick={() => copyToClipboard(metadata.path, 'path')}\n className=\"group flex items-center gap-1.5 text-xs font-mono text-text-secondary break-all cursor-pointer hover:text-text-primary transition-colors\"\n title=\"Click to copy\"\n >\n <span className=\"flex-1\">{metadata.path}</span>\n {copied === 'path'\n ? <Check className=\"w-3.5 h-3.5 text-status-success shrink-0\" />\n : <Copy className=\"w-3.5 h-3.5 opacity-0 group-hover:opacity-100 text-text-tertiary shrink-0 transition-opacity\" />}\n </dd>\n </div>\n <MetaRow label=\"Type\" value={metadata.content_type} />\n <MetaRow label=\"Size\" value={formatSize(metadata.size)} />\n <MetaRow label=\"Modified\">\n <TimeAgo date={metadata.modified_at} />\n </MetaRow>\n </div>\n );\n}\n\nexport async function triggerDownload(url: string, name: string) {\n const res = await fetch(url);\n const blob = await res.blob();\n const blobUrl = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = blobUrl;\n a.download = name;\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(blobUrl);\n}\n","import {\n Folder,\n File,\n Image,\n FileText,\n FileJson2,\n FileSpreadsheet,\n} from 'lucide-react';\nimport { TimeAgo } from '../../components/common/display/TimeAgo';\nimport { getFilePreviewUrl } from '../../api/files';\n\nexport function formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\nexport function fileIcon(filePath: string) {\n const ext = filePath.split('.').pop()?.toLowerCase() || '';\n if (['png', 'jpg', 'jpeg', 'gif', 'svg', 'webp'].includes(ext)) {\n return <Image className=\"w-4 h-4 text-accent/60\" strokeWidth={1.5} />;\n }\n if (['json'].includes(ext)) {\n return <FileJson2 className=\"w-4 h-4 text-accent/60\" strokeWidth={1.5} />;\n }\n if (['csv', 'xlsx', 'xls'].includes(ext)) {\n return <FileSpreadsheet className=\"w-4 h-4 text-accent/60\" strokeWidth={1.5} />;\n }\n if (['txt', 'md', 'html', 'xml', 'yaml', 'yml', 'css', 'js', 'ts'].includes(ext)) {\n return <FileText className=\"w-4 h-4 text-accent/60\" strokeWidth={1.5} />;\n }\n return <File className=\"w-4 h-4 text-accent/60\" strokeWidth={1.5} />;\n}\n\nexport function isImagePath(filePath: string): boolean {\n const ext = filePath.split('.').pop()?.toLowerCase() || '';\n return ['png', 'jpg', 'jpeg', 'gif', 'svg', 'webp'].includes(ext);\n}\n\nexport function dirName(dirPath: string): string {\n const stripped = dirPath.replace(/\\/+$/, '');\n return stripped.split('/').pop() || stripped;\n}\n\nexport function fileNameFromPath(filePath: string): string {\n return filePath.split('/').pop() || filePath;\n}\n\ninterface ViewProps {\n directories: string[];\n files: Array<{ path: string; size: number; modified_at: string }>;\n onNavigate: (prefix: string) => void;\n onSelect: (path: string) => void;\n selectedFile: string | null;\n}\n\nexport function ListView({ directories, files, onNavigate, onSelect, selectedFile }: ViewProps) {\n return (\n <table className=\"w-full mt-2\">\n <thead>\n <tr className=\"text-left text-2xs uppercase tracking-wider text-text-tertiary\">\n <th className=\"pb-2 pl-2 font-medium\">Name</th>\n <th className=\"pb-2 font-medium w-24 text-right\">Size</th>\n <th className=\"pb-2 pr-2 font-medium w-40 text-right\">Modified</th>\n </tr>\n </thead>\n <tbody>\n {directories.map((dir) => (\n <tr\n key={dir}\n onClick={() => onNavigate(dir)}\n className=\"row-hover cursor-pointer group\"\n >\n <td className=\"py-2 pl-2\">\n <span className=\"flex items-center gap-2.5\">\n <Folder className=\"w-4 h-4 text-accent/75 shrink-0\" strokeWidth={1.5} />\n <span className=\"text-sm text-text-primary group-hover:text-accent transition-colors\">\n {dirName(dir)}\n </span>\n </span>\n </td>\n <td className=\"py-2 text-right text-xs text-text-tertiary\">&mdash;</td>\n <td className=\"py-2 pr-2 text-right text-xs text-text-tertiary\">&mdash;</td>\n </tr>\n ))}\n {files.map((file) => (\n <tr\n key={file.path}\n onClick={() => onSelect(file.path)}\n className={`row-hover cursor-pointer group ${\n selectedFile === file.path ? 'bg-surface-hover' : ''\n }`}\n >\n <td className=\"py-2 pl-2\">\n <span className=\"flex items-center gap-2.5\">\n {fileIcon(file.path)}\n <span className=\"text-sm text-text-primary truncate\">\n {fileNameFromPath(file.path)}\n </span>\n </span>\n </td>\n <td className=\"py-2 text-right text-xs text-text-secondary tabular-nums\">\n {formatSize(file.size)}\n </td>\n <td className=\"py-2 pr-2 text-right text-xs text-text-secondary\">\n <TimeAgo date={file.modified_at} />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\nexport function GridView({ directories, files, onNavigate, onSelect, selectedFile }: ViewProps) {\n return (\n <div className=\"mt-4\">\n {/* Directories as compact list */}\n {directories.length > 0 && (\n <div className=\"flex flex-wrap gap-2 mb-6\">\n {directories.map((dir) => (\n <button\n key={dir}\n onClick={() => onNavigate(dir)}\n className=\"flex items-center gap-2 px-3 py-1.5 rounded-md text-sm text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors\"\n >\n <Folder className=\"w-4 h-4 text-accent/75\" strokeWidth={1.5} />\n <span>{dirName(dir)}</span>\n </button>\n ))}\n </div>\n )}\n\n {/* Files as thumbnail grid */}\n <div className=\"grid grid-cols-2 @grp-cols:grid-cols-3 @split:grid-cols-4 @wall:grid-cols-5 gap-3\">\n {files.map((file) => {\n const isImg = isImagePath(file.path);\n return (\n <button\n key={file.path}\n onClick={() => onSelect(file.path)}\n className={`group text-left rounded-lg overflow-hidden transition-all ${\n selectedFile === file.path\n ? 'ring-2 ring-accent/40 bg-surface-hover'\n : 'hover:bg-surface-hover'\n }`}\n >\n <div className=\"aspect-square bg-surface-sunken flex items-center justify-center overflow-hidden\">\n {isImg ? (\n <img\n src={getFilePreviewUrl(file.path)}\n alt={fileNameFromPath(file.path)}\n loading=\"lazy\"\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"flex flex-col items-center gap-2 text-text-tertiary\">\n {fileIcon(file.path)}\n <span className=\"text-2xs uppercase tracking-wider\">\n {file.path.split('.').pop()?.toUpperCase()}\n </span>\n </div>\n )}\n </div>\n <div className=\"px-2 py-1.5\">\n <p className=\"text-xs text-text-primary truncate\" title={fileNameFromPath(file.path)}>\n {fileNameFromPath(file.path)}\n </p>\n <p className=\"text-2xs text-text-tertiary tabular-nums\">\n {formatSize(file.size)}\n </p>\n </div>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useState } from 'react';\nimport {\n X,\n Download,\n ExternalLink,\n Link,\n Check,\n Trash2,\n} from 'lucide-react';\nimport { useFileMetadata, useFilePreviewUrl, useGenerateSignedUrl, useDeleteFile } from '../../api/files';\nimport { fileName, triggerDownload, TextPreview, FileMetadataDisplay } from './FilePreviewContent';\nimport { isImagePath } from './FileListViews';\n\ninterface FilePreviewPanelProps {\n filePath: string;\n onClose: () => void;\n onDeleted?: () => void;\n}\n\nconst EXPIRY_OPTIONS = [\n { label: '1 hour', value: 3600 },\n { label: '6 hours', value: 21600 },\n { label: '24 hours', value: 86400 },\n { label: '7 days', value: 604800 },\n { label: '30 days', value: 2592000 },\n];\n\nexport function FilePreviewPanel({ filePath, onClose, onDeleted }: FilePreviewPanelProps) {\n const { data: metadata, isLoading } = useFileMetadata(filePath);\n const signedUrlMutation = useGenerateSignedUrl();\n const deleteMutation = useDeleteFile();\n const [showShareMenu, setShowShareMenu] = useState(false);\n const [copied, setCopied] = useState(false);\n const [confirmDelete, setConfirmDelete] = useState(false);\n\n const { data: previewUrl } = useFilePreviewUrl(filePath);\n const isImage = metadata?.content_type?.startsWith('image/') || isImagePath(filePath);\n const TEXT_EXTENSIONS = /\\.(ts|tsx|js|jsx|json|md|yaml|yml|toml|xml|csv|sql|sh|py|rb|go|rs|java|c|cpp|h|css|scss|html|txt|log|env|ini|cfg|conf)$/i;\n const isText = metadata?.content_type?.startsWith('text/')\n || metadata?.content_type === 'application/json'\n || metadata?.content_type === 'application/xml'\n || (metadata?.content_type === 'application/octet-stream' && TEXT_EXTENSIONS.test(filePath));\n const isPdf = metadata?.content_type === 'application/pdf';\n\n async function handleDownload() {\n try {\n const result = await signedUrlMutation.mutateAsync({ path: filePath, expiresIn: 3600 });\n const fullUrl = result.url.startsWith('http')\n ? result.url\n : `${window.location.origin}${result.url}`;\n triggerDownload(fullUrl, fileName(filePath));\n } catch {\n // handled by mutation state\n }\n }\n\n async function handleShare(expiresIn: number) {\n setShowShareMenu(false);\n try {\n const result = await signedUrlMutation.mutateAsync({ path: filePath, expiresIn });\n const fullUrl = result.url.startsWith('http')\n ? result.url\n : `${window.location.origin}${result.url}`;\n await navigator.clipboard.writeText(fullUrl);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // handled by mutation state\n }\n }\n\n return (\n <>\n {/* Fullscreen — opens image in a new tab */}\n\n {/* Panel */}\n <div className=\"w-[380px] shrink-0 border-l border-surface-border bg-surface overflow-y-auto\">\n {/* Header */}\n <div className=\"sticky top-0 bg-surface z-10 px-5 pt-5 pb-3 border-b border-surface-border\">\n <div className=\"flex items-center justify-between mb-3\">\n <h3 className=\"text-sm font-medium text-text-primary truncate pr-2\" title={fileName(filePath)}>\n {fileName(filePath)}\n </h3>\n <button onClick={onClose} className=\"text-text-tertiary hover:text-text-primary shrink-0\">\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-1 flex-wrap\">\n <button\n onClick={handleDownload}\n className=\"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs\"\n title=\"Download\"\n >\n <Download className=\"w-3.5 h-3.5\" />\n <span>Download</span>\n </button>\n\n <a\n href={previewUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs\"\n title=\"Open in new tab\"\n >\n <ExternalLink className=\"w-3.5 h-3.5\" />\n <span>Open</span>\n </a>\n\n <div className=\"relative\">\n <button\n onClick={() => setShowShareMenu((v) => !v)}\n className=\"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs\"\n title=\"Share with signed URL\"\n >\n {copied ? <Check className=\"w-3.5 h-3.5 text-status-success\" /> : <Link className=\"w-3.5 h-3.5\" />}\n <span>Share</span>\n </button>\n {showShareMenu && (\n <div className=\"absolute top-full left-0 mt-1 bg-surface-raised border border-surface-border rounded-md shadow-lg py-1 z-[100] min-w-[120px]\">\n {EXPIRY_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n onClick={() => handleShare(opt.value)}\n className=\"w-full text-left px-3 py-1.5 text-xs text-text-secondary hover:bg-surface-hover hover:text-text-primary transition-colors\"\n >\n {opt.label}\n </button>\n ))}\n </div>\n )}\n </div>\n\n <button\n onClick={() => setConfirmDelete(true)}\n className=\"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs text-status-error/70 hover:text-status-error\"\n title=\"Delete file\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n <span>Delete</span>\n </button>\n </div>\n\n {/* Delete confirmation */}\n {confirmDelete && (\n <div className=\"mt-3 p-3 bg-status-error/5 border border-status-error/20 rounded-md\">\n <p className=\"text-xs text-text-primary mb-2\">\n Permanently delete <span className=\"font-medium\">{fileName(filePath)}</span>? This cannot be undone.\n </p>\n <div className=\"flex gap-2\">\n <button\n onClick={() => setConfirmDelete(false)}\n className=\"btn-secondary text-xs\"\n disabled={deleteMutation.isPending}\n >\n Cancel\n </button>\n <button\n onClick={async () => {\n try {\n await deleteMutation.mutateAsync(filePath);\n setConfirmDelete(false);\n onDeleted?.();\n } catch {\n // error shown below\n }\n }}\n className=\"btn-primary text-xs !bg-status-error hover:!bg-status-error/90\"\n disabled={deleteMutation.isPending}\n >\n {deleteMutation.isPending ? 'Deleting...' : 'Delete'}\n </button>\n </div>\n {deleteMutation.isError && (\n <p className=\"text-xs text-status-error mt-2\">{deleteMutation.error.message}</p>\n )}\n </div>\n )}\n\n {signedUrlMutation.isError && (\n <p className=\"text-xs text-status-error mt-2\">{signedUrlMutation.error.message}</p>\n )}\n </div>\n\n {/* Preview area */}\n <div className=\"p-5\">\n {isLoading ? (\n <div className=\"animate-pulse space-y-3\">\n <div className=\"h-48 bg-surface-sunken rounded\" />\n <div className=\"h-4 bg-surface-sunken rounded w-2/3\" />\n </div>\n ) : (\n <>\n {isImage && previewUrl && (\n <div\n className=\"mb-5 rounded-md border border-surface-border bg-surface-sunken overflow-hidden\"\n style={{ maxHeight: '400px' }}\n >\n <img\n src={previewUrl}\n alt={fileName(filePath)}\n className=\"w-full object-cover object-top\"\n style={{ maxHeight: '400px' }}\n />\n </div>\n )}\n\n {isText && previewUrl && (\n <div className=\"mb-5\">\n <TextPreview url={previewUrl} />\n </div>\n )}\n\n {isPdf && previewUrl && (\n <div className=\"mb-5 p-4 bg-surface-sunken rounded-md text-center\">\n <a\n href={previewUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-accent hover:text-accent-hover text-sm font-medium\"\n >\n Open PDF in new tab\n </a>\n </div>\n )}\n\n {metadata && (\n <FileMetadataDisplay metadata={metadata} />\n )}\n </>\n )}\n </div>\n </div>\n </>\n );\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useSearchParams } from 'react-router-dom';\nimport {\n ChevronLeft,\n ChevronRight,\n Upload,\n UploadCloud,\n} from 'lucide-react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterInput } from '../../components/common/data/FilterBar';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { buildApiPath } from '../../lib/api-path';\nimport { EmptyState } from '../../components/common/display/EmptyState';\nimport { DropZone } from '../../components/common/DropZone';\nimport { useFileBrowse, useUploadFile } from '../../api/files';\nimport { FileBreadcrumbs } from './FileBreadcrumbs';\nimport { FilePreviewPanel } from './FilePreviewPanel';\nimport { ListView } from './FileListViews';\n\nconst PAGE_SIZES = [25, 50, 100, 200];\n\nexport function FilesPage() {\n const [searchParams, setSearchParams] = useSearchParams();\n const prefix = searchParams.get('prefix') || '';\n const [search, setSearch] = useState('');\n const [debouncedSearch, setDebouncedSearch] = useState('');\n const [selectedFile, setSelectedFile] = useState<string | null>(null);\n const [pageSize, setPageSize] = useState(100);\n const [tokenStack, setTokenStack] = useState<string[]>([]);\n const [currentToken, setCurrentToken] = useState<string | undefined>();\n\n // Debounce search — refines the prefix sent to S3\n useEffect(() => {\n const t = setTimeout(() => {\n setDebouncedSearch(search);\n setCurrentToken(undefined);\n setTokenStack([]);\n }, 300);\n return () => clearTimeout(t);\n }, [search]);\n\n const effectivePrefix = debouncedSearch\n ? `${prefix}${debouncedSearch}`\n : prefix;\n\n const { data, isLoading, isFetching, refetch } = useFileBrowse(effectivePrefix, pageSize, currentToken);\n const uploadMutation = useUploadFile();\n const queryClient = useQueryClient();\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const [pendingFiles, setPendingFiles] = useState<File[] | null>(null);\n const [uploadPrefix, setUploadPrefix] = useState('');\n\n const handleUploadFiles = useCallback((files: File[]) => {\n setPendingFiles(files);\n setUploadPrefix(prefix);\n }, [prefix]);\n\n const [uploadError, setUploadError] = useState('');\n\n const confirmUpload = useCallback(() => {\n if (!pendingFiles) return;\n setUploadError('');\n let remaining = pendingFiles.length;\n for (const file of pendingFiles) {\n const targetPath = `${uploadPrefix}${file.name}`;\n uploadMutation.mutate({ path: targetPath, file }, {\n onSuccess: () => {\n remaining--;\n queryClient.invalidateQueries({ queryKey: ['fileBrowse'] });\n if (remaining <= 0) setPendingFiles(null);\n },\n onError: (err) => {\n remaining--;\n setUploadError(err.message);\n console.error('[Upload] failed:', targetPath, err);\n },\n });\n }\n }, [pendingFiles, uploadPrefix, uploadMutation, queryClient]);\n\n const directories = data?.directories ?? [];\n const files = data?.files ?? [];\n const nextToken = data?.nextToken;\n\n const navigateTo = useCallback((newPrefix: string) => {\n setSearch('');\n setDebouncedSearch('');\n setSelectedFile(null);\n setCurrentToken(undefined);\n setTokenStack([]);\n if (newPrefix) {\n setSearchParams({ prefix: newPrefix });\n } else {\n setSearchParams({});\n }\n }, [setSearchParams]);\n\n function goNextPage() {\n if (!nextToken) return;\n setTokenStack((prev) => [...prev, currentToken || '']);\n setCurrentToken(nextToken);\n }\n\n function goPrevPage() {\n if (tokenStack.length === 0) return;\n const prev = [...tokenStack];\n const token = prev.pop()!;\n setTokenStack(prev);\n setCurrentToken(token || undefined);\n }\n\n function changePageSize(size: number) {\n setPageSize(size);\n setCurrentToken(undefined);\n setTokenStack([]);\n }\n\n const isEmpty = directories.length === 0 && files.length === 0;\n const pageNum = tokenStack.length + 1;\n const hasNextPage = !!nextToken;\n const hasPrevPage = tokenStack.length > 0;\n\n const apiPath = buildApiPath('/file-browser/browse', {\n prefix: effectivePrefix,\n pageSize,\n continuationToken: currentToken || undefined,\n });\n\n return (\n <DropZone onDrop={handleUploadFiles} label=\"Drop files to upload\">\n <div className=\"flex gap-0\">\n {/* Hidden file input for button-triggered upload */}\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n onChange={(e) => {\n const files = Array.from(e.target.files || []);\n if (files.length) handleUploadFiles(files);\n e.target.value = '';\n }}\n />\n\n {/* Main content */}\n <div className=\"flex-1 min-w-0 overflow-hidden pr-6\">\n <PageHeader\n title=\"Files\"\n docsHash=\"#docs:dashboard.md:files\"\n actions={\n <button\n onClick={() => fileInputRef.current?.click()}\n disabled={uploadMutation.isPending}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <Upload className=\"w-3.5 h-3.5\" />\n {uploadMutation.isPending ? 'Uploading...' : 'Upload'}\n </button>\n }\n />\n\n <FileBreadcrumbs prefix={prefix} onNavigate={navigateTo} />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={apiPath}\n />\n }>\n <FilterInput\n label=\"Search\"\n value={search}\n onChange={setSearch}\n placeholder=\"Filter by prefix...\"\n />\n </FilterBar>\n\n {isLoading ? (\n <div className=\"animate-pulse space-y-2 mt-4\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div key={i} className=\"h-10 bg-surface-sunken rounded\" />\n ))}\n </div>\n ) : isEmpty ? (\n <div className=\"cursor-pointer\" onClick={() => fileInputRef.current?.click()}>\n <EmptyState\n icon={UploadCloud}\n title={search ? 'No matching files' : 'No files yet'}\n description={search ? undefined : 'Drop files here or click to upload'}\n />\n </div>\n ) : (\n <ListView\n directories={directories}\n files={files}\n onNavigate={navigateTo}\n onSelect={setSelectedFile}\n selectedFile={selectedFile}\n />\n )}\n\n {/* Cursor-based pagination */}\n {(hasPrevPage || hasNextPage || files.length > 0) && (\n <div className=\"flex items-center justify-between pt-4 pb-2\">\n <div className=\"flex items-center gap-4\">\n <p className=\"text-xs text-text-tertiary\">\n Page {pageNum} &middot; {files.length + directories.length} items\n </p>\n <select\n value={pageSize}\n onChange={(e) => changePageSize(parseInt(e.target.value))}\n className=\"select text-xs py-1\"\n >\n {PAGE_SIZES.map((size) => (\n <option key={size} value={size}>{size} / page</option>\n ))}\n </select>\n </div>\n {(hasPrevPage || hasNextPage) && (\n <div className=\"flex items-center gap-1\">\n <button\n onClick={goPrevPage}\n disabled={!hasPrevPage}\n className=\"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed flex items-center gap-1\"\n >\n <ChevronLeft className=\"w-3.5 h-3.5\" />\n Previous\n </button>\n <button\n onClick={goNextPage}\n disabled={!hasNextPage}\n className=\"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed flex items-center gap-1\"\n >\n Next\n <ChevronRight className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Preview panel */}\n {selectedFile && (\n <FilePreviewPanel\n filePath={selectedFile}\n onClose={() => setSelectedFile(null)}\n onDeleted={() => { setSelectedFile(null); refetch(); }}\n />\n )}\n </div>\n {/* Upload confirmation dialog */}\n {pendingFiles && createPortal(\n <>\n <div className=\"fixed inset-0 z-40 bg-black/30\" onClick={() => setPendingFiles(null)} />\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-4\">\n <div className=\"bg-surface-raised border border-surface-border rounded-lg shadow-lg w-full max-w-sm\">\n <div className=\"px-5 py-4 border-b border-surface-border\">\n <h3 className=\"text-sm font-medium text-text-primary\">Upload {pendingFiles.length} file{pendingFiles.length > 1 ? 's' : ''}</h3>\n </div>\n <div className=\"px-5 py-4 space-y-3\">\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Destination folder</label>\n <input\n type=\"text\"\n value={uploadPrefix}\n onChange={(e) => setUploadPrefix(e.target.value)}\n placeholder=\"e.g., images/ or leave empty for root\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div className=\"text-2xs text-text-quaternary space-y-0.5\">\n {pendingFiles.map((f, i) => (\n <p key={i} className=\"truncate\">{uploadPrefix}{f.name} <span className=\"text-text-tertiary\">({(f.size / 1024).toFixed(1)} KB)</span></p>\n ))}\n </div>\n {uploadError && <p className=\"text-xs text-status-error\">{uploadError}</p>}\n </div>\n <div className=\"flex justify-end gap-2 px-5 py-3 border-t border-surface-border\">\n <button onClick={() => setPendingFiles(null)} className=\"btn-ghost text-xs\">Cancel</button>\n <button onClick={confirmUpload} className=\"btn-primary text-xs\">\n <Upload className=\"w-3.5 h-3.5 mr-1.5 inline\" />\n Upload\n </button>\n </div>\n </div>\n </div>\n </>,\n document.body,\n )}\n </DropZone>\n );\n}\n"],"names":["useFileBrowse","prefix","pageSize","continuationToken","params","qs","useQuery","apiFetch","useFileMetadata","filePath","useGenerateSignedUrl","useMutation","data","useDeleteFile","useUploadFile","path","file","buffer","useFilePreviewUrl","FileBreadcrumbs","onNavigate","segments","jsxs","jsx","FolderOpen","segment","i","isLast","targetPrefix","ChevronRight","formatSize","bytes","fileName","MetaRow","label","value","mono","children","TextPreview","url","content","setContent","useState","error","setError","res","text","FileMetadataDisplay","metadata","copied","setCopied","copyToClipboard","Check","Copy","TimeAgo","triggerDownload","name","blob","blobUrl","a","fileIcon","ext","_a","Image","FileJson2","FileSpreadsheet","FileText","File","isImagePath","dirName","dirPath","stripped","fileNameFromPath","ListView","directories","files","onSelect","selectedFile","dir","Folder","EXPIRY_OPTIONS","FilePreviewPanel","onClose","onDeleted","isLoading","signedUrlMutation","deleteMutation","showShareMenu","setShowShareMenu","confirmDelete","setConfirmDelete","previewUrl","isImage","TEXT_EXTENSIONS","isText","_b","isPdf","handleDownload","result","fullUrl","handleShare","expiresIn","Fragment","X","Download","ExternalLink","v","Link","opt","Trash2","PAGE_SIZES","FilesPage","searchParams","setSearchParams","useSearchParams","search","setSearch","debouncedSearch","setDebouncedSearch","setSelectedFile","setPageSize","tokenStack","setTokenStack","currentToken","setCurrentToken","useEffect","t","effectivePrefix","isFetching","refetch","uploadMutation","queryClient","useQueryClient","fileInputRef","useRef","pendingFiles","setPendingFiles","uploadPrefix","setUploadPrefix","handleUploadFiles","useCallback","uploadError","setUploadError","confirmUpload","remaining","targetPath","err","nextToken","navigateTo","newPrefix","goNextPage","prev","goPrevPage","token","changePageSize","size","isEmpty","pageNum","hasNextPage","hasPrevPage","apiPath","buildApiPath","DropZone","e","PageHeader","Upload","FilterBar","ListToolbar","FilterInput","_","EmptyState","UploadCloud","ChevronLeft","createPortal","f"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{c as k,u as R,b as O,j as e,a as d}from"./vendor-query-B2UbickB.js";import{P as F}from"./PageHeader-DvEmMMP6.js";import{d as b}from"./index-C-8xXyvr.js";import{M}from"./Modal-D4afnAjc.js";import{R as g,C}from"./constants-BHkpVaqx.js";import{aL as E,aE as T,aA as W,ao as j,T as I,al as D}from"./vendor-icons-DKCAtTJ9.js";import"./vendor-react-CXumBFUA.js";function $(){return R({queryKey:["maintenance"],queryFn:()=>b("/config/maintenance")})}function L(){const t=O();return k({mutationFn:r=>b("/config/maintenance",{method:"PUT",body:JSON.stringify(r)}),onSuccess:()=>{t.invalidateQueries({queryKey:["maintenance"]})}})}function _(){return k({mutationFn:t=>b("/dba/prune",{method:"POST",body:JSON.stringify(t)})})}function v({checked:t,onToggle:r,label:a,hint:s,safety:i,value:l,onChange:c}){const n=i==="safe"?W:i==="moderate"?E:T,o=i==="safe"?"text-status-success":i==="moderate"?"text-status-warning":"text-status-error",p=i==="safe"?"Safe":i==="moderate"?"Careful":"Permanent";return e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("label",{className:"flex items-center gap-2.5 cursor-pointer w-80 shrink-0",children:[e.jsx("input",{type:"checkbox",checked:t,onChange:x=>r(x.target.checked),className:"w-4 h-4 rounded border-border accent-accent shrink-0"}),e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-xs text-text-primary",children:a}),e.jsxs("span",{className:`flex items-center gap-0.5 text-2xs ${o}`,children:[e.jsx(n,{className:"w-3 h-3",strokeWidth:1.5}),p]})]}),e.jsx("p",{className:"text-2xs text-text-tertiary",children:s})]})]}),e.jsx("select",{value:l,onChange:x=>c(x.target.value),disabled:!t,className:`select text-xs w-36 transition-opacity ${t?"":"opacity-40 cursor-not-allowed"}`,children:g.map(x=>e.jsx("option",{value:x.value,children:x.label},x.value))})]})}function q(){return e.jsxs("div",{className:"flex items-start gap-2 mt-2 px-3 py-2 rounded bg-surface-sunken",children:[e.jsx(j,{className:"w-3.5 h-3.5 text-text-tertiary shrink-0 mt-0.5"}),e.jsx("p",{className:"text-2xs text-text-tertiary leading-relaxed",children:"Stripping preserves workflow results and timeline data needed for the execution detail view. Transient jobs are internal bookkeeping that accumulates over time."})]})}const f={pruneJobs:!0,expire:"30 days",engineStreams:!0,engineStreamsExpire:"1 day",workerStreams:!0,workerStreamsExpire:"90 days",stripAttributes:!1,pruneTransient:!1};function N(t){return t.pruneJobs||t.engineStreams||t.workerStreams||t.stripAttributes||t.pruneTransient}function P({fields:t,onChange:r}){const a=(s,i)=>r({...t,[s]:i});return e.jsxs("div",{className:"space-y-8",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Stream Messages"}),e.jsx("p",{className:"text-2xs text-text-tertiary mb-4",children:"Processed routing messages. Already consumed — safe to remove after a short retention window."}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(v,{checked:t.engineStreams,onToggle:s=>a("engineStreams",s),label:"Engine messages",hint:"Internal orchestration signals",safety:"safe",value:t.engineStreamsExpire,onChange:s=>a("engineStreamsExpire",s)}),e.jsx(v,{checked:t.workerStreams,onToggle:s=>a("workerStreams",s),label:"Worker messages",hint:"Activity dispatch and response payloads",safety:"safe",value:t.workerStreamsExpire,onChange:s=>a("workerStreamsExpire",s)})]})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Completed Workflows"}),e.jsx("p",{className:"text-2xs text-text-tertiary mb-4",children:"Choose how to handle completed workflow records. Reducing strips step-level detail but keeps the workflow and its results. Deleting removes the record entirely."}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("label",{className:"flex items-start gap-2.5 cursor-pointer",children:[e.jsx("input",{type:"radio",name:"workflow-cleanup",checked:!t.stripAttributes&&!t.pruneJobs,onChange:()=>r({...t,stripAttributes:!1,pruneJobs:!1}),className:"w-4 h-4 mt-0.5 accent-accent shrink-0"}),e.jsxs("div",{children:[e.jsx("span",{className:"text-xs text-text-primary",children:"Keep as-is"}),e.jsx("p",{className:"text-2xs text-text-tertiary",children:"No changes to completed workflow records."})]})]}),e.jsxs("div",{className:"flex items-start gap-2.5",children:[e.jsxs("label",{className:"flex items-start gap-2.5 cursor-pointer w-80 shrink-0",children:[e.jsx("input",{type:"radio",name:"workflow-cleanup",checked:t.stripAttributes&&!t.pruneJobs,onChange:()=>r({...t,stripAttributes:!0,pruneJobs:!1}),className:"w-4 h-4 mt-0.5 accent-accent shrink-0"}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-xs text-text-primary",children:"Reduce completed workflows"}),e.jsxs("span",{className:"flex items-center gap-0.5 text-2xs text-status-warning",children:[e.jsx(E,{className:"w-3 h-3",strokeWidth:1.5}),"Careful"]})]}),e.jsx("p",{className:"text-2xs text-text-tertiary",children:"Strips step-level execution detail (activity inputs/outputs, internal state). Workflow results and timeline are preserved."})]})]}),e.jsx("select",{value:t.expire,onChange:s=>a("expire",s.target.value),disabled:!t.stripAttributes||t.pruneJobs,className:`select text-xs w-36 transition-opacity mt-0.5 ${!t.stripAttributes||t.pruneJobs?"opacity-40 cursor-not-allowed":""}`,children:g.map(s=>e.jsx("option",{value:s.value,children:s.label},s.value))})]}),e.jsxs("div",{className:"flex items-start gap-2.5",children:[e.jsxs("label",{className:"flex items-start gap-2.5 cursor-pointer w-80 shrink-0",children:[e.jsx("input",{type:"radio",name:"workflow-cleanup",checked:t.pruneJobs,onChange:()=>r({...t,pruneJobs:!0,stripAttributes:!1}),className:"w-4 h-4 mt-0.5 accent-accent shrink-0"}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-xs text-text-primary",children:"Delete completed workflows"}),e.jsxs("span",{className:"flex items-center gap-0.5 text-2xs text-status-error",children:[e.jsx(T,{className:"w-3 h-3",strokeWidth:1.5}),"Permanent"]})]}),e.jsx("p",{className:"text-2xs text-text-tertiary",children:"Permanently removes workflow records. Results, timeline, and all execution data are deleted and cannot be recovered."})]})]}),e.jsx("select",{value:t.expire,onChange:s=>a("expire",s.target.value),disabled:!t.pruneJobs,className:`select text-xs w-36 transition-opacity mt-0.5 ${t.pruneJobs?"":"opacity-40 cursor-not-allowed"}`,children:g.map(s=>e.jsx("option",{value:s.value,children:s.label},s.value))})]})]}),e.jsx(q,{})]})]})}function m({label:t,value:r}){return e.jsxs("div",{children:[e.jsx("p",{className:"text-lg font-light text-text-primary",children:r.toLocaleString()}),e.jsx("p",{className:"text-2xs text-text-tertiary",children:t})]})}function U(){const t=_(),[r,a]=d.useState(f),[s,i]=d.useState(null),[l,c]=d.useState(!1),n=()=>{i(null),t.mutate({expire:r.expire,jobs:r.pruneJobs,engineStreams:r.engineStreams,engineStreamsExpire:r.engineStreamsExpire,workerStreams:r.workerStreams,workerStreamsExpire:r.workerStreamsExpire,attributes:r.stripAttributes,pruneTransient:r.pruneTransient},{onSuccess:o=>{i(o),c(!1)}})};return e.jsxs("div",{className:"space-y-8",children:[e.jsx(P,{fields:r,onChange:a}),e.jsxs("div",{className:"flex items-center justify-between pt-2 border-t border-surface-border",children:[e.jsx("p",{className:"text-2xs text-text-tertiary",children:N(r)?"This action permanently deletes data and cannot be undone.":"Select at least one operation to enable pruning."}),e.jsx("button",{onClick:()=>c(!0),disabled:!N(r)||t.isPending,className:"bg-status-error text-text-inverse px-4 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity disabled:opacity-40 shrink-0",children:t.isPending?"Pruning...":"Prune Now"})]}),s&&e.jsxs("div",{className:"bg-surface-sunken rounded-md px-4 py-3",children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Results"}),e.jsxs("div",{className:"flex flex-wrap gap-6",children:[s.jobs!=null&&s.jobs>0&&e.jsx(m,{label:"Jobs deleted",value:s.jobs}),s.engineStreams!=null&&s.engineStreams>0&&e.jsx(m,{label:"Engine streams",value:s.engineStreams}),s.workerStreams!=null&&s.workerStreams>0&&e.jsx(m,{label:"Worker streams",value:s.workerStreams}),s.streams!=null&&s.engineStreams==null&&s.streams>0&&e.jsx(m,{label:"Streams",value:s.streams}),s.attributes!=null&&s.attributes>0&&e.jsx(m,{label:"Artifacts stripped",value:s.attributes}),s.transient!=null&&s.transient>0&&e.jsx(m,{label:"Transient deleted",value:s.transient}),s.marked!=null&&s.marked>0&&e.jsx(m,{label:"Marked pruned",value:s.marked}),Object.values(s).every(o=>!o||o===0)&&e.jsx("p",{className:"text-xs text-text-tertiary",children:"Nothing to prune within the selected retention windows."})]})]}),t.error&&e.jsx("p",{className:"text-xs text-status-error",children:t.error.message}),e.jsx(M,{open:l,onClose:()=>c(!1),title:"Confirm Prune",children:e.jsxs("div",{className:"space-y-4",children:[e.jsx("p",{className:"text-sm text-text-secondary",children:"This will permanently delete data. This action cannot be undone."}),e.jsxs("ul",{className:"text-xs text-text-secondary space-y-1 list-disc list-inside",children:[r.pruneJobs&&e.jsxs("li",{children:["Delete jobs older than ",r.expire]}),r.engineStreams&&e.jsxs("li",{children:["Delete engine streams older than ",r.engineStreamsExpire]}),r.workerStreams&&e.jsxs("li",{children:["Delete worker streams older than ",r.workerStreamsExpire]}),r.stripAttributes&&e.jsx("li",{children:"Strip execution artifacts from completed jobs"}),r.pruneTransient&&e.jsx("li",{children:"Delete transient (entity-less) jobs"})]}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:()=>c(!1),className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:n,className:"bg-status-error text-text-inverse px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity",disabled:t.isPending,children:t.isPending?"Pruning...":"Confirm Prune"})]})]})})]})}function w(t){var c;if(!((c=t==null?void 0:t.rules)!=null&&c.length))return f;const r=t.rules,a=r.find(n=>n.target==="streams"&&n.action==="delete"),s=r.find(n=>n.target==="jobs"&&n.action==="delete"&&n.hasEntity===!1),i=r.find(n=>n.target==="jobs"&&n.action==="prune"&&n.hasEntity===!0),l=r.find(n=>n.target==="jobs"&&n.action==="delete"&&n.pruned===!0);return{pruneJobs:!!l,expire:(l==null?void 0:l.olderThan)??"180 days",engineStreams:!!a,engineStreamsExpire:(a==null?void 0:a.olderThan)??"1 day",workerStreams:!!a,workerStreamsExpire:(a==null?void 0:a.olderThan)??"90 days",stripAttributes:!!i,pruneTransient:!!s}}function H(t){const r=[];return t.engineStreams&&r.push({target:"streams",action:"delete",olderThan:t.engineStreamsExpire}),t.workerStreams&&t.workerStreamsExpire!==t.engineStreamsExpire&&r.push({target:"streams",action:"delete",olderThan:t.workerStreamsExpire}),t.pruneTransient&&r.push({target:"jobs",action:"delete",olderThan:t.expire,hasEntity:!1}),t.stripAttributes&&r.push({target:"jobs",action:"prune",olderThan:t.expire,hasEntity:!0}),t.pruneJobs&&r.push({target:"jobs",action:"delete",olderThan:t.expire,pruned:!0}),r}function S(t){var r;return((r=C.find(a=>a.value===t))==null?void 0:r.label)??""}function K(){const{data:t,isLoading:r}=$(),a=L(),[s,i]=d.useState(""),[l,c]=d.useState(f),[n,o]=d.useState(""),p=d.useCallback(()=>{t!=null&&t.config&&(i(t.config.schedule),c(w(t.config)),o(JSON.stringify({schedule:t.config.schedule,fields:w(t.config)})))},[t]);d.useEffect(()=>{p()},[p]);const x=JSON.stringify({schedule:s,fields:l}),y=n!==""&&x!==n,h=(t==null?void 0:t.active)??!1,J=()=>{const u=H(l);a.mutate({schedule:s,rules:u},{onSuccess:()=>{o(JSON.stringify({schedule:s,fields:l}))}})},A=()=>{p()};return r?e.jsx("div",{className:"animate-pulse h-40 bg-surface-sunken rounded"}):e.jsxs("div",{className:"space-y-8",children:[e.jsxs("div",{className:"grid grid-cols-1 @split:grid-cols-[1fr_auto] gap-10",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"Schedule"}),e.jsxs("div",{className:"flex items-end gap-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-2xs text-text-tertiary mb-1",children:"Cron Expression"}),e.jsx("input",{type:"text",value:s,onChange:u=>i(u.target.value),placeholder:"0 2 * * *",className:"input text-xs font-mono w-48"})]}),e.jsx("div",{children:e.jsxs("div",{className:"flex items-center gap-1.5 h-8",children:[e.jsx("span",{className:`w-1.5 h-1.5 rounded-full dot-ring ${h?"bg-status-success":"bg-text-tertiary"}`}),e.jsx("span",{className:`text-xs ${h?"text-status-success":"text-text-tertiary"}`,children:h?"Active":"Inactive"})]})}),S(s)&&e.jsx("p",{className:"text-xs text-text-tertiary h-8 flex items-center",children:S(s)})]}),e.jsx("div",{className:"flex flex-wrap gap-1.5 mt-3",children:C.map(u=>e.jsx("button",{type:"button",onClick:()=>i(u.value),className:`px-2.5 py-1 text-2xs rounded-full transition-colors ${s===u.value?"bg-accent/10 text-accent font-medium":"bg-surface-sunken text-text-tertiary hover:text-text-secondary"}`,children:u.label},u.value))})]}),e.jsxs("div",{className:"lg:w-72",children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"How It Works"}),e.jsxs("div",{className:"flex items-start gap-2 px-3 py-2 rounded bg-surface-sunken",children:[e.jsx(j,{className:"w-3.5 h-3.5 text-text-tertiary shrink-0 mt-0.5"}),e.jsx("p",{className:"text-2xs text-text-tertiary leading-relaxed",children:"Rules execute sequentially on each cron cycle. Engine streams can be pruned aggressively since they only contain internal routing data. Worker streams should be retained longer to preserve execution playback and input enrichment."})]})]})]}),e.jsx(P,{fields:l,onChange:c}),e.jsxs("div",{className:"flex items-center justify-between pt-2 border-t border-surface-border",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[y&&e.jsx("button",{onClick:A,className:"text-2xs text-text-tertiary hover:text-text-primary transition-colors",children:"Revert changes"}),a.error&&e.jsx("p",{className:"text-xs text-status-error",children:a.error.message})]}),e.jsx("button",{onClick:J,disabled:!y||!s.trim()||a.isPending,className:"btn-primary text-xs disabled:opacity-40 shrink-0",children:a.isPending?"Saving...":"Save Schedule"})]})]})}function Q({mode:t,onChange:r}){const a=(s,i,l)=>e.jsxs("button",{onClick:()=>r(s),className:`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${t===s?"bg-accent/10 text-accent font-medium":"text-text-tertiary hover:text-text-secondary hover:bg-surface-hover"}`,children:[i,l]});return e.jsxs("div",{className:"flex gap-1 p-0.5 bg-surface-sunken rounded-lg w-fit",children:[a("prune",e.jsx(I,{className:"w-3.5 h-3.5"}),"Prune Now"),a("schedule",e.jsx(D,{className:"w-3.5 h-3.5"}),"Schedule")]})}function ee(){const[t,r]=d.useState("schedule");return e.jsxs("div",{children:[e.jsx(F,{title:"DB Maintenance",docsHash:"#docs:dashboard.md:db-maintenance",actions:e.jsx(Q,{mode:t,onChange:r})}),e.jsxs("div",{className:"flex items-start gap-2 px-4 py-3 mb-8 rounded-md bg-accent/5 border border-accent/10",children:[e.jsx(j,{className:"w-4 h-4 text-accent shrink-0 mt-0.5"}),e.jsx("p",{className:"text-xs text-text-secondary leading-relaxed",children:"Workflow data grows as jobs complete. Operations are ordered safest-first: stream messages are always safe to prune, workflow reduction preserves results, and deletion is permanent."})]}),t==="prune"?e.jsx(U,{}):e.jsx(K,{})]})}export{ee as MaintenancePage};
2
+ //# sourceMappingURL=index-DSa-6Ux8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-DSa-6Ux8.js","sources":["../../src/api/maintenance.ts","../../src/pages/admin/maintenance/controls.tsx","../../src/pages/admin/maintenance/PruneSection.tsx","../../src/pages/admin/maintenance/ScheduleSection.tsx","../../src/pages/admin/maintenance/MaintenancePage.tsx"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface MaintenanceRule {\n target: 'streams' | 'jobs';\n action: 'delete' | 'prune';\n olderThan: string;\n hasEntity?: boolean;\n pruned?: boolean;\n}\n\nexport interface MaintenanceConfig {\n schedule: string;\n rules: MaintenanceRule[];\n}\n\nexport interface PruneOptions {\n expire?: string;\n jobs?: boolean;\n streams?: boolean;\n engineStreams?: boolean;\n engineStreamsExpire?: string;\n workerStreams?: boolean;\n workerStreamsExpire?: string;\n attributes?: boolean;\n entities?: string[];\n pruneTransient?: boolean;\n keepHmark?: boolean;\n}\n\nexport interface PruneResult {\n jobs?: number;\n streams?: number;\n engineStreams?: number;\n workerStreams?: number;\n attributes?: number;\n transient?: number;\n marked?: number;\n}\n\n// ── Maintenance config ────────────────────────────────────────────────────────\n\nexport function useMaintenanceConfig() {\n return useQuery<{ config: MaintenanceConfig; active: boolean }>({\n queryKey: ['maintenance'],\n queryFn: () => apiFetch('/config/maintenance'),\n });\n}\n\nexport function useUpdateMaintenanceConfig() {\n const queryClient = useQueryClient();\n return useMutation<\n { config: MaintenanceConfig; restarted: boolean },\n Error,\n MaintenanceConfig\n >({\n mutationFn: (config) =>\n apiFetch('/config/maintenance', {\n method: 'PUT',\n body: JSON.stringify(config),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['maintenance'] });\n },\n });\n}\n\n// ── DBA operations ────────────────────────────────────────────────────────────\n\nexport function usePrune() {\n return useMutation<PruneResult, Error, PruneOptions>({\n mutationFn: (options) =>\n apiFetch('/dba/prune', {\n method: 'POST',\n body: JSON.stringify(options),\n }),\n });\n}\n\nexport function useDeploy() {\n return useMutation<{ ok: boolean }, Error, void>({\n mutationFn: () =>\n apiFetch('/dba/deploy', { method: 'POST' }),\n });\n}\n","import { Info, ShieldCheck, ShieldAlert, ShieldOff } from 'lucide-react';\nimport { RETENTION_PERIOD_OPTIONS } from '../../../lib/constants';\n\n// ── Retention row (checkbox + label + select) ───────────────────────────────\n\nexport function RetentionRow({ checked, onToggle, label, hint, safety, value, onChange }: {\n checked: boolean;\n onToggle: (v: boolean) => void;\n label: string;\n hint: string;\n safety: 'safe' | 'moderate' | 'destructive';\n value: string;\n onChange: (v: string) => void;\n}) {\n const SafetyIcon = safety === 'safe' ? ShieldCheck : safety === 'moderate' ? ShieldAlert : ShieldOff;\n const safetyColor = safety === 'safe' ? 'text-status-success' : safety === 'moderate' ? 'text-status-warning' : 'text-status-error';\n const safetyLabel = safety === 'safe' ? 'Safe' : safety === 'moderate' ? 'Careful' : 'Permanent';\n\n return (\n <div className=\"flex items-center gap-4\">\n <label className=\"flex items-center gap-2.5 cursor-pointer w-80 shrink-0\">\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={(e) => onToggle(e.target.checked)}\n className=\"w-4 h-4 rounded border-border accent-accent shrink-0\"\n />\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-text-primary\">{label}</span>\n <span className={`flex items-center gap-0.5 text-2xs ${safetyColor}`}>\n <SafetyIcon className=\"w-3 h-3\" strokeWidth={1.5} />\n {safetyLabel}\n </span>\n </div>\n <p className=\"text-2xs text-text-tertiary\">{hint}</p>\n </div>\n </label>\n <select\n value={value}\n onChange={(e) => onChange(e.target.value)}\n disabled={!checked}\n className={`select text-xs w-36 transition-opacity ${!checked ? 'opacity-40 cursor-not-allowed' : ''}`}\n >\n {RETENTION_PERIOD_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n </div>\n );\n}\n\n// ── Cleanup checkbox ────────────────────────────────────────────────────────\n\nexport function CleanupCheck({ checked, onChange, label, description, safety }: {\n checked: boolean;\n onChange: (v: boolean) => void;\n label: string;\n description: string;\n safety: 'safe' | 'moderate' | 'destructive';\n}) {\n const SafetyIcon = safety === 'safe' ? ShieldCheck : safety === 'moderate' ? ShieldAlert : ShieldOff;\n const safetyColor = safety === 'safe' ? 'text-status-success' : safety === 'moderate' ? 'text-status-warning' : 'text-status-error';\n const safetyLabel = safety === 'safe' ? 'Safe' : safety === 'moderate' ? 'Careful' : 'Permanent';\n\n return (\n <label className=\"flex items-start gap-2.5 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={(e) => onChange(e.target.checked)}\n className=\"w-4 h-4 mt-0.5 rounded border-border accent-accent shrink-0\"\n />\n <div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-text-primary\">{label}</span>\n <span className={`flex items-center gap-0.5 text-2xs ${safetyColor}`}>\n <SafetyIcon className=\"w-3 h-3\" strokeWidth={1.5} />\n {safetyLabel}\n </span>\n </div>\n <p className=\"text-2xs text-text-tertiary\">{description}</p>\n </div>\n </label>\n );\n}\n\n// ── Cleanup callout ─────────────────────────────────────────────────────────\n\nexport function CleanupCallout() {\n return (\n <div className=\"flex items-start gap-2 mt-2 px-3 py-2 rounded bg-surface-sunken\">\n <Info className=\"w-3.5 h-3.5 text-text-tertiary shrink-0 mt-0.5\" />\n <p className=\"text-2xs text-text-tertiary leading-relaxed\">\n Stripping preserves workflow results and timeline data needed for the execution detail view.\n Transient jobs are internal bookkeeping that accumulates over time.\n </p>\n </div>\n );\n}\n\n// ── Prune fields state shape (shared between both panels) ───────────────────\n\nexport interface PruneFields {\n pruneJobs: boolean;\n expire: string;\n engineStreams: boolean;\n engineStreamsExpire: string;\n workerStreams: boolean;\n workerStreamsExpire: string;\n stripAttributes: boolean;\n pruneTransient: boolean;\n}\n\nexport const DEFAULT_PRUNE_FIELDS: PruneFields = {\n pruneJobs: true,\n expire: '30 days',\n engineStreams: true,\n engineStreamsExpire: '1 day',\n workerStreams: true,\n workerStreamsExpire: '90 days',\n stripAttributes: false,\n pruneTransient: false,\n};\n\nexport function hasSelection(f: PruneFields): boolean {\n return f.pruneJobs || f.engineStreams || f.workerStreams || f.stripAttributes || f.pruneTransient;\n}\n\n// ── Prune fields editor (reused by both Prune Now and Schedule) ─────────────\n\nexport function PruneFieldsEditor({ fields, onChange }: {\n fields: PruneFields;\n onChange: (f: PruneFields) => void;\n}) {\n const set = <K extends keyof PruneFields>(key: K, value: PruneFields[K]) =>\n onChange({ ...fields, [key]: value });\n\n return (\n <div className=\"space-y-8\">\n {/* Stream messages — always safe to prune */}\n <div>\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Stream Messages\n </p>\n <p className=\"text-2xs text-text-tertiary mb-4\">\n Processed routing messages. Already consumed — safe to remove after a short retention window.\n </p>\n <div className=\"space-y-3\">\n <RetentionRow\n checked={fields.engineStreams} onToggle={(v) => set('engineStreams', v)}\n label=\"Engine messages\" hint=\"Internal orchestration signals\"\n safety=\"safe\"\n value={fields.engineStreamsExpire} onChange={(v) => set('engineStreamsExpire', v)}\n />\n <RetentionRow\n checked={fields.workerStreams} onToggle={(v) => set('workerStreams', v)}\n label=\"Worker messages\" hint=\"Activity dispatch and response payloads\"\n safety=\"safe\"\n value={fields.workerStreamsExpire} onChange={(v) => set('workerStreamsExpire', v)}\n />\n </div>\n </div>\n\n {/* Workflow data — mutually exclusive: reduce OR delete */}\n <div>\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Completed Workflows\n </p>\n <p className=\"text-2xs text-text-tertiary mb-4\">\n Choose how to handle completed workflow records. Reducing strips step-level detail\n but keeps the workflow and its results. Deleting removes the record entirely.\n </p>\n <div className=\"space-y-3\">\n <label className=\"flex items-start gap-2.5 cursor-pointer\">\n <input\n type=\"radio\"\n name=\"workflow-cleanup\"\n checked={!fields.stripAttributes && !fields.pruneJobs}\n onChange={() => onChange({ ...fields, stripAttributes: false, pruneJobs: false })}\n className=\"w-4 h-4 mt-0.5 accent-accent shrink-0\"\n />\n <div>\n <span className=\"text-xs text-text-primary\">Keep as-is</span>\n <p className=\"text-2xs text-text-tertiary\">No changes to completed workflow records.</p>\n </div>\n </label>\n\n <div className=\"flex items-start gap-2.5\">\n <label className=\"flex items-start gap-2.5 cursor-pointer w-80 shrink-0\">\n <input\n type=\"radio\"\n name=\"workflow-cleanup\"\n checked={fields.stripAttributes && !fields.pruneJobs}\n onChange={() => onChange({ ...fields, stripAttributes: true, pruneJobs: false })}\n className=\"w-4 h-4 mt-0.5 accent-accent shrink-0\"\n />\n <div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-text-primary\">Reduce completed workflows</span>\n <span className=\"flex items-center gap-0.5 text-2xs text-status-warning\">\n <ShieldAlert className=\"w-3 h-3\" strokeWidth={1.5} />\n Careful\n </span>\n </div>\n <p className=\"text-2xs text-text-tertiary\">\n Strips step-level execution detail (activity inputs/outputs, internal state).\n Workflow results and timeline are preserved.\n </p>\n </div>\n </label>\n <select\n value={fields.expire}\n onChange={(e) => set('expire', e.target.value)}\n disabled={!fields.stripAttributes || fields.pruneJobs}\n className={`select text-xs w-36 transition-opacity mt-0.5 ${!fields.stripAttributes || fields.pruneJobs ? 'opacity-40 cursor-not-allowed' : ''}`}\n >\n {RETENTION_PERIOD_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n </div>\n\n <div className=\"flex items-start gap-2.5\">\n <label className=\"flex items-start gap-2.5 cursor-pointer w-80 shrink-0\">\n <input\n type=\"radio\"\n name=\"workflow-cleanup\"\n checked={fields.pruneJobs}\n onChange={() => onChange({ ...fields, pruneJobs: true, stripAttributes: false })}\n className=\"w-4 h-4 mt-0.5 accent-accent shrink-0\"\n />\n <div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-text-primary\">Delete completed workflows</span>\n <span className=\"flex items-center gap-0.5 text-2xs text-status-error\">\n <ShieldOff className=\"w-3 h-3\" strokeWidth={1.5} />\n Permanent\n </span>\n </div>\n <p className=\"text-2xs text-text-tertiary\">\n Permanently removes workflow records. Results, timeline, and all\n execution data are deleted and cannot be recovered.\n </p>\n </div>\n </label>\n <select\n value={fields.expire}\n onChange={(e) => set('expire', e.target.value)}\n disabled={!fields.pruneJobs}\n className={`select text-xs w-36 transition-opacity mt-0.5 ${!fields.pruneJobs ? 'opacity-40 cursor-not-allowed' : ''}`}\n >\n {RETENTION_PERIOD_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n </div>\n </div>\n <CleanupCallout />\n </div>\n </div>\n );\n}\n","import { useState } from 'react';\nimport { usePrune, type PruneResult } from '../../../api/maintenance';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport { PruneFieldsEditor, DEFAULT_PRUNE_FIELDS, hasSelection, type PruneFields } from './controls';\n\nfunction ResultCard({ label, value }: { label: string; value: number }) {\n return (\n <div>\n <p className=\"text-lg font-light text-text-primary\">{value.toLocaleString()}</p>\n <p className=\"text-2xs text-text-tertiary\">{label}</p>\n </div>\n );\n}\n\nexport function PruneSection() {\n const prune = usePrune();\n const [fields, setFields] = useState<PruneFields>(DEFAULT_PRUNE_FIELDS);\n const [result, setResult] = useState<PruneResult | null>(null);\n const [showConfirm, setShowConfirm] = useState(false);\n\n const handlePrune = () => {\n setResult(null);\n prune.mutate(\n {\n expire: fields.expire,\n jobs: fields.pruneJobs,\n engineStreams: fields.engineStreams,\n engineStreamsExpire: fields.engineStreamsExpire,\n workerStreams: fields.workerStreams,\n workerStreamsExpire: fields.workerStreamsExpire,\n attributes: fields.stripAttributes,\n pruneTransient: fields.pruneTransient,\n },\n {\n onSuccess: (data) => {\n setResult(data);\n setShowConfirm(false);\n },\n },\n );\n };\n\n return (\n <div className=\"space-y-8\">\n <PruneFieldsEditor fields={fields} onChange={setFields} />\n\n {/* Action bar */}\n <div className=\"flex items-center justify-between pt-2 border-t border-surface-border\">\n <p className=\"text-2xs text-text-tertiary\">\n {!hasSelection(fields)\n ? 'Select at least one operation to enable pruning.'\n : 'This action permanently deletes data and cannot be undone.'}\n </p>\n <button\n onClick={() => setShowConfirm(true)}\n disabled={!hasSelection(fields) || prune.isPending}\n className=\"bg-status-error text-text-inverse px-4 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity disabled:opacity-40 shrink-0\"\n >\n {prune.isPending ? 'Pruning...' : 'Prune Now'}\n </button>\n </div>\n\n {/* Results */}\n {result && (\n <div className=\"bg-surface-sunken rounded-md px-4 py-3\">\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-2\">\n Results\n </p>\n <div className=\"flex flex-wrap gap-6\">\n {result.jobs != null && result.jobs > 0 && <ResultCard label=\"Jobs deleted\" value={result.jobs} />}\n {result.engineStreams != null && result.engineStreams > 0 && <ResultCard label=\"Engine streams\" value={result.engineStreams} />}\n {result.workerStreams != null && result.workerStreams > 0 && <ResultCard label=\"Worker streams\" value={result.workerStreams} />}\n {result.streams != null && result.engineStreams == null && result.streams > 0 && <ResultCard label=\"Streams\" value={result.streams} />}\n {result.attributes != null && result.attributes > 0 && <ResultCard label=\"Artifacts stripped\" value={result.attributes} />}\n {result.transient != null && result.transient > 0 && <ResultCard label=\"Transient deleted\" value={result.transient} />}\n {result.marked != null && result.marked > 0 && <ResultCard label=\"Marked pruned\" value={result.marked} />}\n {Object.values(result).every((v) => !v || v === 0) && (\n <p className=\"text-xs text-text-tertiary\">Nothing to prune within the selected retention windows.</p>\n )}\n </div>\n </div>\n )}\n\n {prune.error && (\n <p className=\"text-xs text-status-error\">{(prune.error as Error).message}</p>\n )}\n\n {/* Confirm modal */}\n <Modal open={showConfirm} onClose={() => setShowConfirm(false)} title=\"Confirm Prune\">\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">\n This will permanently delete data. This action cannot be undone.\n </p>\n <ul className=\"text-xs text-text-secondary space-y-1 list-disc list-inside\">\n {fields.pruneJobs && <li>Delete jobs older than {fields.expire}</li>}\n {fields.engineStreams && <li>Delete engine streams older than {fields.engineStreamsExpire}</li>}\n {fields.workerStreams && <li>Delete worker streams older than {fields.workerStreamsExpire}</li>}\n {fields.stripAttributes && <li>Strip execution artifacts from completed jobs</li>}\n {fields.pruneTransient && <li>Delete transient (entity-less) jobs</li>}\n </ul>\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={() => setShowConfirm(false)} className=\"btn-secondary text-xs\">Cancel</button>\n <button\n onClick={handlePrune}\n className=\"bg-status-error text-text-inverse px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity\"\n disabled={prune.isPending}\n >\n {prune.isPending ? 'Pruning...' : 'Confirm Prune'}\n </button>\n </div>\n </div>\n </Modal>\n </div>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { Info } from 'lucide-react';\nimport {\n useMaintenanceConfig,\n useUpdateMaintenanceConfig,\n type MaintenanceConfig,\n} from '../../../api/maintenance';\nimport { CRON_PRESETS } from '../../../lib/constants';\nimport { PruneFieldsEditor, DEFAULT_PRUNE_FIELDS, type PruneFields } from './controls';\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\n/** Convert a MaintenanceConfig (rules array) into PruneFields for the editor. */\nfunction configToFields(config: MaintenanceConfig | undefined): PruneFields {\n if (!config?.rules?.length) return DEFAULT_PRUNE_FIELDS;\n const r = config.rules;\n const streamDelete = r.find((x) => x.target === 'streams' && x.action === 'delete');\n const jobDeleteTransient = r.find((x) => x.target === 'jobs' && x.action === 'delete' && x.hasEntity === false);\n const jobPrune = r.find((x) => x.target === 'jobs' && x.action === 'prune' && x.hasEntity === true);\n const jobDeletePruned = r.find((x) => x.target === 'jobs' && x.action === 'delete' && x.pruned === true);\n return {\n pruneJobs: !!jobDeletePruned,\n expire: jobDeletePruned?.olderThan ?? '180 days',\n engineStreams: !!streamDelete,\n engineStreamsExpire: streamDelete?.olderThan ?? '1 day',\n workerStreams: !!streamDelete,\n workerStreamsExpire: streamDelete?.olderThan ?? '90 days',\n stripAttributes: !!jobPrune,\n pruneTransient: !!jobDeleteTransient,\n };\n}\n\n/** Convert PruneFields back to a MaintenanceConfig rules array. */\nfunction fieldsToRules(f: PruneFields): MaintenanceConfig['rules'] {\n const rules: MaintenanceConfig['rules'] = [];\n if (f.engineStreams) {\n rules.push({ target: 'streams', action: 'delete', olderThan: f.engineStreamsExpire });\n }\n if (f.workerStreams && f.workerStreamsExpire !== f.engineStreamsExpire) {\n rules.push({ target: 'streams', action: 'delete', olderThan: f.workerStreamsExpire });\n }\n if (f.pruneTransient) {\n rules.push({ target: 'jobs', action: 'delete', olderThan: f.expire, hasEntity: false });\n }\n if (f.stripAttributes) {\n rules.push({ target: 'jobs', action: 'prune', olderThan: f.expire, hasEntity: true });\n }\n if (f.pruneJobs) {\n rules.push({ target: 'jobs', action: 'delete', olderThan: f.expire, pruned: true });\n }\n return rules;\n}\n\nfunction describeCron(expr: string): string {\n return CRON_PRESETS.find((p) => p.value === expr)?.label ?? '';\n}\n\n// ── Main ────────────────────────────────────────────────────────────────────\n\nexport function ScheduleSection() {\n const { data, isLoading } = useMaintenanceConfig();\n const updateConfig = useUpdateMaintenanceConfig();\n\n const [schedule, setSchedule] = useState('');\n const [fields, setFields] = useState<PruneFields>(DEFAULT_PRUNE_FIELDS);\n const [savedSnapshot, setSavedSnapshot] = useState('');\n\n // Sync from server config when loaded\n const syncFromServer = useCallback(() => {\n if (!data?.config) return;\n setSchedule(data.config.schedule);\n setFields(configToFields(data.config));\n setSavedSnapshot(JSON.stringify({ schedule: data.config.schedule, fields: configToFields(data.config) }));\n }, [data]);\n\n useEffect(() => { syncFromServer(); }, [syncFromServer]);\n\n const currentSnapshot = JSON.stringify({ schedule, fields });\n const isDirty = savedSnapshot !== '' && currentSnapshot !== savedSnapshot;\n const active = data?.active ?? false;\n\n const handleSave = () => {\n const rules = fieldsToRules(fields);\n updateConfig.mutate(\n { schedule, rules },\n {\n onSuccess: () => {\n setSavedSnapshot(JSON.stringify({ schedule, fields }));\n },\n },\n );\n };\n\n const handleRevert = () => {\n syncFromServer();\n };\n\n if (isLoading) {\n return <div className=\"animate-pulse h-40 bg-surface-sunken rounded\" />;\n }\n\n return (\n <div className=\"space-y-8\">\n {/* Cron schedule + status */}\n <div className=\"grid grid-cols-1 @split:grid-cols-[1fr_auto] gap-10\">\n <div>\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-4\">\n Schedule\n </p>\n <div className=\"flex items-end gap-4\">\n <div>\n <label className=\"block text-2xs text-text-tertiary mb-1\">Cron Expression</label>\n <input\n type=\"text\"\n value={schedule}\n onChange={(e) => setSchedule(e.target.value)}\n placeholder=\"0 2 * * *\"\n className=\"input text-xs font-mono w-48\"\n />\n </div>\n <div>\n <div className=\"flex items-center gap-1.5 h-8\">\n <span className={`w-1.5 h-1.5 rounded-full dot-ring ${active ? 'bg-status-success' : 'bg-text-tertiary'}`} />\n <span className={`text-xs ${active ? 'text-status-success' : 'text-text-tertiary'}`}>\n {active ? 'Active' : 'Inactive'}\n </span>\n </div>\n </div>\n {describeCron(schedule) && (\n <p className=\"text-xs text-text-tertiary h-8 flex items-center\">{describeCron(schedule)}</p>\n )}\n </div>\n\n {/* Preset pills */}\n <div className=\"flex flex-wrap gap-1.5 mt-3\">\n {CRON_PRESETS.map((preset) => (\n <button\n key={preset.value}\n type=\"button\"\n onClick={() => setSchedule(preset.value)}\n className={`px-2.5 py-1 text-2xs rounded-full transition-colors ${\n schedule === preset.value\n ? 'bg-accent/10 text-accent font-medium'\n : 'bg-surface-sunken text-text-tertiary hover:text-text-secondary'\n }`}\n >\n {preset.label}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"lg:w-72\">\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-4\">\n How It Works\n </p>\n <div className=\"flex items-start gap-2 px-3 py-2 rounded bg-surface-sunken\">\n <Info className=\"w-3.5 h-3.5 text-text-tertiary shrink-0 mt-0.5\" />\n <p className=\"text-2xs text-text-tertiary leading-relaxed\">\n Rules execute sequentially on each cron cycle. Engine streams can be pruned aggressively\n since they only contain internal routing data. Worker streams should be retained longer\n to preserve execution playback and input enrichment.\n </p>\n </div>\n </div>\n </div>\n\n {/* Same prune fields as Prune Now */}\n <PruneFieldsEditor fields={fields} onChange={setFields} />\n\n {/* Action bar */}\n <div className=\"flex items-center justify-between pt-2 border-t border-surface-border\">\n <div className=\"flex items-center gap-3\">\n {isDirty && (\n <button\n onClick={handleRevert}\n className=\"text-2xs text-text-tertiary hover:text-text-primary transition-colors\"\n >\n Revert changes\n </button>\n )}\n {updateConfig.error && (\n <p className=\"text-xs text-status-error\">{(updateConfig.error as Error).message}</p>\n )}\n </div>\n <button\n onClick={handleSave}\n disabled={!isDirty || !schedule.trim() || updateConfig.isPending}\n className=\"btn-primary text-xs disabled:opacity-40 shrink-0\"\n >\n {updateConfig.isPending ? 'Saving...' : 'Save Schedule'}\n </button>\n </div>\n </div>\n );\n}\n","import { useState } from 'react';\nimport { Trash2, Clock, Info } from 'lucide-react';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { PruneSection } from './PruneSection';\nimport { ScheduleSection } from './ScheduleSection';\n\ntype Mode = 'prune' | 'schedule';\n\nfunction ModeToggle({ mode, onChange }: { mode: Mode; onChange: (m: Mode) => void }) {\n const btn = (m: Mode, icon: React.ReactNode, label: string) => (\n <button\n onClick={() => onChange(m)}\n className={`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${\n mode === m\n ? 'bg-accent/10 text-accent font-medium'\n : 'text-text-tertiary hover:text-text-secondary hover:bg-surface-hover'\n }`}\n >\n {icon}\n {label}\n </button>\n );\n\n return (\n <div className=\"flex gap-1 p-0.5 bg-surface-sunken rounded-lg w-fit\">\n {btn('prune', <Trash2 className=\"w-3.5 h-3.5\" />, 'Prune Now')}\n {btn('schedule', <Clock className=\"w-3.5 h-3.5\" />, 'Schedule')}\n </div>\n );\n}\n\nexport function MaintenancePage() {\n const [mode, setMode] = useState<Mode>('schedule');\n\n return (\n <div>\n <PageHeader\n title=\"DB Maintenance\"\n docsHash=\"#docs:dashboard.md:db-maintenance\"\n actions={<ModeToggle mode={mode} onChange={setMode} />}\n />\n\n <div className=\"flex items-start gap-2 px-4 py-3 mb-8 rounded-md bg-accent/5 border border-accent/10\">\n <Info className=\"w-4 h-4 text-accent shrink-0 mt-0.5\" />\n <p className=\"text-xs text-text-secondary leading-relaxed\">\n Workflow data grows as jobs complete. Operations are ordered safest-first: stream messages are\n always safe to prune, workflow reduction preserves results, and deletion is permanent.\n </p>\n </div>\n\n {mode === 'prune' ? <PruneSection /> : <ScheduleSection />}\n </div>\n );\n}\n"],"names":["useMaintenanceConfig","useQuery","apiFetch","useUpdateMaintenanceConfig","queryClient","useQueryClient","useMutation","config","usePrune","options","RetentionRow","checked","onToggle","label","hint","safety","value","onChange","SafetyIcon","ShieldCheck","ShieldAlert","ShieldOff","safetyColor","safetyLabel","jsxs","jsx","e","RETENTION_PERIOD_OPTIONS","opt","CleanupCallout","Info","DEFAULT_PRUNE_FIELDS","hasSelection","f","PruneFieldsEditor","fields","set","key","v","ResultCard","PruneSection","prune","setFields","useState","result","setResult","showConfirm","setShowConfirm","handlePrune","data","Modal","configToFields","_a","streamDelete","x","jobDeleteTransient","jobPrune","jobDeletePruned","fieldsToRules","rules","describeCron","expr","CRON_PRESETS","p","ScheduleSection","isLoading","updateConfig","schedule","setSchedule","savedSnapshot","setSavedSnapshot","syncFromServer","useCallback","useEffect","currentSnapshot","isDirty","active","handleSave","handleRevert","preset","ModeToggle","mode","btn","m","icon","Trash2","Clock","MaintenancePage","setMode","PageHeader"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Plus Jakarta Sans,system-ui,-apple-system,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,Fira Code,ui-monospace,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--lt-radius-field: .25rem;--lt-color-scheme: light;--lt-surface: 255 255 255;--lt-surface-raised: 255 255 255;--lt-surface-sunken: 255 255 255;--lt-text-inverse: 255 255 255;--lt-heading: 51 51 51;--lt-text-primary: 23 23 23;--lt-text-secondary: 55 55 55;--lt-text-tertiary: 88 88 88;--lt-text-quaternary: 122 122 122;--lt-status-active: 37 99 235;--lt-status-pending: 180 83 9;--lt-status-draft: 194 65 12;--lt-status-success: 22 101 52;--lt-status-warning: 180 83 9;--lt-status-error: 220 38 38;--lt-status-pending-graphic: 245 158 11;--lt-status-draft-graphic: 249 115 22;--lt-status-success-graphic: 22 163 74;--lt-status-queued: 3 105 161;--lt-status-claimed: 194 65 12;--lt-status-queued-graphic: 14 165 233;--lt-status-claimed-graphic: 249 115 22;--lt-field-bg: 230 235 242;--lt-field-border: 203 213 225;--lt-select-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");--lt-type-2xs: .6875rem;--lt-type-xs: .75rem;--lt-type-sm: .875rem;--lt-type-base: 1rem;--lt-type-lg: 1.125rem;--lt-type-xl: 1.375rem;--lt-type-2xl: 1.75rem;--lt-space-page-x: clamp(1.25rem, 3vw, 2.5rem);--lt-space-page-y: 2rem;--lt-space-field-y: 1.25rem;--lt-space-col-gap: clamp(1.5rem, 3vw, 3.5rem);--lt-measure-form: 56rem}:root,[data-theme=blue]{--lt-accent: 37 99 235;--lt-accent-hover: 29 78 216;--lt-accent-muted: 147 197 253;--lt-accent-faint: 219 234 254;--lt-surface: 248 250 253;--lt-surface-hover: 232 239 247;--lt-field-bg: 228 236 246;--lt-field-focus: 236 243 254;--lt-surface-border: 208 217 231}[data-theme=blue]{--lt-logo: 24 116 240}[data-theme=violet]{--lt-accent: 123 59 224;--lt-accent-hover: 98 41 190;--lt-accent-muted: 187 156 239;--lt-accent-faint: 229 217 249;--lt-surface: 249 248 252;--lt-surface-hover: 236 234 245;--lt-field-bg: 232 229 242;--lt-field-focus: 244 238 252;--lt-surface-border: 215 210 228}[data-theme=red]{--lt-accent: 220 56 45;--lt-accent-hover: 179 42 34;--lt-accent-muted: 236 154 147;--lt-accent-faint: 247 218 214;--lt-surface: 252 250 249;--lt-surface-hover: 244 236 233;--lt-field-bg: 242 233 230;--lt-field-focus: 252 242 240;--lt-surface-border: 226 211 208}[data-theme=green]{--lt-accent: 22 163 74;--lt-accent-hover: 15 118 55;--lt-accent-muted: 74 222 128;--lt-accent-faint: 187 247 208;--lt-surface: 248 251 249;--lt-surface-hover: 234 242 237;--lt-field-bg: 229 240 233;--lt-field-focus: 240 253 244;--lt-surface-border: 205 223 211}[data-theme=rose]{--lt-accent: 236 72 153;--lt-accent-hover: 219 39 119;--lt-accent-muted: 249 168 212;--lt-accent-faint: 252 231 243;--lt-surface: 252 249 250;--lt-surface-hover: 244 235 239;--lt-field-bg: 242 232 236;--lt-field-focus: 253 242 248;--lt-surface-border: 228 209 218}[data-theme=orange]{--lt-accent: 249 115 22;--lt-accent-hover: 234 88 12;--lt-accent-muted: 254 215 170;--lt-accent-faint: 255 247 237;--lt-surface: 252 250 248;--lt-surface-hover: 244 237 230;--lt-field-bg: 242 235 226;--lt-field-focus: 255 247 237;--lt-surface-border: 228 216 202}body{--tw-bg-opacity: 1;background-color:rgb(var(--lt-surface) / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(var(--lt-text-primary) / var(--tw-text-opacity, 1));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color-scheme:var(--lt-color-scheme)}*{--tw-border-opacity: 1;border-color:rgb(var(--lt-surface-border) / var(--tw-border-opacity, 1))}.container{width:100%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.btn-primary{--tw-bg-opacity: 1;background-color:rgb(var(--lt-accent) / var(--tw-bg-opacity, 1));padding:.625rem 1.25rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(var(--lt-text-inverse) / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-primary:hover{--tw-bg-opacity: 1;background-color:rgb(var(--lt-accent-hover) / var(--tw-bg-opacity, 1))}.btn-primary{border-radius:var(--lt-radius-field)}.btn-secondary{border-width:1px;--tw-border-opacity: 1;border-color:rgb(var(--lt-surface-border) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--lt-surface-raised) / var(--tw-bg-opacity, 1));padding:.625rem 1.25rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(var(--lt-text-primary) / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-secondary:hover{--tw-bg-opacity: 1;background-color:rgb(var(--lt-surface-hover) / var(--tw-bg-opacity, 1))}.btn-secondary{border-radius:var(--lt-radius-field)}.btn-ghost{padding:.625rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(var(--lt-text-secondary) / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-ghost:hover{--tw-bg-opacity: 1;background-color:rgb(var(--lt-surface-hover) / var(--tw-bg-opacity, 1))}.btn-ghost{border-radius:var(--lt-radius-field)}.row-hover{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.1s}.field,.input,.select,.textarea{border-width:1px;--tw-border-opacity: 1;border-color:rgb(var(--lt-field-border) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--lt-field-bg) / var(--tw-bg-opacity, 1));padding:.375rem .625rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(var(--lt-text-primary) / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.field::-moz-placeholder,.input::-moz-placeholder,.select::-moz-placeholder,.textarea::-moz-placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.field::placeholder,.input::placeholder,.select::placeholder,.textarea::placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.field:focus,.input:focus,.select:focus,.textarea:focus{--tw-border-opacity: 1;border-color:rgb(var(--lt-accent) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--lt-field-focus) / var(--tw-bg-opacity, 1));outline:2px solid transparent;outline-offset:2px}.\!input{border-width:1px;--tw-border-opacity: 1;border-color:rgb(var(--lt-field-border) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--lt-field-bg) / var(--tw-bg-opacity, 1));padding:.375rem .625rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(var(--lt-text-primary) / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\!input::-moz-placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.\!input::placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.\!input:focus{--tw-border-opacity: 1;border-color:rgb(var(--lt-accent) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--lt-field-focus) / var(--tw-bg-opacity, 1));outline:2px solid transparent;outline-offset:2px}.field,.input,.select,.textarea{border-radius:var(--lt-radius-field)}.\!input{border-radius:var(--lt-radius-field)!important}.field,.input,.textarea,.\!input{width:100%}.select{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;padding-right:1.75rem;background-image:var(--lt-select-chevron);background-repeat:no-repeat;background-position:right .5rem center;background-size:1rem}.textarea{resize:vertical;line-height:1.625}.input-json{width:100%;resize:vertical;border-width:1px;--tw-border-opacity: 1;border-color:rgb(var(--lt-field-border) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--lt-field-bg) / var(--tw-bg-opacity, 1));padding:.5rem .75rem;font-family:JetBrains Mono,Fira Code,ui-monospace,monospace;font-size:var(--lt-type-2xs);--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);line-height:1.625;--tw-text-opacity: 1;color:rgb(var(--lt-text-primary) / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.input-json::-moz-placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.input-json::placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.input-json:focus{--tw-border-opacity: 1;border-color:rgb(var(--lt-accent) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--lt-field-focus) / var(--tw-bg-opacity, 1));outline:2px solid transparent;outline-offset:2px}.input-json{border-radius:var(--lt-radius-field)}.textarea-quiet{width:100%;resize:none;overflow:hidden;border-width:1px;--tw-border-opacity: 1;border-color:rgb(var(--lt-field-border) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--lt-field-bg) / var(--tw-bg-opacity, 1));padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;line-height:1.625;--tw-text-opacity: 1;color:rgb(var(--lt-text-primary) / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.textarea-quiet::-moz-placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.textarea-quiet::placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.textarea-quiet:focus{--tw-border-opacity: 1;border-color:rgb(var(--lt-accent) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--lt-field-focus) / var(--tw-bg-opacity, 1));outline:2px solid transparent;outline-offset:2px}.textarea-quiet{border-radius:var(--lt-radius-field)}.\!label,.label{margin-bottom:.125rem;display:block;font-size:.75rem;line-height:1rem;font-weight:600;--tw-text-opacity: 1;color:rgb(var(--lt-text-secondary) / var(--tw-text-opacity, 1))}.hint{margin-top:.25rem;font-size:var(--lt-type-2xs);line-height:1.375;--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.heading-1{font-size:2.125rem;font-weight:300;font-variant-caps:small-caps;letter-spacing:.02em;line-height:1.2;color:rgb(var(--lt-heading))}.heading-2{font-size:1.5rem;font-weight:300;font-variant-caps:small-caps;letter-spacing:.02em;color:rgb(var(--lt-heading))}.heading-3{font-size:1.25rem;font-weight:300;font-variant-caps:small-caps;letter-spacing:.02em;color:rgb(var(--lt-heading))}.section-header{margin-bottom:.75rem;display:block;border-bottom-width:1px;border-color:rgb(var(--lt-surface-border) / .3);padding-bottom:.375rem;font-size:1.25rem;font-weight:300;font-variant-caps:small-caps;letter-spacing:.03em;color:rgb(var(--lt-heading))}.section-h2{font-size:1.25rem;font-weight:300;font-variant-caps:small-caps;letter-spacing:.03em;color:rgb(var(--lt-heading))}.dot-ring{mask-image:radial-gradient(circle closest-side,transparent calc(100% - 1.5px),#000 calc(100% - .75px));-webkit-mask-image:radial-gradient(circle closest-side,transparent calc(100% - 1.5px),#000 calc(100% - .75px))}.logo-mark{background-color:rgb(var(--lt-logo, var(--lt-accent)));mask-image:var(--logo-url);mask-repeat:no-repeat;mask-position:center;mask-size:contain;-webkit-mask-image:var(--logo-url);-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;-webkit-mask-size:contain}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-4{top:1rem;right:1rem;bottom:1rem;left:1rem}.inset-y-0{top:0;bottom:0}.-left-\[3px\]{left:-3px}.-right-0\.5{right:-.125rem}.-right-1{right:-.25rem}.-top-0\.5{top:-.125rem}.-top-1{top:-.25rem}.bottom-0{bottom:0}.bottom-1{bottom:.25rem}.bottom-3{bottom:.75rem}.left-0{left:0}.left-1\/2{left:50%}.left-2\.5{left:.625rem}.left-4{left:1rem}.left-56{left:14rem}.left-\[7px\]{left:7px}.right-0{right:0}.right-2{right:.5rem}.right-3{right:.75rem}.right-4{right:1rem}.right-6{right:1.5rem}.top-0{top:0}.top-1{top:.25rem}.top-1\/2{top:50%}.top-14{top:3.5rem}.top-16{top:4rem}.top-2{top:.5rem}.top-3{top:.75rem}.top-4{top:1rem}.top-6{top:1.5rem}.top-\[2\.75rem\]{top:2.75rem}.top-\[3px\]{top:3px}.top-\[60px\]{top:60px}.top-full{top:100%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[1\]{z-index:1}.z-\[45\]{z-index:45}.z-\[5\]{z-index:5}.z-\[9999\]{z-index:9999}.col-span-2{grid-column:span 2 / span 2}.col-span-full{grid-column:1 / -1}.float-right{float:right}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.-mx-3{margin-left:-.75rem;margin-right:-.75rem}.-mx-page-x{margin-left:calc(var(--lt-space-page-x) * -1);margin-right:calc(var(--lt-space-page-x) * -1)}.-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.-mb-16{margin-bottom:-4rem}.-ml-10{margin-left:-2.5rem}.-ml-8{margin-left:-2rem}.-ml-\[12\.5rem\]{margin-left:-12.5rem}.-ml-\[9\.75rem\]{margin-left:-9.75rem}.-ml-page-x{margin-left:calc(var(--lt-space-page-x) * -1)}.-mr-0\.5{margin-right:-.125rem}.-mr-10{margin-right:-2.5rem}.-mr-page-x{margin-right:calc(var(--lt-space-page-x) * -1)}.-mt-1{margin-top:-.25rem}.-mt-10{margin-top:-2.5rem}.-mt-2{margin-top:-.5rem}.-mt-4{margin-top:-1rem}.-mt-6{margin-top:-1.5rem}.-mt-8{margin-top:-2rem}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-10{margin-bottom:2.5rem}.mb-12{margin-bottom:3rem}.mb-2{margin-bottom:.5rem}.mb-2\.5{margin-bottom:.625rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-6{margin-left:1.5rem}.ml-7{margin-left:1.75rem}.ml-8{margin-left:2rem}.ml-9{margin-left:2.25rem}.ml-\[19px\]{margin-left:19px}.ml-auto{margin-left:auto}.mr-1\.5{margin-right:.375rem}.mr-16{margin-right:4rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-12{margin-top:3rem}.mt-14{margin-top:3.5rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-3\.5{margin-top:.875rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-7{margin-top:1.75rem}.mt-8{margin-top:2rem}.mt-\[3em\]{margin-top:3em}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-40{height:10rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-60{height:15rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-96{height:24rem}.h-\[12\.5rem\]{height:12.5rem}.h-\[14px\]{height:14px}.h-\[15px\]{height:15px}.h-\[16rem\]{height:16rem}.h-\[18px\]{height:18px}.h-\[50vh\]{height:50vh}.h-\[7px\]{height:7px}.h-\[80px\]{height:80px}.h-\[9px\]{height:9px}.h-\[calc\(100vh-5\.25rem\)\]{height:calc(100vh - 5.25rem)}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-0{max-height:0px}.max-h-40{max-height:10rem}.max-h-44{max-height:11rem}.max-h-48{max-height:12rem}.max-h-60{max-height:15rem}.max-h-64{max-height:16rem}.max-h-80{max-height:20rem}.max-h-\[200px\]{max-height:200px}.max-h-\[280px\]{max-height:280px}.max-h-\[300px\]{max-height:300px}.max-h-\[30vh\]{max-height:30vh}.max-h-\[400px\]{max-height:400px}.max-h-\[40vh\]{max-height:40vh}.max-h-\[50vh\]{max-height:50vh}.max-h-\[60vh\]{max-height:60vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[85vh\]{max-height:85vh}.max-h-\[900px\]{max-height:900px}.max-h-\[90vh\]{max-height:90vh}.max-h-\[calc\(100vh-220px\)\]{max-height:calc(100vh - 220px)}.max-h-\[calc\(100vh-3\.5rem\)\]{max-height:calc(100vh - 3.5rem)}.max-h-\[calc\(100vh-8rem\)\]{max-height:calc(100vh - 8rem)}.max-h-none{max-height:none}.max-h-screen{max-height:100vh}.min-h-0{min-height:0px}.min-h-\[100px\]{min-height:100px}.min-h-\[120px\]{min-height:120px}.min-h-\[160px\]{min-height:160px}.min-h-\[200px\]{min-height:200px}.min-h-\[28px\]{min-height:28px}.min-h-\[300px\]{min-height:300px}.min-h-\[34px\]{min-height:34px}.min-h-\[360px\]{min-height:360px}.min-h-\[40vh\]{min-height:40vh}.min-h-\[48px\]{min-height:48px}.min-h-\[55vh\]{min-height:55vh}.min-h-\[60px\]{min-height:60px}.min-h-\[80px\]{min-height:80px}.min-h-\[calc\(100vh-12rem\)\]{min-height:calc(100vh - 12rem)}.min-h-\[calc\(100vh-80px\)\]{min-height:calc(100vh - 80px)}.min-h-screen{min-height:100vh}.w-0\.5{width:.125rem}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-1\/4{width:25%}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-2\/3{width:66.666667%}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:1rem}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-52{width:13rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-60{width:15rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-\[12\.5rem\]{width:12.5rem}.w-\[120px\]{width:120px}.w-\[14px\]{width:14px}.w-\[15px\]{width:15px}.w-\[16rem\]{width:16rem}.w-\[18px\]{width:18px}.w-\[200px\]{width:200px}.w-\[22rem\]{width:22rem}.w-\[280px\]{width:280px}.w-\[28rem\]{width:28rem}.w-\[30\%\]{width:30%}.w-\[36rem\]{width:36rem}.w-\[380px\]{width:380px}.w-\[40vw\]{width:40vw}.w-\[440px\]{width:440px}.w-\[48rem\]{width:48rem}.w-\[60px\]{width:60px}.w-\[7px\]{width:7px}.w-\[80\%\]{width:80%}.w-\[9px\]{width:9px}.w-auto{width:auto}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-4{min-width:1rem}.min-w-64{min-width:16rem}.min-w-\[120px\]{min-width:120px}.min-w-\[140px\]{min-width:140px}.min-w-\[14px\]{min-width:14px}.min-w-\[16rem\]{min-width:16rem}.min-w-\[180px\]{min-width:180px}.min-w-\[18px\]{min-width:18px}.min-w-\[20rem\]{min-width:20rem}.min-w-\[260px\]{min-width:260px}.min-w-\[6rem\]{min-width:6rem}.min-w-\[800px\]{min-width:800px}.min-w-\[80px\]{min-width:80px}.min-w-\[min\(16rem\,100\%\)\]{min-width:min(16rem,100%)}.max-w-0{max-width:0px}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-48{max-width:12rem}.max-w-64{max-width:16rem}.max-w-\[120px\]{max-width:120px}.max-w-\[150px\]{max-width:150px}.max-w-\[160px\]{max-width:160px}.max-w-\[180px\]{max-width:180px}.max-w-\[19rem\]{max-width:19rem}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-\[24rem\]{max-width:24rem}.max-w-\[25rem\]{max-width:25rem}.max-w-\[32rem\]{max-width:32rem}.max-w-\[460px\]{max-width:460px}.max-w-\[85\%\]{max-width:85%}.max-w-\[85vw\]{max-width:85vw}.max-w-\[90vw\]{max-width:90vw}.max-w-form{max-width:var(--lt-measure-form)}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.flex-none{flex:none}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.table-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.origin-center{transform-origin:center}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-px{--tw-translate-x: -1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-\[60vh\]{--tw-translate-y: -60vh;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-4{--tw-translate-x: 1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[120vw\]{--tw-translate-x: 120vw;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[18px\]{--tw-translate-x: 18px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[3px\]{--tw-translate-x: 3px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-full{--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-1{--tw-translate-y: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-\[120deg\]{--tw-rotate: -120deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-0{--tw-rotate: 0deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-\[3\]{--tw-scale-x: 3;--tw-scale-y: 3;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.animate-\[field-enter_0\.2s_ease-out\]{animation:field-enter .2s ease-out}.animate-\[field-error-in_0\.3s_ease-out\]{animation:field-error-in .3s ease-out}.animate-\[field-shake_0\.4s_ease-in-out\]{animation:field-shake .4s ease-in-out}.animate-\[section-enter_0\.25s_ease-out\]{animation:section-enter .25s ease-out}.animate-\[triage-glow_6s_ease-in-out_infinite\]{animation:triage-glow 6s ease-in-out infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-crosshair{cursor:crosshair}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.cursor-zoom-out{cursor:zoom-out}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize-y{resize:vertical}.resize{resize:both}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-\[1fr_240px\]{grid-template-columns:1fr 240px}.grid-cols-\[1fr_auto_auto\]{grid-template-columns:1fr auto auto}.grid-cols-\[300px_1fr\]{grid-template-columns:300px 1fr}.grid-cols-\[3fr_1fr\]{grid-template-columns:3fr 1fr}.grid-cols-\[minmax\(0\,1fr\)_7rem_13rem_4\.5rem\]{grid-template-columns:minmax(0,1fr) 7rem 13rem 4.5rem}.grid-cols-\[repeat\(auto-fill\,minmax\(15rem\,1fr\)\)\]{grid-template-columns:repeat(auto-fill,minmax(15rem,1fr))}.grid-rows-\[0fr\]{grid-template-rows:0fr}.grid-rows-\[1fr\]{grid-template-rows:1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0px}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-10{gap:2.5rem}.gap-12{gap:3rem}.gap-16{gap:4rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-px{gap:1px}.gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.gap-x-14{-moz-column-gap:3.5rem;column-gap:3.5rem}.gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.gap-x-col-gap{-moz-column-gap:var(--lt-space-col-gap);column-gap:var(--lt-space-col-gap)}.gap-y-0\.5{row-gap:.125rem}.gap-y-1{row-gap:.25rem}.gap-y-1\.5{row-gap:.375rem}.gap-y-10{row-gap:2.5rem}.gap-y-2{row-gap:.5rem}.gap-y-3{row-gap:.75rem}.gap-y-4{row-gap:1rem}.gap-y-5{row-gap:1.25rem}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem * var(--tw-space-y-reverse))}.space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(3rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem * var(--tw-space-y-reverse))}.space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(3.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3.5rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.625rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.875rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1px * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-surface-border>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(var(--lt-surface-border) / var(--tw-divide-opacity, 1))}.divide-surface-border\/30>:not([hidden])~:not([hidden]){border-color:rgb(var(--lt-surface-border) / .3)}.divide-surface-border\/40>:not([hidden])~:not([hidden]){border-color:rgb(var(--lt-surface-border) / .4)}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.self-center{align-self:center}.self-stretch{align-self:stretch}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-x-clip{overflow-x:clip}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-\[0\.125em\]{border-radius:.125em}.rounded-\[4px\]{border-radius:4px}.rounded-\[var\(--lt-radius-field\)\]{border-radius:var(--lt-radius-field)}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-y{border-top-width:1px;border-bottom-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-accent{--tw-border-opacity: 1;border-color:rgb(var(--lt-accent) / var(--tw-border-opacity, 1))}.border-accent-faint{--tw-border-opacity: 1;border-color:rgb(var(--lt-accent-faint) / var(--tw-border-opacity, 1))}.border-accent-muted{--tw-border-opacity: 1;border-color:rgb(var(--lt-accent-muted) / var(--tw-border-opacity, 1))}.border-accent-muted\/40{border-color:rgb(var(--lt-accent-muted) / .4)}.border-accent\/10{border-color:rgb(var(--lt-accent) / .1)}.border-accent\/15{border-color:rgb(var(--lt-accent) / .15)}.border-accent\/20{border-color:rgb(var(--lt-accent) / .2)}.border-accent\/25{border-color:rgb(var(--lt-accent) / .25)}.border-accent\/30{border-color:rgb(var(--lt-accent) / .3)}.border-accent\/40{border-color:rgb(var(--lt-accent) / .4)}.border-purple-500\/20{border-color:#a855f733}.border-status-active{--tw-border-opacity: 1;border-color:rgb(var(--lt-status-active) / var(--tw-border-opacity, 1))}.border-status-claimed{--tw-border-opacity: 1;border-color:rgb(var(--lt-status-claimed) / var(--tw-border-opacity, 1))}.border-status-claimed-graphic\/40{border-color:rgb(var(--lt-status-claimed-graphic) / .4)}.border-status-draft{--tw-border-opacity: 1;border-color:rgb(var(--lt-status-draft) / var(--tw-border-opacity, 1))}.border-status-error{--tw-border-opacity: 1;border-color:rgb(var(--lt-status-error) / var(--tw-border-opacity, 1))}.border-status-error\/20{border-color:rgb(var(--lt-status-error) / .2)}.border-status-error\/30{border-color:rgb(var(--lt-status-error) / .3)}.border-status-error\/50{border-color:rgb(var(--lt-status-error) / .5)}.border-status-error\/60{border-color:rgb(var(--lt-status-error) / .6)}.border-status-pending-graphic\/40{border-color:rgb(var(--lt-status-pending-graphic) / .4)}.border-status-pending\/30{border-color:rgb(var(--lt-status-pending) / .3)}.border-status-success{--tw-border-opacity: 1;border-color:rgb(var(--lt-status-success) / var(--tw-border-opacity, 1))}.border-status-success-graphic\/40{border-color:rgb(var(--lt-status-success-graphic) / .4)}.border-status-success\/30{border-color:rgb(var(--lt-status-success) / .3)}.border-status-warning{--tw-border-opacity: 1;border-color:rgb(var(--lt-status-warning) / var(--tw-border-opacity, 1))}.border-status-warning\/20{border-color:rgb(var(--lt-status-warning) / .2)}.border-status-warning\/30{border-color:rgb(var(--lt-status-warning) / .3)}.border-status-warning\/70{border-color:rgb(var(--lt-status-warning) / .7)}.border-surface{--tw-border-opacity: 1;border-color:rgb(var(--lt-surface) / var(--tw-border-opacity, 1))}.border-surface-border{--tw-border-opacity: 1;border-color:rgb(var(--lt-surface-border) / var(--tw-border-opacity, 1))}.border-surface-border\/15{border-color:rgb(var(--lt-surface-border) / .15)}.border-surface-border\/30{border-color:rgb(var(--lt-surface-border) / .3)}.border-surface-border\/40{border-color:rgb(var(--lt-surface-border) / .4)}.border-surface-border\/50{border-color:rgb(var(--lt-surface-border) / .5)}.border-surface-border\/60{border-color:rgb(var(--lt-surface-border) / .6)}.border-surface-field-border{--tw-border-opacity: 1;border-color:rgb(var(--lt-field-border) / var(--tw-border-opacity, 1))}.border-text-inverse\/70{border-color:rgb(var(--lt-text-inverse) / .7)}.border-text-quaternary\/40{border-color:rgb(var(--lt-text-quaternary) / .4)}.border-text-tertiary{--tw-border-opacity: 1;border-color:rgb(var(--lt-text-tertiary) / var(--tw-border-opacity, 1))}.\!border-l-accent{--tw-border-opacity: 1 !important;border-left-color:rgb(var(--lt-accent) / var(--tw-border-opacity, 1))!important}.border-l-accent{--tw-border-opacity: 1;border-left-color:rgb(var(--lt-accent) / var(--tw-border-opacity, 1))}.border-l-accent\/30{border-left-color:rgb(var(--lt-accent) / .3)}.border-l-transparent{border-left-color:transparent}.border-r-surface-border{--tw-border-opacity: 1;border-right-color:rgb(var(--lt-surface-border) / var(--tw-border-opacity, 1))}.border-r-transparent{border-right-color:transparent}.\!bg-status-error{--tw-bg-opacity: 1 !important;background-color:rgb(var(--lt-status-error) / var(--tw-bg-opacity, 1))!important}.bg-\[a-z\]{background-color:a-z}.bg-accent{--tw-bg-opacity: 1;background-color:rgb(var(--lt-accent) / var(--tw-bg-opacity, 1))}.bg-accent-faint{--tw-bg-opacity: 1;background-color:rgb(var(--lt-accent-faint) / var(--tw-bg-opacity, 1))}.bg-accent-faint\/50{background-color:rgb(var(--lt-accent-faint) / .5)}.bg-accent-muted{--tw-bg-opacity: 1;background-color:rgb(var(--lt-accent-muted) / var(--tw-bg-opacity, 1))}.bg-accent-muted\/20{background-color:rgb(var(--lt-accent-muted) / .2)}.bg-accent\/10{background-color:rgb(var(--lt-accent) / .1)}.bg-accent\/15{background-color:rgb(var(--lt-accent) / .15)}.bg-accent\/20{background-color:rgb(var(--lt-accent) / .2)}.bg-accent\/5{background-color:rgb(var(--lt-accent) / .05)}.bg-accent\/60{background-color:rgb(var(--lt-accent) / .6)}.bg-accent\/\[0\.06\]{background-color:rgb(var(--lt-accent) / .06)}.bg-accent\/\[0\.08\]{background-color:rgb(var(--lt-accent) / .08)}.bg-amber-300\/\[0\.08\]{background-color:#fcd34d14}.bg-amber-400\/\[0\.08\]{background-color:#fbbf2414}.bg-black\/20{background-color:#0003}.bg-black\/30{background-color:#0000004d}.bg-blue-400\/\[0\.08\]{background-color:#60a5fa14}.bg-blue-500\/10{background-color:#3b82f61a}.bg-cyan-400\/\[0\.08\]{background-color:#22d3ee14}.bg-emerald-400\/\[0\.08\]{background-color:#34d39914}.bg-fuchsia-400\/\[0\.08\]{background-color:#e879f914}.bg-green-400\/\[0\.08\]{background-color:#4ade8014}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-indigo-400\/\[0\.08\]{background-color:#818cf814}.bg-lime-400\/\[0\.08\]{background-color:#a3e63514}.bg-orange-400\/\[0\.08\]{background-color:#fb923c14}.bg-pink-300\/\[0\.08\]{background-color:#f9a8d414}.bg-pink-400\/\[0\.08\]{background-color:#f472b614}.bg-purple-400\/\[0\.08\]{background-color:#c084fc14}.bg-purple-500\/10{background-color:#a855f71a}.bg-red-400\/\[0\.08\]{background-color:#f8717114}.bg-rose-300\/\[0\.08\]{background-color:#fda4af14}.bg-rose-400\/\[0\.08\]{background-color:#fb718514}.bg-sky-300\/\[0\.08\]{background-color:#7dd3fc14}.bg-sky-400\/\[0\.08\]{background-color:#38bdf814}.bg-status-active{--tw-bg-opacity: 1;background-color:rgb(var(--lt-status-active) / var(--tw-bg-opacity, 1))}.bg-status-active\/10{background-color:rgb(var(--lt-status-active) / .1)}.bg-status-active\/60{background-color:rgb(var(--lt-status-active) / .6)}.bg-status-active\/70{background-color:rgb(var(--lt-status-active) / .7)}.bg-status-claimed-graphic{--tw-bg-opacity: 1;background-color:rgb(var(--lt-status-claimed-graphic) / var(--tw-bg-opacity, 1))}.bg-status-claimed-graphic\/15{background-color:rgb(var(--lt-status-claimed-graphic) / .15)}.bg-status-draft{--tw-bg-opacity: 1;background-color:rgb(var(--lt-status-draft) / var(--tw-bg-opacity, 1))}.bg-status-draft-graphic{--tw-bg-opacity: 1;background-color:rgb(var(--lt-status-draft-graphic) / var(--tw-bg-opacity, 1))}.bg-status-draft\/10{background-color:rgb(var(--lt-status-draft) / .1)}.bg-status-draft\/30{background-color:rgb(var(--lt-status-draft) / .3)}.bg-status-error{--tw-bg-opacity: 1;background-color:rgb(var(--lt-status-error) / var(--tw-bg-opacity, 1))}.bg-status-error\/10{background-color:rgb(var(--lt-status-error) / .1)}.bg-status-error\/5{background-color:rgb(var(--lt-status-error) / .05)}.bg-status-error\/70{background-color:rgb(var(--lt-status-error) / .7)}.bg-status-error\/\[0\.04\]{background-color:rgb(var(--lt-status-error) / .04)}.bg-status-pending{--tw-bg-opacity: 1;background-color:rgb(var(--lt-status-pending) / var(--tw-bg-opacity, 1))}.bg-status-pending-graphic{--tw-bg-opacity: 1;background-color:rgb(var(--lt-status-pending-graphic) / var(--tw-bg-opacity, 1))}.bg-status-pending-graphic\/15{background-color:rgb(var(--lt-status-pending-graphic) / .15)}.bg-status-pending\/10{background-color:rgb(var(--lt-status-pending) / .1)}.bg-status-queued-graphic{--tw-bg-opacity: 1;background-color:rgb(var(--lt-status-queued-graphic) / var(--tw-bg-opacity, 1))}.bg-status-success{--tw-bg-opacity: 1;background-color:rgb(var(--lt-status-success) / var(--tw-bg-opacity, 1))}.bg-status-success-graphic{--tw-bg-opacity: 1;background-color:rgb(var(--lt-status-success-graphic) / var(--tw-bg-opacity, 1))}.bg-status-success-graphic\/15{background-color:rgb(var(--lt-status-success-graphic) / .15)}.bg-status-success\/10{background-color:rgb(var(--lt-status-success) / .1)}.bg-status-success\/20{background-color:rgb(var(--lt-status-success) / .2)}.bg-status-success\/30{background-color:rgb(var(--lt-status-success) / .3)}.bg-status-warning{--tw-bg-opacity: 1;background-color:rgb(var(--lt-status-warning) / var(--tw-bg-opacity, 1))}.bg-status-warning\/10{background-color:rgb(var(--lt-status-warning) / .1)}.bg-status-warning\/15{background-color:rgb(var(--lt-status-warning) / .15)}.bg-status-warning\/5{background-color:rgb(var(--lt-status-warning) / .05)}.bg-status-warning\/\[0\.06\]{background-color:rgb(var(--lt-status-warning) / .06)}.bg-stone-400\/\[0\.08\]{background-color:#a8a29e14}.bg-surface{--tw-bg-opacity: 1;background-color:rgb(var(--lt-surface) / var(--tw-bg-opacity, 1))}.bg-surface-border{--tw-bg-opacity: 1;background-color:rgb(var(--lt-surface-border) / var(--tw-bg-opacity, 1))}.bg-surface-border\/60{background-color:rgb(var(--lt-surface-border) / .6)}.bg-surface-border\/70{background-color:rgb(var(--lt-surface-border) / .7)}.bg-surface-border\/80{background-color:rgb(var(--lt-surface-border) / .8)}.bg-surface-field{--tw-bg-opacity: 1;background-color:rgb(var(--lt-field-bg) / var(--tw-bg-opacity, 1))}.bg-surface-hover{--tw-bg-opacity: 1;background-color:rgb(var(--lt-surface-hover) / var(--tw-bg-opacity, 1))}.bg-surface-hover\/30{background-color:rgb(var(--lt-surface-hover) / .3)}.bg-surface-raised{--tw-bg-opacity: 1;background-color:rgb(var(--lt-surface-raised) / var(--tw-bg-opacity, 1))}.bg-surface-raised\/50{background-color:rgb(var(--lt-surface-raised) / .5)}.bg-surface-raised\/\[0\.03\]{background-color:rgb(var(--lt-surface-raised) / .03)}.bg-surface-sunken{--tw-bg-opacity: 1;background-color:rgb(var(--lt-surface-sunken) / var(--tw-bg-opacity, 1))}.bg-surface-sunken\/15{background-color:rgb(var(--lt-surface-sunken) / .15)}.bg-surface-sunken\/20{background-color:rgb(var(--lt-surface-sunken) / .2)}.bg-surface-sunken\/30{background-color:rgb(var(--lt-surface-sunken) / .3)}.bg-surface-sunken\/40{background-color:rgb(var(--lt-surface-sunken) / .4)}.bg-surface-sunken\/50{background-color:rgb(var(--lt-surface-sunken) / .5)}.bg-surface-sunken\/60{background-color:rgb(var(--lt-surface-sunken) / .6)}.bg-surface-sunken\/75{background-color:rgb(var(--lt-surface-sunken) / .75)}.bg-surface-sunken\/80{background-color:rgb(var(--lt-surface-sunken) / .8)}.bg-surface-sunken\/90{background-color:rgb(var(--lt-surface-sunken) / .9)}.bg-surface\/90{background-color:rgb(var(--lt-surface) / .9)}.bg-surface\/95{background-color:rgb(var(--lt-surface) / .95)}.bg-teal-300\/\[0\.08\]{background-color:#5eead414}.bg-teal-400\/\[0\.08\]{background-color:#2dd4bf14}.bg-text-inverse{--tw-bg-opacity: 1;background-color:rgb(var(--lt-text-inverse) / var(--tw-bg-opacity, 1))}.bg-text-primary\/30{background-color:rgb(var(--lt-text-primary) / .3)}.bg-text-primary\/60{background-color:rgb(var(--lt-text-primary) / .6)}.bg-text-quaternary{--tw-bg-opacity: 1;background-color:rgb(var(--lt-text-quaternary) / var(--tw-bg-opacity, 1))}.bg-text-secondary{--tw-bg-opacity: 1;background-color:rgb(var(--lt-text-secondary) / var(--tw-bg-opacity, 1))}.bg-text-tertiary{--tw-bg-opacity: 1;background-color:rgb(var(--lt-text-tertiary) / var(--tw-bg-opacity, 1))}.bg-text-tertiary\/30{background-color:rgb(var(--lt-text-tertiary) / .3)}.bg-transparent{background-color:transparent}.bg-violet-300\/\[0\.08\]{background-color:#c4b5fd14}.bg-violet-400\/\[0\.08\]{background-color:#a78bfa14}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-400\/\[0\.08\]{background-color:#facc1514}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.from-accent\/\[0\.04\]{--tw-gradient-from: rgb(var(--lt-accent) / .04) var(--tw-gradient-from-position);--tw-gradient-to: rgb(var(--lt-accent) / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-transparent{--tw-gradient-to: transparent var(--tw-gradient-to-position)}.fill-surface{fill:rgb(var(--lt-surface) / 1)}.fill-text-primary{fill:rgb(var(--lt-text-primary) / 1)}.fill-text-quaternary{fill:rgb(var(--lt-text-quaternary) / 1)}.fill-text-tertiary{fill:rgb(var(--lt-text-tertiary) / 1)}.stroke-accent{stroke:rgb(var(--lt-accent) / 1)}.stroke-current{stroke:currentColor}.stroke-surface-border{stroke:rgb(var(--lt-surface-border) / 1)}.stroke-text-quaternary{stroke:rgb(var(--lt-text-quaternary) / 1)}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.object-top{-o-object-position:top;object-position:top}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.\!px-2{padding-left:.5rem!important;padding-right:.5rem!important}.\!px-2\.5{padding-left:.625rem!important;padding-right:.625rem!important}.\!py-0\.5{padding-top:.125rem!important;padding-bottom:.125rem!important}.\!py-1\.5{padding-top:.375rem!important;padding-bottom:.375rem!important}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-12{padding-left:3rem;padding-right:3rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.px-page-x{padding-left:var(--lt-space-page-x);padding-right:var(--lt-space-page-x)}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-24{padding-top:6rem;padding-bottom:6rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-\[2px\]{padding-top:2px;padding-bottom:2px}.py-px{padding-top:1px;padding-bottom:1px}.pb-0{padding-bottom:0}.pb-0\.5{padding-bottom:.125rem}.pb-1{padding-bottom:.25rem}.pb-1\.5{padding-bottom:.375rem}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-24{padding-bottom:6rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pl-0{padding-left:0}.pl-1{padding-left:.25rem}.pl-1\.5{padding-left:.375rem}.pl-10{padding-left:2.5rem}.pl-11{padding-left:2.75rem}.pl-14{padding-left:3.5rem}.pl-16{padding-left:4rem}.pl-2{padding-left:.5rem}.pl-2\.5{padding-left:.625rem}.pl-3{padding-left:.75rem}.pl-3\.5{padding-left:.875rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pl-52{padding-left:13rem}.pl-6{padding-left:1.5rem}.pl-8{padding-left:2rem}.pl-\[18px\]{padding-left:18px}.pr-1{padding-right:.25rem}.pr-10{padding-right:2.5rem}.pr-2{padding-right:.5rem}.pr-2\.5{padding-right:.625rem}.pr-28{padding-right:7rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-5{padding-right:1.25rem}.pr-6{padding-right:1.5rem}.pr-7{padding-right:1.75rem}.pr-8{padding-right:2rem}.pr-page-x{padding-right:var(--lt-space-page-x)}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-1\.5{padding-top:.375rem}.pt-10{padding-top:2.5rem}.pt-2{padding-top:.5rem}.pt-2\.5{padding-top:.625rem}.pt-24{padding-top:6rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.pt-8{padding-top:2rem}.pt-9{padding-top:2.25rem}.pt-\[36px\]{padding-top:36px}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.font-mono{font-family:JetBrains Mono,Fira Code,ui-monospace,monospace}.font-sans{font-family:Plus Jakarta Sans,system-ui,-apple-system,sans-serif}.\!text-2xs{font-size:var(--lt-type-2xs)!important}.text-2xl{font-size:1.5rem;line-height:2rem}.text-2xs{font-size:var(--lt-type-2xs)}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[0\.5em\]{font-size:.5em}.text-\[1\.40625rem\]{font-size:1.40625rem}.text-\[36px\]{font-size:36px}.text-\[44px\]{font-size:44px}.text-\[8\.5px\]{font-size:8.5px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.italic{font-style:italic}.ordinal{--tw-ordinal: ordinal;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[0\.12em\]{letter-spacing:.12em}.tracking-\[0\.15em\]{letter-spacing:.15em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-\[a-z\]{color:a-z}.text-accent{--tw-text-opacity: 1;color:rgb(var(--lt-accent) / var(--tw-text-opacity, 1))}.text-accent-muted{--tw-text-opacity: 1;color:rgb(var(--lt-accent-muted) / var(--tw-text-opacity, 1))}.text-accent\/40{color:rgb(var(--lt-accent) / .4)}.text-accent\/50{color:rgb(var(--lt-accent) / .5)}.text-accent\/60{color:rgb(var(--lt-accent) / .6)}.text-accent\/70{color:rgb(var(--lt-accent) / .7)}.text-accent\/75{color:rgb(var(--lt-accent) / .75)}.text-accent\/80{color:rgb(var(--lt-accent) / .8)}.text-accent\/90{color:rgb(var(--lt-accent) / .9)}.text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-cyan-400{--tw-text-opacity: 1;color:rgb(34 211 238 / var(--tw-text-opacity, 1))}.text-emerald-400{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.text-fuchsia-400{--tw-text-opacity: 1;color:rgb(232 121 249 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-heading{--tw-text-opacity: 1;color:rgb(var(--lt-heading) / var(--tw-text-opacity, 1))}.text-indigo-400{--tw-text-opacity: 1;color:rgb(129 140 248 / var(--tw-text-opacity, 1))}.text-inherit{color:inherit}.text-lime-400{--tw-text-opacity: 1;color:rgb(163 230 53 / var(--tw-text-opacity, 1))}.text-orange-400{--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity, 1))}.text-pink-300{--tw-text-opacity: 1;color:rgb(249 168 212 / var(--tw-text-opacity, 1))}.text-pink-400{--tw-text-opacity: 1;color:rgb(244 114 182 / var(--tw-text-opacity, 1))}.text-purple-400{--tw-text-opacity: 1;color:rgb(192 132 252 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-rose-300{--tw-text-opacity: 1;color:rgb(253 164 175 / var(--tw-text-opacity, 1))}.text-rose-400{--tw-text-opacity: 1;color:rgb(251 113 133 / var(--tw-text-opacity, 1))}.text-sky-300{--tw-text-opacity: 1;color:rgb(125 211 252 / var(--tw-text-opacity, 1))}.text-sky-400{--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.text-status-active{--tw-text-opacity: 1;color:rgb(var(--lt-status-active) / var(--tw-text-opacity, 1))}.text-status-active\/70{color:rgb(var(--lt-status-active) / .7)}.text-status-claimed{--tw-text-opacity: 1;color:rgb(var(--lt-status-claimed) / var(--tw-text-opacity, 1))}.text-status-draft{--tw-text-opacity: 1;color:rgb(var(--lt-status-draft) / var(--tw-text-opacity, 1))}.text-status-error{--tw-text-opacity: 1;color:rgb(var(--lt-status-error) / var(--tw-text-opacity, 1))}.text-status-error\/50{color:rgb(var(--lt-status-error) / .5)}.text-status-error\/60{color:rgb(var(--lt-status-error) / .6)}.text-status-error\/70{color:rgb(var(--lt-status-error) / .7)}.text-status-error\/80{color:rgb(var(--lt-status-error) / .8)}.text-status-pending{--tw-text-opacity: 1;color:rgb(var(--lt-status-pending) / var(--tw-text-opacity, 1))}.text-status-queued{--tw-text-opacity: 1;color:rgb(var(--lt-status-queued) / var(--tw-text-opacity, 1))}.text-status-success{--tw-text-opacity: 1;color:rgb(var(--lt-status-success) / var(--tw-text-opacity, 1))}.text-status-success\/70{color:rgb(var(--lt-status-success) / .7)}.text-status-success\/80{color:rgb(var(--lt-status-success) / .8)}.text-status-warning{--tw-text-opacity: 1;color:rgb(var(--lt-status-warning) / var(--tw-text-opacity, 1))}.text-stone-400{--tw-text-opacity: 1;color:rgb(168 162 158 / var(--tw-text-opacity, 1))}.text-surface-border{--tw-text-opacity: 1;color:rgb(var(--lt-surface-border) / var(--tw-text-opacity, 1))}.text-teal-300{--tw-text-opacity: 1;color:rgb(94 234 212 / var(--tw-text-opacity, 1))}.text-teal-400{--tw-text-opacity: 1;color:rgb(45 212 191 / var(--tw-text-opacity, 1))}.text-text-inverse{--tw-text-opacity: 1;color:rgb(var(--lt-text-inverse) / var(--tw-text-opacity, 1))}.text-text-inverse\/70{color:rgb(var(--lt-text-inverse) / .7)}.text-text-primary{--tw-text-opacity: 1;color:rgb(var(--lt-text-primary) / var(--tw-text-opacity, 1))}.text-text-quaternary{--tw-text-opacity: 1;color:rgb(var(--lt-text-quaternary) / var(--tw-text-opacity, 1))}.text-text-quaternary\/40{color:rgb(var(--lt-text-quaternary) / .4)}.text-text-quaternary\/50{color:rgb(var(--lt-text-quaternary) / .5)}.text-text-quaternary\/60{color:rgb(var(--lt-text-quaternary) / .6)}.text-text-quaternary\/70{color:rgb(var(--lt-text-quaternary) / .7)}.text-text-secondary{--tw-text-opacity: 1;color:rgb(var(--lt-text-secondary) / var(--tw-text-opacity, 1))}.text-text-tertiary{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.text-text-tertiary\/30{color:rgb(var(--lt-text-tertiary) / .3)}.text-text-tertiary\/40{color:rgb(var(--lt-text-tertiary) / .4)}.text-text-tertiary\/50{color:rgb(var(--lt-text-tertiary) / .5)}.text-text-tertiary\/60{color:rgb(var(--lt-text-tertiary) / .6)}.text-text-tertiary\/70{color:rgb(var(--lt-text-tertiary) / .7)}.text-violet-300{--tw-text-opacity: 1;color:rgb(196 181 253 / var(--tw-text-opacity, 1))}.text-violet-400{--tw-text-opacity: 1;color:rgb(167 139 250 / var(--tw-text-opacity, 1))}.text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.line-through{text-decoration-line:line-through}.decoration-text-tertiary\/30{text-decoration-color:rgb(var(--lt-text-tertiary) / .3)}.accent-accent{accent-color:rgb(var(--lt-accent) / 1)}.accent-status-error{accent-color:rgb(var(--lt-status-error) / 1)}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-90{opacity:.9}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-black\/5{--tw-shadow-color: rgb(0 0 0 / .05);--tw-shadow: var(--tw-shadow-colored)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-accent{--tw-ring-opacity: 1;--tw-ring-color: rgb(var(--lt-accent) / var(--tw-ring-opacity, 1))}.ring-accent\/40{--tw-ring-color: rgb(var(--lt-accent) / .4)}.ring-surface-border{--tw-ring-opacity: 1;--tw-ring-color: rgb(var(--lt-surface-border) / var(--tw-ring-opacity, 1))}.ring-offset-1{--tw-ring-offset-width: 1px}.ring-offset-surface{--tw-ring-offset-color: rgb(var(--lt-surface) / 1)}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.brightness-150{--tw-brightness: brightness(1.5);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.grayscale{--tw-grayscale: grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-\[2px\]{--tw-backdrop-blur: blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[grid-template-rows\]{transition-property:grid-template-rows;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-\[1500ms\]{transition-duration:1.5s}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\@container{container-type:inline-size}.\@container\/filters{container-type:inline-size;container-name:filters}.\@container\/table{container-type:inline-size;container-name:table}.\[animation-delay\:150ms\]{animation-delay:.15s}.\[animation-delay\:300ms\]{animation-delay:.3s}.\[font-variant-caps\:small-caps\]{font-variant-caps:small-caps}@keyframes fadeIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes triage-glow{0%{box-shadow:0 0 3px rgb(var(--lt-accent) / .15)}8.3%{box-shadow:0 0 10px 2px rgb(var(--lt-accent) / .4)}16.7%,to{box-shadow:0 0 3px rgb(var(--lt-accent) / .15)}}.animate-page-enter{animation:fadeIn .15s ease-out both}@keyframes pageFade{0%{opacity:0}to{opacity:1}}.animate-page-in{animation:pageFade .2s ease-out both}@keyframes field-enter{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}@keyframes section-enter{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}@keyframes field-shake{0%,to{transform:translate(0)}15%{transform:translate(-4px)}30%{transform:translate(3px)}45%{transform:translate(-2px)}60%{transform:translate(1px)}75%{transform:translate(0)}}@keyframes field-error-in{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}.bg-stripes{background-image:repeating-linear-gradient(-45deg,transparent,transparent 3px,rgb(var(--lt-text-inverse) / .15) 3px,rgb(var(--lt-text-inverse) / .15) 6px);background-color:rgb(var(--lt-status-pending-graphic))}.placeholder\:italic::-moz-placeholder{font-style:italic}.placeholder\:italic::placeholder{font-style:italic}.placeholder\:text-text-tertiary::-moz-placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.placeholder\:text-text-tertiary::placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.placeholder\:text-text-tertiary\/40::-moz-placeholder{color:rgb(var(--lt-text-tertiary) / .4)}.placeholder\:text-text-tertiary\/40::placeholder{color:rgb(var(--lt-text-tertiary) / .4)}.placeholder\:text-text-tertiary\/50::-moz-placeholder{color:rgb(var(--lt-text-tertiary) / .5)}.placeholder\:text-text-tertiary\/50::placeholder{color:rgb(var(--lt-text-tertiary) / .5)}.first\:mt-0:first-child{margin-top:0}.first\:border-t-0:first-child{border-top-width:0px}.first\:pt-1:first-child{padding-top:.25rem}.last\:border-b-0:last-child{border-bottom-width:0px}.focus-within\:border-accent:focus-within{--tw-border-opacity: 1;border-color:rgb(var(--lt-accent) / var(--tw-border-opacity, 1))}.focus-within\:ring-1:focus-within{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.hover\:scale-110:hover{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-\[1\.05\]:hover{--tw-scale-x: 1.05;--tw-scale-y: 1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-\[1\.5\]:hover{--tw-scale-x: 1.5;--tw-scale-y: 1.5;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-accent:hover{--tw-border-opacity: 1;border-color:rgb(var(--lt-accent) / var(--tw-border-opacity, 1))}.hover\:border-accent\/40:hover{border-color:rgb(var(--lt-accent) / .4)}.hover\:border-accent\/50:hover{border-color:rgb(var(--lt-accent) / .5)}.hover\:border-status-error:hover{--tw-border-opacity: 1;border-color:rgb(var(--lt-status-error) / var(--tw-border-opacity, 1))}.hover\:border-surface-border:hover{--tw-border-opacity: 1;border-color:rgb(var(--lt-surface-border) / var(--tw-border-opacity, 1))}.hover\:border-text-tertiary:hover{--tw-border-opacity: 1;border-color:rgb(var(--lt-text-tertiary) / var(--tw-border-opacity, 1))}.hover\:\!bg-status-error\/90:hover{background-color:rgb(var(--lt-status-error) / .9)!important}.hover\:bg-accent-hover:hover{--tw-bg-opacity: 1;background-color:rgb(var(--lt-accent-hover) / var(--tw-bg-opacity, 1))}.hover\:bg-accent-muted:hover{--tw-bg-opacity: 1;background-color:rgb(var(--lt-accent-muted) / var(--tw-bg-opacity, 1))}.hover\:bg-accent\/10:hover{background-color:rgb(var(--lt-accent) / .1)}.hover\:bg-accent\/15:hover{background-color:rgb(var(--lt-accent) / .15)}.hover\:bg-accent\/20:hover{background-color:rgb(var(--lt-accent) / .2)}.hover\:bg-accent\/25:hover{background-color:rgb(var(--lt-accent) / .25)}.hover\:bg-accent\/30:hover{background-color:rgb(var(--lt-accent) / .3)}.hover\:bg-accent\/90:hover{background-color:rgb(var(--lt-accent) / .9)}.hover\:bg-accent\/\[0\.04\]:hover{background-color:rgb(var(--lt-accent) / .04)}.hover\:bg-status-error\/10:hover{background-color:rgb(var(--lt-status-error) / .1)}.hover\:bg-status-error\/20:hover{background-color:rgb(var(--lt-status-error) / .2)}.hover\:bg-status-error\/5:hover{background-color:rgb(var(--lt-status-error) / .05)}.hover\:bg-status-error\/80:hover{background-color:rgb(var(--lt-status-error) / .8)}.hover\:bg-status-error\/90:hover{background-color:rgb(var(--lt-status-error) / .9)}.hover\:bg-status-success\/10:hover{background-color:rgb(var(--lt-status-success) / .1)}.hover\:bg-status-success\/20:hover{background-color:rgb(var(--lt-status-success) / .2)}.hover\:bg-status-warning\/\[0\.1\]:hover{background-color:rgb(var(--lt-status-warning) / .1)}.hover\:bg-surface-hover:hover{--tw-bg-opacity: 1;background-color:rgb(var(--lt-surface-hover) / var(--tw-bg-opacity, 1))}.hover\:bg-surface-hover\/30:hover{background-color:rgb(var(--lt-surface-hover) / .3)}.hover\:bg-surface-hover\/40:hover{background-color:rgb(var(--lt-surface-hover) / .4)}.hover\:bg-surface-hover\/50:hover{background-color:rgb(var(--lt-surface-hover) / .5)}.hover\:bg-surface-raised:hover{--tw-bg-opacity: 1;background-color:rgb(var(--lt-surface-raised) / var(--tw-bg-opacity, 1))}.hover\:bg-surface-raised\/30:hover{background-color:rgb(var(--lt-surface-raised) / .3)}.hover\:bg-surface-raised\/60:hover{background-color:rgb(var(--lt-surface-raised) / .6)}.hover\:bg-surface-sunken:hover{--tw-bg-opacity: 1;background-color:rgb(var(--lt-surface-sunken) / var(--tw-bg-opacity, 1))}.hover\:bg-surface-sunken\/40:hover{background-color:rgb(var(--lt-surface-sunken) / .4)}.hover\:bg-surface-sunken\/70:hover{background-color:rgb(var(--lt-surface-sunken) / .7)}.hover\:text-accent:hover{--tw-text-opacity: 1;color:rgb(var(--lt-accent) / var(--tw-text-opacity, 1))}.hover\:text-accent-hover:hover{--tw-text-opacity: 1;color:rgb(var(--lt-accent-hover) / var(--tw-text-opacity, 1))}.hover\:text-accent\/80:hover{color:rgb(var(--lt-accent) / .8)}.hover\:text-status-active:hover{--tw-text-opacity: 1;color:rgb(var(--lt-status-active) / var(--tw-text-opacity, 1))}.hover\:text-status-error:hover{--tw-text-opacity: 1;color:rgb(var(--lt-status-error) / var(--tw-text-opacity, 1))}.hover\:text-status-error\/80:hover{color:rgb(var(--lt-status-error) / .8)}.hover\:text-status-success:hover{--tw-text-opacity: 1;color:rgb(var(--lt-status-success) / var(--tw-text-opacity, 1))}.hover\:text-status-success\/80:hover{color:rgb(var(--lt-status-success) / .8)}.hover\:text-status-warning:hover{--tw-text-opacity: 1;color:rgb(var(--lt-status-warning) / var(--tw-text-opacity, 1))}.hover\:text-status-warning\/80:hover{color:rgb(var(--lt-status-warning) / .8)}.hover\:text-text-inverse:hover{--tw-text-opacity: 1;color:rgb(var(--lt-text-inverse) / var(--tw-text-opacity, 1))}.hover\:text-text-primary:hover{--tw-text-opacity: 1;color:rgb(var(--lt-text-primary) / var(--tw-text-opacity, 1))}.hover\:text-text-secondary:hover{--tw-text-opacity: 1;color:rgb(var(--lt-text-secondary) / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-70:hover{opacity:.7}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-90:hover{opacity:.9}.hover\:shadow-md:hover{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:brightness-110:hover{--tw-brightness: brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.focus\:border-accent:focus{--tw-border-opacity: 1;border-color:rgb(var(--lt-accent) / var(--tw-border-opacity, 1))}.focus\:border-status-error:focus{--tw-border-opacity: 1;border-color:rgb(var(--lt-status-error) / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-inset:focus{--tw-ring-inset: inset}.focus\:ring-accent:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(var(--lt-accent) / var(--tw-ring-opacity, 1))}.focus\:ring-accent\/30:focus{--tw-ring-color: rgb(var(--lt-accent) / .3)}.focus\:ring-accent\/40:focus{--tw-ring-color: rgb(var(--lt-accent) / .4)}.focus\:ring-accent\/50:focus{--tw-ring-color: rgb(var(--lt-accent) / .5)}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-accent\/40:focus-visible{--tw-ring-color: rgb(var(--lt-accent) / .4)}.focus-visible\:ring-status-warning\/40:focus-visible{--tw-ring-color: rgb(var(--lt-status-warning) / .4)}.disabled\:cursor-default:disabled{cursor:default}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:no-underline:disabled{text-decoration-line:none}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:hover\:border-surface-border:hover:disabled{--tw-border-opacity: 1;border-color:rgb(var(--lt-surface-border) / var(--tw-border-opacity, 1))}.group\/srv:hover .group-hover\/srv\:visible{visibility:visible}.group:hover .group-hover\:block{display:block}.group:hover .group-hover\:border-accent\/60{border-color:rgb(var(--lt-accent) / .6)}.group\/row:hover .group-hover\/row\:text-text-primary{--tw-text-opacity: 1;color:rgb(var(--lt-text-primary) / var(--tw-text-opacity, 1))}.group\/row:hover .group-hover\/row\:text-text-secondary{--tw-text-opacity: 1;color:rgb(var(--lt-text-secondary) / var(--tw-text-opacity, 1))}.group\/section:hover .group-hover\/section\:text-text-tertiary{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.group\/srv:hover .group-hover\/srv\:text-accent,.group:hover .group-hover\:text-accent{--tw-text-opacity: 1;color:rgb(var(--lt-accent) / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-accent-hover{--tw-text-opacity: 1;color:rgb(var(--lt-accent-hover) / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-status-error{--tw-text-opacity: 1;color:rgb(var(--lt-status-error) / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-text-primary{--tw-text-opacity: 1;color:rgb(var(--lt-text-primary) / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-text-secondary{--tw-text-opacity: 1;color:rgb(var(--lt-text-secondary) / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-text-tertiary{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.group:hover .group-hover\:underline{text-decoration-line:underline}.group\/frow:hover .group-hover\/frow\:opacity-100,.group\/key:hover .group-hover\/key\:opacity-100,.group\/mrow:hover .group-hover\/mrow\:opacity-100,.group\/row:hover .group-hover\/row\:opacity-100,.group\/sched:hover .group-hover\/sched\:opacity-100{opacity:1}.group\/sorthead:hover .group-hover\/sorthead\:opacity-40{opacity:.4}.group\/sub:hover .group-hover\/sub\:opacity-100,.group\/tip:hover .group-hover\/tip\:opacity-100,.group\/trace:hover .group-hover\/trace\:opacity-100,.group:hover .group-hover\:opacity-100{opacity:1}@container table (min-width: 22rem){.\@dict-inline\/table\:grid-cols-\[max-content_1fr\]{grid-template-columns:max-content 1fr}}@container (min-width: 22rem){.\@dict-inline\:mt-0{margin-top:0}.\@dict-inline\:inline{display:inline}.\@dict-inline\:inline-flex{display:inline-flex}.\@dict-inline\:hidden{display:none}.\@dict-inline\:grid-cols-\[max-content_1fr\]{grid-template-columns:max-content 1fr}}@container (min-width: 26rem){.\@grp-cols\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.\@grp-cols\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@container (min-width: 34rem){.\@form-cols\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@container (min-width: 38rem){.\@dict-pairs\:grid-cols-\[max-content_1fr_max-content_1fr\]{grid-template-columns:max-content 1fr max-content 1fr}.\@dict-pairs\:gap-x-8{-moz-column-gap:2rem;column-gap:2rem}}@container table (min-width: 54rem){.\@split\/table\:table-cell{display:table-cell}}@container (min-width: 54rem){.\@split\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.\@split\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.\@split\:grid-cols-\[1\.6fr_1fr\]{grid-template-columns:1.6fr 1fr}.\@split\:grid-cols-\[1fr_240px\]{grid-template-columns:1fr 240px}.\@split\:grid-cols-\[1fr_340px\]{grid-template-columns:1fr 340px}.\@split\:grid-cols-\[1fr_360px\]{grid-template-columns:1fr 360px}.\@split\:grid-cols-\[1fr_400px\]{grid-template-columns:1fr 400px}.\@split\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.\@split\:gap-x-col-gap{-moz-column-gap:var(--lt-space-col-gap);column-gap:var(--lt-space-col-gap)}}@container table (min-width: 64rem){.\@wall\/table\:table-cell{display:table-cell}}@container (min-width: 64rem){.\@wall\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.\@wall\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.\@wall\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}@container filters (min-width: 72rem){.\@filters\/filters\:flex{display:flex}.\@filters\/filters\:contents{display:contents}.\@filters\/filters\:hidden{display:none}}@media(min-width:640px){.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:1024px){.lg\:col-span-2{grid-column:span 2 / span 2}.lg\:col-span-3{grid-column:span 3 / span 3}.lg\:block{display:block}.lg\:inline{display:inline}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:w-72{width:18rem}.lg\:border-l{border-left-width:1px}.lg\:border-surface-border{--tw-border-opacity: 1;border-color:rgb(var(--lt-surface-border) / var(--tw-border-opacity, 1))}.lg\:pl-12{padding-left:3rem}}