@hotmeshio/long-tail 0.17.0 → 0.17.2
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.
- package/dashboard/dist/assets/AdminDashboard-B_AVB7tk.js +2 -0
- package/dashboard/dist/assets/{AdminDashboard-Bx5G6Qb_.js.map → AdminDashboard-B_AVB7tk.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-S-YfPwCG.js → AgentConfigPage-JoZko3JB.js} +7 -7
- package/dashboard/dist/assets/{AgentConfigPage-S-YfPwCG.js.map → AgentConfigPage-JoZko3JB.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-pFVqLY4c.js → AgentDetailPage-DfpR2Fgg.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-pFVqLY4c.js.map → AgentDetailPage-DfpR2Fgg.js.map} +1 -1
- package/dashboard/dist/assets/AgentsPage-F2ixDk1Q.js +2 -0
- package/dashboard/dist/assets/{AgentsPage-DjAluFkM.js.map → AgentsPage-F2ixDk1Q.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-D-W4OP55.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-D-W4OP55.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-h2YrxQS2.js → BotPicker-B8Yal8Mm.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-h2YrxQS2.js.map → BotPicker-B8Yal8Mm.js.map} +1 -1
- package/dashboard/dist/assets/BulkAssignModal-ySfoaF7f.js +2 -0
- package/dashboard/dist/assets/{BulkAssignModal-CNKZBgK5.js.map → BulkAssignModal-ySfoaF7f.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-BSJ2oFj6.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-DGsnIiJi.js.map → CapabilitiesPage-BSJ2oFj6.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-ptEsXSl6.js → CollapsibleSection-CcV88IUy.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-ptEsXSl6.js.map → CollapsibleSection-CcV88IUy.js.map} +1 -1
- package/dashboard/dist/assets/CountdownTimer-C-E9MXMk.js +2 -0
- package/dashboard/dist/assets/{CountdownTimer-Cvif0QtN.js.map → CountdownTimer-C-E9MXMk.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-CwKUAtAR.js → CredentialsPage-DrydlZ65.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-CwKUAtAR.js.map → CredentialsPage-DrydlZ65.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-B9RbqMR-.js → CronLabel-BxQmJXos.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-B9RbqMR-.js.map → CronLabel-BxQmJXos.js.map} +1 -1
- package/dashboard/dist/assets/ElapsedCell-lszUXiyP.js +2 -0
- package/dashboard/dist/assets/{ElapsedCell-BirS3yZq.js.map → ElapsedCell-lszUXiyP.js.map} +1 -1
- package/dashboard/dist/assets/EntityTimelinePanel-CwzIV87U.js +2 -0
- package/dashboard/dist/assets/{EntityTimelinePanel-D3QNqDiL.js.map → EntityTimelinePanel-CwzIV87U.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-Bke-30FY.js → EscalationListSchemaPage-D16uUVcG.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-Bke-30FY.js.map → EscalationListSchemaPage-D16uUVcG.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-CTFE9vko.js → EscalationSchemaPage-BLM3dUEw.js} +3 -3
- package/dashboard/dist/assets/{EscalationSchemaPage-CTFE9vko.js.map → EscalationSchemaPage-BLM3dUEw.js.map} +1 -1
- package/dashboard/dist/assets/EscalationsOverview-BlFjoKlR.js +2 -0
- package/dashboard/dist/assets/{EscalationsOverview-C2FaSmXk.js.map → EscalationsOverview-BlFjoKlR.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-zFqzbEdC.js → EventTable-rTkMR8Zf.js} +2 -2
- package/dashboard/dist/assets/{EventTable-zFqzbEdC.js.map → EventTable-rTkMR8Zf.js.map} +1 -1
- package/dashboard/dist/assets/FilterBar-BeVBUdfJ.js +2 -0
- package/dashboard/dist/assets/FilterBar-BeVBUdfJ.js.map +1 -0
- package/dashboard/dist/assets/{GraphInvokePage-CA_XYI2W.js → GraphInvokePage-BV60xkVy.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-CA_XYI2W.js.map → GraphInvokePage-BV60xkVy.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-BA0RYzFc.js +2 -0
- package/dashboard/dist/assets/HomePage-BA0RYzFc.js.map +1 -0
- package/dashboard/dist/assets/ListToolbar-4IfsUXfV.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-BEogxu1f.js.map → ListToolbar-4IfsUXfV.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-CdMR-5qh.js → McpOverview-gDegMXvF.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-CdMR-5qh.js.map → McpOverview-gDegMXvF.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-BXo4UjJF.js → McpQueryDetailPage-CnCffPks.js} +4 -4
- package/dashboard/dist/assets/{McpQueryDetailPage-BXo4UjJF.js.map → McpQueryDetailPage-CnCffPks.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryPage-CLEMtLOG.js +2 -0
- package/dashboard/dist/assets/{McpQueryPage-BvvM0Ya1.js.map → McpQueryPage-CLEMtLOG.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-tr-lrWVv.js +2 -0
- package/dashboard/dist/assets/McpRunDetailPage-tr-lrWVv.js.map +1 -0
- package/dashboard/dist/assets/McpRunsPage-nE0d_1Px.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-nE0d_1Px.js.map +1 -0
- package/dashboard/dist/assets/OperationsPage-C8h1DN5Q.js +3 -0
- package/dashboard/dist/assets/OperationsPage-C8h1DN5Q.js.map +1 -0
- package/dashboard/dist/assets/OperatorDashboard-DCG8BFKE.js +2 -0
- package/dashboard/dist/assets/OperatorDashboard-DCG8BFKE.js.map +1 -0
- package/dashboard/dist/assets/{PersonaDetailPage-BHQ44UIu.js → PersonaDetailPage-BEVeJr1q.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-BHQ44UIu.js.map → PersonaDetailPage-BEVeJr1q.js.map} +1 -1
- package/dashboard/dist/assets/PersonasPage-B5fj2AK6.js +2 -0
- package/dashboard/dist/assets/PersonasPage-B5fj2AK6.js.map +1 -0
- package/dashboard/dist/assets/ProcessDetailPage-CWGby6KD.js +2 -0
- package/dashboard/dist/assets/{ProcessDetailPage-CZ09xiWf.js.map → ProcessDetailPage-CWGby6KD.js.map} +1 -1
- package/dashboard/dist/assets/ProcessesListPage-nFdLMlfb.js +2 -0
- package/dashboard/dist/assets/ProcessesListPage-nFdLMlfb.js.map +1 -0
- package/dashboard/dist/assets/RoleDetailPage-OmOdRm1F.js +8 -0
- package/dashboard/dist/assets/{RoleDetailPage-CDsJKPvV.js.map → RoleDetailPage-OmOdRm1F.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-D2cV92bL.js → RolesPage-DwprdPCA.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-D2cV92bL.js.map → RolesPage-DwprdPCA.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-Cvi8x8xx.js → RunAsSelector-DGw9EKSR.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-Cvi8x8xx.js.map → RunAsSelector-DGw9EKSR.js.map} +1 -1
- package/dashboard/dist/assets/{ScanCodesPage-BWt_iRCu.js → ScanCodesPage-RPi4qZ_l.js} +2 -2
- package/dashboard/dist/assets/{ScanCodesPage-BWt_iRCu.js.map → ScanCodesPage-RPi4qZ_l.js.map} +1 -1
- package/dashboard/dist/assets/ScanSchemeDetailPage-BKc4lUjc.js +2 -0
- package/dashboard/dist/assets/{ScanSchemeDetailPage-C6mRYkxL.js.map → ScanSchemeDetailPage-BKc4lUjc.js.map} +1 -1
- package/dashboard/dist/assets/ScanStationPage-DUfxcntB.js +2 -0
- package/dashboard/dist/assets/{ScanStationPage-YQiijAKy.js.map → ScanStationPage-DUfxcntB.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-BsbSade1.js → StickyPagination-DXOk5z5X.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-BsbSade1.js.map → StickyPagination-DXOk5z5X.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-jczXwuBw.js → StreamMessageDetail-BB1h2zZN.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-jczXwuBw.js.map → StreamMessageDetail-BB1h2zZN.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-DSO6QXmX.js → SwimlaneTimeline-CapKokLg.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-DSO6QXmX.js.map → SwimlaneTimeline-CapKokLg.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-DWLfcAF4.js → TaskDetailPage-Dfzdp97x.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-DWLfcAF4.js.map → TaskDetailPage-Dfzdp97x.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-B0at3vJ3.js → TasksListPage-DxlS7PTD.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-B0at3vJ3.js.map → TasksListPage-DxlS7PTD.js.map} +1 -1
- package/dashboard/dist/assets/TimeAgo-Bv5viQ1m.js +2 -0
- package/dashboard/dist/assets/{TimeAgo-poxwErGl.js.map → TimeAgo-Bv5viQ1m.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-Be6tvFQd.js → TimestampCell-DXNBf_eb.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-Be6tvFQd.js.map → TimestampCell-DXNBf_eb.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-CYOqnqMz.js → ToolTestPanel-f32mir7Q.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-CYOqnqMz.js.map → ToolTestPanel-f32mir7Q.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-C82WIKaU.js → TopicDetailPage-D-N8Vsd4.js} +3 -3
- package/dashboard/dist/assets/{TopicDetailPage-C82WIKaU.js.map → TopicDetailPage-D-N8Vsd4.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-COH547ZD.js → TopicsPage-hqlu32wg.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-COH547ZD.js.map → TopicsPage-hqlu32wg.js.map} +1 -1
- package/dashboard/dist/assets/UserName-BhA_ItNN.js +2 -0
- package/dashboard/dist/assets/{UserName-D2SoVbe9.js.map → UserName-BhA_ItNN.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-BAgMKnhe.js +2 -0
- package/dashboard/dist/assets/{WorkflowExecutionPage-C82Q-TYC.js.map → WorkflowExecutionPage-BAgMKnhe.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsDashboard-B2wYT_hj.js +2 -0
- package/dashboard/dist/assets/WorkflowsDashboard-B2wYT_hj.js.map +1 -0
- package/dashboard/dist/assets/WorkflowsOverview--jC5F9lz.js +2 -0
- package/dashboard/dist/assets/{WorkflowsOverview-DdKRtWdK.js.map → WorkflowsOverview--jC5F9lz.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-D3qvyy_4.js → YamlWorkflowDetailPage-BdB5eX8s.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-D3qvyy_4.js.map → YamlWorkflowDetailPage-BdB5eX8s.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-BJsxZOBC.js → YamlWorkflowsPage-BUQQU9II.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-BJsxZOBC.js.map → YamlWorkflowsPage-BUQQU9II.js.map} +1 -1
- package/dashboard/dist/assets/{agents-OQHCkIfJ.js → agents-BF_S1J_z.js} +2 -2
- package/dashboard/dist/assets/{agents-OQHCkIfJ.js.map → agents-BF_S1J_z.js.map} +1 -1
- package/dashboard/dist/assets/{bots-e8jsNOf4.js → bots-CGlEoWAu.js} +2 -2
- package/dashboard/dist/assets/{bots-e8jsNOf4.js.map → bots-CGlEoWAu.js.map} +1 -1
- package/dashboard/dist/assets/capabilities-Pq8pG0kX.js +2 -0
- package/dashboard/dist/assets/{capabilities-CEo0AB79.js.map → capabilities-Pq8pG0kX.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-CD6ti-QB.js → controlplane-dY6a4iYT.js} +2 -2
- package/dashboard/dist/assets/{controlplane-CD6ti-QB.js.map → controlplane-dY6a4iYT.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-CBUTda5U.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-CUtDSbxl.js.map → escalation-columns-CBUTda5U.js.map} +1 -1
- package/dashboard/dist/assets/{index-Bf4IPu7I.js → index-BHfISWyn.js} +2 -2
- package/dashboard/dist/assets/{index-Bf4IPu7I.js.map → index-BHfISWyn.js.map} +1 -1
- package/dashboard/dist/assets/{index-BsP7vujM.js → index-BTksPQZe.js} +2 -2
- package/dashboard/dist/assets/{index-BsP7vujM.js.map → index-BTksPQZe.js.map} +1 -1
- package/dashboard/dist/assets/{index-B76fjEom.js → index-BWtW5puE.js} +2 -2
- package/dashboard/dist/assets/{index-B76fjEom.js.map → index-BWtW5puE.js.map} +1 -1
- package/dashboard/dist/assets/index-Bn-6MP9-.js +2 -0
- package/dashboard/dist/assets/index-Bn-6MP9-.js.map +1 -0
- package/dashboard/dist/assets/{index-C8VhbKFU.js → index-BrFGgfjR.js} +2 -2
- package/dashboard/dist/assets/index-BrFGgfjR.js.map +1 -0
- package/dashboard/dist/assets/{index-COUj4v_W.js → index-ByYeo8P7.js} +3 -3
- package/dashboard/dist/assets/{index-COUj4v_W.js.map → index-ByYeo8P7.js.map} +1 -1
- package/dashboard/dist/assets/{index-BpwkKV5f.js → index-CivQGQpu.js} +3 -3
- package/dashboard/dist/assets/{index-BpwkKV5f.js.map → index-CivQGQpu.js.map} +1 -1
- package/dashboard/dist/assets/{index-DIHr2CvI.js → index-CwQn-nhR.js} +2 -2
- package/dashboard/dist/assets/{index-DIHr2CvI.js.map → index-CwQn-nhR.js.map} +1 -1
- package/dashboard/dist/assets/index-D0bjzVum.js +2 -0
- package/dashboard/dist/assets/index-D0bjzVum.js.map +1 -0
- package/dashboard/dist/assets/{index-CTZEzzN3.js → index-D1KCPoRr.js} +2 -2
- package/dashboard/dist/assets/{index-CTZEzzN3.js.map → index-D1KCPoRr.js.map} +1 -1
- package/dashboard/dist/assets/index-D9rtK9QF.js +67 -0
- package/dashboard/dist/assets/index-D9rtK9QF.js.map +1 -0
- package/dashboard/dist/assets/{index-B0C6wSrQ.js → index-DrlZc3C0.js} +2 -2
- package/dashboard/dist/assets/{index-B0C6wSrQ.js.map → index-DrlZc3C0.js.map} +1 -1
- package/dashboard/dist/assets/index-U7HShN30.js +2 -0
- package/dashboard/dist/assets/{index-B2aiEKtM.js.map → index-U7HShN30.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-C89zT4Qe.js → knowledge-8_TilyaY.js} +2 -2
- package/dashboard/dist/assets/{knowledge-C89zT4Qe.js.map → knowledge-8_TilyaY.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-BLKHykZS.js → mcp-hY3O2HJa.js} +2 -2
- package/dashboard/dist/assets/{mcp-BLKHykZS.js.map → mcp-hY3O2HJa.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-CfiqUNDV.js → mcp-query-CA8NEf2e.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-CfiqUNDV.js.map → mcp-query-CA8NEf2e.js.map} +1 -1
- package/dashboard/dist/assets/{personas-B1HzC94M.js → personas-DrWgQ94s.js} +2 -2
- package/dashboard/dist/assets/{personas-B1HzC94M.js.map → personas-DrWgQ94s.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-C73X50ES.js → pipelines-DdgSlafC.js} +2 -2
- package/dashboard/dist/assets/{pipelines-C73X50ES.js.map → pipelines-DdgSlafC.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-DHbFpQk4.js → tasks-UyjER1TA.js} +2 -2
- package/dashboard/dist/assets/{tasks-DHbFpQk4.js.map → tasks-UyjER1TA.js.map} +1 -1
- package/dashboard/dist/assets/{topics-Fu8qCUOd.js → topics-CIc5SpT_.js} +2 -2
- package/dashboard/dist/assets/{topics-Fu8qCUOd.js.map → topics-CIc5SpT_.js.map} +1 -1
- package/dashboard/dist/assets/useDebouncedValue-CmUqBRK4.js +2 -0
- package/dashboard/dist/assets/useDebouncedValue-CmUqBRK4.js.map +1 -0
- package/dashboard/dist/assets/{useNamespace-CpO5Hogb.js → useNamespace-BOZOwXTE.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-CpO5Hogb.js.map → useNamespace-BOZOwXTE.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-BwIl6_d2.js → useYamlActivityEvents-BsTpIsba.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-BwIl6_d2.js.map → useYamlActivityEvents-BsTpIsba.js.map} +1 -1
- package/dashboard/dist/assets/{workflows-DR9OQcuq.js → workflows-BkFI3IwE.js} +2 -2
- package/dashboard/dist/assets/{workflows-DR9OQcuq.js.map → workflows-BkFI3IwE.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-DjEHh9Wy.js → yaml-workflows-CeeqNi9k.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-DjEHh9Wy.js.map → yaml-workflows-CeeqNi9k.js.map} +1 -1
- package/dashboard/dist/index.html +1 -1
- package/docs/dashboard.md +18 -0
- package/package.json +1 -1
- package/dashboard/dist/assets/AdminDashboard-Bx5G6Qb_.js +0 -2
- package/dashboard/dist/assets/AgentsPage-DjAluFkM.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-BHsRZk4v.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-BHsRZk4v.js.map +0 -1
- package/dashboard/dist/assets/BulkAssignModal-CNKZBgK5.js +0 -2
- package/dashboard/dist/assets/CapabilitiesPage-DGsnIiJi.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-Cvif0QtN.js +0 -2
- package/dashboard/dist/assets/ElapsedCell-BirS3yZq.js +0 -2
- package/dashboard/dist/assets/EntityTimelinePanel-D3QNqDiL.js +0 -2
- package/dashboard/dist/assets/EscalationsOverview-C2FaSmXk.js +0 -2
- package/dashboard/dist/assets/FilterBar-fwUqeM-5.js +0 -2
- package/dashboard/dist/assets/FilterBar-fwUqeM-5.js.map +0 -1
- package/dashboard/dist/assets/HomePage-C2HnqdFX.js +0 -2
- package/dashboard/dist/assets/HomePage-C2HnqdFX.js.map +0 -1
- package/dashboard/dist/assets/ListToolbar-BEogxu1f.js +0 -2
- package/dashboard/dist/assets/McpQueryPage-BvvM0Ya1.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-5eaJeupC.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-5eaJeupC.js.map +0 -1
- package/dashboard/dist/assets/McpRunsPage-B5_-3NUF.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-B5_-3NUF.js.map +0 -1
- package/dashboard/dist/assets/OperationsPage-CJXTw02Z.js +0 -3
- package/dashboard/dist/assets/OperationsPage-CJXTw02Z.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-Dx7639os.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-Dx7639os.js.map +0 -1
- package/dashboard/dist/assets/PersonasPage-Cnmb4uox.js +0 -2
- package/dashboard/dist/assets/PersonasPage-Cnmb4uox.js.map +0 -1
- package/dashboard/dist/assets/ProcessDetailPage-CZ09xiWf.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-BT76_7bW.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-BT76_7bW.js.map +0 -1
- package/dashboard/dist/assets/RoleDetailPage-CDsJKPvV.js +0 -8
- package/dashboard/dist/assets/ScanSchemeDetailPage-C6mRYkxL.js +0 -2
- package/dashboard/dist/assets/ScanStationPage-YQiijAKy.js +0 -2
- package/dashboard/dist/assets/TimeAgo-poxwErGl.js +0 -2
- package/dashboard/dist/assets/UserName-D2SoVbe9.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-C82Q-TYC.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-DDWwCT-v.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-DDWwCT-v.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsOverview-DdKRtWdK.js +0 -2
- package/dashboard/dist/assets/capabilities-CEo0AB79.js +0 -2
- package/dashboard/dist/assets/escalation-columns-CUtDSbxl.js +0 -2
- package/dashboard/dist/assets/index-B2aiEKtM.js +0 -2
- package/dashboard/dist/assets/index-BYIN0l5M.js +0 -2
- package/dashboard/dist/assets/index-BYIN0l5M.js.map +0 -1
- package/dashboard/dist/assets/index-C8VhbKFU.js.map +0 -1
- package/dashboard/dist/assets/index-DSdqso-_.js +0 -67
- package/dashboard/dist/assets/index-DSdqso-_.js.map +0 -1
- package/dashboard/dist/assets/index-VsZyCFz8.js +0 -2
- package/dashboard/dist/assets/index-VsZyCFz8.js.map +0 -1
- package/dashboard/dist/assets/useDebouncedValue-C4P2jQuh.js +0 -2
- package/dashboard/dist/assets/useDebouncedValue-C4P2jQuh.js.map +0 -1
- package/dashboard/dist/assets/useEventHooks-DL3Vhz4g.js +0 -2
- package/dashboard/dist/assets/useEventHooks-DL3Vhz4g.js.map +0 -1
- package/dashboard/dist/assets/users-C0ke1Z-8.js +0 -2
- package/dashboard/dist/assets/users-C0ke1Z-8.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-B2aiEKtM.js","sources":["../../src/pages/admin/users/CreateUserModal.tsx","../../src/pages/admin/users/EditUserModal.tsx","../../src/pages/admin/bots/CreateBotModal.tsx","../../src/pages/admin/bots/EditBotModal.tsx","../../src/pages/admin/bots/BotDetailPanel.tsx","../../src/pages/admin/bots/BotsPage.tsx","../../src/components/common/form/PropertiesEditor.tsx","../../src/lib/roleScope.ts","../../src/pages/admin/users/RolePanel.tsx","../../src/pages/admin/users/AccountTabToggle.tsx","../../src/pages/admin/users/UsersPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useCreateUser } from '../../../api/users';\nimport { Modal } from '../../../components/common/modal/Modal';\n\nexport function CreateUserModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const createUser = useCreateUser();\n const [form, setForm] = useState({\n external_id: '',\n email: '',\n display_name: '',\n password: '',\n });\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) setForm({ external_id: '', email: '', display_name: '', password: '' });\n }\n\n const handleCreate = () => {\n if (!form.external_id.trim()) return;\n createUser.mutate(\n {\n external_id: form.external_id.trim(),\n email: form.email.trim() || undefined,\n display_name: form.display_name.trim() || undefined,\n password: form.password || undefined,\n },\n { onSuccess: onClose },\n );\n };\n\n const set = (field: string, value: string) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create User\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n External ID (required)\n </label>\n <input\n type=\"text\"\n value={form.external_id}\n onChange={(e) => set('external_id', e.target.value)}\n placeholder=\"e.g., john.doe\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => set('display_name', e.target.value)}\n placeholder=\"John Doe\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Email\n </label>\n <input\n type=\"text\"\n value={form.email}\n onChange={(e) => set('email', e.target.value)}\n placeholder=\"john@example.com\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Password\n </label>\n <input\n type=\"password\"\n value={form.password}\n onChange={(e) => set('password', e.target.value)}\n placeholder=\"Leave blank for no password\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n {createUser.error && (\n <p className=\"text-xs text-status-error\">{(createUser.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleCreate}\n disabled={!form.external_id.trim() || createUser.isPending}\n className=\"btn-primary text-xs\"\n >\n {createUser.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useUpdateUser } from '../../../api/users';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport type { LTUserRecord } from '../../../api/types';\n\nexport function EditUserModal({\n open,\n onClose,\n user,\n}: {\n open: boolean;\n onClose: () => void;\n user: LTUserRecord | null;\n}) {\n const updateUser = useUpdateUser();\n const [form, setForm] = useState({\n display_name: '',\n email: '',\n status: 'active' as string,\n });\n\n const [prevUser, setPrevUser] = useState(user);\n if (user !== prevUser) {\n setPrevUser(user);\n if (user) {\n setForm({\n display_name: user.display_name ?? '',\n email: user.email ?? '',\n status: user.status,\n });\n }\n }\n\n const handleSave = () => {\n if (!user) return;\n updateUser.mutate(\n {\n id: user.id,\n display_name: form.display_name.trim() || undefined,\n email: form.email.trim() || undefined,\n status: form.status,\n },\n { onSuccess: onClose },\n );\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={`Edit — ${user?.display_name || user?.external_id || ''}`}\n >\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => setForm((f) => ({ ...f, display_name: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Email\n </label>\n <input\n type=\"text\"\n value={form.email}\n onChange={(e) => setForm((f) => ({ ...f, email: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Status\n </label>\n <select\n value={form.status}\n onChange={(e) => setForm((f) => ({ ...f, status: e.target.value }))}\n className=\"select text-xs w-full\"\n >\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n <option value=\"suspended\">Suspended</option>\n </select>\n </div>\n\n {updateUser.error && (\n <p className=\"text-xs text-status-error\">{(updateUser.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={updateUser.isPending}\n className=\"btn-primary text-xs\"\n >\n {updateUser.isPending ? 'Saving...' : 'Save'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useCreateBot } from '../../../api/bots';\nimport { Modal } from '../../../components/common/modal/Modal';\n\nexport function CreateBotModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const createBot = useCreateBot();\n const [form, setForm] = useState({\n name: '',\n display_name: '',\n description: '',\n });\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) setForm({ name: '', display_name: '', description: '' });\n }\n\n const handleCreate = () => {\n if (!form.name.trim()) return;\n createBot.mutate(\n {\n name: form.name.trim(),\n display_name: form.display_name.trim() || undefined,\n description: form.description.trim() || undefined,\n },\n { onSuccess: onClose },\n );\n };\n\n const set = (field: string, value: string) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create Service Account\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Name (required)\n </label>\n <input\n type=\"text\"\n value={form.name}\n onChange={(e) => set('name', e.target.value.replace(/\\s+/g, '-').toLowerCase())}\n placeholder=\"e.g., ci-bot\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => set('display_name', e.target.value)}\n placeholder=\"CI Bot\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Description\n </label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"Runs scheduled workflows\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n {createBot.error && (\n <p className=\"text-xs text-status-error\">{(createBot.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleCreate}\n disabled={!form.name.trim() || createBot.isPending}\n className=\"btn-primary text-xs\"\n >\n {createBot.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useUpdateBot } from '../../../api/bots';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport type { BotRecord } from '../../../api/types';\n\nexport function EditBotModal({\n open,\n onClose,\n bot,\n}: {\n open: boolean;\n onClose: () => void;\n bot: BotRecord | null;\n}) {\n const updateBot = useUpdateBot();\n const [form, setForm] = useState({\n display_name: '',\n description: '',\n status: 'active' as string,\n });\n\n const [prevBot, setPrevBot] = useState(bot);\n if (bot !== prevBot) {\n setPrevBot(bot);\n if (bot) {\n setForm({\n display_name: bot.display_name ?? '',\n description: bot.description ?? '',\n status: bot.status,\n });\n }\n }\n\n const handleSave = () => {\n if (!bot) return;\n updateBot.mutate(\n {\n id: bot.id,\n display_name: form.display_name.trim() || undefined,\n description: form.description.trim() || undefined,\n status: form.status,\n },\n { onSuccess: onClose },\n );\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={`Edit — ${bot?.display_name || bot?.external_id || ''}`}\n >\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => setForm((f) => ({ ...f, display_name: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Description\n </label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => setForm((f) => ({ ...f, description: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Status\n </label>\n <select\n value={form.status}\n onChange={(e) => setForm((f) => ({ ...f, status: e.target.value }))}\n className=\"select text-xs w-full\"\n >\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n <option value=\"suspended\">Suspended</option>\n </select>\n </div>\n\n {updateBot.error && (\n <p className=\"text-xs text-status-error\">{(updateBot.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={updateBot.isPending}\n className=\"btn-primary text-xs\"\n >\n {updateBot.isPending ? 'Saving...' : 'Save'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { Trash2, Key, Plus, Copy, Check } from 'lucide-react';\nimport {\n useBotApiKeys,\n useCreateBotApiKey,\n useRevokeBotApiKey,\n useAddBotRole,\n useRemoveBotRole,\n} from '../../../api/bots';\nimport { useRoles } from '../../../api/roles';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { TimeAgo } from '../../../components/common/display/TimeAgo';\nimport type { BotRecord, BotApiKeyRecord, LTRoleType } from '../../../api/types';\n\nfunction ApiKeysSection({ botId }: { botId: string }) {\n const { data } = useBotApiKeys(botId);\n const createKey = useCreateBotApiKey();\n const revokeKey = useRevokeBotApiKey();\n\n const [newKeyName, setNewKeyName] = useState('');\n const [selectedScope, setSelectedScope] = useState<'read' | 'full'>('read');\n const [generatedKey, setGeneratedKey] = useState<string | null>(null);\n const [copied, setCopied] = useState(false);\n const [confirmRevoke, setConfirmRevoke] = useState<BotApiKeyRecord | null>(null);\n\n const keys = data?.keys ?? [];\n\n const SCOPE_PRESETS = {\n read: { label: 'Read only', scopes: ['mcp:read'], hint: 'Discovery and monitoring — read-safe tools only' },\n full: { label: 'Full access', scopes: ['mcp:read', 'mcp:full'], hint: 'All tools — can modify state' },\n } as const;\n\n const handleGenerate = () => {\n if (!newKeyName.trim()) return;\n createKey.mutate(\n { botId, name: newKeyName.trim(), scopes: SCOPE_PRESETS[selectedScope].scopes as unknown as string[] },\n {\n onSuccess: (result: any) => {\n setGeneratedKey(result.rawKey);\n setNewKeyName('');\n },\n },\n );\n };\n\n const handleCopy = () => {\n if (!generatedKey) return;\n navigator.clipboard.writeText(generatedKey);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n const handleRevoke = () => {\n if (!confirmRevoke) return;\n revokeKey.mutate(\n { botId, keyId: confirmRevoke.id },\n { onSuccess: () => setConfirmRevoke(null) },\n );\n };\n\n return (\n <div>\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-3\">\n API Keys\n </p>\n\n {generatedKey && (\n <div className=\"mb-3 p-3 bg-status-success/10 border border-status-success/30 rounded-md\">\n <p className=\"text-2xs font-semibold text-status-success mb-1\">\n Key generated — copy now, it won't be shown again\n </p>\n <div className=\"flex items-center gap-2\">\n <code className=\"text-2xs font-mono text-text-primary bg-surface-sunken px-2 py-1 rounded flex-1 min-w-0 overflow-hidden text-ellipsis whitespace-nowrap\">\n {generatedKey}\n </code>\n <button\n onClick={handleCopy}\n className=\"text-text-tertiary hover:text-text-primary shrink-0\"\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 </button>\n </div>\n </div>\n )}\n\n {keys.length === 0 ? (\n <p className=\"text-xs text-text-tertiary mb-3\">No API keys.</p>\n ) : (\n <div className=\"space-y-1.5 mb-3\">\n {keys.map((k) => (\n <div\n key={k.id}\n className=\"group/key flex items-center justify-between px-2.5 py-1.5 bg-surface-sunken rounded text-xs\"\n >\n <div className=\"flex items-center gap-2 flex-wrap\">\n <Key className=\"w-3 h-3 text-text-tertiary\" />\n <span className=\"text-text-primary font-mono\">{k.name}</span>\n {(k.scopes ?? []).map((s: string) => (\n <span key={s} className={`px-1.5 py-0.5 rounded text-2xs font-mono ${s.includes('full') ? 'bg-status-warning/15 text-status-warning' : 'bg-accent/10 text-accent'}`}>\n {s}\n </span>\n ))}\n {k.last_used_at && (\n <span className=\"text-2xs text-text-tertiary\">\n used <TimeAgo date={k.last_used_at} />\n </span>\n )}\n </div>\n <button\n onClick={() => setConfirmRevoke(k)}\n className=\"opacity-0 group-hover/key:opacity-100 transition-opacity text-text-tertiary hover:text-status-error\"\n title=\"Revoke key\"\n >\n <Trash2 className=\"w-3 h-3\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* Stacked like the user panel's Add Role form — the input takes the\n full row, then the fixed-width scope toggle and button share the\n second row. Nothing here can widen the 360px column. */}\n <div className=\"space-y-2\">\n <input\n type=\"text\"\n value={newKeyName}\n onChange={(e) => setNewKeyName(e.target.value)}\n placeholder=\"Key name...\"\n className=\"input text-xs font-mono\"\n />\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex rounded-md border border-surface-border overflow-hidden shrink-0\">\n {(Object.entries(SCOPE_PRESETS) as [keyof typeof SCOPE_PRESETS, typeof SCOPE_PRESETS[keyof typeof SCOPE_PRESETS]][]).map(([key, preset]) => (\n <button\n key={key}\n type=\"button\"\n onClick={() => setSelectedScope(key)}\n title={preset.hint}\n className={`px-2.5 py-1 text-2xs font-medium transition-colors ${\n selectedScope === key\n ? 'bg-accent text-text-inverse'\n : 'bg-surface text-text-secondary hover:bg-surface-hover'\n }`}\n >\n {preset.label}\n </button>\n ))}\n </div>\n <button\n onClick={handleGenerate}\n disabled={!newKeyName.trim() || createKey.isPending}\n className=\"btn-primary text-xs inline-flex items-center gap-1 shrink-0\"\n >\n <Plus className=\"w-3 h-3\" />\n {createKey.isPending ? '...' : 'Generate'}\n </button>\n </div>\n </div>\n {createKey.error && (\n <p className=\"text-2xs text-status-error mt-1\">{(createKey.error as Error).message}</p>\n )}\n\n <ConfirmDeleteModal\n open={!!confirmRevoke}\n onClose={() => setConfirmRevoke(null)}\n onConfirm={handleRevoke}\n title=\"Revoke API Key\"\n description={\n <>\n Revoke API key{' '}\n <span className=\"font-medium text-text-primary font-mono\">\n {confirmRevoke?.name}\n </span>\n ? This bot will no longer be able to authenticate with this key.\n </>\n }\n isPending={revokeKey.isPending}\n error={revokeKey.error as Error | null}\n />\n </div>\n );\n}\n\nfunction RolesSection({ bot }: { bot: BotRecord }) {\n const { data: allRolesData } = useRoles();\n const addRole = useAddBotRole();\n const removeRole = useRemoveBotRole();\n const [newRole, setNewRole] = useState('');\n const [newType, setNewType] = useState<LTRoleType>('member');\n\n const allRoles = allRolesData?.roles ?? [];\n const currentRoles = bot.roles ?? [];\n\n const available = useMemo(() => {\n const assigned = new Set(currentRoles.map((r) => r.role));\n return allRoles.filter((r) => !assigned.has(r));\n }, [allRoles, currentRoles]);\n\n const handleAdd = () => {\n if (!newRole.trim()) return;\n addRole.mutate(\n { botId: bot.id, role: newRole.trim(), type: newType },\n { onSuccess: () => { setNewRole(''); setNewType('member'); } },\n );\n };\n\n const handleRemove = (role: string) => {\n removeRole.mutate({ botId: bot.id, role });\n };\n\n return (\n <div>\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-3\">\n Roles\n </p>\n\n {currentRoles.length === 0 ? (\n <p className=\"text-xs text-text-tertiary mb-3\">No roles assigned.</p>\n ) : (\n <div className=\"flex flex-wrap gap-2 mb-3\">\n {currentRoles.map((r) => (\n <span\n key={r.role}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary\"\n >\n <RolePill role={r.role} />\n <span className=\"text-2xs text-text-tertiary\">{r.type}</span>\n <button\n onClick={() => handleRemove(r.role)}\n className=\"text-text-tertiary hover:text-status-error transition-colors ml-0.5\"\n title={`Remove ${r.role}`}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n\n {available.length > 0 && (\n <div className=\"space-y-2\">\n {/* Same stacked form as the user panel's Add Role — full-width\n selects that can never push the button off-screen. */}\n <select\n value={newRole}\n onChange={(e) => setNewRole(e.target.value)}\n className=\"select text-xs font-mono w-full min-w-0\"\n aria-label=\"Role\"\n >\n <option value=\"\">Select a role...</option>\n {available.map((r) => (\n <option key={r} value={r}>{r}</option>\n ))}\n </select>\n <div className=\"grid grid-cols-2 gap-2 items-end\">\n <div className=\"min-w-0\">\n <label className=\"block text-2xs text-text-tertiary mb-1\">Type</label>\n <select\n value={newType}\n onChange={(e) => setNewType(e.target.value as LTRoleType)}\n className=\"select text-xs w-full min-w-0\"\n aria-label=\"Role type\"\n >\n <option value=\"member\">member</option>\n <option value=\"admin\">admin</option>\n <option value=\"superadmin\">superadmin</option>\n </select>\n </div>\n <div className=\"flex justify-end\">\n <button\n onClick={handleAdd}\n disabled={!newRole || addRole.isPending}\n className=\"btn-primary text-xs\"\n >\n {addRole.isPending ? '...' : 'Add Role'}\n </button>\n </div>\n </div>\n </div>\n )}\n {addRole.error && (\n <p className=\"text-2xs text-status-error mt-1\">{(addRole.error as Error).message}</p>\n )}\n </div>\n );\n}\n\nexport function BotDetailPanel({ bot }: { bot: BotRecord | null }) {\n if (!bot) {\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px]\">\n <p className=\"text-xs text-text-tertiary\">\n Select a service account to manage its API keys and roles.\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px] space-y-6\">\n <div>\n <p className=\"text-sm text-text-primary\">{bot.display_name || bot.external_id}</p>\n {bot.description && (\n <p className=\"text-xs text-text-tertiary mt-0.5\">{bot.description}</p>\n )}\n </div>\n\n <ApiKeysSection botId={bot.id} />\n <RolesSection bot={bot} />\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { Pencil, Trash2 } from 'lucide-react';\nimport { useBots, useDeleteBot } from '../../../api/bots';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect, FilterInput } from '../../../components/common/data/FilterBar';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { DateValue } from '../../../components/common/display/DateValue';\nimport type { BotRecord } from '../../../api/types';\nimport { CreateBotModal } from './CreateBotModal';\nimport { EditBotModal } from './EditBotModal';\nimport { BotDetailPanel } from './BotDetailPanel';\n\nconst statusDot: Record<string, string> = {\n active: 'bg-status-success',\n inactive: 'bg-text-tertiary',\n suspended: 'bg-status-error',\n};\n\nconst statusOptions = [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'suspended', label: 'Suspended' },\n];\n\nexport function BotsPage({ embedded = false }: { embedded?: boolean }) {\n // Same filter surface as the User Accounts tab: search + status, both\n // URL-driven and resolved server-side (never a client-side pass over a\n // paginated page).\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { status: '', search: '' },\n });\n const deleteBot = useDeleteBot();\n\n const [showCreate, setShowCreate] = useState(false);\n const [editingBot, setEditingBot] = useState<BotRecord | null>(null);\n const [selectedBot, setSelectedBot] = useState<BotRecord | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<BotRecord | null>(null);\n\n const { data, isLoading } = useBots({\n status: filters.status || undefined,\n search: filters.search || undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n const bots = data?.bots ?? [];\n\n const activeBot = useMemo(() => {\n if (!selectedBot) return null;\n return bots.find((b) => b.id === selectedBot.id) ?? selectedBot;\n }, [bots, selectedBot]);\n\n const columns: Column<BotRecord>[] = [\n {\n key: 'display_name',\n label: 'Service Account',\n render: (row) => (\n <div className=\"flex items-center gap-2.5\">\n <span\n className={`w-2.5 h-2.5 rounded-full dot-ring shrink-0 ${statusDot[row.status] ?? 'bg-status-pending'}`}\n title={row.status}\n />\n <span className=\"text-sm text-text-primary whitespace-nowrap\">\n {row.display_name || row.external_id}\n </span>\n </div>\n ),\n },\n {\n key: 'description',\n label: 'Description',\n render: (row) => (\n <span\n className=\"block max-w-[32rem] truncate text-xs text-text-tertiary\"\n title={row.description ?? undefined}\n >\n {row.description ?? ''}\n </span>\n ),\n },\n {\n key: 'roles',\n label: 'Roles',\n render: (row) => (\n <div className=\"flex gap-1 flex-wrap\">\n {(row.roles ?? []).map((r) => (\n <RolePill key={r.role} role={r.role} />\n ))}\n </div>\n ),\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <DateValue date={row.created_at} />,\n className: 'w-36 whitespace-nowrap',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Pencil}\n title=\"Edit service account\"\n onClick={() => setEditingBot(row)}\n />\n <RowAction\n icon={Trash2}\n title=\"Delete service account\"\n onClick={() => setConfirmDelete(row)}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteBot.mutate(confirmDelete.id, {\n onSuccess: () => {\n setConfirmDelete(null);\n if (selectedBot?.id === confirmDelete.id) setSelectedBot(null);\n },\n });\n };\n\n return (\n <div>\n {embedded ? (\n <div className=\"flex justify-end mb-4\">\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add Service Account\n </button>\n </div>\n ) : (\n <PageHeader\n title=\"Service Accounts\"\n actions={\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add Service Account\n </button>\n }\n />\n )}\n\n <FilterBar>\n <FilterInput\n label=\"Search\"\n value={filters.search}\n onChange={(v) => setFilter('search', v)}\n placeholder=\"name, id, description…\"\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={statusOptions}\n />\n </FilterBar>\n\n <div className=\"grid grid-cols-1 @split:grid-cols-[1fr_360px] gap-6 items-start\">\n <div className=\"overflow-x-clip\">\n <DataTable\n columns={columns}\n data={bots}\n keyFn={(row) => row.id}\n isLoading={isLoading}\n emptyMessage=\"No service accounts yet\"\n onRowClick={(row) => setSelectedBot(row)}\n activeRowKey={activeBot?.id ?? null}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n\n <div className=\"sticky top-4\">\n <BotDetailPanel bot={activeBot} />\n </div>\n </div>\n\n <CreateBotModal open={showCreate} onClose={() => setShowCreate(false)} />\n\n <EditBotModal\n open={!!editingBot}\n onClose={() => setEditingBot(null)}\n bot={editingBot}\n />\n\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete Service Account\"\n description={\n <>\n Delete{' '}\n <span className=\"font-medium text-text-primary\">\n {confirmDelete?.display_name || confirmDelete?.external_id}\n </span>\n ? This will also revoke all API keys. This action cannot be undone.\n </>\n }\n isPending={deleteBot.isPending}\n error={deleteBot.error as Error | null}\n />\n </div>\n );\n}\n","import { useState } from 'react';\nimport { KeyRound } from 'lucide-react';\n\n/** One atomic patch: deleting is explicit, an absent key means keep. */\nexport interface PropertyOps {\n set?: Record<string, unknown>;\n remove?: string[];\n rename?: Record<string, string>;\n}\n\n/**\n * A generic key/value dictionary editor that emits ATOMIC patch ops — it\n * never round-trips the whole dictionary, so editing one property can never\n * clobber another. Dictionary-agnostic by design: the owner wires `onPatch`\n * to whichever properties surface it manages (user properties today; any\n * dictionary with a patch endpoint tomorrow).\n *\n * - Add / edit value / rename key / delete (with confirm), one op at a time.\n * - Values JSON-parse with a string fallback, so numbers, booleans, and\n * objects round-trip typed.\n * - `systemKeys` are marked (the platform reads them — e.g. badge scheme\n * facets) and their edits sit behind a confirm step.\n */\nexport function PropertiesEditor({ value, systemKeys = [], pending = false, error, onPatch }: {\n value: Record<string, unknown> | null | undefined;\n systemKeys?: string[];\n pending?: boolean;\n /** The owner's last patch error (e.g. a 409 identity conflict), shown inline. */\n error?: string | null;\n onPatch: (ops: PropertyOps) => void;\n}) {\n const entries = Object.entries(value ?? {});\n const systemSet = new Set(systemKeys);\n\n const [editingKey, setEditingKey] = useState<string | null>(null);\n const [draftName, setDraftName] = useState('');\n const [draftValue, setDraftValue] = useState('');\n const [pendingRemove, setPendingRemove] = useState<string | null>(null);\n const [confirmSystem, setConfirmSystem] = useState<string | null>(null);\n const [ghostName, setGhostName] = useState('');\n const [ghostValue, setGhostValue] = useState('');\n const [inlineError, setInlineError] = useState<string | null>(null);\n\n const format = (v: unknown) => (typeof v === 'string' ? v : JSON.stringify(v));\n const parse = (raw: string): unknown => {\n const trimmed = raw.trim();\n try { return JSON.parse(trimmed); } catch { return trimmed; }\n };\n\n function startEdit(key: string) {\n if (systemSet.has(key) && confirmSystem !== key) {\n setConfirmSystem(key);\n return;\n }\n setConfirmSystem(null);\n setEditingKey(key);\n setDraftName(key);\n setDraftValue(format((value ?? {})[key]));\n setPendingRemove(null);\n setInlineError(null);\n }\n\n function commitEdit() {\n if (editingKey === null) return;\n const name = draftName.trim();\n if (!name) { setInlineError('Property name is required'); return; }\n if (name !== editingKey && entries.some(([k]) => k === name)) {\n setInlineError(`\"${name}\" already exists`);\n return;\n }\n const ops: PropertyOps = {};\n if (name !== editingKey) ops.rename = { [editingKey]: name };\n const nextValue = parse(draftValue);\n if (format(nextValue) !== format((value ?? {})[editingKey]) || name !== editingKey) {\n // A renamed key keeps its value unless the value also changed; a value\n // change lands under the (possibly new) name — one atomic patch.\n if (format(nextValue) !== format((value ?? {})[editingKey])) {\n ops.set = { [name]: nextValue };\n }\n }\n if (!ops.set && !ops.rename) { cancelEdit(); return; }\n onPatch(ops);\n cancelEdit();\n }\n\n function cancelEdit() {\n setEditingKey(null);\n setDraftName('');\n setDraftValue('');\n setInlineError(null);\n }\n\n function commitAdd() {\n const name = ghostName.trim();\n if (!name) { setInlineError('Property name is required'); return; }\n if (entries.some(([k]) => k === name)) {\n setInlineError(`\"${name}\" already exists`);\n return;\n }\n onPatch({ set: { [name]: parse(ghostValue) } });\n setGhostName('');\n setGhostValue('');\n setInlineError(null);\n }\n\n return (\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary\">\n Properties\n </p>\n\n {entries.length === 0 && (\n <p className=\"text-xs text-text-tertiary italic\">No properties — add one below.</p>\n )}\n\n {entries.map(([key, val]) => {\n const isSystem = systemSet.has(key);\n const isEditing = editingKey === key;\n const isRemoving = pendingRemove === key;\n return (\n <div key={key} className=\"group text-xs\">\n {isEditing ? (\n <div className=\"space-y-1.5 border-l-2 border-l-accent pl-2\">\n <input\n value={draftName}\n onChange={(e) => setDraftName(e.target.value)}\n aria-label=\"Property name\"\n className=\"input text-xs w-full min-w-0 font-mono\"\n />\n <input\n value={draftValue}\n onChange={(e) => setDraftValue(e.target.value)}\n aria-label=\"Property value\"\n placeholder=\"value (string or JSON)\"\n className=\"input text-xs w-full min-w-0\"\n />\n <div className=\"flex gap-2\">\n <button onClick={commitEdit} disabled={pending} className=\"text-2xs font-medium text-accent hover:text-accent-hover\">\n {pending ? 'Saving...' : 'Save'}\n </button>\n <button onClick={cancelEdit} className=\"text-2xs text-text-tertiary hover:text-text-secondary\">Cancel</button>\n <button\n onClick={() => { setPendingRemove(key); setEditingKey(null); }}\n className=\"text-2xs text-status-error/50 hover:text-status-error ml-auto\"\n >\n Remove\n </button>\n </div>\n </div>\n ) : isRemoving ? (\n <span className=\"flex items-center gap-2 text-2xs\">\n <span className=\"text-status-error\">Remove <span className=\"font-medium font-mono\">{key}</span>?</span>\n <button\n onClick={() => { onPatch({ remove: [key] }); setPendingRemove(null); }}\n disabled={pending}\n className=\"font-medium text-status-error hover:text-status-error/80\"\n >\n {pending ? '...' : 'Yes'}\n </button>\n <button onClick={() => setPendingRemove(null)} className=\"text-text-tertiary hover:text-text-secondary\">No</button>\n </span>\n ) : confirmSystem === key ? (\n <span className=\"flex items-center gap-2 text-2xs\">\n <span className=\"text-text-secondary\">\n <span className=\"font-mono font-medium\">{key}</span> is a system property — the platform resolves identities with it. Edit?\n </span>\n <button onClick={() => startEdit(key)} className=\"font-medium text-accent hover:text-accent-hover\">Edit</button>\n <button onClick={() => setConfirmSystem(null)} className=\"text-text-tertiary hover:text-text-secondary\">Cancel</button>\n </span>\n ) : (\n <button\n onClick={() => startEdit(key)}\n className=\"flex items-center gap-2 w-full min-w-0 text-left rounded px-1 py-0.5 -mx-1 hover:bg-surface-hover transition-colors\"\n title={`Edit ${key}`}\n >\n <span className=\"font-mono font-medium text-text-secondary shrink-0\">{key}</span>\n {isSystem && (\n <span className=\"shrink-0 text-accent/80\" title=\"system\">\n <KeyRound className=\"w-3 h-3\" aria-label=\"system\" />\n </span>\n )}\n {/* Value right-aligns so the section reads tabular. */}\n <span className=\"flex-1 min-w-0 truncate text-right text-text-primary tabular-nums\">{format(val)}</span>\n </button>\n )}\n </div>\n );\n })}\n\n {/* Add row */}\n <div className=\"pt-1.5 border-t border-surface-border space-y-1.5\">\n <div className=\"grid grid-cols-2 gap-2\">\n <input\n value={ghostName}\n onChange={(e) => setGhostName(e.target.value)}\n placeholder=\"property\"\n aria-label=\"New property name\"\n className=\"input text-xs w-full min-w-0 font-mono\"\n />\n <input\n value={ghostValue}\n onChange={(e) => setGhostValue(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') commitAdd(); }}\n placeholder=\"value\"\n aria-label=\"New property value\"\n className=\"input text-xs w-full min-w-0\"\n />\n </div>\n {ghostName.trim() && (\n <div className=\"flex justify-end\">\n <button onClick={commitAdd} disabled={pending} className=\"btn-primary text-xs\">\n {pending ? '...' : 'Add Property'}\n </button>\n </div>\n )}\n </div>\n\n {(inlineError || error) && (\n <p role=\"alert\" className=\"text-2xs text-status-error\">{inlineError || error}</p>\n )}\n </div>\n );\n}\n","import type { LTReadScope, LTWriteScope } from '../api/types';\n\n// The work-surface scope a `member` carries, presented as named grants. Each\n// preset is a point in the (read, write) lattice (write ⊆ read). admin/superadmin\n// always act on all and never show a scope picker.\nexport interface ScopePreset {\n value: string; // `${read}|${write}`\n label: string;\n read_scope: LTReadScope;\n write_scope: LTWriteScope;\n}\n\n// Labels are parallel and structured around the two axes (see / act) so the\n// difference between profiles is scannable, not a run-on sentence.\nexport const SCOPE_PRESETS: ScopePreset[] = [\n { value: 'all|all', label: 'See all · act on all', read_scope: 'all', write_scope: 'all' },\n { value: 'all|self', label: 'See all · act on self', read_scope: 'all', write_scope: 'self' },\n { value: 'self|self', label: 'See self · act on self', read_scope: 'self', write_scope: 'self' },\n { value: 'all|none', label: 'See all · read-only', read_scope: 'all', write_scope: 'none' },\n { value: 'self|none', label: 'See self · read-only', read_scope: 'self', write_scope: 'none' },\n];\n\nexport const DEFAULT_SCOPE_VALUE = 'all|all';\n\nexport function scopeKey(read: LTReadScope, write: LTWriteScope): string {\n return `${read}|${write}`;\n}\n\nexport function scopePreset(value: string): ScopePreset {\n return SCOPE_PRESETS.find((p) => p.value === value) ?? SCOPE_PRESETS[0];\n}\n","import { useState, useMemo } from 'react';\nimport { Drama } from 'lucide-react';\nimport { Link } from 'react-router-dom';\nimport { useRoles } from '../../../api/roles';\nimport { useAddUserRole, useRemoveUserRole, usePatchUserProperties, useSystemPropertyKeys } from '../../../api/users';\nimport { PropertiesEditor } from '../../../components/common/form/PropertiesEditor';\nimport {\n usePersonas,\n useUserPersonas,\n useAssignPersona,\n useUnassignPersona,\n} from '../../../api/personas';\nimport type { LTUserRecord, LTRoleType } from '../../../api/types';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { ScopeBadge } from '../../../components/common/display/ScopeBadge';\nimport {\n SCOPE_PRESETS,\n DEFAULT_SCOPE_VALUE,\n scopePreset,\n} from '../../../lib/roleScope';\n\n/**\n * The panel's section surface — the same distinct-surface treatment the\n * resolver form's SectionGroup uses, so the three blocks read as sections,\n * not a run of text.\n */\nfunction PanelSection({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"border border-surface-border bg-surface-sunken rounded-[var(--lt-radius-section)] p-4\">\n {children}\n </div>\n );\n}\n\n/**\n * The user's properties dictionary (lt_users.metadata) as an editable\n * key/value table. Every edit is ONE atomic patch — changing a property can\n * never clobber its siblings, and a rename never opens a key-absent window.\n * Identity-binding keys (badge scheme facets) are marked as system\n * properties; a duplicate identity value answers a 409 shown inline.\n */\nfunction PropertiesBlock({ user }: { user: LTUserRecord }) {\n const patch = usePatchUserProperties();\n const { data: systemKeys } = useSystemPropertyKeys();\n\n return (\n <PanelSection>\n <PropertiesEditor\n value={user.metadata ?? {}}\n systemKeys={systemKeys?.keys ?? []}\n pending={patch.isPending}\n error={patch.error ? (patch.error as Error).message : null}\n onPatch={(ops) => patch.mutate({ id: user.id, ops })}\n />\n </PanelSection>\n );\n}\n\n/**\n * Persona assignment for the selected user. A persona is shorthand for scoped\n * role memberships — assigning one composes the user's whole surface; the\n * membership list below reflects the fan-out (rows marked with the sustaining\n * persona's key).\n */\nfunction PersonaBlock({ user }: { user: LTUserRecord }) {\n const { data: allPersonas } = usePersonas();\n const { data: held } = useUserPersonas(user.id);\n const assign = useAssignPersona();\n const unassign = useUnassignPersona();\n const [newPersona, setNewPersona] = useState('');\n\n const heldPersonas = held?.personas ?? [];\n const available = useMemo(() => {\n const keys = new Set(heldPersonas.map((p) => p.key));\n return (allPersonas?.personas ?? []).filter((p) => !keys.has(p.key));\n }, [allPersonas, heldPersonas]);\n\n if (heldPersonas.length === 0 && available.length === 0) return null;\n\n return (\n <PanelSection>\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary\">\n Personas\n </p>\n {heldPersonas.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n {heldPersonas.map((p) => (\n <span\n key={p.key}\n className=\"flex items-center gap-2.5 w-full min-w-0 pl-2.5 pr-2 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary\"\n >\n <Drama className=\"w-3 h-3 shrink-0 text-text-tertiary\" aria-hidden />\n <Link\n to={`/admin/personas/${encodeURIComponent(p.key)}`}\n className=\"flex-1 min-w-0 truncate transition-colors hover:text-accent\"\n title={p.key}\n >\n {p.title || p.key}\n </Link>\n <span className=\"shrink-0 text-2xs text-text-tertiary tabular-nums\">\n {p.roles.length} role{p.roles.length === 1 ? '' : 's'}\n </span>\n <button\n onClick={() => unassign.mutate({ userId: user.id, key: p.key })}\n className=\"shrink-0 text-text-tertiary hover:text-status-error transition-colors ml-1\"\n title={`Unassign ${p.title || p.key}`}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n {available.length > 0 && (\n <div className=\"flex gap-2\">\n <select\n value={newPersona}\n onChange={(e) => setNewPersona(e.target.value)}\n className=\"select text-xs w-full min-w-0\"\n aria-label=\"Persona\"\n >\n <option value=\"\">Assign a persona...</option>\n {available.map((p) => (\n <option key={p.key} value={p.key}>{p.title || p.key}</option>\n ))}\n </select>\n <button\n onClick={() => {\n if (!newPersona) return;\n assign.mutate(\n { userId: user.id, key: newPersona },\n { onSuccess: () => setNewPersona('') },\n );\n }}\n disabled={!newPersona || assign.isPending}\n className=\"btn-primary text-xs shrink-0\"\n >\n {assign.isPending ? '...' : 'Assign'}\n </button>\n </div>\n )}\n {(assign.error || unassign.error) && (\n <p className=\"text-2xs text-status-error\">\n {((assign.error || unassign.error) as Error).message}\n </p>\n )}\n </div>\n </PanelSection>\n );\n}\n\nexport function RolePanel({ user }: { user: LTUserRecord | null }) {\n const { data: allRolesData } = useRoles();\n const addRole = useAddUserRole();\n const removeRole = useRemoveUserRole();\n const [newRole, setNewRole] = useState('');\n const [newType, setNewType] = useState<LTRoleType>('member');\n // Work-surface scope applies to `member`; admin/superadmin act on the whole queue.\n const [newScope, setNewScope] = useState(DEFAULT_SCOPE_VALUE);\n\n const allRoles = allRolesData?.roles ?? [];\n const currentRoles = user?.roles ?? [];\n\n const available = useMemo(() => {\n const assigned = new Set(currentRoles.map((r) => r.role));\n return allRoles.filter((r) => !assigned.has(r));\n }, [allRoles, currentRoles]);\n\n const handleAdd = () => {\n if (!user || !newRole.trim()) return;\n const preset = newType === 'member' ? scopePreset(newScope) : scopePreset(DEFAULT_SCOPE_VALUE);\n addRole.mutate(\n {\n userId: user.id,\n role: newRole.trim(),\n type: newType,\n read_scope: preset.read_scope,\n write_scope: preset.write_scope,\n },\n { onSuccess: () => { setNewRole(''); setNewType('member'); setNewScope(DEFAULT_SCOPE_VALUE); } },\n );\n };\n\n const handleRemove = (role: string) => {\n if (!user) return;\n removeRole.mutate({ userId: user.id, role });\n };\n\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 pb-8 min-h-[300px]\">\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-4\">\n Role Membership\n </p>\n\n {!user ? (\n <p className=\"text-xs text-text-tertiary\">\n Select a user to manage their roles.\n </p>\n ) : (\n <div className=\"space-y-6\">\n <div>\n <p className=\"text-sm text-text-primary\">{user.display_name || user.external_id}</p>\n </div>\n\n <PersonaBlock user={user} />\n\n {/* Roles section — membership list plus the add form. */}\n <PanelSection>\n <div className=\"space-y-4\">\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary\">Roles</p>\n\n {currentRoles.length === 0 ? (\n <p className=\"text-xs text-text-tertiary\">No roles assigned.</p>\n ) : (\n <div className=\"flex flex-col gap-2\">\n {currentRoles.map((r) => (\n <span\n key={r.role}\n className=\"flex items-center gap-2.5 w-full min-w-0 pl-2.5 pr-2 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary\"\n >\n {/* The universal role pill leads and truncates; the fixed\n facts (type, scope, remove) keep their width so columns\n align across stacked rows. */}\n <span className=\"flex-1 min-w-0 truncate\" title={r.role}>\n <RolePill role={r.role} tone=\"inherit\" />\n </span>\n <span className=\"w-14 shrink-0 text-2xs uppercase tracking-wide text-text-tertiary\">{r.type}</span>\n {r.type === 'member' && (\n <>\n <span className=\"w-px h-3 bg-surface-border shrink-0\" aria-hidden />\n <ScopeBadge read={r.read_scope} write={r.write_scope} className=\"shrink-0\" />\n </>\n )}\n {r.granted_by_persona && (\n <span\n className=\"shrink-0\"\n title={`Granted by persona ${r.granted_by_persona}`}\n >\n <Drama className=\"w-3 h-3 text-text-tertiary\" aria-hidden />\n </span>\n )}\n <button\n onClick={() => handleRemove(r.role)}\n className=\"shrink-0 text-text-tertiary hover:text-status-error transition-colors ml-1\"\n title={`Remove ${r.role}`}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n\n {available.length > 0 && (\n <div className=\"pt-3 border-t border-surface-border space-y-2\">\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary\">\n Add Role\n </p>\n {/* Stacked, label-over-control fields (the app's form pattern) —\n every control is w-full/min-w-0, so a long role key or scope\n label can never widen the column or push the button away. */}\n <select\n value={newRole}\n onChange={(e) => setNewRole(e.target.value)}\n className=\"select text-xs font-mono w-full min-w-0\"\n aria-label=\"Role\"\n >\n <option value=\"\">Select a role...</option>\n {available.map((r) => (\n <option key={r} value={r}>{r}</option>\n ))}\n </select>\n <div className=\"grid grid-cols-2 gap-2\">\n <div className=\"min-w-0\">\n <label className=\"block text-2xs text-text-tertiary mb-1\">Type</label>\n <select\n value={newType}\n onChange={(e) => setNewType(e.target.value as LTRoleType)}\n className=\"select text-xs w-full min-w-0\"\n aria-label=\"Role type\"\n >\n <option value=\"member\">member</option>\n <option value=\"admin\">admin</option>\n <option value=\"superadmin\">superadmin</option>\n </select>\n </div>\n {newType === 'member' && (\n <div className=\"min-w-0\">\n <label className=\"block text-2xs text-text-tertiary mb-1\">Scope</label>\n <select\n value={newScope}\n onChange={(e) => setNewScope(e.target.value)}\n className=\"select text-xs w-full min-w-0\"\n aria-label=\"Work-surface scope\"\n >\n {SCOPE_PRESETS.map((p) => (\n <option key={p.value} value={p.value}>{p.label}</option>\n ))}\n </select>\n </div>\n )}\n </div>\n <div className=\"flex justify-end pt-1\">\n <button\n onClick={handleAdd}\n disabled={!newRole || addRole.isPending}\n className=\"btn-primary text-xs\"\n >\n {addRole.isPending ? '...' : 'Add Role'}\n </button>\n </div>\n {addRole.error && (\n <p className=\"text-2xs text-status-error\">{(addRole.error as Error).message}</p>\n )}\n </div>\n )}\n </div>\n </PanelSection>\n\n <PropertiesBlock user={user} />\n </div>\n )}\n </div>\n );\n}\n","import { User, Bot } from 'lucide-react';\nimport { SegmentedTabs } from '../../../components/common/layout/SegmentedTabs';\n\nexport type AccountTab = 'users' | 'service-accounts';\n\nexport function AccountTabToggle({ active, onChange }: { active: AccountTab; onChange: (t: AccountTab) => void }) {\n return (\n <SegmentedTabs<AccountTab>\n aria-label=\"Account kind\"\n active={active}\n onChange={onChange}\n tabs={[\n { key: 'users', label: 'User Accounts', icon: <User className=\"w-3.5 h-3.5\" /> },\n { key: 'service-accounts', label: 'Service Accounts', icon: <Bot className=\"w-3.5 h-3.5\" /> },\n ]}\n />\n );\n}\n","import { useState, useMemo } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { Pencil, Trash2 } from 'lucide-react';\nimport { useAccess } from '../../../hooks/useAccess';\nimport { useUsers, useDeleteUser } from '../../../api/users';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect, FilterInput } from '../../../components/common/data/FilterBar';\nimport { DateValue } from '../../../components/common/display/DateValue';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport type { LTUserRecord } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { CreateUserModal } from './CreateUserModal';\nimport { EditUserModal } from './EditUserModal';\nimport { BotsPage } from '../bots/BotsPage';\nimport { RolePanel } from './RolePanel';\nimport { AccountTabToggle, type AccountTab } from './AccountTabToggle';\n\nconst statusOptions = [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'suspended', label: 'Suspended' },\n];\n\nconst statusDot: Record<string, string> = {\n active: 'bg-status-success',\n inactive: 'bg-text-tertiary',\n suspended: 'bg-status-error',\n};\n\nexport function UsersPage() {\n const { isBuilder } = useAccess();\n const [searchParams, setSearchParams] = useSearchParams();\n const tabParam = searchParams.get('tab');\n const activeTab: AccountTab = (isBuilder && tabParam === 'service-accounts') ? 'service-accounts' : 'users';\n\n const handleTabChange = (tab: AccountTab) => {\n if (tab === 'users') {\n setSearchParams({});\n } else {\n setSearchParams({ tab });\n }\n };\n\n return (\n <div>\n <PageHeader\n title=\"Accounts\"\n docsHash=\"#docs:dashboard.md:accounts\"\n actions={isBuilder ? <AccountTabToggle active={activeTab} onChange={handleTabChange} /> : undefined}\n />\n {activeTab === 'users' ? <UserAccountsPanel /> : <BotsPage embedded />}\n </div>\n );\n}\n\nfunction UserAccountsPanel() {\n const { isBuilder } = useAccess();\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { status: '', search: '' },\n });\n const deleteUser = useDeleteUser();\n\n const [showCreate, setShowCreate] = useState(false);\n const [editingUser, setEditingUser] = useState<LTUserRecord | null>(null);\n const [selectedUser, setSelectedUser] = useState<LTUserRecord | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<LTUserRecord | null>(null);\n\n const { data, isLoading } = useUsers({\n status: filters.status || undefined,\n search: filters.search || undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n const users = data?.users ?? [];\n\n const activeUser = useMemo(() => {\n if (!selectedUser) return null;\n return users.find((u) => u.id === selectedUser.id) ?? selectedUser;\n }, [users, selectedUser]);\n\n const columns: Column<LTUserRecord>[] = [\n {\n key: 'display_name',\n label: 'User',\n render: (row) => (\n <div className=\"flex items-center gap-2.5\">\n <span\n className={`w-2.5 h-2.5 rounded-full dot-ring shrink-0 ${statusDot[row.status] ?? 'bg-status-pending'}`}\n title={row.status}\n />\n <span className=\"text-xs text-text-primary whitespace-nowrap\">\n {row.display_name || row.external_id}\n </span>\n </div>\n ),\n },\n {\n key: 'email',\n label: 'Email',\n render: (row) =>\n row.email ? (\n <span className=\"text-xs text-text-secondary whitespace-nowrap\">{row.email}</span>\n ) : (\n <span className=\"text-xs text-text-quaternary\">—</span>\n ),\n },\n {\n key: 'roles',\n label: 'Roles',\n render: (row) => (\n <div className=\"flex gap-2 flex-wrap\">\n {(row.roles ?? []).map((r) => (\n <RolePill key={r.role} role={r.role} size=\"md\" />\n ))}\n </div>\n ),\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <DateValue date={row.created_at} />,\n className: 'w-36 whitespace-nowrap',\n },\n ...(isBuilder ? [{\n key: 'actions' as const,\n label: '',\n render: (row: LTUserRecord) => (\n <RowActionGroup>\n <RowAction\n icon={Pencil}\n title=\"Edit user\"\n onClick={() => setEditingUser(row)}\n />\n <RowAction\n icon={Trash2}\n title=\"Delete user\"\n onClick={() => setConfirmDelete(row)}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n }] : []),\n ];\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteUser.mutate(confirmDelete.id, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n return (\n <div>\n {isBuilder && (\n <div className=\"flex justify-end mb-4\">\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add User\n </button>\n </div>\n )}\n\n {/* Same filter surface as the Service Accounts tab: search + status. */}\n <FilterBar>\n <FilterInput\n label=\"Search\"\n value={filters.search}\n onChange={(v) => setFilter('search', v)}\n placeholder=\"name, email, id…\"\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={statusOptions}\n />\n </FilterBar>\n\n {/* 360px right column — same width as the Service Accounts tab's panel\n (BotsPage), so the two Accounts tabs share one layout rhythm. */}\n <div className=\"grid grid-cols-1 @split:grid-cols-[1fr_460px] gap-6 items-start\">\n {/* Left — users table */}\n <div className=\"overflow-x-clip\">\n <DataTable\n columns={columns}\n data={users}\n keyFn={(row) => row.id}\n isLoading={isLoading}\n emptyMessage=\"No users found\"\n onRowClick={(row) => setSelectedUser(row)}\n activeRowKey={activeUser?.id ?? null}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n\n {/* Right — role management panel */}\n <div className=\"sticky top-4\">\n <RolePanel user={activeUser} />\n </div>\n </div>\n\n <CreateUserModal open={showCreate} onClose={() => setShowCreate(false)} />\n\n <EditUserModal\n open={!!editingUser}\n onClose={() => setEditingUser(null)}\n user={editingUser}\n />\n\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete User\"\n description={\n <>\n Delete{' '}\n <span className=\"font-medium text-text-primary\">\n {confirmDelete?.display_name || confirmDelete?.external_id}\n </span>\n ? This action cannot be undone.\n </>\n }\n isPending={deleteUser.isPending}\n error={deleteUser.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["CreateUserModal","open","onClose","createUser","useCreateUser","form","setForm","useState","prevOpen","setPrevOpen","handleCreate","set","field","value","f","jsx","Modal","jsxs","e","EditUserModal","user","updateUser","useUpdateUser","prevUser","setPrevUser","handleSave","CreateBotModal","createBot","useCreateBot","EditBotModal","bot","updateBot","useUpdateBot","prevBot","setPrevBot","ApiKeysSection","botId","data","useBotApiKeys","createKey","useCreateBotApiKey","revokeKey","useRevokeBotApiKey","newKeyName","setNewKeyName","selectedScope","setSelectedScope","generatedKey","setGeneratedKey","copied","setCopied","confirmRevoke","setConfirmRevoke","keys","SCOPE_PRESETS","handleGenerate","result","handleCopy","handleRevoke","Check","Copy","k","Key","s","TimeAgo","Trash2","key","preset","Plus","ConfirmDeleteModal","Fragment","RolesSection","allRolesData","useRoles","addRole","useAddBotRole","removeRole","useRemoveBotRole","newRole","setNewRole","newType","setNewType","allRoles","currentRoles","available","useMemo","assigned","r","handleAdd","handleRemove","role","RolePill","BotDetailPanel","statusDot","statusOptions","BotsPage","embedded","filters","setFilter","pagination","useFilterParams","deleteBot","useDeleteBot","showCreate","setShowCreate","editingBot","setEditingBot","selectedBot","setSelectedBot","confirmDelete","setConfirmDelete","isLoading","useBots","total","bots","activeBot","b","columns","row","DateValue","RowActionGroup","RowAction","Pencil","handleDelete","PageHeader","FilterBar","FilterInput","v","FilterSelect","DataTable","StickyPagination","PropertiesEditor","systemKeys","pending","error","onPatch","entries","systemSet","editingKey","setEditingKey","draftName","setDraftName","draftValue","setDraftValue","pendingRemove","setPendingRemove","confirmSystem","setConfirmSystem","ghostName","setGhostName","ghostValue","setGhostValue","inlineError","setInlineError","format","parse","raw","trimmed","startEdit","commitEdit","name","ops","nextValue","cancelEdit","commitAdd","val","isSystem","isEditing","isRemoving","KeyRound","DEFAULT_SCOPE_VALUE","scopePreset","p","PanelSection","children","PropertiesBlock","patch","usePatchUserProperties","useSystemPropertyKeys","PersonaBlock","allPersonas","usePersonas","held","useUserPersonas","assign","useAssignPersona","unassign","useUnassignPersona","newPersona","setNewPersona","heldPersonas","Drama","Link","RolePanel","useAddUserRole","useRemoveUserRole","newScope","setNewScope","ScopeBadge","AccountTabToggle","active","onChange","SegmentedTabs","User","Bot","UsersPage","isBuilder","useAccess","searchParams","setSearchParams","useSearchParams","tabParam","activeTab","handleTabChange","tab","UserAccountsPanel","deleteUser","useDeleteUser","editingUser","setEditingUser","selectedUser","setSelectedUser","useUsers","users","activeUser","u"],"mappings":"6oCAIO,SAASA,GAAgB,CAC9B,KAAAC,EACA,QAAAC,CACF,EAGG,CACD,MAAMC,EAAaC,GAAA,EACb,CAACC,EAAMC,CAAO,EAAIC,WAAS,CAC/B,YAAa,GACb,MAAO,GACP,aAAc,GACd,SAAU,EAAA,CACX,EAEK,CAACC,EAAUC,CAAW,EAAIF,EAAAA,SAASN,CAAI,EACzCA,IAASO,IACXC,EAAYR,CAAI,EACZA,GAAMK,EAAQ,CAAE,YAAa,GAAI,MAAO,GAAI,aAAc,GAAI,SAAU,EAAA,CAAI,GAGlF,MAAMI,EAAe,IAAM,CACpBL,EAAK,YAAY,QACtBF,EAAW,OACT,CACE,YAAaE,EAAK,YAAY,KAAA,EAC9B,MAAOA,EAAK,MAAM,KAAA,GAAU,OAC5B,aAAcA,EAAK,aAAa,KAAA,GAAU,OAC1C,SAAUA,EAAK,UAAY,MAAA,EAE7B,CAAE,UAAWH,CAAA,CAAQ,CAEzB,EAEMS,EAAM,CAACC,EAAeC,IAC1BP,EAASQ,IAAO,CAAE,GAAGA,EAAG,CAACF,CAAK,EAAGC,GAAQ,EAE3C,OACEE,EAAAA,IAACC,GAAM,KAAAf,EAAY,QAAAC,EAAkB,MAAM,cACzC,SAAAe,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAF,EAAAA,IAAC,QAAA,CAAM,UAAU,iFAAiF,SAAA,yBAElG,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOV,EAAK,YACZ,SAAWa,GAAMP,EAAI,cAAeO,EAAE,OAAO,KAAK,EAClD,YAAY,iBACZ,UAAU,sBAAA,CAAA,CACZ,EACF,SACC,MAAA,CACC,SAAA,CAAAH,EAAAA,IAAC,QAAA,CAAM,UAAU,iFAAiF,SAAA,eAElG,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOV,EAAK,aACZ,SAAWa,GAAMP,EAAI,eAAgBO,EAAE,OAAO,KAAK,EACnD,YAAY,WACZ,UAAU,sBAAA,CAAA,CACZ,EACF,SACC,MAAA,CACC,SAAA,CAAAH,EAAAA,IAAC,QAAA,CAAM,UAAU,iFAAiF,SAAA,QAElG,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOV,EAAK,MACZ,SAAWa,GAAMP,EAAI,QAASO,EAAE,OAAO,KAAK,EAC5C,YAAY,mBACZ,UAAU,sBAAA,CAAA,CACZ,EACF,SACC,MAAA,CACC,SAAA,CAAAH,EAAAA,IAAC,QAAA,CAAM,UAAU,iFAAiF,SAAA,WAElG,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,WACL,MAAOV,EAAK,SACZ,SAAWa,GAAMP,EAAI,WAAYO,EAAE,OAAO,KAAK,EAC/C,YAAY,8BACZ,UAAU,sBAAA,CAAA,CACZ,EACF,EAECf,EAAW,OACVY,MAAC,IAAA,CAAE,UAAU,4BAA8B,SAAAZ,EAAW,MAAgB,OAAA,CAAQ,EAGhFc,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAF,MAAC,SAAA,CAAO,QAASb,EAAS,UAAU,wBAAwB,SAAA,SAE5D,EACAa,EAAAA,IAAC,SAAA,CACC,QAASL,EACT,SAAU,CAACL,EAAK,YAAY,KAAA,GAAUF,EAAW,UACjD,UAAU,sBAET,SAAAA,EAAW,UAAY,cAAgB,QAAA,CAAA,CAC1C,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CC3GO,SAASgB,GAAc,CAC5B,KAAAlB,EACA,QAAAC,EACA,KAAAkB,CACF,EAIG,CACD,MAAMC,EAAaC,GAAA,EACb,CAACjB,EAAMC,CAAO,EAAIC,WAAS,CAC/B,aAAc,GACd,MAAO,GACP,OAAQ,QAAA,CACT,EAEK,CAACgB,EAAUC,CAAW,EAAIjB,EAAAA,SAASa,CAAI,EACzCA,IAASG,IACXC,EAAYJ,CAAI,EACZA,GACFd,EAAQ,CACN,aAAcc,EAAK,cAAgB,GACnC,MAAOA,EAAK,OAAS,GACrB,OAAQA,EAAK,MAAA,CACd,GAIL,MAAMK,EAAa,IAAM,CAClBL,GACLC,EAAW,OACT,CACE,GAAID,EAAK,GACT,aAAcf,EAAK,aAAa,KAAA,GAAU,OAC1C,MAAOA,EAAK,MAAM,KAAA,GAAU,OAC5B,OAAQA,EAAK,MAAA,EAEf,CAAE,UAAWH,CAAA,CAAQ,CAEzB,EAEA,OACEa,EAAAA,IAACC,EAAA,CACC,KAAAf,EACA,QAAAC,EACA,MAAO,WAAUkB,GAAA,YAAAA,EAAM,gBAAgBA,GAAA,YAAAA,EAAM,cAAe,EAAE,GAE9D,SAAAH,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAF,EAAAA,IAAC,QAAA,CAAM,UAAU,iFAAiF,SAAA,eAElG,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOV,EAAK,aACZ,SAAWa,GAAMZ,EAASQ,IAAO,CAAE,GAAGA,EAAG,aAAcI,EAAE,OAAO,OAAQ,EACxE,UAAU,sBAAA,CAAA,CACZ,EACF,SACC,MAAA,CACC,SAAA,CAAAH,EAAAA,IAAC,QAAA,CAAM,UAAU,iFAAiF,SAAA,QAElG,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOV,EAAK,MACZ,SAAWa,GAAMZ,EAASQ,IAAO,CAAE,GAAGA,EAAG,MAAOI,EAAE,OAAO,OAAQ,EACjE,UAAU,sBAAA,CAAA,CACZ,EACF,SACC,MAAA,CACC,SAAA,CAAAH,EAAAA,IAAC,QAAA,CAAM,UAAU,iFAAiF,SAAA,SAElG,EACAE,EAAAA,KAAC,SAAA,CACC,MAAOZ,EAAK,OACZ,SAAWa,GAAMZ,EAASQ,IAAO,CAAE,GAAGA,EAAG,OAAQI,EAAE,OAAO,OAAQ,EAClE,UAAU,wBAEV,SAAA,CAAAH,EAAAA,IAAC,SAAA,CAAO,MAAM,SAAS,SAAA,SAAM,EAC7BA,EAAAA,IAAC,SAAA,CAAO,MAAM,WAAW,SAAA,WAAQ,EACjCA,EAAAA,IAAC,SAAA,CAAO,MAAM,YAAY,SAAA,WAAA,CAAS,CAAA,CAAA,CAAA,CACrC,EACF,EAECM,EAAW,OACVN,MAAC,IAAA,CAAE,UAAU,4BAA8B,SAAAM,EAAW,MAAgB,OAAA,CAAQ,EAGhFJ,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAF,MAAC,SAAA,CAAO,QAASb,EAAS,UAAU,wBAAwB,SAAA,SAE5D,EACAa,EAAAA,IAAC,SAAA,CACC,QAASU,EACT,SAAUJ,EAAW,UACrB,UAAU,sBAET,SAAAA,EAAW,UAAY,YAAc,MAAA,CAAA,CACxC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAGN,CCzGO,SAASK,GAAe,CAC7B,KAAAzB,EACA,QAAAC,CACF,EAGG,CACD,MAAMyB,EAAYC,GAAA,EACZ,CAACvB,EAAMC,CAAO,EAAIC,WAAS,CAC/B,KAAM,GACN,aAAc,GACd,YAAa,EAAA,CACd,EAEK,CAACC,EAAUC,CAAW,EAAIF,EAAAA,SAASN,CAAI,EACzCA,IAASO,IACXC,EAAYR,CAAI,EACZA,KAAc,CAAE,KAAM,GAAI,aAAc,GAAI,YAAa,GAAI,GAGnE,MAAMS,EAAe,IAAM,CACpBL,EAAK,KAAK,QACfsB,EAAU,OACR,CACE,KAAMtB,EAAK,KAAK,KAAA,EAChB,aAAcA,EAAK,aAAa,KAAA,GAAU,OAC1C,YAAaA,EAAK,YAAY,QAAU,MAAA,EAE1C,CAAE,UAAWH,CAAA,CAAQ,CAEzB,EAEMS,EAAM,CAACC,EAAeC,IAC1BP,EAASQ,IAAO,CAAE,GAAGA,EAAG,CAACF,CAAK,EAAGC,GAAQ,EAE3C,OACEE,EAAAA,IAACC,GAAM,KAAAf,EAAY,QAAAC,EAAkB,MAAM,yBACzC,SAAAe,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAF,EAAAA,IAAC,QAAA,CAAM,UAAU,iFAAiF,SAAA,kBAElG,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOV,EAAK,KACZ,SAAWa,GAAMP,EAAI,OAAQO,EAAE,OAAO,MAAM,QAAQ,OAAQ,GAAG,EAAE,aAAa,EAC9E,YAAY,eACZ,UAAU,gCAAA,CAAA,CACZ,EACF,SACC,MAAA,CACC,SAAA,CAAAH,EAAAA,IAAC,QAAA,CAAM,UAAU,iFAAiF,SAAA,eAElG,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOV,EAAK,aACZ,SAAWa,GAAMP,EAAI,eAAgBO,EAAE,OAAO,KAAK,EACnD,YAAY,SACZ,UAAU,sBAAA,CAAA,CACZ,EACF,SACC,MAAA,CACC,SAAA,CAAAH,EAAAA,IAAC,QAAA,CAAM,UAAU,iFAAiF,SAAA,cAElG,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOV,EAAK,YACZ,SAAWa,GAAMP,EAAI,cAAeO,EAAE,OAAO,KAAK,EAClD,YAAY,2BACZ,UAAU,sBAAA,CAAA,CACZ,EACF,EAECS,EAAU,OACTZ,MAAC,IAAA,CAAE,UAAU,4BAA8B,SAAAY,EAAU,MAAgB,OAAA,CAAQ,EAG/EV,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAF,MAAC,SAAA,CAAO,QAASb,EAAS,UAAU,wBAAwB,SAAA,SAE5D,EACAa,EAAAA,IAAC,SAAA,CACC,QAASL,EACT,SAAU,CAACL,EAAK,KAAK,KAAA,GAAUsB,EAAU,UACzC,UAAU,sBAET,SAAAA,EAAU,UAAY,cAAgB,QAAA,CAAA,CACzC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CC7FO,SAASE,GAAa,CAC3B,KAAA5B,EACA,QAAAC,EACA,IAAA4B,CACF,EAIG,CACD,MAAMC,EAAYC,GAAA,EACZ,CAAC3B,EAAMC,CAAO,EAAIC,WAAS,CAC/B,aAAc,GACd,YAAa,GACb,OAAQ,QAAA,CACT,EAEK,CAAC0B,EAASC,CAAU,EAAI3B,EAAAA,SAASuB,CAAG,EACtCA,IAAQG,IACVC,EAAWJ,CAAG,EACVA,GACFxB,EAAQ,CACN,aAAcwB,EAAI,cAAgB,GAClC,YAAaA,EAAI,aAAe,GAChC,OAAQA,EAAI,MAAA,CACb,GAIL,MAAML,EAAa,IAAM,CAClBK,GACLC,EAAU,OACR,CACE,GAAID,EAAI,GACR,aAAczB,EAAK,aAAa,KAAA,GAAU,OAC1C,YAAaA,EAAK,YAAY,KAAA,GAAU,OACxC,OAAQA,EAAK,MAAA,EAEf,CAAE,UAAWH,CAAA,CAAQ,CAEzB,EAEA,OACEa,EAAAA,IAACC,EAAA,CACC,KAAAf,EACA,QAAAC,EACA,MAAO,WAAU4B,GAAA,YAAAA,EAAK,gBAAgBA,GAAA,YAAAA,EAAK,cAAe,EAAE,GAE5D,SAAAb,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAF,EAAAA,IAAC,QAAA,CAAM,UAAU,iFAAiF,SAAA,eAElG,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOV,EAAK,aACZ,SAAWa,GAAMZ,EAASQ,IAAO,CAAE,GAAGA,EAAG,aAAcI,EAAE,OAAO,OAAQ,EACxE,UAAU,sBAAA,CAAA,CACZ,EACF,SACC,MAAA,CACC,SAAA,CAAAH,EAAAA,IAAC,QAAA,CAAM,UAAU,iFAAiF,SAAA,cAElG,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOV,EAAK,YACZ,SAAWa,GAAMZ,EAASQ,IAAO,CAAE,GAAGA,EAAG,YAAaI,EAAE,OAAO,OAAQ,EACvE,UAAU,sBAAA,CAAA,CACZ,EACF,SACC,MAAA,CACC,SAAA,CAAAH,EAAAA,IAAC,QAAA,CAAM,UAAU,iFAAiF,SAAA,SAElG,EACAE,EAAAA,KAAC,SAAA,CACC,MAAOZ,EAAK,OACZ,SAAWa,GAAMZ,EAASQ,IAAO,CAAE,GAAGA,EAAG,OAAQI,EAAE,OAAO,OAAQ,EAClE,UAAU,wBAEV,SAAA,CAAAH,EAAAA,IAAC,SAAA,CAAO,MAAM,SAAS,SAAA,SAAM,EAC7BA,EAAAA,IAAC,SAAA,CAAO,MAAM,WAAW,SAAA,WAAQ,EACjCA,EAAAA,IAAC,SAAA,CAAO,MAAM,YAAY,SAAA,WAAA,CAAS,CAAA,CAAA,CAAA,CACrC,EACF,EAECgB,EAAU,OACThB,MAAC,IAAA,CAAE,UAAU,4BAA8B,SAAAgB,EAAU,MAAgB,OAAA,CAAQ,EAG/Ed,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAF,MAAC,SAAA,CAAO,QAASb,EAAS,UAAU,wBAAwB,SAAA,SAE5D,EACAa,EAAAA,IAAC,SAAA,CACC,QAASU,EACT,SAAUM,EAAU,UACpB,UAAU,sBAET,SAAAA,EAAU,UAAY,YAAc,MAAA,CAAA,CACvC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAGN,CC9FA,SAASI,GAAe,CAAE,MAAAC,GAA4B,CACpD,KAAM,CAAE,KAAAC,CAAA,EAASC,GAAcF,CAAK,EAC9BG,EAAYC,GAAA,EACZC,EAAYC,GAAA,EAEZ,CAACC,EAAYC,CAAa,EAAIrC,EAAAA,SAAS,EAAE,EACzC,CAACsC,EAAeC,CAAgB,EAAIvC,EAAAA,SAA0B,MAAM,EACpE,CAACwC,EAAcC,CAAe,EAAIzC,EAAAA,SAAwB,IAAI,EAC9D,CAAC0C,EAAQC,CAAS,EAAI3C,EAAAA,SAAS,EAAK,EACpC,CAAC4C,EAAeC,CAAgB,EAAI7C,EAAAA,SAAiC,IAAI,EAEzE8C,GAAOhB,GAAA,YAAAA,EAAM,OAAQ,CAAA,EAErBiB,EAAgB,CACpB,KAAM,CAAE,MAAO,YAAa,OAAQ,CAAC,UAAU,EAAG,KAAM,iDAAA,EACxD,KAAM,CAAE,MAAO,cAAe,OAAQ,CAAC,WAAY,UAAU,EAAG,KAAM,8BAAA,CAA+B,EAGjGC,EAAiB,IAAM,CACtBZ,EAAW,QAChBJ,EAAU,OACR,CAAE,MAAAH,EAAO,KAAMO,EAAW,KAAA,EAAQ,OAAQW,EAAcT,CAAa,EAAE,MAAA,EACvE,CACE,UAAYW,GAAgB,CAC1BR,EAAgBQ,EAAO,MAAM,EAC7BZ,EAAc,EAAE,CAClB,CAAA,CACF,CAEJ,EAEMa,EAAa,IAAM,CAClBV,IACL,UAAU,UAAU,UAAUA,CAAY,EAC1CG,EAAU,EAAI,EACd,WAAW,IAAMA,EAAU,EAAK,EAAG,GAAI,EACzC,EAEMQ,EAAe,IAAM,CACpBP,GACLV,EAAU,OACR,CAAE,MAAAL,EAAO,MAAOe,EAAc,EAAA,EAC9B,CAAE,UAAW,IAAMC,EAAiB,IAAI,CAAA,CAAE,CAE9C,EAEA,cACG,MAAA,CACC,SAAA,CAAArC,EAAAA,IAAC,IAAA,CAAE,UAAU,2EAA2E,SAAA,WAExF,EAECgC,GACC9B,EAAAA,KAAC,MAAA,CAAI,UAAU,2EACb,SAAA,CAAAF,EAAAA,IAAC,IAAA,CAAE,UAAU,kDAAkD,SAAA,oDAE/D,EACAE,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAF,EAAAA,IAAC,OAAA,CAAK,UAAU,0IACb,SAAAgC,EACH,EACAhC,EAAAA,IAAC,SAAA,CACC,QAAS0C,EACT,UAAU,sDACV,MAAM,oBAEL,SAAAR,QAAUU,GAAA,CAAM,UAAU,kCAAkC,EAAK5C,EAAAA,IAAC6C,GAAA,CAAK,UAAU,aAAA,CAAc,CAAA,CAAA,CAClG,CAAA,CACF,CAAA,EACF,EAGDP,EAAK,SAAW,EACftC,EAAAA,IAAC,IAAA,CAAE,UAAU,kCAAkC,SAAA,cAAA,CAAY,EAE3DA,MAAC,OAAI,UAAU,mBACZ,SAAAsC,EAAK,IAAKQ,GACT5C,EAAAA,KAAC,MAAA,CAEC,UAAU,8FAEV,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAAF,EAAAA,IAAC+C,GAAA,CAAI,UAAU,4BAAA,CAA6B,EAC5C/C,EAAAA,IAAC,OAAA,CAAK,UAAU,8BAA+B,WAAE,KAAK,GACpD8C,EAAE,QAAU,CAAA,GAAI,IAAKE,SACpB,OAAA,CAAa,UAAW,4CAA4CA,EAAE,SAAS,MAAM,EAAI,2CAA6C,0BAA0B,GAC9J,SAAAA,GADQA,CAEX,CACD,EACAF,EAAE,cACD5C,OAAC,OAAA,CAAK,UAAU,8BAA8B,SAAA,CAAA,QACvCF,EAAAA,IAACiD,GAAA,CAAQ,KAAMH,EAAE,YAAA,CAAc,CAAA,CAAA,CACtC,CAAA,EAEJ,EACA9C,EAAAA,IAAC,SAAA,CACC,QAAS,IAAMqC,EAAiBS,CAAC,EACjC,UAAU,sGACV,MAAM,aAEN,SAAA9C,EAAAA,IAACkD,EAAA,CAAO,UAAU,SAAA,CAAU,CAAA,CAAA,CAC9B,CAAA,EAvBKJ,EAAE,EAAA,CAyBV,EACH,EAMF5C,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAF,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAO4B,EACP,SAAWzB,GAAM0B,EAAc1B,EAAE,OAAO,KAAK,EAC7C,YAAY,cACZ,UAAU,yBAAA,CAAA,EAEZD,EAAAA,KAAC,MAAA,CAAI,UAAU,0CACb,SAAA,CAAAF,EAAAA,IAAC,MAAA,CAAI,UAAU,wEACX,SAAA,OAAO,QAAQuC,CAAa,EAAuF,IAAI,CAAC,CAACY,EAAKC,CAAM,IACpIpD,EAAAA,IAAC,SAAA,CAEC,KAAK,SACL,QAAS,IAAM+B,EAAiBoB,CAAG,EACnC,MAAOC,EAAO,KACd,UAAW,sDACTtB,IAAkBqB,EACd,8BACA,uDACN,GAEC,SAAAC,EAAO,KAAA,EAVHD,CAAA,CAYR,EACH,EACAjD,EAAAA,KAAC,SAAA,CACC,QAASsC,EACT,SAAU,CAACZ,EAAW,KAAA,GAAUJ,EAAU,UAC1C,UAAU,8DAEV,SAAA,CAAAxB,EAAAA,IAACqD,GAAA,CAAK,UAAU,SAAA,CAAU,EACzB7B,EAAU,UAAY,MAAQ,UAAA,CAAA,CAAA,CACjC,CAAA,CACF,CAAA,EACF,EACCA,EAAU,OACTxB,MAAC,IAAA,CAAE,UAAU,kCAAoC,SAAAwB,EAAU,MAAgB,OAAA,CAAQ,EAGrFxB,EAAAA,IAACsD,EAAA,CACC,KAAM,CAAC,CAAClB,EACR,QAAS,IAAMC,EAAiB,IAAI,EACpC,UAAWM,EACX,MAAM,iBACN,YACEzC,EAAAA,KAAAqD,WAAA,CAAE,SAAA,CAAA,iBACe,IACfvD,EAAAA,IAAC,OAAA,CAAK,UAAU,0CACb,0BAAe,KAClB,EAAO,kEAAA,EAET,EAEF,UAAW0B,EAAU,UACrB,MAAOA,EAAU,KAAA,CAAA,CACnB,EACF,CAEJ,CAEA,SAAS8B,GAAa,CAAE,IAAAzC,GAA2B,CACjD,KAAM,CAAE,KAAM0C,CAAA,EAAiBC,EAAA,EACzBC,EAAUC,GAAA,EACVC,EAAaC,GAAA,EACb,CAACC,EAASC,CAAU,EAAIxE,EAAAA,SAAS,EAAE,EACnC,CAACyE,EAASC,CAAU,EAAI1E,EAAAA,SAAqB,QAAQ,EAErD2E,GAAWV,GAAA,YAAAA,EAAc,QAAS,CAAA,EAClCW,EAAerD,EAAI,OAAS,CAAA,EAE5BsD,EAAYC,EAAAA,QAAQ,IAAM,CAC9B,MAAMC,EAAW,IAAI,IAAIH,EAAa,IAAKI,GAAMA,EAAE,IAAI,CAAC,EACxD,OAAOL,EAAS,OAAQK,GAAM,CAACD,EAAS,IAAIC,CAAC,CAAC,CAChD,EAAG,CAACL,EAAUC,CAAY,CAAC,EAErBK,EAAY,IAAM,CACjBV,EAAQ,QACbJ,EAAQ,OACN,CAAE,MAAO5C,EAAI,GAAI,KAAMgD,EAAQ,KAAA,EAAQ,KAAME,CAAA,EAC7C,CAAE,UAAW,IAAM,CAAED,EAAW,EAAE,EAAGE,EAAW,QAAQ,CAAG,CAAA,CAAE,CAEjE,EAEMQ,EAAgBC,GAAiB,CACrCd,EAAW,OAAO,CAAE,MAAO9C,EAAI,GAAI,KAAA4D,EAAM,CAC3C,EAEA,cACG,MAAA,CACC,SAAA,CAAA3E,EAAAA,IAAC,IAAA,CAAE,UAAU,2EAA2E,SAAA,QAExF,EAECoE,EAAa,SAAW,EACvBpE,EAAAA,IAAC,IAAA,CAAE,UAAU,kCAAkC,SAAA,oBAAA,CAAkB,EAEjEA,MAAC,OAAI,UAAU,4BACZ,SAAAoE,EAAa,IAAKI,GACjBtE,EAAAA,KAAC,OAAA,CAEC,UAAU,0GAEV,SAAA,CAAAF,EAAAA,IAAC4E,EAAA,CAAS,KAAMJ,EAAE,IAAA,CAAM,EACxBxE,EAAAA,IAAC,OAAA,CAAK,UAAU,8BAA+B,WAAE,KAAK,EACtDA,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM0E,EAAaF,EAAE,IAAI,EAClC,UAAU,sEACV,MAAO,UAAUA,EAAE,IAAI,GACxB,SAAA,GAAA,CAAA,CAED,CAAA,EAXKA,EAAE,IAAA,CAaV,EACH,EAGDH,EAAU,OAAS,GAClBnE,EAAAA,KAAC,MAAA,CAAI,UAAU,YAGb,SAAA,CAAAA,EAAAA,KAAC,SAAA,CACC,MAAO6D,EACP,SAAW5D,GAAM6D,EAAW7D,EAAE,OAAO,KAAK,EAC1C,UAAU,0CACV,aAAW,OAEX,SAAA,CAAAH,EAAAA,IAAC,SAAA,CAAO,MAAM,GAAG,SAAA,mBAAgB,EAChCqE,EAAU,IAAKG,GACdxE,EAAAA,IAAC,UAAe,MAAOwE,EAAI,SAAAA,CAAA,EAAdA,CAAgB,CAC9B,CAAA,CAAA,CAAA,EAEHtE,EAAAA,KAAC,MAAA,CAAI,UAAU,mCACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,UACb,SAAA,CAAAF,EAAAA,IAAC,QAAA,CAAM,UAAU,yCAAyC,SAAA,OAAI,EAC9DE,EAAAA,KAAC,SAAA,CACC,MAAO+D,EACP,SAAW9D,GAAM+D,EAAW/D,EAAE,OAAO,KAAmB,EACxD,UAAU,gCACV,aAAW,YAEX,SAAA,CAAAH,EAAAA,IAAC,SAAA,CAAO,MAAM,SAAS,SAAA,SAAM,EAC7BA,EAAAA,IAAC,SAAA,CAAO,MAAM,QAAQ,SAAA,QAAK,EAC3BA,EAAAA,IAAC,SAAA,CAAO,MAAM,aAAa,SAAA,YAAA,CAAU,CAAA,CAAA,CAAA,CACvC,EACF,EACAA,EAAAA,IAAC,MAAA,CAAI,UAAU,mBACb,SAAAA,EAAAA,IAAC,SAAA,CACC,QAASyE,EACT,SAAU,CAACV,GAAWJ,EAAQ,UAC9B,UAAU,sBAET,SAAAA,EAAQ,UAAY,MAAQ,UAAA,CAAA,CAC/B,CACF,CAAA,CAAA,CACF,CAAA,EACF,EAEDA,EAAQ,OACP3D,MAAC,IAAA,CAAE,UAAU,kCAAoC,SAAA2D,EAAQ,MAAgB,OAAA,CAAQ,CAAA,EAErF,CAEJ,CAEO,SAASkB,GAAe,CAAE,IAAA9D,GAAkC,CACjE,OAAKA,EAWHb,EAAAA,KAAC,MAAA,CAAI,UAAU,mEACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAF,MAAC,KAAE,UAAU,4BAA6B,SAAAe,EAAI,cAAgBA,EAAI,YAAY,EAC7EA,EAAI,aACHf,EAAAA,IAAC,KAAE,UAAU,oCAAqC,WAAI,WAAA,CAAY,CAAA,EAEtE,EAEAA,EAAAA,IAACoB,GAAA,CAAe,MAAOL,EAAI,EAAA,CAAI,EAC/Bf,MAACwD,IAAa,IAAAzC,CAAA,CAAU,CAAA,EAC1B,EAnBEf,EAAAA,IAAC,OAAI,UAAU,yDACb,eAAC,IAAA,CAAE,UAAU,6BAA6B,SAAA,4DAAA,CAE1C,CAAA,CACF,CAiBN,CCzSA,MAAM8E,GAAoC,CACxC,OAAQ,oBACR,SAAU,mBACV,UAAW,iBACb,EAEMC,GAAgB,CACpB,CAAE,MAAO,SAAU,MAAO,QAAA,EAC1B,CAAE,MAAO,WAAY,MAAO,UAAA,EAC5B,CAAE,MAAO,YAAa,MAAO,WAAA,CAC/B,EAEO,SAASC,GAAS,CAAE,SAAAC,EAAW,IAAiC,CAIrE,KAAM,CAAE,QAAAC,EAAS,UAAAC,EAAW,WAAAC,CAAA,EAAeC,EAAgB,CACzD,QAAS,CAAE,OAAQ,GAAI,OAAQ,EAAA,CAAG,CACnC,EACKC,EAAYC,GAAA,EAEZ,CAACC,EAAYC,CAAa,EAAIjG,EAAAA,SAAS,EAAK,EAC5C,CAACkG,EAAYC,CAAa,EAAInG,EAAAA,SAA2B,IAAI,EAC7D,CAACoG,EAAaC,CAAc,EAAIrG,EAAAA,SAA2B,IAAI,EAC/D,CAACsG,EAAeC,CAAgB,EAAIvG,EAAAA,SAA2B,IAAI,EAEnE,CAAE,KAAA8B,EAAM,UAAA0E,CAAA,EAAcC,GAAQ,CAClC,OAAQf,EAAQ,QAAU,OAC1B,OAAQA,EAAQ,QAAU,OAC1B,MAAOE,EAAW,SAClB,OAAQA,EAAW,MAAA,CACpB,EAEKc,GAAQ5E,GAAA,YAAAA,EAAM,QAAS,EACvB6E,GAAO7E,GAAA,YAAAA,EAAM,OAAQ,CAAA,EAErB8E,EAAY9B,EAAAA,QAAQ,IACnBsB,EACEO,EAAK,KAAME,GAAMA,EAAE,KAAOT,EAAY,EAAE,GAAKA,EAD3B,KAExB,CAACO,EAAMP,CAAW,CAAC,EAEhBU,EAA+B,CACnC,CACE,IAAK,eACL,MAAO,kBACP,OAASC,GACPrG,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAF,EAAAA,IAAC,OAAA,CACC,UAAW,8CAA8C8E,GAAUyB,EAAI,MAAM,GAAK,mBAAmB,GACrG,MAAOA,EAAI,MAAA,CAAA,QAEZ,OAAA,CAAK,UAAU,8CACb,SAAAA,EAAI,cAAgBA,EAAI,WAAA,CAC3B,CAAA,CAAA,CACF,CAAA,EAGJ,CACE,IAAK,cACL,MAAO,cACP,OAASA,GACPvG,EAAAA,IAAC,OAAA,CACC,UAAU,0DACV,MAAOuG,EAAI,aAAe,OAEzB,WAAI,aAAe,EAAA,CAAA,CACtB,EAGJ,CACE,IAAK,QACL,MAAO,QACP,OAASA,GACPvG,EAAAA,IAAC,OAAI,UAAU,uBACX,UAAAuG,EAAI,OAAS,CAAA,GAAI,IAAK/B,SACrBI,EAAA,CAAsB,KAAMJ,EAAE,IAAA,EAAhBA,EAAE,IAAoB,CACtC,CAAA,CACH,CAAA,EAGJ,CACE,IAAK,aACL,MAAO,UACP,OAAS+B,SAASC,EAAA,CAAU,KAAMD,EAAI,WAAY,EAClD,UAAW,wBAAA,EAEb,CACE,IAAK,UACL,MAAO,GACP,OAASA,GACPrG,EAAAA,KAACuG,EAAA,CACC,SAAA,CAAAzG,EAAAA,IAAC0G,EAAA,CACC,KAAMC,GACN,MAAM,uBACN,QAAS,IAAMhB,EAAcY,CAAG,CAAA,CAAA,EAElCvG,EAAAA,IAAC0G,EAAA,CACC,KAAMxD,EACN,MAAM,yBACN,QAAS,IAAM6C,EAAiBQ,CAAG,EACnC,WAAW,4CAAA,CAAA,CACb,EACF,EAEF,UAAW,iBAAA,CACb,EAGIK,EAAe,IAAM,CACpBd,GACLR,EAAU,OAAOQ,EAAc,GAAI,CACjC,UAAW,IAAM,CACfC,EAAiB,IAAI,GACjBH,GAAA,YAAAA,EAAa,MAAOE,EAAc,MAAmB,IAAI,CAC/D,CAAA,CACD,CACH,EAEA,cACG,MAAA,CACE,SAAA,CAAAb,EACCjF,EAAAA,IAAC,MAAA,CAAI,UAAU,wBACb,eAAC,SAAA,CAAO,QAAS,IAAMyF,EAAc,EAAI,EAAG,UAAU,sBAAsB,SAAA,qBAAA,CAE5E,EACF,EAEAzF,EAAAA,IAAC6G,GAAA,CACC,MAAM,mBACN,QACE7G,EAAAA,IAAC,SAAA,CAAO,QAAS,IAAMyF,EAAc,EAAI,EAAG,UAAU,sBAAsB,SAAA,qBAAA,CAE5E,CAAA,CAAA,SAKLqB,EAAA,CACC,SAAA,CAAA9G,EAAAA,IAAC+G,EAAA,CACC,MAAM,SACN,MAAO7B,EAAQ,OACf,SAAW8B,GAAM7B,EAAU,SAAU6B,CAAC,EACtC,YAAY,wBAAA,CAAA,EAEdhH,EAAAA,IAACiH,EAAA,CACC,MAAM,SACN,MAAO/B,EAAQ,OACf,SAAW8B,GAAM7B,EAAU,SAAU6B,CAAC,EACtC,QAASjC,EAAA,CAAA,CACX,EACF,EAEA7E,EAAAA,KAAC,MAAA,CAAI,UAAU,kEACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,kBACb,SAAA,CAAAF,EAAAA,IAACkH,EAAA,CACC,QAAAZ,EACA,KAAMH,EACN,MAAQI,GAAQA,EAAI,GACpB,UAAAP,EACA,aAAa,0BACb,WAAaO,GAAQV,EAAeU,CAAG,EACvC,cAAcH,GAAA,YAAAA,EAAW,KAAM,IAAA,CAAA,EAGjCpG,EAAAA,IAACmH,EAAA,CACC,KAAM/B,EAAW,KACjB,WAAYA,EAAW,WAAWc,CAAK,EACvC,aAAcd,EAAW,QACzB,MAAAc,EACA,SAAUd,EAAW,SACrB,iBAAkBA,EAAW,WAAA,CAAA,CAC/B,EACF,EAEApF,EAAAA,IAAC,OAAI,UAAU,eACb,eAAC6E,GAAA,CAAe,IAAKuB,EAAW,CAAA,CAClC,CAAA,EACF,EAEApG,MAACW,IAAe,KAAM6E,EAAY,QAAS,IAAMC,EAAc,EAAK,EAAG,EAEvEzF,EAAAA,IAACc,GAAA,CACC,KAAM,CAAC,CAAC4E,EACR,QAAS,IAAMC,EAAc,IAAI,EACjC,IAAKD,CAAA,CAAA,EAGP1F,EAAAA,IAACsD,EAAA,CACC,KAAM,CAAC,CAACwC,EACR,QAAS,IAAMC,EAAiB,IAAI,EACpC,UAAWa,EACX,MAAM,yBACN,YACE1G,EAAAA,KAAAqD,WAAA,CAAE,SAAA,CAAA,SACO,UACN,OAAA,CAAK,UAAU,gCACb,UAAAuC,GAAA,YAAAA,EAAe,gBAAgBA,GAAA,YAAAA,EAAe,aACjD,EAAO,qEAAA,EAET,EAEF,UAAWR,EAAU,UACrB,MAAOA,EAAU,KAAA,CAAA,CACnB,EACF,CAEJ,CCxMO,SAAS8B,GAAiB,CAAE,MAAAtH,EAAO,WAAAuH,EAAa,CAAA,EAAI,QAAAC,EAAU,GAAO,MAAAC,EAAO,QAAAC,GAOhF,CACD,MAAMC,EAAU,OAAO,QAAQ3H,GAAS,CAAA,CAAE,EACpC4H,EAAY,IAAI,IAAIL,CAAU,EAE9B,CAACM,EAAYC,CAAa,EAAIpI,EAAAA,SAAwB,IAAI,EAC1D,CAACqI,EAAWC,CAAY,EAAItI,EAAAA,SAAS,EAAE,EACvC,CAACuI,EAAYC,CAAa,EAAIxI,EAAAA,SAAS,EAAE,EACzC,CAACyI,EAAeC,CAAgB,EAAI1I,EAAAA,SAAwB,IAAI,EAChE,CAAC2I,EAAeC,CAAgB,EAAI5I,EAAAA,SAAwB,IAAI,EAChE,CAAC6I,EAAWC,CAAY,EAAI9I,EAAAA,SAAS,EAAE,EACvC,CAAC+I,EAAYC,CAAa,EAAIhJ,EAAAA,SAAS,EAAE,EACzC,CAACiJ,EAAaC,CAAc,EAAIlJ,EAAAA,SAAwB,IAAI,EAE5DmJ,EAAU3B,GAAgB,OAAOA,GAAM,SAAWA,EAAI,KAAK,UAAUA,CAAC,EACtE4B,EAASC,GAAyB,CACtC,MAAMC,EAAUD,EAAI,KAAA,EACpB,GAAI,CAAE,OAAO,KAAK,MAAMC,CAAO,CAAG,MAAQ,CAAE,OAAOA,CAAS,CAC9D,EAEA,SAASC,EAAU5F,EAAa,CAC9B,GAAIuE,EAAU,IAAIvE,CAAG,GAAKgF,IAAkBhF,EAAK,CAC/CiF,EAAiBjF,CAAG,EACpB,MACF,CACAiF,EAAiB,IAAI,EACrBR,EAAczE,CAAG,EACjB2E,EAAa3E,CAAG,EAChB6E,EAAcW,GAAQ7I,GAAS,CAAA,GAAIqD,CAAG,CAAC,CAAC,EACxC+E,EAAiB,IAAI,EACrBQ,EAAe,IAAI,CACrB,CAEA,SAASM,IAAa,CACpB,GAAIrB,IAAe,KAAM,OACzB,MAAMsB,EAAOpB,EAAU,KAAA,EACvB,GAAI,CAACoB,EAAM,CAAEP,EAAe,2BAA2B,EAAG,MAAQ,CAClE,GAAIO,IAAStB,GAAcF,EAAQ,KAAK,CAAC,CAAC3E,CAAC,IAAMA,IAAMmG,CAAI,EAAG,CAC5DP,EAAe,IAAIO,CAAI,kBAAkB,EACzC,MACF,CACA,MAAMC,EAAmB,CAAA,EACrBD,IAAStB,IAAYuB,EAAI,OAAS,CAAE,CAACvB,CAAU,EAAGsB,CAAA,GACtD,MAAME,EAAYP,EAAMb,CAAU,EAQlC,IAPIY,EAAOQ,CAAS,IAAMR,GAAQ7I,GAAS,CAAA,GAAI6H,CAAU,CAAC,GAAKsB,IAAStB,IAGlEgB,EAAOQ,CAAS,IAAMR,GAAQ7I,GAAS,CAAA,GAAI6H,CAAU,CAAC,IACxDuB,EAAI,IAAM,CAAE,CAACD,CAAI,EAAGE,CAAA,GAGpB,CAACD,EAAI,KAAO,CAACA,EAAI,OAAQ,CAAEE,EAAA,EAAc,MAAQ,CACrD5B,EAAQ0B,CAAG,EACXE,EAAA,CACF,CAEA,SAASA,GAAa,CACpBxB,EAAc,IAAI,EAClBE,EAAa,EAAE,EACfE,EAAc,EAAE,EAChBU,EAAe,IAAI,CACrB,CAEA,SAASW,GAAY,CACnB,MAAMJ,EAAOZ,EAAU,KAAA,EACvB,GAAI,CAACY,EAAM,CAAEP,EAAe,2BAA2B,EAAG,MAAQ,CAClE,GAAIjB,EAAQ,KAAK,CAAC,CAAC3E,CAAC,IAAMA,IAAMmG,CAAI,EAAG,CACrCP,EAAe,IAAIO,CAAI,kBAAkB,EACzC,MACF,CACAzB,EAAQ,CAAE,IAAK,CAAE,CAACyB,CAAI,EAAGL,EAAML,CAAU,CAAA,EAAK,EAC9CD,EAAa,EAAE,EACfE,EAAc,EAAE,EAChBE,EAAe,IAAI,CACrB,CAEA,OACExI,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAF,EAAAA,IAAC,IAAA,CAAE,UAAU,sEAAsE,SAAA,aAEnF,EAECyH,EAAQ,SAAW,SACjB,IAAA,CAAE,UAAU,oCAAoC,SAAA,iCAA8B,EAGhFA,EAAQ,IAAI,CAAC,CAACtE,EAAKmG,CAAG,IAAM,CAC3B,MAAMC,EAAW7B,EAAU,IAAIvE,CAAG,EAC5BqG,EAAY7B,IAAexE,EAC3BsG,GAAaxB,IAAkB9E,EACrC,OACEnD,EAAAA,IAAC,OAAc,UAAU,gBACtB,WACCE,EAAAA,KAAC,MAAA,CAAI,UAAU,8CACb,SAAA,CAAAF,EAAAA,IAAC,QAAA,CACC,MAAO6H,EACP,SAAW1H,GAAM2H,EAAa3H,EAAE,OAAO,KAAK,EAC5C,aAAW,gBACX,UAAU,wCAAA,CAAA,EAEZH,EAAAA,IAAC,QAAA,CACC,MAAO+H,EACP,SAAW5H,GAAM6H,EAAc7H,EAAE,OAAO,KAAK,EAC7C,aAAW,iBACX,YAAY,yBACZ,UAAU,8BAAA,CAAA,EAEZD,EAAAA,KAAC,MAAA,CAAI,UAAU,aACb,SAAA,CAAAF,EAAAA,IAAC,SAAA,CAAO,QAASgJ,GAAY,SAAU1B,EAAS,UAAU,2DACvD,SAAAA,EAAU,YAAc,MAAA,CAC3B,QACC,SAAA,CAAO,QAAS8B,EAAY,UAAU,wDAAwD,SAAA,SAAM,EACrGpJ,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM,CAAEkI,EAAiB/E,CAAG,EAAGyE,EAAc,IAAI,CAAG,EAC7D,UAAU,gEACX,SAAA,QAAA,CAAA,CAED,CAAA,CACF,CAAA,CAAA,CACF,EACE6B,GACFvJ,EAAAA,KAAC,OAAA,CAAK,UAAU,mCACd,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,oBAAoB,SAAA,CAAA,UAAOF,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAyB,SAAAmD,EAAI,EAAO,GAAA,EAAC,EAChGnD,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM,CAAEwH,EAAQ,CAAE,OAAQ,CAACrE,CAAG,EAAG,EAAG+E,EAAiB,IAAI,CAAG,EACrE,SAAUZ,EACV,UAAU,2DAET,WAAU,MAAQ,KAAA,CAAA,EAErBtH,EAAAA,IAAC,UAAO,QAAS,IAAMkI,EAAiB,IAAI,EAAG,UAAU,+CAA+C,SAAA,IAAA,CAAE,CAAA,EAC5G,EACEC,IAAkBhF,EACpBjD,EAAAA,KAAC,OAAA,CAAK,UAAU,mCACd,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,sBACd,SAAA,CAAAF,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAyB,SAAAmD,EAAI,EAAO,yEAAA,EACtD,EACAnD,EAAAA,IAAC,UAAO,QAAS,IAAM+I,EAAU5F,CAAG,EAAG,UAAU,kDAAkD,SAAA,MAAA,CAAI,EACvGnD,EAAAA,IAAC,UAAO,QAAS,IAAMoI,EAAiB,IAAI,EAAG,UAAU,+CAA+C,SAAA,QAAA,CAAM,CAAA,CAAA,CAChH,EAEAlI,EAAAA,KAAC,SAAA,CACC,QAAS,IAAM6I,EAAU5F,CAAG,EAC5B,UAAU,sHACV,MAAO,QAAQA,CAAG,GAElB,SAAA,CAAAnD,EAAAA,IAAC,OAAA,CAAK,UAAU,qDAAsD,SAAAmD,EAAI,EACzEoG,GACCvJ,EAAAA,IAAC,OAAA,CAAK,UAAU,0BAA0B,MAAM,SAC9C,SAAAA,EAAAA,IAAC0J,GAAA,CAAS,UAAU,UAAU,aAAW,SAAS,EACpD,QAGD,OAAA,CAAK,UAAU,oEAAqE,SAAAf,EAAOW,CAAG,CAAA,CAAE,CAAA,CAAA,CAAA,GA9D7FnG,CAiEV,CAEJ,CAAC,EAGDjD,EAAAA,KAAC,MAAA,CAAI,UAAU,oDACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACb,SAAA,CAAAF,EAAAA,IAAC,QAAA,CACC,MAAOqI,EACP,SAAWlI,GAAMmI,EAAanI,EAAE,OAAO,KAAK,EAC5C,YAAY,WACZ,aAAW,oBACX,UAAU,wCAAA,CAAA,EAEZH,EAAAA,IAAC,QAAA,CACC,MAAOuI,EACP,SAAWpI,GAAMqI,EAAcrI,EAAE,OAAO,KAAK,EAC7C,UAAYA,GAAM,CAAMA,EAAE,MAAQ,SAASkJ,EAAA,CAAa,EACxD,YAAY,QACZ,aAAW,qBACX,UAAU,8BAAA,CAAA,CACZ,EACF,EACChB,EAAU,cACR,MAAA,CAAI,UAAU,mBACb,SAAArI,EAAAA,IAAC,SAAA,CAAO,QAASqJ,EAAW,SAAU/B,EAAS,UAAU,sBACtD,SAAAA,EAAU,MAAQ,eACrB,CAAA,CACF,CAAA,EAEJ,GAEEmB,GAAelB,IACfvH,EAAAA,IAAC,IAAA,CAAE,KAAK,QAAQ,UAAU,6BAA8B,SAAAyI,GAAelB,CAAA,CAAM,CAAA,EAEjF,CAEJ,CChNO,MAAMhF,EAA+B,CAC1C,CAAE,MAAO,UAAW,MAAO,uBAAwB,WAAY,MAAO,YAAa,KAAA,EACnF,CAAE,MAAO,WAAY,MAAO,wBAAyB,WAAY,MAAO,YAAa,MAAA,EACrF,CAAE,MAAO,YAAa,MAAO,yBAA0B,WAAY,OAAQ,YAAa,MAAA,EACxF,CAAE,MAAO,WAAY,MAAO,sBAAuB,WAAY,MAAO,YAAa,MAAA,EACnF,CAAE,MAAO,YAAa,MAAO,uBAAwB,WAAY,OAAQ,YAAa,MAAA,CACxF,EAEaoH,EAAsB,UAM5B,SAASC,EAAY9J,EAA4B,CACtD,OAAOyC,EAAc,KAAMsH,GAAMA,EAAE,QAAU/J,CAAK,GAAKyC,EAAc,CAAC,CACxE,CCJA,SAASuH,EAAa,CAAE,SAAAC,GAA2C,CACjE,OACE/J,EAAAA,IAAC,MAAA,CAAI,UAAU,wFACZ,SAAA+J,CAAA,CACH,CAEJ,CASA,SAASC,GAAgB,CAAE,KAAA3J,GAAgC,CACzD,MAAM4J,EAAQC,GAAA,EACR,CAAE,KAAM7C,CAAA,EAAe8C,GAAA,EAE7B,aACGL,EAAA,CACC,SAAA9J,EAAAA,IAACoH,GAAA,CACC,MAAO/G,EAAK,UAAY,CAAA,EACxB,YAAYgH,GAAA,YAAAA,EAAY,OAAQ,CAAA,EAChC,QAAS4C,EAAM,UACf,MAAOA,EAAM,MAASA,EAAM,MAAgB,QAAU,KACtD,QAAUf,GAAQe,EAAM,OAAO,CAAE,GAAI5J,EAAK,GAAI,IAAA6I,CAAA,CAAK,CAAA,CAAA,EAEvD,CAEJ,CAQA,SAASkB,GAAa,CAAE,KAAA/J,GAAgC,CACtD,KAAM,CAAE,KAAMgK,CAAA,EAAgBC,GAAA,EACxB,CAAE,KAAMC,CAAA,EAASC,GAAgBnK,EAAK,EAAE,EACxCoK,EAASC,GAAA,EACTC,EAAWC,GAAA,EACX,CAACC,EAAYC,CAAa,EAAItL,EAAAA,SAAS,EAAE,EAEzCuL,GAAeR,GAAA,YAAAA,EAAM,WAAY,CAAA,EACjClG,EAAYC,EAAAA,QAAQ,IAAM,CAC9B,MAAMhC,EAAO,IAAI,IAAIyI,EAAa,IAAKlB,GAAMA,EAAE,GAAG,CAAC,EACnD,QAAQQ,GAAA,YAAAA,EAAa,WAAY,CAAA,GAAI,OAAQR,GAAM,CAACvH,EAAK,IAAIuH,EAAE,GAAG,CAAC,CACrE,EAAG,CAACQ,EAAaU,CAAY,CAAC,EAE9B,OAAIA,EAAa,SAAW,GAAK1G,EAAU,SAAW,EAAU,KAG9DrE,EAAAA,IAAC8J,EAAA,CACD,SAAA5J,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAF,EAAAA,IAAC,IAAA,CAAE,UAAU,sEAAsE,SAAA,WAEnF,EACC+K,EAAa,OAAS,GACrB/K,EAAAA,IAAC,MAAA,CAAI,UAAU,sBACZ,SAAA+K,EAAa,IAAKlB,GACjB3J,EAAAA,KAAC,OAAA,CAEC,UAAU,uHAEV,SAAA,CAAAF,EAAAA,IAACgL,GAAA,CAAM,UAAU,sCAAsC,cAAW,GAAC,EACnEhL,EAAAA,IAACiL,GAAA,CACC,GAAI,mBAAmB,mBAAmBpB,EAAE,GAAG,CAAC,GAChD,UAAU,8DACV,MAAOA,EAAE,IAER,SAAAA,EAAE,OAASA,EAAE,GAAA,CAAA,EAEhB3J,EAAAA,KAAC,OAAA,CAAK,UAAU,oDACb,SAAA,CAAA2J,EAAE,MAAM,OAAO,QAAMA,EAAE,MAAM,SAAW,EAAI,GAAK,GAAA,EACpD,EACA7J,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM2K,EAAS,OAAO,CAAE,OAAQtK,EAAK,GAAI,IAAKwJ,EAAE,IAAK,EAC9D,UAAU,6EACV,MAAO,YAAYA,EAAE,OAASA,EAAE,GAAG,GACpC,SAAA,GAAA,CAAA,CAED,CAAA,EApBKA,EAAE,GAAA,CAsBV,EACH,EAEDxF,EAAU,OAAS,GAClBnE,EAAAA,KAAC,MAAA,CAAI,UAAU,aACb,SAAA,CAAAA,EAAAA,KAAC,SAAA,CACC,MAAO2K,EACP,SAAW1K,GAAM2K,EAAc3K,EAAE,OAAO,KAAK,EAC7C,UAAU,gCACV,aAAW,UAEX,SAAA,CAAAH,EAAAA,IAAC,SAAA,CAAO,MAAM,GAAG,SAAA,sBAAmB,EACnCqE,EAAU,IAAKwF,SACb,SAAA,CAAmB,MAAOA,EAAE,IAAM,WAAE,OAASA,EAAE,GAAA,EAAnCA,EAAE,GAAqC,CACrD,CAAA,CAAA,CAAA,EAEH7J,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM,CACR6K,GACLJ,EAAO,OACL,CAAE,OAAQpK,EAAK,GAAI,IAAKwK,CAAA,EACxB,CAAE,UAAW,IAAMC,EAAc,EAAE,CAAA,CAAE,CAEzC,EACA,SAAU,CAACD,GAAcJ,EAAO,UAChC,UAAU,+BAET,SAAAA,EAAO,UAAY,MAAQ,QAAA,CAAA,CAC9B,EACF,GAEAA,EAAO,OAASE,EAAS,QACzB3K,EAAAA,IAAC,IAAA,CAAE,UAAU,6BACR,UAAAyK,EAAO,OAASE,EAAS,OAAiB,OAAA,CAC/C,CAAA,CAAA,CAEJ,CAAA,CACA,CAEJ,CAEO,SAASO,GAAU,CAAE,KAAA7K,GAAuC,CACjE,KAAM,CAAE,KAAMoD,CAAA,EAAiBC,EAAA,EACzBC,EAAUwH,GAAA,EACVtH,EAAauH,GAAA,EACb,CAACrH,EAASC,CAAU,EAAIxE,EAAAA,SAAS,EAAE,EACnC,CAACyE,EAASC,CAAU,EAAI1E,EAAAA,SAAqB,QAAQ,EAErD,CAAC6L,EAAUC,CAAW,EAAI9L,EAAAA,SAASmK,CAAmB,EAEtDxF,GAAWV,GAAA,YAAAA,EAAc,QAAS,CAAA,EAClCW,GAAe/D,GAAA,YAAAA,EAAM,QAAS,CAAA,EAE9BgE,EAAYC,EAAAA,QAAQ,IAAM,CAC9B,MAAMC,EAAW,IAAI,IAAIH,EAAa,IAAKI,GAAMA,EAAE,IAAI,CAAC,EACxD,OAAOL,EAAS,OAAQK,GAAM,CAACD,EAAS,IAAIC,CAAC,CAAC,CAChD,EAAG,CAACL,EAAUC,CAAY,CAAC,EAErBK,EAAY,IAAM,CACtB,GAAI,CAACpE,GAAQ,CAAC0D,EAAQ,OAAQ,OAC9B,MAAMX,EAAgCwG,EAAvB3F,IAAY,SAAuBoH,EAAwB1B,CAAhB,EAC1DhG,EAAQ,OACN,CACE,OAAQtD,EAAK,GACb,KAAM0D,EAAQ,KAAA,EACd,KAAME,EACN,WAAYb,EAAO,WACnB,YAAaA,EAAO,WAAA,EAEtB,CAAE,UAAW,IAAM,CAAEY,EAAW,EAAE,EAAGE,EAAW,QAAQ,EAAGoH,EAAY3B,CAAmB,CAAG,CAAA,CAAE,CAEnG,EAEMjF,EAAgBC,GAAiB,CAChCtE,GACLwD,EAAW,OAAO,CAAE,OAAQxD,EAAK,GAAI,KAAAsE,EAAM,CAC7C,EAEA,OACEzE,EAAAA,KAAC,MAAA,CAAI,UAAU,8DACb,SAAA,CAAAF,EAAAA,IAAC,IAAA,CAAE,UAAU,2EAA2E,SAAA,kBAExF,EAEEK,EAKAH,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAF,EAAAA,IAAC,MAAA,CACC,eAAC,IAAA,CAAE,UAAU,4BAA6B,SAAAK,EAAK,cAAgBA,EAAK,WAAA,CAAY,CAAA,CAClF,EAEAL,MAACoK,IAAa,KAAA/J,EAAY,EAG1BL,MAAC8J,EAAA,CACD,SAAA5J,EAAAA,KAAC,MAAA,CAAI,UAAU,YACf,SAAA,CAAAF,EAAAA,IAAC,IAAA,CAAE,UAAU,sEAAsE,SAAA,QAAK,EAEvFoE,EAAa,SAAW,EACvBpE,EAAAA,IAAC,IAAA,CAAE,UAAU,6BAA6B,SAAA,oBAAA,CAAkB,EAE5DA,MAAC,OAAI,UAAU,sBACZ,SAAAoE,EAAa,IAAKI,GACjBtE,EAAAA,KAAC,OAAA,CAEC,UAAU,uHAKV,SAAA,CAAAF,EAAAA,IAAC,OAAA,CAAK,UAAU,0BAA0B,MAAOwE,EAAE,KACjD,SAAAxE,EAAAA,IAAC4E,EAAA,CAAS,KAAMJ,EAAE,KAAM,KAAK,UAAU,EACzC,EACAxE,EAAAA,IAAC,OAAA,CAAK,UAAU,oEAAqE,WAAE,KAAK,EAC3FwE,EAAE,OAAS,UACVtE,EAAAA,KAAAqD,EAAAA,SAAA,CACE,SAAA,CAAAvD,EAAAA,IAAC,OAAA,CAAK,UAAU,sCAAsC,cAAW,GAAC,EAClEA,EAAAA,IAACuL,IAAW,KAAM/G,EAAE,WAAY,MAAOA,EAAE,YAAa,UAAU,UAAA,CAAW,CAAA,EAC7E,EAEDA,EAAE,oBACDxE,EAAAA,IAAC,OAAA,CACC,UAAU,WACV,MAAO,sBAAsBwE,EAAE,kBAAkB,GAEjD,SAAAxE,EAAAA,IAACgL,GAAA,CAAM,UAAU,6BAA6B,cAAW,EAAA,CAAC,CAAA,CAAA,EAG9DhL,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM0E,EAAaF,EAAE,IAAI,EAClC,UAAU,6EACV,MAAO,UAAUA,EAAE,IAAI,GACxB,SAAA,GAAA,CAAA,CAED,CAAA,EA9BKA,EAAE,IAAA,CAgCV,EACH,EAGDH,EAAU,OAAS,GAClBnE,EAAAA,KAAC,MAAA,CAAI,UAAU,gDACb,SAAA,CAAAF,EAAAA,IAAC,IAAA,CAAE,UAAU,sEAAsE,SAAA,WAEnF,EAIAE,EAAAA,KAAC,SAAA,CACC,MAAO6D,EACP,SAAW5D,GAAM6D,EAAW7D,EAAE,OAAO,KAAK,EAC1C,UAAU,0CACV,aAAW,OAEX,SAAA,CAAAH,EAAAA,IAAC,SAAA,CAAO,MAAM,GAAG,SAAA,mBAAgB,EAChCqE,EAAU,IAAKG,GACdxE,EAAAA,IAAC,UAAe,MAAOwE,EAAI,SAAAA,CAAA,EAAdA,CAAgB,CAC9B,CAAA,CAAA,CAAA,EAEHtE,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,UACb,SAAA,CAAAF,EAAAA,IAAC,QAAA,CAAM,UAAU,yCAAyC,SAAA,OAAI,EAC9DE,EAAAA,KAAC,SAAA,CACC,MAAO+D,EACP,SAAW9D,GAAM+D,EAAW/D,EAAE,OAAO,KAAmB,EACxD,UAAU,gCACV,aAAW,YAEX,SAAA,CAAAH,EAAAA,IAAC,SAAA,CAAO,MAAM,SAAS,SAAA,SAAM,EAC7BA,EAAAA,IAAC,SAAA,CAAO,MAAM,QAAQ,SAAA,QAAK,EAC3BA,EAAAA,IAAC,SAAA,CAAO,MAAM,aAAa,SAAA,YAAA,CAAU,CAAA,CAAA,CAAA,CACvC,EACF,EACCiE,IAAY,UACX/D,OAAC,MAAA,CAAI,UAAU,UACb,SAAA,CAAAF,EAAAA,IAAC,QAAA,CAAM,UAAU,yCAAyC,SAAA,QAAK,EAC/DA,EAAAA,IAAC,SAAA,CACC,MAAOqL,EACP,SAAWlL,GAAMmL,EAAYnL,EAAE,OAAO,KAAK,EAC3C,UAAU,gCACV,aAAW,qBAEV,SAAAoC,EAAc,IAAKsH,GAClB7J,EAAAA,IAAC,SAAA,CAAqB,MAAO6J,EAAE,MAAQ,SAAAA,EAAE,KAAA,EAA5BA,EAAE,KAAgC,CAChD,CAAA,CAAA,CACH,CAAA,CACF,CAAA,EAEJ,EACA7J,EAAAA,IAAC,MAAA,CAAI,UAAU,wBACb,SAAAA,EAAAA,IAAC,SAAA,CACC,QAASyE,EACT,SAAU,CAACV,GAAWJ,EAAQ,UAC9B,UAAU,sBAET,SAAAA,EAAQ,UAAY,MAAQ,UAAA,CAAA,EAEjC,EACCA,EAAQ,OACP3D,MAAC,IAAA,CAAE,UAAU,6BAA+B,SAAA2D,EAAQ,MAAgB,OAAA,CAAQ,CAAA,CAAA,CAEhF,CAAA,CAAA,CAEF,CAAA,CACA,EAEA3D,MAACgK,IAAgB,KAAA3J,CAAA,CAAY,CAAA,CAAA,CAC/B,EA7HAL,EAAAA,IAAC,IAAA,CAAE,UAAU,6BAA6B,SAAA,sCAAA,CAE1C,CA2HA,EAEJ,CAEJ,CChUO,SAASwL,GAAiB,CAAE,OAAAC,EAAQ,SAAAC,GAAuE,CAChH,OACE1L,EAAAA,IAAC2L,GAAA,CACC,aAAW,eACX,OAAAF,EACA,SAAAC,EACA,KAAM,CACJ,CAAE,IAAK,QAAS,MAAO,gBAAiB,KAAM1L,EAAAA,IAAC4L,GAAA,CAAK,UAAU,aAAA,CAAc,CAAA,EAC5E,CAAE,IAAK,mBAAoB,MAAO,mBAAoB,KAAM5L,EAAAA,IAAC6L,GAAA,CAAI,UAAU,cAAc,CAAA,CAAG,CAC9F,CAAA,CAGN,CCIA,MAAM9G,GAAgB,CACpB,CAAE,MAAO,SAAU,MAAO,QAAA,EAC1B,CAAE,MAAO,WAAY,MAAO,UAAA,EAC5B,CAAE,MAAO,YAAa,MAAO,WAAA,CAC/B,EAEMD,GAAoC,CACxC,OAAQ,oBACR,SAAU,mBACV,UAAW,iBACb,EAEO,SAASgH,IAAY,CAC1B,KAAM,CAAE,UAAAC,CAAA,EAAcC,EAAA,EAChB,CAACC,EAAcC,CAAe,EAAIC,GAAA,EAClCC,EAAWH,EAAa,IAAI,KAAK,EACjCI,EAAyBN,GAAaK,IAAa,mBAAsB,mBAAqB,QAE9FE,EAAmBC,GAAoB,CAEzCL,EADEK,IAAQ,QACM,CAAA,EAEA,CAAE,IAAAA,EAFA,CAItB,EAEA,cACG,MAAA,CACC,SAAA,CAAAvM,EAAAA,IAAC6G,GAAA,CACC,MAAM,WACN,SAAS,8BACT,QAASkF,EAAY/L,EAAAA,IAACwL,GAAA,CAAiB,OAAQa,EAAW,SAAUC,EAAiB,EAAK,MAAA,CAAA,EAE3FD,IAAc,QAAUrM,EAAAA,IAACwM,GAAA,CAAA,CAAkB,EAAKxM,EAAAA,IAACgF,GAAA,CAAS,SAAQ,EAAA,CAAC,CAAA,EACtE,CAEJ,CAEA,SAASwH,IAAoB,CAC3B,KAAM,CAAE,UAAAT,CAAA,EAAcC,EAAA,EAChB,CAAE,QAAA9G,EAAS,UAAAC,EAAW,WAAAC,CAAA,EAAeC,EAAgB,CACzD,QAAS,CAAE,OAAQ,GAAI,OAAQ,EAAA,CAAG,CACnC,EACKoH,EAAaC,GAAA,EAEb,CAAClH,EAAYC,CAAa,EAAIjG,EAAAA,SAAS,EAAK,EAC5C,CAACmN,EAAaC,CAAc,EAAIpN,EAAAA,SAA8B,IAAI,EAClE,CAACqN,EAAcC,CAAe,EAAItN,EAAAA,SAA8B,IAAI,EACpE,CAACsG,EAAeC,CAAgB,EAAIvG,EAAAA,SAA8B,IAAI,EAEtE,CAAE,KAAA8B,EAAM,UAAA0E,CAAA,EAAc+G,GAAS,CACnC,OAAQ7H,EAAQ,QAAU,OAC1B,OAAQA,EAAQ,QAAU,OAC1B,MAAOE,EAAW,SAClB,OAAQA,EAAW,MAAA,CACpB,EAEKc,GAAQ5E,GAAA,YAAAA,EAAM,QAAS,EACvB0L,GAAQ1L,GAAA,YAAAA,EAAM,QAAS,CAAA,EAEvB2L,EAAa3I,EAAAA,QAAQ,IACpBuI,EACEG,EAAM,KAAME,GAAMA,EAAE,KAAOL,EAAa,EAAE,GAAKA,EAD5B,KAEzB,CAACG,EAAOH,CAAY,CAAC,EAElBvG,EAAkC,CACtC,CACE,IAAK,eACL,MAAO,OACP,OAASC,GACPrG,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAF,EAAAA,IAAC,OAAA,CACC,UAAW,8CAA8C8E,GAAUyB,EAAI,MAAM,GAAK,mBAAmB,GACrG,MAAOA,EAAI,MAAA,CAAA,QAEZ,OAAA,CAAK,UAAU,8CACb,SAAAA,EAAI,cAAgBA,EAAI,WAAA,CAC3B,CAAA,CAAA,CACF,CAAA,EAGJ,CACE,IAAK,QACL,MAAO,QACP,OAASA,GACPA,EAAI,YACD,OAAA,CAAK,UAAU,gDAAiD,SAAAA,EAAI,MAAM,EAE3EvG,MAAC,OAAA,CAAK,UAAU,+BAA+B,SAAA,GAAA,CAAC,CAAA,EAGtD,CACE,IAAK,QACL,MAAO,QACP,OAASuG,GACPvG,EAAAA,IAAC,MAAA,CAAI,UAAU,uBACX,UAAAuG,EAAI,OAAS,CAAA,GAAI,IAAK/B,GACtBxE,EAAAA,IAAC4E,EAAA,CAAsB,KAAMJ,EAAE,KAAM,KAAK,IAAA,EAA3BA,EAAE,IAA8B,CAChD,CAAA,CACH,CAAA,EAGJ,CACE,IAAK,aACL,MAAO,UACP,OAAS+B,SAASC,EAAA,CAAU,KAAMD,EAAI,WAAY,EAClD,UAAW,wBAAA,EAEb,GAAIwF,EAAY,CAAC,CACf,IAAK,UACL,MAAO,GACP,OAASxF,GACPrG,EAAAA,KAACuG,EAAA,CACC,SAAA,CAAAzG,EAAAA,IAAC0G,EAAA,CACC,KAAMC,GACN,MAAM,YACN,QAAS,IAAMiG,EAAerG,CAAG,CAAA,CAAA,EAEnCvG,EAAAA,IAAC0G,EAAA,CACC,KAAMxD,EACN,MAAM,cACN,QAAS,IAAM6C,EAAiBQ,CAAG,EACnC,WAAW,4CAAA,CAAA,CACb,EACF,EAEF,UAAW,iBAAA,CACZ,EAAI,CAAA,CAAC,EAGFK,EAAe,IAAM,CACpBd,GACL2G,EAAW,OAAO3G,EAAc,GAAI,CAClC,UAAW,IAAMC,EAAiB,IAAI,CAAA,CACvC,CACH,EAEA,cACG,MAAA,CACE,SAAA,CAAAgG,GACC/L,EAAAA,IAAC,MAAA,CAAI,UAAU,wBACb,eAAC,SAAA,CAAO,QAAS,IAAMyF,EAAc,EAAI,EAAG,UAAU,sBAAsB,oBAE5E,EACF,SAIDqB,EAAA,CACC,SAAA,CAAA9G,EAAAA,IAAC+G,EAAA,CACC,MAAM,SACN,MAAO7B,EAAQ,OACf,SAAW8B,GAAM7B,EAAU,SAAU6B,CAAC,EACtC,YAAY,kBAAA,CAAA,EAEdhH,EAAAA,IAACiH,EAAA,CACC,MAAM,SACN,MAAO/B,EAAQ,OACf,SAAW8B,GAAM7B,EAAU,SAAU6B,CAAC,EACtC,QAASjC,EAAA,CAAA,CACX,EACF,EAIA7E,EAAAA,KAAC,MAAA,CAAI,UAAU,kEAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,kBACb,SAAA,CAAAF,EAAAA,IAACkH,EAAA,CACC,QAAAZ,EACA,KAAM0G,EACN,MAAQzG,GAAQA,EAAI,GACpB,UAAAP,EACA,aAAa,iBACb,WAAaO,GAAQuG,EAAgBvG,CAAG,EACxC,cAAc0G,GAAA,YAAAA,EAAY,KAAM,IAAA,CAAA,EAGlCjN,EAAAA,IAACmH,EAAA,CACC,KAAM/B,EAAW,KACjB,WAAYA,EAAW,WAAWc,CAAK,EACvC,aAAcd,EAAW,QACzB,MAAAc,EACA,SAAUd,EAAW,SACrB,iBAAkBA,EAAW,WAAA,CAAA,CAC/B,EACF,EAGApF,EAAAA,IAAC,OAAI,UAAU,eACb,eAACkL,GAAA,CAAU,KAAM+B,EAAY,CAAA,CAC/B,CAAA,EACF,EAEAjN,MAACf,IAAgB,KAAMuG,EAAY,QAAS,IAAMC,EAAc,EAAK,EAAG,EAExEzF,EAAAA,IAACI,GAAA,CACC,KAAM,CAAC,CAACuM,EACR,QAAS,IAAMC,EAAe,IAAI,EAClC,KAAMD,CAAA,CAAA,EAGR3M,EAAAA,IAACsD,EAAA,CACC,KAAM,CAAC,CAACwC,EACR,QAAS,IAAMC,EAAiB,IAAI,EACpC,UAAWa,EACX,MAAM,cACN,YACE1G,EAAAA,KAAAqD,WAAA,CAAE,SAAA,CAAA,SACO,UACN,OAAA,CAAK,UAAU,gCACb,UAAAuC,GAAA,YAAAA,EAAe,gBAAgBA,GAAA,YAAAA,EAAe,aACjD,EAAO,iCAAA,EAET,EAEF,UAAW2G,EAAW,UACtB,MAAOA,EAAW,KAAA,CAAA,CACpB,EACF,CAEJ"}
|
|
1
|
+
{"version":3,"file":"index-U7HShN30.js","sources":["../../src/pages/admin/users/CreateUserModal.tsx","../../src/pages/admin/users/EditUserModal.tsx","../../src/pages/admin/bots/CreateBotModal.tsx","../../src/pages/admin/bots/EditBotModal.tsx","../../src/pages/admin/bots/BotDetailPanel.tsx","../../src/pages/admin/bots/BotsPage.tsx","../../src/components/common/form/PropertiesEditor.tsx","../../src/lib/roleScope.ts","../../src/pages/admin/users/RolePanel.tsx","../../src/pages/admin/users/AccountTabToggle.tsx","../../src/pages/admin/users/UsersPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useCreateUser } from '../../../api/users';\nimport { Modal } from '../../../components/common/modal/Modal';\n\nexport function CreateUserModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const createUser = useCreateUser();\n const [form, setForm] = useState({\n external_id: '',\n email: '',\n display_name: '',\n password: '',\n });\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) setForm({ external_id: '', email: '', display_name: '', password: '' });\n }\n\n const handleCreate = () => {\n if (!form.external_id.trim()) return;\n createUser.mutate(\n {\n external_id: form.external_id.trim(),\n email: form.email.trim() || undefined,\n display_name: form.display_name.trim() || undefined,\n password: form.password || undefined,\n },\n { onSuccess: onClose },\n );\n };\n\n const set = (field: string, value: string) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create User\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n External ID (required)\n </label>\n <input\n type=\"text\"\n value={form.external_id}\n onChange={(e) => set('external_id', e.target.value)}\n placeholder=\"e.g., john.doe\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => set('display_name', e.target.value)}\n placeholder=\"John Doe\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Email\n </label>\n <input\n type=\"text\"\n value={form.email}\n onChange={(e) => set('email', e.target.value)}\n placeholder=\"john@example.com\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Password\n </label>\n <input\n type=\"password\"\n value={form.password}\n onChange={(e) => set('password', e.target.value)}\n placeholder=\"Leave blank for no password\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n {createUser.error && (\n <p className=\"text-xs text-status-error\">{(createUser.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleCreate}\n disabled={!form.external_id.trim() || createUser.isPending}\n className=\"btn-primary text-xs\"\n >\n {createUser.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useUpdateUser } from '../../../api/users';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport type { LTUserRecord } from '../../../api/types';\n\nexport function EditUserModal({\n open,\n onClose,\n user,\n}: {\n open: boolean;\n onClose: () => void;\n user: LTUserRecord | null;\n}) {\n const updateUser = useUpdateUser();\n const [form, setForm] = useState({\n display_name: '',\n email: '',\n status: 'active' as string,\n });\n\n const [prevUser, setPrevUser] = useState(user);\n if (user !== prevUser) {\n setPrevUser(user);\n if (user) {\n setForm({\n display_name: user.display_name ?? '',\n email: user.email ?? '',\n status: user.status,\n });\n }\n }\n\n const handleSave = () => {\n if (!user) return;\n updateUser.mutate(\n {\n id: user.id,\n display_name: form.display_name.trim() || undefined,\n email: form.email.trim() || undefined,\n status: form.status,\n },\n { onSuccess: onClose },\n );\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={`Edit — ${user?.display_name || user?.external_id || ''}`}\n >\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => setForm((f) => ({ ...f, display_name: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Email\n </label>\n <input\n type=\"text\"\n value={form.email}\n onChange={(e) => setForm((f) => ({ ...f, email: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Status\n </label>\n <select\n value={form.status}\n onChange={(e) => setForm((f) => ({ ...f, status: e.target.value }))}\n className=\"select text-xs w-full\"\n >\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n <option value=\"suspended\">Suspended</option>\n </select>\n </div>\n\n {updateUser.error && (\n <p className=\"text-xs text-status-error\">{(updateUser.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={updateUser.isPending}\n className=\"btn-primary text-xs\"\n >\n {updateUser.isPending ? 'Saving...' : 'Save'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useCreateBot } from '../../../api/bots';\nimport { Modal } from '../../../components/common/modal/Modal';\n\nexport function CreateBotModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const createBot = useCreateBot();\n const [form, setForm] = useState({\n name: '',\n display_name: '',\n description: '',\n });\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) setForm({ name: '', display_name: '', description: '' });\n }\n\n const handleCreate = () => {\n if (!form.name.trim()) return;\n createBot.mutate(\n {\n name: form.name.trim(),\n display_name: form.display_name.trim() || undefined,\n description: form.description.trim() || undefined,\n },\n { onSuccess: onClose },\n );\n };\n\n const set = (field: string, value: string) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create Service Account\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Name (required)\n </label>\n <input\n type=\"text\"\n value={form.name}\n onChange={(e) => set('name', e.target.value.replace(/\\s+/g, '-').toLowerCase())}\n placeholder=\"e.g., ci-bot\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => set('display_name', e.target.value)}\n placeholder=\"CI Bot\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Description\n </label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"Runs scheduled workflows\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n {createBot.error && (\n <p className=\"text-xs text-status-error\">{(createBot.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleCreate}\n disabled={!form.name.trim() || createBot.isPending}\n className=\"btn-primary text-xs\"\n >\n {createBot.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useUpdateBot } from '../../../api/bots';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport type { BotRecord } from '../../../api/types';\n\nexport function EditBotModal({\n open,\n onClose,\n bot,\n}: {\n open: boolean;\n onClose: () => void;\n bot: BotRecord | null;\n}) {\n const updateBot = useUpdateBot();\n const [form, setForm] = useState({\n display_name: '',\n description: '',\n status: 'active' as string,\n });\n\n const [prevBot, setPrevBot] = useState(bot);\n if (bot !== prevBot) {\n setPrevBot(bot);\n if (bot) {\n setForm({\n display_name: bot.display_name ?? '',\n description: bot.description ?? '',\n status: bot.status,\n });\n }\n }\n\n const handleSave = () => {\n if (!bot) return;\n updateBot.mutate(\n {\n id: bot.id,\n display_name: form.display_name.trim() || undefined,\n description: form.description.trim() || undefined,\n status: form.status,\n },\n { onSuccess: onClose },\n );\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={`Edit — ${bot?.display_name || bot?.external_id || ''}`}\n >\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => setForm((f) => ({ ...f, display_name: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Description\n </label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => setForm((f) => ({ ...f, description: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Status\n </label>\n <select\n value={form.status}\n onChange={(e) => setForm((f) => ({ ...f, status: e.target.value }))}\n className=\"select text-xs w-full\"\n >\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n <option value=\"suspended\">Suspended</option>\n </select>\n </div>\n\n {updateBot.error && (\n <p className=\"text-xs text-status-error\">{(updateBot.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={updateBot.isPending}\n className=\"btn-primary text-xs\"\n >\n {updateBot.isPending ? 'Saving...' : 'Save'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { Trash2, Key, Plus, Copy, Check } from 'lucide-react';\nimport {\n useBotApiKeys,\n useCreateBotApiKey,\n useRevokeBotApiKey,\n useAddBotRole,\n useRemoveBotRole,\n} from '../../../api/bots';\nimport { useRoles } from '../../../api/roles';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { TimeAgo } from '../../../components/common/display/TimeAgo';\nimport type { BotRecord, BotApiKeyRecord, LTRoleType } from '../../../api/types';\n\nfunction ApiKeysSection({ botId }: { botId: string }) {\n const { data } = useBotApiKeys(botId);\n const createKey = useCreateBotApiKey();\n const revokeKey = useRevokeBotApiKey();\n\n const [newKeyName, setNewKeyName] = useState('');\n const [selectedScope, setSelectedScope] = useState<'read' | 'full'>('read');\n const [generatedKey, setGeneratedKey] = useState<string | null>(null);\n const [copied, setCopied] = useState(false);\n const [confirmRevoke, setConfirmRevoke] = useState<BotApiKeyRecord | null>(null);\n\n const keys = data?.keys ?? [];\n\n const SCOPE_PRESETS = {\n read: { label: 'Read only', scopes: ['mcp:read'], hint: 'Discovery and monitoring — read-safe tools only' },\n full: { label: 'Full access', scopes: ['mcp:read', 'mcp:full'], hint: 'All tools — can modify state' },\n } as const;\n\n const handleGenerate = () => {\n if (!newKeyName.trim()) return;\n createKey.mutate(\n { botId, name: newKeyName.trim(), scopes: SCOPE_PRESETS[selectedScope].scopes as unknown as string[] },\n {\n onSuccess: (result: any) => {\n setGeneratedKey(result.rawKey);\n setNewKeyName('');\n },\n },\n );\n };\n\n const handleCopy = () => {\n if (!generatedKey) return;\n navigator.clipboard.writeText(generatedKey);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n const handleRevoke = () => {\n if (!confirmRevoke) return;\n revokeKey.mutate(\n { botId, keyId: confirmRevoke.id },\n { onSuccess: () => setConfirmRevoke(null) },\n );\n };\n\n return (\n <div>\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-3\">\n API Keys\n </p>\n\n {generatedKey && (\n <div className=\"mb-3 p-3 bg-status-success/10 border border-status-success/30 rounded-md\">\n <p className=\"text-2xs font-semibold text-status-success mb-1\">\n Key generated — copy now, it won't be shown again\n </p>\n <div className=\"flex items-center gap-2\">\n <code className=\"text-2xs font-mono text-text-primary bg-surface-sunken px-2 py-1 rounded flex-1 min-w-0 overflow-hidden text-ellipsis whitespace-nowrap\">\n {generatedKey}\n </code>\n <button\n onClick={handleCopy}\n className=\"text-text-tertiary hover:text-text-primary shrink-0\"\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 </button>\n </div>\n </div>\n )}\n\n {keys.length === 0 ? (\n <p className=\"text-xs text-text-tertiary mb-3\">No API keys.</p>\n ) : (\n <div className=\"space-y-1.5 mb-3\">\n {keys.map((k) => (\n <div\n key={k.id}\n className=\"group/key flex items-center justify-between px-2.5 py-1.5 bg-surface-sunken rounded text-xs\"\n >\n <div className=\"flex items-center gap-2 flex-wrap\">\n <Key className=\"w-3 h-3 text-text-tertiary\" />\n <span className=\"text-text-primary font-mono\">{k.name}</span>\n {(k.scopes ?? []).map((s: string) => (\n <span key={s} className={`px-1.5 py-0.5 rounded text-2xs font-mono ${s.includes('full') ? 'bg-status-warning/15 text-status-warning' : 'bg-accent/10 text-accent'}`}>\n {s}\n </span>\n ))}\n {k.last_used_at && (\n <span className=\"text-2xs text-text-tertiary\">\n used <TimeAgo date={k.last_used_at} />\n </span>\n )}\n </div>\n <button\n onClick={() => setConfirmRevoke(k)}\n className=\"opacity-0 group-hover/key:opacity-100 transition-opacity text-text-tertiary hover:text-status-error\"\n title=\"Revoke key\"\n >\n <Trash2 className=\"w-3 h-3\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* Stacked like the user panel's Add Role form — the input takes the\n full row, then the fixed-width scope toggle and button share the\n second row. Nothing here can widen the 360px column. */}\n <div className=\"space-y-2\">\n <input\n type=\"text\"\n value={newKeyName}\n onChange={(e) => setNewKeyName(e.target.value)}\n placeholder=\"Key name...\"\n className=\"input text-xs font-mono\"\n />\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex rounded-md border border-surface-border overflow-hidden shrink-0\">\n {(Object.entries(SCOPE_PRESETS) as [keyof typeof SCOPE_PRESETS, typeof SCOPE_PRESETS[keyof typeof SCOPE_PRESETS]][]).map(([key, preset]) => (\n <button\n key={key}\n type=\"button\"\n onClick={() => setSelectedScope(key)}\n title={preset.hint}\n className={`px-2.5 py-1 text-2xs font-medium transition-colors ${\n selectedScope === key\n ? 'bg-accent text-text-inverse'\n : 'bg-surface text-text-secondary hover:bg-surface-hover'\n }`}\n >\n {preset.label}\n </button>\n ))}\n </div>\n <button\n onClick={handleGenerate}\n disabled={!newKeyName.trim() || createKey.isPending}\n className=\"btn-primary text-xs inline-flex items-center gap-1 shrink-0\"\n >\n <Plus className=\"w-3 h-3\" />\n {createKey.isPending ? '...' : 'Generate'}\n </button>\n </div>\n </div>\n {createKey.error && (\n <p className=\"text-2xs text-status-error mt-1\">{(createKey.error as Error).message}</p>\n )}\n\n <ConfirmDeleteModal\n open={!!confirmRevoke}\n onClose={() => setConfirmRevoke(null)}\n onConfirm={handleRevoke}\n title=\"Revoke API Key\"\n description={\n <>\n Revoke API key{' '}\n <span className=\"font-medium text-text-primary font-mono\">\n {confirmRevoke?.name}\n </span>\n ? This bot will no longer be able to authenticate with this key.\n </>\n }\n isPending={revokeKey.isPending}\n error={revokeKey.error as Error | null}\n />\n </div>\n );\n}\n\nfunction RolesSection({ bot }: { bot: BotRecord }) {\n const { data: allRolesData } = useRoles();\n const addRole = useAddBotRole();\n const removeRole = useRemoveBotRole();\n const [newRole, setNewRole] = useState('');\n const [newType, setNewType] = useState<LTRoleType>('member');\n\n const allRoles = allRolesData?.roles ?? [];\n const currentRoles = bot.roles ?? [];\n\n const available = useMemo(() => {\n const assigned = new Set(currentRoles.map((r) => r.role));\n return allRoles.filter((r) => !assigned.has(r));\n }, [allRoles, currentRoles]);\n\n const handleAdd = () => {\n if (!newRole.trim()) return;\n addRole.mutate(\n { botId: bot.id, role: newRole.trim(), type: newType },\n { onSuccess: () => { setNewRole(''); setNewType('member'); } },\n );\n };\n\n const handleRemove = (role: string) => {\n removeRole.mutate({ botId: bot.id, role });\n };\n\n return (\n <div>\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-3\">\n Roles\n </p>\n\n {currentRoles.length === 0 ? (\n <p className=\"text-xs text-text-tertiary mb-3\">No roles assigned.</p>\n ) : (\n <div className=\"flex flex-wrap gap-2 mb-3\">\n {currentRoles.map((r) => (\n <span\n key={r.role}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary\"\n >\n <RolePill role={r.role} />\n <span className=\"text-2xs text-text-tertiary\">{r.type}</span>\n <button\n onClick={() => handleRemove(r.role)}\n className=\"text-text-tertiary hover:text-status-error transition-colors ml-0.5\"\n title={`Remove ${r.role}`}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n\n {available.length > 0 && (\n <div className=\"space-y-2\">\n {/* Same stacked form as the user panel's Add Role — full-width\n selects that can never push the button off-screen. */}\n <select\n value={newRole}\n onChange={(e) => setNewRole(e.target.value)}\n className=\"select text-xs font-mono w-full min-w-0\"\n aria-label=\"Role\"\n >\n <option value=\"\">Select a role...</option>\n {available.map((r) => (\n <option key={r} value={r}>{r}</option>\n ))}\n </select>\n <div className=\"grid grid-cols-2 gap-2 items-end\">\n <div className=\"min-w-0\">\n <label className=\"block text-2xs text-text-tertiary mb-1\">Type</label>\n <select\n value={newType}\n onChange={(e) => setNewType(e.target.value as LTRoleType)}\n className=\"select text-xs w-full min-w-0\"\n aria-label=\"Role type\"\n >\n <option value=\"member\">member</option>\n <option value=\"admin\">admin</option>\n <option value=\"superadmin\">superadmin</option>\n </select>\n </div>\n <div className=\"flex justify-end\">\n <button\n onClick={handleAdd}\n disabled={!newRole || addRole.isPending}\n className=\"btn-primary text-xs\"\n >\n {addRole.isPending ? '...' : 'Add Role'}\n </button>\n </div>\n </div>\n </div>\n )}\n {addRole.error && (\n <p className=\"text-2xs text-status-error mt-1\">{(addRole.error as Error).message}</p>\n )}\n </div>\n );\n}\n\nexport function BotDetailPanel({ bot }: { bot: BotRecord | null }) {\n if (!bot) {\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px]\">\n <p className=\"text-xs text-text-tertiary\">\n Select a service account to manage its API keys and roles.\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px] space-y-6\">\n <div>\n <p className=\"text-sm text-text-primary\">{bot.display_name || bot.external_id}</p>\n {bot.description && (\n <p className=\"text-xs text-text-tertiary mt-0.5\">{bot.description}</p>\n )}\n </div>\n\n <ApiKeysSection botId={bot.id} />\n <RolesSection bot={bot} />\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { Pencil, Trash2 } from 'lucide-react';\nimport { useBots, useDeleteBot } from '../../../api/bots';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect, FilterInput } from '../../../components/common/data/FilterBar';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { DateValue } from '../../../components/common/display/DateValue';\nimport type { BotRecord } from '../../../api/types';\nimport { CreateBotModal } from './CreateBotModal';\nimport { EditBotModal } from './EditBotModal';\nimport { BotDetailPanel } from './BotDetailPanel';\n\nconst statusDot: Record<string, string> = {\n active: 'bg-status-success',\n inactive: 'bg-text-tertiary',\n suspended: 'bg-status-error',\n};\n\nconst statusOptions = [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'suspended', label: 'Suspended' },\n];\n\nexport function BotsPage({ embedded = false }: { embedded?: boolean }) {\n // Same filter surface as the User Accounts tab: search + status, both\n // URL-driven and resolved server-side (never a client-side pass over a\n // paginated page).\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { status: '', search: '' },\n });\n const deleteBot = useDeleteBot();\n\n const [showCreate, setShowCreate] = useState(false);\n const [editingBot, setEditingBot] = useState<BotRecord | null>(null);\n const [selectedBot, setSelectedBot] = useState<BotRecord | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<BotRecord | null>(null);\n\n const { data, isLoading } = useBots({\n status: filters.status || undefined,\n search: filters.search || undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n const bots = data?.bots ?? [];\n\n const activeBot = useMemo(() => {\n if (!selectedBot) return null;\n return bots.find((b) => b.id === selectedBot.id) ?? selectedBot;\n }, [bots, selectedBot]);\n\n const columns: Column<BotRecord>[] = [\n {\n key: 'display_name',\n label: 'Service Account',\n render: (row) => (\n <div className=\"flex items-center gap-2.5\">\n <span\n className={`w-2.5 h-2.5 rounded-full dot-ring shrink-0 ${statusDot[row.status] ?? 'bg-status-pending'}`}\n title={row.status}\n />\n <span className=\"text-sm text-text-primary whitespace-nowrap\">\n {row.display_name || row.external_id}\n </span>\n </div>\n ),\n },\n {\n key: 'description',\n label: 'Description',\n render: (row) => (\n <span\n className=\"block max-w-[32rem] truncate text-xs text-text-tertiary\"\n title={row.description ?? undefined}\n >\n {row.description ?? ''}\n </span>\n ),\n },\n {\n key: 'roles',\n label: 'Roles',\n render: (row) => (\n <div className=\"flex gap-1 flex-wrap\">\n {(row.roles ?? []).map((r) => (\n <RolePill key={r.role} role={r.role} />\n ))}\n </div>\n ),\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <DateValue date={row.created_at} />,\n className: 'w-36 whitespace-nowrap',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Pencil}\n title=\"Edit service account\"\n onClick={() => setEditingBot(row)}\n />\n <RowAction\n icon={Trash2}\n title=\"Delete service account\"\n onClick={() => setConfirmDelete(row)}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteBot.mutate(confirmDelete.id, {\n onSuccess: () => {\n setConfirmDelete(null);\n if (selectedBot?.id === confirmDelete.id) setSelectedBot(null);\n },\n });\n };\n\n return (\n <div>\n {embedded ? (\n <div className=\"flex justify-end mb-4\">\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add Service Account\n </button>\n </div>\n ) : (\n <PageHeader\n title=\"Service Accounts\"\n actions={\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add Service Account\n </button>\n }\n />\n )}\n\n <FilterBar>\n <FilterInput\n label=\"Search\"\n value={filters.search}\n onChange={(v) => setFilter('search', v)}\n placeholder=\"name, id, description…\"\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={statusOptions}\n />\n </FilterBar>\n\n <div className=\"grid grid-cols-1 @split:grid-cols-[1fr_360px] gap-6 items-start\">\n <div className=\"overflow-x-clip\">\n <DataTable\n columns={columns}\n data={bots}\n keyFn={(row) => row.id}\n isLoading={isLoading}\n emptyMessage=\"No service accounts yet\"\n onRowClick={(row) => setSelectedBot(row)}\n activeRowKey={activeBot?.id ?? null}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n\n <div className=\"sticky top-4\">\n <BotDetailPanel bot={activeBot} />\n </div>\n </div>\n\n <CreateBotModal open={showCreate} onClose={() => setShowCreate(false)} />\n\n <EditBotModal\n open={!!editingBot}\n onClose={() => setEditingBot(null)}\n bot={editingBot}\n />\n\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete Service Account\"\n description={\n <>\n Delete{' '}\n <span className=\"font-medium text-text-primary\">\n {confirmDelete?.display_name || confirmDelete?.external_id}\n </span>\n ? This will also revoke all API keys. This action cannot be undone.\n </>\n }\n isPending={deleteBot.isPending}\n error={deleteBot.error as Error | null}\n />\n </div>\n );\n}\n","import { useState } from 'react';\nimport { KeyRound } from 'lucide-react';\n\n/** One atomic patch: deleting is explicit, an absent key means keep. */\nexport interface PropertyOps {\n set?: Record<string, unknown>;\n remove?: string[];\n rename?: Record<string, string>;\n}\n\n/**\n * A generic key/value dictionary editor that emits ATOMIC patch ops — it\n * never round-trips the whole dictionary, so editing one property can never\n * clobber another. Dictionary-agnostic by design: the owner wires `onPatch`\n * to whichever properties surface it manages (user properties today; any\n * dictionary with a patch endpoint tomorrow).\n *\n * - Add / edit value / rename key / delete (with confirm), one op at a time.\n * - Values JSON-parse with a string fallback, so numbers, booleans, and\n * objects round-trip typed.\n * - `systemKeys` are marked (the platform reads them — e.g. badge scheme\n * facets) and their edits sit behind a confirm step.\n */\nexport function PropertiesEditor({ value, systemKeys = [], pending = false, error, onPatch }: {\n value: Record<string, unknown> | null | undefined;\n systemKeys?: string[];\n pending?: boolean;\n /** The owner's last patch error (e.g. a 409 identity conflict), shown inline. */\n error?: string | null;\n onPatch: (ops: PropertyOps) => void;\n}) {\n const entries = Object.entries(value ?? {});\n const systemSet = new Set(systemKeys);\n\n const [editingKey, setEditingKey] = useState<string | null>(null);\n const [draftName, setDraftName] = useState('');\n const [draftValue, setDraftValue] = useState('');\n const [pendingRemove, setPendingRemove] = useState<string | null>(null);\n const [confirmSystem, setConfirmSystem] = useState<string | null>(null);\n const [ghostName, setGhostName] = useState('');\n const [ghostValue, setGhostValue] = useState('');\n const [inlineError, setInlineError] = useState<string | null>(null);\n\n const format = (v: unknown) => (typeof v === 'string' ? v : JSON.stringify(v));\n const parse = (raw: string): unknown => {\n const trimmed = raw.trim();\n try { return JSON.parse(trimmed); } catch { return trimmed; }\n };\n\n function startEdit(key: string) {\n if (systemSet.has(key) && confirmSystem !== key) {\n setConfirmSystem(key);\n return;\n }\n setConfirmSystem(null);\n setEditingKey(key);\n setDraftName(key);\n setDraftValue(format((value ?? {})[key]));\n setPendingRemove(null);\n setInlineError(null);\n }\n\n function commitEdit() {\n if (editingKey === null) return;\n const name = draftName.trim();\n if (!name) { setInlineError('Property name is required'); return; }\n if (name !== editingKey && entries.some(([k]) => k === name)) {\n setInlineError(`\"${name}\" already exists`);\n return;\n }\n const ops: PropertyOps = {};\n if (name !== editingKey) ops.rename = { [editingKey]: name };\n const nextValue = parse(draftValue);\n if (format(nextValue) !== format((value ?? {})[editingKey]) || name !== editingKey) {\n // A renamed key keeps its value unless the value also changed; a value\n // change lands under the (possibly new) name — one atomic patch.\n if (format(nextValue) !== format((value ?? {})[editingKey])) {\n ops.set = { [name]: nextValue };\n }\n }\n if (!ops.set && !ops.rename) { cancelEdit(); return; }\n onPatch(ops);\n cancelEdit();\n }\n\n function cancelEdit() {\n setEditingKey(null);\n setDraftName('');\n setDraftValue('');\n setInlineError(null);\n }\n\n function commitAdd() {\n const name = ghostName.trim();\n if (!name) { setInlineError('Property name is required'); return; }\n if (entries.some(([k]) => k === name)) {\n setInlineError(`\"${name}\" already exists`);\n return;\n }\n onPatch({ set: { [name]: parse(ghostValue) } });\n setGhostName('');\n setGhostValue('');\n setInlineError(null);\n }\n\n return (\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary\">\n Properties\n </p>\n\n {entries.length === 0 && (\n <p className=\"text-xs text-text-tertiary italic\">No properties — add one below.</p>\n )}\n\n {entries.map(([key, val]) => {\n const isSystem = systemSet.has(key);\n const isEditing = editingKey === key;\n const isRemoving = pendingRemove === key;\n return (\n <div key={key} className=\"group text-xs\">\n {isEditing ? (\n <div className=\"space-y-1.5 border-l-2 border-l-accent pl-2\">\n <input\n value={draftName}\n onChange={(e) => setDraftName(e.target.value)}\n aria-label=\"Property name\"\n className=\"input text-xs w-full min-w-0 font-mono\"\n />\n <input\n value={draftValue}\n onChange={(e) => setDraftValue(e.target.value)}\n aria-label=\"Property value\"\n placeholder=\"value (string or JSON)\"\n className=\"input text-xs w-full min-w-0\"\n />\n <div className=\"flex gap-2\">\n <button onClick={commitEdit} disabled={pending} className=\"text-2xs font-medium text-accent hover:text-accent-hover\">\n {pending ? 'Saving...' : 'Save'}\n </button>\n <button onClick={cancelEdit} className=\"text-2xs text-text-tertiary hover:text-text-secondary\">Cancel</button>\n <button\n onClick={() => { setPendingRemove(key); setEditingKey(null); }}\n className=\"text-2xs text-status-error/50 hover:text-status-error ml-auto\"\n >\n Remove\n </button>\n </div>\n </div>\n ) : isRemoving ? (\n <span className=\"flex items-center gap-2 text-2xs\">\n <span className=\"text-status-error\">Remove <span className=\"font-medium font-mono\">{key}</span>?</span>\n <button\n onClick={() => { onPatch({ remove: [key] }); setPendingRemove(null); }}\n disabled={pending}\n className=\"font-medium text-status-error hover:text-status-error/80\"\n >\n {pending ? '...' : 'Yes'}\n </button>\n <button onClick={() => setPendingRemove(null)} className=\"text-text-tertiary hover:text-text-secondary\">No</button>\n </span>\n ) : confirmSystem === key ? (\n <span className=\"flex items-center gap-2 text-2xs\">\n <span className=\"text-text-secondary\">\n <span className=\"font-mono font-medium\">{key}</span> is a system property — the platform resolves identities with it. Edit?\n </span>\n <button onClick={() => startEdit(key)} className=\"font-medium text-accent hover:text-accent-hover\">Edit</button>\n <button onClick={() => setConfirmSystem(null)} className=\"text-text-tertiary hover:text-text-secondary\">Cancel</button>\n </span>\n ) : (\n <button\n onClick={() => startEdit(key)}\n className=\"flex items-center gap-2 w-full min-w-0 text-left rounded px-1 py-0.5 -mx-1 hover:bg-surface-hover transition-colors\"\n title={`Edit ${key}`}\n >\n <span className=\"font-mono font-medium text-text-secondary shrink-0\">{key}</span>\n {isSystem && (\n <span className=\"shrink-0 text-accent/80\" title=\"system\">\n <KeyRound className=\"w-3 h-3\" aria-label=\"system\" />\n </span>\n )}\n {/* Value right-aligns so the section reads tabular. */}\n <span className=\"flex-1 min-w-0 truncate text-right text-text-primary tabular-nums\">{format(val)}</span>\n </button>\n )}\n </div>\n );\n })}\n\n {/* Add row */}\n <div className=\"pt-1.5 border-t border-surface-border space-y-1.5\">\n <div className=\"grid grid-cols-2 gap-2\">\n <input\n value={ghostName}\n onChange={(e) => setGhostName(e.target.value)}\n placeholder=\"property\"\n aria-label=\"New property name\"\n className=\"input text-xs w-full min-w-0 font-mono\"\n />\n <input\n value={ghostValue}\n onChange={(e) => setGhostValue(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') commitAdd(); }}\n placeholder=\"value\"\n aria-label=\"New property value\"\n className=\"input text-xs w-full min-w-0\"\n />\n </div>\n {ghostName.trim() && (\n <div className=\"flex justify-end\">\n <button onClick={commitAdd} disabled={pending} className=\"btn-primary text-xs\">\n {pending ? '...' : 'Add Property'}\n </button>\n </div>\n )}\n </div>\n\n {(inlineError || error) && (\n <p role=\"alert\" className=\"text-2xs text-status-error\">{inlineError || error}</p>\n )}\n </div>\n );\n}\n","import type { LTReadScope, LTWriteScope } from '../api/types';\n\n// The work-surface scope a `member` carries, presented as named grants. Each\n// preset is a point in the (read, write) lattice (write ⊆ read). admin/superadmin\n// always act on all and never show a scope picker.\nexport interface ScopePreset {\n value: string; // `${read}|${write}`\n label: string;\n read_scope: LTReadScope;\n write_scope: LTWriteScope;\n}\n\n// Labels are parallel and structured around the two axes (see / act) so the\n// difference between profiles is scannable, not a run-on sentence.\nexport const SCOPE_PRESETS: ScopePreset[] = [\n { value: 'all|all', label: 'See all · act on all', read_scope: 'all', write_scope: 'all' },\n { value: 'all|self', label: 'See all · act on self', read_scope: 'all', write_scope: 'self' },\n { value: 'self|self', label: 'See self · act on self', read_scope: 'self', write_scope: 'self' },\n { value: 'all|none', label: 'See all · read-only', read_scope: 'all', write_scope: 'none' },\n { value: 'self|none', label: 'See self · read-only', read_scope: 'self', write_scope: 'none' },\n];\n\nexport const DEFAULT_SCOPE_VALUE = 'all|all';\n\nexport function scopeKey(read: LTReadScope, write: LTWriteScope): string {\n return `${read}|${write}`;\n}\n\nexport function scopePreset(value: string): ScopePreset {\n return SCOPE_PRESETS.find((p) => p.value === value) ?? SCOPE_PRESETS[0];\n}\n","import { useState, useMemo } from 'react';\nimport { Drama } from 'lucide-react';\nimport { Link } from 'react-router-dom';\nimport { useRoles } from '../../../api/roles';\nimport { useAddUserRole, useRemoveUserRole, usePatchUserProperties, useSystemPropertyKeys } from '../../../api/users';\nimport { PropertiesEditor } from '../../../components/common/form/PropertiesEditor';\nimport {\n usePersonas,\n useUserPersonas,\n useAssignPersona,\n useUnassignPersona,\n} from '../../../api/personas';\nimport type { LTUserRecord, LTRoleType } from '../../../api/types';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { ScopeBadge } from '../../../components/common/display/ScopeBadge';\nimport {\n SCOPE_PRESETS,\n DEFAULT_SCOPE_VALUE,\n scopePreset,\n} from '../../../lib/roleScope';\n\n/**\n * The panel's section surface — the same distinct-surface treatment the\n * resolver form's SectionGroup uses, so the three blocks read as sections,\n * not a run of text.\n */\nfunction PanelSection({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"border border-surface-border bg-surface-sunken rounded-[var(--lt-radius-section)] p-4\">\n {children}\n </div>\n );\n}\n\n/**\n * The user's properties dictionary (lt_users.metadata) as an editable\n * key/value table. Every edit is ONE atomic patch — changing a property can\n * never clobber its siblings, and a rename never opens a key-absent window.\n * Identity-binding keys (badge scheme facets) are marked as system\n * properties; a duplicate identity value answers a 409 shown inline.\n */\nfunction PropertiesBlock({ user }: { user: LTUserRecord }) {\n const patch = usePatchUserProperties();\n const { data: systemKeys } = useSystemPropertyKeys();\n\n return (\n <PanelSection>\n <PropertiesEditor\n value={user.metadata ?? {}}\n systemKeys={systemKeys?.keys ?? []}\n pending={patch.isPending}\n error={patch.error ? (patch.error as Error).message : null}\n onPatch={(ops) => patch.mutate({ id: user.id, ops })}\n />\n </PanelSection>\n );\n}\n\n/**\n * Persona assignment for the selected user. A persona is shorthand for scoped\n * role memberships — assigning one composes the user's whole surface; the\n * membership list below reflects the fan-out (rows marked with the sustaining\n * persona's key).\n */\nfunction PersonaBlock({ user }: { user: LTUserRecord }) {\n const { data: allPersonas } = usePersonas();\n const { data: held } = useUserPersonas(user.id);\n const assign = useAssignPersona();\n const unassign = useUnassignPersona();\n const [newPersona, setNewPersona] = useState('');\n\n const heldPersonas = held?.personas ?? [];\n const available = useMemo(() => {\n const keys = new Set(heldPersonas.map((p) => p.key));\n return (allPersonas?.personas ?? []).filter((p) => !keys.has(p.key));\n }, [allPersonas, heldPersonas]);\n\n if (heldPersonas.length === 0 && available.length === 0) return null;\n\n return (\n <PanelSection>\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary\">\n Personas\n </p>\n {heldPersonas.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n {heldPersonas.map((p) => (\n <span\n key={p.key}\n className=\"flex items-center gap-2.5 w-full min-w-0 pl-2.5 pr-2 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary\"\n >\n <Drama className=\"w-3 h-3 shrink-0 text-text-tertiary\" aria-hidden />\n <Link\n to={`/admin/personas/${encodeURIComponent(p.key)}`}\n className=\"flex-1 min-w-0 truncate transition-colors hover:text-accent\"\n title={p.key}\n >\n {p.title || p.key}\n </Link>\n <span className=\"shrink-0 text-2xs text-text-tertiary tabular-nums\">\n {p.roles.length} role{p.roles.length === 1 ? '' : 's'}\n </span>\n <button\n onClick={() => unassign.mutate({ userId: user.id, key: p.key })}\n className=\"shrink-0 text-text-tertiary hover:text-status-error transition-colors ml-1\"\n title={`Unassign ${p.title || p.key}`}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n {available.length > 0 && (\n <div className=\"flex gap-2\">\n <select\n value={newPersona}\n onChange={(e) => setNewPersona(e.target.value)}\n className=\"select text-xs w-full min-w-0\"\n aria-label=\"Persona\"\n >\n <option value=\"\">Assign a persona...</option>\n {available.map((p) => (\n <option key={p.key} value={p.key}>{p.title || p.key}</option>\n ))}\n </select>\n <button\n onClick={() => {\n if (!newPersona) return;\n assign.mutate(\n { userId: user.id, key: newPersona },\n { onSuccess: () => setNewPersona('') },\n );\n }}\n disabled={!newPersona || assign.isPending}\n className=\"btn-primary text-xs shrink-0\"\n >\n {assign.isPending ? '...' : 'Assign'}\n </button>\n </div>\n )}\n {(assign.error || unassign.error) && (\n <p className=\"text-2xs text-status-error\">\n {((assign.error || unassign.error) as Error).message}\n </p>\n )}\n </div>\n </PanelSection>\n );\n}\n\nexport function RolePanel({ user }: { user: LTUserRecord | null }) {\n const { data: allRolesData } = useRoles();\n const addRole = useAddUserRole();\n const removeRole = useRemoveUserRole();\n const [newRole, setNewRole] = useState('');\n const [newType, setNewType] = useState<LTRoleType>('member');\n // Work-surface scope applies to `member`; admin/superadmin act on the whole queue.\n const [newScope, setNewScope] = useState(DEFAULT_SCOPE_VALUE);\n\n const allRoles = allRolesData?.roles ?? [];\n const currentRoles = user?.roles ?? [];\n\n const available = useMemo(() => {\n const assigned = new Set(currentRoles.map((r) => r.role));\n return allRoles.filter((r) => !assigned.has(r));\n }, [allRoles, currentRoles]);\n\n const handleAdd = () => {\n if (!user || !newRole.trim()) return;\n const preset = newType === 'member' ? scopePreset(newScope) : scopePreset(DEFAULT_SCOPE_VALUE);\n addRole.mutate(\n {\n userId: user.id,\n role: newRole.trim(),\n type: newType,\n read_scope: preset.read_scope,\n write_scope: preset.write_scope,\n },\n { onSuccess: () => { setNewRole(''); setNewType('member'); setNewScope(DEFAULT_SCOPE_VALUE); } },\n );\n };\n\n const handleRemove = (role: string) => {\n if (!user) return;\n removeRole.mutate({ userId: user.id, role });\n };\n\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 pb-8 min-h-[300px]\">\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-4\">\n Role Membership\n </p>\n\n {!user ? (\n <p className=\"text-xs text-text-tertiary\">\n Select a user to manage their roles.\n </p>\n ) : (\n <div className=\"space-y-6\">\n <div>\n <p className=\"text-sm text-text-primary\">{user.display_name || user.external_id}</p>\n </div>\n\n <PersonaBlock user={user} />\n\n {/* Roles section — membership list plus the add form. */}\n <PanelSection>\n <div className=\"space-y-4\">\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary\">Roles</p>\n\n {currentRoles.length === 0 ? (\n <p className=\"text-xs text-text-tertiary\">No roles assigned.</p>\n ) : (\n <div className=\"flex flex-col gap-2\">\n {currentRoles.map((r) => (\n <span\n key={r.role}\n className=\"flex items-center gap-2.5 w-full min-w-0 pl-2.5 pr-2 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary\"\n >\n {/* The universal role pill leads and truncates; the fixed\n facts (type, scope, remove) keep their width so columns\n align across stacked rows. */}\n <span className=\"flex-1 min-w-0 truncate\" title={r.role}>\n <RolePill role={r.role} tone=\"inherit\" />\n </span>\n <span className=\"w-14 shrink-0 text-2xs uppercase tracking-wide text-text-tertiary\">{r.type}</span>\n {r.type === 'member' && (\n <>\n <span className=\"w-px h-3 bg-surface-border shrink-0\" aria-hidden />\n <ScopeBadge read={r.read_scope} write={r.write_scope} className=\"shrink-0\" />\n </>\n )}\n {r.granted_by_persona && (\n <span\n className=\"shrink-0\"\n title={`Granted by persona ${r.granted_by_persona}`}\n >\n <Drama className=\"w-3 h-3 text-text-tertiary\" aria-hidden />\n </span>\n )}\n <button\n onClick={() => handleRemove(r.role)}\n className=\"shrink-0 text-text-tertiary hover:text-status-error transition-colors ml-1\"\n title={`Remove ${r.role}`}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n\n {available.length > 0 && (\n <div className=\"pt-3 border-t border-surface-border space-y-2\">\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary\">\n Add Role\n </p>\n {/* Stacked, label-over-control fields (the app's form pattern) —\n every control is w-full/min-w-0, so a long role key or scope\n label can never widen the column or push the button away. */}\n <select\n value={newRole}\n onChange={(e) => setNewRole(e.target.value)}\n className=\"select text-xs font-mono w-full min-w-0\"\n aria-label=\"Role\"\n >\n <option value=\"\">Select a role...</option>\n {available.map((r) => (\n <option key={r} value={r}>{r}</option>\n ))}\n </select>\n <div className=\"grid grid-cols-2 gap-2\">\n <div className=\"min-w-0\">\n <label className=\"block text-2xs text-text-tertiary mb-1\">Type</label>\n <select\n value={newType}\n onChange={(e) => setNewType(e.target.value as LTRoleType)}\n className=\"select text-xs w-full min-w-0\"\n aria-label=\"Role type\"\n >\n <option value=\"member\">member</option>\n <option value=\"admin\">admin</option>\n <option value=\"superadmin\">superadmin</option>\n </select>\n </div>\n {newType === 'member' && (\n <div className=\"min-w-0\">\n <label className=\"block text-2xs text-text-tertiary mb-1\">Scope</label>\n <select\n value={newScope}\n onChange={(e) => setNewScope(e.target.value)}\n className=\"select text-xs w-full min-w-0\"\n aria-label=\"Work-surface scope\"\n >\n {SCOPE_PRESETS.map((p) => (\n <option key={p.value} value={p.value}>{p.label}</option>\n ))}\n </select>\n </div>\n )}\n </div>\n <div className=\"flex justify-end pt-1\">\n <button\n onClick={handleAdd}\n disabled={!newRole || addRole.isPending}\n className=\"btn-primary text-xs\"\n >\n {addRole.isPending ? '...' : 'Add Role'}\n </button>\n </div>\n {addRole.error && (\n <p className=\"text-2xs text-status-error\">{(addRole.error as Error).message}</p>\n )}\n </div>\n )}\n </div>\n </PanelSection>\n\n <PropertiesBlock user={user} />\n </div>\n )}\n </div>\n );\n}\n","import { User, Bot } from 'lucide-react';\nimport { SegmentedTabs } from '../../../components/common/layout/SegmentedTabs';\n\nexport type AccountTab = 'users' | 'service-accounts';\n\nexport function AccountTabToggle({ active, onChange }: { active: AccountTab; onChange: (t: AccountTab) => void }) {\n return (\n <SegmentedTabs<AccountTab>\n aria-label=\"Account kind\"\n active={active}\n onChange={onChange}\n tabs={[\n { key: 'users', label: 'User Accounts', icon: <User className=\"w-3.5 h-3.5\" /> },\n { key: 'service-accounts', label: 'Service Accounts', icon: <Bot className=\"w-3.5 h-3.5\" /> },\n ]}\n />\n );\n}\n","import { useState, useMemo } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { Pencil, Trash2 } from 'lucide-react';\nimport { useAccess } from '../../../hooks/useAccess';\nimport { useUsers, useDeleteUser } from '../../../api/users';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect, FilterInput } from '../../../components/common/data/FilterBar';\nimport { DateValue } from '../../../components/common/display/DateValue';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport type { LTUserRecord } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { CreateUserModal } from './CreateUserModal';\nimport { EditUserModal } from './EditUserModal';\nimport { BotsPage } from '../bots/BotsPage';\nimport { RolePanel } from './RolePanel';\nimport { AccountTabToggle, type AccountTab } from './AccountTabToggle';\n\nconst statusOptions = [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'suspended', label: 'Suspended' },\n];\n\nconst statusDot: Record<string, string> = {\n active: 'bg-status-success',\n inactive: 'bg-text-tertiary',\n suspended: 'bg-status-error',\n};\n\nexport function UsersPage() {\n const { isBuilder } = useAccess();\n const [searchParams, setSearchParams] = useSearchParams();\n const tabParam = searchParams.get('tab');\n const activeTab: AccountTab = (isBuilder && tabParam === 'service-accounts') ? 'service-accounts' : 'users';\n\n const handleTabChange = (tab: AccountTab) => {\n if (tab === 'users') {\n setSearchParams({});\n } else {\n setSearchParams({ tab });\n }\n };\n\n return (\n <div>\n <PageHeader\n title=\"Accounts\"\n docsHash=\"#docs:dashboard.md:accounts\"\n actions={isBuilder ? <AccountTabToggle active={activeTab} onChange={handleTabChange} /> : undefined}\n />\n {activeTab === 'users' ? <UserAccountsPanel /> : <BotsPage embedded />}\n </div>\n );\n}\n\nfunction UserAccountsPanel() {\n const { isBuilder } = useAccess();\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { status: '', search: '' },\n });\n const deleteUser = useDeleteUser();\n\n const [showCreate, setShowCreate] = useState(false);\n const [editingUser, setEditingUser] = useState<LTUserRecord | null>(null);\n const [selectedUser, setSelectedUser] = useState<LTUserRecord | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<LTUserRecord | null>(null);\n\n const { data, isLoading } = useUsers({\n status: filters.status || undefined,\n search: filters.search || undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n const users = data?.users ?? [];\n\n const activeUser = useMemo(() => {\n if (!selectedUser) return null;\n return users.find((u) => u.id === selectedUser.id) ?? selectedUser;\n }, [users, selectedUser]);\n\n const columns: Column<LTUserRecord>[] = [\n {\n key: 'display_name',\n label: 'User',\n render: (row) => (\n <div className=\"flex items-center gap-2.5\">\n <span\n className={`w-2.5 h-2.5 rounded-full dot-ring shrink-0 ${statusDot[row.status] ?? 'bg-status-pending'}`}\n title={row.status}\n />\n <span className=\"text-xs text-text-primary whitespace-nowrap\">\n {row.display_name || row.external_id}\n </span>\n </div>\n ),\n },\n {\n key: 'email',\n label: 'Email',\n render: (row) =>\n row.email ? (\n <span className=\"text-xs text-text-secondary whitespace-nowrap\">{row.email}</span>\n ) : (\n <span className=\"text-xs text-text-quaternary\">—</span>\n ),\n },\n {\n key: 'roles',\n label: 'Roles',\n render: (row) => (\n <div className=\"flex gap-2 flex-wrap\">\n {(row.roles ?? []).map((r) => (\n <RolePill key={r.role} role={r.role} size=\"md\" />\n ))}\n </div>\n ),\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <DateValue date={row.created_at} />,\n className: 'w-36 whitespace-nowrap',\n },\n ...(isBuilder ? [{\n key: 'actions' as const,\n label: '',\n render: (row: LTUserRecord) => (\n <RowActionGroup>\n <RowAction\n icon={Pencil}\n title=\"Edit user\"\n onClick={() => setEditingUser(row)}\n />\n <RowAction\n icon={Trash2}\n title=\"Delete user\"\n onClick={() => setConfirmDelete(row)}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n }] : []),\n ];\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteUser.mutate(confirmDelete.id, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n return (\n <div>\n {isBuilder && (\n <div className=\"flex justify-end mb-4\">\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add User\n </button>\n </div>\n )}\n\n {/* Same filter surface as the Service Accounts tab: search + status. */}\n <FilterBar>\n <FilterInput\n label=\"Search\"\n value={filters.search}\n onChange={(v) => setFilter('search', v)}\n placeholder=\"name, email, id…\"\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={statusOptions}\n />\n </FilterBar>\n\n {/* 360px right column — same width as the Service Accounts tab's panel\n (BotsPage), so the two Accounts tabs share one layout rhythm. */}\n <div className=\"grid grid-cols-1 @split:grid-cols-[1fr_460px] gap-6 items-start\">\n {/* Left — users table */}\n <div className=\"overflow-x-clip\">\n <DataTable\n columns={columns}\n data={users}\n keyFn={(row) => row.id}\n isLoading={isLoading}\n emptyMessage=\"No users found\"\n onRowClick={(row) => setSelectedUser(row)}\n activeRowKey={activeUser?.id ?? null}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n\n {/* Right — role management panel */}\n <div className=\"sticky top-4\">\n <RolePanel user={activeUser} />\n </div>\n </div>\n\n <CreateUserModal open={showCreate} onClose={() => setShowCreate(false)} />\n\n <EditUserModal\n open={!!editingUser}\n onClose={() => setEditingUser(null)}\n user={editingUser}\n />\n\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete User\"\n description={\n <>\n Delete{' '}\n <span className=\"font-medium text-text-primary\">\n {confirmDelete?.display_name || confirmDelete?.external_id}\n </span>\n ? This action cannot be undone.\n </>\n }\n isPending={deleteUser.isPending}\n error={deleteUser.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["CreateUserModal","open","onClose","createUser","useCreateUser","form","setForm","useState","prevOpen","setPrevOpen","handleCreate","set","field","value","f","jsx","Modal","jsxs","e","EditUserModal","user","updateUser","useUpdateUser","prevUser","setPrevUser","handleSave","CreateBotModal","createBot","useCreateBot","EditBotModal","bot","updateBot","useUpdateBot","prevBot","setPrevBot","ApiKeysSection","botId","data","useBotApiKeys","createKey","useCreateBotApiKey","revokeKey","useRevokeBotApiKey","newKeyName","setNewKeyName","selectedScope","setSelectedScope","generatedKey","setGeneratedKey","copied","setCopied","confirmRevoke","setConfirmRevoke","keys","SCOPE_PRESETS","handleGenerate","result","handleCopy","handleRevoke","Check","Copy","k","Key","s","TimeAgo","Trash2","key","preset","Plus","ConfirmDeleteModal","Fragment","RolesSection","allRolesData","useRoles","addRole","useAddBotRole","removeRole","useRemoveBotRole","newRole","setNewRole","newType","setNewType","allRoles","currentRoles","available","useMemo","assigned","r","handleAdd","handleRemove","role","RolePill","BotDetailPanel","statusDot","statusOptions","BotsPage","embedded","filters","setFilter","pagination","useFilterParams","deleteBot","useDeleteBot","showCreate","setShowCreate","editingBot","setEditingBot","selectedBot","setSelectedBot","confirmDelete","setConfirmDelete","isLoading","useBots","total","bots","activeBot","b","columns","row","DateValue","RowActionGroup","RowAction","Pencil","handleDelete","PageHeader","FilterBar","FilterInput","v","FilterSelect","DataTable","StickyPagination","PropertiesEditor","systemKeys","pending","error","onPatch","entries","systemSet","editingKey","setEditingKey","draftName","setDraftName","draftValue","setDraftValue","pendingRemove","setPendingRemove","confirmSystem","setConfirmSystem","ghostName","setGhostName","ghostValue","setGhostValue","inlineError","setInlineError","format","parse","raw","trimmed","startEdit","commitEdit","name","ops","nextValue","cancelEdit","commitAdd","val","isSystem","isEditing","isRemoving","KeyRound","DEFAULT_SCOPE_VALUE","scopePreset","p","PanelSection","children","PropertiesBlock","patch","usePatchUserProperties","useSystemPropertyKeys","PersonaBlock","allPersonas","usePersonas","held","useUserPersonas","assign","useAssignPersona","unassign","useUnassignPersona","newPersona","setNewPersona","heldPersonas","Drama","Link","RolePanel","useAddUserRole","useRemoveUserRole","newScope","setNewScope","ScopeBadge","AccountTabToggle","active","onChange","SegmentedTabs","User","Bot","UsersPage","isBuilder","useAccess","searchParams","setSearchParams","useSearchParams","tabParam","activeTab","handleTabChange","tab","UserAccountsPanel","deleteUser","useDeleteUser","editingUser","setEditingUser","selectedUser","setSelectedUser","useUsers","users","activeUser","u"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as a,b as
|
|
2
|
-
//# sourceMappingURL=knowledge-
|
|
1
|
+
import{u as a,b as l,c as s}from"./vendor-query-RUZdMvN6.js";import{l as u}from"./index-D9rtK9QF.js";function g(){return a({queryKey:["knowledge","domains"],queryFn:()=>u("/knowledge/domains")})}function f(n,e){var t;const r=new URLSearchParams;r.set("domain",n),(t=e==null?void 0:e.tags)!=null&&t.length&&r.set("tags",e.tags.join(",")),e!=null&&e.search&&r.set("search",e.search),(e==null?void 0:e.limit)!=null&&r.set("limit",String(e.limit)),(e==null?void 0:e.offset)!=null&&r.set("offset",String(e.offset));const i=r.toString();return a({queryKey:["knowledge",n,e==null?void 0:e.tags,e==null?void 0:e.search,e==null?void 0:e.limit,e==null?void 0:e.offset],queryFn:()=>u(`/knowledge/entries?${i}`),enabled:!!n})}function y(n,e){const r=new URLSearchParams;n&&r.set("domain",n),e&&r.set("key",e);const i=r.toString();return a({queryKey:["knowledge",n,e],queryFn:()=>u(`/knowledge/entry?${i}`),enabled:!!n&&!!e})}function o(n,e,r){const i=new URLSearchParams;return n&&i.set("domain",n),e&&i.set("key",e),a({queryKey:["knowledge",n,e,"versions"],queryFn:()=>u(`/knowledge/entry/versions?${i}`),enabled:!!n&&!!e&&r})}function w(n,e,r){const i=new URLSearchParams;return n&&i.set("domain",n),e&&i.set("key",e),r!=null&&i.set("version",String(r)),a({queryKey:["knowledge",n,e,"version",r],queryFn:()=>u(`/knowledge/entry?${i}`),enabled:!!n&&!!e&&r!=null,staleTime:1/0})}function m(){const n=l();return s({mutationFn:e=>u("/knowledge/entry",{method:"POST",body:JSON.stringify(e)}),onSuccess:()=>{n.invalidateQueries({queryKey:["knowledge"]})}})}function q(){const n=l();return s({mutationFn:e=>u("/knowledge/field",{method:"PUT",body:JSON.stringify(e)}),onSuccess:()=>{n.invalidateQueries({queryKey:["knowledge"]})}})}function S(){const n=l();return s({mutationFn:({domain:e,key:r,path:i})=>{const t=new URLSearchParams({domain:e,key:r,path:i});return u(`/knowledge/field?${t}`,{method:"DELETE"})},onSuccess:()=>{n.invalidateQueries({queryKey:["knowledge"]})}})}function h(){const n=l();return s({mutationFn:({domain:e,key:r})=>{const i=new URLSearchParams({domain:e,key:r});return u(`/knowledge/entry?${i}`,{method:"DELETE"})},onSuccess:()=>{n.invalidateQueries({queryKey:["knowledge"]})}})}export{h as a,m as b,q as c,S as d,o as e,w as f,g,f as h,y as u};
|
|
2
|
+
//# sourceMappingURL=knowledge-8_TilyaY.js.map
|