@hotmeshio/long-tail 0.29.0 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/build/api/roles.js +4 -0
  2. package/build/api/scan-codes/choice.js +6 -3
  3. package/build/api/scan-codes/context.d.ts +7 -1
  4. package/build/api/scan-codes/context.js +24 -0
  5. package/build/api/scan-codes/execute.js +4 -2
  6. package/build/api/scan-codes/present.d.ts +3 -1
  7. package/build/api/scan-codes/present.js +25 -12
  8. package/build/routes/oauth.js +9 -6
  9. package/build/services/oauth/providers/github.js +2 -1
  10. package/build/services/oauth/providers/google.js +3 -3
  11. package/build/services/oauth/providers/microsoft.js +4 -1
  12. package/build/services/oauth/providers/mock.js +1 -1
  13. package/build/services/role/scan-done.d.ts +7 -0
  14. package/build/services/role/scan-done.js +36 -0
  15. package/build/services/role/seed.js +4 -0
  16. package/build/services/role/types.d.ts +11 -0
  17. package/build/services/role/types.js +4 -0
  18. package/build/services/scan-code/validate.js +50 -0
  19. package/build/tsconfig.tsbuildinfo +1 -1
  20. package/build/types/index.d.ts +2 -2
  21. package/build/types/index.js +3 -1
  22. package/build/types/oauth.d.ts +1 -0
  23. package/build/types/scan-choice.d.ts +8 -0
  24. package/build/types/scan-code/constants.d.ts +3 -0
  25. package/build/types/scan-code/constants.js +4 -1
  26. package/build/types/scan-code/response.d.ts +14 -0
  27. package/build/types/scan-code/rule.d.ts +11 -0
  28. package/dashboard/dist/assets/{AdminDashboard-DRE0hSDS.js → AdminDashboard-Bjf_7-S6.js} +2 -2
  29. package/dashboard/dist/assets/{AdminDashboard-DRE0hSDS.js.map → AdminDashboard-Bjf_7-S6.js.map} +1 -1
  30. package/dashboard/dist/assets/{AgentConfigPage-BuflQGgy.js → AgentConfigPage-CEGk5Gbv.js} +6 -6
  31. package/dashboard/dist/assets/{AgentConfigPage-BuflQGgy.js.map → AgentConfigPage-CEGk5Gbv.js.map} +1 -1
  32. package/dashboard/dist/assets/{AgentDetailPage-BiL9FB7i.js → AgentDetailPage-C52Oi1_f.js} +3 -3
  33. package/dashboard/dist/assets/{AgentDetailPage-BiL9FB7i.js.map → AgentDetailPage-C52Oi1_f.js.map} +1 -1
  34. package/dashboard/dist/assets/{AgentsPage-C4ZxCNxt.js → AgentsPage-CohqxaWS.js} +2 -2
  35. package/dashboard/dist/assets/{AgentsPage-C4ZxCNxt.js.map → AgentsPage-CohqxaWS.js.map} +1 -1
  36. package/dashboard/dist/assets/{AvailableEscalationsPage-B5p8QJvI.js → AvailableEscalationsPage-DXpRnOVd.js} +2 -2
  37. package/dashboard/dist/assets/{AvailableEscalationsPage-B5p8QJvI.js.map → AvailableEscalationsPage-DXpRnOVd.js.map} +1 -1
  38. package/dashboard/dist/assets/{BotPicker-B7V77PnY.js → BotPicker-DPglulL6.js} +2 -2
  39. package/dashboard/dist/assets/{BotPicker-B7V77PnY.js.map → BotPicker-DPglulL6.js.map} +1 -1
  40. package/dashboard/dist/assets/{BulkAssignModal-DcGVMQqm.js → BulkAssignModal-DWNR3FJJ.js} +2 -2
  41. package/dashboard/dist/assets/{BulkAssignModal-DcGVMQqm.js.map → BulkAssignModal-DWNR3FJJ.js.map} +1 -1
  42. package/dashboard/dist/assets/{CapabilitiesPage-DmbC1pEs.js → CapabilitiesPage-ChBBD0IX.js} +2 -2
  43. package/dashboard/dist/assets/{CapabilitiesPage-DmbC1pEs.js.map → CapabilitiesPage-ChBBD0IX.js.map} +1 -1
  44. package/dashboard/dist/assets/{CollapsibleSection-C81S1qic.js → CollapsibleSection-QAXKTYc6.js} +2 -2
  45. package/dashboard/dist/assets/{CollapsibleSection-C81S1qic.js.map → CollapsibleSection-QAXKTYc6.js.map} +1 -1
  46. package/dashboard/dist/assets/{ConfirmDeleteModal-3RFyWN9Q.js → ConfirmDeleteModal-J9xc_gVZ.js} +2 -2
  47. package/dashboard/dist/assets/{ConfirmDeleteModal-3RFyWN9Q.js.map → ConfirmDeleteModal-J9xc_gVZ.js.map} +1 -1
  48. package/dashboard/dist/assets/{ConnectedAppsPage-B0D2OvTD.js → ConnectedAppsPage-BKhsc_jJ.js} +2 -2
  49. package/dashboard/dist/assets/{ConnectedAppsPage-B0D2OvTD.js.map → ConnectedAppsPage-BKhsc_jJ.js.map} +1 -1
  50. package/dashboard/dist/assets/{CountdownTimer-iAG28fzG.js → CountdownTimer-C4hP64lF.js} +2 -2
  51. package/dashboard/dist/assets/{CountdownTimer-iAG28fzG.js.map → CountdownTimer-C4hP64lF.js.map} +1 -1
  52. package/dashboard/dist/assets/{CredentialsPage-DoFwNvFv.js → CredentialsPage-DUfgsEbI.js} +2 -2
  53. package/dashboard/dist/assets/{CredentialsPage-DoFwNvFv.js.map → CredentialsPage-DUfgsEbI.js.map} +1 -1
  54. package/dashboard/dist/assets/{CronLabel-C1Bb2wo4.js → CronLabel-CBc3Tvau.js} +2 -2
  55. package/dashboard/dist/assets/{CronLabel-C1Bb2wo4.js.map → CronLabel-CBc3Tvau.js.map} +1 -1
  56. package/dashboard/dist/assets/{DropZone-Cl_Flb16.js → DropZone-DefYTYQy.js} +2 -2
  57. package/dashboard/dist/assets/{DropZone-Cl_Flb16.js.map → DropZone-DefYTYQy.js.map} +1 -1
  58. package/dashboard/dist/assets/{ElapsedCell-DZs1I1JW.js → ElapsedCell-V27Y2Ksb.js} +2 -2
  59. package/dashboard/dist/assets/{ElapsedCell-DZs1I1JW.js.map → ElapsedCell-V27Y2Ksb.js.map} +1 -1
  60. package/dashboard/dist/assets/{EntityTimelinePanel-Du1O6Oly.js → EntityTimelinePanel-BA4MWXkB.js} +2 -2
  61. package/dashboard/dist/assets/{EntityTimelinePanel-Du1O6Oly.js.map → EntityTimelinePanel-BA4MWXkB.js.map} +1 -1
  62. package/dashboard/dist/assets/{EscalationListSchemaPage-CrpBhC0e.js → EscalationListSchemaPage-B20HUAlO.js} +2 -2
  63. package/dashboard/dist/assets/{EscalationListSchemaPage-CrpBhC0e.js.map → EscalationListSchemaPage-B20HUAlO.js.map} +1 -1
  64. package/dashboard/dist/assets/{EscalationSchemaPage-Co59lcuD.js → EscalationSchemaPage-Cen9HGYG.js} +2 -2
  65. package/dashboard/dist/assets/{EscalationSchemaPage-Co59lcuD.js.map → EscalationSchemaPage-Cen9HGYG.js.map} +1 -1
  66. package/dashboard/dist/assets/{EscalationTimeline-B_fzNsX5.js → EscalationTimeline-DGNgcMm0.js} +2 -2
  67. package/dashboard/dist/assets/{EscalationTimeline-B_fzNsX5.js.map → EscalationTimeline-DGNgcMm0.js.map} +1 -1
  68. package/dashboard/dist/assets/{EscalationTitleSelect-C2Goebjo.js → EscalationTitleSelect-BhsflGiC.js} +2 -2
  69. package/dashboard/dist/assets/{EscalationTitleSelect-C2Goebjo.js.map → EscalationTitleSelect-BhsflGiC.js.map} +1 -1
  70. package/dashboard/dist/assets/{EscalationsOverview-Cgmrl8Zc.js → EscalationsOverview-C2nc-Pgv.js} +2 -2
  71. package/dashboard/dist/assets/{EscalationsOverview-Cgmrl8Zc.js.map → EscalationsOverview-C2nc-Pgv.js.map} +1 -1
  72. package/dashboard/dist/assets/{EventTable-BdEiu3Fv.js → EventTable-BvNxHKy1.js} +2 -2
  73. package/dashboard/dist/assets/{EventTable-BdEiu3Fv.js.map → EventTable-BvNxHKy1.js.map} +1 -1
  74. package/dashboard/dist/assets/{FilterBar-CzKYBOMC.js → FilterBar-22FDO0R_.js} +2 -2
  75. package/dashboard/dist/assets/{FilterBar-CzKYBOMC.js.map → FilterBar-22FDO0R_.js.map} +1 -1
  76. package/dashboard/dist/assets/{GraphInvokePage-CcDFhY53.js → GraphInvokePage-BAyfJ-PY.js} +2 -2
  77. package/dashboard/dist/assets/{GraphInvokePage-CcDFhY53.js.map → GraphInvokePage-BAyfJ-PY.js.map} +1 -1
  78. package/dashboard/dist/assets/{HomePage-Xahqcdu9.js → HomePage-CtjG2kGn.js} +2 -2
  79. package/dashboard/dist/assets/{HomePage-Xahqcdu9.js.map → HomePage-CtjG2kGn.js.map} +1 -1
  80. package/dashboard/dist/assets/{LinePage-DKwhGunp.js → LinePage-DPe-vP3-.js} +3 -3
  81. package/dashboard/dist/assets/{LinePage-DKwhGunp.js.map → LinePage-DPe-vP3-.js.map} +1 -1
  82. package/dashboard/dist/assets/{LinesPage-BXZVO4MC.js → LinesPage-BCSfYkuL.js} +2 -2
  83. package/dashboard/dist/assets/{LinesPage-BXZVO4MC.js.map → LinesPage-BCSfYkuL.js.map} +1 -1
  84. package/dashboard/dist/assets/{ListToolbar-orQsOdl_.js → ListToolbar-6siR0Hao.js} +2 -2
  85. package/dashboard/dist/assets/{ListToolbar-orQsOdl_.js.map → ListToolbar-6siR0Hao.js.map} +1 -1
  86. package/dashboard/dist/assets/{McpOverview-pSnadtSM.js → McpOverview-Cbu2CXlQ.js} +2 -2
  87. package/dashboard/dist/assets/{McpOverview-pSnadtSM.js.map → McpOverview-Cbu2CXlQ.js.map} +1 -1
  88. package/dashboard/dist/assets/{McpQueryDetailPage-BCAJ3rKO.js → McpQueryDetailPage--1FsnGuM.js} +2 -2
  89. package/dashboard/dist/assets/{McpQueryDetailPage-BCAJ3rKO.js.map → McpQueryDetailPage--1FsnGuM.js.map} +1 -1
  90. package/dashboard/dist/assets/{McpQueryPage-CRyXeRp5.js → McpQueryPage-CPUUMIiY.js} +2 -2
  91. package/dashboard/dist/assets/{McpQueryPage-CRyXeRp5.js.map → McpQueryPage-CPUUMIiY.js.map} +1 -1
  92. package/dashboard/dist/assets/{McpRunDetailPage-BHppCztI.js → McpRunDetailPage-BDCv-c1o.js} +2 -2
  93. package/dashboard/dist/assets/{McpRunDetailPage-BHppCztI.js.map → McpRunDetailPage-BDCv-c1o.js.map} +1 -1
  94. package/dashboard/dist/assets/{McpRunsPage-Cd9yCT-_.js → McpRunsPage-Df4yOclO.js} +2 -2
  95. package/dashboard/dist/assets/{McpRunsPage-Cd9yCT-_.js.map → McpRunsPage-Df4yOclO.js.map} +1 -1
  96. package/dashboard/dist/assets/{NamespacePill-OTZD2hzt.js → NamespacePill-CeSfHH-j.js} +2 -2
  97. package/dashboard/dist/assets/{NamespacePill-OTZD2hzt.js.map → NamespacePill-CeSfHH-j.js.map} +1 -1
  98. package/dashboard/dist/assets/{OperationsPage-BtnthZgj.js → OperationsPage-BYUGFgPp.js} +2 -2
  99. package/dashboard/dist/assets/{OperationsPage-BtnthZgj.js.map → OperationsPage-BYUGFgPp.js.map} +1 -1
  100. package/dashboard/dist/assets/{OperatorDashboard-B4_OBhYh.js → OperatorDashboard-Dd1EhTZe.js} +2 -2
  101. package/dashboard/dist/assets/{OperatorDashboard-B4_OBhYh.js.map → OperatorDashboard-Dd1EhTZe.js.map} +1 -1
  102. package/dashboard/dist/assets/{PageHeader-Hx8APPwE.js → PageHeader-DiGWAQlR.js} +2 -2
  103. package/dashboard/dist/assets/{PageHeader-Hx8APPwE.js.map → PageHeader-DiGWAQlR.js.map} +1 -1
  104. package/dashboard/dist/assets/{PageHeaderWithStats-BEQYYBJv.js → PageHeaderWithStats-DwnKQ06j.js} +2 -2
  105. package/dashboard/dist/assets/{PageHeaderWithStats-BEQYYBJv.js.map → PageHeaderWithStats-DwnKQ06j.js.map} +1 -1
  106. package/dashboard/dist/assets/{PersonaDetailPage-BAYjM9qf.js → PersonaDetailPage-BCx3Ey2_.js} +2 -2
  107. package/dashboard/dist/assets/{PersonaDetailPage-BAYjM9qf.js.map → PersonaDetailPage-BCx3Ey2_.js.map} +1 -1
  108. package/dashboard/dist/assets/{PersonasPage-6HsOp-1y.js → PersonasPage--Ez0YeHh.js} +2 -2
  109. package/dashboard/dist/assets/{PersonasPage-6HsOp-1y.js.map → PersonasPage--Ez0YeHh.js.map} +1 -1
  110. package/dashboard/dist/assets/{PortalPage-6OMr7KtJ.js → PortalPage-BmBmheBp.js} +2 -2
  111. package/dashboard/dist/assets/{PortalPage-6OMr7KtJ.js.map → PortalPage-BmBmheBp.js.map} +1 -1
  112. package/dashboard/dist/assets/{ProcessDetailPage-AidH_h7z.js → ProcessDetailPage-DBj4VEnP.js} +2 -2
  113. package/dashboard/dist/assets/{ProcessDetailPage-AidH_h7z.js.map → ProcessDetailPage-DBj4VEnP.js.map} +1 -1
  114. package/dashboard/dist/assets/{ProcessesListPage-BWKoKbXk.js → ProcessesListPage-CD5NRIBK.js} +2 -2
  115. package/dashboard/dist/assets/{ProcessesListPage-BWKoKbXk.js.map → ProcessesListPage-CD5NRIBK.js.map} +1 -1
  116. package/dashboard/dist/assets/{ResolverForm-BaSvhLoT.js → ResolverForm-Baxwv_IG.js} +2 -2
  117. package/dashboard/dist/assets/{ResolverForm-BaSvhLoT.js.map → ResolverForm-Baxwv_IG.js.map} +1 -1
  118. package/dashboard/dist/assets/RoleDetailPage-6ukNyycs.js +8 -0
  119. package/dashboard/dist/assets/RoleDetailPage-6ukNyycs.js.map +1 -0
  120. package/dashboard/dist/assets/{RolePill-R5_ctGFy.js → RolePill-D3hkAdKf.js} +2 -2
  121. package/dashboard/dist/assets/{RolePill-R5_ctGFy.js.map → RolePill-D3hkAdKf.js.map} +1 -1
  122. package/dashboard/dist/assets/{RolesPage-T2hH_MV5.js → RolesPage-DRs2XeSd.js} +2 -2
  123. package/dashboard/dist/assets/{RolesPage-T2hH_MV5.js.map → RolesPage-DRs2XeSd.js.map} +1 -1
  124. package/dashboard/dist/assets/{RosterWidget-DG6Rcx4P.js → RosterWidget-BPBPSa1k.js} +2 -2
  125. package/dashboard/dist/assets/{RosterWidget-DG6Rcx4P.js.map → RosterWidget-BPBPSa1k.js.map} +1 -1
  126. package/dashboard/dist/assets/{RunAsSelector-M2h9U6PP.js → RunAsSelector-Br9FiMwP.js} +2 -2
  127. package/dashboard/dist/assets/{RunAsSelector-M2h9U6PP.js.map → RunAsSelector-Br9FiMwP.js.map} +1 -1
  128. package/dashboard/dist/assets/{ScanCodesPage-lB_WxoZw.js → ScanCodesPage-BXENWoZb.js} +2 -2
  129. package/dashboard/dist/assets/{ScanCodesPage-lB_WxoZw.js.map → ScanCodesPage-BXENWoZb.js.map} +1 -1
  130. package/dashboard/dist/assets/{ScanSchemeDetailPage-C3VLg61H.js → ScanSchemeDetailPage-CaM4rUBV.js} +2 -2
  131. package/dashboard/dist/assets/{ScanSchemeDetailPage-C3VLg61H.js.map → ScanSchemeDetailPage-CaM4rUBV.js.map} +1 -1
  132. package/dashboard/dist/assets/ScanStationPage-CmJKgWy_.js +2 -0
  133. package/dashboard/dist/assets/ScanStationPage-CmJKgWy_.js.map +1 -0
  134. package/dashboard/dist/assets/{ScopeBadge-BXZ084nD.js → ScopeBadge-DGz79rmG.js} +2 -2
  135. package/dashboard/dist/assets/{ScopeBadge-BXZ084nD.js.map → ScopeBadge-DGz79rmG.js.map} +1 -1
  136. package/dashboard/dist/assets/{StickyPagination-BdjseWXr.js → StickyPagination-DX5CPgrX.js} +2 -2
  137. package/dashboard/dist/assets/{StickyPagination-BdjseWXr.js.map → StickyPagination-DX5CPgrX.js.map} +1 -1
  138. package/dashboard/dist/assets/{StreamMessageDetail-DJCBxETh.js → StreamMessageDetail-3mWw3_M5.js} +2 -2
  139. package/dashboard/dist/assets/{StreamMessageDetail-DJCBxETh.js.map → StreamMessageDetail-3mWw3_M5.js.map} +1 -1
  140. package/dashboard/dist/assets/{SwimlaneTimeline-DiXm9jIk.js → SwimlaneTimeline-C_pIcWBJ.js} +2 -2
  141. package/dashboard/dist/assets/{SwimlaneTimeline-DiXm9jIk.js.map → SwimlaneTimeline-C_pIcWBJ.js.map} +1 -1
  142. package/dashboard/dist/assets/{TagInput-DjPUDp2M.js → TagInput-DaIdhv3h.js} +2 -2
  143. package/dashboard/dist/assets/{TagInput-DjPUDp2M.js.map → TagInput-DaIdhv3h.js.map} +1 -1
  144. package/dashboard/dist/assets/{TaskDetailPage-m8CQFN4w.js → TaskDetailPage-DthMVBZO.js} +2 -2
  145. package/dashboard/dist/assets/{TaskDetailPage-m8CQFN4w.js.map → TaskDetailPage-DthMVBZO.js.map} +1 -1
  146. package/dashboard/dist/assets/{TaskQueuePill-D-4Ynf3K.js → TaskQueuePill-sUA1nZe-.js} +2 -2
  147. package/dashboard/dist/assets/{TaskQueuePill-D-4Ynf3K.js.map → TaskQueuePill-sUA1nZe-.js.map} +1 -1
  148. package/dashboard/dist/assets/{TasksListPage-DHBSUhZC.js → TasksListPage-MtawUpuU.js} +2 -2
  149. package/dashboard/dist/assets/{TasksListPage-DHBSUhZC.js.map → TasksListPage-MtawUpuU.js.map} +1 -1
  150. package/dashboard/dist/assets/{TimeAgo-Cq3bKUd-.js → TimeAgo-DIziYk-v.js} +2 -2
  151. package/dashboard/dist/assets/{TimeAgo-Cq3bKUd-.js.map → TimeAgo-DIziYk-v.js.map} +1 -1
  152. package/dashboard/dist/assets/{TimestampCell-e5gRR_FY.js → TimestampCell-Dn5M-Eey.js} +2 -2
  153. package/dashboard/dist/assets/{TimestampCell-e5gRR_FY.js.map → TimestampCell-Dn5M-Eey.js.map} +1 -1
  154. package/dashboard/dist/assets/{ToolPill-GsKQ80CO.js → ToolPill-CpBAFdEX.js} +2 -2
  155. package/dashboard/dist/assets/{ToolPill-GsKQ80CO.js.map → ToolPill-CpBAFdEX.js.map} +1 -1
  156. package/dashboard/dist/assets/{ToolTestPanel-Bg0ss9oN.js → ToolTestPanel-DaBrgPML.js} +2 -2
  157. package/dashboard/dist/assets/{ToolTestPanel-Bg0ss9oN.js.map → ToolTestPanel-DaBrgPML.js.map} +1 -1
  158. package/dashboard/dist/assets/{TopicDetailPage-DhPiCfOO.js → TopicDetailPage-zNE3EigP.js} +2 -2
  159. package/dashboard/dist/assets/{TopicDetailPage-DhPiCfOO.js.map → TopicDetailPage-zNE3EigP.js.map} +1 -1
  160. package/dashboard/dist/assets/{TopicsPage-BqZaVv3d.js → TopicsPage-Cj0ugdie.js} +2 -2
  161. package/dashboard/dist/assets/{TopicsPage-BqZaVv3d.js.map → TopicsPage-Cj0ugdie.js.map} +1 -1
  162. package/dashboard/dist/assets/{UserName-C6ZNHHKN.js → UserName-t3PbLYfd.js} +2 -2
  163. package/dashboard/dist/assets/{UserName-C6ZNHHKN.js.map → UserName-t3PbLYfd.js.map} +1 -1
  164. package/dashboard/dist/assets/{WorkflowExecutionPage-BUqIhtcr.js → WorkflowExecutionPage-CZ2c5QLL.js} +2 -2
  165. package/dashboard/dist/assets/{WorkflowExecutionPage-BUqIhtcr.js.map → WorkflowExecutionPage-CZ2c5QLL.js.map} +1 -1
  166. package/dashboard/dist/assets/{WorkflowPill-D7244fKp.js → WorkflowPill-CKHip3hH.js} +2 -2
  167. package/dashboard/dist/assets/{WorkflowPill-D7244fKp.js.map → WorkflowPill-CKHip3hH.js.map} +1 -1
  168. package/dashboard/dist/assets/{WorkflowsDashboard-BKxhC_hT.js → WorkflowsDashboard-DLb71Sa2.js} +2 -2
  169. package/dashboard/dist/assets/{WorkflowsDashboard-BKxhC_hT.js.map → WorkflowsDashboard-DLb71Sa2.js.map} +1 -1
  170. package/dashboard/dist/assets/{WorkflowsOverview-018s2q_p.js → WorkflowsOverview-Wz6RzxHJ.js} +2 -2
  171. package/dashboard/dist/assets/{WorkflowsOverview-018s2q_p.js.map → WorkflowsOverview-Wz6RzxHJ.js.map} +1 -1
  172. package/dashboard/dist/assets/{YamlWorkflowDetailPage-C2zcXDr1.js → YamlWorkflowDetailPage-CcRAN_ey.js} +2 -2
  173. package/dashboard/dist/assets/{YamlWorkflowDetailPage-C2zcXDr1.js.map → YamlWorkflowDetailPage-CcRAN_ey.js.map} +1 -1
  174. package/dashboard/dist/assets/{YamlWorkflowsPage-aVcNZNu6.js → YamlWorkflowsPage-B4C9fiYU.js} +2 -2
  175. package/dashboard/dist/assets/{YamlWorkflowsPage-aVcNZNu6.js.map → YamlWorkflowsPage-B4C9fiYU.js.map} +1 -1
  176. package/dashboard/dist/assets/{agents-DRaaJUue.js → agents-BvRjwrof.js} +2 -2
  177. package/dashboard/dist/assets/{agents-DRaaJUue.js.map → agents-BvRjwrof.js.map} +1 -1
  178. package/dashboard/dist/assets/{bots-C4N90NCj.js → bots-qx7qPwFo.js} +2 -2
  179. package/dashboard/dist/assets/{bots-C4N90NCj.js.map → bots-qx7qPwFo.js.map} +1 -1
  180. package/dashboard/dist/assets/{capabilities-BoRWifSC.js → capabilities-DJrUEeew.js} +2 -2
  181. package/dashboard/dist/assets/{capabilities-BoRWifSC.js.map → capabilities-DJrUEeew.js.map} +1 -1
  182. package/dashboard/dist/assets/{controlplane-DGZAxi7J.js → controlplane-D82a5cfq.js} +2 -2
  183. package/dashboard/dist/assets/{controlplane-DGZAxi7J.js.map → controlplane-D82a5cfq.js.map} +1 -1
  184. package/dashboard/dist/assets/{escalation-columns-DJbfsH_m.js → escalation-columns-Dmm8LY_f.js} +2 -2
  185. package/dashboard/dist/assets/{escalation-columns-DJbfsH_m.js.map → escalation-columns-Dmm8LY_f.js.map} +1 -1
  186. package/dashboard/dist/assets/{escalation-items-C8iJZEA8.js → escalation-items-C3ko1DCb.js} +2 -2
  187. package/dashboard/dist/assets/{escalation-items-C8iJZEA8.js.map → escalation-items-C3ko1DCb.js.map} +1 -1
  188. package/dashboard/dist/assets/{index-BuSUevzO.js → index-BAxEeqfF.js} +2 -2
  189. package/dashboard/dist/assets/{index-BuSUevzO.js.map → index-BAxEeqfF.js.map} +1 -1
  190. package/dashboard/dist/assets/{index-DhKGp4QK.js → index-BCSeHOZH.js} +2 -2
  191. package/dashboard/dist/assets/{index-DhKGp4QK.js.map → index-BCSeHOZH.js.map} +1 -1
  192. package/dashboard/dist/assets/{index-DeyA88jq.js → index-BJrsQM-E.js} +2 -2
  193. package/dashboard/dist/assets/{index-DeyA88jq.js.map → index-BJrsQM-E.js.map} +1 -1
  194. package/dashboard/dist/assets/{index-CXXc9sUr.js → index-BVxqddYr.js} +2 -2
  195. package/dashboard/dist/assets/{index-CXXc9sUr.js.map → index-BVxqddYr.js.map} +1 -1
  196. package/dashboard/dist/assets/{index-DIU89TX3.js → index-C59ZyWOo.js} +2 -2
  197. package/dashboard/dist/assets/{index-DIU89TX3.js.map → index-C59ZyWOo.js.map} +1 -1
  198. package/dashboard/dist/assets/{index-CyL-6CAa.js → index-CNDnGdvT.js} +2 -2
  199. package/dashboard/dist/assets/{index-CyL-6CAa.js.map → index-CNDnGdvT.js.map} +1 -1
  200. package/dashboard/dist/assets/{index-pzbGpihI.js → index-CSr5q355.js} +25 -25
  201. package/dashboard/dist/assets/index-CSr5q355.js.map +1 -0
  202. package/dashboard/dist/assets/{index-DMKLnxt8.js → index-CXnmU0TS.js} +2 -2
  203. package/dashboard/dist/assets/{index-DMKLnxt8.js.map → index-CXnmU0TS.js.map} +1 -1
  204. package/dashboard/dist/assets/{index-CjjRxpVe.js → index-C_-FoMo9.js} +2 -2
  205. package/dashboard/dist/assets/{index-CjjRxpVe.js.map → index-C_-FoMo9.js.map} +1 -1
  206. package/dashboard/dist/assets/index-C_dp4WgY.css +1 -0
  207. package/dashboard/dist/assets/{index-3HaFP00M.js → index-D-vNL8Hm.js} +2 -2
  208. package/dashboard/dist/assets/{index-3HaFP00M.js.map → index-D-vNL8Hm.js.map} +1 -1
  209. package/dashboard/dist/assets/{index-BFxHIfQ_.js → index-DOkHnsLK.js} +2 -2
  210. package/dashboard/dist/assets/{index-BFxHIfQ_.js.map → index-DOkHnsLK.js.map} +1 -1
  211. package/dashboard/dist/assets/{index-BhS9XSy8.js → index-U5gC9Xgq.js} +2 -2
  212. package/dashboard/dist/assets/{index-BhS9XSy8.js.map → index-U5gC9Xgq.js.map} +1 -1
  213. package/dashboard/dist/assets/{index-CeeSFnl-.js → index-f4-pKYcm.js} +2 -2
  214. package/dashboard/dist/assets/{index-CeeSFnl-.js.map → index-f4-pKYcm.js.map} +1 -1
  215. package/dashboard/dist/assets/{knowledge-BWo3OCJc.js → knowledge-i7_nXSbf.js} +2 -2
  216. package/dashboard/dist/assets/{knowledge-BWo3OCJc.js.map → knowledge-i7_nXSbf.js.map} +1 -1
  217. package/dashboard/dist/assets/{machines-LEYY_yar.js → machines-DfSNshLg.js} +2 -2
  218. package/dashboard/dist/assets/{machines-LEYY_yar.js.map → machines-DfSNshLg.js.map} +1 -1
  219. package/dashboard/dist/assets/{mcp-_0kFRcyT.js → mcp-dCLNwcC8.js} +2 -2
  220. package/dashboard/dist/assets/{mcp-_0kFRcyT.js.map → mcp-dCLNwcC8.js.map} +1 -1
  221. package/dashboard/dist/assets/{mcp-query-BzmN0lc5.js → mcp-query-wmbaGRYi.js} +2 -2
  222. package/dashboard/dist/assets/{mcp-query-BzmN0lc5.js.map → mcp-query-wmbaGRYi.js.map} +1 -1
  223. package/dashboard/dist/assets/{personas-kE4PMrgo.js → personas-B_cJA5UG.js} +2 -2
  224. package/dashboard/dist/assets/{personas-kE4PMrgo.js.map → personas-B_cJA5UG.js.map} +1 -1
  225. package/dashboard/dist/assets/{pipelines-DYDNaypF.js → pipelines-ClUmuwmY.js} +2 -2
  226. package/dashboard/dist/assets/{pipelines-DYDNaypF.js.map → pipelines-ClUmuwmY.js.map} +1 -1
  227. package/dashboard/dist/assets/{tasks-ClJ-mbj9.js → tasks-BE97GrLr.js} +2 -2
  228. package/dashboard/dist/assets/{tasks-ClJ-mbj9.js.map → tasks-BE97GrLr.js.map} +1 -1
  229. package/dashboard/dist/assets/{topics-oHX4vbqe.js → topics-Dk0Y3kZP.js} +2 -2
  230. package/dashboard/dist/assets/{topics-oHX4vbqe.js.map → topics-Dk0Y3kZP.js.map} +1 -1
  231. package/dashboard/dist/assets/{useDebouncedValue-C97KADrj.js → useDebouncedValue-BLGuHd_v.js} +2 -2
  232. package/dashboard/dist/assets/{useDebouncedValue-C97KADrj.js.map → useDebouncedValue-BLGuHd_v.js.map} +1 -1
  233. package/dashboard/dist/assets/{useNamespace-Kje0Rn7j.js → useNamespace-Cj7t8eQd.js} +2 -2
  234. package/dashboard/dist/assets/{useNamespace-Kje0Rn7j.js.map → useNamespace-Cj7t8eQd.js.map} +1 -1
  235. package/dashboard/dist/assets/{useYamlActivityEvents-DMz-HKFv.js → useYamlActivityEvents-C7eurSkD.js} +2 -2
  236. package/dashboard/dist/assets/{useYamlActivityEvents-DMz-HKFv.js.map → useYamlActivityEvents-C7eurSkD.js.map} +1 -1
  237. package/dashboard/dist/assets/{validate-hUqjWN63.js → validate-BypZfZ8R.js} +2 -2
  238. package/dashboard/dist/assets/{validate-hUqjWN63.js.map → validate-BypZfZ8R.js.map} +1 -1
  239. package/dashboard/dist/assets/{vendor-icons-fxBvvHBi.js → vendor-icons-en0_uSRD.js} +191 -186
  240. package/dashboard/dist/assets/vendor-icons-en0_uSRD.js.map +1 -0
  241. package/dashboard/dist/assets/{yaml-workflows-64vfmKJx.js → yaml-workflows-CnMKmznF.js} +2 -2
  242. package/dashboard/dist/assets/{yaml-workflows-64vfmKJx.js.map → yaml-workflows-CnMKmznF.js.map} +1 -1
  243. package/dashboard/dist/index.html +3 -3
  244. package/docs/api/http/roles.md +1 -1
  245. package/docs/dashboard.md +2 -2
  246. package/docs/oauth-and-delegation.md +5 -1
  247. package/docs/scan-codes.md +56 -0
  248. package/package.json +1 -1
  249. package/dashboard/dist/assets/RoleDetailPage-D_30TDVh.js +0 -8
  250. package/dashboard/dist/assets/RoleDetailPage-D_30TDVh.js.map +0 -1
  251. package/dashboard/dist/assets/ScanStationPage-CVET1_4r.js +0 -2
  252. package/dashboard/dist/assets/ScanStationPage-CVET1_4r.js.map +0 -1
  253. package/dashboard/dist/assets/index-B9uv-euR.css +0 -1
  254. package/dashboard/dist/assets/index-pzbGpihI.js.map +0 -1
  255. package/dashboard/dist/assets/vendor-icons-fxBvvHBi.js.map +0 -1
