@hotmeshio/long-tail 0.14.1 → 0.14.3
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/build/api/escalations/bulk.d.ts +18 -0
- package/build/api/escalations/bulk.js +49 -1
- package/build/api/escalations/helpers.d.ts +11 -1
- package/build/api/escalations/helpers.js +30 -3
- package/build/api/escalations/index.d.ts +1 -1
- package/build/api/escalations/index.js +2 -1
- package/build/routes/escalations/bulk.js +6 -0
- package/build/sdk/index.d.ts +4 -0
- package/build/sdk/index.js +1 -0
- package/build/services/escalation/bulk.d.ts +27 -0
- package/build/services/escalation/bulk.js +39 -0
- package/build/services/escalation/sql.d.ts +17 -0
- package/build/services/escalation/sql.js +44 -1
- package/build/system/mcp-servers/admin/escalations.js +13 -1
- package/build/system/mcp-servers/admin/schemas.d.ts +10 -0
- package/build/system/mcp-servers/admin/schemas.js +6 -2
- package/build/system/seed/tool-manifests-admin.d.ts +88 -0
- package/build/system/seed/tool-manifests-admin.js +2 -1
- package/dashboard/dist/assets/{AdminDashboard-C4h1R-lz.js → AdminDashboard-BS3wd7Zg.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-C4h1R-lz.js.map → AdminDashboard-BS3wd7Zg.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-EWC8VQ7R.js → AgentConfigPage-4C9aU0dj.js} +6 -6
- package/dashboard/dist/assets/{AgentConfigPage-EWC8VQ7R.js.map → AgentConfigPage-4C9aU0dj.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-DaLfa80d.js → AgentDetailPage-B6uvDnMF.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-DaLfa80d.js.map → AgentDetailPage-B6uvDnMF.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-islj_zrh.js → AgentsPage-vtxdvdrQ.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-islj_zrh.js.map → AgentsPage-vtxdvdrQ.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-C9VKPhD6.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-C9VKPhD6.js.map +1 -0
- package/dashboard/dist/assets/BotPicker-CkY9u7nD.js +2 -0
- package/dashboard/dist/assets/{BotPicker-CnX8xfka.js.map → BotPicker-CkY9u7nD.js.map} +1 -1
- package/dashboard/dist/assets/BulkAssignModal-OIbUDYlC.js +2 -0
- package/dashboard/dist/assets/BulkAssignModal-OIbUDYlC.js.map +1 -0
- package/dashboard/dist/assets/CapabilitiesPage-Bkbq_GO6.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-DK7wGMFt.js.map → CapabilitiesPage-Bkbq_GO6.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-WqEpMTyx.js → CollapsibleSection-Zuz9HkFL.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-WqEpMTyx.js.map → CollapsibleSection-Zuz9HkFL.js.map} +1 -1
- package/dashboard/dist/assets/CountdownTimer-CGnk4Bw_.js +2 -0
- package/dashboard/dist/assets/CountdownTimer-CGnk4Bw_.js.map +1 -0
- package/dashboard/dist/assets/{CredentialsPage-CfT60FiU.js → CredentialsPage-CAmDMnzV.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-CfT60FiU.js.map → CredentialsPage-CAmDMnzV.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-ds7dLz6S.js → CronLabel-DX2woCPZ.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-ds7dLz6S.js.map → CronLabel-DX2woCPZ.js.map} +1 -1
- package/dashboard/dist/assets/{DataTable-Bir0Xs1p.js → DataTable-DFPMeqyQ.js} +2 -2
- package/dashboard/dist/assets/DataTable-DFPMeqyQ.js.map +1 -0
- package/dashboard/dist/assets/{DropZone-DovkhN2p.js → DropZone-7UoXQ4qL.js} +2 -2
- package/dashboard/dist/assets/{DropZone-DovkhN2p.js.map → DropZone-7UoXQ4qL.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-DRQhFky_.js → ElapsedCell-D2old1NF.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-DRQhFky_.js.map → ElapsedCell-D2old1NF.js.map} +1 -1
- package/dashboard/dist/assets/{EntityTimelinePanel-nCgWdmpK.js → EntityTimelinePanel-m9baDiW0.js} +2 -2
- package/dashboard/dist/assets/{EntityTimelinePanel-nCgWdmpK.js.map → EntityTimelinePanel-m9baDiW0.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-DBCnPMG9.js → EscalationListSchemaPage-BPr7Ou8c.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-DBCnPMG9.js.map → EscalationListSchemaPage-BPr7Ou8c.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-DfzRTqhV.js → EscalationSchemaPage-83n5JyAh.js} +3 -3
- package/dashboard/dist/assets/{EscalationSchemaPage-DfzRTqhV.js.map → EscalationSchemaPage-83n5JyAh.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-CWd2Ivso.js → EscalationsOverview-CDJ5wRlq.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-CWd2Ivso.js.map → EscalationsOverview-CDJ5wRlq.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-Dm9Fbab1.js → EventTable-DRUHkKtv.js} +2 -2
- package/dashboard/dist/assets/{EventTable-Dm9Fbab1.js.map → EventTable-DRUHkKtv.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-DR4cJvTB.js → FilterBar-C06DK5Oa.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-DR4cJvTB.js.map → FilterBar-C06DK5Oa.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-DQt64Ru0.js → GraphInvokePage-DSlyTmyq.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-DQt64Ru0.js.map → GraphInvokePage-DSlyTmyq.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-D7qNiqtw.js → HomePage-DXzDBkQV.js} +2 -2
- package/dashboard/dist/assets/{HomePage-D7qNiqtw.js.map → HomePage-DXzDBkQV.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-BdZkpRMo.js → ListToolbar-BvpGFFYp.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-BdZkpRMo.js.map → ListToolbar-BvpGFFYp.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-DHAEYY1b.js → McpOverview-C2atR_B6.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-DHAEYY1b.js.map → McpOverview-C2atR_B6.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-BfGhRO_c.js → McpQueryDetailPage-BUxPspjB.js} +3 -3
- package/dashboard/dist/assets/{McpQueryDetailPage-BfGhRO_c.js.map → McpQueryDetailPage-BUxPspjB.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryPage-CM_Fgl9G.js +2 -0
- package/dashboard/dist/assets/{McpQueryPage-3EXLX1Eq.js.map → McpQueryPage-CM_Fgl9G.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-DHI0F65P.js → McpRunDetailPage-Bo9vXQBA.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-DHI0F65P.js.map → McpRunDetailPage-Bo9vXQBA.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-C6-KpYCY.js → McpRunsPage-BwsgvGtg.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-C6-KpYCY.js.map → McpRunsPage-BwsgvGtg.js.map} +1 -1
- package/dashboard/dist/assets/{NamespacePill-BeifzjUm.js → NamespacePill-CKp_9EaI.js} +2 -2
- package/dashboard/dist/assets/{NamespacePill-BeifzjUm.js.map → NamespacePill-CKp_9EaI.js.map} +1 -1
- package/dashboard/dist/assets/OperationsPage-BftWAJ9m.js +3 -0
- package/dashboard/dist/assets/OperationsPage-BftWAJ9m.js.map +1 -0
- package/dashboard/dist/assets/{OperatorDashboard-DLp9gCTA.js → OperatorDashboard-CKjrYYFi.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-DLp9gCTA.js.map → OperatorDashboard-CKjrYYFi.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-BpeBHqyc.js → PageHeader-CDDpHpdv.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-BpeBHqyc.js.map → PageHeader-CDDpHpdv.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-JXeUFa_g.js → PageHeaderWithStats-DIWH6fRv.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-JXeUFa_g.js.map → PageHeaderWithStats-DIWH6fRv.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-DFv4Zwmq.js → PersonaDetailPage-BsIPtBxZ.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-DFv4Zwmq.js.map → PersonaDetailPage-BsIPtBxZ.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-C52o87Zv.js → PersonasPage-62hANmNf.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-C52o87Zv.js.map → PersonasPage-62hANmNf.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-CKCxXogl.js → ProcessDetailPage-DS_t9DcR.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-CKCxXogl.js.map → ProcessDetailPage-DS_t9DcR.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-D1bxIy7-.js → ProcessesListPage-Ch2tSICc.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-D1bxIy7-.js.map → ProcessesListPage-Ch2tSICc.js.map} +1 -1
- package/dashboard/dist/assets/{RoleDetailPage-_MrbOGW_.js → RoleDetailPage-DVbtnTvn.js} +3 -3
- package/dashboard/dist/assets/{RoleDetailPage-_MrbOGW_.js.map → RoleDetailPage-DVbtnTvn.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-EocCXZh0.js → RolePill-C0hExOmI.js} +2 -2
- package/dashboard/dist/assets/{RolePill-EocCXZh0.js.map → RolePill-C0hExOmI.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-ZVCkB4iF.js → RolesPage-CK6FjD5P.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-ZVCkB4iF.js.map → RolesPage-CK6FjD5P.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-ImueSaJ4.js +2 -0
- package/dashboard/dist/assets/{RunAsSelector-BAqa1Tya.js.map → RunAsSelector-ImueSaJ4.js.map} +1 -1
- package/dashboard/dist/assets/{ScanCodesPage-b7WkFiy-.js → ScanCodesPage-CDqLJuCq.js} +2 -2
- package/dashboard/dist/assets/{ScanCodesPage-b7WkFiy-.js.map → ScanCodesPage-CDqLJuCq.js.map} +1 -1
- package/dashboard/dist/assets/ScanSchemeDetailPage-DO6qtJdM.js +2 -0
- package/dashboard/dist/assets/ScanSchemeDetailPage-DO6qtJdM.js.map +1 -0
- package/dashboard/dist/assets/ScanStationPage-ID3xMhds.js +2 -0
- package/dashboard/dist/assets/{ScanStationPage-CPC9CdCR.js.map → ScanStationPage-ID3xMhds.js.map} +1 -1
- package/dashboard/dist/assets/{ScopeBadge-H5dEqeHi.js → ScopeBadge-BBQvz4pj.js} +2 -2
- package/dashboard/dist/assets/{ScopeBadge-H5dEqeHi.js.map → ScopeBadge-BBQvz4pj.js.map} +1 -1
- package/dashboard/dist/assets/StatusBadge-BDeUwPtb.js +2 -0
- package/dashboard/dist/assets/StatusBadge-BDeUwPtb.js.map +1 -0
- package/dashboard/dist/assets/{StickyPagination-CgSzarlP.js → StickyPagination-XA1krmz5.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-CgSzarlP.js.map → StickyPagination-XA1krmz5.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-B4E3S5RB.js → StreamMessageDetail-DziA1g1e.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-B4E3S5RB.js.map → StreamMessageDetail-DziA1g1e.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-BkcjucMZ.js → SwimlaneTimeline-DTNEnHiF.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-BkcjucMZ.js.map → SwimlaneTimeline-DTNEnHiF.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-Ch5u6iPH.js → TagInput-BXxXs1JD.js} +2 -2
- package/dashboard/dist/assets/{TagInput-Ch5u6iPH.js.map → TagInput-BXxXs1JD.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-D7e8x2gX.js → TaskDetailPage-U19sJHAI.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-D7e8x2gX.js.map → TaskDetailPage-U19sJHAI.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-Bz146p-P.js → TaskQueuePill-BKGJBVZG.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-Bz146p-P.js.map → TaskQueuePill-BKGJBVZG.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-B4mxP9Ey.js → TasksListPage-jc4Xk7kI.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-B4mxP9Ey.js.map → TasksListPage-jc4Xk7kI.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-D6sbYsUO.js → TimeAgo-GWgJ0LVq.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-D6sbYsUO.js.map → TimeAgo-GWgJ0LVq.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-DFDf3NAT.js → TimestampCell-Dk1TVsFV.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-DFDf3NAT.js.map → TimestampCell-Dk1TVsFV.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-sj8OkBB0.js → ToolPill-BY6zLSfA.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-sj8OkBB0.js.map → ToolPill-BY6zLSfA.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-DbWw0-Le.js → ToolTestPanel-BKcqnR68.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-DbWw0-Le.js.map → ToolTestPanel-BKcqnR68.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-C6CPcvuO.js → TopicDetailPage-D8GcDu_0.js} +4 -4
- package/dashboard/dist/assets/{TopicDetailPage-C6CPcvuO.js.map → TopicDetailPage-D8GcDu_0.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-C8_XpeT2.js → TopicsPage-BT9LV3yH.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-C8_XpeT2.js.map → TopicsPage-BT9LV3yH.js.map} +1 -1
- package/dashboard/dist/assets/UserName-BrwZnLjU.js +2 -0
- package/dashboard/dist/assets/{UserName-CIoJvf_e.js.map → UserName-BrwZnLjU.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-CldfHwky.js +2 -0
- package/dashboard/dist/assets/WorkflowExecutionPage-CldfHwky.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowPill-BcA7S3gI.js → WorkflowPill-qp5UF3-y.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-BcA7S3gI.js.map → WorkflowPill-qp5UF3-y.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-y2L_zwnf.js → WorkflowsDashboard-DkyGkxW1.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-y2L_zwnf.js.map → WorkflowsDashboard-DkyGkxW1.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-ChE1Mm3P.js → WorkflowsOverview-DACADuUE.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-ChE1Mm3P.js.map → WorkflowsOverview-DACADuUE.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-D0aY_inb.js → YamlWorkflowDetailPage-DSAjzido.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-D0aY_inb.js.map → YamlWorkflowDetailPage-DSAjzido.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-DJ0JitPs.js → YamlWorkflowsPage-CqoSFz5B.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-DJ0JitPs.js.map → YamlWorkflowsPage-CqoSFz5B.js.map} +1 -1
- package/dashboard/dist/assets/{agents-Bu5Ly_ER.js → agents-Cg_e-aaf.js} +2 -2
- package/dashboard/dist/assets/{agents-Bu5Ly_ER.js.map → agents-Cg_e-aaf.js.map} +1 -1
- package/dashboard/dist/assets/{bots-Cb14wZ1Y.js → bots-B047yNJ0.js} +2 -2
- package/dashboard/dist/assets/{bots-Cb14wZ1Y.js.map → bots-B047yNJ0.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-DeHLk9JJ.js → capabilities-CI1dbCDk.js} +2 -2
- package/dashboard/dist/assets/{capabilities-DeHLk9JJ.js.map → capabilities-CI1dbCDk.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-YBZ3SbA6.js → controlplane-Cy7snw7f.js} +2 -2
- package/dashboard/dist/assets/{controlplane-YBZ3SbA6.js.map → controlplane-Cy7snw7f.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-CA9DQlhA.js → escalation-columns-BNrONMYj.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-CA9DQlhA.js.map → escalation-columns-BNrONMYj.js.map} +1 -1
- package/dashboard/dist/assets/index-B6Grf1WQ.js +6 -0
- package/dashboard/dist/assets/index-B6Grf1WQ.js.map +1 -0
- package/dashboard/dist/assets/{index-CQriisJy.js → index-Bf3hVGXZ.js} +2 -2
- package/dashboard/dist/assets/{index-CQriisJy.js.map → index-Bf3hVGXZ.js.map} +1 -1
- package/dashboard/dist/assets/{index-YUv7aNb4.js → index-Bxd2sXqz.js} +2 -2
- package/dashboard/dist/assets/{index-YUv7aNb4.js.map → index-Bxd2sXqz.js.map} +1 -1
- package/dashboard/dist/assets/index-CJV2pWNH.css +1 -0
- package/dashboard/dist/assets/{index-B4Nea96C.js → index-COKZW8Xx.js} +2 -2
- package/dashboard/dist/assets/{index-B4Nea96C.js.map → index-COKZW8Xx.js.map} +1 -1
- package/dashboard/dist/assets/{index-BRmgxeZM.js → index-C_y0lQ_o.js} +3 -3
- package/dashboard/dist/assets/{index-BRmgxeZM.js.map → index-C_y0lQ_o.js.map} +1 -1
- package/dashboard/dist/assets/{index-BaDimDGQ.js → index-DAUV3eJ-.js} +2 -2
- package/dashboard/dist/assets/{index-BaDimDGQ.js.map → index-DAUV3eJ-.js.map} +1 -1
- package/dashboard/dist/assets/{index-BAKroiNw.js → index-DVtIMrTb.js} +2 -2
- package/dashboard/dist/assets/{index-BAKroiNw.js.map → index-DVtIMrTb.js.map} +1 -1
- package/dashboard/dist/assets/index-Ds5rGe-i.js +3 -0
- package/dashboard/dist/assets/index-Ds5rGe-i.js.map +1 -0
- package/dashboard/dist/assets/{index-B7fE-rND.js → index-DyTb77Jb.js} +2 -2
- package/dashboard/dist/assets/{index-B7fE-rND.js.map → index-DyTb77Jb.js.map} +1 -1
- package/dashboard/dist/assets/{index-B0qNe7Ux.js → index-Uk6N1qiH.js} +2 -2
- package/dashboard/dist/assets/{index-B0qNe7Ux.js.map → index-Uk6N1qiH.js.map} +1 -1
- package/dashboard/dist/assets/index-X3_AxcUk.js +2 -0
- package/dashboard/dist/assets/{index-chMUPSOd.js.map → index-X3_AxcUk.js.map} +1 -1
- package/dashboard/dist/assets/{index-Ntul2ZC1.js → index-lGfBW1PB.js} +29 -28
- package/dashboard/dist/assets/index-lGfBW1PB.js.map +1 -0
- package/dashboard/dist/assets/{index-D5MSJsiW.js → index-nUmEwQrg.js} +2 -2
- package/dashboard/dist/assets/{index-D5MSJsiW.js.map → index-nUmEwQrg.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-B1HqYuB2.js → knowledge-DsIUzscY.js} +2 -2
- package/dashboard/dist/assets/{knowledge-B1HqYuB2.js.map → knowledge-DsIUzscY.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-dhihqJpH.js → mcp-D889kZ-c.js} +2 -2
- package/dashboard/dist/assets/{mcp-dhihqJpH.js.map → mcp-D889kZ-c.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-B_gkB7JK.js → mcp-query-Cs9J2pVT.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-B_gkB7JK.js.map → mcp-query-Cs9J2pVT.js.map} +1 -1
- package/dashboard/dist/assets/{personas-Bw_OlfI6.js → personas-xHB16O-Q.js} +2 -2
- package/dashboard/dist/assets/{personas-Bw_OlfI6.js.map → personas-xHB16O-Q.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-BYwn0LXY.js → pipelines-DnTPjw1v.js} +2 -2
- package/dashboard/dist/assets/{pipelines-BYwn0LXY.js.map → pipelines-DnTPjw1v.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-t6bPmJ7P.js → tasks-BcDvp6dL.js} +2 -2
- package/dashboard/dist/assets/{tasks-t6bPmJ7P.js.map → tasks-BcDvp6dL.js.map} +1 -1
- package/dashboard/dist/assets/{topics-Bgo9xw80.js → topics-DXw6BNy5.js} +2 -2
- package/dashboard/dist/assets/{topics-Bgo9xw80.js.map → topics-DXw6BNy5.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-BJbMbg_h.js → useEventHooks-C-bsD8zP.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-BJbMbg_h.js.map → useEventHooks-C-bsD8zP.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-CaXJuSFG.js → useNamespace-wZCsEF6O.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-CaXJuSFG.js.map → useNamespace-wZCsEF6O.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-B47LQrDk.js → useYamlActivityEvents-Cu_o4-ow.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-B47LQrDk.js.map → useYamlActivityEvents-Cu_o4-ow.js.map} +1 -1
- package/dashboard/dist/assets/{users-D0jvzUqW.js → users-XpCq_umD.js} +2 -2
- package/dashboard/dist/assets/{users-D0jvzUqW.js.map → users-XpCq_umD.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-BPsNpK3Y.js → vendor-icons-BgsXTN4h.js} +145 -140
- package/dashboard/dist/assets/vendor-icons-BgsXTN4h.js.map +1 -0
- package/dashboard/dist/assets/{workflows-DRoZRrMH.js → workflows-CMxHVqQ8.js} +2 -2
- package/dashboard/dist/assets/{workflows-DRoZRrMH.js.map → workflows-CMxHVqQ8.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-BdhYyIef.js → yaml-workflows-kxOF5yEC.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-BdhYyIef.js.map → yaml-workflows-kxOF5yEC.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/api/http/escalations.md +29 -0
- package/docs/dashboard.md +2 -0
- package/docs/events.md +1 -1
- package/docs/hitl/x-lt-footer.md +6 -0
- package/docs/hitl/x-lt-list-schema.md +4 -2
- package/package.json +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-B8NjwwKQ.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-B8NjwwKQ.js.map +0 -1
- package/dashboard/dist/assets/BotPicker-CnX8xfka.js +0 -2
- package/dashboard/dist/assets/CapabilitiesPage-DK7wGMFt.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-BvQw_3WJ.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-BvQw_3WJ.js.map +0 -1
- package/dashboard/dist/assets/CustomDurationPicker-D-iY1f4n.js +0 -2
- package/dashboard/dist/assets/CustomDurationPicker-D-iY1f4n.js.map +0 -1
- package/dashboard/dist/assets/DataTable-Bir0Xs1p.js.map +0 -1
- package/dashboard/dist/assets/McpQueryPage-3EXLX1Eq.js +0 -2
- package/dashboard/dist/assets/OperationsPage-BNW7uris.js +0 -3
- package/dashboard/dist/assets/OperationsPage-BNW7uris.js.map +0 -1
- package/dashboard/dist/assets/RunAsSelector-BAqa1Tya.js +0 -2
- package/dashboard/dist/assets/ScanSchemeDetailPage-BCsEgS-s.js +0 -2
- package/dashboard/dist/assets/ScanSchemeDetailPage-BCsEgS-s.js.map +0 -1
- package/dashboard/dist/assets/ScanStationPage-CPC9CdCR.js +0 -2
- package/dashboard/dist/assets/StatusBadge-DkgllZHv.js +0 -2
- package/dashboard/dist/assets/StatusBadge-DkgllZHv.js.map +0 -1
- package/dashboard/dist/assets/UserName-CIoJvf_e.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-Bq3kSkRr.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-Bq3kSkRr.js.map +0 -1
- package/dashboard/dist/assets/index-B5jxf81r.css +0 -1
- package/dashboard/dist/assets/index-BhurEB5s.js +0 -6
- package/dashboard/dist/assets/index-BhurEB5s.js.map +0 -1
- package/dashboard/dist/assets/index-Ntul2ZC1.js.map +0 -1
- package/dashboard/dist/assets/index-chMUPSOd.js +0 -2
- package/dashboard/dist/assets/index-uWUJXqGS.js +0 -3
- package/dashboard/dist/assets/index-uWUJXqGS.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-BPsNpK3Y.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PersonasPage-C52o87Zv.js","sources":["../../src/pages/admin/personas/CreatePersonaModal.tsx","../../src/components/common/form/UserCombobox.tsx","../../src/pages/admin/personas/AssigneesPanel.tsx","../../src/pages/admin/personas/PersonasPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useCreatePersona } from '../../../api/personas';\nimport { Modal } from '../../../components/common/modal/Modal';\n\nexport function CreatePersonaModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const navigate = useNavigate();\n const createPersona = useCreatePersona();\n const [key, setKey] = useState('');\n const [title, setTitle] = useState('');\n const [description, setDescription] = useState('');\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) {\n setKey('');\n setTitle('');\n setDescription('');\n createPersona.reset();\n }\n }\n\n const handleCreate = () => {\n const trimmed = key.trim().toLowerCase();\n if (!trimmed) return;\n createPersona.mutate(\n {\n key: trimmed,\n title: title.trim() || undefined,\n description: description.trim() || undefined,\n },\n {\n onSuccess: () => {\n onClose();\n // Land on the detail page to link roles right away.\n navigate(`/admin/personas/${encodeURIComponent(trimmed)}`);\n },\n },\n );\n };\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create Persona\">\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 Key (required)\n </label>\n <input\n type=\"text\"\n value={key}\n onChange={(e) => setKey(e.target.value)}\n placeholder=\"e.g., floor-manager\"\n className=\"input text-xs w-full font-mono\"\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleCreate();\n }}\n />\n <p className=\"text-2xs text-text-tertiary mt-1\">\n Lowercase letters, numbers, hyphens, and underscores only. Stable — it names the persona everywhere.\n </p>\n </div>\n\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Title\n </label>\n <input\n type=\"text\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder=\"e.g., Floor Manager\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Description\n </label>\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"The day in the life, one paragraph.\"\n rows={3}\n className=\"input text-xs w-full resize-y\"\n />\n </div>\n\n {createPersona.error && (\n <p className=\"text-xs text-status-error\">{(createPersona.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={!key.trim() || createPersona.isPending}\n className=\"btn-primary text-xs\"\n >\n {createPersona.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useRef, useEffect, useMemo } from 'react';\nimport { useUsers } from '../../../api/users';\nimport { useDebouncedValue } from '../../../hooks/useDebouncedValue';\n\nexport interface UserComboboxSelection {\n id: string;\n label: string;\n}\n\n/**\n * Searchable inline combobox for picking a user account. The filter drives the\n * server-side account search (name, email, external_id), so the list stays\n * bounded no matter how many accounts exist; a footer line discloses when more\n * matches remain than the page shows. Styled to match CapabilityCombobox.\n */\nexport function UserCombobox({ selected, onSelect, excludeIds = [], placeholder = 'Search users…' }: {\n selected: UserComboboxSelection | null;\n onSelect: (user: UserComboboxSelection | null) => void;\n /** Accounts to hide from the results (e.g. already assigned). */\n excludeIds?: string[];\n placeholder?: string;\n}) {\n const [open, setOpen] = useState(false);\n const [filter, setFilter] = useState('');\n const containerRef = useRef<HTMLDivElement>(null);\n\n const debounced = useDebouncedValue(filter, 300);\n const PAGE = 20;\n const { data, isFetching } = useUsers({\n search: debounced.trim() || undefined,\n limit: PAGE,\n });\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n function handleClick(e: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [open]);\n\n const excluded = useMemo(() => new Set(excludeIds), [excludeIds]);\n const users = (data?.users ?? []).filter((u) => !excluded.has(u.id));\n const total = data?.total ?? 0;\n const truncated = total > (data?.users.length ?? 0);\n\n const displayValue = selected?.label ?? '';\n const filterText = open ? filter : displayValue;\n\n return (\n <div ref={containerRef} className=\"relative\">\n <input\n type=\"text\"\n value={filterText}\n onFocus={() => { setOpen(true); setFilter(''); }}\n onChange={(e) => {\n setFilter(e.target.value);\n if (!e.target.value) onSelect(null);\n if (!open) setOpen(true);\n }}\n placeholder={placeholder}\n className=\"input text-xs w-full min-w-0\"\n aria-label=\"User\"\n />\n\n {open && (\n <div className=\"absolute z-[100] left-0 right-0 mt-1 max-h-64 overflow-y-auto rounded-md border border-surface-border bg-surface shadow-lg\">\n {users.map((u) => {\n const label = u.display_name || u.external_id;\n return (\n <button\n key={u.id}\n type=\"button\"\n onClick={() => {\n onSelect({ id: u.id, label });\n setFilter('');\n setOpen(false);\n }}\n className={`w-full text-left px-3 py-2 hover:bg-surface-hover transition-colors flex items-center gap-3 min-w-0 ${\n selected?.id === u.id ? 'bg-accent/5' : ''\n }`}\n >\n <span className=\"text-xs text-text-primary truncate\">{label}</span>\n {u.email && (\n <span className=\"text-2xs text-text-quaternary truncate\">{u.email}</span>\n )}\n </button>\n );\n })}\n\n {users.length === 0 && (\n <p className=\"px-3 py-4 text-center text-2xs text-text-quaternary\">\n {isFetching ? 'Searching…' : filter ? `No users match \"${filter}\"` : 'No users available'}\n </p>\n )}\n\n {truncated && (\n <p className=\"px-3 py-1.5 text-2xs text-text-quaternary border-t border-surface-border/60 tabular-nums\">\n {users.length} of {total} — type to narrow\n </p>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { useState } from 'react';\nimport { X } from 'lucide-react';\nimport { usePersona, useAssignPersona, useUnassignPersona } from '../../../api/personas';\nimport { DateValue } from '../../../components/common/display/DateValue';\nimport { UserCombobox, type UserComboboxSelection } from '../../../components/common/form/UserCombobox';\n\nconst SECTION_HDR = 'text-2xs font-semibold uppercase tracking-widest text-text-tertiary';\n\n/**\n * The 90% surface: pick a persona in the list, assign a user, and they get\n * every linked role — pins, list schemas, and forms compose from the roles.\n * Rendered in the global shell right panel (key 'persona-assignees').\n */\nexport function AssigneesPanel({\n personaKey,\n onClose,\n}: {\n personaKey: string | null;\n onClose?: () => void;\n}) {\n const { data: persona } = usePersona(personaKey ?? '');\n const assign = useAssignPersona();\n const unassign = useUnassignPersona();\n const [pendingUser, setPendingUser] = useState<UserComboboxSelection | null>(null);\n\n const assignees = persona?.assignees ?? [];\n\n const handleAssign = () => {\n if (!persona || !pendingUser) return;\n assign.mutate(\n { userId: pendingUser.id, key: persona.key },\n { onSuccess: () => setPendingUser(null) },\n );\n };\n\n return (\n <div className=\"h-full overflow-y-auto px-5 pt-4 pb-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <p className={SECTION_HDR}>Assignees</p>\n {onClose && (\n <button onClick={onClose} className=\"icon-link\" title=\"Close\" aria-label=\"Close\">\n <X className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n\n {!persona ? (\n <p className=\"text-xs text-text-tertiary\">\n Select a persona to assign users. An assignee joins every linked role\n at its scope — sidebar pins and forms compose from the roles.\n </p>\n ) : (\n <div className=\"space-y-4\">\n <div>\n <p className=\"text-sm text-text-primary\">{persona.title || persona.key}</p>\n <p className=\"text-2xs text-text-tertiary mt-0.5\">\n {persona.roles.length} role{persona.roles.length === 1 ? '' : 's'} per assignment\n </p>\n </div>\n\n {assignees.length === 0 ? (\n <p className=\"text-xs text-text-tertiary\">\n Assign a user to compose their whole surface in one step.\n </p>\n ) : (\n <div className=\"flex flex-col gap-2\">\n {assignees.map((a) => (\n <span\n key={a.id}\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 <span className=\"flex-1 min-w-0 truncate\" title={a.external_id}>\n {a.display_name || a.external_id}\n </span>\n <span className=\"shrink-0 text-2xs text-text-tertiary\">\n <DateValue date={a.assigned_at} />\n </span>\n <button\n onClick={() => unassign.mutate({ userId: a.id, key: persona.key })}\n className=\"shrink-0 text-text-tertiary hover:text-status-error transition-colors ml-1\"\n title={`Unassign ${a.display_name || a.external_id}`}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n\n <div className=\"pt-3 border-t border-surface-border space-y-2\">\n <p className={SECTION_HDR}>Assign User</p>\n <UserCombobox\n selected={pendingUser}\n onSelect={setPendingUser}\n excludeIds={assignees.map((a) => a.id)}\n />\n <div className=\"flex justify-end pt-1\">\n <button\n onClick={handleAssign}\n disabled={!pendingUser || assign.isPending}\n className=\"btn-primary text-xs\"\n >\n {assign.isPending ? '...' : 'Assign'}\n </button>\n </div>\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 </div>\n )}\n </div>\n );\n}\n","import { useState, useMemo, useEffect, useRef } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Pencil } from 'lucide-react';\nimport { usePersonas } from '../../../api/personas';\nimport { FilterBar, FilterInput } from '../../../components/common/data/FilterBar';\nimport type { LTPersonaRecord } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { useShellPanelOptional } from '../../../hooks/useShellPanel';\nimport { CreatePersonaModal } from './CreatePersonaModal';\nimport { AssigneesPanel } from './AssigneesPanel';\n\n// Shell-panel ownership key — the Assignees panel claims/releases this slot.\nconst ASSIGNEES_PANEL_KEY = 'persona-assignees';\n\n// ── Grid columns ──────────────────────────────────────────────────────────────\n// PERSONA(title, 180px) | KEY(140px) | DESCRIPTION(1fr) | ROLES(220px) | USERS(56px) | CONFIGURE(40px)\n// Mirrors the Roles list: display title leads, exact key is the secondary\n// field, the bundle's role pills preview on the right. Clicking a row selects\n// it for the Assignees panel (the 90% path); the pencil opens configuration.\nconst GRID = '180px 140px 1fr 220px 56px 40px';\n\nconst CELL_TEXT = 'text-text-secondary transition-colors group-hover/row:text-text-primary';\nconst HDR = 'text-2xs font-semibold uppercase tracking-widest text-text-quaternary';\nconst CELL_PY = 'py-2';\nconst ROW_PY = 'py-2.5';\n\n/** Title Case fallback derived from the key, same convention as roles. */\nfunction displayPersonaTitle(p: LTPersonaRecord): string {\n if (p.title) return p.title;\n return p.key.replace(/[-_]+/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction TableHead() {\n return (\n <div\n className=\"grid gap-4 px-3 border-b border-surface-border bg-surface\"\n style={{ gridTemplateColumns: GRID }}\n >\n <span className={`${HDR} ${CELL_PY} flex items-center`}>Persona</span>\n <span className={`${HDR} ${CELL_PY} flex items-center`}>Key</span>\n <span className={`${HDR} ${CELL_PY} flex items-center`}>Description</span>\n <span className={`${HDR} ${CELL_PY} flex items-center`}>Roles</span>\n <span className={`${HDR} ${CELL_PY} flex items-center justify-end`}>Users</span>\n <span className={CELL_PY} />\n </div>\n );\n}\n\nconst ROLE_PREVIEW_LIMIT = 3;\n\nfunction PersonaRow({ persona, active, onClick, onConfigure }: {\n persona: LTPersonaRecord;\n active: boolean;\n onClick: () => void;\n onConfigure: () => void;\n}) {\n const roles = persona.roles ?? [];\n const preview = roles.slice(0, ROLE_PREVIEW_LIMIT);\n const overflow = roles.length - preview.length;\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') onClick(); }}\n className={`grid gap-4 px-3 cursor-pointer group/row transition-colors ${active ? 'bg-surface-hover/60' : 'hover:bg-surface-hover/30'}`}\n style={{ gridTemplateColumns: GRID }}\n >\n <span className={`flex items-center min-w-0 text-sm truncate ${ROW_PY} ${CELL_TEXT}`}>\n {displayPersonaTitle(persona)}\n </span>\n\n <span className={`flex items-center text-xs font-mono truncate ${ROW_PY} text-text-tertiary transition-colors group-hover/row:text-text-secondary`}>\n {persona.key}\n </span>\n\n <span className={`flex items-center min-w-0 text-xs text-text-tertiary truncate ${ROW_PY} transition-colors group-hover/row:text-text-secondary`}>\n {persona.description ?? ''}\n </span>\n\n <div className={`flex items-center flex-wrap gap-x-2.5 gap-y-0.5 min-w-0 ${ROW_PY}`}>\n {preview.map((r) => (\n <span key={r.role} className=\"min-w-0 truncate text-text-secondary\">\n <RolePill role={r.role} tone=\"inherit\" />\n </span>\n ))}\n {overflow > 0 && (\n <span className=\"text-2xs text-text-quaternary tabular-nums\">+{overflow}</span>\n )}\n </div>\n\n <span className={`flex items-center justify-end text-sm tabular-nums ${ROW_PY} transition-colors ${CELL_TEXT}`}>\n {persona.user_count > 0 ? persona.user_count : ''}\n </span>\n\n <span className={`flex items-center justify-end ${ROW_PY}`}>\n <button\n onClick={(e) => { e.stopPropagation(); onConfigure(); }}\n className=\"text-text-quaternary/70 hover:text-accent transition-colors\"\n title={`Configure ${displayPersonaTitle(persona)}`}\n aria-label={`Configure ${displayPersonaTitle(persona)}`}\n >\n <Pencil className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </span>\n </div>\n );\n}\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function PersonasPage() {\n const navigate = useNavigate();\n const { data, isLoading } = usePersonas();\n const shell = useShellPanelOptional();\n const [showCreate, setShowCreate] = useState(false);\n const [search, setSearch] = useState('');\n const [selectedKey, setSelectedKey] = useState<string | null>(null);\n\n const personas = data?.personas ?? [];\n\n // ── Selection ↔ shell panel sync ────────────────────────────────────────────\n // Clicking a row opens the Assignees panel in the shell's right slot; an\n // external close (the panel's X, slot takeover) clears the selection. The\n // applied-key ref guards against re-setting the panel on unrelated renders.\n const appliedKey = useRef<string | null>(null);\n const panelWasOpen = useRef(false);\n useEffect(() => {\n if (!shell) return;\n if (selectedKey === appliedKey.current) return;\n appliedKey.current = selectedKey;\n if (selectedKey) {\n shell.setPanel(\n <AssigneesPanel personaKey={selectedKey} onClose={() => setSelectedKey(null)} />,\n { key: ASSIGNEES_PANEL_KEY, width: 360 },\n );\n } else {\n panelWasOpen.current = false;\n shell.closePanel(ASSIGNEES_PANEL_KEY);\n }\n }, [selectedKey, shell]);\n useEffect(() => {\n if (!shell || !selectedKey) return;\n if (shell.open && shell.ownerKey === ASSIGNEES_PANEL_KEY) {\n panelWasOpen.current = true;\n return;\n }\n if (panelWasOpen.current) {\n panelWasOpen.current = false;\n setSelectedKey(null);\n }\n }, [shell, selectedKey]);\n // Unmount with the panel open releases the slot (keyed — never yanks\n // another claimant's panel).\n const shellRef = useRef(shell);\n shellRef.current = shell;\n useEffect(\n () => () => {\n if (appliedKey.current) shellRef.current?.closePanel(ASSIGNEES_PANEL_KEY);\n },\n [],\n );\n\n const filtered = useMemo(() => {\n const sorted = [...personas].sort((a, b) =>\n displayPersonaTitle(a).localeCompare(displayPersonaTitle(b)),\n );\n if (!search.trim()) return sorted;\n const q = search.toLowerCase();\n return sorted.filter(\n (p) =>\n p.key.toLowerCase().includes(q) ||\n displayPersonaTitle(p).toLowerCase().includes(q) ||\n p.description?.toLowerCase().includes(q) ||\n p.roles?.some((r) => r.role.toLowerCase().includes(q)),\n );\n }, [personas, search]);\n\n return (\n <div>\n <PageHeader\n title=\"Personas\"\n docsHash=\"#docs:dashboard.md:personas\"\n actions={\n <button\n onClick={() => setShowCreate(true)}\n className=\"btn-primary text-xs flex items-center gap-1.5\"\n >\n + Add Persona\n </button>\n }\n />\n\n {/* The standard full-width sticky filter band — above the split. */}\n {!isLoading && personas.length > 0 && (\n <FilterBar>\n <FilterInput\n label=\"Search\"\n value={search}\n onChange={setSearch}\n placeholder={`${personas.length} personas…`}\n />\n {search && filtered.length !== personas.length && (\n <span className=\"text-2xs text-text-quaternary tabular-nums shrink-0\">\n {filtered.length} of {personas.length}\n </span>\n )}\n </FilterBar>\n )}\n\n {/* The table IS the page — selecting a row opens the Assignees panel in\n the shell's right panel; the row pencil opens the persona's config. */}\n <div className=\"overflow-x-clip\">\n {!isLoading && personas.length > 0 && filtered.length > 0 && (\n <div className=\"sticky top-[60px] z-10 bg-surface\">\n <TableHead />\n </div>\n )}\n\n {isLoading ? (\n <div className=\"animate-pulse space-y-3 mt-6\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"h-10 bg-surface-sunken rounded w-full\" />\n ))}\n </div>\n ) : filtered.length === 0 ? (\n <p className=\"text-sm text-text-tertiary mt-8\">\n {search\n ? 'Clear the search to see all personas.'\n : 'Create a persona to bundle roles into a one-step assignment.'}\n </p>\n ) : (\n <div className=\"divide-y divide-surface-border/30\">\n {filtered.map((persona) => (\n <PersonaRow\n key={persona.key}\n persona={persona}\n active={persona.key === selectedKey}\n onClick={() => setSelectedKey(persona.key)}\n onConfigure={() => navigate(`/admin/personas/${encodeURIComponent(persona.key)}`)}\n />\n ))}\n </div>\n )}\n </div>\n\n <CreatePersonaModal open={showCreate} onClose={() => setShowCreate(false)} />\n </div>\n );\n}\n"],"names":["CreatePersonaModal","open","onClose","navigate","useNavigate","createPersona","useCreatePersona","key","setKey","useState","title","setTitle","description","setDescription","prevOpen","setPrevOpen","handleCreate","trimmed","jsx","Modal","jsxs","e","UserCombobox","selected","onSelect","excludeIds","placeholder","setOpen","filter","setFilter","containerRef","useRef","debounced","useDebouncedValue","PAGE","data","isFetching","useUsers","useEffect","handleClick","excluded","useMemo","users","u","total","truncated","displayValue","filterText","label","SECTION_HDR","AssigneesPanel","personaKey","persona","usePersona","assign","useAssignPersona","unassign","useUnassignPersona","pendingUser","setPendingUser","assignees","handleAssign","X","a","DateValue","ASSIGNEES_PANEL_KEY","GRID","CELL_TEXT","HDR","CELL_PY","ROW_PY","displayPersonaTitle","p","c","TableHead","ROLE_PREVIEW_LIMIT","PersonaRow","active","onClick","onConfigure","roles","preview","overflow","r","RolePill","Pencil","PersonasPage","isLoading","usePersonas","shell","useShellPanelOptional","showCreate","setShowCreate","search","setSearch","selectedKey","setSelectedKey","personas","appliedKey","panelWasOpen","shellRef","_a","filtered","sorted","b","q","_b","PageHeader","FilterBar","FilterInput","i"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PersonasPage-62hANmNf.js","sources":["../../src/pages/admin/personas/CreatePersonaModal.tsx","../../src/components/common/form/UserCombobox.tsx","../../src/pages/admin/personas/AssigneesPanel.tsx","../../src/pages/admin/personas/PersonasPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useCreatePersona } from '../../../api/personas';\nimport { Modal } from '../../../components/common/modal/Modal';\n\nexport function CreatePersonaModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const navigate = useNavigate();\n const createPersona = useCreatePersona();\n const [key, setKey] = useState('');\n const [title, setTitle] = useState('');\n const [description, setDescription] = useState('');\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) {\n setKey('');\n setTitle('');\n setDescription('');\n createPersona.reset();\n }\n }\n\n const handleCreate = () => {\n const trimmed = key.trim().toLowerCase();\n if (!trimmed) return;\n createPersona.mutate(\n {\n key: trimmed,\n title: title.trim() || undefined,\n description: description.trim() || undefined,\n },\n {\n onSuccess: () => {\n onClose();\n // Land on the detail page to link roles right away.\n navigate(`/admin/personas/${encodeURIComponent(trimmed)}`);\n },\n },\n );\n };\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create Persona\">\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 Key (required)\n </label>\n <input\n type=\"text\"\n value={key}\n onChange={(e) => setKey(e.target.value)}\n placeholder=\"e.g., floor-manager\"\n className=\"input text-xs w-full font-mono\"\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleCreate();\n }}\n />\n <p className=\"text-2xs text-text-tertiary mt-1\">\n Lowercase letters, numbers, hyphens, and underscores only. Stable — it names the persona everywhere.\n </p>\n </div>\n\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Title\n </label>\n <input\n type=\"text\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder=\"e.g., Floor Manager\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Description\n </label>\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"The day in the life, one paragraph.\"\n rows={3}\n className=\"input text-xs w-full resize-y\"\n />\n </div>\n\n {createPersona.error && (\n <p className=\"text-xs text-status-error\">{(createPersona.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={!key.trim() || createPersona.isPending}\n className=\"btn-primary text-xs\"\n >\n {createPersona.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useRef, useEffect, useMemo } from 'react';\nimport { useUsers } from '../../../api/users';\nimport { useDebouncedValue } from '../../../hooks/useDebouncedValue';\n\nexport interface UserComboboxSelection {\n id: string;\n label: string;\n}\n\n/**\n * Searchable inline combobox for picking a user account. The filter drives the\n * server-side account search (name, email, external_id), so the list stays\n * bounded no matter how many accounts exist; a footer line discloses when more\n * matches remain than the page shows. Styled to match CapabilityCombobox.\n */\nexport function UserCombobox({ selected, onSelect, excludeIds = [], placeholder = 'Search users…' }: {\n selected: UserComboboxSelection | null;\n onSelect: (user: UserComboboxSelection | null) => void;\n /** Accounts to hide from the results (e.g. already assigned). */\n excludeIds?: string[];\n placeholder?: string;\n}) {\n const [open, setOpen] = useState(false);\n const [filter, setFilter] = useState('');\n const containerRef = useRef<HTMLDivElement>(null);\n\n const debounced = useDebouncedValue(filter, 300);\n const PAGE = 20;\n const { data, isFetching } = useUsers({\n search: debounced.trim() || undefined,\n limit: PAGE,\n });\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n function handleClick(e: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [open]);\n\n const excluded = useMemo(() => new Set(excludeIds), [excludeIds]);\n const users = (data?.users ?? []).filter((u) => !excluded.has(u.id));\n const total = data?.total ?? 0;\n const truncated = total > (data?.users.length ?? 0);\n\n const displayValue = selected?.label ?? '';\n const filterText = open ? filter : displayValue;\n\n return (\n <div ref={containerRef} className=\"relative\">\n <input\n type=\"text\"\n value={filterText}\n onFocus={() => { setOpen(true); setFilter(''); }}\n onChange={(e) => {\n setFilter(e.target.value);\n if (!e.target.value) onSelect(null);\n if (!open) setOpen(true);\n }}\n placeholder={placeholder}\n className=\"input text-xs w-full min-w-0\"\n aria-label=\"User\"\n />\n\n {open && (\n <div className=\"absolute z-[100] left-0 right-0 mt-1 max-h-64 overflow-y-auto rounded-md border border-surface-border bg-surface shadow-lg\">\n {users.map((u) => {\n const label = u.display_name || u.external_id;\n return (\n <button\n key={u.id}\n type=\"button\"\n onClick={() => {\n onSelect({ id: u.id, label });\n setFilter('');\n setOpen(false);\n }}\n className={`w-full text-left px-3 py-2 hover:bg-surface-hover transition-colors flex items-center gap-3 min-w-0 ${\n selected?.id === u.id ? 'bg-accent/5' : ''\n }`}\n >\n <span className=\"text-xs text-text-primary truncate\">{label}</span>\n {u.email && (\n <span className=\"text-2xs text-text-quaternary truncate\">{u.email}</span>\n )}\n </button>\n );\n })}\n\n {users.length === 0 && (\n <p className=\"px-3 py-4 text-center text-2xs text-text-quaternary\">\n {isFetching ? 'Searching…' : filter ? `No users match \"${filter}\"` : 'No users available'}\n </p>\n )}\n\n {truncated && (\n <p className=\"px-3 py-1.5 text-2xs text-text-quaternary border-t border-surface-border/60 tabular-nums\">\n {users.length} of {total} — type to narrow\n </p>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { useState } from 'react';\nimport { X } from 'lucide-react';\nimport { usePersona, useAssignPersona, useUnassignPersona } from '../../../api/personas';\nimport { DateValue } from '../../../components/common/display/DateValue';\nimport { UserCombobox, type UserComboboxSelection } from '../../../components/common/form/UserCombobox';\n\nconst SECTION_HDR = 'text-2xs font-semibold uppercase tracking-widest text-text-tertiary';\n\n/**\n * The 90% surface: pick a persona in the list, assign a user, and they get\n * every linked role — pins, list schemas, and forms compose from the roles.\n * Rendered in the global shell right panel (key 'persona-assignees').\n */\nexport function AssigneesPanel({\n personaKey,\n onClose,\n}: {\n personaKey: string | null;\n onClose?: () => void;\n}) {\n const { data: persona } = usePersona(personaKey ?? '');\n const assign = useAssignPersona();\n const unassign = useUnassignPersona();\n const [pendingUser, setPendingUser] = useState<UserComboboxSelection | null>(null);\n\n const assignees = persona?.assignees ?? [];\n\n const handleAssign = () => {\n if (!persona || !pendingUser) return;\n assign.mutate(\n { userId: pendingUser.id, key: persona.key },\n { onSuccess: () => setPendingUser(null) },\n );\n };\n\n return (\n <div className=\"h-full overflow-y-auto px-5 pt-4 pb-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <p className={SECTION_HDR}>Assignees</p>\n {onClose && (\n <button onClick={onClose} className=\"icon-link\" title=\"Close\" aria-label=\"Close\">\n <X className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n\n {!persona ? (\n <p className=\"text-xs text-text-tertiary\">\n Select a persona to assign users. An assignee joins every linked role\n at its scope — sidebar pins and forms compose from the roles.\n </p>\n ) : (\n <div className=\"space-y-4\">\n <div>\n <p className=\"text-sm text-text-primary\">{persona.title || persona.key}</p>\n <p className=\"text-2xs text-text-tertiary mt-0.5\">\n {persona.roles.length} role{persona.roles.length === 1 ? '' : 's'} per assignment\n </p>\n </div>\n\n {assignees.length === 0 ? (\n <p className=\"text-xs text-text-tertiary\">\n Assign a user to compose their whole surface in one step.\n </p>\n ) : (\n <div className=\"flex flex-col gap-2\">\n {assignees.map((a) => (\n <span\n key={a.id}\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 <span className=\"flex-1 min-w-0 truncate\" title={a.external_id}>\n {a.display_name || a.external_id}\n </span>\n <span className=\"shrink-0 text-2xs text-text-tertiary\">\n <DateValue date={a.assigned_at} />\n </span>\n <button\n onClick={() => unassign.mutate({ userId: a.id, key: persona.key })}\n className=\"shrink-0 text-text-tertiary hover:text-status-error transition-colors ml-1\"\n title={`Unassign ${a.display_name || a.external_id}`}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n\n <div className=\"pt-3 border-t border-surface-border space-y-2\">\n <p className={SECTION_HDR}>Assign User</p>\n <UserCombobox\n selected={pendingUser}\n onSelect={setPendingUser}\n excludeIds={assignees.map((a) => a.id)}\n />\n <div className=\"flex justify-end pt-1\">\n <button\n onClick={handleAssign}\n disabled={!pendingUser || assign.isPending}\n className=\"btn-primary text-xs\"\n >\n {assign.isPending ? '...' : 'Assign'}\n </button>\n </div>\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 </div>\n )}\n </div>\n );\n}\n","import { useState, useMemo, useEffect, useRef } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Pencil } from 'lucide-react';\nimport { usePersonas } from '../../../api/personas';\nimport { FilterBar, FilterInput } from '../../../components/common/data/FilterBar';\nimport type { LTPersonaRecord } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { useShellPanelOptional } from '../../../hooks/useShellPanel';\nimport { CreatePersonaModal } from './CreatePersonaModal';\nimport { AssigneesPanel } from './AssigneesPanel';\n\n// Shell-panel ownership key — the Assignees panel claims/releases this slot.\nconst ASSIGNEES_PANEL_KEY = 'persona-assignees';\n\n// ── Grid columns ──────────────────────────────────────────────────────────────\n// PERSONA(title, 180px) | KEY(140px) | DESCRIPTION(1fr) | ROLES(220px) | USERS(56px) | CONFIGURE(40px)\n// Mirrors the Roles list: display title leads, exact key is the secondary\n// field, the bundle's role pills preview on the right. Clicking a row selects\n// it for the Assignees panel (the 90% path); the pencil opens configuration.\nconst GRID = '180px 140px 1fr 220px 56px 40px';\n\nconst CELL_TEXT = 'text-text-secondary transition-colors group-hover/row:text-text-primary';\nconst HDR = 'text-2xs font-semibold uppercase tracking-widest text-text-quaternary';\nconst CELL_PY = 'py-2';\nconst ROW_PY = 'py-2.5';\n\n/** Title Case fallback derived from the key, same convention as roles. */\nfunction displayPersonaTitle(p: LTPersonaRecord): string {\n if (p.title) return p.title;\n return p.key.replace(/[-_]+/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction TableHead() {\n return (\n <div\n className=\"grid gap-4 px-3 border-b border-surface-border bg-surface\"\n style={{ gridTemplateColumns: GRID }}\n >\n <span className={`${HDR} ${CELL_PY} flex items-center`}>Persona</span>\n <span className={`${HDR} ${CELL_PY} flex items-center`}>Key</span>\n <span className={`${HDR} ${CELL_PY} flex items-center`}>Description</span>\n <span className={`${HDR} ${CELL_PY} flex items-center`}>Roles</span>\n <span className={`${HDR} ${CELL_PY} flex items-center justify-end`}>Users</span>\n <span className={CELL_PY} />\n </div>\n );\n}\n\nconst ROLE_PREVIEW_LIMIT = 3;\n\nfunction PersonaRow({ persona, active, onClick, onConfigure }: {\n persona: LTPersonaRecord;\n active: boolean;\n onClick: () => void;\n onConfigure: () => void;\n}) {\n const roles = persona.roles ?? [];\n const preview = roles.slice(0, ROLE_PREVIEW_LIMIT);\n const overflow = roles.length - preview.length;\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') onClick(); }}\n className={`grid gap-4 px-3 cursor-pointer group/row transition-colors ${active ? 'bg-surface-hover/60' : 'hover:bg-surface-hover/30'}`}\n style={{ gridTemplateColumns: GRID }}\n >\n <span className={`flex items-center min-w-0 text-sm truncate ${ROW_PY} ${CELL_TEXT}`}>\n {displayPersonaTitle(persona)}\n </span>\n\n <span className={`flex items-center text-xs font-mono truncate ${ROW_PY} text-text-tertiary transition-colors group-hover/row:text-text-secondary`}>\n {persona.key}\n </span>\n\n <span className={`flex items-center min-w-0 text-xs text-text-tertiary truncate ${ROW_PY} transition-colors group-hover/row:text-text-secondary`}>\n {persona.description ?? ''}\n </span>\n\n <div className={`flex items-center flex-wrap gap-x-2.5 gap-y-0.5 min-w-0 ${ROW_PY}`}>\n {preview.map((r) => (\n <span key={r.role} className=\"min-w-0 truncate text-text-secondary\">\n <RolePill role={r.role} tone=\"inherit\" />\n </span>\n ))}\n {overflow > 0 && (\n <span className=\"text-2xs text-text-quaternary tabular-nums\">+{overflow}</span>\n )}\n </div>\n\n <span className={`flex items-center justify-end text-sm tabular-nums ${ROW_PY} transition-colors ${CELL_TEXT}`}>\n {persona.user_count > 0 ? persona.user_count : ''}\n </span>\n\n <span className={`flex items-center justify-end ${ROW_PY}`}>\n <button\n onClick={(e) => { e.stopPropagation(); onConfigure(); }}\n className=\"text-text-quaternary/70 hover:text-accent transition-colors\"\n title={`Configure ${displayPersonaTitle(persona)}`}\n aria-label={`Configure ${displayPersonaTitle(persona)}`}\n >\n <Pencil className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </span>\n </div>\n );\n}\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function PersonasPage() {\n const navigate = useNavigate();\n const { data, isLoading } = usePersonas();\n const shell = useShellPanelOptional();\n const [showCreate, setShowCreate] = useState(false);\n const [search, setSearch] = useState('');\n const [selectedKey, setSelectedKey] = useState<string | null>(null);\n\n const personas = data?.personas ?? [];\n\n // ── Selection ↔ shell panel sync ────────────────────────────────────────────\n // Clicking a row opens the Assignees panel in the shell's right slot; an\n // external close (the panel's X, slot takeover) clears the selection. The\n // applied-key ref guards against re-setting the panel on unrelated renders.\n const appliedKey = useRef<string | null>(null);\n const panelWasOpen = useRef(false);\n useEffect(() => {\n if (!shell) return;\n if (selectedKey === appliedKey.current) return;\n appliedKey.current = selectedKey;\n if (selectedKey) {\n shell.setPanel(\n <AssigneesPanel personaKey={selectedKey} onClose={() => setSelectedKey(null)} />,\n { key: ASSIGNEES_PANEL_KEY, width: 360 },\n );\n } else {\n panelWasOpen.current = false;\n shell.closePanel(ASSIGNEES_PANEL_KEY);\n }\n }, [selectedKey, shell]);\n useEffect(() => {\n if (!shell || !selectedKey) return;\n if (shell.open && shell.ownerKey === ASSIGNEES_PANEL_KEY) {\n panelWasOpen.current = true;\n return;\n }\n if (panelWasOpen.current) {\n panelWasOpen.current = false;\n setSelectedKey(null);\n }\n }, [shell, selectedKey]);\n // Unmount with the panel open releases the slot (keyed — never yanks\n // another claimant's panel).\n const shellRef = useRef(shell);\n shellRef.current = shell;\n useEffect(\n () => () => {\n if (appliedKey.current) shellRef.current?.closePanel(ASSIGNEES_PANEL_KEY);\n },\n [],\n );\n\n const filtered = useMemo(() => {\n const sorted = [...personas].sort((a, b) =>\n displayPersonaTitle(a).localeCompare(displayPersonaTitle(b)),\n );\n if (!search.trim()) return sorted;\n const q = search.toLowerCase();\n return sorted.filter(\n (p) =>\n p.key.toLowerCase().includes(q) ||\n displayPersonaTitle(p).toLowerCase().includes(q) ||\n p.description?.toLowerCase().includes(q) ||\n p.roles?.some((r) => r.role.toLowerCase().includes(q)),\n );\n }, [personas, search]);\n\n return (\n <div>\n <PageHeader\n title=\"Personas\"\n docsHash=\"#docs:dashboard.md:personas\"\n actions={\n <button\n onClick={() => setShowCreate(true)}\n className=\"btn-primary text-xs flex items-center gap-1.5\"\n >\n + Add Persona\n </button>\n }\n />\n\n {/* The standard full-width sticky filter band — above the split. */}\n {!isLoading && personas.length > 0 && (\n <FilterBar>\n <FilterInput\n label=\"Search\"\n value={search}\n onChange={setSearch}\n placeholder={`${personas.length} personas…`}\n />\n {search && filtered.length !== personas.length && (\n <span className=\"text-2xs text-text-quaternary tabular-nums shrink-0\">\n {filtered.length} of {personas.length}\n </span>\n )}\n </FilterBar>\n )}\n\n {/* The table IS the page — selecting a row opens the Assignees panel in\n the shell's right panel; the row pencil opens the persona's config. */}\n <div className=\"overflow-x-clip\">\n {!isLoading && personas.length > 0 && filtered.length > 0 && (\n <div className=\"sticky top-[60px] z-10 bg-surface\">\n <TableHead />\n </div>\n )}\n\n {isLoading ? (\n <div className=\"animate-pulse space-y-3 mt-6\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"h-10 bg-surface-sunken rounded w-full\" />\n ))}\n </div>\n ) : filtered.length === 0 ? (\n <p className=\"text-sm text-text-tertiary mt-8\">\n {search\n ? 'Clear the search to see all personas.'\n : 'Create a persona to bundle roles into a one-step assignment.'}\n </p>\n ) : (\n <div className=\"divide-y divide-surface-border/30\">\n {filtered.map((persona) => (\n <PersonaRow\n key={persona.key}\n persona={persona}\n active={persona.key === selectedKey}\n onClick={() => setSelectedKey(persona.key)}\n onConfigure={() => navigate(`/admin/personas/${encodeURIComponent(persona.key)}`)}\n />\n ))}\n </div>\n )}\n </div>\n\n <CreatePersonaModal open={showCreate} onClose={() => setShowCreate(false)} />\n </div>\n );\n}\n"],"names":["CreatePersonaModal","open","onClose","navigate","useNavigate","createPersona","useCreatePersona","key","setKey","useState","title","setTitle","description","setDescription","prevOpen","setPrevOpen","handleCreate","trimmed","jsx","Modal","jsxs","e","UserCombobox","selected","onSelect","excludeIds","placeholder","setOpen","filter","setFilter","containerRef","useRef","debounced","useDebouncedValue","PAGE","data","isFetching","useUsers","useEffect","handleClick","excluded","useMemo","users","u","total","truncated","displayValue","filterText","label","SECTION_HDR","AssigneesPanel","personaKey","persona","usePersona","assign","useAssignPersona","unassign","useUnassignPersona","pendingUser","setPendingUser","assignees","handleAssign","X","a","DateValue","ASSIGNEES_PANEL_KEY","GRID","CELL_TEXT","HDR","CELL_PY","ROW_PY","displayPersonaTitle","p","c","TableHead","ROLE_PREVIEW_LIMIT","PersonaRow","active","onClick","onConfigure","roles","preview","overflow","r","RolePill","Pencil","PersonasPage","isLoading","usePersonas","shell","useShellPanelOptional","showCreate","setShowCreate","search","setSearch","selectedKey","setSelectedKey","personas","appliedKey","panelWasOpen","shellRef","_a","filtered","sorted","b","q","_b","PageHeader","FilterBar","FilterInput","i"],"mappings":"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"}
|
package/dashboard/dist/assets/{ProcessDetailPage-CKCxXogl.js → ProcessDetailPage-DS_t9DcR.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as b,j as e}from"./vendor-query-RUZdMvN6.js";import{a as z}from"./tasks-t6bPmJ7P.js";import{a as V}from"./useEventHooks-BJbMbg_h.js";import{D as S,f as L,C as J,u as q,a as G,J as P,S as T}from"./index-Ntul2ZC1.js";import{P as K}from"./PageHeaderWithStats-JXeUFa_g.js";import{S as W}from"./StatusBadge-DkgllZHv.js";import{W as Q}from"./WorkflowPill-BcA7S3gI.js";import{T as y}from"./TimestampCell-DFDf3NAT.js";import{L as D,e as X}from"./vendor-react-CdqEC2zv.js";import{R as Y}from"./RolePill-EocCXZh0.js";import{U as Z}from"./UserName-CIoJvf_e.js";import"./vendor-icons-BPsNpK3Y.js";import"./users-D0jvzUqW.js";const ee="bg-stripes animate-pulse opacity-70";function $(t){switch(t){case"completed":return"text-status-success";case"in_progress":case"pending":return"text-status-warning";case"needs_intervention":return"text-status-error";case"cancelled":return"text-text-tertiary";default:return"text-text-tertiary"}}function I(t){switch(t){case"resolved":return"text-status-success";case"pending":return"text-status-warning";case"cancelled":return"text-text-tertiary";default:return"text-text-tertiary"}}function te(t,a,l){return`${t==="task"?"Task":l?"Notification":"Escalation"} is ${a.replace(/_/g," ")}`}function se(t,a){if(a)return ee;switch(t){case"completed":case"resolved":return"bg-status-success";case"pending":case"in_progress":case"needs_intervention":return"bg-status-warning";case"cancelled":return"bg-status-error";default:return"bg-text-tertiary"}}function ae(t){return t.startsWith("mcp")||t.startsWith("Mcp")}function E(t){return!t.workflow_type}function A(t,a){if(t.length<=a)return t;const l=Math.floor((a-1)/2);return`${t.slice(0,l)}…${t.slice(t.length-l)}`}function ne(t,a){const l=Date.now(),c=new Map,x=[];for(const s of a)s.task_id?(c.has(s.task_id)||c.set(s.task_id,[]),c.get(s.task_id).push(s)):x.push(s);const r=[...t].sort((s,d)=>new Date(s.created_at).getTime()-new Date(d.created_at).getTime()),i=[];for(const s of t)i.push(new Date(s.created_at).getTime()),s.completed_at&&i.push(new Date(s.completed_at).getTime());for(const s of a)i.push(new Date(s.created_at).getTime()),s.resolved_at&&i.push(new Date(s.resolved_at).getTime()),s.claimed_at&&i.push(new Date(s.claimed_at).getTime());if(i.length===0)return{lanes:[],timeMin:0,timeMax:1};const o=Math.min(...i),f=t.some(s=>!s.completed_at)||a.some(s=>!s.resolved_at)?Math.max(l,Math.max(...i)):Math.max(...i),p=f-o||1,m=s=>(s-o)/p*100,h=[];for(const s of r){const d=new Date(s.created_at).getTime(),j=s.completed_at?new Date(s.completed_at).getTime():l,g=!s.completed_at;h.push({kind:"task",id:s.id,label:s.workflow_type,taskId:s.id,startMs:d,endMs:j,startPct:m(d),widthPct:Math.max((j-d)/p*100,.5),durationMs:j-d,isOpen:g,task:s});const v=(c.get(s.id)||[]).sort((n,u)=>new Date(n.created_at).getTime()-new Date(u.created_at).getTime());for(const n of v){const u=new Date(n.created_at).getTime(),N=n.resolved_at?new Date(n.resolved_at).getTime():l,M=!n.resolved_at;let w=null;if(n.claimed_at){const U=new Date(n.claimed_at).getTime(),H=N-u||1;w=(U-u)/H*100}h.push({kind:"escalation",id:n.id,label:n.role,taskId:s.id,startMs:u,endMs:N,startPct:m(u),widthPct:Math.max((N-u)/p*100,.5),durationMs:N-u,isOpen:M,escalation:n,claimPct:w})}}for(const s of x){const d=new Date(s.created_at).getTime(),j=s.resolved_at?new Date(s.resolved_at).getTime():l;let g=null;if(s.claimed_at){const v=new Date(s.claimed_at).getTime(),n=j-d||1;g=(v-d)/n*100}h.push({kind:"escalation",id:s.id,label:s.role,taskId:"",startMs:d,endMs:j,startPct:m(d),widthPct:Math.max((j-d)/p*100,.5),durationMs:j-d,isOpen:!s.resolved_at,escalation:s,claimPct:g})}return{lanes:h,timeMin:o,timeMax:f}}function re(t,a,l,c=500){const[x,r]=b.useState(0),i=b.useRef(null),o=l-a||1;b.useEffect(()=>{if(t===0)return;i.current=null,r(0);let f;const p=m=>{i.current===null&&(i.current=m);const h=m-i.current,s=Math.min(h/c,1),d=1-Math.pow(1-s,3);r(d),s<1&&(f=requestAnimationFrame(p))};return f=requestAnimationFrame(p),()=>cancelAnimationFrame(f)},[t,c]);const k=b.useCallback(f=>{const p=(f.startMs-a)/o,m=(f.endMs-a)/o;if(x<p)return{width:0,opacity:0};const h=m-p||.001,s=Math.min((x-p)/h,1),d=f.widthPct*s,j=Math.min(s/.1,1);return{width:d,opacity:j}},[x,a,o]);return{progress:x,animatedBar:k}}function R({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"})})}function B({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9.813 15.904L9 18.75l-.813-2.846a4.5 4.5 0 00-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 003.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 003.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 00-3.09 3.09zM18.259 8.715L18 9.75l-.259-1.035a3.375 3.375 0 00-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 002.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 002.455 2.456L21.75 6l-1.036.259a3.375 3.375 0 00-2.455 2.456zM16.894 20.567L16.5 21.75l-.394-1.183a2.25 2.25 0 00-1.423-1.423L13.5 18.75l1.183-.394a2.25 2.25 0 001.423-1.423l.394-1.183.394 1.183a2.25 2.25 0 001.423 1.423l1.183.394-1.183.394a2.25 2.25 0 00-1.423 1.423z"})})}function O({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0"})})}function F({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z"})})}function ie({allExpanded:t,onToggleAll:a}){return e.jsxs("div",{className:"flex items-center gap-4 mb-4 flex-wrap",children:[e.jsx("button",{onClick:a,className:"text-2xs text-accent hover:underline",children:t?"Collapse all":"Expand all"}),e.jsxs("div",{className:"flex items-center gap-4 ml-auto",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(R,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Task"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(B,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"AI Task"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(F,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Escalation"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(O,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Notification"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2.5 h-2.5 rounded-full dot-ring bg-status-success"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Done"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2.5 h-2.5 rounded-full dot-ring bg-status-warning"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Active"})]})]})]})}function oe({ticks:t}){return e.jsxs("div",{className:"flex",children:[e.jsx("div",{className:"w-52 shrink-0"}),e.jsx("div",{className:"flex-1 relative h-6 border-b border-surface-border",children:t.map(a=>e.jsx("span",{className:"absolute text-2xs font-mono text-text-tertiary -translate-x-1/2 bottom-1 whitespace-nowrap",style:{left:`${a.pct}%`},children:a.label},a.pct))})]})}function _({label:t,children:a}){return e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:t}),e.jsx("div",{className:"text-xs text-text-primary",children:a})]})}function le({traceId:t,href:a}){const[l,c]=b.useState(!1),x=i=>{i.stopPropagation(),navigator.clipboard.writeText(t),c(!0),setTimeout(()=>c(!1),1500)},r=i=>{i.stopPropagation(),a&&window.open(a,"_blank","noopener,noreferrer")};return e.jsxs("span",{className:"group/trace inline-flex items-center gap-1.5",children:[a&&e.jsx("button",{onClick:r,title:"Open trace",className:"opacity-0 group-hover/trace:opacity-100 transition-opacity p-0.5",children:e.jsx("svg",{className:"w-3 h-3 text-text-tertiary hover:text-accent",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-4.5-4.5h6m0 0v6m0-6L10.5 15"})})}),e.jsx("button",{onClick:x,title:"Copy trace ID",className:"opacity-0 group-hover/trace:opacity-100 transition-opacity p-0.5",children:e.jsx("svg",{className:`w-3 h-3 transition-colors ${l?"text-status-success":"text-text-tertiary hover:text-accent"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:l?e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"}):e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3"})})}),e.jsx("span",{className:"text-2xs text-accent",children:"Trace Details"})]})}function ce({task:t,traceUrl:a}){const l=t.completed_at?new Date(t.completed_at).getTime()-new Date(t.created_at).getTime():Date.now()-new Date(t.created_at).getTime();return e.jsxs("div",{className:"grid grid-cols-[3fr_1fr] gap-6",children:[e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(W,{status:t.status}),e.jsx(Q,{type:t.workflow_type})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsx(_,{label:"Started",children:e.jsx(y,{date:t.created_at})}),e.jsx(_,{label:"Completed",children:t.completed_at?e.jsx(y,{date:t.completed_at}):e.jsx("span",{className:"text-text-tertiary italic text-xs",children:"In progress"})}),e.jsx(_,{label:"Duration",children:e.jsx(S,{ms:l,className:"font-mono text-sm"})})]}),t.milestones.length>0&&e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:"Milestones"}),e.jsx("div",{className:"flex flex-wrap gap-1.5",children:t.milestones.map((c,x)=>e.jsxs("span",{className:"px-2 py-0.5 text-2xs font-mono bg-accent-faint/50 rounded text-text-secondary",children:[c.name,": ",String(c.value)]},x))})]})]}),e.jsxs("div",{className:"flex flex-col items-end gap-2",children:[e.jsx(D,{to:`/workflows/executions/${encodeURIComponent(t.workflow_id)}`,className:"block text-2xs text-accent hover:underline",children:"Execution Details"}),e.jsx(D,{to:`/workflows/tasks/detail/${t.id}`,className:"block text-2xs text-accent hover:underline",children:"Task Details"}),t.trace_id&&e.jsx(le,{traceId:t.trace_id,href:a?a.replace("{traceId}",t.trace_id):void 0})]})]})}function de({escalation:t}){const a=new Date(t.created_at).getTime(),l=t.claimed_at?new Date(t.claimed_at).getTime()-a:null,c=t.resolved_at?new Date(t.resolved_at).getTime()-a:null;return e.jsxs("div",{className:"grid grid-cols-[3fr_1fr] gap-6",children:[e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(W,{status:t.status}),e.jsx(Y,{role:t.role}),t.type&&e.jsxs("span",{className:"text-2xs text-text-tertiary",children:[t.type,t.subtype?` / ${t.subtype}`:""]})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsx(_,{label:"Created",children:e.jsx(y,{date:t.created_at})}),e.jsx(_,{label:"Claimed",children:t.claimed_at?e.jsxs(e.Fragment,{children:[e.jsx(y,{date:t.claimed_at}),e.jsxs("p",{className:"text-2xs text-text-tertiary mt-0.5",children:["after ",e.jsx(S,{ms:l}),t.assigned_to&&e.jsxs(e.Fragment,{children:[" ","by"," ",e.jsx("span",{className:"text-text-secondary font-medium",children:e.jsx(Z,{userId:t.assigned_to})})]})]})]}):e.jsx("span",{className:"text-text-tertiary italic text-xs",children:"Unclaimed"})}),e.jsx(_,{label:"Resolved",children:t.resolved_at?e.jsxs(e.Fragment,{children:[e.jsx(y,{date:t.resolved_at}),e.jsxs("p",{className:"text-2xs text-text-tertiary mt-0.5",children:[e.jsx(S,{ms:c})," total"]})]}):e.jsx("span",{className:"text-text-tertiary italic text-xs",children:"Pending"})})]}),t.description&&e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Description"}),e.jsx("p",{className:"text-2xs text-text-secondary leading-relaxed",children:t.description})]})]}),e.jsxs("div",{className:"flex flex-col items-end gap-2",children:[t.workflow_id&&e.jsx(D,{to:`/workflows/executions/${encodeURIComponent(t.workflow_id)}`,className:"block text-2xs text-accent hover:underline",children:"Execution Details"}),e.jsx(D,{to:`/escalations/detail/${t.id}`,className:"block text-2xs text-accent hover:underline",children:"Escalation Details"})]})]})}function xe({lane:t,ticks:a,isExpanded:l,onToggle:c,anim:x,animDone:r,traceUrl:i}){var m,h;const o=t.kind==="task",k=o?t.task.status:t.escalation.status,f=se(k,t.isOpen),p=x.opacity>0;return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center border-b border-surface-border cursor-pointer hover:bg-surface-sunken/40 transition-colors",onClick:c,children:[e.jsxs("div",{className:`w-52 shrink-0 py-3 pr-4 flex items-center gap-2 ${o?"":"pl-6"}`,style:{opacity:p?1:0,transition:"opacity 0.15s ease-out"},children:[o?ae(t.task.workflow_type)?e.jsx(B,{className:`w-4 h-4 shrink-0 ${$(t.task.status)}`}):e.jsx(R,{className:`w-4 h-4 shrink-0 ${$(t.task.status)}`}):E(t.escalation)?e.jsx(O,{className:`w-4 h-4 shrink-0 ${I(t.escalation.status)}`}):e.jsx(F,{className:`w-4 h-4 shrink-0 ${I(t.escalation.status)}`}),e.jsx("p",{className:"text-xs font-mono text-text-secondary whitespace-nowrap overflow-hidden",title:te(t.kind,o?t.task.status:t.escalation.status,!o&&E(t.escalation)),children:o?A(t.label,24):A(((m=t.escalation)==null?void 0:m.role)??t.label,20)})]}),e.jsxs("div",{className:"flex-1 relative h-10",children:[a.map(s=>e.jsx("div",{className:"absolute top-0 bottom-0 w-px bg-surface-border opacity-30",style:{left:`${s.pct}%`}},s.pct)),e.jsxs("div",{className:`absolute top-2 h-6 rounded-sm ${l?`${f} ring-2 ring-accent ring-offset-1`:`${f} hover:opacity-80`}`,style:{left:`${t.startPct}%`,width:p?`${Math.max(x.width,.3)}%`:"0%",minWidth:p?"4px":"0px",opacity:x.opacity},title:`${t.label} — ${L(t.durationMs)} — ${new Date(t.startMs).toLocaleTimeString()}`,children:[x.width>8&&r&&e.jsx("span",{className:"absolute inset-0 flex items-center px-1.5 text-2xs font-mono text-text-inverse truncate",children:L(t.durationMs)}),t.claimPct!=null&&r&&e.jsx("div",{className:"absolute top-0 bottom-0 w-px border-l border-dashed border-text-inverse/70",style:{left:`${t.claimPct}%`},title:(h=t.escalation)!=null&&h.assigned_to?`Claimed by ${t.escalation.assigned_to}`:"Claimed",children:e.jsx("div",{className:"absolute -top-1 -left-[3px] w-[7px] h-[7px] rounded-full bg-text-inverse border border-status-warning"})})]})]})]}),e.jsx(J,{open:l,children:e.jsx("div",{className:"py-4 px-6 pl-52 border-b border-surface-border bg-surface-sunken/20",children:o&&t.task?e.jsx(ce,{task:t.task,traceUrl:i}):t.escalation?e.jsx(de,{escalation:t.escalation}):null})})]})}function me({tasks:t,escalations:a,traceUrl:l}){const[c,x]=b.useState(new Set),{lanes:r,timeMin:i,timeMax:o}=b.useMemo(()=>ne(t,a),[t,a]),k=o-i||1,{progress:f,animatedBar:p}=re(r.length,i,o);if(r.length===0)return e.jsx("p",{className:"text-sm text-text-tertiary py-8 text-center",children:"No events in this process."});const m=5,h=Array.from({length:m+1},(n,u)=>({pct:u/m*100,label:L(Math.round(u/m*k))})),s=n=>{x(u=>{const N=new Set(u);return N.has(n)?N.delete(n):N.add(n),N})},d=r.map(n=>n.id),j=d.length>0&&d.every(n=>c.has(n)),g=()=>{x(j?new Set:new Set(d))},v=f>=1;return e.jsxs("div",{className:"py-2",children:[e.jsx(ie,{allExpanded:j,onToggleAll:g}),e.jsx(oe,{ticks:h}),r.map(n=>e.jsx(xe,{lane:n,ticks:h,isExpanded:c.has(n.id),onToggle:()=>s(n.id),anim:p(n),animDone:v,traceUrl:l},`${n.kind}-${n.id}`))]})}function C(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}function ue(t){return t.length===0?null:[...t].sort((a,l)=>new Date(a.created_at).getTime()-new Date(l.created_at).getTime())[0]}function De(){var j;const{originId:t}=X();V(t);const{data:a,isLoading:l}=z(t??""),{data:c}=q(),x=((j=c==null?void 0:c.telemetry)==null?void 0:j.traceUrl)??null,r=(a==null?void 0:a.tasks)??[],i=(a==null?void 0:a.escalations)??[],o=b.useMemo(()=>ue(r),[r]),k=b.useMemo(()=>C(o==null?void 0:o.envelope),[o]),f=b.useMemo(()=>{if(o!=null&&o.data)return C(o.data);const g=r.filter(v=>v.status==="completed"&&v.data).sort((v,n)=>new Date(n.completed_at).getTime()-new Date(v.completed_at).getTime());return g.length>0?C(g[0].data):null},[o,r]),p=b.useMemo(()=>r.length>0&&r.some(g=>g.status!=="completed"&&g.status!=="cancelled"),[r]),m=b.useMemo(()=>{const g=r.filter(u=>u.status==="completed").length,v=r.filter(u=>u.status==="needs_intervention").length,n=i.filter(u=>u.status==="resolved").length;return{tasks:r.length,completed:g,escalated:v,escalations:i.length,resolved:n}},[r,i]),h=b.useMemo(()=>{if(r.length===0&&i.length===0)return null;const v=[...r.map(w=>w.created_at),...i.map(w=>w.created_at)].sort()[0],n=r.every(w=>w.status==="completed"||w.status==="cancelled"),u=i.every(w=>w.status==="resolved"),N=r.length>0&&n&&u,M=N?[...r.map(w=>w.completed_at),...i.map(w=>w.resolved_at)].filter(Boolean).sort().pop()??null:null;return{startIso:v,endIso:M,isFinished:N,elapsed:G(v,M)}},[r,i]),s=b.useMemo(()=>{const g=[];return h&&g.push({label:h.isFinished?"Completed":"Running",value:h.elapsed,dotClass:h.isFinished?"bg-status-success":"bg-status-pending animate-pulse"}),g.push({label:"Tasks",value:`${m.completed}/${m.tasks}`},{label:"Escalations",value:`${m.resolved}/${m.escalations}`}),g},[h,m]);if(l&&r.length===0)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-40 bg-surface-sunken rounded"})]});const d=k||f||p;return e.jsxs("div",{children:[e.jsx(K,{title:"Process Detail",docsHash:"#docs:dashboard.md:process-detail",subtitle:t,stats:s}),d&&e.jsxs("div",{className:"grid grid-cols-1 @split:grid-cols-2 gap-8 mb-10",children:[e.jsx("div",{children:k?e.jsx(P,{data:k,label:"Input",defaultMode:"json",defaultCollapsed:!0}):e.jsxs("div",{children:[e.jsx(T,{children:"Input"}),e.jsx("div",{className:"font-mono text-xs bg-surface-sunken rounded-md p-4 text-text-tertiary italic mt-2",children:"Waiting for task..."})]})}),e.jsx("div",{children:f?e.jsx(P,{data:f,label:"Output",defaultMode:"json",defaultCollapsed:!0}):p?e.jsxs("div",{children:[e.jsx(T,{children:"Output"}),e.jsxs("div",{className:"flex items-center gap-2 font-mono text-xs bg-surface-sunken rounded-md p-4 text-text-secondary mt-2",children:[e.jsx("span",{className:"w-2.5 h-2.5 rounded-full dot-ring bg-status-pending animate-pulse"}),"Processing..."]})]}):null})]}),e.jsx(T,{className:"mb-6",children:"Timeline"}),e.jsx(me,{tasks:r,escalations:i,traceUrl:x})]})}export{De as ProcessDetailPage};
|
|
2
|
-
//# sourceMappingURL=ProcessDetailPage-
|
|
1
|
+
import{a as b,j as e}from"./vendor-query-RUZdMvN6.js";import{a as z}from"./tasks-BcDvp6dL.js";import{a as V}from"./useEventHooks-C-bsD8zP.js";import{D as S,f as L,C as J,u as q,a as G,J as P,S as T}from"./index-lGfBW1PB.js";import{P as K}from"./PageHeaderWithStats-DIWH6fRv.js";import{S as W}from"./StatusBadge-BDeUwPtb.js";import{W as Q}from"./WorkflowPill-qp5UF3-y.js";import{T as y}from"./TimestampCell-Dk1TVsFV.js";import{L as D,e as X}from"./vendor-react-CdqEC2zv.js";import{R as Y}from"./RolePill-C0hExOmI.js";import{U as Z}from"./UserName-BrwZnLjU.js";import"./vendor-icons-BgsXTN4h.js";import"./users-XpCq_umD.js";const ee="bg-stripes animate-pulse opacity-70";function $(t){switch(t){case"completed":return"text-status-success";case"in_progress":case"pending":return"text-status-warning";case"needs_intervention":return"text-status-error";case"cancelled":return"text-text-tertiary";default:return"text-text-tertiary"}}function I(t){switch(t){case"resolved":return"text-status-success";case"pending":return"text-status-warning";case"cancelled":return"text-text-tertiary";default:return"text-text-tertiary"}}function te(t,a,l){return`${t==="task"?"Task":l?"Notification":"Escalation"} is ${a.replace(/_/g," ")}`}function se(t,a){if(a)return ee;switch(t){case"completed":case"resolved":return"bg-status-success";case"pending":case"in_progress":case"needs_intervention":return"bg-status-warning";case"cancelled":return"bg-status-error";default:return"bg-text-tertiary"}}function ae(t){return t.startsWith("mcp")||t.startsWith("Mcp")}function E(t){return!t.workflow_type}function A(t,a){if(t.length<=a)return t;const l=Math.floor((a-1)/2);return`${t.slice(0,l)}…${t.slice(t.length-l)}`}function ne(t,a){const l=Date.now(),c=new Map,x=[];for(const s of a)s.task_id?(c.has(s.task_id)||c.set(s.task_id,[]),c.get(s.task_id).push(s)):x.push(s);const r=[...t].sort((s,d)=>new Date(s.created_at).getTime()-new Date(d.created_at).getTime()),i=[];for(const s of t)i.push(new Date(s.created_at).getTime()),s.completed_at&&i.push(new Date(s.completed_at).getTime());for(const s of a)i.push(new Date(s.created_at).getTime()),s.resolved_at&&i.push(new Date(s.resolved_at).getTime()),s.claimed_at&&i.push(new Date(s.claimed_at).getTime());if(i.length===0)return{lanes:[],timeMin:0,timeMax:1};const o=Math.min(...i),f=t.some(s=>!s.completed_at)||a.some(s=>!s.resolved_at)?Math.max(l,Math.max(...i)):Math.max(...i),p=f-o||1,m=s=>(s-o)/p*100,h=[];for(const s of r){const d=new Date(s.created_at).getTime(),j=s.completed_at?new Date(s.completed_at).getTime():l,g=!s.completed_at;h.push({kind:"task",id:s.id,label:s.workflow_type,taskId:s.id,startMs:d,endMs:j,startPct:m(d),widthPct:Math.max((j-d)/p*100,.5),durationMs:j-d,isOpen:g,task:s});const v=(c.get(s.id)||[]).sort((n,u)=>new Date(n.created_at).getTime()-new Date(u.created_at).getTime());for(const n of v){const u=new Date(n.created_at).getTime(),N=n.resolved_at?new Date(n.resolved_at).getTime():l,M=!n.resolved_at;let w=null;if(n.claimed_at){const U=new Date(n.claimed_at).getTime(),H=N-u||1;w=(U-u)/H*100}h.push({kind:"escalation",id:n.id,label:n.role,taskId:s.id,startMs:u,endMs:N,startPct:m(u),widthPct:Math.max((N-u)/p*100,.5),durationMs:N-u,isOpen:M,escalation:n,claimPct:w})}}for(const s of x){const d=new Date(s.created_at).getTime(),j=s.resolved_at?new Date(s.resolved_at).getTime():l;let g=null;if(s.claimed_at){const v=new Date(s.claimed_at).getTime(),n=j-d||1;g=(v-d)/n*100}h.push({kind:"escalation",id:s.id,label:s.role,taskId:"",startMs:d,endMs:j,startPct:m(d),widthPct:Math.max((j-d)/p*100,.5),durationMs:j-d,isOpen:!s.resolved_at,escalation:s,claimPct:g})}return{lanes:h,timeMin:o,timeMax:f}}function re(t,a,l,c=500){const[x,r]=b.useState(0),i=b.useRef(null),o=l-a||1;b.useEffect(()=>{if(t===0)return;i.current=null,r(0);let f;const p=m=>{i.current===null&&(i.current=m);const h=m-i.current,s=Math.min(h/c,1),d=1-Math.pow(1-s,3);r(d),s<1&&(f=requestAnimationFrame(p))};return f=requestAnimationFrame(p),()=>cancelAnimationFrame(f)},[t,c]);const k=b.useCallback(f=>{const p=(f.startMs-a)/o,m=(f.endMs-a)/o;if(x<p)return{width:0,opacity:0};const h=m-p||.001,s=Math.min((x-p)/h,1),d=f.widthPct*s,j=Math.min(s/.1,1);return{width:d,opacity:j}},[x,a,o]);return{progress:x,animatedBar:k}}function R({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"})})}function B({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9.813 15.904L9 18.75l-.813-2.846a4.5 4.5 0 00-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 003.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 003.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 00-3.09 3.09zM18.259 8.715L18 9.75l-.259-1.035a3.375 3.375 0 00-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 002.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 002.455 2.456L21.75 6l-1.036.259a3.375 3.375 0 00-2.455 2.456zM16.894 20.567L16.5 21.75l-.394-1.183a2.25 2.25 0 00-1.423-1.423L13.5 18.75l1.183-.394a2.25 2.25 0 001.423-1.423l.394-1.183.394 1.183a2.25 2.25 0 001.423 1.423l1.183.394-1.183.394a2.25 2.25 0 00-1.423 1.423z"})})}function O({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0"})})}function F({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z"})})}function ie({allExpanded:t,onToggleAll:a}){return e.jsxs("div",{className:"flex items-center gap-4 mb-4 flex-wrap",children:[e.jsx("button",{onClick:a,className:"text-2xs text-accent hover:underline",children:t?"Collapse all":"Expand all"}),e.jsxs("div",{className:"flex items-center gap-4 ml-auto",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(R,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Task"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(B,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"AI Task"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(F,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Escalation"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(O,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Notification"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2.5 h-2.5 rounded-full dot-ring bg-status-success"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Done"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2.5 h-2.5 rounded-full dot-ring bg-status-warning"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Active"})]})]})]})}function oe({ticks:t}){return e.jsxs("div",{className:"flex",children:[e.jsx("div",{className:"w-52 shrink-0"}),e.jsx("div",{className:"flex-1 relative h-6 border-b border-surface-border",children:t.map(a=>e.jsx("span",{className:"absolute text-2xs font-mono text-text-tertiary -translate-x-1/2 bottom-1 whitespace-nowrap",style:{left:`${a.pct}%`},children:a.label},a.pct))})]})}function _({label:t,children:a}){return e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:t}),e.jsx("div",{className:"text-xs text-text-primary",children:a})]})}function le({traceId:t,href:a}){const[l,c]=b.useState(!1),x=i=>{i.stopPropagation(),navigator.clipboard.writeText(t),c(!0),setTimeout(()=>c(!1),1500)},r=i=>{i.stopPropagation(),a&&window.open(a,"_blank","noopener,noreferrer")};return e.jsxs("span",{className:"group/trace inline-flex items-center gap-1.5",children:[a&&e.jsx("button",{onClick:r,title:"Open trace",className:"opacity-0 group-hover/trace:opacity-100 transition-opacity p-0.5",children:e.jsx("svg",{className:"w-3 h-3 text-text-tertiary hover:text-accent",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-4.5-4.5h6m0 0v6m0-6L10.5 15"})})}),e.jsx("button",{onClick:x,title:"Copy trace ID",className:"opacity-0 group-hover/trace:opacity-100 transition-opacity p-0.5",children:e.jsx("svg",{className:`w-3 h-3 transition-colors ${l?"text-status-success":"text-text-tertiary hover:text-accent"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:l?e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"}):e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3"})})}),e.jsx("span",{className:"text-2xs text-accent",children:"Trace Details"})]})}function ce({task:t,traceUrl:a}){const l=t.completed_at?new Date(t.completed_at).getTime()-new Date(t.created_at).getTime():Date.now()-new Date(t.created_at).getTime();return e.jsxs("div",{className:"grid grid-cols-[3fr_1fr] gap-6",children:[e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(W,{status:t.status}),e.jsx(Q,{type:t.workflow_type})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsx(_,{label:"Started",children:e.jsx(y,{date:t.created_at})}),e.jsx(_,{label:"Completed",children:t.completed_at?e.jsx(y,{date:t.completed_at}):e.jsx("span",{className:"text-text-tertiary italic text-xs",children:"In progress"})}),e.jsx(_,{label:"Duration",children:e.jsx(S,{ms:l,className:"font-mono text-sm"})})]}),t.milestones.length>0&&e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:"Milestones"}),e.jsx("div",{className:"flex flex-wrap gap-1.5",children:t.milestones.map((c,x)=>e.jsxs("span",{className:"px-2 py-0.5 text-2xs font-mono bg-accent-faint/50 rounded text-text-secondary",children:[c.name,": ",String(c.value)]},x))})]})]}),e.jsxs("div",{className:"flex flex-col items-end gap-2",children:[e.jsx(D,{to:`/workflows/executions/${encodeURIComponent(t.workflow_id)}`,className:"block text-2xs text-accent hover:underline",children:"Execution Details"}),e.jsx(D,{to:`/workflows/tasks/detail/${t.id}`,className:"block text-2xs text-accent hover:underline",children:"Task Details"}),t.trace_id&&e.jsx(le,{traceId:t.trace_id,href:a?a.replace("{traceId}",t.trace_id):void 0})]})]})}function de({escalation:t}){const a=new Date(t.created_at).getTime(),l=t.claimed_at?new Date(t.claimed_at).getTime()-a:null,c=t.resolved_at?new Date(t.resolved_at).getTime()-a:null;return e.jsxs("div",{className:"grid grid-cols-[3fr_1fr] gap-6",children:[e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(W,{status:t.status}),e.jsx(Y,{role:t.role}),t.type&&e.jsxs("span",{className:"text-2xs text-text-tertiary",children:[t.type,t.subtype?` / ${t.subtype}`:""]})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsx(_,{label:"Created",children:e.jsx(y,{date:t.created_at})}),e.jsx(_,{label:"Claimed",children:t.claimed_at?e.jsxs(e.Fragment,{children:[e.jsx(y,{date:t.claimed_at}),e.jsxs("p",{className:"text-2xs text-text-tertiary mt-0.5",children:["after ",e.jsx(S,{ms:l}),t.assigned_to&&e.jsxs(e.Fragment,{children:[" ","by"," ",e.jsx("span",{className:"text-text-secondary font-medium",children:e.jsx(Z,{userId:t.assigned_to})})]})]})]}):e.jsx("span",{className:"text-text-tertiary italic text-xs",children:"Unclaimed"})}),e.jsx(_,{label:"Resolved",children:t.resolved_at?e.jsxs(e.Fragment,{children:[e.jsx(y,{date:t.resolved_at}),e.jsxs("p",{className:"text-2xs text-text-tertiary mt-0.5",children:[e.jsx(S,{ms:c})," total"]})]}):e.jsx("span",{className:"text-text-tertiary italic text-xs",children:"Pending"})})]}),t.description&&e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Description"}),e.jsx("p",{className:"text-2xs text-text-secondary leading-relaxed",children:t.description})]})]}),e.jsxs("div",{className:"flex flex-col items-end gap-2",children:[t.workflow_id&&e.jsx(D,{to:`/workflows/executions/${encodeURIComponent(t.workflow_id)}`,className:"block text-2xs text-accent hover:underline",children:"Execution Details"}),e.jsx(D,{to:`/escalations/detail/${t.id}`,className:"block text-2xs text-accent hover:underline",children:"Escalation Details"})]})]})}function xe({lane:t,ticks:a,isExpanded:l,onToggle:c,anim:x,animDone:r,traceUrl:i}){var m,h;const o=t.kind==="task",k=o?t.task.status:t.escalation.status,f=se(k,t.isOpen),p=x.opacity>0;return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center border-b border-surface-border cursor-pointer hover:bg-surface-sunken/40 transition-colors",onClick:c,children:[e.jsxs("div",{className:`w-52 shrink-0 py-3 pr-4 flex items-center gap-2 ${o?"":"pl-6"}`,style:{opacity:p?1:0,transition:"opacity 0.15s ease-out"},children:[o?ae(t.task.workflow_type)?e.jsx(B,{className:`w-4 h-4 shrink-0 ${$(t.task.status)}`}):e.jsx(R,{className:`w-4 h-4 shrink-0 ${$(t.task.status)}`}):E(t.escalation)?e.jsx(O,{className:`w-4 h-4 shrink-0 ${I(t.escalation.status)}`}):e.jsx(F,{className:`w-4 h-4 shrink-0 ${I(t.escalation.status)}`}),e.jsx("p",{className:"text-xs font-mono text-text-secondary whitespace-nowrap overflow-hidden",title:te(t.kind,o?t.task.status:t.escalation.status,!o&&E(t.escalation)),children:o?A(t.label,24):A(((m=t.escalation)==null?void 0:m.role)??t.label,20)})]}),e.jsxs("div",{className:"flex-1 relative h-10",children:[a.map(s=>e.jsx("div",{className:"absolute top-0 bottom-0 w-px bg-surface-border opacity-30",style:{left:`${s.pct}%`}},s.pct)),e.jsxs("div",{className:`absolute top-2 h-6 rounded-sm ${l?`${f} ring-2 ring-accent ring-offset-1`:`${f} hover:opacity-80`}`,style:{left:`${t.startPct}%`,width:p?`${Math.max(x.width,.3)}%`:"0%",minWidth:p?"4px":"0px",opacity:x.opacity},title:`${t.label} — ${L(t.durationMs)} — ${new Date(t.startMs).toLocaleTimeString()}`,children:[x.width>8&&r&&e.jsx("span",{className:"absolute inset-0 flex items-center px-1.5 text-2xs font-mono text-text-inverse truncate",children:L(t.durationMs)}),t.claimPct!=null&&r&&e.jsx("div",{className:"absolute top-0 bottom-0 w-px border-l border-dashed border-text-inverse/70",style:{left:`${t.claimPct}%`},title:(h=t.escalation)!=null&&h.assigned_to?`Claimed by ${t.escalation.assigned_to}`:"Claimed",children:e.jsx("div",{className:"absolute -top-1 -left-[3px] w-[7px] h-[7px] rounded-full bg-text-inverse border border-status-warning"})})]})]})]}),e.jsx(J,{open:l,children:e.jsx("div",{className:"py-4 px-6 pl-52 border-b border-surface-border bg-surface-sunken/20",children:o&&t.task?e.jsx(ce,{task:t.task,traceUrl:i}):t.escalation?e.jsx(de,{escalation:t.escalation}):null})})]})}function me({tasks:t,escalations:a,traceUrl:l}){const[c,x]=b.useState(new Set),{lanes:r,timeMin:i,timeMax:o}=b.useMemo(()=>ne(t,a),[t,a]),k=o-i||1,{progress:f,animatedBar:p}=re(r.length,i,o);if(r.length===0)return e.jsx("p",{className:"text-sm text-text-tertiary py-8 text-center",children:"No events in this process."});const m=5,h=Array.from({length:m+1},(n,u)=>({pct:u/m*100,label:L(Math.round(u/m*k))})),s=n=>{x(u=>{const N=new Set(u);return N.has(n)?N.delete(n):N.add(n),N})},d=r.map(n=>n.id),j=d.length>0&&d.every(n=>c.has(n)),g=()=>{x(j?new Set:new Set(d))},v=f>=1;return e.jsxs("div",{className:"py-2",children:[e.jsx(ie,{allExpanded:j,onToggleAll:g}),e.jsx(oe,{ticks:h}),r.map(n=>e.jsx(xe,{lane:n,ticks:h,isExpanded:c.has(n.id),onToggle:()=>s(n.id),anim:p(n),animDone:v,traceUrl:l},`${n.kind}-${n.id}`))]})}function C(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}function ue(t){return t.length===0?null:[...t].sort((a,l)=>new Date(a.created_at).getTime()-new Date(l.created_at).getTime())[0]}function De(){var j;const{originId:t}=X();V(t);const{data:a,isLoading:l}=z(t??""),{data:c}=q(),x=((j=c==null?void 0:c.telemetry)==null?void 0:j.traceUrl)??null,r=(a==null?void 0:a.tasks)??[],i=(a==null?void 0:a.escalations)??[],o=b.useMemo(()=>ue(r),[r]),k=b.useMemo(()=>C(o==null?void 0:o.envelope),[o]),f=b.useMemo(()=>{if(o!=null&&o.data)return C(o.data);const g=r.filter(v=>v.status==="completed"&&v.data).sort((v,n)=>new Date(n.completed_at).getTime()-new Date(v.completed_at).getTime());return g.length>0?C(g[0].data):null},[o,r]),p=b.useMemo(()=>r.length>0&&r.some(g=>g.status!=="completed"&&g.status!=="cancelled"),[r]),m=b.useMemo(()=>{const g=r.filter(u=>u.status==="completed").length,v=r.filter(u=>u.status==="needs_intervention").length,n=i.filter(u=>u.status==="resolved").length;return{tasks:r.length,completed:g,escalated:v,escalations:i.length,resolved:n}},[r,i]),h=b.useMemo(()=>{if(r.length===0&&i.length===0)return null;const v=[...r.map(w=>w.created_at),...i.map(w=>w.created_at)].sort()[0],n=r.every(w=>w.status==="completed"||w.status==="cancelled"),u=i.every(w=>w.status==="resolved"),N=r.length>0&&n&&u,M=N?[...r.map(w=>w.completed_at),...i.map(w=>w.resolved_at)].filter(Boolean).sort().pop()??null:null;return{startIso:v,endIso:M,isFinished:N,elapsed:G(v,M)}},[r,i]),s=b.useMemo(()=>{const g=[];return h&&g.push({label:h.isFinished?"Completed":"Running",value:h.elapsed,dotClass:h.isFinished?"bg-status-success":"bg-status-pending animate-pulse"}),g.push({label:"Tasks",value:`${m.completed}/${m.tasks}`},{label:"Escalations",value:`${m.resolved}/${m.escalations}`}),g},[h,m]);if(l&&r.length===0)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-40 bg-surface-sunken rounded"})]});const d=k||f||p;return e.jsxs("div",{children:[e.jsx(K,{title:"Process Detail",docsHash:"#docs:dashboard.md:process-detail",subtitle:t,stats:s}),d&&e.jsxs("div",{className:"grid grid-cols-1 @split:grid-cols-2 gap-8 mb-10",children:[e.jsx("div",{children:k?e.jsx(P,{data:k,label:"Input",defaultMode:"json",defaultCollapsed:!0}):e.jsxs("div",{children:[e.jsx(T,{children:"Input"}),e.jsx("div",{className:"font-mono text-xs bg-surface-sunken rounded-md p-4 text-text-tertiary italic mt-2",children:"Waiting for task..."})]})}),e.jsx("div",{children:f?e.jsx(P,{data:f,label:"Output",defaultMode:"json",defaultCollapsed:!0}):p?e.jsxs("div",{children:[e.jsx(T,{children:"Output"}),e.jsxs("div",{className:"flex items-center gap-2 font-mono text-xs bg-surface-sunken rounded-md p-4 text-text-secondary mt-2",children:[e.jsx("span",{className:"w-2.5 h-2.5 rounded-full dot-ring bg-status-pending animate-pulse"}),"Processing..."]})]}):null})]}),e.jsx(T,{className:"mb-6",children:"Timeline"}),e.jsx(me,{tasks:r,escalations:i,traceUrl:x})]})}export{De as ProcessDetailPage};
|
|
2
|
+
//# sourceMappingURL=ProcessDetailPage-DS_t9DcR.js.map
|