@hotmeshio/long-tail 0.1.15 → 0.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/api/settings.js +0 -3
- package/build/api/yaml-workflows/crud.js +25 -5
- package/build/index.d.ts +1 -1
- package/build/lib/db/schemas/schemas/001_schema.sql +485 -0
- package/build/lib/db/schemas/schemas/002_seed.sql +92 -0
- package/build/lib/events/socketio.d.ts +12 -0
- package/build/lib/events/socketio.js +24 -1
- package/build/routes/index.js +2 -0
- package/build/routes/nats-credentials.d.ts +2 -0
- package/build/routes/nats-credentials.js +22 -0
- package/build/services/yaml-workflow/workers/register.js +4 -2
- package/build/start/adapters.js +4 -1
- package/build/start/socket-auth.d.ts +13 -0
- package/build/start/socket-auth.js +32 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/dashboard/dist/assets/{AdminDashboard-NLryl1_B.js → AdminDashboard-Bprul9Eb.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-NLryl1_B.js.map → AdminDashboard-Bprul9Eb.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-6vexlrk3.js → AvailableEscalationsPage-H_z5mC10.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-6vexlrk3.js.map → AvailableEscalationsPage-H_z5mC10.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-DWhn0tr1.js → BotPicker-DcvILNUf.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-DWhn0tr1.js.map → BotPicker-DcvILNUf.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-CgYgQiOc.js → CollapsibleSection-BWPbzgEe.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-CgYgQiOc.js.map → CollapsibleSection-BWPbzgEe.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-DCKAPXD3.js → ConfirmDeleteModal-Cy6KVLfC.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-DCKAPXD3.js.map → ConfirmDeleteModal-Cy6KVLfC.js.map} +1 -1
- package/dashboard/dist/assets/{CopyableId-DXkaAOYk.js → CopyableId-CRED8hvk.js} +2 -2
- package/dashboard/dist/assets/{CopyableId-DXkaAOYk.js.map → CopyableId-CRED8hvk.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-B361BOfU.js → CredentialsPage-BUdvxiE3.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-B361BOfU.js.map → CredentialsPage-BUdvxiE3.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-D2G1ldiF.js → CustomDurationPicker-eOk2EqQ5.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-D2G1ldiF.js.map → CustomDurationPicker-eOk2EqQ5.js.map} +1 -1
- package/dashboard/dist/assets/{DataTable-DXSUbA26.js → DataTable-bd2PTBJd.js} +2 -2
- package/dashboard/dist/assets/{DataTable-DXSUbA26.js.map → DataTable-bd2PTBJd.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-CQGqkXP_.js → ElapsedCell-BGo8vyus.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-CQGqkXP_.js.map → ElapsedCell-BGo8vyus.js.map} +1 -1
- package/dashboard/dist/assets/{EmptyState-Dep92Wkg.js → EmptyState-BygtU-Rh.js} +2 -2
- package/dashboard/dist/assets/{EmptyState-Dep92Wkg.js.map → EmptyState-BygtU-Rh.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-DVEFVjs7.js → EscalationsOverview-DUEcN5MP.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-DVEFVjs7.js.map → EscalationsOverview-DUEcN5MP.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-BMJAPkMi.js → EventTable-CmFhswLW.js} +2 -2
- package/dashboard/dist/assets/{EventTable-BMJAPkMi.js.map → EventTable-CmFhswLW.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-DbVbCzH2.js → FilterBar-BQNzsd3A.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-DbVbCzH2.js.map → FilterBar-BQNzsd3A.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-0XNuXj0M.js → ListToolbar-OWOn-HiC.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-0XNuXj0M.js.map → ListToolbar-OWOn-HiC.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-CeYnCzBN.js → McpOverview-OkEzvClD.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-CeYnCzBN.js.map → McpOverview-OkEzvClD.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-t3qW3QNa.js → McpQueryDetailPage-C6Ih5sC_.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-t3qW3QNa.js.map → McpQueryDetailPage-C6Ih5sC_.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-CfUcdzaj.js → McpQueryPage-BAuOf5TL.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-CfUcdzaj.js.map → McpQueryPage-BAuOf5TL.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-CZtodW_Z.js → McpRunDetailPage-DMeiG4i_.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-CZtodW_Z.js.map → McpRunDetailPage-DMeiG4i_.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-Dzgq7HGt.js → McpRunsPage-CG3cNJh8.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-Dzgq7HGt.js.map → McpRunsPage-CG3cNJh8.js.map} +1 -1
- package/dashboard/dist/assets/{Modal-yyhUeKoA.js → Modal-Dir9Rlnx.js} +2 -2
- package/dashboard/dist/assets/{Modal-yyhUeKoA.js.map → Modal-Dir9Rlnx.js.map} +1 -1
- package/dashboard/dist/assets/{OperatorDashboard-Ceh7OQtZ.js → OperatorDashboard-OqWC6Azy.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-Ceh7OQtZ.js.map → OperatorDashboard-OqWC6Azy.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-CZ9a8cpr.js → PageHeader-FJIemmrC.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-CZ9a8cpr.js.map → PageHeader-FJIemmrC.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-BJuNs5NM.js → PageHeaderWithStats-Br5y9qNO.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-BJuNs5NM.js.map → PageHeaderWithStats-Br5y9qNO.js.map} +1 -1
- package/dashboard/dist/assets/{PriorityBadge-BrPikMFy.js → PriorityBadge-C7D5d_HY.js} +2 -2
- package/dashboard/dist/assets/{PriorityBadge-BrPikMFy.js.map → PriorityBadge-C7D5d_HY.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-2miaYd8G.js → ProcessDetailPage-DZIP6grw.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-2miaYd8G.js.map → ProcessDetailPage-DZIP6grw.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-DqpRDqjk.js → ProcessesListPage-BQoPYkeB.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-DqpRDqjk.js.map → ProcessesListPage-BQoPYkeB.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-DxbJMfJu.js → RolePill-D6nMxMvp.js} +2 -2
- package/dashboard/dist/assets/{RolePill-DxbJMfJu.js.map → RolePill-D6nMxMvp.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-CYHRo21-.js → RolesPage-CwLnJFhy.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-CYHRo21-.js.map → RolesPage-CwLnJFhy.js.map} +1 -1
- package/dashboard/dist/assets/{RowActions-DurFwIwe.js → RowActions-JqgAB0p3.js} +2 -2
- package/dashboard/dist/assets/{RowActions-DurFwIwe.js.map → RowActions-JqgAB0p3.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-CNKraP6u.js → RunAsSelector-KAlKtitB.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-CNKraP6u.js.map → RunAsSelector-KAlKtitB.js.map} +1 -1
- package/dashboard/dist/assets/{StatCard-CKplpK3w.js → StatCard-B-WLhOaH.js} +2 -2
- package/dashboard/dist/assets/{StatCard-CKplpK3w.js.map → StatCard-B-WLhOaH.js.map} +1 -1
- package/dashboard/dist/assets/{StatusBadge-Dm0V1dNN.js → StatusBadge-DVCf2ncM.js} +2 -2
- package/dashboard/dist/assets/{StatusBadge-Dm0V1dNN.js.map → StatusBadge-DVCf2ncM.js.map} +1 -1
- package/dashboard/dist/assets/{StepIndicator-Dicx0WTZ.js → StepIndicator-D9Xvdf18.js} +2 -2
- package/dashboard/dist/assets/{StepIndicator-Dicx0WTZ.js.map → StepIndicator-D9Xvdf18.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-B2jYvU3-.js → StickyPagination-CJHMzYJj.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-B2jYvU3-.js.map → StickyPagination-CJHMzYJj.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-ClwumkT1.js → SwimlaneTimeline-YiXPDyEL.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-ClwumkT1.js.map → SwimlaneTimeline-YiXPDyEL.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-CypDZ6Kl.js → TagInput-DcPnUnSJ.js} +2 -2
- package/dashboard/dist/assets/{TagInput-CypDZ6Kl.js.map → TagInput-DcPnUnSJ.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-DooDNJGT.js → TaskDetailPage-DftmYWD7.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-DooDNJGT.js.map → TaskDetailPage-DftmYWD7.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-C1hZ-j31.js → TaskQueuePill-BzduBqwy.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-C1hZ-j31.js.map → TaskQueuePill-BzduBqwy.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-D7CdkAeg.js → TasksListPage-DeewV4Gp.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-D7CdkAeg.js.map → TasksListPage-DeewV4Gp.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-B5LXB2aj.js → TimeAgo-DJZq-e4R.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-B5LXB2aj.js.map → TimeAgo-DJZq-e4R.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-Crb9b0Gw.js → TimestampCell-Dx5uwGfS.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-Crb9b0Gw.js.map → TimestampCell-Dx5uwGfS.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-OPg-nkRa.js → UserName-CnGk7MgL.js} +2 -2
- package/dashboard/dist/assets/{UserName-OPg-nkRa.js.map → UserName-CnGk7MgL.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-CcLVrs9b.js → WorkflowExecutionPage-CPQ0fIwf.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-CcLVrs9b.js.map → WorkflowExecutionPage-CPQ0fIwf.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-CCV4MMj7.js → WorkflowPill-BrD5d1AG.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-CCV4MMj7.js.map → WorkflowPill-BrD5d1AG.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-DB1SncBi.js → WorkflowsDashboard-BzjhABZP.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-DB1SncBi.js.map → WorkflowsDashboard-BzjhABZP.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-DvShiYJV.js → WorkflowsOverview-lBp2E6rN.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-DvShiYJV.js.map → WorkflowsOverview-lBp2E6rN.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-DCBoMeGI.js → YamlWorkflowsPage-C_MkAp2i.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-DCBoMeGI.js.map → YamlWorkflowsPage-C_MkAp2i.js.map} +1 -1
- package/dashboard/dist/assets/{bots-Dqos20NE.js → bots-fc_O_YIq.js} +2 -2
- package/dashboard/dist/assets/{bots-Dqos20NE.js.map → bots-fc_O_YIq.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-A0CsbvNV.js → escalation-BYhLYHBz.js} +2 -2
- package/dashboard/dist/assets/{escalation-A0CsbvNV.js.map → escalation-BYhLYHBz.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-BpBJN6k4.js → escalation-columns-DjJyuC1g.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-BpBJN6k4.js.map → escalation-columns-DjJyuC1g.js.map} +1 -1
- package/dashboard/dist/assets/{helpers-CmznCuAx.js → helpers-CQG3Rh2y.js} +2 -2
- package/dashboard/dist/assets/{helpers-CmznCuAx.js.map → helpers-CQG3Rh2y.js.map} +1 -1
- package/dashboard/dist/assets/{index-C8-UaN4N.js → index-2nBhR7Dg.js} +2 -2
- package/dashboard/dist/assets/{index-C8-UaN4N.js.map → index-2nBhR7Dg.js.map} +1 -1
- package/dashboard/dist/assets/{index-DZHNte4o.js → index-4IUoh_hd.js} +2 -2
- package/dashboard/dist/assets/{index-DZHNte4o.js.map → index-4IUoh_hd.js.map} +1 -1
- package/dashboard/dist/assets/{index-BIeYV5QK.js → index-B2CqPzLK.js} +2 -2
- package/dashboard/dist/assets/{index-BIeYV5QK.js.map → index-B2CqPzLK.js.map} +1 -1
- package/dashboard/dist/assets/{index-ZjOUzWhc.js → index-B78xalb4.js} +2 -2
- package/dashboard/dist/assets/{index-ZjOUzWhc.js.map → index-B78xalb4.js.map} +1 -1
- package/dashboard/dist/assets/{index-CjxHCVxl.js → index-BI8r69O_.js} +2 -2
- package/dashboard/dist/assets/{index-CjxHCVxl.js.map → index-BI8r69O_.js.map} +1 -1
- package/dashboard/dist/assets/{index-t5frSddy.js → index-CUqCBBZG.js} +2 -2
- package/dashboard/dist/assets/{index-t5frSddy.js.map → index-CUqCBBZG.js.map} +1 -1
- package/dashboard/dist/assets/{index-Cr0Rqsj7.js → index-D51PaQZY.js} +2 -2
- package/dashboard/dist/assets/{index-Cr0Rqsj7.js.map → index-D51PaQZY.js.map} +1 -1
- package/dashboard/dist/assets/{index-XGOmZ117.js → index-DNtXXy1o.js} +2 -2
- package/dashboard/dist/assets/{index-XGOmZ117.js.map → index-DNtXXy1o.js.map} +1 -1
- package/dashboard/dist/assets/{index-VnYkWW8r.js → index-DR4qQvlW.js} +2 -2
- package/dashboard/dist/assets/{index-VnYkWW8r.js.map → index-DR4qQvlW.js.map} +1 -1
- package/dashboard/dist/assets/{index-CAj5LT9H.js → index-Dh0PCbR-.js} +2 -2
- package/dashboard/dist/assets/{index-CAj5LT9H.js.map → index-Dh0PCbR-.js.map} +1 -1
- package/dashboard/dist/assets/{index-BYwD3kHN.js → index-KYpLvJKB.js} +2 -2
- package/dashboard/dist/assets/{index-BYwD3kHN.js.map → index-KYpLvJKB.js.map} +1 -1
- package/dashboard/dist/assets/{index-puKKZ5l8.js → index-sNrqYt0Q.js} +53 -53
- package/dashboard/dist/assets/index-sNrqYt0Q.js.map +1 -0
- package/dashboard/dist/assets/{mcp-DrWymhSu.js → mcp-D2XfRh8v.js} +2 -2
- package/dashboard/dist/assets/{mcp-DrWymhSu.js.map → mcp-D2XfRh8v.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-BhUxVEMS.js → mcp-query-CIx_mIC7.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-BhUxVEMS.js.map → mcp-query-CIx_mIC7.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-runs-DUfz4mLd.js → mcp-runs-C9_J4LIH.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-DUfz4mLd.js.map → mcp-runs-C9_J4LIH.js.map} +1 -1
- package/dashboard/dist/assets/{namespaces-Cm6AY5sh.js → namespaces-BwMljx6f.js} +2 -2
- package/dashboard/dist/assets/{namespaces-Cm6AY5sh.js.map → namespaces-BwMljx6f.js.map} +1 -1
- package/dashboard/dist/assets/{roles-2v1Kc7BJ.js → roles-Bd_sTV6I.js} +2 -2
- package/dashboard/dist/assets/{roles-2v1Kc7BJ.js.map → roles-Bd_sTV6I.js.map} +1 -1
- package/dashboard/dist/assets/{settings-DTQNp6tH.js → settings-BCb8eFyA.js} +2 -2
- package/dashboard/dist/assets/{settings-DTQNp6tH.js.map → settings-BCb8eFyA.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-CS1rgG1s.js → tasks-Bq54qGGq.js} +2 -2
- package/dashboard/dist/assets/{tasks-CS1rgG1s.js.map → tasks-Bq54qGGq.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-BjXX8x3a.js → useEventHooks-BTbGf536.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-BjXX8x3a.js.map → useEventHooks-BTbGf536.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-BeR-nVWQ.js → useYamlActivityEvents-CsYP09W5.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-BeR-nVWQ.js.map → useYamlActivityEvents-CsYP09W5.js.map} +1 -1
- package/dashboard/dist/assets/{users-DYsdQ7Md.js → users-BTBhafGc.js} +2 -2
- package/dashboard/dist/assets/{users-DYsdQ7Md.js.map → users-BTBhafGc.js.map} +1 -1
- package/dashboard/dist/assets/{workflows-2QAXh3UD.js → workflows-BkzA4ahe.js} +2 -2
- package/dashboard/dist/assets/{workflows-2QAXh3UD.js.map → workflows-BkzA4ahe.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-sx8-UEE3.js → yaml-workflows-Cs0EYp0F.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-sx8-UEE3.js.map → yaml-workflows-Cs0EYp0F.js.map} +1 -1
- package/dashboard/dist/index.html +1 -1
- package/package.json +1 -1
- package/dashboard/dist/assets/index-puKKZ5l8.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"YamlWorkflowsPage-DCBoMeGI.js","sources":["../../src/components/common/test/WorkflowTestPanel.tsx","../../src/pages/workflows/cron/CronScheduleEditor.tsx","../../src/components/common/test/CronPanel.tsx","../../src/pages/workflows/yaml-helpers.ts","../../src/pages/workflows/yaml-workflow-rows.tsx","../../src/pages/workflows/YamlWorkflowsPage.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport { Link } from 'react-router-dom';\nimport { X, Play, RotateCcw, ExternalLink } from 'lucide-react';\nimport { useInvokeYamlWorkflow } from '../../../api/yaml-workflows';\nimport { useYamlActivityEvents, type ActivityStep } from '../../../hooks/useYamlActivityEvents';\nimport { RunAsSelector } from '../form/RunAsSelector';\nimport type { LTYamlWorkflowRecord, ActivityManifestEntry } from '../../../api/types';\nimport { buildSkeleton } from '../../../pages/mcp/mcp-query-detail/helpers';\n\nconst TOOL_SOURCE_COLORS: Record<string, { border: string; text: string; icon: string }> = {\n mcp: { border: 'border-blue-500', text: 'text-blue-500', icon: 'MCP' },\n db: { border: 'border-blue-500', text: 'text-blue-500', icon: 'DB' },\n llm: { border: 'border-violet-500', text: 'text-violet-500', icon: 'LLM' },\n transform: { border: 'border-emerald-500', text: 'text-emerald-500', icon: 'Map' },\n};\n\nfunction LiveTimeline({ steps, manifest, isComplete }: {\n steps: ActivityStep[];\n manifest: ActivityManifestEntry[];\n isComplete: boolean;\n}) {\n const workerActivities = manifest.filter((a) => a.type === 'worker');\n const totalSteps = workerActivities.length;\n\n const merged = workerActivities.map((a) => {\n const live = steps.find((s) => s.activityId === a.activity_id);\n const source = a.tool_source || 'mcp';\n const colors = TOOL_SOURCE_COLORS[source] || TOOL_SOURCE_COLORS.mcp;\n return {\n activityId: a.activity_id,\n title: a.title || a.mcp_tool_name || a.activity_id,\n toolName: a.mcp_tool_name,\n colors,\n status: live?.status || 'pending' as const,\n error: live?.error,\n };\n });\n\n return (\n <div>\n <p className=\"text-[11px] text-text-secondary mb-3\">\n {isComplete\n ? `All ${totalSteps} steps completed`\n : `Running step ${merged.filter((s) => s.status === 'completed').length + 1} of ${totalSteps}...`}\n </p>\n <div className=\"space-y-0\">\n {merged.map((step, idx) => {\n const isLast = idx === merged.length - 1;\n return (\n <div key={step.activityId} className=\"flex items-stretch gap-2\">\n <div className=\"flex flex-col items-center w-4 shrink-0\">\n <span className={`w-2.5 h-2.5 rounded-full shrink-0 border-2 transition-colors ${\n step.status === 'completed' ? 'bg-status-success border-status-success'\n : step.status === 'running' ? `${step.colors.border} bg-transparent animate-pulse`\n : step.status === 'failed' ? 'bg-status-error border-status-error'\n : 'bg-surface-sunken border-surface-border'\n }`} />\n {!isLast && (\n <span className={`w-px flex-1 transition-colors ${\n step.status === 'completed' ? 'bg-status-success/30' : 'bg-surface-border'\n }`} />\n )}\n </div>\n <div className={isLast ? '' : 'pb-3'}>\n <p className={`text-[11px] font-medium ${\n step.status === 'running' ? 'text-text-primary'\n : step.status === 'completed' ? 'text-text-secondary'\n : step.status === 'failed' ? 'text-status-error'\n : 'text-text-tertiary'\n }`}>{step.title}</p>\n {step.toolName && (\n <span className=\"text-[9px] text-text-tertiary font-mono\">{step.toolName}</span>\n )}\n {step.error && (\n <p className=\"text-[9px] text-status-error mt-0.5\">{step.error}</p>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\ninterface WorkflowTestPanelProps {\n workflow: LTYamlWorkflowRecord;\n onClose: () => void;\n}\n\nexport function WorkflowTestPanel({ workflow, onClose }: WorkflowTestPanelProps) {\n const invokeMutation = useInvokeYamlWorkflow();\n const [jsonMode, setJsonMode] = useState(false);\n const [fields, setFields] = useState<Record<string, any>>({});\n const [argsJson, setArgsJson] = useState('');\n const [jsonError, setJsonError] = useState('');\n const [executeAs, setExecuteAs] = useState('');\n const [activeJobId, setActiveJobId] = useState<string | null>(null);\n const [completedResult, setCompletedResult] = useState<{ jobId: string } | null>(null);\n const { steps, isComplete } = useYamlActivityEvents(activeJobId);\n\n useEffect(() => {\n setActiveJobId(null);\n setCompletedResult(null);\n setJsonError('');\n invokeMutation.reset();\n const skeleton = buildSkeleton(workflow.input_schema);\n setFields(skeleton);\n setArgsJson(JSON.stringify(skeleton, null, 2));\n setJsonMode(false);\n }, [workflow.id]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n if (isComplete && activeJobId) {\n const jobId = activeJobId;\n const timer = setTimeout(() => {\n setCompletedResult({ jobId });\n setActiveJobId(null);\n }, 800);\n return () => clearTimeout(timer);\n }\n }, [isComplete, activeJobId]);\n\n const toggleMode = () => {\n if (!jsonMode) {\n setArgsJson(JSON.stringify(fields, null, 2));\n } else {\n try { setFields(JSON.parse(argsJson)); } catch { /* keep fields */ }\n }\n setJsonMode(!jsonMode);\n };\n\n const handleRun = async () => {\n setJsonError('');\n setCompletedResult(null);\n let parsed: Record<string, unknown>;\n if (jsonMode) {\n try { parsed = JSON.parse(argsJson); } catch { setJsonError('Invalid JSON'); return; }\n } else {\n parsed = { ...fields };\n }\n try {\n const result = await invokeMutation.mutateAsync({\n id: workflow.id,\n data: parsed,\n sync: false,\n ...(executeAs ? { execute_as: executeAs } : {}),\n });\n if (result.job_id) setActiveJobId(result.job_id);\n } catch { /* error shown in panel */ }\n };\n\n const isRunning = !!activeJobId;\n const ns = workflow.app_id || 'longtail';\n\n return (\n <div className=\"border-l border-surface-border bg-surface-raised flex flex-col h-full\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-surface-border shrink-0\">\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-text-primary truncate\">{workflow.app_id}</p>\n <code className=\"text-[11px] font-mono text-accent truncate block\">{workflow.graph_topic}</code>\n </div>\n <button onClick={() => { if (!isRunning) onClose(); }} className=\"p-1 text-text-tertiary hover:text-text-primary shrink-0 ml-2\">\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Scrollable body */}\n <div className=\"flex-1 overflow-y-auto px-4 py-3 space-y-4\">\n {isRunning ? (\n <LiveTimeline steps={steps} manifest={workflow.activity_manifest} isComplete={isComplete} />\n ) : completedResult ? (\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-4 h-4 text-status-success\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 1a7 7 0 110 14A7 7 0 018 1zm3.36 4.65a.5.5 0 00-.72 0L7 9.29 5.36 7.65a.5.5 0 10-.72.7l2 2a.5.5 0 00.72 0l4-4a.5.5 0 000-.7z\" />\n </svg>\n <p className=\"text-xs font-medium text-status-success\">Workflow completed</p>\n </div>\n <div className=\"flex items-center justify-between\">\n <Link\n to={`/mcp/executions/${encodeURIComponent(completedResult.jobId)}?namespace=${encodeURIComponent(ns)}`}\n className=\"inline-flex items-center gap-1.5 text-xs text-accent hover:underline\"\n >\n <ExternalLink size={12} /> View execution\n </Link>\n <button\n onClick={() => setCompletedResult(null)}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <RotateCcw size={12} /> Run again\n </button>\n </div>\n </div>\n ) : (\n <>\n <RunAsSelector selected={executeAs} onChange={setExecuteAs} />\n\n {workflow.description && (\n <p className=\"text-[11px] text-text-secondary leading-relaxed\">{workflow.description}</p>\n )}\n\n {/* Form / JSON toggle input */}\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <label className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">Input</label>\n <button onClick={toggleMode} className=\"text-[10px] text-accent hover:underline\">\n {jsonMode ? 'Form view' : 'JSON view'}\n </button>\n </div>\n\n {jsonMode ? (\n <textarea\n value={argsJson}\n onChange={(e) => setArgsJson(e.target.value)}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-[11px] text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary resize-y\"\n rows={6}\n spellCheck={false}\n />\n ) : (\n <div className=\"space-y-3 max-h-[300px] overflow-y-auto\">\n {Object.entries(fields).map(([key, value]) => (\n <div key={key}>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">{key}</label>\n {typeof value === 'boolean' ? (\n <select\n value={String(value)}\n onChange={(e) => setFields({ ...fields, [key]: e.target.value === 'true' })}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : typeof value === 'object' ? (\n <textarea\n value={JSON.stringify(value, null, 2)}\n onChange={(e) => { try { setFields({ ...fields, [key]: JSON.parse(e.target.value) }); } catch { /* invalid */ } }}\n className=\"w-full min-h-[60px] px-3 py-1.5 bg-surface-sunken border border-surface-border rounded-md font-mono text-xs text-text-primary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n />\n ) : (\n <input\n type={typeof value === 'number' ? 'number' : 'text'}\n value={String(value ?? '')}\n onChange={(e) => setFields({ ...fields, [key]: typeof value === 'number' ? Number(e.target.value) : e.target.value })}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n />\n )}\n </div>\n ))}\n {Object.keys(fields).length === 0 && (\n <p className=\"text-[11px] text-text-tertiary italic\">No input fields defined</p>\n )}\n </div>\n )}\n {jsonError && <p className=\"text-[11px] text-status-error mt-1\">{jsonError}</p>}\n </div>\n\n {invokeMutation.isError && (\n <div className=\"bg-status-error/10 border border-status-error/20 rounded-md px-3 py-2\">\n <p className=\"text-[11px] text-status-error\">\n {invokeMutation.error instanceof Error ? invokeMutation.error.message : 'Invocation failed'}\n </p>\n </div>\n )}\n <button\n onClick={handleRun}\n disabled={invokeMutation.isPending}\n className=\"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5\"\n >\n {invokeMutation.isPending ? 'Starting...' : <><Play size={12} /> Run</>}\n </button>\n </>\n )}\n </div>\n </div>\n );\n}\n","import { SectionLabel } from '../../../components/common/layout/SectionLabel';\nimport { describeCron, COMMON_PATTERNS } from './helpers';\n\ninterface CronScheduleEditorProps {\n cronInput: string;\n setCronInput: (value: string) => void;\n setCron: { isPending: boolean; isSuccess: boolean; error: Error | null; reset: () => void };\n hasCronSchedule: boolean;\n onSave: () => void;\n onClear: () => void;\n}\n\nexport function CronScheduleEditor({\n cronInput,\n setCronInput,\n setCron,\n hasCronSchedule,\n onSave,\n onClear,\n}: CronScheduleEditorProps) {\n return (\n <>\n <div>\n <SectionLabel className=\"mb-3\">Schedule</SectionLabel>\n <div className=\"flex gap-3 items-start\">\n <div className=\"flex-1\">\n <input\n type=\"text\"\n value={cronInput}\n onChange={(e) => {\n setCronInput(e.target.value);\n setCron.reset();\n }}\n placeholder=\"0 */6 * * *\"\n className=\"input font-mono text-sm w-full\"\n />\n {cronInput.trim() && describeCron(cronInput.trim()) && (\n <p className=\"text-xs text-text-secondary mt-1.5\">\n {describeCron(cronInput.trim())}\n </p>\n )}\n </div>\n <button\n onClick={onSave}\n disabled={setCron.isPending}\n className=\"btn-primary text-xs shrink-0\"\n >\n {setCron.isPending ? 'Saving...' : 'Save'}\n </button>\n {hasCronSchedule && (\n <button\n onClick={onClear}\n disabled={setCron.isPending}\n className=\"btn-ghost text-xs text-status-error shrink-0\"\n >\n Clear\n </button>\n )}\n </div>\n\n {setCron.isSuccess && (\n <p className=\"text-[10px] text-status-success mt-2\">Schedule updated</p>\n )}\n {setCron.error && (\n <p className=\"text-[10px] text-status-error mt-2\">{setCron.error.message}</p>\n )}\n </div>\n\n {/* Common patterns */}\n <div className=\"bg-surface-sunken rounded-lg p-4\">\n <SectionLabel className=\"mb-2\">Common Patterns</SectionLabel>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 gap-x-6 gap-y-1.5\">\n {COMMON_PATTERNS.map(([expr, desc]) => (\n <button\n key={expr}\n type=\"button\"\n onClick={() => {\n setCronInput(expr);\n setCron.reset();\n }}\n className=\"flex items-center gap-2 text-left py-0.5 group\"\n >\n <code className=\"font-mono text-[11px] text-accent group-hover:text-accent-hover\">\n {expr}\n </code>\n <span className=\"text-[10px] text-text-tertiary\">{desc}</span>\n </button>\n ))}\n </div>\n </div>\n </>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { X } from 'lucide-react';\nimport { useSetYamlCron, useClearYamlCron } from '../../../api/yaml-workflows';\nimport { RunAsSelector } from '../form/RunAsSelector';\nimport { CronScheduleEditor } from '../../../pages/workflows/cron/CronScheduleEditor';\nimport { SectionLabel } from '../layout/SectionLabel';\nimport { buildSkeleton } from '../../../pages/mcp/mcp-query-detail/helpers';\nimport type { LTYamlWorkflowRecord } from '../../../api/types';\n\ninterface CronPanelProps {\n workflow: LTYamlWorkflowRecord;\n onClose: () => void;\n}\n\nexport function CronPanel({ workflow, onClose }: CronPanelProps) {\n const setCronMutation = useSetYamlCron();\n const clearCronMutation = useClearYamlCron();\n\n const [cronInput, setCronInput] = useState('');\n const [executeAs, setExecuteAs] = useState('');\n const [jsonMode, setJsonMode] = useState(false);\n const [fields, setFields] = useState<Record<string, any>>({});\n const [argsJson, setArgsJson] = useState('{}');\n\n // Sync state when workflow changes\n useEffect(() => {\n setCronInput(workflow.cron_schedule ?? '');\n setExecuteAs(workflow.execute_as ?? '');\n setCronMutation.reset();\n clearCronMutation.reset();\n\n const envelope = workflow.cron_envelope || {};\n const skeleton = Object.keys(envelope).length > 0\n ? envelope\n : buildSkeleton(workflow.input_schema);\n setFields(skeleton as Record<string, any>);\n setArgsJson(JSON.stringify(skeleton, null, 2));\n setJsonMode(false);\n }, [workflow.id]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const toggleMode = () => {\n if (!jsonMode) {\n setArgsJson(JSON.stringify(fields, null, 2));\n } else {\n try { setFields(JSON.parse(argsJson)); } catch { /* keep fields */ }\n }\n setJsonMode(!jsonMode);\n };\n\n const handleSave = () => {\n let envelope: Record<string, unknown>;\n if (jsonMode) {\n try { envelope = JSON.parse(argsJson); } catch { return; }\n } else {\n envelope = { ...fields };\n }\n\n setCronMutation.mutate({\n id: workflow.id,\n cron_schedule: cronInput.trim(),\n cron_envelope: Object.keys(envelope).length > 0 ? envelope : null,\n execute_as: executeAs || null,\n });\n };\n\n const handleClear = () => {\n clearCronMutation.mutate(workflow.id, {\n onSuccess: () => {\n setCronInput('');\n },\n });\n };\n\n // Combine mutation states for CronScheduleEditor\n const combinedMutation = {\n isPending: setCronMutation.isPending || clearCronMutation.isPending,\n isSuccess: setCronMutation.isSuccess || clearCronMutation.isSuccess,\n error: setCronMutation.error || clearCronMutation.error,\n reset: () => { setCronMutation.reset(); clearCronMutation.reset(); },\n };\n\n return (\n <div className=\"border-l border-surface-border bg-surface-raised flex flex-col h-full\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-surface-border shrink-0\">\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-text-primary truncate\">Cron Schedule</p>\n <code className=\"text-[11px] font-mono text-accent truncate block\">{workflow.graph_topic}</code>\n </div>\n <button onClick={onClose} className=\"p-1 text-text-tertiary hover:text-text-primary shrink-0 ml-2\">\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Scrollable body */}\n <div className=\"flex-1 overflow-y-auto px-4 py-3 space-y-4\">\n <RunAsSelector selected={executeAs} onChange={setExecuteAs} />\n\n <CronScheduleEditor\n cronInput={cronInput}\n setCronInput={setCronInput}\n setCron={combinedMutation}\n hasCronSchedule={!!workflow.cron_schedule}\n onSave={handleSave}\n onClear={handleClear}\n />\n\n {/* Default input for cron invocations */}\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <SectionLabel>Default Input</SectionLabel>\n <button onClick={toggleMode} className=\"text-[10px] text-accent hover:underline\">\n {jsonMode ? 'Form view' : 'JSON view'}\n </button>\n </div>\n\n {jsonMode ? (\n <textarea\n value={argsJson}\n onChange={(e) => setArgsJson(e.target.value)}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-[11px] text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary resize-y\"\n rows={6}\n spellCheck={false}\n />\n ) : (\n <div className=\"space-y-3 max-h-[200px] overflow-y-auto\">\n {Object.entries(fields).map(([key, value]) => (\n <div key={key}>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">{key}</label>\n {typeof value === 'boolean' ? (\n <select\n value={String(value)}\n onChange={(e) => setFields({ ...fields, [key]: e.target.value === 'true' })}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : typeof value === 'object' ? (\n <textarea\n value={JSON.stringify(value, null, 2)}\n onChange={(e) => { try { setFields({ ...fields, [key]: JSON.parse(e.target.value) }); } catch { /* invalid */ } }}\n className=\"w-full min-h-[60px] px-3 py-1.5 bg-surface-sunken border border-surface-border rounded-md font-mono text-xs text-text-primary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n />\n ) : (\n <input\n type={typeof value === 'number' ? 'number' : 'text'}\n value={String(value ?? '')}\n onChange={(e) => setFields({ ...fields, [key]: typeof value === 'number' ? Number(e.target.value) : e.target.value })}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n />\n )}\n </div>\n ))}\n {Object.keys(fields).length === 0 && (\n <p className=\"text-[11px] text-text-tertiary italic\">No input fields defined</p>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import type { LTYamlWorkflowRecord } from '../../api/types';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface ProcessServer {\n appId: string;\n workflows: LTYamlWorkflowRecord[];\n toolCount: number;\n status: string;\n updatedAt: string;\n appVersion: string;\n setId: string | null;\n}\n\n// ── Grouping & filtering helpers ──────────────────────────────────────────────\n\nexport function groupByAppId(workflows: LTYamlWorkflowRecord[]): ProcessServer[] {\n const map = new Map<string, LTYamlWorkflowRecord[]>();\n for (const wf of workflows) {\n const list = map.get(wf.app_id) ?? [];\n list.push(wf);\n map.set(wf.app_id, list);\n }\n\n return [...map.entries()].map(([appId, wfs]) => {\n const statusPriority: Record<string, number> = { active: 0, deployed: 1, draft: 2, archived: 3 };\n const bestStatus = wfs.reduce(\n (best, wf) => ((statusPriority[wf.status] ?? 9) < (statusPriority[best] ?? 9) ? wf.status : best),\n wfs[0].status,\n );\n const latest = wfs.reduce((max, wf) => (wf.updated_at > max ? wf.updated_at : max), wfs[0].updated_at);\n\n const maxAppVersion = wfs.reduce((max, wf) => {\n const v = parseInt(wf.app_version || '0', 10);\n return v > max ? v : max;\n }, 0);\n // Use the set_id from any workflow in the group (they all share the same set)\n const setId = wfs.find(wf => wf.set_id)?.set_id || null;\n\n return {\n appId,\n workflows: wfs,\n toolCount: wfs.length,\n status: bestStatus,\n updatedAt: latest,\n appVersion: String(maxAppVersion),\n setId,\n };\n });\n}\n\n/** Client-side search: match server name or any tool's graph_topic/description */\nexport function matchesSearch(server: ProcessServer, search: string): boolean {\n if (!search) return true;\n const q = search.toLowerCase();\n if (server.appId.toLowerCase().includes(q)) return true;\n return server.workflows.some(\n (wf) =>\n wf.graph_topic.toLowerCase().includes(q) ||\n wf.name?.toLowerCase().includes(q) ||\n wf.description?.toLowerCase().includes(q),\n );\n}\n\n/** Filter tools within a server that match the search term */\nexport function filterTools(workflows: LTYamlWorkflowRecord[], search: string): LTYamlWorkflowRecord[] {\n if (!search) return workflows;\n const q = search.toLowerCase();\n return workflows.filter(\n (wf) =>\n wf.graph_topic.toLowerCase().includes(q) ||\n wf.name?.toLowerCase().includes(q) ||\n wf.description?.toLowerCase().includes(q),\n );\n}\n","import { ChevronRight, Clock, Play, Wand2, Wrench } from 'lucide-react';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\nimport type { ProcessServer } from './yaml-helpers';\nimport type { LTYamlWorkflowRecord } from '../../api/types';\n\n// ── Tool row (individual workflow inside expanded server) ─────────────────────\n\nexport function ToolRow({ wf, onTry, onWizard, onCron }: {\n wf: LTYamlWorkflowRecord;\n onTry: () => void;\n onWizard: () => void;\n onCron: () => void;\n}) {\n const canTry = wf.status === 'active';\n const hasCron = !!wf.cron_schedule;\n\n return (\n <div onClick={canTry ? onTry : undefined} className={`group/row flex items-center hover:bg-surface-hover/50 transition-colors border-b border-surface-border/30 ${canTry ? 'cursor-pointer' : ''}`}>\n <div className=\"flex-1 pl-14 pr-6 py-2 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <code className=\"text-xs font-mono text-accent-primary truncate\">{wf.graph_topic}</code>\n <span className=\"text-[9px] text-text-tertiary font-mono shrink-0\">v{wf.content_version}</span>\n </div>\n {wf.description && (\n <p className=\"text-[10px] text-text-tertiary mt-0.5 line-clamp-1\">{wf.description}</p>\n )}\n </div>\n <div className=\"w-32 px-4 py-2 text-[10px] text-text-tertiary whitespace-nowrap shrink-0\">\n {new Date(wf.updated_at).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}\n </div>\n <div className=\"w-28 px-6 py-2 whitespace-nowrap shrink-0\">\n <StatusBadge status={wf.status} />\n </div>\n <div className=\"w-20 px-3 py-2 flex justify-end gap-2 shrink-0\">\n {canTry && (\n <button\n onClick={(e) => { e.stopPropagation(); onTry(); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent\"\n title=\"Test tool\"\n >\n <Play className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n )}\n <button\n onClick={(e) => { e.stopPropagation(); onCron(); }}\n className={hasCron\n ? 'text-status-success'\n : 'opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent'}\n title={hasCron ? `Cron: ${wf.cron_schedule}` : 'Schedule cron'}\n >\n <Clock className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n {wf.source_workflow_id && (\n <button\n onClick={(e) => { e.stopPropagation(); onWizard(); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent\"\n title=\"MCP Tool Compiler\"\n >\n <Wand2 className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n )}\n </div>\n </div>\n );\n}\n\n// ── Server row (expandable namespace) ────────────────────────────────────────\n\nexport function ServerRow({\n server,\n expanded,\n onToggle,\n onTryTool,\n onWizard,\n onWorkbench,\n onCron,\n visibleTools,\n}: {\n server: ProcessServer;\n expanded: boolean;\n onToggle: () => void;\n onTryTool: (wf: LTYamlWorkflowRecord) => void;\n onWizard: (wf: LTYamlWorkflowRecord) => void;\n onWorkbench: () => void;\n onCron: (wf: LTYamlWorkflowRecord) => void;\n visibleTools: LTYamlWorkflowRecord[];\n}) {\n return (\n <>\n <tr\n onClick={onToggle}\n className=\"group/row border-b transition-colors duration-100 cursor-pointer row-hover\"\n >\n {/* Name + version */}\n <td className=\"px-6 py-3.5\">\n <div className=\"flex items-center gap-2\">\n <span className={`transition-transform duration-150 ${expanded ? 'rotate-90' : ''} text-text-tertiary`}>\n <ChevronRight size={14} />\n </span>\n <p className=\"text-sm text-text-primary font-medium font-mono\">{server.appId}</p>\n <span className=\"text-[9px] text-text-tertiary font-mono\">app v{server.appVersion}</span>\n </div>\n </td>\n\n {/* Status */}\n <td className=\"px-6 py-3.5 w-28 whitespace-nowrap\">\n <StatusBadge status={server.status} />\n </td>\n\n {/* Tool count + workbench */}\n <td className=\"w-20 text-center\">\n <div className=\"flex items-center justify-center gap-2\">\n <span className=\"inline-flex items-center justify-center w-5 h-5 rounded-full border border-accent/30 text-[10px] font-medium text-accent\">\n {server.toolCount}\n </span>\n {server.setId && (\n <button\n onClick={(e) => { e.stopPropagation(); onWorkbench(); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent\"\n title=\"Open workbench\"\n >\n <Wrench className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n )}\n </div>\n </td>\n </tr>\n\n {/* Expanded tool rows — no sub-header, aligned to outer columns */}\n <tr>\n <td colSpan={5} className=\"p-0 border-0\">\n <div\n className=\"grid transition-[grid-template-rows] duration-200 ease-in-out\"\n style={{ gridTemplateRows: expanded ? '1fr' : '0fr' }}\n >\n <div className=\"overflow-hidden\">\n {visibleTools.map((wf) => (\n <ToolRow key={wf.id} wf={wf} onTry={() => onTryTool(wf)} onWizard={() => onWizard(wf)} onCron={() => onCron(wf)} />\n ))}\n <div className=\"h-1 bg-surface-sunken/20\" />\n </div>\n </div>\n </td>\n </tr>\n </>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useYamlWorkflows } from '../../api/yaml-workflows';\nimport { useWorkflowSets } from '../../api/workflow-sets';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { useExpandedRows } from '../../hooks/useExpandedRows';\n\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect, FilterInput } from '../../components/common/data/FilterBar';\nimport { EmptyState } from '../../components/common/display/EmptyState';\nimport { WorkflowTestPanel } from '../../components/common/test/WorkflowTestPanel';\nimport { CronPanel } from '../../components/common/test/CronPanel';\nimport { groupByAppId, matchesSearch, filterTools } from './yaml-helpers';\nimport { ServerRow } from './yaml-workflow-rows';\nimport type { LTYamlWorkflowRecord } from '../../api/types';\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function YamlWorkflowsPage() {\n const navigate = useNavigate();\n const { filters, setFilter } = useFilterParams({\n filters: { status: '', server: '', search: '' },\n });\n\n // Fetch a larger page to get all workflows for grouping\n const { data, isLoading } = useYamlWorkflows({\n status: (filters.status || undefined) as any,\n app_id: filters.server || undefined,\n search: filters.search || undefined,\n limit: 200,\n offset: 0,\n });\n\n const workflows = data?.workflows ?? [];\n\n // Fetch workflow sets to resolve workbench links (set_id → planner workflow ID)\n const { data: setsData } = useWorkflowSets({ limit: 100 });\n const setSourceMap = useMemo(() => {\n const map = new Map<string, string>();\n for (const s of setsData?.sets ?? []) {\n if (s.source_workflow_id) map.set(s.id, s.source_workflow_id);\n }\n return map;\n }, [setsData?.sets]);\n\n const servers = useMemo(() => groupByAppId(workflows), [workflows]);\n\n // Build server options from unfiltered results; re-derive when status/search change\n const serverOptions = useMemo(() => {\n const ids = [...new Set(workflows.map((wf) => wf.app_id))].sort();\n return ids.map((id) => ({ value: id, label: id }));\n }, [workflows]);\n\n // Client-side search filtering for tool-level matches within expanded rows\n const filteredServers = useMemo(() => {\n if (!filters.search) return servers;\n return servers.filter((s) => matchesSearch(s, filters.search));\n }, [servers, filters.search]);\n\n const { expandedIds, toggle: toggleExpand } = useExpandedRows('lt:expanded:yaml-workflows');\n const [tryWorkflow, setTryWorkflow] = useState<LTYamlWorkflowRecord | null>(null);\n const [cronWorkflow, setCronWorkflow] = useState<LTYamlWorkflowRecord | null>(null);\n\n // Active sidebar: test panel or cron panel (mutually exclusive)\n const sidebarWorkflow = tryWorkflow || cronWorkflow;\n\n if (isLoading) {\n return (\n <div>\n <PageHeader title=\"MCP Pipeline Tools\" />\n <div className=\"animate-pulse space-y-0\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"h-14 border-b last:border-b-0 px-6 flex items-center\">\n <div className=\"h-3 bg-surface-sunken rounded w-full\" />\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div>\n <PageHeader\n title=\"MCP Pipeline Tools\"\n actions={\n <button onClick={() => navigate('/mcp/queries')} className=\"btn-primary text-xs\">\n Design Pipeline\n </button>\n }\n />\n\n <p className=\"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed\">\n Compiled from successful triage runs. Each workflow is a deterministic tool.\n </p>\n\n <FilterBar>\n <FilterInput\n label=\"Search\"\n value={filters.search}\n onChange={(v) => setFilter('search', v)}\n placeholder=\"Server or tool name…\"\n />\n {serverOptions.length > 1 && (\n <FilterSelect\n label=\"Server\"\n value={filters.server}\n onChange={(v) => setFilter('server', v)}\n options={serverOptions}\n />\n )}\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'draft', label: 'Draft' },\n { value: 'deployed', label: 'Deployed' },\n { value: 'active', label: 'Active' },\n { value: 'archived', label: 'Archived' },\n ]}\n />\n </FilterBar>\n\n <div className=\"flex gap-0\">\n <div className={`${sidebarWorkflow ? 'flex-1 min-w-0' : 'w-full'} transition-all`}>\n {filteredServers.length === 0 ? (\n <EmptyState title=\"No pipelines yet\" description=\"Use the MCP Tool Designer to create your first MCP tool.\" />\n ) : (\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b\">\n <th className=\"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Server / Tool\n </th>\n <th className=\"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28\">\n Status\n </th>\n <th className=\"sticky top-[2.75rem] z-10 bg-surface w-20\" />\n </tr>\n </thead>\n <tbody>\n {filteredServers.map((server) => (\n <ServerRow\n key={server.appId}\n server={server}\n expanded={expandedIds.has(server.appId)}\n onToggle={() => toggleExpand(server.appId)}\n onTryTool={(wf) => { setCronWorkflow(null); setTryWorkflow(wf); }}\n onWizard={(wf) => {\n if (wf.source_workflow_id) navigate(`/mcp/queries/${wf.source_workflow_id}?step=4`);\n }}\n onWorkbench={() => {\n if (server.setId) {\n const plannerWfId = setSourceMap.get(server.setId);\n if (plannerWfId) {\n navigate(`/mcp/queries/${plannerWfId}?mode=plan&set_id=${server.setId}&step=2`);\n }\n }\n }}\n onCron={(wf) => { setTryWorkflow(null); setCronWorkflow(wf); }}\n visibleTools={filterTools(server.workflows, filters.search)}\n />\n ))}\n </tbody>\n </table>\n )}\n </div>\n\n {tryWorkflow && (\n <div className=\"w-[380px] shrink-0 sticky top-0 h-[calc(100vh-12rem)]\">\n <WorkflowTestPanel\n workflow={tryWorkflow}\n onClose={() => setTryWorkflow(null)}\n />\n </div>\n )}\n\n {cronWorkflow && (\n <div className=\"w-[380px] shrink-0 sticky top-0 h-[calc(100vh-12rem)]\">\n <CronPanel\n workflow={cronWorkflow}\n onClose={() => setCronWorkflow(null)}\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"names":["TOOL_SOURCE_COLORS","LiveTimeline","steps","manifest","isComplete","workerActivities","a","totalSteps","merged","live","s","source","colors","jsxDEV","step","idx","isLast","WorkflowTestPanel","workflow","onClose","invokeMutation","useInvokeYamlWorkflow","jsonMode","setJsonMode","useState","fields","setFields","argsJson","setArgsJson","jsonError","setJsonError","executeAs","setExecuteAs","activeJobId","setActiveJobId","completedResult","setCompletedResult","useYamlActivityEvents","useEffect","skeleton","buildSkeleton","jobId","timer","toggleMode","handleRun","parsed","result","isRunning","ns","X","Link","ExternalLink","RotateCcw","Fragment","RunAsSelector","e","key","value","Play","CronScheduleEditor","cronInput","setCronInput","setCron","hasCronSchedule","onSave","onClear","SectionLabel","describeCron","COMMON_PATTERNS","expr","desc","CronPanel","setCronMutation","useSetYamlCron","clearCronMutation","useClearYamlCron","envelope","handleSave","handleClear","combinedMutation","groupByAppId","workflows","map","wf","list","appId","wfs","statusPriority","bestStatus","best","latest","max","maxAppVersion","v","setId","_a","matchesSearch","server","search","q","_b","filterTools","ToolRow","onTry","onWizard","onCron","canTry","hasCron","StatusBadge","Clock","Wand2","ServerRow","expanded","onToggle","onTryTool","onWorkbench","visibleTools","ChevronRight","Wrench","YamlWorkflowsPage","navigate","useNavigate","filters","setFilter","useFilterParams","data","isLoading","useYamlWorkflows","setsData","useWorkflowSets","setSourceMap","useMemo","servers","serverOptions","id","filteredServers","expandedIds","toggleExpand","useExpandedRows","tryWorkflow","setTryWorkflow","cronWorkflow","setCronWorkflow","sidebarWorkflow","PageHeader","_","FilterBar","FilterInput","FilterSelect","EmptyState","plannerWfId"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"YamlWorkflowsPage-C_MkAp2i.js","sources":["../../src/components/common/test/WorkflowTestPanel.tsx","../../src/pages/workflows/cron/CronScheduleEditor.tsx","../../src/components/common/test/CronPanel.tsx","../../src/pages/workflows/yaml-helpers.ts","../../src/pages/workflows/yaml-workflow-rows.tsx","../../src/pages/workflows/YamlWorkflowsPage.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport { Link } from 'react-router-dom';\nimport { X, Play, RotateCcw, ExternalLink } from 'lucide-react';\nimport { useInvokeYamlWorkflow } from '../../../api/yaml-workflows';\nimport { useYamlActivityEvents, type ActivityStep } from '../../../hooks/useYamlActivityEvents';\nimport { RunAsSelector } from '../form/RunAsSelector';\nimport type { LTYamlWorkflowRecord, ActivityManifestEntry } from '../../../api/types';\nimport { buildSkeleton } from '../../../pages/mcp/mcp-query-detail/helpers';\n\nconst TOOL_SOURCE_COLORS: Record<string, { border: string; text: string; icon: string }> = {\n mcp: { border: 'border-blue-500', text: 'text-blue-500', icon: 'MCP' },\n db: { border: 'border-blue-500', text: 'text-blue-500', icon: 'DB' },\n llm: { border: 'border-violet-500', text: 'text-violet-500', icon: 'LLM' },\n transform: { border: 'border-emerald-500', text: 'text-emerald-500', icon: 'Map' },\n};\n\nfunction LiveTimeline({ steps, manifest, isComplete }: {\n steps: ActivityStep[];\n manifest: ActivityManifestEntry[];\n isComplete: boolean;\n}) {\n const workerActivities = manifest.filter((a) => a.type === 'worker');\n const totalSteps = workerActivities.length;\n\n const merged = workerActivities.map((a) => {\n const live = steps.find((s) => s.activityId === a.activity_id);\n const source = a.tool_source || 'mcp';\n const colors = TOOL_SOURCE_COLORS[source] || TOOL_SOURCE_COLORS.mcp;\n return {\n activityId: a.activity_id,\n title: a.title || a.mcp_tool_name || a.activity_id,\n toolName: a.mcp_tool_name,\n colors,\n status: live?.status || 'pending' as const,\n error: live?.error,\n };\n });\n\n return (\n <div>\n <p className=\"text-[11px] text-text-secondary mb-3\">\n {isComplete\n ? `All ${totalSteps} steps completed`\n : `Running step ${merged.filter((s) => s.status === 'completed').length + 1} of ${totalSteps}...`}\n </p>\n <div className=\"space-y-0\">\n {merged.map((step, idx) => {\n const isLast = idx === merged.length - 1;\n return (\n <div key={step.activityId} className=\"flex items-stretch gap-2\">\n <div className=\"flex flex-col items-center w-4 shrink-0\">\n <span className={`w-2.5 h-2.5 rounded-full shrink-0 border-2 transition-colors ${\n step.status === 'completed' ? 'bg-status-success border-status-success'\n : step.status === 'running' ? `${step.colors.border} bg-transparent animate-pulse`\n : step.status === 'failed' ? 'bg-status-error border-status-error'\n : 'bg-surface-sunken border-surface-border'\n }`} />\n {!isLast && (\n <span className={`w-px flex-1 transition-colors ${\n step.status === 'completed' ? 'bg-status-success/30' : 'bg-surface-border'\n }`} />\n )}\n </div>\n <div className={isLast ? '' : 'pb-3'}>\n <p className={`text-[11px] font-medium ${\n step.status === 'running' ? 'text-text-primary'\n : step.status === 'completed' ? 'text-text-secondary'\n : step.status === 'failed' ? 'text-status-error'\n : 'text-text-tertiary'\n }`}>{step.title}</p>\n {step.toolName && (\n <span className=\"text-[9px] text-text-tertiary font-mono\">{step.toolName}</span>\n )}\n {step.error && (\n <p className=\"text-[9px] text-status-error mt-0.5\">{step.error}</p>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\ninterface WorkflowTestPanelProps {\n workflow: LTYamlWorkflowRecord;\n onClose: () => void;\n}\n\nexport function WorkflowTestPanel({ workflow, onClose }: WorkflowTestPanelProps) {\n const invokeMutation = useInvokeYamlWorkflow();\n const [jsonMode, setJsonMode] = useState(false);\n const [fields, setFields] = useState<Record<string, any>>({});\n const [argsJson, setArgsJson] = useState('');\n const [jsonError, setJsonError] = useState('');\n const [executeAs, setExecuteAs] = useState('');\n const [activeJobId, setActiveJobId] = useState<string | null>(null);\n const [completedResult, setCompletedResult] = useState<{ jobId: string } | null>(null);\n const { steps, isComplete } = useYamlActivityEvents(activeJobId);\n\n useEffect(() => {\n setActiveJobId(null);\n setCompletedResult(null);\n setJsonError('');\n invokeMutation.reset();\n const skeleton = buildSkeleton(workflow.input_schema);\n setFields(skeleton);\n setArgsJson(JSON.stringify(skeleton, null, 2));\n setJsonMode(false);\n }, [workflow.id]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n if (isComplete && activeJobId) {\n const jobId = activeJobId;\n const timer = setTimeout(() => {\n setCompletedResult({ jobId });\n setActiveJobId(null);\n }, 800);\n return () => clearTimeout(timer);\n }\n }, [isComplete, activeJobId]);\n\n const toggleMode = () => {\n if (!jsonMode) {\n setArgsJson(JSON.stringify(fields, null, 2));\n } else {\n try { setFields(JSON.parse(argsJson)); } catch { /* keep fields */ }\n }\n setJsonMode(!jsonMode);\n };\n\n const handleRun = async () => {\n setJsonError('');\n setCompletedResult(null);\n let parsed: Record<string, unknown>;\n if (jsonMode) {\n try { parsed = JSON.parse(argsJson); } catch { setJsonError('Invalid JSON'); return; }\n } else {\n parsed = { ...fields };\n }\n try {\n const result = await invokeMutation.mutateAsync({\n id: workflow.id,\n data: parsed,\n sync: false,\n ...(executeAs ? { execute_as: executeAs } : {}),\n });\n if (result.job_id) setActiveJobId(result.job_id);\n } catch { /* error shown in panel */ }\n };\n\n const isRunning = !!activeJobId;\n const ns = workflow.app_id || 'longtail';\n\n return (\n <div className=\"border-l border-surface-border bg-surface-raised flex flex-col h-full\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-surface-border shrink-0\">\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-text-primary truncate\">{workflow.app_id}</p>\n <code className=\"text-[11px] font-mono text-accent truncate block\">{workflow.graph_topic}</code>\n </div>\n <button onClick={() => { if (!isRunning) onClose(); }} className=\"p-1 text-text-tertiary hover:text-text-primary shrink-0 ml-2\">\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Scrollable body */}\n <div className=\"flex-1 overflow-y-auto px-4 py-3 space-y-4\">\n {isRunning ? (\n <LiveTimeline steps={steps} manifest={workflow.activity_manifest} isComplete={isComplete} />\n ) : completedResult ? (\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-4 h-4 text-status-success\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 1a7 7 0 110 14A7 7 0 018 1zm3.36 4.65a.5.5 0 00-.72 0L7 9.29 5.36 7.65a.5.5 0 10-.72.7l2 2a.5.5 0 00.72 0l4-4a.5.5 0 000-.7z\" />\n </svg>\n <p className=\"text-xs font-medium text-status-success\">Workflow completed</p>\n </div>\n <div className=\"flex items-center justify-between\">\n <Link\n to={`/mcp/executions/${encodeURIComponent(completedResult.jobId)}?namespace=${encodeURIComponent(ns)}`}\n className=\"inline-flex items-center gap-1.5 text-xs text-accent hover:underline\"\n >\n <ExternalLink size={12} /> View execution\n </Link>\n <button\n onClick={() => setCompletedResult(null)}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <RotateCcw size={12} /> Run again\n </button>\n </div>\n </div>\n ) : (\n <>\n <RunAsSelector selected={executeAs} onChange={setExecuteAs} />\n\n {workflow.description && (\n <p className=\"text-[11px] text-text-secondary leading-relaxed\">{workflow.description}</p>\n )}\n\n {/* Form / JSON toggle input */}\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <label className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">Input</label>\n <button onClick={toggleMode} className=\"text-[10px] text-accent hover:underline\">\n {jsonMode ? 'Form view' : 'JSON view'}\n </button>\n </div>\n\n {jsonMode ? (\n <textarea\n value={argsJson}\n onChange={(e) => setArgsJson(e.target.value)}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-[11px] text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary resize-y\"\n rows={6}\n spellCheck={false}\n />\n ) : (\n <div className=\"space-y-3 max-h-[300px] overflow-y-auto\">\n {Object.entries(fields).map(([key, value]) => (\n <div key={key}>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">{key}</label>\n {typeof value === 'boolean' ? (\n <select\n value={String(value)}\n onChange={(e) => setFields({ ...fields, [key]: e.target.value === 'true' })}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : typeof value === 'object' ? (\n <textarea\n value={JSON.stringify(value, null, 2)}\n onChange={(e) => { try { setFields({ ...fields, [key]: JSON.parse(e.target.value) }); } catch { /* invalid */ } }}\n className=\"w-full min-h-[60px] px-3 py-1.5 bg-surface-sunken border border-surface-border rounded-md font-mono text-xs text-text-primary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n />\n ) : (\n <input\n type={typeof value === 'number' ? 'number' : 'text'}\n value={String(value ?? '')}\n onChange={(e) => setFields({ ...fields, [key]: typeof value === 'number' ? Number(e.target.value) : e.target.value })}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n />\n )}\n </div>\n ))}\n {Object.keys(fields).length === 0 && (\n <p className=\"text-[11px] text-text-tertiary italic\">No input fields defined</p>\n )}\n </div>\n )}\n {jsonError && <p className=\"text-[11px] text-status-error mt-1\">{jsonError}</p>}\n </div>\n\n {invokeMutation.isError && (\n <div className=\"bg-status-error/10 border border-status-error/20 rounded-md px-3 py-2\">\n <p className=\"text-[11px] text-status-error\">\n {invokeMutation.error instanceof Error ? invokeMutation.error.message : 'Invocation failed'}\n </p>\n </div>\n )}\n <button\n onClick={handleRun}\n disabled={invokeMutation.isPending}\n className=\"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5\"\n >\n {invokeMutation.isPending ? 'Starting...' : <><Play size={12} /> Run</>}\n </button>\n </>\n )}\n </div>\n </div>\n );\n}\n","import { SectionLabel } from '../../../components/common/layout/SectionLabel';\nimport { describeCron, COMMON_PATTERNS } from './helpers';\n\ninterface CronScheduleEditorProps {\n cronInput: string;\n setCronInput: (value: string) => void;\n setCron: { isPending: boolean; isSuccess: boolean; error: Error | null; reset: () => void };\n hasCronSchedule: boolean;\n onSave: () => void;\n onClear: () => void;\n}\n\nexport function CronScheduleEditor({\n cronInput,\n setCronInput,\n setCron,\n hasCronSchedule,\n onSave,\n onClear,\n}: CronScheduleEditorProps) {\n return (\n <>\n <div>\n <SectionLabel className=\"mb-3\">Schedule</SectionLabel>\n <div className=\"flex gap-3 items-start\">\n <div className=\"flex-1\">\n <input\n type=\"text\"\n value={cronInput}\n onChange={(e) => {\n setCronInput(e.target.value);\n setCron.reset();\n }}\n placeholder=\"0 */6 * * *\"\n className=\"input font-mono text-sm w-full\"\n />\n {cronInput.trim() && describeCron(cronInput.trim()) && (\n <p className=\"text-xs text-text-secondary mt-1.5\">\n {describeCron(cronInput.trim())}\n </p>\n )}\n </div>\n <button\n onClick={onSave}\n disabled={setCron.isPending}\n className=\"btn-primary text-xs shrink-0\"\n >\n {setCron.isPending ? 'Saving...' : 'Save'}\n </button>\n {hasCronSchedule && (\n <button\n onClick={onClear}\n disabled={setCron.isPending}\n className=\"btn-ghost text-xs text-status-error shrink-0\"\n >\n Clear\n </button>\n )}\n </div>\n\n {setCron.isSuccess && (\n <p className=\"text-[10px] text-status-success mt-2\">Schedule updated</p>\n )}\n {setCron.error && (\n <p className=\"text-[10px] text-status-error mt-2\">{setCron.error.message}</p>\n )}\n </div>\n\n {/* Common patterns */}\n <div className=\"bg-surface-sunken rounded-lg p-4\">\n <SectionLabel className=\"mb-2\">Common Patterns</SectionLabel>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 gap-x-6 gap-y-1.5\">\n {COMMON_PATTERNS.map(([expr, desc]) => (\n <button\n key={expr}\n type=\"button\"\n onClick={() => {\n setCronInput(expr);\n setCron.reset();\n }}\n className=\"flex items-center gap-2 text-left py-0.5 group\"\n >\n <code className=\"font-mono text-[11px] text-accent group-hover:text-accent-hover\">\n {expr}\n </code>\n <span className=\"text-[10px] text-text-tertiary\">{desc}</span>\n </button>\n ))}\n </div>\n </div>\n </>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { X } from 'lucide-react';\nimport { useSetYamlCron, useClearYamlCron } from '../../../api/yaml-workflows';\nimport { RunAsSelector } from '../form/RunAsSelector';\nimport { CronScheduleEditor } from '../../../pages/workflows/cron/CronScheduleEditor';\nimport { SectionLabel } from '../layout/SectionLabel';\nimport { buildSkeleton } from '../../../pages/mcp/mcp-query-detail/helpers';\nimport type { LTYamlWorkflowRecord } from '../../../api/types';\n\ninterface CronPanelProps {\n workflow: LTYamlWorkflowRecord;\n onClose: () => void;\n}\n\nexport function CronPanel({ workflow, onClose }: CronPanelProps) {\n const setCronMutation = useSetYamlCron();\n const clearCronMutation = useClearYamlCron();\n\n const [cronInput, setCronInput] = useState('');\n const [executeAs, setExecuteAs] = useState('');\n const [jsonMode, setJsonMode] = useState(false);\n const [fields, setFields] = useState<Record<string, any>>({});\n const [argsJson, setArgsJson] = useState('{}');\n\n // Sync state when workflow changes\n useEffect(() => {\n setCronInput(workflow.cron_schedule ?? '');\n setExecuteAs(workflow.execute_as ?? '');\n setCronMutation.reset();\n clearCronMutation.reset();\n\n const envelope = workflow.cron_envelope || {};\n const skeleton = Object.keys(envelope).length > 0\n ? envelope\n : buildSkeleton(workflow.input_schema);\n setFields(skeleton as Record<string, any>);\n setArgsJson(JSON.stringify(skeleton, null, 2));\n setJsonMode(false);\n }, [workflow.id]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const toggleMode = () => {\n if (!jsonMode) {\n setArgsJson(JSON.stringify(fields, null, 2));\n } else {\n try { setFields(JSON.parse(argsJson)); } catch { /* keep fields */ }\n }\n setJsonMode(!jsonMode);\n };\n\n const handleSave = () => {\n let envelope: Record<string, unknown>;\n if (jsonMode) {\n try { envelope = JSON.parse(argsJson); } catch { return; }\n } else {\n envelope = { ...fields };\n }\n\n setCronMutation.mutate({\n id: workflow.id,\n cron_schedule: cronInput.trim(),\n cron_envelope: Object.keys(envelope).length > 0 ? envelope : null,\n execute_as: executeAs || null,\n });\n };\n\n const handleClear = () => {\n clearCronMutation.mutate(workflow.id, {\n onSuccess: () => {\n setCronInput('');\n },\n });\n };\n\n // Combine mutation states for CronScheduleEditor\n const combinedMutation = {\n isPending: setCronMutation.isPending || clearCronMutation.isPending,\n isSuccess: setCronMutation.isSuccess || clearCronMutation.isSuccess,\n error: setCronMutation.error || clearCronMutation.error,\n reset: () => { setCronMutation.reset(); clearCronMutation.reset(); },\n };\n\n return (\n <div className=\"border-l border-surface-border bg-surface-raised flex flex-col h-full\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-surface-border shrink-0\">\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-text-primary truncate\">Cron Schedule</p>\n <code className=\"text-[11px] font-mono text-accent truncate block\">{workflow.graph_topic}</code>\n </div>\n <button onClick={onClose} className=\"p-1 text-text-tertiary hover:text-text-primary shrink-0 ml-2\">\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Scrollable body */}\n <div className=\"flex-1 overflow-y-auto px-4 py-3 space-y-4\">\n <RunAsSelector selected={executeAs} onChange={setExecuteAs} />\n\n <CronScheduleEditor\n cronInput={cronInput}\n setCronInput={setCronInput}\n setCron={combinedMutation}\n hasCronSchedule={!!workflow.cron_schedule}\n onSave={handleSave}\n onClear={handleClear}\n />\n\n {/* Default input for cron invocations */}\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <SectionLabel>Default Input</SectionLabel>\n <button onClick={toggleMode} className=\"text-[10px] text-accent hover:underline\">\n {jsonMode ? 'Form view' : 'JSON view'}\n </button>\n </div>\n\n {jsonMode ? (\n <textarea\n value={argsJson}\n onChange={(e) => setArgsJson(e.target.value)}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-[11px] text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary resize-y\"\n rows={6}\n spellCheck={false}\n />\n ) : (\n <div className=\"space-y-3 max-h-[200px] overflow-y-auto\">\n {Object.entries(fields).map(([key, value]) => (\n <div key={key}>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">{key}</label>\n {typeof value === 'boolean' ? (\n <select\n value={String(value)}\n onChange={(e) => setFields({ ...fields, [key]: e.target.value === 'true' })}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : typeof value === 'object' ? (\n <textarea\n value={JSON.stringify(value, null, 2)}\n onChange={(e) => { try { setFields({ ...fields, [key]: JSON.parse(e.target.value) }); } catch { /* invalid */ } }}\n className=\"w-full min-h-[60px] px-3 py-1.5 bg-surface-sunken border border-surface-border rounded-md font-mono text-xs text-text-primary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n />\n ) : (\n <input\n type={typeof value === 'number' ? 'number' : 'text'}\n value={String(value ?? '')}\n onChange={(e) => setFields({ ...fields, [key]: typeof value === 'number' ? Number(e.target.value) : e.target.value })}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n />\n )}\n </div>\n ))}\n {Object.keys(fields).length === 0 && (\n <p className=\"text-[11px] text-text-tertiary italic\">No input fields defined</p>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import type { LTYamlWorkflowRecord } from '../../api/types';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface ProcessServer {\n appId: string;\n workflows: LTYamlWorkflowRecord[];\n toolCount: number;\n status: string;\n updatedAt: string;\n appVersion: string;\n setId: string | null;\n}\n\n// ── Grouping & filtering helpers ──────────────────────────────────────────────\n\nexport function groupByAppId(workflows: LTYamlWorkflowRecord[]): ProcessServer[] {\n const map = new Map<string, LTYamlWorkflowRecord[]>();\n for (const wf of workflows) {\n const list = map.get(wf.app_id) ?? [];\n list.push(wf);\n map.set(wf.app_id, list);\n }\n\n return [...map.entries()].map(([appId, wfs]) => {\n const statusPriority: Record<string, number> = { active: 0, deployed: 1, draft: 2, archived: 3 };\n const bestStatus = wfs.reduce(\n (best, wf) => ((statusPriority[wf.status] ?? 9) < (statusPriority[best] ?? 9) ? wf.status : best),\n wfs[0].status,\n );\n const latest = wfs.reduce((max, wf) => (wf.updated_at > max ? wf.updated_at : max), wfs[0].updated_at);\n\n const maxAppVersion = wfs.reduce((max, wf) => {\n const v = parseInt(wf.app_version || '0', 10);\n return v > max ? v : max;\n }, 0);\n // Use the set_id from any workflow in the group (they all share the same set)\n const setId = wfs.find(wf => wf.set_id)?.set_id || null;\n\n return {\n appId,\n workflows: wfs,\n toolCount: wfs.length,\n status: bestStatus,\n updatedAt: latest,\n appVersion: String(maxAppVersion),\n setId,\n };\n });\n}\n\n/** Client-side search: match server name or any tool's graph_topic/description */\nexport function matchesSearch(server: ProcessServer, search: string): boolean {\n if (!search) return true;\n const q = search.toLowerCase();\n if (server.appId.toLowerCase().includes(q)) return true;\n return server.workflows.some(\n (wf) =>\n wf.graph_topic.toLowerCase().includes(q) ||\n wf.name?.toLowerCase().includes(q) ||\n wf.description?.toLowerCase().includes(q),\n );\n}\n\n/** Filter tools within a server that match the search term */\nexport function filterTools(workflows: LTYamlWorkflowRecord[], search: string): LTYamlWorkflowRecord[] {\n if (!search) return workflows;\n const q = search.toLowerCase();\n return workflows.filter(\n (wf) =>\n wf.graph_topic.toLowerCase().includes(q) ||\n wf.name?.toLowerCase().includes(q) ||\n wf.description?.toLowerCase().includes(q),\n );\n}\n","import { ChevronRight, Clock, Play, Wand2, Wrench } from 'lucide-react';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\nimport type { ProcessServer } from './yaml-helpers';\nimport type { LTYamlWorkflowRecord } from '../../api/types';\n\n// ── Tool row (individual workflow inside expanded server) ─────────────────────\n\nexport function ToolRow({ wf, onTry, onWizard, onCron }: {\n wf: LTYamlWorkflowRecord;\n onTry: () => void;\n onWizard: () => void;\n onCron: () => void;\n}) {\n const canTry = wf.status === 'active';\n const hasCron = !!wf.cron_schedule;\n\n return (\n <div onClick={canTry ? onTry : undefined} className={`group/row flex items-center hover:bg-surface-hover/50 transition-colors border-b border-surface-border/30 ${canTry ? 'cursor-pointer' : ''}`}>\n <div className=\"flex-1 pl-14 pr-6 py-2 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <code className=\"text-xs font-mono text-accent-primary truncate\">{wf.graph_topic}</code>\n <span className=\"text-[9px] text-text-tertiary font-mono shrink-0\">v{wf.content_version}</span>\n </div>\n {wf.description && (\n <p className=\"text-[10px] text-text-tertiary mt-0.5 line-clamp-1\">{wf.description}</p>\n )}\n </div>\n <div className=\"w-32 px-4 py-2 text-[10px] text-text-tertiary whitespace-nowrap shrink-0\">\n {new Date(wf.updated_at).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}\n </div>\n <div className=\"w-28 px-6 py-2 whitespace-nowrap shrink-0\">\n <StatusBadge status={wf.status} />\n </div>\n <div className=\"w-20 px-3 py-2 flex justify-end gap-2 shrink-0\">\n {canTry && (\n <button\n onClick={(e) => { e.stopPropagation(); onTry(); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent\"\n title=\"Test tool\"\n >\n <Play className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n )}\n <button\n onClick={(e) => { e.stopPropagation(); onCron(); }}\n className={hasCron\n ? 'text-status-success'\n : 'opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent'}\n title={hasCron ? `Cron: ${wf.cron_schedule}` : 'Schedule cron'}\n >\n <Clock className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n {wf.source_workflow_id && (\n <button\n onClick={(e) => { e.stopPropagation(); onWizard(); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent\"\n title=\"MCP Tool Compiler\"\n >\n <Wand2 className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n )}\n </div>\n </div>\n );\n}\n\n// ── Server row (expandable namespace) ────────────────────────────────────────\n\nexport function ServerRow({\n server,\n expanded,\n onToggle,\n onTryTool,\n onWizard,\n onWorkbench,\n onCron,\n visibleTools,\n}: {\n server: ProcessServer;\n expanded: boolean;\n onToggle: () => void;\n onTryTool: (wf: LTYamlWorkflowRecord) => void;\n onWizard: (wf: LTYamlWorkflowRecord) => void;\n onWorkbench: () => void;\n onCron: (wf: LTYamlWorkflowRecord) => void;\n visibleTools: LTYamlWorkflowRecord[];\n}) {\n return (\n <>\n <tr\n onClick={onToggle}\n className=\"group/row border-b transition-colors duration-100 cursor-pointer row-hover\"\n >\n {/* Name + version */}\n <td className=\"px-6 py-3.5\">\n <div className=\"flex items-center gap-2\">\n <span className={`transition-transform duration-150 ${expanded ? 'rotate-90' : ''} text-text-tertiary`}>\n <ChevronRight size={14} />\n </span>\n <p className=\"text-sm text-text-primary font-medium font-mono\">{server.appId}</p>\n <span className=\"text-[9px] text-text-tertiary font-mono\">app v{server.appVersion}</span>\n </div>\n </td>\n\n {/* Status */}\n <td className=\"px-6 py-3.5 w-28 whitespace-nowrap\">\n <StatusBadge status={server.status} />\n </td>\n\n {/* Tool count + workbench */}\n <td className=\"w-20 text-center\">\n <div className=\"flex items-center justify-center gap-2\">\n <span className=\"inline-flex items-center justify-center w-5 h-5 rounded-full border border-accent/30 text-[10px] font-medium text-accent\">\n {server.toolCount}\n </span>\n {server.setId && (\n <button\n onClick={(e) => { e.stopPropagation(); onWorkbench(); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent\"\n title=\"Open workbench\"\n >\n <Wrench className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n )}\n </div>\n </td>\n </tr>\n\n {/* Expanded tool rows — no sub-header, aligned to outer columns */}\n <tr>\n <td colSpan={5} className=\"p-0 border-0\">\n <div\n className=\"grid transition-[grid-template-rows] duration-200 ease-in-out\"\n style={{ gridTemplateRows: expanded ? '1fr' : '0fr' }}\n >\n <div className=\"overflow-hidden\">\n {visibleTools.map((wf) => (\n <ToolRow key={wf.id} wf={wf} onTry={() => onTryTool(wf)} onWizard={() => onWizard(wf)} onCron={() => onCron(wf)} />\n ))}\n <div className=\"h-1 bg-surface-sunken/20\" />\n </div>\n </div>\n </td>\n </tr>\n </>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useYamlWorkflows } from '../../api/yaml-workflows';\nimport { useWorkflowSets } from '../../api/workflow-sets';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { useExpandedRows } from '../../hooks/useExpandedRows';\n\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect, FilterInput } from '../../components/common/data/FilterBar';\nimport { EmptyState } from '../../components/common/display/EmptyState';\nimport { WorkflowTestPanel } from '../../components/common/test/WorkflowTestPanel';\nimport { CronPanel } from '../../components/common/test/CronPanel';\nimport { groupByAppId, matchesSearch, filterTools } from './yaml-helpers';\nimport { ServerRow } from './yaml-workflow-rows';\nimport type { LTYamlWorkflowRecord } from '../../api/types';\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function YamlWorkflowsPage() {\n const navigate = useNavigate();\n const { filters, setFilter } = useFilterParams({\n filters: { status: '', server: '', search: '' },\n });\n\n // Fetch a larger page to get all workflows for grouping\n const { data, isLoading } = useYamlWorkflows({\n status: (filters.status || undefined) as any,\n app_id: filters.server || undefined,\n search: filters.search || undefined,\n limit: 200,\n offset: 0,\n });\n\n const workflows = data?.workflows ?? [];\n\n // Fetch workflow sets to resolve workbench links (set_id → planner workflow ID)\n const { data: setsData } = useWorkflowSets({ limit: 100 });\n const setSourceMap = useMemo(() => {\n const map = new Map<string, string>();\n for (const s of setsData?.sets ?? []) {\n if (s.source_workflow_id) map.set(s.id, s.source_workflow_id);\n }\n return map;\n }, [setsData?.sets]);\n\n const servers = useMemo(() => groupByAppId(workflows), [workflows]);\n\n // Build server options from unfiltered results; re-derive when status/search change\n const serverOptions = useMemo(() => {\n const ids = [...new Set(workflows.map((wf) => wf.app_id))].sort();\n return ids.map((id) => ({ value: id, label: id }));\n }, [workflows]);\n\n // Client-side search filtering for tool-level matches within expanded rows\n const filteredServers = useMemo(() => {\n if (!filters.search) return servers;\n return servers.filter((s) => matchesSearch(s, filters.search));\n }, [servers, filters.search]);\n\n const { expandedIds, toggle: toggleExpand } = useExpandedRows('lt:expanded:yaml-workflows');\n const [tryWorkflow, setTryWorkflow] = useState<LTYamlWorkflowRecord | null>(null);\n const [cronWorkflow, setCronWorkflow] = useState<LTYamlWorkflowRecord | null>(null);\n\n // Active sidebar: test panel or cron panel (mutually exclusive)\n const sidebarWorkflow = tryWorkflow || cronWorkflow;\n\n if (isLoading) {\n return (\n <div>\n <PageHeader title=\"MCP Pipeline Tools\" />\n <div className=\"animate-pulse space-y-0\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"h-14 border-b last:border-b-0 px-6 flex items-center\">\n <div className=\"h-3 bg-surface-sunken rounded w-full\" />\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div>\n <PageHeader\n title=\"MCP Pipeline Tools\"\n actions={\n <button onClick={() => navigate('/mcp/queries')} className=\"btn-primary text-xs\">\n Design Pipeline\n </button>\n }\n />\n\n <p className=\"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed\">\n Compiled from successful triage runs. Each workflow is a deterministic tool.\n </p>\n\n <FilterBar>\n <FilterInput\n label=\"Search\"\n value={filters.search}\n onChange={(v) => setFilter('search', v)}\n placeholder=\"Server or tool name…\"\n />\n {serverOptions.length > 1 && (\n <FilterSelect\n label=\"Server\"\n value={filters.server}\n onChange={(v) => setFilter('server', v)}\n options={serverOptions}\n />\n )}\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'draft', label: 'Draft' },\n { value: 'deployed', label: 'Deployed' },\n { value: 'active', label: 'Active' },\n { value: 'archived', label: 'Archived' },\n ]}\n />\n </FilterBar>\n\n <div className=\"flex gap-0\">\n <div className={`${sidebarWorkflow ? 'flex-1 min-w-0' : 'w-full'} transition-all`}>\n {filteredServers.length === 0 ? (\n <EmptyState title=\"No pipelines yet\" description=\"Use the MCP Tool Designer to create your first MCP tool.\" />\n ) : (\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b\">\n <th className=\"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Server / Tool\n </th>\n <th className=\"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28\">\n Status\n </th>\n <th className=\"sticky top-[2.75rem] z-10 bg-surface w-20\" />\n </tr>\n </thead>\n <tbody>\n {filteredServers.map((server) => (\n <ServerRow\n key={server.appId}\n server={server}\n expanded={expandedIds.has(server.appId)}\n onToggle={() => toggleExpand(server.appId)}\n onTryTool={(wf) => { setCronWorkflow(null); setTryWorkflow(wf); }}\n onWizard={(wf) => {\n if (wf.source_workflow_id) navigate(`/mcp/queries/${wf.source_workflow_id}?step=4`);\n }}\n onWorkbench={() => {\n if (server.setId) {\n const plannerWfId = setSourceMap.get(server.setId);\n if (plannerWfId) {\n navigate(`/mcp/queries/${plannerWfId}?mode=plan&set_id=${server.setId}&step=2`);\n }\n }\n }}\n onCron={(wf) => { setTryWorkflow(null); setCronWorkflow(wf); }}\n visibleTools={filterTools(server.workflows, filters.search)}\n />\n ))}\n </tbody>\n </table>\n )}\n </div>\n\n {tryWorkflow && (\n <div className=\"w-[380px] shrink-0 sticky top-0 h-[calc(100vh-12rem)]\">\n <WorkflowTestPanel\n workflow={tryWorkflow}\n onClose={() => setTryWorkflow(null)}\n />\n </div>\n )}\n\n {cronWorkflow && (\n <div className=\"w-[380px] shrink-0 sticky top-0 h-[calc(100vh-12rem)]\">\n <CronPanel\n workflow={cronWorkflow}\n onClose={() => setCronWorkflow(null)}\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"names":["TOOL_SOURCE_COLORS","LiveTimeline","steps","manifest","isComplete","workerActivities","a","totalSteps","merged","live","s","source","colors","jsxDEV","step","idx","isLast","WorkflowTestPanel","workflow","onClose","invokeMutation","useInvokeYamlWorkflow","jsonMode","setJsonMode","useState","fields","setFields","argsJson","setArgsJson","jsonError","setJsonError","executeAs","setExecuteAs","activeJobId","setActiveJobId","completedResult","setCompletedResult","useYamlActivityEvents","useEffect","skeleton","buildSkeleton","jobId","timer","toggleMode","handleRun","parsed","result","isRunning","ns","X","Link","ExternalLink","RotateCcw","Fragment","RunAsSelector","e","key","value","Play","CronScheduleEditor","cronInput","setCronInput","setCron","hasCronSchedule","onSave","onClear","SectionLabel","describeCron","COMMON_PATTERNS","expr","desc","CronPanel","setCronMutation","useSetYamlCron","clearCronMutation","useClearYamlCron","envelope","handleSave","handleClear","combinedMutation","groupByAppId","workflows","map","wf","list","appId","wfs","statusPriority","bestStatus","best","latest","max","maxAppVersion","v","setId","_a","matchesSearch","server","search","q","_b","filterTools","ToolRow","onTry","onWizard","onCron","canTry","hasCron","StatusBadge","Clock","Wand2","ServerRow","expanded","onToggle","onTryTool","onWorkbench","visibleTools","ChevronRight","Wrench","YamlWorkflowsPage","navigate","useNavigate","filters","setFilter","useFilterParams","data","isLoading","useYamlWorkflows","setsData","useWorkflowSets","setSourceMap","useMemo","servers","serverOptions","id","filteredServers","expandedIds","toggleExpand","useExpandedRows","tryWorkflow","setTryWorkflow","cronWorkflow","setCronWorkflow","sidebarWorkflow","PageHeader","_","FilterBar","FilterInput","FilterSelect","EmptyState","plannerWfId"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{b as s,c as u,u as a}from"./vendor-query-DLp59M9_.js";import{b as n}from"./index-
|
|
2
|
-
//# sourceMappingURL=bots-
|
|
1
|
+
import{b as s,c as u,u as a}from"./vendor-query-DLp59M9_.js";import{b as n}from"./index-sNrqYt0Q.js";function y(e={}){const t=new URLSearchParams;return e.limit&&t.set("limit",String(e.limit)),e.offset!==void 0&&t.set("offset",String(e.offset)),a({queryKey:["bots",e],queryFn:()=>n(`/bot-accounts?${t}`)})}function d(e){return a({queryKey:["bots",e,"api-keys"],queryFn:()=>n(`/bot-accounts/${e}/api-keys`),enabled:!!e})}function b(){const e=s();return u({mutationFn:t=>n("/bot-accounts",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>{e.invalidateQueries({queryKey:["bots"]})}})}function m(){const e=s();return u({mutationFn:({id:t,...o})=>n(`/bot-accounts/${t}`,{method:"PUT",body:JSON.stringify(o)}),onSuccess:()=>{e.invalidateQueries({queryKey:["bots"]})}})}function f(){const e=s();return u({mutationFn:t=>n(`/bot-accounts/${t}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:["bots"]})}})}function l(){const e=s();return u({mutationFn:({botId:t,name:o,scopes:i})=>n(`/bot-accounts/${t}/api-keys`,{method:"POST",body:JSON.stringify({name:o,scopes:i})}),onSuccess:(t,o)=>{e.invalidateQueries({queryKey:["bots",o.botId,"api-keys"]})}})}function q(){const e=s();return u({mutationFn:({botId:t,keyId:o})=>n(`/bot-accounts/${t}/api-keys/${o}`,{method:"DELETE"}),onSuccess:(t,o)=>{e.invalidateQueries({queryKey:["bots",o.botId,"api-keys"]})}})}function S(){const e=s();return u({mutationFn:({botId:t,role:o,type:i})=>n(`/bot-accounts/${t}/roles`,{method:"POST",body:JSON.stringify({role:o,type:i})}),onSuccess:()=>{e.invalidateQueries({queryKey:["bots"]})}})}function p(){const e=s();return u({mutationFn:({botId:t,role:o})=>n(`/bot-accounts/${t}/roles/${encodeURIComponent(o)}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:["bots"]})}})}export{b as a,m as b,d as c,l as d,q as e,S as f,p as g,f as h,y as u};
|
|
2
|
+
//# sourceMappingURL=bots-fc_O_YIq.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bots-
|
|
1
|
+
{"version":3,"file":"bots-fc_O_YIq.js","sources":["../../src/api/bots.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { BotRecord, BotApiKeyRecord } from './types';\nimport type { LTRoleType } from './types';\n\ninterface BotListResponse {\n bots: BotRecord[];\n total: number;\n}\n\ninterface BotFilters {\n limit?: number;\n offset?: number;\n}\n\n// ── Query hooks ──────────────────────────────────────────────────────────────\n\nexport function useBots(filters: BotFilters = {}) {\n const params = new URLSearchParams();\n if (filters.limit) params.set('limit', String(filters.limit));\n if (filters.offset !== undefined) params.set('offset', String(filters.offset));\n\n return useQuery<BotListResponse>({\n queryKey: ['bots', filters],\n queryFn: () => apiFetch(`/bot-accounts?${params}`),\n });\n}\n\nexport function useBotApiKeys(botId: string) {\n return useQuery<{ keys: BotApiKeyRecord[] }>({\n queryKey: ['bots', botId, 'api-keys'],\n queryFn: () => apiFetch(`/bot-accounts/${botId}/api-keys`),\n enabled: !!botId,\n });\n}\n\n// ── Mutation hooks ───────────────────────────────────────────────────────────\n\nexport function useCreateBot() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (data: {\n name: string;\n description?: string;\n display_name?: string;\n roles?: { role: string; type: LTRoleType }[];\n }) =>\n apiFetch('/bot-accounts', {\n method: 'POST',\n body: JSON.stringify(data),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['bots'] });\n },\n });\n}\n\nexport function useUpdateBot() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n id,\n ...data\n }: {\n id: string;\n display_name?: string;\n description?: string;\n status?: string;\n }) =>\n apiFetch(`/bot-accounts/${id}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['bots'] });\n },\n });\n}\n\nexport function useDeleteBot() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch(`/bot-accounts/${id}`, { method: 'DELETE' }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['bots'] });\n },\n });\n}\n\nexport function useCreateBotApiKey() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n botId,\n name,\n scopes,\n }: {\n botId: string;\n name: string;\n scopes?: string[];\n }) =>\n apiFetch<{ id: string; rawKey: string }>(`/bot-accounts/${botId}/api-keys`, {\n method: 'POST',\n body: JSON.stringify({ name, scopes }),\n }),\n onSuccess: (_data, vars) => {\n queryClient.invalidateQueries({ queryKey: ['bots', vars.botId, 'api-keys'] });\n },\n });\n}\n\nexport function useRevokeBotApiKey() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ botId, keyId }: { botId: string; keyId: string }) =>\n apiFetch(`/bot-accounts/${botId}/api-keys/${keyId}`, { method: 'DELETE' }),\n onSuccess: (_data, vars) => {\n queryClient.invalidateQueries({ queryKey: ['bots', vars.botId, 'api-keys'] });\n },\n });\n}\n\nexport function useAddBotRole() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n botId,\n role,\n type,\n }: {\n botId: string;\n role: string;\n type: LTRoleType;\n }) =>\n apiFetch(`/bot-accounts/${botId}/roles`, {\n method: 'POST',\n body: JSON.stringify({ role, type }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['bots'] });\n },\n });\n}\n\nexport function useRemoveBotRole() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ botId, role }: { botId: string; role: string }) =>\n apiFetch(`/bot-accounts/${botId}/roles/${encodeURIComponent(role)}`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['bots'] });\n },\n });\n}\n"],"names":["useBots","filters","params","useQuery","apiFetch","useBotApiKeys","botId","useCreateBot","queryClient","useQueryClient","useMutation","data","useUpdateBot","id","useDeleteBot","useCreateBotApiKey","name","scopes","_data","vars","useRevokeBotApiKey","keyId","useAddBotRole","role","type","useRemoveBotRole"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{v as l,j as s,w as m,x as c}from"./index-
|
|
2
|
-
//# sourceMappingURL=escalation-
|
|
1
|
+
import{v as l,j as s,w as m,x as c}from"./index-sNrqYt0Q.js";import{a}from"./vendor-query-DLp59M9_.js";const n=[{maxMs:0,color:"text-status-error"},{maxMs:300*1e3,color:"text-status-error"},{maxMs:900*1e3,color:"text-status-warning"},{maxMs:1/0,color:"text-accent"}];function u(e){if(e<=0)return n[0].color;for(const t of n)if(e<t.maxMs)return t.color;return n[n.length-1].color}function d({until:e}){const[t,r]=a.useState(()=>new Date(e).getTime()-Date.now());a.useEffect(()=>{const o=setInterval(()=>{r(new Date(e).getTime()-Date.now())},1e3);return()=>clearInterval(o)},[e]);const i=a.useMemo(()=>{const o=new Date(e);return[{label:"ms",value:String(Math.max(0,t))},{label:"until",value:o.toISOString()},{label:"local",value:l(o,"MMM d, yyyy h:mm:ss a")}]},[e,t]);return s.jsxDEV(m,{options:i,children:s.jsxDEV("span",{className:`text-xs font-mono ${u(t)}`,children:c(t)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CountdownTimer.tsx",lineNumber:42,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CountdownTimer.tsx",lineNumber:41,columnNumber:5},this)}function p(e){return!!(e.assigned_to&&e.assigned_until&&new Date(e.assigned_until)>new Date)}function w(e){return!e.workflow_type}export{d as C,p as a,w as i};
|
|
2
|
+
//# sourceMappingURL=escalation-BYhLYHBz.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"escalation-
|
|
1
|
+
{"version":3,"file":"escalation-BYhLYHBz.js","sources":["../../src/components/common/display/CountdownTimer.tsx","../../src/lib/escalation.ts"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { format as fnsFormat } from 'date-fns';\nimport { formatRemaining } from '../../../lib/format';\nimport { DateTooltip } from './DateTooltip';\n\nconst COUNTDOWN_THRESHOLDS = [\n { maxMs: 0, color: 'text-status-error' },\n { maxMs: 5 * 60 * 1000, color: 'text-status-error' },\n { maxMs: 15 * 60 * 1000, color: 'text-status-warning' },\n { maxMs: Infinity, color: 'text-accent' },\n] as const;\n\nfunction countdownColor(remainingMs: number): string {\n if (remainingMs <= 0) return COUNTDOWN_THRESHOLDS[0].color;\n for (const t of COUNTDOWN_THRESHOLDS) {\n if (remainingMs < t.maxMs) return t.color;\n }\n return COUNTDOWN_THRESHOLDS[COUNTDOWN_THRESHOLDS.length - 1].color;\n}\n\nexport function CountdownTimer({ until }: { until: string }) {\n const [remaining, setRemaining] = useState(() => new Date(until).getTime() - Date.now());\n\n useEffect(() => {\n const interval = setInterval(() => {\n setRemaining(new Date(until).getTime() - Date.now());\n }, 1000);\n return () => clearInterval(interval);\n }, [until]);\n\n const options = useMemo(() => {\n const d = new Date(until);\n return [\n { label: 'ms', value: String(Math.max(0, remaining)) },\n { label: 'until', value: d.toISOString() },\n { label: 'local', value: fnsFormat(d, 'MMM d, yyyy h:mm:ss a') },\n ];\n }, [until, remaining]);\n\n return (\n <DateTooltip options={options}>\n <span className={`text-xs font-mono ${countdownColor(remaining)}`}>\n {formatRemaining(remaining)}\n </span>\n </DateTooltip>\n );\n}\n","import type { LTEscalationRecord } from '../api/types';\n\nexport function isEffectivelyClaimed(esc: LTEscalationRecord): boolean {\n return !!(\n esc.assigned_to &&\n esc.assigned_until &&\n new Date(esc.assigned_until) > new Date()\n );\n}\n\n/** An ACK escalation has no associated workflow — it's a notification, not a task. */\nexport function isAckEscalation(esc: LTEscalationRecord): boolean {\n return !esc.workflow_type;\n}\n\nexport function isAvailable(esc: LTEscalationRecord): boolean {\n return (\n esc.status === 'pending' &&\n (!esc.assigned_to ||\n !esc.assigned_until ||\n new Date(esc.assigned_until) <= new Date())\n );\n}\n"],"names":["COUNTDOWN_THRESHOLDS","countdownColor","remainingMs","CountdownTimer","until","remaining","setRemaining","useState","useEffect","interval","options","useMemo","d","fnsFormat","jsxDEV","DateTooltip","formatRemaining","isEffectivelyClaimed","esc","isAckEscalation"],"mappings":"uGAKA,MAAMA,EAAuB,CAC3B,CAAE,MAAO,EAAgB,MAAO,mBAAA,EAChC,CAAE,MAAO,IAAS,IAAO,MAAO,mBAAA,EAChC,CAAE,MAAO,IAAU,IAAM,MAAO,qBAAA,EAChC,CAAE,MAAO,IAAiB,MAAO,aAAA,CACnC,EAEA,SAASC,EAAeC,EAA6B,CACnD,GAAIA,GAAe,EAAG,OAAOF,EAAqB,CAAC,EAAE,MACrD,UAAW,KAAKA,EACd,GAAIE,EAAc,EAAE,MAAO,OAAO,EAAE,MAEtC,OAAOF,EAAqBA,EAAqB,OAAS,CAAC,EAAE,KAC/D,CAEO,SAASG,EAAe,CAAE,MAAAC,GAA4B,CAC3D,KAAM,CAACC,EAAWC,CAAY,EAAIC,EAAAA,SAAS,IAAM,IAAI,KAAKH,CAAK,EAAE,QAAA,EAAY,KAAK,KAAK,EAEvFI,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAW,YAAY,IAAM,CACjCH,EAAa,IAAI,KAAKF,CAAK,EAAE,UAAY,KAAK,KAAK,CACrD,EAAG,GAAI,EACP,MAAO,IAAM,cAAcK,CAAQ,CACrC,EAAG,CAACL,CAAK,CAAC,EAEV,MAAMM,EAAUC,EAAAA,QAAQ,IAAM,CAC5B,MAAMC,EAAI,IAAI,KAAKR,CAAK,EACxB,MAAO,CACL,CAAE,MAAO,KAAM,MAAO,OAAO,KAAK,IAAI,EAAGC,CAAS,CAAC,CAAA,EACnD,CAAE,MAAO,QAAS,MAAOO,EAAE,aAAY,EACvC,CAAE,MAAO,QAAS,MAAOC,EAAUD,EAAG,uBAAuB,CAAA,CAAE,CAEnE,EAAG,CAACR,EAAOC,CAAS,CAAC,EAErB,OACES,EAAAA,OAACC,EAAA,CAAY,QAAAL,EACX,SAAAI,SAAC,OAAA,CAAK,UAAW,qBAAqBb,EAAeI,CAAS,CAAC,GAC5D,SAAAW,EAAgBX,CAAS,CAAA,EAD5B,OAAA,GAAA,CAAA,SAAA,kEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAAA,EAHF,OAAA,GAAA,CAAA,SAAA,kEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAIA,CAEJ,CC5CO,SAASY,EAAqBC,EAAkC,CACrE,MAAO,CAAC,EACNA,EAAI,aACJA,EAAI,gBACJ,IAAI,KAAKA,EAAI,cAAc,EAAI,IAAI,KAEvC,CAGO,SAASC,EAAgBD,EAAkC,CAChE,MAAO,CAACA,EAAI,aACd"}
|
package/dashboard/dist/assets/{escalation-columns-BpBJN6k4.js → escalation-columns-DjJyuC1g.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as a}from"./index-
|
|
2
|
-
//# sourceMappingURL=escalation-columns-
|
|
1
|
+
import{j as a}from"./index-sNrqYt0Q.js";import{F as c,b as r}from"./FilterBar-BQNzsd3A.js";import{P as u}from"./PriorityBadge-C7D5d_HY.js";import{R as p}from"./RolePill-D6nMxMvp.js";import{W as d}from"./WorkflowPill-BrD5d1AG.js";import{T as b}from"./TimestampCell-Dx5uwGfS.js";import{C as N,i as f,a as x}from"./escalation-BYhLYHBz.js";import{_ as h,$ as v,a0 as g,a1 as t}from"./vendor-icons-CWl44VA6.js";import{L as y}from"./vendor-react-Co3Y8ikm.js";function E({row:e}){if(f(e)){const l=e.status==="resolved"?"text-status-success":"text-text-tertiary";return a.jsxDEV(g,{className:`w-3 h-3 shrink-0 ${l}`},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:17,columnNumber:12},this)}return e.status==="resolved"?a.jsxDEV(t,{className:"w-2.5 h-2.5 shrink-0 fill-status-success text-status-success"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:20,columnNumber:12},this):e.status==="cancelled"?a.jsxDEV(t,{className:"w-2.5 h-2.5 shrink-0 fill-status-error text-status-error"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:23,columnNumber:12},this):x(e)?a.jsxDEV(t,{className:"w-2.5 h-2.5 shrink-0 fill-status-warning text-status-warning"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:26,columnNumber:12},this):a.jsxDEV(t,{className:"w-2.5 h-2.5 shrink-0 fill-status-active text-status-active"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:29,columnNumber:10},this)}const R=[{key:"description",label:"Summary",render:e=>a.jsxDEV("div",{className:"flex items-start gap-2 overflow-hidden",children:[a.jsxDEV("span",{className:"mt-1 shrink-0",children:a.jsxDEV(E,{row:e},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:39,columnNumber:41},void 0)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:39,columnNumber:9},void 0),a.jsxDEV("div",{className:"min-w-0 overflow-hidden",children:[a.jsxDEV("p",{className:"text-xs text-text-primary truncate",children:e.description||e.type},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:41,columnNumber:11},void 0),a.jsxDEV("div",{className:"flex items-center gap-2 mt-0.5",children:[a.jsxDEV(d,{type:e.type},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:43,columnNumber:13},void 0),e.subtype&&e.subtype!==e.type&&a.jsxDEV("span",{className:"text-[10px] text-text-tertiary whitespace-nowrap",children:e.subtype},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:45,columnNumber:15},void 0)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:42,columnNumber:11},void 0)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:40,columnNumber:9},void 0)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:38,columnNumber:7},void 0),className:"max-w-0"},{key:"task_id",label:"Task",render:e=>e.task_id?a.jsxDEV(y,{to:`/workflows/tasks/detail/${e.task_id}`,onClick:l=>l.stopPropagation(),className:"group/task inline-flex items-center gap-1 text-xs font-mono text-text-secondary hover:text-accent transition-colors",children:[e.task_id.slice(0,12),"…",a.jsxDEV(h,{size:10,className:"opacity-0 group-hover/task:opacity-100 transition-opacity"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:64,columnNumber:11},void 0)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:58,columnNumber:9},void 0):a.jsxDEV("span",{className:"text-xs text-text-tertiary",children:"—"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:67,columnNumber:9},void 0),className:"w-36 whitespace-nowrap"},{key:"role",label:"Role",render:e=>a.jsxDEV(p,{role:e.role},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:74,columnNumber:22},void 0),className:"w-28"},{key:"priority",label:"Priority",render:e=>a.jsxDEV(u,{priority:e.priority},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:80,columnNumber:22},void 0),className:"w-20",sortable:!0},{key:"created_at",label:"Created",render:e=>a.jsxDEV(b,{date:e.created_at},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:87,columnNumber:22},void 0),className:"w-40",sortable:!0}],L={key:"expires",label:a.jsxDEV(v,{className:"w-3.5 h-3.5 text-text-tertiary"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:96,columnNumber:11},void 0),render:e=>e.assigned_until?a.jsxDEV(N,{until:e.assigned_until},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:99,columnNumber:7},void 0):a.jsxDEV("span",{className:"text-xs text-text-tertiary",children:"—"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:101,columnNumber:7},void 0),className:"w-10"},j=[{value:"1",label:"P1"},{value:"2",label:"P2"},{value:"3",label:"P3"},{value:"4",label:"P4"}],D=[{value:"available",label:"Available"},{value:"claimed",label:"Claimed"},{value:"resolved",label:"Resolved"}];function I({filters:e,setFilter:l,roles:o,types:i,showStatus:n=!1,actions:m}){return a.jsxDEV(c,{actions:m,children:[n&&a.jsxDEV(r,{label:"Status",value:e.status??"",onChange:s=>l("status",s),options:D},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:172,columnNumber:9},this),a.jsxDEV(r,{label:"Role",value:e.role,onChange:s=>l("role",s),options:o.map(s=>({value:s,label:s}))},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:179,columnNumber:7},this),a.jsxDEV(r,{label:"Type",value:e.type,onChange:s=>l("type",s),options:i.map(s=>({value:s,label:s}))},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:185,columnNumber:7},this),a.jsxDEV(r,{label:"Priority",value:e.priority,onChange:s=>l("priority",s),options:j},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:191,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/escalation-columns.tsx",lineNumber:170,columnNumber:5},this)}export{R as E,L as T,I as a};
|
|
2
|
+
//# sourceMappingURL=escalation-columns-DjJyuC1g.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"escalation-columns-BpBJN6k4.js","sources":["../../src/pages/operator/escalation-columns.tsx"],"sourcesContent":["import { Link } from 'react-router-dom';\nimport { ExternalLink, Circle, Bell, Clock } from 'lucide-react';\nimport type { Column } from '../../components/common/data/DataTable';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { PriorityBadge } from '../../components/common/display/PriorityBadge';\nimport { RolePill } from '../../components/common/display/RolePill';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { CountdownTimer } from '../../components/common/display/CountdownTimer';\nimport { isEffectivelyClaimed, isAckEscalation } from '../../lib/escalation';\nimport type { LTEscalationRecord } from '../../api/types';\n\n/** Status dot — rendered inline before summary. */\nfunction StatusDot({ row }: { row: LTEscalationRecord }) {\n if (isAckEscalation(row)) {\n const color = row.status === 'resolved' ? 'text-status-success' : 'text-text-tertiary';\n return <Bell className={`w-3 h-3 shrink-0 ${color}`} />;\n }\n if (row.status === 'resolved') {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-success text-status-success\" />;\n }\n if (row.status === 'cancelled') {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-error text-status-error\" />;\n }\n if (isEffectivelyClaimed(row)) {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-warning text-status-warning\" />;\n }\n // pending (unclaimed)\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-active text-status-active\" />;\n}\n\n/** Base columns shared by all escalation list pages. */\nexport const ESCALATION_COLUMNS: Column<LTEscalationRecord>[] = [\n {\n key: 'description',\n label: 'Summary',\n render: (row) => (\n <div className=\"flex items-start gap-2 overflow-hidden\">\n <span className=\"mt-1 shrink-0\"><StatusDot row={row} /></span>\n <div className=\"min-w-0 overflow-hidden\">\n <p className=\"text-xs text-text-primary truncate\">{row.description || row.type}</p>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <WorkflowPill type={row.type} />\n {row.subtype && row.subtype !== row.type && (\n <span className=\"text-[10px] text-text-tertiary whitespace-nowrap\">{row.subtype}</span>\n )}\n </div>\n </div>\n </div>\n ),\n className: 'max-w-0',\n },\n {\n key: 'task_id',\n label: 'Task',\n render: (row) =>\n row.task_id ? (\n <Link\n to={`/workflows/tasks/detail/${row.task_id}`}\n onClick={(e) => e.stopPropagation()}\n className=\"group/task inline-flex items-center gap-1 text-xs font-mono text-text-secondary hover:text-accent transition-colors\"\n >\n {row.task_id.slice(0, 12)}…\n <ExternalLink size={10} className=\"opacity-0 group-hover/task:opacity-100 transition-opacity\" />\n </Link>\n ) : (\n <span className=\"text-xs text-text-tertiary\">—</span>\n ),\n className: 'w-36 whitespace-nowrap',\n },\n {\n key: 'role',\n label: 'Role',\n render: (row) => <RolePill role={row.role} />,\n className: 'w-28',\n },\n {\n key: 'priority',\n label: 'Priority',\n render: (row) => <PriorityBadge priority={row.priority} />,\n className: 'w-20',\n sortable: true,\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-40',\n sortable: true,\n },\n];\n\n/** Time-remaining column for claimed escalations — aligns with checkbox column on All Escalations. */\nexport const TIME_LEFT_COLUMN: Column<LTEscalationRecord> = {\n key: 'expires',\n label: (<Clock className=\"w-3.5 h-3.5 text-text-tertiary\" />) as any,\n render: (row) =>\n row.assigned_until ? (\n <CountdownTimer until={row.assigned_until} />\n ) : (\n <span className=\"text-xs text-text-tertiary\">—</span>\n ),\n className: 'w-10',\n};\n\n/** Status icon column — color-coded filled circle, or bell for ACK/notification escalations. */\nexport const STATUS_COLUMN: Column<LTEscalationRecord> = {\n key: 'status',\n label: '',\n render: (row) => {\n if (isAckEscalation(row)) {\n const color = row.status === 'resolved' ? 'text-status-success' : 'text-text-tertiary';\n return <Bell className={`w-3 h-3 ${color}`} />;\n }\n if (row.status === 'resolved') {\n return <Circle className=\"w-2.5 h-2.5 fill-status-success text-status-success\" />;\n }\n if (isEffectivelyClaimed(row)) {\n return <Circle className=\"w-2.5 h-2.5 fill-status-warning text-status-warning\" />;\n }\n // pending (unclaimed)\n return <Circle className=\"w-2.5 h-2.5 fill-text-tertiary text-text-tertiary\" />;\n },\n className: 'w-8',\n};\n\n/** Claimed-only status icon (always orange, or bell for ACK). */\nexport const CLAIMED_STATUS_COLUMN: Column<LTEscalationRecord> = {\n key: 'status',\n label: '',\n render: (row) =>\n isAckEscalation(row)\n ? <Bell className=\"w-3 h-3 text-status-warning\" />\n : <Circle className=\"w-2.5 h-2.5 fill-status-warning text-status-warning\" />,\n className: 'w-8',\n};\n\n/** Priority filter options shared by both pages. */\nexport const PRIORITY_OPTIONS = [\n { value: '1', label: 'P1' },\n { value: '2', label: 'P2' },\n { value: '3', label: 'P3' },\n { value: '4', label: 'P4' },\n];\n\n/** Status filter options for escalation list pages. */\nexport const STATUS_OPTIONS = [\n { value: 'available', label: 'Available' },\n { value: 'claimed', label: 'Claimed' },\n { value: 'resolved', label: 'Resolved' },\n];\n\n/** Shared filter bar for escalation list pages. */\nexport function EscalationFilterBar({\n filters,\n setFilter,\n roles,\n types,\n showStatus = false,\n actions,\n}: {\n filters: { role: string; type: string; priority: string; status?: string };\n setFilter: (key: any, value: string) => void;\n roles: string[];\n types: string[];\n showStatus?: boolean;\n actions?: React.ReactNode;\n}) {\n return (\n <FilterBar actions={actions}>\n {showStatus && (\n <FilterSelect\n label=\"Status\"\n value={filters.status ?? ''}\n onChange={(v) => setFilter('status', v)}\n options={STATUS_OPTIONS}\n />\n )}\n <FilterSelect\n label=\"Role\"\n value={filters.role}\n onChange={(v) => setFilter('role', v)}\n options={roles.map((r) => ({ value: r, label: r }))}\n />\n <FilterSelect\n label=\"Type\"\n value={filters.type}\n onChange={(v) => setFilter('type', v)}\n options={types.map((t) => ({ value: t, label: t }))}\n />\n <FilterSelect\n label=\"Priority\"\n value={filters.priority}\n onChange={(v) => setFilter('priority', v)}\n options={PRIORITY_OPTIONS}\n />\n </FilterBar>\n );\n}\n"],"names":["StatusDot","row","isAckEscalation","color","jsxDEV","Bell","Circle","isEffectivelyClaimed","ESCALATION_COLUMNS","this","WorkflowPill","Link","e","ExternalLink","RolePill","PriorityBadge","TimestampCell","TIME_LEFT_COLUMN","Clock","CountdownTimer","PRIORITY_OPTIONS","STATUS_OPTIONS","EscalationFilterBar","filters","setFilter","roles","types","showStatus","actions","FilterBar","FilterSelect","v","r","t"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"escalation-columns-DjJyuC1g.js","sources":["../../src/pages/operator/escalation-columns.tsx"],"sourcesContent":["import { Link } from 'react-router-dom';\nimport { ExternalLink, Circle, Bell, Clock } from 'lucide-react';\nimport type { Column } from '../../components/common/data/DataTable';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { PriorityBadge } from '../../components/common/display/PriorityBadge';\nimport { RolePill } from '../../components/common/display/RolePill';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { CountdownTimer } from '../../components/common/display/CountdownTimer';\nimport { isEffectivelyClaimed, isAckEscalation } from '../../lib/escalation';\nimport type { LTEscalationRecord } from '../../api/types';\n\n/** Status dot — rendered inline before summary. */\nfunction StatusDot({ row }: { row: LTEscalationRecord }) {\n if (isAckEscalation(row)) {\n const color = row.status === 'resolved' ? 'text-status-success' : 'text-text-tertiary';\n return <Bell className={`w-3 h-3 shrink-0 ${color}`} />;\n }\n if (row.status === 'resolved') {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-success text-status-success\" />;\n }\n if (row.status === 'cancelled') {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-error text-status-error\" />;\n }\n if (isEffectivelyClaimed(row)) {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-warning text-status-warning\" />;\n }\n // pending (unclaimed)\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-active text-status-active\" />;\n}\n\n/** Base columns shared by all escalation list pages. */\nexport const ESCALATION_COLUMNS: Column<LTEscalationRecord>[] = [\n {\n key: 'description',\n label: 'Summary',\n render: (row) => (\n <div className=\"flex items-start gap-2 overflow-hidden\">\n <span className=\"mt-1 shrink-0\"><StatusDot row={row} /></span>\n <div className=\"min-w-0 overflow-hidden\">\n <p className=\"text-xs text-text-primary truncate\">{row.description || row.type}</p>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <WorkflowPill type={row.type} />\n {row.subtype && row.subtype !== row.type && (\n <span className=\"text-[10px] text-text-tertiary whitespace-nowrap\">{row.subtype}</span>\n )}\n </div>\n </div>\n </div>\n ),\n className: 'max-w-0',\n },\n {\n key: 'task_id',\n label: 'Task',\n render: (row) =>\n row.task_id ? (\n <Link\n to={`/workflows/tasks/detail/${row.task_id}`}\n onClick={(e) => e.stopPropagation()}\n className=\"group/task inline-flex items-center gap-1 text-xs font-mono text-text-secondary hover:text-accent transition-colors\"\n >\n {row.task_id.slice(0, 12)}…\n <ExternalLink size={10} className=\"opacity-0 group-hover/task:opacity-100 transition-opacity\" />\n </Link>\n ) : (\n <span className=\"text-xs text-text-tertiary\">—</span>\n ),\n className: 'w-36 whitespace-nowrap',\n },\n {\n key: 'role',\n label: 'Role',\n render: (row) => <RolePill role={row.role} />,\n className: 'w-28',\n },\n {\n key: 'priority',\n label: 'Priority',\n render: (row) => <PriorityBadge priority={row.priority} />,\n className: 'w-20',\n sortable: true,\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-40',\n sortable: true,\n },\n];\n\n/** Time-remaining column for claimed escalations — aligns with checkbox column on All Escalations. */\nexport const TIME_LEFT_COLUMN: Column<LTEscalationRecord> = {\n key: 'expires',\n label: (<Clock className=\"w-3.5 h-3.5 text-text-tertiary\" />) as any,\n render: (row) =>\n row.assigned_until ? (\n <CountdownTimer until={row.assigned_until} />\n ) : (\n <span className=\"text-xs text-text-tertiary\">—</span>\n ),\n className: 'w-10',\n};\n\n/** Status icon column — color-coded filled circle, or bell for ACK/notification escalations. */\nexport const STATUS_COLUMN: Column<LTEscalationRecord> = {\n key: 'status',\n label: '',\n render: (row) => {\n if (isAckEscalation(row)) {\n const color = row.status === 'resolved' ? 'text-status-success' : 'text-text-tertiary';\n return <Bell className={`w-3 h-3 ${color}`} />;\n }\n if (row.status === 'resolved') {\n return <Circle className=\"w-2.5 h-2.5 fill-status-success text-status-success\" />;\n }\n if (isEffectivelyClaimed(row)) {\n return <Circle className=\"w-2.5 h-2.5 fill-status-warning text-status-warning\" />;\n }\n // pending (unclaimed)\n return <Circle className=\"w-2.5 h-2.5 fill-text-tertiary text-text-tertiary\" />;\n },\n className: 'w-8',\n};\n\n/** Claimed-only status icon (always orange, or bell for ACK). */\nexport const CLAIMED_STATUS_COLUMN: Column<LTEscalationRecord> = {\n key: 'status',\n label: '',\n render: (row) =>\n isAckEscalation(row)\n ? <Bell className=\"w-3 h-3 text-status-warning\" />\n : <Circle className=\"w-2.5 h-2.5 fill-status-warning text-status-warning\" />,\n className: 'w-8',\n};\n\n/** Priority filter options shared by both pages. */\nexport const PRIORITY_OPTIONS = [\n { value: '1', label: 'P1' },\n { value: '2', label: 'P2' },\n { value: '3', label: 'P3' },\n { value: '4', label: 'P4' },\n];\n\n/** Status filter options for escalation list pages. */\nexport const STATUS_OPTIONS = [\n { value: 'available', label: 'Available' },\n { value: 'claimed', label: 'Claimed' },\n { value: 'resolved', label: 'Resolved' },\n];\n\n/** Shared filter bar for escalation list pages. */\nexport function EscalationFilterBar({\n filters,\n setFilter,\n roles,\n types,\n showStatus = false,\n actions,\n}: {\n filters: { role: string; type: string; priority: string; status?: string };\n setFilter: (key: any, value: string) => void;\n roles: string[];\n types: string[];\n showStatus?: boolean;\n actions?: React.ReactNode;\n}) {\n return (\n <FilterBar actions={actions}>\n {showStatus && (\n <FilterSelect\n label=\"Status\"\n value={filters.status ?? ''}\n onChange={(v) => setFilter('status', v)}\n options={STATUS_OPTIONS}\n />\n )}\n <FilterSelect\n label=\"Role\"\n value={filters.role}\n onChange={(v) => setFilter('role', v)}\n options={roles.map((r) => ({ value: r, label: r }))}\n />\n <FilterSelect\n label=\"Type\"\n value={filters.type}\n onChange={(v) => setFilter('type', v)}\n options={types.map((t) => ({ value: t, label: t }))}\n />\n <FilterSelect\n label=\"Priority\"\n value={filters.priority}\n onChange={(v) => setFilter('priority', v)}\n options={PRIORITY_OPTIONS}\n />\n </FilterBar>\n );\n}\n"],"names":["StatusDot","row","isAckEscalation","color","jsxDEV","Bell","Circle","isEffectivelyClaimed","ESCALATION_COLUMNS","this","WorkflowPill","Link","e","ExternalLink","RolePill","PriorityBadge","TimestampCell","TIME_LEFT_COLUMN","Clock","CountdownTimer","PRIORITY_OPTIONS","STATUS_OPTIONS","EscalationFilterBar","filters","setFilter","roles","types","showStatus","actions","FilterBar","FilterSelect","v","r","t"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as n}from"./index-
|
|
2
|
-
//# sourceMappingURL=helpers-
|
|
1
|
+
import{j as n}from"./index-sNrqYt0Q.js";import{T as o}from"./TimeAgo-DJZq-e4R.js";import{S as l}from"./StatusBadge-DVCf2ncM.js";const i={"* * * * *":"Every minute","*/5 * * * *":"Every 5 minutes","*/15 * * * *":"Every 15 minutes","*/30 * * * *":"Every 30 minutes","0 * * * *":"Every hour","0 */2 * * *":"Every 2 hours","0 */6 * * *":"Every 6 hours","0 */12 * * *":"Every 12 hours","0 0 * * *":"Daily at midnight","0 9 * * *":"Daily at 9 AM","0 9 * * 1-5":"Weekdays at 9 AM","0 0 * * 0":"Weekly (Sunday midnight)","0 0 1 * *":"Monthly (1st at midnight)","0 2 * * *":"Daily at 2 AM"};function c(e){return i[e]??""}const f=[["*/15 * * * *","Every 15 min"],["0 * * * *","Every hour"],["0 */6 * * *","Every 6 hours"],["0 9 * * *","Daily 9 AM"],["0 9 * * 1-5","Weekdays 9 AM"],["0 0 * * 0","Weekly (Sun)"]];function p(e){const t=e==null?void 0:e.data;if(!t||typeof t!="object"||Array.isArray(t))return null;const a=Object.entries(t);return a.length===0||!a.every(([,r])=>typeof r=="string"||typeof r=="number"||typeof r=="boolean"||r===null)?null:a.map(([r,s])=>({key:r,value:s===null?"":String(s),type:s===null?"string":typeof s}))}const h=[{key:"workflow_id",label:"Workflow ID",render:e=>n.jsxDEV("span",{className:"font-mono text-[11px] text-text-secondary",children:e.workflow_id.length>40?`${e.workflow_id.slice(0,40)}...`:e.workflow_id},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/cron/helpers.tsx",lineNumber:69,columnNumber:7},void 0)},{key:"status",label:"Status",render:e=>n.jsxDEV(l,{status:e.status},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/cron/helpers.tsx",lineNumber:79,columnNumber:22},void 0),className:"w-28"},{key:"created_at",label:"Started",render:e=>n.jsxDEV(o,{date:e.created_at},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/cron/helpers.tsx",lineNumber:85,columnNumber:22},void 0),className:"w-32"}];export{f as C,c as d,p as e,h as j};
|
|
2
|
+
//# sourceMappingURL=helpers-CQG3Rh2y.js.map
|