@hotmeshio/long-tail 0.24.1 → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/api/escalations/accumulate.js +8 -4
- package/build/api/escalations/metadata.js +4 -3
- package/build/api/escalations/related.d.ts +1 -1
- package/build/api/escalations/related.js +28 -18
- package/build/lib/db/schemas/040_oauth_client_consent.sql +15 -0
- package/build/modules/config.d.ts +4 -0
- package/build/modules/config.js +4 -0
- package/build/modules/maintenance.d.ts +1 -1
- package/build/modules/maintenance.js +1 -1
- package/build/services/auth/oauth-server/index.d.ts +1 -1
- package/build/services/auth/oauth-server/index.js +2 -1
- package/build/services/auth/oauth-server/sql.d.ts +7 -4
- package/build/services/auth/oauth-server/sql.js +10 -4
- package/build/services/auth/oauth-server/store.d.ts +8 -1
- package/build/services/auth/oauth-server/store.js +31 -2
- package/build/services/escalation/accumulate.d.ts +3 -1
- package/build/services/escalation/facet-sql.js +4 -2
- package/build/services/escalation/index.d.ts +1 -0
- package/build/services/escalation/index.js +4 -1
- package/build/services/escalation/related-extremes.d.ts +17 -0
- package/build/services/escalation/related-extremes.js +65 -0
- package/build/services/escalation/related.d.ts +4 -0
- package/build/services/escalation/related.js +2 -0
- package/build/services/escalation/resolver-validation.js +7 -0
- package/build/services/escalation/roster.d.ts +13 -0
- package/build/services/escalation/roster.js +37 -0
- package/build/services/escalation/submit-guard.d.ts +3 -0
- package/build/services/escalation/submit-guard.js +21 -2
- package/build/services/maintenance/index.js +1 -1
- package/build/services/mcp/server-tools.js +1 -1
- package/build/shared/form-validation/display-only-widgets.d.ts +1 -0
- package/build/shared/form-validation/display-only-widgets.js +1 -0
- package/build/shared/form-validation/index.d.ts +1 -0
- package/build/shared/form-validation/index.js +1 -0
- package/build/shared/form-validation/validate-resolver-payload.d.ts +1 -0
- package/build/shared/form-validation/validate-resolver-payload.js +2 -1
- package/build/shared/form-validation/x-lt-help.d.ts +1 -1
- package/build/shared/form-validation/x-lt-help.js +2 -1
- package/build/shared/form-validation/x-lt-roster.d.ts +92 -0
- package/build/shared/form-validation/x-lt-roster.js +234 -0
- package/build/shared/form-validation/x-lt-show-if.d.ts +8 -0
- package/build/shared/form-validation/x-lt-show-if.js +13 -0
- package/build/shared/form-validation/x-lt-submit-guard.d.ts +14 -1
- package/build/shared/form-validation/x-lt-submit-guard.js +4 -1
- package/build/shared/list-schema/aggregate.d.ts +19 -0
- package/build/shared/list-schema/aggregate.js +66 -0
- package/build/shared/list-schema/index.d.ts +2 -0
- package/build/shared/list-schema/index.js +7 -1
- package/build/shared/list-schema/types.d.ts +15 -2
- package/build/shared/list-schema/types.js +6 -1
- package/build/shared/list-schema/validate.js +28 -2
- package/build/tsconfig.tsbuildinfo +1 -1
- package/dashboard/dist/assets/{AdminDashboard-B3mkMIOT.js → AdminDashboard-DWVRAu63.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-B3mkMIOT.js.map → AdminDashboard-DWVRAu63.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-CQj2B678.js → AgentConfigPage-Exjtjbvp.js} +6 -6
- package/dashboard/dist/assets/{AgentConfigPage-CQj2B678.js.map → AgentConfigPage-Exjtjbvp.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-CzrD8JJI.js → AgentDetailPage-nDbZo6RB.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-CzrD8JJI.js.map → AgentDetailPage-nDbZo6RB.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-jg2OFwyW.js → AgentsPage-Dsk9iHps.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-jg2OFwyW.js.map → AgentsPage-Dsk9iHps.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-D1mCqj8Z.js +2 -0
- package/dashboard/dist/assets/{AvailableEscalationsPage-IS28XBRe.js.map → AvailableEscalationsPage-D1mCqj8Z.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-DvEJFpwS.js → BotPicker-u5760MWZ.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-DvEJFpwS.js.map → BotPicker-u5760MWZ.js.map} +1 -1
- package/dashboard/dist/assets/{BulkAssignModal-BoQCi-YC.js → BulkAssignModal-CtISXXmW.js} +2 -2
- package/dashboard/dist/assets/{BulkAssignModal-BoQCi-YC.js.map → BulkAssignModal-CtISXXmW.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-kwlrcb_t.js → CapabilitiesPage-BKIlrQfU.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-kwlrcb_t.js.map → CapabilitiesPage-BKIlrQfU.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-UMIV4KIj.js → CollapsibleSection-DlBVTFqc.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-UMIV4KIj.js.map → CollapsibleSection-DlBVTFqc.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-C5puwMg7.js → ConfirmDeleteModal-Pabkchg_.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-C5puwMg7.js.map → ConfirmDeleteModal-Pabkchg_.js.map} +1 -1
- package/dashboard/dist/assets/{ConnectedAppsPage-drZa65kP.js → ConnectedAppsPage-DG2YZGN3.js} +2 -2
- package/dashboard/dist/assets/{ConnectedAppsPage-drZa65kP.js.map → ConnectedAppsPage-DG2YZGN3.js.map} +1 -1
- package/dashboard/dist/assets/CountdownTimer-5t8S2qMi.js +2 -0
- package/dashboard/dist/assets/CountdownTimer-5t8S2qMi.js.map +1 -0
- package/dashboard/dist/assets/{CredentialsPage-CaFQ6vLb.js → CredentialsPage-CPVbYQow.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-CaFQ6vLb.js.map → CredentialsPage-CPVbYQow.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-Co5j7tzW.js → CronLabel-C7UbTrO-.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-Co5j7tzW.js.map → CronLabel-C7UbTrO-.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-B1Tdfddc.js → DropZone-DCZpORx-.js} +2 -2
- package/dashboard/dist/assets/{DropZone-B1Tdfddc.js.map → DropZone-DCZpORx-.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-WJyE9G0T.js → ElapsedCell-Yz7-LbtE.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-WJyE9G0T.js.map → ElapsedCell-Yz7-LbtE.js.map} +1 -1
- package/dashboard/dist/assets/{EntityTimelinePanel-CDFFfX9d.js → EntityTimelinePanel-xgPRdKEq.js} +2 -2
- package/dashboard/dist/assets/{EntityTimelinePanel-CDFFfX9d.js.map → EntityTimelinePanel-xgPRdKEq.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-CMrUlaKI.js → EscalationListSchemaPage-CqCd-y6B.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-CMrUlaKI.js.map → EscalationListSchemaPage-CqCd-y6B.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-Dx2Lyfrz.js → EscalationSchemaPage-D8YVQNph.js} +3 -3
- package/dashboard/dist/assets/{EscalationSchemaPage-Dx2Lyfrz.js.map → EscalationSchemaPage-D8YVQNph.js.map} +1 -1
- package/dashboard/dist/assets/EscalationTimeline-D6jrDcBb.js +2 -0
- package/dashboard/dist/assets/{EscalationTimeline-d3nvshOk.js.map → EscalationTimeline-D6jrDcBb.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationTitleSelect-DWQieOM9.js → EscalationTitleSelect-CGGT-QTu.js} +2 -2
- package/dashboard/dist/assets/{EscalationTitleSelect-DWQieOM9.js.map → EscalationTitleSelect-CGGT-QTu.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-BX8Cpi0X.js → EscalationsOverview-B7O4ttP4.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-BX8Cpi0X.js.map → EscalationsOverview-B7O4ttP4.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-D1-ITVXS.js → EventTable-DJniXnhe.js} +2 -2
- package/dashboard/dist/assets/{EventTable-D1-ITVXS.js.map → EventTable-DJniXnhe.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-ABC9ctin.js → FilterBar-f-LEKcHI.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-ABC9ctin.js.map → FilterBar-f-LEKcHI.js.map} +1 -1
- package/dashboard/dist/assets/{FormattedValue-k27T4bG7.js → FormattedValue-CUtv1g3k.js} +2 -2
- package/dashboard/dist/assets/{FormattedValue-k27T4bG7.js.map → FormattedValue-CUtv1g3k.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-DKUErxWc.js → GraphInvokePage-CR0MtYv8.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-DKUErxWc.js.map → GraphInvokePage-CR0MtYv8.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-C6u9dIpR.js → HomePage-HVw7T5ER.js} +2 -2
- package/dashboard/dist/assets/{HomePage-C6u9dIpR.js.map → HomePage-HVw7T5ER.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-gA5rFzkz.js → ListToolbar-CTGK5BXW.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-gA5rFzkz.js.map → ListToolbar-CTGK5BXW.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-BOPo3J_i.js → McpOverview-B2bbKKu2.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-BOPo3J_i.js.map → McpOverview-B2bbKKu2.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-BRVVi0Zh.js → McpQueryDetailPage-DgLxwwJy.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-BRVVi0Zh.js.map → McpQueryDetailPage-DgLxwwJy.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-Dmbb6SAc.js → McpQueryPage-CSkczeJP.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-Dmbb6SAc.js.map → McpQueryPage-CSkczeJP.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-CrUsDPRD.js +2 -0
- package/dashboard/dist/assets/{McpRunDetailPage-bMXNO-6V.js.map → McpRunDetailPage-CrUsDPRD.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-Bi9AMWja.js → McpRunsPage-twxFdTtJ.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-Bi9AMWja.js.map → McpRunsPage-twxFdTtJ.js.map} +1 -1
- package/dashboard/dist/assets/{NamespacePill-DwM5pNA4.js → NamespacePill-CSZT2fA4.js} +2 -2
- package/dashboard/dist/assets/{NamespacePill-DwM5pNA4.js.map → NamespacePill-CSZT2fA4.js.map} +1 -1
- package/dashboard/dist/assets/{OperationsPage-CvR74ZUJ.js → OperationsPage-gOVMrL_a.js} +3 -3
- package/dashboard/dist/assets/{OperationsPage-CvR74ZUJ.js.map → OperationsPage-gOVMrL_a.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-BoeZIyup.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-DctmZw10.js.map → OperatorDashboard-BoeZIyup.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-CMd3f4bz.js → PageHeader-C4z1ExF7.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-CMd3f4bz.js.map → PageHeader-C4z1ExF7.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-DHj8Mqox.js → PageHeaderWithStats-B_f_Sz_Q.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-DHj8Mqox.js.map → PageHeaderWithStats-B_f_Sz_Q.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-Ubqm2rQH.js → PersonaDetailPage-CDktk1mi.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-Ubqm2rQH.js.map → PersonaDetailPage-CDktk1mi.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-BpFL2rpo.js → PersonasPage-Bs097x07.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-BpFL2rpo.js.map → PersonasPage-Bs097x07.js.map} +1 -1
- package/dashboard/dist/assets/PortalPage-DjfjerpF.js +2 -0
- package/dashboard/dist/assets/{PortalPage-Dfc_Q02R.js.map → PortalPage-DjfjerpF.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-liJspvQh.js → ProcessDetailPage-B30RatjD.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-liJspvQh.js.map → ProcessDetailPage-B30RatjD.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-C3OM5ZUy.js → ProcessesListPage-DrvjzgWT.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-C3OM5ZUy.js.map → ProcessesListPage-DrvjzgWT.js.map} +1 -1
- package/dashboard/dist/assets/ResolverForm-Bl8Pibyz.js +8 -0
- package/dashboard/dist/assets/ResolverForm-Bl8Pibyz.js.map +1 -0
- package/dashboard/dist/assets/{RoleDetailPage-CrlYCh-R.js → RoleDetailPage-ClYgn-3d.js} +3 -3
- package/dashboard/dist/assets/{RoleDetailPage-CrlYCh-R.js.map → RoleDetailPage-ClYgn-3d.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-Di2CAHuD.js → RolePill-Bw_n7EpR.js} +2 -2
- package/dashboard/dist/assets/{RolePill-Di2CAHuD.js.map → RolePill-Bw_n7EpR.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-BaazL_pt.js → RolesPage-B_3qWsvQ.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-BaazL_pt.js.map → RolesPage-B_3qWsvQ.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-DxuV0fa1.js → RunAsSelector-CbJT50Hp.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-DxuV0fa1.js.map → RunAsSelector-CbJT50Hp.js.map} +1 -1
- package/dashboard/dist/assets/{ScanCodesPage-C0mvmYTq.js → ScanCodesPage-CIIDuh8w.js} +2 -2
- package/dashboard/dist/assets/{ScanCodesPage-C0mvmYTq.js.map → ScanCodesPage-CIIDuh8w.js.map} +1 -1
- package/dashboard/dist/assets/{ScanSchemeDetailPage-CiJgt5dZ.js → ScanSchemeDetailPage-Bd3P3eyh.js} +2 -2
- package/dashboard/dist/assets/{ScanSchemeDetailPage-CiJgt5dZ.js.map → ScanSchemeDetailPage-Bd3P3eyh.js.map} +1 -1
- package/dashboard/dist/assets/ScanStationPage-BiO34nov.js +2 -0
- package/dashboard/dist/assets/ScanStationPage-BiO34nov.js.map +1 -0
- package/dashboard/dist/assets/{ScopeBadge-CSItPVOH.js → ScopeBadge-CKgfwTy3.js} +2 -2
- package/dashboard/dist/assets/{ScopeBadge-CSItPVOH.js.map → ScopeBadge-CKgfwTy3.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-CqbjVY6T.js → StickyPagination-BNOuYZ1m.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-CqbjVY6T.js.map → StickyPagination-BNOuYZ1m.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-wX3i0aqs.js → StreamMessageDetail-ALVUnfF1.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-wX3i0aqs.js.map → StreamMessageDetail-ALVUnfF1.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-C50PsFoV.js → SwimlaneTimeline-B5b8-xqI.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-C50PsFoV.js.map → SwimlaneTimeline-B5b8-xqI.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-CAgdLN_b.js → TagInput-B6fMAqxd.js} +2 -2
- package/dashboard/dist/assets/{TagInput-CAgdLN_b.js.map → TagInput-B6fMAqxd.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-bbNSv4Ae.js → TaskDetailPage-CoV3WcTA.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-bbNSv4Ae.js.map → TaskDetailPage-CoV3WcTA.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-h0oorVMe.js → TaskQueuePill-BnDp_DE6.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-h0oorVMe.js.map → TaskQueuePill-BnDp_DE6.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-CDWnm_d9.js → TasksListPage-CkMmOYOE.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-CDWnm_d9.js.map → TasksListPage-CkMmOYOE.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-BLjqlfoX.js → TimeAgo-DVkFgECX.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-BLjqlfoX.js.map → TimeAgo-DVkFgECX.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-CnW0ENb5.js → TimestampCell-CfTc6Txy.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-CnW0ENb5.js.map → TimestampCell-CfTc6Txy.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-CQCsVdzD.js → ToolPill-BRZWo4l8.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-CQCsVdzD.js.map → ToolPill-BRZWo4l8.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-DkMgCB-k.js → ToolTestPanel-kvqZqM0A.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-DkMgCB-k.js.map → ToolTestPanel-kvqZqM0A.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-g3pljKKX.js → TopicDetailPage-CjkAAyy8.js} +4 -4
- package/dashboard/dist/assets/{TopicDetailPage-g3pljKKX.js.map → TopicDetailPage-CjkAAyy8.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-CVcCYdy-.js → TopicsPage-CJZnv50y.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-CVcCYdy-.js.map → TopicsPage-CJZnv50y.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-D6zGIK2i.js → UserName-CPJPZnN1.js} +2 -2
- package/dashboard/dist/assets/{UserName-D6zGIK2i.js.map → UserName-CPJPZnN1.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-46UV5pJd.js +2 -0
- package/dashboard/dist/assets/{WorkflowExecutionPage-B8g81FCJ.js.map → WorkflowExecutionPage-46UV5pJd.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-Dg7BDTyM.js → WorkflowPill-Cly9Ln_3.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-Dg7BDTyM.js.map → WorkflowPill-Cly9Ln_3.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-nxT3bv6W.js → WorkflowsDashboard-DtxYdQbQ.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-nxT3bv6W.js.map → WorkflowsDashboard-DtxYdQbQ.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-grI-KAI2.js → WorkflowsOverview-Cg4LSfck.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-grI-KAI2.js.map → WorkflowsOverview-Cg4LSfck.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-BoZ-hfBE.js → YamlWorkflowDetailPage-Del-RCgi.js} +12 -12
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-BoZ-hfBE.js.map → YamlWorkflowDetailPage-Del-RCgi.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-Bf04rwRv.js → YamlWorkflowsPage-BF6Jtx24.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-Bf04rwRv.js.map → YamlWorkflowsPage-BF6Jtx24.js.map} +1 -1
- package/dashboard/dist/assets/{agents-Dphpdi8l.js → agents-wL-3dMOX.js} +2 -2
- package/dashboard/dist/assets/{agents-Dphpdi8l.js.map → agents-wL-3dMOX.js.map} +1 -1
- package/dashboard/dist/assets/{bots-DIFE298x.js → bots-D72EsztP.js} +2 -2
- package/dashboard/dist/assets/{bots-DIFE298x.js.map → bots-D72EsztP.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-D7Y7LClY.js → capabilities-DXFo6bRb.js} +2 -2
- package/dashboard/dist/assets/{capabilities-D7Y7LClY.js.map → capabilities-DXFo6bRb.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-D1TGcYsS.js → controlplane-gQdOgVtH.js} +2 -2
- package/dashboard/dist/assets/{controlplane-D1TGcYsS.js.map → controlplane-gQdOgVtH.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-CSE5wfWQ.js +2 -0
- package/dashboard/dist/assets/escalation-columns-CSE5wfWQ.js.map +1 -0
- package/dashboard/dist/assets/escalation-items-BIgBWbaw.js +2 -0
- package/dashboard/dist/assets/escalation-items-BIgBWbaw.js.map +1 -0
- package/dashboard/dist/assets/{index-CeCtqujG.js → index-BaCDL5fh.js} +38 -38
- package/dashboard/dist/assets/index-BaCDL5fh.js.map +1 -0
- package/dashboard/dist/assets/{index-Dl_8hbYI.js → index-Btm8FtTQ.js} +2 -2
- package/dashboard/dist/assets/{index-Dl_8hbYI.js.map → index-Btm8FtTQ.js.map} +1 -1
- package/dashboard/dist/assets/index-BvH8T-jb.js +2 -0
- package/dashboard/dist/assets/{index-CxdjT1Yk.js.map → index-BvH8T-jb.js.map} +1 -1
- package/dashboard/dist/assets/{index-HLu98Sqh.js → index-C-QQ5rKF.js} +2 -2
- package/dashboard/dist/assets/{index-HLu98Sqh.js.map → index-C-QQ5rKF.js.map} +1 -1
- package/dashboard/dist/assets/{index-DpKOr311.js → index-C1iuZ4Q5.js} +2 -2
- package/dashboard/dist/assets/{index-DpKOr311.js.map → index-C1iuZ4Q5.js.map} +1 -1
- package/dashboard/dist/assets/{index-ChV7pBjM.js → index-CDxOQ84B.js} +2 -2
- package/dashboard/dist/assets/{index-ChV7pBjM.js.map → index-CDxOQ84B.js.map} +1 -1
- package/dashboard/dist/assets/index-CED9cLE2.js +3 -0
- package/dashboard/dist/assets/index-CED9cLE2.js.map +1 -0
- package/dashboard/dist/assets/index-CnU7Jjz3.css +1 -0
- package/dashboard/dist/assets/{index-DAvi5_2T.js → index-CptTEhWp.js} +2 -2
- package/dashboard/dist/assets/{index-DAvi5_2T.js.map → index-CptTEhWp.js.map} +1 -1
- package/dashboard/dist/assets/{index-ag2pCAPu.js → index-Cu0xdX2t.js} +2 -2
- package/dashboard/dist/assets/{index-ag2pCAPu.js.map → index-Cu0xdX2t.js.map} +1 -1
- package/dashboard/dist/assets/index-D1lfq5iZ.js +13 -0
- package/dashboard/dist/assets/{index-gkxPN7Vx.js.map → index-D1lfq5iZ.js.map} +1 -1
- package/dashboard/dist/assets/{index-Dy1wWu2e.js → index-czgLyfSo.js} +2 -2
- package/dashboard/dist/assets/{index-Dy1wWu2e.js.map → index-czgLyfSo.js.map} +1 -1
- package/dashboard/dist/assets/{index-DN-kX7hL.js → index-h1Useskt.js} +2 -2
- package/dashboard/dist/assets/{index-DN-kX7hL.js.map → index-h1Useskt.js.map} +1 -1
- package/dashboard/dist/assets/{index-BzYcUPdD.js → index-ujGmmwl6.js} +2 -2
- package/dashboard/dist/assets/{index-BzYcUPdD.js.map → index-ujGmmwl6.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-DnMs-SOJ.js → knowledge-150lsM68.js} +2 -2
- package/dashboard/dist/assets/{knowledge-DnMs-SOJ.js.map → knowledge-150lsM68.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-CwW-K3r4.js → mcp-CRtY4v5W.js} +2 -2
- package/dashboard/dist/assets/{mcp-CwW-K3r4.js.map → mcp-CRtY4v5W.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-BZt5e8_Q.js → mcp-query-CDsSMaYq.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-BZt5e8_Q.js.map → mcp-query-CDsSMaYq.js.map} +1 -1
- package/dashboard/dist/assets/{personas-UA-Xn60f.js → personas-C2Wm4ng1.js} +2 -2
- package/dashboard/dist/assets/{personas-UA-Xn60f.js.map → personas-C2Wm4ng1.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-Cu3PARum.js → pipelines-BH0F9-jf.js} +2 -2
- package/dashboard/dist/assets/{pipelines-Cu3PARum.js.map → pipelines-BH0F9-jf.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-BO6h8GJE.js → tasks-BkUVpaOa.js} +2 -2
- package/dashboard/dist/assets/{tasks-BO6h8GJE.js.map → tasks-BkUVpaOa.js.map} +1 -1
- package/dashboard/dist/assets/{topics-CWjCR-17.js → topics-Crl8HKHq.js} +2 -2
- package/dashboard/dist/assets/{topics-CWjCR-17.js.map → topics-Crl8HKHq.js.map} +1 -1
- package/dashboard/dist/assets/{useDebouncedValue-6t0jx1RB.js → useDebouncedValue-Dk3r5xo-.js} +2 -2
- package/dashboard/dist/assets/{useDebouncedValue-6t0jx1RB.js.map → useDebouncedValue-Dk3r5xo-.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-CqpoQx6D.js → useNamespace-BXuyHKAs.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-CqpoQx6D.js.map → useNamespace-BXuyHKAs.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-hmCQQwzB.js → useYamlActivityEvents-DSlkjQfb.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-hmCQQwzB.js.map → useYamlActivityEvents-DSlkjQfb.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-CeVtUKyP.js → vendor-icons-C_DQEeBy.js} +2 -2
- package/dashboard/dist/assets/{vendor-icons-CeVtUKyP.js.map → vendor-icons-C_DQEeBy.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-ziUdZhKY.js → yaml-workflows-B230v5Za.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-ziUdZhKY.js.map → yaml-workflows-B230v5Za.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/faceted-routing.md +14 -1
- package/docs/hitl/x-lt-embed.md +4 -1
- package/docs/hitl/x-lt-list-schema.md +19 -2
- package/docs/hitl/x-lt-roster.md +112 -0
- package/docs/hitl/x-lt-show-if.md +15 -0
- package/docs/hitl/x-lt-widget.md +1 -0
- package/docs/hitl-guide.md +3 -1
- package/docs/maintenance.md +3 -3
- package/docs/mcp.md +2 -0
- package/docs/scan-codes.md +4 -0
- package/docs/schema-enforcement.md +5 -0
- package/package.json +2 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-IS28XBRe.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-LG03dVgR.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-LG03dVgR.js.map +0 -1
- package/dashboard/dist/assets/EscalationTimeline-d3nvshOk.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-bMXNO-6V.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-DctmZw10.js +0 -2
- package/dashboard/dist/assets/PortalPage-Dfc_Q02R.js +0 -2
- package/dashboard/dist/assets/ResolverForm-B1_x8Blv.js +0 -8
- package/dashboard/dist/assets/ResolverForm-B1_x8Blv.js.map +0 -1
- package/dashboard/dist/assets/ScanStationPage-DzGaXc40.js +0 -2
- package/dashboard/dist/assets/ScanStationPage-DzGaXc40.js.map +0 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-B8g81FCJ.js +0 -2
- package/dashboard/dist/assets/escalation-columns-cwZE6xyo.js +0 -2
- package/dashboard/dist/assets/escalation-columns-cwZE6xyo.js.map +0 -1
- package/dashboard/dist/assets/index-CeCtqujG.js.map +0 -1
- package/dashboard/dist/assets/index-CniRa65p.js +0 -3
- package/dashboard/dist/assets/index-CniRa65p.js.map +0 -1
- package/dashboard/dist/assets/index-CxdjT1Yk.js +0 -2
- package/dashboard/dist/assets/index-gkxPN7Vx.js +0 -13
- package/dashboard/dist/assets/index-m9A3UYst.css +0 -1
- package/dashboard/dist/assets/validate-BIRn4a6d.js +0 -2
- package/dashboard/dist/assets/validate-BIRn4a6d.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as t}from"./vendor-query-DvWWuNIB.js";import{a$ as o,
|
|
2
|
-
//# sourceMappingURL=FormattedValue-
|
|
1
|
+
import{j as t}from"./vendor-query-DvWWuNIB.js";import{a$ as o,bg as c,g as u}from"./index-BaCDL5fh.js";import{U as p}from"./UserName-CPJPZnN1.js";const r=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}/,i="—",a={AGE:"age",AGO:"ago",DATE:"date",USER:"user"};function m(e){return e===a.AGE||e===a.AGO}function x({raw:e,format:s}){if(!e||e===i)return t.jsx("span",{className:"text-text-quaternary",children:i});if(s===a.USER)return t.jsx(p,{userId:e,className:"block truncate"});const n=r.test(e)||!Number.isNaN(new Date(e).getTime())&&(m(s)||s===a.DATE);return m(s)&&n?t.jsx("span",{title:c(e),className:"tabular-nums whitespace-nowrap",children:o(e)}):n&&(s===a.DATE||r.test(e))?t.jsx(u,{date:e,format:"datetime",className:"text-text-primary whitespace-nowrap"}):t.jsx(t.Fragment,{children:e})}export{i as E,x as F,m as i};
|
|
2
|
+
//# sourceMappingURL=FormattedValue-CUtv1g3k.js.map
|
package/dashboard/dist/assets/{FormattedValue-k27T4bG7.js.map → FormattedValue-CUtv1g3k.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormattedValue-
|
|
1
|
+
{"version":3,"file":"FormattedValue-CUtv1g3k.js","sources":["../../src/components/common/display/FormattedValue.tsx"],"sourcesContent":["import { DateValue } from './DateValue';\nimport { UserName } from './UserName';\nimport { formatAgoCompact } from '../../../lib/format';\nimport { formatDisplayDateTime } from '../../../lib/display-zone';\n\nconst ISO_DATETIME = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}/;\nexport const EM_DASH = '—';\n\n/** Value formats an author may name on a column, card field, or fact. `ago` is the spoken form of `age`. */\nexport const FIELD_FORMATS = {\n AGE: 'age',\n AGO: 'ago',\n DATE: 'date',\n USER: 'user',\n} as const;\n\n/** True when the format renders as an age that ages with the clock. */\nexport function isAgeFormat(format?: string): boolean {\n return format === FIELD_FORMATS.AGE || format === FIELD_FORMATS.AGO;\n}\n\n/**\n * Render a value with a little care: `age`/`ago` turns a timestamp into a\n * compact age (\"12m\", \"3h\") with the absolute time as its tooltip; `date`\n * renders the full date, hoverable, and so does any ISO datetime with no\n * format; `user` resolves a user id to a display name; an empty value a quiet\n * em dash; anything else plain text.\n */\nexport function FormattedValue({ raw, format }: { raw: string; format?: string }) {\n if (!raw || raw === EM_DASH) return <span className=\"text-text-quaternary\">{EM_DASH}</span>;\n if (format === FIELD_FORMATS.USER) return <UserName userId={raw} className=\"block truncate\" />;\n const isDate = ISO_DATETIME.test(raw) || !Number.isNaN(new Date(raw).getTime()) && (isAgeFormat(format) || format === FIELD_FORMATS.DATE);\n if (isAgeFormat(format) && isDate) {\n return <span title={formatDisplayDateTime(raw)} className=\"tabular-nums whitespace-nowrap\">{formatAgoCompact(raw)}</span>;\n }\n if (isDate && (format === FIELD_FORMATS.DATE || ISO_DATETIME.test(raw))) {\n return <DateValue date={raw} format=\"datetime\" className=\"text-text-primary whitespace-nowrap\" />;\n }\n return <>{raw}</>;\n}\n"],"names":["ISO_DATETIME","EM_DASH","FIELD_FORMATS","isAgeFormat","format","FormattedValue","raw","jsx","UserName","isDate","formatDisplayDateTime","formatAgoCompact","DateValue"],"mappings":"kJAKA,MAAMA,EAAe,iCACRC,EAAU,IAGVC,EAAgB,CAC3B,IAAK,MACL,IAAK,MACL,KAAM,OACN,KAAM,MACR,EAGO,SAASC,EAAYC,EAA0B,CACpD,OAAOA,IAAWF,EAAc,KAAOE,IAAWF,EAAc,GAClE,CASO,SAASG,EAAe,CAAE,IAAAC,EAAK,OAAAF,GAA4C,CAChF,GAAI,CAACE,GAAOA,IAAQL,SAAgBM,EAAAA,IAAC,OAAA,CAAK,UAAU,uBAAwB,SAAAN,CAAA,CAAQ,EACpF,GAAIG,IAAWF,EAAc,KAAM,aAAQM,EAAA,CAAS,OAAQF,EAAK,UAAU,gBAAA,CAAiB,EAC5F,MAAMG,EAAST,EAAa,KAAKM,CAAG,GAAK,CAAC,OAAO,MAAM,IAAI,KAAKA,CAAG,EAAE,SAAS,IAAMH,EAAYC,CAAM,GAAKA,IAAWF,EAAc,MACpI,OAAIC,EAAYC,CAAM,GAAKK,EAClBF,EAAAA,IAAC,OAAA,CAAK,MAAOG,EAAsBJ,CAAG,EAAG,UAAU,iCAAkC,SAAAK,EAAiBL,CAAG,CAAA,CAAE,EAEhHG,IAAWL,IAAWF,EAAc,MAAQF,EAAa,KAAKM,CAAG,SAC3DM,EAAA,CAAU,KAAMN,EAAK,OAAO,WAAW,UAAU,sCAAsC,oBAEvF,SAAAA,CAAA,CAAI,CAChB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as l,j as e}from"./vendor-query-DvWWuNIB.js";import{l as L,u as O}from"./yaml-workflows-ziUdZhKY.js";import{P as J}from"./PageHeader-CMd3f4bz.js";import{u as E}from"./useYamlActivityEvents-hmCQQwzB.js";import{R as P}from"./RunAsSelector-DxuV0fa1.js";import{b as A}from"./helpers-DzO-OGPe.js";import{X as $,aA as z,av as M,j as w,b as T,a0 as W}from"./vendor-icons-CeVtUKyP.js";import{L as F,f as q}from"./vendor-react-_9U4mKFr.js";import{T as G}from"./ToolPill-CQCsVdzD.js";import{N as B}from"./NamespacePill-DwM5pNA4.js";import"./index-CeCtqujG.js";import"./BotPicker-DvEJFpwS.js";import"./bots-DIFE298x.js";const k={mcp:{border:"border-status-active",text:"text-status-active",icon:"MCP"},db:{border:"border-status-active",text:"text-status-active",icon:"DB"},llm:{border:"border-accent",text:"text-accent",icon:"LLM"},transform:{border:"border-status-success",text:"text-status-success",icon:"Map"}};function U({steps:a,manifest:x,isComplete:i}){const n=x.filter(t=>t.type==="worker"),u=n.length,s=n.map(t=>{const r=a.find(f=>f.activityId===t.activity_id),d=t.tool_source||"mcp",m=k[d]||k.mcp;return{activityId:t.activity_id,title:t.title||t.mcp_tool_name||t.activity_id,toolName:t.mcp_tool_name,colors:m,status:(r==null?void 0:r.status)||"pending",error:r==null?void 0:r.error}});return e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs text-text-secondary mb-3",children:i?`All ${u} steps completed`:`Running step ${s.filter(t=>t.status==="completed").length+1} of ${u}...`}),e.jsx("div",{className:"space-y-0",children:s.map((t,r)=>{const d=r===s.length-1;return e.jsxs("div",{className:"flex items-stretch gap-2",children:[e.jsxs("div",{className:"flex flex-col items-center w-4 shrink-0",children:[e.jsx("span",{className:`w-2.5 h-2.5 rounded-full shrink-0 border-2 transition-colors ${t.status==="completed"?"bg-status-success border-status-success":t.status==="running"?`${t.colors.border} bg-transparent animate-pulse`:t.status==="failed"?"bg-status-error border-status-error":"bg-surface-sunken border-surface-border"}`}),!d&&e.jsx("span",{className:`w-px flex-1 transition-colors ${t.status==="completed"?"bg-status-success/30":"bg-surface-border"}`})]}),e.jsxs("div",{className:d?"":"pb-3",children:[e.jsx("p",{className:`text-2xs font-medium ${t.status==="running"?"text-text-primary":t.status==="completed"?"text-text-secondary":t.status==="failed"?"text-status-error":"text-text-tertiary"}`,children:t.title}),t.toolName&&e.jsx("span",{className:"text-2xs text-text-tertiary font-mono",children:t.toolName}),t.error&&e.jsx("p",{className:"text-2xs text-status-error mt-0.5",children:t.error})]})]},t.activityId)})})]})}function Y({workflow:a,onClose:x}){const i=L(),[n,u]=l.useState(!1),[s,t]=l.useState({}),[r,d]=l.useState(""),[m,f]=l.useState(""),[g,S]=l.useState(""),[h,j]=l.useState(null),[N,b]=l.useState(null),{steps:C,isComplete:y}=E(h);l.useEffect(()=>{j(null),b(null),f(""),i.reset();const c=A(a.input_schema);t(c),d(JSON.stringify(c,null,2)),u(!1)},[a.id]),l.useEffect(()=>{if(y&&h){const c=h,o=setTimeout(()=>{b({jobId:c}),j(null)},800);return()=>clearTimeout(o)}},[y,h]);const _=()=>{if(!n)d(JSON.stringify(s,null,2));else try{t(JSON.parse(r))}catch{}u(!n)},I=async()=>{f(""),b(null);let c;if(n)try{c=JSON.parse(r)}catch{f("Invalid JSON");return}else c={...s};try{const o=await i.mutateAsync({id:a.id,data:c,sync:!1,...g?{execute_as:g}:{}});o.job_id&&j(o.job_id)}catch{}},v=!!h,R=a.app_id||"";return e.jsxs("div",{className:"border-l border-surface-border bg-surface-raised flex flex-col h-full",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-3 border-b border-surface-border shrink-0",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("p",{className:"text-xs font-medium text-text-primary truncate",children:a.app_id}),e.jsx("code",{className:"text-2xs font-mono text-accent truncate block",children:a.graph_topic})]}),e.jsx("button",{onClick:()=>{v||x()},className:"p-1 text-text-tertiary hover:text-text-primary shrink-0 ml-2",children:e.jsx($,{className:"w-4 h-4"})})]}),e.jsx("div",{className:"flex-1 overflow-y-auto px-4 py-3 space-y-4",children:v?e.jsx(U,{steps:C,manifest:a.activity_manifest,isComplete:y}):N?e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("svg",{className:"w-4 h-4 text-status-success",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("path",{d:"M8 1a7 7 0 110 14A7 7 0 018 1zm3.36 4.65a.5.5 0 00-.72 0L7 9.29 5.36 7.65a.5.5 0 10-.72.7l2 2a.5.5 0 00.72 0l4-4a.5.5 0 000-.7z"})}),e.jsx("p",{className:"text-xs font-medium text-status-success",children:"Workflow completed"})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs(F,{to:`/mcp/executions/${encodeURIComponent(N.jobId)}?namespace=${encodeURIComponent(R)}`,className:"inline-flex items-center gap-1.5 text-xs text-accent hover:underline",children:[e.jsx(z,{size:12})," View execution"]}),e.jsxs("button",{onClick:()=>b(null),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(M,{size:12})," Run again"]})]})]}):e.jsxs(e.Fragment,{children:[e.jsx(P,{selected:g,onChange:S}),a.description&&e.jsx("p",{className:"text-2xs text-text-secondary leading-relaxed",children:a.description}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-1",children:[e.jsx("label",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary",children:"Input"}),e.jsx("button",{onClick:_,className:"text-2xs text-accent hover:underline",children:n?"Form view":"JSON view"})]}),n?e.jsx("textarea",{value:r,onChange:c=>d(c.target.value),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-2xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary resize-y",rows:6,spellCheck:!1}):e.jsxs("div",{className:"space-y-3 max-h-[300px] overflow-y-auto",children:[Object.entries(s).map(([c,o])=>e.jsxs("div",{children:[e.jsx("label",{className:"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:c}),typeof o=="boolean"?e.jsxs("select",{value:String(o),onChange:p=>t({...s,[c]:p.target.value==="true"}),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary",children:[e.jsx("option",{value:"true",children:"true"}),e.jsx("option",{value:"false",children:"false"})]}):typeof o=="object"?e.jsx("textarea",{value:JSON.stringify(o,null,2),onChange:p=>{try{t({...s,[c]:JSON.parse(p.target.value)})}catch{}},className:"w-full min-h-[60px] px-3 py-1.5 bg-surface-sunken border border-surface-border rounded-md font-mono text-xs text-text-primary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary"}):e.jsx("input",{type:typeof o=="number"?"number":"text",value:String(o??""),onChange:p=>t({...s,[c]:typeof o=="number"?Number(p.target.value):p.target.value}),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary"})]},c)),Object.keys(s).length===0&&e.jsx("p",{className:"text-2xs text-text-tertiary italic",children:"No input fields defined"})]}),m&&e.jsx("p",{className:"text-2xs text-status-error mt-1",children:m})]}),i.isError&&e.jsx("div",{className:"bg-status-error/10 border border-status-error/20 rounded-md px-3 py-2",children:e.jsx("p",{className:"text-2xs text-status-error",children:i.error instanceof Error?i.error.message:"Invocation failed"})}),e.jsx("button",{onClick:I,disabled:i.isPending,className:"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5",children:i.isPending?"Starting...":e.jsxs(e.Fragment,{children:[e.jsx(w,{size:12})," Run"]})})]})})]})}function H({flows:a,selectedId:x,onSelect:i}){const[n,u]=l.useState(""),s=l.useMemo(()=>{if(!n.trim())return a;const t=n.toLowerCase();return a.filter(r=>{var d,m;return r.graph_topic.toLowerCase().includes(t)||((d=r.description)==null?void 0:d.toLowerCase().includes(t))||((m=r.app_id)==null?void 0:m.toLowerCase().includes(t))})},[a,n]);return e.jsxs("div",{children:[e.jsxs("div",{className:"sticky top-0 z-20 bg-surface pt-4",children:[e.jsx("div",{className:"bg-surface-sunken rounded-lg px-4 py-2 mb-3",children:e.jsxs("div",{className:"relative w-1/2",children:[e.jsx(T,{className:"absolute left-2.5 top-1/2 -translate-y-1/2 w-3 h-3 text-text-quaternary pointer-events-none"}),e.jsx("input",{type:"text",value:n,onChange:t=>u(t.target.value),placeholder:`Search ${a.length} flows…`,className:"input pl-8"})]})}),e.jsxs("div",{className:"flex items-center gap-2 py-2 border-b border-surface-border",children:[e.jsx(W,{className:"w-3 h-3 text-accent",strokeWidth:1.5}),e.jsx("h2",{className:"section-h2",children:"Graph Flows"}),e.jsx("span",{className:"text-xs text-text-quaternary",children:s.length})]})]}),s.length===0?e.jsx("p",{className:"text-sm text-text-tertiary py-8 text-center",children:"No flows match your search."}):e.jsx("div",{className:"divide-y divide-surface-border/30",children:s.map(t=>{const r=x===t.id;return e.jsxs("button",{onClick:()=>i(t),className:"group relative w-full text-left py-2 px-3 -mx-3 rounded-md transition-colors duration-150",children:[r&&e.jsx("span",{className:"absolute left-0 top-1 bottom-1 w-0.5 bg-accent rounded-full"}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(G,{name:t.graph_topic,size:"md"}),t.description&&e.jsx("p",{className:"flex-1 min-w-0 truncate text-2xs text-text-tertiary group-hover:text-text-secondary transition-colors",children:t.description}),e.jsx("span",{className:"ml-auto shrink-0",children:e.jsx(B,{namespace:t.app_id})})]})]},t.id)})})]})}function ie(){const[a,x]=q(),i=a.get("id")??"",{data:n,isLoading:u}=O({status:"active",limit:200,offset:0}),s=(n==null?void 0:n.workflows)??[],t=s.find(r=>r.id===i)??null;return l.useEffect(()=>{s.length===1&&!a.get("id")&&x({id:s[0].id},{replace:!0})},[s.length]),u?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"})]}):e.jsxs("div",{children:[e.jsx(J,{title:"Invoke",docsHash:"#docs:dashboard.md:graph-workflows"}),s.length===0?e.jsxs("div",{className:"py-16 text-center",children:[e.jsx("p",{className:"text-sm text-text-primary mb-1",children:"No active graph flows"}),e.jsx("p",{className:"text-xs text-text-tertiary",children:"Register graph flows at startup with the graphWorkflows config, or deploy one from Configure."})]}):e.jsxs("div",{className:"grid grid-cols-3 gap-8 items-start",children:[e.jsx("div",{className:"col-span-2",children:e.jsx(H,{flows:s,selectedId:i,onSelect:r=>x({id:r.id},{replace:!0})})}),e.jsx("div",{className:"sticky top-4 transition-all duration-200 ease-out",children:t?e.jsx(Y,{workflow:t,onClose:()=>x({},{replace:!0})}):e.jsxs("div",{className:"flex flex-col items-center justify-center py-24 text-center",children:[e.jsx(w,{className:"w-6 h-6 text-text-quaternary mb-3",strokeWidth:1}),e.jsx("p",{className:"text-sm text-text-tertiary",children:"Select a flow"}),e.jsx("p",{className:"text-xs text-text-quaternary mt-1",children:"Choose one from the list to run it."})]})})]})]})}export{ie as GraphInvokePage};
|
|
2
|
-
//# sourceMappingURL=GraphInvokePage-
|
|
1
|
+
import{a as l,j as e}from"./vendor-query-DvWWuNIB.js";import{l as L,u as O}from"./yaml-workflows-B230v5Za.js";import{P as J}from"./PageHeader-C4z1ExF7.js";import{u as E}from"./useYamlActivityEvents-DSlkjQfb.js";import{R as P}from"./RunAsSelector-CbJT50Hp.js";import{b as A}from"./helpers-DzO-OGPe.js";import{X as $,aB as z,aw as M,k as w,b as T,a1 as W}from"./vendor-icons-C_DQEeBy.js";import{L as F,f as q}from"./vendor-react-_9U4mKFr.js";import{T as B}from"./ToolPill-BRZWo4l8.js";import{N as G}from"./NamespacePill-CSZT2fA4.js";import"./index-BaCDL5fh.js";import"./BotPicker-u5760MWZ.js";import"./bots-D72EsztP.js";const k={mcp:{border:"border-status-active",text:"text-status-active",icon:"MCP"},db:{border:"border-status-active",text:"text-status-active",icon:"DB"},llm:{border:"border-accent",text:"text-accent",icon:"LLM"},transform:{border:"border-status-success",text:"text-status-success",icon:"Map"}};function U({steps:a,manifest:x,isComplete:i}){const n=x.filter(t=>t.type==="worker"),u=n.length,s=n.map(t=>{const r=a.find(f=>f.activityId===t.activity_id),d=t.tool_source||"mcp",m=k[d]||k.mcp;return{activityId:t.activity_id,title:t.title||t.mcp_tool_name||t.activity_id,toolName:t.mcp_tool_name,colors:m,status:(r==null?void 0:r.status)||"pending",error:r==null?void 0:r.error}});return e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs text-text-secondary mb-3",children:i?`All ${u} steps completed`:`Running step ${s.filter(t=>t.status==="completed").length+1} of ${u}...`}),e.jsx("div",{className:"space-y-0",children:s.map((t,r)=>{const d=r===s.length-1;return e.jsxs("div",{className:"flex items-stretch gap-2",children:[e.jsxs("div",{className:"flex flex-col items-center w-4 shrink-0",children:[e.jsx("span",{className:`w-2.5 h-2.5 rounded-full shrink-0 border-2 transition-colors ${t.status==="completed"?"bg-status-success border-status-success":t.status==="running"?`${t.colors.border} bg-transparent animate-pulse`:t.status==="failed"?"bg-status-error border-status-error":"bg-surface-sunken border-surface-border"}`}),!d&&e.jsx("span",{className:`w-px flex-1 transition-colors ${t.status==="completed"?"bg-status-success/30":"bg-surface-border"}`})]}),e.jsxs("div",{className:d?"":"pb-3",children:[e.jsx("p",{className:`text-2xs font-medium ${t.status==="running"?"text-text-primary":t.status==="completed"?"text-text-secondary":t.status==="failed"?"text-status-error":"text-text-tertiary"}`,children:t.title}),t.toolName&&e.jsx("span",{className:"text-2xs text-text-tertiary font-mono",children:t.toolName}),t.error&&e.jsx("p",{className:"text-2xs text-status-error mt-0.5",children:t.error})]})]},t.activityId)})})]})}function Y({workflow:a,onClose:x}){const i=L(),[n,u]=l.useState(!1),[s,t]=l.useState({}),[r,d]=l.useState(""),[m,f]=l.useState(""),[g,S]=l.useState(""),[h,j]=l.useState(null),[N,b]=l.useState(null),{steps:C,isComplete:y}=E(h);l.useEffect(()=>{j(null),b(null),f(""),i.reset();const c=A(a.input_schema);t(c),d(JSON.stringify(c,null,2)),u(!1)},[a.id]),l.useEffect(()=>{if(y&&h){const c=h,o=setTimeout(()=>{b({jobId:c}),j(null)},800);return()=>clearTimeout(o)}},[y,h]);const _=()=>{if(!n)d(JSON.stringify(s,null,2));else try{t(JSON.parse(r))}catch{}u(!n)},I=async()=>{f(""),b(null);let c;if(n)try{c=JSON.parse(r)}catch{f("Invalid JSON");return}else c={...s};try{const o=await i.mutateAsync({id:a.id,data:c,sync:!1,...g?{execute_as:g}:{}});o.job_id&&j(o.job_id)}catch{}},v=!!h,R=a.app_id||"";return e.jsxs("div",{className:"border-l border-surface-border bg-surface-raised flex flex-col h-full",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-3 border-b border-surface-border shrink-0",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("p",{className:"text-xs font-medium text-text-primary truncate",children:a.app_id}),e.jsx("code",{className:"text-2xs font-mono text-accent truncate block",children:a.graph_topic})]}),e.jsx("button",{onClick:()=>{v||x()},className:"p-1 text-text-tertiary hover:text-text-primary shrink-0 ml-2",children:e.jsx($,{className:"w-4 h-4"})})]}),e.jsx("div",{className:"flex-1 overflow-y-auto px-4 py-3 space-y-4",children:v?e.jsx(U,{steps:C,manifest:a.activity_manifest,isComplete:y}):N?e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("svg",{className:"w-4 h-4 text-status-success",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("path",{d:"M8 1a7 7 0 110 14A7 7 0 018 1zm3.36 4.65a.5.5 0 00-.72 0L7 9.29 5.36 7.65a.5.5 0 10-.72.7l2 2a.5.5 0 00.72 0l4-4a.5.5 0 000-.7z"})}),e.jsx("p",{className:"text-xs font-medium text-status-success",children:"Workflow completed"})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs(F,{to:`/mcp/executions/${encodeURIComponent(N.jobId)}?namespace=${encodeURIComponent(R)}`,className:"inline-flex items-center gap-1.5 text-xs text-accent hover:underline",children:[e.jsx(z,{size:12})," View execution"]}),e.jsxs("button",{onClick:()=>b(null),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(M,{size:12})," Run again"]})]})]}):e.jsxs(e.Fragment,{children:[e.jsx(P,{selected:g,onChange:S}),a.description&&e.jsx("p",{className:"text-2xs text-text-secondary leading-relaxed",children:a.description}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-1",children:[e.jsx("label",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary",children:"Input"}),e.jsx("button",{onClick:_,className:"text-2xs text-accent hover:underline",children:n?"Form view":"JSON view"})]}),n?e.jsx("textarea",{value:r,onChange:c=>d(c.target.value),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-2xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary resize-y",rows:6,spellCheck:!1}):e.jsxs("div",{className:"space-y-3 max-h-[300px] overflow-y-auto",children:[Object.entries(s).map(([c,o])=>e.jsxs("div",{children:[e.jsx("label",{className:"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:c}),typeof o=="boolean"?e.jsxs("select",{value:String(o),onChange:p=>t({...s,[c]:p.target.value==="true"}),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary",children:[e.jsx("option",{value:"true",children:"true"}),e.jsx("option",{value:"false",children:"false"})]}):typeof o=="object"?e.jsx("textarea",{value:JSON.stringify(o,null,2),onChange:p=>{try{t({...s,[c]:JSON.parse(p.target.value)})}catch{}},className:"w-full min-h-[60px] px-3 py-1.5 bg-surface-sunken border border-surface-border rounded-md font-mono text-xs text-text-primary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary"}):e.jsx("input",{type:typeof o=="number"?"number":"text",value:String(o??""),onChange:p=>t({...s,[c]:typeof o=="number"?Number(p.target.value):p.target.value}),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary"})]},c)),Object.keys(s).length===0&&e.jsx("p",{className:"text-2xs text-text-tertiary italic",children:"No input fields defined"})]}),m&&e.jsx("p",{className:"text-2xs text-status-error mt-1",children:m})]}),i.isError&&e.jsx("div",{className:"bg-status-error/10 border border-status-error/20 rounded-md px-3 py-2",children:e.jsx("p",{className:"text-2xs text-status-error",children:i.error instanceof Error?i.error.message:"Invocation failed"})}),e.jsx("button",{onClick:I,disabled:i.isPending,className:"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5",children:i.isPending?"Starting...":e.jsxs(e.Fragment,{children:[e.jsx(w,{size:12})," Run"]})})]})})]})}function H({flows:a,selectedId:x,onSelect:i}){const[n,u]=l.useState(""),s=l.useMemo(()=>{if(!n.trim())return a;const t=n.toLowerCase();return a.filter(r=>{var d,m;return r.graph_topic.toLowerCase().includes(t)||((d=r.description)==null?void 0:d.toLowerCase().includes(t))||((m=r.app_id)==null?void 0:m.toLowerCase().includes(t))})},[a,n]);return e.jsxs("div",{children:[e.jsxs("div",{className:"sticky top-0 z-20 bg-surface pt-4",children:[e.jsx("div",{className:"bg-surface-sunken rounded-lg px-4 py-2 mb-3",children:e.jsxs("div",{className:"relative w-1/2",children:[e.jsx(T,{className:"absolute left-2.5 top-1/2 -translate-y-1/2 w-3 h-3 text-text-quaternary pointer-events-none"}),e.jsx("input",{type:"text",value:n,onChange:t=>u(t.target.value),placeholder:`Search ${a.length} flows…`,className:"input pl-8"})]})}),e.jsxs("div",{className:"flex items-center gap-2 py-2 border-b border-surface-border",children:[e.jsx(W,{className:"w-3 h-3 text-accent",strokeWidth:1.5}),e.jsx("h2",{className:"section-h2",children:"Graph Flows"}),e.jsx("span",{className:"text-xs text-text-quaternary",children:s.length})]})]}),s.length===0?e.jsx("p",{className:"text-sm text-text-tertiary py-8 text-center",children:"No flows match your search."}):e.jsx("div",{className:"divide-y divide-surface-border/30",children:s.map(t=>{const r=x===t.id;return e.jsxs("button",{onClick:()=>i(t),className:"group relative w-full text-left py-2 px-3 -mx-3 rounded-md transition-colors duration-150",children:[r&&e.jsx("span",{className:"absolute left-0 top-1 bottom-1 w-0.5 bg-accent rounded-full"}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(B,{name:t.graph_topic,size:"md"}),t.description&&e.jsx("p",{className:"flex-1 min-w-0 truncate text-2xs text-text-tertiary group-hover:text-text-secondary transition-colors",children:t.description}),e.jsx("span",{className:"ml-auto shrink-0",children:e.jsx(G,{namespace:t.app_id})})]})]},t.id)})})]})}function ie(){const[a,x]=q(),i=a.get("id")??"",{data:n,isLoading:u}=O({status:"active",limit:200,offset:0}),s=(n==null?void 0:n.workflows)??[],t=s.find(r=>r.id===i)??null;return l.useEffect(()=>{s.length===1&&!a.get("id")&&x({id:s[0].id},{replace:!0})},[s.length]),u?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"})]}):e.jsxs("div",{children:[e.jsx(J,{title:"Invoke",docsHash:"#docs:dashboard.md:graph-workflows"}),s.length===0?e.jsxs("div",{className:"py-16 text-center",children:[e.jsx("p",{className:"text-sm text-text-primary mb-1",children:"No active graph flows"}),e.jsx("p",{className:"text-xs text-text-tertiary",children:"Register graph flows at startup with the graphWorkflows config, or deploy one from Configure."})]}):e.jsxs("div",{className:"grid grid-cols-3 gap-8 items-start",children:[e.jsx("div",{className:"col-span-2",children:e.jsx(H,{flows:s,selectedId:i,onSelect:r=>x({id:r.id},{replace:!0})})}),e.jsx("div",{className:"sticky top-4 transition-all duration-200 ease-out",children:t?e.jsx(Y,{workflow:t,onClose:()=>x({},{replace:!0})}):e.jsxs("div",{className:"flex flex-col items-center justify-center py-24 text-center",children:[e.jsx(w,{className:"w-6 h-6 text-text-quaternary mb-3",strokeWidth:1}),e.jsx("p",{className:"text-sm text-text-tertiary",children:"Select a flow"}),e.jsx("p",{className:"text-xs text-text-quaternary mt-1",children:"Choose one from the list to run it."})]})})]})]})}export{ie as GraphInvokePage};
|
|
2
|
+
//# sourceMappingURL=GraphInvokePage-CR0MtYv8.js.map
|
package/dashboard/dist/assets/{GraphInvokePage-DKUErxWc.js.map → GraphInvokePage-CR0MtYv8.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GraphInvokePage-DKUErxWc.js","sources":["../../src/components/common/test/WorkflowTestPanel.tsx","../../src/pages/workflows/GraphFlowSelector.tsx","../../src/pages/workflows/GraphInvokePage.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport { Link } from 'react-router-dom';\nimport { X, Play, RotateCcw, ExternalLink } from 'lucide-react';\nimport { useInvokeYamlWorkflow } from '../../../api/yaml-workflows';\nimport { useYamlActivityEvents, type ActivityStep } from '../../../hooks/useYamlActivityEvents';\nimport { RunAsSelector } from '../form/RunAsSelector';\nimport type { LTYamlWorkflowRecord, ActivityManifestEntry } from '../../../api/types';\nimport { buildSkeleton } from '../../../pages/mcp/mcp-query-detail/helpers';\n\nconst TOOL_SOURCE_COLORS: Record<string, { border: string; text: string; icon: string }> = {\n mcp: { border: 'border-status-active', text: 'text-status-active', icon: 'MCP' },\n db: { border: 'border-status-active', text: 'text-status-active', icon: 'DB' },\n llm: { border: 'border-accent', text: 'text-accent', icon: 'LLM' },\n transform: { border: 'border-status-success', text: 'text-status-success', icon: 'Map' },\n};\n\nfunction LiveTimeline({ steps, manifest, isComplete }: {\n steps: ActivityStep[];\n manifest: ActivityManifestEntry[];\n isComplete: boolean;\n}) {\n const workerActivities = manifest.filter((a) => a.type === 'worker');\n const totalSteps = workerActivities.length;\n\n const merged = workerActivities.map((a) => {\n const live = steps.find((s) => s.activityId === a.activity_id);\n const source = a.tool_source || 'mcp';\n const colors = TOOL_SOURCE_COLORS[source] || TOOL_SOURCE_COLORS.mcp;\n return {\n activityId: a.activity_id,\n title: a.title || a.mcp_tool_name || a.activity_id,\n toolName: a.mcp_tool_name,\n colors,\n status: live?.status || 'pending' as const,\n error: live?.error,\n };\n });\n\n return (\n <div>\n <p className=\"text-2xs text-text-secondary mb-3\">\n {isComplete\n ? `All ${totalSteps} steps completed`\n : `Running step ${merged.filter((s) => s.status === 'completed').length + 1} of ${totalSteps}...`}\n </p>\n <div className=\"space-y-0\">\n {merged.map((step, idx) => {\n const isLast = idx === merged.length - 1;\n return (\n <div key={step.activityId} className=\"flex items-stretch gap-2\">\n <div className=\"flex flex-col items-center w-4 shrink-0\">\n <span className={`w-2.5 h-2.5 rounded-full shrink-0 border-2 transition-colors ${\n step.status === 'completed' ? 'bg-status-success border-status-success'\n : step.status === 'running' ? `${step.colors.border} bg-transparent animate-pulse`\n : step.status === 'failed' ? 'bg-status-error border-status-error'\n : 'bg-surface-sunken border-surface-border'\n }`} />\n {!isLast && (\n <span className={`w-px flex-1 transition-colors ${\n step.status === 'completed' ? 'bg-status-success/30' : 'bg-surface-border'\n }`} />\n )}\n </div>\n <div className={isLast ? '' : 'pb-3'}>\n <p className={`text-2xs font-medium ${\n step.status === 'running' ? 'text-text-primary'\n : step.status === 'completed' ? 'text-text-secondary'\n : step.status === 'failed' ? 'text-status-error'\n : 'text-text-tertiary'\n }`}>{step.title}</p>\n {step.toolName && (\n <span className=\"text-2xs text-text-tertiary font-mono\">{step.toolName}</span>\n )}\n {step.error && (\n <p className=\"text-2xs text-status-error mt-0.5\">{step.error}</p>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\ninterface WorkflowTestPanelProps {\n workflow: LTYamlWorkflowRecord;\n onClose: () => void;\n}\n\nexport function WorkflowTestPanel({ workflow, onClose }: WorkflowTestPanelProps) {\n const invokeMutation = useInvokeYamlWorkflow();\n const [jsonMode, setJsonMode] = useState(false);\n const [fields, setFields] = useState<Record<string, any>>({});\n const [argsJson, setArgsJson] = useState('');\n const [jsonError, setJsonError] = useState('');\n const [executeAs, setExecuteAs] = useState('');\n const [activeJobId, setActiveJobId] = useState<string | null>(null);\n const [completedResult, setCompletedResult] = useState<{ jobId: string } | null>(null);\n const { steps, isComplete } = useYamlActivityEvents(activeJobId);\n\n useEffect(() => {\n setActiveJobId(null);\n setCompletedResult(null);\n setJsonError('');\n invokeMutation.reset();\n const skeleton = buildSkeleton(workflow.input_schema);\n setFields(skeleton);\n setArgsJson(JSON.stringify(skeleton, null, 2));\n setJsonMode(false);\n }, [workflow.id]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n if (isComplete && activeJobId) {\n const jobId = activeJobId;\n const timer = setTimeout(() => {\n setCompletedResult({ jobId });\n setActiveJobId(null);\n }, 800);\n return () => clearTimeout(timer);\n }\n }, [isComplete, activeJobId]);\n\n const toggleMode = () => {\n if (!jsonMode) {\n setArgsJson(JSON.stringify(fields, null, 2));\n } else {\n try { setFields(JSON.parse(argsJson)); } catch { /* keep fields */ }\n }\n setJsonMode(!jsonMode);\n };\n\n const handleRun = async () => {\n setJsonError('');\n setCompletedResult(null);\n let parsed: Record<string, unknown>;\n if (jsonMode) {\n try { parsed = JSON.parse(argsJson); } catch { setJsonError('Invalid JSON'); return; }\n } else {\n parsed = { ...fields };\n }\n try {\n const result = await invokeMutation.mutateAsync({\n id: workflow.id,\n data: parsed,\n sync: false,\n ...(executeAs ? { execute_as: executeAs } : {}),\n });\n if (result.job_id) setActiveJobId(result.job_id);\n } catch { /* error shown in panel */ }\n };\n\n const isRunning = !!activeJobId;\n const ns = workflow.app_id || '';\n\n return (\n <div className=\"border-l border-surface-border bg-surface-raised flex flex-col h-full\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-surface-border shrink-0\">\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-text-primary truncate\">{workflow.app_id}</p>\n <code className=\"text-2xs font-mono text-accent truncate block\">{workflow.graph_topic}</code>\n </div>\n <button onClick={() => { if (!isRunning) onClose(); }} className=\"p-1 text-text-tertiary hover:text-text-primary shrink-0 ml-2\">\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Scrollable body */}\n <div className=\"flex-1 overflow-y-auto px-4 py-3 space-y-4\">\n {isRunning ? (\n <LiveTimeline steps={steps} manifest={workflow.activity_manifest} isComplete={isComplete} />\n ) : completedResult ? (\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-4 h-4 text-status-success\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 1a7 7 0 110 14A7 7 0 018 1zm3.36 4.65a.5.5 0 00-.72 0L7 9.29 5.36 7.65a.5.5 0 10-.72.7l2 2a.5.5 0 00.72 0l4-4a.5.5 0 000-.7z\" />\n </svg>\n <p className=\"text-xs font-medium text-status-success\">Workflow completed</p>\n </div>\n <div className=\"flex items-center justify-between\">\n <Link\n to={`/mcp/executions/${encodeURIComponent(completedResult.jobId)}?namespace=${encodeURIComponent(ns)}`}\n className=\"inline-flex items-center gap-1.5 text-xs text-accent hover:underline\"\n >\n <ExternalLink size={12} /> View execution\n </Link>\n <button\n onClick={() => setCompletedResult(null)}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <RotateCcw size={12} /> Run again\n </button>\n </div>\n </div>\n ) : (\n <>\n <RunAsSelector selected={executeAs} onChange={setExecuteAs} />\n\n {workflow.description && (\n <p className=\"text-2xs text-text-secondary leading-relaxed\">{workflow.description}</p>\n )}\n\n {/* Form / JSON toggle input */}\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <label className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary\">Input</label>\n <button onClick={toggleMode} className=\"text-2xs text-accent hover:underline\">\n {jsonMode ? 'Form view' : 'JSON view'}\n </button>\n </div>\n\n {jsonMode ? (\n <textarea\n value={argsJson}\n onChange={(e) => setArgsJson(e.target.value)}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-2xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary resize-y\"\n rows={6}\n spellCheck={false}\n />\n ) : (\n <div className=\"space-y-3 max-h-[300px] overflow-y-auto\">\n {Object.entries(fields).map(([key, value]) => (\n <div key={key}>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">{key}</label>\n {typeof value === 'boolean' ? (\n <select\n value={String(value)}\n onChange={(e) => setFields({ ...fields, [key]: e.target.value === 'true' })}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : typeof value === 'object' ? (\n <textarea\n value={JSON.stringify(value, null, 2)}\n onChange={(e) => { try { setFields({ ...fields, [key]: JSON.parse(e.target.value) }); } catch { /* invalid */ } }}\n className=\"w-full min-h-[60px] px-3 py-1.5 bg-surface-sunken border border-surface-border rounded-md font-mono text-xs text-text-primary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n />\n ) : (\n <input\n type={typeof value === 'number' ? 'number' : 'text'}\n value={String(value ?? '')}\n onChange={(e) => setFields({ ...fields, [key]: typeof value === 'number' ? Number(e.target.value) : e.target.value })}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n />\n )}\n </div>\n ))}\n {Object.keys(fields).length === 0 && (\n <p className=\"text-2xs text-text-tertiary italic\">No input fields defined</p>\n )}\n </div>\n )}\n {jsonError && <p className=\"text-2xs text-status-error mt-1\">{jsonError}</p>}\n </div>\n\n {invokeMutation.isError && (\n <div className=\"bg-status-error/10 border border-status-error/20 rounded-md px-3 py-2\">\n <p className=\"text-2xs text-status-error\">\n {invokeMutation.error instanceof Error ? invokeMutation.error.message : 'Invocation failed'}\n </p>\n </div>\n )}\n <button\n onClick={handleRun}\n disabled={invokeMutation.isPending}\n className=\"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5\"\n >\n {invokeMutation.isPending ? 'Starting...' : <><Play size={12} /> Run</>}\n </button>\n </>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { Search, GitBranch } from 'lucide-react';\nimport { ToolPill } from '../../components/common/display/ToolPill';\nimport { NamespacePill } from '../../components/common/display/NamespacePill';\nimport type { LTYamlWorkflowRecord } from '../../api/types';\n\nexport function GraphFlowSelector({\n flows,\n selectedId,\n onSelect,\n}: {\n flows: LTYamlWorkflowRecord[];\n selectedId: string;\n onSelect: (flow: LTYamlWorkflowRecord) => void;\n}) {\n const [search, setSearch] = useState('');\n\n const filtered = useMemo(() => {\n if (!search.trim()) return flows;\n const q = search.toLowerCase();\n return flows.filter(\n (f) =>\n f.graph_topic.toLowerCase().includes(q) ||\n f.description?.toLowerCase().includes(q) ||\n f.app_id?.toLowerCase().includes(q),\n );\n }, [flows, search]);\n\n return (\n <div>\n {/* Sticky header: search pill + section label — single block, no gap */}\n <div className=\"sticky top-0 z-20 bg-surface pt-4\">\n <div className=\"bg-surface-sunken rounded-lg px-4 py-2 mb-3\">\n <div className=\"relative w-1/2\">\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 w-3 h-3 text-text-quaternary pointer-events-none\" />\n <input\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={`Search ${flows.length} flows…`}\n className=\"input pl-8\"\n />\n </div>\n </div>\n <div className=\"flex items-center gap-2 py-2 border-b border-surface-border\">\n <GitBranch className=\"w-3 h-3 text-accent\" strokeWidth={1.5} />\n <h2 className=\"section-h2\">Graph Flows</h2>\n <span className=\"text-xs text-text-quaternary\">{filtered.length}</span>\n </div>\n </div>\n\n {/* List */}\n {filtered.length === 0 ? (\n <p className=\"text-sm text-text-tertiary py-8 text-center\">No flows match your search.</p>\n ) : (\n <div className=\"divide-y divide-surface-border/30\">\n {filtered.map((flow) => {\n const isSelected = selectedId === flow.id;\n return (\n <button\n key={flow.id}\n onClick={() => onSelect(flow)}\n className=\"group relative w-full text-left py-2 px-3 -mx-3 rounded-md transition-colors duration-150\"\n >\n {isSelected && (\n <span className=\"absolute left-0 top-1 bottom-1 w-0.5 bg-accent rounded-full\" />\n )}\n <div className=\"flex items-center gap-3\">\n <ToolPill name={flow.graph_topic} size=\"md\" />\n {flow.description && (\n <p className=\"flex-1 min-w-0 truncate text-2xs text-text-tertiary group-hover:text-text-secondary transition-colors\">\n {flow.description}\n </p>\n )}\n <span className=\"ml-auto shrink-0\">\n <NamespacePill namespace={flow.app_id} />\n </span>\n </div>\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","import { useEffect } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { Play } from 'lucide-react';\nimport { useYamlWorkflows } from '../../api/yaml-workflows';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { WorkflowTestPanel } from '../../components/common/test/WorkflowTestPanel';\nimport { GraphFlowSelector } from './GraphFlowSelector';\n\nexport function GraphInvokePage() {\n const [searchParams, setSearchParams] = useSearchParams();\n const selectedId = searchParams.get('id') ?? '';\n\n const { data, isLoading } = useYamlWorkflows({ status: 'active' as any, limit: 200, offset: 0 });\n const flows = data?.workflows ?? [];\n const selected = flows.find((f) => f.id === selectedId) ?? null;\n\n // Auto-select when there's exactly one flow\n useEffect(() => {\n if (flows.length === 1 && !searchParams.get('id')) {\n setSearchParams({ id: flows[0].id }, { replace: true });\n }\n }, [flows.length]); // eslint-disable-line react-hooks/exhaustive-deps\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-48\" />\n <div className=\"h-40 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n return (\n <div>\n <PageHeader title=\"Invoke\" docsHash=\"#docs:dashboard.md:graph-workflows\" />\n\n {flows.length === 0 ? (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-primary mb-1\">No active graph flows</p>\n <p className=\"text-xs text-text-tertiary\">\n Register graph flows at startup with the graphWorkflows config, or deploy one from Configure.\n </p>\n </div>\n ) : (\n <div className=\"grid grid-cols-3 gap-8 items-start\">\n <div className=\"col-span-2\">\n <GraphFlowSelector\n flows={flows}\n selectedId={selectedId}\n onSelect={(f) => setSearchParams({ id: f.id }, { replace: true })}\n />\n </div>\n\n <div className=\"sticky top-4 transition-all duration-200 ease-out\">\n {selected ? (\n <WorkflowTestPanel\n workflow={selected}\n onClose={() => setSearchParams({}, { replace: true })}\n />\n ) : (\n <div className=\"flex flex-col items-center justify-center py-24 text-center\">\n <Play className=\"w-6 h-6 text-text-quaternary mb-3\" strokeWidth={1} />\n <p className=\"text-sm text-text-tertiary\">Select a flow</p>\n <p className=\"text-xs text-text-quaternary mt-1\">Choose one from the list to run it.</p>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"names":["TOOL_SOURCE_COLORS","LiveTimeline","steps","manifest","isComplete","workerActivities","a","totalSteps","merged","live","s","source","colors","jsx","step","idx","isLast","jsxs","WorkflowTestPanel","workflow","onClose","invokeMutation","useInvokeYamlWorkflow","jsonMode","setJsonMode","useState","fields","setFields","argsJson","setArgsJson","jsonError","setJsonError","executeAs","setExecuteAs","activeJobId","setActiveJobId","completedResult","setCompletedResult","useYamlActivityEvents","useEffect","skeleton","buildSkeleton","jobId","timer","toggleMode","handleRun","parsed","result","isRunning","ns","X","Link","ExternalLink","RotateCcw","Fragment","RunAsSelector","e","key","value","Play","GraphFlowSelector","flows","selectedId","onSelect","search","setSearch","filtered","useMemo","q","f","_a","_b","Search","GitBranch","flow","isSelected","ToolPill","NamespacePill","GraphInvokePage","searchParams","setSearchParams","useSearchParams","data","isLoading","useYamlWorkflows","selected","PageHeader"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GraphInvokePage-CR0MtYv8.js","sources":["../../src/components/common/test/WorkflowTestPanel.tsx","../../src/pages/workflows/GraphFlowSelector.tsx","../../src/pages/workflows/GraphInvokePage.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport { Link } from 'react-router-dom';\nimport { X, Play, RotateCcw, ExternalLink } from 'lucide-react';\nimport { useInvokeYamlWorkflow } from '../../../api/yaml-workflows';\nimport { useYamlActivityEvents, type ActivityStep } from '../../../hooks/useYamlActivityEvents';\nimport { RunAsSelector } from '../form/RunAsSelector';\nimport type { LTYamlWorkflowRecord, ActivityManifestEntry } from '../../../api/types';\nimport { buildSkeleton } from '../../../pages/mcp/mcp-query-detail/helpers';\n\nconst TOOL_SOURCE_COLORS: Record<string, { border: string; text: string; icon: string }> = {\n mcp: { border: 'border-status-active', text: 'text-status-active', icon: 'MCP' },\n db: { border: 'border-status-active', text: 'text-status-active', icon: 'DB' },\n llm: { border: 'border-accent', text: 'text-accent', icon: 'LLM' },\n transform: { border: 'border-status-success', text: 'text-status-success', icon: 'Map' },\n};\n\nfunction LiveTimeline({ steps, manifest, isComplete }: {\n steps: ActivityStep[];\n manifest: ActivityManifestEntry[];\n isComplete: boolean;\n}) {\n const workerActivities = manifest.filter((a) => a.type === 'worker');\n const totalSteps = workerActivities.length;\n\n const merged = workerActivities.map((a) => {\n const live = steps.find((s) => s.activityId === a.activity_id);\n const source = a.tool_source || 'mcp';\n const colors = TOOL_SOURCE_COLORS[source] || TOOL_SOURCE_COLORS.mcp;\n return {\n activityId: a.activity_id,\n title: a.title || a.mcp_tool_name || a.activity_id,\n toolName: a.mcp_tool_name,\n colors,\n status: live?.status || 'pending' as const,\n error: live?.error,\n };\n });\n\n return (\n <div>\n <p className=\"text-2xs text-text-secondary mb-3\">\n {isComplete\n ? `All ${totalSteps} steps completed`\n : `Running step ${merged.filter((s) => s.status === 'completed').length + 1} of ${totalSteps}...`}\n </p>\n <div className=\"space-y-0\">\n {merged.map((step, idx) => {\n const isLast = idx === merged.length - 1;\n return (\n <div key={step.activityId} className=\"flex items-stretch gap-2\">\n <div className=\"flex flex-col items-center w-4 shrink-0\">\n <span className={`w-2.5 h-2.5 rounded-full shrink-0 border-2 transition-colors ${\n step.status === 'completed' ? 'bg-status-success border-status-success'\n : step.status === 'running' ? `${step.colors.border} bg-transparent animate-pulse`\n : step.status === 'failed' ? 'bg-status-error border-status-error'\n : 'bg-surface-sunken border-surface-border'\n }`} />\n {!isLast && (\n <span className={`w-px flex-1 transition-colors ${\n step.status === 'completed' ? 'bg-status-success/30' : 'bg-surface-border'\n }`} />\n )}\n </div>\n <div className={isLast ? '' : 'pb-3'}>\n <p className={`text-2xs font-medium ${\n step.status === 'running' ? 'text-text-primary'\n : step.status === 'completed' ? 'text-text-secondary'\n : step.status === 'failed' ? 'text-status-error'\n : 'text-text-tertiary'\n }`}>{step.title}</p>\n {step.toolName && (\n <span className=\"text-2xs text-text-tertiary font-mono\">{step.toolName}</span>\n )}\n {step.error && (\n <p className=\"text-2xs text-status-error mt-0.5\">{step.error}</p>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\ninterface WorkflowTestPanelProps {\n workflow: LTYamlWorkflowRecord;\n onClose: () => void;\n}\n\nexport function WorkflowTestPanel({ workflow, onClose }: WorkflowTestPanelProps) {\n const invokeMutation = useInvokeYamlWorkflow();\n const [jsonMode, setJsonMode] = useState(false);\n const [fields, setFields] = useState<Record<string, any>>({});\n const [argsJson, setArgsJson] = useState('');\n const [jsonError, setJsonError] = useState('');\n const [executeAs, setExecuteAs] = useState('');\n const [activeJobId, setActiveJobId] = useState<string | null>(null);\n const [completedResult, setCompletedResult] = useState<{ jobId: string } | null>(null);\n const { steps, isComplete } = useYamlActivityEvents(activeJobId);\n\n useEffect(() => {\n setActiveJobId(null);\n setCompletedResult(null);\n setJsonError('');\n invokeMutation.reset();\n const skeleton = buildSkeleton(workflow.input_schema);\n setFields(skeleton);\n setArgsJson(JSON.stringify(skeleton, null, 2));\n setJsonMode(false);\n }, [workflow.id]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n if (isComplete && activeJobId) {\n const jobId = activeJobId;\n const timer = setTimeout(() => {\n setCompletedResult({ jobId });\n setActiveJobId(null);\n }, 800);\n return () => clearTimeout(timer);\n }\n }, [isComplete, activeJobId]);\n\n const toggleMode = () => {\n if (!jsonMode) {\n setArgsJson(JSON.stringify(fields, null, 2));\n } else {\n try { setFields(JSON.parse(argsJson)); } catch { /* keep fields */ }\n }\n setJsonMode(!jsonMode);\n };\n\n const handleRun = async () => {\n setJsonError('');\n setCompletedResult(null);\n let parsed: Record<string, unknown>;\n if (jsonMode) {\n try { parsed = JSON.parse(argsJson); } catch { setJsonError('Invalid JSON'); return; }\n } else {\n parsed = { ...fields };\n }\n try {\n const result = await invokeMutation.mutateAsync({\n id: workflow.id,\n data: parsed,\n sync: false,\n ...(executeAs ? { execute_as: executeAs } : {}),\n });\n if (result.job_id) setActiveJobId(result.job_id);\n } catch { /* error shown in panel */ }\n };\n\n const isRunning = !!activeJobId;\n const ns = workflow.app_id || '';\n\n return (\n <div className=\"border-l border-surface-border bg-surface-raised flex flex-col h-full\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-surface-border shrink-0\">\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-text-primary truncate\">{workflow.app_id}</p>\n <code className=\"text-2xs font-mono text-accent truncate block\">{workflow.graph_topic}</code>\n </div>\n <button onClick={() => { if (!isRunning) onClose(); }} className=\"p-1 text-text-tertiary hover:text-text-primary shrink-0 ml-2\">\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Scrollable body */}\n <div className=\"flex-1 overflow-y-auto px-4 py-3 space-y-4\">\n {isRunning ? (\n <LiveTimeline steps={steps} manifest={workflow.activity_manifest} isComplete={isComplete} />\n ) : completedResult ? (\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-4 h-4 text-status-success\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 1a7 7 0 110 14A7 7 0 018 1zm3.36 4.65a.5.5 0 00-.72 0L7 9.29 5.36 7.65a.5.5 0 10-.72.7l2 2a.5.5 0 00.72 0l4-4a.5.5 0 000-.7z\" />\n </svg>\n <p className=\"text-xs font-medium text-status-success\">Workflow completed</p>\n </div>\n <div className=\"flex items-center justify-between\">\n <Link\n to={`/mcp/executions/${encodeURIComponent(completedResult.jobId)}?namespace=${encodeURIComponent(ns)}`}\n className=\"inline-flex items-center gap-1.5 text-xs text-accent hover:underline\"\n >\n <ExternalLink size={12} /> View execution\n </Link>\n <button\n onClick={() => setCompletedResult(null)}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <RotateCcw size={12} /> Run again\n </button>\n </div>\n </div>\n ) : (\n <>\n <RunAsSelector selected={executeAs} onChange={setExecuteAs} />\n\n {workflow.description && (\n <p className=\"text-2xs text-text-secondary leading-relaxed\">{workflow.description}</p>\n )}\n\n {/* Form / JSON toggle input */}\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <label className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary\">Input</label>\n <button onClick={toggleMode} className=\"text-2xs text-accent hover:underline\">\n {jsonMode ? 'Form view' : 'JSON view'}\n </button>\n </div>\n\n {jsonMode ? (\n <textarea\n value={argsJson}\n onChange={(e) => setArgsJson(e.target.value)}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-2xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary resize-y\"\n rows={6}\n spellCheck={false}\n />\n ) : (\n <div className=\"space-y-3 max-h-[300px] overflow-y-auto\">\n {Object.entries(fields).map(([key, value]) => (\n <div key={key}>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">{key}</label>\n {typeof value === 'boolean' ? (\n <select\n value={String(value)}\n onChange={(e) => setFields({ ...fields, [key]: e.target.value === 'true' })}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : typeof value === 'object' ? (\n <textarea\n value={JSON.stringify(value, null, 2)}\n onChange={(e) => { try { setFields({ ...fields, [key]: JSON.parse(e.target.value) }); } catch { /* invalid */ } }}\n className=\"w-full min-h-[60px] px-3 py-1.5 bg-surface-sunken border border-surface-border rounded-md font-mono text-xs text-text-primary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n />\n ) : (\n <input\n type={typeof value === 'number' ? 'number' : 'text'}\n value={String(value ?? '')}\n onChange={(e) => setFields({ ...fields, [key]: typeof value === 'number' ? Number(e.target.value) : e.target.value })}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n />\n )}\n </div>\n ))}\n {Object.keys(fields).length === 0 && (\n <p className=\"text-2xs text-text-tertiary italic\">No input fields defined</p>\n )}\n </div>\n )}\n {jsonError && <p className=\"text-2xs text-status-error mt-1\">{jsonError}</p>}\n </div>\n\n {invokeMutation.isError && (\n <div className=\"bg-status-error/10 border border-status-error/20 rounded-md px-3 py-2\">\n <p className=\"text-2xs text-status-error\">\n {invokeMutation.error instanceof Error ? invokeMutation.error.message : 'Invocation failed'}\n </p>\n </div>\n )}\n <button\n onClick={handleRun}\n disabled={invokeMutation.isPending}\n className=\"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5\"\n >\n {invokeMutation.isPending ? 'Starting...' : <><Play size={12} /> Run</>}\n </button>\n </>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { Search, GitBranch } from 'lucide-react';\nimport { ToolPill } from '../../components/common/display/ToolPill';\nimport { NamespacePill } from '../../components/common/display/NamespacePill';\nimport type { LTYamlWorkflowRecord } from '../../api/types';\n\nexport function GraphFlowSelector({\n flows,\n selectedId,\n onSelect,\n}: {\n flows: LTYamlWorkflowRecord[];\n selectedId: string;\n onSelect: (flow: LTYamlWorkflowRecord) => void;\n}) {\n const [search, setSearch] = useState('');\n\n const filtered = useMemo(() => {\n if (!search.trim()) return flows;\n const q = search.toLowerCase();\n return flows.filter(\n (f) =>\n f.graph_topic.toLowerCase().includes(q) ||\n f.description?.toLowerCase().includes(q) ||\n f.app_id?.toLowerCase().includes(q),\n );\n }, [flows, search]);\n\n return (\n <div>\n {/* Sticky header: search pill + section label — single block, no gap */}\n <div className=\"sticky top-0 z-20 bg-surface pt-4\">\n <div className=\"bg-surface-sunken rounded-lg px-4 py-2 mb-3\">\n <div className=\"relative w-1/2\">\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 w-3 h-3 text-text-quaternary pointer-events-none\" />\n <input\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={`Search ${flows.length} flows…`}\n className=\"input pl-8\"\n />\n </div>\n </div>\n <div className=\"flex items-center gap-2 py-2 border-b border-surface-border\">\n <GitBranch className=\"w-3 h-3 text-accent\" strokeWidth={1.5} />\n <h2 className=\"section-h2\">Graph Flows</h2>\n <span className=\"text-xs text-text-quaternary\">{filtered.length}</span>\n </div>\n </div>\n\n {/* List */}\n {filtered.length === 0 ? (\n <p className=\"text-sm text-text-tertiary py-8 text-center\">No flows match your search.</p>\n ) : (\n <div className=\"divide-y divide-surface-border/30\">\n {filtered.map((flow) => {\n const isSelected = selectedId === flow.id;\n return (\n <button\n key={flow.id}\n onClick={() => onSelect(flow)}\n className=\"group relative w-full text-left py-2 px-3 -mx-3 rounded-md transition-colors duration-150\"\n >\n {isSelected && (\n <span className=\"absolute left-0 top-1 bottom-1 w-0.5 bg-accent rounded-full\" />\n )}\n <div className=\"flex items-center gap-3\">\n <ToolPill name={flow.graph_topic} size=\"md\" />\n {flow.description && (\n <p className=\"flex-1 min-w-0 truncate text-2xs text-text-tertiary group-hover:text-text-secondary transition-colors\">\n {flow.description}\n </p>\n )}\n <span className=\"ml-auto shrink-0\">\n <NamespacePill namespace={flow.app_id} />\n </span>\n </div>\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","import { useEffect } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { Play } from 'lucide-react';\nimport { useYamlWorkflows } from '../../api/yaml-workflows';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { WorkflowTestPanel } from '../../components/common/test/WorkflowTestPanel';\nimport { GraphFlowSelector } from './GraphFlowSelector';\n\nexport function GraphInvokePage() {\n const [searchParams, setSearchParams] = useSearchParams();\n const selectedId = searchParams.get('id') ?? '';\n\n const { data, isLoading } = useYamlWorkflows({ status: 'active' as any, limit: 200, offset: 0 });\n const flows = data?.workflows ?? [];\n const selected = flows.find((f) => f.id === selectedId) ?? null;\n\n // Auto-select when there's exactly one flow\n useEffect(() => {\n if (flows.length === 1 && !searchParams.get('id')) {\n setSearchParams({ id: flows[0].id }, { replace: true });\n }\n }, [flows.length]); // eslint-disable-line react-hooks/exhaustive-deps\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-48\" />\n <div className=\"h-40 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n return (\n <div>\n <PageHeader title=\"Invoke\" docsHash=\"#docs:dashboard.md:graph-workflows\" />\n\n {flows.length === 0 ? (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-primary mb-1\">No active graph flows</p>\n <p className=\"text-xs text-text-tertiary\">\n Register graph flows at startup with the graphWorkflows config, or deploy one from Configure.\n </p>\n </div>\n ) : (\n <div className=\"grid grid-cols-3 gap-8 items-start\">\n <div className=\"col-span-2\">\n <GraphFlowSelector\n flows={flows}\n selectedId={selectedId}\n onSelect={(f) => setSearchParams({ id: f.id }, { replace: true })}\n />\n </div>\n\n <div className=\"sticky top-4 transition-all duration-200 ease-out\">\n {selected ? (\n <WorkflowTestPanel\n workflow={selected}\n onClose={() => setSearchParams({}, { replace: true })}\n />\n ) : (\n <div className=\"flex flex-col items-center justify-center py-24 text-center\">\n <Play className=\"w-6 h-6 text-text-quaternary mb-3\" strokeWidth={1} />\n <p className=\"text-sm text-text-tertiary\">Select a flow</p>\n <p className=\"text-xs text-text-quaternary mt-1\">Choose one from the list to run it.</p>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"names":["TOOL_SOURCE_COLORS","LiveTimeline","steps","manifest","isComplete","workerActivities","a","totalSteps","merged","live","s","source","colors","jsx","step","idx","isLast","jsxs","WorkflowTestPanel","workflow","onClose","invokeMutation","useInvokeYamlWorkflow","jsonMode","setJsonMode","useState","fields","setFields","argsJson","setArgsJson","jsonError","setJsonError","executeAs","setExecuteAs","activeJobId","setActiveJobId","completedResult","setCompletedResult","useYamlActivityEvents","useEffect","skeleton","buildSkeleton","jobId","timer","toggleMode","handleRun","parsed","result","isRunning","ns","X","Link","ExternalLink","RotateCcw","Fragment","RunAsSelector","e","key","value","Play","GraphFlowSelector","flows","selectedId","onSelect","search","setSearch","filtered","useMemo","q","f","_a","_b","Search","GitBranch","flow","isSelected","ToolPill","NamespacePill","GraphInvokePage","searchParams","setSearchParams","useSearchParams","data","isLoading","useYamlWorkflows","selected","PageHeader"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as x,j as e}from"./vendor-query-DvWWuNIB.js";import{$ as z,j as Ne,a9 as pe,b0 as we,bJ as ke,bB as he,Z as fe,O as _e,bK as Ce,t as Pe,l as Ee,bC as Re,w as Se,ay as qe,bb as Fe,bm as Me,g as O}from"./index-CeCtqujG.js";import{u as $e}from"./pipelines-Cu3PARum.js";import{u as Te}from"./controlplane-D1TGcYsS.js";import{R as Ae}from"./RolePill-Di2CAHuD.js";import{W as U}from"./WorkflowPill-Dg7BDTyM.js";import{L as P}from"./ListToolbar-gA5rFzkz.js";import{j as Ie,b as We,P as Qe}from"./OperationsPage-CvR74ZUJ.js";import{i as Be}from"./task-queues-7-sHKPsN.js";import{bV as Le,aA as f,an as De,a1 as Oe,aN as re,I as j,l as le,W as ce}from"./vendor-icons-CeVtUKyP.js";import{u as B,f as Ue}from"./vendor-react-_9U4mKFr.js";import"./EntityTimelinePanel-CDFFfX9d.js";import"./PageHeader-CMd3f4bz.js";import"./useContainerWidth-DSLp1gEm.js";function ze(){const{user:s}=z();return x.useMemo(()=>{const n=((s==null?void 0:s.roles)??[]).map(t=>t.role).filter(t=>!Be(t));return Array.from(new Set(n)).sort((t,i)=>t.localeCompare(i))},[s])}function He(){const{user:s}=z(),n=s==null?void 0:s.userId,t=Ne("SUMMARY"),{data:i}=pe({assigned_to:n,status:"pending",limit:1});return we(ke(),()=>{n&&t([["escalations"]])}),(i==null?void 0:i.total)??0}function D({n:s,label:n,tone:t}){return e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:`text-2xl font-light tabular-nums leading-none ${t==="muted"?"text-text-tertiary":"text-text-primary"}`,children:s}),e.jsx("div",{className:"text-2xs uppercase tracking-wider text-text-quaternary mt-1 truncate",children:n})]})}function Ve({role:s,title:n,metric:t,priorityFacet:i,periodLabel:l}){const d=B(),r=(t==null?void 0:t.pending)??0,u=(t==null?void 0:t.claimed)??0,g=(t==null?void 0:t.resolved)??0,m=(t==null?void 0:t.priority_count)??0;return e.jsxs("div",{role:"button",tabIndex:0,onClick:()=>d(`/escalations/available?role=${encodeURIComponent(s)}`),onKeyDown:p=>{(p.key==="Enter"||p.key===" ")&&(p.preventDefault(),d(`/escalations/available?role=${encodeURIComponent(s)}`))},className:"group h-full border-l-2 border-accent/30 bg-surface-sunken/40 rounded-[0.125em] px-4 py-3.5 cursor-pointer transition-colors hover:bg-surface-sunken/70 focus:outline-none focus-visible:ring-1 focus-visible:ring-accent/40",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2 mb-3",children:[e.jsx("span",{className:"text-2xs font-semibold uppercase tracking-wider text-text-secondary truncate",children:n||s}),e.jsx(f,{className:"w-3 h-3 shrink-0 text-text-quaternary opacity-0 group-hover:opacity-100 transition-opacity",strokeWidth:1.5})]}),e.jsxs("div",{className:"flex items-baseline gap-5",children:[e.jsx(D,{n:r,label:"pending"}),e.jsx(D,{n:u,label:"claimed"}),e.jsx(D,{n:g,label:`resolved · ${l}`,tone:"muted"})]}),e.jsx("div",{className:"mt-3 h-6 flex items-center",children:m>0?e.jsxs("button",{type:"button",onClick:p=>{p.stopPropagation(),d(Ie({role:s,priority_facet:i}))},className:"inline-flex items-center gap-1.5 pl-1.5 pr-2.5 py-1 rounded-full text-2xs font-semibold tabular-nums bg-status-error text-text-inverse transition-transform hover:scale-[1.05]",title:"Past the priority threshold — a hard limit; open oldest first",children:[e.jsx(De,{className:"w-3 h-3",strokeWidth:2.5}),m," in jeopardy"]}):e.jsx("span",{className:"text-2xs text-text-quaternary",children:"on pace"})})]})}function de({count:s}){const n=B();return e.jsxs("div",{role:"button",tabIndex:0,onClick:()=>n("/escalations/queue"),onKeyDown:t=>{(t.key==="Enter"||t.key===" ")&&(t.preventDefault(),n("/escalations/queue"))},className:"group h-full border-l-2 border-status-warning/70 bg-status-warning/[0.06] rounded-[0.125em] px-4 py-3.5 cursor-pointer transition-colors hover:bg-status-warning/[0.1] focus:outline-none focus-visible:ring-1 focus-visible:ring-status-warning/40",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2 mb-3",children:[e.jsxs("span",{className:"flex items-center gap-1.5 text-2xs font-semibold uppercase tracking-wider text-status-warning",children:[e.jsx(Le,{className:"w-3 h-3",strokeWidth:2}),"Claimed"]}),e.jsx(f,{className:"w-3 h-3 shrink-0 text-text-quaternary opacity-0 group-hover:opacity-100 transition-opacity",strokeWidth:1.5})]}),e.jsx("div",{className:"text-2xl font-light tabular-nums leading-none text-text-primary",children:s}),e.jsx("div",{className:"text-2xs uppercase tracking-wider text-text-quaternary mt-1",children:"assigned to you"}),e.jsx("div",{className:"mt-3 h-6 flex items-center",children:e.jsx("span",{className:"text-2xs font-medium text-status-warning",children:s>0?"Finish these first →":"Nothing claimed"})})]})}const Ke=["15m","1h","24h","7d"];function Je({maxRows:s}){const[n,t]=x.useState("24h"),i=ze(),l=He(),d=he(n),r=fe(),u=x.useMemo(()=>{var o;return new Map((((o=d.data)==null?void 0:o.stations)??[]).map(c=>[c.role,c]))},[d.data]),g=x.useMemo(()=>{var o;return new Map((((o=r.data)==null?void 0:o.roles)??[]).map(c=>[c.role,c]))},[r.data]),m=x.useMemo(()=>[...i].sort((o,c)=>{var v,M;const y=((v=u.get(o))==null?void 0:v.priority_count)??0,S=((M=u.get(c))==null?void 0:M.priority_count)??0;return S!==y?S-y:o.localeCompare(c)}),[i,u]),F=s*4-1,R=m.slice(0,F),b=m.length-R.length;return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-4 pb-2 border-b border-surface-border",children:[e.jsxs("h2",{className:"flex items-center gap-2 text-sm font-medium text-text-primary",children:[e.jsx(Oe,{className:"w-4 h-4 text-accent",strokeWidth:1.5}),"Task Queues"]}),e.jsx("div",{className:"flex items-center gap-0.5",children:Ke.map(o=>e.jsx("button",{onClick:()=>t(o),className:`px-2.5 py-1 text-2xs font-mono rounded transition-colors ${n===o?"bg-accent/10 text-accent font-semibold":"text-text-quaternary hover:text-text-secondary"}`,children:o},o))})]}),i.length===0?e.jsxs("div",{className:"grid grid-cols-1 @grp-cols:grid-cols-2 @wall:grid-cols-4 gap-4",children:[e.jsx(de,{count:l}),e.jsx("div",{className:"lg:col-span-3 flex items-center px-4 py-3.5 text-sm text-text-tertiary",children:"You are not a member of a role. Task queues appear here once you join one."})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-1 @grp-cols:grid-cols-2 @wall:grid-cols-4 gap-4 auto-rows-fr",children:[e.jsx(de,{count:l}),R.map(o=>{var c,y;return e.jsx(Ve,{role:o,title:((c=g.get(o))==null?void 0:c.title)??null,metric:u.get(o),priorityFacet:((y=g.get(o))==null?void 0:y.priority_facet)??null,periodLabel:n},o)})]}),b>0&&e.jsxs("p",{className:"mt-3 text-2xs text-text-quaternary",children:["+",b," more ",b===1?"lane":"lanes"," in the Task Queues sidebar."]})]})]})}const Ye={completed:"bg-status-success",active:"bg-status-active",running:"bg-status-active",pending:"bg-status-pending",error:"bg-status-error",failed:"bg-status-error"};function xe(s){return Ye[s]??"bg-text-tertiary"}function k({icon:s,text:n}){return e.jsxs("div",{className:"flex flex-col items-center justify-center py-10 text-center",children:[e.jsx(s,{className:"w-6 h-6 text-text-quaternary/50 mb-2",strokeWidth:1}),e.jsx("p",{className:"text-xs text-text-quaternary",children:n})]})}function Ge(s,n=37){if(!s||s.length<=n)return s;const t=Math.floor((n-3)/2);return`${s.slice(0,t)}...${s.slice(-t)}`}function ue({dot:s,pill:n,id:t,date:i,onClick:l}){return e.jsxs("button",{onClick:l,className:"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-0.5",children:[e.jsx("span",{className:`w-2.5 h-2.5 rounded-full dot-ring shrink-0 ${s}`}),e.jsx("span",{className:"text-xs text-text-primary font-mono truncate flex-1 min-w-0",children:Ge(t)}),e.jsx("span",{className:"hidden @dict-inline:inline text-2xs text-text-quaternary shrink-0 whitespace-nowrap",children:e.jsx(O,{date:i})})]}),e.jsxs("div",{className:"pl-3.5 flex items-center gap-1 overflow-hidden",children:[n,e.jsx("span",{className:"flex-1 min-w-0"}),e.jsx("span",{className:"@dict-inline:hidden text-2xs text-text-quaternary shrink-0 whitespace-nowrap",children:e.jsx(O,{date:i})})]})]})}function Q({esc:s,onClick:n}){const t=e.jsx(O,{date:s.updated_at??s.created_at});return e.jsxs("button",{onClick:n,className:"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-0.5",children:[e.jsxs("span",{className:"text-2xs text-text-quaternary font-medium shrink-0",children:["P",s.priority??2]}),e.jsx("span",{className:"text-xs text-text-primary truncate flex-1 min-w-0",children:s.description||s.subtype||s.type}),e.jsx("span",{className:"hidden @dict-inline:inline text-2xs text-text-quaternary shrink-0",children:t})]}),e.jsxs("div",{className:"flex items-center gap-2 pl-5 overflow-hidden",children:[e.jsx("span",{className:"hidden @dict-inline:inline-flex min-w-0",children:e.jsx(U,{type:s.type||"unknown",size:"xs"})}),e.jsx("span",{className:"flex-1 min-w-0"}),e.jsx(Ae,{role:s.role}),e.jsx("span",{className:"@dict-inline:hidden text-2xs text-text-quaternary shrink-0",children:t})]})]})}function _({to:s,icon:n,title:t}){const i=B();return e.jsx("button",{onClick:()=>i(s),className:"text-text-quaternary hover:text-accent transition-colors",title:t,children:e.jsx(n,{className:"w-2.5 h-2.5",strokeWidth:1.5})})}function me({appIds:s,selected:n,onSelect:t}){const[i,l]=x.useState(!1),d=x.useRef(null);return x.useEffect(()=>{if(!i)return;const r=u=>{d.current&&!d.current.contains(u.target)&&l(!1)};return document.addEventListener("mousedown",r),()=>document.removeEventListener("mousedown",r)},[i]),s.length<=1?null:e.jsxs("div",{className:"relative mb-3 -mt-2",ref:d,children:[e.jsxs("button",{onClick:()=>l(r=>!r),className:"flex items-center gap-1 px-2 py-0.5 text-2xs rounded bg-accent/10 text-accent hover:bg-accent/20 transition-colors",children:[n,e.jsx("svg",{className:`w-2.5 h-2.5 transition-transform ${i?"rotate-180":""}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"})})]}),i&&e.jsx("div",{className:"absolute top-full left-0 mt-1 bg-surface-raised border border-surface-border rounded-md shadow-lg z-[100] py-1 min-w-[120px]",children:s.map(r=>e.jsx("button",{onClick:()=>{t(r),l(!1)},className:`w-full text-left px-3 py-1.5 text-2xs transition-colors ${n===r?"text-accent bg-accent/5":"text-text-secondary hover:bg-surface-hover"}`,children:r},r))})]})}function E({icon:s,title:n,count:t,actions:i,children:l}){return e.jsxs("div",{className:"flex-1 min-w-0 min-h-0 flex flex-col",children:[e.jsxs("div",{className:"flex items-center justify-between pt-4 pb-2 px-5 shrink-0 border-b border-surface-border",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(s,{className:"w-3.5 h-3.5 text-accent/60",strokeWidth:1.5}),e.jsx("h2",{className:"section-h2",children:n}),t!==void 0&&t>0&&e.jsx("span",{className:"px-1.5 py-0.5 rounded-full bg-accent/10 text-accent text-2xs font-semibold tabular-nums",children:Me(t)})]}),i&&e.jsx("div",{className:"flex items-center gap-2",children:i})]}),e.jsx("div",{className:"flex-1 min-h-0 overflow-y-auto py-2 px-5 @container",children:l})]})}function us(){var Y,G,X,Z,ee,se,te,ae;const s=B(),{user:n}=z(),{isBuilder:t}=_e(),i=Ce(),[l,d]=Ue(),{data:r}=Te({enabled:t}),u=x.useMemo(()=>((r==null?void 0:r.apps)??[]).map(a=>a.appId).sort(),[r]),g=u[0]??"",m=l.get("pipelinenamespace")||g,p=l.get("durablenamespace")||g,F=x.useCallback((a,I)=>{d(W=>{const C=new URLSearchParams(W);return C.set(a,I),C},{replace:!1})},[d]);Pe(),Ee(),Re();const R=!i.showTaskQueueCards,b=i.canSeeWorkflows&&!i.canSeePaceBoard,o=fe({enabled:i.canSeePaceBoard}),{values:c}=Se(),y=x.useMemo(()=>Object.keys(c).length?c:void 0,[c]),S=he("1h",y,{enabled:i.canSeePaceBoard}),v=qe({limit:5,sort_by:"updated_at",order:"desc",namespace:p},{enabled:b}),M=u,je=u,$=$e({limit:5,app_id:m,sort_by:"updated_at",order:"desc"},{enabled:b}),N=Fe({limit:5,sort_by:"created_at",order:"desc",enabled:R}),w=pe({assigned_to:n==null?void 0:n.userId,status:"pending",limit:5,sort_by:"created_at",order:"desc",enabled:R});x.useEffect(()=>{const a=setTimeout(()=>{w.refetch(),N.refetch()},2e3);return()=>clearTimeout(a)},[]);const q=x.useMemo(()=>{var ne,ie,oe;const a=((ne=o.data)==null?void 0:ne.roles)??[],I=We(a),W=(ie=a.find(h=>h.ops_home_default))==null?void 0:ie.role,C=W&&I.find(h=>h.stations.some(L=>L.role.role===W))||I[0],ye=(C==null?void 0:C.stations)??[],ve=((oe=S.data)==null?void 0:oe.stations)??[];return ye.map(({role:h})=>({role:h.role,title:h.title,parent_role:h.parent_role,target_per_hour:h.target_per_hour??null,upstream_roles:h.upstream_roles??[],metric:ve.find(L=>L.role===h.role)}))},[o.data,S.data]),H=((Y=v.data)==null?void 0:Y.jobs)??[],ge=(G=v.data)==null?void 0:G.total,V=((X=$.data)==null?void 0:X.jobs)??[],be=(Z=$.data)==null?void 0:Z.total,T=((ee=N.data)==null?void 0:ee.escalations)??[],K=(se=N.data)==null?void 0:se.total,A=((te=w.data)==null?void 0:te.escalations)??[],J=(ae=w.data)==null?void 0:ae.total;return i.showTaskQueueCards?e.jsxs("div",{children:[e.jsx("h1",{className:"heading-1 mb-6",children:"Console"}),e.jsx(Je,{maxRows:2})]}):i.canSeePaceBoard?e.jsxs("div",{className:"flex-1 min-h-0 flex flex-col",children:[e.jsxs("div",{className:"flex-1 min-h-0 flex flex-col",children:[e.jsxs("div",{className:"flex items-center justify-between pb-3 px-5 shrink-0 border-b border-surface-border",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(re,{className:"w-3.5 h-3.5 text-accent/60",strokeWidth:1.5}),e.jsx("h2",{className:"section-h2",children:"Pace Board"}),q.length>0&&e.jsxs("span",{className:"text-2xs text-text-quaternary",children:[q.length," ",q.length===1?"station":"stations"," · 1h"]})]}),e.jsx(_,{to:"/pace",icon:f,title:"Open the full Pace Board"})]}),e.jsx("div",{className:"flex-1 min-h-0 cursor-pointer",onClick:()=>s("/pace"),children:q.length===0?e.jsx(k,{icon:re,text:"No roles yet — mark roles visible on the Pace Board"}):e.jsx(Qe,{stations:q,selectedRole:null,onSelect:()=>s("/pace"),onUpstreamSelect:()=>s("/pace"),periodHours:1,logScale:!0,fill:!0})})]}),e.jsxs("div",{className:"hidden sm:flex flex-1 min-h-0 border-t border-surface-border",children:[e.jsx(E,{icon:j,title:"All Escalations",count:K,actions:e.jsxs(e.Fragment,{children:[e.jsx(P,{onRefresh:()=>N.refetch(),isFetching:N.isFetching,apiPath:"/escalations?status=pending&limit=5&sort_by=created_at&order=desc"}),e.jsx(_,{to:"/escalations/available",icon:f,title:"All escalations"})]}),children:T.length===0?e.jsx(k,{icon:j,text:"No pending escalations"}):e.jsx("div",{className:"space-y-0.5",children:T.map(a=>e.jsx(Q,{esc:a,onClick:()=>s(`/escalations/detail/${a.id}`)},a.id))})}),e.jsx("div",{className:"w-px bg-surface-border shrink-0"}),e.jsx(E,{icon:j,title:"My Escalations",count:J,actions:e.jsxs(e.Fragment,{children:[e.jsx(P,{onRefresh:()=>w.refetch(),isFetching:w.isFetching,apiPath:`/escalations?assigned_to=${(n==null?void 0:n.userId)??""}&status=pending&limit=5&sort_by=created_at&order=desc`}),e.jsx(_,{to:"/escalations/queue",icon:f,title:"My escalation queue"})]}),children:A.length===0?e.jsx(k,{icon:j,text:"No assigned escalations"}):e.jsx("div",{className:"space-y-0.5",children:A.map(a=>e.jsx(Q,{esc:a,onClick:()=>s(`/escalations/detail/${a.id}`)},a.id))})})]})]}):e.jsxs("div",{className:"flex-1 min-h-0 flex flex-col",children:[e.jsxs("div",{className:"flex-1 min-h-0 flex border-b border-surface-border",children:[e.jsx(E,{icon:j,title:"All Escalations",count:K,actions:e.jsxs(e.Fragment,{children:[e.jsx(P,{onRefresh:()=>N.refetch(),isFetching:N.isFetching,apiPath:"/escalations?status=pending&limit=5&sort_by=created_at&order=desc"}),e.jsx(_,{to:"/escalations/available",icon:f,title:"All escalations"})]}),children:T.length===0?e.jsx(k,{icon:j,text:"No pending escalations"}):e.jsx("div",{className:"space-y-0.5",children:T.map(a=>e.jsx(Q,{esc:a,onClick:()=>s(`/escalations/detail/${a.id}`)},a.id))})}),e.jsx("div",{className:"w-px bg-surface-border shrink-0"}),e.jsx(E,{icon:j,title:"My Escalations",count:J,actions:e.jsxs(e.Fragment,{children:[e.jsx(P,{onRefresh:()=>w.refetch(),isFetching:w.isFetching,apiPath:`/escalations?assigned_to=${(n==null?void 0:n.userId)??""}&status=pending&limit=5&sort_by=created_at&order=desc`}),e.jsx(_,{to:"/escalations/queue",icon:f,title:"My escalation queue"})]}),children:A.length===0?e.jsx(k,{icon:j,text:"No assigned escalations"}):e.jsx("div",{className:"space-y-0.5",children:A.map(a=>e.jsx(Q,{esc:a,onClick:()=>s(`/escalations/detail/${a.id}`)},a.id))})})]}),b&&e.jsxs("div",{className:"flex-1 min-h-0 flex",children:[e.jsxs(E,{icon:le,title:"Procedural",count:ge,actions:e.jsxs(e.Fragment,{children:[e.jsx(P,{onRefresh:()=>v.refetch(),isFetching:v.isFetching,apiPath:`/workflow-states/jobs?namespace=${p}&limit=5`}),e.jsx(_,{to:"/workflows/executions",icon:f,title:"All procedural executions"})]}),children:[e.jsx(me,{appIds:M,selected:p,onSelect:a=>F("durablenamespace",a)}),H.length===0?e.jsx(k,{icon:le,text:"No recent procedural runs"}):e.jsx("div",{className:"space-y-0.5",children:H.map(a=>e.jsx(ue,{dot:xe(a.status),pill:e.jsx(U,{type:a.entity||a.type||"workflow",size:"xs"}),id:a.workflow_id,date:a.updated_at??a.created_at,onClick:()=>s(`/workflows/executions/${a.workflow_id}`)},a.workflow_id))})]}),e.jsx("div",{className:"w-px bg-surface-border shrink-0"}),e.jsxs(E,{icon:ce,title:"Graph",count:be,actions:e.jsxs(e.Fragment,{children:[e.jsx(P,{onRefresh:()=>$.refetch(),isFetching:$.isFetching,apiPath:`/pipelines?app_id=${m}&limit=5`}),e.jsx(_,{to:"/mcp/executions",icon:f,title:"All graph executions"})]}),children:[e.jsx(me,{appIds:je,selected:m,onSelect:a=>F("pipelinenamespace",a)}),V.length===0?e.jsx(k,{icon:ce,text:"No recent graph runs"}):e.jsx("div",{className:"space-y-0.5",children:V.map(a=>e.jsx(ue,{dot:xe(a.status),pill:e.jsx(U,{type:a.entity||a.workflow_name||"pipeline",variant:"pipeline",size:"xs"}),id:a.workflow_id,date:a.updated_at??a.created_at,onClick:()=>s(`/mcp/executions/${a.workflow_id}?namespace=${m}`)},a.workflow_id))})]})]})]})}export{us as HomePage};
|
|
2
|
-
//# sourceMappingURL=HomePage-
|
|
1
|
+
import{a as x,j as e}from"./vendor-query-DvWWuNIB.js";import{$ as z,j as Ne,a9 as pe,b0 as we,bL as ke,bD as he,Z as fe,O as _e,bM as Ce,t as Ee,l as Pe,bE as Re,w as Se,ay as qe,bc as Fe,bn as Me,g as O}from"./index-BaCDL5fh.js";import{u as $e}from"./pipelines-BH0F9-jf.js";import{u as Te}from"./controlplane-gQdOgVtH.js";import{R as Ie}from"./RolePill-Bw_n7EpR.js";import{W as U}from"./WorkflowPill-Cly9Ln_3.js";import{L as E}from"./ListToolbar-CTGK5BXW.js";import{j as Ae,b as We,P as Qe}from"./OperationsPage-gOVMrL_a.js";import{i as Le}from"./task-queues-7-sHKPsN.js";import{bV as Be,aB as f,ao as De,a2 as Oe,aO as re,I as j,m as le,W as ce}from"./vendor-icons-C_DQEeBy.js";import{u as L,f as Ue}from"./vendor-react-_9U4mKFr.js";import"./EntityTimelinePanel-xgPRdKEq.js";import"./PageHeader-C4z1ExF7.js";import"./useContainerWidth-DSLp1gEm.js";function ze(){const{user:s}=z();return x.useMemo(()=>{const n=((s==null?void 0:s.roles)??[]).map(t=>t.role).filter(t=>!Le(t));return Array.from(new Set(n)).sort((t,i)=>t.localeCompare(i))},[s])}function He(){const{user:s}=z(),n=s==null?void 0:s.userId,t=Ne("SUMMARY"),{data:i}=pe({assigned_to:n,status:"pending",limit:1});return we(ke(),()=>{n&&t([["escalations"]])}),(i==null?void 0:i.total)??0}function D({n:s,label:n,tone:t}){return e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:`text-2xl font-light tabular-nums leading-none ${t==="muted"?"text-text-tertiary":"text-text-primary"}`,children:s}),e.jsx("div",{className:"text-2xs uppercase tracking-wider text-text-quaternary mt-1 truncate",children:n})]})}function Ve({role:s,title:n,metric:t,priorityFacet:i,periodLabel:l}){const d=L(),r=(t==null?void 0:t.pending)??0,u=(t==null?void 0:t.claimed)??0,g=(t==null?void 0:t.resolved)??0,m=(t==null?void 0:t.priority_count)??0;return e.jsxs("div",{role:"button",tabIndex:0,onClick:()=>d(`/escalations/available?role=${encodeURIComponent(s)}`),onKeyDown:p=>{(p.key==="Enter"||p.key===" ")&&(p.preventDefault(),d(`/escalations/available?role=${encodeURIComponent(s)}`))},className:"group h-full border-l-2 border-accent/30 bg-surface-sunken/40 rounded-[0.125em] px-4 py-3.5 cursor-pointer transition-colors hover:bg-surface-sunken/70 focus:outline-none focus-visible:ring-1 focus-visible:ring-accent/40",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2 mb-3",children:[e.jsx("span",{className:"text-2xs font-semibold uppercase tracking-wider text-text-secondary truncate",children:n||s}),e.jsx(f,{className:"w-3 h-3 shrink-0 text-text-quaternary opacity-0 group-hover:opacity-100 transition-opacity",strokeWidth:1.5})]}),e.jsxs("div",{className:"flex items-baseline gap-5",children:[e.jsx(D,{n:r,label:"pending"}),e.jsx(D,{n:u,label:"claimed"}),e.jsx(D,{n:g,label:`resolved · ${l}`,tone:"muted"})]}),e.jsx("div",{className:"mt-3 h-6 flex items-center",children:m>0?e.jsxs("button",{type:"button",onClick:p=>{p.stopPropagation(),d(Ae({role:s,priority_facet:i}))},className:"inline-flex items-center gap-1.5 pl-1.5 pr-2.5 py-1 rounded-full text-2xs font-semibold tabular-nums bg-status-error text-text-inverse transition-transform hover:scale-[1.05]",title:"Past the priority threshold — a hard limit; open oldest first",children:[e.jsx(De,{className:"w-3 h-3",strokeWidth:2.5}),m," in jeopardy"]}):e.jsx("span",{className:"text-2xs text-text-quaternary",children:"on pace"})})]})}function de({count:s}){const n=L();return e.jsxs("div",{role:"button",tabIndex:0,onClick:()=>n("/escalations/queue"),onKeyDown:t=>{(t.key==="Enter"||t.key===" ")&&(t.preventDefault(),n("/escalations/queue"))},className:"group h-full border-l-2 border-status-warning/70 bg-status-warning/[0.06] rounded-[0.125em] px-4 py-3.5 cursor-pointer transition-colors hover:bg-status-warning/[0.1] focus:outline-none focus-visible:ring-1 focus-visible:ring-status-warning/40",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2 mb-3",children:[e.jsxs("span",{className:"flex items-center gap-1.5 text-2xs font-semibold uppercase tracking-wider text-status-warning",children:[e.jsx(Be,{className:"w-3 h-3",strokeWidth:2}),"Claimed"]}),e.jsx(f,{className:"w-3 h-3 shrink-0 text-text-quaternary opacity-0 group-hover:opacity-100 transition-opacity",strokeWidth:1.5})]}),e.jsx("div",{className:"text-2xl font-light tabular-nums leading-none text-text-primary",children:s}),e.jsx("div",{className:"text-2xs uppercase tracking-wider text-text-quaternary mt-1",children:"assigned to you"}),e.jsx("div",{className:"mt-3 h-6 flex items-center",children:e.jsx("span",{className:"text-2xs font-medium text-status-warning",children:s>0?"Finish these first →":"Nothing claimed"})})]})}const Ke=["15m","1h","24h","7d"];function Ye({maxRows:s}){const[n,t]=x.useState("24h"),i=ze(),l=He(),d=he(n),r=fe(),u=x.useMemo(()=>{var o;return new Map((((o=d.data)==null?void 0:o.stations)??[]).map(c=>[c.role,c]))},[d.data]),g=x.useMemo(()=>{var o;return new Map((((o=r.data)==null?void 0:o.roles)??[]).map(c=>[c.role,c]))},[r.data]),m=x.useMemo(()=>[...i].sort((o,c)=>{var v,M;const y=((v=u.get(o))==null?void 0:v.priority_count)??0,S=((M=u.get(c))==null?void 0:M.priority_count)??0;return S!==y?S-y:o.localeCompare(c)}),[i,u]),F=s*4-1,R=m.slice(0,F),b=m.length-R.length;return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-4 pb-2 border-b border-surface-border",children:[e.jsxs("h2",{className:"flex items-center gap-2 text-sm font-medium text-text-primary",children:[e.jsx(Oe,{className:"w-4 h-4 text-accent",strokeWidth:1.5}),"Task Queues"]}),e.jsx("div",{className:"flex items-center gap-0.5",children:Ke.map(o=>e.jsx("button",{onClick:()=>t(o),className:`px-2.5 py-1 text-2xs font-mono rounded transition-colors ${n===o?"bg-accent/10 text-accent font-semibold":"text-text-quaternary hover:text-text-secondary"}`,children:o},o))})]}),i.length===0?e.jsxs("div",{className:"grid grid-cols-1 @grp-cols:grid-cols-2 @wall:grid-cols-4 gap-4",children:[e.jsx(de,{count:l}),e.jsx("div",{className:"lg:col-span-3 flex items-center px-4 py-3.5 text-sm text-text-tertiary",children:"You are not a member of a role. Task queues appear here once you join one."})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-1 @grp-cols:grid-cols-2 @wall:grid-cols-4 gap-4 auto-rows-fr",children:[e.jsx(de,{count:l}),R.map(o=>{var c,y;return e.jsx(Ve,{role:o,title:((c=g.get(o))==null?void 0:c.title)??null,metric:u.get(o),priorityFacet:((y=g.get(o))==null?void 0:y.priority_facet)??null,periodLabel:n},o)})]}),b>0&&e.jsxs("p",{className:"mt-3 text-2xs text-text-quaternary",children:["+",b," more ",b===1?"lane":"lanes"," in the Task Queues sidebar."]})]})]})}const Ge={completed:"bg-status-success",active:"bg-status-active",running:"bg-status-active",pending:"bg-status-pending",error:"bg-status-error",failed:"bg-status-error"};function xe(s){return Ge[s]??"bg-text-tertiary"}function k({icon:s,text:n}){return e.jsxs("div",{className:"flex flex-col items-center justify-center py-10 text-center",children:[e.jsx(s,{className:"w-6 h-6 text-text-quaternary/50 mb-2",strokeWidth:1}),e.jsx("p",{className:"text-xs text-text-quaternary",children:n})]})}function Je(s,n=37){if(!s||s.length<=n)return s;const t=Math.floor((n-3)/2);return`${s.slice(0,t)}...${s.slice(-t)}`}function ue({dot:s,pill:n,id:t,date:i,onClick:l}){return e.jsxs("button",{onClick:l,className:"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-0.5",children:[e.jsx("span",{className:`w-2.5 h-2.5 rounded-full dot-ring shrink-0 ${s}`}),e.jsx("span",{className:"text-xs text-text-primary font-mono truncate flex-1 min-w-0",children:Je(t)}),e.jsx("span",{className:"hidden @dict-inline:inline text-2xs text-text-quaternary shrink-0 whitespace-nowrap",children:e.jsx(O,{date:i})})]}),e.jsxs("div",{className:"pl-3.5 flex items-center gap-1 overflow-hidden",children:[n,e.jsx("span",{className:"flex-1 min-w-0"}),e.jsx("span",{className:"@dict-inline:hidden text-2xs text-text-quaternary shrink-0 whitespace-nowrap",children:e.jsx(O,{date:i})})]})]})}function Q({esc:s,onClick:n}){const t=e.jsx(O,{date:s.updated_at??s.created_at});return e.jsxs("button",{onClick:n,className:"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-0.5",children:[e.jsxs("span",{className:"text-2xs text-text-quaternary font-medium shrink-0",children:["P",s.priority??2]}),e.jsx("span",{className:"text-xs text-text-primary truncate flex-1 min-w-0",children:s.description||s.subtype||s.type}),e.jsx("span",{className:"hidden @dict-inline:inline text-2xs text-text-quaternary shrink-0",children:t})]}),e.jsxs("div",{className:"flex items-center gap-2 pl-5 overflow-hidden",children:[e.jsx("span",{className:"hidden @dict-inline:inline-flex min-w-0",children:e.jsx(U,{type:s.type||"unknown",size:"xs"})}),e.jsx("span",{className:"flex-1 min-w-0"}),e.jsx(Ie,{role:s.role}),e.jsx("span",{className:"@dict-inline:hidden text-2xs text-text-quaternary shrink-0",children:t})]})]})}function _({to:s,icon:n,title:t}){const i=L();return e.jsx("button",{onClick:()=>i(s),className:"text-text-quaternary hover:text-accent transition-colors",title:t,children:e.jsx(n,{className:"w-2.5 h-2.5",strokeWidth:1.5})})}function me({appIds:s,selected:n,onSelect:t}){const[i,l]=x.useState(!1),d=x.useRef(null);return x.useEffect(()=>{if(!i)return;const r=u=>{d.current&&!d.current.contains(u.target)&&l(!1)};return document.addEventListener("mousedown",r),()=>document.removeEventListener("mousedown",r)},[i]),s.length<=1?null:e.jsxs("div",{className:"relative mb-3 -mt-2",ref:d,children:[e.jsxs("button",{onClick:()=>l(r=>!r),className:"flex items-center gap-1 px-2 py-0.5 text-2xs rounded bg-accent/10 text-accent hover:bg-accent/20 transition-colors",children:[n,e.jsx("svg",{className:`w-2.5 h-2.5 transition-transform ${i?"rotate-180":""}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"})})]}),i&&e.jsx("div",{className:"absolute top-full left-0 mt-1 bg-surface-raised border border-surface-border rounded-md shadow-lg z-[100] py-1 min-w-[120px]",children:s.map(r=>e.jsx("button",{onClick:()=>{t(r),l(!1)},className:`w-full text-left px-3 py-1.5 text-2xs transition-colors ${n===r?"text-accent bg-accent/5":"text-text-secondary hover:bg-surface-hover"}`,children:r},r))})]})}function P({icon:s,title:n,count:t,actions:i,children:l}){return e.jsxs("div",{className:"flex-1 min-w-0 min-h-0 flex flex-col",children:[e.jsxs("div",{className:"flex items-center justify-between pt-4 pb-2 px-5 shrink-0 border-b border-surface-border",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(s,{className:"w-3.5 h-3.5 text-accent/60",strokeWidth:1.5}),e.jsx("h2",{className:"section-h2",children:n}),t!==void 0&&t>0&&e.jsx("span",{className:"px-1.5 py-0.5 rounded-full bg-accent/10 text-accent text-2xs font-semibold tabular-nums",children:Me(t)})]}),i&&e.jsx("div",{className:"flex items-center gap-2",children:i})]}),e.jsx("div",{className:"flex-1 min-h-0 overflow-y-auto py-2 px-5 @container",children:l})]})}function us(){var G,J,X,Z,ee,se,te,ae;const s=L(),{user:n}=z(),{isBuilder:t}=_e(),i=Ce(),[l,d]=Ue(),{data:r}=Te({enabled:t}),u=x.useMemo(()=>((r==null?void 0:r.apps)??[]).map(a=>a.appId).sort(),[r]),g=u[0]??"",m=l.get("pipelinenamespace")||g,p=l.get("durablenamespace")||g,F=x.useCallback((a,A)=>{d(W=>{const C=new URLSearchParams(W);return C.set(a,A),C},{replace:!1})},[d]);Ee(),Pe(),Re();const R=!i.showTaskQueueCards,b=i.canSeeWorkflows&&!i.canSeePaceBoard,o=fe({enabled:i.canSeePaceBoard}),{values:c}=Se(),y=x.useMemo(()=>Object.keys(c).length?c:void 0,[c]),S=he("1h",y,{enabled:i.canSeePaceBoard}),v=qe({limit:5,sort_by:"updated_at",order:"desc",namespace:p},{enabled:b}),M=u,je=u,$=$e({limit:5,app_id:m,sort_by:"updated_at",order:"desc"},{enabled:b}),N=Fe({limit:5,sort_by:"created_at",order:"desc",enabled:R}),w=pe({assigned_to:n==null?void 0:n.userId,status:"pending",limit:5,sort_by:"created_at",order:"desc",enabled:R});x.useEffect(()=>{const a=setTimeout(()=>{w.refetch(),N.refetch()},2e3);return()=>clearTimeout(a)},[]);const q=x.useMemo(()=>{var ne,ie,oe;const a=((ne=o.data)==null?void 0:ne.roles)??[],A=We(a),W=(ie=a.find(h=>h.ops_home_default))==null?void 0:ie.role,C=W&&A.find(h=>h.stations.some(B=>B.role.role===W))||A[0],ye=(C==null?void 0:C.stations)??[],ve=((oe=S.data)==null?void 0:oe.stations)??[];return ye.map(({role:h})=>({role:h.role,title:h.title,parent_role:h.parent_role,target_per_hour:h.target_per_hour??null,upstream_roles:h.upstream_roles??[],metric:ve.find(B=>B.role===h.role)}))},[o.data,S.data]),H=((G=v.data)==null?void 0:G.jobs)??[],ge=(J=v.data)==null?void 0:J.total,V=((X=$.data)==null?void 0:X.jobs)??[],be=(Z=$.data)==null?void 0:Z.total,T=((ee=N.data)==null?void 0:ee.escalations)??[],K=(se=N.data)==null?void 0:se.total,I=((te=w.data)==null?void 0:te.escalations)??[],Y=(ae=w.data)==null?void 0:ae.total;return i.showTaskQueueCards?e.jsxs("div",{children:[e.jsx("h1",{className:"heading-1 mb-6",children:"Console"}),e.jsx(Ye,{maxRows:2})]}):i.canSeePaceBoard?e.jsxs("div",{className:"flex-1 min-h-0 flex flex-col",children:[e.jsxs("div",{className:"flex-1 min-h-0 flex flex-col",children:[e.jsxs("div",{className:"flex items-center justify-between pb-3 px-5 shrink-0 border-b border-surface-border",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(re,{className:"w-3.5 h-3.5 text-accent/60",strokeWidth:1.5}),e.jsx("h2",{className:"section-h2",children:"Pace Board"}),q.length>0&&e.jsxs("span",{className:"text-2xs text-text-quaternary",children:[q.length," ",q.length===1?"station":"stations"," · 1h"]})]}),e.jsx(_,{to:"/pace",icon:f,title:"Open the full Pace Board"})]}),e.jsx("div",{className:"flex-1 min-h-0 cursor-pointer",onClick:()=>s("/pace"),children:q.length===0?e.jsx(k,{icon:re,text:"No roles yet — mark roles visible on the Pace Board"}):e.jsx(Qe,{stations:q,selectedRole:null,onSelect:()=>s("/pace"),onUpstreamSelect:()=>s("/pace"),periodHours:1,logScale:!0,fill:!0})})]}),e.jsxs("div",{className:"hidden sm:flex flex-1 min-h-0 border-t border-surface-border",children:[e.jsx(P,{icon:j,title:"All Escalations",count:K,actions:e.jsxs(e.Fragment,{children:[e.jsx(E,{onRefresh:()=>N.refetch(),isFetching:N.isFetching,apiPath:"/escalations?status=pending&limit=5&sort_by=created_at&order=desc"}),e.jsx(_,{to:"/escalations/available",icon:f,title:"All escalations"})]}),children:T.length===0?e.jsx(k,{icon:j,text:"No pending escalations"}):e.jsx("div",{className:"space-y-0.5",children:T.map(a=>e.jsx(Q,{esc:a,onClick:()=>s(`/escalations/detail/${a.id}`)},a.id))})}),e.jsx("div",{className:"w-px bg-surface-border shrink-0"}),e.jsx(P,{icon:j,title:"My Escalations",count:Y,actions:e.jsxs(e.Fragment,{children:[e.jsx(E,{onRefresh:()=>w.refetch(),isFetching:w.isFetching,apiPath:`/escalations?assigned_to=${(n==null?void 0:n.userId)??""}&status=pending&limit=5&sort_by=created_at&order=desc`}),e.jsx(_,{to:"/escalations/queue",icon:f,title:"My escalation queue"})]}),children:I.length===0?e.jsx(k,{icon:j,text:"No assigned escalations"}):e.jsx("div",{className:"space-y-0.5",children:I.map(a=>e.jsx(Q,{esc:a,onClick:()=>s(`/escalations/detail/${a.id}`)},a.id))})})]})]}):e.jsxs("div",{className:"flex-1 min-h-0 flex flex-col",children:[e.jsxs("div",{className:"flex-1 min-h-0 flex border-b border-surface-border",children:[e.jsx(P,{icon:j,title:"All Escalations",count:K,actions:e.jsxs(e.Fragment,{children:[e.jsx(E,{onRefresh:()=>N.refetch(),isFetching:N.isFetching,apiPath:"/escalations?status=pending&limit=5&sort_by=created_at&order=desc"}),e.jsx(_,{to:"/escalations/available",icon:f,title:"All escalations"})]}),children:T.length===0?e.jsx(k,{icon:j,text:"No pending escalations"}):e.jsx("div",{className:"space-y-0.5",children:T.map(a=>e.jsx(Q,{esc:a,onClick:()=>s(`/escalations/detail/${a.id}`)},a.id))})}),e.jsx("div",{className:"w-px bg-surface-border shrink-0"}),e.jsx(P,{icon:j,title:"My Escalations",count:Y,actions:e.jsxs(e.Fragment,{children:[e.jsx(E,{onRefresh:()=>w.refetch(),isFetching:w.isFetching,apiPath:`/escalations?assigned_to=${(n==null?void 0:n.userId)??""}&status=pending&limit=5&sort_by=created_at&order=desc`}),e.jsx(_,{to:"/escalations/queue",icon:f,title:"My escalation queue"})]}),children:I.length===0?e.jsx(k,{icon:j,text:"No assigned escalations"}):e.jsx("div",{className:"space-y-0.5",children:I.map(a=>e.jsx(Q,{esc:a,onClick:()=>s(`/escalations/detail/${a.id}`)},a.id))})})]}),b&&e.jsxs("div",{className:"flex-1 min-h-0 flex",children:[e.jsxs(P,{icon:le,title:"Procedural",count:ge,actions:e.jsxs(e.Fragment,{children:[e.jsx(E,{onRefresh:()=>v.refetch(),isFetching:v.isFetching,apiPath:`/workflow-states/jobs?namespace=${p}&limit=5`}),e.jsx(_,{to:"/workflows/executions",icon:f,title:"All procedural executions"})]}),children:[e.jsx(me,{appIds:M,selected:p,onSelect:a=>F("durablenamespace",a)}),H.length===0?e.jsx(k,{icon:le,text:"No recent procedural runs"}):e.jsx("div",{className:"space-y-0.5",children:H.map(a=>e.jsx(ue,{dot:xe(a.status),pill:e.jsx(U,{type:a.entity||a.type||"workflow",size:"xs"}),id:a.workflow_id,date:a.updated_at??a.created_at,onClick:()=>s(`/workflows/executions/${a.workflow_id}`)},a.workflow_id))})]}),e.jsx("div",{className:"w-px bg-surface-border shrink-0"}),e.jsxs(P,{icon:ce,title:"Graph",count:be,actions:e.jsxs(e.Fragment,{children:[e.jsx(E,{onRefresh:()=>$.refetch(),isFetching:$.isFetching,apiPath:`/pipelines?app_id=${m}&limit=5`}),e.jsx(_,{to:"/mcp/executions",icon:f,title:"All graph executions"})]}),children:[e.jsx(me,{appIds:je,selected:m,onSelect:a=>F("pipelinenamespace",a)}),V.length===0?e.jsx(k,{icon:ce,text:"No recent graph runs"}):e.jsx("div",{className:"space-y-0.5",children:V.map(a=>e.jsx(ue,{dot:xe(a.status),pill:e.jsx(U,{type:a.entity||a.workflow_name||"pipeline",variant:"pipeline",size:"xs"}),id:a.workflow_id,date:a.updated_at??a.created_at,onClick:()=>s(`/mcp/executions/${a.workflow_id}?namespace=${m}`)},a.workflow_id))})]})]})]})}export{us as HomePage};
|
|
2
|
+
//# sourceMappingURL=HomePage-HVw7T5ER.js.map
|