@hotmeshio/long-tail 0.9.2 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dashboard/dist/assets/{AdminDashboard-JobmypiO.js → AdminDashboard-BONGlQva.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-JobmypiO.js.map → AdminDashboard-BONGlQva.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-D_HuaRN9.js → AgentConfigPage-C_NJ4-pr.js} +2 -2
- package/dashboard/dist/assets/{AgentConfigPage-D_HuaRN9.js.map → AgentConfigPage-C_NJ4-pr.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-Cj22NZLI.js → AgentDetailPage-MSCS6bFD.js} +2 -2
- package/dashboard/dist/assets/{AgentDetailPage-Cj22NZLI.js.map → AgentDetailPage-MSCS6bFD.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-DTKto-gL.js → AgentsPage-PfSvedS-.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-DTKto-gL.js.map → AgentsPage-PfSvedS-.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-CUvrKkgS.js → AvailableEscalationsPage-DBeBLNWW.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-CUvrKkgS.js.map → AvailableEscalationsPage-DBeBLNWW.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-AwKouk26.js → BotPicker-DmCdoim8.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-AwKouk26.js.map → BotPicker-DmCdoim8.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-1ZMO_0UU.js → CapabilitiesPage-DVf4zIMZ.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-1ZMO_0UU.js.map → CapabilitiesPage-DVf4zIMZ.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-D6kUTrq4.js → CollapsibleSection-7ACdYUZy.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-D6kUTrq4.js.map → CollapsibleSection-7ACdYUZy.js.map} +1 -1
- package/dashboard/dist/assets/{CountdownTimer-Bj9YbInO.js → CountdownTimer-Gbp6RHav.js} +2 -2
- package/dashboard/dist/assets/{CountdownTimer-Bj9YbInO.js.map → CountdownTimer-Gbp6RHav.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-D5H_kyRL.js → CredentialsPage-JWCUgQMi.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-D5H_kyRL.js.map → CredentialsPage-JWCUgQMi.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-DvmJ0EFz.js → CronLabel-9GtrGEDe.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-DvmJ0EFz.js.map → CronLabel-9GtrGEDe.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-DT_g8Hr4.js → CustomDurationPicker-xNJMIvjL.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-DT_g8Hr4.js.map → CustomDurationPicker-xNJMIvjL.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-7_8YpC3D.js → ElapsedCell-rRiChKDm.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-7_8YpC3D.js.map → ElapsedCell-rRiChKDm.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-ClFRLeKV.js → EscalationListSchemaPage-B7PHz5CB.js} +2 -2
- package/dashboard/dist/assets/{EscalationListSchemaPage-ClFRLeKV.js.map → EscalationListSchemaPage-B7PHz5CB.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-BcYcj-b8.js → EscalationSchemaPage-_CbayTDk.js} +2 -2
- package/dashboard/dist/assets/{EscalationSchemaPage-BcYcj-b8.js.map → EscalationSchemaPage-_CbayTDk.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-uHb8ni_5.js → EscalationsOverview-C5bVdGf2.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-uHb8ni_5.js.map → EscalationsOverview-C5bVdGf2.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-CkdWqmEL.js → EventTable-DGaRYVnB.js} +2 -2
- package/dashboard/dist/assets/{EventTable-CkdWqmEL.js.map → EventTable-DGaRYVnB.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-C6sfPjSc.js → GraphInvokePage-R6_p2Sy7.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-C6sfPjSc.js.map → GraphInvokePage-R6_p2Sy7.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-CUHZxihq.js → HomePage-DHxtqRkD.js} +2 -2
- package/dashboard/dist/assets/{HomePage-CUHZxihq.js.map → HomePage-DHxtqRkD.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-nWxpujpH.js → ListToolbar-BhXp7clK.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-nWxpujpH.js.map → ListToolbar-BhXp7clK.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-DXrkDkU-.js → McpOverview-COgIIWkK.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-DXrkDkU-.js.map → McpOverview-COgIIWkK.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-CnLYE26v.js → McpQueryDetailPage-4LEqQZax.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-CnLYE26v.js.map → McpQueryDetailPage-4LEqQZax.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-oE9eWAus.js → McpQueryPage-DWAcSqF-.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-oE9eWAus.js.map → McpQueryPage-DWAcSqF-.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-B7e6AVl1.js → McpRunDetailPage-BNjhOPLp.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-B7e6AVl1.js.map → McpRunDetailPage-BNjhOPLp.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-Bx5DiGk7.js → McpRunsPage-DAjYKqqt.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-Bx5DiGk7.js.map → McpRunsPage-DAjYKqqt.js.map} +1 -1
- package/dashboard/dist/assets/{OperationsPage-BmG3qzdR.js → OperationsPage-5RkfIbtT.js} +2 -2
- package/dashboard/dist/assets/{OperationsPage-BmG3qzdR.js.map → OperationsPage-5RkfIbtT.js.map} +1 -1
- package/dashboard/dist/assets/{OperatorDashboard-r6hQ57eO.js → OperatorDashboard-B-2dIbj4.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-r6hQ57eO.js.map → OperatorDashboard-B-2dIbj4.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-C3gE4OHq.js → ProcessDetailPage-Bx7sF-vV.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-C3gE4OHq.js.map → ProcessDetailPage-Bx7sF-vV.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-DSsIGmBB.js → ProcessesListPage-Dsfc-DX_.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-DSsIGmBB.js.map → ProcessesListPage-Dsfc-DX_.js.map} +1 -1
- package/dashboard/dist/assets/{RoleDetailPage-DiFISbnq.js → RoleDetailPage-DF-ov9E9.js} +2 -2
- package/dashboard/dist/assets/{RoleDetailPage-DiFISbnq.js.map → RoleDetailPage-DF-ov9E9.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-CE5fui18.js → RolesPage-DIlde9bw.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-CE5fui18.js.map → RolesPage-DIlde9bw.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-Ct8NNadu.js → RunAsSelector-DOYUYXcD.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-Ct8NNadu.js.map → RunAsSelector-DOYUYXcD.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-BfgBtP_B.js → StickyPagination-BwXLmDc-.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-BfgBtP_B.js.map → StickyPagination-BwXLmDc-.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-2rwp7Ynx.js → StreamMessageDetail-CCez20kE.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-2rwp7Ynx.js.map → StreamMessageDetail-CCez20kE.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-BwWyYBCo.js → SwimlaneTimeline-hcWBunXb.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-BwWyYBCo.js.map → SwimlaneTimeline-hcWBunXb.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-BUKHu2oD.js → TaskDetailPage-CIarmoAk.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-BUKHu2oD.js.map → TaskDetailPage-CIarmoAk.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-C_PwExQC.js → TasksListPage-CFqMwhLE.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-C_PwExQC.js.map → TasksListPage-CFqMwhLE.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-Bagm-L2o.js → TimeAgo-CuI-66Kw.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-Bagm-L2o.js.map → TimeAgo-CuI-66Kw.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-BwDo7knq.js → TimestampCell-BI3Uptj8.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-BwDo7knq.js.map → TimestampCell-BI3Uptj8.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-CVZ2M1yv.js → ToolTestPanel-QwGyWRfG.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-CVZ2M1yv.js.map → ToolTestPanel-QwGyWRfG.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-DKAvbkxD.js → TopicDetailPage-CGCiqQGf.js} +2 -2
- package/dashboard/dist/assets/{TopicDetailPage-DKAvbkxD.js.map → TopicDetailPage-CGCiqQGf.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-BZknsApe.js → TopicsPage-Bk8-inSO.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-BZknsApe.js.map → TopicsPage-Bk8-inSO.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-ByDxLHPZ.js → UserName-BOaihCFP.js} +2 -2
- package/dashboard/dist/assets/{UserName-ByDxLHPZ.js.map → UserName-BOaihCFP.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-DrwKB2x8.js → WorkflowExecutionPage-CE0QzhIt.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-DrwKB2x8.js.map → WorkflowExecutionPage-CE0QzhIt.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-DEq9fkhl.js → WorkflowsDashboard-wgWRZOnB.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-DEq9fkhl.js.map → WorkflowsDashboard-wgWRZOnB.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-l-0KYP7Y.js → WorkflowsOverview-CLyitES7.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-l-0KYP7Y.js.map → WorkflowsOverview-CLyitES7.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-BgimL3VT.js → YamlWorkflowDetailPage-pP2i1ptj.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-BgimL3VT.js.map → YamlWorkflowDetailPage-pP2i1ptj.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-CabXXA9r.js → YamlWorkflowsPage-BwQSMfYw.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-CabXXA9r.js.map → YamlWorkflowsPage-BwQSMfYw.js.map} +1 -1
- package/dashboard/dist/assets/{agents-D_L6lV0f.js → agents-CRtBacrZ.js} +2 -2
- package/dashboard/dist/assets/{agents-D_L6lV0f.js.map → agents-CRtBacrZ.js.map} +1 -1
- package/dashboard/dist/assets/{bots-wdZz1nJw.js → bots-FjzeqLzA.js} +2 -2
- package/dashboard/dist/assets/{bots-wdZz1nJw.js.map → bots-FjzeqLzA.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-C35_V8eu.js → capabilities-CB0y1ZCx.js} +2 -2
- package/dashboard/dist/assets/{capabilities-C35_V8eu.js.map → capabilities-CB0y1ZCx.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-kR2P6zYv.js → controlplane-ZJtfQopv.js} +2 -2
- package/dashboard/dist/assets/{controlplane-kR2P6zYv.js.map → controlplane-ZJtfQopv.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-BVj16HuR.js → escalation-columns-735GLlEN.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-BVj16HuR.js.map → escalation-columns-735GLlEN.js.map} +1 -1
- package/dashboard/dist/assets/{index-CJFA7aLp.js → index-AUrwksY_.js} +2 -2
- package/dashboard/dist/assets/{index-CJFA7aLp.js.map → index-AUrwksY_.js.map} +1 -1
- package/dashboard/dist/assets/{index-C75E0-Wd.js → index-BH0BQHF-.js} +2 -2
- package/dashboard/dist/assets/{index-C75E0-Wd.js.map → index-BH0BQHF-.js.map} +1 -1
- package/dashboard/dist/assets/{index-DIrYjyRG.js → index-BTrN5iqE.js} +3 -3
- package/dashboard/dist/assets/{index-DIrYjyRG.js.map → index-BTrN5iqE.js.map} +1 -1
- package/dashboard/dist/assets/{index-wZzl3bcK.js → index-B_pZXTTp.js} +2 -2
- package/dashboard/dist/assets/{index-wZzl3bcK.js.map → index-B_pZXTTp.js.map} +1 -1
- package/dashboard/dist/assets/{index-BMQopgAx.js → index-Bho1kYrO.js} +2 -2
- package/dashboard/dist/assets/{index-BMQopgAx.js.map → index-Bho1kYrO.js.map} +1 -1
- package/dashboard/dist/assets/{index-1WCiN-pF.js → index-CzYOxahh.js} +2 -2
- package/dashboard/dist/assets/{index-1WCiN-pF.js.map → index-CzYOxahh.js.map} +1 -1
- package/dashboard/dist/assets/{index-B4zWCfQr.js → index-D4z4fzW5.js} +2 -2
- package/dashboard/dist/assets/{index-B4zWCfQr.js.map → index-D4z4fzW5.js.map} +1 -1
- package/dashboard/dist/assets/{index-BZfX_ziz.js → index-DiCp9bmR.js} +2 -2
- package/dashboard/dist/assets/{index-BZfX_ziz.js.map → index-DiCp9bmR.js.map} +1 -1
- package/dashboard/dist/assets/{index-BmbO85oT.js → index-DlrsXckY.js} +2 -2
- package/dashboard/dist/assets/{index-BmbO85oT.js.map → index-DlrsXckY.js.map} +1 -1
- package/dashboard/dist/assets/{index-so192yXP.js → index-DpGeD89g.js} +3 -3
- package/dashboard/dist/assets/{index-so192yXP.js.map → index-DpGeD89g.js.map} +1 -1
- package/dashboard/dist/assets/{index-xBNf5aFb.js → index-DzIB5CaR.js} +2 -2
- package/dashboard/dist/assets/{index-xBNf5aFb.js.map → index-DzIB5CaR.js.map} +1 -1
- package/dashboard/dist/assets/{index-BfDn7j4K.js → index-GRckVBX1.js} +2 -2
- package/dashboard/dist/assets/{index-BfDn7j4K.js.map → index-GRckVBX1.js.map} +1 -1
- package/dashboard/dist/assets/{index-QOTnrFd1.js → index-iEn58vjL.js} +2 -2
- package/dashboard/dist/assets/{index-QOTnrFd1.js.map → index-iEn58vjL.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-DDt599ea.js → knowledge-Bw51BCX9.js} +2 -2
- package/dashboard/dist/assets/{knowledge-DDt599ea.js.map → knowledge-Bw51BCX9.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-BPXRXEje.js → mcp-D4KRVy2a.js} +2 -2
- package/dashboard/dist/assets/{mcp-BPXRXEje.js.map → mcp-D4KRVy2a.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-HUZuboi-.js → mcp-query-0Zo3GwTv.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-HUZuboi-.js.map → mcp-query-0Zo3GwTv.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-CH8q3ok_.js → pipelines-B8sOpeCD.js} +2 -2
- package/dashboard/dist/assets/{pipelines-CH8q3ok_.js.map → pipelines-B8sOpeCD.js.map} +1 -1
- package/dashboard/dist/assets/{roles-B7rzw8wD.js → roles-Bs6hUrQJ.js} +2 -2
- package/dashboard/dist/assets/{roles-B7rzw8wD.js.map → roles-Bs6hUrQJ.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-j-mVt2EA.js → tasks-KDV3bflF.js} +2 -2
- package/dashboard/dist/assets/{tasks-j-mVt2EA.js.map → tasks-KDV3bflF.js.map} +1 -1
- package/dashboard/dist/assets/{topics-DATyaYWW.js → topics-BS_n738l.js} +2 -2
- package/dashboard/dist/assets/{topics-DATyaYWW.js.map → topics-BS_n738l.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-CwIAhqJk.js → useEventHooks-RbAigCWV.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-CwIAhqJk.js.map → useEventHooks-RbAigCWV.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-hV7rcAfa.js → useNamespace-ChDZWKAd.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-hV7rcAfa.js.map → useNamespace-ChDZWKAd.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-Dwuuu3F0.js → useYamlActivityEvents-6xNaRNAc.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-Dwuuu3F0.js.map → useYamlActivityEvents-6xNaRNAc.js.map} +1 -1
- package/dashboard/dist/assets/{users-DS9yeHe4.js → users-BPt2YERY.js} +2 -2
- package/dashboard/dist/assets/{users-DS9yeHe4.js.map → users-BPt2YERY.js.map} +1 -1
- package/dashboard/dist/assets/{workflows-FF8WUHaC.js → workflows-BaSjfNsd.js} +2 -2
- package/dashboard/dist/assets/{workflows-FF8WUHaC.js.map → workflows-BaSjfNsd.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-y-eo6Rwj.js → yaml-workflows-Be3rM5i2.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-y-eo6Rwj.js.map → yaml-workflows-Be3rM5i2.js.map} +1 -1
- package/dashboard/dist/index.html +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserName-
|
|
1
|
+
{"version":3,"file":"UserName-BOaihCFP.js","sources":["../../src/components/common/display/UserName.tsx"],"sourcesContent":["import { useUser } from '../../../api/users';\n\n/**\n * Resolves a user ID to their display name (or email, or truncated ID as fallback).\n * Renders inline — suitable for use inside <span>, <p>, etc.\n */\nexport function UserName({ userId, fallback }: { userId: string; fallback?: string }) {\n const { data: resolved } = useUser(userId);\n\n if (resolved) {\n return <>{resolved.display_name || resolved.email || resolved.external_id}</>;\n }\n\n // Still loading or no record — show fallback or truncated ID\n return <>{fallback ?? `${userId.slice(0, 8)}…`}</>;\n}\n"],"names":["UserName","userId","fallback","resolved","useUser","jsx","Fragment"],"mappings":"uFAMO,SAASA,EAAS,CAAE,OAAAC,EAAQ,SAAAC,GAAmD,CACpF,KAAM,CAAE,KAAMC,GAAaC,EAAQH,CAAM,EAEzC,OAAIE,oBACQ,SAAAA,EAAS,cAAgBA,EAAS,OAASA,EAAS,YAAY,EAIrEE,EAAAA,IAAAC,EAAAA,SAAA,CAAG,YAAY,GAAGL,EAAO,MAAM,EAAG,CAAC,CAAC,GAAA,CAAI,CACjD"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as b,j as e}from"./vendor-query-B2UbickB.js";import{a as D,f as U}from"./workflows-FF8WUHaC.js";import{h as O}from"./useEventHooks-CwIAhqJk.js";import{u as z,E as B}from"./EventTable-CkdWqmEL.js";import{b as K,e as M}from"./tasks-j-mVt2EA.js";import{b as v,D as Q,J as T,e as F}from"./index-so192yXP.js";import{P as H}from"./PageHeader-Ji1AtA4f.js";import{C as N}from"./CollapsibleSection-D6kUTrq4.js";import{L as J}from"./ListToolbar-nWxpujpH.js";import{P as c,S as q,a as Z}from"./SlidePanel-BzeKveus.js";import{S as C}from"./StatusBadge-CEQMRmSQ.js";import{C as _}from"./CopyableId-uot2mE_g.js";import{ah as G,af as X,am as Y,an as ee,i as te}from"./vendor-icons-BX2Vih4L.js";import{L as u,e as se,c as ae}from"./vendor-react-CXumBFUA.js";import{S as re}from"./SwimlaneTimeline-BwWyYBCo.js";import"./FilterBar-DDIn8TOs.js";import"./StreamMessageDetail-2rwp7Ynx.js";function ne(t){const s=t.lastIndexOf("-");return s<=0?{taskQueue:t,workflowType:t}:{taskQueue:t.substring(0,s),workflowType:t.substring(s+1)}}function S({children:t}){return e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:t})}function oe({escalations:t}){return e.jsx("div",{children:t.map(s=>e.jsxs(u,{to:`/escalations/detail/${s.id}`,className:"grid grid-cols-[1fr_auto_auto] items-center gap-x-3 py-2 border-b border-surface-border/40 last:border-b-0 group",children:[e.jsxs("span",{className:"min-w-0",children:[e.jsx("span",{className:"block text-xs font-mono text-text-primary group-hover:text-accent transition-colors truncate",title:s.type,children:s.type}),e.jsx("span",{className:"block text-[10px] text-text-tertiary truncate",children:s.role})]}),e.jsx(v,{date:s.created_at,format:"relative",className:"text-[10px] text-text-tertiary whitespace-nowrap"}),e.jsx("span",{className:"w-20 flex justify-end",children:e.jsx(C,{status:s.status})})]},s.id))})}function le({tasks:t}){return e.jsx("div",{children:t.map(s=>e.jsxs(u,{to:`/workflows/tasks/detail/${s.id}`,className:"grid grid-cols-[1fr_auto_auto] items-center gap-x-3 py-2 border-b border-surface-border/40 last:border-b-0 group",children:[e.jsxs("span",{className:"min-w-0",children:[e.jsx("span",{className:"block text-xs font-mono text-text-primary group-hover:text-accent transition-colors truncate",title:s.workflow_type,children:s.workflow_type}),e.jsx("span",{className:"block text-[10px] text-text-tertiary truncate",children:s.lt_type})]}),e.jsx(v,{date:s.created_at,format:"relative",className:"text-[10px] text-text-tertiary whitespace-nowrap"}),e.jsx("span",{className:"w-20 flex justify-end",children:e.jsx(C,{status:s.status})})]},s.id))})}function ie({execution:t,parentWorkflowId:s,childTasks:a,escalations:r,headerActions:n,open:l}){const m=r.length>0||a.length>0,[x,o]=b.useState(m?"escalations":"details"),{taskQueue:p,workflowType:h}=ne(t.workflow_type),f=[{id:"details",icon:G,label:"Details",content:e.jsxs("dl",{className:"space-y-3.5",children:[e.jsx(c,{label:"Status",children:e.jsx(C,{status:t.status})}),e.jsx(c,{label:"Workflow Type",children:e.jsx(_,{bare:!0,value:h,href:`/workflows/executions?entity=${encodeURIComponent(h)}`})}),e.jsx(c,{label:"Workflow ID",children:e.jsx(_,{bare:!0,value:t.workflow_id})}),s&&e.jsx(c,{label:"Parent",children:e.jsx(_,{bare:!0,value:s,href:`/workflows/executions/${s}`})}),e.jsx(c,{label:"Task Queue",children:e.jsx("span",{className:"font-mono",children:p})}),e.jsx(c,{label:"Start Time",children:t.start_time?e.jsx(v,{date:t.start_time,format:"datetime"}):e.jsx("span",{className:"text-text-tertiary",children:"--"})}),e.jsx(c,{label:"End Time",children:t.close_time?e.jsx(v,{date:t.close_time,format:"datetime"}):e.jsx("span",{className:"text-text-tertiary",children:"--"})}),e.jsx(c,{label:"Duration",children:e.jsx(Q,{ms:t.duration_ms,className:"font-mono"})}),e.jsxs(c,{label:"History Size",children:[t.summary.total_events," events"]}),e.jsxs(c,{label:"Activities",children:[t.summary.activities.completed," / ",t.summary.activities.total]})]})},{id:"escalations",icon:X,label:"Escalations",content:e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx(S,{children:"Escalations"}),r.length>0?e.jsx(oe,{escalations:r}):e.jsx("p",{className:"text-xs text-text-tertiary italic",children:"This workflow has not escalated."})]}),a.length>0&&e.jsxs("div",{children:[e.jsx(S,{children:"Related Tasks"}),e.jsx(le,{tasks:a})]})]})}];return e.jsx(q,{open:l,width:384,className:"self-stretch",children:e.jsx("div",{className:"h-full pl-6",children:e.jsx(Z,{views:f,activeId:x,onViewChange:o,headerActions:n,stickyClassName:"sticky top-0 z-10 h-[calc(100vh-5.25rem)] pt-9"})})})}function ce(t){var r;const s=t.events.find(n=>n.event_type==="workflow_execution_started"),a=(r=s==null?void 0:s.attributes)==null?void 0:r.input;return a&&typeof a=="object"?a:null}function de({execution:t}){const s=ce(t),a=t.result,r=(a==null?void 0:a.data)??a??null;return!s&&!r?null:e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4 mb-6",children:[s!==null&&e.jsx("div",{children:e.jsx(T,{data:s,label:"Input Envelope"})}),r!==null&&e.jsx("div",{children:e.jsx(T,{data:r,label:"Result"})})]})}function xe({isRunning:t,hasToolCalls:s,workflowId:a,onAction:r}){const[n,l]=b.useState(!1),m=b.useRef(null);return b.useEffect(()=>{if(!n)return;const x=o=>{m.current&&!m.current.contains(o.target)&&l(!1)};return document.addEventListener("mousedown",x),()=>document.removeEventListener("mousedown",x)},[n]),e.jsxs("div",{className:"relative",ref:m,children:[e.jsxs("button",{onClick:()=>l(!n),className:"flex items-center gap-0.5 pl-2 pr-1 py-1 rounded-md text-[11px] font-medium text-text-tertiary hover:text-accent hover:bg-surface-hover transition-colors",title:"Actions",children:["Actions",e.jsx(te,{className:`w-3 h-3 transition-transform ${n?"rotate-180":""}`})]}),n&&e.jsxs("div",{className:"absolute right-0 mt-1 w-44 bg-surface-raised border border-surface-border rounded-md shadow-lg z-20",children:[e.jsx("button",{onClick:()=>{r("restart"),l(!1)},className:"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover",children:"Restart Workflow"}),t&&e.jsx("button",{onClick:()=>{r("terminate"),l(!1)},className:"block w-full text-left px-4 py-2 text-xs text-status-error hover:bg-surface-hover",children:"Terminate"}),s&&e.jsx(u,{to:`/mcp/queries/${a}?step=3`,className:"block w-full text-left px-4 py-2 text-xs text-accent hover:bg-surface-hover",onClick:()=>l(!1),children:"Compile into Pipeline"}),e.jsx(u,{to:`/mcp/executions/${encodeURIComponent(a)}?namespace=durable`,className:"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover",onClick:()=>l(!1),children:"View Pipeline Execution"}),e.jsx(u,{to:`/admin/streams?source=worker&jid=${encodeURIComponent(a)}`,className:"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover",onClick:()=>l(!1),children:"Worker Messages"}),e.jsx(u,{to:`/admin/streams?source=engine&jid=${encodeURIComponent(a)}`,className:"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover",onClick:()=>l(!1),children:"Engine Messages"})]})]})}function Se(){const{workflowId:t}=se();O(t);const s="Workflow Execution",{data:a,isLoading:r,error:n,refetch:l,isFetching:m}=D(t),{data:x}=K(t),{data:o}=M(t),{data:p}=F(t),h=ae(),f=U(),{isCollapsed:j,toggle:w}=z("workflow-execution"),P=d=>{var i;if(d==="terminate")confirm("Are you sure you want to terminate this workflow?")&&f.mutate(t);else if(d==="restart"&&a){const L=a.workflow_id.replace(/-[A-Za-z0-9_-]{20,}$/,""),g=a.events.find(V=>V.event_type==="workflow_execution_started"),E=(i=g==null?void 0:g.attributes)==null?void 0:i.input;E&&sessionStorage.setItem("lt:invoke:prefill",JSON.stringify(E)),h(`/workflows/start?type=${encodeURIComponent(L)}&mode=now`)}};if(r)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-60 bg-surface-sunken rounded"})]});if(n||!a){const d=(n==null?void 0:n.message)??"",i=d.includes("expired")||d.includes("no longer available");return e.jsxs("div",{children:[e.jsx(u,{to:"/workflows/executions",className:"text-xs text-text-tertiary hover:text-text-primary",children:"← Workflows"}),e.jsxs("div",{className:"mt-4 text-center py-8",children:[e.jsx("p",{className:"text-sm text-text-primary mb-1",children:i?"Execution data is no longer available":n?"Unable to load execution":"Execution not found"}),e.jsx("p",{className:"text-xs text-text-tertiary",children:i?"This workflow's underlying job has expired. The task record is preserved, but the execution timeline has been cleaned up.":d||"The workflow could not be resolved."})]})]})}const R=a.status!=="completed"&&a.status!=="failed",k=!j("side-panel"),I=a.parent_workflow_id,W=x&&x.workflow_id===a.workflow_id,y=I||(W?x.parent_workflow_id:null)||null,$=y&&y!==a.workflow_id?y:null,A=a.status==="completed"&&a.events.some(d=>{if(d.event_type!=="activity_task_completed")return!1;const i=d.attributes.activity_type;return i==="callDbTool"||i==="callVisionTool"||i==="callMcpTool"||(i==null?void 0:i.startsWith("mcp_"))});return e.jsxs("div",{className:"flex items-stretch min-w-0 -mt-10 -mr-10 -mb-16",children:[e.jsxs("div",{className:"flex-1 min-w-0 pt-10 pr-10 pb-16",children:[e.jsx(H,{title:s,actions:e.jsx("button",{onClick:()=>w("side-panel"),className:"text-text-tertiary hover:text-accent transition-colors",title:k?"Hide side panel":"Show side panel",children:k?e.jsx(Y,{className:"w-5 h-5",strokeWidth:1.5}):e.jsx(ee,{className:"w-5 h-5",strokeWidth:1.5})})}),f.error&&e.jsx("div",{className:"py-3 mb-6",children:e.jsxs("p",{className:"text-xs text-status-error",children:["Terminate failed: ",f.error.message]})}),e.jsxs("div",{className:"space-y-6",children:[e.jsx(N,{title:"Details",sectionKey:"details",isCollapsed:j("details"),onToggle:w,contentClassName:"mt-4 ml-9",children:e.jsx(de,{execution:a})}),e.jsx(N,{title:"Execution Timeline",sectionKey:"timeline",isCollapsed:j("timeline"),onToggle:w,contentClassName:"mt-4 ml-9",children:e.jsx(re,{events:a.events,childTasks:o==null?void 0:o.tasks,jid:t,appId:"durable"})}),e.jsx(N,{title:"Events",sectionKey:"events",isCollapsed:j("events"),onToggle:w,contentClassName:"mt-4 ml-9",children:e.jsx(B,{events:a.events,childTasks:o==null?void 0:o.tasks,jid:t,appId:"durable"})})]})]}),e.jsx(ie,{execution:a,parentWorkflowId:$,childTasks:(o==null?void 0:o.tasks)??[],escalations:(p==null?void 0:p.escalations)??[],headerActions:e.jsxs(e.Fragment,{children:[e.jsx(J,{onRefresh:()=>l(),isFetching:m,apiPath:`/workflow-states/${t}/execution`}),e.jsx(xe,{isRunning:R,hasToolCalls:A,workflowId:t,onAction:P})]}),open:k})]})}export{Se as WorkflowExecutionPage};
|
|
2
|
-
//# sourceMappingURL=WorkflowExecutionPage-
|
|
1
|
+
import{a as b,j as e}from"./vendor-query-B2UbickB.js";import{a as D,f as U}from"./workflows-BaSjfNsd.js";import{h as O}from"./useEventHooks-RbAigCWV.js";import{u as z,E as B}from"./EventTable-DGaRYVnB.js";import{b as K,e as M}from"./tasks-KDV3bflF.js";import{b as v,D as Q,J as T,e as F}from"./index-DpGeD89g.js";import{P as H}from"./PageHeader-Ji1AtA4f.js";import{C as N}from"./CollapsibleSection-7ACdYUZy.js";import{L as J}from"./ListToolbar-BhXp7clK.js";import{P as c,S as q,a as Z}from"./SlidePanel-BzeKveus.js";import{S as C}from"./StatusBadge-CEQMRmSQ.js";import{C as _}from"./CopyableId-uot2mE_g.js";import{ah as G,af as X,am as Y,an as ee,i as te}from"./vendor-icons-BX2Vih4L.js";import{L as u,e as se,c as ae}from"./vendor-react-CXumBFUA.js";import{S as re}from"./SwimlaneTimeline-hcWBunXb.js";import"./FilterBar-DDIn8TOs.js";import"./StreamMessageDetail-CCez20kE.js";function ne(t){const s=t.lastIndexOf("-");return s<=0?{taskQueue:t,workflowType:t}:{taskQueue:t.substring(0,s),workflowType:t.substring(s+1)}}function S({children:t}){return e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:t})}function oe({escalations:t}){return e.jsx("div",{children:t.map(s=>e.jsxs(u,{to:`/escalations/detail/${s.id}`,className:"grid grid-cols-[1fr_auto_auto] items-center gap-x-3 py-2 border-b border-surface-border/40 last:border-b-0 group",children:[e.jsxs("span",{className:"min-w-0",children:[e.jsx("span",{className:"block text-xs font-mono text-text-primary group-hover:text-accent transition-colors truncate",title:s.type,children:s.type}),e.jsx("span",{className:"block text-[10px] text-text-tertiary truncate",children:s.role})]}),e.jsx(v,{date:s.created_at,format:"relative",className:"text-[10px] text-text-tertiary whitespace-nowrap"}),e.jsx("span",{className:"w-20 flex justify-end",children:e.jsx(C,{status:s.status})})]},s.id))})}function le({tasks:t}){return e.jsx("div",{children:t.map(s=>e.jsxs(u,{to:`/workflows/tasks/detail/${s.id}`,className:"grid grid-cols-[1fr_auto_auto] items-center gap-x-3 py-2 border-b border-surface-border/40 last:border-b-0 group",children:[e.jsxs("span",{className:"min-w-0",children:[e.jsx("span",{className:"block text-xs font-mono text-text-primary group-hover:text-accent transition-colors truncate",title:s.workflow_type,children:s.workflow_type}),e.jsx("span",{className:"block text-[10px] text-text-tertiary truncate",children:s.lt_type})]}),e.jsx(v,{date:s.created_at,format:"relative",className:"text-[10px] text-text-tertiary whitespace-nowrap"}),e.jsx("span",{className:"w-20 flex justify-end",children:e.jsx(C,{status:s.status})})]},s.id))})}function ie({execution:t,parentWorkflowId:s,childTasks:a,escalations:r,headerActions:n,open:l}){const m=r.length>0||a.length>0,[x,o]=b.useState(m?"escalations":"details"),{taskQueue:p,workflowType:h}=ne(t.workflow_type),f=[{id:"details",icon:G,label:"Details",content:e.jsxs("dl",{className:"space-y-3.5",children:[e.jsx(c,{label:"Status",children:e.jsx(C,{status:t.status})}),e.jsx(c,{label:"Workflow Type",children:e.jsx(_,{bare:!0,value:h,href:`/workflows/executions?entity=${encodeURIComponent(h)}`})}),e.jsx(c,{label:"Workflow ID",children:e.jsx(_,{bare:!0,value:t.workflow_id})}),s&&e.jsx(c,{label:"Parent",children:e.jsx(_,{bare:!0,value:s,href:`/workflows/executions/${s}`})}),e.jsx(c,{label:"Task Queue",children:e.jsx("span",{className:"font-mono",children:p})}),e.jsx(c,{label:"Start Time",children:t.start_time?e.jsx(v,{date:t.start_time,format:"datetime"}):e.jsx("span",{className:"text-text-tertiary",children:"--"})}),e.jsx(c,{label:"End Time",children:t.close_time?e.jsx(v,{date:t.close_time,format:"datetime"}):e.jsx("span",{className:"text-text-tertiary",children:"--"})}),e.jsx(c,{label:"Duration",children:e.jsx(Q,{ms:t.duration_ms,className:"font-mono"})}),e.jsxs(c,{label:"History Size",children:[t.summary.total_events," events"]}),e.jsxs(c,{label:"Activities",children:[t.summary.activities.completed," / ",t.summary.activities.total]})]})},{id:"escalations",icon:X,label:"Escalations",content:e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx(S,{children:"Escalations"}),r.length>0?e.jsx(oe,{escalations:r}):e.jsx("p",{className:"text-xs text-text-tertiary italic",children:"This workflow has not escalated."})]}),a.length>0&&e.jsxs("div",{children:[e.jsx(S,{children:"Related Tasks"}),e.jsx(le,{tasks:a})]})]})}];return e.jsx(q,{open:l,width:384,className:"self-stretch",children:e.jsx("div",{className:"h-full pl-6",children:e.jsx(Z,{views:f,activeId:x,onViewChange:o,headerActions:n,stickyClassName:"sticky top-0 z-10 h-[calc(100vh-5.25rem)] pt-9"})})})}function ce(t){var r;const s=t.events.find(n=>n.event_type==="workflow_execution_started"),a=(r=s==null?void 0:s.attributes)==null?void 0:r.input;return a&&typeof a=="object"?a:null}function de({execution:t}){const s=ce(t),a=t.result,r=(a==null?void 0:a.data)??a??null;return!s&&!r?null:e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4 mb-6",children:[s!==null&&e.jsx("div",{children:e.jsx(T,{data:s,label:"Input Envelope"})}),r!==null&&e.jsx("div",{children:e.jsx(T,{data:r,label:"Result"})})]})}function xe({isRunning:t,hasToolCalls:s,workflowId:a,onAction:r}){const[n,l]=b.useState(!1),m=b.useRef(null);return b.useEffect(()=>{if(!n)return;const x=o=>{m.current&&!m.current.contains(o.target)&&l(!1)};return document.addEventListener("mousedown",x),()=>document.removeEventListener("mousedown",x)},[n]),e.jsxs("div",{className:"relative",ref:m,children:[e.jsxs("button",{onClick:()=>l(!n),className:"flex items-center gap-0.5 pl-2 pr-1 py-1 rounded-md text-[11px] font-medium text-text-tertiary hover:text-accent hover:bg-surface-hover transition-colors",title:"Actions",children:["Actions",e.jsx(te,{className:`w-3 h-3 transition-transform ${n?"rotate-180":""}`})]}),n&&e.jsxs("div",{className:"absolute right-0 mt-1 w-44 bg-surface-raised border border-surface-border rounded-md shadow-lg z-20",children:[e.jsx("button",{onClick:()=>{r("restart"),l(!1)},className:"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover",children:"Restart Workflow"}),t&&e.jsx("button",{onClick:()=>{r("terminate"),l(!1)},className:"block w-full text-left px-4 py-2 text-xs text-status-error hover:bg-surface-hover",children:"Terminate"}),s&&e.jsx(u,{to:`/mcp/queries/${a}?step=3`,className:"block w-full text-left px-4 py-2 text-xs text-accent hover:bg-surface-hover",onClick:()=>l(!1),children:"Compile into Pipeline"}),e.jsx(u,{to:`/mcp/executions/${encodeURIComponent(a)}?namespace=durable`,className:"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover",onClick:()=>l(!1),children:"View Pipeline Execution"}),e.jsx(u,{to:`/admin/streams?source=worker&jid=${encodeURIComponent(a)}`,className:"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover",onClick:()=>l(!1),children:"Worker Messages"}),e.jsx(u,{to:`/admin/streams?source=engine&jid=${encodeURIComponent(a)}`,className:"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover",onClick:()=>l(!1),children:"Engine Messages"})]})]})}function Se(){const{workflowId:t}=se();O(t);const s="Workflow Execution",{data:a,isLoading:r,error:n,refetch:l,isFetching:m}=D(t),{data:x}=K(t),{data:o}=M(t),{data:p}=F(t),h=ae(),f=U(),{isCollapsed:j,toggle:w}=z("workflow-execution"),P=d=>{var i;if(d==="terminate")confirm("Are you sure you want to terminate this workflow?")&&f.mutate(t);else if(d==="restart"&&a){const L=a.workflow_id.replace(/-[A-Za-z0-9_-]{20,}$/,""),g=a.events.find(V=>V.event_type==="workflow_execution_started"),E=(i=g==null?void 0:g.attributes)==null?void 0:i.input;E&&sessionStorage.setItem("lt:invoke:prefill",JSON.stringify(E)),h(`/workflows/start?type=${encodeURIComponent(L)}&mode=now`)}};if(r)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-60 bg-surface-sunken rounded"})]});if(n||!a){const d=(n==null?void 0:n.message)??"",i=d.includes("expired")||d.includes("no longer available");return e.jsxs("div",{children:[e.jsx(u,{to:"/workflows/executions",className:"text-xs text-text-tertiary hover:text-text-primary",children:"← Workflows"}),e.jsxs("div",{className:"mt-4 text-center py-8",children:[e.jsx("p",{className:"text-sm text-text-primary mb-1",children:i?"Execution data is no longer available":n?"Unable to load execution":"Execution not found"}),e.jsx("p",{className:"text-xs text-text-tertiary",children:i?"This workflow's underlying job has expired. The task record is preserved, but the execution timeline has been cleaned up.":d||"The workflow could not be resolved."})]})]})}const R=a.status!=="completed"&&a.status!=="failed",k=!j("side-panel"),I=a.parent_workflow_id,W=x&&x.workflow_id===a.workflow_id,y=I||(W?x.parent_workflow_id:null)||null,$=y&&y!==a.workflow_id?y:null,A=a.status==="completed"&&a.events.some(d=>{if(d.event_type!=="activity_task_completed")return!1;const i=d.attributes.activity_type;return i==="callDbTool"||i==="callVisionTool"||i==="callMcpTool"||(i==null?void 0:i.startsWith("mcp_"))});return e.jsxs("div",{className:"flex items-stretch min-w-0 -mt-10 -mr-10 -mb-16",children:[e.jsxs("div",{className:"flex-1 min-w-0 pt-10 pr-10 pb-16",children:[e.jsx(H,{title:s,actions:e.jsx("button",{onClick:()=>w("side-panel"),className:"text-text-tertiary hover:text-accent transition-colors",title:k?"Hide side panel":"Show side panel",children:k?e.jsx(Y,{className:"w-5 h-5",strokeWidth:1.5}):e.jsx(ee,{className:"w-5 h-5",strokeWidth:1.5})})}),f.error&&e.jsx("div",{className:"py-3 mb-6",children:e.jsxs("p",{className:"text-xs text-status-error",children:["Terminate failed: ",f.error.message]})}),e.jsxs("div",{className:"space-y-6",children:[e.jsx(N,{title:"Details",sectionKey:"details",isCollapsed:j("details"),onToggle:w,contentClassName:"mt-4 ml-9",children:e.jsx(de,{execution:a})}),e.jsx(N,{title:"Execution Timeline",sectionKey:"timeline",isCollapsed:j("timeline"),onToggle:w,contentClassName:"mt-4 ml-9",children:e.jsx(re,{events:a.events,childTasks:o==null?void 0:o.tasks,jid:t,appId:"durable"})}),e.jsx(N,{title:"Events",sectionKey:"events",isCollapsed:j("events"),onToggle:w,contentClassName:"mt-4 ml-9",children:e.jsx(B,{events:a.events,childTasks:o==null?void 0:o.tasks,jid:t,appId:"durable"})})]})]}),e.jsx(ie,{execution:a,parentWorkflowId:$,childTasks:(o==null?void 0:o.tasks)??[],escalations:(p==null?void 0:p.escalations)??[],headerActions:e.jsxs(e.Fragment,{children:[e.jsx(J,{onRefresh:()=>l(),isFetching:m,apiPath:`/workflow-states/${t}/execution`}),e.jsx(xe,{isRunning:R,hasToolCalls:A,workflowId:t,onAction:P})]}),open:k})]})}export{Se as WorkflowExecutionPage};
|
|
2
|
+
//# sourceMappingURL=WorkflowExecutionPage-CE0QzhIt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowExecutionPage-DrwKB2x8.js","sources":["../../src/pages/workflows/workflow-execution/ExecutionSidePanel.tsx","../../src/pages/workflows/workflow-execution/ExecutionInputResult.tsx","../../src/pages/workflows/WorkflowExecutionPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport { Info, Bell } from 'lucide-react';\nimport { SlidePanel, SlidePanelViews, PanelField, type SlidePanelView } from '../../../components/common/layout/SlidePanel';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\nimport { CopyableId } from '../../../components/common/display/CopyableId';\nimport { DateValue } from '../../../components/common/display/DateValue';\nimport { DurationValue } from '../../../components/common/display/DurationValue';\nimport type { WorkflowExecution, LTTaskRecord, LTEscalationRecord } from '../../../api/types';\n\n/**\n * Split a HotMesh compound entity key (taskQueue-workflowName) on the last '-'.\n * Workflow names are camelCase, so the last segment is always the workflow type.\n */\nfunction splitEntityKey(compound: string): { taskQueue: string; workflowType: string } {\n const lastDash = compound.lastIndexOf('-');\n if (lastDash <= 0) return { taskQueue: compound, workflowType: compound };\n return {\n taskQueue: compound.substring(0, lastDash),\n workflowType: compound.substring(lastDash + 1),\n };\n}\n\nfunction SectionLabel({ children }: { children: React.ReactNode }) {\n return (\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">\n {children}\n </p>\n );\n}\n\n/**\n * A workflow can escalate to multiple targets, and multiple times across its\n * lifecycle — each escalation is its own row: role and type on the left, the\n * status badge in a right-aligned column, so a long history reads as a table\n * instead of running on.\n */\nfunction EscalationRows({ escalations }: { escalations: LTEscalationRecord[] }) {\n return (\n <div>\n {escalations.map((esc) => (\n <Link\n key={esc.id}\n to={`/escalations/detail/${esc.id}`}\n className=\"grid grid-cols-[1fr_auto_auto] items-center gap-x-3 py-2 border-b border-surface-border/40 last:border-b-0 group\"\n >\n <span className=\"min-w-0\">\n <span className=\"block text-xs font-mono text-text-primary group-hover:text-accent transition-colors truncate\" title={esc.type}>\n {esc.type}\n </span>\n <span className=\"block text-[10px] text-text-tertiary truncate\">{esc.role}</span>\n </span>\n <DateValue date={esc.created_at} format=\"relative\" className=\"text-[10px] text-text-tertiary whitespace-nowrap\" />\n <span className=\"w-20 flex justify-end\"><StatusBadge status={esc.status} /></span>\n </Link>\n ))}\n </div>\n );\n}\n\nfunction TaskRows({ tasks }: { tasks: LTTaskRecord[] }) {\n return (\n <div>\n {tasks.map((t) => (\n <Link\n key={t.id}\n to={`/workflows/tasks/detail/${t.id}`}\n className=\"grid grid-cols-[1fr_auto_auto] items-center gap-x-3 py-2 border-b border-surface-border/40 last:border-b-0 group\"\n >\n <span className=\"min-w-0\">\n <span className=\"block text-xs font-mono text-text-primary group-hover:text-accent transition-colors truncate\" title={t.workflow_type}>\n {t.workflow_type}\n </span>\n <span className=\"block text-[10px] text-text-tertiary truncate\">{t.lt_type}</span>\n </span>\n <DateValue date={t.created_at} format=\"relative\" className=\"text-[10px] text-text-tertiary whitespace-nowrap\" />\n <span className=\"w-20 flex justify-end\"><StatusBadge status={t.status} /></span>\n </Link>\n ))}\n </div>\n );\n}\n\n/**\n * The execution detail side panel — the record's facts beside the timeline:\n *\n * Details — workflow identity, timing, and history metadata\n * Escalations — every escalation the workflow raised, plus related tasks\n */\nexport function ExecutionSidePanel({\n execution,\n parentWorkflowId,\n childTasks,\n escalations,\n headerActions,\n open,\n}: {\n execution: WorkflowExecution;\n parentWorkflowId: string | null;\n childTasks: LTTaskRecord[];\n escalations: LTEscalationRecord[];\n /** Page controls (toolbar, Actions menu) shown at the right of the icon row. */\n headerActions?: React.ReactNode;\n open: boolean;\n}) {\n const hasRelated = escalations.length > 0 || childTasks.length > 0;\n const [activeView, setActiveView] = useState(hasRelated ? 'escalations' : 'details');\n\n const { taskQueue, workflowType } = splitEntityKey(execution.workflow_type);\n\n const views: SlidePanelView[] = [\n {\n id: 'details',\n icon: Info,\n label: 'Details',\n content: (\n <dl className=\"space-y-3.5\">\n <PanelField label=\"Status\"><StatusBadge status={execution.status} /></PanelField>\n <PanelField label=\"Workflow Type\">\n <CopyableId bare value={workflowType} href={`/workflows/executions?entity=${encodeURIComponent(workflowType)}`} />\n </PanelField>\n <PanelField label=\"Workflow ID\">\n <CopyableId bare value={execution.workflow_id} />\n </PanelField>\n {parentWorkflowId && (\n <PanelField label=\"Parent\">\n <CopyableId bare value={parentWorkflowId} href={`/workflows/executions/${parentWorkflowId}`} />\n </PanelField>\n )}\n <PanelField label=\"Task Queue\"><span className=\"font-mono\">{taskQueue}</span></PanelField>\n <PanelField label=\"Start Time\">\n {execution.start_time\n ? <DateValue date={execution.start_time} format=\"datetime\" />\n : <span className=\"text-text-tertiary\">--</span>}\n </PanelField>\n <PanelField label=\"End Time\">\n {execution.close_time\n ? <DateValue date={execution.close_time} format=\"datetime\" />\n : <span className=\"text-text-tertiary\">--</span>}\n </PanelField>\n <PanelField label=\"Duration\">\n <DurationValue ms={execution.duration_ms} className=\"font-mono\" />\n </PanelField>\n <PanelField label=\"History Size\">{execution.summary.total_events} events</PanelField>\n <PanelField label=\"Activities\">\n {execution.summary.activities.completed} / {execution.summary.activities.total}\n </PanelField>\n </dl>\n ),\n },\n {\n id: 'escalations',\n icon: Bell,\n label: 'Escalations',\n content: (\n <div className=\"space-y-6\">\n <div>\n <SectionLabel>Escalations</SectionLabel>\n {escalations.length > 0\n ? <EscalationRows escalations={escalations} />\n : <p className=\"text-xs text-text-tertiary italic\">This workflow has not escalated.</p>}\n </div>\n {childTasks.length > 0 && (\n <div>\n <SectionLabel>Related Tasks</SectionLabel>\n <TaskRows tasks={childTasks} />\n </div>\n )}\n </div>\n ),\n },\n ];\n\n return (\n <SlidePanel open={open} width={384} className=\"self-stretch\">\n <div className=\"h-full pl-6\">\n <SlidePanelViews\n views={views}\n activeId={activeView}\n onViewChange={setActiveView}\n headerActions={headerActions}\n stickyClassName=\"sticky top-0 z-10 h-[calc(100vh-5.25rem)] pt-9\"\n />\n </div>\n </SlidePanel>\n );\n}\n","import { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport type { WorkflowExecution } from '../../../api/types';\n\ninterface ExecutionInputResultProps {\n execution: WorkflowExecution;\n}\n\n/**\n * Extract the workflow input envelope from the workflow_execution_started event.\n * HotMesh 0.13.0+ includes the actual trigger arguments (the envelope passed\n * to startWorkflow) in the start event's `input` attribute.\n */\nfunction extractInput(execution: WorkflowExecution): Record<string, unknown> | null {\n const startEvent = execution.events.find(\n (e) => e.event_type === 'workflow_execution_started',\n );\n const input = (startEvent?.attributes as any)?.input;\n return input && typeof input === 'object' ? input : null;\n}\n\nexport function ExecutionInputResult({ execution }: ExecutionInputResultProps) {\n const input = extractInput(execution);\n\n // Result: unwrap the workflow return — the `data` field is what LT users care about\n const rawResult = execution.result as Record<string, unknown> | null | undefined;\n const result = rawResult?.data ?? rawResult ?? null;\n\n if (!input && !result) return null;\n\n return (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-6\">\n {input !== null && (\n <div>\n <JsonViewer data={input} label=\"Input Envelope\" />\n </div>\n )}\n {result !== null && (\n <div>\n <JsonViewer data={result} label=\"Result\" />\n </div>\n )}\n </div>\n );\n}\n","import { useState, useRef, useEffect } from 'react';\nimport { useParams, useNavigate, Link } from 'react-router-dom';\nimport { useWorkflowExecution, useTerminateWorkflow } from '../../api/workflows';\nimport { useWorkflowDetailEvents } from '../../hooks/useEventHooks';\nimport { useCollapsedSections } from '../../hooks/useCollapsedSections';\nimport { useTaskByWorkflowId, useChildTasks } from '../../api/tasks';\nimport { useEscalationsByWorkflowId } from '../../api/escalations';\n\nimport { PanelRightClose, PanelRightOpen, ChevronDown } from 'lucide-react';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { CollapsibleSection } from '../../components/common/layout/CollapsibleSection';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\n\nimport { ExecutionSidePanel } from './workflow-execution/ExecutionSidePanel';\nimport { ExecutionInputResult } from './workflow-execution/ExecutionInputResult';\nimport { SwimlaneTimeline } from './workflow-execution/SwimlaneTimeline';\nimport { EventTable } from './workflow-execution/EventTable';\n\nfunction ActionsDropdown({ isRunning, hasToolCalls, workflowId, onAction }: {\n isRunning: boolean;\n hasToolCalls: boolean;\n workflowId: string;\n onAction: (action: 'restart' | 'terminate') => void;\n}) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open]);\n\n return (\n <div className=\"relative\" ref={ref}>\n <button\n onClick={() => setOpen(!open)}\n className=\"flex items-center gap-0.5 pl-2 pr-1 py-1 rounded-md text-[11px] font-medium text-text-tertiary hover:text-accent hover:bg-surface-hover transition-colors\"\n title=\"Actions\"\n >\n Actions\n <ChevronDown className={`w-3 h-3 transition-transform ${open ? 'rotate-180' : ''}`} />\n </button>\n {open && (\n <div className=\"absolute right-0 mt-1 w-44 bg-surface-raised border border-surface-border rounded-md shadow-lg z-20\">\n <button\n onClick={() => { onAction('restart'); setOpen(false); }}\n className=\"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover\"\n >\n Restart Workflow\n </button>\n {isRunning && (\n <button\n onClick={() => { onAction('terminate'); setOpen(false); }}\n className=\"block w-full text-left px-4 py-2 text-xs text-status-error hover:bg-surface-hover\"\n >\n Terminate\n </button>\n )}\n {hasToolCalls && (\n <Link\n to={`/mcp/queries/${workflowId}?step=3`}\n className=\"block w-full text-left px-4 py-2 text-xs text-accent hover:bg-surface-hover\"\n onClick={() => setOpen(false)}\n >\n Compile into Pipeline\n </Link>\n )}\n <Link\n to={`/mcp/executions/${encodeURIComponent(workflowId)}?namespace=durable`}\n className=\"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover\"\n onClick={() => setOpen(false)}\n >\n View Pipeline Execution\n </Link>\n <Link\n to={`/admin/streams?source=worker&jid=${encodeURIComponent(workflowId)}`}\n className=\"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover\"\n onClick={() => setOpen(false)}\n >\n Worker Messages\n </Link>\n <Link\n to={`/admin/streams?source=engine&jid=${encodeURIComponent(workflowId)}`}\n className=\"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover\"\n onClick={() => setOpen(false)}\n >\n Engine Messages\n </Link>\n </div>\n )}\n </div>\n );\n}\n\nexport function WorkflowExecutionPage() {\n const { workflowId } = useParams<{ workflowId: string }>();\n useWorkflowDetailEvents(workflowId);\n\n const executionTitle = 'Workflow Execution';\n const { data: execution, isLoading, error, refetch, isFetching } = useWorkflowExecution(workflowId!);\n const { data: task } = useTaskByWorkflowId(workflowId!);\n const { data: childTasksData } = useChildTasks(workflowId!);\n const { data: escalationsData } = useEscalationsByWorkflowId(workflowId);\n const navigate = useNavigate();\n const terminateMutation = useTerminateWorkflow();\n const { isCollapsed, toggle } = useCollapsedSections('workflow-execution');\n\n const handleAction = (action: 'restart' | 'terminate') => {\n if (action === 'terminate') {\n if (confirm('Are you sure you want to terminate this workflow?')) {\n terminateMutation.mutate(workflowId!);\n }\n } else if (action === 'restart' && execution) {\n // Extract entity from workflow_id (format: {entity}-{guid})\n const entity = execution.workflow_id.replace(/-[A-Za-z0-9_-]{20,}$/, '');\n // Extract original input from the started event\n const startEvent = execution.events.find((e) => e.event_type === 'workflow_execution_started');\n const input = (startEvent?.attributes as any)?.input;\n if (input) {\n sessionStorage.setItem('lt:invoke:prefill', JSON.stringify(input));\n }\n navigate(`/workflows/start?type=${encodeURIComponent(entity)}&mode=now`);\n }\n };\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-64\" />\n <div className=\"h-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (error || !execution) {\n const msg = (error as Error)?.message ?? '';\n const isExpired = msg.includes('expired') || msg.includes('no longer available');\n\n return (\n <div>\n <Link to=\"/workflows/executions\" className=\"text-xs text-text-tertiary hover:text-text-primary\">\n ← Workflows\n </Link>\n <div className=\"mt-4 text-center py-8\">\n <p className=\"text-sm text-text-primary mb-1\">\n {isExpired\n ? 'Execution data is no longer available'\n : error\n ? 'Unable to load execution'\n : 'Execution not found'}\n </p>\n <p className=\"text-xs text-text-tertiary\">\n {isExpired\n ? \"This workflow's underlying job has expired. The task record is preserved, but the execution timeline has been cleaned up.\"\n : msg || 'The workflow could not be resolved.'}\n </p>\n </div>\n </div>\n );\n }\n\n const isRunning = execution.status !== 'completed' && execution.status !== 'failed';\n const sidePanelOpen = !isCollapsed('side-panel');\n\n // Parent relationship — prefer execution-level pj (from HotMesh raw state),\n // fall back to lt_tasks record. Self-references filtered (cron-invoked\n // workflows store themselves as parent).\n const executionParent = (execution as any).parent_workflow_id as string | undefined;\n const isLeaf = task && task.workflow_id === execution.workflow_id;\n const rawParent = executionParent || (isLeaf ? task.parent_workflow_id : null) || null;\n const parentWorkflowId = rawParent && rawParent !== execution.workflow_id ? rawParent : null;\n const hasToolCalls = execution.status === 'completed' && execution.events.some(\n (e) => {\n if (e.event_type !== 'activity_task_completed') return false;\n const actType = (e.attributes as any).activity_type;\n return actType === 'callDbTool' || actType === 'callVisionTool' || actType === 'callMcpTool' || actType?.startsWith('mcp_');\n },\n );\n\n return (\n // Master flow beside a full-height panel: the left column page-scrolls\n // like any detail page; the panel spans the middle row with its own\n // sticky viewport. Negative margins let the panel bleed to the page edge;\n // the left column re-adds those gutters.\n <div className=\"flex items-stretch min-w-0 -mt-10 -mr-10 -mb-16\">\n <div className=\"flex-1 min-w-0 pt-10 pr-10 pb-16\">\n {/* The main header stays quiet: title + the panel toggle. Status, the\n toolbar, and the Actions menu all live in the panel. */}\n <PageHeader\n title={executionTitle}\n actions={\n <button\n onClick={() => toggle('side-panel')}\n className=\"text-text-tertiary hover:text-accent transition-colors\"\n title={sidePanelOpen ? 'Hide side panel' : 'Show side panel'}\n >\n {sidePanelOpen\n ? <PanelRightClose className=\"w-5 h-5\" strokeWidth={1.5} />\n : <PanelRightOpen className=\"w-5 h-5\" strokeWidth={1.5} />}\n </button>\n }\n />\n\n {terminateMutation.error && (\n <div className=\"py-3 mb-6\">\n <p className=\"text-xs text-status-error\">\n Terminate failed: {terminateMutation.error.message}\n </p>\n </div>\n )}\n\n\n <div className=\"space-y-6\">\n <CollapsibleSection title=\"Details\" sectionKey=\"details\" isCollapsed={isCollapsed('details')} onToggle={toggle} contentClassName=\"mt-4 ml-9\">\n <ExecutionInputResult execution={execution} />\n </CollapsibleSection>\n\n <CollapsibleSection title=\"Execution Timeline\" sectionKey=\"timeline\" isCollapsed={isCollapsed('timeline')} onToggle={toggle} contentClassName=\"mt-4 ml-9\">\n <SwimlaneTimeline\n events={execution.events}\n childTasks={childTasksData?.tasks}\n jid={workflowId}\n appId=\"durable\"\n />\n </CollapsibleSection>\n\n <CollapsibleSection title=\"Events\" sectionKey=\"events\" isCollapsed={isCollapsed('events')} onToggle={toggle} contentClassName=\"mt-4 ml-9\">\n <EventTable\n events={execution.events}\n childTasks={childTasksData?.tasks}\n jid={workflowId}\n appId=\"durable\"\n />\n </CollapsibleSection>\n </div>\n </div>\n\n <ExecutionSidePanel\n execution={execution}\n parentWorkflowId={parentWorkflowId}\n childTasks={childTasksData?.tasks ?? []}\n escalations={escalationsData?.escalations ?? []}\n headerActions={\n <>\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/workflow-states/${workflowId}/execution`}\n />\n <ActionsDropdown\n isRunning={isRunning}\n hasToolCalls={hasToolCalls}\n workflowId={workflowId!}\n onAction={handleAction}\n />\n </>\n }\n open={sidePanelOpen}\n />\n </div>\n );\n}\n"],"names":["splitEntityKey","compound","lastDash","SectionLabel","children","jsx","EscalationRows","escalations","esc","jsxs","Link","DateValue","StatusBadge","TaskRows","tasks","t","ExecutionSidePanel","execution","parentWorkflowId","childTasks","headerActions","open","hasRelated","activeView","setActiveView","useState","taskQueue","workflowType","views","Info","PanelField","CopyableId","DurationValue","Bell","SlidePanel","SlidePanelViews","extractInput","startEvent","e","input","_a","ExecutionInputResult","rawResult","result","JsonViewer","ActionsDropdown","isRunning","hasToolCalls","workflowId","onAction","setOpen","ref","useRef","useEffect","handler","ChevronDown","WorkflowExecutionPage","useParams","useWorkflowDetailEvents","executionTitle","isLoading","error","refetch","isFetching","useWorkflowExecution","task","useTaskByWorkflowId","childTasksData","useChildTasks","escalationsData","useEscalationsByWorkflowId","navigate","useNavigate","terminateMutation","useTerminateWorkflow","isCollapsed","toggle","useCollapsedSections","handleAction","action","entity","msg","isExpired","sidePanelOpen","executionParent","isLeaf","rawParent","actType","PageHeader","PanelRightClose","PanelRightOpen","CollapsibleSection","SwimlaneTimeline","EventTable","Fragment","ListToolbar"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WorkflowExecutionPage-CE0QzhIt.js","sources":["../../src/pages/workflows/workflow-execution/ExecutionSidePanel.tsx","../../src/pages/workflows/workflow-execution/ExecutionInputResult.tsx","../../src/pages/workflows/WorkflowExecutionPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport { Info, Bell } from 'lucide-react';\nimport { SlidePanel, SlidePanelViews, PanelField, type SlidePanelView } from '../../../components/common/layout/SlidePanel';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\nimport { CopyableId } from '../../../components/common/display/CopyableId';\nimport { DateValue } from '../../../components/common/display/DateValue';\nimport { DurationValue } from '../../../components/common/display/DurationValue';\nimport type { WorkflowExecution, LTTaskRecord, LTEscalationRecord } from '../../../api/types';\n\n/**\n * Split a HotMesh compound entity key (taskQueue-workflowName) on the last '-'.\n * Workflow names are camelCase, so the last segment is always the workflow type.\n */\nfunction splitEntityKey(compound: string): { taskQueue: string; workflowType: string } {\n const lastDash = compound.lastIndexOf('-');\n if (lastDash <= 0) return { taskQueue: compound, workflowType: compound };\n return {\n taskQueue: compound.substring(0, lastDash),\n workflowType: compound.substring(lastDash + 1),\n };\n}\n\nfunction SectionLabel({ children }: { children: React.ReactNode }) {\n return (\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">\n {children}\n </p>\n );\n}\n\n/**\n * A workflow can escalate to multiple targets, and multiple times across its\n * lifecycle — each escalation is its own row: role and type on the left, the\n * status badge in a right-aligned column, so a long history reads as a table\n * instead of running on.\n */\nfunction EscalationRows({ escalations }: { escalations: LTEscalationRecord[] }) {\n return (\n <div>\n {escalations.map((esc) => (\n <Link\n key={esc.id}\n to={`/escalations/detail/${esc.id}`}\n className=\"grid grid-cols-[1fr_auto_auto] items-center gap-x-3 py-2 border-b border-surface-border/40 last:border-b-0 group\"\n >\n <span className=\"min-w-0\">\n <span className=\"block text-xs font-mono text-text-primary group-hover:text-accent transition-colors truncate\" title={esc.type}>\n {esc.type}\n </span>\n <span className=\"block text-[10px] text-text-tertiary truncate\">{esc.role}</span>\n </span>\n <DateValue date={esc.created_at} format=\"relative\" className=\"text-[10px] text-text-tertiary whitespace-nowrap\" />\n <span className=\"w-20 flex justify-end\"><StatusBadge status={esc.status} /></span>\n </Link>\n ))}\n </div>\n );\n}\n\nfunction TaskRows({ tasks }: { tasks: LTTaskRecord[] }) {\n return (\n <div>\n {tasks.map((t) => (\n <Link\n key={t.id}\n to={`/workflows/tasks/detail/${t.id}`}\n className=\"grid grid-cols-[1fr_auto_auto] items-center gap-x-3 py-2 border-b border-surface-border/40 last:border-b-0 group\"\n >\n <span className=\"min-w-0\">\n <span className=\"block text-xs font-mono text-text-primary group-hover:text-accent transition-colors truncate\" title={t.workflow_type}>\n {t.workflow_type}\n </span>\n <span className=\"block text-[10px] text-text-tertiary truncate\">{t.lt_type}</span>\n </span>\n <DateValue date={t.created_at} format=\"relative\" className=\"text-[10px] text-text-tertiary whitespace-nowrap\" />\n <span className=\"w-20 flex justify-end\"><StatusBadge status={t.status} /></span>\n </Link>\n ))}\n </div>\n );\n}\n\n/**\n * The execution detail side panel — the record's facts beside the timeline:\n *\n * Details — workflow identity, timing, and history metadata\n * Escalations — every escalation the workflow raised, plus related tasks\n */\nexport function ExecutionSidePanel({\n execution,\n parentWorkflowId,\n childTasks,\n escalations,\n headerActions,\n open,\n}: {\n execution: WorkflowExecution;\n parentWorkflowId: string | null;\n childTasks: LTTaskRecord[];\n escalations: LTEscalationRecord[];\n /** Page controls (toolbar, Actions menu) shown at the right of the icon row. */\n headerActions?: React.ReactNode;\n open: boolean;\n}) {\n const hasRelated = escalations.length > 0 || childTasks.length > 0;\n const [activeView, setActiveView] = useState(hasRelated ? 'escalations' : 'details');\n\n const { taskQueue, workflowType } = splitEntityKey(execution.workflow_type);\n\n const views: SlidePanelView[] = [\n {\n id: 'details',\n icon: Info,\n label: 'Details',\n content: (\n <dl className=\"space-y-3.5\">\n <PanelField label=\"Status\"><StatusBadge status={execution.status} /></PanelField>\n <PanelField label=\"Workflow Type\">\n <CopyableId bare value={workflowType} href={`/workflows/executions?entity=${encodeURIComponent(workflowType)}`} />\n </PanelField>\n <PanelField label=\"Workflow ID\">\n <CopyableId bare value={execution.workflow_id} />\n </PanelField>\n {parentWorkflowId && (\n <PanelField label=\"Parent\">\n <CopyableId bare value={parentWorkflowId} href={`/workflows/executions/${parentWorkflowId}`} />\n </PanelField>\n )}\n <PanelField label=\"Task Queue\"><span className=\"font-mono\">{taskQueue}</span></PanelField>\n <PanelField label=\"Start Time\">\n {execution.start_time\n ? <DateValue date={execution.start_time} format=\"datetime\" />\n : <span className=\"text-text-tertiary\">--</span>}\n </PanelField>\n <PanelField label=\"End Time\">\n {execution.close_time\n ? <DateValue date={execution.close_time} format=\"datetime\" />\n : <span className=\"text-text-tertiary\">--</span>}\n </PanelField>\n <PanelField label=\"Duration\">\n <DurationValue ms={execution.duration_ms} className=\"font-mono\" />\n </PanelField>\n <PanelField label=\"History Size\">{execution.summary.total_events} events</PanelField>\n <PanelField label=\"Activities\">\n {execution.summary.activities.completed} / {execution.summary.activities.total}\n </PanelField>\n </dl>\n ),\n },\n {\n id: 'escalations',\n icon: Bell,\n label: 'Escalations',\n content: (\n <div className=\"space-y-6\">\n <div>\n <SectionLabel>Escalations</SectionLabel>\n {escalations.length > 0\n ? <EscalationRows escalations={escalations} />\n : <p className=\"text-xs text-text-tertiary italic\">This workflow has not escalated.</p>}\n </div>\n {childTasks.length > 0 && (\n <div>\n <SectionLabel>Related Tasks</SectionLabel>\n <TaskRows tasks={childTasks} />\n </div>\n )}\n </div>\n ),\n },\n ];\n\n return (\n <SlidePanel open={open} width={384} className=\"self-stretch\">\n <div className=\"h-full pl-6\">\n <SlidePanelViews\n views={views}\n activeId={activeView}\n onViewChange={setActiveView}\n headerActions={headerActions}\n stickyClassName=\"sticky top-0 z-10 h-[calc(100vh-5.25rem)] pt-9\"\n />\n </div>\n </SlidePanel>\n );\n}\n","import { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport type { WorkflowExecution } from '../../../api/types';\n\ninterface ExecutionInputResultProps {\n execution: WorkflowExecution;\n}\n\n/**\n * Extract the workflow input envelope from the workflow_execution_started event.\n * HotMesh 0.13.0+ includes the actual trigger arguments (the envelope passed\n * to startWorkflow) in the start event's `input` attribute.\n */\nfunction extractInput(execution: WorkflowExecution): Record<string, unknown> | null {\n const startEvent = execution.events.find(\n (e) => e.event_type === 'workflow_execution_started',\n );\n const input = (startEvent?.attributes as any)?.input;\n return input && typeof input === 'object' ? input : null;\n}\n\nexport function ExecutionInputResult({ execution }: ExecutionInputResultProps) {\n const input = extractInput(execution);\n\n // Result: unwrap the workflow return — the `data` field is what LT users care about\n const rawResult = execution.result as Record<string, unknown> | null | undefined;\n const result = rawResult?.data ?? rawResult ?? null;\n\n if (!input && !result) return null;\n\n return (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-6\">\n {input !== null && (\n <div>\n <JsonViewer data={input} label=\"Input Envelope\" />\n </div>\n )}\n {result !== null && (\n <div>\n <JsonViewer data={result} label=\"Result\" />\n </div>\n )}\n </div>\n );\n}\n","import { useState, useRef, useEffect } from 'react';\nimport { useParams, useNavigate, Link } from 'react-router-dom';\nimport { useWorkflowExecution, useTerminateWorkflow } from '../../api/workflows';\nimport { useWorkflowDetailEvents } from '../../hooks/useEventHooks';\nimport { useCollapsedSections } from '../../hooks/useCollapsedSections';\nimport { useTaskByWorkflowId, useChildTasks } from '../../api/tasks';\nimport { useEscalationsByWorkflowId } from '../../api/escalations';\n\nimport { PanelRightClose, PanelRightOpen, ChevronDown } from 'lucide-react';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { CollapsibleSection } from '../../components/common/layout/CollapsibleSection';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\n\nimport { ExecutionSidePanel } from './workflow-execution/ExecutionSidePanel';\nimport { ExecutionInputResult } from './workflow-execution/ExecutionInputResult';\nimport { SwimlaneTimeline } from './workflow-execution/SwimlaneTimeline';\nimport { EventTable } from './workflow-execution/EventTable';\n\nfunction ActionsDropdown({ isRunning, hasToolCalls, workflowId, onAction }: {\n isRunning: boolean;\n hasToolCalls: boolean;\n workflowId: string;\n onAction: (action: 'restart' | 'terminate') => void;\n}) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open]);\n\n return (\n <div className=\"relative\" ref={ref}>\n <button\n onClick={() => setOpen(!open)}\n className=\"flex items-center gap-0.5 pl-2 pr-1 py-1 rounded-md text-[11px] font-medium text-text-tertiary hover:text-accent hover:bg-surface-hover transition-colors\"\n title=\"Actions\"\n >\n Actions\n <ChevronDown className={`w-3 h-3 transition-transform ${open ? 'rotate-180' : ''}`} />\n </button>\n {open && (\n <div className=\"absolute right-0 mt-1 w-44 bg-surface-raised border border-surface-border rounded-md shadow-lg z-20\">\n <button\n onClick={() => { onAction('restart'); setOpen(false); }}\n className=\"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover\"\n >\n Restart Workflow\n </button>\n {isRunning && (\n <button\n onClick={() => { onAction('terminate'); setOpen(false); }}\n className=\"block w-full text-left px-4 py-2 text-xs text-status-error hover:bg-surface-hover\"\n >\n Terminate\n </button>\n )}\n {hasToolCalls && (\n <Link\n to={`/mcp/queries/${workflowId}?step=3`}\n className=\"block w-full text-left px-4 py-2 text-xs text-accent hover:bg-surface-hover\"\n onClick={() => setOpen(false)}\n >\n Compile into Pipeline\n </Link>\n )}\n <Link\n to={`/mcp/executions/${encodeURIComponent(workflowId)}?namespace=durable`}\n className=\"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover\"\n onClick={() => setOpen(false)}\n >\n View Pipeline Execution\n </Link>\n <Link\n to={`/admin/streams?source=worker&jid=${encodeURIComponent(workflowId)}`}\n className=\"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover\"\n onClick={() => setOpen(false)}\n >\n Worker Messages\n </Link>\n <Link\n to={`/admin/streams?source=engine&jid=${encodeURIComponent(workflowId)}`}\n className=\"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover\"\n onClick={() => setOpen(false)}\n >\n Engine Messages\n </Link>\n </div>\n )}\n </div>\n );\n}\n\nexport function WorkflowExecutionPage() {\n const { workflowId } = useParams<{ workflowId: string }>();\n useWorkflowDetailEvents(workflowId);\n\n const executionTitle = 'Workflow Execution';\n const { data: execution, isLoading, error, refetch, isFetching } = useWorkflowExecution(workflowId!);\n const { data: task } = useTaskByWorkflowId(workflowId!);\n const { data: childTasksData } = useChildTasks(workflowId!);\n const { data: escalationsData } = useEscalationsByWorkflowId(workflowId);\n const navigate = useNavigate();\n const terminateMutation = useTerminateWorkflow();\n const { isCollapsed, toggle } = useCollapsedSections('workflow-execution');\n\n const handleAction = (action: 'restart' | 'terminate') => {\n if (action === 'terminate') {\n if (confirm('Are you sure you want to terminate this workflow?')) {\n terminateMutation.mutate(workflowId!);\n }\n } else if (action === 'restart' && execution) {\n // Extract entity from workflow_id (format: {entity}-{guid})\n const entity = execution.workflow_id.replace(/-[A-Za-z0-9_-]{20,}$/, '');\n // Extract original input from the started event\n const startEvent = execution.events.find((e) => e.event_type === 'workflow_execution_started');\n const input = (startEvent?.attributes as any)?.input;\n if (input) {\n sessionStorage.setItem('lt:invoke:prefill', JSON.stringify(input));\n }\n navigate(`/workflows/start?type=${encodeURIComponent(entity)}&mode=now`);\n }\n };\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-64\" />\n <div className=\"h-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (error || !execution) {\n const msg = (error as Error)?.message ?? '';\n const isExpired = msg.includes('expired') || msg.includes('no longer available');\n\n return (\n <div>\n <Link to=\"/workflows/executions\" className=\"text-xs text-text-tertiary hover:text-text-primary\">\n ← Workflows\n </Link>\n <div className=\"mt-4 text-center py-8\">\n <p className=\"text-sm text-text-primary mb-1\">\n {isExpired\n ? 'Execution data is no longer available'\n : error\n ? 'Unable to load execution'\n : 'Execution not found'}\n </p>\n <p className=\"text-xs text-text-tertiary\">\n {isExpired\n ? \"This workflow's underlying job has expired. The task record is preserved, but the execution timeline has been cleaned up.\"\n : msg || 'The workflow could not be resolved.'}\n </p>\n </div>\n </div>\n );\n }\n\n const isRunning = execution.status !== 'completed' && execution.status !== 'failed';\n const sidePanelOpen = !isCollapsed('side-panel');\n\n // Parent relationship — prefer execution-level pj (from HotMesh raw state),\n // fall back to lt_tasks record. Self-references filtered (cron-invoked\n // workflows store themselves as parent).\n const executionParent = (execution as any).parent_workflow_id as string | undefined;\n const isLeaf = task && task.workflow_id === execution.workflow_id;\n const rawParent = executionParent || (isLeaf ? task.parent_workflow_id : null) || null;\n const parentWorkflowId = rawParent && rawParent !== execution.workflow_id ? rawParent : null;\n const hasToolCalls = execution.status === 'completed' && execution.events.some(\n (e) => {\n if (e.event_type !== 'activity_task_completed') return false;\n const actType = (e.attributes as any).activity_type;\n return actType === 'callDbTool' || actType === 'callVisionTool' || actType === 'callMcpTool' || actType?.startsWith('mcp_');\n },\n );\n\n return (\n // Master flow beside a full-height panel: the left column page-scrolls\n // like any detail page; the panel spans the middle row with its own\n // sticky viewport. Negative margins let the panel bleed to the page edge;\n // the left column re-adds those gutters.\n <div className=\"flex items-stretch min-w-0 -mt-10 -mr-10 -mb-16\">\n <div className=\"flex-1 min-w-0 pt-10 pr-10 pb-16\">\n {/* The main header stays quiet: title + the panel toggle. Status, the\n toolbar, and the Actions menu all live in the panel. */}\n <PageHeader\n title={executionTitle}\n actions={\n <button\n onClick={() => toggle('side-panel')}\n className=\"text-text-tertiary hover:text-accent transition-colors\"\n title={sidePanelOpen ? 'Hide side panel' : 'Show side panel'}\n >\n {sidePanelOpen\n ? <PanelRightClose className=\"w-5 h-5\" strokeWidth={1.5} />\n : <PanelRightOpen className=\"w-5 h-5\" strokeWidth={1.5} />}\n </button>\n }\n />\n\n {terminateMutation.error && (\n <div className=\"py-3 mb-6\">\n <p className=\"text-xs text-status-error\">\n Terminate failed: {terminateMutation.error.message}\n </p>\n </div>\n )}\n\n\n <div className=\"space-y-6\">\n <CollapsibleSection title=\"Details\" sectionKey=\"details\" isCollapsed={isCollapsed('details')} onToggle={toggle} contentClassName=\"mt-4 ml-9\">\n <ExecutionInputResult execution={execution} />\n </CollapsibleSection>\n\n <CollapsibleSection title=\"Execution Timeline\" sectionKey=\"timeline\" isCollapsed={isCollapsed('timeline')} onToggle={toggle} contentClassName=\"mt-4 ml-9\">\n <SwimlaneTimeline\n events={execution.events}\n childTasks={childTasksData?.tasks}\n jid={workflowId}\n appId=\"durable\"\n />\n </CollapsibleSection>\n\n <CollapsibleSection title=\"Events\" sectionKey=\"events\" isCollapsed={isCollapsed('events')} onToggle={toggle} contentClassName=\"mt-4 ml-9\">\n <EventTable\n events={execution.events}\n childTasks={childTasksData?.tasks}\n jid={workflowId}\n appId=\"durable\"\n />\n </CollapsibleSection>\n </div>\n </div>\n\n <ExecutionSidePanel\n execution={execution}\n parentWorkflowId={parentWorkflowId}\n childTasks={childTasksData?.tasks ?? []}\n escalations={escalationsData?.escalations ?? []}\n headerActions={\n <>\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/workflow-states/${workflowId}/execution`}\n />\n <ActionsDropdown\n isRunning={isRunning}\n hasToolCalls={hasToolCalls}\n workflowId={workflowId!}\n onAction={handleAction}\n />\n </>\n }\n open={sidePanelOpen}\n />\n </div>\n );\n}\n"],"names":["splitEntityKey","compound","lastDash","SectionLabel","children","jsx","EscalationRows","escalations","esc","jsxs","Link","DateValue","StatusBadge","TaskRows","tasks","t","ExecutionSidePanel","execution","parentWorkflowId","childTasks","headerActions","open","hasRelated","activeView","setActiveView","useState","taskQueue","workflowType","views","Info","PanelField","CopyableId","DurationValue","Bell","SlidePanel","SlidePanelViews","extractInput","startEvent","e","input","_a","ExecutionInputResult","rawResult","result","JsonViewer","ActionsDropdown","isRunning","hasToolCalls","workflowId","onAction","setOpen","ref","useRef","useEffect","handler","ChevronDown","WorkflowExecutionPage","useParams","useWorkflowDetailEvents","executionTitle","isLoading","error","refetch","isFetching","useWorkflowExecution","task","useTaskByWorkflowId","childTasksData","useChildTasks","escalationsData","useEscalationsByWorkflowId","navigate","useNavigate","terminateMutation","useTerminateWorkflow","isCollapsed","toggle","useCollapsedSections","handleAction","action","entity","msg","isExpired","sidePanelOpen","executionParent","isLeaf","rawParent","actType","PageHeader","PanelRightClose","PanelRightOpen","CollapsibleSection","SwimlaneTimeline","EventTable","Fragment","ListToolbar"],"mappings":"62BAcA,SAASA,GAAeC,EAA+D,CACrF,MAAMC,EAAWD,EAAS,YAAY,GAAG,EACzC,OAAIC,GAAY,EAAU,CAAE,UAAWD,EAAU,aAAcA,CAAA,EACxD,CACL,UAAWA,EAAS,UAAU,EAAGC,CAAQ,EACzC,aAAcD,EAAS,UAAUC,EAAW,CAAC,CAAA,CAEjD,CAEA,SAASC,EAAa,CAAE,SAAAC,GAA2C,CACjE,OACEC,EAAAA,IAAC,IAAA,CAAE,UAAU,8EACV,SAAAD,CAAA,CACH,CAEJ,CAQA,SAASE,GAAe,CAAE,YAAAC,GAAsD,CAC9E,OACEF,EAAAA,IAAC,MAAA,CACE,SAAAE,EAAY,IAAKC,GAChBC,EAAAA,KAACC,EAAA,CAEC,GAAI,uBAAuBF,EAAI,EAAE,GACjC,UAAU,mHAEV,SAAA,CAAAC,EAAAA,KAAC,OAAA,CAAK,UAAU,UACd,SAAA,CAAAJ,EAAAA,IAAC,QAAK,UAAU,+FAA+F,MAAOG,EAAI,KACvH,WAAI,IAAA,CACP,EACAH,EAAAA,IAAC,OAAA,CAAK,UAAU,gDAAiD,WAAI,IAAA,CAAK,CAAA,EAC5E,EACAA,MAACM,GAAU,KAAMH,EAAI,WAAY,OAAO,WAAW,UAAU,mDAAmD,EAChHH,EAAAA,IAAC,QAAK,UAAU,wBAAwB,eAACO,EAAA,CAAY,OAAQJ,EAAI,MAAA,CAAQ,CAAA,CAAE,CAAA,CAAA,EAXtEA,EAAI,EAAA,CAaZ,EACH,CAEJ,CAEA,SAASK,GAAS,CAAE,MAAAC,GAAoC,CACtD,OACET,EAAAA,IAAC,MAAA,CACE,SAAAS,EAAM,IAAKC,GACVN,EAAAA,KAACC,EAAA,CAEC,GAAI,2BAA2BK,EAAE,EAAE,GACnC,UAAU,mHAEV,SAAA,CAAAN,EAAAA,KAAC,OAAA,CAAK,UAAU,UACd,SAAA,CAAAJ,EAAAA,IAAC,QAAK,UAAU,+FAA+F,MAAOU,EAAE,cACrH,WAAE,aAAA,CACL,EACAV,EAAAA,IAAC,OAAA,CAAK,UAAU,gDAAiD,WAAE,OAAA,CAAQ,CAAA,EAC7E,EACAA,MAACM,GAAU,KAAMI,EAAE,WAAY,OAAO,WAAW,UAAU,mDAAmD,EAC9GV,EAAAA,IAAC,QAAK,UAAU,wBAAwB,eAACO,EAAA,CAAY,OAAQG,EAAE,MAAA,CAAQ,CAAA,CAAE,CAAA,CAAA,EAXpEA,EAAE,EAAA,CAaV,EACH,CAEJ,CAQO,SAASC,GAAmB,CACjC,UAAAC,EACA,iBAAAC,EACA,WAAAC,EACA,YAAAZ,EACA,cAAAa,EACA,KAAAC,CACF,EAQG,CACD,MAAMC,EAAaf,EAAY,OAAS,GAAKY,EAAW,OAAS,EAC3D,CAACI,EAAYC,CAAa,EAAIC,EAAAA,SAASH,EAAa,cAAgB,SAAS,EAE7E,CAAE,UAAAI,EAAW,aAAAC,CAAA,EAAiB3B,GAAeiB,EAAU,aAAa,EAEpEW,EAA0B,CAC9B,CACE,GAAI,UACJ,KAAMC,EACN,MAAO,UACP,QACEpB,EAAAA,KAAC,KAAA,CAAG,UAAU,cACZ,SAAA,CAAAJ,EAAAA,IAACyB,EAAA,CAAW,MAAM,SAAS,SAAAzB,EAAAA,IAACO,GAAY,OAAQK,EAAU,OAAQ,CAAA,CAAE,QACnEa,EAAA,CAAW,MAAM,gBAChB,SAAAzB,EAAAA,IAAC0B,GAAW,KAAI,GAAC,MAAOJ,EAAc,KAAM,gCAAgC,mBAAmBA,CAAY,CAAC,GAAI,EAClH,EACAtB,EAAAA,IAACyB,EAAA,CAAW,MAAM,cAChB,SAAAzB,EAAAA,IAAC0B,EAAA,CAAW,KAAI,GAAC,MAAOd,EAAU,WAAA,CAAa,CAAA,CACjD,EACCC,GACCb,EAAAA,IAACyB,EAAA,CAAW,MAAM,SAChB,SAAAzB,EAAAA,IAAC0B,EAAA,CAAW,KAAI,GAAC,MAAOb,EAAkB,KAAM,yBAAyBA,CAAgB,GAAI,EAC/F,EAEFb,EAAAA,IAACyB,GAAW,MAAM,aAAa,eAAC,OAAA,CAAK,UAAU,YAAa,SAAAJ,CAAA,CAAU,CAAA,CAAO,QAC5EI,EAAA,CAAW,MAAM,aACf,SAAAb,EAAU,iBACNN,EAAA,CAAU,KAAMM,EAAU,WAAY,OAAO,WAAW,EACzDZ,EAAAA,IAAC,QAAK,UAAU,qBAAqB,cAAE,CAAA,CAC7C,QACCyB,EAAA,CAAW,MAAM,WACf,SAAAb,EAAU,iBACNN,EAAA,CAAU,KAAMM,EAAU,WAAY,OAAO,WAAW,EACzDZ,EAAAA,IAAC,QAAK,UAAU,qBAAqB,cAAE,CAAA,CAC7C,EACAA,EAAAA,IAACyB,EAAA,CAAW,MAAM,WAChB,SAAAzB,EAAAA,IAAC2B,EAAA,CAAc,GAAIf,EAAU,YAAa,UAAU,WAAA,CAAY,CAAA,CAClE,EACAR,EAAAA,KAACqB,EAAA,CAAW,MAAM,eAAgB,SAAA,CAAAb,EAAU,QAAQ,aAAa,SAAA,EAAO,EACxER,EAAAA,KAACqB,EAAA,CAAW,MAAM,aACf,SAAA,CAAAb,EAAU,QAAQ,WAAW,UAAU,MAAIA,EAAU,QAAQ,WAAW,KAAA,CAAA,CAC3E,CAAA,CAAA,CACF,CAAA,EAGJ,CACE,GAAI,cACJ,KAAMgB,EACN,MAAO,cACP,QACExB,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAJ,EAAAA,IAACF,GAAa,SAAA,aAAA,CAAW,EACxBI,EAAY,OAAS,EAClBF,EAAAA,IAACC,GAAA,CAAe,YAAAC,CAAA,CAA0B,EAC1CF,EAAAA,IAAC,IAAA,CAAE,UAAU,oCAAoC,SAAA,kCAAA,CAAgC,CAAA,EACvF,EACCc,EAAW,OAAS,GACnBV,EAAAA,KAAC,MAAA,CACC,SAAA,CAAAJ,EAAAA,IAACF,GAAa,SAAA,eAAA,CAAa,EAC3BE,EAAAA,IAACQ,GAAA,CAAS,MAAOM,CAAA,CAAY,CAAA,CAAA,CAC/B,CAAA,CAAA,CAEJ,CAAA,CAEJ,EAGF,OACEd,EAAAA,IAAC6B,EAAA,CAAW,KAAAb,EAAY,MAAO,IAAK,UAAU,eAC5C,SAAAhB,EAAAA,IAAC,MAAA,CAAI,UAAU,cACb,SAAAA,EAAAA,IAAC8B,EAAA,CACC,MAAAP,EACA,SAAUL,EACV,aAAcC,EACd,cAAAJ,EACA,gBAAgB,gDAAA,CAAA,EAEpB,CAAA,CACF,CAEJ,CC9KA,SAASgB,GAAanB,EAA8D,OAClF,MAAMoB,EAAapB,EAAU,OAAO,KACjCqB,GAAMA,EAAE,aAAe,4BAAA,EAEpBC,GAASC,EAAAH,GAAA,YAAAA,EAAY,aAAZ,YAAAG,EAAgC,MAC/C,OAAOD,GAAS,OAAOA,GAAU,SAAWA,EAAQ,IACtD,CAEO,SAASE,GAAqB,CAAE,UAAAxB,GAAwC,CAC7E,MAAMsB,EAAQH,GAAanB,CAAS,EAG9ByB,EAAYzB,EAAU,OACtB0B,GAASD,GAAA,YAAAA,EAAW,OAAQA,GAAa,KAE/C,MAAI,CAACH,GAAS,CAACI,EAAe,KAG5BlC,EAAAA,KAAC,MAAA,CAAI,UAAU,6CACZ,SAAA,CAAA8B,IAAU,YACR,MAAA,CACC,SAAAlC,EAAAA,IAACuC,GAAW,KAAML,EAAO,MAAM,gBAAA,CAAiB,CAAA,CAClD,EAEDI,IAAW,MACVtC,EAAAA,IAAC,MAAA,CACC,SAAAA,EAAAA,IAACuC,GAAW,KAAMD,EAAQ,MAAM,QAAA,CAAS,CAAA,CAC3C,CAAA,EAEJ,CAEJ,CCzBA,SAASE,GAAgB,CAAE,UAAAC,EAAW,aAAAC,EAAc,WAAAC,EAAY,SAAAC,GAK7D,CACD,KAAM,CAAC5B,EAAM6B,CAAO,EAAIzB,EAAAA,SAAS,EAAK,EAChC0B,EAAMC,EAAAA,OAAuB,IAAI,EAEvCC,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,CAAChC,EAAM,OACX,MAAMiC,EAAWhB,GAAkB,CAC7Ba,EAAI,SAAW,CAACA,EAAI,QAAQ,SAASb,EAAE,MAAc,GAAGY,EAAQ,EAAK,CAC3E,EACA,gBAAS,iBAAiB,YAAaI,CAAO,EACvC,IAAM,SAAS,oBAAoB,YAAaA,CAAO,CAChE,EAAG,CAACjC,CAAI,CAAC,EAGPZ,EAAAA,KAAC,MAAA,CAAI,UAAU,WAAW,IAAA0C,EACxB,SAAA,CAAA1C,EAAAA,KAAC,SAAA,CACC,QAAS,IAAMyC,EAAQ,CAAC7B,CAAI,EAC5B,UAAU,4JACV,MAAM,UACP,SAAA,CAAA,gBAEEkC,GAAA,CAAY,UAAW,gCAAgClC,EAAO,aAAe,EAAE,EAAA,CAAI,CAAA,CAAA,CAAA,EAErFA,GACCZ,EAAAA,KAAC,MAAA,CAAI,UAAU,sGACb,SAAA,CAAAJ,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM,CAAE4C,EAAS,SAAS,EAAGC,EAAQ,EAAK,CAAG,EACtD,UAAU,sFACX,SAAA,kBAAA,CAAA,EAGAJ,GACCzC,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM,CAAE4C,EAAS,WAAW,EAAGC,EAAQ,EAAK,CAAG,EACxD,UAAU,oFACX,SAAA,WAAA,CAAA,EAIFH,GACC1C,EAAAA,IAACK,EAAA,CACC,GAAI,gBAAgBsC,CAAU,UAC9B,UAAU,8EACV,QAAS,IAAME,EAAQ,EAAK,EAC7B,SAAA,uBAAA,CAAA,EAIH7C,EAAAA,IAACK,EAAA,CACC,GAAI,mBAAmB,mBAAmBsC,CAAU,CAAC,qBACrD,UAAU,sFACV,QAAS,IAAME,EAAQ,EAAK,EAC7B,SAAA,yBAAA,CAAA,EAGD7C,EAAAA,IAACK,EAAA,CACC,GAAI,oCAAoC,mBAAmBsC,CAAU,CAAC,GACtE,UAAU,sFACV,QAAS,IAAME,EAAQ,EAAK,EAC7B,SAAA,iBAAA,CAAA,EAGD7C,EAAAA,IAACK,EAAA,CACC,GAAI,oCAAoC,mBAAmBsC,CAAU,CAAC,GACtE,UAAU,sFACV,QAAS,IAAME,EAAQ,EAAK,EAC7B,SAAA,iBAAA,CAAA,CAED,CAAA,CACF,CAAA,EAEJ,CAEJ,CAEO,SAASM,IAAwB,CACtC,KAAM,CAAE,WAAAR,CAAA,EAAeS,GAAA,EACvBC,EAAwBV,CAAU,EAElC,MAAMW,EAAiB,qBACjB,CAAE,KAAM1C,EAAW,UAAA2C,EAAW,MAAAC,EAAO,QAAAC,EAAS,WAAAC,CAAA,EAAeC,EAAqBhB,CAAW,EAC7F,CAAE,KAAMiB,GAASC,EAAoBlB,CAAW,EAChD,CAAE,KAAMmB,GAAmBC,EAAcpB,CAAW,EACpD,CAAE,KAAMqB,GAAoBC,EAA2BtB,CAAU,EACjEuB,EAAWC,GAAA,EACXC,EAAoBC,EAAA,EACpB,CAAE,YAAAC,EAAa,OAAAC,GAAWC,EAAqB,oBAAoB,EAEnEC,EAAgBC,GAAoC,OACxD,GAAIA,IAAW,YACT,QAAQ,mDAAmD,GAC7DN,EAAkB,OAAOzB,CAAW,UAE7B+B,IAAW,WAAa9D,EAAW,CAE5C,MAAM+D,EAAS/D,EAAU,YAAY,QAAQ,uBAAwB,EAAE,EAEjEoB,EAAapB,EAAU,OAAO,KAAMqB,GAAMA,EAAE,aAAe,4BAA4B,EACvFC,GAASC,EAAAH,GAAA,YAAAA,EAAY,aAAZ,YAAAG,EAAgC,MAC3CD,GACF,eAAe,QAAQ,oBAAqB,KAAK,UAAUA,CAAK,CAAC,EAEnEgC,EAAS,yBAAyB,mBAAmBS,CAAM,CAAC,WAAW,CACzE,CACF,EAEA,GAAIpB,EACF,OACEnD,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAJ,EAAAA,IAAC,MAAA,CAAI,UAAU,oCAAA,CAAqC,EACpDA,EAAAA,IAAC,MAAA,CAAI,UAAU,gCAAA,CAAiC,CAAA,EAClD,EAIJ,GAAIwD,GAAS,CAAC5C,EAAW,CACvB,MAAMgE,GAAOpB,GAAA,YAAAA,EAAiB,UAAW,GACnCqB,EAAYD,EAAI,SAAS,SAAS,GAAKA,EAAI,SAAS,qBAAqB,EAE/E,cACG,MAAA,CACC,SAAA,CAAA5E,MAACK,EAAA,CAAK,GAAG,wBAAwB,UAAU,qDAAqD,SAAA,cAEhG,EACAD,EAAAA,KAAC,MAAA,CAAI,UAAU,wBACb,SAAA,CAAAJ,EAAAA,IAAC,KAAE,UAAU,iCACV,WACG,wCACAwD,EACE,2BACA,qBAAA,CACR,QACC,IAAA,CAAE,UAAU,6BACV,SAAAqB,EACG,4HACAD,GAAO,qCAAA,CACb,CAAA,CAAA,CACF,CAAA,EACF,CAEJ,CAEA,MAAMnC,EAAY7B,EAAU,SAAW,aAAeA,EAAU,SAAW,SACrEkE,EAAgB,CAACR,EAAY,YAAY,EAKzCS,EAAmBnE,EAAkB,mBACrCoE,EAASpB,GAAQA,EAAK,cAAgBhD,EAAU,YAChDqE,EAAYF,IAAoBC,EAASpB,EAAK,mBAAqB,OAAS,KAC5E/C,EAAmBoE,GAAaA,IAAcrE,EAAU,YAAcqE,EAAY,KAClFvC,EAAe9B,EAAU,SAAW,aAAeA,EAAU,OAAO,KACvEqB,GAAM,CACL,GAAIA,EAAE,aAAe,0BAA2B,MAAO,GACvD,MAAMiD,EAAWjD,EAAE,WAAmB,cACtC,OAAOiD,IAAY,cAAgBA,IAAY,kBAAoBA,IAAY,gBAAiBA,GAAA,YAAAA,EAAS,WAAW,QACtH,CAAA,EAGF,OAKE9E,EAAAA,KAAC,MAAA,CAAI,UAAU,kDACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,mCAGb,SAAA,CAAAJ,EAAAA,IAACmF,EAAA,CACC,MAAO7B,EACP,QACEtD,EAAAA,IAAC,SAAA,CACC,QAAS,IAAMuE,EAAO,YAAY,EAClC,UAAU,yDACV,MAAOO,EAAgB,kBAAoB,kBAE1C,SAAAA,EACG9E,EAAAA,IAACoF,EAAA,CAAgB,UAAU,UAAU,YAAa,GAAA,CAAK,EACvDpF,EAAAA,IAACqF,GAAA,CAAe,UAAU,UAAU,YAAa,GAAA,CAAK,CAAA,CAAA,CAC5D,CAAA,EAIHjB,EAAkB,OACjBpE,EAAAA,IAAC,MAAA,CAAI,UAAU,YACb,SAAAI,EAAAA,KAAC,IAAA,CAAE,UAAU,4BAA4B,SAAA,CAAA,qBACpBgE,EAAkB,MAAM,OAAA,CAAA,CAC7C,CAAA,CACF,EAIFhE,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAJ,MAACsF,GAAmB,MAAM,UAAU,WAAW,UAAU,YAAahB,EAAY,SAAS,EAAG,SAAUC,EAAQ,iBAAiB,YAC/H,SAAAvE,EAAAA,IAACoC,GAAA,CAAqB,UAAAxB,EAAsB,EAC9C,EAEAZ,EAAAA,IAACsF,EAAA,CAAmB,MAAM,qBAAqB,WAAW,WAAW,YAAahB,EAAY,UAAU,EAAG,SAAUC,EAAQ,iBAAiB,YAC5I,SAAAvE,EAAAA,IAACuF,GAAA,CACC,OAAQ3E,EAAU,OAClB,WAAYkD,GAAA,YAAAA,EAAgB,MAC5B,IAAKnB,EACL,MAAM,SAAA,CAAA,EAEV,EAEA3C,EAAAA,IAACsF,EAAA,CAAmB,MAAM,SAAS,WAAW,SAAS,YAAahB,EAAY,QAAQ,EAAG,SAAUC,EAAQ,iBAAiB,YAC5H,SAAAvE,EAAAA,IAACwF,EAAA,CACC,OAAQ5E,EAAU,OAClB,WAAYkD,GAAA,YAAAA,EAAgB,MAC5B,IAAKnB,EACL,MAAM,SAAA,CAAA,CACR,CACF,CAAA,CAAA,CACF,CAAA,EACF,EAEA3C,EAAAA,IAACW,GAAA,CACC,UAAAC,EACA,iBAAAC,EACA,YAAYiD,GAAA,YAAAA,EAAgB,QAAS,CAAA,EACrC,aAAaE,GAAA,YAAAA,EAAiB,cAAe,CAAA,EAC7C,cACE5D,EAAAA,KAAAqF,WAAA,CACE,SAAA,CAAAzF,EAAAA,IAAC0F,EAAA,CACC,UAAW,IAAMjC,EAAA,EACjB,WAAAC,EACA,QAAS,oBAAoBf,CAAU,YAAA,CAAA,EAEzC3C,EAAAA,IAACwC,GAAA,CACC,UAAAC,EACA,aAAAC,EACA,WAAAC,EACA,SAAU8B,CAAA,CAAA,CACZ,EACF,EAEF,KAAMK,CAAA,CAAA,CACR,CAAA,CACF,CAEJ"}
|
package/dashboard/dist/assets/{WorkflowsDashboard-DEq9fkhl.js → WorkflowsDashboard-wgWRZOnB.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as d,j as t}from"./vendor-query-B2UbickB.js";import{E as z}from"./ElapsedCell-
|
|
2
|
-
//# sourceMappingURL=WorkflowsDashboard-
|
|
1
|
+
import{a as d,j as t}from"./vendor-query-B2UbickB.js";import{E as z}from"./ElapsedCell-rRiChKDm.js";import{l as A,b as v}from"./index-DpGeD89g.js";import{u as E,d as $,b as L}from"./workflows-BaSjfNsd.js";import{u as M}from"./useNamespace-ChDZWKAd.js";import{b as I}from"./useEventHooks-RbAigCWV.js";import{u as U}from"./useFilterParams-x-Dg0Vgz.js";import{b as O}from"./api-path-u2Jf9QXS.js";import{D as B}from"./DataTable-Byn3oyT9.js";import{W as H}from"./WorkflowPill-BXmmLR0t.js";import{P as V}from"./PageHeader-Ji1AtA4f.js";import{F as G,c as f,b as x}from"./FilterBar-DDIn8TOs.js";import{S as J}from"./StickyPagination-BwXLmDc-.js";import{L as q}from"./ListToolbar-BhXp7clK.js";import{R as K,a as k}from"./RowActions-BA9L9djf.js";import{u as Q,y as X}from"./vendor-icons-BX2Vih4L.js";import{c as Y}from"./vendor-react-CXumBFUA.js";import"./controlplane-ZJtfQopv.js";import"./EmptyState-BcsfPq9T.js";const Z={running:"in_progress",completed:"completed",failed:"failed"},ee={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"},te={running:"text-status-active",completed:"text-status-success",failed:"text-status-error"};function se(p,n,m,l,a){return[{key:"workflow_id",label:"Workflow ID",render:e=>{const o=ee[Z[e.status]??e.status]??"bg-status-pending",r=e.status==="running"?" animate-pulse":"";return t.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[t.jsx("span",{className:`w-1.5 h-1.5 shrink-0 rounded-full dot-ring ${o}${r}`,title:e.status}),t.jsx("span",{className:"font-mono text-xs text-text-primary truncate",children:e.workflow_id})]})}},{key:"entity",label:"Type",render:e=>t.jsx(H,{type:e.entity,variant:a.get(e.entity)??"durable",size:"xs"}),className:"w-44 shrink-0"},{key:"created_at",label:"Created",render:e=>t.jsx(v,{date:e.created_at,format:"relative",className:"text-xs text-text-secondary whitespace-nowrap"}),className:"w-32",sortable:!0},{key:"updated_at",label:"Updated",render:e=>t.jsx(v,{date:e.updated_at,format:"relative",className:"text-xs text-text-secondary whitespace-nowrap"}),className:"w-32",sortable:!0},{key:"duration",label:"Duration",render:e=>t.jsx(z,{startDate:e.created_at,endDate:e.status==="running"?null:e.updated_at,isLive:e.status==="running"}),className:"w-28"},{key:"actions",label:"",render:e=>t.jsxs(K,{children:[t.jsx(k,{icon:Q,title:`Filter by ${e.entity}`,onClick:()=>p(e.entity)}),t.jsx("button",{onClick:o=>{o.stopPropagation(),n(e.status)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity",title:`Filter by ${e.status}`,children:t.jsx("svg",{className:`w-[18px] h-[18px] ${te[e.status]??"text-text-tertiary"} hover:opacity-70`,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,children:t.jsx("circle",{cx:"12",cy:"12",r:"6"})})}),m&&t.jsx(k,{icon:X,title:"View config",onClick:()=>l(`/workflows/registry/${encodeURIComponent(e.entity)}`)})]}),className:"w-24 text-right"}]}function ke({tier:p="all"}){I();const n=Y(),{isSuperAdmin:m}=A(),{namespace:l}=M(),{filters:a,setFilter:e,pagination:o,sort:r,setSort:j}=U({filters:{search:"",entity:"",status:"",tier:p}}),c=a.tier||"all",g=c==="certified"?"true":c==="durable"?"false":void 0,{data:b}=E(),{data:y}=$(),S=d.useMemo(()=>{const s=new Map;for(const w of y??[])s.set(w.workflow_type,w.tier??"durable");return s},[y]),_=se(s=>e("entity",s),s=>e("status",s),m,n,S),[u,C]=d.useState(a.search);d.useEffect(()=>{if(u===a.search)return;const s=setTimeout(()=>e("search",u),300);return()=>clearTimeout(s)},[u,e,a.search]);const{data:i,isLoading:N,refetch:P,isFetching:T}=L({limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:r.sort_by||"created_at",order:r.order||"desc",registered:g,namespace:l||void 0}),h=(i==null?void 0:i.total)??0,F=(i==null?void 0:i.jobs)??[],D=d.useMemo(()=>[...new Set((b??[]).map(s=>s.workflow_type))].sort(),[b]),R="Workflow Executions",W=c==="certified"?"No certified workflow executions found":c==="durable"?"No durable workflow executions found":"No workflow executions found";return t.jsxs("div",{children:[t.jsx(V,{title:R,docsHash:"#docs:dashboard.md:procedural-executions"}),t.jsxs(G,{actions:t.jsx(q,{onRefresh:()=>P(),isFetching:T,apiPath:O("/workflow-states/jobs",{limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:r.sort_by||"created_at",order:r.order||"desc",registered:g,namespace:l||void 0})}),children:[t.jsx("input",{type:"text",placeholder:"Search workflow ID...",value:u,onChange:s=>C(s.target.value),className:"input text-[11px] py-1 px-2 w-56"}),t.jsx(f,{}),t.jsx(x,{label:"Type",value:a.entity,onChange:s=>e("entity",s),options:D.map(s=>({value:s,label:s}))}),t.jsx(f,{}),t.jsx(x,{label:"Status",value:a.status,onChange:s=>e("status",s),options:[{value:"running",label:"Running"},{value:"completed",label:"Completed"},{value:"failed",label:"Failed"}]}),t.jsx(f,{}),t.jsx(x,{label:"Tier",value:a.tier==="all"?"":a.tier,onChange:s=>e("tier",s||"all"),options:[{value:"certified",label:"Certified"},{value:"durable",label:"Durable"}]})]}),t.jsx(B,{columns:_,data:F,keyFn:s=>s.workflow_id,onRowClick:s=>n(`/workflows/executions/${s.workflow_id}`),isLoading:N,emptyMessage:W,sort:r,onSort:j}),t.jsx(J,{page:o.page,totalPages:o.totalPages(h),onPageChange:o.setPage,total:h,pageSize:o.pageSize,onPageSizeChange:o.setPageSize})]})}export{ke as WorkflowsDashboard};
|
|
2
|
+
//# sourceMappingURL=WorkflowsDashboard-wgWRZOnB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowsDashboard-DEq9fkhl.js","sources":["../../src/pages/workflows/WorkflowsDashboard.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Filter, Settings } from 'lucide-react';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { useJobs, useWorkflowConfigs, useDiscoveredWorkflows } from '../../api/workflows';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useNamespace } from '../../hooks/useNamespace';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { buildApiPath } from '../../lib/api-path';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect, FilterDivider } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport type { LTJob, WorkflowTier } from '../../api/types';\n\nexport type ExecutionsTier = 'all' | 'certified' | 'durable';\n\nconst jobStatusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\nconst STATUS_DOT: Record<string, string> = {\n in_progress: 'bg-status-active',\n completed: 'bg-status-success',\n failed: 'bg-status-error',\n};\n\nconst STATUS_COLORS: Record<string, string> = {\n running: 'text-status-active',\n completed: 'text-status-success',\n failed: 'text-status-error',\n};\n\nfunction buildColumns(\n onFilterEntity: (entity: string) => void,\n onFilterStatus: (status: string) => void,\n isSuperAdmin: boolean,\n navigate: (path: string) => void,\n tierMap: Map<string, WorkflowTier>,\n): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Workflow ID',\n render: (row) => {\n const dotClass = STATUS_DOT[jobStatusMap[row.status] ?? row.status] ?? 'bg-status-pending';\n const pulseClass = row.status === 'running' ? ' animate-pulse' : '';\n return (\n <div className=\"flex items-center gap-2 min-w-0\">\n <span className={`w-1.5 h-1.5 shrink-0 rounded-full dot-ring ${dotClass}${pulseClass}`} title={row.status} />\n <span className=\"font-mono text-xs text-text-primary truncate\">{row.workflow_id}</span>\n </div>\n );\n },\n },\n {\n key: 'entity',\n label: 'Type',\n render: (row) => <WorkflowPill type={row.entity} variant={tierMap.get(row.entity) ?? 'durable'} size=\"xs\" />,\n className: 'w-44 shrink-0',\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <DateValue date={row.created_at} format=\"relative\" className=\"text-xs text-text-secondary whitespace-nowrap\" />,\n className: 'w-32',\n sortable: true,\n },\n {\n key: 'updated_at',\n label: 'Updated',\n render: (row) => <DateValue date={row.updated_at} format=\"relative\" className=\"text-xs text-text-secondary whitespace-nowrap\" />,\n className: 'w-32',\n sortable: true,\n },\n {\n key: 'duration',\n label: 'Duration',\n render: (row) => (\n <ElapsedCell\n startDate={row.created_at}\n endDate={row.status === 'running' ? null : row.updated_at}\n isLive={row.status === 'running'}\n />\n ),\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Filter}\n title={`Filter by ${row.entity}`}\n onClick={() => onFilterEntity(row.entity)}\n />\n <button\n onClick={(e) => { e.stopPropagation(); onFilterStatus(row.status); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity\"\n title={`Filter by ${row.status}`}\n >\n <svg className={`w-[18px] h-[18px] ${STATUS_COLORS[row.status] ?? 'text-text-tertiary'} hover:opacity-70`} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5}>\n <circle cx=\"12\" cy=\"12\" r=\"6\" />\n </svg>\n </button>\n {isSuperAdmin && (\n <RowAction\n icon={Settings}\n title=\"View config\"\n onClick={() => navigate(`/workflows/registry/${encodeURIComponent(row.entity)}`)}\n />\n )}\n </RowActionGroup>\n ),\n className: 'w-24 text-right',\n },\n ];\n}\n\nexport function WorkflowsDashboard({ tier: initialTier = 'all' }: { tier?: ExecutionsTier }) {\n useWorkflowListEvents();\n const navigate = useNavigate();\n const { isSuperAdmin } = useAuth();\n const { namespace } = useNamespace();\n\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', entity: '', status: '', tier: initialTier },\n });\n\n const activeTier = (filters.tier || 'all') as ExecutionsTier;\n\n // Map tier to server-side registered filter\n const registeredFilter = activeTier === 'certified' ? 'true'\n : activeTier === 'durable' ? 'false'\n : undefined;\n\n const { data: configs } = useWorkflowConfigs();\n const { data: discoveredData } = useDiscoveredWorkflows();\n\n const tierMap = useMemo(() => {\n const map = new Map<string, WorkflowTier>();\n for (const dw of discoveredData ?? []) {\n map.set(dw.workflow_type, dw.tier ?? 'durable');\n }\n return map;\n }, [discoveredData]);\n\n const columns = buildColumns(\n (entity) => setFilter('entity', entity),\n (status) => setFilter('status', status),\n isSuperAdmin,\n navigate,\n tierMap,\n );\n const [searchInput, setSearchInput] = useState(filters.search);\n\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const { data: jobsData, isLoading, refetch, isFetching } = useJobs({\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n search: filters.search || undefined,\n status: filters.status || undefined,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n registered: registeredFilter,\n namespace: namespace || undefined,\n });\n\n const total = jobsData?.total ?? 0;\n const jobs = jobsData?.jobs ?? [];\n\n const entities = useMemo(() => {\n return [...new Set((configs ?? []).map((c) => c.workflow_type))].sort();\n }, [configs]);\n\n const pageTitle = 'Workflow Executions';\n\n const emptyMessage = activeTier === 'certified'\n ? 'No certified workflow executions found'\n : activeTier === 'durable'\n ? 'No durable workflow executions found'\n : 'No workflow executions found';\n\n return (\n <div>\n <PageHeader title={pageTitle} docsHash=\"#docs:dashboard.md:procedural-executions\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={buildApiPath('/workflow-states/jobs', {\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n search: filters.search || undefined,\n status: filters.status || undefined,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n registered: registeredFilter,\n namespace: namespace || undefined,\n })}\n />\n }>\n <input\n type=\"text\"\n placeholder=\"Search workflow ID...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-[11px] py-1 px-2 w-56\"\n />\n <FilterDivider />\n <FilterSelect\n label=\"Type\"\n value={filters.entity}\n onChange={(v) => setFilter('entity', v)}\n options={entities.map((e) => ({ value: e, label: e }))}\n />\n <FilterDivider />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'running', label: 'Running' },\n { value: 'completed', label: 'Completed' },\n { value: 'failed', label: 'Failed' },\n ]}\n />\n <FilterDivider />\n <FilterSelect\n label=\"Tier\"\n value={filters.tier === 'all' ? '' : filters.tier}\n onChange={(v) => setFilter('tier', v || 'all')}\n options={[\n { value: 'certified', label: 'Certified' },\n { value: 'durable', label: 'Durable' },\n ]}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/workflows/executions/${row.workflow_id}`)}\n isLoading={isLoading}\n emptyMessage={emptyMessage}\n sort={sort}\n onSort={setSort}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n );\n}\n"],"names":["jobStatusMap","STATUS_DOT","STATUS_COLORS","buildColumns","onFilterEntity","onFilterStatus","isSuperAdmin","navigate","tierMap","row","dotClass","pulseClass","jsxs","jsx","WorkflowPill","DateValue","ElapsedCell","RowActionGroup","RowAction","Filter","e","Settings","WorkflowsDashboard","initialTier","useWorkflowListEvents","useNavigate","useAuth","namespace","useNamespace","filters","setFilter","pagination","sort","setSort","useFilterParams","activeTier","registeredFilter","configs","useWorkflowConfigs","discoveredData","useDiscoveredWorkflows","useMemo","map","dw","columns","entity","status","searchInput","setSearchInput","useState","useEffect","timer","jobsData","isLoading","refetch","isFetching","useJobs","total","jobs","entities","c","pageTitle","emptyMessage","PageHeader","FilterBar","ListToolbar","buildApiPath","FilterDivider","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WorkflowsDashboard-wgWRZOnB.js","sources":["../../src/pages/workflows/WorkflowsDashboard.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Filter, Settings } from 'lucide-react';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { useJobs, useWorkflowConfigs, useDiscoveredWorkflows } from '../../api/workflows';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useNamespace } from '../../hooks/useNamespace';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { buildApiPath } from '../../lib/api-path';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect, FilterDivider } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport type { LTJob, WorkflowTier } from '../../api/types';\n\nexport type ExecutionsTier = 'all' | 'certified' | 'durable';\n\nconst jobStatusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\nconst STATUS_DOT: Record<string, string> = {\n in_progress: 'bg-status-active',\n completed: 'bg-status-success',\n failed: 'bg-status-error',\n};\n\nconst STATUS_COLORS: Record<string, string> = {\n running: 'text-status-active',\n completed: 'text-status-success',\n failed: 'text-status-error',\n};\n\nfunction buildColumns(\n onFilterEntity: (entity: string) => void,\n onFilterStatus: (status: string) => void,\n isSuperAdmin: boolean,\n navigate: (path: string) => void,\n tierMap: Map<string, WorkflowTier>,\n): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Workflow ID',\n render: (row) => {\n const dotClass = STATUS_DOT[jobStatusMap[row.status] ?? row.status] ?? 'bg-status-pending';\n const pulseClass = row.status === 'running' ? ' animate-pulse' : '';\n return (\n <div className=\"flex items-center gap-2 min-w-0\">\n <span className={`w-1.5 h-1.5 shrink-0 rounded-full dot-ring ${dotClass}${pulseClass}`} title={row.status} />\n <span className=\"font-mono text-xs text-text-primary truncate\">{row.workflow_id}</span>\n </div>\n );\n },\n },\n {\n key: 'entity',\n label: 'Type',\n render: (row) => <WorkflowPill type={row.entity} variant={tierMap.get(row.entity) ?? 'durable'} size=\"xs\" />,\n className: 'w-44 shrink-0',\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <DateValue date={row.created_at} format=\"relative\" className=\"text-xs text-text-secondary whitespace-nowrap\" />,\n className: 'w-32',\n sortable: true,\n },\n {\n key: 'updated_at',\n label: 'Updated',\n render: (row) => <DateValue date={row.updated_at} format=\"relative\" className=\"text-xs text-text-secondary whitespace-nowrap\" />,\n className: 'w-32',\n sortable: true,\n },\n {\n key: 'duration',\n label: 'Duration',\n render: (row) => (\n <ElapsedCell\n startDate={row.created_at}\n endDate={row.status === 'running' ? null : row.updated_at}\n isLive={row.status === 'running'}\n />\n ),\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Filter}\n title={`Filter by ${row.entity}`}\n onClick={() => onFilterEntity(row.entity)}\n />\n <button\n onClick={(e) => { e.stopPropagation(); onFilterStatus(row.status); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity\"\n title={`Filter by ${row.status}`}\n >\n <svg className={`w-[18px] h-[18px] ${STATUS_COLORS[row.status] ?? 'text-text-tertiary'} hover:opacity-70`} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5}>\n <circle cx=\"12\" cy=\"12\" r=\"6\" />\n </svg>\n </button>\n {isSuperAdmin && (\n <RowAction\n icon={Settings}\n title=\"View config\"\n onClick={() => navigate(`/workflows/registry/${encodeURIComponent(row.entity)}`)}\n />\n )}\n </RowActionGroup>\n ),\n className: 'w-24 text-right',\n },\n ];\n}\n\nexport function WorkflowsDashboard({ tier: initialTier = 'all' }: { tier?: ExecutionsTier }) {\n useWorkflowListEvents();\n const navigate = useNavigate();\n const { isSuperAdmin } = useAuth();\n const { namespace } = useNamespace();\n\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', entity: '', status: '', tier: initialTier },\n });\n\n const activeTier = (filters.tier || 'all') as ExecutionsTier;\n\n // Map tier to server-side registered filter\n const registeredFilter = activeTier === 'certified' ? 'true'\n : activeTier === 'durable' ? 'false'\n : undefined;\n\n const { data: configs } = useWorkflowConfigs();\n const { data: discoveredData } = useDiscoveredWorkflows();\n\n const tierMap = useMemo(() => {\n const map = new Map<string, WorkflowTier>();\n for (const dw of discoveredData ?? []) {\n map.set(dw.workflow_type, dw.tier ?? 'durable');\n }\n return map;\n }, [discoveredData]);\n\n const columns = buildColumns(\n (entity) => setFilter('entity', entity),\n (status) => setFilter('status', status),\n isSuperAdmin,\n navigate,\n tierMap,\n );\n const [searchInput, setSearchInput] = useState(filters.search);\n\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const { data: jobsData, isLoading, refetch, isFetching } = useJobs({\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n search: filters.search || undefined,\n status: filters.status || undefined,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n registered: registeredFilter,\n namespace: namespace || undefined,\n });\n\n const total = jobsData?.total ?? 0;\n const jobs = jobsData?.jobs ?? [];\n\n const entities = useMemo(() => {\n return [...new Set((configs ?? []).map((c) => c.workflow_type))].sort();\n }, [configs]);\n\n const pageTitle = 'Workflow Executions';\n\n const emptyMessage = activeTier === 'certified'\n ? 'No certified workflow executions found'\n : activeTier === 'durable'\n ? 'No durable workflow executions found'\n : 'No workflow executions found';\n\n return (\n <div>\n <PageHeader title={pageTitle} docsHash=\"#docs:dashboard.md:procedural-executions\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={buildApiPath('/workflow-states/jobs', {\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n search: filters.search || undefined,\n status: filters.status || undefined,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n registered: registeredFilter,\n namespace: namespace || undefined,\n })}\n />\n }>\n <input\n type=\"text\"\n placeholder=\"Search workflow ID...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-[11px] py-1 px-2 w-56\"\n />\n <FilterDivider />\n <FilterSelect\n label=\"Type\"\n value={filters.entity}\n onChange={(v) => setFilter('entity', v)}\n options={entities.map((e) => ({ value: e, label: e }))}\n />\n <FilterDivider />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'running', label: 'Running' },\n { value: 'completed', label: 'Completed' },\n { value: 'failed', label: 'Failed' },\n ]}\n />\n <FilterDivider />\n <FilterSelect\n label=\"Tier\"\n value={filters.tier === 'all' ? '' : filters.tier}\n onChange={(v) => setFilter('tier', v || 'all')}\n options={[\n { value: 'certified', label: 'Certified' },\n { value: 'durable', label: 'Durable' },\n ]}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/workflows/executions/${row.workflow_id}`)}\n isLoading={isLoading}\n emptyMessage={emptyMessage}\n sort={sort}\n onSort={setSort}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n );\n}\n"],"names":["jobStatusMap","STATUS_DOT","STATUS_COLORS","buildColumns","onFilterEntity","onFilterStatus","isSuperAdmin","navigate","tierMap","row","dotClass","pulseClass","jsxs","jsx","WorkflowPill","DateValue","ElapsedCell","RowActionGroup","RowAction","Filter","e","Settings","WorkflowsDashboard","initialTier","useWorkflowListEvents","useNavigate","useAuth","namespace","useNamespace","filters","setFilter","pagination","sort","setSort","useFilterParams","activeTier","registeredFilter","configs","useWorkflowConfigs","discoveredData","useDiscoveredWorkflows","useMemo","map","dw","columns","entity","status","searchInput","setSearchInput","useState","useEffect","timer","jobsData","isLoading","refetch","isFetching","useJobs","total","jobs","entities","c","pageTitle","emptyMessage","PageHeader","FilterBar","ListToolbar","buildApiPath","FilterDivider","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
|
package/dashboard/dist/assets/{WorkflowsOverview-l-0KYP7Y.js → WorkflowsOverview-CLyitES7.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as x,j as t}from"./vendor-query-B2UbickB.js";import{b as C,u as k}from"./workflows-
|
|
2
|
-
//# sourceMappingURL=WorkflowsOverview-
|
|
1
|
+
import{a as x,j as t}from"./vendor-query-B2UbickB.js";import{b as C,u as k}from"./workflows-BaSjfNsd.js";import{b as $}from"./useEventHooks-RbAigCWV.js";import{P as D}from"./PageHeader-Ji1AtA4f.js";import{S as h}from"./StatCard-DrdlUeQz.js";import{c as w}from"./vendor-react-CXumBFUA.js";import"./index-DpGeD89g.js";import"./vendor-icons-BX2Vih4L.js";const v=[{label:"1h",ms:36e5},{label:"24h",ms:864e5},{label:"7d",ms:6048e5},{label:"30d",ms:2592e6}];function T(r){return r<1e3?`${Math.round(r)}ms`:r<6e4?`${(r/1e3).toFixed(1)}s`:r<36e5?`${(r/6e4).toFixed(1)}m`:`${(r/36e5).toFixed(1)}h`}function p({value:r,colorClass:o,onClick:f}){return r===0?t.jsx("span",{className:"text-text-tertiary",children:"0"}):t.jsx("button",{onClick:f,className:`${o} hover:underline tabular-nums font-medium`,children:r})}function _(){$();const r=w(),[o,f]=x.useState("24h"),{data:c}=C({limit:500}),{data:g}=k(),b=x.useMemo(()=>{const e=v.find(i=>i.label===o);return Date.now()-e.ms},[o]),n=x.useMemo(()=>((c==null?void 0:c.jobs)??[]).filter(e=>new Date(e.created_at).getTime()>=b),[c==null?void 0:c.jobs,b]),j=x.useMemo(()=>{const e=new Map;for(const a of n){const s=e.get(a.entity)??{total:0,running:0,completed:0,failed:0,durations:[]};if(s.total++,a.status==="running"&&s.running++,a.status==="completed"){s.completed++;const m=new Date(a.updated_at).getTime()-new Date(a.created_at).getTime();m>0&&s.durations.push(m)}a.status==="failed"&&s.failed++,e.set(a.entity,s)}const i=[];for(const[a,s]of e)i.push({type:a,...s,avgDuration:s.durations.length>0?s.durations.reduce((m,N)=>m+N,0)/s.durations.length:null});return i.sort((a,s)=>s.total-a.total)},[n]),u=x.useMemo(()=>({total:n.length,running:n.filter(e=>e.status==="running").length,completed:n.filter(e=>e.status==="completed").length,failed:n.filter(e=>e.status==="failed").length}),[n]),y=(g==null?void 0:g.length)??0,l=(e,i)=>{const a=new URLSearchParams;e&&a.set("entity",e),i&&a.set("status",i);const s=a.toString();r(`/workflows/executions${s?`?${s}`:""}`)},d="pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary";return t.jsxs("div",{children:[t.jsx(D,{title:"Workflows",actions:t.jsxs("span",{className:"text-xs text-text-tertiary",children:[y," certified type",y!==1?"s":""]})}),t.jsx("div",{className:"flex items-center gap-1 mb-6",children:v.map(e=>t.jsx("button",{onClick:()=>f(e.label),className:`px-3 py-1 text-xs rounded-full transition-colors ${o===e.label?"bg-accent text-text-inverse":"text-text-tertiary hover:text-text-primary hover:bg-surface-hover"}`,children:e.label},e.label))}),t.jsxs("div",{className:"grid grid-cols-4 gap-4 mb-8",children:[t.jsx(h,{label:"Total",value:u.total,onClick:()=>l()}),t.jsx(h,{label:"Running",value:u.running,colorClass:"text-status-active",onClick:()=>l(void 0,"running")}),t.jsx(h,{label:"Completed",value:u.completed,colorClass:"text-status-success",onClick:()=>l(void 0,"completed")}),t.jsx(h,{label:"Failed",value:u.failed,colorClass:"text-status-error",onClick:()=>l(void 0,"failed")})]}),j.length>0&&t.jsxs("table",{className:"w-full text-left",children:[t.jsx("thead",{children:t.jsxs("tr",{className:"border-b border-surface-border",children:[t.jsx("th",{className:d,children:"Type"}),t.jsx("th",{className:`${d} text-right w-20`,children:"Total"}),t.jsx("th",{className:`${d} text-right w-20`,children:"Running"}),t.jsx("th",{className:`${d} text-right w-24`,children:"Completed"}),t.jsx("th",{className:`${d} text-right w-20`,children:"Failed"}),t.jsx("th",{className:`${d} text-right w-28`,children:"Avg Duration"})]})}),t.jsx("tbody",{children:j.map(e=>t.jsxs("tr",{className:"border-b border-surface-border last:border-b-0",children:[t.jsx("td",{className:"py-3 text-sm font-mono text-text-primary",children:t.jsx("button",{onClick:()=>l(e.type),className:"hover:text-accent hover:underline",children:e.type})}),t.jsx("td",{className:"py-3 text-sm text-right",children:t.jsx(p,{value:e.total,colorClass:"text-text-secondary",onClick:()=>l(e.type)})}),t.jsx("td",{className:"py-3 text-sm text-right",children:t.jsx(p,{value:e.running,colorClass:"text-status-active",onClick:()=>l(e.type,"running")})}),t.jsx("td",{className:"py-3 text-sm text-right",children:t.jsx(p,{value:e.completed,colorClass:"text-status-success",onClick:()=>l(e.type,"completed")})}),t.jsx("td",{className:"py-3 text-sm text-right",children:t.jsx(p,{value:e.failed,colorClass:"text-status-error",onClick:()=>l(e.type,"failed")})}),t.jsx("td",{className:"py-3 text-sm font-mono text-text-secondary text-right",children:e.avgDuration!==null?T(e.avgDuration):"—"})]},e.type))})]}),j.length===0&&t.jsx("div",{className:"py-16 text-center",children:t.jsxs("p",{className:"text-sm text-text-tertiary",children:["No workflow activity in the last ",o]})})]})}export{_ as WorkflowsOverview};
|
|
2
|
+
//# sourceMappingURL=WorkflowsOverview-CLyitES7.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowsOverview-l-0KYP7Y.js","sources":["../../src/pages/workflows/WorkflowsOverview.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useJobs, useWorkflowConfigs } from '../../api/workflows';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StatCard } from '../../components/common/data/StatCard';\n\n// ── Duration filter ──────────────────────────────────────────────────────────\n\nconst DURATIONS = [\n { label: '1h', ms: 3_600_000 },\n { label: '24h', ms: 86_400_000 },\n { label: '7d', ms: 604_800_000 },\n { label: '30d', ms: 2_592_000_000 },\n] as const;\n\ntype DurationLabel = (typeof DURATIONS)[number]['label'];\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3_600_000) return `${(ms / 60_000).toFixed(1)}m`;\n return `${(ms / 3_600_000).toFixed(1)}h`;\n}\n\ninterface TypeStats {\n type: string;\n total: number;\n running: number;\n completed: number;\n failed: number;\n avgDuration: number | null;\n}\n\n// ── Clickable stat cell ──────────────────────────────────────────────────────\n\nfunction StatCell({\n value,\n colorClass,\n onClick,\n}: {\n value: number;\n colorClass: string;\n onClick: () => void;\n}) {\n if (value === 0) {\n return <span className=\"text-text-tertiary\">0</span>;\n }\n return (\n <button\n onClick={onClick}\n className={`${colorClass} hover:underline tabular-nums font-medium`}\n >\n {value}\n </button>\n );\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function WorkflowsOverview() {\n useWorkflowListEvents();\n const navigate = useNavigate();\n const [duration, setDuration] = useState<DurationLabel>('24h');\n\n const { data: allJobs } = useJobs({ limit: 500 });\n const { data: configs } = useWorkflowConfigs();\n\n const cutoff = useMemo(() => {\n const d = DURATIONS.find((d) => d.label === duration)!;\n return Date.now() - d.ms;\n }, [duration]);\n\n const jobs = useMemo(\n () => (allJobs?.jobs ?? []).filter((j) => new Date(j.created_at).getTime() >= cutoff),\n [allJobs?.jobs, cutoff],\n );\n\n const byType = useMemo(() => {\n const map = new Map<string, { total: number; running: number; completed: number; failed: number; durations: number[] }>();\n for (const j of jobs) {\n const entry = map.get(j.entity) ?? { total: 0, running: 0, completed: 0, failed: 0, durations: [] };\n entry.total++;\n if (j.status === 'running') entry.running++;\n if (j.status === 'completed') {\n entry.completed++;\n const dur = new Date(j.updated_at).getTime() - new Date(j.created_at).getTime();\n if (dur > 0) entry.durations.push(dur);\n }\n if (j.status === 'failed') entry.failed++;\n map.set(j.entity, entry);\n }\n\n const result: TypeStats[] = [];\n for (const [type, stats] of map) {\n result.push({\n type,\n ...stats,\n avgDuration: stats.durations.length > 0\n ? stats.durations.reduce((a, b) => a + b, 0) / stats.durations.length\n : null,\n });\n }\n return result.sort((a, b) => b.total - a.total);\n }, [jobs]);\n\n // Totals\n const totals = useMemo(() => ({\n total: jobs.length,\n running: jobs.filter((j) => j.status === 'running').length,\n completed: jobs.filter((j) => j.status === 'completed').length,\n failed: jobs.filter((j) => j.status === 'failed').length,\n }), [jobs]);\n\n const registered = configs?.length ?? 0;\n\n const goToList = (entity?: string, status?: string) => {\n const params = new URLSearchParams();\n if (entity) params.set('entity', entity);\n if (status) params.set('status', status);\n const qs = params.toString();\n navigate(`/workflows/executions${qs ? `?${qs}` : ''}`);\n };\n\n const thCls = 'pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary';\n\n return (\n <div>\n <PageHeader\n title=\"Workflows\"\n actions={\n <span className=\"text-xs text-text-tertiary\">\n {registered} certified type{registered !== 1 ? 's' : ''}\n </span>\n }\n />\n\n {/* Duration tabs */}\n <div className=\"flex items-center gap-1 mb-6\">\n {DURATIONS.map((d) => (\n <button\n key={d.label}\n onClick={() => setDuration(d.label)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n duration === d.label\n ? 'bg-accent text-text-inverse'\n : 'text-text-tertiary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {d.label}\n </button>\n ))}\n </div>\n\n {/* Summary cards */}\n <div className=\"grid grid-cols-4 gap-4 mb-8\">\n <StatCard label=\"Total\" value={totals.total} onClick={() => goToList()} />\n <StatCard label=\"Running\" value={totals.running} colorClass=\"text-status-active\" onClick={() => goToList(undefined, 'running')} />\n <StatCard label=\"Completed\" value={totals.completed} colorClass=\"text-status-success\" onClick={() => goToList(undefined, 'completed')} />\n <StatCard label=\"Failed\" value={totals.failed} colorClass=\"text-status-error\" onClick={() => goToList(undefined, 'failed')} />\n </div>\n\n {/* By-type table */}\n {byType.length > 0 && (\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Type</th>\n <th className={`${thCls} text-right w-20`}>Total</th>\n <th className={`${thCls} text-right w-20`}>Running</th>\n <th className={`${thCls} text-right w-24`}>Completed</th>\n <th className={`${thCls} text-right w-20`}>Failed</th>\n <th className={`${thCls} text-right w-28`}>Avg Duration</th>\n </tr>\n </thead>\n <tbody>\n {byType.map((row) => (\n <tr key={row.type} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToList(row.type)}\n className=\"hover:text-accent hover:underline\"\n >\n {row.type}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.total} colorClass=\"text-text-secondary\" onClick={() => goToList(row.type)} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.running} colorClass=\"text-status-active\" onClick={() => goToList(row.type, 'running')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.completed} colorClass=\"text-status-success\" onClick={() => goToList(row.type, 'completed')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.failed} colorClass=\"text-status-error\" onClick={() => goToList(row.type, 'failed')} />\n </td>\n <td className=\"py-3 text-sm font-mono text-text-secondary text-right\">\n {row.avgDuration !== null ? formatDuration(row.avgDuration) : '—'}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n\n {byType.length === 0 && (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-tertiary\">\n No workflow activity in the last {duration}\n </p>\n </div>\n )}\n </div>\n );\n}"],"names":["DURATIONS","formatDuration","ms","StatCell","value","colorClass","onClick","jsx","WorkflowsOverview","useWorkflowListEvents","navigate","useNavigate","duration","setDuration","useState","allJobs","useJobs","configs","useWorkflowConfigs","cutoff","useMemo","d","jobs","j","byType","map","entry","dur","result","type","stats","a","b","totals","registered","goToList","entity","status","params","qs","thCls","PageHeader","jsxs","StatCard","row"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WorkflowsOverview-CLyitES7.js","sources":["../../src/pages/workflows/WorkflowsOverview.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useJobs, useWorkflowConfigs } from '../../api/workflows';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StatCard } from '../../components/common/data/StatCard';\n\n// ── Duration filter ──────────────────────────────────────────────────────────\n\nconst DURATIONS = [\n { label: '1h', ms: 3_600_000 },\n { label: '24h', ms: 86_400_000 },\n { label: '7d', ms: 604_800_000 },\n { label: '30d', ms: 2_592_000_000 },\n] as const;\n\ntype DurationLabel = (typeof DURATIONS)[number]['label'];\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3_600_000) return `${(ms / 60_000).toFixed(1)}m`;\n return `${(ms / 3_600_000).toFixed(1)}h`;\n}\n\ninterface TypeStats {\n type: string;\n total: number;\n running: number;\n completed: number;\n failed: number;\n avgDuration: number | null;\n}\n\n// ── Clickable stat cell ──────────────────────────────────────────────────────\n\nfunction StatCell({\n value,\n colorClass,\n onClick,\n}: {\n value: number;\n colorClass: string;\n onClick: () => void;\n}) {\n if (value === 0) {\n return <span className=\"text-text-tertiary\">0</span>;\n }\n return (\n <button\n onClick={onClick}\n className={`${colorClass} hover:underline tabular-nums font-medium`}\n >\n {value}\n </button>\n );\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function WorkflowsOverview() {\n useWorkflowListEvents();\n const navigate = useNavigate();\n const [duration, setDuration] = useState<DurationLabel>('24h');\n\n const { data: allJobs } = useJobs({ limit: 500 });\n const { data: configs } = useWorkflowConfigs();\n\n const cutoff = useMemo(() => {\n const d = DURATIONS.find((d) => d.label === duration)!;\n return Date.now() - d.ms;\n }, [duration]);\n\n const jobs = useMemo(\n () => (allJobs?.jobs ?? []).filter((j) => new Date(j.created_at).getTime() >= cutoff),\n [allJobs?.jobs, cutoff],\n );\n\n const byType = useMemo(() => {\n const map = new Map<string, { total: number; running: number; completed: number; failed: number; durations: number[] }>();\n for (const j of jobs) {\n const entry = map.get(j.entity) ?? { total: 0, running: 0, completed: 0, failed: 0, durations: [] };\n entry.total++;\n if (j.status === 'running') entry.running++;\n if (j.status === 'completed') {\n entry.completed++;\n const dur = new Date(j.updated_at).getTime() - new Date(j.created_at).getTime();\n if (dur > 0) entry.durations.push(dur);\n }\n if (j.status === 'failed') entry.failed++;\n map.set(j.entity, entry);\n }\n\n const result: TypeStats[] = [];\n for (const [type, stats] of map) {\n result.push({\n type,\n ...stats,\n avgDuration: stats.durations.length > 0\n ? stats.durations.reduce((a, b) => a + b, 0) / stats.durations.length\n : null,\n });\n }\n return result.sort((a, b) => b.total - a.total);\n }, [jobs]);\n\n // Totals\n const totals = useMemo(() => ({\n total: jobs.length,\n running: jobs.filter((j) => j.status === 'running').length,\n completed: jobs.filter((j) => j.status === 'completed').length,\n failed: jobs.filter((j) => j.status === 'failed').length,\n }), [jobs]);\n\n const registered = configs?.length ?? 0;\n\n const goToList = (entity?: string, status?: string) => {\n const params = new URLSearchParams();\n if (entity) params.set('entity', entity);\n if (status) params.set('status', status);\n const qs = params.toString();\n navigate(`/workflows/executions${qs ? `?${qs}` : ''}`);\n };\n\n const thCls = 'pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary';\n\n return (\n <div>\n <PageHeader\n title=\"Workflows\"\n actions={\n <span className=\"text-xs text-text-tertiary\">\n {registered} certified type{registered !== 1 ? 's' : ''}\n </span>\n }\n />\n\n {/* Duration tabs */}\n <div className=\"flex items-center gap-1 mb-6\">\n {DURATIONS.map((d) => (\n <button\n key={d.label}\n onClick={() => setDuration(d.label)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n duration === d.label\n ? 'bg-accent text-text-inverse'\n : 'text-text-tertiary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {d.label}\n </button>\n ))}\n </div>\n\n {/* Summary cards */}\n <div className=\"grid grid-cols-4 gap-4 mb-8\">\n <StatCard label=\"Total\" value={totals.total} onClick={() => goToList()} />\n <StatCard label=\"Running\" value={totals.running} colorClass=\"text-status-active\" onClick={() => goToList(undefined, 'running')} />\n <StatCard label=\"Completed\" value={totals.completed} colorClass=\"text-status-success\" onClick={() => goToList(undefined, 'completed')} />\n <StatCard label=\"Failed\" value={totals.failed} colorClass=\"text-status-error\" onClick={() => goToList(undefined, 'failed')} />\n </div>\n\n {/* By-type table */}\n {byType.length > 0 && (\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Type</th>\n <th className={`${thCls} text-right w-20`}>Total</th>\n <th className={`${thCls} text-right w-20`}>Running</th>\n <th className={`${thCls} text-right w-24`}>Completed</th>\n <th className={`${thCls} text-right w-20`}>Failed</th>\n <th className={`${thCls} text-right w-28`}>Avg Duration</th>\n </tr>\n </thead>\n <tbody>\n {byType.map((row) => (\n <tr key={row.type} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToList(row.type)}\n className=\"hover:text-accent hover:underline\"\n >\n {row.type}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.total} colorClass=\"text-text-secondary\" onClick={() => goToList(row.type)} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.running} colorClass=\"text-status-active\" onClick={() => goToList(row.type, 'running')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.completed} colorClass=\"text-status-success\" onClick={() => goToList(row.type, 'completed')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.failed} colorClass=\"text-status-error\" onClick={() => goToList(row.type, 'failed')} />\n </td>\n <td className=\"py-3 text-sm font-mono text-text-secondary text-right\">\n {row.avgDuration !== null ? formatDuration(row.avgDuration) : '—'}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n\n {byType.length === 0 && (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-tertiary\">\n No workflow activity in the last {duration}\n </p>\n </div>\n )}\n </div>\n );\n}"],"names":["DURATIONS","formatDuration","ms","StatCell","value","colorClass","onClick","jsx","WorkflowsOverview","useWorkflowListEvents","navigate","useNavigate","duration","setDuration","useState","allJobs","useJobs","configs","useWorkflowConfigs","cutoff","useMemo","d","jobs","j","byType","map","entry","dur","result","type","stats","a","b","totals","registered","goToList","entity","status","params","qs","thCls","PageHeader","jsxs","StatCard","row"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{j as p}from"./vendor-query-B2UbickB.js";import{c as vn,d as An}from"./yaml-workflows-
|
|
1
|
+
import{j as p}from"./vendor-query-B2UbickB.js";import{c as vn,d as An}from"./yaml-workflows-Be3rM5i2.js";import{S as yn}from"./StatusBadge-CEQMRmSQ.js";import{N as _n}from"./NamespacePill-BlhSWa5S.js";import{B as Cn,P as wn,ah as bn,g as se,W as Sn,a2 as En,at as Nn}from"./vendor-icons-BX2Vih4L.js";import{e as Fn,c as Tn}from"./vendor-react-CXumBFUA.js";import"./index-DpGeD89g.js";/*! js-yaml 4.1.1 https://github.com/nodeca/js-yaml @license MIT */function Te(e){return typeof e>"u"||e===null}function kn(e){return typeof e=="object"&&e!==null}function On(e){return Array.isArray(e)?e:Te(e)?[]:[e]}function In(e,n){var i,l,r,u;if(n)for(u=Object.keys(n),i=0,l=u.length;i<l;i+=1)r=u[i],e[r]=n[r];return e}function jn(e,n){var i="",l;for(l=0;l<n;l+=1)i+=e;return i}function Ln(e){return e===0&&Number.NEGATIVE_INFINITY===1/e}var Rn=Te,Dn=kn,Mn=On,Pn=jn,Yn=Ln,Bn=In,_={isNothing:Rn,isObject:Dn,toArray:Mn,repeat:Pn,isNegativeZero:Yn,extend:Bn};function ke(e,n){var i="",l=e.reason||"(unknown reason)";return e.mark?(e.mark.name&&(i+='in "'+e.mark.name+'" '),i+="("+(e.mark.line+1)+":"+(e.mark.column+1)+")",!n&&e.mark.snippet&&(i+=`
|
|
2
2
|
|
|
3
3
|
`+e.mark.snippet),l+" "+i):l}function B(e,n){Error.call(this),this.name="YAMLException",this.reason=e,this.mark=n,this.message=ke(this,!1),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}B.prototype=Object.create(Error.prototype);B.prototype.constructor=B;B.prototype.toString=function(n){return this.name+": "+ke(this,n)};var b=B;function X(e,n,i,l,r){var u="",o="",c=Math.floor(r/2)-1;return l-n>c&&(u=" ... ",n=l-c+u.length),i-l>c&&(o=" ...",i=l+c-o.length),{str:u+e.slice(n,i).replace(/\t/g,"→")+o,pos:l-n+u.length}}function Z(e,n){return _.repeat(" ",n-e.length)+e}function Hn(e,n){if(n=Object.create(n||null),!e.buffer)return null;n.maxLength||(n.maxLength=79),typeof n.indent!="number"&&(n.indent=1),typeof n.linesBefore!="number"&&(n.linesBefore=3),typeof n.linesAfter!="number"&&(n.linesAfter=2);for(var i=/\r?\n|\r|\0/g,l=[0],r=[],u,o=-1;u=i.exec(e.buffer);)r.push(u.index),l.push(u.index+u[0].length),e.position<=u.index&&o<0&&(o=l.length-2);o<0&&(o=l.length-1);var c="",t,a,s=Math.min(e.line+n.linesAfter,r.length).toString().length,f=n.maxLength-(n.indent+s+3);for(t=1;t<=n.linesBefore&&!(o-t<0);t++)a=X(e.buffer,l[o-t],r[o-t],e.position-(l[o]-l[o-t]),f),c=_.repeat(" ",n.indent)+Z((e.line-t+1).toString(),s)+" | "+a.str+`
|
|
4
4
|
`+c;for(a=X(e.buffer,l[o],r[o],e.position,f),c+=_.repeat(" ",n.indent)+Z((e.line+1).toString(),s)+" | "+a.str+`
|
|
@@ -30,4 +30,4 @@ import{j as p}from"./vendor-query-B2UbickB.js";import{c as vn,d as An}from"./yam
|
|
|
30
30
|
`,e.length-r>n&&o>r?t+=e.slice(r,o)+`
|
|
31
31
|
`+e.slice(o+1):t+=e.slice(r),t.slice(1)}function Nr(e){for(var n="",i=0,l,r=0;r<e.length;i>=65536?r+=2:r++)i=Y(e,r),l=w[i],!l&&q(i)?(n+=e[r],i>=65536&&(n+=e[r+1])):n+=l||vr(i);return n}function Fr(e,n,i){var l="",r=e.tag,u,o,c;for(u=0,o=i.length;u<o;u+=1)c=i[u],e.replacer&&(c=e.replacer.call(i,String(u),c)),(F(e,n,c,!1,!1)||typeof c>"u"&&F(e,n,null,!1,!1))&&(l!==""&&(l+=","+(e.condenseFlow?"":" ")),l+=e.dump);e.tag=r,e.dump="["+l+"]"}function Ee(e,n,i,l){var r="",u=e.tag,o,c,t;for(o=0,c=i.length;o<c;o+=1)t=i[o],e.replacer&&(t=e.replacer.call(i,String(o),t)),(F(e,n+1,t,!0,!0,!1,!0)||typeof t>"u"&&F(e,n+1,null,!0,!0,!1,!0))&&((!l||r!=="")&&(r+=ie(e,n)),e.dump&&H===e.dump.charCodeAt(0)?r+="-":r+="- ",r+=e.dump);e.tag=u,e.dump=r||"[]"}function Tr(e,n,i){var l="",r=e.tag,u=Object.keys(i),o,c,t,a,s;for(o=0,c=u.length;o<c;o+=1)s="",l!==""&&(s+=", "),e.condenseFlow&&(s+='"'),t=u[o],a=i[t],e.replacer&&(a=e.replacer.call(i,t,a)),F(e,n,t,!1,!1)&&(e.dump.length>1024&&(s+="? "),s+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),F(e,n,a,!1,!1)&&(s+=e.dump,l+=s));e.tag=r,e.dump="{"+l+"}"}function kr(e,n,i,l){var r="",u=e.tag,o=Object.keys(i),c,t,a,s,f,h;if(e.sortKeys===!0)o.sort();else if(typeof e.sortKeys=="function")o.sort(e.sortKeys);else if(e.sortKeys)throw new b("sortKeys must be a boolean or a function");for(c=0,t=o.length;c<t;c+=1)h="",(!l||r!=="")&&(h+=ie(e,n)),a=o[c],s=i[a],e.replacer&&(s=e.replacer.call(i,a,s)),F(e,n+1,a,!0,!0,!0)&&(f=e.tag!==null&&e.tag!=="?"||e.dump&&e.dump.length>1024,f&&(e.dump&&H===e.dump.charCodeAt(0)?h+="?":h+="? "),h+=e.dump,f&&(h+=ie(e,n)),F(e,n+1,s,!0,f)&&(e.dump&&H===e.dump.charCodeAt(0)?h+=":":h+=": ",h+=e.dump,r+=h));e.tag=u,e.dump=r||"{}"}function Ne(e,n,i){var l,r,u,o,c,t;for(r=i?e.explicitTypes:e.implicitTypes,u=0,o=r.length;u<o;u+=1)if(c=r[u],(c.instanceOf||c.predicate)&&(!c.instanceOf||typeof n=="object"&&n instanceof c.instanceOf)&&(!c.predicate||c.predicate(n))){if(i?c.multi&&c.representName?e.tag=c.representName(n):e.tag=c.tag:e.tag="?",c.represent){if(t=e.styleMap[c.tag]||c.defaultStyle,cn.call(c.represent)==="[object Function]")l=c.represent(n,t);else if(tn.call(c.represent,t))l=c.represent[t](n,t);else throw new b("!<"+c.tag+'> tag resolver accepts not "'+t+'" style');e.dump=l}return!0}return!1}function F(e,n,i,l,r,u,o){e.tag=null,e.dump=i,Ne(e,i,!1)||Ne(e,i,!0);var c=cn.call(e.dump),t=l,a;l&&(l=e.flowLevel<0||e.flowLevel>n);var s=c==="[object Object]"||c==="[object Array]",f,h;if(s&&(f=e.duplicates.indexOf(i),h=f!==-1),(e.tag!==null&&e.tag!=="?"||h||e.indent!==2&&n>0)&&(r=!1),h&&e.usedDuplicates[f])e.dump="*ref_"+f;else{if(s&&h&&!e.usedDuplicates[f]&&(e.usedDuplicates[f]=!0),c==="[object Object]")l&&Object.keys(e.dump).length!==0?(kr(e,n,e.dump,r),h&&(e.dump="&ref_"+f+e.dump)):(Tr(e,n,e.dump),h&&(e.dump="&ref_"+f+" "+e.dump));else if(c==="[object Array]")l&&e.dump.length!==0?(e.noArrayIndent&&!o&&n>0?Ee(e,n-1,e.dump,r):Ee(e,n,e.dump,r),h&&(e.dump="&ref_"+f+e.dump)):(Fr(e,n,e.dump),h&&(e.dump="&ref_"+f+" "+e.dump));else if(c==="[object String]")e.tag!=="?"&&Sr(e,e.dump,n,u,t);else{if(c==="[object Undefined]")return!1;if(e.skipInvalid)return!1;throw new b("unacceptable kind of an object to dump "+c)}e.tag!==null&&e.tag!=="?"&&(a=encodeURI(e.tag[0]==="!"?e.tag.slice(1):e.tag).replace(/!/g,"%21"),e.tag[0]==="!"?a="!"+a:a.slice(0,18)==="tag:yaml.org,2002:"?a="!!"+a.slice(18):a="!<"+a+">",e.dump=a+" "+e.dump)}return!0}function Or(e,n){var i=[],l=[],r,u;for(le(e,i,l),r=0,u=l.length;r<u;r+=1)n.duplicates.push(i[l[r]]);n.usedDuplicates=new Array(u)}function le(e,n,i){var l,r,u;if(e!==null&&typeof e=="object")if(r=n.indexOf(e),r!==-1)i.indexOf(r)===-1&&i.push(r);else if(n.push(e),Array.isArray(e))for(r=0,u=e.length;r<u;r+=1)le(e[r],n,i);else for(l=Object.keys(e),r=0,u=l.length;r<u;r+=1)le(e[l[r]],n,i)}function Ir(e,n){n=n||{};var i=new yr(n);i.noRefs||Or(e,i);var l=e;return i.replacer&&(l=i.replacer.call({"":l},"",l)),F(i,0,l,!0,!0)?i.dump+`
|
|
32
32
|
`:""}var jr=Ir,Lr={dump:jr};function pe(e,n){return function(){throw new Error("Function yaml."+e+" is removed in js-yaml 4. Use yaml."+n+" instead, which is now safe by default.")}}var Rr=C,Dr=Oe,Mr=Re,Pr=Be,Yr=He,Br=ce,Hr=un.load,Ur=un.loadAll,qr=Lr.dump,Kr=b,Wr={binary:Ge,float:Ye,map:Le,null:De,pairs:Qe,set:Ve,timestamp:Ke,bool:Me,int:Pe,merge:We,omap:$e,seq:je,str:Ie},Gr=pe("safeLoad","load"),$r=pe("safeLoadAll","loadAll"),Qr=pe("safeDump","dump"),Vr={Type:Rr,Schema:Dr,FAILSAFE_SCHEMA:Mr,JSON_SCHEMA:Pr,CORE_SCHEMA:Yr,DEFAULT_SCHEMA:Br,load:Hr,loadAll:Ur,dump:qr,YAMLException:Kr,types:Wr,safeLoad:Gr,safeLoadAll:$r,safeDump:Qr};function Xr({children:e,className:n=""}){return p.jsx("span",{className:`px-2 py-0.5 text-[10px] bg-surface-sunken rounded-full text-text-secondary ${n}`,children:e})}function j({icon:e,color:n,children:i}){return p.jsxs("div",{className:"flex items-center gap-2 mb-3 pb-2 border-b border-surface-border",children:[p.jsx(e,{className:`w-4 h-4 ${n}`,strokeWidth:1.5}),p.jsx("h2",{className:"section-h2",children:i})]})}function oe({text:e}){return p.jsx("p",{className:"text-[11px] text-text-quaternary py-2",children:e})}function L({label:e,children:n}){return p.jsxs("div",{className:"flex items-baseline justify-between py-2 gap-4",children:[p.jsx("span",{className:"text-[10px] uppercase tracking-widest text-text-quaternary shrink-0",children:e}),p.jsx("span",{className:"text-xs text-text-primary text-right min-w-0 truncate",children:n})]})}function J(e){return e?new Date(e).toLocaleString("en-US",{dateStyle:"medium",timeStyle:"short"}):"—"}function Zr(e){const n=(e==null?void 0:e.properties)??{};return Object.entries(n).map(([i,l])=>({key:i,type:(l==null?void 0:l.type)??"any",description:(l==null?void 0:l.description)??""}))}function Fe({schema:e,empty:n}){const i=Zr(e);return i.length===0?p.jsx(oe,{text:n}):p.jsx("div",{className:"divide-y divide-surface-border/30",children:i.map(l=>p.jsxs("div",{className:"py-2",children:[p.jsxs("div",{className:"flex items-baseline gap-2",children:[p.jsx("code",{className:"text-xs font-mono text-text-primary",children:l.key}),p.jsx("span",{className:"text-[10px] font-mono text-text-quaternary",children:l.type})]}),l.description&&p.jsx("p",{className:"text-[11px] text-text-tertiary mt-0.5 leading-snug",children:l.description})]},l.key))})}function ol(){var t;const{id:e=""}=Fn(),n=Tn(),{data:i,isLoading:l}=vn(e),{data:r}=An(e),u=(r==null?void 0:r.versions)??[];if(l||!i)return p.jsxs("div",{className:"animate-pulse space-y-4",children:[p.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),p.jsx("div",{className:"h-40 bg-surface-sunken rounded"})]});const o=i.activity_manifest??[],c=(()=>{var s,f,h,x;const a=i.output_schema;if(a&&Object.keys(a).length>0)return a;try{const m=Vr.load(i.yaml_content);return((x=(h=(f=(s=m==null?void 0:m.app)==null?void 0:s.graphs)==null?void 0:f[0])==null?void 0:h.output)==null?void 0:x.schema)??void 0}catch{return}})();return p.jsxs("div",{children:[p.jsxs("div",{className:"flex items-start justify-between mb-3",children:[p.jsxs("div",{className:"flex items-center gap-2",children:[p.jsx("h1",{className:"text-3xl font-light text-text-primary font-mono",children:i.graph_topic}),p.jsx("button",{onClick:()=>{window.location.hash="#docs:dashboard.md:graph-workflows"},className:"text-text-quaternary hover:text-accent transition-colors mt-1",title:"Docs",children:p.jsx(Cn,{className:"w-4 h-4",strokeWidth:1.5})})]}),p.jsx("div",{className:"flex items-center gap-3",children:i.status==="active"&&p.jsxs("button",{onClick:()=>n(`/mcp/workflows/invoke?id=${i.id}`),className:"flex items-center gap-1.5 px-4 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors",children:[p.jsx(wn,{className:"w-3 h-3"})," Run"]})})]}),p.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[p.jsx(yn,{status:i.status}),p.jsx(_n,{namespace:i.app_id}),p.jsxs("span",{className:"text-[11px] font-mono text-text-quaternary",children:["v",i.content_version]})]}),i.description&&p.jsx("p",{className:"text-sm text-text-secondary mb-8 max-w-2xl leading-relaxed",children:i.description}),((t=i.tags)==null?void 0:t.length)>0&&p.jsx("div",{className:"flex items-center gap-1.5 mb-10",children:i.tags.map(a=>p.jsx(Xr,{children:a},a))}),p.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-x-14 gap-y-10 mb-12",children:[p.jsxs("div",{children:[p.jsx(j,{icon:bn,color:"text-accent",children:"Overview"}),p.jsxs("div",{className:"divide-y divide-surface-border/30",children:[p.jsx(L,{label:"Topic",children:p.jsx("code",{className:"font-mono",children:i.graph_topic})}),p.jsx(L,{label:"Namespace",children:p.jsx("code",{className:"font-mono",children:i.app_id})}),p.jsx(L,{label:"App version",children:i.app_version}),p.jsx(L,{label:"Runs as",children:i.execute_as||"caller"}),p.jsx(L,{label:"Deployed",children:J(i.deployed_at)}),p.jsx(L,{label:"Activated",children:J(i.activated_at)})]})]}),p.jsxs("div",{className:"space-y-10",children:[p.jsxs("div",{children:[p.jsx(j,{icon:se,color:"text-accent",children:"Input"}),p.jsx(Fe,{schema:i.input_schema,empty:"No declared input fields"})]}),p.jsxs("div",{children:[p.jsx(j,{icon:se,color:"text-accent",children:"Output"}),p.jsx(Fe,{schema:c,empty:"No declared output fields"})]})]}),p.jsxs("div",{children:[p.jsx(j,{icon:Sn,color:"text-accent",children:"Graph"}),o.length===0?p.jsx(oe,{text:"A single trigger maps the input straight to the output — see the graph definition below."}):p.jsx("div",{className:"divide-y divide-surface-border/30",children:o.map(a=>p.jsxs("div",{className:"flex items-center justify-between py-2 gap-3",children:[p.jsxs("div",{className:"min-w-0",children:[p.jsx("code",{className:"text-xs font-mono text-text-primary",children:a.title||a.activity_id}),a.topic&&p.jsx("p",{className:"text-[10px] font-mono text-text-quaternary truncate",children:a.topic})]}),p.jsx("span",{className:"text-[10px] uppercase tracking-widest text-text-quaternary shrink-0",children:a.tool_source||a.type})]},a.activity_id))})]})]}),p.jsxs("div",{className:"mb-12",children:[p.jsx(j,{icon:En,color:"text-accent",children:"Definition"}),p.jsx("pre",{className:"text-[11px] font-mono text-text-secondary bg-surface-sunken/50 rounded-md p-4 overflow-x-auto leading-relaxed",children:i.yaml_content})]}),p.jsxs("div",{children:[p.jsxs(j,{icon:Nn,color:"text-accent",children:["Versions (",u.length,")"]}),u.length===0?p.jsx(oe,{text:"No prior versions"}):p.jsx("div",{className:"divide-y divide-surface-border/30",children:u.map(a=>p.jsxs("div",{className:"flex items-center justify-between py-2 gap-3",children:[p.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[p.jsxs("span",{className:"text-xs font-mono text-text-primary",children:["v",a.version]}),a.change_summary&&p.jsx("span",{className:"text-[11px] text-text-tertiary truncate",children:a.change_summary})]}),p.jsx("span",{className:"text-[10px] text-text-quaternary shrink-0",children:J(a.created_at)})]},a.id))})]})]})}export{ol as YamlWorkflowDetailPage};
|
|
33
|
-
//# sourceMappingURL=YamlWorkflowDetailPage-
|
|
33
|
+
//# sourceMappingURL=YamlWorkflowDetailPage-pP2i1ptj.js.map
|