@jiggai/kitchen 0.5.10 → 0.5.11

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.
Files changed (112) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +2 -2
  3. package/.next/prerender-manifest.json +3 -3
  4. package/.next/server/app/_global-error.html +2 -2
  5. package/.next/server/app/_global-error.rsc +1 -1
  6. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  11. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  12. package/.next/server/app/_not-found.html +1 -1
  13. package/.next/server/app/_not-found.rsc +3 -3
  14. package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  15. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  16. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  17. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  20. package/.next/server/app/agents/[agentId]/page_client-reference-manifest.js +1 -1
  21. package/.next/server/app/channels/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/channels.html +2 -2
  23. package/.next/server/app/channels.rsc +3 -3
  24. package/.next/server/app/channels.segments/_full.segment.rsc +3 -3
  25. package/.next/server/app/channels.segments/_head.segment.rsc +1 -1
  26. package/.next/server/app/channels.segments/_index.segment.rsc +2 -2
  27. package/.next/server/app/channels.segments/_tree.segment.rsc +2 -2
  28. package/.next/server/app/channels.segments/channels/__PAGE__.segment.rsc +1 -1
  29. package/.next/server/app/channels.segments/channels.segment.rsc +1 -1
  30. package/.next/server/app/cron-jobs/page_client-reference-manifest.js +1 -1
  31. package/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -1
  32. package/.next/server/app/goals/new/page_client-reference-manifest.js +1 -1
  33. package/.next/server/app/goals/new.html +2 -2
  34. package/.next/server/app/goals/new.rsc +3 -3
  35. package/.next/server/app/goals/new.segments/_full.segment.rsc +3 -3
  36. package/.next/server/app/goals/new.segments/_head.segment.rsc +1 -1
  37. package/.next/server/app/goals/new.segments/_index.segment.rsc +2 -2
  38. package/.next/server/app/goals/new.segments/_tree.segment.rsc +2 -2
  39. package/.next/server/app/goals/new.segments/goals/new/__PAGE__.segment.rsc +1 -1
  40. package/.next/server/app/goals/new.segments/goals/new.segment.rsc +1 -1
  41. package/.next/server/app/goals/new.segments/goals.segment.rsc +1 -1
  42. package/.next/server/app/goals/page_client-reference-manifest.js +1 -1
  43. package/.next/server/app/goals.html +1 -1
  44. package/.next/server/app/goals.rsc +3 -3
  45. package/.next/server/app/goals.segments/_full.segment.rsc +3 -3
  46. package/.next/server/app/goals.segments/_head.segment.rsc +1 -1
  47. package/.next/server/app/goals.segments/_index.segment.rsc +2 -2
  48. package/.next/server/app/goals.segments/_tree.segment.rsc +2 -2
  49. package/.next/server/app/goals.segments/goals/__PAGE__.segment.rsc +1 -1
  50. package/.next/server/app/goals.segments/goals.segment.rsc +1 -1
  51. package/.next/server/app/page_client-reference-manifest.js +1 -1
  52. package/.next/server/app/recipes/[id]/page_client-reference-manifest.js +1 -1
  53. package/.next/server/app/recipes/page_client-reference-manifest.js +1 -1
  54. package/.next/server/app/runs/page_client-reference-manifest.js +1 -1
  55. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  56. package/.next/server/app/settings.html +1 -1
  57. package/.next/server/app/settings.rsc +3 -3
  58. package/.next/server/app/settings.segments/_full.segment.rsc +3 -3
  59. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  60. package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  61. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  62. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
  63. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  64. package/.next/server/app/teams/[teamId]/deliverables/page_client-reference-manifest.js +1 -1
  65. package/.next/server/app/teams/[teamId]/page.js.nft.json +1 -1
  66. package/.next/server/app/teams/[teamId]/page_client-reference-manifest.js +1 -1
  67. package/.next/server/app/teams/[teamId]/runs/[workflowId]/[runId]/page_client-reference-manifest.js +1 -1
  68. package/.next/server/app/teams/[teamId]/runs/page_client-reference-manifest.js +1 -1
  69. package/.next/server/app/teams/[teamId]/tickets/[ticket]/page_client-reference-manifest.js +1 -1
  70. package/.next/server/app/teams/[teamId]/tickets/page_client-reference-manifest.js +1 -1
  71. package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page.js.nft.json +1 -1
  72. package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page_client-reference-manifest.js +1 -1
  73. package/.next/server/app/teams/[teamId]/workflows/page.js.nft.json +1 -1
  74. package/.next/server/app/teams/[teamId]/workflows/page_client-reference-manifest.js +1 -1
  75. package/.next/server/app/tickets/[ticket]/page_client-reference-manifest.js +1 -1
  76. package/.next/server/app/tickets/page_client-reference-manifest.js +1 -1
  77. package/.next/server/chunks/ssr/[root-of-the-server]__3b880807._.js +1 -1
  78. package/.next/server/chunks/ssr/[root-of-the-server]__3b880807._.js.map +1 -1
  79. package/.next/server/chunks/ssr/[root-of-the-server]__7af8e528._.js +9 -0
  80. package/.next/server/chunks/ssr/[root-of-the-server]__7af8e528._.js.map +1 -0
  81. package/.next/server/chunks/ssr/_15bc566e._.js +9 -0
  82. package/.next/server/chunks/ssr/_15bc566e._.js.map +1 -0
  83. package/.next/server/chunks/ssr/{_835573ec._.js → _3d6d3f59._.js} +8 -2
  84. package/.next/server/chunks/ssr/_3d6d3f59._.js.map +1 -0
  85. package/.next/server/chunks/ssr/b1a17_app_teams_[teamId]_workflows_[workflowId]_workflows-editor-client_tsx_5e714aa2._.js +1 -7
  86. package/.next/server/chunks/ssr/b1a17_app_teams_[teamId]_workflows_[workflowId]_workflows-editor-client_tsx_5e714aa2._.js.map +1 -1
  87. package/.next/server/chunks/ssr/src_app_teams_[teamId]_runs_[workflowId]_[runId]_run-detail-client_tsx_56f0cbd7._.js +1 -1
  88. package/.next/server/chunks/ssr/src_app_teams_[teamId]_runs_[workflowId]_[runId]_run-detail-client_tsx_56f0cbd7._.js.map +1 -1
  89. package/.next/server/chunks/ssr/src_app_teams_[teamId]_workflows_workflows-client_tsx_12742cc9._.js +1 -1
  90. package/.next/server/chunks/ssr/src_app_teams_[teamId]_workflows_workflows-client_tsx_12742cc9._.js.map +1 -1
  91. package/.next/server/pages/404.html +1 -1
  92. package/.next/server/pages/500.html +2 -2
  93. package/.next/server/server-reference-manifest.js +1 -1
  94. package/.next/server/server-reference-manifest.json +1 -1
  95. package/.next/static/chunks/2a86fa0c3d9177c5.js +7 -0
  96. package/.next/static/chunks/4a57b795d958b061.js +1 -0
  97. package/.next/static/chunks/67a9a9a3c6dd4aa4.js +7 -0
  98. package/.next/static/chunks/a683f58aaf4f41e9.css +3 -0
  99. package/.next/static/chunks/{212477db59154fa7.js → b641409c1c9d8c3e.js} +3 -3
  100. package/.next/static/chunks/{fac5526bd312cf6e.js → b8722104d0ceb74d.js} +9 -3
  101. package/openclaw.plugin.json +1 -1
  102. package/package.json +1 -1
  103. package/.next/server/chunks/ssr/[root-of-the-server]__cb91405c._.js +0 -3
  104. package/.next/server/chunks/ssr/[root-of-the-server]__cb91405c._.js.map +0 -1
  105. package/.next/server/chunks/ssr/_835573ec._.js.map +0 -1
  106. package/.next/static/chunks/24ac17715eb2614d.js +0 -1
  107. package/.next/static/chunks/8b99ae14a606b607.css +0 -3
  108. package/.next/static/chunks/d593ea5e91e81b45.js +0 -1
  109. package/.next/static/chunks/ff661b5e599f8d74.js +0 -7
  110. /package/.next/static/{3JkH3_7LqC0wr-k7JoZl9 → LRt6kweldrLHTF1HgLgu2}/_buildManifest.js +0 -0
  111. /package/.next/static/{3JkH3_7LqC0wr-k7JoZl9 → LRt6kweldrLHTF1HgLgu2}/_clientMiddlewareManifest.json +0 -0
  112. /package/.next/static/{3JkH3_7LqC0wr-k7JoZl9 → LRt6kweldrLHTF1HgLgu2}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app/teams/%5BteamId%5D/workflows/%5BworkflowId%5D/workflows-editor-client.tsx","../../../../src/lib/workflows/validate.ts","../../../../src/lib/workflows/media-nodes.ts","../../../../src/components/media/MediaGenerationConfig.tsx","../../../../src/components/RunLoadingOverlay.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\nimport { ConfirmationModal } from \"@/components/ConfirmationModal\";\nimport type { WorkflowFileV1 } from \"@/lib/workflows/types\";\nimport { validateWorkflowFileV1 } from \"@/lib/workflows/validate\";\nimport { getMediaNodeConfig, isMediaNode, type MediaGenerationConfig } from \"@/lib/workflows/media-nodes\";\nimport { MediaGenerationConfigComponent } from \"@/components/media/MediaGenerationConfig\";\nimport { RunLoadingOverlay } from \"@/components/RunLoadingOverlay\";\n\n// Helper function to collect upstream variables for template insertion\nfunction getUpstreamVariables(\n wf: WorkflowFileV1, \n nodeId: string\n): Array<{nodeId: string, nodeName: string, fieldName: string, fieldType: string}> {\n const variables: Array<{nodeId: string, nodeName: string, fieldName: string, fieldType: string}> = [];\n \n // BFS backwards from nodeId to find all upstream ancestors\n const upstream = new Set<string>();\n const queue = [nodeId];\n const visited = new Set<string>();\n \n while (queue.length > 0) {\n const currentId = queue.shift()!;\n if (visited.has(currentId)) continue;\n visited.add(currentId);\n \n for (const edge of (wf.edges ?? [])) {\n if (edge.to === currentId && !upstream.has(edge.from) && edge.from !== nodeId) {\n upstream.add(edge.from);\n queue.push(edge.from);\n }\n }\n }\n \n // For each upstream node, collect its output fields + standard outputs\n for (const upstreamId of upstream) {\n const upstreamNode = wf.nodes.find(n => n.id === upstreamId);\n if (!upstreamNode) continue;\n \n const nodeName = upstreamNode.name || upstreamId;\n const config = upstreamNode.config && typeof upstreamNode.config === 'object' && !Array.isArray(upstreamNode.config) ? upstreamNode.config as Record<string, unknown> : {};\n \n // Always include standard outputs for every upstream node\n variables.push(\n { nodeId: upstreamId, nodeName, fieldName: 'output', fieldType: 'text' },\n { nodeId: upstreamId, nodeName, fieldName: 'text', fieldType: 'text' }\n );\n \n // Include declared output fields if they exist\n const outputFields = config.outputFields as Array<{name: string, type: string}> | undefined;\n if (Array.isArray(outputFields)) {\n for (const field of outputFields) {\n if (field.name?.trim()) {\n variables.push({\n nodeId: upstreamId,\n nodeName,\n fieldName: field.name.trim(),\n fieldType: field.type || 'text'\n });\n }\n }\n }\n }\n \n return variables;\n}\n\n// Variable insertion dropdown component\nfunction VariableInsertDropdown({\n targetTextareaRef,\n workflow,\n currentNodeId,\n onInsert\n}: {\n targetTextareaRef: React.RefObject<HTMLTextAreaElement | null>;\n workflow: WorkflowFileV1;\n currentNodeId: string;\n onInsert?: (variable: string) => void;\n}) {\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n \n const variables = useMemo(() => getUpstreamVariables(workflow, currentNodeId), [workflow, currentNodeId]);\n\n // Always-available globals (these work across node types)\n const globalVariables = useMemo(\n () => [\n { variable: \"{{run.id}}\", type: \"text\" },\n { variable: \"{{workflow.name}}\", type: \"text\" },\n { variable: \"{{workflow.id}}\", type: \"text\" },\n { variable: \"{{node.id}}\", type: \"text\" },\n { variable: \"{{date}}\", type: \"text\" },\n ],\n []\n );\n \n // Close dropdown when clicking outside\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n }\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isOpen]);\n \n const insertVariable = (variable: string) => {\n const textarea = targetTextareaRef.current;\n if (textarea) {\n const start = textarea.selectionStart;\n const end = textarea.selectionEnd;\n const currentValue = textarea.value;\n const newValue = currentValue.substring(0, start) + variable + currentValue.substring(end);\n \n // Use the onInsert callback to update the parent component's state\n if (onInsert) {\n onInsert(newValue);\n \n // Set cursor position after the inserted variable\n setTimeout(() => {\n textarea.focus();\n const newCursorPos = start + variable.length;\n textarea.setSelectionRange(newCursorPos, newCursorPos);\n }, 0);\n }\n }\n setIsOpen(false);\n };\n \n // Group variables by node\n const groupedVariables = variables.reduce((groups, variable) => {\n const key = `${variable.nodeId}|${variable.nodeName}`;\n if (!groups[key]) {\n groups[key] = { nodeId: variable.nodeId, nodeName: variable.nodeName, fields: [] };\n }\n groups[key].fields.push({ name: variable.fieldName, type: variable.fieldType });\n return groups;\n }, {} as Record<string, { nodeId: string; nodeName: string; fields: Array<{ name: string; type: string }> }>);\n \n return (\n <div className=\"absolute top-1 right-1\" ref={dropdownRef}>\n <button\n type=\"button\"\n onClick={() => setIsOpen(!isOpen)}\n className=\"rounded-lg border border-white/10 bg-black/30 px-2 py-1 text-[9px] text-[color:var(--ck-text-secondary)] hover:bg-white/10 hover:text-[color:var(--ck-text-primary)]\"\n title=\"Insert variable\"\n >\n {'{{}}'}\n </button>\n \n {isOpen && (\n <div className=\"absolute right-0 top-8 z-50 w-72 max-h-80 overflow-auto rounded-lg border border-white/15 bg-black/80 backdrop-blur shadow-[var(--ck-shadow-1)]\">\n <div className=\"p-1\">\n <div>\n <div className=\"px-2 py-1 text-[10px] font-medium uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">\n Globals\n </div>\n {globalVariables.map(({ variable, type }) => (\n <button\n key={variable}\n type=\"button\"\n onClick={() => insertVariable(variable)}\n className=\"w-full flex items-center justify-between gap-2 rounded-lg px-2 py-1 text-left text-xs text-[color:var(--ck-text-primary)] hover:bg-white/10 cursor-pointer\"\n >\n <span className=\"font-mono\">{variable}</span>\n <span className=\"text-[9px] px-1 py-0.5 rounded-sm bg-black/30 text-blue-400\">\n {type}\n </span>\n </button>\n ))}\n </div>\n\n {Object.values(groupedVariables).map(group => (\n <div key={group.nodeId}>\n <div className=\"px-2 py-1 text-[10px] font-medium uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">\n {group.nodeName}\n </div>\n {group.fields.map(field => {\n const variable = `{{${group.nodeId}.${field.name}}}`;\n const badgeColor = field.type === 'text' ? 'text-blue-400' : \n field.type === 'list' ? 'text-green-400' : \n field.type === 'json' ? 'text-amber-400' : 'text-gray-400';\n \n return (\n <button\n key={`${group.nodeId}.${field.name}`}\n type=\"button\"\n onClick={() => insertVariable(variable)}\n className=\"w-full flex items-center justify-between gap-2 rounded-lg px-2 py-1 text-left text-xs text-[color:var(--ck-text-primary)] hover:bg-white/10 cursor-pointer\"\n >\n <span className=\"font-mono\">{variable}</span>\n <span className={`text-[9px] px-1 py-0.5 rounded-sm bg-black/30 ${badgeColor}`}>\n {field.type}\n </span>\n </button>\n );\n })}\n </div>\n ))}\n \n {variables.length === 0 && (\n <div className=\"px-2 py-3 text-xs text-[color:var(--ck-text-secondary)]\">\n Tip: Add output fields to upstream nodes to see node-specific variables here.\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction TemplateTextareaWithVars({\n value,\n onChangeValue,\n workflow,\n currentNodeId,\n className,\n placeholder,\n spellCheck,\n}: {\n value: string;\n onChangeValue: (next: string) => void;\n workflow: WorkflowFileV1;\n currentNodeId: string;\n className: string;\n placeholder?: string;\n spellCheck?: boolean;\n}) {\n const ref = useRef<HTMLTextAreaElement>(null);\n return (\n <div className=\"relative\">\n <textarea\n ref={ref}\n value={value}\n onChange={(e) => onChangeValue(e.target.value)}\n className={className}\n placeholder={placeholder}\n spellCheck={spellCheck}\n />\n <VariableInsertDropdown\n targetTextareaRef={ref}\n workflow={workflow}\n currentNodeId={currentNodeId}\n onInsert={(newValue) => onChangeValue(newValue)}\n />\n </div>\n );\n}\n\n// Output fields editor component for all node types\nfunction OutputFieldsEditor({\n outputFields,\n onChange\n}: {\n outputFields: OutputField[];\n onChange: (fields: OutputField[]) => void;\n}) {\n return (\n <div>\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">\n output fields (optional)\n </div>\n <div className=\"text-[9px] text-[color:var(--ck-text-secondary)] mb-2\">\n Define what this node produces for downstream nodes\n </div>\n <div className=\"space-y-1\">\n {outputFields.map((field, index) => (\n <div key={index} className=\"flex items-center gap-2\">\n <input\n value={field.name}\n onChange={(e) => {\n const newOutputFields = [...outputFields];\n newOutputFields[index] = { ...field, name: e.target.value };\n onChange(newOutputFields);\n }}\n className=\"flex-1 rounded-lg border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"Field name\"\n />\n <select\n value={field.type}\n onChange={(e) => {\n const newType = e.target.value as OutputFieldType;\n const newOutputFields = [...outputFields];\n newOutputFields[index] = { ...field, type: newType };\n onChange(newOutputFields);\n }}\n className=\"rounded-lg border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"text\">text</option>\n <option value=\"list\">list</option>\n <option value=\"json\">json</option>\n </select>\n <button\n type=\"button\"\n onClick={() => {\n const newOutputFields = outputFields.filter((_, i) => i !== index);\n onChange(newOutputFields);\n }}\n className=\"text-xs text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n ×\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n onClick={() => {\n const newOutputFields = [...outputFields, { name: \"\", type: \"text\" as const }];\n onChange(newOutputFields);\n }}\n className=\"text-xs text-[color:var(--ck-text-secondary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n + Add field\n </button>\n </div>\n </div>\n );\n}\n\ntype LoadState =\n | { kind: \"loading\" }\n | { kind: \"error\"; error: string }\n | { kind: \"ready\"; jsonText: string };\n\ntype OutputFieldType = \"text\" | \"list\" | \"json\";\ntype OutputField = { name: string; type: OutputFieldType };\n\nfunction draftKey(teamId: string, workflowId: string) {\n return `ck-wf-draft:${teamId}:${workflowId}`;\n}\n\nexport default function WorkflowsEditorClient({\n teamId,\n workflowId,\n draft,\n llmTaskEnabled,\n}: {\n teamId: string;\n workflowId: string;\n draft: boolean;\n llmTaskEnabled?: boolean;\n}) {\n const router = useRouter();\n const [view, setView] = useState<\"canvas\" | \"json\">(\"canvas\");\n const [saving, setSaving] = useState(false);\n const [status, setStatus] = useState<LoadState>({ kind: \"loading\" });\n const [actionError, setActionError] = useState<string>(\"\");\n const [triggerSyncStatus, setTriggerSyncStatus] = useState<\"idle\" | \"syncing\" | \"success\" | \"error\">(\n \"idle\"\n );\n const [triggerSyncError, setTriggerSyncError] = useState<string>(\"\");\n const importInputRef = useRef<HTMLInputElement | null>(null);\n\n const [toolsCollapsed, setToolsCollapsed] = useState(false);\n\n // Canvas zoom\n const [zoom, setZoom] = useState(1);\n const ZOOM_MIN = 0.5;\n const ZOOM_MAX = 2.5;\n const ZOOM_STEP = 0.1;\n\n // Canvas: selection, drag, node/edge creation.\n const canvasRef = useRef<HTMLDivElement | null>(null);\n const [selectedNodeId, setSelectedNodeId] = useState<string>(\"\");\n const [dragging, setDragging] = useState<null | { nodeId: string; dx: number; dy: number }>(null);\n\n const [activeTool, setActiveTool] = useState<\n | { kind: \"select\" }\n | { kind: \"add-node\"; nodeType: WorkflowFileV1[\"nodes\"][number][\"type\"] }\n | { kind: \"connect\" }\n >({ kind: \"select\" });\n const [connectFromNodeId, setConnectFromNodeId] = useState<string>(\"\");\n\n const [agents, setAgents] = useState<Array<{ id: string; identityName?: string }>>([]);\n const [agentsError, setAgentsError] = useState<string>(\"\");\n\n const [approvalBindings, setApprovalBindings] = useState<Array<{ id: string; label: string; channel: string; target: string }>>([]);\n const [approvalBindingsError, setApprovalBindingsError] = useState<string>(\"\");\n const [availableModels, setAvailableModels] = useState<string[]>([]);\n const [availableModelsError, setAvailableModelsError] = useState<string>(\"\");\n\n // Handoff node: available teams & their workflows\n const [handoffTeams, setHandoffTeams] = useState<string[]>([]);\n const [handoffWorkflows, setHandoffWorkflows] = useState<Record<string, Array<{ id: string; name?: string }>>>({});\n const [handoffTeamsLoading, setHandoffTeamsLoading] = useState(false);\n // Generic per-platform account cache for handoff nodes. Key format: `${teamId}::${canonicalPlatform}`.\n // Each account carries `identifier` (raw Postiz type e.g. `instagram-standalone`) so workflows\n // stay variant-aware at publish time even when the UI groups variants together.\n const [handoffAccounts, setHandoffAccounts] = useState<Record<string, Array<{ integrationId: string; displayName: string; username?: string; identifier: string }>>>({});\n const [handoffAccountsLoading, setHandoffAccountsLoading] = useState<Record<string, boolean>>({});\n\n // Extract the platform a per-platform post workflow targets. Convention:\n // social-post-to-<platform>-v<N> (platform may contain hyphens, e.g. google-business)\n // Returns null for workflows that don't follow this convention (e.g. social-execution-from-handoff),\n // in which case the picker stays hidden.\n const extractPlatformFromWorkflowId = (workflowId: string): string | null => {\n const m = String(workflowId || '').match(/^social-post-to-(.+)-v\\d+$/i);\n return m ? m[1].toLowerCase() : null;\n };\n // Collapse Postiz variants (instagram-standalone → instagram, facebook-page → facebook).\n const canonicalPlatform = (identifier: string): string => {\n return String(identifier || '').toLowerCase().replace(/-standalone$/, '').replace(/-page$/, '');\n };\n const accountsKey = (tid: string, platform: string) => `${tid}::${canonicalPlatform(platform)}`;\n const [showRawConfig, setShowRawConfig] = useState<Record<string, boolean>>({});\n\n const approvalBindingsNeedsKitchenUpdate = useMemo(() => {\n return /Tool not available:\\s*gateway/i.test(String(approvalBindingsError || \"\"));\n }, [approvalBindingsError]);\n\n // Inspector state (parity with modal)\n const [workflowRuns, setWorkflowRuns] = useState<string[]>([]);\n const [workflowRunsLoading, setWorkflowRunsLoading] = useState(false);\n const [runOverlayOpen, setRunOverlayOpen] = useState(false);\n const [workflowRunsError, setWorkflowRunsError] = useState(\"\");\n const [selectedWorkflowRunId, setSelectedWorkflowRunId] = useState<string>(\"\");\n\n // Run preflight: ensure nodes are assigned + required worker cron exists.\n const [cronLoading, setCronLoading] = useState(false);\n const [cronError, setCronError] = useState<string>(\"\");\n const [agentHasCron, setAgentHasCron] = useState<Record<string, boolean>>({});\n\n const [installCronOpen, setInstallCronOpen] = useState(false);\n const [installCronBusy, setInstallCronBusy] = useState(false);\n const [installCronError, setInstallCronError] = useState<string>(\"\");\n\n // Skip cron check: session-only flag (\"skipCronOnce\") OR persisted flag on the\n // workflow JSON at `meta.skipCronCheck` (\"skipCronPermanent\"). Either unblocks\n // the Run Now button when worker crons aren't installed (e.g. when workers\n // are running via launchd or an external scheduler).\n const [skipCronOnce, setSkipCronOnce] = useState(false);\n const [skipCronModalOpen, setSkipCronModalOpen] = useState(false);\n const [skipCronSaving, setSkipCronSaving] = useState(false);\n const [skipCronError, setSkipCronError] = useState<string>(\"\");\n\n const [newNodeId, setNewNodeId] = useState(\"\");\n const [newNodeName, setNewNodeName] = useState(\"\");\n const [newNodeType, setNewNodeType] = useState<WorkflowFileV1[\"nodes\"][number][\"type\"]>(\"llm\");\n\n const [newEdgeFrom, setNewEdgeFrom] = useState(\"\");\n const [newEdgeTo, setNewEdgeTo] = useState(\"\");\n const [newEdgeLabel, setNewEdgeLabel] = useState(\"\");\n\n useEffect(() => {\n (async () => {\n try {\n if (draft) {\n const stored = sessionStorage.getItem(draftKey(teamId, workflowId));\n if (stored) {\n setStatus({ kind: \"ready\", jsonText: stored });\n return;\n }\n\n // New draft: initialize a clean workflow instead of trying to fetch an existing file.\n const initial: WorkflowFileV1 = {\n schema: \"clawkitchen.workflow.v1\",\n id: workflowId,\n name: \"New workflow\",\n timezone: \"UTC\",\n nodes: [\n { id: \"start\", type: \"start\", name: \"start\", x: 80, y: 80, config: {} },\n { id: \"end\", type: \"end\", name: \"end\", x: 520, y: 80, config: {} },\n ],\n edges: [{ id: \"e1\", from: \"start\", to: \"end\" }],\n };\n const text = JSON.stringify(initial, null, 2) + \"\\n\";\n setStatus({ kind: \"ready\", jsonText: text });\n try {\n sessionStorage.setItem(draftKey(teamId, workflowId), text);\n } catch {\n // ignore\n }\n return;\n }\n\n const res = await fetch(\n `/api/teams/workflows?teamId=${encodeURIComponent(teamId)}&id=${encodeURIComponent(workflowId)}`,\n { cache: \"no-store\" }\n );\n const json = (await res.json()) as { ok?: boolean; error?: string; workflow?: unknown };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to load workflow\");\n setStatus({ kind: \"ready\", jsonText: JSON.stringify(json.workflow, null, 2) + \"\\n\" });\n } catch (e: unknown) {\n setStatus({ kind: \"error\", error: e instanceof Error ? e.message : String(e) });\n }\n })();\n }, [teamId, workflowId, draft]);\n\n useEffect(() => {\n (async () => {\n setAgentsError(\"\");\n try {\n const res = await fetch(\"/api/agents\", { cache: \"no-store\" });\n const json = (await res.json()) as { agents?: Array<{ id?: unknown; identityName?: unknown }>; error?: string; message?: string };\n if (!res.ok) throw new Error(json.error || json.message || \"Failed to load agents\");\n const list = Array.isArray(json.agents) ? json.agents : [];\n const filtered = list\n .map((a) => ({ id: String(a.id ?? \"\").trim(), identityName: typeof a.identityName === \"string\" ? a.identityName : undefined }))\n .filter((a) => a.id && a.id.startsWith(`${teamId}-`));\n setAgents(filtered);\n } catch (e: unknown) {\n setAgentsError(e instanceof Error ? e.message : String(e));\n setAgents([]);\n }\n })();\n }, [teamId]);\n\n function isRecord(v: unknown): v is Record<string, unknown> {\n return Boolean(v) && typeof v === \"object\" && !Array.isArray(v);\n }\n\n function bindingLabelAndTarget(b: unknown): { id: string; label: string; channel: string; target: string } | null {\n // Expected OpenClaw binding shape:\n // { agentId, match: { channel: \"telegram\", accountId?: string, peer?: { kind: \"dm\"|\"group\", id: string } } }\n if (!isRecord(b)) return null;\n const match = isRecord(b.match) ? b.match : null;\n if (!match) return null;\n\n const channel = String(match.channel ?? \"\").trim();\n if (!channel) return null;\n\n const bindingAgentId = String(b.agentId ?? \"\").trim();\n const accountId = String(match.accountId ?? \"\").trim();\n const peer = isRecord(match.peer) ? match.peer : null;\n const kind = peer ? String(peer.kind ?? \"\").trim() : \"\";\n const peerId = peer ? String(peer.id ?? \"\").trim() : \"\";\n const target = peerId || accountId;\n\n if (!target) return null;\n\n // approvalBindingId must be the actual config binding id (agentId) when available.\n // Older Kitchen builds synthesized ids like telegram:dm:<peer> or telegram:account:<id>,\n // which can be ambiguous and break approval resolution when multiple bindings share a peer.\n const id = bindingAgentId || (accountId ? `${channel}:account:${accountId}` : `${channel}:${kind}:${peerId}`);\n\n const parts = [channel];\n if (bindingAgentId) parts.push(bindingAgentId);\n if (accountId) parts.push(`account:${accountId}`);\n if (kind && peerId) parts.push(`${kind}:${peerId}`);\n\n return { id, label: parts.join(\" · \"), channel, target };\n }\n\n useEffect(() => {\n (async () => {\n setApprovalBindingsError(\"\");\n try {\n const res = await fetch(\"/api/channels/bindings\", { cache: \"no-store\" });\n const json = (await res.json()) as { ok?: boolean; bindings?: unknown[]; error?: string };\n if (!res.ok || json.ok === false) throw new Error(json.error || \"Failed to load bindings\");\n\n const list = Array.isArray(json.bindings) ? json.bindings : [];\n const mapped = list.map(bindingLabelAndTarget).filter(Boolean) as Array<{ id: string; label: string; channel: string; target: string }>;\n setApprovalBindings(mapped);\n } catch (e: unknown) {\n setApprovalBindingsError(e instanceof Error ? e.message : String(e));\n setApprovalBindings([]);\n }\n })();\n }, []);\n\n useEffect(() => {\n (async () => {\n setAvailableModelsError(\"\");\n try {\n const res = await fetch(\"/api/settings/model-options\", { cache: \"no-store\" });\n const json = (await res.json()) as { ok?: boolean; models?: unknown[]; error?: string };\n if (!res.ok || json.ok === false) throw new Error(json.error || \"Failed to load model options\");\n\n const deduped = Array.isArray(json.models)\n ? Array.from(new Set(json.models.map((m) => String(m ?? \"\").trim()).filter(Boolean)))\n : [];\n setAvailableModels(deduped);\n } catch (e: unknown) {\n setAvailableModelsError(e instanceof Error ? e.message : String(e));\n setAvailableModels([]);\n }\n })();\n }, []);\n\n const refreshCronMap = useCallback(async (): Promise<Record<string, boolean>> => {\n // Preflight helper: determine whether each workflow-assigned agent has a\n // workflow worker-tick cron installed and enabled. Safe-idle or other\n // generic crons do NOT satisfy this requirement — only crons whose name\n // starts with \"workflow-worker:\" or whose payload message contains\n // \"worker-tick\" count.\n setCronError(\"\");\n setCronLoading(true);\n try {\n const res = await fetch(\"/api/cron/jobs\", { cache: \"no-store\" });\n const json = (await res.json()) as { ok?: boolean; error?: string; jobs?: unknown[] };\n if (!res.ok || json.ok === false) throw new Error(json.error || \"Failed to load cron jobs\");\n const jobs = Array.isArray(json.jobs) ? json.jobs : [];\n\n const map: Record<string, boolean> = {};\n for (const j of jobs) {\n const job = j as {\n enabled?: unknown;\n name?: unknown;\n agentId?: unknown;\n payload?: { message?: unknown; kind?: unknown };\n scope?: { kind?: unknown; id?: unknown };\n };\n if (!job || !Boolean(job.enabled)) continue;\n\n // Only match workflow worker-tick crons, not safe-idle or other agent crons.\n const jobName = String(job.name ?? \"\");\n const payloadMsg = String(job.payload?.message ?? \"\");\n const isWorkerTick = jobName.startsWith(\"workflow-worker:\") || payloadMsg.includes(\"worker-tick\");\n if (!isWorkerTick) continue;\n\n // Worker-tick crons run as agentId \"main\" but reference the target\n // agent in the name (workflow-worker:<teamId>:<agentId>) and message.\n // Extract the target agent from the name or payload.\n const nameMatch = jobName.match(/^workflow-worker:[^:]+:(.+)$/);\n if (nameMatch?.[1]) {\n map[nameMatch[1]] = true;\n continue;\n }\n\n // Fallback: extract from payload message pattern \"worker-tick ... --agent-id <id>\"\n const msgMatch = payloadMsg.match(/--agent-id\\s+(\\S+)/);\n if (msgMatch?.[1]) {\n map[msgMatch[1]] = true;\n continue;\n }\n\n // Last resort: if the cron runs as a non-main agent, use that.\n const agentId = String(job.agentId ?? \"\").trim();\n if (agentId && agentId !== \"main\") {\n map[agentId] = true;\n }\n }\n setAgentHasCron(map);\n return map;\n } catch (e: unknown) {\n setCronError(e instanceof Error ? e.message : String(e));\n setAgentHasCron({});\n return {};\n } finally {\n setCronLoading(false);\n }\n }, []);\n\n useEffect(() => {\n void refreshCronMap();\n }, [refreshCronMap]);\n\n const parsed = useMemo(() => {\n if (status.kind !== \"ready\") return { wf: null as WorkflowFileV1 | null, err: \"\" };\n try {\n const wf = JSON.parse(status.jsonText) as WorkflowFileV1;\n return { wf, err: \"\" };\n } catch (e: unknown) {\n return { wf: null, err: e instanceof Error ? e.message : String(e) };\n }\n }, [status]);\n\n const validation = useMemo(() => {\n if (!parsed.wf) return { errors: [], warnings: [] as string[] };\n return validateWorkflowFileV1(parsed.wf);\n }, [parsed.wf]);\n\n const runPreflight = useMemo(() => {\n const wf = parsed.wf;\n if (!wf) {\n return {\n missingAgentOnNodeIds: [] as string[],\n requiredAgentIds: [] as string[],\n agentIdsMissingCron: [] as string[],\n ok: true,\n };\n }\n\n const nodesToExecute = (wf.nodes ?? []).filter(\n (n) => n.type !== \"start\" && n.type !== \"end\" && n.type !== \"human_approval\"\n );\n\n const missingAgentOnNodeIds = nodesToExecute\n .filter((n) => {\n const cfg = n.config && typeof n.config === \"object\" && !Array.isArray(n.config) ? (n.config as Record<string, unknown>) : {};\n const agentId = String(cfg.agentId ?? \"\").trim();\n return !agentId;\n })\n .map((n) => n.id);\n\n const requiredAgentIds = Array.from(\n new Set(\n nodesToExecute\n .map((n) => {\n const cfg = n.config && typeof n.config === \"object\" && !Array.isArray(n.config) ? (n.config as Record<string, unknown>) : {};\n return String(cfg.agentId ?? \"\").trim();\n })\n .filter(Boolean)\n )\n );\n\n const agentIdsMissingCron = requiredAgentIds.filter((id) => !agentHasCron[id]);\n\n // meta.skipCronCheck is the persisted \"skip permanently\" flag on the workflow itself.\n const meta = wf.meta && typeof wf.meta === \"object\" && !Array.isArray(wf.meta)\n ? (wf.meta as Record<string, unknown>)\n : {};\n const skipCronPermanent = meta.skipCronCheck === true;\n\n const cronSatisfied = agentIdsMissingCron.length === 0 || skipCronOnce || skipCronPermanent;\n const ok = missingAgentOnNodeIds.length === 0 && cronSatisfied;\n return {\n missingAgentOnNodeIds,\n requiredAgentIds,\n agentIdsMissingCron,\n skipCronPermanent,\n ok,\n };\n }, [parsed.wf, agentHasCron, skipCronOnce]);\n\n function setWorkflow(next: WorkflowFileV1) {\n const text = JSON.stringify(next, null, 2) + \"\\n\";\n setStatus({ kind: \"ready\", jsonText: text });\n if (draft) {\n try {\n sessionStorage.setItem(draftKey(teamId, workflowId), text);\n } catch {\n // ignore\n }\n }\n }\n\n async function onSave() {\n if (status.kind !== \"ready\") return;\n if (!parsed.wf) return;\n if (parsed.err) return;\n if (validation.errors.length) return;\n\n setSaving(true);\n setActionError(\"\");\n setTriggerSyncStatus(\"idle\");\n setTriggerSyncError(\"\");\n \n try {\n // Save workflow first\n const res = await fetch(\"/api/teams/workflows\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, workflow: parsed.wf }),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to save workflow\");\n\n // Clear draft cache once persisted.\n try {\n sessionStorage.removeItem(draftKey(teamId, workflowId));\n } catch {\n // ignore\n }\n\n // Sync triggers (don't block save flow on trigger sync errors)\n if (parsed.wf.triggers?.length) {\n try {\n setTriggerSyncStatus(\"syncing\");\n const triggerRes = await fetch(\"/api/teams/workflow-triggers\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n action: \"sync\",\n teamId,\n workflowId: parsed.wf.id,\n triggers: parsed.wf.triggers ?? [],\n }),\n });\n const triggerJson = (await triggerRes.json()) as { ok?: boolean; error?: string };\n \n if (triggerRes.ok && triggerJson.ok) {\n setTriggerSyncStatus(\"success\");\n // Clear success status after 3 seconds\n setTimeout(() => setTriggerSyncStatus(\"idle\"), 3000);\n } else {\n setTriggerSyncStatus(\"error\");\n setTriggerSyncError(triggerJson.error || \"Failed to sync triggers\");\n }\n } catch (e: unknown) {\n setTriggerSyncStatus(\"error\");\n setTriggerSyncError(e instanceof Error ? e.message : \"Failed to sync triggers\");\n }\n }\n } catch (e: unknown) {\n setActionError(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n\n function onExport() {\n if (!parsed.wf) return;\n if (parsed.err) return;\n if (validation.errors.length) return;\n\n const filename = `${parsed.wf.id || workflowId}.workflow.json`;\n const blob = new Blob([JSON.stringify(parsed.wf, null, 2) + \"\\n\"], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n }\n\n if (status.kind === \"loading\") return <div className=\"w-full\">Loading…</div>;\n if (status.kind === \"error\") return <div className=\"w-full\">{status.error}</div>;\n\n // (section collapse uses native <details> to keep this file simple)\n const llmHelp = llmTaskEnabled === false ? (\n <div className=\"mx-3 mb-3 rounded-lg border border-amber-500/30 bg-amber-500/10 p-3 text-sm\">\n <div className=\"font-medium text-amber-200\">LLM support is not enabled</div>\n <div className=\"mt-1 text-[color:var(--ck-text-secondary)]\">\n Workflow LLM nodes require the optional built-in <code className=\"px-1\">llm-task</code> plugin.\n </div>\n <div className=\"mt-2 text-[color:var(--ck-text-secondary)]\">\n Enable it with: <code className=\"px-1\">openclaw plugins enable llm-task</code> then run{' '}\n <code className=\"px-1\">openclaw gateway restart</code>.\n </div>\n </div>\n ) : null;\n\n\n return (\n <div className=\"flex h-full min-h-0 w-full flex-1 flex-col\">\n <div className=\"flex flex-wrap items-center justify-between gap-3 px-3 py-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <a\n href={`/teams/${encodeURIComponent(teamId)}?tab=workflows`}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Back\n </a>\n <div className=\"min-w-0\">\n <div className=\"truncate text-base font-medium text-[color:var(--ck-text-primary)]\">\n {workflowId}.workflow.json\n </div>\n <div className=\"mt-0.5 text-sm text-[color:var(--ck-text-tertiary)]\">Team: {teamId}</div>\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"flex overflow-hidden rounded-lg border border-white/10\">\n <button\n type=\"button\"\n onClick={() => setView(\"canvas\")}\n className={\n view === \"canvas\"\n ? \"bg-white/10 px-3 py-2 text-xs font-medium text-[color:var(--ck-text-primary)]\"\n : \"bg-transparent px-3 py-2 text-xs font-medium text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n >\n Canvas\n </button>\n <button\n type=\"button\"\n onClick={() => setView(\"json\")}\n className={\n view === \"json\"\n ? \"bg-white/10 px-3 py-2 text-xs font-medium text-[color:var(--ck-text-primary)]\"\n : \"bg-transparent px-3 py-2 text-xs font-medium text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n >\n JSON\n </button>\n </div>\n\n <input\n ref={importInputRef}\n type=\"file\"\n accept=\"application/json,.json\"\n className=\"hidden\"\n onChange={async (e) => {\n const file = e.target.files?.[0];\n // Reset the input so re-importing the same file still triggers onChange.\n e.target.value = \"\";\n if (!file) return;\n\n setActionError(\"\");\n try {\n const text = await file.text();\n const next = JSON.parse(text) as WorkflowFileV1;\n setStatus({ kind: \"ready\", jsonText: JSON.stringify(next, null, 2) + \"\\n\" });\n if (draft) {\n try {\n sessionStorage.setItem(draftKey(teamId, workflowId), JSON.stringify(next, null, 2) + \"\\n\");\n } catch {\n // ignore\n }\n }\n } catch (err: unknown) {\n setActionError(err instanceof Error ? err.message : String(err));\n }\n }}\n />\n\n <button\n type=\"button\"\n disabled={saving}\n onClick={() => importInputRef.current?.click()}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-white/10 disabled:opacity-50\"\n >\n Import\n </button>\n\n <button\n type=\"button\"\n disabled={!parsed.wf || Boolean(parsed.err) || validation.errors.length > 0}\n onClick={onExport}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-white/10 disabled:opacity-50\"\n >\n Export\n </button>\n\n <button\n type=\"button\"\n disabled={saving || !parsed.wf || Boolean(parsed.err) || validation.errors.length > 0}\n onClick={onSave}\n className=\"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save\"}\n </button>\n\n {/* Back button lives in the left header. */}\n </div>\n </div>\n\n {llmHelp}\n\n {parsed.err ? (\n <div className=\"mt-3 rounded-lg border border-yellow-400/30 bg-yellow-500/10 p-3 text-sm text-yellow-100\">\n JSON parse error: {parsed.err}\n </div>\n ) : null}\n {!parsed.err && validation.errors.length ? (\n <div className=\"mt-3 rounded-lg border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n <div className=\"font-medium\">Workflow validation errors</div>\n <ul className=\"mt-2 list-disc space-y-1 pl-5\">\n {validation.errors.map((e) => (\n <li key={e}>{e}</li>\n ))}\n </ul>\n </div>\n ) : null}\n\n {!parsed.err && !validation.errors.length && validation.warnings.length ? (\n <div className=\"mt-3 rounded-lg border border-yellow-400/30 bg-yellow-500/10 p-3 text-sm text-yellow-100\">\n <div className=\"font-medium\">Workflow validation warnings</div>\n <ul className=\"mt-2 list-disc space-y-1 pl-5\">\n {validation.warnings.map((w) => (\n <li key={w}>{w}</li>\n ))}\n </ul>\n </div>\n ) : null}\n\n {actionError ? (\n <div className=\"mt-3 rounded-lg border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {actionError}\n </div>\n ) : null}\n\n <div className=\"flex min-h-0 flex-1 gap-0\">\n {view === \"json\" ? (\n <textarea\n value={status.jsonText}\n onChange={(e) => {\n const t = e.target.value;\n setStatus({ kind: \"ready\", jsonText: t });\n if (draft) {\n try {\n sessionStorage.setItem(draftKey(teamId, workflowId), t);\n } catch {\n // ignore\n }\n }\n }}\n className=\"h-full min-h-0 w-full flex-1 resize-none rounded-lg border border-white/10 bg-white/5 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]\"\n />\n ) : (\n <div\n ref={canvasRef}\n className=\"relative h-full min-h-0 w-full flex-1 overflow-auto bg-white/5\"\n onWheel={(e) => {\n // Ctrl/Cmd + wheel to zoom (avoid hijacking normal scroll)\n if (!e.ctrlKey && !e.metaKey) return;\n e.preventDefault();\n const dir = e.deltaY > 0 ? -1 : 1;\n setZoom((z) => {\n const next = Math.max(ZOOM_MIN, Math.min(ZOOM_MAX, Math.round((z + dir * ZOOM_STEP) * 10) / 10));\n return next;\n });\n }}\n onClick={(e) => {\n if (activeTool.kind !== \"add-node\") return;\n const wf = parsed.wf;\n if (!wf) return;\n const el = canvasRef.current;\n if (!el) return;\n\n // Only create when clicking on the canvas background (not a node).\n const target = e.target as HTMLElement | null;\n if (target && target.closest(\"[data-wf-node='1']\")) return;\n\n const rect = el.getBoundingClientRect();\n const clickX = (e.clientX - rect.left + el.scrollLeft) / zoom;\n const clickY = (e.clientY - rect.top + el.scrollTop) / zoom;\n\n const base = activeTool.nodeType.replace(/[^a-z0-9_\\-]/gi, \"_\");\n const used = new Set(wf.nodes.map((n) => n.id));\n let i = 1;\n let id = `${base}_${i}`;\n while (used.has(id)) {\n i++;\n id = `${base}_${i}`;\n }\n\n const x = Math.max(0, clickX - 90);\n const y = Math.max(0, clickY - 24);\n\n const defaultConfig = isMediaNode(activeTool.nodeType) \n ? getMediaNodeConfig(activeTool.nodeType)\n : {};\n\n const nextNode: WorkflowFileV1[\"nodes\"][number] = {\n id,\n type: activeTool.nodeType,\n name: id,\n x,\n y,\n config: defaultConfig,\n };\n\n setWorkflow({ ...wf, nodes: [...wf.nodes, nextNode] });\n setSelectedNodeId(id);\n setActiveTool({ kind: \"select\" });\n }}\n >\n <div className=\"relative\" style={{ width: 2200 * zoom, height: 1200 * zoom }}>\n {/* Tool palette / agent palette (not scaled) */}\n <div\n className={\n toolsCollapsed\n ? \"absolute left-3 top-3 z-20 w-[44px] overflow-hidden rounded-lg border border-white/10 bg-black/40 p-2 backdrop-blur\"\n : \"absolute left-3 top-3 z-20 w-[260px] rounded-lg border border-white/10 bg-black/40 p-2 backdrop-blur\"\n }\n >\n <div className=\"flex items-center justify-between gap-2\">\n <div className={toolsCollapsed ? \"hidden\" : \"text-[10px] font-medium uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\"}>Tools</div>\n <div className=\"flex items-center gap-2\">\n <div className={toolsCollapsed ? \"hidden\" : \"flex items-center gap-1\"}>\n <button\n type=\"button\"\n onClick={() => setZoom((z) => Math.max(ZOOM_MIN, Math.round((z - ZOOM_STEP) * 10) / 10))}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-[10px] text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n title=\"Zoom out (Ctrl/Cmd+wheel)\"\n >\n -\n </button>\n <div className=\"min-w-[42px] text-center text-[10px] text-[color:var(--ck-text-tertiary)]\">{Math.round(zoom * 100)}%</div>\n <button\n type=\"button\"\n onClick={() => setZoom((z) => Math.min(ZOOM_MAX, Math.round((z + ZOOM_STEP) * 10) / 10))}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-[10px] text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n title=\"Zoom in (Ctrl/Cmd+wheel)\"\n >\n +\n </button>\n </div>\n\n <button\n type=\"button\"\n onClick={() => setToolsCollapsed((v) => !v)}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-[10px] text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n title={toolsCollapsed ? \"Expand\" : \"Collapse\"}\n >\n {toolsCollapsed ? \">\" : \"<\"}\n </button>\n </div>\n </div>\n {toolsCollapsed ? (\n <div className=\"mt-2 flex flex-col items-center gap-2\">\n {(\n [\n {\n key: \"select\",\n label: \"Select\",\n active: activeTool.kind === \"select\",\n onClick: () => {\n setActiveTool({ kind: \"select\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 4l7 16 2-7 7-2L5 4Z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"connect\",\n label: \"Connect\",\n active: activeTool.kind === \"connect\",\n onClick: () => {\n // Toggle connect tool.\n setActiveTool((t) => (t.kind === \"connect\" ? { kind: \"select\" } : { kind: \"connect\" }));\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M10 13a5 5 0 0 1 0-7l1.2-1.2a5 5 0 0 1 7 7L17 12\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n <path d=\"M14 11a5 5 0 0 1 0 7L12.8 19.2a5 5 0 1 1-7-7L7 12\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n ),\n },\n {\n key: \"llm\",\n label: \"LLM\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"llm\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"llm\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M12 2l1.5 6.5L20 10l-6.5 1.5L12 18l-1.5-6.5L4 10l6.5-1.5L12 2Z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"tool\",\n label: \"Tool\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"tool\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"tool\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M14.5 7.5l2 2-8.5 8.5H6v-2l8.5-8.5Z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinejoin=\"round\" />\n <path d=\"M12 6a4 4 0 0 0-5 5l3-3 2 2 3-3A4 4 0 0 0 12 6Z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"condition\",\n label: \"If\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"condition\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"condition\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M7 4v7a3 3 0 0 0 3 3h7\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n <path d=\"M17 10l3 3-3 3\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"delay\",\n label: \"Delay\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"delay\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"delay\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M12 7v5l3 2\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M21 12a9 9 0 1 1-9-9\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n ),\n },\n {\n key: \"approval\",\n label: \"Approval\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"human_approval\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"human_approval\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M20 6 9 17l-5-5\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"end\",\n label: \"End\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"end\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"end\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M7 7h10v10H7V7Z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"media-image\",\n label: \"Image\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"media-image\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"media-image\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M14.5 4h-5L7 6.5 4.5 9v6L7 17.5 9.5 20h5L17 17.5 19.5 15V9L17 6.5 14.5 4Z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinejoin=\"round\" />\n <path d=\"M9 10a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\" fill=\"currentColor\" />\n <path d=\"m4.5 15 3.5-3.5L11 14l3.5-3.5 4 4\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"media-video\",\n label: \"Video\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"media-video\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"media-video\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M14 2v6h6\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M10 12l4.5 2.5-4.5 2.5v-5z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"handoff\",\n label: \"Handoff\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"handoff\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"handoff\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 12h14\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n <path d=\"M13 6l6 6-6 6\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M3 6v12\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n ),\n },\n ] as const\n ).map((b) => (\n <button\n key={b.key}\n type=\"button\"\n onClick={b.onClick}\n className={\n b.active\n ? \"flex h-8 w-8 items-center justify-center rounded-lg bg-white/10 text-[color:var(--ck-text-primary)]\"\n : \"flex h-8 w-8 items-center justify-center rounded-lg border border-white/10 bg-white/5 text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n }\n title={b.label}\n aria-label={b.label}\n >\n {b.icon}\n </button>\n ))}\n </div>\n ) : (\n <div className=\"mt-2 grid grid-cols-2 gap-2\">\n <button\n type=\"button\"\n onClick={() => {\n setActiveTool({ kind: \"select\" });\n setConnectFromNodeId(\"\");\n }}\n className={\n activeTool.kind === \"select\"\n ? \"rounded-lg bg-white/10 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n : \"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n }\n >\n Select\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setActiveTool({ kind: \"connect\" });\n setConnectFromNodeId(\"\");\n }}\n className={\n activeTool.kind === \"connect\"\n ? \"rounded-lg bg-white/10 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n : \"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n }\n title=\"Click a node, then click another node to create an edge\"\n >\n Connect\n </button>\n\n {([\n { t: \"llm\", label: \"LLM\" },\n { t: \"tool\", label: \"Tool\" },\n { t: \"condition\", label: \"If\" },\n { t: \"delay\", label: \"Delay\" },\n { t: \"human_approval\", label: \"Approve\" },\n { t: \"media-image\", label: \"🎨 Image\" },\n { t: \"media-video\", label: \"🎬 Video\" },\n { t: \"handoff\", label: \"↗ Handoff\" },\n { t: \"end\", label: \"End\" },\n ] as Array<{ t: WorkflowFileV1[\"nodes\"][number][\"type\"]; label: string }>).map((x) => (\n <button\n key={x.t}\n type=\"button\"\n onClick={() => {\n setActiveTool({ kind: \"add-node\", nodeType: x.t });\n setConnectFromNodeId(\"\");\n }}\n className={\n activeTool.kind === \"add-node\" && activeTool.nodeType === x.t\n ? \"rounded-lg bg-white/10 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n : \"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n }\n title=\"Select tool, then click on the canvas to place\"\n >\n + {x.label}\n </button>\n ))}\n </div>\n )}\n\n {!toolsCollapsed && activeTool.kind === \"connect\" && connectFromNodeId ? (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-secondary)]\">Connecting from: <span className=\"font-mono\">{connectFromNodeId}</span></div>\n ) : null}\n {!toolsCollapsed && activeTool.kind === \"add-node\" ? (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-secondary)]\">Click on the canvas to place a <span className=\"font-mono\">{activeTool.nodeType}</span> node.</div>\n ) : null}\n\n <div className=\"mt-3 border-t border-white/10 pt-3\">\n <div className={toolsCollapsed ? \"hidden\" : \"flex items-center justify-between gap-2\"}>\n <div className=\"text-[10px] font-medium uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">Agents</div>\n <div className=\"text-[10px] text-[color:var(--ck-text-tertiary)]\">drag → node</div>\n </div>\n\n {toolsCollapsed ? (\n <button\n type=\"button\"\n onClick={() => setToolsCollapsed(false)}\n className=\"mt-2 flex h-8 w-8 items-center justify-center rounded-lg border border-white/10 bg-white/5 text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n title=\"Expand to see agents\"\n aria-label=\"Expand to see agents\"\n >\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M16 11a4 4 0 1 0-8 0\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n <path d=\"M4 20a8 8 0 0 1 16 0\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n </button>\n ) : (\n <>\n {agentsError ? <div className=\"mt-1 text-[11px] text-red-200\">{agentsError}</div> : null}\n <div className=\"mt-2 max-h-[140px] space-y-1 overflow-auto\">\n {agents.length ? (\n agents.map((a) => (\n <div\n key={a.id}\n draggable\n onDragStart={(e) => {\n e.dataTransfer.setData(\"text/plain\", a.id);\n e.dataTransfer.effectAllowed = \"copy\";\n }}\n className=\"cursor-grab rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n title={a.id}\n >\n {a.identityName ? a.identityName : a.id.replace(`${teamId}-`, \"\")}\n </div>\n ))\n ) : (\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">No team agents found.</div>\n )}\n </div>\n </>\n )}\n </div>\n </div>\n\n <div className=\"relative h-[1200px] w-[2200px]\" style={{ transform: `scale(${zoom})`, transformOrigin: \"0 0\" }}>\n <svg\n className=\"pointer-events-none absolute inset-0 -z-10\"\n width={2200}\n height={1200}\n style={{ overflow: \"visible\" }}\n >\n {(parsed.wf?.edges ?? []).map((e) => {\n const wf = parsed.wf;\n if (!wf) return null;\n const a = wf.nodes.find((n) => n.id === e.from);\n const b = wf.nodes.find((n) => n.id === e.to);\n if (!a || !b) return null;\n const ax = (typeof a.x === \"number\" ? a.x : 80) + 90;\n const ay = (typeof a.y === \"number\" ? a.y : 80) + 24;\n const bx = (typeof b.x === \"number\" ? b.x : 80) + 90;\n const by = (typeof b.y === \"number\" ? b.y : 80) + 24;\n return (\n <line\n key={e.id}\n x1={ax}\n y1={ay}\n x2={bx}\n y2={by}\n stroke=\"rgba(255,255,255,0.35)\"\n strokeWidth={3}\n />\n );\n })}\n </svg>\n\n {(parsed.wf?.nodes ?? []).map((n, idx) => {\n const x = typeof n.x === \"number\" ? n.x : 80 + idx * 220;\n const y = typeof n.y === \"number\" ? n.y : 80;\n const selected = selectedNodeId === n.id;\n return (\n <div\n key={n.id}\n role=\"button\"\n tabIndex={0}\n data-wf-node=\"1\"\n draggable={activeTool.kind === \"select\" || activeTool.kind === \"connect\"}\n onDragStart={(e) => {\n // allow agent pills to be dropped; do not start a browser drag ghost for nodes.\n if (activeTool.kind !== \"select\") return;\n e.dataTransfer.setData(\"text/plain\", \"\");\n }}\n onDragOver={(e) => {\n // Allow dropping agents.\n if (e.dataTransfer.types.includes(\"text/plain\")) e.preventDefault();\n }}\n onDrop={(e) => {\n const wf = parsed.wf;\n if (!wf) return;\n e.preventDefault();\n e.stopPropagation();\n const agentId = String(e.dataTransfer.getData(\"text/plain\") || \"\").trim();\n if (!agentId) return;\n\n const nextNodes = wf.nodes.map((node) => {\n if (node.id !== n.id) return node;\n const cfg = node.config && typeof node.config === \"object\" && !Array.isArray(node.config) ? node.config : {};\n return { ...node, config: { ...cfg, agentId } };\n });\n setWorkflow({ ...wf, nodes: nextNodes });\n setSelectedNodeId(n.id);\n }}\n onClick={(e) => {\n e.stopPropagation();\n const wf = parsed.wf;\n if (activeTool.kind === \"connect\") {\n if (!wf) return;\n if (!connectFromNodeId) {\n setConnectFromNodeId(n.id);\n setSelectedNodeId(n.id);\n return;\n }\n const from = connectFromNodeId;\n const to = n.id;\n setConnectFromNodeId(\"\");\n if (!from || !to || from === to) return;\n const exists = (wf.edges ?? []).some((e) => e.from === from && e.to === to);\n if (exists) return;\n const id = `e${Date.now()}`;\n const nextEdge: WorkflowFileV1[\"edges\"][number] = { id, from, to };\n setWorkflow({ ...wf, edges: [...(wf.edges ?? []), nextEdge] });\n // After creating an edge, return to Select tool.\n setActiveTool({ kind: \"select\" });\n return;\n }\n\n setSelectedNodeId(n.id);\n }}\n onPointerDown={(e) => {\n // Allow dragging nodes even in connect mode (connect is click-to-connect, not drag-to-connect).\n if (activeTool.kind === \"add-node\") return;\n if (e.button !== 0) return;\n const el = canvasRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n setSelectedNodeId(n.id);\n try {\n e.currentTarget.setPointerCapture(e.pointerId);\n } catch {\n // ignore\n }\n e.preventDefault();\n\n const pointerX = (e.clientX - rect.left + el.scrollLeft) / zoom;\n const pointerY = (e.clientY - rect.top + el.scrollTop) / zoom;\n setDragging({ nodeId: n.id, dx: pointerX - x, dy: pointerY - y });\n }}\n onPointerUp={(e) => {\n try {\n e.currentTarget.releasePointerCapture(e.pointerId);\n } catch {\n // ignore\n }\n setDragging(null);\n }}\n onPointerMove={(e) => {\n if (!dragging) return;\n if (dragging.nodeId !== n.id) return;\n const wf = parsed.wf;\n if (!wf) return;\n const el = canvasRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const pointerX = (e.clientX - rect.left + el.scrollLeft) / zoom;\n const pointerY = (e.clientY - rect.top + el.scrollTop) / zoom;\n const nextX = pointerX - dragging.dx;\n const nextY = pointerY - dragging.dy;\n const nextNodes = wf.nodes.map((node) => (node.id === n.id ? { ...node, x: nextX, y: nextY } : node));\n const next: WorkflowFileV1 = { ...wf, nodes: nextNodes };\n setStatus({ kind: \"ready\", jsonText: JSON.stringify(next, null, 2) + \"\\n\" });\n }}\n className={\n selected\n ? \"absolute z-10 cursor-grab rounded-lg border border-white/25 bg-white/10 px-3 py-2 text-xs text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)]\"\n : \"absolute z-10 cursor-grab rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-xs text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n }\n style={{ left: x, top: y, width: 180 }}\n >\n <div className=\"flex items-center gap-2\">\n {isMediaNode(n.type) && (\n <span className=\"text-lg\">\n {n.type === 'media-image' ? '🎨' : '🎬'}\n </span>\n )}\n {n.type === 'handoff' && (\n <span className=\"text-lg\">↗</span>\n )}\n <div className=\"font-medium text-[color:var(--ck-text-primary)]\">{n.name || n.id}</div>\n </div>\n <div className=\"mt-0.5 text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">{n.type}</div>\n {(() => {\n const cfg = n.config && typeof n.config === \"object\" && !Array.isArray(n.config) ? (n.config as Record<string, unknown>) : null;\n \n // Show media generation prompt for media nodes\n if (isMediaNode(n.type) && cfg) {\n const prompt = String(cfg.prompt ?? \"\").trim();\n const provider = String(cfg.provider ?? \"auto\");\n return (\n <div className=\"mt-1 space-y-0.5\">\n {prompt && (\n <div className=\"text-[10px] text-[color:var(--ck-text-secondary)] truncate\" title={prompt}>\n &quot;{prompt.length > 40 ? prompt.substring(0, 40) + '...' : prompt}&quot;\n </div>\n )}\n <div className=\"text-[10px] text-[color:var(--ck-text-tertiary)]\">\n Provider: {provider}\n </div>\n </div>\n );\n }\n \n // Show handoff target\n if (n.type === 'handoff' && cfg) {\n const tgt = String(cfg.targetTeamId ?? \"\").trim();\n const tgtWf = String(cfg.targetWorkflowId ?? \"\").trim();\n const mode = String(cfg.mode ?? 'fire-and-forget');\n return tgt ? (\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-secondary)]\">\n → {tgt}{tgtWf ? ` / ${tgtWf}` : \"\"}\n {mode === 'wait-for-completion' ? <span className=\"ml-1 text-yellow-400\" title=\"Waits for target to complete\">⏳</span> : null}\n </div>\n ) : null;\n }\n\n // Show agent for other nodes\n const agentId = cfg ? String(cfg.agentId ?? \"\").trim() : \"\";\n if (!agentId) return null;\n const short = agentId.replace(`${teamId}-`, \"\");\n return <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-secondary)]\">Agent: {short}</div>;\n })()}\n </div>\n );\n })}\n\n {/* Inline in-canvas node inspector (requirement #6) */}\n {(() => {\n const wf = parsed.wf;\n if (!wf) return null;\n if (!selectedNodeId) return null;\n const node = wf.nodes.find((n) => n.id === selectedNodeId);\n if (!node) return null;\n\n const x = typeof node.x === \"number\" ? node.x : 80;\n const y = typeof node.y === \"number\" ? node.y : 80;\n const cfg = node.config && typeof node.config === \"object\" && !Array.isArray(node.config) ? (node.config as Record<string, unknown>) : {};\n const agentId = String(cfg.agentId ?? \"\").trim();\n const model = String(cfg.model ?? \"\").trim();\n\n return (\n <div\n className=\"absolute z-10 w-[320px] rounded-lg border border-white/15 bg-black/60 p-3 shadow-[var(--ck-shadow-1)] backdrop-blur\"\n style={{ left: x + 200, top: y }}\n >\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-primary)]\">{node.name || node.id}</div>\n <button\n type=\"button\"\n onClick={() => setSelectedNodeId(\"\")}\n className=\"text-[10px] text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n Close\n </button>\n </div>\n\n <div className=\"mt-2 space-y-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">name</div>\n <input\n value={String(node.name ?? \"\")}\n onChange={(e) => {\n const nextName = e.target.value;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, name: nextName } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"Optional\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">type</div>\n <select\n value={node.type}\n onChange={(e) => {\n const nextType = e.target.value as WorkflowFileV1[\"nodes\"][number][\"type\"];\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, type: nextType } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"start\">start</option>\n <option value=\"end\">end</option>\n <option value=\"llm\">llm</option>\n <option value=\"tool\">tool</option>\n <option value=\"condition\">condition</option>\n <option value=\"delay\">delay</option>\n <option value=\"human_approval\">human_approval</option>\n <option value=\"media-image\">media-image</option>\n <option value=\"media-video\">media-video</option>\n <option value=\"handoff\">handoff</option>\n </select>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">agentId</div>\n <input\n value={agentId}\n onChange={(e) => {\n const nextAgentId = String(e.target.value || \"\").trim();\n const nextCfg = { ...cfg, ...(nextAgentId ? { agentId: nextAgentId } : {}) };\n if (!nextAgentId) delete (nextCfg as Record<string, unknown>).agentId;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"(drag an agent onto the node or type)\"\n />\n </label>\n\n {node.type === \"llm\" ? (\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">model</div>\n <select\n value={model}\n onChange={(e) => {\n const nextModel = String(e.target.value || \"\").trim();\n const nextCfg = { ...cfg, ...(nextModel ? { model: nextModel } : {}) };\n if (!nextModel) delete (nextCfg as Record<string, unknown>).model;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">Default (inherit global)</option>\n {availableModels.map((m) => (\n <option key={m} value={m}>{m}</option>\n ))}\n </select>\n {availableModelsError ? (\n <div className=\"mt-1 text-[10px] text-amber-300\">Could not load model list: {availableModelsError}</div>\n ) : null}\n </label>\n ) : null}\n\n {node.type === \"human_approval\" ? (\n <div className=\"rounded-lg border border-white/10 bg-white/5 p-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">approval config</div>\n\n <div className=\"mt-2 space-y-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">provider</div>\n <input\n value={String((cfg as Record<string, unknown>).provider ?? \"\")}\n onChange={(e) => {\n const v = String(e.target.value || \"\").trim();\n const nextCfg = { ...cfg, ...(v ? { provider: v } : {}) };\n if (!v) delete (nextCfg as Record<string, unknown>).provider;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"telegram\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">target</div>\n <input\n value={String((cfg as Record<string, unknown>).target ?? \"\")}\n onChange={(e) => {\n const v = String(e.target.value || \"\").trim();\n const nextCfg = { ...cfg, ...(v ? { target: v } : {}) };\n if (!v) delete (nextCfg as Record<string, unknown>).target;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"(e.g. Telegram chat id)\"\n />\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">Overrides workflow-level default when set.</div>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">messageTemplate (optional)</div>\n <TemplateTextareaWithVars\n value={String((cfg as Record<string, unknown>).messageTemplate ?? \"\")}\n workflow={wf}\n currentNodeId={node.id}\n onChangeValue={(nextValue) => {\n const nextCfg = { ...cfg, ...(nextValue.trim() ? { messageTemplate: nextValue } : {}) };\n if (!nextValue.trim()) delete (nextCfg as Record<string, unknown>).messageTemplate;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 h-[70px] w-full resize-none rounded-lg border border-white/10 bg-white/5 p-2 pr-12 font-mono text-[10px] text-[color:var(--ck-text-primary)]\"\n placeholder=\"Approval needed for {{workflowName}} (run {{runId}})\"\n spellCheck={false}\n />\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">\n Vars: {\"{{workflowName}}\"}, {\"{{workflowId}}\"}, {\"{{runId}}\"}, {\"{{nodeId}}\"}\n </div>\n </label>\n </div>\n </div>\n ) : null}\n\n {isMediaNode(node.type) ? (\n <div className=\"rounded-lg border border-white/10 bg-white/5 p-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">Media Generation</div>\n <div className=\"mt-2\">\n <MediaGenerationConfigComponent\n config={{\n mediaType: 'image',\n provider: 'auto',\n prompt: '',\n ...((node.config as Record<string, unknown>) || {})\n } as MediaGenerationConfig}\n onChange={(newConfig) => {\n setWorkflow({ \n ...wf, \n nodes: wf.nodes.map((n) => \n n.id === node.id ? { ...n, config: newConfig as unknown as Record<string, unknown> } : n\n ) \n });\n }}\n teamId={teamId}\n workflow={wf}\n workflowNodeIds={wf.nodes.map((n) => n.id)}\n workflowEdges={(wf.edges ?? []).map((e) => ({ from: e.from, to: e.to }))}\n currentNodeId={node.id}\n />\n </div>\n </div>\n ) : null}\n\n {node.type === \"llm\" ? (\n <div className=\"space-y-2\">\n {/* LLM-specific fields */}\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">prompt</div>\n <TemplateTextareaWithVars\n value={String(cfg.promptTemplate ?? \"\")}\n workflow={wf}\n currentNodeId={node.id}\n onChangeValue={(nextValue) => {\n const nextCfg = { ...cfg, promptTemplate: nextValue };\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 min-h-[200px] w-full resize-y rounded-lg border border-white/10 bg-black/30 p-2 pr-12 font-mono text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"What should this node do? Use {{nodeId.output}} to reference upstream node outputs.\"\n spellCheck={false}\n />\n </label>\n\n {/* Output Fields */}\n <div>\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">output fields (optional)</div>\n <div className=\"text-[9px] text-[color:var(--ck-text-secondary)] mb-2\">Define the structure of what this node should produce</div>\n {(() => {\n const outputFields = (cfg.outputFields as Array<{name: string, type: \"text\"|\"list\"|\"json\"}>) || [];\n return (\n <div className=\"space-y-1\">\n {outputFields.map((field, index) => (\n <div key={index} className=\"flex items-center gap-2\">\n <input\n value={field.name}\n onChange={(e) => {\n const newOutputFields = [...outputFields];\n newOutputFields[index] = { ...field, name: e.target.value };\n const nextCfg = { ...cfg, outputFields: newOutputFields };\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"flex-1 rounded-lg border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"Field name\"\n />\n <select\n value={field.type}\n onChange={(e) => {\n const newType = e.target.value as \"text\"|\"list\"|\"json\";\n const newOutputFields = [...outputFields];\n newOutputFields[index] = { ...field, type: newType };\n const nextCfg = { ...cfg, outputFields: newOutputFields };\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"rounded-lg border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"text\">text</option>\n <option value=\"list\">list</option>\n <option value=\"json\">json</option>\n </select>\n <button\n type=\"button\"\n onClick={() => {\n const newOutputFields = outputFields.filter((_, i) => i !== index);\n const nextCfg = { ...cfg };\n if (newOutputFields.length > 0) {\n nextCfg.outputFields = newOutputFields;\n } else {\n delete (nextCfg as Record<string, unknown>).outputFields;\n }\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"text-xs text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n ×\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n onClick={() => {\n const newOutputFields = [...outputFields, { name: \"\", type: \"text\" as const }];\n const nextCfg = { ...cfg, outputFields: newOutputFields };\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"text-xs text-[color:var(--ck-text-secondary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n + Add field\n </button>\n </div>\n );\n })()}\n </div>\n\n {/* Timeout */}\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">timeout (seconds)</div>\n <input\n type=\"number\"\n value={cfg.timeoutMs ? String(Number(cfg.timeoutMs) / 1000) : \"\"}\n onChange={(e) => {\n const seconds = e.target.value ? Number(e.target.value) : null;\n const nextCfg = { ...cfg };\n if (seconds && seconds > 0) {\n nextCfg.timeoutMs = seconds * 1000;\n } else {\n delete (nextCfg as Record<string, unknown>).timeoutMs;\n }\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-24 rounded-lg border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"120\"\n min=\"1\"\n />\n </label>\n </div>\n ) : null}\n\n {/* Handoff config in canvas inspector */}\n {node.type === \"handoff\" ? (() => {\n const targetTeamIdInsp = String(cfg.targetTeamId ?? \"\");\n const targetWorkflowIdInsp = String(cfg.targetWorkflowId ?? \"\");\n const variableMappingInsp = (cfg.variableMapping || {}) as Record<string, string>;\n const handoffModeInsp = String(cfg.mode ?? 'fire-and-forget');\n const kitchenTeamIdInsp = String(variableMappingInsp.kitchenTeamId ?? '').includes('{{') ? teamId : String(variableMappingInsp.kitchenTeamId ?? teamId);\n const targetPlatformInsp = extractPlatformFromWorkflowId(targetWorkflowIdInsp);\n const accountsKeyInsp = kitchenTeamIdInsp && targetPlatformInsp ? accountsKey(kitchenTeamIdInsp, targetPlatformInsp) : '';\n const accountOptsInsp = accountsKeyInsp ? (handoffAccounts[accountsKeyInsp] || []) : [];\n const accountsLoadingInsp = accountsKeyInsp ? !!handoffAccountsLoading[accountsKeyInsp] : false;\n const currentIdsInsp = String(variableMappingInsp.integrationIds ?? variableMappingInsp.integrationId ?? '').split(',').map((s: string) => s.trim()).filter(Boolean);\n const targetWfsInsp = handoffWorkflows[targetTeamIdInsp] || [];\n const showPickerInsp = !!targetPlatformInsp;\n\n const updateCfgInsp = (patch: Record<string, unknown>) => {\n const nextCfg = { ...cfg, ...patch };\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n };\n\n // Auto-load data\n if (handoffTeams.length === 0 && !handoffTeamsLoading) {\n (async () => { try { const r = await fetch('/api/teams/list'); const j = await r.json(); if (j.ok) setHandoffTeams(j.teamIds); } catch {} })();\n }\n if (targetTeamIdInsp && !handoffWorkflows[targetTeamIdInsp]) {\n (async () => { try { const r = await fetch(`/api/teams/workflows?teamId=${encodeURIComponent(targetTeamIdInsp)}`); const j = await r.json(); if (j.ok && j.files) setHandoffWorkflows(prev => ({ ...prev, [targetTeamIdInsp]: j.files.map((f: string) => ({ id: f.replace(/\\.workflow\\.json$/, '') })) })); } catch {} })();\n }\n if (showPickerInsp && kitchenTeamIdInsp && targetPlatformInsp && !handoffAccounts[accountsKeyInsp] && !handoffAccountsLoading[accountsKeyInsp]) {\n (async () => {\n setHandoffAccountsLoading(prev => ({ ...prev, [accountsKeyInsp]: true }));\n try {\n const pk = (() => {\n try {\n return JSON.parse(localStorage.getItem(`ck-postiz-${kitchenTeamIdInsp}`) || '{}').apiKey || '';\n } catch {\n return '';\n }\n })();\n const r = await fetch(\n `/api/plugins/marketing/integrations?team=${encodeURIComponent(kitchenTeamIdInsp)}&teamId=${encodeURIComponent(kitchenTeamIdInsp)}`,\n { headers: pk ? { 'x-postiz-api-key': pk } : {} }\n );\n const j = await r.json();\n const target = canonicalPlatform(targetPlatformInsp);\n const filtered = (j.integrations || [])\n .filter((i: Record<string, unknown>) => canonicalPlatform(String(i.identifier || '')) === target && !i.disabled && i.id)\n .map((i: Record<string, unknown>) => ({\n integrationId: String(i.id),\n identifier: String(i.identifier || ''),\n displayName: String(i.name || targetPlatformInsp),\n username: i.username ? String(i.username) : undefined,\n }));\n setHandoffAccounts(prev => ({ ...prev, [accountsKeyInsp]: filtered }));\n } catch {}\n setHandoffAccountsLoading(prev => ({ ...prev, [accountsKeyInsp]: false }));\n })();\n }\n\n return (\n <div className=\"rounded-lg border border-white/10 bg-white/5 p-2 space-y-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">handoff config</div>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">mode</div>\n <select value={handoffModeInsp} onChange={(e) => updateCfgInsp({ mode: e.target.value === 'fire-and-forget' ? undefined : e.target.value })} className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\">\n <option value=\"fire-and-forget\">Fire &amp; Forget</option>\n <option value=\"wait-for-completion\">Wait for Completion</option>\n </select>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">target team</div>\n <select value={targetTeamIdInsp} onChange={(e) => { updateCfgInsp({ targetTeamId: e.target.value || undefined, targetWorkflowId: undefined }); }} className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\">\n <option value=\"\">— Select —</option>\n {handoffTeams.map((t) => <option key={t} value={t}>{t}{t === teamId ? ' (current)' : ''}</option>)}\n </select>\n </label>\n\n {targetTeamIdInsp ? (\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">target workflow</div>\n <select value={targetWorkflowIdInsp} onChange={(e) => updateCfgInsp({ targetWorkflowId: e.target.value || undefined })} className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\">\n <option value=\"\">— Select —</option>\n {targetWfsInsp.map((w) => <option key={w.id} value={w.id}>{w.name || w.id}</option>)}\n </select>\n </label>\n ) : null}\n\n {showPickerInsp && targetPlatformInsp && accountOptsInsp.length > 0 ? (\n <div>\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">{targetPlatformInsp} accounts</div>\n <div className=\"mt-1 space-y-1\">\n {accountOptsInsp.map((opt) => {\n const checked = currentIdsInsp.includes(opt.integrationId);\n const variantSuffix = opt.identifier && opt.identifier !== targetPlatformInsp ? ` (${opt.identifier})` : '';\n return (\n <label key={opt.integrationId} className=\"flex items-center gap-2 cursor-pointer rounded-lg border border-white/10 bg-white/5 px-2 py-1 hover:bg-white/10\">\n <input type=\"checkbox\" checked={checked} onChange={() => {\n const next = checked ? currentIdsInsp.filter((id: string) => id !== opt.integrationId) : [...currentIdsInsp, opt.integrationId];\n const nextVm = { ...variableMappingInsp }; delete nextVm.integrationId;\n if (next.length > 0) nextVm.integrationIds = next.join(','); else delete nextVm.integrationIds;\n updateCfgInsp({ variableMapping: nextVm });\n }} className=\"accent-[var(--ck-accent-red)]\" />\n <div><div className=\"text-xs text-[color:var(--ck-text-primary)]\">{opt.displayName}{variantSuffix}</div>{opt.username ? <div className=\"text-[10px] text-[color:var(--ck-text-tertiary)]\">{opt.username}</div> : null}</div>\n </label>\n );\n })}\n </div>\n </div>\n ) : null}\n {showPickerInsp && accountsLoadingInsp ? <div className=\"text-[10px] text-[color:var(--ck-text-tertiary)]\">Loading accounts…</div> : null}\n </div>\n );\n })() : null}\n\n {/* Collapsible raw config section */}\n <div>\n <button\n type=\"button\"\n onClick={() => {\n const currentState = showRawConfig[node.id] ?? (node.type !== \"llm\");\n setShowRawConfig({ ...showRawConfig, [node.id]: !currentState });\n }}\n className=\"mb-2 text-[10px] text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n {(showRawConfig[node.id] ?? (node.type !== \"llm\")) ? \"Hide\" : \"Show\"} raw config\n </button>\n {(showRawConfig[node.id] ?? (node.type !== \"llm\")) ? (\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">config (json)</div>\n <textarea\n value={JSON.stringify(cfg, null, 2)}\n onChange={(e) => {\n try {\n const nextCfg = JSON.parse(e.target.value) as Record<string, unknown>;\n if (!nextCfg || typeof nextCfg !== \"object\" || Array.isArray(nextCfg)) return;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n } catch {\n // ignore invalid JSON while typing\n }\n }}\n className=\"mt-1 h-[140px] w-full resize-none rounded-lg border border-white/10 bg-black/30 p-2 font-mono text-[10px] text-[color:var(--ck-text-primary)]\"\n spellCheck={false}\n />\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">(Edits apply when JSON is valid.)</div>\n </label>\n ) : null}\n </div>\n </div>\n </div>\n );\n })()}\n </div>\n </div>\n </div>\n )}\n\n <div className=\"w-[380px] shrink-0 overflow-auto p-3 text-sm\">\n <div className=\"space-y-3\">\n {parsed.wf ? (\n (() => {\n const wf = parsed.wf;\n const tz = String(wf.timezone ?? \"\").trim() || \"UTC\";\n const triggers = wf.triggers ?? [];\n\n const meta = wf.meta && typeof wf.meta === \"object\" && !Array.isArray(wf.meta) ? (wf.meta as Record<string, unknown>) : {};\n const approvalBindingId = String(meta.approvalBindingId ?? \"\").trim();\n const approvalProvider = String(meta.approvalProvider ?? \"telegram\").trim() || \"telegram\";\n const approvalTarget = String(meta.approvalTarget ?? \"\").trim();\n\n // Cron schedule suggestions.\n // Note: dev-team automation defaults should avoid the 02:00-07:00 America/New_York blackout window.\n // We keep presets in \"safe\" hours by default.\n const presets = [\n { label: \"(no preset)\", expr: \"\" },\n { label: \"Weekdays 09:00 local\", expr: \"0 9 * * 1-5\" },\n { label: \"Mon/Wed/Fri 09:00 local\", expr: \"0 9 * * 1,3,5\" },\n { label: \"Daily 08:00 local\", expr: \"0 8 * * *\" },\n { label: \"Daily 12:00 local\", expr: \"0 12 * * *\" },\n { label: \"Mon 09:30 local\", expr: \"30 9 * * 1\" },\n ];\n\n return (\n <div className=\"space-y-3\">\n <details open className=\"rounded-lg border border-white/10 bg-white/5\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Workflow</summary>\n <div className=\"px-3 pb-3\">\n <label className=\"block\">\n <div className=\"text-[11px] font-medium text-[color:var(--ck-text-tertiary)]\">Timezone</div>\n <input\n value={tz}\n onChange={(e) => {\n const nextTz = String(e.target.value || \"\").trim() || \"UTC\";\n setWorkflow({ ...wf, timezone: nextTz });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"America/New_York\"\n />\n </label>\n </div>\n </details>\n\n <details open className=\"rounded-lg border border-white/10 bg-white/5\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Approval Channel</summary>\n <div className=\"px-3 pb-3 space-y-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">binding (recommended)</div>\n <select\n value={approvalBindingId}\n onChange={(e) => {\n const nextId = String(e.target.value || \"\").trim();\n const selected = approvalBindings.find((b) => b.id === nextId);\n\n // Store a stable-ish reference id in the workflow so it's portable.\n // We also keep provider/target in sync for backward compatibility.\n if (selected) {\n setWorkflow({\n ...wf,\n meta: {\n ...meta,\n approvalBindingId: selected.id,\n approvalProvider: selected.channel,\n approvalTarget: selected.target,\n },\n nodes: wf.nodes.map((n) =>\n n.type === \"human_approval\"\n ? {\n ...n,\n config: {\n ...((n.config && typeof n.config === \"object\" && !Array.isArray(n.config)\n ? n.config\n : {}) as Record<string, unknown>),\n approvalBindingId: selected.id,\n provider: selected.channel,\n target: selected.target,\n },\n }\n : n\n ),\n });\n } else {\n setWorkflow({\n ...wf,\n meta: { ...meta, approvalBindingId: \"\" },\n nodes: wf.nodes.map((n) =>\n n.type === \"human_approval\"\n ? {\n ...n,\n config: {\n ...((n.config && typeof n.config === \"object\" && !Array.isArray(n.config)\n ? n.config\n : {}) as Record<string, unknown>),\n approvalBindingId: \"\",\n },\n }\n : n\n ),\n });\n }\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">(manual)</option>\n {approvalBindings.map((b) => (\n <option key={b.id} value={b.id}>\n {b.label}\n </option>\n ))}\n </select>\n {approvalBindingsNeedsKitchenUpdate ? (\n <div className=\"mt-1 text-[10px] text-yellow-200\">\n Kitchen looks out of date. Run <code className=\"font-mono\">openclaw plugins update</code> then\n <code className=\"ml-1 font-mono\">openclaw gateway restart</code>.\n </div>\n ) : null}\n {approvalBindingsError ? (\n <div className=\"mt-1 text-[10px] text-red-200\">Failed to load bindings: {approvalBindingsError}</div>\n ) : null}\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">\n Uses your existing OpenClaw bindings (recommended). Manual provider/target is an advanced override.\n </div>\n </label>\n\n <details className=\"rounded-lg border border-white/10 bg-black/10\">\n <summary className=\"cursor-pointer list-none px-2 py-1 text-[11px] font-medium text-[color:var(--ck-text-secondary)]\">Advanced: manual override</summary>\n <div className=\"px-2 pb-2 pt-1 space-y-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">provider</div>\n <input\n value={approvalProvider}\n onChange={(e) => {\n const nextProvider = String(e.target.value || \"\").trim() || \"telegram\";\n setWorkflow({\n ...wf,\n meta: { ...meta, approvalBindingId: \"\", approvalProvider: nextProvider },\n nodes: wf.nodes.map((n) =>\n n.type === \"human_approval\"\n ? {\n ...n,\n config: {\n ...((n.config && typeof n.config === \"object\" && !Array.isArray(n.config)\n ? n.config\n : {}) as Record<string, unknown>),\n approvalBindingId: \"\",\n provider: nextProvider,\n },\n }\n : n\n ),\n });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"telegram\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">target</div>\n <input\n value={approvalTarget}\n onChange={(e) => {\n const nextTarget = String(e.target.value || \"\").trim();\n setWorkflow({\n ...wf,\n meta: { ...meta, approvalBindingId: \"\", approvalTarget: nextTarget },\n nodes: wf.nodes.map((n) =>\n n.type === \"human_approval\"\n ? {\n ...n,\n config: {\n ...((n.config && typeof n.config === \"object\" && !Array.isArray(n.config)\n ? n.config\n : {}) as Record<string, unknown>),\n approvalBindingId: \"\",\n target: nextTarget,\n },\n }\n : n\n ),\n });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"(e.g. Telegram chat id)\"\n />\n </label>\n </div>\n </details>\n </div>\n </details>\n\n <details open className=\"rounded-lg border border-white/10 bg-white/5\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Node inspector</summary>\n <div className=\"px-3 pb-3\">\n <div className=\"flex items-center justify-between gap-2\">\n {selectedNodeId ? (\n <button\n type=\"button\"\n onClick={() => {\n const nodeId = selectedNodeId;\n const nextNodes = wf.nodes.filter((n) => n.id !== nodeId);\n const nextEdges = (wf.edges ?? []).filter((e) => e.from !== nodeId && e.to !== nodeId);\n setWorkflow({ ...wf, nodes: nextNodes, edges: nextEdges });\n setSelectedNodeId(\"\");\n }}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-[10px] font-medium text-red-100 hover:bg-white/10\"\n >\n Delete node\n </button>\n ) : null}\n </div>\n\n {selectedNodeId ? (\n (() => {\n const node = wf.nodes.find((n) => n.id === selectedNodeId);\n if (!node) return <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">No node selected.</div>;\n\n return (\n <div className=\"mt-3 space-y-3\">\n <div>\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">id</div>\n <div className=\"mt-1 rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\">\n {node.id}\n </div>\n </div>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">name</div>\n <input\n value={String(node.name ?? \"\")}\n onChange={(e) => {\n const nextName = e.target.value;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, name: nextName } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"Optional\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">type</div>\n <select\n value={node.type}\n onChange={(e) => {\n const nextType = e.target.value as WorkflowFileV1[\"nodes\"][number][\"type\"];\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, type: nextType } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"start\">start</option>\n <option value=\"end\">end</option>\n <option value=\"llm\">llm</option>\n <option value=\"tool\">tool</option>\n <option value=\"condition\">condition</option>\n <option value=\"delay\">delay</option>\n <option value=\"human_approval\">human_approval</option>\n <option value=\"media-image\">media-image</option>\n <option value=\"media-video\">media-video</option>\n <option value=\"handoff\">handoff</option>\n </select>\n </label>\n\n <div className=\"grid grid-cols-2 gap-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">x</div>\n <input\n type=\"number\"\n value={typeof node.x === \"number\" ? node.x : 0}\n onChange={(e) => {\n const nextX = Number(e.target.value);\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, x: nextX } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n />\n </label>\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">y</div>\n <input\n type=\"number\"\n value={typeof node.y === \"number\" ? node.y : 0}\n onChange={(e) => {\n const nextY = Number(e.target.value);\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, y: nextY } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n />\n </label>\n </div>\n\n {/* LLM Configuration */}\n {node.type === \"llm\" ? (\n <div className=\"space-y-3\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">prompt</div>\n <TemplateTextareaWithVars\n value={String(((node.config as Record<string, unknown>) || {}).promptTemplate ?? \"\")}\n workflow={wf}\n currentNodeId={node.id}\n onChangeValue={(nextValue) => {\n const nextCfg = { ...(node.config as Record<string, unknown>), promptTemplate: nextValue };\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 min-h-[150px] w-full resize-y rounded-lg border border-white/10 bg-white/5 p-2 pr-12 font-mono text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"What should this node do? Use {{nodeId.output}} to reference upstream node outputs.\"\n spellCheck={false}\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">model</div>\n <select\n value={String(((node.config as Record<string, unknown>) || {}).model ?? \"\")}\n onChange={(e) => {\n const nextModel = String(e.target.value || \"\").trim();\n const nextCfg = { ...(node.config as Record<string, unknown>), ...(nextModel ? { model: nextModel } : {}) };\n if (!nextModel) delete nextCfg.model;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">Default (inherit global)</option>\n {availableModels.map((m) => (\n <option key={m} value={m}>{m}</option>\n ))}\n </select>\n {availableModelsError ? (\n <div className=\"mt-1 text-[10px] text-amber-300\">Could not load model list: {availableModelsError}</div>\n ) : null}\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">timeout (seconds)</div>\n <input\n type=\"number\"\n value={((node.config as Record<string, unknown>) || {}).timeoutMs ? String(Number(((node.config as Record<string, unknown>) || {}).timeoutMs) / 1000) : \"\"}\n onChange={(e) => {\n const seconds = e.target.value ? Number(e.target.value) : null;\n const nextCfg = { ...(node.config as Record<string, unknown>) };\n if (seconds && seconds > 0) {\n nextCfg.timeoutMs = seconds * 1000;\n } else {\n delete nextCfg.timeoutMs;\n }\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-24 rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"120\"\n min=\"1\"\n />\n </label>\n </div>\n ) : null}\n\n {/* Media Generation Configuration */}\n {isMediaNode(node.type) ? (\n <div>\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">Media Generation</div>\n <div className=\"mt-1\">\n <MediaGenerationConfigComponent\n config={{\n mediaType: 'image',\n provider: 'auto',\n prompt: '',\n ...((node.config as Record<string, unknown>) || {})\n } as MediaGenerationConfig}\n onChange={(newConfig) => {\n setWorkflow({ \n ...wf, \n nodes: wf.nodes.map((n) => \n n.id === node.id ? { ...n, config: newConfig as unknown as Record<string, unknown> } : n\n ) \n });\n }}\n teamId={teamId}\n workflow={wf}\n workflowNodeIds={wf.nodes.map((n) => n.id)}\n workflowEdges={(wf.edges ?? []).map((e) => ({ from: e.from, to: e.to }))}\n currentNodeId={node.id}\n />\n </div>\n </div>\n ) : null}\n\n {/* Human Approval Configuration */}\n {node.type === \"human_approval\" ? (\n <div className=\"space-y-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">provider</div>\n <input\n value={String(((node.config as Record<string, unknown>) || {}).provider ?? \"\")}\n onChange={(e) => {\n const v = String(e.target.value || \"\").trim();\n const nextCfg = { ...(node.config as Record<string, unknown>), ...(v ? { provider: v } : {}) };\n if (!v) delete nextCfg.provider;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"telegram\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">target</div>\n <input\n value={String(((node.config as Record<string, unknown>) || {}).target ?? \"\")}\n onChange={(e) => {\n const v = String(e.target.value || \"\").trim();\n const nextCfg = { ...(node.config as Record<string, unknown>), ...(v ? { target: v } : {}) };\n if (!v) delete nextCfg.target;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"(e.g. Telegram chat id)\"\n />\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">Overrides workflow-level default when set.</div>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">messageTemplate (optional)</div>\n <TemplateTextareaWithVars\n value={String(((node.config as Record<string, unknown>) || {}).messageTemplate ?? \"\")}\n workflow={wf}\n currentNodeId={node.id}\n onChangeValue={(nextValue) => {\n const nextCfg = { ...(node.config as Record<string, unknown>), ...(nextValue.trim() ? { messageTemplate: nextValue } : {}) };\n if (!nextValue.trim()) delete nextCfg.messageTemplate;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 h-[70px] w-full resize-none rounded-lg border border-white/10 bg-white/5 p-2 pr-12 font-mono text-[10px] text-[color:var(--ck-text-primary)]\"\n placeholder=\"Approval needed for {{workflowName}} (run {{runId}})\"\n spellCheck={false}\n />\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">\n Vars: {\"{{workflowName}}\"}, {\"{{workflowId}}\"}, {\"{{runId}}\"}, {\"{{nodeId}}\"}\n </div>\n </label>\n </div>\n ) : null}\n\n {/* Handoff Configuration */}\n {node.type === \"handoff\" ? (() => {\n const cfg = (node.config || {}) as Record<string, unknown>;\n const targetTeamId = String(cfg.targetTeamId ?? \"\");\n const targetWorkflowId = String(cfg.targetWorkflowId ?? \"\");\n const variableMapping = (cfg.variableMapping || {}) as Record<string, string>;\n\n const loadTeams = async () => {\n if (handoffTeams.length > 0 || handoffTeamsLoading) return;\n setHandoffTeamsLoading(true);\n try {\n const res = await fetch(\"/api/teams/list\");\n const json = await res.json();\n if (json.ok && Array.isArray(json.teamIds)) {\n setHandoffTeams(json.teamIds);\n }\n } catch { /* ignore */ }\n setHandoffTeamsLoading(false);\n };\n\n const loadWorkflows = async (tid: string) => {\n if (!tid || handoffWorkflows[tid]) return;\n try {\n const res = await fetch(`/api/teams/workflows?teamId=${encodeURIComponent(tid)}`);\n const json = await res.json();\n if (json.ok && Array.isArray(json.files)) {\n // files are like [\"my-workflow.workflow.json\"] — strip suffix to get id\n const wfs = json.files.map((f: string) => ({\n id: f.replace(/\\.workflow\\.json$/, \"\"),\n }));\n setHandoffWorkflows((prev) => ({ ...prev, [tid]: wfs }));\n }\n } catch { /* ignore */ }\n };\n\n const loadAccountsForPlatform = async (tid: string, platform: string) => {\n const key = accountsKey(tid, platform);\n if (!tid || !platform || handoffAccounts[key] || handoffAccountsLoading[key]) return;\n setHandoffAccountsLoading((prev) => ({ ...prev, [key]: true }));\n try {\n const postizKey = (() => {\n try {\n const s = localStorage.getItem(`ck-postiz-${tid}`);\n return s ? JSON.parse(s).apiKey || '' : '';\n } catch {\n return '';\n }\n })();\n // Use /integrations (raw Postiz identifier per account) so we can\n // group variants (instagram / instagram-standalone) under the same platform.\n const res = await fetch(\n `/api/plugins/marketing/integrations?team=${encodeURIComponent(tid)}&teamId=${encodeURIComponent(tid)}`,\n {\n headers: postizKey ? { 'x-postiz-api-key': postizKey } : {},\n }\n );\n const json = await res.json();\n const integrations = Array.isArray(json?.integrations) ? json.integrations : [];\n const target = canonicalPlatform(platform);\n const filtered = integrations\n .filter((i: Record<string, unknown>) => canonicalPlatform(String(i?.identifier || '')) === target && !i?.disabled && i?.id)\n .map((i: Record<string, unknown>) => ({\n integrationId: String(i.id),\n identifier: String(i.identifier || ''),\n displayName: String(i.name || platform),\n username: i.username ? String(i.username) : undefined,\n }));\n setHandoffAccounts((prev) => ({ ...prev, [key]: filtered }));\n } catch { /* ignore */ }\n setHandoffAccountsLoading((prev) => ({ ...prev, [key]: false }));\n };\n\n // Resolve kitchenTeamId from variable mapping (if literal)\n const kitchenTeamIdRaw = String(variableMapping.kitchenTeamId ?? '');\n const kitchenTeamId = kitchenTeamIdRaw && !kitchenTeamIdRaw.includes('{{') ? kitchenTeamIdRaw : teamId;\n\n // Trigger data loading\n if (handoffTeams.length === 0 && !handoffTeamsLoading) {\n loadTeams();\n }\n if (targetTeamId && !handoffWorkflows[targetTeamId]) {\n loadWorkflows(targetTeamId);\n }\n // Derive target platform from the target workflow's name. Picker only\n // shows when the target is a known per-platform post workflow\n // (social-post-to-<platform>-vN); otherwise the handoff is generic\n // and no per-platform account selection applies here.\n const targetPlatform = extractPlatformFromWorkflowId(targetWorkflowId);\n const showPicker = !!targetPlatform;\n if (showPicker && kitchenTeamId) {\n loadAccountsForPlatform(kitchenTeamId, targetPlatform);\n }\n\n const targetWfs = handoffWorkflows[targetTeamId] || [];\n const mappingEntries = Object.entries(variableMapping);\n const accountsKeyForTeam = kitchenTeamId && targetPlatform ? accountsKey(kitchenTeamId, targetPlatform) : '';\n const accountOptions = accountsKeyForTeam ? (handoffAccounts[accountsKeyForTeam] || []) : [];\n const accountsLoading = accountsKeyForTeam ? !!handoffAccountsLoading[accountsKeyForTeam] : false;\n\n // Current selection: integrationId (single) or integrationIds (multi, comma-separated)\n const currentIds = String(variableMapping.integrationIds ?? variableMapping.integrationId ?? '').split(',').map((s: string) => s.trim()).filter(Boolean);\n\n const updateCfg = (patch: Record<string, unknown>) => {\n const nextCfg = { ...cfg, ...patch };\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n };\n\n const handoffMode = String(cfg.mode ?? 'fire-and-forget');\n const waitTimeoutMs = typeof cfg.waitTimeoutMs === 'number' ? cfg.waitTimeoutMs as number : 300000;\n\n return (\n <div className=\"space-y-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">Handoff Target</div>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">mode</div>\n <select\n value={handoffMode}\n onChange={(e) => {\n const m = e.target.value;\n updateCfg({ mode: m === 'fire-and-forget' ? undefined : m });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"fire-and-forget\">Fire &amp; Forget</option>\n <option value=\"wait-for-completion\">Wait for Completion</option>\n </select>\n </label>\n\n {handoffMode === 'wait-for-completion' ? (\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">wait timeout (seconds)</div>\n <input\n type=\"number\"\n min={30}\n value={Math.round(waitTimeoutMs / 1000)}\n onChange={(e) => {\n const secs = Math.max(30, parseInt(e.target.value, 10) || 300);\n updateCfg({ waitTimeoutMs: secs * 1000 });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n />\n <div className=\"mt-0.5 text-[9px] text-[color:var(--ck-text-tertiary)]\">\n Workflow will wait up to this long for the target to complete.\n </div>\n </label>\n ) : null}\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">target team</div>\n <select\n value={targetTeamId}\n onChange={(e) => {\n const tid = e.target.value;\n updateCfg({ targetTeamId: tid || undefined, targetWorkflowId: undefined });\n if (tid && !handoffWorkflows[tid]) loadWorkflows(tid);\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">— Select team —</option>\n {handoffTeams.map((t) => (\n <option key={t} value={t}>{t}{t === teamId ? \" (current)\" : \"\"}</option>\n ))}\n </select>\n </label>\n\n {targetTeamId ? (\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">target workflow</div>\n <select\n value={targetWorkflowId}\n onChange={(e) => updateCfg({ targetWorkflowId: e.target.value || undefined })}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">— Select workflow —</option>\n {targetWfs.map((w) => (\n <option key={w.id} value={w.id}>{w.name || w.id}</option>\n ))}\n </select>\n {targetTeamId && !handoffWorkflows[targetTeamId] ? (\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">Loading workflows…</div>\n ) : null}\n </label>\n ) : null}\n\n {showPicker && targetPlatform ? (\n <div>\n <div className=\"flex items-center justify-between\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">{targetPlatform} accounts</div>\n <button\n type=\"button\"\n onClick={() => {\n const key = accountsKey(kitchenTeamId, targetPlatform);\n setHandoffAccounts((prev) => { const next = { ...prev }; delete next[key]; return next; });\n loadAccountsForPlatform(kitchenTeamId, targetPlatform);\n }}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-0.5 text-[10px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Refresh\n </button>\n </div>\n {accountsLoading ? (\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">Loading accounts…</div>\n ) : accountOptions.length === 0 ? (\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">\n No {targetPlatform} accounts found. Open Marketing → Accounts and connect {targetPlatform} in Postiz.\n </div>\n ) : (\n <div className=\"mt-1 space-y-1\">\n {accountOptions.map((opt) => {\n const checked = currentIds.includes(opt.integrationId);\n const variantSuffix = opt.identifier && opt.identifier !== targetPlatform ? ` (${opt.identifier})` : '';\n return (\n <label key={opt.integrationId} className=\"flex items-center gap-2 cursor-pointer rounded-lg border border-white/10 bg-white/5 px-2 py-1 hover:bg-white/10\">\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={() => {\n const next = checked\n ? currentIds.filter((id: string) => id !== opt.integrationId)\n : [...currentIds, opt.integrationId];\n const nextVm = { ...variableMapping };\n // Use integrationIds (plural) for multi-select\n delete nextVm.integrationId;\n if (next.length > 0) {\n nextVm.integrationIds = next.join(',');\n } else {\n delete nextVm.integrationIds;\n }\n updateCfg({ variableMapping: nextVm });\n }}\n className=\"accent-[var(--ck-accent-red)]\"\n />\n <div>\n <div className=\"text-xs text-[color:var(--ck-text-primary)]\">{opt.displayName}{variantSuffix}</div>\n {opt.username ? <div className=\"text-[10px] text-[color:var(--ck-text-tertiary)]\">{opt.username}</div> : null}\n </div>\n </label>\n );\n })}\n <div className=\"text-[9px] text-[color:var(--ck-text-tertiary)]\">\n {currentIds.length === 0 ? 'None selected — will use first connected account.' : `${currentIds.length} account${currentIds.length > 1 ? 's' : ''} selected.`}\n </div>\n </div>\n )}\n </div>\n ) : null}\n\n <div>\n <div className=\"flex items-center justify-between\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">variable mapping</div>\n <button\n type=\"button\"\n onClick={() => {\n const key = `var_${Date.now()}`;\n updateCfg({ variableMapping: { ...variableMapping, [key]: \"\" } });\n }}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-0.5 text-[10px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n + Add\n </button>\n </div>\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">\n Map target workflow trigger inputs to upstream node outputs. Key = target variable name, Value = {\"{{nodeId.field}}\"} template.\n </div>\n {mappingEntries.length > 0 ? (\n <div className=\"mt-2 space-y-1\">\n {mappingEntries.map(([key, value], idx) => (\n <div key={idx} className=\"flex items-center gap-1\">\n <input\n value={key}\n onChange={(e) => {\n const newKey = e.target.value;\n const newMapping = { ...variableMapping };\n delete newMapping[key];\n newMapping[newKey] = value;\n updateCfg({ variableMapping: newMapping });\n }}\n className=\"w-1/3 rounded-lg border border-white/10 bg-white/5 px-1.5 py-0.5 text-[10px] text-[color:var(--ck-text-primary)]\"\n placeholder=\"target_var\"\n />\n <span className=\"text-[10px] text-[color:var(--ck-text-tertiary)]\">→</span>\n <input\n value={value}\n onChange={(e) => {\n const newMapping = { ...variableMapping, [key]: e.target.value };\n updateCfg({ variableMapping: newMapping });\n }}\n className=\"flex-1 rounded-lg border border-white/10 bg-white/5 px-1.5 py-0.5 text-[10px] text-[color:var(--ck-text-primary)]\"\n placeholder=\"{{nodeId.output}}\"\n />\n <button\n type=\"button\"\n onClick={() => {\n const newMapping = { ...variableMapping };\n delete newMapping[key];\n updateCfg({ variableMapping: Object.keys(newMapping).length > 0 ? newMapping : undefined });\n }}\n className=\"text-[10px] text-red-400 hover:text-red-300\"\n title=\"Remove mapping\"\n >\n ✕\n </button>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)] italic\">No mappings — target workflow will receive empty trigger input.</div>\n )}\n </div>\n </div>\n );\n })() : null}\n\n {/* Output Fields for ALL node types */}\n <div>\n <OutputFieldsEditor\n outputFields={(((node.config as Record<string, unknown>) || {}).outputFields as OutputField[]) || []}\n onChange={(newOutputFields) => {\n const nextCfg = { ...(node.config as Record<string, unknown>) };\n if (newOutputFields.length > 0) {\n nextCfg.outputFields = newOutputFields;\n } else {\n delete nextCfg.outputFields;\n }\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n />\n </div>\n\n {/* Raw config section for debugging */}\n <details className=\"rounded-lg border border-white/10 bg-black/10\">\n <summary className=\"cursor-pointer list-none px-2 py-1 text-[10px] font-medium text-[color:var(--ck-text-secondary)]\">Raw Config (debug)</summary>\n <div className=\"p-2\">\n <pre className=\"mt-1 max-h-[150px] overflow-auto rounded-lg border border-white/10 bg-white/5 p-2 text-[9px] text-[color:var(--ck-text-tertiary)]\">\n {JSON.stringify(node.config ?? {}, null, 2)}\n </pre>\n </div>\n </details>\n </div>\n );\n })()\n ) : (\n <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">Select a node.</div>\n )}\n </div>\n </details>\n\n <details open className=\"rounded-lg border border-white/10 bg-white/5\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Triggers</summary>\n <div className=\"px-3 pb-3\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">triggers</div>\n <button\n type=\"button\"\n onClick={() => {\n const id = `t${Date.now()}`;\n setWorkflow({\n ...wf,\n triggers: [\n ...triggers,\n { kind: \"cron\", id, name: \"New trigger\", enabled: true, expr: \"0 9 * * 1-5\", tz },\n ],\n });\n }}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-[10px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n + Add\n </button>\n </div>\n\n {/* Trigger sync status */}\n {triggerSyncStatus !== \"idle\" && (\n <div className=\"mt-2 flex items-center gap-2 rounded-lg border border-white/10 bg-white/5 px-2 py-1\">\n {triggerSyncStatus === \"syncing\" && (\n <>\n <div className=\"h-3 w-3 animate-spin rounded-full border border-blue-400 border-t-transparent\"></div>\n <div className=\"text-xs text-blue-400\">Syncing triggers...</div>\n </>\n )}\n {triggerSyncStatus === \"success\" && (\n <>\n <div className=\"text-green-400\">✓</div>\n <div className=\"text-xs text-green-400\">Triggers synced</div>\n </>\n )}\n {triggerSyncStatus === \"error\" && (\n <>\n <div className=\"text-red-400\">✗</div>\n <div className=\"text-xs text-red-400\">Trigger sync failed: {triggerSyncError}</div>\n </>\n )}\n </div>\n )}\n\n <div className=\"mt-2 space-y-2\">\n {triggers.length ? (\n triggers.map((t, i) => {\n const kind = (t as { kind?: unknown }).kind;\n const isCron = kind === \"cron\";\n const id = String((t as { id?: unknown }).id ?? \"\");\n const name = String((t as { name?: unknown }).name ?? \"\");\n const enabled = Boolean((t as { enabled?: unknown }).enabled);\n const expr = String((t as { expr?: unknown }).expr ?? \"\");\n const trigTz = String((t as { tz?: unknown }).tz ?? tz);\n const cronFields = expr.trim().split(/\\s+/).filter(Boolean);\n const cronLooksValid = !expr.trim() || cronFields.length === 5;\n\n return (\n <div key={`${id}-${i}`} className=\"rounded-lg border border-white/10 bg-white/5 p-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-xs text-[color:var(--ck-text-primary)]\">{name || id || `trigger-${i + 1}`}</div>\n <button\n type=\"button\"\n onClick={() => setWorkflow({ ...wf, triggers: triggers.filter((_, idx) => idx !== i) })}\n className=\"text-[10px] text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n Remove\n </button>\n </div>\n\n {!isCron ? (\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">Unsupported trigger kind: {String(kind)}</div>\n ) : null}\n\n <div className=\"mt-2 grid grid-cols-1 gap-2\">\n <label className=\"flex items-center gap-2 text-xs text-[color:var(--ck-text-secondary)]\">\n <input\n type=\"checkbox\"\n checked={enabled}\n onChange={(e) => {\n const nextEnabled = e.target.checked;\n setWorkflow({\n ...wf,\n triggers: triggers.map((x, idx) => (idx === i && x.kind === \"cron\" ? { ...x, enabled: nextEnabled } : x)),\n });\n }}\n />\n Enabled\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">name</div>\n <input\n value={name}\n onChange={(e) => {\n const nextName = e.target.value;\n setWorkflow({\n ...wf,\n triggers: triggers.map((x, idx) => (idx === i && x.kind === \"cron\" ? { ...x, name: nextName } : x)),\n });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"Content cadence\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">schedule (cron)</div>\n <input\n value={expr}\n onChange={(e) => {\n const nextExpr = e.target.value;\n setWorkflow({\n ...wf,\n triggers: triggers.map((x, idx) => (idx === i && x.kind === \"cron\" ? { ...x, expr: nextExpr } : x)),\n });\n }}\n className={\n cronLooksValid\n ? \"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 font-mono text-[11px] text-[color:var(--ck-text-primary)]\"\n : \"mt-1 w-full rounded-lg border border-red-400/50 bg-white/5 px-2 py-1 font-mono text-[11px] text-[color:var(--ck-text-primary)]\"\n }\n placeholder=\"0 9 * * 1,3,5\"\n />\n {!cronLooksValid ? (\n <div className=\"mt-1 text-[10px] text-red-200\">\n Cron should be 5 fields (min hour dom month dow). You entered {cronFields.length}.\n </div>\n ) : null}\n <div className=\"mt-1 grid grid-cols-1 gap-1\">\n <select\n value={presets.some((p) => p.expr === expr) ? expr : \"\"}\n onChange={(e) => {\n const nextExpr = e.target.value;\n setWorkflow({\n ...wf,\n triggers: triggers.map((x, idx) => (idx === i && x.kind === \"cron\" ? { ...x, expr: nextExpr } : x)),\n });\n }}\n className=\"w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-[11px] text-[color:var(--ck-text-secondary)]\"\n >\n {presets.map((p) => (\n <option key={p.label} value={p.expr}>\n {p.label}\n </option>\n ))}\n </select>\n <div className=\"text-[10px] text-[color:var(--ck-text-tertiary)]\">Presets set the cron; edit freely for advanced schedules.</div>\n </div>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">timezone override</div>\n <input\n value={trigTz}\n onChange={(e) => {\n const nextTz = String(e.target.value || \"\").trim() || tz;\n setWorkflow({\n ...wf,\n triggers: triggers.map((x, idx) => (idx === i && x.kind === \"cron\" ? { ...x, tz: nextTz } : x)),\n });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder={tz}\n />\n </label>\n </div>\n </div>\n );\n })\n ) : (\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">No triggers yet.</div>\n )}\n </div>\n </div>\n </details>\n\n <details open className=\"rounded-lg border border-white/10 bg-white/5\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Runs</summary>\n <div className=\"px-3 pb-3\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-3\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Runs (history)</div>\n <Link\n href={`/teams/${encodeURIComponent(teamId)}/runs`}\n className=\"text-[10px] font-medium text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-secondary)] hover:underline\"\n >\n View all →\n </Link>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n disabled={saving}\n onClick={async () => {\n const wfId = String(wf.id ?? \"\").trim();\n if (!wfId) return;\n setWorkflowRunsError(\"\");\n setWorkflowRunsLoading(true);\n try {\n const res = await fetch(\"/api/teams/workflow-runs\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n // Enqueue a canonical file-first run via the CLI (Kitchen should not author run artifacts).\n body: JSON.stringify({ teamId, workflowId: wfId, mode: \"enqueue\" }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to enqueue run\");\n\n const listRes = await fetch(\n `/api/teams/workflow-runs?teamId=${encodeURIComponent(teamId)}&workflowId=${encodeURIComponent(wfId)}`,\n { cache: \"no-store\" }\n );\n const listJson = await listRes.json();\n if (!listRes.ok || !listJson.ok) throw new Error(listJson.error || \"Failed to refresh runs\");\n const files = Array.isArray(listJson.files) ? listJson.files : [];\n const list = files.map((f: unknown) => String(f ?? \"\").trim()).filter((f: string) => Boolean(f));\n setWorkflowRuns(list);\n } catch (e: unknown) {\n setWorkflowRunsError(e instanceof Error ? e.message : String(e));\n } finally {\n setWorkflowRunsLoading(false);\n }\n }}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-[10px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n + Queue run\n </button>\n <button\n type=\"button\"\n disabled={saving || cronLoading || !runPreflight.ok}\n onClick={async () => {\n const wfId = String(wf.id ?? \"\").trim();\n if (!wfId) return;\n\n // Preflight: all nodes must be assigned.\n if (runPreflight.missingAgentOnNodeIds.length) {\n setWorkflowRunsError(\"All nodes must be assigned to an agent.\");\n return;\n }\n\n // Cron reconciliation: keep the system clean by disabling orphaned worker crons,\n // and install/enable missing worker crons before enqueue.\n // Skipped when the user opted to skip the cron check (once or permanently).\n const skipCronCheck = skipCronOnce || runPreflight.skipCronPermanent;\n if (runPreflight.agentIdsMissingCron.length && !skipCronCheck) {\n setInstallCronBusy(true);\n setInstallCronError(\"\");\n try {\n const reconcileRes = await fetch(\"/api/cron/worker\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ action: \"reconcile\", teamId }),\n });\n const reconcileJson = (await reconcileRes.json()) as { ok?: boolean; error?: string };\n if (!reconcileRes.ok || reconcileJson.ok === false) {\n throw new Error(reconcileJson.error || \"Failed to reconcile worker crons\");\n }\n const map = await refreshCronMap();\n const stillMissing = runPreflight.requiredAgentIds.filter((id) => !map[id]);\n if (stillMissing.length) {\n setWorkflowRunsError(`Cron not set up for: ${stillMissing.join(\", \")}`);\n return;\n }\n } catch (e: unknown) {\n setWorkflowRunsError(e instanceof Error ? e.message : String(e));\n return;\n } finally {\n setInstallCronBusy(false);\n }\n }\n\n setWorkflowRunsError(\"\");\n setWorkflowRunsLoading(true);\n setRunOverlayOpen(true);\n try {\n const res = await fetch(\"/api/teams/workflow-runs\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, workflowId: wfId, mode: \"run_now\" }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to create run\");\n\n // Redirect to run page if runId is available\n const newRunId = String(json.runId ?? \"\").trim();\n if (newRunId) {\n router.push(`/teams/${teamId}/runs/${workflowId}/${newRunId}`);\n return;\n }\n\n setRunOverlayOpen(false);\n const listRes = await fetch(\n `/api/teams/workflow-runs?teamId=${encodeURIComponent(teamId)}&workflowId=${encodeURIComponent(wfId)}`,\n { cache: \"no-store\" }\n );\n const listJson = await listRes.json();\n if (!listRes.ok || !listJson.ok) throw new Error(listJson.error || \"Failed to refresh runs\");\n const files = Array.isArray(listJson.files) ? listJson.files : [];\n const list = files.map((f: unknown) => String(f ?? \"\").trim()).filter((f: string) => Boolean(f));\n setWorkflowRuns(list);\n } catch (e: unknown) {\n setRunOverlayOpen(false);\n setWorkflowRunsError(e instanceof Error ? e.message : String(e));\n } finally {\n setWorkflowRunsLoading(false);\n }\n }}\n className=\"rounded-lg border border-emerald-400/30 bg-emerald-500/10 px-2 py-1 text-[10px] font-medium text-emerald-50 hover:bg-emerald-500/15 disabled:opacity-50\"\n title=\"Enqueue a run for the workflow runner (Kitchen does not execute nodes)\"\n >\n + Run now\n </button>\n {cronError ? (\n <div className=\"ml-2 text-[10px] text-amber-100/90\" title={cronError}>\n Cron check unavailable\n </div>\n ) : null}\n </div>\n </div>\n\n {runPreflight.missingAgentOnNodeIds.length ? (\n <div className=\"mt-2 rounded-lg border border-red-400/30 bg-red-500/10 p-2 text-xs text-red-100\">\n All nodes must be assigned to an agent. Missing agentId on: {runPreflight.missingAgentOnNodeIds.join(\", \")}\n </div>\n ) : runPreflight.skipCronPermanent ? (\n <div className=\"mt-2 rounded-lg border border-sky-400/30 bg-sky-500/10 p-2 text-xs text-sky-50\">\n <div>Cron check is skipped permanently for this workflow. Run Now will enqueue without installing worker crons.</div>\n <div className=\"mt-2 flex flex-wrap items-center gap-2\">\n <button\n type=\"button\"\n disabled={skipCronSaving}\n onClick={async () => {\n setSkipCronSaving(true);\n setSkipCronError(\"\");\n try {\n if (status.kind !== \"ready\") throw new Error(\"Workflow not loaded\");\n const current = JSON.parse(status.jsonText) as WorkflowFileV1;\n const curMeta =\n current.meta && typeof current.meta === \"object\" && !Array.isArray(current.meta)\n ? { ...(current.meta as Record<string, unknown>) }\n : {};\n delete curMeta.skipCronCheck;\n const nextWf: WorkflowFileV1 = { ...current, meta: curMeta };\n const res = await fetch(\"/api/teams/workflows\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, workflow: nextWf }),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || json.ok === false) {\n throw new Error(json.error || \"Failed to save workflow\");\n }\n setStatus({ kind: \"ready\", jsonText: JSON.stringify(nextWf, null, 2) + \"\\n\" });\n await refreshCronMap();\n } catch (e: unknown) {\n setSkipCronError(e instanceof Error ? e.message : String(e));\n } finally {\n setSkipCronSaving(false);\n }\n }}\n className=\"rounded-lg border border-sky-300/30 bg-sky-500/10 px-2 py-1 text-[10px] font-medium text-sky-50 hover:bg-sky-500/15 disabled:opacity-60\"\n >\n {skipCronSaving ? \"Unskipping…\" : \"Unskip\"}\n </button>\n {skipCronError ? (\n <span className=\"text-[10px] text-red-200\">{skipCronError}</span>\n ) : null}\n </div>\n </div>\n ) : skipCronOnce ? (\n <div className=\"mt-2 rounded-lg border border-sky-400/30 bg-sky-500/10 p-2 text-xs text-sky-50\">\n Cron check is skipped for this session. Run Now will enqueue without installing worker crons.\n Reload the page to re-enable the check.\n </div>\n ) : runPreflight.agentIdsMissingCron.length ? (\n <div className=\"mt-2 rounded-lg border border-amber-400/30 bg-amber-500/10 p-2 text-xs text-amber-50\">\n <div>Cron not set up for: {runPreflight.agentIdsMissingCron.join(\", \")}</div>\n <div className=\"mt-2 flex flex-wrap items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => {\n setInstallCronError(\"\");\n setInstallCronOpen(true);\n }}\n className=\"rounded-lg border border-amber-300/30 bg-amber-500/10 px-2 py-1 text-[10px] font-medium text-amber-50 hover:bg-amber-500/15\"\n >\n Install worker cron(s)\n </button>\n <button\n type=\"button\"\n onClick={() => void refreshCronMap()}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-[10px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Re-check\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setSkipCronError(\"\");\n setSkipCronModalOpen(true);\n }}\n className=\"rounded-lg border border-sky-400/30 bg-sky-500/10 px-2 py-1 text-[10px] font-medium text-sky-50 hover:bg-sky-500/15\"\n title=\"Skip the cron-install check and enable Run Now (useful when workers run via launchd or an external scheduler)\"\n >\n Skip\n </button>\n </div>\n </div>\n ) : null}\n\n <ConfirmationModal\n open={skipCronModalOpen}\n title=\"Skip cron check?\"\n busy={skipCronSaving}\n error={skipCronError || undefined}\n confirmLabel=\"Skip this run only\"\n confirmBusyLabel=\"Saving…\"\n onClose={() => {\n if (skipCronSaving) return;\n setSkipCronModalOpen(false);\n }}\n onConfirm={() => {\n setSkipCronOnce(true);\n setSkipCronModalOpen(false);\n }}\n >\n <div className=\"text-sm text-[color:var(--ck-text-secondary)] space-y-3\">\n <p>\n Choose how long to bypass the worker-cron check for this workflow. The actual worker\n process must still be running somewhere (OpenClaw cron, macOS launchd, systemd, etc.)\n — skipping the check only stops Kitchen from blocking Run Now.\n </p>\n <div className=\"rounded-lg border border-white/10 bg-white/5 p-3\">\n <div className=\"text-xs font-semibold text-[color:var(--ck-text-primary)]\">Skip this run only</div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n Click the primary button below. Skip resets on page reload.\n </div>\n </div>\n <button\n type=\"button\"\n disabled={skipCronSaving}\n onClick={async () => {\n setSkipCronSaving(true);\n setSkipCronError(\"\");\n try {\n if (status.kind !== \"ready\") throw new Error(\"Workflow not loaded\");\n const current = JSON.parse(status.jsonText) as WorkflowFileV1;\n const nextMeta: Record<string, unknown> = {\n ...(current.meta && typeof current.meta === \"object\" && !Array.isArray(current.meta)\n ? (current.meta as Record<string, unknown>)\n : {}),\n skipCronCheck: true,\n };\n const nextWf: WorkflowFileV1 = { ...current, meta: nextMeta };\n const res = await fetch(\"/api/teams/workflows\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, workflow: nextWf }),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || json.ok === false) {\n throw new Error(json.error || \"Failed to save workflow\");\n }\n setStatus({ kind: \"ready\", jsonText: JSON.stringify(nextWf, null, 2) + \"\\n\" });\n setSkipCronModalOpen(false);\n } catch (e: unknown) {\n setSkipCronError(e instanceof Error ? e.message : String(e));\n } finally {\n setSkipCronSaving(false);\n }\n }}\n className=\"w-full rounded-lg border border-sky-400/30 bg-sky-500/10 p-3 text-left hover:bg-sky-500/15 disabled:opacity-60\"\n >\n <div className=\"text-xs font-semibold text-sky-50\">Skip permanently</div>\n <div className=\"mt-1 text-xs text-sky-100/80\">\n Writes <span className=\"font-mono\">meta.skipCronCheck: true</span> into the workflow JSON.\n Applies forever unless the flag is removed.\n </div>\n </button>\n </div>\n </ConfirmationModal>\n\n <ConfirmationModal\n open={installCronOpen}\n title=\"Install worker cron jobs?\"\n busy={installCronBusy}\n error={installCronError || undefined}\n confirmLabel=\"Install\"\n onClose={() => {\n if (installCronBusy) return;\n setInstallCronOpen(false);\n }}\n onConfirm={async () => {\n setInstallCronBusy(true);\n setInstallCronError(\"\");\n try {\n const res = await fetch(\"/api/cron/worker\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ action: \"reconcile\", teamId }),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || json.ok === false) throw new Error(json.error || \"Failed to install worker crons\");\n\n await refreshCronMap();\n setInstallCronOpen(false);\n } catch (e: unknown) {\n setInstallCronError(e instanceof Error ? e.message : String(e));\n } finally {\n setInstallCronBusy(false);\n }\n }}\n >\n <div className=\"text-sm text-[color:var(--ck-text-secondary)]\">\n Kitchen will install (or enable) worker cron jobs for the following agents so this workflow can drain:\n <div className=\"mt-2 rounded-lg border border-white/10 bg-white/5 p-2 font-mono text-[11px] text-[color:var(--ck-text-primary)]\">\n {runPreflight.agentIdsMissingCron.join(\", \")}\n </div>\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Cron cadence: every 5 minutes. The worker runs: <span className=\"font-mono\">openclaw recipes workflows worker-tick</span>.\n </div>\n </div>\n </ConfirmationModal>\n\n {workflowRunsError ? (\n <div className=\"mt-2 rounded-lg border border-red-400/30 bg-red-500/10 p-2 text-xs text-red-100\">\n {workflowRunsError}\n </div>\n ) : null}\n\n <div className=\"mt-2 space-y-1\">\n {workflowRunsLoading ? (\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">Serving up hot…</div>\n ) : workflowRuns.length ? (\n workflowRuns.slice(0, 8).map((f) => {\n const wfId = String(wf.id ?? \"\").trim();\n const runId = String(f).replace(/\\.run\\.json$/i, \"\");\n const selected = selectedWorkflowRunId === runId;\n const href = wfId\n ? `/teams/${encodeURIComponent(teamId)}/runs/${encodeURIComponent(wfId)}/${encodeURIComponent(runId)}`\n : \"#\";\n\n return (\n <Link\n key={f}\n href={href}\n onClick={() => setSelectedWorkflowRunId(runId)}\n className={\n selected\n ? \"block w-full rounded-lg bg-white/10 px-2 py-1 text-left text-[11px] font-mono text-[color:var(--ck-text-primary)]\"\n : \"block w-full rounded-lg px-2 py-1 text-left text-[11px] font-mono text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n title=\"Open run detail\"\n >\n {runId}\n </Link>\n );\n })\n ) : (\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">No runs yet.</div>\n )}\n </div>\n\n <details open className=\"mt-3 rounded-lg border border-white/10 bg-black/10\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Nodes</summary>\n <div className=\"px-3 pb-3\">\n\n <div className=\"mt-2 rounded-lg border border-white/10 bg-white/5 p-2\">\n <div className=\"grid grid-cols-1 gap-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">id</div>\n <input\n value={newNodeId}\n onChange={(e) => setNewNodeId(e.target.value)}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"e.g. draft_assets\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">name (optional)</div>\n <input\n value={newNodeName}\n onChange={(e) => setNewNodeName(e.target.value)}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"Human-friendly label\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">type</div>\n <select\n value={newNodeType}\n onChange={(e) => setNewNodeType(e.target.value as WorkflowFileV1[\"nodes\"][number][\"type\"])}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"start\">start</option>\n <option value=\"end\">end</option>\n <option value=\"llm\">llm</option>\n <option value=\"tool\">tool</option>\n <option value=\"condition\">condition</option>\n <option value=\"delay\">delay</option>\n <option value=\"human_approval\">human_approval</option>\n <option value=\"media-image\">media-image</option>\n <option value=\"media-video\">media-video</option>\n <option value=\"handoff\">handoff</option>\n </select>\n </label>\n\n <button\n type=\"button\"\n onClick={() => {\n const rawId = String(newNodeId || \"\").trim();\n const id = rawId.replace(/[^a-z0-9_\\-]/gi, \"_\");\n if (!id) return;\n if (wf.nodes.some((n) => n.id === id)) return;\n\n const maxX = wf.nodes.reduce((acc, n) => (typeof n.x === \"number\" ? Math.max(acc, n.x) : acc), 80);\n const nextNode = {\n id,\n type: newNodeType,\n name: String(newNodeName || \"\").trim() || id,\n x: maxX + 220,\n y: 80,\n } as WorkflowFileV1[\"nodes\"][number];\n\n setWorkflow({ ...wf, nodes: [...wf.nodes, nextNode] });\n setSelectedNodeId(id);\n setNewNodeId(\"\");\n setNewNodeName(\"\");\n }}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-[11px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n + Add node\n </button>\n </div>\n </div>\n\n <div className=\"mt-2 space-y-1\">\n {wf.nodes.map((n) => {\n const selected = selectedNodeId === n.id;\n return (\n <button\n key={n.id}\n type=\"button\"\n onClick={() => setSelectedNodeId(n.id)}\n className={\n selected\n ? \"w-full rounded-lg bg-white/10 px-2 py-1 text-left text-[11px] text-[color:var(--ck-text-primary)]\"\n : \"w-full rounded-lg px-2 py-1 text-left text-[11px] text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n >\n <span className=\"font-mono\">{n.id}</span>\n <span className=\"ml-2 text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">{n.type}</span>\n </button>\n );\n })}\n </div>\n </div>\n </details>\n\n <details open className=\"mt-3 rounded-lg border border-white/10 bg-black/10\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Edges</summary>\n <div className=\"px-3 pb-3\">\n\n <div className=\"mt-2 rounded-lg border border-white/10 bg-white/5 p-2\">\n <div className=\"grid grid-cols-1 gap-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">from</div>\n <select\n value={newEdgeFrom}\n onChange={(e) => setNewEdgeFrom(e.target.value)}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">(select)</option>\n {wf.nodes.map((n) => (\n <option key={n.id} value={n.id}>\n {n.id}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">to</div>\n <select\n value={newEdgeTo}\n onChange={(e) => setNewEdgeTo(e.target.value)}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">(select)</option>\n {wf.nodes.map((n) => (\n <option key={n.id} value={n.id}>\n {n.id}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">label (optional)</div>\n <input\n value={newEdgeLabel}\n onChange={(e) => setNewEdgeLabel(e.target.value)}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"e.g. approve\"\n />\n </label>\n\n <button\n type=\"button\"\n onClick={() => {\n const from = String(newEdgeFrom || \"\").trim();\n const to = String(newEdgeTo || \"\").trim();\n if (!from || !to) return;\n if (from === to) return;\n const id = `e${Date.now()}`;\n const nextEdge: WorkflowFileV1[\"edges\"][number] = {\n id,\n from,\n to,\n ...(String(newEdgeLabel || \"\").trim() ? { label: String(newEdgeLabel).trim() } : {}),\n };\n setWorkflow({ ...wf, edges: [...(wf.edges ?? []), nextEdge] });\n setNewEdgeLabel(\"\");\n }}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-[11px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n + Add edge\n </button>\n </div>\n </div>\n\n <div className=\"mt-2 space-y-2\">\n {(wf.edges ?? []).length ? (\n (wf.edges ?? []).map((e) => (\n <div key={e.id} className=\"rounded-lg border border-white/10 bg-white/5 p-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-[11px] text-[color:var(--ck-text-secondary)]\">\n <span className=\"font-mono\">{e.from}</span> → <span className=\"font-mono\">{e.to}</span>\n {e.label ? <span className=\"ml-2 text-[10px] text-[color:var(--ck-text-tertiary)]\">({e.label})</span> : null}\n </div>\n <button\n type=\"button\"\n onClick={() => setWorkflow({ ...wf, edges: (wf.edges ?? []).filter((x) => x.id !== e.id) })}\n className=\"text-[10px] text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n Remove\n </button>\n </div>\n </div>\n ))\n ) : (\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">No edges yet.</div>\n )}\n </div>\n </div>\n </details>\n\n\n </div>\n </details>\n </div>\n );\n })()\n ) : null}\n </div>\n </div>\n </div>\n <RunLoadingOverlay open={runOverlayOpen} />\n </div>\n );\n}\n","import type { WorkflowEdgeV1, WorkflowFileV1, WorkflowNodeV1, WorkflowTriggerCronV1 } from \"@/lib/workflows/types\";\n\nexport type WorkflowValidationResult = {\n errors: string[];\n warnings: string[];\n};\n\nfunction isFiveFieldCron(expr: string) {\n const parts = String(expr || \"\")\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n return parts.length === 5;\n}\n\nfunction uniqCount(values: string[]) {\n const set = new Set<string>();\n for (const v of values) set.add(v);\n return set.size;\n}\n\nexport function validateWorkflowFileV1(wf: WorkflowFileV1): WorkflowValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (wf.schema !== \"clawkitchen.workflow.v1\") errors.push(`schema must be clawkitchen.workflow.v1 (got ${String(wf.schema)})`);\n if (!String(wf.id || \"\").trim()) errors.push(\"id is required\");\n if (!String(wf.name || \"\").trim()) errors.push(\"name is required\");\n\n const nodes: WorkflowNodeV1[] = Array.isArray(wf.nodes) ? wf.nodes : [];\n const edges: WorkflowEdgeV1[] = Array.isArray(wf.edges) ? wf.edges : [];\n const triggers: WorkflowTriggerCronV1[] = Array.isArray(wf.triggers) ? wf.triggers : [];\n\n const nodeIds = nodes.map((n) => String(n?.id ?? \"\").trim()).filter(Boolean);\n if (nodeIds.length !== nodes.length) errors.push(\"all nodes must have a non-empty id\");\n if (uniqCount(nodeIds) !== nodeIds.length) errors.push(\"node ids must be unique\");\n\n const edgeIds = edges.map((e) => String(e?.id ?? \"\").trim()).filter(Boolean);\n if (edgeIds.length !== edges.length) errors.push(\"all edges must have a non-empty id\");\n if (uniqCount(edgeIds) !== edgeIds.length) errors.push(\"edge ids must be unique\");\n\n const nodeIdSet = new Set(nodeIds);\n for (const e of edges) {\n const from = String(e?.from ?? \"\").trim();\n const to = String(e?.to ?? \"\").trim();\n if (!from || !to) {\n errors.push(`edge ${String(e?.id ?? \"(missing id)\")} must have from/to`);\n continue;\n }\n if (!nodeIdSet.has(from)) errors.push(`edge ${String(e.id)} references missing from node: ${from}`);\n if (!nodeIdSet.has(to)) errors.push(`edge ${String(e.id)} references missing to node: ${to}`);\n }\n\n const starts = nodes.filter((n) => n.type === \"start\");\n const ends = nodes.filter((n) => n.type === \"end\");\n if (!starts.length) warnings.push(\"no start node found\");\n if (starts.length > 1) warnings.push(\"multiple start nodes found (MVP supports this, but execution semantics may be ambiguous)\");\n if (!ends.length) warnings.push(\"no end node found\");\n\n for (const t of triggers) {\n if (t.kind === \"cron\") {\n if (!String(t.id || \"\").trim()) errors.push(\"cron trigger missing id\");\n if (!String(t.expr || \"\").trim()) errors.push(`cron trigger ${String(t.id || \"(missing id)\")} missing expr`);\n else if (!isFiveFieldCron(t.expr)) warnings.push(`cron trigger ${String(t.id)} expr is not 5-field: ${String(t.expr)}`);\n const tz = t.tz ? String(t.tz).trim() : \"\";\n // NOTE: We commonly use \"UTC\" as a default, and it is widely accepted even though it isn't in the\n // classic Region/City IANA format. Treat it as valid to avoid noisy validation warnings.\n if (tz && tz !== \"UTC\" && !tz.includes(\"/\")) {\n warnings.push(`cron trigger ${String(t.id)} tz doesn't look like an IANA timezone: ${String(t.tz)}`);\n }\n }\n }\n\n // Human approval node sanity checks (MVP)\n const meta = wf.meta && typeof wf.meta === \"object\" && !Array.isArray(wf.meta) ? (wf.meta as Record<string, unknown>) : {};\n const defaultTarget = String(meta.approvalTarget ?? \"\").trim();\n for (const n of nodes) {\n if (n.type !== \"human_approval\") continue;\n const cfg = n.config && typeof n.config === \"object\" && !Array.isArray(n.config) ? (n.config as Record<string, unknown>) : {};\n const target = String(cfg.target ?? cfg.chatId ?? \"\").trim();\n const provider = String(cfg.provider ?? cfg.channel ?? \"\").trim();\n\n if (!target && !defaultTarget) {\n warnings.push(`human_approval node ${String(n.id)} has no target (set node.config.target or workflow.meta.approvalTarget)`);\n }\n if (target && !provider && !String(meta.approvalProvider ?? \"\").trim()) {\n warnings.push(`human_approval node ${String(n.id)} has a target but no provider (set node.config.provider or workflow.meta.approvalProvider)`);\n }\n }\n\n return { errors, warnings };\n}\n","/**\n * Media Generation Node Types for ClawKitchen Workflows\n * Integrates with the vendor-agnostic media generation backend system\n */\n\nexport interface MediaGenerationConfig {\n mediaType: 'image' | 'video' | 'audio';\n provider: 'auto' | 'openai' | 'skill' | 'http' | string;\n prompt: string;\n size?: string;\n quality?: 'standard' | 'hd';\n style?: 'natural' | 'vivid';\n model?: string;\n outputPath?: string;\n duration?: string; // For video\n aspect_ratio?: string; // For video (e.g. '16:9', '9:16')\n addRefinement?: boolean | string; // Opt-in LLM refinement pass\n // Provider-specific configs\n skillId?: string;\n httpEndpoint?: string;\n httpHeaders?: Record<string, string>;\n}\n\nexport interface DurationConstraints {\n minSeconds: number;\n maxSeconds: number;\n defaultSeconds: number;\n stepSeconds?: number;\n}\n\nexport interface MediaProvider {\n id: string;\n name: string;\n supportedTypes: ('image' | 'video')[];\n available: boolean;\n models?: string[];\n error?: string;\n durationConstraints?: DurationConstraints | null;\n}\n\nexport const MEDIA_NODE_TYPES = {\n 'media-image': {\n type: 'tool',\n tool: 'media.generate',\n label: 'Generate Image',\n description: 'Generate images using AI providers (DALL-E, Skills, etc.)',\n icon: '🎨',\n color: '#9333EA',\n category: 'media',\n defaultConfig: {\n mediaType: 'image',\n provider: 'auto',\n prompt: '',\n size: '1024x1024',\n quality: 'standard',\n style: 'natural',\n outputPath: 'shared-context/media/{{run.id}}_{{node.id}}.png'\n } as MediaGenerationConfig\n },\n 'media-video': {\n type: 'tool', \n tool: 'media.generate',\n label: 'Generate Video',\n description: 'Generate videos using AI providers',\n icon: '🎬',\n color: '#DC2626',\n category: 'media',\n defaultConfig: {\n mediaType: 'video',\n provider: 'auto',\n prompt: '',\n duration: '5s',\n outputPath: 'shared-context/media/{{run.id}}_{{node.id}}.mp4'\n } as MediaGenerationConfig\n }\n} as const;\n\nexport type MediaNodeType = keyof typeof MEDIA_NODE_TYPES;\n\nexport function isMediaNode(nodeType: string): nodeType is MediaNodeType {\n return nodeType in MEDIA_NODE_TYPES;\n}\n\nexport function getMediaNodeConfig(nodeType: MediaNodeType): MediaGenerationConfig {\n return { ...MEDIA_NODE_TYPES[nodeType].defaultConfig };\n}\n\nexport function validateMediaConfig(config: Partial<MediaGenerationConfig>): string[] {\n const errors: string[] = [];\n \n if (!config.prompt?.trim()) {\n errors.push('Prompt is required');\n }\n \n if (config.mediaType === 'image') {\n if (config.size && !['256x256', '512x512', '1024x1024', '1792x1024', '1024x1792'].includes(config.size)) {\n errors.push('Invalid image size');\n }\n }\n \n if (config.mediaType === 'video') {\n if (config.duration && !config.duration.match(/^\\d+s?$/)) {\n errors.push('Invalid video duration format (e.g., \"5s\")');\n }\n }\n \n return errors;\n}\n\n/**\n * Built-in template variable suggestions for media generation prompts.\n * Prior node outputs (e.g. {{research.output}}) are added dynamically\n * by the UI component based on the current workflow.\n */\nexport const TEMPLATE_VARIABLES = [\n '{{run.id}}',\n '{{workflow.name}}',\n '{{workflow.id}}',\n '{{date}}',\n];\n\n/**\n * Build dynamic template variable list including only upstream node outputs.\n * Walks the edge graph backwards from currentNodeId to find all ancestors.\n *\n * @param allNodeIds - all node IDs in the workflow\n * @param edges - workflow edges (each has `from` and `to`)\n * @param currentNodeId - the node being edited (excluded from suggestions)\n */\nexport function buildTemplateVariables(\n allNodeIds: string[],\n edges: { from: string; to: string }[],\n currentNodeId: string\n): string[] {\n // BFS backwards from currentNodeId to find all upstream ancestors\n const upstream = new Set<string>();\n const queue = [currentNodeId];\n while (queue.length > 0) {\n const nodeId = queue.shift()!;\n for (const edge of edges) {\n if (edge.to === nodeId && !upstream.has(edge.from)) {\n upstream.add(edge.from);\n queue.push(edge.from);\n }\n }\n }\n\n const nodeVars = allNodeIds\n .filter((id) => upstream.has(id) && id !== 'start' && id !== 'end')\n .map((id) => `{{${id}.output}}`);\n return [...nodeVars, ...TEMPLATE_VARIABLES];\n}\n\n/**\n * Common prompt templates for different media types\n */\nexport const PROMPT_TEMPLATES = {\n 'social-media': 'Professional social media image for: {{content}}',\n 'blog-header': 'Blog header image representing: {{title}}',\n 'product-shot': 'Product photography style image of: {{product}}',\n 'illustration': 'Clean vector illustration of: {{concept}}',\n 'marketing': 'Marketing banner image for: {{campaign}}'\n} as const;","'use client';\n\nimport React, { useMemo, useRef, useState, useEffect } from 'react';\nimport { MediaGenerationConfig, MediaProvider, validateMediaConfig, buildTemplateVariables, PROMPT_TEMPLATES } from '@/lib/workflows/media-nodes';\nimport type { WorkflowFileV1 } from '@/lib/workflows/types';\n\ninterface MediaGenerationConfigProps {\n config: MediaGenerationConfig;\n onChange: (config: MediaGenerationConfig) => void;\n teamId: string;\n /** Full workflow object for outputFields-aware variable insertion */\n workflow?: WorkflowFileV1;\n /** All node IDs in the workflow (for building {{nodeId.output}} variable suggestions) */\n workflowNodeIds?: string[];\n /** Workflow edges for determining upstream nodes */\n workflowEdges?: { from: string; to: string }[];\n /** The current node's ID (excluded from variable suggestions) */\n currentNodeId?: string;\n}\n\nexport function MediaGenerationConfigComponent({ config, onChange, teamId, workflow, workflowNodeIds, workflowEdges, currentNodeId }: MediaGenerationConfigProps) {\n const [providers, setProviders] = useState<MediaProvider[]>([]);\n const [loading, setLoading] = useState(true);\n const [errors, setErrors] = useState<string[]>([]);\n\n // Load available providers\n useEffect(() => {\n async function loadProviders() {\n try {\n const response = await fetch(`/api/teams/${teamId}/media-providers`);\n if (response.ok) {\n const data = await response.json();\n setProviders(data);\n }\n } catch (error) {\n console.error('Failed to load media providers:', error);\n } finally {\n setLoading(false);\n }\n }\n loadProviders();\n }, [teamId]);\n\n // Validate config on change\n useEffect(() => {\n const configErrors = validateMediaConfig(config);\n setErrors(configErrors);\n }, [config]);\n\n const updateConfig = (updates: Partial<MediaGenerationConfig>) => {\n onChange({ ...config, ...updates });\n };\n\n const availableProviders = providers.filter(p => p.available);\n const selectedProvider = providers.find(p => p.id === config.provider);\n\n // --- Variables dropdown logic ---\n const promptRef = useRef<HTMLTextAreaElement>(null);\n const [isVarsOpen, setIsVarsOpen] = useState(false);\n const varsDropdownRef = useRef<HTMLDivElement>(null);\n\n const globalVariables = useMemo(\n () => [\n { variable: '{{run.id}}', type: 'text' },\n { variable: '{{workflow.name}}', type: 'text' },\n { variable: '{{workflow.id}}', type: 'text' },\n { variable: '{{node.id}}', type: 'text' },\n { variable: '{{date}}', type: 'text' },\n ],\n []\n );\n\n const upstreamVariables = useMemo(() => {\n if (!workflowNodeIds || !workflowEdges || !currentNodeId) return [];\n\n // If we have the full workflow with nodes, use outputFields-aware logic\n if (workflow && workflow.nodes) {\n const upstream = new Set<string>();\n const queue = [currentNodeId];\n const visited = new Set<string>();\n while (queue.length > 0) {\n const cur = queue.shift()!;\n if (visited.has(cur)) continue;\n visited.add(cur);\n for (const e of (workflow.edges ?? [])) {\n if (e.to === cur && e.from !== currentNodeId && !upstream.has(e.from)) {\n upstream.add(e.from);\n queue.push(e.from);\n }\n }\n }\n\n const vars: Array<{ nodeId: string; nodeName: string; fieldName: string; fieldType: string }> = [];\n for (const nId of upstream) {\n if (nId === 'start' || nId === 'end') continue;\n const node = workflow.nodes.find((n) => n.id === nId);\n if (!node) continue;\n const nodeName = String((node as Record<string, unknown>).name ?? node.id);\n\n vars.push({ nodeId: nId, nodeName, fieldName: 'output', fieldType: 'text' });\n vars.push({ nodeId: nId, nodeName, fieldName: 'text', fieldType: 'text' });\n\n const cfg = (node as Record<string, unknown>).config as Record<string, unknown> | undefined;\n const outputFields = cfg?.outputFields as Array<{ name?: string; type?: string }> | undefined;\n if (Array.isArray(outputFields)) {\n for (const f of outputFields) {\n const name = String(f.name ?? '').trim();\n if (!name || name === 'output' || name === 'text') continue;\n vars.push({ nodeId: nId, nodeName, fieldName: name, fieldType: String(f.type ?? 'text') });\n }\n }\n }\n return vars;\n }\n\n // Fallback: use old buildTemplateVariables (just {{nodeId.output}} list)\n return buildTemplateVariables(workflowNodeIds, workflowEdges, currentNodeId)\n .filter(v => v.includes('.output') && v.startsWith('{{'))\n .map(v => {\n const inner = v.slice(2, -2); // strip {{ }}\n const dotIdx = inner.indexOf('.');\n const nodeId = inner.substring(0, dotIdx);\n return { nodeId, nodeName: nodeId, fieldName: 'output', fieldType: 'text' };\n });\n }, [workflow, workflowNodeIds, workflowEdges, currentNodeId]);\n\n const groupedUpstream = useMemo(() => {\n const groups: Record<string, { nodeId: string; nodeName: string; fields: Array<{ name: string; type: string }> }> = {};\n for (const v of upstreamVariables) {\n const key = v.nodeId + '|' + v.nodeName;\n if (!groups[key]) groups[key] = { nodeId: v.nodeId, nodeName: v.nodeName, fields: [] };\n groups[key].fields.push({ name: v.fieldName, type: v.fieldType });\n }\n return Object.values(groups);\n }, [upstreamVariables]);\n\n useEffect(() => {\n function onClickOutside(event: MouseEvent) {\n if (varsDropdownRef.current && !varsDropdownRef.current.contains(event.target as Node)) {\n setIsVarsOpen(false);\n }\n }\n if (isVarsOpen) {\n document.addEventListener('mousedown', onClickOutside);\n return () => document.removeEventListener('mousedown', onClickOutside);\n }\n }, [isVarsOpen]);\n\n const insertVariable = (variable: string) => {\n const textarea = promptRef.current;\n if (!textarea) {\n // Fallback: just append\n updateConfig({ prompt: config.prompt + (config.prompt ? ' ' : '') + variable });\n setIsVarsOpen(false);\n return;\n }\n const start = textarea.selectionStart;\n const end = textarea.selectionEnd;\n const currentValue = textarea.value;\n const nextValue = currentValue.substring(0, start) + variable + currentValue.substring(end);\n updateConfig({ prompt: nextValue });\n setTimeout(() => {\n textarea.focus();\n const newPos = start + variable.length;\n textarea.setSelectionRange(newPos, newPos);\n }, 0);\n setIsVarsOpen(false);\n };\n\n return (\n <div className=\"space-y-3\">\n {loading && (\n <div className=\"flex items-center gap-2 text-[10px] text-[color:var(--ck-text-tertiary)]\">\n <div className=\"animate-spin w-3 h-3 border border-[color:var(--ck-border-subtle)] border-t-transparent rounded-full\"></div>\n Detecting providers...\n </div>\n )}\n\n {!loading && availableProviders.length === 0 && providers.length > 0 && (\n <div className=\"mt-2 rounded-lg border border-amber-400/30 bg-amber-500/10 p-2 text-xs text-amber-50\">\n <div className=\"space-y-1\">\n <div className=\"font-medium\">⚠️ Media providers detected but not available</div>\n <div>\n <strong>Common Issues:</strong>\n </div>\n {providers.some(p => p.error?.includes('API key')) && (\n <div>• Missing API keys - Check provider selection below for specific requirements</div>\n )}\n {providers.some(p => p.error?.includes('not running')) && (\n <div>• Local services not running - Start Stable Diffusion, ComfyUI, etc.</div>\n )}\n <div>\n • <a href=\"https://docs.openclaw.ai/nodes/images\" target=\"_blank\" rel=\"noopener\" className=\"text-amber-100 underline hover:text-amber-50\">\n Setup troubleshooting →\n </a>\n </div>\n </div>\n </div>\n )}\n\n {!loading && providers.length === 0 && (\n <div className=\"rounded-lg border border-white/10 bg-white/5 p-3\">\n <div className=\"text-xs text-[color:var(--ck-text-secondary)] space-y-2\">\n <p className=\"font-medium text-[color:var(--ck-text-primary)]\">⚠️ No media generation providers detected</p>\n <div className=\"space-y-1 text-[color:var(--ck-text-tertiary)]\">\n <p><strong>Setup Options:</strong></p>\n <p>• <a href=\"https://docs.openclaw.ai/nodes/images\" target=\"_blank\" rel=\"noopener\" className=\"text-blue-400 hover:text-blue-300 hover:underline\">Configure image generation models →</a></p>\n <p>• <a href=\"https://clawhub.ai/skills?q=image\" target=\"_blank\" rel=\"noopener\" className=\"text-blue-400 hover:text-blue-300 hover:underline\">Install image generation skills →</a></p>\n <p>• <a href=\"https://docs.openclaw.ai/setup/providers#openai\" target=\"_blank\" rel=\"noopener\" className=\"text-blue-400 hover:text-blue-300 hover:underline\">Add OpenAI API key for DALL-E →</a></p>\n </div>\n </div>\n </div>\n )}\n\n {/* Provider Selection */}\n {(!loading && providers.length > 0) && (\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">provider</div>\n <select\n value={config.provider}\n onChange={(e) => updateConfig({ provider: e.target.value })}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"auto\">Auto-detect (recommended)</option>\n {providers.map((provider) => (\n <option key={provider.id} value={provider.id}>\n {provider.name}\n {provider.available \n ? (provider.models && provider.models.length > 0 \n ? ` (${provider.models.join(', ')})` \n : ' ✓'\n )\n : ' ⚠️'\n }\n </option>\n ))}\n </select>\n {selectedProvider && (\n <div className=\"mt-1 space-y-1\">\n <div className=\"text-[10px] text-[color:var(--ck-text-tertiary)]\">\n Supports: {selectedProvider.supportedTypes.join(', ')}\n {selectedProvider.models && selectedProvider.models.length > 0 && (\n <span className=\"ml-2\">• Models: {selectedProvider.models.join(', ')}</span>\n )}\n </div>\n {selectedProvider.error && (\n <div className=\"mt-2 rounded-lg border border-red-400/30 bg-red-500/10 p-2 text-xs text-red-100\">\n <div>\n <span className=\"font-medium\">⚠️ Setup Required:</span> {selectedProvider.error}\n </div>\n {selectedProvider.id === 'openai' && selectedProvider.error.includes('OPENAI_API_KEY') && (\n <div className=\"mt-1\">\n Add your OpenAI API key to environment variables or OpenClaw config.{' '}\n <a href=\"https://docs.openclaw.ai/setup/providers#openai\" target=\"_blank\" rel=\"noopener\" className=\"text-red-200 underline hover:text-red-100\">\n Setup guide →\n </a>\n </div>\n )}\n {selectedProvider.id === 'skills' && selectedProvider.error.includes('API keys') && (\n <div className=\"mt-1\">\n Skills require API keys (OPENAI_API_KEY, EVOLINK_API_KEY).{' '}\n <a href=\"https://clawhub.ai/skills?q=image\" target=\"_blank\" rel=\"noopener\" className=\"text-red-200 underline hover:text-red-100\">\n Browse skills →\n </a>\n </div>\n )}\n {selectedProvider.id.startsWith('http-') && (\n <div className=\"mt-1\">\n Start the local service or configure a different endpoint.{' '}\n <a href=\"https://docs.openclaw.ai/nodes/images#local-endpoints\" target=\"_blank\" rel=\"noopener\" className=\"text-red-200 underline hover:text-red-100\">\n Local setup →\n </a>\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </label>\n )}\n\n {/* Prompt with {{}} variables dropdown */}\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">prompt</div>\n <div className=\"relative\">\n <textarea\n ref={promptRef}\n value={config.prompt}\n onChange={(e) => updateConfig({ prompt: e.target.value })}\n placeholder=\"Describe the image or video you want to generate...\"\n rows={3}\n className=\"mt-1 w-full resize-none rounded-lg border border-white/10 bg-white/5 p-2 pr-12 text-xs text-[color:var(--ck-text-primary)]\"\n />\n\n {/* Variables dropdown */}\n <div className=\"absolute top-1 right-1\" ref={varsDropdownRef}>\n <button\n type=\"button\"\n onClick={() => setIsVarsOpen(!isVarsOpen)}\n className=\"rounded-lg border border-white/10 bg-black/30 px-2 py-1 text-[9px] text-[color:var(--ck-text-secondary)] hover:bg-white/10 hover:text-[color:var(--ck-text-primary)]\"\n title=\"Insert variable\"\n >\n {'{{}}'}\n </button>\n\n {isVarsOpen && (\n <div className=\"absolute right-0 top-8 z-50 w-72 max-h-80 overflow-auto rounded-lg border border-white/15 bg-black/80 backdrop-blur shadow-[var(--ck-shadow-1)]\">\n <div className=\"p-1\">\n <div>\n <div className=\"px-2 py-1 text-[10px] font-medium uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">\n Globals\n </div>\n {globalVariables.map(({ variable, type }) => (\n <button\n key={variable}\n type=\"button\"\n onClick={() => insertVariable(variable)}\n className=\"w-full flex items-center justify-between gap-2 rounded-lg px-2 py-1 text-left text-xs text-[color:var(--ck-text-primary)] hover:bg-white/10 cursor-pointer\"\n >\n <span className=\"font-mono\">{variable}</span>\n <span className=\"text-[9px] px-1 py-0.5 rounded-sm bg-black/30 text-blue-400\">\n {type}\n </span>\n </button>\n ))}\n </div>\n\n {groupedUpstream.map(group => (\n <div key={group.nodeId}>\n <div className=\"px-2 py-1 text-[10px] font-medium uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">\n {group.nodeName}\n </div>\n {group.fields.map(field => {\n const variable = `{{${group.nodeId}.${field.name}}}`;\n const badgeColor = field.type === 'text' ? 'text-blue-400' :\n field.type === 'list' ? 'text-green-400' :\n field.type === 'json' ? 'text-amber-400' : 'text-gray-400';\n\n return (\n <button\n key={`${group.nodeId}.${field.name}`}\n type=\"button\"\n onClick={() => insertVariable(variable)}\n className=\"w-full flex items-center justify-between gap-2 rounded-lg px-2 py-1 text-left text-xs text-[color:var(--ck-text-primary)] hover:bg-white/10 cursor-pointer\"\n >\n <span className=\"font-mono\">{variable}</span>\n <span className={`text-[9px] px-1 py-0.5 rounded-sm bg-black/30 ${badgeColor}`}>\n {field.type}\n </span>\n </button>\n );\n })}\n </div>\n ))}\n\n {groupedUpstream.length === 0 && (\n <div className=\"px-2 py-3 text-xs text-[color:var(--ck-text-secondary)]\">\n Tip: Add output fields to upstream nodes to see node-specific variables here.\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Quick prompt templates */}\n <div className=\"mt-1 flex gap-1 flex-wrap\">\n {Object.entries(PROMPT_TEMPLATES).map(([key, template]) => (\n <button\n key={key}\n onClick={() => updateConfig({ prompt: template })}\n className=\"rounded-lg bg-white/5 px-2 py-0.5 text-[9px] text-[color:var(--ck-text-tertiary)] hover:bg-black/30\"\n type=\"button\"\n >\n {key}\n </button>\n ))}\n </div>\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">\n Use template variables for dynamic content. Quick templates available above.\n </div>\n </label>\n\n {/* Image-specific options */}\n {config.mediaType === 'image' && (\n <div className=\"grid grid-cols-2 gap-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">size</div>\n <select\n value={config.size || '1024x1024'}\n onChange={(e) => updateConfig({ size: e.target.value })}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"1024x1024\">Square (1024×1024)</option>\n <option value=\"1792x1024\">Landscape (1792×1024)</option>\n <option value=\"1024x1792\">Portrait (1024×1792)</option>\n <option value=\"512x512\">Small Square (512×512)</option>\n </select>\n </label>\n\n {selectedProvider?.id === 'openai' && (\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">quality</div>\n <select\n value={config.quality || 'standard'}\n onChange={(e) => updateConfig({ quality: e.target.value as 'standard' | 'hd' })}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"standard\">Standard</option>\n <option value=\"hd\">HD (higher cost)</option>\n </select>\n </label>\n )}\n </div>\n )}\n\n {selectedProvider?.id === 'openai' && config.mediaType === 'image' && (\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">style</div>\n <select\n value={config.style || 'natural'}\n onChange={(e) => updateConfig({ style: e.target.value as 'natural' | 'vivid' })}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"natural\">Natural</option>\n <option value=\"vivid\">Vivid</option>\n </select>\n </label>\n )}\n\n {/* Video-specific options */}\n {config.mediaType === 'video' && (\n <div className=\"grid grid-cols-2 gap-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">aspect ratio</div>\n <select\n value={config.aspect_ratio || '16:9'}\n onChange={(e) => updateConfig({ aspect_ratio: e.target.value })}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"16:9\">Landscape (16:9)</option>\n <option value=\"9:16\">Portrait (9:16)</option>\n <option value=\"1:1\">Square (1:1)</option>\n <option value=\"4:3\">Standard (4:3)</option>\n <option value=\"3:4\">Portrait (3:4)</option>\n <option value=\"21:9\">Ultrawide (21:9)</option>\n </select>\n </label>\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">duration</div>\n <input\n type=\"text\"\n value={config.duration || '5s'}\n onChange={(e) => updateConfig({ duration: e.target.value })}\n placeholder=\"e.g., 5s, 10s\"\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n />\n {selectedProvider?.durationConstraints ? (\n <div className=\"mt-1 flex items-center gap-1 text-[10px] text-amber-400/80\">\n <span>ℹ️</span>\n <span>\n {selectedProvider.name}: {selectedProvider.durationConstraints.minSeconds}–{selectedProvider.durationConstraints.maxSeconds}s\n (default {selectedProvider.durationConstraints.defaultSeconds}s)\n </span>\n </div>\n ) : (\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">\n Duration in seconds (e.g., &quot;5s&quot;, &quot;10s&quot;)\n </div>\n )}\n </label>\n </div>\n )}\n\n {/* Prompt Refinement toggle — opt-in for video/audio */}\n {(config.mediaType === 'video' || config.mediaType === 'audio') && (\n <label className=\"flex items-center gap-2 py-1\">\n <input\n type=\"checkbox\"\n checked={config.addRefinement === true || config.addRefinement === 'true'}\n onChange={(e) => updateConfig({ addRefinement: e.target.checked })}\n className=\"h-3.5 w-3.5 rounded border-white/20 bg-white/5 text-blue-500 accent-blue-500\"\n />\n <div>\n <span className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">Add LLM Refinement</span>\n <div className=\"text-[10px] text-[color:var(--ck-text-tertiary)] opacity-60\">\n Run an extra LLM pass to refine the prompt before generation. Off by default.\n </div>\n </div>\n </label>\n )}\n\n {/* Validation Errors */}\n {errors.length > 0 && (\n <div className=\"mt-2 rounded-lg border border-red-400/30 bg-red-500/10 p-2 text-xs text-red-100\">\n <div className=\"font-medium mb-1\">Configuration Issues:</div>\n <div className=\"space-y-0.5\">\n {errors.map((error, index) => (\n <div key={index}>• {error}</div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { createPortal } from \"react-dom\";\n\nexport function RunLoadingOverlay({ open }: { open: boolean }) {\n if (!open) return null;\n\n return createPortal(\n <div className=\"fixed inset-0 z-[9999]\">\n <div className=\"fixed inset-0 bg-[color:var(--ck-bg-base)]/90 pointer-events-none\" />\n\n <div className=\"fixed inset-0 flex items-center justify-center p-6 sm:p-10\">\n <div className=\"w-full max-w-md rounded-2xl border border-white/10 bg-[color:var(--ck-bg-soft)] p-8 sm:p-10 shadow-[var(--ck-shadow-2)]\">\n <div className=\"text-xl font-semibold text-[color:var(--ck-text-primary)]\">\n Gathering your ingredients..\n </div>\n\n <div className=\"mt-6 h-1.5 w-full overflow-hidden rounded-full bg-white/10\">\n <div className=\"h-full w-1/3 animate-[loading-bar_1.5s_ease-in-out_infinite] rounded-full bg-[var(--ck-accent-red)]\" />\n </div>\n </div>\n </div>\n\n <style>{`\n @keyframes loading-bar {\n 0% { transform: translateX(-100%); }\n 50% { transform: translateX(200%); }\n 100% { transform: translateX(-100%); }\n }\n `}</style>\n </div>,\n document.body,\n );\n}\n"],"names":[],"mappings":"wDAEA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OCUA,SAAS,EAAU,CAAgB,EACjC,IAAM,EAAM,IAAI,IAChB,IAAK,IAAM,KAAK,EAAQ,EAAI,GAAG,CAAC,GAChC,OAAO,EAAI,IACb,AADiB,CCsBV,IAAM,EAAmB,CAC9B,cAAe,CACb,KAAM,OACN,KAAM,iBACN,MAAO,iBACP,YAAa,4DACb,KAAM,KACN,MAAO,UACP,SAAU,QACV,cAAe,CACb,UAAW,QACX,SAAU,OACV,OAAQ,GACR,KAAM,YACN,QAAS,WACT,MAAO,UACP,WAAY,iDACd,CACF,EACA,cAAe,CACb,KAAM,OACN,KAAM,iBACN,MAAO,iBACP,YAAa,qCACb,KAAM,KACN,MAAO,UACP,SAAU,QACV,cAAe,CACb,UAAW,QACX,SAAU,OACV,OAAQ,GACR,SAAU,KACV,WAAY,iDACd,CACF,CACF,EAuCa,EAAqB,CAChC,aACA,oBACA,kBACA,WACD,CAqCY,EAAmB,CAC9B,eAAgB,mDAChB,cAAe,4CACf,eAAgB,kDAChB,aAAgB,4CAChB,UAAa,0CACf,EC9IO,SAAS,EAA+B,QAAE,CAAM,UAAE,CAAQ,QAAE,CAAM,UAAE,CAAQ,iBAAE,CAAe,eAAE,CAAa,eAAE,CAAa,CAA8B,EAC9J,GAAM,CAAC,EAAW,EAAa,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAkB,EAAE,EACxD,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACjC,CAAC,EAAQ,EAAU,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAW,EAAE,EAGjD,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,MACR,AAaA,eAbe,EACb,GAAI,CACF,IAAM,EAAW,MAAM,MAAM,CAAC,WAAW,EAAE,EAAO,gBAAgB,CAAC,EACnE,GAAI,EAAS,EAAE,CAAE,CACf,IAAM,EAAO,MAAM,EAAS,IAAI,GAChC,EAAa,EACf,CACF,CAAE,MAAO,EAAO,CACd,QAAQ,KAAK,CAAC,kCAAmC,EACnD,QAAU,CACR,EAAW,GACb,CACF,GAEF,EAAG,CAAC,EAAO,EAGX,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,SD4CJ,EC1CJ,KD0CuB,EAAE,CC3CgB,AD6CvC,AAAC,EC5CO,AD4CA,MAAM,EAAE,QAClB,AAD0B,EACnB,IAAI,CAAC,sBAGW,SAAS,CAA9B,EAAO,SAAS,EACd,EAAO,IAAI,EAAI,CAAC,CAAC,UAAW,UAAW,YAAa,YAAa,YAAY,CAAC,QAAQ,CAAC,EAAO,IAAI,GAAG,AACvG,EAAO,IAAI,CAAC,sBAIZ,AAAqB,SAAS,GAAvB,SAAS,EACd,EAAO,QAAQ,EAAI,CAAC,EAAO,QAAQ,CAAC,KAAK,CAAC,YAAY,AACxD,EAAO,IAAI,CAAC,8CAIT,GC3DP,EAAG,CAAC,EAAO,EAEX,IAAM,EAAe,AAAC,IACpB,EAAS,CAAE,GAAG,CAAM,CAAE,GAAG,CAAO,AAAC,EACnC,EAEM,EAAqB,EAAU,MAAM,CAAC,GAAK,EAAE,SAAS,EACtD,EAAmB,EAAU,IAAI,CAAC,GAAK,EAAE,EAAE,GAAK,EAAO,QAAQ,EAG/D,EAAY,CAAA,EAAA,EAAA,MAAA,AAAM,EAAsB,MACxC,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACvC,EAAkB,CAAA,EAAA,EAAA,MAAA,AAAM,EAAiB,MAEzC,EAAkB,CAAA,EAAA,EAAA,OAAA,AAAO,EAC7B,IAAM,CACJ,CAAE,SAAU,aAAc,KAAM,MAAO,EACvC,CAAE,SAAU,oBAAqB,KAAM,MAAO,EAC9C,CAAE,SAAU,kBAAmB,KAAM,MAAO,EAC5C,CAAE,SAAU,cAAe,KAAM,MAAO,EACxC,CAAE,SAAU,WAAY,KAAM,MAAO,EACtC,CACD,EAAE,EAGE,EAAoB,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KAChC,GAAI,CAAC,GAAmB,CAAC,GAAiB,CAAC,EAAe,MAAO,EAAE,CAGnE,GAAI,GAAY,EAAS,KAAK,CAAE,CAC9B,IAAM,EAAW,IAAI,IACf,EAAQ,CAAC,EAAc,CACvB,EAAU,IAAI,IACpB,KAAO,EAAM,MAAM,CAAG,GAAG,CACvB,IAAM,EAAM,EAAM,KAAK,GACvB,IAAI,EAAQ,GAAG,CAAC,GAEhB,GAFsB,CAEjB,IAAM,KADX,EAAQ,GAAG,CAAC,GACK,EAAS,KAAK,EAAI,EAAE,CAAG,CAClC,EAAE,EAAE,GAAK,GAAO,EAAE,IAAI,GAAK,GAAkB,EAAS,GAAG,CAAC,EAAE,IAAI,EAApB,CAAuB,CACrE,EAAS,GAAG,CAAC,EAAE,IAAI,EACnB,EAAM,IAAI,CAAC,EAAE,IAAI,EAGvB,CAEA,IAAM,EAA0F,EAAE,CAClG,IAAK,IAAM,KAAO,EAAU,CAC1B,GAAY,UAAR,GAA2B,QAAR,EAAe,SACtC,IAAM,EAAO,EAAS,KAAK,CAAC,IAAI,CAAC,AAAC,GAAM,EAAE,EAAE,GAAK,GACjD,GAAI,CAAC,EAAM,SACX,IAAM,EAAW,OAAQ,EAAiC,IAAI,EAAI,EAAK,EAAE,EAEzE,EAAK,IAAI,CAAC,CAAE,OAAQ,EAAK,WAAU,UAAW,SAAU,UAAW,MAAO,GAC1E,EAAK,IAAI,CAAC,CAAE,OAAQ,WAAK,EAAU,UAAW,OAAQ,UAAW,MAAO,GAExE,IAAM,EAAO,EAAiC,MAAM,CAC9C,EAAe,GAAK,aAC1B,GAAI,MAAM,OAAO,CAAC,GAChB,IAAK,IAAM,IADoB,CACf,EAAc,CAC5B,IAAM,EAAO,OAAO,EAAE,IAAI,EAAI,IAAI,IAAI,GACjC,GAAiB,WAAT,GAA8B,QAAQ,CAAjB,GAClC,EAAK,IAAI,CAAC,CAAE,OAAQ,EAAK,WAAU,UAAW,EAAM,UAAW,OAAO,EAAE,IAAI,EAAI,OAAQ,EAC1F,CAEJ,CACA,OAAO,CACT,CAGA,MAAO,CDaJ,SAAS,AACd,CAAoB,CACpB,CAAqC,CACrC,CAAqB,EAGrB,IAAM,EAAW,IAAI,IACf,EAAQ,CAAC,EAAc,CAC7B,KAAO,EAAM,MAAM,CAAG,GAAG,CACvB,IAAM,EAAS,EAAM,KAAK,GAC1B,IAAK,IAAM,KAAQ,EACb,EAAK,EADe,AACb,GAAK,GAAW,EAAS,GAAG,CAAC,CAAd,CAAmB,IAAI,GAAG,CAClD,EAAS,GAAG,CAAC,EAAK,IAAI,EACtB,EAAM,IAAI,CAAC,EAAK,IAAI,EAG1B,CAKA,MAAO,IAHU,EACd,MAAM,CAAC,AAAC,GAAO,EAAS,GAAG,CAAC,IAAc,UAAP,GAAyB,QAAP,GACrD,GAAG,CAAE,AAAD,GAAQ,CAAC,EAAE,EAAE,EAAG,SAAS,CAAC,KACT,EAAmB,CAC7C,ECnCkC,EAAiB,EAAe,GAC3D,MAAM,CAAC,GAAK,EAAE,QAAQ,CAAC,YAAc,EAAE,UAAU,CAAC,OAClD,GAAG,CAAC,IACH,IAAM,EAAQ,EAAE,KAAK,CAAC,EAAG,CAAC,GACpB,CADwB,CACf,EAAM,OAAO,CAAC,GADe,EAEtC,EAAS,EAAM,SAAS,CAAC,EAAG,GAClC,MAAO,QAAE,EAAQ,SAAU,EAAQ,UAAW,SAAU,UAAW,MAAO,CAC5E,EACJ,EAAG,CAAC,EAAU,EAAiB,EAAe,EAAc,EAEtD,EAAkB,CAAA,EAAA,EAAA,OAAO,AAAP,EAAQ,KAC9B,IAAM,EAA8G,CAAC,EACrH,IAAK,IAAM,KAAK,EAAmB,CACjC,IAAM,EAAM,EAAE,MAAM,CAAG,IAAM,EAAE,QAAQ,AACnC,CAAC,CAAM,CAAC,EAAI,GAAE,CAAM,CAAC,EAAI,CAAG,CAAE,OAAQ,EAAE,MAAM,CAAE,SAAU,EAAE,QAAQ,CAAE,OAAQ,EAAE,CAAC,EACrF,CAAM,CAAC,EAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAE,KAAM,EAAE,SAAS,CAAE,KAAM,EAAE,SAAS,AAAC,EACjE,CACA,OAAO,OAAO,MAAM,CAAC,EACvB,EAAG,CAAC,EAAkB,EAEtB,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACR,SAAS,EAAe,CAAiB,EACnC,EAAgB,OAAO,EAAI,CAAC,EAAgB,OAAO,CAAC,QAAQ,CAAC,EAAM,MAAM,GAAW,AACtF,GAAc,EAElB,CACA,GAAI,EAEF,OADA,GADc,MACL,gBAAgB,CAAC,YAAa,GAChC,IAAM,SAAS,mBAAmB,CAAC,YAAa,EAE3D,EAAG,CAAC,EAAW,EAEf,IAAM,EAAiB,AAAC,IACtB,IAAM,EAAW,EAAU,OAAO,CAClC,GAAI,CAAC,EAAU,CAEb,EAAa,CAAE,OAAQ,EAAO,MAAM,EAAI,CAAD,CAAQ,MAAM,CAAG,IAAM,EAAA,CAAE,CAAI,CAAS,GAC7E,GAAc,GACd,MACF,CACA,IAAM,EAAQ,EAAS,cAAc,CAC/B,EAAM,EAAS,YAAY,CAC3B,EAAe,EAAS,KAAK,CAEnC,EAAa,CAAE,OADG,CACK,CADQ,SAAS,CAAC,EAAG,GAAS,EAAW,EAAa,SAAS,CAAC,EACtD,GACjC,WAAW,KACT,EAAS,KAAK,GACd,IAAM,EAAS,EAAQ,EAAS,MAAM,CACtC,EAAS,iBAAiB,CAAC,EAAQ,EACrC,EAAG,GACH,GAAc,EAChB,EAEA,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACZ,GACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qFACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,yGAA6G,4BAK/H,CAAC,GAAyC,IAA9B,EAAmB,MAAM,EAAU,EAAU,MAAM,CAAG,GACjE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gGACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,uBAAc,kDAC7B,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,UACC,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,UAAO,qBAET,EAAU,IAAI,CAAC,GAAK,EAAE,KAAK,EAAE,SAAS,aACrC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,UAAI,kFAEN,EAAU,IAAI,CAAC,GAAK,EAAE,KAAK,EAAE,SAAS,iBACrC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,UAAI,yEAEP,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WAAI,KACD,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,KAAK,wCAAwC,OAAO,SAAS,IAAI,WAAW,UAAU,wDAA+C,oCAQjJ,CAAC,GAAgC,IAArB,EAAU,MAAM,EAC3B,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,4DACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oEACb,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,2DAAkD,8CAC/D,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,2DACb,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,UAAE,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,UAAO,qBACX,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,WAAE,KAAE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,KAAK,wCAAwC,OAAO,SAAS,IAAI,WAAW,UAAU,6DAAoD,2CAClJ,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,WAAE,KAAE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,KAAK,oCAAoC,OAAO,SAAS,IAAI,WAAW,UAAU,6DAAoD,yCAC9I,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,WAAE,KAAE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,KAAK,kDAAkD,OAAO,SAAS,IAAI,WAAW,UAAU,6DAAoD,+CAOlK,CAAC,GAAW,EAAU,MAAM,CAAG,GAC/B,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,aAC1F,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,EAAO,QAAQ,CACtB,SAAU,AAAC,GAAM,EAAa,CAAE,SAAU,EAAE,MAAM,CAAC,KAAK,AAAC,GACzD,UAAU,2HAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,gBAAO,8BACpB,EAAU,GAAG,CAAC,AAAC,GACd,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAyB,MAAO,EAAS,EAAE,WACzC,EAAS,IAAI,CACb,EAAS,SAAS,CACd,EAAS,MAAM,EAAI,EAAS,MAAM,CAAC,MAAM,CAAG,EAC1C,CAAC,EAAE,EAAE,EAAS,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAClC,KAEH,QAPO,EAAS,EAAE,MAY3B,GACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,2BACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,6DAAmD,aACrD,EAAiB,cAAc,CAAC,IAAI,CAAC,MAC/C,EAAiB,MAAM,EAAI,EAAiB,MAAM,CAAC,MAAM,CAAG,GAC3D,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,iBAAO,aAAW,EAAiB,MAAM,CAAC,IAAI,CAAC,YAGlE,EAAiB,KAAK,EACrB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,4FACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uBAAc,uBAAyB,IAAE,EAAiB,KAAK,IAExD,WAAxB,EAAiB,EAAE,EAAiB,EAAiB,KAAK,CAAC,QAAQ,CAAC,mBACnE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,iBAAO,uEACiD,IACrE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,KAAK,kDAAkD,OAAO,SAAS,IAAI,WAAW,UAAU,qDAA4C,qBAK1H,WAAxB,EAAiB,EAAE,EAAiB,EAAiB,KAAK,CAAC,QAAQ,CAAC,aACnE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,iBAAO,6DACuC,IAC3D,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,KAAK,oCAAoC,OAAO,SAAS,IAAI,WAAW,UAAU,qDAA4C,uBAKpI,EAAiB,EAAE,CAAC,UAAU,CAAC,UAC9B,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,iBAAO,6DACuC,IAC3D,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,KAAK,wDAAwD,OAAO,SAAS,IAAI,WAAW,UAAU,qDAA4C,8BAarK,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,WAC1F,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qBACb,CAAA,EAAA,EAAA,GAAA,EAAC,WAAA,CACC,IAAK,EACL,MAAO,EAAO,MAAM,CACpB,SAAU,AAAC,GAAM,EAAa,CAAE,OAAQ,EAAE,MAAM,CAAC,KAAM,AAAD,GACtD,YAAY,sDACZ,KAAM,EACN,UAAU,+HAIZ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yBAAyB,IAAK,YAC3C,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,EAAc,CAAC,GAC9B,UAAU,uKACV,MAAM,2BAEL,SAGF,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,2JACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gBACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0GAAiG,YAG/G,EAAgB,GAAG,CAAC,CAAC,UAAE,CAAQ,MAAE,CAAI,CAAE,GACtC,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAEC,KAAK,SACL,QAAS,IAAM,EAAe,GAC9B,UAAU,uKAEV,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,IAC7B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uEACb,MAPE,OAaV,EAAgB,GAAG,CAAC,GACnB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0GACZ,EAAM,QAAQ,GAEhB,EAAM,MAAM,CAAC,GAAG,CAAC,IAChB,IAAM,EAAW,CAAC,EAAE,EAAE,EAAM,MAAM,CAAC,CAAC,EAAE,EAAM,IAAI,CAAC,EAAE,CAAC,CAC9C,EAAa,AAAe,WAAT,IAAI,CAAc,gBACX,SAAf,EAAM,IAAI,CAAc,iBACT,SAAf,EAAM,IAAI,CAAc,iBAAmB,gBAE5D,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAEC,KAAK,SACL,QAAS,IAAM,EAAe,GAC9B,UAAU,uKAEV,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,IAC7B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAW,CAAC,8CAA8C,EAAE,EAAA,CAAY,UAC3E,EAAM,IAAI,KAPR,CAAA,EAAG,EAAM,MAAM,CAAC,CAAC,EAAE,EAAM,IAAI,CAAA,CAAE,CAW1C,KAvBQ,EAAM,MAAM,GA2BI,IAA3B,EAAgB,MAAM,EACrB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,6FAWrF,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qCACZ,OAAO,OAAO,CAAC,GAAkB,GAAG,CAAC,CAAC,CAAC,EAAK,EAAS,GACpD,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAEC,QAAS,IAAM,EAAa,CAAE,OAAQ,CAAS,GAC/C,UAAU,sGACV,KAAK,kBAEJ,GALI,MASX,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,iEAAwD,oFAMnD,UAArB,EAAO,SAAS,EACf,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mCACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,SAC1F,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,EAAO,IAAI,EAAI,YACtB,SAAU,AAAC,GAAM,EAAa,CAAE,KAAM,EAAE,MAAM,CAAC,KAAK,AAAC,GACrD,UAAU,2HAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,qBAAY,uBAC1B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,qBAAY,0BAC1B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,qBAAY,yBAC1B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,mBAAU,iCAI3B,GAAkB,KAAO,UACxB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,YAC1F,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,EAAO,OAAO,EAAI,WACzB,SAAU,AAAC,GAAM,EAAa,CAAE,QAAS,EAAE,MAAM,CAAC,KAAK,AAAsB,GAC7E,UAAU,2HAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,oBAAW,aACzB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,cAAK,8BAO5B,GAAkB,KAAO,UAAiC,UAArB,EAAO,SAAS,EACpD,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,UAC1F,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,EAAO,KAAK,EAAI,UACvB,SAAU,AAAC,GAAM,EAAa,CAAE,MAAO,EAAE,MAAM,CAAC,KAAK,AAAwB,GAC7E,UAAU,2HAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,mBAAU,YACxB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,iBAAQ,gBAMN,UAArB,EAAO,SAAS,EACf,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mCACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,iBAC1F,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,EAAO,YAAY,EAAI,OAC9B,SAAU,AAAC,GAAM,EAAa,CAAE,aAAc,EAAE,MAAM,CAAC,KAAK,AAAC,GAC7D,UAAU,2HAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,gBAAO,qBACrB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,gBAAO,oBACrB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,eAAM,iBACpB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,eAAM,mBACpB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,eAAM,mBACpB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,gBAAO,2BAGzB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,aAC5F,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,OACL,MAAO,EAAO,QAAQ,EAAI,KAC1B,SAAW,AAAD,GAAO,EAAa,CAAE,SAAU,EAAE,MAAM,CAAC,KAAK,AAAC,GACzD,YAAY,gBACZ,UAAU,mHAEX,GAAkB,oBACjB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uEACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,OACN,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,WACE,EAAiB,IAAI,CAAC,KAAG,EAAiB,mBAAmB,CAAC,UAAU,CAAC,IAAE,EAAiB,mBAAmB,CAAC,UAAU,CAAC,cAClH,EAAiB,mBAAmB,CAAC,cAAc,CAAC,WAIlE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,iEAAwD,kDAS5E,CAAsB,UAArB,EAAO,SAAS,EAAqC,UAArB,EAAO,SAAS,AAAK,CAAO,EAC5D,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,yCACf,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,WACL,SAAkC,IAAzB,EAAO,aAAa,EAAsC,SAAzB,EAAO,aAAa,CAC9D,SAAU,AAAC,GAAM,EAAa,CAAE,cAAe,EAAE,MAAM,CAAC,OAAO,AAAC,GAChE,UAAU,iFAEZ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,oFAA2E,uBAC3F,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,uEAA8D,wFAQlF,EAAO,MAAM,CAAG,GACf,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,4FACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,4BAAmB,0BAClC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,uBACZ,EAAO,GAAG,CAAC,CAAC,EAAO,IAClB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WAAgB,KAAG,IAAV,WAOxB,CCxfA,IAAA,EAAA,EAAA,CAAA,CAAA,OAEO,SAAS,EAAkB,MAAE,CAAI,CAAqB,SAC3D,AAAK,EAEE,CAAA,CAFH,CAEG,CAFI,CAEJ,YAAA,AAAY,EACjB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mCACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,sEAEf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,sEACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oIACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qEAA4D,iCAI3E,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,sEACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,+GAKrB,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,UAAO,CAAC;;;;;;MAMT,CAAC,MAEH,SAAS,IAAI,EA1BG,IA4BpB,CJsCA,SAAS,EAAuB,CAC9B,mBAAiB,UACjB,CAAQ,eACR,CAAa,UACb,CAAQ,CAMT,EACC,GAAM,CAAC,EAAQ,EAAU,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC/B,EAAc,CAAA,EAAA,EAAA,MAAA,AAAM,EAAiB,MAErC,EAAY,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IAAM,CAxElC,SAAS,AACP,CAAkB,CAClB,CAAc,EAEd,IAAM,EAA6F,EAAE,CAG/F,EAAW,IAAI,IACf,EAAQ,CAAC,EAAO,CAChB,EAAU,IAAI,IAEpB,KAAO,EAAM,MAAM,CAAG,GAAG,CACvB,IAAM,EAAY,EAAM,KAAK,GAC7B,IAAI,EAAQ,GAAG,CAAC,GAGhB,IAAK,IAAM,CAHiB,IAC5B,EAAQ,GAAG,CAAC,GAEQ,EAAG,KAAK,EAAI,EAAE,CAAG,CAC/B,EAAK,EAAE,GAAK,GAAc,EAAS,GAAG,CAAC,EAAK,EAAnB,EAAuB,GAAK,EAAK,IAAI,GAAK,IACrE,EAAS,EADoE,CACjE,CAAC,EAAK,IAAI,EACtB,EAAM,IAAI,CAAC,EAAK,IAAI,EAG1B,CAGA,IAAK,IAAM,KAAc,EAAU,CACjC,IAAM,EAAe,EAAG,KAAK,CAAC,IAAI,CAAC,GAAK,EAAE,EAAE,GAAK,GACjD,GAAI,CAAC,EAAc,SAEnB,IAAM,EAAW,EAAa,IAAI,EAAI,EAChC,EAAS,EAAa,MAAM,EAAmC,UAA/B,OAAO,EAAa,MAAM,EAAiB,CAAC,MAAM,OAAO,CAAC,EAAa,MAAM,EAAI,EAAa,MAAM,CAA8B,CAAC,EAGzK,EAAU,IAAI,CACZ,CAAE,OAAQ,WAAY,EAAU,UAAW,SAAU,UAAW,MAAO,EACvE,CAAE,OAAQ,WAAY,EAAU,UAAW,OAAQ,UAAW,MAAO,GAIvE,IAAM,EAAe,EAAO,YAAY,CACxC,GAAI,MAAM,OAAO,CAAC,GAChB,IAAK,IAAM,IADoB,CACX,EACd,EAAM,IAAI,EAAE,GADgB,KAE9B,AADsB,EACZ,IAAI,CAAC,CACb,OAAQ,WACR,EACA,UAAW,EAAM,IAAI,CAAC,IAAI,GAC1B,UAAW,EAAM,IAAI,EAAI,MAC3B,EAIR,CAEA,OAAO,EACT,EAiBuD,EAAU,GAAgB,CAAC,EAAU,EAAc,EAGlG,EAAkB,CAAA,EAAA,EAAA,OAAA,AAAO,EAC7B,IAAM,CACJ,CAAE,SAAU,aAAc,KAAM,MAAO,EACvC,CAAE,SAAU,oBAAqB,KAAM,MAAO,EAC9C,CAAE,SAAU,kBAAmB,KAAM,MAAO,EAC5C,CAAE,SAAU,cAAe,KAAM,MAAO,EACxC,CAAE,SAAU,WAAY,KAAM,MAAO,EACtC,CACD,EAAE,EAIJ,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACR,SAAS,EAAmB,CAAiB,EACvC,EAAY,OAAO,EAAI,CAAC,EAAY,OAAO,CAAC,QAAQ,CAAC,EAAM,MAAM,GAAW,AAC9E,GAAU,EAEd,CACA,GAAI,EAEF,MAFU,CACV,SAAS,gBAAgB,CAAC,YAAa,GAChC,IAAM,SAAS,mBAAmB,CAAC,YAAa,EAE3D,EAAG,CAAC,EAAO,EAEX,IAAM,EAAiB,AAAC,IACtB,IAAM,EAAW,EAAkB,OAAO,CAC1C,GAAI,EAAU,CACZ,IAAM,EAAQ,EAAS,cAAc,CAC/B,EAAM,EAAS,YAAY,CAC3B,EAAe,EAAS,KAAK,CAC7B,EAAW,EAAa,SAAS,CAAC,EAAG,GAAS,EAAW,EAAa,SAAS,CAAC,GAGlF,IACF,EAAS,GAGT,CAJY,UAID,KACT,EAAS,KAAK,GACd,IAAM,EAAe,EAAQ,EAAS,MAAM,CAC5C,EAAS,iBAAiB,CAAC,EAAc,EAC3C,EAAG,GAEP,CACA,GAAU,EACZ,EAGM,EAAmB,EAAU,MAAM,CAAC,CAAC,EAAQ,KACjD,IAAM,EAAM,CAAA,EAAG,EAAS,MAAM,CAAC,CAAC,EAAE,EAAS,QAAQ,CAAA,CAAE,CAKrD,OAJI,AAAC,CAAM,CAAC,EAAI,EAAE,CAChB,CAAM,CAAC,EAAI,CAAG,CAAE,OAAQ,EAAS,MAAM,CAAE,SAAU,EAAS,QAAQ,CAAE,OAAQ,EAAE,CAAC,EAEnF,CAAM,CAAC,EAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAE,KAAM,EAAS,SAAS,CAAE,KAAM,EAAS,SAAS,AAAC,GACtE,CACT,EAAG,CAAC,GAEJ,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yBAAyB,IAAK,YAC3C,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,EAAU,CAAC,GAC1B,UAAU,uKACV,MAAM,2BAEL,SAGF,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,2JACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gBACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0GAAiG,YAG/G,EAAgB,GAAG,CAAC,CAAC,CAAE,UAAQ,MAAE,CAAI,CAAE,GACtC,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAEC,KAAK,SACL,QAAS,IAAM,EAAe,GAC9B,UAAU,uKAEV,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,IAC7B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uEACb,MAPE,OAaV,OAAO,MAAM,CAAC,GAAkB,GAAG,CAAC,GACnC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0GACZ,EAAM,QAAQ,GAEhB,EAAM,MAAM,CAAC,GAAG,CAAC,IAChB,IAAM,EAAW,CAAC,EAAE,EAAE,EAAM,MAAM,CAAC,CAAC,EAAE,EAAM,IAAI,CAAC,EAAE,CAAC,CAC9C,EAAa,AAAe,WAAT,IAAI,CAAc,gBACX,SAAf,EAAM,IAAI,CAAc,iBACT,SAAf,EAAM,IAAI,CAAc,iBAAmB,gBAE5D,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAEC,KAAK,SACL,QAAS,IAAM,EAAe,GAC9B,UAAU,uKAEV,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,IAC7B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAW,CAAC,8CAA8C,EAAE,EAAA,CAAY,UAC3E,EAAM,IAAI,KAPR,CAAA,EAAG,EAAM,MAAM,CAAC,CAAC,EAAE,EAAM,IAAI,CAAA,CAAE,CAW1C,KAvBQ,EAAM,MAAM,GA2BF,IAArB,EAAU,MAAM,EACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,yFASvF,CAEA,SAAS,EAAyB,OAChC,CAAK,CACL,eAAa,CACb,UAAQ,eACR,CAAa,WACb,CAAS,aACT,CAAW,YACX,CAAU,CASX,EACC,IAAM,EAAM,CAAA,EAAA,EAAA,MAAA,AAAM,EAAsB,MACxC,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qBACb,CAAA,EAAA,EAAA,GAAA,EAAC,WAAA,CACC,IAAK,EACL,MAAO,EACP,SAAU,AAAC,GAAM,EAAc,EAAE,MAAM,CAAC,KAAK,EAC7C,UAAW,EACX,YAAa,EACb,WAAY,IAEd,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,kBAAmB,EACnB,SAAU,EACV,cAAe,EACf,SAAU,AAAC,GAAa,EAAc,OAI9C,CAGA,SAAS,EAAmB,cAC1B,CAAY,CACZ,UAAQ,CAIT,EACC,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,6BAG1F,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,iEAAwD,wDAGvE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACZ,EAAa,GAAG,CAAC,CAAC,EAAO,IACxB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAgB,UAAU,oCACzB,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EAAM,IAAI,CACjB,SAAW,AAAD,IACR,IAAM,EAAkB,IAAI,EAAa,CACzC,CAAe,CAAC,EAAM,CAAG,CAAE,GAAG,CAAK,CAAE,KAAM,EAAE,MAAM,CAAC,KAAK,AAAC,EAC1D,EAAS,EACX,EACA,UAAU,6GACV,YAAY,eAEd,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,EAAM,IAAI,CACjB,SAAU,AAAC,IACT,IAAM,EAAU,EAAE,MAAM,CAAC,KAAK,CACxB,EAAkB,IAAI,EAAa,CACzC,CAAe,CAAC,EAAM,CAAG,CAAE,GAAG,CAAK,CAAE,KAAM,CAAQ,EACnD,EAAS,EACX,EACA,UAAU,gHAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,gBAAO,SACrB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,gBAAO,SACrB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,gBAAO,YAEvB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,KAEP,EADwB,EAAa,KAC5B,CADkC,CAAC,CAAC,EAAG,IAAM,IAAM,GAE9D,EACA,UAAU,kGACX,QAhCO,IAqCZ,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,KAEP,EADwB,IAAI,EAAc,CAAE,AACnC,KADyC,GAAI,KAAM,MAAgB,EAAE,CAEhF,EACA,UAAU,mGACX,qBAMT,CAUA,SAAS,EAAS,CAAc,CAAE,CAAkB,EAClD,MAAO,CAAC,YAAY,EAAE,EAAO,CAAC,EAAE,EAAA,CAAY,AAC9C,CAEe,SAAS,EAAsB,QAC5C,CAAM,YACN,CAAU,OACV,CAAK,gBACL,CAAc,CAMf,EACC,IAwmEkC,EACA,EACA,EACA,EAEA,EAaA,EAeA,EAsCA,EACA,EAaA,EACA,EAKA,EACA,QAMA,IAOA,IA5UN,IAnNV,IAGA,EACA,EACA,EACA,IAxrDZ,EAAS,CAAA,EAAA,EAAA,SAAA,AAAS,IAClB,CAAC,EAAM,EAAQ,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAoB,UAC9C,CAAC,EAAQ,EAAU,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC/B,CAAC,EAAQ,EAAU,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAY,CAAE,KAAM,SAAU,GAC5D,CAAC,EAAa,EAAe,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAiB,IACjD,CAAC,GAAmB,GAAqB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EACxD,QAEI,CAAC,GAAkB,GAAoB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IAC3D,GAAiB,CAAA,EAAA,EAAA,MAAM,AAAN,EAAgC,MAEjD,CAAC,GAAgB,GAAkB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAG/C,CAAC,GAAM,GAAQ,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,GAM3B,GAAY,CAAA,EAAA,EAAA,MAAM,AAAN,EAA8B,MAC1C,CAAC,GAAgB,GAAkB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IACvD,CAAC,GAAU,GAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAoD,MAEtF,CAAC,GAAY,GAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAI1C,CAAE,KAAM,QAAS,GACb,CAAC,GAAmB,GAAqB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IAE7D,CAAC,GAAQ,GAAU,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAA+C,EAAE,EAC/E,CAAC,GAAa,GAAe,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IAEjD,CAAC,GAAkB,GAAoB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAwE,EAAE,EAC5H,CAAC,GAAuB,GAAyB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IACrE,CAAC,GAAiB,GAAmB,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAmB,EAAE,EAC7D,CAAC,GAAsB,GAAwB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IAGnE,CAAC,GAAc,GAAgB,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAmB,EAAE,EACvD,CAAC,GAAkB,GAAoB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAuD,CAAC,GAC1G,CAAC,GAAqB,GAAuB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAIzD,CAAC,GAAiB,GAAmB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAA+G,CAAC,GAChK,CAAC,GAAwB,GAA0B,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAA0B,CAAC,GAMzF,GAAgC,AAAC,IACrC,IAAM,EAAI,OAAO,GAAc,IAAI,KAAK,CAAC,+BACzC,OAAO,EAAI,CAAC,CAAC,EAAE,CAAC,WAAW,GAAK,IAClC,EAEM,GAAoB,AAAC,GAClB,OAAO,GAAc,IAAI,WAAW,GAAG,OAAO,CAAC,eAAgB,IAAI,OAAO,CAAC,SAAU,IAExF,GAAc,CAAC,EAAa,IAAqB,CAAA,EAAG,EAAI,EAAE,EAAE,GAAkB,GAAA,CAAW,CACzF,CAAC,GAAe,GAAiB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAA0B,CAAC,GAEvE,GAAqC,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IAC1C,iCAAiC,IAAI,CAAC,OAAO,IAAyB,KAC5E,CAAC,GAAsB,EAGpB,CAAC,GAAc,GAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAW,EAAE,EACvD,CAAC,GAAqB,GAAuB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACzD,CAAC,GAAgB,GAAkB,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,GAAS,GAC/C,CAAC,GAAmB,GAAqB,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAS,IACrD,CAAC,GAAuB,GAAyB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IAGrE,CAAC,GAAa,GAAe,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,GAAS,GACzC,CAAC,GAAW,GAAa,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IAC7C,CAAC,GAAc,GAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAA0B,CAAC,GAErE,CAAC,GAAiB,GAAmB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACjD,CAAC,GAAiB,GAAmB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACjD,CAAC,GAAkB,GAAoB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IAM3D,CAAC,GAAc,GAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC3C,CAAC,GAAmB,GAAqB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACrD,CAAC,GAAgB,GAAkB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC/C,CAAC,GAAe,GAAiB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IAErD,CAAC,GAAW,GAAa,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACrC,CAAC,GAAa,GAAe,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACzC,CAAC,GAAa,GAAe,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAA0C,OAElF,CAAC,GAAa,GAAe,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACzC,CAAC,GAAW,GAAa,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACrC,CAAC,GAAc,GAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IAkEjD,SAAS,GAAS,CAAU,EAC1B,OAAO,CAAQ,GAAmB,UAAb,OAAO,GAAkB,CAAC,MAAM,OAAO,CAAC,EAC/D,CAEA,SAAS,GAAsB,CAAU,EAGvC,GAAI,CAAC,GAAS,GAAI,OAAO,KACzB,IAAM,EAAQ,GAAS,EAAE,KAAK,EAAI,EAAE,KAAK,CAAG,KAC5C,GAAI,CAAC,EAAO,OAAO,KAEnB,IAAM,EAAU,OAAO,EAAM,OAAO,EAAI,IAAI,IAAI,GAChD,GAAI,CAAC,EAAS,OAAO,KAErB,IAAM,EAAiB,OAAO,EAAE,OAAO,EAAI,IAAI,IAAI,GAC7C,EAAY,OAAO,EAAM,SAAS,EAAI,IAAI,IAAI,GAC9C,EAAO,GAAS,EAAM,IAAI,EAAI,EAAM,IAAI,CAAG,KAC3C,EAAO,EAAO,OAAO,EAAK,IAAI,EAAI,IAAI,IAAI,GAAK,GAC/C,EAAS,EAAO,OAAO,EAAK,EAAE,EAAI,IAAI,IAAI,GAAK,GAC/C,EAAS,GAAU,EAEzB,GAAI,CAAC,EAAQ,OAAO,KAKpB,IAAM,EAAK,IAAmB,EAAY,CAAA,EAAG,EAAQ,OAAxB,EAAiC,EAAE,EAAA,CAAW,CAAG,CAAA,EAAG,EAAQ,CAAC,EAAE,EAAK,CAAC,EAAE,EAAA,CAAA,AAAQ,EAEtG,EAAQ,CAAC,EAAQ,CAKvB,OAJI,GAAgB,EAAM,IAAI,CAAC,GAC3B,GAAW,EAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAA,CAAW,EAC5C,GAAQ,GAAQ,EAAM,IAAI,CAAC,CAAA,EAAG,EAAK,CAAC,EAAE,EAAA,CAAQ,EAE3C,IAAE,EAAI,MAAO,EAAM,IAAI,CAAC,eAAQ,SAAS,CAAO,CACzD,CAlGA,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACR,CAAC,UACC,GAAI,CACF,GAAI,EAAO,CACT,IAAM,EAAS,eAAe,OAAO,CAAC,EAAS,EAAQ,IACvD,GAAI,EAAQ,YACV,EAAU,CAAE,KAAM,QAAS,SAAU,CAAO,GAgB9C,IAAM,EAAO,KAAK,SAAS,CAXK,AAWJ,CAV1B,OAAQ,0BACR,GAAI,EACJ,KAAM,eACN,SAAU,MACV,MAAO,CACL,CAAE,GAAI,QAAS,KAAM,QAAS,KAAM,QAAS,EAAG,GAAI,EAAG,GAAI,OAAQ,CAAC,CAAE,EACtE,CAAE,GAAI,MAAO,KAAM,MAAO,KAAM,MAAO,EAAG,IAAK,EAAG,GAAI,OAAQ,CAAC,CAAE,EAClE,CACD,MAAO,CAAC,CAAE,GAAI,KAAM,KAAM,QAAS,GAAI,KAAM,EAAE,AACjD,EACqC,KAAM,GAAK,KAChD,EAAU,CAAE,KAAM,QAAS,SAAU,CAAK,GAC1C,GAAI,CACF,eAAe,OAAO,CAAC,EAAS,EAAQ,GAAa,EACvD,CAAE,KAAM,CAER,CACA,MACF,CAEA,IAAM,EAAM,MAAM,MAChB,CAAC,4BAA4B,EAAE,mBAAmB,GAAQ,IAAI,EAAE,mBAAmB,GAAA,CAAa,CAChG,CAAE,MAAO,UAAW,GAEhB,EAAQ,MAAM,EAAI,IAAI,GAC5B,GAAI,CAAC,EAAI,EAAE,EAAI,CAAC,EAAK,EAAE,CAAE,MAAM,AAAI,MAAM,EAAK,KAAK,EAAI,2BACvD,EAAU,CAAE,KAAM,QAAS,SAAU,KAAK,SAAS,CAAC,EAAK,QAAQ,CAAE,KAAM,GAAK,IAAK,EACrF,CAAE,MAAO,EAAY,CACnB,EAAU,CAAE,KAAM,QAAS,MAAO,aAAa,MAAQ,EAAE,OAAO,CAAG,OAAO,EAAG,EAC/E,EACF,CAAC,EACH,EAAG,CAAC,EAAQ,EAAY,EAAM,EAE9B,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACR,CAAC,UACC,GAAe,IACf,GAAI,CACF,IAAM,EAAM,MAAM,MAAM,cAAe,CAAE,MAAO,UAAW,GACrD,EAAQ,MAAM,EAAI,IAAI,GAC5B,GAAI,CAAC,EAAI,EAAE,CAAE,MAAM,AAAI,MAAM,EAAK,KAAK,EAAI,EAAK,OAAO,EAAI,yBAE3D,IAAM,EADO,AACI,OADE,OAAO,CAAC,EAAK,MAAM,EAAI,EAAK,MAAM,CAAG,EAAA,AAAE,EAEvD,GAAG,CAAC,AAAC,IAAO,AAAD,CAAG,GAAI,OAAO,EAAE,EAAE,EAAI,IAAI,IAAI,GAAI,aAAwC,UAA1B,OAAO,EAAE,YAAY,CAAgB,EAAE,YAAY,MAAG,EAAU,CAAC,EAC5H,MAAM,CAAC,AAAC,GAAM,EAAE,EAAE,EAAI,EAAE,EAAE,CAAC,UAAU,CAAC,CAAA,EAAG,EAAO,CAAC,CAAC,GACrD,GAAU,EACZ,CAAE,MAAO,EAAY,CACnB,GAAe,aAAa,MAAQ,EAAE,OAAO,CAAG,OAAO,IACvD,GAAU,EAAE,CACd,EACF,CAAC,EACH,EAAG,CAAC,EAAO,EAsCX,CAAA,EAAA,EAAA,SAAS,AAAT,EAAU,KACR,CAAC,UACC,GAAyB,IACzB,GAAI,CACF,IAAM,EAAM,MAAM,MAAM,yBAA0B,CAAE,MAAO,UAAW,GAChE,EAAQ,MAAM,EAAI,IAAI,GAC5B,GAAI,CAAC,EAAI,EAAE,EAAI,CAAY,MAAP,EAAE,CAAY,MAAM,AAAI,MAAM,EAAK,KAAK,EAAI,2BAGhE,IAAM,EAAS,CADF,MAAM,OAAO,CAAC,EAAK,QAAQ,EAAI,EAAK,QAAQ,CAAG,EAAA,AAAE,EAC1C,GAAG,CAAC,IAAuB,MAAM,CAAC,SACtD,GAAoB,EACtB,CAAE,MAAO,EAAY,CACnB,GAAyB,aAAa,MAAQ,EAAE,OAAO,CAAG,OAAO,IACjE,GAAoB,EAAE,CACxB,EACF,CAAC,EACH,EAAG,EAAE,EAEL,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACR,CAAC,UACC,GAAwB,IACxB,GAAI,CACF,IAAM,EAAM,MAAM,MAAM,8BAA+B,CAAE,MAAO,UAAW,GACrE,EAAQ,MAAM,EAAI,IAAI,GAC5B,GAAI,CAAC,EAAI,EAAE,GAAgB,IAAZ,EAAK,EAAE,CAAY,MAAM,AAAI,MAAM,EAAK,KAAK,EAAI,gCAEhE,IAAM,EAAU,MAAM,OAAO,CAAC,EAAK,MAAM,EACrC,MAAM,IAAI,CAAC,IAAI,IAAI,EAAK,MAAM,CAAC,GAAG,CAAC,AAAC,GAAM,OAAO,GAAK,IAAI,IAAI,IAAI,MAAM,CAAC,WACzE,EAAE,CACN,GAAmB,EACrB,CAAE,MAAO,EAAY,CACnB,GAAwB,aAAa,MAAQ,EAAE,OAAO,CAAG,OAAO,IAChE,GAAmB,EAAE,CACvB,EACF,CAAC,EACH,EAAG,EAAE,EAEL,IAAM,GAAiB,CAAA,EAAA,EAAA,WAAW,AAAX,EAAY,UAMjC,GAAa,IACb,GAAe,IACf,GAAI,CACF,IAAM,EAAM,MAAM,MAAM,iBAAkB,CAAE,MAAO,UAAW,GACxD,EAAQ,MAAM,EAAI,IAAI,GAC5B,GAAI,CAAC,EAAI,EAAE,GAAgB,IAAZ,EAAK,EAAE,CAAY,MAAM,AAAI,MAAM,EAAK,KAAK,EAAI,4BAChE,IAAM,EAAO,MAAM,OAAO,CAAC,EAAK,IAAI,EAAI,EAAK,IAAI,CAAG,EAAE,CAEhD,EAA+B,CAAC,EACtC,IAAK,IAAM,KAAK,EAAM,CAQpB,GAAI,CAAC,GAAO,CAAC,AAAQ,EAAI,OAAO,CAAG,SAGnC,IAAM,EAAU,OAAO,EAAI,IAAI,EAAI,IAC7B,EAAa,OAAO,EAAI,OAAO,EAAE,SAAW,IAElD,GAAI,CAAC,CADgB,EAAQ,UAAU,CAAC,qBAAuB,EAAW,QAAQ,CAAC,cAAA,EAChE,SAKnB,IAAM,EAAY,EAAQ,KAAK,CAAC,gCAChC,GAAI,GAAW,CAAC,EAAE,CAAE,CAClB,CAAG,CAAC,CAAS,CAAC,EAAE,CAAC,EAAG,EACpB,QACF,CAGA,IAAM,EAAW,EAAW,KAAK,CAAC,sBAClC,GAAI,GAAU,CAAC,EAAE,CAAE,CACjB,CAAG,CAAC,CAAQ,CAAC,EAAE,CAAC,EAAG,EACnB,QACF,CAGA,IAAM,EAAU,OAhCJ,AAgCW,EAAI,OAAO,EAAI,IAAI,IAAI,GAC1C,GAAuB,QAAQ,CAApB,IACb,CAAG,CAAC,EAAQ,EAAG,CAAA,CAEnB,CAEA,OADA,GAAgB,GACT,CACT,CAAE,MAAO,EAAY,CAGnB,OAFA,GAAa,aAAa,MAAQ,EAAE,OAAO,CAAG,OAAO,IACrD,GAAgB,CAAC,GACV,CAAC,CACV,QAAU,CACR,IAAe,EACjB,CACF,EAAG,EAAE,EAEL,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACH,IACP,EAAG,CAAC,GAAe,EAEnB,IAAM,GAAS,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KACrB,GAAoB,UAAhB,EAAO,IAAI,CAAc,MAAO,CAAE,GAAI,KAA+B,IAAK,EAAG,EACjF,GAAI,CAEF,MAAO,CAAE,GADE,KAAK,KAAK,CAAC,EAAO,QAAQ,EACxB,IAAK,EAAG,CACvB,CAAE,MAAO,EAAY,CACnB,MAAO,CAAE,GAAI,KAAM,IAAK,aAAa,MAAQ,EAAE,OAAO,CAAG,OAAO,EAAG,CACrE,CACF,EAAG,CAAC,EAAO,EAEL,GAAa,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IACpB,AAAL,GAAY,CAAR,CAAU,CACP,ACtoBJ,CDqoBa,QCroBmB,AAAvB,CAAyC,EACvD,IAAM,EAAmB,EAAE,CACrB,EAAqB,EAAE,CAEX,4BAAd,EAAG,MAAM,EAAgC,EAAO,IAAI,CAAC,CAAC,4CAA4C,EAAE,OAAO,EAAG,MAAM,EAAE,CAAC,CAAC,EACxH,AAAC,OAAO,EAAG,EAAE,EAAI,IAAI,IAAI,IAAI,EAAO,IAAI,CAAC,kBACzC,AAAC,OAAO,EAAG,IAAI,EAAI,IAAI,IAAI,IAAI,EAAO,IAAI,CAAC,oBAE/C,IAAM,EAA0B,MAAM,OAAO,CAAC,EAAG,KAAK,EAAI,EAAG,KAAK,CAAG,EAAE,CACjE,EAA0B,MAAM,OAAO,CAAC,EAAG,KAAK,EAAI,EAAG,KAAK,CAAG,EAAE,CACjE,EAAoC,MAAM,OAAO,CAAC,EAAG,QAAQ,EAAI,EAAG,QAAQ,CAAG,EAAE,CAEjF,EAAU,EAAM,GAAG,CAAC,AAAC,GAAM,OAAO,GAAG,IAAM,IAAI,IAAI,IAAI,MAAM,CAAC,SAChE,EAAQ,MAAM,GAAK,EAAM,MAAM,EAAE,EAAO,IAAI,CAAC,sCAC7C,EAAU,KAAa,EAAQ,MAAM,EAAE,EAAO,IAAI,CAAC,2BAEvD,IAAM,EAAU,EAAM,GAAG,CAAC,AAAC,GAAM,OAAO,GAAG,IAAM,IAAI,IAAI,IAAI,MAAM,CAAC,SAChE,EAAQ,MAAM,GAAK,EAAM,MAAM,EAAE,EAAO,IAAI,CAAC,sCAC7C,EAAU,KAAa,EAAQ,MAAM,EAAE,EAAO,IAAI,CAAC,2BAEvD,IAAM,EAAY,IAAI,IAAI,GAC1B,IAAK,IAAM,KAAK,EAAO,CACrB,IAAM,EAAO,OAAO,GAAG,MAAQ,IAAI,IAAI,GACjC,EAAK,OAAO,GAAG,IAAM,IAAI,IAAI,GACnC,GAAI,CAAC,GAAQ,CAAC,EAAI,CAChB,EAAO,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,GAAG,IAAM,gBAAgB,kBAAkB,CAAC,EACvE,QACF,CACI,AAAC,EAAU,GAAG,CAAC,IAAO,EAAO,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,+BAA+B,EAAE,EAAA,CAAM,EAC9F,AAAC,EAAU,GAAG,CAAC,IAAK,EAAO,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,6BAA6B,EAAE,EAAA,CAAI,CAC9F,CAEA,IAAM,EAAS,EAAM,MAAM,CAAE,AAAD,GAAkB,UAAX,EAAE,IAAI,EACnC,EAAO,EAAM,MAAM,CAAE,AAAD,GAAkB,QAAX,EAAE,IAAI,EAKvC,IAAK,IAAM,KAJP,AAAC,EAAO,MAAM,EAAE,EAAS,IAAI,CAAC,uBAC9B,EAAO,MAAM,CAAG,GAAG,EAAS,IAAI,CAAC,4FACjC,AAAC,EAAK,MAAM,EAAE,EAAS,IAAI,CAAC,qBAEhB,GACd,GAAI,AAAW,GADS,QAClB,IAAI,CAAa,EACjB,AAAC,OAAO,EAAE,EAAE,EAAI,IAAI,IAAI,IAAI,EAAO,IAAI,CAAC,2BACvC,OAAO,EAAE,IAAI,EAAI,IAAI,IAAI,IAlDV,AAmDX,CAAC,GAnDP,AAJO,OAAO,AAuDS,EAAE,IAAI,EAvDP,IAC1B,IAAI,GACJ,KAAK,CAAC,OACN,MAAM,CAAC,SACG,MAAM,EAmDoB,EAAS,IAAI,CAAC,CAAC,aAAa,EAAE,OAAO,EAAE,EAAE,EAAE,sBAAsB,EAAE,OAAO,EAAE,IAAI,EAAA,CAAG,EADpF,EAAO,IAAI,CAAC,CAAC,aAAa,EAAE,OAAO,EAAE,EAAE,EAAI,gBAAgB,aAAa,CAAC,EAE3G,IAAM,EAAK,EAAE,EAAE,CAAG,OAAO,EAAE,EAAE,EAAE,IAAI,GAAK,GAGpC,GAAa,QAAP,GAAgB,CAAC,EAAG,QAAQ,CAAC,MAAM,AAC3C,EAAS,IAAI,CAAC,CAAC,aAAa,EAAE,OAAO,EAAE,EAAE,EAAE,wCAAwC,EAAE,OAAO,EAAE,EAAE,EAAA,CAAG,CAEvG,CAIF,IAAM,EAAO,EAAG,IAAI,EAAuB,UAAnB,OAAO,EAAG,IAAI,EAAiB,CAAC,MAAM,OAAO,CAAC,EAAG,IAAI,EAAK,EAAG,IAAI,CAA+B,CAAC,EACnH,EAAgB,OAAO,EAAK,cAAc,EAAI,IAAI,IAAI,GAC5D,IAAK,IAAM,KAAK,EAAO,CACrB,GAAe,mBAAX,EAAE,IAAI,CAAuB,SACjC,IAAM,EAAM,EAAE,MAAM,EAAwB,UAApB,OAAO,EAAE,MAAM,EAAiB,CAAC,MAAM,OAAO,CAAC,EAAE,MAAM,EAAK,EAAE,MAAM,CAA+B,CAAC,EACtH,EAAS,OAAO,EAAI,MAAM,EAAI,EAAI,MAAM,EAAI,IAAI,IAAI,GACpD,EAAW,OAAO,EAAI,QAAQ,EAAI,EAAI,OAAO,EAAI,IAAI,IAAI,EAE3D,CAAC,GAAW,GACd,EAAS,EADI,EACA,CAAC,CAAC,IADc,gBACM,EAAE,OAAO,EAAE,EAAE,EAAE,uEAAuE,CAAC,GAExH,GAAW,GAAa,IAAd,GAAqB,EAAR,AAAa,gBAAgB,EAAI,IAAI,IAAI,IAAI,AACtE,EAAS,IAAI,CAAC,CAAC,oBAAoB,EAAE,OAAO,EAAE,EAAE,EAAE,0FAA0F,CAAC,CAEjJ,CAEA,MAAO,QAAE,WAAQ,CAAS,CAC5B,EDgkBkC,GAAO,EAAE,EADhB,CAAE,OAAQ,EAAE,CAAE,SAAU,EAAE,AAAa,EAE7D,CAAC,GAAO,EAAE,CAAC,EAER,GAAe,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KAC3B,IAAM,EAAK,GAAO,EAAE,CACpB,GAAI,CAAC,EACH,EADO,IACA,CACL,sBAAuB,EAAE,CACzB,iBAAkB,EAAE,CACpB,oBAAqB,EAAE,CACvB,IAAI,CACN,EAGF,IAAM,EAAiB,CAAC,EAAG,KAAK,EAAI,EAAA,AAAE,EAAE,MAAM,CAC5C,AAAC,GAAM,AAAW,YAAT,IAAI,EAA2B,QAAX,EAAE,IAAI,EAAyB,mBAAX,EAAE,IAAI,EAGnD,EAAwB,EAC3B,MAAM,CAAC,AAAC,GAGA,CAAC,AADQ,OAAO,CADX,EAAE,MAAM,EAAwB,UAApB,OAAO,EAAE,MAAM,EAAiB,CAAC,MAAM,OAAO,CAAC,EAAE,MAAM,EAAK,EAAE,MAAM,CAA+B,EAAC,EACjG,OAAO,EAAI,IAAI,IAAI,IAG/C,GAAG,CAAC,AAAC,GAAM,EAAE,EAAE,EAEZ,EAAmB,MAAM,IAAI,CACjC,IAAI,IACF,EACG,GAAG,CAAC,AAAC,GAEG,OAAO,CADF,EAAE,MAAM,EAAwB,UAApB,OAAO,EAAE,MAAM,EAAiB,CAAC,MAAM,OAAO,CAAC,EAAE,MAAM,EAAK,EAAE,MAAM,CAA+B,EAAC,EAC1G,OAAO,EAAI,IAAI,IAAI,IAEtC,MAAM,CAAC,WAIR,EAAsB,EAAiB,MAAM,CAAE,AAAD,GAAQ,CAAC,EAAY,CAAC,EAAG,EAMvE,EAAoB,CAAuB,KAHpC,EAAG,IAAI,EAAuB,UAAnB,OAAO,EAAG,IAAI,EAAiB,CAAC,MAAM,OAAO,CAAC,EAAG,IAAI,EACxE,EAAG,IAAI,CACR,EAAC,EAC0B,aAAa,CAEtC,EAA+C,IAA/B,EAAoB,MAAM,EAAU,IAAgB,EACpE,EAAsC,IAAjC,EAAsB,MAAM,EAAU,EACjD,MAAO,uBACL,mBACA,sBACA,oBACA,KACA,CACF,CACF,EAAG,CAAC,GAAO,EAAE,CAAE,GAAc,GAAa,EAE1C,SAAS,GAAY,CAAoB,EACvC,IAAM,EAAO,KAAK,SAAS,CAAC,EAAM,KAAM,GAAK,KAE7C,GADA,EAAU,CAAE,KAAM,QAAS,SAAU,CAAK,GACtC,EACF,GAAI,CACF,CAFO,cAEQ,OAAO,CAAC,EAAS,EAAQ,GAAa,EACvD,CAAE,KAAM,CAER,CAEJ,CAEA,eAAe,KACb,GAAoB,SAAS,CAAzB,EAAO,IAAI,EACV,GAAO,EAAE,EAAE,CACZ,GAAO,GAAG,EAAE,CACZ,GAAW,MAAM,CAAC,MAAM,EAAE,AAE9B,GAAU,GACV,EAAe,IACf,GAAqB,QACrB,GAAoB,IAEpB,GAAI,CAEF,IAAM,EAAM,MAAM,MAAM,uBAAwB,CAC9C,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,QAAE,EAAQ,SAAU,GAAO,EAAE,AAAC,EACrD,GACM,EAAQ,MAAM,EAAI,IAAI,GAC5B,GAAI,CAAC,EAAI,EAAE,EAAI,CAAC,EAAK,EAAE,CAAE,MAAM,AAAI,MAAM,EAAK,KAAK,EAAI,2BAGvD,GAAI,CACF,eAAe,UAAU,CAAC,EAAS,EAAQ,GAC7C,CAAE,KAAM,CAER,CAGA,GAAI,GAAO,EAAE,CAAC,QAAQ,EAAE,OACtB,CAD8B,EAC1B,CACF,GAAqB,WACrB,IAAM,EAAa,MAAM,MAAM,+BAAgC,CAC7D,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,CACnB,OAAQ,cACR,EACA,WAAY,GAAO,EAAE,CAAC,EAAE,CACxB,SAAU,GAAO,EAAE,CAAC,QAAQ,EAAI,EAAE,AACpC,EACF,GACM,EAAe,MAAM,EAAW,IAAI,GAEtC,EAAW,EAAE,EAAI,EAAY,EAAE,EAAE,AACnC,GAAqB,WAErB,WAAW,IAAM,GAAqB,QAAS,OAE/C,GAAqB,SACrB,GAAoB,EAAY,KAAK,EAAI,2BAE7C,CAAE,MAAO,EAAY,CACnB,GAAqB,SACrB,GAAoB,aAAa,MAAQ,EAAE,OAAO,CAAG,0BACvD,CAEJ,CAAE,MAAO,EAAY,CACnB,EAAe,aAAa,MAAQ,EAAE,OAAO,CAAG,OAAO,GACzD,QAAU,CACR,GAAU,EACZ,EACF,CAmBA,GAAoB,YAAhB,EAAO,IAAI,CAAgB,MAAO,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,kBAAS,aAC9D,GAAoB,UAAhB,EAAO,IAAI,CAAc,MAAO,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,kBAAU,EAAO,KAAK,GAGzE,IAAM,GAAU,CAAmB,MACjC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wFACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,sCAA6B,+BAC5C,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uDAA6C,oDACT,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gBAAO,aAAe,cAEzF,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uDAA6C,mBAC1C,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gBAAO,qCAAuC,YAAU,IACxF,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gBAAO,6BAA+B,UAGxD,KAGJ,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wEACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,4CACb,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CACC,KAAM,CAAC,OAAO,EAAE,mBAAmB,GAAQ,cAAc,CAAC,CAC1D,UAAU,4IACX,SAGD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oBACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+EACZ,EAAW,oBAEd,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gEAAsD,SAAO,WAIhF,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8CACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mEACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,EAAQ,UACvB,UACW,WAAT,EACI,gFACA,+GAEP,WAGD,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,EAAQ,QACvB,UACW,SAAT,EACI,gFACA,+GAEP,YAKH,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,IAAK,GACL,KAAK,OACL,OAAO,yBACP,UAAU,SACV,SAAU,MAAO,IACf,IAAM,EAAO,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,CAGhC,GADA,CACI,CADF,MAAM,CAAC,KAAK,CAAG,GACZ,GAEL,EAAe,CAFJ,GAGX,GAAI,CACF,IAAM,EAAO,MAAM,EAAK,IAAI,GACtB,EAAO,KAAK,KAAK,CAAC,GAExB,GADA,EAAU,CAAE,KAAM,QAAS,SAAU,KAAK,SAAS,CAAC,EAAM,KAAM,GAAK,IAAK,GACtE,EACF,GAAI,CACF,CAFO,cAEQ,OAAO,CAAC,EAAS,EAAQ,GAAa,KAAK,SAAS,CAAC,EAAM,KAAM,GAAK,KACvF,CAAE,KAAM,CAER,CAEJ,CAAE,MAAO,EAAc,CACrB,EAAe,aAAe,MAAQ,EAAI,OAAO,CAAG,OAAO,GAC7D,EACF,IAGF,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,SAAU,EACV,QAAS,IAAM,GAAe,OAAO,EAAE,QACvC,UAAU,4LACX,WAID,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,SAAU,CAAC,GAAO,EAAE,GAAI,CAAQ,GAAO,GAAG,EAAK,GAAW,MAAM,CAAC,MAAM,CAAG,EAC1E,QAxHV,CAwHmB,QAxHV,EACP,GAAI,CAAC,GAAO,EAAE,EACV,GAAO,GAAG,EAAE,AACZ,GAAW,MAAM,CAAC,MAAM,CAFZ,CAEc,MAE9B,IAAM,EAAW,CAAA,EAAG,GAAO,EAAE,CAAC,EAAE,EAAI,EAAW,cAAc,CAAC,CACxD,EAAO,IAAI,KAAK,CAAC,KAAK,SAAS,CAAC,GAAO,EAAE,CAAE,KAAM,GAAK,KAAK,CAAE,CAAE,KAAM,kBAAmB,GACxF,EAAM,IAAI,eAAe,CAAC,GAC1B,EAAI,SAAS,aAAa,CAAC,KACjC,EAAE,IAAI,CAAG,EACT,EAAE,QAAQ,CAAG,EACb,SAAS,IAAI,CAAC,WAAW,CAAC,GAC1B,EAAE,KAAK,GACP,EAAE,MAAM,GACR,IAAI,eAAe,CAAC,EACtB,EA0GU,UAAU,4LACX,WAID,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,SAAU,GAAU,CAAC,GAAO,EAAE,GAAI,CAAQ,GAAO,GAAG,EAAK,GAAW,MAAM,CAAC,MAAM,CAAG,EACpF,QAAS,GACT,UAAU,yIAET,EAAS,UAAY,eAO3B,GAEA,GAAO,GAAG,CACT,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qGAA2F,qBACrF,GAAO,GAAG,IAE7B,KACH,CAAC,GAAO,GAAG,EAAI,GAAW,MAAM,CAAC,MAAM,CACtC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,4FACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,uBAAc,+BAC7B,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,yCACX,GAAW,MAAM,CAAC,GAAG,CAAC,AAAC,GACtB,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,UAAY,GAAJ,SAIb,KAEH,AAAC,GAAO,GAAG,EAAK,EAAD,CAAY,MAAM,CAAC,MAAM,GAAI,GAAW,QAAQ,CAAC,MAAM,CASnE,KARF,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qGACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,uBAAc,iCAC7B,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,yCACX,GAAW,QAAQ,CAAC,GAAG,CAAE,AAAD,GACvB,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,UAAY,GAAJ,SAMhB,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,2FACZ,IAED,KAEJ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sCACH,SAAT,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,WAAA,CACC,MAAO,EAAO,QAAQ,CACtB,SAAU,AAAC,IACT,IAAM,EAAI,EAAE,MAAM,CAAC,KAAK,CAExB,GADA,EAAU,CAAE,KAAM,QAAS,SAAU,CAAE,GACnC,EACF,GAAI,CACF,CAFO,cAEQ,OAAO,CAAC,EAAS,EAAQ,GAAa,EACvD,CAAE,KAAM,CAER,CAEJ,EACA,UAAU,oJAGZ,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CACC,IAAK,GACL,UAAU,iEACV,QAAS,AAAC,IAER,GAAI,CAAC,EAAE,OAAO,EAAI,CAAC,EAAE,OAAO,CAAE,OAC9B,EAAE,cAAc,GAChB,IAAM,EAAM,EAAE,MAAM,CAAG,EAAI,CAAC,EAAI,EAChC,GAAQ,AAAC,GACM,KAAK,GAAG,CAAC,GAAU,KAAK,GAAG,CAAC,IAAU,KAAK,KAAK,CAAC,AAAC,GAAI,IAAM,CAAS,CAAT,AAAa,IAAM,KAGhG,EACA,QAAS,AAAC,IACR,GAAwB,aAApB,GAAW,IAAI,CAAiB,OACpC,IAAM,EAAK,GAAO,EAAE,CACpB,GAAI,CAAC,EAAI,OACT,IAAM,EAAK,GAAU,OAAO,CAC5B,GAAI,CAAC,EAAI,OAGT,IAAM,EAAS,EAAE,MAAM,CACvB,GAAI,GAAU,EAAO,OAAO,CAAC,sBAAuB,OAEpD,IAAM,EAAO,EAAG,qBAAqB,GAC/B,EAAS,CAAC,EAAE,OAAO,CAAG,EAAK,IAAI,CAAG,EAAG,UAAA,AAAU,EAAI,GACnD,EAAS,CAAC,EAAE,OAAO,CAAG,EAAK,GAAG,CAAG,EAAG,SAAA,AAAS,EAAI,GAEjD,EAAO,GAAW,QAAQ,CAAC,OAAO,CAAC,iBAAkB,KACrD,EAAO,IAAI,IAAI,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAM,EAAE,EAAE,GACzC,EAAI,EACJ,EAAK,CAAA,EAAG,EAAK,CAAC,EAAE,EAAA,CAAG,CACvB,KAAO,EAAK,GAAG,CAAC,IAAK,AACnB,IACA,EAAK,CAAA,EAAG,EAAK,CAAC,EAAE,EAAA,CAAG,CAGrB,IAAM,EAAI,KAAK,GAAG,CAAC,EAAG,EAAS,IACzB,EAAI,KAAK,GAAG,CAAC,EAAG,EAAS,IAEzB,EAAgB,AAAY,GAAW,QAAQ,IACjD,EEp7BT,CAAE,GAAG,CAAgB,CAAC,AFo7BM,GAAW,QAAQ,CEp7BhB,CAAC,aAAa,AAAC,EFq7BrC,CAAC,EAEC,EAA4C,IAChD,EACA,KAAM,GAAW,QAAQ,CACzB,KAAM,IACN,IACA,EACA,OAAQ,CACV,EAEA,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,IAAI,EAAG,KAAK,CAAE,EAAU,AAAD,GACnD,GAAkB,GAClB,GAAc,CAAE,KAAM,QAAS,EACjC,WAEA,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,WAAW,MAAO,CAAE,MAAO,KAAO,GAAM,OAAQ,KAAO,EAAK,YAEzE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CACC,UACE,GACI,sHACA,iHAGN,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oDACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAW,GAAiB,SAAW,gGAAwF,UACpI,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAW,GAAiB,SAAW,oCAC1C,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,GAAQ,AAAC,GAAM,KAAK,GAAG,CA5rB3C,AA4rB4C,GAAU,KAAK,KAAK,CAAC,CAAC,EA1rBjE,EA0rBqE,CAAS,CAAI,IAAM,KACpF,UAAU,6HACV,MAAM,qCACP,MAGD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sFAA6E,KAAK,KAAK,CAAQ,IAAP,IAAY,OACnH,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,GAAQ,AAAC,GAAM,KAAK,GAAG,CApsB3C,AAosB4C,IAAU,KAAK,KAAK,CAAC,CAAC,IAAI,CAAS,CAAI,IAAM,KACpF,UAAU,6HACV,MAAM,oCACP,SAKH,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,GAAkB,AAAC,GAAM,CAAC,GACzC,UAAU,6HACV,MAAO,GAAiB,SAAW,oBAElC,GAAiB,IAAM,YAI7B,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,iDAEX,CACE,CACE,IAAK,SACL,MAAO,SACP,OAA4B,WAApB,GAAW,IAAI,CACvB,QAAS,KACP,GAAc,CAAE,KAAM,QAAS,GAC/B,GAAqB,GACvB,EACA,KACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,QAAQ,YAAY,UAAU,UAAU,KAAK,OAAO,cAAY,gBACnE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,EAAE,yBAAyB,OAAO,eAAe,YAAY,MAAM,eAAe,WAG9F,EACA,CACE,IAAK,UACL,MAAO,UACP,OAA4B,YAApB,GAAW,IAAI,CACvB,QAAS,KAEP,GAAe,AAAD,GAAmB,YAAX,EAAE,IAAI,CAAiB,CAAE,KAAM,QAAS,EAAI,CAAE,KAAM,SAAU,GACpF,GAAqB,GACvB,EACA,KACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,QAAQ,YAAY,UAAU,UAAU,KAAK,OAAO,cAAY,iBACnE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,EAAE,mDAAmD,OAAO,eAAe,YAAY,MAAM,cAAc,UACjH,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,EAAE,oDAAoD,OAAO,eAAe,YAAY,MAAM,cAAc,YAGxH,EACA,CACE,IAAK,MACL,MAAO,MACP,OAA4B,aAApB,GAAW,IAAI,EAA2C,QAAxB,GAAW,QAAQ,CAC7D,QAAS,KACP,GAAc,CAAE,KAAM,WAAY,SAAU,KAAM,GAClD,GAAqB,GACvB,EACA,KACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,QAAQ,YAAY,UAAU,UAAU,KAAK,OAAO,cAAY,gBACnE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,EAAE,iEAAiE,OAAO,eAAe,YAAY,MAAM,eAAe,WAGtI,EACA,CACE,IAAK,OACL,MAAO,OACP,OAAQ,AAAoB,gBAAT,IAAI,EAA2C,AAAxB,YAAW,QAAQ,CAC7D,QAAS,KACP,GAAc,CAAE,KAAM,WAAY,SAAU,MAAO,GACnD,GAAqB,GACvB,EACA,KACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,QAAQ,YAAY,UAAU,UAAU,KAAK,OAAO,cAAY,iBACnE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,EAAE,sCAAsC,OAAO,eAAe,YAAY,MAAM,eAAe,UACrG,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,EAAE,kDAAkD,OAAO,eAAe,YAAY,MAAM,eAAe,YAGvH,EACA,CACE,IAAK,YACL,MAAO,KACP,OAA4B,aAApB,GAAW,IAAI,EAA2C,cAAxB,GAAW,QAAQ,CAC7D,QAAS,KACP,GAAc,CAAE,KAAM,WAAY,SAAU,WAAY,GACxD,GAAqB,GACvB,EACA,KACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,QAAQ,YAAY,UAAU,UAAU,KAAK,OAAO,cAAY,iBACnE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,EAAE,yBAAyB,OAAO,eAAe,YAAY,MAAM,cAAc,UACvF,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,EAAE,iBAAiB,OAAO,eAAe,YAAY,MAAM,cAAc,QAAQ,eAAe,YAG5G,EACA,CACE,IAAK,QACL,MAAO,QACP,OAA4B,aAApB,GAAW,IAAI,EAA2C,UAAxB,GAAW,QAAQ,CAC7D,QAAS,KACP,GAAc,CAAE,KAAM,WAAY,SAAU,OAAQ,GACpD,GAAqB,GACvB,EACA,KACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,QAAQ,YAAY,UAAU,UAAU,KAAK,OAAO,cAAY,iBACnE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,EAAE,cAAc,OAAO,eAAe,YAAY,MAAM,cAAc,QAAQ,eAAe,UACnG,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,EAAE,uBAAuB,OAAO,eAAe,YAAY,MAAM,cAAc,YAG3F,EACA,CACE,IAAK,WACL,MAAO,WACP,OAA4B,aAApB,GAAW,IAAI,EAA2C,mBAAxB,GAAW,QAAQ,CAC7D,QAAS,KACP,GAAc,CAAE,KAAM,WAAY,SAAU,gBAAiB,GAC7D,GAAqB,GACvB,EACA,KACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,QAAQ,YAAY,UAAU,UAAU,KAAK,OAAO,cAAY,gBACnE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,EAAE,kBAAkB,OAAO,eAAe,YAAY,MAAM,cAAc,QAAQ,eAAe,WAG7G,EACA,CACE,IAAK,MACL,MAAO,MACP,OAA4B,AAApB,gBAAW,IAAI,EAA2C,QAAxB,GAAW,QAAQ,CAC7D,QAAS,KACP,GAAc,CAAE,KAAM,WAAY,SAAU,KAAM,GAClD,GAAqB,GACvB,EACA,KACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,QAAQ,YAAY,UAAU,UAAU,KAAK,OAAO,cAAY,gBACnE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,EAAE,kBAAkB,OAAO,eAAe,YAAY,MAAM,eAAe,WAGvF,EACA,CACE,IAAK,cACL,MAAO,QACP,OAA4B,aAApB,GAAW,IAAI,EAA2C,gBAAxB,GAAW,QAAQ,CAC7D,QAAS,KACP,GAAc,CAAE,KAAM,WAAY,SAAU,aAAc,GAC1D,GAAqB,GACvB,EACA,KACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,QAAQ,YAAY,UAAU,UAAU,KAAK,OAAO,cAAY,iBACnE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,EAAE,4EAA4E,OAAO,eAAe,YAAY,MAAM,eAAe,UAC3I,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,EAAE,qCAAqC,KAAK,iBAClD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,EAAE,oCAAoC,OAAO,eAAe,YAAY,MAAM,cAAc,QAAQ,eAAe,YAG/H,EACA,CACE,IAAK,cACL,MAAO,QACP,OAA4B,aAApB,GAAW,IAAI,EAA2C,gBAAxB,GAAW,QAAQ,CAC7D,QAAS,KACP,GAAc,CAAE,KAAM,WAAY,SAAU,aAAc,GAC1D,GAAqB,GACvB,EACA,KACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,QAAQ,YAAY,UAAU,UAAU,KAAK,OAAO,cAAY,iBACnE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,EAAE,6DAA6D,OAAO,eAAe,YAAY,MAAM,cAAc,QAAQ,eAAe,UAClJ,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,EAAE,YAAY,OAAO,eAAe,YAAY,MAAM,cAAc,QAAQ,eAAe,UACjG,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,EAAE,6BAA6B,OAAO,eAAe,YAAY,MAAM,cAAc,QAAQ,eAAe,YAGxH,EACA,CACE,IAAK,UACL,MAAO,UACP,OAA4B,aAApB,GAAW,IAAI,EAA2C,YAAxB,GAAW,QAAQ,CAC7D,QAAS,KACP,GAAc,CAAE,KAAM,WAAY,SAAU,SAAU,GACtD,GAAqB,GACvB,EACA,KACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,QAAQ,YAAY,UAAU,UAAU,KAAK,OAAO,cAAY,iBACnE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,EAAE,WAAW,OAAO,eAAe,YAAY,MAAM,cAAc,UACzE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,EAAE,gBAAgB,OAAO,eAAe,YAAY,MAAM,cAAc,QAAQ,eAAe,UACrG,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,EAAE,UAAU,OAAO,eAAe,YAAY,MAAM,cAAc,YAG9E,EACD,CACD,GAAG,CAAC,AAAC,GACL,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAEC,KAAK,SACL,QAAS,EAAE,OAAO,CAClB,UACE,EAAE,MAAM,CACJ,sGACA,gJAEN,MAAO,EAAE,KAAK,CACd,aAAY,EAAE,KAAK,UAElB,EAAE,IAAI,EAXF,EAAE,GAAG,KAgBhB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wCACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,KACP,GAAc,CAAE,KAAM,QAAS,GAC/B,GAAqB,GACvB,EACA,UACsB,WAApB,GAAW,IAAI,CACX,+EACA,kIAEP,WAGD,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,KACP,GAAc,CAAE,KAAM,SAAU,GAChC,GAAqB,GACvB,EACA,UACsB,YAApB,GAAW,IAAI,CACX,+EACA,yHAEN,MAAM,mEACP,YAIC,CACA,CAAE,EAAG,MAAO,MAAO,KAAM,EACzB,CAAE,EAAG,OAAQ,MAAO,MAAO,EAC3B,CAAE,EAAG,YAAa,MAAO,IAAK,EAC9B,CAAE,EAAG,QAAS,MAAO,OAAQ,EAC7B,CAAE,EAAG,iBAAkB,MAAO,SAAU,EACxC,CAAE,EAAG,cAAe,MAAO,UAAW,EACtC,CAAE,EAAG,cAAe,MAAO,UAAW,EACtC,CAAE,EAAG,UAAW,MAAO,WAAY,EACnC,CAAE,EAAG,MAAO,MAAO,KAAM,EAC1B,CAA0E,GAAG,CAAC,AAAC,GAC9E,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAEC,KAAK,SACL,QAAS,KACP,GAAc,CAAE,KAAM,WAAY,SAAU,EAAE,CAAC,AAAC,GAChD,GAAqB,GACvB,EACA,UACsB,aAApB,GAAW,IAAI,EAAmB,GAAW,QAAQ,GAAK,EAAE,CAAC,CACzD,+EACA,yHAEN,MAAM,2DACP,KACI,EAAE,KAAK,GAbL,EAAE,CAAC,MAmBf,CAAC,IAAkB,AAAoB,eAAT,IAAI,EAAkB,GACnD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+DAAqD,oBAAiB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,QAChH,KACH,AAAC,IAAsC,AAApB,gBAAW,IAAI,CAE/B,KADF,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+DAAqD,kCAA+B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,GAAW,QAAQ,GAAQ,YAG7J,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+CACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAW,GAAiB,SAAW,oDAC1C,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gGAAuF,WACtG,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,4DAAmD,mBAGnE,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,IAAkB,GACjC,UAAU,qJACV,MAAM,uBACN,aAAW,gCAEX,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,QAAQ,YAAY,UAAU,UAAU,KAAK,OAAO,cAAY,iBACnE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,EAAE,uBAAuB,OAAO,eAAe,YAAY,MAAM,cAAc,UACrF,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,EAAE,uBAAuB,OAAO,eAAe,YAAY,MAAM,cAAc,eAIzF,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACG,GAAc,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,yCAAiC,KAAqB,KACpF,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,sDACZ,GAAO,MAAM,CACZ,GAAO,GAAG,CAAC,AAAC,GACV,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAEC,SAAS,CAAA,CAAA,EACT,YAAa,AAAC,IACZ,EAAE,YAAY,CAAC,OAAO,CAAC,aAAc,EAAE,EAAE,EACzC,EAAE,YAAY,CAAC,aAAa,CAAG,MACjC,EACA,UAAU,qIACV,MAAO,EAAE,EAAE,UAEV,EAAE,YAAY,CAAG,EAAE,YAAY,CAAG,EAAE,EAAE,CAAC,OAAO,CAAC,CAAA,EAAG,EAAO,CAAC,CAAC,CAAE,KATzD,EAAE,EAAE,GAab,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wDAA+C,qCAQ1E,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,iCAAiC,MAAO,CAAE,UAAW,CAAC,MAAM,EAAE,GAAK,CAAC,CAAC,CAAE,gBAAiB,KAAM,YAC7G,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CACC,UAAU,6CACV,MAAO,KACP,OAAQ,KACR,MAAO,CAAE,SAAU,SAAU,WAE5B,CAAC,GAAO,EAAE,EAAE,OAAS,EAAA,AAAE,EAAE,GAAG,CAAC,AAAC,IAC7B,IAAM,EAAK,GAAO,EAAE,CACpB,GAAI,CAAC,EAAI,OAAO,KAChB,IAAM,EAAI,EAAG,KAAK,CAAC,IAAI,CAAC,AAAC,GAAM,EAAE,EAAE,GAAK,EAAE,IAAI,EACxC,EAAI,EAAG,KAAK,CAAC,IAAI,CAAC,AAAC,GAAM,EAAE,EAAE,GAAK,EAAE,EAAE,EAC5C,GAAI,CAAC,GAAK,CAAC,EAAG,OAAO,KACrB,IAAM,EAAK,CAAgB,UAAf,OAAO,EAAE,CAAC,CAAgB,EAAE,CAAC,CAAG,EAAA,CAAE,CAAI,GAC5C,EAAK,CAAgB,AAAf,iBAAO,EAAE,CAAC,CAAgB,EAAE,CAAC,CAAG,EAAA,CAAE,CAAI,GAC5C,EAAK,CAAgB,UAAf,OAAO,EAAE,CAAC,CAAgB,EAAE,CAAC,CAAG,EAAA,CAAE,CAAI,GAC5C,EAAK,CAAgB,UAAf,OAAO,EAAE,CAAC,CAAgB,EAAE,CAAC,CAAG,EAAA,CAAE,CAAI,GAClD,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAEC,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,OAAO,yBACP,YAAa,GANR,EAAE,EAAE,CASf,KAGD,CAAC,GAAO,EAAE,EAAE,OAAS,EAAA,AAAE,EAAE,GAAG,CAAC,CAAC,EAAG,KAChC,IAAM,EAAmB,UAAf,OAAO,EAAE,CAAC,CAAgB,EAAE,CAAC,CAAG,GAAK,AAAM,MAC/C,EAAmB,UAAf,OAAO,EAAE,CAAC,CAAgB,EAAE,CAAC,CAAG,GACpC,EAAW,KAAmB,EAAE,EAAE,CACxC,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAEC,KAAK,SACL,SAAU,EACV,eAAa,IACb,UAA+B,WAApB,GAAW,IAAI,EAAqC,YAApB,GAAW,IAAI,CAC1D,YAAa,AAAC,IAEY,UAAU,CAA9B,GAAW,IAAI,EACnB,EAAE,YAAY,CAAC,OAAO,CAAC,aAAc,GACvC,EACA,WAAY,AAAC,IAEP,EAAE,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,EAAE,cAAc,EACnE,EACA,OAAQ,AAAC,IACP,IAAM,EAAK,GAAO,EAAE,CACpB,GAAI,CAAC,EAAI,OACT,EAAE,cAAc,GAChB,EAAE,eAAe,GACjB,IAAM,EAAU,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,eAAiB,IAAI,IAAI,GACvE,GAAI,CAAC,EAAS,OAEd,IAAM,EAAY,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,IAC9B,GAAI,EAAK,EAAE,GAAK,EAAE,EAAE,CAAE,OAAO,EAC7B,IAAM,EAAM,EAAK,MAAM,EAA2B,AAAvB,iBAAO,EAAK,MAAM,EAAiB,CAAC,MAAM,OAAO,CAAC,EAAK,MAAM,EAAI,EAAK,MAAM,CAAG,CAAC,EAC3G,MAAO,CAAE,GAAG,CAAI,CAAE,OAAQ,CAAE,GAAG,CAAG,SAAE,CAAQ,CAAE,CAChD,GACA,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,CAAU,GACtC,GAAkB,EAAE,EAAE,CACxB,EACA,QAAS,AAAC,IACR,EAAE,eAAe,GACjB,IAAM,EAAK,GAAO,EAAE,CACpB,GAAI,AAAoB,eAAT,IAAI,CAAgB,CACjC,GAAI,CAAC,EAAI,OACT,GAAI,CAAC,GAAmB,CACtB,GAAqB,EAAE,EAAE,EACzB,GAAkB,EAAE,EAAE,EACtB,MACF,CAEA,IAAM,EAAK,EAAE,EAAE,CAEf,GADA,GAAqB,IACjB,CAAC,IAAQ,CAAC,GAAM,KAAS,GACd,CAAC,EAAG,KAAK,EAAI,EAAA,AAAE,EAAE,IAAI,CAAC,AAAC,GAAM,EAAE,IAAI,KAAK,EAAQ,EAAE,EAAE,GAAK,GADvC,OAGjC,IAAM,EAAK,CAAC,CAAC,EAAE,KAAK,GAAG,GAAA,CAAI,CAE3B,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,IAAK,EAAG,KAAK,EAAI,EAAE,CADG,IAAE,EAAI,KAP3C,MAOiD,CAAG,EACN,AAAC,GAE5D,GAAc,CAAE,KAAM,QAAS,GAC/B,MACF,CAEA,GAAkB,EAAE,EAAE,CACxB,EACA,cAAe,AAAC,IAEd,GAAwB,aAApB,GAAW,IAAI,EACF,GAAG,CAAhB,EAAE,MAAM,CADwB,OAEpC,IAAM,EAAK,GAAU,OAAO,CAC5B,GAAI,CAAC,EAAI,OACT,IAAM,EAAO,EAAG,qBAAqB,GACrC,GAAkB,EAAE,EAAE,EACtB,GAAI,CACF,EAAE,aAAa,CAAC,iBAAiB,CAAC,EAAE,SAAS,CAC/C,CAAE,KAAM,CAER,CACA,EAAE,cAAc,GAEhB,IAAM,EAAW,CAAC,EAAE,OAAO,CAAG,EAAK,IAAI,CAAG,EAAG,UAAA,AAAU,EAAI,GACrD,EAAW,CAAC,EAAE,OAAO,CAAG,EAAK,GAAG,CAAG,EAAG,SAAA,AAAS,EAAI,GACzD,GAAY,CAAE,OAAQ,EAAE,EAAE,CAAE,GAAI,EAAW,EAAG,GAAI,EAAW,CAAE,EACjE,EACA,YAAc,AAAD,IACX,GAAI,CACF,EAAE,aAAa,CAAC,qBAAqB,CAAC,EAAE,SAAS,CACnD,CAAE,KAAM,CAER,CACA,GAAY,KACd,EACA,cAAe,AAAC,IACd,GAAI,CAAC,IACD,GAAS,MAAM,GAAK,EAAE,EAAE,CADb,CACe,MAC9B,IAAM,EAAK,GAAO,EAAE,CACpB,GAAI,CAAC,EAAI,OACT,IAAM,EAAK,GAAU,OAAO,CAC5B,GAAI,CAAC,EAAI,OACT,IAAM,EAAO,EAAG,qBAAqB,GAC/B,EAAW,CAAC,EAAE,OAAO,CAAG,EAAK,IAAI,CAAG,EAAG,UAAA,AAAU,EAAI,GACrD,EAAW,CAAC,EAAE,OAAO,CAAG,EAAK,GAAG,CAAG,EAAG,SAAA,AAAS,EAAI,GACnD,EAAQ,EAAW,GAAS,EAAE,CAC9B,EAAQ,EAAW,GAAS,EAAE,CAC9B,EAAY,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAU,EAAK,EAAE,GAAK,EAAE,EAAE,CAAG,CAAE,GAAG,CAAI,CAAE,EAAG,EAAO,EAAG,CAAM,EAAI,GAE/F,EAAU,CAAE,KAAM,QAAS,SAAU,KAAK,SAAS,CAAC,AADvB,CAAE,GAAG,CAAE,CAAE,MAAO,CAAU,EACG,KAAM,GAAK,IAAK,EAC5E,EACA,UACE,EACI,4JACA,mJAEN,MAAO,CAAE,KAAM,EAAG,IAAK,EAAG,MAAO,GAAI,YAErC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACZ,AAAY,EAAE,IAAI,OACjB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mBACF,gBAAX,EAAE,IAAI,CAAqB,KAAO,OAG3B,YAAX,EAAE,IAAI,EACL,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mBAAU,MAE5B,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,2DAAmD,EAAE,IAAI,EAAI,EAAE,EAAE,MAElF,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,2FAAmF,EAAE,IAAI,GACvG,CAAC,KACA,IAAM,EAAM,EAAE,MAAM,EAAI,AAAoB,iBAAb,EAAE,MAAM,EAAiB,CAAC,MAAM,OAAO,CAAC,EAAE,MAAM,EAAK,EAAE,MAAM,CAA+B,KAG3H,GAAI,AAAY,EAAE,IAAI,OAAK,EAAK,CAC9B,IAAM,EAAS,OAAO,EAAI,MAAM,EAAI,IAAI,IAAI,GACtC,EAAW,OAAO,EAAI,QAAQ,EAAI,QACxC,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,6BACZ,GACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,6DAA6D,MAAO,YAAQ,IAClF,EAAO,MAAM,CAAG,GAAK,EAAO,SAAS,CAAC,EAAG,IAAM,MAAQ,EAAO,OAGzE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,6DAAmD,aACrD,OAInB,CAGA,GAAe,YAAX,EAAE,IAAI,EAAkB,EAAK,CAC/B,IAAM,EAAM,OAAO,EAAI,YAAY,EAAI,IAAI,IAAI,GACzC,EAAQ,OAAO,EAAI,gBAAgB,EAAI,IAAI,IAAI,GAC/C,EAAO,OAAO,EAAI,IAAI,EAAI,mBAChC,OAAO,EACL,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mEAAyD,KACnE,EAAK,EAAQ,CAAC,GAAG,EAAE,EAAA,CAAO,CAAG,GAC/B,AAAS,0BAAwB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uBAAuB,MAAM,wCAA+B,MAAW,QAEzH,IACN,CAGA,IAAM,EAAU,EAAM,OAAO,EAAI,OAAO,EAAI,IAAI,IAAI,GAAK,GACzD,GAAI,CAAC,EAAS,OAAO,KACrB,IAAM,EAAQ,EAAQ,OAAO,CAAC,CAAA,EAAG,EAAO,CAAC,CAAC,CAAE,IAC5C,MAAO,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mEAAyD,UAAQ,KACzF,CAAC,KA7JI,EAAE,EAAE,CAgKf,GAGC,AAAC,MACA,IAwNoB,MA6FN,EACA,QAIA,EACA,IAEA,EACA,EAEA,EAhUR,EAAK,GAAO,EAAE,CACpB,GAAI,CAAC,GACD,CAAC,GADI,OAAO,KAEhB,CADqB,GACf,EAAO,EADe,AACZ,KAAK,CAAC,IAAI,CAAC,AAAC,GAAM,EAAE,EAAE,GAAK,IAC3C,GAAI,CAAC,EAAM,OAAO,KAElB,IAAM,EAAsB,UAAlB,OAAO,EAAK,CAAC,CAAgB,EAAK,CAAC,CAAG,GAC1C,EAAsB,UAAlB,OAAO,EAAK,CAAC,CAAgB,EAAK,CAAC,CAAG,GAC1C,EAAM,EAAK,MAAM,EAA2B,UAAvB,OAAO,EAAK,MAAM,EAAiB,CAAC,MAAM,OAAO,CAAC,EAAK,MAAM,EAAK,EAAK,MAAM,CAA+B,CAAC,EAClI,EAAU,OAAO,EAAI,OAAO,EAAI,IAAI,IAAI,GACxC,EAAQ,OAAO,EAAI,KAAK,EAAI,IAAI,IAAI,GAE1C,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CACC,UAAU,sHACV,MAAO,CAAE,KAAM,EAAI,IAAK,IAAK,CAAE,YAE/B,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oDACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA2D,EAAK,IAAI,EAAI,EAAK,EAAE,GAC9F,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,GAAkB,IACjC,UAAU,sGACX,aAKH,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,2BACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,SAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,OAAO,EAAK,IAAI,EAAI,IAC3B,SAAU,AAAC,IACT,IAAM,EAAW,EAAE,MAAM,CAAC,KAAK,CAC/B,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,KAAM,CAAS,EAAI,EAAI,EACrG,EACA,UAAU,kHACV,YAAY,gBAIhB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,SAC1F,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,EAAK,IAAI,CAChB,SAAU,AAAC,IACT,IAAM,EAAW,EAAE,MAAM,CAAC,KAAK,CAC/B,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,KAAM,CAAS,EAAI,EAAI,EACrG,EACA,UAAU,4HAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,iBAAQ,UACtB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,eAAM,QACpB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,eAAM,QACpB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,gBAAO,SACrB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,qBAAY,cAC1B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,iBAAQ,UACtB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,0BAAiB,mBAC/B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,uBAAc,gBAC5B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,uBAAc,gBAC5B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,mBAAU,kBAI5B,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,YAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAU,AAAC,IACT,IAAM,EAAc,OAAO,EAAE,MAAM,CAAC,KAAK,EAAI,IAAI,IAAI,GAC/C,EAAU,CAAE,GAAG,CAAG,CAAE,GAAI,EAAc,CAAE,QAAS,CAAY,EAAI,CAAC,CAAC,AAAE,CACvE,CAAC,GAAa,OAAQ,EAAoC,OAAO,CACrE,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,OAAQ,CAAQ,EAAI,EAAI,EACtG,EACA,UAAU,kHACV,YAAY,6CAIf,AAAc,UAAT,IAAI,CACR,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,UAC1F,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,EACP,SAAU,AAAC,IACT,IAAM,EAAY,OAAO,EAAE,MAAM,CAAC,KAAK,EAAI,IAAI,IAAI,GAC7C,EAAU,CAAE,GAAG,CAAG,CAAE,GAAI,EAAY,CAAE,MAAO,CAAU,EAAI,CAAC,CAAC,AAAE,CACjE,CAAC,GAAW,OAAQ,EAAoC,KAAK,CACjE,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,OAAQ,CAAQ,EAAI,EAAI,EACtG,EACA,UAAU,4HAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,YAAG,6BAChB,GAAgB,GAAG,CAAC,AAAC,GACpB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAe,MAAO,WAAI,GAAd,OAGhB,GACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,4CAAkC,8BAA4B,MAC3E,QAEJ,KAEW,mBAAd,EAAK,IAAI,CACR,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,6DACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,oBAE1F,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,2BACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,aAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,OAAQ,EAAgC,QAAQ,EAAI,IAC3D,SAAU,AAAC,IACT,IAAM,EAAI,OAAO,EAAE,MAAM,CAAC,KAAK,EAAI,IAAI,IAAI,GACrC,EAAU,CAAE,GAAG,CAAG,CAAE,GAAI,EAAI,CAAE,SAAU,CAAE,EAAI,CAAC,CAAC,AAAE,CACpD,CAAC,GAAG,OAAQ,EAAoC,QAAQ,CAC5D,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,OAAQ,CAAQ,EAAI,EAAI,EACtG,EACA,UAAU,iHACV,YAAY,gBAIhB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,WAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,OAAQ,EAAgC,MAAM,EAAI,IACzD,SAAW,AAAD,IACR,IAAM,EAAI,OAAO,EAAE,MAAM,CAAC,KAAK,EAAI,IAAI,IAAI,GACrC,EAAU,CAAE,GAAG,CAAG,CAAE,GAAI,EAAI,CAAE,OAAQ,CAAE,EAAI,CAAC,CAAC,AAAE,CAClD,CAAC,GAAG,OAAQ,EAAoC,MAAM,CAC1D,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,OAAQ,CAAQ,EAAI,EAAI,EACtG,EACA,UAAU,iHACV,YAAY,4BAEd,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,iEAAwD,kDAGzE,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,+BAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,MAAO,OAAQ,EAAgC,eAAe,EAAI,IAClE,SAAU,EACV,cAAe,EAAK,EAAE,CACtB,cAAe,AAAC,IACd,IAAM,EAAU,CAAE,GAAG,CAAG,CAAE,GAAI,EAAU,IAAI,GAAK,CAAE,gBAAiB,CAAU,EAAI,CAAC,CAAC,AAAE,CAClF,CAAC,EAAU,IAAI,IAAI,OAAQ,EAAoC,eAAe,CAClF,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAE,AAAD,GAAQ,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,OAAQ,CAAQ,EAAI,EAAI,EACtG,EACA,UAAU,oJACV,YAAY,uDACZ,YAAY,IAEd,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,kEAAwD,SAC9D,mBAAmB,KAAG,iBAAiB,KAAG,YAAY,KAAG,yBAKtE,KAES,AE/oD1B,AF+oDc,EAAiB,IAAI,IE/oDvB,EFgpDG,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,6DACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,qBAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gBACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,OAAQ,CACN,UAAW,QACX,SAAU,OACV,OAAQ,GACR,GAAK,EAAK,MAAM,EAAgC,CAAC,CAAC,AACpD,EACA,SAAU,AAAC,IACT,GAAY,CACV,GAAG,CAAE,CACL,MAAO,EAAG,KAAK,CAAC,GAAG,CAAE,AAAD,GAClB,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,OAAQ,CAAgD,EAAI,EAE3F,EACF,EACA,OAAQ,EACR,SAAU,EACV,gBAAiB,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAM,EAAE,EAAE,EACzC,cAAe,CAAC,EAAG,KAAK,EAAI,EAAA,AAAE,EAAE,GAAG,CAAE,AAAD,IAAO,AAAC,CAAE,KAAM,EAAE,IAAI,CAAE,GAAI,EAAE,EAAE,AAAC,CAAC,GACtE,cAAe,EAAK,EAAE,QAI1B,KAEW,QAAd,EAAK,IAAI,CACR,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBAEb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,WAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,MAAO,OAAO,EAAI,cAAc,EAAI,IACpC,SAAU,EACV,cAAe,EAAK,EAAE,CACtB,cAAe,AAAC,IACd,IAAM,EAAU,CAAE,GAAG,CAAG,CAAE,eAAgB,CAAU,EACpD,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,OAAQ,CAAQ,EAAI,EAAI,EACtG,EACA,UAAU,mJACV,YAAY,sFACZ,YAAY,OAKhB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,6BAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,iEAAwD,6DAE/C,EAAI,YAAY,EAA0D,EAAE,CAEhG,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACZ,EAAa,GAAG,CAAC,CAAC,EAAO,IACxB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAgB,UAAU,oCACzB,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EAAM,IAAI,CACjB,SAAU,AAAC,IACT,IAAM,EAAkB,IAAI,EAAa,CACzC,CAAe,CAAC,EAAM,CAAG,CAAE,GAAG,CAAK,CAAE,KAAM,EAAE,MAAM,CAAC,KAAK,AAAC,EAC1D,IAAM,EAAU,CAAE,GAAG,CAAG,CAAE,aAAc,CAAgB,EACxD,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,OAAQ,CAAQ,EAAI,EAAI,EACtG,EACA,UAAU,6GACV,YAAY,eAEd,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,EAAM,IAAI,CACjB,SAAU,AAAC,IACT,IAAM,EAAU,EAAE,MAAM,CAAC,KAAK,CACxB,EAAkB,IAAI,EAAa,CACzC,CAAe,CAAC,EAAM,CAAG,CAAE,GAAG,CAAK,CAAE,KAAM,CAAQ,EACnD,IAAM,EAAU,CAAE,GAAG,CAAG,CAAE,aAAc,CAAgB,EACxD,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,OAAQ,CAAQ,EAAI,EAAI,EACtG,EACA,UAAU,gHAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,gBAAO,SACrB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,gBAAO,SACrB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,gBAAO,YAEvB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,KACP,IAAM,EAAkB,EAAa,MAAM,CAAC,CAAC,EAAG,IAAM,IAAM,GACtD,EAAU,CAAE,GAAG,CAAI,AAAD,EACpB,EAAgB,MAAM,CAAG,EAC3B,CAD8B,CACtB,YAAY,CAAG,EAEvB,OAAQ,EAAoC,YAAY,CAE1D,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,OAAQ,CAAQ,EAAI,EAAI,EACtG,EACA,UAAU,kGACX,QAxCO,IA6CZ,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,KACP,IAAM,EAAkB,IAAI,EAAc,CAAE,KAAM,GAAI,KAAM,MAAgB,EAAE,CACxE,EAAU,CAAE,GAAG,CAAG,CAAE,aAAc,CAAgB,EACxD,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,OAAQ,CAAQ,EAAI,EAAI,EACtG,EACA,UAAU,mGACX,uBAST,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,sBAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,SACL,MAAO,EAAI,SAAS,CAAG,OAAO,OAAO,EAAI,SAAS,EAAI,KAAQ,GAC9D,SAAU,AAAC,IACT,IAAM,EAAU,EAAE,MAAM,CAAC,KAAK,CAAG,OAAO,EAAE,MAAM,CAAC,KAAK,EAAI,KACpD,EAAU,CAAE,GAAG,CAAG,AAAC,EACrB,GAAW,EAAU,EACvB,CAD0B,CAClB,SAAS,CAAa,IAAV,EAEpB,OAAQ,EAAoC,SAAS,CAEvD,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAE,AAAD,GAAQ,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,OAAQ,CAAQ,EAAI,EAAI,EACtG,EACA,UAAU,gHACV,YAAY,MACZ,IAAI,YAIR,KAGW,YAAd,AAA0B,CAAC,CAAtB,IAAI,EACF,EAAmB,OAAO,EAAI,YAAY,EAAI,IAC9C,EAAuB,OAAO,EAAI,gBAAgB,EAAI,MAC/B,EAAI,eAAe,EAAI,CAAC,IAC7B,OAAO,EAAI,IAAI,EAAI,mBACrC,EAAoB,OAAO,EAAoB,aAAa,EAAI,IAAI,QAAQ,CAAC,MAAQ,EAAS,OAAO,EAAoB,aAAa,EAAI,GAC1I,EAAqB,GAA8B,KAEjC,CADlB,EAAkB,GAAqB,EAAqB,GAAY,EAAmB,GAAsB,KAC5E,EAAe,CAAC,EAAgB,EAAI,EAAE,GAAI,EAAE,AAC3D,GAAkB,CAAC,CAAC,EAAsB,CAAC,EAAgB,CACjF,EADoF,AACnE,OAAO,EAAoB,cAAc,EAAI,EAAoB,aAAa,EAAI,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,AAAC,GAAc,EAAE,IAAI,IAAI,MAAM,CAAC,WACtI,EAAgB,CAAC,EAAiB,EAAI,EAAE,GACvC,CAAC,CAAC,IAEH,AAAC,IACrB,IAAM,EAAU,CAAE,GAAG,CAAG,CAAE,GAAG,CAAK,AAAC,EACnC,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,OAAQ,CAAQ,EAAI,EAAI,EACtG,EAGI,AAAwB,KAAK,EAAhB,MAAM,EAAW,IAChC,CAAC,UAAc,GAAI,CAAE,EADgC,EAC1B,EAAI,MAAM,MAAM,mBAA0B,EAAI,MAAM,EAAE,IAAI,EAAQ,GAAE,EAAE,EAAE,GAAgB,EAAE,OAAO,CAAG,CAAE,KAAM,CAAC,EAAE,CAAC,GAEzI,GAAoB,CAAC,EAAgB,CAAC,EAAiB,EACzD,AAD2D,CAC1D,UAAc,GAAI,CAAE,IAAM,EAAI,MAAM,MAAM,CAAC,4BAA4B,EAAE,mBAAmB,GAAA,CAAmB,EAAS,EAAI,MAAM,EAAE,IAAI,GAAQ,EAAE,EAAE,EAAI,EAAE,KAAK,EAAE,GAAoB,IAAS,CAAE,EAAH,CAAM,CAAI,CAAE,CAAC,EAAiB,CAAE,EAAE,KAAK,CAAC,GAAG,CAAC,AAAC,IAAe,AAAD,CAAG,GAAI,EAAE,OAAO,CAAC,oBAAqB,GAAI,CAAC,EAAG,CAAC,EAAI,CAAE,KAAM,CAAC,EAAE,CAAC,GAEtT,GAAkB,GAAqB,GAAsB,CAAC,EAAe,CAAC,EAAgB,EAAI,CAAC,EAAsB,CAAC,EAAgB,EAAE,AAC9I,CAAC,UACC,GAA0B,IAAS,CAAE,EAAH,CAAM,CAAI,CAAE,CAAC,EAAgB,EAAE,EAAK,CAAC,EACvE,GAAI,CACF,IAAM,EAAK,CAAC,KACV,GAAI,CACF,OAAO,KAAK,KAAK,CAAC,aAAa,OAAO,CAAC,CAAC,UAAU,EAAE,EAAA,CAAmB,GAAK,MAAM,MAAM,EAAI,EAC9F,CAAE,KAAM,CACN,MAAO,EACT,EACF,CAAC,GACK,EAAI,MAAM,MACd,CAAC,yCAAyC,EAAE,mBAAmB,GAAmB,QAAQ,EAAE,mBAAmB,GAAA,CAAoB,CACnI,CAAE,QAAS,EAAK,CAAE,mBAAoB,CAAG,EAAI,CAAC,CAAE,GAE5C,EAAI,MAAM,EAAE,IAAI,GAChB,EAAS,GAAkB,GAC3B,EAAW,CAAC,EAAE,YAAY,EAAI,EAAA,AAAE,EACnC,MAAM,CAAE,AAAD,GAAgC,GAAkB,OAAO,EAAE,UAAU,EAAI,OAAS,GAAU,CAAC,EAAE,QAAQ,EAAI,EAAE,EAAE,EACtH,GAAG,CAAC,AAAC,IAA+B,AAAC,CACpC,cAAe,OAAO,EAAE,EAAE,EAC1B,WAAY,OAAO,EAAE,UAAU,EAAI,IACnC,YAAa,OAAO,EAAE,IAAI,EAAI,GAC9B,SAAU,EAAE,QAAQ,CAAG,OAAO,EAAE,QAAQ,OAAI,EAC9C,CAAC,EACH,GAAmB,IAAS,CAAE,EAAH,CAAM,CAAI,CAAE,CAAC,EAAgB,CAAE,EAAS,CAAC,CACtE,CAAE,KAAM,CAAC,CACT,GAA0B,GAAS,EAAE,EAAH,CAAM,CAAI,CAAE,CAAC,EAAgB,EAAE,EAAM,CAAC,EAC1E,CAAC,GAID,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uEACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,mBAE1F,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,SAC1F,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,MAAO,EAAiB,SAAU,AAAC,GAAM,EAAc,CAAE,KAAyB,oBAAnB,EAAE,MAAM,CAAC,KAAK,MAAyB,EAAY,EAAE,MAAM,CAAC,KAAK,AAAC,GAAI,UAAU,2HACrJ,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,2BAAkB,kBAChC,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,+BAAsB,8BAIxC,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,gBAC1F,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,MAAO,EAAkB,SAAU,AAAC,IAAQ,EAAc,CAAE,aAAc,EAAE,MAAM,CAAC,KAAK,OAAI,EAAW,sBAAkB,CAAU,EAAI,EAAG,UAAU,2HAC1J,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,YAAG,eAChB,GAAa,GAAG,CAAC,AAAC,GAAM,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAe,MAAO,YAAI,EAAG,IAAM,EAAS,aAAe,KAA/C,UAIzC,EACC,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,oBAC1F,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,MAAO,EAAsB,SAAU,AAAC,GAAM,EAAc,CAAE,iBAAkB,EAAE,MAAM,CAAC,KAAK,OAAI,CAAU,GAAI,UAAU,2HAChI,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,YAAG,eAChB,EAAc,GAAG,CAAC,AAAC,GAAM,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAkB,MAAO,EAAE,EAAE,UAAG,EAAE,IAAI,EAAI,EAAE,EAAE,EAAlC,EAAE,EAAE,SAG7C,KAEH,GAAkB,GAAsB,EAAgB,MAAM,CAAG,EAChE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qFAA4E,EAAmB,eAC9G,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0BACZ,EAAgB,GAAG,CAAC,AAAC,IACpB,IAAM,EAAU,EAAe,QAAQ,CAAC,EAAI,aAAa,EACnD,EAAgB,EAAI,UAAU,EAAI,EAAI,UAAU,GAAK,EAAqB,CAAC,EAAE,EAAE,EAAI,UAAU,CAAC,CAAC,CAAC,CAAG,GACzG,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAA8B,UAAU,4HACvC,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,KAAK,WAAW,QAAS,EAAS,SAAU,KACjD,IAAM,EAAO,EAAU,EAAe,MAAM,CAAC,AAAC,GAAe,IAAO,EAAI,aAAa,EAAI,IAAI,EAAgB,EAAI,aAAa,CAAC,CACzH,EAAS,CAAE,GAAG,CAAmB,AAAC,CAAG,QAAO,EAAO,aAAa,CAClE,EAAK,MAAM,CAAG,EAAG,EAAO,cAAc,CAAG,EAAK,IAAI,CAAC,KAAW,OAAO,EAAO,cAAc,CAC9F,EAAc,CAAE,gBAAiB,CAAO,EAC1C,EAAG,UAAU,kCACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WAAI,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wDAA+C,EAAI,WAAW,CAAE,KAAqB,EAAI,QAAQ,CAAG,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,4DAAoD,EAAI,QAAQ,GAAU,UAPvM,EAAI,aAAa,CAUjC,QAGF,KACH,GAAkB,EAAsB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,4DAAmD,sBAA0B,SAGpI,KAGP,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,KACP,IAAM,EAAe,EAAa,CAAC,EAAK,EAAE,CAAC,EAAmB,QAAd,EAAK,IAAI,CACzD,GAAiB,CAAE,GAAG,EAAa,CAAE,CAAC,EAAK,EAAE,CAAC,CAAE,CAAC,CAAa,EAChE,EACA,UAAU,4GAER,EAAa,CAAC,EAAK,EAAE,CAAC,EAAmB,QAAd,EAAK,IAAI,CAAe,OAAS,OAAO,iBAErE,EAAa,CAAC,EAAK,EAAE,CAAC,EAAmB,QAAd,EAAK,IAAI,CACpC,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,kBAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,WAAA,CACC,MAAO,KAAK,SAAS,CAAC,EAAK,KAAM,GACjC,SAAU,AAAC,IACT,GAAI,CACF,IAAM,EAAU,KAAK,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,EACzC,GAAI,CAAC,GAA8B,UAAnB,OAAO,GAAwB,MAAM,OAAO,CAAC,GAAU,OACvE,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,OAAQ,CAAQ,EAAI,EAAI,EACtG,CAAE,KAAM,CAER,CACF,EACA,UAAU,gJACV,YAAY,IAEd,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,iEAAwD,yCAEvE,cAKd,CAAC,WAMP,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wDACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qBACZ,GAAO,EAAE,GACV,CAAC,AAEY,OAAO,CADZ,EAAK,GAAO,EAAE,EACC,QAAQ,EAAI,IAAI,IAAI,IAAM,MACzC,EAAW,EAAG,QAAQ,EAAI,EAAE,GAGR,OAAO,GADpB,EAAG,IAAI,EAAuB,UAAnB,OAAO,EAAG,IAAI,EAAiB,CAAC,MAAM,OAAO,CAAC,EAAG,IAAI,EAAK,EAAG,IAAI,CAA+B,CAAC,GACnF,iBAAiB,EAAI,IAAI,IAAI,KAC1C,OAAO,EAAK,gBAAgB,EAAI,YAAY,IAAI,IAAM,aACxD,OAAO,EAAK,cAAc,EAAI,IAAI,IAAI,GAKvD,EAAU,CACd,CAAE,MAAO,cAAe,KAAM,EAAG,EACjC,CAAE,MAAO,uBAAwB,KAAM,aAAc,EACrD,CAAE,MAAO,0BAA2B,KAAM,eAAgB,EAC1D,CAAE,MAAO,oBAAqB,KAAM,WAAY,EAChD,CAAE,MAAO,oBAAqB,KAAM,YAAa,EACjD,CAAE,MAAO,kBAAmB,KAAM,YAAa,EAChD,CAGC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACb,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,IAAI,CAAA,CAAA,EAAC,UAAU,yDACtB,CAAA,EAAA,EAAA,GAAA,EAAC,UAAA,CAAQ,UAAU,sGAA6F,aAChH,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qBACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wEAA+D,aAC9E,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAU,AAAC,IACT,IAAM,EAAS,OAAO,EAAE,MAAM,CAAC,KAAK,EAAI,IAAI,IAAI,IAAM,MACtD,GAAY,CAAE,GAAG,CAAE,CAAE,SAAU,CAAO,EACxC,EACA,UAAU,iHACV,YAAY,6BAMpB,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,IAAI,CAAA,CAAA,EAAC,UAAU,yDACtB,CAAA,EAAA,EAAA,GAAA,EAAC,UAAA,CAAQ,UAAU,sGAA6F,qBAChH,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gCACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,0BAC1F,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,EACP,SAAW,AAAD,IACR,IAAM,EAAS,OAAO,EAAE,MAAM,CAAC,KAAK,EAAI,IAAI,IAAI,GAC1C,EAAW,GAAiB,IAAI,CAAC,AAAC,GAAM,EAAE,EAAE,GAAK,GAInD,EACF,GAAY,CACV,GAAG,CAFO,AAEL,CACL,KAAM,CACJ,GAAG,CAAI,CACP,kBAAmB,EAAS,EAAE,CAC9B,iBAAkB,EAAS,OAAO,CAClC,eAAgB,EAAS,MAAM,AACjC,EACA,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GACR,mBAAX,EAAE,IAAI,CACF,CACE,GAAG,CAAC,CACJ,OAAQ,CACN,GAAK,EAAE,MAAM,EAAwB,UAApB,OAAO,EAAE,MAAM,EAAiB,CAAC,MAAM,OAAO,CAAC,EAAE,MAAM,EACpE,EAAE,MAAM,CACR,CAAC,CAAC,CACN,kBAAmB,EAAS,EAAE,CAC9B,SAAU,EAAS,OAAO,CAC1B,OAAQ,EAAS,MAAM,AACzB,CACF,EACA,EAER,GAEA,GAAY,CACV,GAAG,CAAE,CACL,KAAM,CAAE,GAAG,CAAI,CAAE,kBAAmB,EAAG,EACvC,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GACR,mBAAX,EAAE,IAAI,CACF,CACE,GAAG,CAAC,CACJ,OAAQ,CACN,GAAK,EAAE,MAAM,EAAwB,UAApB,OAAO,EAAE,MAAM,EAAiB,CAAC,MAAM,OAAO,CAAC,EAAE,MAAM,EACpE,EAAE,MAAM,CACR,CAAC,CAAC,CACN,kBAAmB,EACrB,CACF,EACA,EAER,EAEJ,EACA,UAAU,2HAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,YAAG,aAChB,GAAiB,GAAG,CAAC,AAAC,GACrB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAkB,MAAO,EAAE,EAAE,UAC3B,EAAE,KAAK,EADG,EAAE,EAAE,MAKpB,GACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,6CAAmC,kCACjB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAY,4BAA8B,QACzF,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,0BAAiB,6BAA+B,OAEhE,KACH,GACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,0CAAgC,4BAA0B,MACvE,KACJ,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,iEAAwD,2GAKzE,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAU,0DACjB,CAAA,EAAA,EAAA,GAAA,EAAC,UAAA,CAAQ,UAAU,4GAAmG,8BACtH,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qCACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,aAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAU,AAAC,IACT,IAAM,EAAe,OAAO,EAAE,MAAM,CAAC,KAAK,EAAI,IAAI,IAAI,IAAM,WAC5D,GAAY,CACV,GAAG,CAAE,CACL,KAAM,CAAE,GAAG,CAAI,CAAE,kBAAmB,GAAI,iBAAkB,CAAa,EACvE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GACR,mBAAX,EAAE,IAAI,CACF,CACE,GAAG,CAAC,CACJ,OAAQ,CACN,GAAK,EAAE,MAAM,EAAI,AAAoB,iBAAb,EAAE,MAAM,EAAiB,CAAC,MAAM,OAAO,CAAC,EAAE,MAAM,EACpE,EAAE,MAAM,CACR,CAAC,CAAC,CACN,kBAAmB,GACnB,SAAU,CACZ,CACF,EACA,EAER,EACF,EACA,UAAU,iHACV,YAAY,gBAIhB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,WAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAU,AAAC,IACT,IAAM,EAAa,OAAO,EAAE,MAAM,CAAC,KAAK,EAAI,IAAI,IAAI,GACpD,GAAY,CACV,GAAG,CAAE,CACL,KAAM,CAAE,GAAG,CAAI,CAAE,kBAAmB,GAAI,eAAgB,CAAW,EACnE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GACR,mBAAX,EAAE,IAAI,CACF,CACE,GAAG,CAAC,CACJ,OAAQ,CACN,GAAK,EAAE,MAAM,EAAwB,AAApB,iBAAO,EAAE,MAAM,EAAiB,CAAC,MAAM,OAAO,CAAC,EAAE,MAAM,EACpE,EAAE,MAAM,CACR,CAAC,CAAC,CACN,kBAAmB,GACnB,OAAQ,CACV,CACF,EACA,EAER,EACF,EACA,UAAU,iHACV,YAAY,2CAQxB,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,IAAI,CAAA,CAAA,EAAC,UAAU,yDACtB,CAAA,EAAA,EAAA,GAAA,EAAC,UAAA,CAAQ,UAAU,sGAA6F,mBAChH,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mDACd,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,KAEP,IAAM,EAAY,EAAG,KAAK,CAAC,MAAM,CAAE,AAAD,GAAO,EAAE,EAAE,KAAK,EAC5C,EAAY,CAAC,EAAG,KAAK,EAAI,EAAA,AAAE,EAAE,MAAM,CAAC,AAAC,GAAM,EAAE,IAAI,KAAK,EAAU,EAAE,EAAE,GAF3D,EAEgE,EAC/E,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAW,MAAO,CAAU,GACxD,GAAkB,GACpB,EACA,UAAU,yHACX,gBAGC,OAGL,GAGG,GADa,CACT,CADY,AACX,KADgB,CACV,AADW,GADxB,CAAC,AAC2B,CAAC,AAAC,GAAM,EAAE,EAAE,GAAK,KAIzC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,2BACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,OAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mHACZ,EAAK,EAAE,MAIZ,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,SAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,OAAO,EAAK,IAAI,EAAI,IAC3B,SAAU,AAAC,IACT,IAAM,EAAW,EAAE,MAAM,CAAC,KAAK,CAC/B,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,KAAM,CAAS,EAAI,EAAI,EACrG,EACA,UAAU,iHACV,YAAY,gBAIhB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,SAC1F,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,EAAK,IAAI,CAChB,SAAU,AAAC,IACT,IAAM,EAAW,EAAE,MAAM,CAAC,KAAK,CAC/B,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,KAAM,CAAS,EAAI,EAAI,EACrG,EACA,UAAU,2HAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,iBAAQ,UACtB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,eAAM,QACpB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,eAAM,QACpB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,gBAAO,SACrB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,qBAAY,cAC1B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,iBAAQ,UACtB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,0BAAiB,mBAC/B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,uBAAc,gBAC5B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,uBAAc,gBAC5B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,mBAAU,kBAI5B,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mCACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,MAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,SACL,MAAyB,UAAlB,OAAO,EAAK,CAAC,CAAgB,EAAK,CAAC,CAAG,EAC7C,SAAW,AAAD,IACR,IAAM,EAAQ,OAAO,EAAE,MAAM,CAAC,KAAK,EACnC,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,EAAG,CAAM,EAAI,EAAI,EAC/F,EACA,UAAU,sHAGd,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,MAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,SACL,MAAyB,UAAlB,OAAO,EAAK,CAAC,CAAgB,EAAK,CAAC,CAAG,EAC7C,SAAU,AAAC,IACT,IAAM,EAAQ,OAAO,EAAE,MAAM,CAAC,KAAK,EACnC,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,EAAG,CAAM,EAAI,EAAI,EAC/F,EACA,UAAU,yHAMf,AAAc,UAAT,IAAI,CACR,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,WAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,MAAO,OAAO,CAAE,EAAK,MAAM,EAAgC,EAAC,CAAC,CAAE,cAAc,EAAI,IACjF,SAAU,EACV,cAAe,EAAK,EAAE,CACtB,cAAe,AAAC,IACd,IAAM,EAAU,CAAE,GAAI,EAAK,MAAM,CAA8B,eAAgB,CAAU,EACzF,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,OAAQ,CAAQ,EAAI,EAAI,EACtG,EACA,UAAU,kJACV,YAAY,sFACZ,YAAY,OAIhB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,UAC1F,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,OAAO,CAAE,EAAK,MAAM,EAAgC,EAAC,CAAC,CAAE,KAAK,EAAI,IACxE,SAAU,AAAC,IACT,IAAM,EAAY,OAAO,EAAE,MAAM,CAAC,KAAK,EAAI,IAAI,IAAI,GAC7C,EAAU,CAAE,GAAI,EAAK,MAAM,CAA8B,GAAI,EAAY,CAAE,MAAO,CAAU,EAAI,CAAC,CAAC,AAAE,CACtG,CAAC,GAAW,OAAO,EAAQ,KAAK,CACpC,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,OAAQ,CAAQ,EAAI,EAAI,EACtG,EACA,UAAU,2HAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,YAAG,6BAChB,GAAgB,GAAG,CAAC,AAAC,GACpB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAe,MAAO,WAAI,GAAd,OAGhB,GACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,4CAAkC,8BAA4B,MAC3E,QAGN,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,sBAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,SACL,MAAO,CAAE,EAAK,MAAM,EAAgC,EAAC,CAAC,CAAE,SAAS,CAAG,OAAO,OAAO,CAAE,EAAK,MAAM,EAAgC,CAAC,CAAC,EAAE,SAAS,EAAI,KAAQ,GACxJ,SAAU,AAAC,IACT,IAAM,EAAU,EAAE,MAAM,CAAC,KAAK,CAAG,OAAO,EAAE,MAAM,CAAC,KAAK,EAAI,KACpD,EAAU,CAAE,GAAI,EAAK,MAAM,AAA6B,EAC1D,GAAW,EAAU,EACvB,CAD0B,CAClB,SAAS,CAAa,IAAV,EAEpB,OAAO,EAAQ,SAAS,CAE1B,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,OAAQ,CAAQ,EAAI,EAAI,EACtG,EACA,UAAU,+GACV,YAAY,MACZ,IAAI,YAIR,KAGH,AAAY,EAAK,IAAI,MACpB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,qBAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gBACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,OAAQ,CACN,UAAW,QACX,SAAU,OACV,OAAQ,GACR,GAAK,EAAK,MAAM,EAAgC,CAAC,CAAC,AACpD,EACA,SAAU,AAAC,IACT,GAAY,CACV,GAAG,CAAE,CACL,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GACnB,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,OAAQ,CAAgD,EAAI,EAE3F,EACF,EACA,OAAQ,EACR,SAAU,EACV,gBAAiB,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAM,EAAE,EAAE,EACzC,cAAe,CAAC,EAAG,KAAK,EAAI,EAAA,AAAE,EAAE,GAAG,CAAC,AAAC,IAAM,AAAC,CAAE,KAAM,EAAE,IAAI,CAAE,GAAI,EAAE,EAAE,AAAC,CAAC,GACtE,cAAe,EAAK,EAAE,QAI1B,KAGW,mBAAd,EAAK,IAAI,CACR,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,aAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,OAAO,CAAE,EAAK,MAAM,EAAgC,EAAC,CAAC,CAAE,QAAQ,EAAI,IAC3E,SAAU,AAAC,IACT,IAAM,EAAI,OAAO,EAAE,MAAM,CAAC,KAAK,EAAI,IAAI,IAAI,GACrC,EAAU,CAAE,GAAI,EAAK,MAAM,CAA8B,GAAI,EAAI,CAAE,SAAU,CAAE,EAAI,CAAC,CAAC,AAAE,CACzF,CAAC,GAAG,OAAO,EAAQ,QAAQ,CAC/B,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,OAAQ,CAAQ,EAAI,EAAI,EACtG,EACA,UAAU,iHACV,YAAY,gBAIhB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,WAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,OAAO,CAAE,EAAK,MAAM,EAAgC,CAAC,CAAC,EAAE,MAAM,EAAI,IACzE,SAAU,AAAC,IACT,IAAM,EAAI,OAAO,EAAE,MAAM,CAAC,KAAK,EAAI,IAAI,IAAI,GACrC,EAAU,CAAE,GAAI,EAAK,MAAM,CAA8B,GAAI,EAAI,CAAE,OAAQ,CAAE,EAAI,CAAC,CAAC,AAAE,CACvF,CAAC,GAAG,OAAO,EAAQ,MAAM,CAC7B,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,OAAQ,CAAQ,EAAI,EAAI,EACtG,EACA,UAAU,iHACV,YAAY,4BAEd,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,iEAAwD,kDAGzE,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,+BAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,MAAO,OAAO,CAAE,EAAK,MAAM,EAAgC,EAAC,CAAC,CAAE,eAAe,EAAI,IAClF,SAAU,EACV,cAAe,EAAK,EAAE,CACtB,cAAe,AAAC,IACd,IAAM,EAAU,CAAE,GAAI,EAAK,MAAM,CAA8B,GAAI,EAAU,IAAI,GAAK,CAAE,gBAAiB,CAAU,EAAI,CAAC,CAAC,AAAE,CACvH,CAAC,EAAU,IAAI,IAAI,OAAO,EAAQ,eAAe,CACrD,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,OAAQ,CAAQ,EAAI,EAAI,EACtG,EACA,UAAU,oJACV,YAAY,uDACZ,YAAY,IAEd,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,kEAAwD,SAC9D,mBAAmB,KAAG,iBAAiB,KAAG,YAAY,KAAG,sBAIpE,KAGW,YAAd,AAA0B,CAAC,CAAtB,IAAI,IAEa,OAAO,GADf,EAAK,MAAM,EAAI,CAAC,GACG,YAAY,EAAI,MACvB,OAAO,EAAI,gBAAgB,EAAI,MAC/B,EAAI,eAAe,EAAI,CAAC,IAE/B,UAChB,KAAI,GAAa,MAAM,EAAG,IAAK,IAC/B,IAAuB,GACvB,GAAI,CACF,IAAM,EAH4C,AAGtC,MAAM,MAAM,mBAClB,EAAO,MAAM,EAAI,IAAI,GACvB,EAAK,EAAE,EAAI,MAAM,OAAO,CAAC,EAAK,OAAO,GAAG,AAC1C,GAAgB,EAAK,OAAO,CAEhC,CAAE,KAAM,CAAe,CACvB,IAAuB,GACzB,IAEsB,MAAO,IAC3B,GAAI,AAAC,IAAO,EAAgB,CAAC,EAAI,CACjC,CADmC,EAC/B,CACF,IAAM,EAAM,MAAM,MAAM,CAAC,4BAA4B,EAAE,mBAAmB,GAAA,CAAM,EAC1E,EAAO,MAAM,EAAI,IAAI,GAC3B,GAAI,EAAK,EAAE,EAAI,MAAM,OAAO,CAAC,EAAK,KAAK,EAAG,CAExC,IAAM,EAAM,EAAK,KAAK,CAAC,GAAG,CAAC,AAAC,IAAc,AAAC,CACzC,GAAI,EAAE,OAAO,CAAC,oBAAqB,GACrC,CAAC,GACD,GAAoB,AAAC,IAAU,CAAE,EAAH,CAAM,CAAI,CAAE,CAAC,EAAI,CAAE,EAAI,CAAC,CACxD,CACF,CAAE,KAAM,CAAe,CACzB,IAEgC,MAAO,EAAa,KAClD,IAAM,EAAM,GAAY,EAAK,GAC7B,GAAI,AAAC,GAAQ,IAAY,AAAb,EAA4B,CAAC,EAAI,GAAI,EAAsB,CAAC,EAAI,EAAE,AAC9E,GAA0B,AAAC,IAAU,CAAE,EAAH,CAAM,CAAI,CAAE,CAAC,EAAI,EAAE,EAAK,CAAC,EAC7D,GAAI,CACF,IAAM,EAAY,AAAC,MACjB,GAAI,CACF,IAAM,EAAI,aAAa,OAAO,CAAC,CAAC,UAAU,EAAE,EAAA,CAAK,EACjD,OAAO,GAAI,KAAK,KAAK,CAAC,GAAG,MAAM,EAAI,EACrC,CAAE,EADwC,GAClC,CACN,MAAO,EACT,EACF,CAAC,GAGK,EAAM,MAAM,MAChB,CAAC,yCAAyC,EAAE,mBAAmB,GAAK,QAAQ,EAAE,mBAAmB,GAAA,CAAM,CACvG,CACE,QAAS,EAAY,CAAE,mBAAoB,CAAU,EAAI,CAAC,CAC5D,GAEI,EAAO,MAAM,EAAI,IAAI,GACrB,EAAe,MAAM,OAAO,CAAC,GAAM,cAAgB,EAAK,YAAY,CAAG,EAAE,CACzE,EAAS,GAAkB,GAC3B,EAAW,EACd,MAAM,CAAE,AAAD,GAAgC,GAAkB,OAAO,GAAG,YAAc,OAAS,GAAU,CAAC,GAAG,UAAY,GAAG,IACvH,GAAG,CAAC,AAAC,IAAgC,AAAD,CACnC,cAAe,OAAO,EAAE,EAAE,EAC1B,WAAY,OAAO,EAAE,UAAU,EAAI,IACnC,YAAa,OAAO,EAAE,IAAI,EAAI,GAC9B,SAAU,EAAE,QAAQ,CAAG,OAAO,EAAE,QAAQ,OAAI,EAC9C,CAAC,EACH,GAAmB,AAAC,IAAU,CAAE,EAAH,CAAM,CAAI,CAAE,CAAC,EAAI,CAAE,EAAS,CAAC,CAC5D,CAAE,KAAM,CAAe,CACvB,GAA0B,AAAC,GAAU,EAAE,EAAH,CAAM,CAAI,CAAE,CAAC,EAAI,CAAE,GAAM,CAAC,EAChE,IAIsB,GADG,OAAO,EAAgB,aAAa,EAAI,MACvB,CAAC,EAAiB,QAAQ,CAAC,MAAQ,EAAmB,EAGpE,IAAxB,CAA6B,EAAhB,MAAM,EAAW,IAChC,IAEE,GAAgB,CAAC,EAAgB,CAAC,EAAa,EAAE,AACnD,EAAc,AAJuC,GAYnD,GADe,CAAC,CAAC,GADE,GAA8B,MAEnC,GAChB,EAAwB,EAAe,KAGvB,EAAgB,CAJD,AAIE,EAAa,EAAI,EAAE,GAC/B,OAAO,OAAO,CAAC,GAEhC,EAAiB,CADjB,EAAqB,GAAiB,EAAiB,GAAY,EAAe,GAAkB,KAC7D,EAAe,CAAC,EAAmB,EAAI,EAAE,CAChF,EADoF,EAAE,AACpE,GAAqB,CAAC,CAAC,EAAsB,CAAC,EAAmB,GAAG,AAGzE,OAAO,EAAgB,cAAc,EAAI,EAAgB,aAAa,EAAI,IAAI,KAAK,CAAC,KAAK,GAAG,CAAE,AAAD,GAAe,EAAE,IAAI,IAAI,MAAM,CAAC,SAE1I,EAAY,AAAC,IACjB,IAAM,EAAU,CAAE,GAAG,CAAG,CAAE,GAAG,CAAK,AAAC,EACnC,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,OAAQ,CAAQ,EAAI,EAAI,EACtG,IAEoB,OAAO,EAAI,IAAI,EAAI,mBACjC,EAA6C,UAA7B,OAAO,EAAI,aAAa,CAAgB,EAAI,aAAa,CAAa,IAG1F,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,mBAE1F,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,SAC1F,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,EACP,SAAU,AAAC,IACT,IAAM,EAAI,EAAE,MAAM,CAAC,KAAK,CACxB,EAAU,CAAE,KAAY,oBAAN,EAA0B,OAAY,CAAE,EAC5D,EACA,UAAU,2HAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,2BAAkB,kBAChC,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,+BAAsB,8BAIvB,wBAAhB,EACC,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,2BAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,SACL,IAAK,GACL,MAAO,KAAK,KAAK,CAAC,EAAgB,KAClC,SAAU,AAAC,IAET,EAAU,CAAE,cAAe,AAAO,IADrB,KAAK,GAAG,CAAC,GAAI,SAAS,EAAE,MAAM,CAAC,KAAK,CAAE,KAAO,IACnB,EACzC,EACA,UAAU,mHAEZ,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,kEAAyD,sEAIxE,KAEJ,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,gBAC1F,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,EACP,SAAU,AAAC,IACT,IAAM,EAAM,EAAE,MAAM,CAAC,KAAK,CAC1B,EAAU,CAAE,aAAc,QAAO,EAAW,iBAAkB,MAAU,GACpE,GAAO,CAAC,EAAgB,CAAC,EAAI,EAAE,EAAc,EACnD,EACA,UAAU,2HAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,YAAG,oBAChB,GAAa,GAAG,CAAC,AAAC,GACjB,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAe,MAAO,YAAI,EAAG,IAAM,EAAS,aAAe,KAA/C,UAKlB,EACC,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,oBAC1F,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAU,CAAE,iBAAkB,EAAE,MAAM,CAAC,KAAK,OAAI,CAAU,GAC3E,UAAU,2HAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,YAAG,wBAChB,EAAU,GAAG,CAAC,AAAC,GACd,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAkB,MAAO,EAAE,EAAE,UAAG,EAAE,IAAI,EAAI,EAAE,EAAE,EAAlC,EAAE,EAAE,MAGpB,GAAgB,CAAC,EAAgB,CAAC,EAAa,CAC9C,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,iEAAwD,uBACrE,QAEJ,KAEH,GAAc,EACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8CACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qFAA4E,EAAe,eAC1G,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,KACP,IAAM,EAAM,GAAY,EAAe,GACvC,GAAmB,AAAC,IAAW,IAAM,EAAO,CAAE,GAAG,CAAI,AAAC,EAAqB,OAAlB,OAAO,CAAI,CAAC,EAAI,CAAS,CAAM,GACxF,EAAwB,EAAe,EACzC,EACA,UAAU,kJACX,eAIF,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,iEAAwD,sBAC3C,IAA1B,EAAe,MAAM,CACvB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,kEAAwD,MACjE,EAAe,0DAAwD,EAAe,iBAG5F,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,2BACZ,EAAe,GAAG,CAAC,AAAC,IACnB,IAAM,EAAU,EAAW,QAAQ,CAAC,EAAI,aAAa,EAC/C,EAAgB,EAAI,UAAU,EAAI,EAAI,UAAU,GAAK,EAAiB,CAAC,EAAE,EAAE,EAAI,UAAU,CAAC,CAAC,CAAC,CAAG,GACrG,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAA8B,UAAU,4HACvC,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,WACL,QAAS,EACT,SAAU,KACR,IAAM,EAAO,EACT,EAAW,MAAM,CAAC,AAAC,GAAe,IAAO,EAAI,aAAa,EAC1D,IAAI,EAAY,EAAI,aAAa,CAAC,CAChC,EAAS,CAAE,GAAG,CAAgB,AAAD,CAEnC,QAAO,EAAO,aAAa,CACvB,EAAK,MAAM,CAAG,EAChB,CADmB,CACZ,cAAc,CAAG,EAAK,IAAI,CAAC,KAElC,OAAO,EAAO,cAAc,CAE9B,EAAU,CAAE,gBAAiB,CAAO,EACtC,EACA,UAAU,kCAEZ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wDAA+C,EAAI,WAAW,CAAE,KAC9E,EAAI,QAAQ,CAAG,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,4DAAoD,EAAI,QAAQ,GAAU,UAtBjG,EAAI,aAAa,CA0BjC,GACA,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,2DACU,IAAtB,EAAW,MAAM,CAAS,oDAAsD,CAAA,EAAG,EAAW,MAAM,CAAC,QAAQ,EAAE,EAAW,MAAM,CAAG,EAAI,IAAM,GAAG,UAAU,CAAC,SAKlK,KAEJ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8CACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,qBAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,KACP,IAAM,EAAM,CAAC,IAAI,EAAE,KAAK,GAAG,GAAA,CAAI,CAC/B,EAAU,CAAE,gBAAiB,CAAE,GAAG,CAAe,CAAE,CAAC,EAAI,CAAE,EAAG,CAAE,EACjE,EACA,UAAU,kJACX,aAIH,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,kEAAwD,oGAC6B,mBAAmB,gBAEtH,EAAe,MAAM,CAAG,EACvB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0BACZ,EAAe,GAAG,CAAC,CAAC,CAAC,EAAK,EAAM,CAAE,IACjC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAc,UAAU,oCACvB,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAU,AAAC,IACT,IAAM,EAAS,EAAE,MAAM,CAAC,KAAK,CACvB,EAAa,CAAE,GAAG,CAAe,AAAC,CACxC,QAAO,CAAU,CAAC,EAAI,CACtB,CAAU,CAAC,EAAO,CAAG,EACrB,EAAU,CAAE,gBAAiB,CAAW,EAC1C,EACA,UAAU,mHACV,YAAY,eAEd,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,4DAAmD,MACnE,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAU,AAAC,IAET,EAAU,CAAE,gBADO,CAAE,AACQ,GADL,CAAe,CAAE,CAAC,EAAI,CAAE,EAAE,MAAM,CAAC,KAAK,AAAC,CACvB,EAC1C,EACA,UAAU,oHACV,YAAY,sBAEd,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,KACP,IAAM,EAAa,CAAE,GAAG,CAAgB,AAAD,CACvC,QAAO,CAAU,CAAC,EAAI,CACtB,EAAU,CAAE,gBAAiB,OAAO,IAAI,CAAC,GAAY,MAAM,CAAG,EAAI,OAAa,CAAU,EAC3F,EACA,UAAU,8CACV,MAAM,0BACP,QAhCO,MAuCd,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wEAA+D,2EAKjF,KAGP,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,UACC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,aAAe,CAAE,EAAK,MAAM,EAAgC,EAAC,CAAC,CAAE,YAAY,EAAsB,EAAE,CACpG,SAAU,AAAC,IACT,IAAM,EAAU,CAAE,GAAI,EAAK,MAAM,AAA6B,EAC1D,EAAgB,MAAM,CAAG,EAC3B,CAD8B,CACtB,YAAY,CAAG,EAEvB,OAAO,EAAQ,YAAY,CAE7B,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,EAAE,CAAG,CAAE,GAAG,CAAC,CAAE,OAAQ,CAAQ,EAAI,EAAI,EACtG,MAKJ,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAU,0DACjB,CAAA,EAAA,EAAA,GAAA,EAAC,UAAA,CAAQ,UAAU,4GAAmG,uBACtH,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,eACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,6IACZ,KAAK,SAAS,CAAC,EAAK,MAAM,EAAI,CAAC,EAAG,KAAM,aA/iBjC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8DAAqD,sBAujBxF,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8DAAqD,yBAKxE,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,IAAI,CAAA,CAAA,EAAC,UAAU,yDACtB,CAAA,EAAA,EAAA,GAAA,EAAC,UAAA,CAAQ,UAAU,sGAA6F,aAChH,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACf,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oDACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,aAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,KACP,IAAM,EAAK,CAAC,CAAC,EAAE,KAAK,GAAG,GAAA,CAAI,CAC3B,GAAY,CACV,GAAG,CAAE,CACL,SAAU,IACL,EACH,CAAE,KAAM,UAAQ,EAAI,KAAM,cAAe,SAAS,EAAM,KAAM,iBAAe,CAAG,EACjF,AACH,EACF,EACA,UAAU,gJACX,aAMF,AAAsB,aACrB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gGACU,YAAtB,IACC,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,kFACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,iCAAwB,2BAGpB,YAAtB,IACC,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0BAAiB,MAChC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,kCAAyB,uBAG3C,AAAsB,cACrB,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wBAAe,MAC9B,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,iCAAuB,wBAAsB,YAMpE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0BACZ,EAAS,MAAM,CACd,EAAS,GAAG,CAAC,CAAC,EAAG,KACf,IAAM,EAAQ,EAAyB,IAAI,CAErC,EAAK,OAAQ,EAAuB,EAAE,EAAI,IAC1C,EAAO,OAAQ,EAAyB,IAAI,EAAI,IAChD,EAAU,EAAS,EAA4B,OAAO,CACtD,EAAO,OAAQ,EAAyB,IAAI,EAAI,IAChD,EAAS,OAAQ,EAAuB,EAAE,EAAI,GAC9C,EAAa,EAAK,IAAI,GAAG,KAAK,CAAC,OAAO,MAAM,CAAC,SAC7C,EAAiB,CAAC,EAAK,IAAI,IAAM,AAAsB,MAAX,MAAM,CAExD,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAuB,UAAU,6DAChC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oDACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,uDAA+C,GAAQ,GAAM,CAAC,QAAQ,EAAE,EAAI,EAAA,CAAG,GAC9F,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,GAAY,CAAE,GAAG,CAAE,CAAE,SAAU,EAAS,MAAM,CAAC,CAAC,EAAG,IAAQ,IAAQ,EAAG,GACrF,UAAU,sGACX,cAKF,AAtBmB,CAsBlB,QAtBS,EAwBP,KADF,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+DAAqD,6BAA2B,OAAO,MAGxG,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wCACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kFACf,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,WACL,QAAS,EACT,SAAW,AAAD,IACR,IAAM,EAAc,EAAE,MAAM,CAAC,OAAO,CACpC,GAAY,CACV,GAAG,CAAE,CACL,SAAU,EAAS,GAAG,CAAC,CAAC,EAAG,IAAS,IAAQ,GAAgB,SAAX,EAAE,IAAI,CAAc,CAAE,GAAG,CAAC,CAAE,QAAS,CAAY,EAAI,EACxG,EACF,IACA,aAIJ,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,SAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAW,AAAD,IACR,IAAM,EAAW,EAAE,MAAM,CAAC,KAAK,CAC/B,GAAY,CACV,GAAG,CAAE,CACL,SAAU,EAAS,GAAG,CAAC,CAAC,EAAG,IAAS,IAAQ,GAAgB,SAAX,EAAE,IAAI,CAAc,CAAE,GAAG,CAAC,CAAE,KAAM,CAAS,EAAI,EAClG,EACF,EACA,UAAU,iHACV,YAAY,uBAIhB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,oBAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAW,AAAD,IACR,IAAM,EAAW,EAAE,MAAM,CAAC,KAAK,CAC/B,GAAY,CACV,GAAG,CAAE,CACL,SAAU,EAAS,GAAG,CAAC,CAAC,EAAG,IAAS,IAAQ,GAAgB,SAAX,EAAE,IAAI,CAAc,CAAE,GAAG,CAAC,CAAE,KAAM,CAAS,EAAI,EAClG,EACF,EACA,UACE,EACI,+HACA,iIAEN,YAAY,kBAEb,AAAC,EAIE,KAHF,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,0CAAgC,iEACkB,EAAW,MAAM,CAAC,OAGrF,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wCACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,MAAO,EAAQ,IAAI,CAAC,AAAC,GAAM,EAAE,IAAI,GAAK,GAAQ,EAAO,GACrD,SAAU,AAAC,IACT,IAAM,EAAW,EAAE,MAAM,CAAC,KAAK,CAC/B,GAAY,CACV,GAAG,CAAE,CACL,SAAU,EAAS,GAAG,CAAC,CAAC,EAAG,IAAS,IAAQ,GAAK,AAAW,WAAT,IAAI,CAAc,CAAE,GAAG,CAAC,CAAE,KAAM,CAAS,EAAI,EAClG,EACF,EACA,UAAU,2HAET,EAAQ,GAAG,CAAC,AAAC,GACZ,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAqB,MAAO,EAAE,IAAI,UAChC,EAAE,KAAK,EADG,EAAE,KAAK,KAKxB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,4DAAmD,oEAItE,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,sBAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAU,AAAC,IACT,IAAM,EAAS,OAAO,EAAE,MAAM,CAAC,KAAK,EAAI,IAAI,IAAI,IAAM,EACtD,GAAY,CACV,GAAG,CAAE,CACL,SAAU,EAAS,GAAG,CAAC,CAAC,EAAG,IAAS,IAAQ,GAAgB,SAAX,EAAE,IAAI,CAAc,CAAE,GAAG,CAAC,CAAE,GAAI,CAAO,EAAI,EAC9F,EACF,EACA,UAAU,iHACV,YAAa,YAzGX,CAAA,EAAG,EAAG,CAAC,EAAE,EAAA,CAAG,CA+G1B,GAEA,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,yDAAgD,6BAMrE,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,IAAI,CAAA,CAAA,EAAC,UAAU,yDACtB,CAAA,EAAA,EAAA,GAAA,EAAC,UAAA,CAAQ,UAAU,sGAA6F,SAChH,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACf,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qEAA4D,mBAC3E,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAI,CAAA,CACH,KAAM,CAAC,OAAO,EAAE,mBAAmB,GAAQ,KAAK,CAAC,CACjD,UAAU,oIACX,kBAIH,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,SAAU,EACV,QAAS,UACP,IAAM,EAAO,OAAO,EAAG,EAAE,EAAI,IAAI,IAAI,GACrC,GAAK,CAAD,EACJ,GADW,AACU,IACrB,IAAuB,GACvB,GAAI,CACF,IAAM,EAAM,MAAM,MAAM,2BAA4B,CAClD,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAE9C,KAAM,KAAK,SAAS,CAAC,QAAE,EAAQ,WAAY,EAAM,KAAM,SAAU,EACnE,GACM,EAAO,MAAM,EAAI,IAAI,GAC3B,GAAI,CAAC,EAAI,EAAE,EAAI,CAAC,EAAK,EAAE,CAAE,MAAM,AAAI,MAAM,EAAK,KAAK,EAAI,yBAEvD,IAAM,EAAU,MAAM,MACpB,CAAC,gCAAgC,EAAE,mBAAmB,GAAQ,YAAY,EAAE,mBAAmB,GAAA,CAAO,CACtG,CAAE,MAAO,UAAW,GAEhB,EAAW,MAAM,EAAQ,IAAI,GACnC,GAAI,CAAC,EAAQ,EAAE,EAAI,CAAC,EAAS,EAAE,CAAE,MAAM,AAAI,MAAM,EAAS,KAAK,EAAI,0BAEnE,IAAM,EADQ,AACD,OADO,OAAO,CAAC,EAAS,KAAK,EAAI,EAAS,KAAK,CAAG,EAAA,AAAE,EAC9C,GAAG,CAAC,AAAC,GAAe,OAAO,GAAK,IAAI,IAAI,IAAI,MAAM,CAAC,AAAC,IAAc,CAAQ,GAC7F,GAAgB,EAClB,CAAE,MAAO,EAAY,CACnB,GAAqB,aAAa,MAAQ,EAAE,OAAO,CAAG,OAAO,GAC/D,QAAU,CACR,IAAuB,EACzB,EACF,EACA,UAAU,oKACX,gBAGD,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,SAAU,GAAU,IAAe,CAAC,GAAa,EAAE,CACnD,QAAS,UACP,IAAM,EAAO,OAAO,EAAG,EAAE,EAAI,IAAI,IAAI,GACrC,GAAI,CAAC,EAAM,OAGX,GAAI,GAAa,qBAAqB,CAAC,MAAM,CAAE,YAC7C,GAAqB,2CAOvB,IAAM,EAAgB,IAAgB,GAAa,iBAAiB,CACpE,GAAI,GAAa,mBAAmB,CAAC,MAAM,EAAI,CAAC,EAAe,CAC7D,IAAmB,GACnB,GAAoB,IACpB,GAAI,CACF,IAAM,EAAe,MAAM,MAAM,mBAAoB,CACnD,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,CAAE,OAAQ,mBAAa,CAAO,EACrD,GACM,EAAiB,MAAM,EAAa,IAAI,GAC9C,GAAI,CAAC,EAAa,EAAE,GAAyB,IAArB,EAAc,CAAc,CAAZ,CACtC,MAAM,AAAI,MAAM,EAAc,KAAK,EAAI,oCAEzC,IAAM,EAAM,MAAM,KACZ,EAAe,GAAa,gBAAgB,CAAC,MAAM,CAAC,AAAC,GAAO,CAAC,CAAG,CAAC,EAAG,EAC1E,GAAI,EAAa,MAAM,CAAE,YACvB,GAAqB,CAAC,qBAAqB,EAAE,EAAa,IAAI,CAAC,MAAA,CAAO,CAG1E,CAAE,MAAO,EAAY,CACnB,GAAqB,aAAa,MAAQ,EAAE,OAAO,CAAG,OAAO,IAC7D,MACF,QAAU,CACR,IAAmB,EACrB,CACF,CAEA,GAAqB,IACrB,IAAuB,GACvB,IAAkB,GAClB,GAAI,CACF,IAAM,EAAM,MAAM,MAAM,2BAA4B,CAClD,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,QAAE,EAAQ,WAAY,EAAM,KAAM,SAAU,EACnE,GACM,EAAO,MAAM,EAAI,IAAI,GAC3B,GAAI,CAAC,EAAI,EAAE,EAAI,CAAC,EAAK,EAAE,CAAE,MAAM,AAAI,MAAM,EAAK,KAAK,EAAI,wBAGvD,IAAM,EAAW,OAAO,EAAK,KAAK,EAAI,IAAI,IAAI,GAC9C,GAAI,EAAU,YACZ,EAAO,IAAI,CAAC,CAAC,OAAO,EAAE,EAAO,MAAM,EAAE,EAAW,CAAC,EAAE,EAAA,CAAU,EAI/D,GAAkB,IAClB,IAAM,EAAU,MAAM,MACpB,CAAC,gCAAgC,EAAE,mBAAmB,GAAQ,YAAY,EAAE,mBAAmB,GAAA,CAAO,CACtG,CAAE,MAAO,UAAW,GAEhB,EAAW,MAAM,EAAQ,IAAI,GACnC,GAAI,CAAC,EAAQ,EAAE,EAAI,CAAC,EAAS,EAAE,CAAE,MAAM,AAAI,MAAM,EAAS,KAAK,EAAI,0BAEnE,IAAM,EAAO,CADC,MAAM,OAAO,CAAC,EAAS,KAAK,EAAI,EAAS,KAAK,CAAG,EAAE,AAAF,EAC5C,GAAG,CAAC,AAAC,GAAe,OAAO,GAAK,IAAI,IAAI,IAAI,MAAM,CAAC,AAAC,IAAc,CAAQ,GAC7F,GAAgB,EAClB,CAAE,MAAO,EAAY,CACnB,IAAkB,GAClB,GAAqB,aAAa,MAAQ,EAAE,OAAO,CAAG,OAAO,GAC/D,QAAU,CACR,IAAuB,EACzB,CACF,EACA,UAAU,0JACV,MAAM,kFACP,cAGA,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qCAAqC,MAAO,YAAW,2BAGpE,WAIP,GAAa,qBAAqB,CAAC,MAAM,CACxC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,4FAAkF,+DAClC,GAAa,qBAAqB,CAAC,IAAI,CAAC,SAErG,GAAa,iBAAiB,CAChC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,2FACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,UAAI,+GACL,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mDACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,SAAU,GACV,QAAS,UACP,IAAkB,GAClB,GAAiB,IACjB,GAAI,CACF,GAAoB,UAAhB,EAAO,IAAI,CAAc,MAAM,AAAI,MAAM,uBAC7C,IAAM,EAAU,KAAK,KAAK,CAAC,EAAO,QAAQ,EACpC,EACJ,EAAQ,IAAI,EAA4B,UAAxB,OAAO,EAAQ,IAAI,EAAiB,CAAC,MAAM,OAAO,CAAC,EAAQ,IAAI,EAC3E,CAAE,GAAI,EAAQ,IAAI,AAA6B,EAC/C,CAAC,CACP,QAAO,EAAQ,aAAa,CAC5B,IAAM,EAAyB,CAAE,GAAG,CAAO,CAAE,KAAM,CAAQ,EACrD,EAAM,MAAM,MAAM,uBAAwB,CAC9C,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,QAAE,EAAQ,SAAU,CAAO,EAClD,GACM,EAAQ,MAAM,EAAI,IAAI,GAC5B,GAAI,CAAC,EAAI,EAAE,GAAgB,IAAZ,EAAK,CAAc,CAAZ,CACpB,MAAM,AAAI,MAAM,EAAK,KAAK,EAAI,2BAEhC,EAAU,CAAE,KAAM,QAAS,SAAU,KAAK,SAAS,CAAC,EAAQ,KAAM,GAAK,IAAK,GAC5E,MAAM,IACR,CAAE,MAAO,EAAY,CACnB,GAAiB,aAAa,MAAQ,EAAE,OAAO,CAAG,OAAO,GAC3D,QAAU,CACR,IAAkB,EACpB,CACF,EACA,UAAU,mJAET,GAAiB,cAAgB,WAEnC,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,oCAA4B,KAC1C,WAGN,GACF,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0FAAiF,0IAI9F,GAAa,mBAAmB,CAAC,MAAM,CACzC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,iGACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WAAI,wBAAsB,GAAa,mBAAmB,CAAC,IAAI,CAAC,SACjE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mDACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,KACP,GAAoB,IACpB,IAAmB,EACrB,EACA,UAAU,uIACX,2BAGD,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,KAAK,KACpB,UAAU,gJACX,aAGD,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,KACP,GAAiB,IACjB,IAAqB,EACvB,EACA,UAAU,sHACV,MAAM,yHACP,eAKH,KAEJ,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,iBAAiB,CAAA,CAChB,KAAM,GACN,MAAM,mBACN,KAAM,GACN,MAAO,SAAiB,EACxB,aAAa,qBACb,iBAAiB,UACjB,QAAS,KACH,IACJ,IAAqB,EACvB,EACA,IAHsB,MAGX,KACT,IAAgB,GAChB,IAAqB,EACvB,WAEA,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oEACb,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,UAAE,8OAKH,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,6DACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qEAA4D,uBAC3E,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,6DAAoD,mEAIrE,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,KAAK,SACL,SAAU,GACV,QAAS,UACP,IAAkB,GAClB,GAAiB,IACjB,GAAI,CACF,GAAI,AAAgB,YAAT,IAAI,CAAc,MAAM,AAAI,MAAM,uBAC7C,IAAM,EAAU,KAAK,KAAK,CAAC,EAAO,QAAQ,EACpC,EAAoC,CACxC,GAAI,EAAQ,IAAI,EAA4B,UAAxB,OAAO,EAAQ,IAAI,EAAiB,CAAC,MAAM,OAAO,CAAC,EAAQ,IAAI,EAC9E,EAAQ,IAAI,CACb,CAAC,CAAC,CACN,eAAe,CACjB,EACM,EAAyB,CAAE,GAAG,CAAO,CAAE,KAAM,CAAS,EACtD,EAAM,MAAM,MAAM,uBAAwB,CAC9C,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,QAAE,EAAQ,SAAU,CAAO,EAClD,GACM,EAAQ,MAAM,EAAI,IAAI,GAC5B,GAAI,CAAC,EAAI,EAAE,GAAgB,IAAZ,EAAK,CAAc,CAAZ,CACpB,MAAM,AAAI,MAAM,EAAK,KAAK,EAAI,2BAEhC,EAAU,CAAE,KAAM,QAAS,SAAU,KAAK,SAAS,CAAC,EAAQ,KAAM,GAAK,IAAK,GAC5E,IAAqB,EACvB,CAAE,MAAO,EAAY,CACnB,GAAiB,aAAa,MAAQ,EAAE,OAAO,CAAG,OAAO,GAC3D,QAAU,CACR,IAAkB,EACpB,CACF,EACA,UAAU,2HAEV,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,6CAAoC,qBACnD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yCAA+B,UACrC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAY,6BAA+B,kFAO1E,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,iBAAiB,CAAA,CAChB,KAAM,GACN,MAAM,4BACN,KAAM,GACN,MAAO,SAAoB,EAC3B,aAAa,UACb,QAAS,KACH,IACJ,IAAmB,EACrB,EACA,KAHuB,KAGZ,UACT,IAAmB,GACnB,GAAoB,IACpB,GAAI,CACF,IAAM,EAAM,MAAM,MAAM,mBAAoB,CAC1C,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,CAAE,OAAQ,YAAa,QAAO,EACrD,GACM,EAAQ,MAAM,EAAI,IAAI,GAC5B,GAAI,CAAC,EAAI,EAAE,GAAgB,IAAZ,EAAK,EAAE,CAAY,MAAM,AAAI,MAAM,EAAK,KAAK,EAAI,iCAEhE,OAAM,KACN,IAAmB,EACrB,CAAE,MAAO,EAAY,CACnB,GAAoB,aAAa,MAAQ,EAAE,OAAO,CAAG,OAAO,GAC9D,QAAU,CACR,IAAmB,EACrB,CACF,WAEA,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,0DAAgD,yGAE7D,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,2HACZ,GAAa,mBAAmB,CAAC,IAAI,CAAC,QAEzC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8DAAoD,mDACjB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAY,2CAA6C,YAK9H,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,2FACZ,KAED,KAEJ,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0BACZ,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,yDAAgD,oBAC7D,GAAa,MAAM,CACrB,GAAa,KAAK,CAAC,EAAG,GAAG,GAAG,CAAC,AAAC,IAC5B,IAAM,EAAO,OAAO,EAAG,EAAE,EAAI,IAAI,IAAI,GAC/B,EAAQ,OAAO,GAAG,OAAO,CAAC,gBAAiB,IAC3C,EAAW,KAA0B,EACrC,EAAO,EACT,CAAC,OAAO,EAAE,mBAAmB,GAAQ,MAAM,EAAE,mBAAmB,GAAM,CAAC,EAAE,mBAAmB,GAAA,CAAQ,CACpG,IAEJ,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAI,CAAA,CAEH,KAAM,EACN,QAAS,IAAM,GAAyB,GACxC,UACE,EACI,oHACA,2HAEN,MAAM,2BAEL,GAVI,EAaX,GAEA,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,yDAAgD,mBAInE,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,IAAI,CAAA,CAAA,EAAC,UAAU,+DACtB,CAAA,EAAA,EAAA,GAAA,EAAC,UAAA,CAAQ,UAAU,sGAA6F,UAChH,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBAEf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,iEACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mCACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,OAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,GACP,SAAU,AAAC,GAAM,GAAa,EAAE,MAAM,CAAC,KAAK,EAC5C,UAAU,iHACV,YAAY,yBAIhB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,oBAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,GACP,SAAU,AAAC,GAAM,GAAe,EAAE,MAAM,CAAC,KAAK,EAC9C,UAAU,iHACV,YAAY,4BAIhB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,SAC1F,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,GACP,SAAU,AAAC,GAAM,GAAe,EAAE,MAAM,CAAC,KAAK,EAC9C,UAAU,2HAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,iBAAQ,UACtB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,eAAM,QACpB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,eAAM,QACpB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,gBAAO,SACrB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,qBAAY,cAC1B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,iBAAQ,UACtB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,0BAAiB,mBAC/B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,uBAAc,gBAC5B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,uBAAc,gBAC5B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,mBAAU,kBAI5B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,KAEP,IAAM,EAAK,AADG,OAAO,IAAa,IAAI,IAAI,GACzB,OAAO,CAAC,iBAAkB,KAC3C,GAAI,CAAC,GACD,EAAG,KAAK,CAAC,IAAI,CAAC,AAAC,GAAM,EAAE,EAAE,GAAK,GADzB,EAC8B,KAEvC,IAAM,EAAO,EAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAK,IAAsB,UAAf,OAAO,EAAE,CAAC,CAAgB,KAAK,GAAG,CAAC,EAAK,EAAE,CAAC,EAAI,EAAM,IACzF,EAAW,CACf,KACA,KAAM,GACN,KAAM,OAAO,IAAe,IAAI,IAAI,IAAM,EAC1C,EAAG,EAAO,IACV,EAAG,EACL,EAEA,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,IAAI,EAAG,KAAK,CAAE,EAAS,AAAC,GACpD,GAAkB,GAClB,GAAa,IACb,GAAe,GACjB,EACA,UAAU,gJACX,oBAML,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0BACZ,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,IACb,IAAM,EAAW,KAAmB,EAAE,EAAE,CACxC,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAEC,KAAK,SACL,QAAS,IAAM,GAAkB,EAAE,EAAE,EACrC,UACE,EACI,oGACA,qHAGN,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,EAAE,EAAE,GACjC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,yFAAiF,EAAE,IAAI,KAVlG,EAAE,EAAE,CAaf,WAKJ,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,IAAI,CAAA,CAAA,EAAC,UAAU,+DACtB,CAAA,EAAA,EAAA,GAAA,EAAC,UAAA,CAAQ,UAAU,sGAA6F,UAChH,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBAEf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,iEACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mCACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,SAC1F,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,GACP,SAAU,AAAC,GAAM,GAAe,EAAE,MAAM,CAAC,KAAK,EAC9C,UAAU,2HAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,YAAG,aAChB,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAkB,MAAO,EAAE,EAAE,UAC3B,EAAE,EAAE,EADM,EAAE,EAAE,SAOvB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,OAC1F,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,GACP,SAAU,AAAC,GAAM,GAAa,EAAE,MAAM,CAAC,KAAK,EAC5C,UAAU,2HAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,YAAG,aAChB,EAAG,KAAK,CAAC,GAAG,CAAC,AAAC,GACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAkB,MAAO,EAAE,EAAE,UAC3B,EAAE,EAAE,EADM,EAAE,EAAE,SAOvB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,qBAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,GACP,SAAU,AAAC,GAAM,GAAgB,EAAE,MAAM,CAAC,KAAK,EAC/C,UAAU,iHACV,YAAY,oBAIhB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,KACP,IAAM,EAAO,OAAO,IAAe,IAAI,IAAI,GACrC,EAAK,OAAO,IAAa,IAAI,IAAI,GACvC,GAAI,CAAC,GAAQ,CAAC,GACV,IAAS,EADK,EACD,KAEjB,IAAM,EAA4C,CAChD,GAFS,CAAC,CAAC,EAAE,KAAK,GAAG,GAAA,CAAI,MAGzB,KACA,EACA,GAAI,OAAO,IAAgB,IAAI,IAAI,GAAK,CAAE,MAAO,OAAO,IAAc,IAAI,EAAG,EAAI,CAAC,CAAC,AACrF,EACA,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,IAAK,EAAG,KAAK,EAAI,EAAE,CAAG,EAAS,AAAC,GAC5D,GAAgB,GAClB,EACA,UAAU,gJACX,oBAML,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0BACZ,CAAC,EAAG,KAAK,EAAI,EAAA,AAAE,EAAE,MAAM,CACtB,CAAC,EAAG,KAAK,EAAI,EAAA,AAAE,EAAE,GAAG,CAAC,AAAC,GACpB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAe,UAAU,4DACxB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8DACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,EAAE,IAAI,GAAQ,MAAG,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,EAAE,EAAE,GAC9E,EAAE,KAAK,CAAG,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,kEAAwD,IAAE,EAAE,KAAK,CAAC,OAAW,QAE1G,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,GAAY,CAAE,GAAG,CAAE,CAAE,MAAO,CAAC,EAAG,KAAK,EAAI,EAAA,AAAE,EAAE,MAAM,CAAC,AAAC,GAAM,EAAE,EAAE,GAAK,EAAE,EAAE,CAAE,GACzF,UAAU,sGACX,eAVK,EAAE,EAAE,GAiBhB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,yDAAgD,oCAY3E,YAIR,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAkB,KAAM,OAG/B"}
1
+ {"version":3,"sources":["../../../../src/app/teams/%5BteamId%5D/workflows/%5BworkflowId%5D/workflows-editor-client.tsx","../../../../src/lib/workflows/validate.ts","../../../../src/lib/workflows/media-nodes.ts","../../../../src/components/media/MediaGenerationConfig.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\nimport { ConfirmationModal } from \"@/components/ConfirmationModal\";\nimport type { WorkflowFileV1 } from \"@/lib/workflows/types\";\nimport { validateWorkflowFileV1 } from \"@/lib/workflows/validate\";\nimport { getMediaNodeConfig, isMediaNode, type MediaGenerationConfig } from \"@/lib/workflows/media-nodes\";\nimport { MediaGenerationConfigComponent } from \"@/components/media/MediaGenerationConfig\";\nimport { RunLoadingOverlay } from \"@/components/RunLoadingOverlay\";\n\n// Helper function to collect upstream variables for template insertion\nfunction getUpstreamVariables(\n wf: WorkflowFileV1, \n nodeId: string\n): Array<{nodeId: string, nodeName: string, fieldName: string, fieldType: string}> {\n const variables: Array<{nodeId: string, nodeName: string, fieldName: string, fieldType: string}> = [];\n \n // BFS backwards from nodeId to find all upstream ancestors\n const upstream = new Set<string>();\n const queue = [nodeId];\n const visited = new Set<string>();\n \n while (queue.length > 0) {\n const currentId = queue.shift()!;\n if (visited.has(currentId)) continue;\n visited.add(currentId);\n \n for (const edge of (wf.edges ?? [])) {\n if (edge.to === currentId && !upstream.has(edge.from) && edge.from !== nodeId) {\n upstream.add(edge.from);\n queue.push(edge.from);\n }\n }\n }\n \n // For each upstream node, collect its output fields + standard outputs\n for (const upstreamId of upstream) {\n const upstreamNode = wf.nodes.find(n => n.id === upstreamId);\n if (!upstreamNode) continue;\n \n const nodeName = upstreamNode.name || upstreamId;\n const config = upstreamNode.config && typeof upstreamNode.config === 'object' && !Array.isArray(upstreamNode.config) ? upstreamNode.config as Record<string, unknown> : {};\n \n // Always include standard outputs for every upstream node\n variables.push(\n { nodeId: upstreamId, nodeName, fieldName: 'output', fieldType: 'text' },\n { nodeId: upstreamId, nodeName, fieldName: 'text', fieldType: 'text' }\n );\n \n // Include declared output fields if they exist\n const outputFields = config.outputFields as Array<{name: string, type: string}> | undefined;\n if (Array.isArray(outputFields)) {\n for (const field of outputFields) {\n if (field.name?.trim()) {\n variables.push({\n nodeId: upstreamId,\n nodeName,\n fieldName: field.name.trim(),\n fieldType: field.type || 'text'\n });\n }\n }\n }\n }\n \n return variables;\n}\n\n// Variable insertion dropdown component\nfunction VariableInsertDropdown({\n targetTextareaRef,\n workflow,\n currentNodeId,\n onInsert\n}: {\n targetTextareaRef: React.RefObject<HTMLTextAreaElement | null>;\n workflow: WorkflowFileV1;\n currentNodeId: string;\n onInsert?: (variable: string) => void;\n}) {\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n \n const variables = useMemo(() => getUpstreamVariables(workflow, currentNodeId), [workflow, currentNodeId]);\n\n // Always-available globals (these work across node types)\n const globalVariables = useMemo(\n () => [\n { variable: \"{{run.id}}\", type: \"text\" },\n { variable: \"{{workflow.name}}\", type: \"text\" },\n { variable: \"{{workflow.id}}\", type: \"text\" },\n { variable: \"{{node.id}}\", type: \"text\" },\n { variable: \"{{date}}\", type: \"text\" },\n ],\n []\n );\n \n // Close dropdown when clicking outside\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n }\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isOpen]);\n \n const insertVariable = (variable: string) => {\n const textarea = targetTextareaRef.current;\n if (textarea) {\n const start = textarea.selectionStart;\n const end = textarea.selectionEnd;\n const currentValue = textarea.value;\n const newValue = currentValue.substring(0, start) + variable + currentValue.substring(end);\n \n // Use the onInsert callback to update the parent component's state\n if (onInsert) {\n onInsert(newValue);\n \n // Set cursor position after the inserted variable\n setTimeout(() => {\n textarea.focus();\n const newCursorPos = start + variable.length;\n textarea.setSelectionRange(newCursorPos, newCursorPos);\n }, 0);\n }\n }\n setIsOpen(false);\n };\n \n // Group variables by node\n const groupedVariables = variables.reduce((groups, variable) => {\n const key = `${variable.nodeId}|${variable.nodeName}`;\n if (!groups[key]) {\n groups[key] = { nodeId: variable.nodeId, nodeName: variable.nodeName, fields: [] };\n }\n groups[key].fields.push({ name: variable.fieldName, type: variable.fieldType });\n return groups;\n }, {} as Record<string, { nodeId: string; nodeName: string; fields: Array<{ name: string; type: string }> }>);\n \n return (\n <div className=\"absolute top-1 right-1\" ref={dropdownRef}>\n <button\n type=\"button\"\n onClick={() => setIsOpen(!isOpen)}\n className=\"rounded-lg border border-white/10 bg-black/30 px-2 py-1 text-[9px] text-[color:var(--ck-text-secondary)] hover:bg-white/10 hover:text-[color:var(--ck-text-primary)]\"\n title=\"Insert variable\"\n >\n {'{{}}'}\n </button>\n \n {isOpen && (\n <div className=\"absolute right-0 top-8 z-50 w-72 max-h-80 overflow-auto rounded-lg border border-white/15 bg-black/80 backdrop-blur shadow-[var(--ck-shadow-1)]\">\n <div className=\"p-1\">\n <div>\n <div className=\"px-2 py-1 text-[10px] font-medium uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">\n Globals\n </div>\n {globalVariables.map(({ variable, type }) => (\n <button\n key={variable}\n type=\"button\"\n onClick={() => insertVariable(variable)}\n className=\"w-full flex items-center justify-between gap-2 rounded-lg px-2 py-1 text-left text-xs text-[color:var(--ck-text-primary)] hover:bg-white/10 cursor-pointer\"\n >\n <span className=\"font-mono\">{variable}</span>\n <span className=\"text-[9px] px-1 py-0.5 rounded-sm bg-black/30 text-blue-400\">\n {type}\n </span>\n </button>\n ))}\n </div>\n\n {Object.values(groupedVariables).map(group => (\n <div key={group.nodeId}>\n <div className=\"px-2 py-1 text-[10px] font-medium uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">\n {group.nodeName}\n </div>\n {group.fields.map(field => {\n const variable = `{{${group.nodeId}.${field.name}}}`;\n const badgeColor = field.type === 'text' ? 'text-blue-400' : \n field.type === 'list' ? 'text-green-400' : \n field.type === 'json' ? 'text-amber-400' : 'text-gray-400';\n \n return (\n <button\n key={`${group.nodeId}.${field.name}`}\n type=\"button\"\n onClick={() => insertVariable(variable)}\n className=\"w-full flex items-center justify-between gap-2 rounded-lg px-2 py-1 text-left text-xs text-[color:var(--ck-text-primary)] hover:bg-white/10 cursor-pointer\"\n >\n <span className=\"font-mono\">{variable}</span>\n <span className={`text-[9px] px-1 py-0.5 rounded-sm bg-black/30 ${badgeColor}`}>\n {field.type}\n </span>\n </button>\n );\n })}\n </div>\n ))}\n \n {variables.length === 0 && (\n <div className=\"px-2 py-3 text-xs text-[color:var(--ck-text-secondary)]\">\n Tip: Add output fields to upstream nodes to see node-specific variables here.\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction TemplateTextareaWithVars({\n value,\n onChangeValue,\n workflow,\n currentNodeId,\n className,\n placeholder,\n spellCheck,\n}: {\n value: string;\n onChangeValue: (next: string) => void;\n workflow: WorkflowFileV1;\n currentNodeId: string;\n className: string;\n placeholder?: string;\n spellCheck?: boolean;\n}) {\n const ref = useRef<HTMLTextAreaElement>(null);\n return (\n <div className=\"relative\">\n <textarea\n ref={ref}\n value={value}\n onChange={(e) => onChangeValue(e.target.value)}\n className={className}\n placeholder={placeholder}\n spellCheck={spellCheck}\n />\n <VariableInsertDropdown\n targetTextareaRef={ref}\n workflow={workflow}\n currentNodeId={currentNodeId}\n onInsert={(newValue) => onChangeValue(newValue)}\n />\n </div>\n );\n}\n\n// Output fields editor component for all node types\nfunction OutputFieldsEditor({\n outputFields,\n onChange\n}: {\n outputFields: OutputField[];\n onChange: (fields: OutputField[]) => void;\n}) {\n return (\n <div>\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">\n output fields (optional)\n </div>\n <div className=\"text-[9px] text-[color:var(--ck-text-secondary)] mb-2\">\n Define what this node produces for downstream nodes\n </div>\n <div className=\"space-y-1\">\n {outputFields.map((field, index) => (\n <div key={index} className=\"flex items-center gap-2\">\n <input\n value={field.name}\n onChange={(e) => {\n const newOutputFields = [...outputFields];\n newOutputFields[index] = { ...field, name: e.target.value };\n onChange(newOutputFields);\n }}\n className=\"flex-1 rounded-lg border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"Field name\"\n />\n <select\n value={field.type}\n onChange={(e) => {\n const newType = e.target.value as OutputFieldType;\n const newOutputFields = [...outputFields];\n newOutputFields[index] = { ...field, type: newType };\n onChange(newOutputFields);\n }}\n className=\"rounded-lg border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"text\">text</option>\n <option value=\"list\">list</option>\n <option value=\"json\">json</option>\n </select>\n <button\n type=\"button\"\n onClick={() => {\n const newOutputFields = outputFields.filter((_, i) => i !== index);\n onChange(newOutputFields);\n }}\n className=\"text-xs text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n ×\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n onClick={() => {\n const newOutputFields = [...outputFields, { name: \"\", type: \"text\" as const }];\n onChange(newOutputFields);\n }}\n className=\"text-xs text-[color:var(--ck-text-secondary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n + Add field\n </button>\n </div>\n </div>\n );\n}\n\ntype LoadState =\n | { kind: \"loading\" }\n | { kind: \"error\"; error: string }\n | { kind: \"ready\"; jsonText: string };\n\ntype OutputFieldType = \"text\" | \"list\" | \"json\";\ntype OutputField = { name: string; type: OutputFieldType };\n\nfunction draftKey(teamId: string, workflowId: string) {\n return `ck-wf-draft:${teamId}:${workflowId}`;\n}\n\nexport default function WorkflowsEditorClient({\n teamId,\n workflowId,\n draft,\n llmTaskEnabled,\n}: {\n teamId: string;\n workflowId: string;\n draft: boolean;\n llmTaskEnabled?: boolean;\n}) {\n const router = useRouter();\n const [view, setView] = useState<\"canvas\" | \"json\">(\"canvas\");\n const [saving, setSaving] = useState(false);\n const [status, setStatus] = useState<LoadState>({ kind: \"loading\" });\n const [actionError, setActionError] = useState<string>(\"\");\n const [triggerSyncStatus, setTriggerSyncStatus] = useState<\"idle\" | \"syncing\" | \"success\" | \"error\">(\n \"idle\"\n );\n const [triggerSyncError, setTriggerSyncError] = useState<string>(\"\");\n const importInputRef = useRef<HTMLInputElement | null>(null);\n\n const [toolsCollapsed, setToolsCollapsed] = useState(false);\n\n // Canvas zoom\n const [zoom, setZoom] = useState(1);\n const ZOOM_MIN = 0.5;\n const ZOOM_MAX = 2.5;\n const ZOOM_STEP = 0.1;\n\n // Canvas: selection, drag, node/edge creation.\n const canvasRef = useRef<HTMLDivElement | null>(null);\n const [selectedNodeId, setSelectedNodeId] = useState<string>(\"\");\n const [dragging, setDragging] = useState<null | { nodeId: string; dx: number; dy: number }>(null);\n\n const [activeTool, setActiveTool] = useState<\n | { kind: \"select\" }\n | { kind: \"add-node\"; nodeType: WorkflowFileV1[\"nodes\"][number][\"type\"] }\n | { kind: \"connect\" }\n >({ kind: \"select\" });\n const [connectFromNodeId, setConnectFromNodeId] = useState<string>(\"\");\n\n const [agents, setAgents] = useState<Array<{ id: string; identityName?: string }>>([]);\n const [agentsError, setAgentsError] = useState<string>(\"\");\n\n const [approvalBindings, setApprovalBindings] = useState<Array<{ id: string; label: string; channel: string; target: string }>>([]);\n const [approvalBindingsError, setApprovalBindingsError] = useState<string>(\"\");\n const [availableModels, setAvailableModels] = useState<string[]>([]);\n const [availableModelsError, setAvailableModelsError] = useState<string>(\"\");\n\n // Handoff node: available teams & their workflows\n const [handoffTeams, setHandoffTeams] = useState<string[]>([]);\n const [handoffWorkflows, setHandoffWorkflows] = useState<Record<string, Array<{ id: string; name?: string }>>>({});\n const [handoffTeamsLoading, setHandoffTeamsLoading] = useState(false);\n // Generic per-platform account cache for handoff nodes. Key format: `${teamId}::${canonicalPlatform}`.\n // Each account carries `identifier` (raw Postiz type e.g. `instagram-standalone`) so workflows\n // stay variant-aware at publish time even when the UI groups variants together.\n const [handoffAccounts, setHandoffAccounts] = useState<Record<string, Array<{ integrationId: string; displayName: string; username?: string; identifier: string }>>>({});\n const [handoffAccountsLoading, setHandoffAccountsLoading] = useState<Record<string, boolean>>({});\n\n // Extract the platform a per-platform post workflow targets. Convention:\n // social-post-to-<platform>-v<N> (platform may contain hyphens, e.g. google-business)\n // Returns null for workflows that don't follow this convention (e.g. social-execution-from-handoff),\n // in which case the picker stays hidden.\n const extractPlatformFromWorkflowId = (workflowId: string): string | null => {\n const m = String(workflowId || '').match(/^social-post-to-(.+)-v\\d+$/i);\n return m ? m[1].toLowerCase() : null;\n };\n // Collapse Postiz variants (instagram-standalone → instagram, facebook-page → facebook).\n const canonicalPlatform = (identifier: string): string => {\n return String(identifier || '').toLowerCase().replace(/-standalone$/, '').replace(/-page$/, '');\n };\n const accountsKey = (tid: string, platform: string) => `${tid}::${canonicalPlatform(platform)}`;\n const [showRawConfig, setShowRawConfig] = useState<Record<string, boolean>>({});\n\n const approvalBindingsNeedsKitchenUpdate = useMemo(() => {\n return /Tool not available:\\s*gateway/i.test(String(approvalBindingsError || \"\"));\n }, [approvalBindingsError]);\n\n // Inspector state (parity with modal)\n const [workflowRuns, setWorkflowRuns] = useState<string[]>([]);\n const [workflowRunsLoading, setWorkflowRunsLoading] = useState(false);\n const [runOverlayOpen, setRunOverlayOpen] = useState(false);\n const [workflowRunsError, setWorkflowRunsError] = useState(\"\");\n const [selectedWorkflowRunId, setSelectedWorkflowRunId] = useState<string>(\"\");\n\n // Run preflight: ensure nodes are assigned + required worker cron exists.\n const [cronLoading, setCronLoading] = useState(false);\n const [cronError, setCronError] = useState<string>(\"\");\n const [agentHasCron, setAgentHasCron] = useState<Record<string, boolean>>({});\n\n const [installCronOpen, setInstallCronOpen] = useState(false);\n const [installCronBusy, setInstallCronBusy] = useState(false);\n const [installCronError, setInstallCronError] = useState<string>(\"\");\n\n // Skip cron check: session-only flag (\"skipCronOnce\") OR persisted flag on the\n // workflow JSON at `meta.skipCronCheck` (\"skipCronPermanent\"). Either unblocks\n // the Run Now button when worker crons aren't installed (e.g. when workers\n // are running via launchd or an external scheduler).\n const [skipCronOnce, setSkipCronOnce] = useState(false);\n const [skipCronModalOpen, setSkipCronModalOpen] = useState(false);\n const [skipCronSaving, setSkipCronSaving] = useState(false);\n const [skipCronError, setSkipCronError] = useState<string>(\"\");\n\n const [newNodeId, setNewNodeId] = useState(\"\");\n const [newNodeName, setNewNodeName] = useState(\"\");\n const [newNodeType, setNewNodeType] = useState<WorkflowFileV1[\"nodes\"][number][\"type\"]>(\"llm\");\n\n const [newEdgeFrom, setNewEdgeFrom] = useState(\"\");\n const [newEdgeTo, setNewEdgeTo] = useState(\"\");\n const [newEdgeLabel, setNewEdgeLabel] = useState(\"\");\n\n useEffect(() => {\n (async () => {\n try {\n if (draft) {\n const stored = sessionStorage.getItem(draftKey(teamId, workflowId));\n if (stored) {\n setStatus({ kind: \"ready\", jsonText: stored });\n return;\n }\n\n // New draft: initialize a clean workflow instead of trying to fetch an existing file.\n const initial: WorkflowFileV1 = {\n schema: \"clawkitchen.workflow.v1\",\n id: workflowId,\n name: \"New workflow\",\n timezone: \"UTC\",\n nodes: [\n { id: \"start\", type: \"start\", name: \"start\", x: 80, y: 80, config: {} },\n { id: \"end\", type: \"end\", name: \"end\", x: 520, y: 80, config: {} },\n ],\n edges: [{ id: \"e1\", from: \"start\", to: \"end\" }],\n };\n const text = JSON.stringify(initial, null, 2) + \"\\n\";\n setStatus({ kind: \"ready\", jsonText: text });\n try {\n sessionStorage.setItem(draftKey(teamId, workflowId), text);\n } catch {\n // ignore\n }\n return;\n }\n\n const res = await fetch(\n `/api/teams/workflows?teamId=${encodeURIComponent(teamId)}&id=${encodeURIComponent(workflowId)}`,\n { cache: \"no-store\" }\n );\n const json = (await res.json()) as { ok?: boolean; error?: string; workflow?: unknown };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to load workflow\");\n setStatus({ kind: \"ready\", jsonText: JSON.stringify(json.workflow, null, 2) + \"\\n\" });\n } catch (e: unknown) {\n setStatus({ kind: \"error\", error: e instanceof Error ? e.message : String(e) });\n }\n })();\n }, [teamId, workflowId, draft]);\n\n useEffect(() => {\n (async () => {\n setAgentsError(\"\");\n try {\n const res = await fetch(\"/api/agents\", { cache: \"no-store\" });\n const json = (await res.json()) as { agents?: Array<{ id?: unknown; identityName?: unknown }>; error?: string; message?: string };\n if (!res.ok) throw new Error(json.error || json.message || \"Failed to load agents\");\n const list = Array.isArray(json.agents) ? json.agents : [];\n const filtered = list\n .map((a) => ({ id: String(a.id ?? \"\").trim(), identityName: typeof a.identityName === \"string\" ? a.identityName : undefined }))\n .filter((a) => a.id && a.id.startsWith(`${teamId}-`));\n setAgents(filtered);\n } catch (e: unknown) {\n setAgentsError(e instanceof Error ? e.message : String(e));\n setAgents([]);\n }\n })();\n }, [teamId]);\n\n function isRecord(v: unknown): v is Record<string, unknown> {\n return Boolean(v) && typeof v === \"object\" && !Array.isArray(v);\n }\n\n function bindingLabelAndTarget(b: unknown): { id: string; label: string; channel: string; target: string } | null {\n // Expected OpenClaw binding shape:\n // { agentId, match: { channel: \"telegram\", accountId?: string, peer?: { kind: \"dm\"|\"group\", id: string } } }\n if (!isRecord(b)) return null;\n const match = isRecord(b.match) ? b.match : null;\n if (!match) return null;\n\n const channel = String(match.channel ?? \"\").trim();\n if (!channel) return null;\n\n const bindingAgentId = String(b.agentId ?? \"\").trim();\n const accountId = String(match.accountId ?? \"\").trim();\n const peer = isRecord(match.peer) ? match.peer : null;\n const kind = peer ? String(peer.kind ?? \"\").trim() : \"\";\n const peerId = peer ? String(peer.id ?? \"\").trim() : \"\";\n const target = peerId || accountId;\n\n if (!target) return null;\n\n // approvalBindingId must be the actual config binding id (agentId) when available.\n // Older Kitchen builds synthesized ids like telegram:dm:<peer> or telegram:account:<id>,\n // which can be ambiguous and break approval resolution when multiple bindings share a peer.\n const id = bindingAgentId || (accountId ? `${channel}:account:${accountId}` : `${channel}:${kind}:${peerId}`);\n\n const parts = [channel];\n if (bindingAgentId) parts.push(bindingAgentId);\n if (accountId) parts.push(`account:${accountId}`);\n if (kind && peerId) parts.push(`${kind}:${peerId}`);\n\n return { id, label: parts.join(\" · \"), channel, target };\n }\n\n useEffect(() => {\n (async () => {\n setApprovalBindingsError(\"\");\n try {\n const res = await fetch(\"/api/channels/bindings\", { cache: \"no-store\" });\n const json = (await res.json()) as { ok?: boolean; bindings?: unknown[]; error?: string };\n if (!res.ok || json.ok === false) throw new Error(json.error || \"Failed to load bindings\");\n\n const list = Array.isArray(json.bindings) ? json.bindings : [];\n const mapped = list.map(bindingLabelAndTarget).filter(Boolean) as Array<{ id: string; label: string; channel: string; target: string }>;\n setApprovalBindings(mapped);\n } catch (e: unknown) {\n setApprovalBindingsError(e instanceof Error ? e.message : String(e));\n setApprovalBindings([]);\n }\n })();\n }, []);\n\n useEffect(() => {\n (async () => {\n setAvailableModelsError(\"\");\n try {\n const res = await fetch(\"/api/settings/model-options\", { cache: \"no-store\" });\n const json = (await res.json()) as { ok?: boolean; models?: unknown[]; error?: string };\n if (!res.ok || json.ok === false) throw new Error(json.error || \"Failed to load model options\");\n\n const deduped = Array.isArray(json.models)\n ? Array.from(new Set(json.models.map((m) => String(m ?? \"\").trim()).filter(Boolean)))\n : [];\n setAvailableModels(deduped);\n } catch (e: unknown) {\n setAvailableModelsError(e instanceof Error ? e.message : String(e));\n setAvailableModels([]);\n }\n })();\n }, []);\n\n const refreshCronMap = useCallback(async (): Promise<Record<string, boolean>> => {\n // Preflight helper: determine whether each workflow-assigned agent has a\n // workflow worker-tick cron installed and enabled. Safe-idle or other\n // generic crons do NOT satisfy this requirement — only crons whose name\n // starts with \"workflow-worker:\" or whose payload message contains\n // \"worker-tick\" count.\n setCronError(\"\");\n setCronLoading(true);\n try {\n const res = await fetch(\"/api/cron/jobs\", { cache: \"no-store\" });\n const json = (await res.json()) as { ok?: boolean; error?: string; jobs?: unknown[] };\n if (!res.ok || json.ok === false) throw new Error(json.error || \"Failed to load cron jobs\");\n const jobs = Array.isArray(json.jobs) ? json.jobs : [];\n\n const map: Record<string, boolean> = {};\n for (const j of jobs) {\n const job = j as {\n enabled?: unknown;\n name?: unknown;\n agentId?: unknown;\n payload?: { message?: unknown; kind?: unknown };\n scope?: { kind?: unknown; id?: unknown };\n };\n if (!job || !Boolean(job.enabled)) continue;\n\n // Only match workflow worker-tick crons, not safe-idle or other agent crons.\n const jobName = String(job.name ?? \"\");\n const payloadMsg = String(job.payload?.message ?? \"\");\n const isWorkerTick = jobName.startsWith(\"workflow-worker:\") || payloadMsg.includes(\"worker-tick\");\n if (!isWorkerTick) continue;\n\n // Worker-tick crons run as agentId \"main\" but reference the target\n // agent in the name (workflow-worker:<teamId>:<agentId>) and message.\n // Extract the target agent from the name or payload.\n const nameMatch = jobName.match(/^workflow-worker:[^:]+:(.+)$/);\n if (nameMatch?.[1]) {\n map[nameMatch[1]] = true;\n continue;\n }\n\n // Fallback: extract from payload message pattern \"worker-tick ... --agent-id <id>\"\n const msgMatch = payloadMsg.match(/--agent-id\\s+(\\S+)/);\n if (msgMatch?.[1]) {\n map[msgMatch[1]] = true;\n continue;\n }\n\n // Last resort: if the cron runs as a non-main agent, use that.\n const agentId = String(job.agentId ?? \"\").trim();\n if (agentId && agentId !== \"main\") {\n map[agentId] = true;\n }\n }\n setAgentHasCron(map);\n return map;\n } catch (e: unknown) {\n setCronError(e instanceof Error ? e.message : String(e));\n setAgentHasCron({});\n return {};\n } finally {\n setCronLoading(false);\n }\n }, []);\n\n useEffect(() => {\n void refreshCronMap();\n }, [refreshCronMap]);\n\n const parsed = useMemo(() => {\n if (status.kind !== \"ready\") return { wf: null as WorkflowFileV1 | null, err: \"\" };\n try {\n const wf = JSON.parse(status.jsonText) as WorkflowFileV1;\n return { wf, err: \"\" };\n } catch (e: unknown) {\n return { wf: null, err: e instanceof Error ? e.message : String(e) };\n }\n }, [status]);\n\n const validation = useMemo(() => {\n if (!parsed.wf) return { errors: [], warnings: [] as string[] };\n return validateWorkflowFileV1(parsed.wf);\n }, [parsed.wf]);\n\n const runPreflight = useMemo(() => {\n const wf = parsed.wf;\n if (!wf) {\n return {\n missingAgentOnNodeIds: [] as string[],\n requiredAgentIds: [] as string[],\n agentIdsMissingCron: [] as string[],\n ok: true,\n };\n }\n\n const nodesToExecute = (wf.nodes ?? []).filter(\n (n) => n.type !== \"start\" && n.type !== \"end\" && n.type !== \"human_approval\"\n );\n\n const missingAgentOnNodeIds = nodesToExecute\n .filter((n) => {\n const cfg = n.config && typeof n.config === \"object\" && !Array.isArray(n.config) ? (n.config as Record<string, unknown>) : {};\n const agentId = String(cfg.agentId ?? \"\").trim();\n return !agentId;\n })\n .map((n) => n.id);\n\n const requiredAgentIds = Array.from(\n new Set(\n nodesToExecute\n .map((n) => {\n const cfg = n.config && typeof n.config === \"object\" && !Array.isArray(n.config) ? (n.config as Record<string, unknown>) : {};\n return String(cfg.agentId ?? \"\").trim();\n })\n .filter(Boolean)\n )\n );\n\n const agentIdsMissingCron = requiredAgentIds.filter((id) => !agentHasCron[id]);\n\n // meta.skipCronCheck is the persisted \"skip permanently\" flag on the workflow itself.\n const meta = wf.meta && typeof wf.meta === \"object\" && !Array.isArray(wf.meta)\n ? (wf.meta as Record<string, unknown>)\n : {};\n const skipCronPermanent = meta.skipCronCheck === true;\n\n const cronSatisfied = agentIdsMissingCron.length === 0 || skipCronOnce || skipCronPermanent;\n const ok = missingAgentOnNodeIds.length === 0 && cronSatisfied;\n return {\n missingAgentOnNodeIds,\n requiredAgentIds,\n agentIdsMissingCron,\n skipCronPermanent,\n ok,\n };\n }, [parsed.wf, agentHasCron, skipCronOnce]);\n\n function setWorkflow(next: WorkflowFileV1) {\n const text = JSON.stringify(next, null, 2) + \"\\n\";\n setStatus({ kind: \"ready\", jsonText: text });\n if (draft) {\n try {\n sessionStorage.setItem(draftKey(teamId, workflowId), text);\n } catch {\n // ignore\n }\n }\n }\n\n async function onSave() {\n if (status.kind !== \"ready\") return;\n if (!parsed.wf) return;\n if (parsed.err) return;\n if (validation.errors.length) return;\n\n setSaving(true);\n setActionError(\"\");\n setTriggerSyncStatus(\"idle\");\n setTriggerSyncError(\"\");\n \n try {\n // Save workflow first\n const res = await fetch(\"/api/teams/workflows\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, workflow: parsed.wf }),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to save workflow\");\n\n // Clear draft cache once persisted.\n try {\n sessionStorage.removeItem(draftKey(teamId, workflowId));\n } catch {\n // ignore\n }\n\n // Sync triggers (don't block save flow on trigger sync errors)\n if (parsed.wf.triggers?.length) {\n try {\n setTriggerSyncStatus(\"syncing\");\n const triggerRes = await fetch(\"/api/teams/workflow-triggers\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n action: \"sync\",\n teamId,\n workflowId: parsed.wf.id,\n triggers: parsed.wf.triggers ?? [],\n }),\n });\n const triggerJson = (await triggerRes.json()) as { ok?: boolean; error?: string };\n \n if (triggerRes.ok && triggerJson.ok) {\n setTriggerSyncStatus(\"success\");\n // Clear success status after 3 seconds\n setTimeout(() => setTriggerSyncStatus(\"idle\"), 3000);\n } else {\n setTriggerSyncStatus(\"error\");\n setTriggerSyncError(triggerJson.error || \"Failed to sync triggers\");\n }\n } catch (e: unknown) {\n setTriggerSyncStatus(\"error\");\n setTriggerSyncError(e instanceof Error ? e.message : \"Failed to sync triggers\");\n }\n }\n } catch (e: unknown) {\n setActionError(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n\n function onExport() {\n if (!parsed.wf) return;\n if (parsed.err) return;\n if (validation.errors.length) return;\n\n const filename = `${parsed.wf.id || workflowId}.workflow.json`;\n const blob = new Blob([JSON.stringify(parsed.wf, null, 2) + \"\\n\"], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n }\n\n if (status.kind === \"loading\") return <div className=\"w-full\">Loading…</div>;\n if (status.kind === \"error\") return <div className=\"w-full\">{status.error}</div>;\n\n // (section collapse uses native <details> to keep this file simple)\n const llmHelp = llmTaskEnabled === false ? (\n <div className=\"mx-3 mb-3 rounded-lg border border-amber-500/30 bg-amber-500/10 p-3 text-sm\">\n <div className=\"font-medium text-amber-200\">LLM support is not enabled</div>\n <div className=\"mt-1 text-[color:var(--ck-text-secondary)]\">\n Workflow LLM nodes require the optional built-in <code className=\"px-1\">llm-task</code> plugin.\n </div>\n <div className=\"mt-2 text-[color:var(--ck-text-secondary)]\">\n Enable it with: <code className=\"px-1\">openclaw plugins enable llm-task</code> then run{' '}\n <code className=\"px-1\">openclaw gateway restart</code>.\n </div>\n </div>\n ) : null;\n\n\n return (\n <div className=\"flex h-full min-h-0 w-full flex-1 flex-col\">\n <div className=\"flex flex-wrap items-center justify-between gap-3 px-3 py-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <a\n href={`/teams/${encodeURIComponent(teamId)}?tab=workflows`}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Back\n </a>\n <div className=\"min-w-0\">\n <div className=\"truncate text-base font-medium text-[color:var(--ck-text-primary)]\">\n {workflowId}.workflow.json\n </div>\n <div className=\"mt-0.5 text-sm text-[color:var(--ck-text-tertiary)]\">Team: {teamId}</div>\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"flex overflow-hidden rounded-lg border border-white/10\">\n <button\n type=\"button\"\n onClick={() => setView(\"canvas\")}\n className={\n view === \"canvas\"\n ? \"bg-white/10 px-3 py-2 text-xs font-medium text-[color:var(--ck-text-primary)]\"\n : \"bg-transparent px-3 py-2 text-xs font-medium text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n >\n Canvas\n </button>\n <button\n type=\"button\"\n onClick={() => setView(\"json\")}\n className={\n view === \"json\"\n ? \"bg-white/10 px-3 py-2 text-xs font-medium text-[color:var(--ck-text-primary)]\"\n : \"bg-transparent px-3 py-2 text-xs font-medium text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n >\n JSON\n </button>\n </div>\n\n <input\n ref={importInputRef}\n type=\"file\"\n accept=\"application/json,.json\"\n className=\"hidden\"\n onChange={async (e) => {\n const file = e.target.files?.[0];\n // Reset the input so re-importing the same file still triggers onChange.\n e.target.value = \"\";\n if (!file) return;\n\n setActionError(\"\");\n try {\n const text = await file.text();\n const next = JSON.parse(text) as WorkflowFileV1;\n setStatus({ kind: \"ready\", jsonText: JSON.stringify(next, null, 2) + \"\\n\" });\n if (draft) {\n try {\n sessionStorage.setItem(draftKey(teamId, workflowId), JSON.stringify(next, null, 2) + \"\\n\");\n } catch {\n // ignore\n }\n }\n } catch (err: unknown) {\n setActionError(err instanceof Error ? err.message : String(err));\n }\n }}\n />\n\n <button\n type=\"button\"\n disabled={saving}\n onClick={() => importInputRef.current?.click()}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-white/10 disabled:opacity-50\"\n >\n Import\n </button>\n\n <button\n type=\"button\"\n disabled={!parsed.wf || Boolean(parsed.err) || validation.errors.length > 0}\n onClick={onExport}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-white/10 disabled:opacity-50\"\n >\n Export\n </button>\n\n <button\n type=\"button\"\n disabled={saving || !parsed.wf || Boolean(parsed.err) || validation.errors.length > 0}\n onClick={onSave}\n className=\"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save\"}\n </button>\n\n {/* Back button lives in the left header. */}\n </div>\n </div>\n\n {llmHelp}\n\n {parsed.err ? (\n <div className=\"mt-3 rounded-lg border border-yellow-400/30 bg-yellow-500/10 p-3 text-sm text-yellow-100\">\n JSON parse error: {parsed.err}\n </div>\n ) : null}\n {!parsed.err && validation.errors.length ? (\n <div className=\"mt-3 rounded-lg border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n <div className=\"font-medium\">Workflow validation errors</div>\n <ul className=\"mt-2 list-disc space-y-1 pl-5\">\n {validation.errors.map((e) => (\n <li key={e}>{e}</li>\n ))}\n </ul>\n </div>\n ) : null}\n\n {!parsed.err && !validation.errors.length && validation.warnings.length ? (\n <div className=\"mt-3 rounded-lg border border-yellow-400/30 bg-yellow-500/10 p-3 text-sm text-yellow-100\">\n <div className=\"font-medium\">Workflow validation warnings</div>\n <ul className=\"mt-2 list-disc space-y-1 pl-5\">\n {validation.warnings.map((w) => (\n <li key={w}>{w}</li>\n ))}\n </ul>\n </div>\n ) : null}\n\n {actionError ? (\n <div className=\"mt-3 rounded-lg border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {actionError}\n </div>\n ) : null}\n\n <div className=\"flex min-h-0 flex-1 gap-0\">\n {view === \"json\" ? (\n <textarea\n value={status.jsonText}\n onChange={(e) => {\n const t = e.target.value;\n setStatus({ kind: \"ready\", jsonText: t });\n if (draft) {\n try {\n sessionStorage.setItem(draftKey(teamId, workflowId), t);\n } catch {\n // ignore\n }\n }\n }}\n className=\"h-full min-h-0 w-full flex-1 resize-none rounded-lg border border-white/10 bg-white/5 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]\"\n />\n ) : (\n <div\n ref={canvasRef}\n className=\"relative h-full min-h-0 w-full flex-1 overflow-auto bg-white/5\"\n onWheel={(e) => {\n // Ctrl/Cmd + wheel to zoom (avoid hijacking normal scroll)\n if (!e.ctrlKey && !e.metaKey) return;\n e.preventDefault();\n const dir = e.deltaY > 0 ? -1 : 1;\n setZoom((z) => {\n const next = Math.max(ZOOM_MIN, Math.min(ZOOM_MAX, Math.round((z + dir * ZOOM_STEP) * 10) / 10));\n return next;\n });\n }}\n onClick={(e) => {\n if (activeTool.kind !== \"add-node\") return;\n const wf = parsed.wf;\n if (!wf) return;\n const el = canvasRef.current;\n if (!el) return;\n\n // Only create when clicking on the canvas background (not a node).\n const target = e.target as HTMLElement | null;\n if (target && target.closest(\"[data-wf-node='1']\")) return;\n\n const rect = el.getBoundingClientRect();\n const clickX = (e.clientX - rect.left + el.scrollLeft) / zoom;\n const clickY = (e.clientY - rect.top + el.scrollTop) / zoom;\n\n const base = activeTool.nodeType.replace(/[^a-z0-9_\\-]/gi, \"_\");\n const used = new Set(wf.nodes.map((n) => n.id));\n let i = 1;\n let id = `${base}_${i}`;\n while (used.has(id)) {\n i++;\n id = `${base}_${i}`;\n }\n\n const x = Math.max(0, clickX - 90);\n const y = Math.max(0, clickY - 24);\n\n const defaultConfig = isMediaNode(activeTool.nodeType) \n ? getMediaNodeConfig(activeTool.nodeType)\n : {};\n\n const nextNode: WorkflowFileV1[\"nodes\"][number] = {\n id,\n type: activeTool.nodeType,\n name: id,\n x,\n y,\n config: defaultConfig,\n };\n\n setWorkflow({ ...wf, nodes: [...wf.nodes, nextNode] });\n setSelectedNodeId(id);\n setActiveTool({ kind: \"select\" });\n }}\n >\n <div className=\"relative\" style={{ width: 2200 * zoom, height: 1200 * zoom }}>\n {/* Tool palette / agent palette (not scaled) */}\n <div\n className={\n toolsCollapsed\n ? \"absolute left-3 top-3 z-20 w-[44px] overflow-hidden rounded-lg border border-white/10 bg-black/40 p-2 backdrop-blur\"\n : \"absolute left-3 top-3 z-20 w-[260px] rounded-lg border border-white/10 bg-black/40 p-2 backdrop-blur\"\n }\n >\n <div className=\"flex items-center justify-between gap-2\">\n <div className={toolsCollapsed ? \"hidden\" : \"text-[10px] font-medium uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\"}>Tools</div>\n <div className=\"flex items-center gap-2\">\n <div className={toolsCollapsed ? \"hidden\" : \"flex items-center gap-1\"}>\n <button\n type=\"button\"\n onClick={() => setZoom((z) => Math.max(ZOOM_MIN, Math.round((z - ZOOM_STEP) * 10) / 10))}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-[10px] text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n title=\"Zoom out (Ctrl/Cmd+wheel)\"\n >\n -\n </button>\n <div className=\"min-w-[42px] text-center text-[10px] text-[color:var(--ck-text-tertiary)]\">{Math.round(zoom * 100)}%</div>\n <button\n type=\"button\"\n onClick={() => setZoom((z) => Math.min(ZOOM_MAX, Math.round((z + ZOOM_STEP) * 10) / 10))}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-[10px] text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n title=\"Zoom in (Ctrl/Cmd+wheel)\"\n >\n +\n </button>\n </div>\n\n <button\n type=\"button\"\n onClick={() => setToolsCollapsed((v) => !v)}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-[10px] text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n title={toolsCollapsed ? \"Expand\" : \"Collapse\"}\n >\n {toolsCollapsed ? \">\" : \"<\"}\n </button>\n </div>\n </div>\n {toolsCollapsed ? (\n <div className=\"mt-2 flex flex-col items-center gap-2\">\n {(\n [\n {\n key: \"select\",\n label: \"Select\",\n active: activeTool.kind === \"select\",\n onClick: () => {\n setActiveTool({ kind: \"select\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 4l7 16 2-7 7-2L5 4Z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"connect\",\n label: \"Connect\",\n active: activeTool.kind === \"connect\",\n onClick: () => {\n // Toggle connect tool.\n setActiveTool((t) => (t.kind === \"connect\" ? { kind: \"select\" } : { kind: \"connect\" }));\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M10 13a5 5 0 0 1 0-7l1.2-1.2a5 5 0 0 1 7 7L17 12\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n <path d=\"M14 11a5 5 0 0 1 0 7L12.8 19.2a5 5 0 1 1-7-7L7 12\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n ),\n },\n {\n key: \"llm\",\n label: \"LLM\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"llm\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"llm\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M12 2l1.5 6.5L20 10l-6.5 1.5L12 18l-1.5-6.5L4 10l6.5-1.5L12 2Z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"tool\",\n label: \"Tool\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"tool\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"tool\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M14.5 7.5l2 2-8.5 8.5H6v-2l8.5-8.5Z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinejoin=\"round\" />\n <path d=\"M12 6a4 4 0 0 0-5 5l3-3 2 2 3-3A4 4 0 0 0 12 6Z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"condition\",\n label: \"If\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"condition\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"condition\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M7 4v7a3 3 0 0 0 3 3h7\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n <path d=\"M17 10l3 3-3 3\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"delay\",\n label: \"Delay\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"delay\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"delay\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M12 7v5l3 2\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M21 12a9 9 0 1 1-9-9\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n ),\n },\n {\n key: \"approval\",\n label: \"Approval\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"human_approval\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"human_approval\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M20 6 9 17l-5-5\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"end\",\n label: \"End\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"end\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"end\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M7 7h10v10H7V7Z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"media-image\",\n label: \"Image\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"media-image\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"media-image\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M14.5 4h-5L7 6.5 4.5 9v6L7 17.5 9.5 20h5L17 17.5 19.5 15V9L17 6.5 14.5 4Z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinejoin=\"round\" />\n <path d=\"M9 10a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\" fill=\"currentColor\" />\n <path d=\"m4.5 15 3.5-3.5L11 14l3.5-3.5 4 4\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"media-video\",\n label: \"Video\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"media-video\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"media-video\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M14 2v6h6\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M10 12l4.5 2.5-4.5 2.5v-5z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"handoff\",\n label: \"Handoff\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"handoff\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"handoff\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 12h14\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n <path d=\"M13 6l6 6-6 6\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M3 6v12\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n ),\n },\n ] as const\n ).map((b) => (\n <button\n key={b.key}\n type=\"button\"\n onClick={b.onClick}\n className={\n b.active\n ? \"flex h-8 w-8 items-center justify-center rounded-lg bg-white/10 text-[color:var(--ck-text-primary)]\"\n : \"flex h-8 w-8 items-center justify-center rounded-lg border border-white/10 bg-white/5 text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n }\n title={b.label}\n aria-label={b.label}\n >\n {b.icon}\n </button>\n ))}\n </div>\n ) : (\n <div className=\"mt-2 grid grid-cols-2 gap-2\">\n <button\n type=\"button\"\n onClick={() => {\n setActiveTool({ kind: \"select\" });\n setConnectFromNodeId(\"\");\n }}\n className={\n activeTool.kind === \"select\"\n ? \"rounded-lg bg-white/10 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n : \"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n }\n >\n Select\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setActiveTool({ kind: \"connect\" });\n setConnectFromNodeId(\"\");\n }}\n className={\n activeTool.kind === \"connect\"\n ? \"rounded-lg bg-white/10 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n : \"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n }\n title=\"Click a node, then click another node to create an edge\"\n >\n Connect\n </button>\n\n {([\n { t: \"llm\", label: \"LLM\" },\n { t: \"tool\", label: \"Tool\" },\n { t: \"condition\", label: \"If\" },\n { t: \"delay\", label: \"Delay\" },\n { t: \"human_approval\", label: \"Approve\" },\n { t: \"media-image\", label: \"🎨 Image\" },\n { t: \"media-video\", label: \"🎬 Video\" },\n { t: \"handoff\", label: \"↗ Handoff\" },\n { t: \"end\", label: \"End\" },\n ] as Array<{ t: WorkflowFileV1[\"nodes\"][number][\"type\"]; label: string }>).map((x) => (\n <button\n key={x.t}\n type=\"button\"\n onClick={() => {\n setActiveTool({ kind: \"add-node\", nodeType: x.t });\n setConnectFromNodeId(\"\");\n }}\n className={\n activeTool.kind === \"add-node\" && activeTool.nodeType === x.t\n ? \"rounded-lg bg-white/10 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n : \"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n }\n title=\"Select tool, then click on the canvas to place\"\n >\n + {x.label}\n </button>\n ))}\n </div>\n )}\n\n {!toolsCollapsed && activeTool.kind === \"connect\" && connectFromNodeId ? (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-secondary)]\">Connecting from: <span className=\"font-mono\">{connectFromNodeId}</span></div>\n ) : null}\n {!toolsCollapsed && activeTool.kind === \"add-node\" ? (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-secondary)]\">Click on the canvas to place a <span className=\"font-mono\">{activeTool.nodeType}</span> node.</div>\n ) : null}\n\n <div className=\"mt-3 border-t border-white/10 pt-3\">\n <div className={toolsCollapsed ? \"hidden\" : \"flex items-center justify-between gap-2\"}>\n <div className=\"text-[10px] font-medium uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">Agents</div>\n <div className=\"text-[10px] text-[color:var(--ck-text-tertiary)]\">drag → node</div>\n </div>\n\n {toolsCollapsed ? (\n <button\n type=\"button\"\n onClick={() => setToolsCollapsed(false)}\n className=\"mt-2 flex h-8 w-8 items-center justify-center rounded-lg border border-white/10 bg-white/5 text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n title=\"Expand to see agents\"\n aria-label=\"Expand to see agents\"\n >\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M16 11a4 4 0 1 0-8 0\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n <path d=\"M4 20a8 8 0 0 1 16 0\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n </button>\n ) : (\n <>\n {agentsError ? <div className=\"mt-1 text-[11px] text-red-200\">{agentsError}</div> : null}\n <div className=\"mt-2 max-h-[140px] space-y-1 overflow-auto\">\n {agents.length ? (\n agents.map((a) => (\n <div\n key={a.id}\n draggable\n onDragStart={(e) => {\n e.dataTransfer.setData(\"text/plain\", a.id);\n e.dataTransfer.effectAllowed = \"copy\";\n }}\n className=\"cursor-grab rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n title={a.id}\n >\n {a.identityName ? a.identityName : a.id.replace(`${teamId}-`, \"\")}\n </div>\n ))\n ) : (\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">No team agents found.</div>\n )}\n </div>\n </>\n )}\n </div>\n </div>\n\n <div className=\"relative h-[1200px] w-[2200px]\" style={{ transform: `scale(${zoom})`, transformOrigin: \"0 0\" }}>\n <svg\n className=\"pointer-events-none absolute inset-0 -z-10\"\n width={2200}\n height={1200}\n style={{ overflow: \"visible\" }}\n >\n {(parsed.wf?.edges ?? []).map((e) => {\n const wf = parsed.wf;\n if (!wf) return null;\n const a = wf.nodes.find((n) => n.id === e.from);\n const b = wf.nodes.find((n) => n.id === e.to);\n if (!a || !b) return null;\n const ax = (typeof a.x === \"number\" ? a.x : 80) + 90;\n const ay = (typeof a.y === \"number\" ? a.y : 80) + 24;\n const bx = (typeof b.x === \"number\" ? b.x : 80) + 90;\n const by = (typeof b.y === \"number\" ? b.y : 80) + 24;\n return (\n <line\n key={e.id}\n x1={ax}\n y1={ay}\n x2={bx}\n y2={by}\n stroke=\"rgba(255,255,255,0.35)\"\n strokeWidth={3}\n />\n );\n })}\n </svg>\n\n {(parsed.wf?.nodes ?? []).map((n, idx) => {\n const x = typeof n.x === \"number\" ? n.x : 80 + idx * 220;\n const y = typeof n.y === \"number\" ? n.y : 80;\n const selected = selectedNodeId === n.id;\n return (\n <div\n key={n.id}\n role=\"button\"\n tabIndex={0}\n data-wf-node=\"1\"\n draggable={activeTool.kind === \"select\" || activeTool.kind === \"connect\"}\n onDragStart={(e) => {\n // allow agent pills to be dropped; do not start a browser drag ghost for nodes.\n if (activeTool.kind !== \"select\") return;\n e.dataTransfer.setData(\"text/plain\", \"\");\n }}\n onDragOver={(e) => {\n // Allow dropping agents.\n if (e.dataTransfer.types.includes(\"text/plain\")) e.preventDefault();\n }}\n onDrop={(e) => {\n const wf = parsed.wf;\n if (!wf) return;\n e.preventDefault();\n e.stopPropagation();\n const agentId = String(e.dataTransfer.getData(\"text/plain\") || \"\").trim();\n if (!agentId) return;\n\n const nextNodes = wf.nodes.map((node) => {\n if (node.id !== n.id) return node;\n const cfg = node.config && typeof node.config === \"object\" && !Array.isArray(node.config) ? node.config : {};\n return { ...node, config: { ...cfg, agentId } };\n });\n setWorkflow({ ...wf, nodes: nextNodes });\n setSelectedNodeId(n.id);\n }}\n onClick={(e) => {\n e.stopPropagation();\n const wf = parsed.wf;\n if (activeTool.kind === \"connect\") {\n if (!wf) return;\n if (!connectFromNodeId) {\n setConnectFromNodeId(n.id);\n setSelectedNodeId(n.id);\n return;\n }\n const from = connectFromNodeId;\n const to = n.id;\n setConnectFromNodeId(\"\");\n if (!from || !to || from === to) return;\n const exists = (wf.edges ?? []).some((e) => e.from === from && e.to === to);\n if (exists) return;\n const id = `e${Date.now()}`;\n const nextEdge: WorkflowFileV1[\"edges\"][number] = { id, from, to };\n setWorkflow({ ...wf, edges: [...(wf.edges ?? []), nextEdge] });\n // After creating an edge, return to Select tool.\n setActiveTool({ kind: \"select\" });\n return;\n }\n\n setSelectedNodeId(n.id);\n }}\n onPointerDown={(e) => {\n // Allow dragging nodes even in connect mode (connect is click-to-connect, not drag-to-connect).\n if (activeTool.kind === \"add-node\") return;\n if (e.button !== 0) return;\n const el = canvasRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n setSelectedNodeId(n.id);\n try {\n e.currentTarget.setPointerCapture(e.pointerId);\n } catch {\n // ignore\n }\n e.preventDefault();\n\n const pointerX = (e.clientX - rect.left + el.scrollLeft) / zoom;\n const pointerY = (e.clientY - rect.top + el.scrollTop) / zoom;\n setDragging({ nodeId: n.id, dx: pointerX - x, dy: pointerY - y });\n }}\n onPointerUp={(e) => {\n try {\n e.currentTarget.releasePointerCapture(e.pointerId);\n } catch {\n // ignore\n }\n setDragging(null);\n }}\n onPointerMove={(e) => {\n if (!dragging) return;\n if (dragging.nodeId !== n.id) return;\n const wf = parsed.wf;\n if (!wf) return;\n const el = canvasRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const pointerX = (e.clientX - rect.left + el.scrollLeft) / zoom;\n const pointerY = (e.clientY - rect.top + el.scrollTop) / zoom;\n const nextX = pointerX - dragging.dx;\n const nextY = pointerY - dragging.dy;\n const nextNodes = wf.nodes.map((node) => (node.id === n.id ? { ...node, x: nextX, y: nextY } : node));\n const next: WorkflowFileV1 = { ...wf, nodes: nextNodes };\n setStatus({ kind: \"ready\", jsonText: JSON.stringify(next, null, 2) + \"\\n\" });\n }}\n className={\n selected\n ? \"absolute z-10 cursor-grab rounded-lg border border-white/25 bg-white/10 px-3 py-2 text-xs text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)]\"\n : \"absolute z-10 cursor-grab rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-xs text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n }\n style={{ left: x, top: y, width: 180 }}\n >\n <div className=\"flex items-center gap-2\">\n {isMediaNode(n.type) && (\n <span className=\"text-lg\">\n {n.type === 'media-image' ? '🎨' : '🎬'}\n </span>\n )}\n {n.type === 'handoff' && (\n <span className=\"text-lg\">↗</span>\n )}\n <div className=\"font-medium text-[color:var(--ck-text-primary)]\">{n.name || n.id}</div>\n </div>\n <div className=\"mt-0.5 text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">{n.type}</div>\n {(() => {\n const cfg = n.config && typeof n.config === \"object\" && !Array.isArray(n.config) ? (n.config as Record<string, unknown>) : null;\n \n // Show media generation prompt for media nodes\n if (isMediaNode(n.type) && cfg) {\n const prompt = String(cfg.prompt ?? \"\").trim();\n const provider = String(cfg.provider ?? \"auto\");\n return (\n <div className=\"mt-1 space-y-0.5\">\n {prompt && (\n <div className=\"text-[10px] text-[color:var(--ck-text-secondary)] truncate\" title={prompt}>\n &quot;{prompt.length > 40 ? prompt.substring(0, 40) + '...' : prompt}&quot;\n </div>\n )}\n <div className=\"text-[10px] text-[color:var(--ck-text-tertiary)]\">\n Provider: {provider}\n </div>\n </div>\n );\n }\n \n // Show handoff target\n if (n.type === 'handoff' && cfg) {\n const tgt = String(cfg.targetTeamId ?? \"\").trim();\n const tgtWf = String(cfg.targetWorkflowId ?? \"\").trim();\n const mode = String(cfg.mode ?? 'fire-and-forget');\n return tgt ? (\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-secondary)]\">\n → {tgt}{tgtWf ? ` / ${tgtWf}` : \"\"}\n {mode === 'wait-for-completion' ? <span className=\"ml-1 text-yellow-400\" title=\"Waits for target to complete\">⏳</span> : null}\n </div>\n ) : null;\n }\n\n // Show agent for other nodes\n const agentId = cfg ? String(cfg.agentId ?? \"\").trim() : \"\";\n if (!agentId) return null;\n const short = agentId.replace(`${teamId}-`, \"\");\n return <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-secondary)]\">Agent: {short}</div>;\n })()}\n </div>\n );\n })}\n\n {/* Inline in-canvas node inspector (requirement #6) */}\n {(() => {\n const wf = parsed.wf;\n if (!wf) return null;\n if (!selectedNodeId) return null;\n const node = wf.nodes.find((n) => n.id === selectedNodeId);\n if (!node) return null;\n\n const x = typeof node.x === \"number\" ? node.x : 80;\n const y = typeof node.y === \"number\" ? node.y : 80;\n const cfg = node.config && typeof node.config === \"object\" && !Array.isArray(node.config) ? (node.config as Record<string, unknown>) : {};\n const agentId = String(cfg.agentId ?? \"\").trim();\n const model = String(cfg.model ?? \"\").trim();\n\n return (\n <div\n className=\"absolute z-10 w-[320px] rounded-lg border border-white/15 bg-black/60 p-3 shadow-[var(--ck-shadow-1)] backdrop-blur\"\n style={{ left: x + 200, top: y }}\n >\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-primary)]\">{node.name || node.id}</div>\n <button\n type=\"button\"\n onClick={() => setSelectedNodeId(\"\")}\n className=\"text-[10px] text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n Close\n </button>\n </div>\n\n <div className=\"mt-2 space-y-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">name</div>\n <input\n value={String(node.name ?? \"\")}\n onChange={(e) => {\n const nextName = e.target.value;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, name: nextName } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"Optional\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">type</div>\n <select\n value={node.type}\n onChange={(e) => {\n const nextType = e.target.value as WorkflowFileV1[\"nodes\"][number][\"type\"];\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, type: nextType } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"start\">start</option>\n <option value=\"end\">end</option>\n <option value=\"llm\">llm</option>\n <option value=\"tool\">tool</option>\n <option value=\"condition\">condition</option>\n <option value=\"delay\">delay</option>\n <option value=\"human_approval\">human_approval</option>\n <option value=\"media-image\">media-image</option>\n <option value=\"media-video\">media-video</option>\n <option value=\"handoff\">handoff</option>\n </select>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">agentId</div>\n <input\n value={agentId}\n onChange={(e) => {\n const nextAgentId = String(e.target.value || \"\").trim();\n const nextCfg = { ...cfg, ...(nextAgentId ? { agentId: nextAgentId } : {}) };\n if (!nextAgentId) delete (nextCfg as Record<string, unknown>).agentId;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"(drag an agent onto the node or type)\"\n />\n </label>\n\n {node.type === \"llm\" ? (\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">model</div>\n <select\n value={model}\n onChange={(e) => {\n const nextModel = String(e.target.value || \"\").trim();\n const nextCfg = { ...cfg, ...(nextModel ? { model: nextModel } : {}) };\n if (!nextModel) delete (nextCfg as Record<string, unknown>).model;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">Default (inherit global)</option>\n {availableModels.map((m) => (\n <option key={m} value={m}>{m}</option>\n ))}\n </select>\n {availableModelsError ? (\n <div className=\"mt-1 text-[10px] text-amber-300\">Could not load model list: {availableModelsError}</div>\n ) : null}\n </label>\n ) : null}\n\n {node.type === \"human_approval\" ? (\n <div className=\"rounded-lg border border-white/10 bg-white/5 p-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">approval config</div>\n\n <div className=\"mt-2 space-y-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">provider</div>\n <input\n value={String((cfg as Record<string, unknown>).provider ?? \"\")}\n onChange={(e) => {\n const v = String(e.target.value || \"\").trim();\n const nextCfg = { ...cfg, ...(v ? { provider: v } : {}) };\n if (!v) delete (nextCfg as Record<string, unknown>).provider;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"telegram\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">target</div>\n <input\n value={String((cfg as Record<string, unknown>).target ?? \"\")}\n onChange={(e) => {\n const v = String(e.target.value || \"\").trim();\n const nextCfg = { ...cfg, ...(v ? { target: v } : {}) };\n if (!v) delete (nextCfg as Record<string, unknown>).target;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"(e.g. Telegram chat id)\"\n />\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">Overrides workflow-level default when set.</div>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">messageTemplate (optional)</div>\n <TemplateTextareaWithVars\n value={String((cfg as Record<string, unknown>).messageTemplate ?? \"\")}\n workflow={wf}\n currentNodeId={node.id}\n onChangeValue={(nextValue) => {\n const nextCfg = { ...cfg, ...(nextValue.trim() ? { messageTemplate: nextValue } : {}) };\n if (!nextValue.trim()) delete (nextCfg as Record<string, unknown>).messageTemplate;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 h-[70px] w-full resize-none rounded-lg border border-white/10 bg-white/5 p-2 pr-12 font-mono text-[10px] text-[color:var(--ck-text-primary)]\"\n placeholder=\"Approval needed for {{workflowName}} (run {{runId}})\"\n spellCheck={false}\n />\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">\n Vars: {\"{{workflowName}}\"}, {\"{{workflowId}}\"}, {\"{{runId}}\"}, {\"{{nodeId}}\"}\n </div>\n </label>\n </div>\n </div>\n ) : null}\n\n {isMediaNode(node.type) ? (\n <div className=\"rounded-lg border border-white/10 bg-white/5 p-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">Media Generation</div>\n <div className=\"mt-2\">\n <MediaGenerationConfigComponent\n config={{\n mediaType: 'image',\n provider: 'auto',\n prompt: '',\n ...((node.config as Record<string, unknown>) || {})\n } as MediaGenerationConfig}\n onChange={(newConfig) => {\n setWorkflow({ \n ...wf, \n nodes: wf.nodes.map((n) => \n n.id === node.id ? { ...n, config: newConfig as unknown as Record<string, unknown> } : n\n ) \n });\n }}\n teamId={teamId}\n workflow={wf}\n workflowNodeIds={wf.nodes.map((n) => n.id)}\n workflowEdges={(wf.edges ?? []).map((e) => ({ from: e.from, to: e.to }))}\n currentNodeId={node.id}\n />\n </div>\n </div>\n ) : null}\n\n {node.type === \"llm\" ? (\n <div className=\"space-y-2\">\n {/* LLM-specific fields */}\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">prompt</div>\n <TemplateTextareaWithVars\n value={String(cfg.promptTemplate ?? \"\")}\n workflow={wf}\n currentNodeId={node.id}\n onChangeValue={(nextValue) => {\n const nextCfg = { ...cfg, promptTemplate: nextValue };\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 min-h-[200px] w-full resize-y rounded-lg border border-white/10 bg-black/30 p-2 pr-12 font-mono text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"What should this node do? Use {{nodeId.output}} to reference upstream node outputs.\"\n spellCheck={false}\n />\n </label>\n\n {/* Output Fields */}\n <div>\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">output fields (optional)</div>\n <div className=\"text-[9px] text-[color:var(--ck-text-secondary)] mb-2\">Define the structure of what this node should produce</div>\n {(() => {\n const outputFields = (cfg.outputFields as Array<{name: string, type: \"text\"|\"list\"|\"json\"}>) || [];\n return (\n <div className=\"space-y-1\">\n {outputFields.map((field, index) => (\n <div key={index} className=\"flex items-center gap-2\">\n <input\n value={field.name}\n onChange={(e) => {\n const newOutputFields = [...outputFields];\n newOutputFields[index] = { ...field, name: e.target.value };\n const nextCfg = { ...cfg, outputFields: newOutputFields };\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"flex-1 rounded-lg border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"Field name\"\n />\n <select\n value={field.type}\n onChange={(e) => {\n const newType = e.target.value as \"text\"|\"list\"|\"json\";\n const newOutputFields = [...outputFields];\n newOutputFields[index] = { ...field, type: newType };\n const nextCfg = { ...cfg, outputFields: newOutputFields };\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"rounded-lg border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"text\">text</option>\n <option value=\"list\">list</option>\n <option value=\"json\">json</option>\n </select>\n <button\n type=\"button\"\n onClick={() => {\n const newOutputFields = outputFields.filter((_, i) => i !== index);\n const nextCfg = { ...cfg };\n if (newOutputFields.length > 0) {\n nextCfg.outputFields = newOutputFields;\n } else {\n delete (nextCfg as Record<string, unknown>).outputFields;\n }\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"text-xs text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n ×\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n onClick={() => {\n const newOutputFields = [...outputFields, { name: \"\", type: \"text\" as const }];\n const nextCfg = { ...cfg, outputFields: newOutputFields };\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"text-xs text-[color:var(--ck-text-secondary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n + Add field\n </button>\n </div>\n );\n })()}\n </div>\n\n {/* Timeout */}\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">timeout (seconds)</div>\n <input\n type=\"number\"\n value={cfg.timeoutMs ? String(Number(cfg.timeoutMs) / 1000) : \"\"}\n onChange={(e) => {\n const seconds = e.target.value ? Number(e.target.value) : null;\n const nextCfg = { ...cfg };\n if (seconds && seconds > 0) {\n nextCfg.timeoutMs = seconds * 1000;\n } else {\n delete (nextCfg as Record<string, unknown>).timeoutMs;\n }\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-24 rounded-lg border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"120\"\n min=\"1\"\n />\n </label>\n </div>\n ) : null}\n\n {/* Handoff config in canvas inspector */}\n {node.type === \"handoff\" ? (() => {\n const targetTeamIdInsp = String(cfg.targetTeamId ?? \"\");\n const targetWorkflowIdInsp = String(cfg.targetWorkflowId ?? \"\");\n const variableMappingInsp = (cfg.variableMapping || {}) as Record<string, string>;\n const handoffModeInsp = String(cfg.mode ?? 'fire-and-forget');\n const kitchenTeamIdInsp = String(variableMappingInsp.kitchenTeamId ?? '').includes('{{') ? teamId : String(variableMappingInsp.kitchenTeamId ?? teamId);\n const targetPlatformInsp = extractPlatformFromWorkflowId(targetWorkflowIdInsp);\n const accountsKeyInsp = kitchenTeamIdInsp && targetPlatformInsp ? accountsKey(kitchenTeamIdInsp, targetPlatformInsp) : '';\n const accountOptsInsp = accountsKeyInsp ? (handoffAccounts[accountsKeyInsp] || []) : [];\n const accountsLoadingInsp = accountsKeyInsp ? !!handoffAccountsLoading[accountsKeyInsp] : false;\n const currentIdsInsp = String(variableMappingInsp.integrationIds ?? variableMappingInsp.integrationId ?? '').split(',').map((s: string) => s.trim()).filter(Boolean);\n const targetWfsInsp = handoffWorkflows[targetTeamIdInsp] || [];\n const showPickerInsp = !!targetPlatformInsp;\n\n const updateCfgInsp = (patch: Record<string, unknown>) => {\n const nextCfg = { ...cfg, ...patch };\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n };\n\n // Auto-load data\n if (handoffTeams.length === 0 && !handoffTeamsLoading) {\n (async () => { try { const r = await fetch('/api/teams/list'); const j = await r.json(); if (j.ok) setHandoffTeams(j.teamIds); } catch {} })();\n }\n if (targetTeamIdInsp && !handoffWorkflows[targetTeamIdInsp]) {\n (async () => { try { const r = await fetch(`/api/teams/workflows?teamId=${encodeURIComponent(targetTeamIdInsp)}`); const j = await r.json(); if (j.ok && j.files) setHandoffWorkflows(prev => ({ ...prev, [targetTeamIdInsp]: j.files.map((f: string) => ({ id: f.replace(/\\.workflow\\.json$/, '') })) })); } catch {} })();\n }\n if (showPickerInsp && kitchenTeamIdInsp && targetPlatformInsp && !handoffAccounts[accountsKeyInsp] && !handoffAccountsLoading[accountsKeyInsp]) {\n (async () => {\n setHandoffAccountsLoading(prev => ({ ...prev, [accountsKeyInsp]: true }));\n try {\n const pk = (() => {\n try {\n return JSON.parse(localStorage.getItem(`ck-postiz-${kitchenTeamIdInsp}`) || '{}').apiKey || '';\n } catch {\n return '';\n }\n })();\n const r = await fetch(\n `/api/plugins/marketing/integrations?team=${encodeURIComponent(kitchenTeamIdInsp)}&teamId=${encodeURIComponent(kitchenTeamIdInsp)}`,\n { headers: pk ? { 'x-postiz-api-key': pk } : {} }\n );\n const j = await r.json();\n const target = canonicalPlatform(targetPlatformInsp);\n const filtered = (j.integrations || [])\n .filter((i: Record<string, unknown>) => canonicalPlatform(String(i.identifier || '')) === target && !i.disabled && i.id)\n .map((i: Record<string, unknown>) => ({\n integrationId: String(i.id),\n identifier: String(i.identifier || ''),\n displayName: String(i.name || targetPlatformInsp),\n username: i.username ? String(i.username) : undefined,\n }));\n setHandoffAccounts(prev => ({ ...prev, [accountsKeyInsp]: filtered }));\n } catch {}\n setHandoffAccountsLoading(prev => ({ ...prev, [accountsKeyInsp]: false }));\n })();\n }\n\n return (\n <div className=\"rounded-lg border border-white/10 bg-white/5 p-2 space-y-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">handoff config</div>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">mode</div>\n <select value={handoffModeInsp} onChange={(e) => updateCfgInsp({ mode: e.target.value === 'fire-and-forget' ? undefined : e.target.value })} className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\">\n <option value=\"fire-and-forget\">Fire &amp; Forget</option>\n <option value=\"wait-for-completion\">Wait for Completion</option>\n </select>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">target team</div>\n <select value={targetTeamIdInsp} onChange={(e) => { updateCfgInsp({ targetTeamId: e.target.value || undefined, targetWorkflowId: undefined }); }} className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\">\n <option value=\"\">— Select —</option>\n {handoffTeams.map((t) => <option key={t} value={t}>{t}{t === teamId ? ' (current)' : ''}</option>)}\n </select>\n </label>\n\n {targetTeamIdInsp ? (\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">target workflow</div>\n <select value={targetWorkflowIdInsp} onChange={(e) => updateCfgInsp({ targetWorkflowId: e.target.value || undefined })} className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\">\n <option value=\"\">— Select —</option>\n {targetWfsInsp.map((w) => <option key={w.id} value={w.id}>{w.name || w.id}</option>)}\n </select>\n </label>\n ) : null}\n\n {showPickerInsp && targetPlatformInsp && accountOptsInsp.length > 0 ? (\n <div>\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">{targetPlatformInsp} accounts</div>\n <div className=\"mt-1 space-y-1\">\n {accountOptsInsp.map((opt) => {\n const checked = currentIdsInsp.includes(opt.integrationId);\n const variantSuffix = opt.identifier && opt.identifier !== targetPlatformInsp ? ` (${opt.identifier})` : '';\n return (\n <label key={opt.integrationId} className=\"flex items-center gap-2 cursor-pointer rounded-lg border border-white/10 bg-white/5 px-2 py-1 hover:bg-white/10\">\n <input type=\"checkbox\" checked={checked} onChange={() => {\n const next = checked ? currentIdsInsp.filter((id: string) => id !== opt.integrationId) : [...currentIdsInsp, opt.integrationId];\n const nextVm = { ...variableMappingInsp }; delete nextVm.integrationId;\n if (next.length > 0) nextVm.integrationIds = next.join(','); else delete nextVm.integrationIds;\n updateCfgInsp({ variableMapping: nextVm });\n }} className=\"accent-[var(--ck-accent-red)]\" />\n <div><div className=\"text-xs text-[color:var(--ck-text-primary)]\">{opt.displayName}{variantSuffix}</div>{opt.username ? <div className=\"text-[10px] text-[color:var(--ck-text-tertiary)]\">{opt.username}</div> : null}</div>\n </label>\n );\n })}\n </div>\n </div>\n ) : null}\n {showPickerInsp && accountsLoadingInsp ? <div className=\"text-[10px] text-[color:var(--ck-text-tertiary)]\">Loading accounts…</div> : null}\n </div>\n );\n })() : null}\n\n {/* Collapsible raw config section */}\n <div>\n <button\n type=\"button\"\n onClick={() => {\n const currentState = showRawConfig[node.id] ?? (node.type !== \"llm\");\n setShowRawConfig({ ...showRawConfig, [node.id]: !currentState });\n }}\n className=\"mb-2 text-[10px] text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n {(showRawConfig[node.id] ?? (node.type !== \"llm\")) ? \"Hide\" : \"Show\"} raw config\n </button>\n {(showRawConfig[node.id] ?? (node.type !== \"llm\")) ? (\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">config (json)</div>\n <textarea\n value={JSON.stringify(cfg, null, 2)}\n onChange={(e) => {\n try {\n const nextCfg = JSON.parse(e.target.value) as Record<string, unknown>;\n if (!nextCfg || typeof nextCfg !== \"object\" || Array.isArray(nextCfg)) return;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n } catch {\n // ignore invalid JSON while typing\n }\n }}\n className=\"mt-1 h-[140px] w-full resize-none rounded-lg border border-white/10 bg-black/30 p-2 font-mono text-[10px] text-[color:var(--ck-text-primary)]\"\n spellCheck={false}\n />\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">(Edits apply when JSON is valid.)</div>\n </label>\n ) : null}\n </div>\n </div>\n </div>\n );\n })()}\n </div>\n </div>\n </div>\n )}\n\n <div className=\"w-[380px] shrink-0 overflow-auto p-3 text-sm\">\n <div className=\"space-y-3\">\n {parsed.wf ? (\n (() => {\n const wf = parsed.wf;\n const tz = String(wf.timezone ?? \"\").trim() || \"UTC\";\n const triggers = wf.triggers ?? [];\n\n const meta = wf.meta && typeof wf.meta === \"object\" && !Array.isArray(wf.meta) ? (wf.meta as Record<string, unknown>) : {};\n const approvalBindingId = String(meta.approvalBindingId ?? \"\").trim();\n const approvalProvider = String(meta.approvalProvider ?? \"telegram\").trim() || \"telegram\";\n const approvalTarget = String(meta.approvalTarget ?? \"\").trim();\n\n // Cron schedule suggestions.\n // Note: dev-team automation defaults should avoid the 02:00-07:00 America/New_York blackout window.\n // We keep presets in \"safe\" hours by default.\n const presets = [\n { label: \"(no preset)\", expr: \"\" },\n { label: \"Weekdays 09:00 local\", expr: \"0 9 * * 1-5\" },\n { label: \"Mon/Wed/Fri 09:00 local\", expr: \"0 9 * * 1,3,5\" },\n { label: \"Daily 08:00 local\", expr: \"0 8 * * *\" },\n { label: \"Daily 12:00 local\", expr: \"0 12 * * *\" },\n { label: \"Mon 09:30 local\", expr: \"30 9 * * 1\" },\n ];\n\n return (\n <div className=\"space-y-3\">\n <details open className=\"rounded-lg border border-white/10 bg-white/5\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Workflow</summary>\n <div className=\"px-3 pb-3\">\n <label className=\"block\">\n <div className=\"text-[11px] font-medium text-[color:var(--ck-text-tertiary)]\">Timezone</div>\n <input\n value={tz}\n onChange={(e) => {\n const nextTz = String(e.target.value || \"\").trim() || \"UTC\";\n setWorkflow({ ...wf, timezone: nextTz });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"America/New_York\"\n />\n </label>\n </div>\n </details>\n\n <details open className=\"rounded-lg border border-white/10 bg-white/5\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Approval Channel</summary>\n <div className=\"px-3 pb-3 space-y-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">binding (recommended)</div>\n <select\n value={approvalBindingId}\n onChange={(e) => {\n const nextId = String(e.target.value || \"\").trim();\n const selected = approvalBindings.find((b) => b.id === nextId);\n\n // Store a stable-ish reference id in the workflow so it's portable.\n // We also keep provider/target in sync for backward compatibility.\n if (selected) {\n setWorkflow({\n ...wf,\n meta: {\n ...meta,\n approvalBindingId: selected.id,\n approvalProvider: selected.channel,\n approvalTarget: selected.target,\n },\n nodes: wf.nodes.map((n) =>\n n.type === \"human_approval\"\n ? {\n ...n,\n config: {\n ...((n.config && typeof n.config === \"object\" && !Array.isArray(n.config)\n ? n.config\n : {}) as Record<string, unknown>),\n approvalBindingId: selected.id,\n provider: selected.channel,\n target: selected.target,\n },\n }\n : n\n ),\n });\n } else {\n setWorkflow({\n ...wf,\n meta: { ...meta, approvalBindingId: \"\" },\n nodes: wf.nodes.map((n) =>\n n.type === \"human_approval\"\n ? {\n ...n,\n config: {\n ...((n.config && typeof n.config === \"object\" && !Array.isArray(n.config)\n ? n.config\n : {}) as Record<string, unknown>),\n approvalBindingId: \"\",\n },\n }\n : n\n ),\n });\n }\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">(manual)</option>\n {approvalBindings.map((b) => (\n <option key={b.id} value={b.id}>\n {b.label}\n </option>\n ))}\n </select>\n {approvalBindingsNeedsKitchenUpdate ? (\n <div className=\"mt-1 text-[10px] text-yellow-200\">\n Kitchen looks out of date. Run <code className=\"font-mono\">openclaw plugins update</code> then\n <code className=\"ml-1 font-mono\">openclaw gateway restart</code>.\n </div>\n ) : null}\n {approvalBindingsError ? (\n <div className=\"mt-1 text-[10px] text-red-200\">Failed to load bindings: {approvalBindingsError}</div>\n ) : null}\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">\n Uses your existing OpenClaw bindings (recommended). Manual provider/target is an advanced override.\n </div>\n </label>\n\n <details className=\"rounded-lg border border-white/10 bg-black/10\">\n <summary className=\"cursor-pointer list-none px-2 py-1 text-[11px] font-medium text-[color:var(--ck-text-secondary)]\">Advanced: manual override</summary>\n <div className=\"px-2 pb-2 pt-1 space-y-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">provider</div>\n <input\n value={approvalProvider}\n onChange={(e) => {\n const nextProvider = String(e.target.value || \"\").trim() || \"telegram\";\n setWorkflow({\n ...wf,\n meta: { ...meta, approvalBindingId: \"\", approvalProvider: nextProvider },\n nodes: wf.nodes.map((n) =>\n n.type === \"human_approval\"\n ? {\n ...n,\n config: {\n ...((n.config && typeof n.config === \"object\" && !Array.isArray(n.config)\n ? n.config\n : {}) as Record<string, unknown>),\n approvalBindingId: \"\",\n provider: nextProvider,\n },\n }\n : n\n ),\n });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"telegram\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">target</div>\n <input\n value={approvalTarget}\n onChange={(e) => {\n const nextTarget = String(e.target.value || \"\").trim();\n setWorkflow({\n ...wf,\n meta: { ...meta, approvalBindingId: \"\", approvalTarget: nextTarget },\n nodes: wf.nodes.map((n) =>\n n.type === \"human_approval\"\n ? {\n ...n,\n config: {\n ...((n.config && typeof n.config === \"object\" && !Array.isArray(n.config)\n ? n.config\n : {}) as Record<string, unknown>),\n approvalBindingId: \"\",\n target: nextTarget,\n },\n }\n : n\n ),\n });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"(e.g. Telegram chat id)\"\n />\n </label>\n </div>\n </details>\n </div>\n </details>\n\n <details open className=\"rounded-lg border border-white/10 bg-white/5\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Node inspector</summary>\n <div className=\"px-3 pb-3\">\n <div className=\"flex items-center justify-between gap-2\">\n {selectedNodeId ? (\n <button\n type=\"button\"\n onClick={() => {\n const nodeId = selectedNodeId;\n const nextNodes = wf.nodes.filter((n) => n.id !== nodeId);\n const nextEdges = (wf.edges ?? []).filter((e) => e.from !== nodeId && e.to !== nodeId);\n setWorkflow({ ...wf, nodes: nextNodes, edges: nextEdges });\n setSelectedNodeId(\"\");\n }}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-[10px] font-medium text-red-100 hover:bg-white/10\"\n >\n Delete node\n </button>\n ) : null}\n </div>\n\n {selectedNodeId ? (\n (() => {\n const node = wf.nodes.find((n) => n.id === selectedNodeId);\n if (!node) return <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">No node selected.</div>;\n\n return (\n <div className=\"mt-3 space-y-3\">\n <div>\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">id</div>\n <div className=\"mt-1 rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\">\n {node.id}\n </div>\n </div>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">name</div>\n <input\n value={String(node.name ?? \"\")}\n onChange={(e) => {\n const nextName = e.target.value;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, name: nextName } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"Optional\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">type</div>\n <select\n value={node.type}\n onChange={(e) => {\n const nextType = e.target.value as WorkflowFileV1[\"nodes\"][number][\"type\"];\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, type: nextType } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"start\">start</option>\n <option value=\"end\">end</option>\n <option value=\"llm\">llm</option>\n <option value=\"tool\">tool</option>\n <option value=\"condition\">condition</option>\n <option value=\"delay\">delay</option>\n <option value=\"human_approval\">human_approval</option>\n <option value=\"media-image\">media-image</option>\n <option value=\"media-video\">media-video</option>\n <option value=\"handoff\">handoff</option>\n </select>\n </label>\n\n <div className=\"grid grid-cols-2 gap-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">x</div>\n <input\n type=\"number\"\n value={typeof node.x === \"number\" ? node.x : 0}\n onChange={(e) => {\n const nextX = Number(e.target.value);\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, x: nextX } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n />\n </label>\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">y</div>\n <input\n type=\"number\"\n value={typeof node.y === \"number\" ? node.y : 0}\n onChange={(e) => {\n const nextY = Number(e.target.value);\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, y: nextY } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n />\n </label>\n </div>\n\n {/* LLM Configuration */}\n {node.type === \"llm\" ? (\n <div className=\"space-y-3\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">prompt</div>\n <TemplateTextareaWithVars\n value={String(((node.config as Record<string, unknown>) || {}).promptTemplate ?? \"\")}\n workflow={wf}\n currentNodeId={node.id}\n onChangeValue={(nextValue) => {\n const nextCfg = { ...(node.config as Record<string, unknown>), promptTemplate: nextValue };\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 min-h-[150px] w-full resize-y rounded-lg border border-white/10 bg-white/5 p-2 pr-12 font-mono text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"What should this node do? Use {{nodeId.output}} to reference upstream node outputs.\"\n spellCheck={false}\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">model</div>\n <select\n value={String(((node.config as Record<string, unknown>) || {}).model ?? \"\")}\n onChange={(e) => {\n const nextModel = String(e.target.value || \"\").trim();\n const nextCfg = { ...(node.config as Record<string, unknown>), ...(nextModel ? { model: nextModel } : {}) };\n if (!nextModel) delete nextCfg.model;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">Default (inherit global)</option>\n {availableModels.map((m) => (\n <option key={m} value={m}>{m}</option>\n ))}\n </select>\n {availableModelsError ? (\n <div className=\"mt-1 text-[10px] text-amber-300\">Could not load model list: {availableModelsError}</div>\n ) : null}\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">timeout (seconds)</div>\n <input\n type=\"number\"\n value={((node.config as Record<string, unknown>) || {}).timeoutMs ? String(Number(((node.config as Record<string, unknown>) || {}).timeoutMs) / 1000) : \"\"}\n onChange={(e) => {\n const seconds = e.target.value ? Number(e.target.value) : null;\n const nextCfg = { ...(node.config as Record<string, unknown>) };\n if (seconds && seconds > 0) {\n nextCfg.timeoutMs = seconds * 1000;\n } else {\n delete nextCfg.timeoutMs;\n }\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-24 rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"120\"\n min=\"1\"\n />\n </label>\n </div>\n ) : null}\n\n {/* Media Generation Configuration */}\n {isMediaNode(node.type) ? (\n <div>\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">Media Generation</div>\n <div className=\"mt-1\">\n <MediaGenerationConfigComponent\n config={{\n mediaType: 'image',\n provider: 'auto',\n prompt: '',\n ...((node.config as Record<string, unknown>) || {})\n } as MediaGenerationConfig}\n onChange={(newConfig) => {\n setWorkflow({ \n ...wf, \n nodes: wf.nodes.map((n) => \n n.id === node.id ? { ...n, config: newConfig as unknown as Record<string, unknown> } : n\n ) \n });\n }}\n teamId={teamId}\n workflow={wf}\n workflowNodeIds={wf.nodes.map((n) => n.id)}\n workflowEdges={(wf.edges ?? []).map((e) => ({ from: e.from, to: e.to }))}\n currentNodeId={node.id}\n />\n </div>\n </div>\n ) : null}\n\n {/* Human Approval Configuration */}\n {node.type === \"human_approval\" ? (\n <div className=\"space-y-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">provider</div>\n <input\n value={String(((node.config as Record<string, unknown>) || {}).provider ?? \"\")}\n onChange={(e) => {\n const v = String(e.target.value || \"\").trim();\n const nextCfg = { ...(node.config as Record<string, unknown>), ...(v ? { provider: v } : {}) };\n if (!v) delete nextCfg.provider;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"telegram\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">target</div>\n <input\n value={String(((node.config as Record<string, unknown>) || {}).target ?? \"\")}\n onChange={(e) => {\n const v = String(e.target.value || \"\").trim();\n const nextCfg = { ...(node.config as Record<string, unknown>), ...(v ? { target: v } : {}) };\n if (!v) delete nextCfg.target;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"(e.g. Telegram chat id)\"\n />\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">Overrides workflow-level default when set.</div>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">messageTemplate (optional)</div>\n <TemplateTextareaWithVars\n value={String(((node.config as Record<string, unknown>) || {}).messageTemplate ?? \"\")}\n workflow={wf}\n currentNodeId={node.id}\n onChangeValue={(nextValue) => {\n const nextCfg = { ...(node.config as Record<string, unknown>), ...(nextValue.trim() ? { messageTemplate: nextValue } : {}) };\n if (!nextValue.trim()) delete nextCfg.messageTemplate;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 h-[70px] w-full resize-none rounded-lg border border-white/10 bg-white/5 p-2 pr-12 font-mono text-[10px] text-[color:var(--ck-text-primary)]\"\n placeholder=\"Approval needed for {{workflowName}} (run {{runId}})\"\n spellCheck={false}\n />\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">\n Vars: {\"{{workflowName}}\"}, {\"{{workflowId}}\"}, {\"{{runId}}\"}, {\"{{nodeId}}\"}\n </div>\n </label>\n </div>\n ) : null}\n\n {/* Handoff Configuration */}\n {node.type === \"handoff\" ? (() => {\n const cfg = (node.config || {}) as Record<string, unknown>;\n const targetTeamId = String(cfg.targetTeamId ?? \"\");\n const targetWorkflowId = String(cfg.targetWorkflowId ?? \"\");\n const variableMapping = (cfg.variableMapping || {}) as Record<string, string>;\n\n const loadTeams = async () => {\n if (handoffTeams.length > 0 || handoffTeamsLoading) return;\n setHandoffTeamsLoading(true);\n try {\n const res = await fetch(\"/api/teams/list\");\n const json = await res.json();\n if (json.ok && Array.isArray(json.teamIds)) {\n setHandoffTeams(json.teamIds);\n }\n } catch { /* ignore */ }\n setHandoffTeamsLoading(false);\n };\n\n const loadWorkflows = async (tid: string) => {\n if (!tid || handoffWorkflows[tid]) return;\n try {\n const res = await fetch(`/api/teams/workflows?teamId=${encodeURIComponent(tid)}`);\n const json = await res.json();\n if (json.ok && Array.isArray(json.files)) {\n // files are like [\"my-workflow.workflow.json\"] — strip suffix to get id\n const wfs = json.files.map((f: string) => ({\n id: f.replace(/\\.workflow\\.json$/, \"\"),\n }));\n setHandoffWorkflows((prev) => ({ ...prev, [tid]: wfs }));\n }\n } catch { /* ignore */ }\n };\n\n const loadAccountsForPlatform = async (tid: string, platform: string) => {\n const key = accountsKey(tid, platform);\n if (!tid || !platform || handoffAccounts[key] || handoffAccountsLoading[key]) return;\n setHandoffAccountsLoading((prev) => ({ ...prev, [key]: true }));\n try {\n const postizKey = (() => {\n try {\n const s = localStorage.getItem(`ck-postiz-${tid}`);\n return s ? JSON.parse(s).apiKey || '' : '';\n } catch {\n return '';\n }\n })();\n // Use /integrations (raw Postiz identifier per account) so we can\n // group variants (instagram / instagram-standalone) under the same platform.\n const res = await fetch(\n `/api/plugins/marketing/integrations?team=${encodeURIComponent(tid)}&teamId=${encodeURIComponent(tid)}`,\n {\n headers: postizKey ? { 'x-postiz-api-key': postizKey } : {},\n }\n );\n const json = await res.json();\n const integrations = Array.isArray(json?.integrations) ? json.integrations : [];\n const target = canonicalPlatform(platform);\n const filtered = integrations\n .filter((i: Record<string, unknown>) => canonicalPlatform(String(i?.identifier || '')) === target && !i?.disabled && i?.id)\n .map((i: Record<string, unknown>) => ({\n integrationId: String(i.id),\n identifier: String(i.identifier || ''),\n displayName: String(i.name || platform),\n username: i.username ? String(i.username) : undefined,\n }));\n setHandoffAccounts((prev) => ({ ...prev, [key]: filtered }));\n } catch { /* ignore */ }\n setHandoffAccountsLoading((prev) => ({ ...prev, [key]: false }));\n };\n\n // Resolve kitchenTeamId from variable mapping (if literal)\n const kitchenTeamIdRaw = String(variableMapping.kitchenTeamId ?? '');\n const kitchenTeamId = kitchenTeamIdRaw && !kitchenTeamIdRaw.includes('{{') ? kitchenTeamIdRaw : teamId;\n\n // Trigger data loading\n if (handoffTeams.length === 0 && !handoffTeamsLoading) {\n loadTeams();\n }\n if (targetTeamId && !handoffWorkflows[targetTeamId]) {\n loadWorkflows(targetTeamId);\n }\n // Derive target platform from the target workflow's name. Picker only\n // shows when the target is a known per-platform post workflow\n // (social-post-to-<platform>-vN); otherwise the handoff is generic\n // and no per-platform account selection applies here.\n const targetPlatform = extractPlatformFromWorkflowId(targetWorkflowId);\n const showPicker = !!targetPlatform;\n if (showPicker && kitchenTeamId) {\n loadAccountsForPlatform(kitchenTeamId, targetPlatform);\n }\n\n const targetWfs = handoffWorkflows[targetTeamId] || [];\n const mappingEntries = Object.entries(variableMapping);\n const accountsKeyForTeam = kitchenTeamId && targetPlatform ? accountsKey(kitchenTeamId, targetPlatform) : '';\n const accountOptions = accountsKeyForTeam ? (handoffAccounts[accountsKeyForTeam] || []) : [];\n const accountsLoading = accountsKeyForTeam ? !!handoffAccountsLoading[accountsKeyForTeam] : false;\n\n // Current selection: integrationId (single) or integrationIds (multi, comma-separated)\n const currentIds = String(variableMapping.integrationIds ?? variableMapping.integrationId ?? '').split(',').map((s: string) => s.trim()).filter(Boolean);\n\n const updateCfg = (patch: Record<string, unknown>) => {\n const nextCfg = { ...cfg, ...patch };\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n };\n\n const handoffMode = String(cfg.mode ?? 'fire-and-forget');\n const waitTimeoutMs = typeof cfg.waitTimeoutMs === 'number' ? cfg.waitTimeoutMs as number : 300000;\n\n return (\n <div className=\"space-y-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">Handoff Target</div>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">mode</div>\n <select\n value={handoffMode}\n onChange={(e) => {\n const m = e.target.value;\n updateCfg({ mode: m === 'fire-and-forget' ? undefined : m });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"fire-and-forget\">Fire &amp; Forget</option>\n <option value=\"wait-for-completion\">Wait for Completion</option>\n </select>\n </label>\n\n {handoffMode === 'wait-for-completion' ? (\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">wait timeout (seconds)</div>\n <input\n type=\"number\"\n min={30}\n value={Math.round(waitTimeoutMs / 1000)}\n onChange={(e) => {\n const secs = Math.max(30, parseInt(e.target.value, 10) || 300);\n updateCfg({ waitTimeoutMs: secs * 1000 });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n />\n <div className=\"mt-0.5 text-[9px] text-[color:var(--ck-text-tertiary)]\">\n Workflow will wait up to this long for the target to complete.\n </div>\n </label>\n ) : null}\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">target team</div>\n <select\n value={targetTeamId}\n onChange={(e) => {\n const tid = e.target.value;\n updateCfg({ targetTeamId: tid || undefined, targetWorkflowId: undefined });\n if (tid && !handoffWorkflows[tid]) loadWorkflows(tid);\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">— Select team —</option>\n {handoffTeams.map((t) => (\n <option key={t} value={t}>{t}{t === teamId ? \" (current)\" : \"\"}</option>\n ))}\n </select>\n </label>\n\n {targetTeamId ? (\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">target workflow</div>\n <select\n value={targetWorkflowId}\n onChange={(e) => updateCfg({ targetWorkflowId: e.target.value || undefined })}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">— Select workflow —</option>\n {targetWfs.map((w) => (\n <option key={w.id} value={w.id}>{w.name || w.id}</option>\n ))}\n </select>\n {targetTeamId && !handoffWorkflows[targetTeamId] ? (\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">Loading workflows…</div>\n ) : null}\n </label>\n ) : null}\n\n {showPicker && targetPlatform ? (\n <div>\n <div className=\"flex items-center justify-between\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">{targetPlatform} accounts</div>\n <button\n type=\"button\"\n onClick={() => {\n const key = accountsKey(kitchenTeamId, targetPlatform);\n setHandoffAccounts((prev) => { const next = { ...prev }; delete next[key]; return next; });\n loadAccountsForPlatform(kitchenTeamId, targetPlatform);\n }}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-0.5 text-[10px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Refresh\n </button>\n </div>\n {accountsLoading ? (\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">Loading accounts…</div>\n ) : accountOptions.length === 0 ? (\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">\n No {targetPlatform} accounts found. Open Marketing → Accounts and connect {targetPlatform} in Postiz.\n </div>\n ) : (\n <div className=\"mt-1 space-y-1\">\n {accountOptions.map((opt) => {\n const checked = currentIds.includes(opt.integrationId);\n const variantSuffix = opt.identifier && opt.identifier !== targetPlatform ? ` (${opt.identifier})` : '';\n return (\n <label key={opt.integrationId} className=\"flex items-center gap-2 cursor-pointer rounded-lg border border-white/10 bg-white/5 px-2 py-1 hover:bg-white/10\">\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={() => {\n const next = checked\n ? currentIds.filter((id: string) => id !== opt.integrationId)\n : [...currentIds, opt.integrationId];\n const nextVm = { ...variableMapping };\n // Use integrationIds (plural) for multi-select\n delete nextVm.integrationId;\n if (next.length > 0) {\n nextVm.integrationIds = next.join(',');\n } else {\n delete nextVm.integrationIds;\n }\n updateCfg({ variableMapping: nextVm });\n }}\n className=\"accent-[var(--ck-accent-red)]\"\n />\n <div>\n <div className=\"text-xs text-[color:var(--ck-text-primary)]\">{opt.displayName}{variantSuffix}</div>\n {opt.username ? <div className=\"text-[10px] text-[color:var(--ck-text-tertiary)]\">{opt.username}</div> : null}\n </div>\n </label>\n );\n })}\n <div className=\"text-[9px] text-[color:var(--ck-text-tertiary)]\">\n {currentIds.length === 0 ? 'None selected — will use first connected account.' : `${currentIds.length} account${currentIds.length > 1 ? 's' : ''} selected.`}\n </div>\n </div>\n )}\n </div>\n ) : null}\n\n <div>\n <div className=\"flex items-center justify-between\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">variable mapping</div>\n <button\n type=\"button\"\n onClick={() => {\n const key = `var_${Date.now()}`;\n updateCfg({ variableMapping: { ...variableMapping, [key]: \"\" } });\n }}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-0.5 text-[10px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n + Add\n </button>\n </div>\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">\n Map target workflow trigger inputs to upstream node outputs. Key = target variable name, Value = {\"{{nodeId.field}}\"} template.\n </div>\n {mappingEntries.length > 0 ? (\n <div className=\"mt-2 space-y-1\">\n {mappingEntries.map(([key, value], idx) => (\n <div key={idx} className=\"flex items-center gap-1\">\n <input\n value={key}\n onChange={(e) => {\n const newKey = e.target.value;\n const newMapping = { ...variableMapping };\n delete newMapping[key];\n newMapping[newKey] = value;\n updateCfg({ variableMapping: newMapping });\n }}\n className=\"w-1/3 rounded-lg border border-white/10 bg-white/5 px-1.5 py-0.5 text-[10px] text-[color:var(--ck-text-primary)]\"\n placeholder=\"target_var\"\n />\n <span className=\"text-[10px] text-[color:var(--ck-text-tertiary)]\">→</span>\n <input\n value={value}\n onChange={(e) => {\n const newMapping = { ...variableMapping, [key]: e.target.value };\n updateCfg({ variableMapping: newMapping });\n }}\n className=\"flex-1 rounded-lg border border-white/10 bg-white/5 px-1.5 py-0.5 text-[10px] text-[color:var(--ck-text-primary)]\"\n placeholder=\"{{nodeId.output}}\"\n />\n <button\n type=\"button\"\n onClick={() => {\n const newMapping = { ...variableMapping };\n delete newMapping[key];\n updateCfg({ variableMapping: Object.keys(newMapping).length > 0 ? newMapping : undefined });\n }}\n className=\"text-[10px] text-red-400 hover:text-red-300\"\n title=\"Remove mapping\"\n >\n ✕\n </button>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)] italic\">No mappings — target workflow will receive empty trigger input.</div>\n )}\n </div>\n </div>\n );\n })() : null}\n\n {/* Output Fields for ALL node types */}\n <div>\n <OutputFieldsEditor\n outputFields={(((node.config as Record<string, unknown>) || {}).outputFields as OutputField[]) || []}\n onChange={(newOutputFields) => {\n const nextCfg = { ...(node.config as Record<string, unknown>) };\n if (newOutputFields.length > 0) {\n nextCfg.outputFields = newOutputFields;\n } else {\n delete nextCfg.outputFields;\n }\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n />\n </div>\n\n {/* Raw config section for debugging */}\n <details className=\"rounded-lg border border-white/10 bg-black/10\">\n <summary className=\"cursor-pointer list-none px-2 py-1 text-[10px] font-medium text-[color:var(--ck-text-secondary)]\">Raw Config (debug)</summary>\n <div className=\"p-2\">\n <pre className=\"mt-1 max-h-[150px] overflow-auto rounded-lg border border-white/10 bg-white/5 p-2 text-[9px] text-[color:var(--ck-text-tertiary)]\">\n {JSON.stringify(node.config ?? {}, null, 2)}\n </pre>\n </div>\n </details>\n </div>\n );\n })()\n ) : (\n <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">Select a node.</div>\n )}\n </div>\n </details>\n\n <details open className=\"rounded-lg border border-white/10 bg-white/5\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Triggers</summary>\n <div className=\"px-3 pb-3\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">triggers</div>\n <button\n type=\"button\"\n onClick={() => {\n const id = `t${Date.now()}`;\n setWorkflow({\n ...wf,\n triggers: [\n ...triggers,\n { kind: \"cron\", id, name: \"New trigger\", enabled: true, expr: \"0 9 * * 1-5\", tz },\n ],\n });\n }}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-[10px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n + Add\n </button>\n </div>\n\n {/* Trigger sync status */}\n {triggerSyncStatus !== \"idle\" && (\n <div className=\"mt-2 flex items-center gap-2 rounded-lg border border-white/10 bg-white/5 px-2 py-1\">\n {triggerSyncStatus === \"syncing\" && (\n <>\n <div className=\"h-3 w-3 animate-spin rounded-full border border-blue-400 border-t-transparent\"></div>\n <div className=\"text-xs text-blue-400\">Syncing triggers...</div>\n </>\n )}\n {triggerSyncStatus === \"success\" && (\n <>\n <div className=\"text-green-400\">✓</div>\n <div className=\"text-xs text-green-400\">Triggers synced</div>\n </>\n )}\n {triggerSyncStatus === \"error\" && (\n <>\n <div className=\"text-red-400\">✗</div>\n <div className=\"text-xs text-red-400\">Trigger sync failed: {triggerSyncError}</div>\n </>\n )}\n </div>\n )}\n\n <div className=\"mt-2 space-y-2\">\n {triggers.length ? (\n triggers.map((t, i) => {\n const kind = (t as { kind?: unknown }).kind;\n const isCron = kind === \"cron\";\n const id = String((t as { id?: unknown }).id ?? \"\");\n const name = String((t as { name?: unknown }).name ?? \"\");\n const enabled = Boolean((t as { enabled?: unknown }).enabled);\n const expr = String((t as { expr?: unknown }).expr ?? \"\");\n const trigTz = String((t as { tz?: unknown }).tz ?? tz);\n const cronFields = expr.trim().split(/\\s+/).filter(Boolean);\n const cronLooksValid = !expr.trim() || cronFields.length === 5;\n\n return (\n <div key={`${id}-${i}`} className=\"rounded-lg border border-white/10 bg-white/5 p-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-xs text-[color:var(--ck-text-primary)]\">{name || id || `trigger-${i + 1}`}</div>\n <button\n type=\"button\"\n onClick={() => setWorkflow({ ...wf, triggers: triggers.filter((_, idx) => idx !== i) })}\n className=\"text-[10px] text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n Remove\n </button>\n </div>\n\n {!isCron ? (\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">Unsupported trigger kind: {String(kind)}</div>\n ) : null}\n\n <div className=\"mt-2 grid grid-cols-1 gap-2\">\n <label className=\"flex items-center gap-2 text-xs text-[color:var(--ck-text-secondary)]\">\n <input\n type=\"checkbox\"\n checked={enabled}\n onChange={(e) => {\n const nextEnabled = e.target.checked;\n setWorkflow({\n ...wf,\n triggers: triggers.map((x, idx) => (idx === i && x.kind === \"cron\" ? { ...x, enabled: nextEnabled } : x)),\n });\n }}\n />\n Enabled\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">name</div>\n <input\n value={name}\n onChange={(e) => {\n const nextName = e.target.value;\n setWorkflow({\n ...wf,\n triggers: triggers.map((x, idx) => (idx === i && x.kind === \"cron\" ? { ...x, name: nextName } : x)),\n });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"Content cadence\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">schedule (cron)</div>\n <input\n value={expr}\n onChange={(e) => {\n const nextExpr = e.target.value;\n setWorkflow({\n ...wf,\n triggers: triggers.map((x, idx) => (idx === i && x.kind === \"cron\" ? { ...x, expr: nextExpr } : x)),\n });\n }}\n className={\n cronLooksValid\n ? \"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 font-mono text-[11px] text-[color:var(--ck-text-primary)]\"\n : \"mt-1 w-full rounded-lg border border-red-400/50 bg-white/5 px-2 py-1 font-mono text-[11px] text-[color:var(--ck-text-primary)]\"\n }\n placeholder=\"0 9 * * 1,3,5\"\n />\n {!cronLooksValid ? (\n <div className=\"mt-1 text-[10px] text-red-200\">\n Cron should be 5 fields (min hour dom month dow). You entered {cronFields.length}.\n </div>\n ) : null}\n <div className=\"mt-1 grid grid-cols-1 gap-1\">\n <select\n value={presets.some((p) => p.expr === expr) ? expr : \"\"}\n onChange={(e) => {\n const nextExpr = e.target.value;\n setWorkflow({\n ...wf,\n triggers: triggers.map((x, idx) => (idx === i && x.kind === \"cron\" ? { ...x, expr: nextExpr } : x)),\n });\n }}\n className=\"w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-[11px] text-[color:var(--ck-text-secondary)]\"\n >\n {presets.map((p) => (\n <option key={p.label} value={p.expr}>\n {p.label}\n </option>\n ))}\n </select>\n <div className=\"text-[10px] text-[color:var(--ck-text-tertiary)]\">Presets set the cron; edit freely for advanced schedules.</div>\n </div>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">timezone override</div>\n <input\n value={trigTz}\n onChange={(e) => {\n const nextTz = String(e.target.value || \"\").trim() || tz;\n setWorkflow({\n ...wf,\n triggers: triggers.map((x, idx) => (idx === i && x.kind === \"cron\" ? { ...x, tz: nextTz } : x)),\n });\n }}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder={tz}\n />\n </label>\n </div>\n </div>\n );\n })\n ) : (\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">No triggers yet.</div>\n )}\n </div>\n </div>\n </details>\n\n <details open className=\"rounded-lg border border-white/10 bg-white/5\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Runs</summary>\n <div className=\"px-3 pb-3\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-3\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Runs (history)</div>\n <Link\n href={`/teams/${encodeURIComponent(teamId)}/runs`}\n className=\"text-[10px] font-medium text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-secondary)] hover:underline\"\n >\n View all →\n </Link>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n disabled={saving}\n onClick={async () => {\n const wfId = String(wf.id ?? \"\").trim();\n if (!wfId) return;\n setWorkflowRunsError(\"\");\n setWorkflowRunsLoading(true);\n try {\n const res = await fetch(\"/api/teams/workflow-runs\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n // Enqueue a canonical file-first run via the CLI (Kitchen should not author run artifacts).\n body: JSON.stringify({ teamId, workflowId: wfId, mode: \"enqueue\" }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to enqueue run\");\n\n const listRes = await fetch(\n `/api/teams/workflow-runs?teamId=${encodeURIComponent(teamId)}&workflowId=${encodeURIComponent(wfId)}`,\n { cache: \"no-store\" }\n );\n const listJson = await listRes.json();\n if (!listRes.ok || !listJson.ok) throw new Error(listJson.error || \"Failed to refresh runs\");\n const files = Array.isArray(listJson.files) ? listJson.files : [];\n const list = files.map((f: unknown) => String(f ?? \"\").trim()).filter((f: string) => Boolean(f));\n setWorkflowRuns(list);\n } catch (e: unknown) {\n setWorkflowRunsError(e instanceof Error ? e.message : String(e));\n } finally {\n setWorkflowRunsLoading(false);\n }\n }}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-[10px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n + Queue run\n </button>\n <button\n type=\"button\"\n disabled={saving || cronLoading || !runPreflight.ok}\n onClick={async () => {\n const wfId = String(wf.id ?? \"\").trim();\n if (!wfId) return;\n\n // Preflight: all nodes must be assigned.\n if (runPreflight.missingAgentOnNodeIds.length) {\n setWorkflowRunsError(\"All nodes must be assigned to an agent.\");\n return;\n }\n\n // Cron reconciliation: keep the system clean by disabling orphaned worker crons,\n // and install/enable missing worker crons before enqueue.\n // Skipped when the user opted to skip the cron check (once or permanently).\n const skipCronCheck = skipCronOnce || runPreflight.skipCronPermanent;\n if (runPreflight.agentIdsMissingCron.length && !skipCronCheck) {\n setInstallCronBusy(true);\n setInstallCronError(\"\");\n try {\n const reconcileRes = await fetch(\"/api/cron/worker\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ action: \"reconcile\", teamId }),\n });\n const reconcileJson = (await reconcileRes.json()) as { ok?: boolean; error?: string };\n if (!reconcileRes.ok || reconcileJson.ok === false) {\n throw new Error(reconcileJson.error || \"Failed to reconcile worker crons\");\n }\n const map = await refreshCronMap();\n const stillMissing = runPreflight.requiredAgentIds.filter((id) => !map[id]);\n if (stillMissing.length) {\n setWorkflowRunsError(`Cron not set up for: ${stillMissing.join(\", \")}`);\n return;\n }\n } catch (e: unknown) {\n setWorkflowRunsError(e instanceof Error ? e.message : String(e));\n return;\n } finally {\n setInstallCronBusy(false);\n }\n }\n\n setWorkflowRunsError(\"\");\n setWorkflowRunsLoading(true);\n setRunOverlayOpen(true);\n try {\n const res = await fetch(\"/api/teams/workflow-runs\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, workflowId: wfId, mode: \"run_now\" }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to create run\");\n\n // Redirect to run page if runId is available\n const newRunId = String(json.runId ?? \"\").trim();\n if (newRunId) {\n router.push(`/teams/${teamId}/runs/${workflowId}/${newRunId}`);\n return;\n }\n\n setRunOverlayOpen(false);\n const listRes = await fetch(\n `/api/teams/workflow-runs?teamId=${encodeURIComponent(teamId)}&workflowId=${encodeURIComponent(wfId)}`,\n { cache: \"no-store\" }\n );\n const listJson = await listRes.json();\n if (!listRes.ok || !listJson.ok) throw new Error(listJson.error || \"Failed to refresh runs\");\n const files = Array.isArray(listJson.files) ? listJson.files : [];\n const list = files.map((f: unknown) => String(f ?? \"\").trim()).filter((f: string) => Boolean(f));\n setWorkflowRuns(list);\n } catch (e: unknown) {\n setRunOverlayOpen(false);\n setWorkflowRunsError(e instanceof Error ? e.message : String(e));\n } finally {\n setWorkflowRunsLoading(false);\n }\n }}\n className=\"rounded-lg border border-emerald-400/30 bg-emerald-500/10 px-2 py-1 text-[10px] font-medium text-emerald-50 hover:bg-emerald-500/15 disabled:opacity-50\"\n title=\"Enqueue a run for the workflow runner (Kitchen does not execute nodes)\"\n >\n + Run now\n </button>\n {cronError ? (\n <div className=\"ml-2 text-[10px] text-amber-100/90\" title={cronError}>\n Cron check unavailable\n </div>\n ) : null}\n </div>\n </div>\n\n {runPreflight.missingAgentOnNodeIds.length ? (\n <div className=\"mt-2 rounded-lg border border-red-400/30 bg-red-500/10 p-2 text-xs text-red-100\">\n All nodes must be assigned to an agent. Missing agentId on: {runPreflight.missingAgentOnNodeIds.join(\", \")}\n </div>\n ) : runPreflight.skipCronPermanent ? (\n <div className=\"mt-2 rounded-lg border border-sky-400/30 bg-sky-500/10 p-2 text-xs text-sky-50\">\n <div>Cron check is skipped permanently for this workflow. Run Now will enqueue without installing worker crons.</div>\n <div className=\"mt-2 flex flex-wrap items-center gap-2\">\n <button\n type=\"button\"\n disabled={skipCronSaving}\n onClick={async () => {\n setSkipCronSaving(true);\n setSkipCronError(\"\");\n try {\n if (status.kind !== \"ready\") throw new Error(\"Workflow not loaded\");\n const current = JSON.parse(status.jsonText) as WorkflowFileV1;\n const curMeta =\n current.meta && typeof current.meta === \"object\" && !Array.isArray(current.meta)\n ? { ...(current.meta as Record<string, unknown>) }\n : {};\n delete curMeta.skipCronCheck;\n const nextWf: WorkflowFileV1 = { ...current, meta: curMeta };\n const res = await fetch(\"/api/teams/workflows\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, workflow: nextWf }),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || json.ok === false) {\n throw new Error(json.error || \"Failed to save workflow\");\n }\n setStatus({ kind: \"ready\", jsonText: JSON.stringify(nextWf, null, 2) + \"\\n\" });\n await refreshCronMap();\n } catch (e: unknown) {\n setSkipCronError(e instanceof Error ? e.message : String(e));\n } finally {\n setSkipCronSaving(false);\n }\n }}\n className=\"rounded-lg border border-sky-300/30 bg-sky-500/10 px-2 py-1 text-[10px] font-medium text-sky-50 hover:bg-sky-500/15 disabled:opacity-60\"\n >\n {skipCronSaving ? \"Unskipping…\" : \"Unskip\"}\n </button>\n {skipCronError ? (\n <span className=\"text-[10px] text-red-200\">{skipCronError}</span>\n ) : null}\n </div>\n </div>\n ) : skipCronOnce ? (\n <div className=\"mt-2 rounded-lg border border-sky-400/30 bg-sky-500/10 p-2 text-xs text-sky-50\">\n Cron check is skipped for this session. Run Now will enqueue without installing worker crons.\n Reload the page to re-enable the check.\n </div>\n ) : runPreflight.agentIdsMissingCron.length ? (\n <div className=\"mt-2 rounded-lg border border-amber-400/30 bg-amber-500/10 p-2 text-xs text-amber-50\">\n <div>Cron not set up for: {runPreflight.agentIdsMissingCron.join(\", \")}</div>\n <div className=\"mt-2 flex flex-wrap items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => {\n setInstallCronError(\"\");\n setInstallCronOpen(true);\n }}\n className=\"rounded-lg border border-amber-300/30 bg-amber-500/10 px-2 py-1 text-[10px] font-medium text-amber-50 hover:bg-amber-500/15\"\n >\n Install worker cron(s)\n </button>\n <button\n type=\"button\"\n onClick={() => void refreshCronMap()}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-[10px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Re-check\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setSkipCronError(\"\");\n setSkipCronModalOpen(true);\n }}\n className=\"rounded-lg border border-sky-400/30 bg-sky-500/10 px-2 py-1 text-[10px] font-medium text-sky-50 hover:bg-sky-500/15\"\n title=\"Skip the cron-install check and enable Run Now (useful when workers run via launchd or an external scheduler)\"\n >\n Skip\n </button>\n </div>\n </div>\n ) : null}\n\n <ConfirmationModal\n open={skipCronModalOpen}\n title=\"Skip cron check?\"\n busy={skipCronSaving}\n error={skipCronError || undefined}\n confirmLabel=\"Skip this run only\"\n confirmBusyLabel=\"Saving…\"\n onClose={() => {\n if (skipCronSaving) return;\n setSkipCronModalOpen(false);\n }}\n onConfirm={() => {\n setSkipCronOnce(true);\n setSkipCronModalOpen(false);\n }}\n >\n <div className=\"text-sm text-[color:var(--ck-text-secondary)] space-y-3\">\n <p>\n Choose how long to bypass the worker-cron check for this workflow. The actual worker\n process must still be running somewhere (OpenClaw cron, macOS launchd, systemd, etc.)\n — skipping the check only stops Kitchen from blocking Run Now.\n </p>\n <div className=\"rounded-lg border border-white/10 bg-white/5 p-3\">\n <div className=\"text-xs font-semibold text-[color:var(--ck-text-primary)]\">Skip this run only</div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n Click the primary button below. Skip resets on page reload.\n </div>\n </div>\n <button\n type=\"button\"\n disabled={skipCronSaving}\n onClick={async () => {\n setSkipCronSaving(true);\n setSkipCronError(\"\");\n try {\n if (status.kind !== \"ready\") throw new Error(\"Workflow not loaded\");\n const current = JSON.parse(status.jsonText) as WorkflowFileV1;\n const nextMeta: Record<string, unknown> = {\n ...(current.meta && typeof current.meta === \"object\" && !Array.isArray(current.meta)\n ? (current.meta as Record<string, unknown>)\n : {}),\n skipCronCheck: true,\n };\n const nextWf: WorkflowFileV1 = { ...current, meta: nextMeta };\n const res = await fetch(\"/api/teams/workflows\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, workflow: nextWf }),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || json.ok === false) {\n throw new Error(json.error || \"Failed to save workflow\");\n }\n setStatus({ kind: \"ready\", jsonText: JSON.stringify(nextWf, null, 2) + \"\\n\" });\n setSkipCronModalOpen(false);\n } catch (e: unknown) {\n setSkipCronError(e instanceof Error ? e.message : String(e));\n } finally {\n setSkipCronSaving(false);\n }\n }}\n className=\"w-full rounded-lg border border-sky-400/30 bg-sky-500/10 p-3 text-left hover:bg-sky-500/15 disabled:opacity-60\"\n >\n <div className=\"text-xs font-semibold text-sky-50\">Skip permanently</div>\n <div className=\"mt-1 text-xs text-sky-100/80\">\n Writes <span className=\"font-mono\">meta.skipCronCheck: true</span> into the workflow JSON.\n Applies forever unless the flag is removed.\n </div>\n </button>\n </div>\n </ConfirmationModal>\n\n <ConfirmationModal\n open={installCronOpen}\n title=\"Install worker cron jobs?\"\n busy={installCronBusy}\n error={installCronError || undefined}\n confirmLabel=\"Install\"\n onClose={() => {\n if (installCronBusy) return;\n setInstallCronOpen(false);\n }}\n onConfirm={async () => {\n setInstallCronBusy(true);\n setInstallCronError(\"\");\n try {\n const res = await fetch(\"/api/cron/worker\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ action: \"reconcile\", teamId }),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || json.ok === false) throw new Error(json.error || \"Failed to install worker crons\");\n\n await refreshCronMap();\n setInstallCronOpen(false);\n } catch (e: unknown) {\n setInstallCronError(e instanceof Error ? e.message : String(e));\n } finally {\n setInstallCronBusy(false);\n }\n }}\n >\n <div className=\"text-sm text-[color:var(--ck-text-secondary)]\">\n Kitchen will install (or enable) worker cron jobs for the following agents so this workflow can drain:\n <div className=\"mt-2 rounded-lg border border-white/10 bg-white/5 p-2 font-mono text-[11px] text-[color:var(--ck-text-primary)]\">\n {runPreflight.agentIdsMissingCron.join(\", \")}\n </div>\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Cron cadence: every 5 minutes. The worker runs: <span className=\"font-mono\">openclaw recipes workflows worker-tick</span>.\n </div>\n </div>\n </ConfirmationModal>\n\n {workflowRunsError ? (\n <div className=\"mt-2 rounded-lg border border-red-400/30 bg-red-500/10 p-2 text-xs text-red-100\">\n {workflowRunsError}\n </div>\n ) : null}\n\n <div className=\"mt-2 space-y-1\">\n {workflowRunsLoading ? (\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">Serving up hot…</div>\n ) : workflowRuns.length ? (\n workflowRuns.slice(0, 8).map((f) => {\n const wfId = String(wf.id ?? \"\").trim();\n const runId = String(f).replace(/\\.run\\.json$/i, \"\");\n const selected = selectedWorkflowRunId === runId;\n const href = wfId\n ? `/teams/${encodeURIComponent(teamId)}/runs/${encodeURIComponent(wfId)}/${encodeURIComponent(runId)}`\n : \"#\";\n\n return (\n <Link\n key={f}\n href={href}\n onClick={() => setSelectedWorkflowRunId(runId)}\n className={\n selected\n ? \"block w-full rounded-lg bg-white/10 px-2 py-1 text-left text-[11px] font-mono text-[color:var(--ck-text-primary)]\"\n : \"block w-full rounded-lg px-2 py-1 text-left text-[11px] font-mono text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n title=\"Open run detail\"\n >\n {runId}\n </Link>\n );\n })\n ) : (\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">No runs yet.</div>\n )}\n </div>\n\n <details open className=\"mt-3 rounded-lg border border-white/10 bg-black/10\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Nodes</summary>\n <div className=\"px-3 pb-3\">\n\n <div className=\"mt-2 rounded-lg border border-white/10 bg-white/5 p-2\">\n <div className=\"grid grid-cols-1 gap-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">id</div>\n <input\n value={newNodeId}\n onChange={(e) => setNewNodeId(e.target.value)}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"e.g. draft_assets\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">name (optional)</div>\n <input\n value={newNodeName}\n onChange={(e) => setNewNodeName(e.target.value)}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"Human-friendly label\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">type</div>\n <select\n value={newNodeType}\n onChange={(e) => setNewNodeType(e.target.value as WorkflowFileV1[\"nodes\"][number][\"type\"])}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"start\">start</option>\n <option value=\"end\">end</option>\n <option value=\"llm\">llm</option>\n <option value=\"tool\">tool</option>\n <option value=\"condition\">condition</option>\n <option value=\"delay\">delay</option>\n <option value=\"human_approval\">human_approval</option>\n <option value=\"media-image\">media-image</option>\n <option value=\"media-video\">media-video</option>\n <option value=\"handoff\">handoff</option>\n </select>\n </label>\n\n <button\n type=\"button\"\n onClick={() => {\n const rawId = String(newNodeId || \"\").trim();\n const id = rawId.replace(/[^a-z0-9_\\-]/gi, \"_\");\n if (!id) return;\n if (wf.nodes.some((n) => n.id === id)) return;\n\n const maxX = wf.nodes.reduce((acc, n) => (typeof n.x === \"number\" ? Math.max(acc, n.x) : acc), 80);\n const nextNode = {\n id,\n type: newNodeType,\n name: String(newNodeName || \"\").trim() || id,\n x: maxX + 220,\n y: 80,\n } as WorkflowFileV1[\"nodes\"][number];\n\n setWorkflow({ ...wf, nodes: [...wf.nodes, nextNode] });\n setSelectedNodeId(id);\n setNewNodeId(\"\");\n setNewNodeName(\"\");\n }}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-[11px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n + Add node\n </button>\n </div>\n </div>\n\n <div className=\"mt-2 space-y-1\">\n {wf.nodes.map((n) => {\n const selected = selectedNodeId === n.id;\n return (\n <button\n key={n.id}\n type=\"button\"\n onClick={() => setSelectedNodeId(n.id)}\n className={\n selected\n ? \"w-full rounded-lg bg-white/10 px-2 py-1 text-left text-[11px] text-[color:var(--ck-text-primary)]\"\n : \"w-full rounded-lg px-2 py-1 text-left text-[11px] text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n >\n <span className=\"font-mono\">{n.id}</span>\n <span className=\"ml-2 text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">{n.type}</span>\n </button>\n );\n })}\n </div>\n </div>\n </details>\n\n <details open className=\"mt-3 rounded-lg border border-white/10 bg-black/10\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Edges</summary>\n <div className=\"px-3 pb-3\">\n\n <div className=\"mt-2 rounded-lg border border-white/10 bg-white/5 p-2\">\n <div className=\"grid grid-cols-1 gap-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">from</div>\n <select\n value={newEdgeFrom}\n onChange={(e) => setNewEdgeFrom(e.target.value)}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">(select)</option>\n {wf.nodes.map((n) => (\n <option key={n.id} value={n.id}>\n {n.id}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">to</div>\n <select\n value={newEdgeTo}\n onChange={(e) => setNewEdgeTo(e.target.value)}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">(select)</option>\n {wf.nodes.map((n) => (\n <option key={n.id} value={n.id}>\n {n.id}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">label (optional)</div>\n <input\n value={newEdgeLabel}\n onChange={(e) => setNewEdgeLabel(e.target.value)}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"e.g. approve\"\n />\n </label>\n\n <button\n type=\"button\"\n onClick={() => {\n const from = String(newEdgeFrom || \"\").trim();\n const to = String(newEdgeTo || \"\").trim();\n if (!from || !to) return;\n if (from === to) return;\n const id = `e${Date.now()}`;\n const nextEdge: WorkflowFileV1[\"edges\"][number] = {\n id,\n from,\n to,\n ...(String(newEdgeLabel || \"\").trim() ? { label: String(newEdgeLabel).trim() } : {}),\n };\n setWorkflow({ ...wf, edges: [...(wf.edges ?? []), nextEdge] });\n setNewEdgeLabel(\"\");\n }}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-[11px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n + Add edge\n </button>\n </div>\n </div>\n\n <div className=\"mt-2 space-y-2\">\n {(wf.edges ?? []).length ? (\n (wf.edges ?? []).map((e) => (\n <div key={e.id} className=\"rounded-lg border border-white/10 bg-white/5 p-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-[11px] text-[color:var(--ck-text-secondary)]\">\n <span className=\"font-mono\">{e.from}</span> → <span className=\"font-mono\">{e.to}</span>\n {e.label ? <span className=\"ml-2 text-[10px] text-[color:var(--ck-text-tertiary)]\">({e.label})</span> : null}\n </div>\n <button\n type=\"button\"\n onClick={() => setWorkflow({ ...wf, edges: (wf.edges ?? []).filter((x) => x.id !== e.id) })}\n className=\"text-[10px] text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n Remove\n </button>\n </div>\n </div>\n ))\n ) : (\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">No edges yet.</div>\n )}\n </div>\n </div>\n </details>\n\n\n </div>\n </details>\n </div>\n );\n })()\n ) : null}\n </div>\n </div>\n </div>\n <RunLoadingOverlay open={runOverlayOpen} />\n </div>\n );\n}\n","import type { WorkflowEdgeV1, WorkflowFileV1, WorkflowNodeV1, WorkflowTriggerCronV1 } from \"@/lib/workflows/types\";\n\nexport type WorkflowValidationResult = {\n errors: string[];\n warnings: string[];\n};\n\nfunction isFiveFieldCron(expr: string) {\n const parts = String(expr || \"\")\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n return parts.length === 5;\n}\n\nfunction uniqCount(values: string[]) {\n const set = new Set<string>();\n for (const v of values) set.add(v);\n return set.size;\n}\n\nexport function validateWorkflowFileV1(wf: WorkflowFileV1): WorkflowValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (wf.schema !== \"clawkitchen.workflow.v1\") errors.push(`schema must be clawkitchen.workflow.v1 (got ${String(wf.schema)})`);\n if (!String(wf.id || \"\").trim()) errors.push(\"id is required\");\n if (!String(wf.name || \"\").trim()) errors.push(\"name is required\");\n\n const nodes: WorkflowNodeV1[] = Array.isArray(wf.nodes) ? wf.nodes : [];\n const edges: WorkflowEdgeV1[] = Array.isArray(wf.edges) ? wf.edges : [];\n const triggers: WorkflowTriggerCronV1[] = Array.isArray(wf.triggers) ? wf.triggers : [];\n\n const nodeIds = nodes.map((n) => String(n?.id ?? \"\").trim()).filter(Boolean);\n if (nodeIds.length !== nodes.length) errors.push(\"all nodes must have a non-empty id\");\n if (uniqCount(nodeIds) !== nodeIds.length) errors.push(\"node ids must be unique\");\n\n const edgeIds = edges.map((e) => String(e?.id ?? \"\").trim()).filter(Boolean);\n if (edgeIds.length !== edges.length) errors.push(\"all edges must have a non-empty id\");\n if (uniqCount(edgeIds) !== edgeIds.length) errors.push(\"edge ids must be unique\");\n\n const nodeIdSet = new Set(nodeIds);\n for (const e of edges) {\n const from = String(e?.from ?? \"\").trim();\n const to = String(e?.to ?? \"\").trim();\n if (!from || !to) {\n errors.push(`edge ${String(e?.id ?? \"(missing id)\")} must have from/to`);\n continue;\n }\n if (!nodeIdSet.has(from)) errors.push(`edge ${String(e.id)} references missing from node: ${from}`);\n if (!nodeIdSet.has(to)) errors.push(`edge ${String(e.id)} references missing to node: ${to}`);\n }\n\n const starts = nodes.filter((n) => n.type === \"start\");\n const ends = nodes.filter((n) => n.type === \"end\");\n if (!starts.length) warnings.push(\"no start node found\");\n if (starts.length > 1) warnings.push(\"multiple start nodes found (MVP supports this, but execution semantics may be ambiguous)\");\n if (!ends.length) warnings.push(\"no end node found\");\n\n for (const t of triggers) {\n if (t.kind === \"cron\") {\n if (!String(t.id || \"\").trim()) errors.push(\"cron trigger missing id\");\n if (!String(t.expr || \"\").trim()) errors.push(`cron trigger ${String(t.id || \"(missing id)\")} missing expr`);\n else if (!isFiveFieldCron(t.expr)) warnings.push(`cron trigger ${String(t.id)} expr is not 5-field: ${String(t.expr)}`);\n const tz = t.tz ? String(t.tz).trim() : \"\";\n // NOTE: We commonly use \"UTC\" as a default, and it is widely accepted even though it isn't in the\n // classic Region/City IANA format. Treat it as valid to avoid noisy validation warnings.\n if (tz && tz !== \"UTC\" && !tz.includes(\"/\")) {\n warnings.push(`cron trigger ${String(t.id)} tz doesn't look like an IANA timezone: ${String(t.tz)}`);\n }\n }\n }\n\n // Human approval node sanity checks (MVP)\n const meta = wf.meta && typeof wf.meta === \"object\" && !Array.isArray(wf.meta) ? (wf.meta as Record<string, unknown>) : {};\n const defaultTarget = String(meta.approvalTarget ?? \"\").trim();\n for (const n of nodes) {\n if (n.type !== \"human_approval\") continue;\n const cfg = n.config && typeof n.config === \"object\" && !Array.isArray(n.config) ? (n.config as Record<string, unknown>) : {};\n const target = String(cfg.target ?? cfg.chatId ?? \"\").trim();\n const provider = String(cfg.provider ?? cfg.channel ?? \"\").trim();\n\n if (!target && !defaultTarget) {\n warnings.push(`human_approval node ${String(n.id)} has no target (set node.config.target or workflow.meta.approvalTarget)`);\n }\n if (target && !provider && !String(meta.approvalProvider ?? \"\").trim()) {\n warnings.push(`human_approval node ${String(n.id)} has a target but no provider (set node.config.provider or workflow.meta.approvalProvider)`);\n }\n }\n\n return { errors, warnings };\n}\n","/**\n * Media Generation Node Types for ClawKitchen Workflows\n * Integrates with the vendor-agnostic media generation backend system\n */\n\nexport interface MediaGenerationConfig {\n mediaType: 'image' | 'video' | 'audio';\n provider: 'auto' | 'openai' | 'skill' | 'http' | string;\n prompt: string;\n size?: string;\n quality?: 'standard' | 'hd';\n style?: 'natural' | 'vivid';\n model?: string;\n outputPath?: string;\n duration?: string; // For video\n aspect_ratio?: string; // For video (e.g. '16:9', '9:16')\n addRefinement?: boolean | string; // Opt-in LLM refinement pass\n // Provider-specific configs\n skillId?: string;\n httpEndpoint?: string;\n httpHeaders?: Record<string, string>;\n}\n\nexport interface DurationConstraints {\n minSeconds: number;\n maxSeconds: number;\n defaultSeconds: number;\n stepSeconds?: number;\n}\n\nexport interface MediaProvider {\n id: string;\n name: string;\n supportedTypes: ('image' | 'video')[];\n available: boolean;\n models?: string[];\n error?: string;\n durationConstraints?: DurationConstraints | null;\n}\n\nexport const MEDIA_NODE_TYPES = {\n 'media-image': {\n type: 'tool',\n tool: 'media.generate',\n label: 'Generate Image',\n description: 'Generate images using AI providers (DALL-E, Skills, etc.)',\n icon: '🎨',\n color: '#9333EA',\n category: 'media',\n defaultConfig: {\n mediaType: 'image',\n provider: 'auto',\n prompt: '',\n size: '1024x1024',\n quality: 'standard',\n style: 'natural',\n outputPath: 'shared-context/media/{{run.id}}_{{node.id}}.png'\n } as MediaGenerationConfig\n },\n 'media-video': {\n type: 'tool', \n tool: 'media.generate',\n label: 'Generate Video',\n description: 'Generate videos using AI providers',\n icon: '🎬',\n color: '#DC2626',\n category: 'media',\n defaultConfig: {\n mediaType: 'video',\n provider: 'auto',\n prompt: '',\n duration: '5s',\n outputPath: 'shared-context/media/{{run.id}}_{{node.id}}.mp4'\n } as MediaGenerationConfig\n }\n} as const;\n\nexport type MediaNodeType = keyof typeof MEDIA_NODE_TYPES;\n\nexport function isMediaNode(nodeType: string): nodeType is MediaNodeType {\n return nodeType in MEDIA_NODE_TYPES;\n}\n\nexport function getMediaNodeConfig(nodeType: MediaNodeType): MediaGenerationConfig {\n return { ...MEDIA_NODE_TYPES[nodeType].defaultConfig };\n}\n\nexport function validateMediaConfig(config: Partial<MediaGenerationConfig>): string[] {\n const errors: string[] = [];\n \n if (!config.prompt?.trim()) {\n errors.push('Prompt is required');\n }\n \n if (config.mediaType === 'image') {\n if (config.size && !['256x256', '512x512', '1024x1024', '1792x1024', '1024x1792'].includes(config.size)) {\n errors.push('Invalid image size');\n }\n }\n \n if (config.mediaType === 'video') {\n if (config.duration && !config.duration.match(/^\\d+s?$/)) {\n errors.push('Invalid video duration format (e.g., \"5s\")');\n }\n }\n \n return errors;\n}\n\n/**\n * Built-in template variable suggestions for media generation prompts.\n * Prior node outputs (e.g. {{research.output}}) are added dynamically\n * by the UI component based on the current workflow.\n */\nexport const TEMPLATE_VARIABLES = [\n '{{run.id}}',\n '{{workflow.name}}',\n '{{workflow.id}}',\n '{{date}}',\n];\n\n/**\n * Build dynamic template variable list including only upstream node outputs.\n * Walks the edge graph backwards from currentNodeId to find all ancestors.\n *\n * @param allNodeIds - all node IDs in the workflow\n * @param edges - workflow edges (each has `from` and `to`)\n * @param currentNodeId - the node being edited (excluded from suggestions)\n */\nexport function buildTemplateVariables(\n allNodeIds: string[],\n edges: { from: string; to: string }[],\n currentNodeId: string\n): string[] {\n // BFS backwards from currentNodeId to find all upstream ancestors\n const upstream = new Set<string>();\n const queue = [currentNodeId];\n while (queue.length > 0) {\n const nodeId = queue.shift()!;\n for (const edge of edges) {\n if (edge.to === nodeId && !upstream.has(edge.from)) {\n upstream.add(edge.from);\n queue.push(edge.from);\n }\n }\n }\n\n const nodeVars = allNodeIds\n .filter((id) => upstream.has(id) && id !== 'start' && id !== 'end')\n .map((id) => `{{${id}.output}}`);\n return [...nodeVars, ...TEMPLATE_VARIABLES];\n}\n\n/**\n * Common prompt templates for different media types\n */\nexport const PROMPT_TEMPLATES = {\n 'social-media': 'Professional social media image for: {{content}}',\n 'blog-header': 'Blog header image representing: {{title}}',\n 'product-shot': 'Product photography style image of: {{product}}',\n 'illustration': 'Clean vector illustration of: {{concept}}',\n 'marketing': 'Marketing banner image for: {{campaign}}'\n} as const;","'use client';\n\nimport React, { useMemo, useRef, useState, useEffect } from 'react';\nimport { MediaGenerationConfig, MediaProvider, validateMediaConfig, buildTemplateVariables, PROMPT_TEMPLATES } from '@/lib/workflows/media-nodes';\nimport type { WorkflowFileV1 } from '@/lib/workflows/types';\n\ninterface MediaGenerationConfigProps {\n config: MediaGenerationConfig;\n onChange: (config: MediaGenerationConfig) => void;\n teamId: string;\n /** Full workflow object for outputFields-aware variable insertion */\n workflow?: WorkflowFileV1;\n /** All node IDs in the workflow (for building {{nodeId.output}} variable suggestions) */\n workflowNodeIds?: string[];\n /** Workflow edges for determining upstream nodes */\n workflowEdges?: { from: string; to: string }[];\n /** The current node's ID (excluded from variable suggestions) */\n currentNodeId?: string;\n}\n\nexport function MediaGenerationConfigComponent({ config, onChange, teamId, workflow, workflowNodeIds, workflowEdges, currentNodeId }: MediaGenerationConfigProps) {\n const [providers, setProviders] = useState<MediaProvider[]>([]);\n const [loading, setLoading] = useState(true);\n const [errors, setErrors] = useState<string[]>([]);\n\n // Load available providers\n useEffect(() => {\n async function loadProviders() {\n try {\n const response = await fetch(`/api/teams/${teamId}/media-providers`);\n if (response.ok) {\n const data = await response.json();\n setProviders(data);\n }\n } catch (error) {\n console.error('Failed to load media providers:', error);\n } finally {\n setLoading(false);\n }\n }\n loadProviders();\n }, [teamId]);\n\n // Validate config on change\n useEffect(() => {\n const configErrors = validateMediaConfig(config);\n setErrors(configErrors);\n }, [config]);\n\n const updateConfig = (updates: Partial<MediaGenerationConfig>) => {\n onChange({ ...config, ...updates });\n };\n\n const availableProviders = providers.filter(p => p.available);\n const selectedProvider = providers.find(p => p.id === config.provider);\n\n // --- Variables dropdown logic ---\n const promptRef = useRef<HTMLTextAreaElement>(null);\n const [isVarsOpen, setIsVarsOpen] = useState(false);\n const varsDropdownRef = useRef<HTMLDivElement>(null);\n\n const globalVariables = useMemo(\n () => [\n { variable: '{{run.id}}', type: 'text' },\n { variable: '{{workflow.name}}', type: 'text' },\n { variable: '{{workflow.id}}', type: 'text' },\n { variable: '{{node.id}}', type: 'text' },\n { variable: '{{date}}', type: 'text' },\n ],\n []\n );\n\n const upstreamVariables = useMemo(() => {\n if (!workflowNodeIds || !workflowEdges || !currentNodeId) return [];\n\n // If we have the full workflow with nodes, use outputFields-aware logic\n if (workflow && workflow.nodes) {\n const upstream = new Set<string>();\n const queue = [currentNodeId];\n const visited = new Set<string>();\n while (queue.length > 0) {\n const cur = queue.shift()!;\n if (visited.has(cur)) continue;\n visited.add(cur);\n for (const e of (workflow.edges ?? [])) {\n if (e.to === cur && e.from !== currentNodeId && !upstream.has(e.from)) {\n upstream.add(e.from);\n queue.push(e.from);\n }\n }\n }\n\n const vars: Array<{ nodeId: string; nodeName: string; fieldName: string; fieldType: string }> = [];\n for (const nId of upstream) {\n if (nId === 'start' || nId === 'end') continue;\n const node = workflow.nodes.find((n) => n.id === nId);\n if (!node) continue;\n const nodeName = String((node as Record<string, unknown>).name ?? node.id);\n\n vars.push({ nodeId: nId, nodeName, fieldName: 'output', fieldType: 'text' });\n vars.push({ nodeId: nId, nodeName, fieldName: 'text', fieldType: 'text' });\n\n const cfg = (node as Record<string, unknown>).config as Record<string, unknown> | undefined;\n const outputFields = cfg?.outputFields as Array<{ name?: string; type?: string }> | undefined;\n if (Array.isArray(outputFields)) {\n for (const f of outputFields) {\n const name = String(f.name ?? '').trim();\n if (!name || name === 'output' || name === 'text') continue;\n vars.push({ nodeId: nId, nodeName, fieldName: name, fieldType: String(f.type ?? 'text') });\n }\n }\n }\n return vars;\n }\n\n // Fallback: use old buildTemplateVariables (just {{nodeId.output}} list)\n return buildTemplateVariables(workflowNodeIds, workflowEdges, currentNodeId)\n .filter(v => v.includes('.output') && v.startsWith('{{'))\n .map(v => {\n const inner = v.slice(2, -2); // strip {{ }}\n const dotIdx = inner.indexOf('.');\n const nodeId = inner.substring(0, dotIdx);\n return { nodeId, nodeName: nodeId, fieldName: 'output', fieldType: 'text' };\n });\n }, [workflow, workflowNodeIds, workflowEdges, currentNodeId]);\n\n const groupedUpstream = useMemo(() => {\n const groups: Record<string, { nodeId: string; nodeName: string; fields: Array<{ name: string; type: string }> }> = {};\n for (const v of upstreamVariables) {\n const key = v.nodeId + '|' + v.nodeName;\n if (!groups[key]) groups[key] = { nodeId: v.nodeId, nodeName: v.nodeName, fields: [] };\n groups[key].fields.push({ name: v.fieldName, type: v.fieldType });\n }\n return Object.values(groups);\n }, [upstreamVariables]);\n\n useEffect(() => {\n function onClickOutside(event: MouseEvent) {\n if (varsDropdownRef.current && !varsDropdownRef.current.contains(event.target as Node)) {\n setIsVarsOpen(false);\n }\n }\n if (isVarsOpen) {\n document.addEventListener('mousedown', onClickOutside);\n return () => document.removeEventListener('mousedown', onClickOutside);\n }\n }, [isVarsOpen]);\n\n const insertVariable = (variable: string) => {\n const textarea = promptRef.current;\n if (!textarea) {\n // Fallback: just append\n updateConfig({ prompt: config.prompt + (config.prompt ? ' ' : '') + variable });\n setIsVarsOpen(false);\n return;\n }\n const start = textarea.selectionStart;\n const end = textarea.selectionEnd;\n const currentValue = textarea.value;\n const nextValue = currentValue.substring(0, start) + variable + currentValue.substring(end);\n updateConfig({ prompt: nextValue });\n setTimeout(() => {\n textarea.focus();\n const newPos = start + variable.length;\n textarea.setSelectionRange(newPos, newPos);\n }, 0);\n setIsVarsOpen(false);\n };\n\n return (\n <div className=\"space-y-3\">\n {loading && (\n <div className=\"flex items-center gap-2 text-[10px] text-[color:var(--ck-text-tertiary)]\">\n <div className=\"animate-spin w-3 h-3 border border-[color:var(--ck-border-subtle)] border-t-transparent rounded-full\"></div>\n Detecting providers...\n </div>\n )}\n\n {!loading && availableProviders.length === 0 && providers.length > 0 && (\n <div className=\"mt-2 rounded-lg border border-amber-400/30 bg-amber-500/10 p-2 text-xs text-amber-50\">\n <div className=\"space-y-1\">\n <div className=\"font-medium\">⚠️ Media providers detected but not available</div>\n <div>\n <strong>Common Issues:</strong>\n </div>\n {providers.some(p => p.error?.includes('API key')) && (\n <div>• Missing API keys - Check provider selection below for specific requirements</div>\n )}\n {providers.some(p => p.error?.includes('not running')) && (\n <div>• Local services not running - Start Stable Diffusion, ComfyUI, etc.</div>\n )}\n <div>\n • <a href=\"https://docs.openclaw.ai/nodes/images\" target=\"_blank\" rel=\"noopener\" className=\"text-amber-100 underline hover:text-amber-50\">\n Setup troubleshooting →\n </a>\n </div>\n </div>\n </div>\n )}\n\n {!loading && providers.length === 0 && (\n <div className=\"rounded-lg border border-white/10 bg-white/5 p-3\">\n <div className=\"text-xs text-[color:var(--ck-text-secondary)] space-y-2\">\n <p className=\"font-medium text-[color:var(--ck-text-primary)]\">⚠️ No media generation providers detected</p>\n <div className=\"space-y-1 text-[color:var(--ck-text-tertiary)]\">\n <p><strong>Setup Options:</strong></p>\n <p>• <a href=\"https://docs.openclaw.ai/nodes/images\" target=\"_blank\" rel=\"noopener\" className=\"text-blue-400 hover:text-blue-300 hover:underline\">Configure image generation models →</a></p>\n <p>• <a href=\"https://clawhub.ai/skills?q=image\" target=\"_blank\" rel=\"noopener\" className=\"text-blue-400 hover:text-blue-300 hover:underline\">Install image generation skills →</a></p>\n <p>• <a href=\"https://docs.openclaw.ai/setup/providers#openai\" target=\"_blank\" rel=\"noopener\" className=\"text-blue-400 hover:text-blue-300 hover:underline\">Add OpenAI API key for DALL-E →</a></p>\n </div>\n </div>\n </div>\n )}\n\n {/* Provider Selection */}\n {(!loading && providers.length > 0) && (\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">provider</div>\n <select\n value={config.provider}\n onChange={(e) => updateConfig({ provider: e.target.value })}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"auto\">Auto-detect (recommended)</option>\n {providers.map((provider) => (\n <option key={provider.id} value={provider.id}>\n {provider.name}\n {provider.available \n ? (provider.models && provider.models.length > 0 \n ? ` (${provider.models.join(', ')})` \n : ' ✓'\n )\n : ' ⚠️'\n }\n </option>\n ))}\n </select>\n {selectedProvider && (\n <div className=\"mt-1 space-y-1\">\n <div className=\"text-[10px] text-[color:var(--ck-text-tertiary)]\">\n Supports: {selectedProvider.supportedTypes.join(', ')}\n {selectedProvider.models && selectedProvider.models.length > 0 && (\n <span className=\"ml-2\">• Models: {selectedProvider.models.join(', ')}</span>\n )}\n </div>\n {selectedProvider.error && (\n <div className=\"mt-2 rounded-lg border border-red-400/30 bg-red-500/10 p-2 text-xs text-red-100\">\n <div>\n <span className=\"font-medium\">⚠️ Setup Required:</span> {selectedProvider.error}\n </div>\n {selectedProvider.id === 'openai' && selectedProvider.error.includes('OPENAI_API_KEY') && (\n <div className=\"mt-1\">\n Add your OpenAI API key to environment variables or OpenClaw config.{' '}\n <a href=\"https://docs.openclaw.ai/setup/providers#openai\" target=\"_blank\" rel=\"noopener\" className=\"text-red-200 underline hover:text-red-100\">\n Setup guide →\n </a>\n </div>\n )}\n {selectedProvider.id === 'skills' && selectedProvider.error.includes('API keys') && (\n <div className=\"mt-1\">\n Skills require API keys (OPENAI_API_KEY, EVOLINK_API_KEY).{' '}\n <a href=\"https://clawhub.ai/skills?q=image\" target=\"_blank\" rel=\"noopener\" className=\"text-red-200 underline hover:text-red-100\">\n Browse skills →\n </a>\n </div>\n )}\n {selectedProvider.id.startsWith('http-') && (\n <div className=\"mt-1\">\n Start the local service or configure a different endpoint.{' '}\n <a href=\"https://docs.openclaw.ai/nodes/images#local-endpoints\" target=\"_blank\" rel=\"noopener\" className=\"text-red-200 underline hover:text-red-100\">\n Local setup →\n </a>\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </label>\n )}\n\n {/* Prompt with {{}} variables dropdown */}\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">prompt</div>\n <div className=\"relative\">\n <textarea\n ref={promptRef}\n value={config.prompt}\n onChange={(e) => updateConfig({ prompt: e.target.value })}\n placeholder=\"Describe the image or video you want to generate...\"\n rows={3}\n className=\"mt-1 w-full resize-none rounded-lg border border-white/10 bg-white/5 p-2 pr-12 text-xs text-[color:var(--ck-text-primary)]\"\n />\n\n {/* Variables dropdown */}\n <div className=\"absolute top-1 right-1\" ref={varsDropdownRef}>\n <button\n type=\"button\"\n onClick={() => setIsVarsOpen(!isVarsOpen)}\n className=\"rounded-lg border border-white/10 bg-black/30 px-2 py-1 text-[9px] text-[color:var(--ck-text-secondary)] hover:bg-white/10 hover:text-[color:var(--ck-text-primary)]\"\n title=\"Insert variable\"\n >\n {'{{}}'}\n </button>\n\n {isVarsOpen && (\n <div className=\"absolute right-0 top-8 z-50 w-72 max-h-80 overflow-auto rounded-lg border border-white/15 bg-black/80 backdrop-blur shadow-[var(--ck-shadow-1)]\">\n <div className=\"p-1\">\n <div>\n <div className=\"px-2 py-1 text-[10px] font-medium uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">\n Globals\n </div>\n {globalVariables.map(({ variable, type }) => (\n <button\n key={variable}\n type=\"button\"\n onClick={() => insertVariable(variable)}\n className=\"w-full flex items-center justify-between gap-2 rounded-lg px-2 py-1 text-left text-xs text-[color:var(--ck-text-primary)] hover:bg-white/10 cursor-pointer\"\n >\n <span className=\"font-mono\">{variable}</span>\n <span className=\"text-[9px] px-1 py-0.5 rounded-sm bg-black/30 text-blue-400\">\n {type}\n </span>\n </button>\n ))}\n </div>\n\n {groupedUpstream.map(group => (\n <div key={group.nodeId}>\n <div className=\"px-2 py-1 text-[10px] font-medium uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">\n {group.nodeName}\n </div>\n {group.fields.map(field => {\n const variable = `{{${group.nodeId}.${field.name}}}`;\n const badgeColor = field.type === 'text' ? 'text-blue-400' :\n field.type === 'list' ? 'text-green-400' :\n field.type === 'json' ? 'text-amber-400' : 'text-gray-400';\n\n return (\n <button\n key={`${group.nodeId}.${field.name}`}\n type=\"button\"\n onClick={() => insertVariable(variable)}\n className=\"w-full flex items-center justify-between gap-2 rounded-lg px-2 py-1 text-left text-xs text-[color:var(--ck-text-primary)] hover:bg-white/10 cursor-pointer\"\n >\n <span className=\"font-mono\">{variable}</span>\n <span className={`text-[9px] px-1 py-0.5 rounded-sm bg-black/30 ${badgeColor}`}>\n {field.type}\n </span>\n </button>\n );\n })}\n </div>\n ))}\n\n {groupedUpstream.length === 0 && (\n <div className=\"px-2 py-3 text-xs text-[color:var(--ck-text-secondary)]\">\n Tip: Add output fields to upstream nodes to see node-specific variables here.\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Quick prompt templates */}\n <div className=\"mt-1 flex gap-1 flex-wrap\">\n {Object.entries(PROMPT_TEMPLATES).map(([key, template]) => (\n <button\n key={key}\n onClick={() => updateConfig({ prompt: template })}\n className=\"rounded-lg bg-white/5 px-2 py-0.5 text-[9px] text-[color:var(--ck-text-tertiary)] hover:bg-black/30\"\n type=\"button\"\n >\n {key}\n </button>\n ))}\n </div>\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">\n Use template variables for dynamic content. Quick templates available above.\n </div>\n </label>\n\n {/* Image-specific options */}\n {config.mediaType === 'image' && (\n <div className=\"grid grid-cols-2 gap-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">size</div>\n <select\n value={config.size || '1024x1024'}\n onChange={(e) => updateConfig({ size: e.target.value })}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"1024x1024\">Square (1024×1024)</option>\n <option value=\"1792x1024\">Landscape (1792×1024)</option>\n <option value=\"1024x1792\">Portrait (1024×1792)</option>\n <option value=\"512x512\">Small Square (512×512)</option>\n </select>\n </label>\n\n {selectedProvider?.id === 'openai' && (\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">quality</div>\n <select\n value={config.quality || 'standard'}\n onChange={(e) => updateConfig({ quality: e.target.value as 'standard' | 'hd' })}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"standard\">Standard</option>\n <option value=\"hd\">HD (higher cost)</option>\n </select>\n </label>\n )}\n </div>\n )}\n\n {selectedProvider?.id === 'openai' && config.mediaType === 'image' && (\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">style</div>\n <select\n value={config.style || 'natural'}\n onChange={(e) => updateConfig({ style: e.target.value as 'natural' | 'vivid' })}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"natural\">Natural</option>\n <option value=\"vivid\">Vivid</option>\n </select>\n </label>\n )}\n\n {/* Video-specific options */}\n {config.mediaType === 'video' && (\n <div className=\"grid grid-cols-2 gap-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">aspect ratio</div>\n <select\n value={config.aspect_ratio || '16:9'}\n onChange={(e) => updateConfig({ aspect_ratio: e.target.value })}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"16:9\">Landscape (16:9)</option>\n <option value=\"9:16\">Portrait (9:16)</option>\n <option value=\"1:1\">Square (1:1)</option>\n <option value=\"4:3\">Standard (4:3)</option>\n <option value=\"3:4\">Portrait (3:4)</option>\n <option value=\"21:9\">Ultrawide (21:9)</option>\n </select>\n </label>\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">duration</div>\n <input\n type=\"text\"\n value={config.duration || '5s'}\n onChange={(e) => updateConfig({ duration: e.target.value })}\n placeholder=\"e.g., 5s, 10s\"\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n />\n {selectedProvider?.durationConstraints ? (\n <div className=\"mt-1 flex items-center gap-1 text-[10px] text-amber-400/80\">\n <span>ℹ️</span>\n <span>\n {selectedProvider.name}: {selectedProvider.durationConstraints.minSeconds}–{selectedProvider.durationConstraints.maxSeconds}s\n (default {selectedProvider.durationConstraints.defaultSeconds}s)\n </span>\n </div>\n ) : (\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">\n Duration in seconds (e.g., &quot;5s&quot;, &quot;10s&quot;)\n </div>\n )}\n </label>\n </div>\n )}\n\n {/* Prompt Refinement toggle — opt-in for video/audio */}\n {(config.mediaType === 'video' || config.mediaType === 'audio') && (\n <label className=\"flex items-center gap-2 py-1\">\n <input\n type=\"checkbox\"\n checked={config.addRefinement === true || config.addRefinement === 'true'}\n onChange={(e) => updateConfig({ addRefinement: e.target.checked })}\n className=\"h-3.5 w-3.5 rounded border-white/20 bg-white/5 text-blue-500 accent-blue-500\"\n />\n <div>\n <span className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">Add LLM Refinement</span>\n <div className=\"text-[10px] text-[color:var(--ck-text-tertiary)] opacity-60\">\n Run an extra LLM pass to refine the prompt before generation. Off by default.\n </div>\n </div>\n </label>\n )}\n\n {/* Validation Errors */}\n {errors.length > 0 && (\n <div className=\"mt-2 rounded-lg border border-red-400/30 bg-red-500/10 p-2 text-xs text-red-100\">\n <div className=\"font-medium mb-1\">Configuration Issues:</div>\n <div className=\"space-y-0.5\">\n {errors.map((error, index) => (\n <div key={index}>• {error}</div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}