@@ -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: .375rem;--lt-radius-section: .625rem;--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-cat-1: 88 128 176;--lt-cat-2: 224 146 78;--lt-cat-3: 104 168 104;--lt-cat-4: 204 100 100;--lt-cat-5: 150 126 194;--lt-cat-6: 82 170 168;--lt-cat-7: 182 154 74;--lt-cat-8: 156 120 96;--lt-cat-9: 202 118 162;--lt-cat-10: 148 158 80;--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: 251 252 253;--lt-surface-hover: 232 239 247;--lt-field-bg: 248 250 253;--lt-field-focus: 236 243 254;--lt-field-border: 160 197 245;--lt-surface-border: 186 214 250}[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: 251 250 252;--lt-surface-hover: 236 234 245;--lt-field-bg: 249 248 252;--lt-field-focus: 244 238 252;--lt-field-border: 200 178 240;--lt-surface-border: 216 198 245}[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 251 251;--lt-surface-hover: 244 236 233;--lt-field-bg: 252 250 249;--lt-field-focus: 252 242 240;--lt-field-border: 240 180 174;--lt-surface-border: 246 202 197}[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: 250 251 250;--lt-surface-hover: 234 242 237;--lt-field-bg: 248 251 249;--lt-field-focus: 240 253 244;--lt-field-border: 150 224 178;--lt-surface-border: 180 232 199}[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 250 251;--lt-surface-hover: 244 235 239;--lt-field-bg: 252 249 250;--lt-field-focus: 253 242 248;--lt-field-border: 248 185 216;--lt-surface-border: 250 206 228}[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 251 250;--lt-surface-hover: 244 237 230;--lt-field-bg: 252 250 248;--lt-field-focus: 255 247 237;--lt-field-border: 250 203 166;--lt-surface-border: 252 216 188}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))}*{scrollbar-width:none}*::-webkit-scrollbar{width:0;height:0}.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}}.icon-link{color:rgb(var(--lt-accent) / .65);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.icon-link:hover{--tw-text-opacity: 1;color:rgb(var(--lt-accent) / var(--tw-text-opacity, 1))}.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:disabled{cursor:not-allowed;opacity:.4}.btn-primary:hover:disabled{--tw-bg-opacity: 1;background-color:rgb(var(--lt-accent) / 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:disabled{cursor:not-allowed;opacity:.4}.btn-secondary:hover:disabled{--tw-bg-opacity: 1;background-color:rgb(var(--lt-surface-raised) / 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{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{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.\!field::placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.\!field: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-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{border-radius:var(--lt-radius-field)!important}.field,.input,.select,.textarea{border-radius:var(--lt-radius-field)}.\!input{border-radius:var(--lt-radius-field)!important}.\!field,.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}.-top-\[0\.35em\]{top:-.35em}.bottom-0{bottom:0}.bottom-1{bottom:.25rem}.bottom-14{bottom:3.5rem}.bottom-2{bottom:.5rem}.bottom-3{bottom:.75rem}.left-0{left:0}.left-1\/2{left:50%}.left-2\.5{left:.625rem}.left-56{left:14rem}.left-\[4px\]{left:4px}.left-\[7px\]{left:7px}.right-0{right:0}.right-1{right:.25rem}.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-\[var\(--lt-sticky-top\,60px\)\]{top:var(--lt-sticky-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-\[60\]{z-index:60}.z-\[9999\]{z-index:9999}.order-9{order:9}.col-span-2{grid-column:span 2 / span 2}.col-span-full{grid-column:1 / -1}.col-start-3{grid-column-start:3}.col-start-4{grid-column-start:4}.float-right{float:right}.m-1{margin:.25rem}.m-2{margin:.5rem}.-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-1\.5{margin-left:.375rem;margin-right:.375rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.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}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.my-8{margin-top:2rem;margin-bottom:2rem}.-mb-16{margin-bottom:-4rem}.-mb-\[calc\(4rem-var\(--lt-space-page-x\)\)\]{margin-bottom:calc(calc(4rem - var(--lt-space-page-x)) * -1)}.-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-1{margin-right:-.25rem}.-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}.-mt-\[calc\(2rem-var\(--lt-space-page-x\)\)\]{margin-top:calc(calc(2rem - var(--lt-space-page-x)) * -1)}.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-\[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}.mr-3{margin-right:.75rem}.mr-auto{margin-right:auto}.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-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}.mt-px{margin-top:1px}.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!important}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.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-9{height:2.25rem}.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-\[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-72{max-height:18rem}.max-h-80{max-height:20rem}.max-h-96{max-height:24rem}.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-5rem\)\]{max-height:calc(100vh - 5rem)}.max-h-\[calc\(100vh-6rem\)\]{max-height:calc(100vh - 6rem)}.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-9{min-height:2.25rem}.min-h-\[100px\]{min-height:100px}.min-h-\[120px\]{min-height:120px}.min-h-\[14rem\]{min-height:14rem}.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-\[4\.5rem\]{min-height:4.5rem}.min-h-\[40vh\]{min-height:40vh}.min-h-\[48px\]{min-height:48px}.min-h-\[55vh\]{min-height:55vh}.min-h-\[5rem\]{min-height:5rem}.min-h-\[60px\]{min-height:60px}.min-h-\[60vh\]{min-height:60vh}.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-\[10\%\]{width:10%}.w-\[10rem\]{width:10rem}.w-\[11\%\]{width:11%}.w-\[12\%\]{width:12%}.w-\[12\.5rem\]{width:12.5rem}.w-\[120px\]{width:120px}.w-\[12rem\]{width:12rem}.w-\[14px\]{width:14px}.w-\[14rem\]{width:14rem}.w-\[15px\]{width:15px}.w-\[16rem\]{width:16rem}.w-\[18px\]{width:18px}.w-\[200px\]{width:200px}.w-\[20rem\]{width:20rem}.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-\[7\%\]{width:7%}.w-\[7px\]{width:7px}.w-\[8\%\]{width:8%}.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-72{min-width:18rem}.min-w-\[11rem\]{min-width:11rem}.min-w-\[120px\]{min-width:120px}.min-w-\[12rem\]{min-width:12rem}.min-w-\[140px\]{min-width:140px}.min-w-\[14px\]{min-width:14px}.min-w-\[14rem\]{min-width:14rem}.min-w-\[15rem\]{min-width:15rem}.min-w-\[16rem\]{min-width:16rem}.min-w-\[17rem\]{min-width:17rem}.min-w-\[180px\]{min-width:180px}.min-w-\[18px\]{min-width:18px}.min-w-\[19rem\]{min-width:19rem}.min-w-\[260px\]{min-width:260px}.min-w-\[2rem\]{min-width:2rem}.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%)}.min-w-max{min-width:-moz-max-content;min-width:max-content}.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-96{max-width:24rem}.max-w-\[10rem\]{max-width:10rem}.max-w-\[120px\]{max-width:120px}.max-w-\[12rem\]{max-width:12rem}.max-w-\[150px\]{max-width:150px}.max-w-\[160px\]{max-width:160px}.max-w-\[16rem\]{max-width:16rem}.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-\[28rem\]{max-width:28rem}.max-w-\[32rem\]{max-width:32rem}.max-w-\[460px\]{max-width:460px}.max-w-\[6rem\]{max-width:6rem}.max-w-\[70\%\]{max-width:70%}.max-w-\[85\%\]{max-width:85%}.max-w-\[85vw\]{max-width:85vw}.max-w-\[90vw\]{max-width:90vw}.max-w-\[9rem\]{max-width:9rem}.max-w-\[calc\(100vw-2rem\)\]{max-width:calc(100vw - 2rem)}.max-w-form{max-width:var(--lt-measure-form)}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-prose{max-width:65ch}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.flex-\[1\]{flex:1}.flex-\[3\]{flex:3}.flex-none{flex:none}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.basis-full{flex-basis:100%}.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))}.-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-\[click-hint_2\.6s_ease-in-out_both\]{animation:click-hint 2.6s ease-in-out both}.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 fadeIn{0%{opacity:0}to{opacity:1}}.animate-fade-in{animation:fadeIn .2s ease-out}@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-\[minmax\(18rem\,auto\)\]{grid-auto-rows:minmax(18rem,auto)}.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-\[0\.6rem_7rem_minmax\(2rem\,1fr\)_1rem\]{grid-template-columns:.6rem 7rem minmax(2rem,1fr) 1rem}.grid-cols-\[1fr_240px\]{grid-template-columns:1fr 240px}.grid-cols-\[300px_1fr\]{grid-template-columns:300px 1fr}.grid-cols-\[3fr_1fr\]{grid-template-columns:3fr 1fr}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.grid-cols-\[auto_auto_minmax\(0\,1fr\)_auto\]{grid-template-columns:auto auto minmax(0,1fr) auto}.grid-cols-\[auto_minmax\(6rem\,1fr\)_minmax\(0\,2fr\)_auto_auto_auto\]{grid-template-columns:auto minmax(6rem,1fr) minmax(0,2fr) auto auto auto}.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\(11rem\,1fr\)\)\]{grid-template-columns:repeat(auto-fill,minmax(11rem,1fr))}.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{-moz-column-gap:.5rem;column-gap:.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)}.divide-surface-border\/60>:not([hidden])~:not([hidden]){border-color:rgb(var(--lt-surface-border) / .6)}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.self-center{align-self:center}.self-stretch{align-self:stretch}.justify-self-center{justify-self:center}.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-normal{white-space:normal}.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-\[0\.25em\]{border-radius:.25em}.rounded-\[3px\]{border-radius:3px}.rounded-\[4px\]{border-radius:4px}.rounded-\[var\(--lt-radius-field\)\]{border-radius:var(--lt-radius-field)}.rounded-\[var\(--lt-radius-section\)\]{border-radius:var(--lt-radius-section)}.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-\[var\(--lt-radius-field\)\]{border-top-right-radius:var(--lt-radius-field);border-bottom-right-radius:var(--lt-radius-field)}.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\/25{border-color:rgb(var(--lt-status-warning) / .25)}.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-transparent{border-color:transparent}.\!border-l-accent{--tw-border-opacity: 1 !important;border-left-color:rgb(var(--lt-accent) / var(--tw-border-opacity, 1))!important}.border-b-surface-border\/40{border-bottom-color:rgb(var(--lt-surface-border) / .4)}.border-l-accent{--tw-border-opacity: 1;border-left-color:rgb(var(--lt-accent) / var(--tw-border-opacity, 1))}.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}.border-t-accent{--tw-border-opacity: 1;border-top-color:rgb(var(--lt-accent) / var(--tw-border-opacity, 1))}.\!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\/40{background-color:rgb(var(--lt-accent) / .4)}.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-hover\/60{background-color:rgb(var(--lt-surface-hover) / .6)}.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\/40{background-color:rgb(var(--lt-text-primary) / .4)}.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-quaternary\/70{background-color:rgb(var(--lt-text-quaternary) / .7)}.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-8{padding-left:2rem;padding-right:2rem}.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-7{padding-top:1.75rem;padding-bottom:1.75rem}.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-0\.5{padding-left:.125rem}.pl-1{padding-left:.25rem}.pl-1\.5{padding-left:.375rem}.pl-10{padding-left:2.5rem}.pl-11{padding-left:2.75rem}.pl-12{padding-left:3rem}.pl-14{padding-left:3.5rem}.pl-16{padding-left:4rem}.pl-2{padding-left:.5rem}.pl-2\.5{padding-left:.625rem}.pl-20{padding-left:5rem}.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-1\.5{padding-right:.375rem}.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-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-4xl{font-size:2.25rem;line-height:2.5rem}.text-7xl{font-size:4.5rem;line-height:1}.text-\[0\.5em\]{font-size:.5em}.text-\[0\.625rem\]{font-size:.625rem}.text-\[0\.7875rem\]{font-size:.7875rem}.text-\[0\.85em\]{font-size:.85em}.text-\[1\.40625rem\]{font-size:1.40625rem}.text-\[10px\]{font-size:10px}.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-xl{font-size:1.25rem;line-height:1.75rem}.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-5{line-height:1.25rem}.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-normal{letter-spacing:0em}.tracking-tight{letter-spacing:-.025em}.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\/65{color:rgb(var(--lt-accent) / .65)}.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-graphic{--tw-text-opacity: 1;color:rgb(var(--lt-status-success-graphic) / 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-status-warning\/40{color:rgb(var(--lt-status-warning) / .4)}.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-white\/75{color:#ffffffbf}.text-white\/95{color:#fffffff2}.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-55{opacity:.55}.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{--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(3px + 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-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}.\@container\/tape{container-type:inline-size;container-name:tape}.\[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)}}@keyframes click-hint{0%{opacity:0;transform:translate(-50%,calc(-100% + 6px)) scale(.94)}10%{opacity:1;transform:translate(-50%,-100%) scale(1.03)}18%{transform:translate(-50%,-100%) scale(1)}82%{opacity:1;transform:translate(-50%,-100%) scale(1)}to{opacity:0;transform:translate(-50%,calc(-100% - 10px)) scale(1)}}.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-quaternary::-moz-placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-quaternary) / var(--tw-text-opacity, 1))}.placeholder\:text-text-quaternary::placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-quaternary) / var(--tw-text-opacity, 1))}.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\:ml-0:first-child{margin-left:0}.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-0:last-child{border-width:0px}.last\:border-b-0:last-child{border-bottom-width:0px}.last\:pr-0:last-child{padding-right:0}.focus-within\:border-accent:focus-within{--tw-border-opacity: 1;border-color:rgb(var(--lt-accent) / var(--tw-border-opacity, 1))}.focus-within\:bg-surface-field-focus:focus-within{--tw-bg-opacity: 1;background-color:rgb(var(--lt-field-focus) / var(--tw-bg-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-accent\/60:hover{border-color:rgb(var(--lt-accent) / .6)}.hover\:border-status-error:hover{--tw-border-opacity: 1;border-color:rgb(var(--lt-status-error) / var(--tw-border-opacity, 1))}.hover\:border-status-error\/50:hover{border-color:rgb(var(--lt-status-error) / .5)}.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\/5:hover{background-color:rgb(var(--lt-accent) / .05)}.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\/50:hover{background-color:rgb(var(--lt-surface-sunken) / .5)}.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)}.enabled\:hover\:border-accent\/60:hover:enabled{border-color:rgb(var(--lt-accent) / .6)}.enabled\:hover\:bg-accent\/5:hover:enabled{background-color:rgb(var(--lt-accent) / .05)}.enabled\:hover\:text-accent:hover:enabled{--tw-text-opacity: 1;color:rgb(var(--lt-accent) / var(--tw-text-opacity, 1))}.disabled\:cursor-default:disabled{cursor:default}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:text-text-tertiary:disabled{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.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\:opacity-60:disabled{opacity:.6}.disabled\:hover\:border-surface-border:hover:disabled{--tw-border-opacity: 1;border-color:rgb(var(--lt-surface-border) / var(--tw-border-opacity, 1))}.disabled\:hover\:bg-accent:hover:disabled{--tw-bg-opacity: 1;background-color:rgb(var(--lt-accent) / var(--tw-bg-opacity, 1))}.disabled\:hover\:bg-transparent:hover:disabled{background-color:transparent}.disabled\:hover\:text-text-tertiary:hover:disabled{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.group:hover .group-hover\:pointer-events-auto{pointer-events:auto}.group\/srv:hover .group-hover\/srv\:visible{visibility:visible}.group:hover .group-hover\:block{display:block}.group:hover .group-hover\:border-accent\/50{border-color:rgb(var(--lt-accent) / .5)}.group:hover .group-hover\:border-accent\/60{border-color:rgb(var(--lt-accent) / .6)}.group\/pin:hover .group-hover\/pin\:text-accent{--tw-text-opacity: 1;color:rgb(var(--lt-accent) / var(--tw-text-opacity, 1))}.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\/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 tape (min-width: 48rem){.\@table\/tape\:col-span-1{grid-column:span 1 / span 1}.\@table\/tape\:col-start-4{grid-column-start:4}.\@table\/tape\:col-start-5{grid-column-start:5}.\@table\/tape\:col-start-6{grid-column-start:6}.\@table\/tape\:max-w-\[22rem\]{max-width:22rem}.\@table\/tape\:grid-cols-\[auto_auto_6rem_11rem_minmax\(0\,1fr\)_auto\]{grid-template-columns:auto auto 6rem 11rem minmax(0,1fr) auto}}@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_460px\]{grid-template-columns:1fr 460px}.\@split\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.\@split\:gap-12{gap:3rem}.\@split\:pt-4{padding-top:1rem}}@container table (min-width: 64rem){.\@wall\/table\:table-cell{display:table-cell}}@container (min-width: 64rem){.\@wall\:sticky{position:sticky}.\@wall\:top-0{top:0}.\@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\:inline{display:inline}.sm\:flex{display:flex}.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:768px){.md\:flex{display:flex}}@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\:table-cell{display:table-cell}.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\:px-8{padding-left:2rem;padding-right:2rem}.lg\:pl-12{padding-left:3rem}}@media(min-width:1280px){.xl\:table-cell{display:table-cell}}.\[\&_p\+p\]\:mt-2 p+p{margin-top:.5rem}.\[\&_p\]\:m-0 p{margin:0}
@@ -1,2 +1,2 @@
1
- import{j as e,a as h}from"./vendor-query-DvWWuNIB.js";import{d as B,e as H,f as z,g as U}from"./mcp-_0kFRcyT.js";import{P as V}from"./PageHeader-Hx8APPwE.js";import{i as q,E as K,ad as Y,ae as X,X as G,ab as W,aL as Q,aM as Z}from"./vendor-icons-fxBvvHBi.js";import{T as ee}from"./TagInput-DjPUDp2M.js";import{e as se,u as te,f as ae}from"./vendor-react-_9U4mKFr.js";import"./index-pzbGpihI.js";function re({steps:s,currentStep:t,onStepClick:r}){return e.jsx("div",{className:"flex items-center justify-center gap-1 pb-4 border-b border-surface-border mb-4",children:s.map((a,l)=>{const c=l<t,i=l===t,n=!!r;return e.jsxs("div",{className:"flex items-center gap-1",children:[l>0&&e.jsx("div",{className:`w-4 h-px ${c?"bg-accent":"bg-surface-border"}`}),e.jsxs("button",{type:"button",onClick:n?()=>r(l):void 0,className:`flex items-center gap-1 ${n?"cursor-pointer":"cursor-default"}`,children:[e.jsx("span",{className:`w-5 h-5 rounded-full text-2xs font-semibold flex items-center justify-center shrink-0 transition-colors ${i?"bg-accent text-text-inverse":c?"bg-accent-muted text-accent":"bg-surface-sunken text-text-tertiary"} ${n&&!i?"hover:bg-accent-muted hover:text-accent":""}`,children:l+1}),e.jsx("span",{className:`text-2xs font-semibold uppercase tracking-wider whitespace-nowrap transition-colors ${i?"text-text-primary":"text-text-tertiary"} ${n&&!i?"hover:text-text-primary":""}`,children:a})]})]},a)})})}const L={name:"",description:"",mode:"network",transport_type:"sse",command:"",args:"",env_vars:"{}",url:"",headers:"{}",auto_connect:!1,tags:[],compile_hints:"",credential_providers:[],discovered_tools:null};function ne(s){const t=s.transport_config??{},r=!!t.builtin;let a="network";return r?a="in-process":s.transport_type==="stdio"&&(a="local-process"),{name:s.name,description:s.description??"",mode:a,transport_type:s.transport_type,command:t.command??"",args:(t.args??[]).join(", "),env_vars:t.env?JSON.stringify(t.env,null,2):"{}",url:t.url??"",headers:t.headers?JSON.stringify(t.headers,null,2):"{}",auto_connect:s.auto_connect,tags:s.tags??[],compile_hints:s.compile_hints??"",credential_providers:s.credential_providers??[],discovered_tools:s.tool_manifest??null}}function R(s){let t={};if(s.mode==="local-process")t={command:s.command.trim(),args:s.args.split(",").map(r=>r.trim()).filter(Boolean),env:s.env_vars.trim()?JSON.parse(s.env_vars):void 0};else if(s.mode==="network"){const r=s.headers.trim()?JSON.parse(s.headers):{};t={url:s.url.trim(),...Object.keys(r).length?{headers:r}:{}}}return{name:s.name.trim(),description:s.description.trim()||void 0,transport_type:s.mode==="local-process"?"stdio":s.transport_type,transport_config:t,auto_connect:s.auto_connect,tags:s.tags,compile_hints:s.compile_hints.trim()||void 0,credential_providers:s.credential_providers.length>0?s.credential_providers:void 0}}const O=["Transport","Discovery","Test","Review"];function M(s,t){return s===1?!(!t.name.trim()||t.mode==="network"&&!t.url.trim()||t.mode==="local-process"&&!t.command.trim()):!0}const d="label",b="hint",w="••••••••";function ce(s){const t=s.trim();if(!t)return!1;try{const r=JSON.parse(t);return!!r&&typeof r=="object"&&Object.keys(r).length>0}catch{return!0}}function le(s){try{const t=JSON.parse(s);if(!t||typeof t!="object"||Array.isArray(t))return w;const r=Object.fromEntries(Object.keys(t).map(a=>[a,w]));return JSON.stringify(r,null,2)}catch{return w}}function A({label:s,value:t,onChange:r,placeholder:a,hint:l,rows:c=3}){const[i,n]=h.useState(null),[o,v]=h.useState(!1),u=i??!ce(t),N=()=>{navigator.clipboard.writeText(t),v(!0),setTimeout(()=>v(!1),1500)};return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("label",{className:"label",children:s}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("button",{type:"button",onClick:()=>n(!u),className:"flex items-center gap-1 text-2xs text-text-tertiary hover:text-text-primary","aria-pressed":u,children:[u?e.jsx(q,{className:"w-3.5 h-3.5"}):e.jsx(K,{className:"w-3.5 h-3.5"}),u?"Hide":"Show"]}),e.jsxs("button",{type:"button",onClick:N,disabled:!t.trim(),className:"flex items-center gap-1 text-2xs text-text-tertiary hover:text-text-primary disabled:opacity-40",title:"Copy to clipboard",children:[o?e.jsx(Y,{className:"w-3.5 h-3.5 text-status-success"}):e.jsx(X,{className:"w-3.5 h-3.5"}),"Copy"]})]})]}),e.jsx("textarea",{"aria-label":s,value:u?t:le(t),onChange:j=>{n(!0),r(j.target.value)},readOnly:!u,placeholder:a,className:"input-json w-full",rows:c,spellCheck:!1,autoComplete:"off"}),l&&e.jsx("p",{className:"hint",children:l})]})}const ie=[{value:"in-process",label:"In-Process",hint:"Built-in server running inside the app"},{value:"network",label:"Network Service",hint:"Remote server via SSE or Streamable HTTP"},{value:"local-process",label:"Local Process",hint:"Spawn a local command via stdio"}];function oe({form:s,set:t,isBuiltin:r}){return e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Connection Mode"}),e.jsx("div",{className:"grid grid-cols-3 gap-3 mt-1",children:ie.map(a=>{const l=s.mode===a.value,c=r&&a.value!=="in-process";return e.jsxs("button",{type:"button",disabled:c,onClick:()=>{t("mode",a.value),a.value==="local-process"&&t("transport_type","stdio"),a.value==="network"&&t("transport_type","sse")},className:`text-left p-3 rounded-md border transition-colors ${l?"border-accent bg-accent/5":c?"border-surface-border bg-surface-sunken opacity-50 cursor-not-allowed":"border-surface-border hover:border-text-tertiary cursor-pointer"}`,children:[e.jsx("span",{className:`text-xs font-medium ${l?"text-accent":"text-text-primary"}`,children:a.label}),e.jsx("span",{className:"block text-2xs text-text-tertiary mt-0.5",children:a.hint})]},a.value)})})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Name"}),e.jsx("input",{type:"text",value:s.name,onChange:a=>t("name",a.target.value),placeholder:"e.g., vision-server",className:"input text-xs w-full",disabled:r})]}),e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Description"}),e.jsx("input",{type:"text",value:s.description,onChange:a=>t("description",a.target.value),placeholder:"Optional description",className:"input text-xs w-full"})]})]}),s.mode==="in-process"&&e.jsx("div",{children:e.jsx("p",{className:b,children:"This server runs in-process via InMemoryTransport. Transport is managed automatically — no configuration needed."})}),s.mode==="network"&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Server URL"}),e.jsx("input",{type:"text",value:s.url,onChange:a=>t("url",a.target.value),placeholder:"https://mcp-server.example.com/sse",className:"input text-xs w-full font-mono"})]}),e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Transport Protocol"}),e.jsx("div",{className:"flex gap-2 mt-1",children:["sse","streamable-http"].map(a=>e.jsx("button",{type:"button",onClick:()=>t("transport_type",a),className:`px-3 py-1.5 text-xs rounded-md border transition-colors ${s.transport_type===a?"border-accent bg-accent/5 text-accent font-medium":"border-surface-border text-text-secondary hover:border-text-tertiary"}`,children:a==="sse"?"SSE":"Streamable HTTP"},a))})]}),e.jsx(A,{label:"Headers (JSON)",value:s.headers,onChange:a=>t("headers",a),placeholder:'{ "Authorization": "Bearer <service-account key>" }',hint:"Sent with every request. Another Long Tail instance's /mcp takes a service-account key here."})]}),s.mode==="local-process"&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Command"}),e.jsx("input",{type:"text",value:s.command,onChange:a=>t("command",a.target.value),placeholder:"e.g., npx",className:"input text-xs w-full font-mono"})]}),e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Arguments (comma-separated)"}),e.jsx("input",{type:"text",value:s.args,onChange:a=>t("args",a.target.value),placeholder:"e.g., -y, @modelcontextprotocol/server-filesystem, /tmp",className:"input text-xs w-full font-mono"})]}),e.jsx(A,{label:"Environment Variables (JSON)",value:s.env_vars,onChange:a=>t("env_vars",a)})]}),e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:s.auto_connect,onChange:a=>t("auto_connect",a.target.checked),className:"w-4 h-4 rounded border-border accent-accent"}),e.jsx("span",{className:"text-xs text-text-primary",children:"Auto-connect on startup"})]})]})}function de({form:s,set:t}){const[r,a]=h.useState(""),l=n=>{const o=n.trim().toLowerCase();o&&!s.credential_providers.includes(o)&&t("credential_providers",[...s.credential_providers,o]),a("")},c=n=>{t("credential_providers",s.credential_providers.filter(o=>o!==n))},i=n=>{n.key==="Enter"||n.key===","?(n.preventDefault(),l(r)):n.key==="Backspace"&&!r&&s.credential_providers.length>0&&c(s.credential_providers[s.credential_providers.length-1])};return e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Tags"}),e.jsx(ee,{tags:s.tags,onChange:n=>t("tags",n),placeholder:"Add tag (e.g., database, analytics)..."}),e.jsx("p",{className:b,children:"Tags enable tool discovery. Workflows filter available MCP servers by tags to find relevant tools."})]}),e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Compile Hints"}),e.jsx("textarea",{value:s.compile_hints,onChange:n=>t("compile_hints",n.target.value),placeholder:"Guidance for the workflow compiler when generating YAML from this server's tools...",className:"input text-xs w-full leading-relaxed",rows:4,spellCheck:!1}),e.jsx("p",{className:b,children:"Free-form text that guides the workflow compiler. Describe how tools should be composed, sequenced, or parameterized."})]}),e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Credential Providers"}),e.jsxs("div",{className:"flex flex-wrap items-center gap-1.5 bg-surface-sunken border border-surface-border rounded-md px-2 py-1.5 focus-within:ring-1 focus-within:ring-accent-primary",children:[s.credential_providers.map(n=>e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-full bg-accent/10 text-accent text-2xs font-medium",children:[n,e.jsx("button",{type:"button",onClick:()=>c(n),className:"hover:text-status-error transition-colors",children:e.jsx(G,{className:"w-2.5 h-2.5"})})]},n)),e.jsx("input",{type:"text",value:r,onChange:n=>a(n.target.value),onKeyDown:i,onBlur:()=>{r.trim()&&l(r)},placeholder:s.credential_providers.length===0?"Add provider (e.g., github, slack)...":"",className:"flex-1 min-w-[80px] bg-transparent text-xs text-text-primary outline-none placeholder:text-text-tertiary"})]}),e.jsx("p",{className:b,children:"IAM credential providers required by this server's tools. Users will be prompted to connect these before tool execution."})]})]})}function pe({form:s,set:t}){const r=B(),a=s.mode==="in-process",l=()=>{const n=R(s);r.mutate({transport_type:n.transport_type,transport_config:n.transport_config},{onSuccess:o=>{o.success&&t("discovered_tools",o.tools)}})},c=r.data,i=s.discovered_tools??(c==null?void 0:c.tools)??[];return e.jsx("div",{className:"space-y-5",children:a?e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-text-secondary",children:"In-process servers connect lazily on first tool call. No connection test needed."}),s.discovered_tools&&s.discovered_tools.length>0&&e.jsxs("div",{className:"mt-4",children:[e.jsxs("p",{className:"text-xs text-text-tertiary mb-2",children:[s.discovered_tools.length," tool",s.discovered_tools.length!==1?"s":""," cached from last connection"]}),e.jsx(I,{tools:s.discovered_tools})]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("button",{type:"button",onClick:l,disabled:r.isPending,className:"btn-primary text-xs",children:r.isPending?e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx(W,{className:"w-3 h-3 animate-spin"}),"Connecting..."]}):"Test Connection"}),(c==null?void 0:c.success)&&e.jsxs("span",{className:"flex items-center gap-1 text-xs text-status-success",children:[e.jsx(Q,{className:"w-3.5 h-3.5"}),"Connected — ",i.length," tool",i.length!==1?"s":""," discovered"]}),c&&!c.success&&e.jsxs("span",{className:"flex items-center gap-1 text-xs text-status-error",children:[e.jsx(Z,{className:"w-3.5 h-3.5"}),c.error||"Connection failed"]})]}),i.length>0&&e.jsxs("div",{children:[e.jsx("p",{className:"text-xs text-text-tertiary mb-2",children:"Discovered tools"}),e.jsx(I,{tools:i})]}),e.jsx("p",{className:b,children:"Tests connectivity by connecting to the server and listing available tools. The server must be reachable from this machine."})]})})}function I({tools:s}){return e.jsx("div",{className:"max-h-[280px] overflow-y-auto border border-surface-border rounded-md divide-y divide-surface-border",children:s.map(t=>e.jsxs("div",{className:"px-3 py-2",children:[e.jsx("span",{className:"text-xs font-medium text-text-primary font-mono",children:t.name}),t.description&&e.jsx("span",{className:"block text-2xs text-text-tertiary mt-0.5 line-clamp-2",children:t.description})]},t.name))})}const xe={"in-process":"In-Process",network:"Network Service","local-process":"Local Process"},ue={stdio:"stdio",sse:"SSE","streamable-http":"Streamable HTTP"};function me({form:s}){const t=s.discovered_tools??[];return e.jsxs("div",{className:"space-y-4",children:[e.jsx(x,{label:"Name",value:s.name}),s.description&&e.jsx(x,{label:"Description",value:s.description}),e.jsx(x,{label:"Mode",value:xe[s.mode]??s.mode}),s.mode==="network"&&e.jsxs(e.Fragment,{children:[e.jsx(x,{label:"Transport",value:ue[s.transport_type]??s.transport_type}),e.jsx(x,{label:"URL",value:s.url,mono:!0})]}),s.mode==="local-process"&&e.jsxs(e.Fragment,{children:[e.jsx(x,{label:"Command",value:s.command,mono:!0}),s.args&&e.jsx(x,{label:"Args",value:s.args,mono:!0})]}),e.jsx(x,{label:"Auto-connect",value:s.auto_connect?"Yes":"No"}),s.tags.length>0&&e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Tags"}),e.jsx("div",{className:"flex flex-wrap gap-1.5 mt-1",children:s.tags.map(r=>e.jsx("span",{className:"px-2 py-0.5 rounded-full bg-accent/10 text-accent text-2xs font-medium",children:r},r))})]}),s.credential_providers.length>0&&e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Credential Providers"}),e.jsx("div",{className:"flex flex-wrap gap-1.5 mt-1",children:s.credential_providers.map(r=>e.jsx("span",{className:"px-2 py-0.5 rounded-full bg-accent/10 text-accent text-2xs font-medium",children:r},r))})]}),s.compile_hints&&e.jsx(x,{label:"Compile Hints",value:s.compile_hints}),t.length>0&&e.jsx(x,{label:"Discovered Tools",value:`${t.length} tool${t.length!==1?"s":""}`})]})}function x({label:s,value:t,mono:r}){return e.jsxs("div",{children:[e.jsx("label",{className:d,children:s}),e.jsx("p",{className:`text-xs text-text-primary mt-0.5 ${r?"font-mono":""}`,children:t})]})}function fe(){var T,P,E;const{serverId:s}=se(),t=!s,r=te(),{data:a,isLoading:l}=H(s??""),c=z(),i=U(),[n,o]=h.useState(L),[v,u]=h.useState(!1),[N,j]=h.useState(""),[$,S]=ae(),p=parseInt($.get("step")||"1",10),f=h.useCallback(m=>{S(g=>{const y=new URLSearchParams(g);return y.set("step",String(m)),y},{replace:!1})},[S]);h.useEffect(()=>{if(!v){if(t){o(L),u(!0);return}a&&(o(ne(a)),u(!0))}},[a,t,v]);const _=(m,g)=>o(y=>({...y,[m]:g})),J=!!((T=a==null?void 0:a.transport_config)!=null&&T.builtin),D=()=>{j("");const m=R(n);a?i.mutate({id:a.id,...m},{onSuccess:()=>r("/mcp/servers")}):c.mutate(m,{onSuccess:()=>r("/mcp/servers"),onError:g=>j(g.message)})};if(!t&&l)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-60 bg-surface-sunken rounded"})]});if(!t&&!a&&!l)return e.jsx("p",{className:"text-sm text-text-secondary",children:"Server not found."});const F=p===O.length,k=c.isPending||i.isPending,C=N||((P=c.error)==null?void 0:P.message)||((E=i.error)==null?void 0:E.message);return e.jsxs("div",{children:[e.jsx(V,{title:t?"Register MCP Server":(a==null?void 0:a.name)??""}),e.jsxs("div",{className:"max-w-3xl",children:[e.jsx(re,{steps:O,currentStep:p-1,onStepClick:m=>f(m+1)}),e.jsxs("div",{className:"min-h-[360px] py-2",children:[p===1&&e.jsx(oe,{form:n,set:_,isBuiltin:J}),p===2&&e.jsx(de,{form:n,set:_}),p===3&&e.jsx(pe,{form:n,set:_}),p===4&&e.jsx(me,{form:n})]}),C&&e.jsx("p",{className:"text-xs text-status-error mt-4",children:C}),e.jsxs("div",{className:"flex justify-between items-center pt-4 border-t border-surface-border mt-4",children:[e.jsx("div",{children:p>1&&e.jsx("button",{onClick:()=>f(p-1),className:"btn-secondary text-xs",children:"Back"})}),e.jsxs("div",{className:"flex gap-3",children:[e.jsx("button",{onClick:()=>r("/mcp/servers"),className:"btn-ghost text-xs",children:"Cancel"}),F?e.jsx("button",{onClick:D,disabled:!M(p,n)||k,className:"btn-primary text-xs",children:k?"Saving...":a?"Save":"Register"}):e.jsx("button",{onClick:()=>f(p+1),disabled:!M(p,n),className:"btn-primary text-xs",children:"Next"})]})]})]})]})}export{fe as McpServerDetailPage};
2
- //# sourceMappingURL=index-3HaFP00M.js.map
1
+ import{j as e,a as h}from"./vendor-query-DvWWuNIB.js";import{d as B,e as H,f as z,g as U}from"./mcp-dCLNwcC8.js";import{P as V}from"./PageHeader-DiGWAQlR.js";import{i as q,E as K,ad as Y,ae as X,X as G,ab as W,aL as Q,aM as Z}from"./vendor-icons-en0_uSRD.js";import{T as ee}from"./TagInput-DaIdhv3h.js";import{e as se,u as te,f as ae}from"./vendor-react-_9U4mKFr.js";import"./index-CSr5q355.js";function re({steps:s,currentStep:t,onStepClick:r}){return e.jsx("div",{className:"flex items-center justify-center gap-1 pb-4 border-b border-surface-border mb-4",children:s.map((a,l)=>{const c=l<t,i=l===t,n=!!r;return e.jsxs("div",{className:"flex items-center gap-1",children:[l>0&&e.jsx("div",{className:`w-4 h-px ${c?"bg-accent":"bg-surface-border"}`}),e.jsxs("button",{type:"button",onClick:n?()=>r(l):void 0,className:`flex items-center gap-1 ${n?"cursor-pointer":"cursor-default"}`,children:[e.jsx("span",{className:`w-5 h-5 rounded-full text-2xs font-semibold flex items-center justify-center shrink-0 transition-colors ${i?"bg-accent text-text-inverse":c?"bg-accent-muted text-accent":"bg-surface-sunken text-text-tertiary"} ${n&&!i?"hover:bg-accent-muted hover:text-accent":""}`,children:l+1}),e.jsx("span",{className:`text-2xs font-semibold uppercase tracking-wider whitespace-nowrap transition-colors ${i?"text-text-primary":"text-text-tertiary"} ${n&&!i?"hover:text-text-primary":""}`,children:a})]})]},a)})})}const L={name:"",description:"",mode:"network",transport_type:"sse",command:"",args:"",env_vars:"{}",url:"",headers:"{}",auto_connect:!1,tags:[],compile_hints:"",credential_providers:[],discovered_tools:null};function ne(s){const t=s.transport_config??{},r=!!t.builtin;let a="network";return r?a="in-process":s.transport_type==="stdio"&&(a="local-process"),{name:s.name,description:s.description??"",mode:a,transport_type:s.transport_type,command:t.command??"",args:(t.args??[]).join(", "),env_vars:t.env?JSON.stringify(t.env,null,2):"{}",url:t.url??"",headers:t.headers?JSON.stringify(t.headers,null,2):"{}",auto_connect:s.auto_connect,tags:s.tags??[],compile_hints:s.compile_hints??"",credential_providers:s.credential_providers??[],discovered_tools:s.tool_manifest??null}}function R(s){let t={};if(s.mode==="local-process")t={command:s.command.trim(),args:s.args.split(",").map(r=>r.trim()).filter(Boolean),env:s.env_vars.trim()?JSON.parse(s.env_vars):void 0};else if(s.mode==="network"){const r=s.headers.trim()?JSON.parse(s.headers):{};t={url:s.url.trim(),...Object.keys(r).length?{headers:r}:{}}}return{name:s.name.trim(),description:s.description.trim()||void 0,transport_type:s.mode==="local-process"?"stdio":s.transport_type,transport_config:t,auto_connect:s.auto_connect,tags:s.tags,compile_hints:s.compile_hints.trim()||void 0,credential_providers:s.credential_providers.length>0?s.credential_providers:void 0}}const O=["Transport","Discovery","Test","Review"];function M(s,t){return s===1?!(!t.name.trim()||t.mode==="network"&&!t.url.trim()||t.mode==="local-process"&&!t.command.trim()):!0}const d="label",b="hint",w="••••••••";function ce(s){const t=s.trim();if(!t)return!1;try{const r=JSON.parse(t);return!!r&&typeof r=="object"&&Object.keys(r).length>0}catch{return!0}}function le(s){try{const t=JSON.parse(s);if(!t||typeof t!="object"||Array.isArray(t))return w;const r=Object.fromEntries(Object.keys(t).map(a=>[a,w]));return JSON.stringify(r,null,2)}catch{return w}}function A({label:s,value:t,onChange:r,placeholder:a,hint:l,rows:c=3}){const[i,n]=h.useState(null),[o,v]=h.useState(!1),u=i??!ce(t),N=()=>{navigator.clipboard.writeText(t),v(!0),setTimeout(()=>v(!1),1500)};return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("label",{className:"label",children:s}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("button",{type:"button",onClick:()=>n(!u),className:"flex items-center gap-1 text-2xs text-text-tertiary hover:text-text-primary","aria-pressed":u,children:[u?e.jsx(q,{className:"w-3.5 h-3.5"}):e.jsx(K,{className:"w-3.5 h-3.5"}),u?"Hide":"Show"]}),e.jsxs("button",{type:"button",onClick:N,disabled:!t.trim(),className:"flex items-center gap-1 text-2xs text-text-tertiary hover:text-text-primary disabled:opacity-40",title:"Copy to clipboard",children:[o?e.jsx(Y,{className:"w-3.5 h-3.5 text-status-success"}):e.jsx(X,{className:"w-3.5 h-3.5"}),"Copy"]})]})]}),e.jsx("textarea",{"aria-label":s,value:u?t:le(t),onChange:j=>{n(!0),r(j.target.value)},readOnly:!u,placeholder:a,className:"input-json w-full",rows:c,spellCheck:!1,autoComplete:"off"}),l&&e.jsx("p",{className:"hint",children:l})]})}const ie=[{value:"in-process",label:"In-Process",hint:"Built-in server running inside the app"},{value:"network",label:"Network Service",hint:"Remote server via SSE or Streamable HTTP"},{value:"local-process",label:"Local Process",hint:"Spawn a local command via stdio"}];function oe({form:s,set:t,isBuiltin:r}){return e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Connection Mode"}),e.jsx("div",{className:"grid grid-cols-3 gap-3 mt-1",children:ie.map(a=>{const l=s.mode===a.value,c=r&&a.value!=="in-process";return e.jsxs("button",{type:"button",disabled:c,onClick:()=>{t("mode",a.value),a.value==="local-process"&&t("transport_type","stdio"),a.value==="network"&&t("transport_type","sse")},className:`text-left p-3 rounded-md border transition-colors ${l?"border-accent bg-accent/5":c?"border-surface-border bg-surface-sunken opacity-50 cursor-not-allowed":"border-surface-border hover:border-text-tertiary cursor-pointer"}`,children:[e.jsx("span",{className:`text-xs font-medium ${l?"text-accent":"text-text-primary"}`,children:a.label}),e.jsx("span",{className:"block text-2xs text-text-tertiary mt-0.5",children:a.hint})]},a.value)})})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Name"}),e.jsx("input",{type:"text",value:s.name,onChange:a=>t("name",a.target.value),placeholder:"e.g., vision-server",className:"input text-xs w-full",disabled:r})]}),e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Description"}),e.jsx("input",{type:"text",value:s.description,onChange:a=>t("description",a.target.value),placeholder:"Optional description",className:"input text-xs w-full"})]})]}),s.mode==="in-process"&&e.jsx("div",{children:e.jsx("p",{className:b,children:"This server runs in-process via InMemoryTransport. Transport is managed automatically — no configuration needed."})}),s.mode==="network"&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Server URL"}),e.jsx("input",{type:"text",value:s.url,onChange:a=>t("url",a.target.value),placeholder:"https://mcp-server.example.com/sse",className:"input text-xs w-full font-mono"})]}),e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Transport Protocol"}),e.jsx("div",{className:"flex gap-2 mt-1",children:["sse","streamable-http"].map(a=>e.jsx("button",{type:"button",onClick:()=>t("transport_type",a),className:`px-3 py-1.5 text-xs rounded-md border transition-colors ${s.transport_type===a?"border-accent bg-accent/5 text-accent font-medium":"border-surface-border text-text-secondary hover:border-text-tertiary"}`,children:a==="sse"?"SSE":"Streamable HTTP"},a))})]}),e.jsx(A,{label:"Headers (JSON)",value:s.headers,onChange:a=>t("headers",a),placeholder:'{ "Authorization": "Bearer <service-account key>" }',hint:"Sent with every request. Another Long Tail instance's /mcp takes a service-account key here."})]}),s.mode==="local-process"&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Command"}),e.jsx("input",{type:"text",value:s.command,onChange:a=>t("command",a.target.value),placeholder:"e.g., npx",className:"input text-xs w-full font-mono"})]}),e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Arguments (comma-separated)"}),e.jsx("input",{type:"text",value:s.args,onChange:a=>t("args",a.target.value),placeholder:"e.g., -y, @modelcontextprotocol/server-filesystem, /tmp",className:"input text-xs w-full font-mono"})]}),e.jsx(A,{label:"Environment Variables (JSON)",value:s.env_vars,onChange:a=>t("env_vars",a)})]}),e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:s.auto_connect,onChange:a=>t("auto_connect",a.target.checked),className:"w-4 h-4 rounded border-border accent-accent"}),e.jsx("span",{className:"text-xs text-text-primary",children:"Auto-connect on startup"})]})]})}function de({form:s,set:t}){const[r,a]=h.useState(""),l=n=>{const o=n.trim().toLowerCase();o&&!s.credential_providers.includes(o)&&t("credential_providers",[...s.credential_providers,o]),a("")},c=n=>{t("credential_providers",s.credential_providers.filter(o=>o!==n))},i=n=>{n.key==="Enter"||n.key===","?(n.preventDefault(),l(r)):n.key==="Backspace"&&!r&&s.credential_providers.length>0&&c(s.credential_providers[s.credential_providers.length-1])};return e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Tags"}),e.jsx(ee,{tags:s.tags,onChange:n=>t("tags",n),placeholder:"Add tag (e.g., database, analytics)..."}),e.jsx("p",{className:b,children:"Tags enable tool discovery. Workflows filter available MCP servers by tags to find relevant tools."})]}),e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Compile Hints"}),e.jsx("textarea",{value:s.compile_hints,onChange:n=>t("compile_hints",n.target.value),placeholder:"Guidance for the workflow compiler when generating YAML from this server's tools...",className:"input text-xs w-full leading-relaxed",rows:4,spellCheck:!1}),e.jsx("p",{className:b,children:"Free-form text that guides the workflow compiler. Describe how tools should be composed, sequenced, or parameterized."})]}),e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Credential Providers"}),e.jsxs("div",{className:"flex flex-wrap items-center gap-1.5 bg-surface-sunken border border-surface-border rounded-md px-2 py-1.5 focus-within:ring-1 focus-within:ring-accent-primary",children:[s.credential_providers.map(n=>e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-full bg-accent/10 text-accent text-2xs font-medium",children:[n,e.jsx("button",{type:"button",onClick:()=>c(n),className:"hover:text-status-error transition-colors",children:e.jsx(G,{className:"w-2.5 h-2.5"})})]},n)),e.jsx("input",{type:"text",value:r,onChange:n=>a(n.target.value),onKeyDown:i,onBlur:()=>{r.trim()&&l(r)},placeholder:s.credential_providers.length===0?"Add provider (e.g., github, slack)...":"",className:"flex-1 min-w-[80px] bg-transparent text-xs text-text-primary outline-none placeholder:text-text-tertiary"})]}),e.jsx("p",{className:b,children:"IAM credential providers required by this server's tools. Users will be prompted to connect these before tool execution."})]})]})}function pe({form:s,set:t}){const r=B(),a=s.mode==="in-process",l=()=>{const n=R(s);r.mutate({transport_type:n.transport_type,transport_config:n.transport_config},{onSuccess:o=>{o.success&&t("discovered_tools",o.tools)}})},c=r.data,i=s.discovered_tools??(c==null?void 0:c.tools)??[];return e.jsx("div",{className:"space-y-5",children:a?e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-text-secondary",children:"In-process servers connect lazily on first tool call. No connection test needed."}),s.discovered_tools&&s.discovered_tools.length>0&&e.jsxs("div",{className:"mt-4",children:[e.jsxs("p",{className:"text-xs text-text-tertiary mb-2",children:[s.discovered_tools.length," tool",s.discovered_tools.length!==1?"s":""," cached from last connection"]}),e.jsx(I,{tools:s.discovered_tools})]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("button",{type:"button",onClick:l,disabled:r.isPending,className:"btn-primary text-xs",children:r.isPending?e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx(W,{className:"w-3 h-3 animate-spin"}),"Connecting..."]}):"Test Connection"}),(c==null?void 0:c.success)&&e.jsxs("span",{className:"flex items-center gap-1 text-xs text-status-success",children:[e.jsx(Q,{className:"w-3.5 h-3.5"}),"Connected — ",i.length," tool",i.length!==1?"s":""," discovered"]}),c&&!c.success&&e.jsxs("span",{className:"flex items-center gap-1 text-xs text-status-error",children:[e.jsx(Z,{className:"w-3.5 h-3.5"}),c.error||"Connection failed"]})]}),i.length>0&&e.jsxs("div",{children:[e.jsx("p",{className:"text-xs text-text-tertiary mb-2",children:"Discovered tools"}),e.jsx(I,{tools:i})]}),e.jsx("p",{className:b,children:"Tests connectivity by connecting to the server and listing available tools. The server must be reachable from this machine."})]})})}function I({tools:s}){return e.jsx("div",{className:"max-h-[280px] overflow-y-auto border border-surface-border rounded-md divide-y divide-surface-border",children:s.map(t=>e.jsxs("div",{className:"px-3 py-2",children:[e.jsx("span",{className:"text-xs font-medium text-text-primary font-mono",children:t.name}),t.description&&e.jsx("span",{className:"block text-2xs text-text-tertiary mt-0.5 line-clamp-2",children:t.description})]},t.name))})}const xe={"in-process":"In-Process",network:"Network Service","local-process":"Local Process"},ue={stdio:"stdio",sse:"SSE","streamable-http":"Streamable HTTP"};function me({form:s}){const t=s.discovered_tools??[];return e.jsxs("div",{className:"space-y-4",children:[e.jsx(x,{label:"Name",value:s.name}),s.description&&e.jsx(x,{label:"Description",value:s.description}),e.jsx(x,{label:"Mode",value:xe[s.mode]??s.mode}),s.mode==="network"&&e.jsxs(e.Fragment,{children:[e.jsx(x,{label:"Transport",value:ue[s.transport_type]??s.transport_type}),e.jsx(x,{label:"URL",value:s.url,mono:!0})]}),s.mode==="local-process"&&e.jsxs(e.Fragment,{children:[e.jsx(x,{label:"Command",value:s.command,mono:!0}),s.args&&e.jsx(x,{label:"Args",value:s.args,mono:!0})]}),e.jsx(x,{label:"Auto-connect",value:s.auto_connect?"Yes":"No"}),s.tags.length>0&&e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Tags"}),e.jsx("div",{className:"flex flex-wrap gap-1.5 mt-1",children:s.tags.map(r=>e.jsx("span",{className:"px-2 py-0.5 rounded-full bg-accent/10 text-accent text-2xs font-medium",children:r},r))})]}),s.credential_providers.length>0&&e.jsxs("div",{children:[e.jsx("label",{className:d,children:"Credential Providers"}),e.jsx("div",{className:"flex flex-wrap gap-1.5 mt-1",children:s.credential_providers.map(r=>e.jsx("span",{className:"px-2 py-0.5 rounded-full bg-accent/10 text-accent text-2xs font-medium",children:r},r))})]}),s.compile_hints&&e.jsx(x,{label:"Compile Hints",value:s.compile_hints}),t.length>0&&e.jsx(x,{label:"Discovered Tools",value:`${t.length} tool${t.length!==1?"s":""}`})]})}function x({label:s,value:t,mono:r}){return e.jsxs("div",{children:[e.jsx("label",{className:d,children:s}),e.jsx("p",{className:`text-xs text-text-primary mt-0.5 ${r?"font-mono":""}`,children:t})]})}function fe(){var T,P,E;const{serverId:s}=se(),t=!s,r=te(),{data:a,isLoading:l}=H(s??""),c=z(),i=U(),[n,o]=h.useState(L),[v,u]=h.useState(!1),[N,j]=h.useState(""),[$,S]=ae(),p=parseInt($.get("step")||"1",10),f=h.useCallback(m=>{S(g=>{const y=new URLSearchParams(g);return y.set("step",String(m)),y},{replace:!1})},[S]);h.useEffect(()=>{if(!v){if(t){o(L),u(!0);return}a&&(o(ne(a)),u(!0))}},[a,t,v]);const _=(m,g)=>o(y=>({...y,[m]:g})),J=!!((T=a==null?void 0:a.transport_config)!=null&&T.builtin),D=()=>{j("");const m=R(n);a?i.mutate({id:a.id,...m},{onSuccess:()=>r("/mcp/servers")}):c.mutate(m,{onSuccess:()=>r("/mcp/servers"),onError:g=>j(g.message)})};if(!t&&l)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-60 bg-surface-sunken rounded"})]});if(!t&&!a&&!l)return e.jsx("p",{className:"text-sm text-text-secondary",children:"Server not found."});const F=p===O.length,k=c.isPending||i.isPending,C=N||((P=c.error)==null?void 0:P.message)||((E=i.error)==null?void 0:E.message);return e.jsxs("div",{children:[e.jsx(V,{title:t?"Register MCP Server":(a==null?void 0:a.name)??""}),e.jsxs("div",{className:"max-w-3xl",children:[e.jsx(re,{steps:O,currentStep:p-1,onStepClick:m=>f(m+1)}),e.jsxs("div",{className:"min-h-[360px] py-2",children:[p===1&&e.jsx(oe,{form:n,set:_,isBuiltin:J}),p===2&&e.jsx(de,{form:n,set:_}),p===3&&e.jsx(pe,{form:n,set:_}),p===4&&e.jsx(me,{form:n})]}),C&&e.jsx("p",{className:"text-xs text-status-error mt-4",children:C}),e.jsxs("div",{className:"flex justify-between items-center pt-4 border-t border-surface-border mt-4",children:[e.jsx("div",{children:p>1&&e.jsx("button",{onClick:()=>f(p-1),className:"btn-secondary text-xs",children:"Back"})}),e.jsxs("div",{className:"flex gap-3",children:[e.jsx("button",{onClick:()=>r("/mcp/servers"),className:"btn-ghost text-xs",children:"Cancel"}),F?e.jsx("button",{onClick:D,disabled:!M(p,n)||k,className:"btn-primary text-xs",children:k?"Saving...":a?"Save":"Register"}):e.jsx("button",{onClick:()=>f(p+1),disabled:!M(p,n),className:"btn-primary text-xs",children:"Next"})]})]})]})]})}export{fe as McpServerDetailPage};
2
+ //# sourceMappingURL=index-D-vNL8Hm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-3HaFP00M.js","sources":["../../src/components/common/layout/StepIndicator.tsx","../../src/pages/mcp/servers/detail/server-form-types.ts","../../src/components/common/form/SecretJsonField.tsx","../../src/pages/mcp/servers/detail/TransportStep.tsx","../../src/pages/mcp/servers/detail/DiscoveryStep.tsx","../../src/pages/mcp/servers/detail/TestStep.tsx","../../src/pages/mcp/servers/detail/ReviewStep.tsx","../../src/pages/mcp/servers/detail/McpServerDetailPage.tsx"],"sourcesContent":["interface StepIndicatorProps {\n steps: string[];\n currentStep: number;\n onStepClick?: (step: number) => void;\n}\n\nexport function StepIndicator({ steps, currentStep, onStepClick }: StepIndicatorProps) {\n return (\n <div className=\"flex items-center justify-center gap-1 pb-4 border-b border-surface-border mb-4\">\n {steps.map((label, i) => {\n const done = i < currentStep;\n const active = i === currentStep;\n const clickable = !!onStepClick;\n return (\n <div key={label} className=\"flex items-center gap-1\">\n {i > 0 && (\n <div className={`w-4 h-px ${done ? 'bg-accent' : 'bg-surface-border'}`} />\n )}\n <button\n type=\"button\"\n onClick={clickable ? () => onStepClick(i) : undefined}\n className={`flex items-center gap-1 ${clickable ? 'cursor-pointer' : 'cursor-default'}`}\n >\n <span\n className={`w-5 h-5 rounded-full text-2xs font-semibold flex items-center justify-center shrink-0 transition-colors ${\n active\n ? 'bg-accent text-text-inverse'\n : done\n ? 'bg-accent-muted text-accent'\n : 'bg-surface-sunken text-text-tertiary'\n } ${clickable && !active ? 'hover:bg-accent-muted hover:text-accent' : ''}`}\n >\n {i + 1}\n </span>\n <span\n className={`text-2xs font-semibold uppercase tracking-wider whitespace-nowrap transition-colors ${\n active ? 'text-text-primary' : 'text-text-tertiary'\n } ${clickable && !active ? 'hover:text-text-primary' : ''}`}\n >\n {label}\n </span>\n </button>\n </div>\n );\n })}\n </div>\n );\n}\n","import type { McpServerRecord, McpToolManifest } from '../../../../api/types';\n\nexport interface ServerFormState {\n name: string;\n description: string;\n mode: 'in-process' | 'network' | 'local-process';\n transport_type: 'stdio' | 'sse' | 'streamable-http';\n // stdio fields\n command: string;\n args: string;\n env_vars: string;\n // network fields\n url: string;\n headers: string;\n // shared\n auto_connect: boolean;\n tags: string[];\n compile_hints: string;\n credential_providers: string[];\n discovered_tools: McpToolManifest[] | null;\n}\n\nexport const EMPTY_FORM: ServerFormState = {\n name: '',\n description: '',\n mode: 'network',\n transport_type: 'sse',\n command: '',\n args: '',\n env_vars: '{}',\n url: '',\n headers: '{}',\n auto_connect: false,\n tags: [],\n compile_hints: '',\n credential_providers: [],\n discovered_tools: null,\n};\n\nexport function serverToForm(s: McpServerRecord): ServerFormState {\n const config = s.transport_config ?? {};\n const isBuiltin = !!(config as any).builtin;\n\n let mode: ServerFormState['mode'] = 'network';\n if (isBuiltin) mode = 'in-process';\n else if (s.transport_type === 'stdio') mode = 'local-process';\n\n return {\n name: s.name,\n description: s.description ?? '',\n mode,\n transport_type: s.transport_type,\n command: (config as any).command ?? '',\n args: ((config as any).args ?? []).join(', '),\n env_vars: (config as any).env ? JSON.stringify((config as any).env, null, 2) : '{}',\n url: (config as any).url ?? '',\n headers: (config as any).headers ? JSON.stringify((config as any).headers, null, 2) : '{}',\n auto_connect: s.auto_connect,\n tags: s.tags ?? [],\n compile_hints: (s as any).compile_hints ?? '',\n credential_providers: s.credential_providers ?? [],\n discovered_tools: s.tool_manifest ?? null,\n };\n}\n\nexport function formToPayload(form: ServerFormState) {\n let transport_config: Record<string, unknown> = {};\n\n if (form.mode === 'local-process') {\n transport_config = {\n command: form.command.trim(),\n args: form.args.split(',').map((a) => a.trim()).filter(Boolean),\n env: form.env_vars.trim() ? JSON.parse(form.env_vars) : undefined,\n };\n } else if (form.mode === 'network') {\n const headers = form.headers.trim() ? JSON.parse(form.headers) : {};\n transport_config = { url: form.url.trim(), ...(Object.keys(headers).length ? { headers } : {}) };\n }\n // in-process: transport_config stays empty (server manages it)\n\n return {\n name: form.name.trim(),\n description: form.description.trim() || undefined,\n transport_type: form.mode === 'local-process' ? 'stdio' as const : form.transport_type,\n transport_config,\n auto_connect: form.auto_connect,\n tags: form.tags,\n compile_hints: form.compile_hints.trim() || undefined,\n credential_providers: form.credential_providers.length > 0 ? form.credential_providers : undefined,\n };\n}\n\nexport const STEP_LABELS = ['Transport', 'Discovery', 'Test', 'Review'];\n\nexport function isStepValid(step: number, form: ServerFormState): boolean {\n if (step === 1) {\n if (!form.name.trim()) return false;\n if (form.mode === 'network' && !form.url.trim()) return false;\n if (form.mode === 'local-process' && !form.command.trim()) return false;\n return true;\n }\n return true;\n}\n\nexport const labelCls = 'label';\nexport const hintCls = 'hint';\n","import { useState } from 'react';\nimport { Check, Copy, Eye, EyeOff } from 'lucide-react';\n\nconst MASK = '••••••••';\n\n/** True when the JSON text holds at least one value worth masking. */\nexport function hasSecretValues(text: string): boolean {\n const trimmed = text.trim();\n if (!trimmed) return false;\n try {\n const parsed = JSON.parse(trimmed);\n return !!parsed && typeof parsed === 'object' && Object.keys(parsed).length > 0;\n } catch {\n return true;\n }\n}\n\n/** The JSON text with every value replaced by a mask; keys stay readable. */\nexport function maskJsonValues(text: string): string {\n try {\n const parsed = JSON.parse(text);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return MASK;\n const masked = Object.fromEntries(Object.keys(parsed).map((k) => [k, MASK]));\n return JSON.stringify(masked, null, 2);\n } catch {\n return MASK;\n }\n}\n\ninterface Props {\n label: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n hint?: string;\n rows?: number;\n}\n\n/**\n * A JSON object of secrets (headers, env vars). Saved values are masked until\n * the user shows them; an empty field starts editable.\n */\nexport function SecretJsonField({ label, value, onChange, placeholder, hint, rows = 3 }: Props) {\n const [revealed, setRevealed] = useState<boolean | null>(null);\n const [copied, setCopied] = useState(false);\n const shown = revealed ?? !hasSecretValues(value);\n\n const copy = () => {\n navigator.clipboard.writeText(value);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n return (\n <div>\n <div className=\"flex items-center justify-between\">\n <label className=\"label\">{label}</label>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => setRevealed(!shown)}\n className=\"flex items-center gap-1 text-2xs text-text-tertiary hover:text-text-primary\"\n aria-pressed={shown}\n >\n {shown ? <EyeOff className=\"w-3.5 h-3.5\" /> : <Eye className=\"w-3.5 h-3.5\" />}\n {shown ? 'Hide' : 'Show'}\n </button>\n <button\n type=\"button\"\n onClick={copy}\n disabled={!value.trim()}\n className=\"flex items-center gap-1 text-2xs text-text-tertiary hover:text-text-primary disabled:opacity-40\"\n title=\"Copy to clipboard\"\n >\n {copied ? <Check className=\"w-3.5 h-3.5 text-status-success\" /> : <Copy className=\"w-3.5 h-3.5\" />}\n Copy\n </button>\n </div>\n </div>\n <textarea\n aria-label={label}\n value={shown ? value : maskJsonValues(value)}\n onChange={(e) => {\n setRevealed(true);\n onChange(e.target.value);\n }}\n readOnly={!shown}\n placeholder={placeholder}\n className=\"input-json w-full\"\n rows={rows}\n spellCheck={false}\n autoComplete=\"off\"\n />\n {hint && <p className=\"hint\">{hint}</p>}\n </div>\n );\n}\n","import type { ServerFormState } from './server-form-types';\nimport { labelCls, hintCls } from './server-form-types';\nimport { SecretJsonField } from '../../../../components/common/form/SecretJsonField';\n\ninterface Props {\n form: ServerFormState;\n set: (field: keyof ServerFormState, value: any) => void;\n isBuiltin: boolean;\n}\n\nconst modes = [\n { value: 'in-process', label: 'In-Process', hint: 'Built-in server running inside the app' },\n { value: 'network', label: 'Network Service', hint: 'Remote server via SSE or Streamable HTTP' },\n { value: 'local-process', label: 'Local Process', hint: 'Spawn a local command via stdio' },\n] as const;\n\nexport function TransportStep({ form, set, isBuiltin }: Props) {\n return (\n <div className=\"space-y-5\">\n {/* Mode selector */}\n <div>\n <label className={labelCls}>Connection Mode</label>\n <div className=\"grid grid-cols-3 gap-3 mt-1\">\n {modes.map((m) => {\n const active = form.mode === m.value;\n const disabled = isBuiltin && m.value !== 'in-process';\n return (\n <button\n key={m.value}\n type=\"button\"\n disabled={disabled}\n onClick={() => {\n set('mode', m.value);\n if (m.value === 'local-process') set('transport_type', 'stdio');\n if (m.value === 'network') set('transport_type', 'sse');\n }}\n className={`text-left p-3 rounded-md border transition-colors ${\n active\n ? 'border-accent bg-accent/5'\n : disabled\n ? 'border-surface-border bg-surface-sunken opacity-50 cursor-not-allowed'\n : 'border-surface-border hover:border-text-tertiary cursor-pointer'\n }`}\n >\n <span className={`text-xs font-medium ${active ? 'text-accent' : 'text-text-primary'}`}>\n {m.label}\n </span>\n <span className=\"block text-2xs text-text-tertiary mt-0.5\">{m.hint}</span>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Name + Description (always shown) */}\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className={labelCls}>Name</label>\n <input\n type=\"text\"\n value={form.name}\n onChange={(e) => set('name', e.target.value)}\n placeholder=\"e.g., vision-server\"\n className=\"input text-xs w-full\"\n disabled={isBuiltin}\n />\n </div>\n <div>\n <label className={labelCls}>Description</label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"Optional description\"\n className=\"input text-xs w-full\"\n />\n </div>\n </div>\n\n {/* In-Process: read-only info */}\n {form.mode === 'in-process' && (\n <div>\n <p className={hintCls}>\n This server runs in-process via InMemoryTransport. Transport is managed automatically — no configuration needed.\n </p>\n </div>\n )}\n\n {/* Network: URL + transport toggle */}\n {form.mode === 'network' && (\n <>\n <div>\n <label className={labelCls}>Server URL</label>\n <input\n type=\"text\"\n value={form.url}\n onChange={(e) => set('url', e.target.value)}\n placeholder=\"https://mcp-server.example.com/sse\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className={labelCls}>Transport Protocol</label>\n <div className=\"flex gap-2 mt-1\">\n {(['sse', 'streamable-http'] as const).map((t) => (\n <button\n key={t}\n type=\"button\"\n onClick={() => set('transport_type', t)}\n className={`px-3 py-1.5 text-xs rounded-md border transition-colors ${\n form.transport_type === t\n ? 'border-accent bg-accent/5 text-accent font-medium'\n : 'border-surface-border text-text-secondary hover:border-text-tertiary'\n }`}\n >\n {t === 'sse' ? 'SSE' : 'Streamable HTTP'}\n </button>\n ))}\n </div>\n </div>\n <SecretJsonField\n label=\"Headers (JSON)\"\n value={form.headers}\n onChange={(v) => set('headers', v)}\n placeholder={'{ \"Authorization\": \"Bearer <service-account key>\" }'}\n hint=\"Sent with every request. Another Long Tail instance's /mcp takes a service-account key here.\"\n />\n </>\n )}\n\n {/* Local Process: command + args + env */}\n {form.mode === 'local-process' && (\n <>\n <div>\n <label className={labelCls}>Command</label>\n <input\n type=\"text\"\n value={form.command}\n onChange={(e) => set('command', e.target.value)}\n placeholder=\"e.g., npx\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className={labelCls}>Arguments (comma-separated)</label>\n <input\n type=\"text\"\n value={form.args}\n onChange={(e) => set('args', e.target.value)}\n placeholder=\"e.g., -y, @modelcontextprotocol/server-filesystem, /tmp\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <SecretJsonField\n label=\"Environment Variables (JSON)\"\n value={form.env_vars}\n onChange={(v) => set('env_vars', v)}\n />\n </>\n )}\n\n {/* Auto-connect */}\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={form.auto_connect}\n onChange={(e) => set('auto_connect', e.target.checked)}\n className=\"w-4 h-4 rounded border-border accent-accent\"\n />\n <span className=\"text-xs text-text-primary\">Auto-connect on startup</span>\n </label>\n </div>\n );\n}\n","import { useState, type KeyboardEvent } from 'react';\nimport { X } from 'lucide-react';\nimport { TagInput } from '../../../../components/common/form/TagInput';\nimport type { ServerFormState } from './server-form-types';\nimport { labelCls, hintCls } from './server-form-types';\n\ninterface Props {\n form: ServerFormState;\n set: (field: keyof ServerFormState, value: any) => void;\n}\n\nexport function DiscoveryStep({ form, set }: Props) {\n const [cpInput, setCpInput] = useState('');\n\n const addProvider = (raw: string) => {\n const v = raw.trim().toLowerCase();\n if (v && !form.credential_providers.includes(v)) {\n set('credential_providers', [...form.credential_providers, v]);\n }\n setCpInput('');\n };\n\n const removeProvider = (p: string) => {\n set('credential_providers', form.credential_providers.filter((x) => x !== p));\n };\n\n const handleCpKey = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault();\n addProvider(cpInput);\n } else if (e.key === 'Backspace' && !cpInput && form.credential_providers.length > 0) {\n removeProvider(form.credential_providers[form.credential_providers.length - 1]);\n }\n };\n\n return (\n <div className=\"space-y-5\">\n {/* Tags */}\n <div>\n <label className={labelCls}>Tags</label>\n <TagInput\n tags={form.tags}\n onChange={(tags) => set('tags', tags)}\n placeholder=\"Add tag (e.g., database, analytics)...\"\n />\n <p className={hintCls}>\n Tags enable tool discovery. Workflows filter available MCP servers by tags to find relevant tools.\n </p>\n </div>\n\n {/* Compile Hints */}\n <div>\n <label className={labelCls}>Compile Hints</label>\n <textarea\n value={form.compile_hints}\n onChange={(e) => set('compile_hints', e.target.value)}\n placeholder=\"Guidance for the workflow compiler when generating YAML from this server's tools...\"\n className=\"input text-xs w-full leading-relaxed\"\n rows={4}\n spellCheck={false}\n />\n <p className={hintCls}>\n Free-form text that guides the workflow compiler. Describe how tools should be composed, sequenced, or parameterized.\n </p>\n </div>\n\n {/* Credential Providers */}\n <div>\n <label className={labelCls}>Credential Providers</label>\n <div className=\"flex flex-wrap items-center gap-1.5 bg-surface-sunken border border-surface-border rounded-md px-2 py-1.5 focus-within:ring-1 focus-within:ring-accent-primary\">\n {form.credential_providers.map((p) => (\n <span\n key={p}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full bg-accent/10 text-accent text-2xs font-medium\"\n >\n {p}\n <button\n type=\"button\"\n onClick={() => removeProvider(p)}\n className=\"hover:text-status-error transition-colors\"\n >\n <X className=\"w-2.5 h-2.5\" />\n </button>\n </span>\n ))}\n <input\n type=\"text\"\n value={cpInput}\n onChange={(e) => setCpInput(e.target.value)}\n onKeyDown={handleCpKey}\n onBlur={() => { if (cpInput.trim()) addProvider(cpInput); }}\n placeholder={form.credential_providers.length === 0 ? 'Add provider (e.g., github, slack)...' : ''}\n className=\"flex-1 min-w-[80px] bg-transparent text-xs text-text-primary outline-none placeholder:text-text-tertiary\"\n />\n </div>\n <p className={hintCls}>\n IAM credential providers required by this server's tools. Users will be prompted to connect these before tool execution.\n </p>\n </div>\n </div>\n );\n}\n","import { CheckCircle2, XCircle, Loader2 } from 'lucide-react';\nimport { useTestConnection } from '../../../../api/mcp';\nimport type { ServerFormState } from './server-form-types';\nimport { formToPayload } from './server-form-types';\nimport { hintCls } from './server-form-types';\n\ninterface Props {\n form: ServerFormState;\n set: (field: keyof ServerFormState, value: any) => void;\n}\n\nexport function TestStep({ form, set }: Props) {\n const test = useTestConnection();\n const isInProcess = form.mode === 'in-process';\n\n const handleTest = () => {\n const payload = formToPayload(form);\n test.mutate(\n { transport_type: payload.transport_type, transport_config: payload.transport_config },\n {\n onSuccess: (result) => {\n if (result.success) {\n set('discovered_tools', result.tools);\n }\n },\n },\n );\n };\n\n const result = test.data;\n const tools = form.discovered_tools ?? result?.tools ?? [];\n\n return (\n <div className=\"space-y-5\">\n {isInProcess ? (\n <div>\n <p className=\"text-sm text-text-secondary\">\n In-process servers connect lazily on first tool call. No connection test needed.\n </p>\n {form.discovered_tools && form.discovered_tools.length > 0 && (\n <div className=\"mt-4\">\n <p className=\"text-xs text-text-tertiary mb-2\">\n {form.discovered_tools.length} tool{form.discovered_tools.length !== 1 ? 's' : ''} cached from last connection\n </p>\n <ToolList tools={form.discovered_tools} />\n </div>\n )}\n </div>\n ) : (\n <>\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={handleTest}\n disabled={test.isPending}\n className=\"btn-primary text-xs\"\n >\n {test.isPending ? (\n <span className=\"flex items-center gap-1.5\">\n <Loader2 className=\"w-3 h-3 animate-spin\" />\n Connecting...\n </span>\n ) : (\n 'Test Connection'\n )}\n </button>\n {result?.success && (\n <span className=\"flex items-center gap-1 text-xs text-status-success\">\n <CheckCircle2 className=\"w-3.5 h-3.5\" />\n Connected — {tools.length} tool{tools.length !== 1 ? 's' : ''} discovered\n </span>\n )}\n {result && !result.success && (\n <span className=\"flex items-center gap-1 text-xs text-status-error\">\n <XCircle className=\"w-3.5 h-3.5\" />\n {result.error || 'Connection failed'}\n </span>\n )}\n </div>\n\n {tools.length > 0 && (\n <div>\n <p className=\"text-xs text-text-tertiary mb-2\">Discovered tools</p>\n <ToolList tools={tools} />\n </div>\n )}\n\n <p className={hintCls}>\n Tests connectivity by connecting to the server and listing available tools. The server must be reachable from this machine.\n </p>\n </>\n )}\n </div>\n );\n}\n\nfunction ToolList({ tools }: { tools: { name: string; description?: string }[] }) {\n return (\n <div className=\"max-h-[280px] overflow-y-auto border border-surface-border rounded-md divide-y divide-surface-border\">\n {tools.map((t) => (\n <div key={t.name} className=\"px-3 py-2\">\n <span className=\"text-xs font-medium text-text-primary font-mono\">{t.name}</span>\n {t.description && (\n <span className=\"block text-2xs text-text-tertiary mt-0.5 line-clamp-2\">{t.description}</span>\n )}\n </div>\n ))}\n </div>\n );\n}\n","import type { ServerFormState } from './server-form-types';\nimport { labelCls } from './server-form-types';\n\ninterface Props {\n form: ServerFormState;\n}\n\nconst modeLabels: Record<string, string> = {\n 'in-process': 'In-Process',\n 'network': 'Network Service',\n 'local-process': 'Local Process',\n};\n\nconst transportLabels: Record<string, string> = {\n stdio: 'stdio',\n sse: 'SSE',\n 'streamable-http': 'Streamable HTTP',\n};\n\nexport function ReviewStep({ form }: Props) {\n const tools = form.discovered_tools ?? [];\n\n return (\n <div className=\"space-y-4\">\n <Row label=\"Name\" value={form.name} />\n {form.description && <Row label=\"Description\" value={form.description} />}\n <Row label=\"Mode\" value={modeLabels[form.mode] ?? form.mode} />\n\n {form.mode === 'network' && (\n <>\n <Row label=\"Transport\" value={transportLabels[form.transport_type] ?? form.transport_type} />\n <Row label=\"URL\" value={form.url} mono />\n </>\n )}\n {form.mode === 'local-process' && (\n <>\n <Row label=\"Command\" value={form.command} mono />\n {form.args && <Row label=\"Args\" value={form.args} mono />}\n </>\n )}\n\n <Row label=\"Auto-connect\" value={form.auto_connect ? 'Yes' : 'No'} />\n\n {form.tags.length > 0 && (\n <div>\n <label className={labelCls}>Tags</label>\n <div className=\"flex flex-wrap gap-1.5 mt-1\">\n {form.tags.map((t) => (\n <span key={t} className=\"px-2 py-0.5 rounded-full bg-accent/10 text-accent text-2xs font-medium\">\n {t}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {form.credential_providers.length > 0 && (\n <div>\n <label className={labelCls}>Credential Providers</label>\n <div className=\"flex flex-wrap gap-1.5 mt-1\">\n {form.credential_providers.map((p) => (\n <span key={p} className=\"px-2 py-0.5 rounded-full bg-accent/10 text-accent text-2xs font-medium\">\n {p}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {form.compile_hints && <Row label=\"Compile Hints\" value={form.compile_hints} />}\n\n {tools.length > 0 && (\n <Row label=\"Discovered Tools\" value={`${tools.length} tool${tools.length !== 1 ? 's' : ''}`} />\n )}\n </div>\n );\n}\n\nfunction Row({ label, value, mono }: { label: string; value: string; mono?: boolean }) {\n return (\n <div>\n <label className={labelCls}>{label}</label>\n <p className={`text-xs text-text-primary mt-0.5 ${mono ? 'font-mono' : ''}`}>{value}</p>\n </div>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useParams, useNavigate, useSearchParams } from 'react-router-dom';\nimport { useMcpServer, useCreateMcpServer, useUpdateMcpServer } from '../../../../api/mcp';\nimport { StepIndicator } from '../../../../components/common/layout/StepIndicator';\nimport { PageHeader } from '../../../../components/common/layout/PageHeader';\nimport {\n EMPTY_FORM,\n serverToForm,\n formToPayload,\n STEP_LABELS,\n isStepValid,\n} from './server-form-types';\nimport type { ServerFormState } from './server-form-types';\nimport { TransportStep } from './TransportStep';\nimport { DiscoveryStep } from './DiscoveryStep';\nimport { TestStep } from './TestStep';\nimport { ReviewStep } from './ReviewStep';\n\nexport function McpServerDetailPage() {\n const { serverId } = useParams<{ serverId: string }>();\n const isNew = !serverId;\n const navigate = useNavigate();\n const { data: existing, isLoading } = useMcpServer(serverId ?? '');\n const createServer = useCreateMcpServer();\n const updateServer = useUpdateMcpServer();\n\n const [form, setForm] = useState<ServerFormState>(EMPTY_FORM);\n const [initialized, setInitialized] = useState(false);\n const [saveError, setSaveError] = useState('');\n\n // Step via URL search param\n const [searchParams, setSearchParams] = useSearchParams();\n const step = parseInt(searchParams.get('step') || '1', 10);\n const setStep = useCallback((s: number) => {\n setSearchParams((prev) => {\n const next = new URLSearchParams(prev);\n next.set('step', String(s));\n return next;\n }, { replace: false });\n }, [setSearchParams]);\n\n // Initialize form from existing record\n useEffect(() => {\n if (initialized) return;\n if (isNew) {\n setForm(EMPTY_FORM);\n setInitialized(true);\n return;\n }\n if (existing) {\n setForm(serverToForm(existing));\n setInitialized(true);\n }\n }, [existing, isNew, initialized]);\n\n const set = (field: keyof ServerFormState, value: any) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n const isBuiltin = !!(existing?.transport_config as any)?.builtin;\n\n // Save\n const handleSave = () => {\n setSaveError('');\n const payload = formToPayload(form);\n\n if (existing) {\n updateServer.mutate(\n { id: existing.id, ...payload },\n { onSuccess: () => navigate('/mcp/servers') },\n );\n } else {\n createServer.mutate(payload, {\n onSuccess: () => navigate('/mcp/servers'),\n onError: (err) => setSaveError(err.message),\n });\n }\n };\n\n if (!isNew && isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-48\" />\n <div className=\"h-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (!isNew && !existing && !isLoading) {\n return <p className=\"text-sm text-text-secondary\">Server not found.</p>;\n }\n\n const isLast = step === STEP_LABELS.length;\n const isPending = createServer.isPending || updateServer.isPending;\n const error = saveError || (createServer.error as Error | null)?.message || (updateServer.error as Error | null)?.message;\n\n return (\n <div>\n <PageHeader title={isNew ? 'Register MCP Server' : existing?.name ?? ''} />\n\n <div className=\"max-w-3xl\">\n <StepIndicator steps={STEP_LABELS} currentStep={step - 1} onStepClick={(i) => setStep(i + 1)} />\n\n <div className=\"min-h-[360px] py-2\">\n {step === 1 && <TransportStep form={form} set={set} isBuiltin={isBuiltin} />}\n {step === 2 && <DiscoveryStep form={form} set={set} />}\n {step === 3 && <TestStep form={form} set={set} />}\n {step === 4 && <ReviewStep form={form} />}\n </div>\n\n {error && (\n <p className=\"text-xs text-status-error mt-4\">{error}</p>\n )}\n\n {/* Navigation */}\n <div className=\"flex justify-between items-center pt-4 border-t border-surface-border mt-4\">\n <div>\n {step > 1 && (\n <button onClick={() => setStep(step - 1)} className=\"btn-secondary text-xs\">\n Back\n </button>\n )}\n </div>\n <div className=\"flex gap-3\">\n <button onClick={() => navigate('/mcp/servers')} className=\"btn-ghost text-xs\">\n Cancel\n </button>\n {isLast ? (\n <button\n onClick={handleSave}\n disabled={!isStepValid(step, form) || isPending}\n className=\"btn-primary text-xs\"\n >\n {isPending ? 'Saving...' : existing ? 'Save' : 'Register'}\n </button>\n ) : (\n <button\n onClick={() => setStep(step + 1)}\n disabled={!isStepValid(step, form)}\n className=\"btn-primary text-xs\"\n >\n Next\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"names":["StepIndicator","steps","currentStep","onStepClick","jsx","label","i","done","active","clickable","jsxs","EMPTY_FORM","serverToForm","config","isBuiltin","mode","formToPayload","form","transport_config","a","headers","STEP_LABELS","isStepValid","step","labelCls","hintCls","MASK","hasSecretValues","text","trimmed","parsed","maskJsonValues","masked","k","SecretJsonField","value","onChange","placeholder","hint","rows","revealed","setRevealed","useState","copied","setCopied","shown","copy","EyeOff","Eye","Check","Copy","e","modes","TransportStep","set","m","disabled","Fragment","t","v","DiscoveryStep","cpInput","setCpInput","addProvider","raw","removeProvider","p","x","handleCpKey","TagInput","tags","X","TestStep","test","useTestConnection","isInProcess","handleTest","payload","result","tools","ToolList","Loader2","CheckCircle2","XCircle","modeLabels","transportLabels","ReviewStep","Row","mono","McpServerDetailPage","serverId","useParams","isNew","navigate","useNavigate","existing","isLoading","useMcpServer","createServer","useCreateMcpServer","updateServer","useUpdateMcpServer","setForm","initialized","setInitialized","saveError","setSaveError","searchParams","setSearchParams","useSearchParams","setStep","useCallback","s","prev","next","useEffect","field","f","_a","handleSave","err","isLast","isPending","error","_b","_c","PageHeader"],"mappings":"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"}
1
+ {"version":3,"file":"index-D-vNL8Hm.js","sources":["../../src/components/common/layout/StepIndicator.tsx","../../src/pages/mcp/servers/detail/server-form-types.ts","../../src/components/common/form/SecretJsonField.tsx","../../src/pages/mcp/servers/detail/TransportStep.tsx","../../src/pages/mcp/servers/detail/DiscoveryStep.tsx","../../src/pages/mcp/servers/detail/TestStep.tsx","../../src/pages/mcp/servers/detail/ReviewStep.tsx","../../src/pages/mcp/servers/detail/McpServerDetailPage.tsx"],"sourcesContent":["interface StepIndicatorProps {\n steps: string[];\n currentStep: number;\n onStepClick?: (step: number) => void;\n}\n\nexport function StepIndicator({ steps, currentStep, onStepClick }: StepIndicatorProps) {\n return (\n <div className=\"flex items-center justify-center gap-1 pb-4 border-b border-surface-border mb-4\">\n {steps.map((label, i) => {\n const done = i < currentStep;\n const active = i === currentStep;\n const clickable = !!onStepClick;\n return (\n <div key={label} className=\"flex items-center gap-1\">\n {i > 0 && (\n <div className={`w-4 h-px ${done ? 'bg-accent' : 'bg-surface-border'}`} />\n )}\n <button\n type=\"button\"\n onClick={clickable ? () => onStepClick(i) : undefined}\n className={`flex items-center gap-1 ${clickable ? 'cursor-pointer' : 'cursor-default'}`}\n >\n <span\n className={`w-5 h-5 rounded-full text-2xs font-semibold flex items-center justify-center shrink-0 transition-colors ${\n active\n ? 'bg-accent text-text-inverse'\n : done\n ? 'bg-accent-muted text-accent'\n : 'bg-surface-sunken text-text-tertiary'\n } ${clickable && !active ? 'hover:bg-accent-muted hover:text-accent' : ''}`}\n >\n {i + 1}\n </span>\n <span\n className={`text-2xs font-semibold uppercase tracking-wider whitespace-nowrap transition-colors ${\n active ? 'text-text-primary' : 'text-text-tertiary'\n } ${clickable && !active ? 'hover:text-text-primary' : ''}`}\n >\n {label}\n </span>\n </button>\n </div>\n );\n })}\n </div>\n );\n}\n","import type { McpServerRecord, McpToolManifest } from '../../../../api/types';\n\nexport interface ServerFormState {\n name: string;\n description: string;\n mode: 'in-process' | 'network' | 'local-process';\n transport_type: 'stdio' | 'sse' | 'streamable-http';\n // stdio fields\n command: string;\n args: string;\n env_vars: string;\n // network fields\n url: string;\n headers: string;\n // shared\n auto_connect: boolean;\n tags: string[];\n compile_hints: string;\n credential_providers: string[];\n discovered_tools: McpToolManifest[] | null;\n}\n\nexport const EMPTY_FORM: ServerFormState = {\n name: '',\n description: '',\n mode: 'network',\n transport_type: 'sse',\n command: '',\n args: '',\n env_vars: '{}',\n url: '',\n headers: '{}',\n auto_connect: false,\n tags: [],\n compile_hints: '',\n credential_providers: [],\n discovered_tools: null,\n};\n\nexport function serverToForm(s: McpServerRecord): ServerFormState {\n const config = s.transport_config ?? {};\n const isBuiltin = !!(config as any).builtin;\n\n let mode: ServerFormState['mode'] = 'network';\n if (isBuiltin) mode = 'in-process';\n else if (s.transport_type === 'stdio') mode = 'local-process';\n\n return {\n name: s.name,\n description: s.description ?? '',\n mode,\n transport_type: s.transport_type,\n command: (config as any).command ?? '',\n args: ((config as any).args ?? []).join(', '),\n env_vars: (config as any).env ? JSON.stringify((config as any).env, null, 2) : '{}',\n url: (config as any).url ?? '',\n headers: (config as any).headers ? JSON.stringify((config as any).headers, null, 2) : '{}',\n auto_connect: s.auto_connect,\n tags: s.tags ?? [],\n compile_hints: (s as any).compile_hints ?? '',\n credential_providers: s.credential_providers ?? [],\n discovered_tools: s.tool_manifest ?? null,\n };\n}\n\nexport function formToPayload(form: ServerFormState) {\n let transport_config: Record<string, unknown> = {};\n\n if (form.mode === 'local-process') {\n transport_config = {\n command: form.command.trim(),\n args: form.args.split(',').map((a) => a.trim()).filter(Boolean),\n env: form.env_vars.trim() ? JSON.parse(form.env_vars) : undefined,\n };\n } else if (form.mode === 'network') {\n const headers = form.headers.trim() ? JSON.parse(form.headers) : {};\n transport_config = { url: form.url.trim(), ...(Object.keys(headers).length ? { headers } : {}) };\n }\n // in-process: transport_config stays empty (server manages it)\n\n return {\n name: form.name.trim(),\n description: form.description.trim() || undefined,\n transport_type: form.mode === 'local-process' ? 'stdio' as const : form.transport_type,\n transport_config,\n auto_connect: form.auto_connect,\n tags: form.tags,\n compile_hints: form.compile_hints.trim() || undefined,\n credential_providers: form.credential_providers.length > 0 ? form.credential_providers : undefined,\n };\n}\n\nexport const STEP_LABELS = ['Transport', 'Discovery', 'Test', 'Review'];\n\nexport function isStepValid(step: number, form: ServerFormState): boolean {\n if (step === 1) {\n if (!form.name.trim()) return false;\n if (form.mode === 'network' && !form.url.trim()) return false;\n if (form.mode === 'local-process' && !form.command.trim()) return false;\n return true;\n }\n return true;\n}\n\nexport const labelCls = 'label';\nexport const hintCls = 'hint';\n","import { useState } from 'react';\nimport { Check, Copy, Eye, EyeOff } from 'lucide-react';\n\nconst MASK = '••••••••';\n\n/** True when the JSON text holds at least one value worth masking. */\nexport function hasSecretValues(text: string): boolean {\n const trimmed = text.trim();\n if (!trimmed) return false;\n try {\n const parsed = JSON.parse(trimmed);\n return !!parsed && typeof parsed === 'object' && Object.keys(parsed).length > 0;\n } catch {\n return true;\n }\n}\n\n/** The JSON text with every value replaced by a mask; keys stay readable. */\nexport function maskJsonValues(text: string): string {\n try {\n const parsed = JSON.parse(text);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return MASK;\n const masked = Object.fromEntries(Object.keys(parsed).map((k) => [k, MASK]));\n return JSON.stringify(masked, null, 2);\n } catch {\n return MASK;\n }\n}\n\ninterface Props {\n label: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n hint?: string;\n rows?: number;\n}\n\n/**\n * A JSON object of secrets (headers, env vars). Saved values are masked until\n * the user shows them; an empty field starts editable.\n */\nexport function SecretJsonField({ label, value, onChange, placeholder, hint, rows = 3 }: Props) {\n const [revealed, setRevealed] = useState<boolean | null>(null);\n const [copied, setCopied] = useState(false);\n const shown = revealed ?? !hasSecretValues(value);\n\n const copy = () => {\n navigator.clipboard.writeText(value);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n return (\n <div>\n <div className=\"flex items-center justify-between\">\n <label className=\"label\">{label}</label>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => setRevealed(!shown)}\n className=\"flex items-center gap-1 text-2xs text-text-tertiary hover:text-text-primary\"\n aria-pressed={shown}\n >\n {shown ? <EyeOff className=\"w-3.5 h-3.5\" /> : <Eye className=\"w-3.5 h-3.5\" />}\n {shown ? 'Hide' : 'Show'}\n </button>\n <button\n type=\"button\"\n onClick={copy}\n disabled={!value.trim()}\n className=\"flex items-center gap-1 text-2xs text-text-tertiary hover:text-text-primary disabled:opacity-40\"\n title=\"Copy to clipboard\"\n >\n {copied ? <Check className=\"w-3.5 h-3.5 text-status-success\" /> : <Copy className=\"w-3.5 h-3.5\" />}\n Copy\n </button>\n </div>\n </div>\n <textarea\n aria-label={label}\n value={shown ? value : maskJsonValues(value)}\n onChange={(e) => {\n setRevealed(true);\n onChange(e.target.value);\n }}\n readOnly={!shown}\n placeholder={placeholder}\n className=\"input-json w-full\"\n rows={rows}\n spellCheck={false}\n autoComplete=\"off\"\n />\n {hint && <p className=\"hint\">{hint}</p>}\n </div>\n );\n}\n","import type { ServerFormState } from './server-form-types';\nimport { labelCls, hintCls } from './server-form-types';\nimport { SecretJsonField } from '../../../../components/common/form/SecretJsonField';\n\ninterface Props {\n form: ServerFormState;\n set: (field: keyof ServerFormState, value: any) => void;\n isBuiltin: boolean;\n}\n\nconst modes = [\n { value: 'in-process', label: 'In-Process', hint: 'Built-in server running inside the app' },\n { value: 'network', label: 'Network Service', hint: 'Remote server via SSE or Streamable HTTP' },\n { value: 'local-process', label: 'Local Process', hint: 'Spawn a local command via stdio' },\n] as const;\n\nexport function TransportStep({ form, set, isBuiltin }: Props) {\n return (\n <div className=\"space-y-5\">\n {/* Mode selector */}\n <div>\n <label className={labelCls}>Connection Mode</label>\n <div className=\"grid grid-cols-3 gap-3 mt-1\">\n {modes.map((m) => {\n const active = form.mode === m.value;\n const disabled = isBuiltin && m.value !== 'in-process';\n return (\n <button\n key={m.value}\n type=\"button\"\n disabled={disabled}\n onClick={() => {\n set('mode', m.value);\n if (m.value === 'local-process') set('transport_type', 'stdio');\n if (m.value === 'network') set('transport_type', 'sse');\n }}\n className={`text-left p-3 rounded-md border transition-colors ${\n active\n ? 'border-accent bg-accent/5'\n : disabled\n ? 'border-surface-border bg-surface-sunken opacity-50 cursor-not-allowed'\n : 'border-surface-border hover:border-text-tertiary cursor-pointer'\n }`}\n >\n <span className={`text-xs font-medium ${active ? 'text-accent' : 'text-text-primary'}`}>\n {m.label}\n </span>\n <span className=\"block text-2xs text-text-tertiary mt-0.5\">{m.hint}</span>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Name + Description (always shown) */}\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className={labelCls}>Name</label>\n <input\n type=\"text\"\n value={form.name}\n onChange={(e) => set('name', e.target.value)}\n placeholder=\"e.g., vision-server\"\n className=\"input text-xs w-full\"\n disabled={isBuiltin}\n />\n </div>\n <div>\n <label className={labelCls}>Description</label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"Optional description\"\n className=\"input text-xs w-full\"\n />\n </div>\n </div>\n\n {/* In-Process: read-only info */}\n {form.mode === 'in-process' && (\n <div>\n <p className={hintCls}>\n This server runs in-process via InMemoryTransport. Transport is managed automatically — no configuration needed.\n </p>\n </div>\n )}\n\n {/* Network: URL + transport toggle */}\n {form.mode === 'network' && (\n <>\n <div>\n <label className={labelCls}>Server URL</label>\n <input\n type=\"text\"\n value={form.url}\n onChange={(e) => set('url', e.target.value)}\n placeholder=\"https://mcp-server.example.com/sse\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className={labelCls}>Transport Protocol</label>\n <div className=\"flex gap-2 mt-1\">\n {(['sse', 'streamable-http'] as const).map((t) => (\n <button\n key={t}\n type=\"button\"\n onClick={() => set('transport_type', t)}\n className={`px-3 py-1.5 text-xs rounded-md border transition-colors ${\n form.transport_type === t\n ? 'border-accent bg-accent/5 text-accent font-medium'\n : 'border-surface-border text-text-secondary hover:border-text-tertiary'\n }`}\n >\n {t === 'sse' ? 'SSE' : 'Streamable HTTP'}\n </button>\n ))}\n </div>\n </div>\n <SecretJsonField\n label=\"Headers (JSON)\"\n value={form.headers}\n onChange={(v) => set('headers', v)}\n placeholder={'{ \"Authorization\": \"Bearer <service-account key>\" }'}\n hint=\"Sent with every request. Another Long Tail instance's /mcp takes a service-account key here.\"\n />\n </>\n )}\n\n {/* Local Process: command + args + env */}\n {form.mode === 'local-process' && (\n <>\n <div>\n <label className={labelCls}>Command</label>\n <input\n type=\"text\"\n value={form.command}\n onChange={(e) => set('command', e.target.value)}\n placeholder=\"e.g., npx\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className={labelCls}>Arguments (comma-separated)</label>\n <input\n type=\"text\"\n value={form.args}\n onChange={(e) => set('args', e.target.value)}\n placeholder=\"e.g., -y, @modelcontextprotocol/server-filesystem, /tmp\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <SecretJsonField\n label=\"Environment Variables (JSON)\"\n value={form.env_vars}\n onChange={(v) => set('env_vars', v)}\n />\n </>\n )}\n\n {/* Auto-connect */}\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={form.auto_connect}\n onChange={(e) => set('auto_connect', e.target.checked)}\n className=\"w-4 h-4 rounded border-border accent-accent\"\n />\n <span className=\"text-xs text-text-primary\">Auto-connect on startup</span>\n </label>\n </div>\n );\n}\n","import { useState, type KeyboardEvent } from 'react';\nimport { X } from 'lucide-react';\nimport { TagInput } from '../../../../components/common/form/TagInput';\nimport type { ServerFormState } from './server-form-types';\nimport { labelCls, hintCls } from './server-form-types';\n\ninterface Props {\n form: ServerFormState;\n set: (field: keyof ServerFormState, value: any) => void;\n}\n\nexport function DiscoveryStep({ form, set }: Props) {\n const [cpInput, setCpInput] = useState('');\n\n const addProvider = (raw: string) => {\n const v = raw.trim().toLowerCase();\n if (v && !form.credential_providers.includes(v)) {\n set('credential_providers', [...form.credential_providers, v]);\n }\n setCpInput('');\n };\n\n const removeProvider = (p: string) => {\n set('credential_providers', form.credential_providers.filter((x) => x !== p));\n };\n\n const handleCpKey = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault();\n addProvider(cpInput);\n } else if (e.key === 'Backspace' && !cpInput && form.credential_providers.length > 0) {\n removeProvider(form.credential_providers[form.credential_providers.length - 1]);\n }\n };\n\n return (\n <div className=\"space-y-5\">\n {/* Tags */}\n <div>\n <label className={labelCls}>Tags</label>\n <TagInput\n tags={form.tags}\n onChange={(tags) => set('tags', tags)}\n placeholder=\"Add tag (e.g., database, analytics)...\"\n />\n <p className={hintCls}>\n Tags enable tool discovery. Workflows filter available MCP servers by tags to find relevant tools.\n </p>\n </div>\n\n {/* Compile Hints */}\n <div>\n <label className={labelCls}>Compile Hints</label>\n <textarea\n value={form.compile_hints}\n onChange={(e) => set('compile_hints', e.target.value)}\n placeholder=\"Guidance for the workflow compiler when generating YAML from this server's tools...\"\n className=\"input text-xs w-full leading-relaxed\"\n rows={4}\n spellCheck={false}\n />\n <p className={hintCls}>\n Free-form text that guides the workflow compiler. Describe how tools should be composed, sequenced, or parameterized.\n </p>\n </div>\n\n {/* Credential Providers */}\n <div>\n <label className={labelCls}>Credential Providers</label>\n <div className=\"flex flex-wrap items-center gap-1.5 bg-surface-sunken border border-surface-border rounded-md px-2 py-1.5 focus-within:ring-1 focus-within:ring-accent-primary\">\n {form.credential_providers.map((p) => (\n <span\n key={p}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full bg-accent/10 text-accent text-2xs font-medium\"\n >\n {p}\n <button\n type=\"button\"\n onClick={() => removeProvider(p)}\n className=\"hover:text-status-error transition-colors\"\n >\n <X className=\"w-2.5 h-2.5\" />\n </button>\n </span>\n ))}\n <input\n type=\"text\"\n value={cpInput}\n onChange={(e) => setCpInput(e.target.value)}\n onKeyDown={handleCpKey}\n onBlur={() => { if (cpInput.trim()) addProvider(cpInput); }}\n placeholder={form.credential_providers.length === 0 ? 'Add provider (e.g., github, slack)...' : ''}\n className=\"flex-1 min-w-[80px] bg-transparent text-xs text-text-primary outline-none placeholder:text-text-tertiary\"\n />\n </div>\n <p className={hintCls}>\n IAM credential providers required by this server's tools. Users will be prompted to connect these before tool execution.\n </p>\n </div>\n </div>\n );\n}\n","import { CheckCircle2, XCircle, Loader2 } from 'lucide-react';\nimport { useTestConnection } from '../../../../api/mcp';\nimport type { ServerFormState } from './server-form-types';\nimport { formToPayload } from './server-form-types';\nimport { hintCls } from './server-form-types';\n\ninterface Props {\n form: ServerFormState;\n set: (field: keyof ServerFormState, value: any) => void;\n}\n\nexport function TestStep({ form, set }: Props) {\n const test = useTestConnection();\n const isInProcess = form.mode === 'in-process';\n\n const handleTest = () => {\n const payload = formToPayload(form);\n test.mutate(\n { transport_type: payload.transport_type, transport_config: payload.transport_config },\n {\n onSuccess: (result) => {\n if (result.success) {\n set('discovered_tools', result.tools);\n }\n },\n },\n );\n };\n\n const result = test.data;\n const tools = form.discovered_tools ?? result?.tools ?? [];\n\n return (\n <div className=\"space-y-5\">\n {isInProcess ? (\n <div>\n <p className=\"text-sm text-text-secondary\">\n In-process servers connect lazily on first tool call. No connection test needed.\n </p>\n {form.discovered_tools && form.discovered_tools.length > 0 && (\n <div className=\"mt-4\">\n <p className=\"text-xs text-text-tertiary mb-2\">\n {form.discovered_tools.length} tool{form.discovered_tools.length !== 1 ? 's' : ''} cached from last connection\n </p>\n <ToolList tools={form.discovered_tools} />\n </div>\n )}\n </div>\n ) : (\n <>\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={handleTest}\n disabled={test.isPending}\n className=\"btn-primary text-xs\"\n >\n {test.isPending ? (\n <span className=\"flex items-center gap-1.5\">\n <Loader2 className=\"w-3 h-3 animate-spin\" />\n Connecting...\n </span>\n ) : (\n 'Test Connection'\n )}\n </button>\n {result?.success && (\n <span className=\"flex items-center gap-1 text-xs text-status-success\">\n <CheckCircle2 className=\"w-3.5 h-3.5\" />\n Connected — {tools.length} tool{tools.length !== 1 ? 's' : ''} discovered\n </span>\n )}\n {result && !result.success && (\n <span className=\"flex items-center gap-1 text-xs text-status-error\">\n <XCircle className=\"w-3.5 h-3.5\" />\n {result.error || 'Connection failed'}\n </span>\n )}\n </div>\n\n {tools.length > 0 && (\n <div>\n <p className=\"text-xs text-text-tertiary mb-2\">Discovered tools</p>\n <ToolList tools={tools} />\n </div>\n )}\n\n <p className={hintCls}>\n Tests connectivity by connecting to the server and listing available tools. The server must be reachable from this machine.\n </p>\n </>\n )}\n </div>\n );\n}\n\nfunction ToolList({ tools }: { tools: { name: string; description?: string }[] }) {\n return (\n <div className=\"max-h-[280px] overflow-y-auto border border-surface-border rounded-md divide-y divide-surface-border\">\n {tools.map((t) => (\n <div key={t.name} className=\"px-3 py-2\">\n <span className=\"text-xs font-medium text-text-primary font-mono\">{t.name}</span>\n {t.description && (\n <span className=\"block text-2xs text-text-tertiary mt-0.5 line-clamp-2\">{t.description}</span>\n )}\n </div>\n ))}\n </div>\n );\n}\n","import type { ServerFormState } from './server-form-types';\nimport { labelCls } from './server-form-types';\n\ninterface Props {\n form: ServerFormState;\n}\n\nconst modeLabels: Record<string, string> = {\n 'in-process': 'In-Process',\n 'network': 'Network Service',\n 'local-process': 'Local Process',\n};\n\nconst transportLabels: Record<string, string> = {\n stdio: 'stdio',\n sse: 'SSE',\n 'streamable-http': 'Streamable HTTP',\n};\n\nexport function ReviewStep({ form }: Props) {\n const tools = form.discovered_tools ?? [];\n\n return (\n <div className=\"space-y-4\">\n <Row label=\"Name\" value={form.name} />\n {form.description && <Row label=\"Description\" value={form.description} />}\n <Row label=\"Mode\" value={modeLabels[form.mode] ?? form.mode} />\n\n {form.mode === 'network' && (\n <>\n <Row label=\"Transport\" value={transportLabels[form.transport_type] ?? form.transport_type} />\n <Row label=\"URL\" value={form.url} mono />\n </>\n )}\n {form.mode === 'local-process' && (\n <>\n <Row label=\"Command\" value={form.command} mono />\n {form.args && <Row label=\"Args\" value={form.args} mono />}\n </>\n )}\n\n <Row label=\"Auto-connect\" value={form.auto_connect ? 'Yes' : 'No'} />\n\n {form.tags.length > 0 && (\n <div>\n <label className={labelCls}>Tags</label>\n <div className=\"flex flex-wrap gap-1.5 mt-1\">\n {form.tags.map((t) => (\n <span key={t} className=\"px-2 py-0.5 rounded-full bg-accent/10 text-accent text-2xs font-medium\">\n {t}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {form.credential_providers.length > 0 && (\n <div>\n <label className={labelCls}>Credential Providers</label>\n <div className=\"flex flex-wrap gap-1.5 mt-1\">\n {form.credential_providers.map((p) => (\n <span key={p} className=\"px-2 py-0.5 rounded-full bg-accent/10 text-accent text-2xs font-medium\">\n {p}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {form.compile_hints && <Row label=\"Compile Hints\" value={form.compile_hints} />}\n\n {tools.length > 0 && (\n <Row label=\"Discovered Tools\" value={`${tools.length} tool${tools.length !== 1 ? 's' : ''}`} />\n )}\n </div>\n );\n}\n\nfunction Row({ label, value, mono }: { label: string; value: string; mono?: boolean }) {\n return (\n <div>\n <label className={labelCls}>{label}</label>\n <p className={`text-xs text-text-primary mt-0.5 ${mono ? 'font-mono' : ''}`}>{value}</p>\n </div>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useParams, useNavigate, useSearchParams } from 'react-router-dom';\nimport { useMcpServer, useCreateMcpServer, useUpdateMcpServer } from '../../../../api/mcp';\nimport { StepIndicator } from '../../../../components/common/layout/StepIndicator';\nimport { PageHeader } from '../../../../components/common/layout/PageHeader';\nimport {\n EMPTY_FORM,\n serverToForm,\n formToPayload,\n STEP_LABELS,\n isStepValid,\n} from './server-form-types';\nimport type { ServerFormState } from './server-form-types';\nimport { TransportStep } from './TransportStep';\nimport { DiscoveryStep } from './DiscoveryStep';\nimport { TestStep } from './TestStep';\nimport { ReviewStep } from './ReviewStep';\n\nexport function McpServerDetailPage() {\n const { serverId } = useParams<{ serverId: string }>();\n const isNew = !serverId;\n const navigate = useNavigate();\n const { data: existing, isLoading } = useMcpServer(serverId ?? '');\n const createServer = useCreateMcpServer();\n const updateServer = useUpdateMcpServer();\n\n const [form, setForm] = useState<ServerFormState>(EMPTY_FORM);\n const [initialized, setInitialized] = useState(false);\n const [saveError, setSaveError] = useState('');\n\n // Step via URL search param\n const [searchParams, setSearchParams] = useSearchParams();\n const step = parseInt(searchParams.get('step') || '1', 10);\n const setStep = useCallback((s: number) => {\n setSearchParams((prev) => {\n const next = new URLSearchParams(prev);\n next.set('step', String(s));\n return next;\n }, { replace: false });\n }, [setSearchParams]);\n\n // Initialize form from existing record\n useEffect(() => {\n if (initialized) return;\n if (isNew) {\n setForm(EMPTY_FORM);\n setInitialized(true);\n return;\n }\n if (existing) {\n setForm(serverToForm(existing));\n setInitialized(true);\n }\n }, [existing, isNew, initialized]);\n\n const set = (field: keyof ServerFormState, value: any) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n const isBuiltin = !!(existing?.transport_config as any)?.builtin;\n\n // Save\n const handleSave = () => {\n setSaveError('');\n const payload = formToPayload(form);\n\n if (existing) {\n updateServer.mutate(\n { id: existing.id, ...payload },\n { onSuccess: () => navigate('/mcp/servers') },\n );\n } else {\n createServer.mutate(payload, {\n onSuccess: () => navigate('/mcp/servers'),\n onError: (err) => setSaveError(err.message),\n });\n }\n };\n\n if (!isNew && isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-48\" />\n <div className=\"h-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (!isNew && !existing && !isLoading) {\n return <p className=\"text-sm text-text-secondary\">Server not found.</p>;\n }\n\n const isLast = step === STEP_LABELS.length;\n const isPending = createServer.isPending || updateServer.isPending;\n const error = saveError || (createServer.error as Error | null)?.message || (updateServer.error as Error | null)?.message;\n\n return (\n <div>\n <PageHeader title={isNew ? 'Register MCP Server' : existing?.name ?? ''} />\n\n <div className=\"max-w-3xl\">\n <StepIndicator steps={STEP_LABELS} currentStep={step - 1} onStepClick={(i) => setStep(i + 1)} />\n\n <div className=\"min-h-[360px] py-2\">\n {step === 1 && <TransportStep form={form} set={set} isBuiltin={isBuiltin} />}\n {step === 2 && <DiscoveryStep form={form} set={set} />}\n {step === 3 && <TestStep form={form} set={set} />}\n {step === 4 && <ReviewStep form={form} />}\n </div>\n\n {error && (\n <p className=\"text-xs text-status-error mt-4\">{error}</p>\n )}\n\n {/* Navigation */}\n <div className=\"flex justify-between items-center pt-4 border-t border-surface-border mt-4\">\n <div>\n {step > 1 && (\n <button onClick={() => setStep(step - 1)} className=\"btn-secondary text-xs\">\n Back\n </button>\n )}\n </div>\n <div className=\"flex gap-3\">\n <button onClick={() => navigate('/mcp/servers')} className=\"btn-ghost text-xs\">\n Cancel\n </button>\n {isLast ? (\n <button\n onClick={handleSave}\n disabled={!isStepValid(step, form) || isPending}\n className=\"btn-primary text-xs\"\n >\n {isPending ? 'Saving...' : existing ? 'Save' : 'Register'}\n </button>\n ) : (\n <button\n onClick={() => setStep(step + 1)}\n disabled={!isStepValid(step, form)}\n className=\"btn-primary text-xs\"\n >\n Next\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"names":["StepIndicator","steps","currentStep","onStepClick","jsx","label","i","done","active","clickable","jsxs","EMPTY_FORM","serverToForm","config","isBuiltin","mode","formToPayload","form","transport_config","a","headers","STEP_LABELS","isStepValid","step","labelCls","hintCls","MASK","hasSecretValues","text","trimmed","parsed","maskJsonValues","masked","k","SecretJsonField","value","onChange","placeholder","hint","rows","revealed","setRevealed","useState","copied","setCopied","shown","copy","EyeOff","Eye","Check","Copy","e","modes","TransportStep","set","m","disabled","Fragment","t","v","DiscoveryStep","cpInput","setCpInput","addProvider","raw","removeProvider","p","x","handleCpKey","TagInput","tags","X","TestStep","test","useTestConnection","isInProcess","handleTest","payload","result","tools","ToolList","Loader2","CheckCircle2","XCircle","modeLabels","transportLabels","ReviewStep","Row","mono","McpServerDetailPage","serverId","useParams","isNew","navigate","useNavigate","existing","isLoading","useMcpServer","createServer","useCreateMcpServer","updateServer","useUpdateMcpServer","setForm","initialized","setInitialized","saveError","setSaveError","searchParams","setSearchParams","useSearchParams","setStep","useCallback","s","prev","next","useEffect","field","f","_a","handleSave","err","isLast","isPending","error","_b","_c","PageHeader"],"mappings":"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"}