@datatechsolutions/ui 3.8.0 → 3.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/dist/astrlabe/index.js +107 -107
  2. package/dist/astrlabe/index.mjs +3 -3
  3. package/dist/astrlabe/workflow-canvas.js +3 -3
  4. package/dist/astrlabe/workflow-canvas.mjs +2 -2
  5. package/dist/{chunk-KKXI7CPF.mjs → chunk-2E7HYTS7.mjs} +3 -3
  6. package/dist/{chunk-KKXI7CPF.mjs.map → chunk-2E7HYTS7.mjs.map} +1 -1
  7. package/dist/{chunk-EWYAM4WJ.mjs → chunk-2ZY3IQ2I.mjs} +3 -3
  8. package/dist/{chunk-EWYAM4WJ.mjs.map → chunk-2ZY3IQ2I.mjs.map} +1 -1
  9. package/dist/{chunk-VPFVW7ZF.js → chunk-6E2YH67A.js} +35 -35
  10. package/dist/{chunk-VPFVW7ZF.js.map → chunk-6E2YH67A.js.map} +1 -1
  11. package/dist/{chunk-A4A3SQTV.mjs → chunk-6QJI5YOJ.mjs} +3 -3
  12. package/dist/{chunk-A4A3SQTV.mjs.map → chunk-6QJI5YOJ.mjs.map} +1 -1
  13. package/dist/{chunk-3X3IYDG6.js → chunk-7AM2SXEF.js} +68 -68
  14. package/dist/{chunk-3X3IYDG6.js.map → chunk-7AM2SXEF.js.map} +1 -1
  15. package/dist/{chunk-H37VDL7Y.js → chunk-A2RIX2RK.js} +4 -4
  16. package/dist/{chunk-H37VDL7Y.js.map → chunk-A2RIX2RK.js.map} +1 -1
  17. package/dist/{chunk-32DHEVOH.mjs → chunk-ARLYOLSO.mjs} +3 -3
  18. package/dist/{chunk-32DHEVOH.mjs.map → chunk-ARLYOLSO.mjs.map} +1 -1
  19. package/dist/{chunk-5YVOLHSW.mjs → chunk-AXBD6OAF.mjs} +4 -4
  20. package/dist/{chunk-5YVOLHSW.mjs.map → chunk-AXBD6OAF.mjs.map} +1 -1
  21. package/dist/{chunk-ZP37M2QK.mjs → chunk-BWUFLW5W.mjs} +6 -6
  22. package/dist/{chunk-ZP37M2QK.mjs.map → chunk-BWUFLW5W.mjs.map} +1 -1
  23. package/dist/{chunk-HBOORO52.js → chunk-CLTNCBSP.js} +4 -4
  24. package/dist/{chunk-HBOORO52.js.map → chunk-CLTNCBSP.js.map} +1 -1
  25. package/dist/{chunk-F35GFICG.js → chunk-CRBGZA6Y.js} +13 -13
  26. package/dist/{chunk-F35GFICG.js.map → chunk-CRBGZA6Y.js.map} +1 -1
  27. package/dist/{chunk-7JZFNKJD.js → chunk-DQIEVLA3.js} +35 -35
  28. package/dist/{chunk-7JZFNKJD.js.map → chunk-DQIEVLA3.js.map} +1 -1
  29. package/dist/{chunk-57E4TCB2.mjs → chunk-EAIE4QGD.mjs} +3 -3
  30. package/dist/{chunk-57E4TCB2.mjs.map → chunk-EAIE4QGD.mjs.map} +1 -1
  31. package/dist/{chunk-5W6LMDXV.mjs → chunk-GQWC4EKE.mjs} +4 -4
  32. package/dist/{chunk-5W6LMDXV.mjs.map → chunk-GQWC4EKE.mjs.map} +1 -1
  33. package/dist/{chunk-FKUIVS6I.js → chunk-IVKFXPLO.js} +28 -28
  34. package/dist/{chunk-FKUIVS6I.js.map → chunk-IVKFXPLO.js.map} +1 -1
  35. package/dist/{chunk-FNA66TT4.js → chunk-MT66VKLS.js} +163 -219
  36. package/dist/chunk-MT66VKLS.js.map +1 -0
  37. package/dist/{chunk-74BU2EBZ.mjs → chunk-OEZ7GAJY.mjs} +6 -6
  38. package/dist/{chunk-74BU2EBZ.mjs.map → chunk-OEZ7GAJY.mjs.map} +1 -1
  39. package/dist/{chunk-CZZOCKEA.mjs → chunk-OVQ4MKCV.mjs} +3 -3
  40. package/dist/{chunk-CZZOCKEA.mjs.map → chunk-OVQ4MKCV.mjs.map} +1 -1
  41. package/dist/{chunk-WDBVIU7W.mjs → chunk-PD3JLDA5.mjs} +3 -3
  42. package/dist/{chunk-WDBVIU7W.mjs.map → chunk-PD3JLDA5.mjs.map} +1 -1
  43. package/dist/{chunk-TJPPZU77.js → chunk-R6GEJBFC.js} +34 -34
  44. package/dist/{chunk-TJPPZU77.js.map → chunk-R6GEJBFC.js.map} +1 -1
  45. package/dist/{chunk-Q4QORAMH.js → chunk-RFUSH7WD.js} +10 -10
  46. package/dist/{chunk-Q4QORAMH.js.map → chunk-RFUSH7WD.js.map} +1 -1
  47. package/dist/{chunk-VS6PTRQ7.mjs → chunk-SJ6SUS7H.mjs} +3 -3
  48. package/dist/{chunk-VS6PTRQ7.mjs.map → chunk-SJ6SUS7H.mjs.map} +1 -1
  49. package/dist/{chunk-E57RZXOR.js → chunk-T4IYOKHR.js} +25 -25
  50. package/dist/{chunk-E57RZXOR.js.map → chunk-T4IYOKHR.js.map} +1 -1
  51. package/dist/{chunk-3H5CFLVK.js → chunk-U6VFS3RD.js} +135 -135
  52. package/dist/{chunk-3H5CFLVK.js.map → chunk-U6VFS3RD.js.map} +1 -1
  53. package/dist/{chunk-RCHTRG7R.js → chunk-UZIICTIY.js} +55 -55
  54. package/dist/{chunk-RCHTRG7R.js.map → chunk-UZIICTIY.js.map} +1 -1
  55. package/dist/{chunk-TCP45Q4B.js → chunk-WJENX6KB.js} +9 -9
  56. package/dist/{chunk-TCP45Q4B.js.map → chunk-WJENX6KB.js.map} +1 -1
  57. package/dist/{chunk-PYNXIDG3.mjs → chunk-WS3IJFPW.mjs} +3 -3
  58. package/dist/{chunk-PYNXIDG3.mjs.map → chunk-WS3IJFPW.mjs.map} +1 -1
  59. package/dist/{chunk-Q7HRCCFT.js → chunk-ZDXEGSCF.js} +45 -45
  60. package/dist/{chunk-Q7HRCCFT.js.map → chunk-ZDXEGSCF.js.map} +1 -1
  61. package/dist/{chunk-PCUINUIC.mjs → chunk-ZQEMKEEH.mjs} +3 -3
  62. package/dist/{chunk-PCUINUIC.mjs.map → chunk-ZQEMKEEH.mjs.map} +1 -1
  63. package/dist/{chunk-E6C7MFHJ.mjs → chunk-ZQRUAXGP.mjs} +164 -218
  64. package/dist/chunk-ZQRUAXGP.mjs.map +1 -0
  65. package/dist/index.d.mts +43 -42
  66. package/dist/index.d.ts +43 -42
  67. package/dist/index.js +662 -670
  68. package/dist/index.mjs +1 -1
  69. package/dist/platform/admin/index.js +9 -9
  70. package/dist/platform/admin/index.mjs +3 -3
  71. package/dist/platform/agents-workspace.js +6 -6
  72. package/dist/platform/agents-workspace.mjs +5 -5
  73. package/dist/platform/app-shell.js +3 -3
  74. package/dist/platform/app-shell.mjs +2 -2
  75. package/dist/platform/auth/index.js +21 -21
  76. package/dist/platform/auth/index.mjs +3 -3
  77. package/dist/platform/billing/index.js +3 -3
  78. package/dist/platform/billing/index.mjs +2 -2
  79. package/dist/platform/impersonation/index.js +3 -3
  80. package/dist/platform/impersonation/index.mjs +2 -2
  81. package/dist/platform/index.d.mts +1 -1
  82. package/dist/platform/index.d.ts +1 -1
  83. package/dist/platform/index.js +74 -74
  84. package/dist/platform/index.mjs +17 -17
  85. package/dist/platform/pages/index.d.mts +93 -4
  86. package/dist/platform/pages/index.d.ts +93 -4
  87. package/dist/platform/pages/index.js +1009 -575
  88. package/dist/platform/pages/index.js.map +1 -1
  89. package/dist/platform/pages/index.mjs +805 -372
  90. package/dist/platform/pages/index.mjs.map +1 -1
  91. package/dist/platform/settings/index.js +6 -6
  92. package/dist/platform/settings/index.mjs +5 -5
  93. package/dist/platform/workflow-canvas-shell.js +4 -4
  94. package/dist/platform/workflow-canvas-shell.mjs +3 -3
  95. package/package.json +1 -1
  96. package/dist/chunk-E6C7MFHJ.mjs.map +0 -1
  97. package/dist/chunk-FNA66TT4.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/astrlabe/components/nodes/model-provider-flow-node.tsx","../src/astrlabe/components/nodes/s3-write-flow-node.tsx","../src/astrlabe/components/icons/model-provider-icons.tsx","../src/astrlabe/components/agent-output-schema/output-schema-builder.tsx","../src/astrlabe/components/modals/agent-modal.tsx","../src/astrlabe/store/subworkflow-store.ts","../src/astrlabe/components/modals/subworkflow-modal.tsx","../src/astrlabe/components/modals/pipeline-settings-modal.tsx","../src/astrlabe/components/modals/run-replay-modal.tsx","../src/astrlabe/components/run-timeline/execution-timeline-panel.tsx","../src/astrlabe/components/rules/types.ts","../src/astrlabe/components/rules/condition-builder.tsx","../src/astrlabe/components/rules/action-builder.tsx","../src/astrlabe/components/rules/rule-form.tsx","../src/astrlabe/components/panels/node-palette.tsx","../src/astrlabe/components/panels/workflow-list-bar.tsx","../src/astrlabe/components/panels/version-history-panel.tsx","../src/astrlabe/components/panels/run-panel.tsx","../src/astrlabe/components/panels/variable-inspector.tsx","../src/astrlabe/components/panels/run-input-dialog.tsx","../src/astrlabe/components/panels/preview-panel.tsx","../src/astrlabe/components/panels/save-status-badge.tsx","../src/astrlabe/components/panels/auto-save-workspace.tsx","../src/astrlabe/components/modals/dynamic-island-confirm.tsx","../src/astrlabe/components/modals/dsl-export-modal.tsx","../src/astrlabe/components/modals/dsl-import-modal.tsx","../src/astrlabe/store/selectors.ts","../src/astrlabe/hooks/use-undo-redo.ts","../src/astrlabe/hooks/use-clipboard.ts","../src/astrlabe/hooks/use-canvas-shortcuts.ts","../src/astrlabe/hooks/use-help-lines.ts"],"names":["ModelProviderFlowNode","memo","S3WriteFlowNode","jsxs","Fragment","jsx","Position","KeyIcon","t","useState","useMemo","useCallback","graph","MaximizeIcon","useEffect","CheckIcon","Cog6ToothIcon","ArrowPathIcon","ClockIcon","ExclamationTriangleIcon","PROVIDER_LOGOS","ChevronDownIcon","CpuChipIcon","ArrowPathRoundedSquareIcon","BoltIcon","PlusIcon","formatTimestamp","CheckCircleIcon","XCircleIcon","formatDuration","XMarkIcon","ChevronRightIcon","PlayIcon","AutoSaveWorkspace","DynamicIslandConfirm","useRef"],"mappings":"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","file":"chunk-5YVOLHSW.mjs","sourcesContent":["import { memo } from 'react'\nimport { Position } from '@xyflow/react'\nimport { KeyIcon, ExclamationTriangleIcon } from '@heroicons/react/24/outline'\nimport type { ModelProviderNodeData } from '../../types'\n\nconst SI = (slug: string, color: string) => `https://cdn.simpleicons.org/${slug}/${color}`\n\nconst PROVIDER_LOGOS: Record<string, string> = {\n aws_bedrock: 'https://www.svgrepo.com/show/448266/aws.svg',\n openai_api: 'https://www.svgrepo.com/show/306500/openai.svg',\n google_vertex: SI('googlegemini', '8E75B2'),\n azure_openai: SI('microsoftazure', '0078D4'),\n anthropic_api: SI('anthropic', 'D4A27F'),\n groq: SI('groq', '000000'),\n mistral: SI('mistralai', 'FF7000'),\n huggingface: SI('huggingface', 'FFD21E'),\n ollama: SI('ollama', 'FFFFFF'),\n}\nimport { Badge } from '@ui/components/badge'\nimport { NodeCard } from './node-card'\nimport { NodeCardHeader, NodeCardMeta } from './node-card-primitives'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nconst PROVIDER_TYPE_LABELS: Record<string, string> = {\n aws_bedrock: 'AWS Bedrock',\n openai_api: 'OpenAI API',\n google_vertex: 'Google Vertex AI',\n azure_openai: 'Azure OpenAI',\n anthropic_api: 'Anthropic API',\n groq: 'Groq Cloud',\n mistral: 'Mistral AI',\n huggingface: 'Hugging Face',\n ollama: 'Ollama (Local)',\n custom: 'Custom',\n}\n\nexport const ModelProviderFlowNode = memo(function ModelProviderFlowNode({ id, data, selected }: { id: string; data: ModelProviderNodeData; selected?: boolean }) {\n const config = data.config\n const isCompact = data.displayMode === 'compact'\n\n if (!config) {\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-gray-400 dark:!bg-gray-500\" />\n <WorkflowHandle type=\"target\" position={Position.Top} id=\"top-in\" colorClass=\"!bg-gray-400 dark:!bg-gray-500\" />\n <NodeCard variant=\"error\" nodeType=\"model_provider\" width=\"w-[280px]\">\n <NodeCardHeader\n icon={<ExclamationTriangleIcon className=\"h-6 w-6 text-white\" />}\n title={data.label || 'Model Provider'}\n description=\"Not configured\"\n iconClassName=\"flex h-11 w-11 items-center justify-center rounded-xl bg-gradient-to-br from-amber-400 to-orange-500 shadow-lg\"\n />\n </NodeCard>\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-slate-500\" />\n <WorkflowHandle type=\"source\" position={Position.Bottom} id=\"bottom-out\" colorClass=\"!bg-slate-500\" />\n </>\n )\n }\n\n const providerLabel = PROVIDER_TYPE_LABELS[config.providerType] ?? config.providerType\n const displayName = config.name || providerLabel\n const regionLabel = config.region ? config.region : undefined\n const isConfigured = !!(config.credentialRef || config.apiKeyRef)\n const logo = PROVIDER_LOGOS[config.providerType]\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-gray-400 dark:!bg-gray-500\" />\n <WorkflowHandle type=\"target\" position={Position.Top} id=\"top-in\" colorClass=\"!bg-gray-400 dark:!bg-gray-500\" />\n\n <button\n type=\"button\"\n onClick={() => data.onEdit?.(id)}\n className=\"w-full text-left\"\n >\n <NodeCard compact={isCompact} selected={selected} nodeType=\"model_provider\" width=\"w-[280px]\">\n <NodeCardHeader\n icon={logo ? (\n <img src={logo} alt={providerLabel} className=\"h-6 w-6 object-contain\" loading=\"lazy\" />\n ) : (\n <KeyIcon className=\"h-6 w-6 text-white\" />\n )}\n title={displayName}\n description={providerLabel}\n iconClassName={`flex h-11 w-11 items-center justify-center rounded-xl shadow-lg ${logo ? 'bg-white/10 dark:bg-white/5 p-2' : 'bg-gradient-to-br from-slate-600 to-slate-700 p-1.5'}`}\n />\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <Badge color=\"zinc\" size=\"xs\">{providerLabel}</Badge>\n {regionLabel && <Badge color=\"zinc\" size=\"xs\">{regionLabel}</Badge>}\n <Badge color={isConfigured ? 'green' : 'amber'} size=\"xs\">\n {isConfigured ? 'Configured' : 'Setup needed'}\n </Badge>\n {config.modelFilter && config.modelFilter.length > 0 && (\n <Badge color=\"zinc\" size=\"xs\">{config.modelFilter.length} models</Badge>\n )}\n </div>\n </NodeCardMeta>\n </NodeCard>\n </button>\n\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-slate-500\" />\n <WorkflowHandle type=\"source\" position={Position.Bottom} id=\"bottom-out\" colorClass=\"!bg-slate-500\" />\n </>\n )\n})\n","import { memo } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { Position } from '@xyflow/react'\nimport { CloudArrowUpIcon } from '@heroicons/react/24/outline'\nimport type { S3WriteNodeData } from '../../types'\nimport { NodeCardBadge, NodeCardDeleteAction, NodeCardHeader, NodeCardMeta, NodeIconBubble, NodeInteractiveCard } from './node-card-primitives'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nexport const S3WriteFlowNode = memo(function S3WriteFlowNode({ id, data, selected }: { id: string; data: S3WriteNodeData; selected?: boolean }) {\n const t = useTranslations('agents.workflow')\n const { config, label, onDelete, onEdit } = data\n const isCompact = data.displayMode === 'compact'\n const keyPreview = config.key ? config.key.slice(0, 30) : ''\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-cyan-500\" />\n\n <NodeInteractiveCard\n nodeId={id}\n onEdit={onEdit}\n compact={isCompact}\n selected={selected}\n nodeType=\"s3_write\"\n >\n <NodeCardHeader\n icon={\n <NodeIconBubble tone=\"s3_write\">\n <CloudArrowUpIcon className=\"h-5 w-5 text-white\" />\n </NodeIconBubble>\n }\n title={label}\n description={t('s3WriteNodeDescription')}\n compact={isCompact}\n iconClassName=\"\"\n />\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex items-center gap-2\">\n <NodeCardBadge tone=\"s3_write\">\n {t('s3WriteNode')}\n </NodeCardBadge>\n {config.bucket && (\n <NodeCardBadge tone=\"s3_write\" soft>\n {config.bucket}\n </NodeCardBadge>\n )}\n {keyPreview && (\n <span className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {keyPreview}\n </span>\n )}\n </div>\n <NodeCardDeleteAction nodeId={id} onDelete={onDelete} />\n </NodeCardMeta>\n </NodeInteractiveCard>\n\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-cyan-500\" />\n </>\n )\n})\n","/**\n * Model provider icons for AWS Bedrock models.\n * Anthropic (Claude), Amazon (Nova), Meta (Llama).\n */\n\ntype IconProps = { className?: string }\n\nexport function AnthropicModelIcon({ className }: IconProps) {\n return (\n <svg role=\"img\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className={className} aria-label=\"Anthropic\">\n <path d=\"M17.3041 3.541h-3.6718l6.696 16.918H24Zm-10.6082 0L0 20.459h3.7442l1.3693-3.5527h7.0052l1.3693 3.5528h3.7442L10.5363 3.5409Zm-.3712 10.2232 2.2914-5.9456 2.2914 5.9456Z\" />\n </svg>\n )\n}\n\nexport function AmazonNovaIcon({ className }: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" className={className} aria-label=\"Amazon Nova\">\n {/* Stylized \"A\" arrow — Amazon-inspired */}\n <path d=\"M12 2L3 20h3.5l1.8-4.5h7.4L17.5 20H21L12 2Zm-2.2 11L12 7.5l2.2 5.5H9.8Z\" fill=\"currentColor\" />\n <path d=\"M2 21c3.5 1.5 7.5 2 10 2s6.5-.5 10-2\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" fill=\"none\" opacity=\"0.6\" />\n </svg>\n )\n}\n\nexport function MetaLlamaIcon({ className }: IconProps) {\n return (\n <svg role=\"img\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className={className} aria-label=\"Meta\">\n <path d=\"M6.915 4.03c-1.968 0-3.683 1.28-4.871 3.113C.704 9.208 0 11.883 0 14.449c0 .706.07 1.369.21 1.973a6.624 6.624 0 0 0 .265.86 5.297 5.297 0 0 0 .371.761c.696 1.159 1.818 1.927 3.593 1.927 1.497 0 2.633-.671 3.965-2.444.76-1.012 1.144-1.626 2.663-4.32l.756-1.339.186-.325c.061.1.121.196.183.3l2.152 3.595c.724 1.21 1.665 2.556 2.47 3.314 1.046.987 1.992 1.22 3.06 1.22 1.075 0 1.876-.355 2.455-.843a3.743 3.743 0 0 0 .81-.973c.542-.939.861-2.127.861-3.745 0-2.72-.681-5.357-2.084-7.45-1.282-1.912-2.957-2.93-4.716-2.93-1.047 0-2.088.467-3.053 1.308-.652.57-1.257 1.29-1.82 2.05-.69-.875-1.335-1.547-1.958-2.056-1.182-.966-2.315-1.303-3.454-1.303zm10.16 2.053c1.147 0 2.188.758 2.992 1.999 1.132 1.748 1.647 4.195 1.647 6.4 0 1.548-.368 2.9-1.839 2.9-.58 0-1.027-.23-1.664-1.004-.496-.601-1.343-1.878-2.832-4.358l-.617-1.028a44.908 44.908 0 0 0-1.255-1.98c.07-.109.141-.224.211-.327 1.12-1.667 2.118-2.602 3.358-2.602zm-10.201.553c1.265 0 2.058.791 2.675 1.446.307.327.737.871 1.234 1.579l-1.02 1.566c-.757 1.163-1.882 3.017-2.837 4.338-1.191 1.649-1.81 1.817-2.486 1.817-.524 0-1.038-.237-1.383-.794-.263-.426-.464-1.13-.464-2.046 0-2.221.63-4.535 1.66-6.088.454-.687.964-1.226 1.533-1.533a2.264 2.264 0 0 1 1.088-.285z\" />\n </svg>\n )\n}\n\nexport function OpenAIModelIcon({ className }: IconProps) {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" className={className} aria-label=\"OpenAI\">\n <path d=\"M14.949 6.547a3.94 3.94 0 0 0-.348-3.273 4.11 4.11 0 0 0-4.4-1.934A4.1 4.1 0 0 0 8.423.2 4.15 4.15 0 0 0 6.305.086a4.1 4.1 0 0 0-1.891.948 4.04 4.04 0 0 0-1.158 1.753 4.1 4.1 0 0 0-1.563.679A4 4 0 0 0 .554 4.72a3.99 3.99 0 0 0 .502 4.731 3.94 3.94 0 0 0 .346 3.274 4.11 4.11 0 0 0 4.402 1.933c.382.425.852.764 1.377.995.526.231 1.095.35 1.67.346 1.78.002 3.358-1.132 3.901-2.804a4.1 4.1 0 0 0 1.563-.68 4 4 0 0 0 1.14-1.253 3.99 3.99 0 0 0-.506-4.716m-6.097 8.406a3.05 3.05 0 0 1-1.945-.694l.096-.054 3.23-1.838a.53.53 0 0 0 .265-.455v-4.49l1.366.778q.02.011.025.035v3.722c-.003 1.653-1.361 2.992-3.037 2.996m-6.53-2.75a2.95 2.95 0 0 1-.36-2.01l.095.057L5.29 12.09a.53.53 0 0 0 .527 0l3.949-2.246v1.555a.05.05 0 0 1-.022.041L6.473 13.3c-1.454.826-3.311.335-4.15-1.098m-.85-6.94A3.02 3.02 0 0 1 3.07 3.949v3.785a.51.51 0 0 0 .262.451l3.93 2.237-1.366.779a.05.05 0 0 1-.048 0L2.585 9.342a2.98 2.98 0 0 1-1.113-4.094zm11.216 2.571L8.747 5.576l1.362-.776a.05.05 0 0 1 .048 0l3.265 1.86a3 3 0 0 1 1.173 1.207 2.96 2.96 0 0 1-.27 3.2 3.05 3.05 0 0 1-1.36.997V8.279a.52.52 0 0 0-.276-.445m1.36-2.015-.097-.057-3.226-1.855a.53.53 0 0 0-.53 0L6.249 6.153V4.598a.04.04 0 0 1 .019-.04L9.533 2.7a3.07 3.07 0 0 1 3.257.139c.474.325.843.778 1.066 1.303.223.526.289 1.103.191 1.664zM5.503 8.575 4.139 7.8a.05.05 0 0 1-.026-.037V4.049c0-.57.166-1.127.476-1.607s.752-.864 1.275-1.105a3.08 3.08 0 0 1 3.234.41l-.096.054-3.23 1.838a.53.53 0 0 0-.265.455zm.742-1.577 1.758-1 1.762 1v2l-1.755 1-1.762-1z\" />\n </svg>\n )\n}\n\nexport function GoogleGeminiIcon({ className }: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" className={className} aria-label=\"Google Gemini\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2Z\" fill=\"#4285F4\" opacity=\"0.15\" />\n <path d=\"M12 2.5c5.25 0 9.5 4.25 9.5 9.5s-4.25 9.5-9.5 9.5S2.5 17.25 2.5 12 6.75 2.5 12 2.5Z\" stroke=\"#4285F4\" strokeWidth=\"1\" fill=\"none\" />\n <path d=\"M12 7L8 12l4 5 4-5-4-5Z\" fill=\"#4285F4\" />\n <path d=\"M12 7L8 12l4 5\" fill=\"#34A853\" />\n </svg>\n )\n}\n\n/** Returns the icon component and color for a model ID */\nexport function getModelIcon(modelId: string): {\n IconComponent: (props: IconProps) => React.ReactNode\n color: string\n providerLabel: string\n} {\n if (modelId.startsWith('anthropic.')) {\n return { IconComponent: AnthropicModelIcon, color: 'text-amber-600 dark:text-amber-400', providerLabel: 'Anthropic' }\n }\n if (modelId.startsWith('amazon.')) {\n return { IconComponent: AmazonNovaIcon, color: 'text-orange-500 dark:text-orange-400', providerLabel: 'Amazon' }\n }\n if (modelId.startsWith('meta.')) {\n return { IconComponent: MetaLlamaIcon, color: 'text-blue-500 dark:text-blue-400', providerLabel: 'Meta' }\n }\n if (modelId.startsWith('google.')) {\n return { IconComponent: GoogleGeminiIcon, color: 'text-blue-500 dark:text-blue-400', providerLabel: 'Google' }\n }\n if (modelId.startsWith('openai.')) {\n return { IconComponent: OpenAIModelIcon, color: 'text-emerald-500 dark:text-emerald-400', providerLabel: 'OpenAI' }\n }\n // fallback\n return { IconComponent: AnthropicModelIcon, color: 'text-gray-500 dark:text-gray-400', providerLabel: 'Custom' }\n}\n","/**\n * Visual editor for `AgentNodeConfig.outputSchema`.\n *\n * Maps onto the JSON-Schema-Draft-7 subset the Rust `AgentExecutor`\n * understands (#72). Authors compose a top-level object schema by\n * adding/removing fields; each field has a name, a primitive type, an\n * optional description, and a required toggle. Nested objects /\n * arrays-of-objects are supported one level deep — the recursive\n * `OutputSchemaBuilder` renders itself again for those.\n *\n * Round-trips losslessly with the JSON-Schema shape the engine reads,\n * which means hand-edited graphs stay editable in this builder so long\n * as they stick to the supported subset.\n */\n\nimport { useMemo } from 'react'\nimport { FormInput, FormSelect } from '@ui/components/form-input'\nimport { Button } from '@ui/components/button'\nimport type { AgentOutputSchema } from '../../contracts'\n\nexport type OutputSchemaBuilderProps = {\n /** Stored schema. `undefined` renders the \"no schema yet\" state with\n * a single button to create one. */\n value?: AgentOutputSchema\n onChange: (next: AgentOutputSchema | undefined) => void\n /** Recursion depth — used to cap the nesting UI offers (deeper trees\n * are still expressible by hand-editing JSON, but the visual builder\n * tops out at 2 to keep the page readable). */\n depth?: number\n}\n\nconst PRIMITIVE_TYPES: Array<{ value: 'string' | 'number' | 'integer' | 'boolean'; label: string }> = [\n { value: 'string', label: 'string' },\n { value: 'number', label: 'number' },\n { value: 'integer', label: 'integer' },\n { value: 'boolean', label: 'boolean' },\n]\n\nconst COMPLEX_TYPES: Array<{ value: 'object' | 'array'; label: string }> = [\n { value: 'object', label: 'object (nested)' },\n { value: 'array', label: 'array of objects' },\n]\n\nconst ALL_TYPES = [...PRIMITIVE_TYPES, ...COMPLEX_TYPES]\n\nexport function OutputSchemaBuilder({ value, onChange, depth = 0 }: OutputSchemaBuilderProps) {\n // Always derive `fields` so React hook order stays stable across the\n // empty / non-object / object branches below.\n const fields: FieldRow[] = useMemo(() => {\n if (!value || value.type !== 'object') return []\n return buildFieldRows(value)\n }, [value])\n\n if (!value) {\n return (\n <div className=\"rounded-xl border border-dashed border-slate-300 bg-slate-50/40 p-4 text-center dark:border-slate-700 dark:bg-slate-900/30\">\n <p className=\"mb-3 text-xs text-slate-500 dark:text-slate-400\">\n No schema yet — agent text is exposed as a raw string. Add a schema to enforce structured output.\n </p>\n <Button\n type=\"button\"\n outline\n onClick={() => onChange({ type: 'object', properties: {}, required: [] })}\n >\n + Add output schema\n </Button>\n </div>\n )\n }\n\n // Top-level must be an object — we only support arrays inline as field\n // types. If someone hand-edited the JSON to something else we coerce\n // back on the next save.\n if (value.type !== 'object') {\n return (\n <div className=\"rounded-xl border border-amber-300 bg-amber-50/40 p-3 text-xs text-amber-700 dark:border-amber-700 dark:bg-amber-900/20 dark:text-amber-300\">\n The visual builder only supports `type: object` at the top level. Convert manually or\n <button\n type=\"button\"\n className=\"ml-1 underline\"\n onClick={() => onChange({ type: 'object', properties: {}, required: [] })}\n >\n reset to object\n </button>.\n </div>\n )\n }\n\n const updateFields = (next: FieldRow[]) => {\n onChange(rowsToSchema(next))\n }\n\n const addField = () => {\n updateFields([\n ...fields,\n { name: '', type: 'string', description: '', required: false, child: undefined },\n ])\n }\n\n const removeField = (index: number) => {\n updateFields(fields.filter((_, i) => i !== index))\n }\n\n const patchField = (index: number, patch: Partial<FieldRow>) => {\n updateFields(fields.map((f, i) => (i === index ? { ...f, ...patch } : f)))\n }\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-slate-700 dark:text-slate-200\">\n Top-level fields\n </span>\n <button\n type=\"button\"\n className=\"text-xs text-rose-600 hover:text-rose-500\"\n onClick={() => onChange(undefined)}\n >\n Remove schema\n </button>\n </div>\n\n <div className=\"space-y-2\">\n {fields.map((field, index) => (\n <FieldEditor\n key={index}\n field={field}\n onChange={(patch) => patchField(index, patch)}\n onRemove={() => removeField(index)}\n depth={depth}\n />\n ))}\n <Button type=\"button\" outline onClick={addField}>+ Add field</Button>\n </div>\n </div>\n )\n}\n\n// ── Field row editor ──────────────────────────────────────────────\n\ntype FieldRow = {\n name: string\n type: 'string' | 'number' | 'integer' | 'boolean' | 'object' | 'array'\n description: string\n required: boolean\n /** Sub-schema for `object` (nested object) or `array` (item schema).\n * Empty for primitives. */\n child?: AgentOutputSchema\n}\n\nfunction FieldEditor({\n field,\n onChange,\n onRemove,\n depth,\n}: {\n field: FieldRow\n onChange: (patch: Partial<FieldRow>) => void\n onRemove: () => void\n depth: number\n}) {\n const handleTypeChange = (next: FieldRow['type']) => {\n if (next === 'object') {\n onChange({ type: next, child: { type: 'object', properties: {}, required: [] } })\n } else if (next === 'array') {\n onChange({ type: next, child: { type: 'object', properties: {}, required: [] } })\n } else {\n onChange({ type: next, child: undefined })\n }\n }\n\n const isComplex = field.type === 'object' || field.type === 'array'\n\n return (\n <div className=\"rounded-xl border border-slate-200 bg-slate-50/60 p-3 dark:border-slate-700 dark:bg-slate-900/40\">\n <div className=\"grid grid-cols-[1fr_140px_auto_auto] items-end gap-2\">\n <FormInput\n label=\"Name\"\n value={field.name}\n onValueChange={(name) => onChange({ name })}\n placeholder=\"recommendedPrice\"\n />\n <FormSelect\n label=\"Type\"\n value={field.type}\n options={ALL_TYPES.map((t) => ({ value: t.value, label: t.label }))}\n onValueChange={(t) => handleTypeChange(t as FieldRow['type'])}\n />\n <label className=\"flex items-center gap-2 pb-2 text-xs text-slate-700 dark:text-slate-200\">\n <input\n type=\"checkbox\"\n checked={field.required}\n onChange={(event) => onChange({ required: event.target.checked })}\n className=\"h-4 w-4 rounded border-slate-300\"\n />\n Required\n </label>\n <Button type=\"button\" plain onClick={onRemove}>Remove</Button>\n </div>\n\n <FormInput\n label=\"Description (optional)\"\n value={field.description}\n onValueChange={(description) => onChange({ description })}\n placeholder=\"What the model should put here\"\n />\n\n {isComplex && depth < 1 && (\n <div className=\"mt-3 rounded-lg border border-dashed border-slate-300 p-2 dark:border-slate-700\">\n <p className=\"mb-2 text-[11px] uppercase tracking-wider text-slate-400\">\n {field.type === 'array' ? 'Item shape' : 'Nested fields'}\n </p>\n <OutputSchemaBuilder\n value={field.child}\n onChange={(child) => onChange({ child })}\n depth={depth + 1}\n />\n </div>\n )}\n\n {isComplex && depth >= 1 && (\n <p className=\"mt-2 text-[11px] italic text-slate-500\">\n Deeper nesting is supported by the engine but not by this builder — edit the JSON\n directly if you need a third level.\n </p>\n )}\n </div>\n )\n}\n\n// ── Schema ↔ FieldRow translation ───────────────────────────────\n\nfunction buildFieldRows(schema: AgentOutputSchema): FieldRow[] {\n const properties = schema.properties ?? {}\n const required = new Set(schema.required ?? [])\n return Object.entries(properties).map(([name, subschema]) => {\n const t = subschema.type ?? 'string'\n const isObject = t === 'object'\n const isArray = t === 'array'\n return {\n name,\n type: isObject ? 'object' : isArray ? 'array' : (t as FieldRow['type']),\n description: subschema.description ?? '',\n required: required.has(name),\n child: isObject ? subschema : isArray ? subschema.items : undefined,\n }\n })\n}\n\nfunction rowsToSchema(rows: FieldRow[]): AgentOutputSchema {\n const properties: Record<string, AgentOutputSchema> = {}\n const required: string[] = []\n for (const row of rows) {\n const name = row.name.trim()\n if (!name) continue\n let entry: AgentOutputSchema\n if (row.type === 'object') {\n entry = row.child && row.child.type === 'object'\n ? row.child\n : { type: 'object', properties: {}, required: [] }\n } else if (row.type === 'array') {\n entry = {\n type: 'array',\n items: row.child ?? { type: 'object', properties: {}, required: [] },\n }\n } else {\n entry = { type: row.type as AgentOutputSchema['type'] }\n }\n if (row.description) entry.description = row.description\n properties[name] = entry\n if (row.required) required.push(name)\n }\n const out: AgentOutputSchema = { type: 'object', properties }\n if (required.length > 0) out.required = required\n return out\n}\n\nexport function defaultAgentOutputSchema(): AgentOutputSchema {\n return { type: 'object', properties: {}, required: [] }\n}\n","import { useState, useMemo, useCallback, useEffect } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { ToggleSwitch } from '@ui/components/toggle-switch'\nimport {\n CpuChipIcon, CommandLineIcon, CheckIcon, KeyIcon,\n UserCircleIcon, WrenchScrewdriverIcon, SparklesIcon,\n Cog6ToothIcon, PlayCircleIcon,\n} from '@heroicons/react/24/outline'\nimport { getFrameworkMeta, FRAMEWORK_META, getCompatibleModels, isModelCompatibleWithFramework, isFrameworkCompatibleWithProviders, type AgentFramework } from '../icons/agent-framework-icons'\nimport { getModelIcon } from '../icons/model-provider-icons'\nimport { GlassModal, type GlassModalSection } from '@ui/components/glass-modal'\nimport { SectionCard } from '@ui/components/card'\nimport { HeroBlock } from '@ui/components/hero-block'\nimport { Avatar } from '@ui/components/avatar'\nimport { StatusBadge } from '@ui/components/status-badge'\nimport { useWorkflowStore } from '../../store/workflow-store'\nimport { useModalStore } from '../../store/modal-store'\nimport type { AgentWithPrompts } from '../../types'\nimport type { AgentModel, AgentTool, AgentPersistPayload, AgentOutputSchema } from '../../contracts'\nimport { OutputSchemaBuilder } from '../agent-output-schema/output-schema-builder'\n\ntype AgentModalProps = {\n onSaved?: () => void\n /**\n * Called when the user clicks Save in the sidebar footer. The modal\n * collects its local editable state (profile + framework + prompt +\n * advanced + tools + connection) into a canonical payload so the\n * parent can decide how to persist (POST for create, PATCH for edit).\n * Returning a rejected promise re-opens the unsaved-changes banner.\n */\n onPersist?: (payload: AgentPersistPayload) => Promise<void>\n}\n\n// Single-page config — Cérebro, Motor and Ferramentas stack as\n// SectionCards in one scrollable pane (UX agent recommendation).\n// Resultados was removed from the modal entirely — execution\n// history is a workspace-level concern, not an agent-edit concern.\ntype TabId = 'config'\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`\n return `${(ms / 1000).toFixed(2)}s`\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction OutputCard({ label, value }: { label: string; value: unknown }) {\n const displayValue = typeof value === 'string' ? value : JSON.stringify(value, null, 2)\n const isLong = typeof displayValue === 'string' && displayValue.length > 120\n\n return (\n <div className=\"rounded-xl border border-white/20 bg-white/40 p-3 dark:border-white/10 dark:bg-white/5\">\n <p className=\"mb-1 text-[10px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {label}\n </p>\n {isLong ? (\n <pre className=\"max-h-40 overflow-auto whitespace-pre-wrap text-xs text-gray-800 dark:text-gray-200\">\n {displayValue}\n </pre>\n ) : (\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">{displayValue}</p>\n )}\n </div>\n )\n}\n\n/* Identity tab — quem é o agente. Avatar, nome, role (read-only),\n * descrição, tags, status. Sem ELO/temperature/modelo/framework\n * (esses vivem em Cérebro e Motor). */\nfunction IdentityTab({\n agent, t, onChanged,\n displayName, setDisplayName,\n description, setDescription,\n avatarUrl, setAvatarUrl,\n status, setStatus,\n tags, setTags,\n}: {\n agent: AgentWithPrompts; t: ReturnType<typeof useTranslations>\n onChanged: () => void\n displayName: string; setDisplayName: (v: string) => void\n description: string; setDescription: (v: string) => void\n avatarUrl: string; setAvatarUrl: (v: string) => void\n status: string; setStatus: (v: string) => void\n tags: string; setTags: (v: string) => void\n}) {\n const liveAvatar = avatarUrl || ((agent as Record<string, unknown>).avatar as string | undefined) || ''\n const [avatarEditOpen, setAvatarEditOpen] = useState(false)\n const touch = () => onChanged()\n\n const inputCard = 'liquid-surface w-full rounded-lg px-3 py-1.5 text-sm text-gray-800 outline-none transition-colors focus:ring-1 focus:ring-indigo-300/40 dark:text-gray-200 dark:focus:ring-indigo-500/20'\n\n return (\n <div className=\"relative overflow-hidden px-6 pb-8 pt-12\">\n {/* Status toggle pinned top-right */}\n <div className=\"absolute right-4 top-4 flex items-center gap-2 rounded-full bg-white/60 px-2.5 py-1 ring-1 ring-gray-200/50 dark:bg-gray-800/60 dark:ring-gray-700/50\">\n <span className={`text-[10px] font-semibold ${status === 'active' ? 'text-emerald-600 dark:text-emerald-400' : 'text-gray-500 dark:text-gray-400'}`}>\n {status === 'active'\n ? t('agentDrawer.statusActive', { _: 'Active' } as never)\n : t('agentDrawer.statusInactive', { _: 'Inactive' } as never)}\n </span>\n <ToggleSwitch\n size=\"sm\"\n color=\"green\"\n checked={status === 'active'}\n onChange={(checked) => { setStatus(checked ? 'active' : 'draft'); touch() }}\n label={t('agentDrawer.status', { _: 'Status' } as never)}\n />\n </div>\n\n {/* Avatar */}\n <div className=\"mb-4 flex justify-center\">\n <div className=\"group relative\">\n <div className=\"absolute inset-0 rounded-full bg-gradient-to-br from-purple-500 to-blue-500 opacity-40 blur-lg\" />\n {liveAvatar ? (\n <img\n src={liveAvatar}\n alt={displayName || agent.name}\n loading=\"lazy\"\n className=\"relative h-20 w-20 rounded-full bg-white object-cover shadow-xl ring-4 ring-white dark:bg-gray-800 dark:ring-gray-800\"\n />\n ) : (\n <div className=\"relative flex h-20 w-20 items-center justify-center rounded-full bg-gradient-to-br from-indigo-400 to-purple-500 shadow-xl ring-4 ring-white dark:ring-gray-800\">\n <CpuChipIcon className=\"h-10 w-10 text-white\" />\n </div>\n )}\n {/* Chip badge */}\n <div className=\"absolute -bottom-1 -right-1 flex h-6 w-6 items-center justify-center rounded-full bg-indigo-500 ring-2 ring-white dark:ring-gray-900\">\n <CpuChipIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n {/* Pencil edit affordance (visible on hover) */}\n <button\n type=\"button\"\n onClick={() => setAvatarEditOpen((open) => !open)}\n className=\"absolute -left-1 -top-1 flex h-6 w-6 items-center justify-center rounded-full bg-gray-900/70 text-white opacity-0 ring-2 ring-white transition-opacity hover:bg-gray-900 group-hover:opacity-100 dark:ring-gray-900\"\n aria-label={t('agentDrawer.avatarUrl', { _: 'Avatar URL' } as never)}\n title={t('agentDrawer.avatarUrl', { _: 'Avatar URL' } as never)}\n >\n <svg className=\"h-3 w-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" /></svg>\n </button>\n </div>\n </div>\n\n {avatarEditOpen && (\n <div className=\"mb-3 flex justify-center\">\n <input\n type=\"text\"\n value={avatarUrl}\n onChange={(event) => { setAvatarUrl(event.target.value); touch() }}\n placeholder=\"https://…\"\n className={`${inputCard} max-w-md text-center text-[11px]`}\n autoFocus\n />\n </div>\n )}\n\n {/* Editable name — input styled as the heading */}\n <input\n type=\"text\"\n value={displayName}\n onChange={(event) => { setDisplayName(event.target.value); touch() }}\n placeholder={agent.name}\n className=\"mx-auto mb-2 block w-full max-w-md bg-transparent text-center text-lg font-bold text-gray-900 outline-none transition-colors placeholder:text-gray-400 focus:outline-none focus:ring-1 focus:ring-indigo-300/40 dark:text-white\"\n aria-label={t('agentDrawer.displayName', { _: 'Display name' } as never)}\n />\n\n {/* Role badge — read-only summary from the agent record */}\n {agent.role && (\n <div className=\"mb-3 flex justify-center\">\n <span className=\"inline-flex items-center gap-1.5 rounded-full bg-white/60 px-3 py-1.5 text-xs font-medium text-gray-600 ring-1 ring-gray-200/50 dark:bg-gray-800/60 dark:text-gray-400 dark:ring-gray-700/50\">\n <svg className=\"h-3 w-3\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M6 6V5a3 3 0 013-3h2a3 3 0 013 3v1h2a2 2 0 012 2v3.57A22.952 22.952 0 0110 13a22.95 22.95 0 01-8-1.43V8a2 2 0 012-2h2zm2-1a1 1 0 011-1h2a1 1 0 011 1v1H8V5zm1 5a1 1 0 011-1h.01a1 1 0 110 2H10a1 1 0 01-1-1z\" clipRule=\"evenodd\" />\n <path d=\"M2 13.692V16a2 2 0 002 2h12a2 2 0 002-2v-2.308A24.974 24.974 0 0110 15c-2.796 0-5.487-.46-8-1.308z\" />\n </svg>\n {agent.role}\n </span>\n </div>\n )}\n\n {/* Editable description — text in glass card, expands as user types */}\n <div className=\"mx-auto mb-4 max-w-xl\">\n <textarea\n rows={2}\n value={description}\n onChange={(event) => { setDescription(event.target.value); touch() }}\n placeholder={t('agentDrawer.descriptionPlaceholder', { _: 'What this agent does, which tasks it\\'s good at' } as never)}\n className={`${inputCard} resize-none text-center text-xs`}\n />\n </div>\n\n {/* Tags */}\n <div className={`${inputCard} mt-2 flex items-center gap-2 !py-1.5`}>\n <span className=\"text-[9px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.tags', { _: 'Tags' } as never)}\n </span>\n <input\n type=\"text\"\n value={tags}\n onChange={(event) => { setTags(event.target.value); touch() }}\n placeholder={t('agentDrawer.tagsPlaceholder', { _: 'pricing, research, internal' } as never)}\n className=\"flex-1 bg-transparent text-[11px] text-gray-800 outline-none placeholder:text-gray-400 dark:text-gray-200\"\n />\n </div>\n\n {/* Prompt version + count */}\n <div className=\"relative mt-4 flex items-center justify-center gap-2 text-[10px] text-gray-400 dark:text-gray-500\">\n <span>v{agent.activePromptVersion}</span>\n <span>·</span>\n <span>{agent.promptCount} prompt{agent.promptCount === 1 ? '' : 's'}</span>\n </div>\n </div>\n )\n}\n\n/*\n ELO tier definitions — maps ELO ranges to model families, tokens, autonomy.\n Each provider family has models sorted by capability (low -> high).\n*/\nconst MODEL_FAMILIES: Record<string, Array<{ prefix: string; maxTokens: number; contextWindow: string }>> = {\n anthropic: [\n { prefix: 'anthropic.claude-haiku', maxTokens: 8192, contextWindow: '200K' },\n { prefix: 'anthropic.claude-sonnet', maxTokens: 8192, contextWindow: '1M' },\n { prefix: 'anthropic.claude-opus', maxTokens: 32768, contextWindow: '1M' },\n ],\n amazon: [\n { prefix: 'amazon.nova-lite', maxTokens: 5120, contextWindow: '300K' },\n { prefix: 'amazon.nova-pro', maxTokens: 5120, contextWindow: '300K' },\n ],\n google: [\n { prefix: 'google.gemini-3-flash', maxTokens: 8192, contextWindow: '1M' },\n { prefix: 'google.gemini-3-1-pro', maxTokens: 32768, contextWindow: '1M' },\n ],\n meta: [\n { prefix: 'meta.llama', maxTokens: 8192, contextWindow: '128K' },\n ],\n openai: [\n { prefix: 'openai.gpt-5-mini', maxTokens: 16384, contextWindow: '1M' },\n { prefix: 'openai.gpt-5-v', maxTokens: 32768, contextWindow: '1M' },\n ],\n}\n\nfunction getProviderFromModelId(modelId: string): string {\n if (modelId.startsWith('anthropic.')) return 'anthropic'\n if (modelId.startsWith('amazon.')) return 'amazon'\n if (modelId.startsWith('meta.')) return 'meta'\n if (modelId.startsWith('openai.')) return 'openai'\n if (modelId.startsWith('google.')) return 'google'\n return 'anthropic'\n}\n\n/** Family extractor — kept symmetric with `getProviderFromModelId`\n * but named for what it actually returns (the *model family*, not\n * the serving provider). E.g., `anthropic.claude-haiku-4.5` is the\n * Anthropic family — it may be served by Anthropic Direct OR by\n * Bedrock at runtime depending on which provider the user picks. */\nfunction getModelFamily(modelId: string): string {\n return getProviderFromModelId(modelId)\n}\n\n/** Which configured providers can serve a given model. Empty array\n * means no provider hosts this family — model is unselectable until\n * the user adds the right credential in Settings. */\nfunction findCompatibleProviders(\n modelId: string,\n providers: import('../../components/panels/node-palette').ModelProvider[],\n): import('../../components/panels/node-palette').ModelProvider[] {\n const family = getModelFamily(modelId)\n return providers.filter((p) => {\n const families = p.servedFamilies ?? [p.provider]\n return families.includes(family)\n })\n}\n\nfunction getEloTier(elo: number): {\n tierKey: string; autonomyKey: string\n color: string; barColor: string\n autonomyPercent: number; costPerTask: string\n familyIndex: number; temperature: number\n} {\n if (elo < 1200) return {\n tierKey: 'beginner', autonomyKey: 'autonomyLow',\n color: 'text-cyan-500', barColor: 'from-cyan-400 to-cyan-500',\n autonomyPercent: 25, costPerTask: '$0.005',\n familyIndex: 0, temperature: 0.7,\n }\n if (elo < 1600) return {\n tierKey: 'intermediate', autonomyKey: 'autonomyMedium',\n color: 'text-pink-500', barColor: 'from-pink-400 to-pink-500',\n autonomyPercent: 50, costPerTask: '$0.15',\n familyIndex: 1, temperature: 0.5,\n }\n if (elo < 2000) return {\n tierKey: 'advanced', autonomyKey: 'autonomyHigh',\n color: 'text-amber-500', barColor: 'from-amber-400 to-amber-500',\n autonomyPercent: 75, costPerTask: '$0.50',\n familyIndex: 1, temperature: 0.4,\n }\n return {\n tierKey: 'expert', autonomyKey: 'autonomyFull',\n color: 'text-emerald-500', barColor: 'from-emerald-400 to-emerald-500',\n autonomyPercent: 100, costPerTask: '$1.50',\n familyIndex: 2, temperature: 0.3,\n }\n}\n\ntype CapabilityCardProps = {\n elo: number\n setElo: (value: number) => void\n models: AgentModel[]\n selectedModelId: string\n setSelectedModelId: (id: string) => void\n temperature: number\n setTemperature: (value: number) => void\n onChanged: () => void\n t: (key: string) => string\n}\n\nfunction AgentCapabilityCard({ elo, setElo, models, selectedModelId, setSelectedModelId, temperature, setTemperature, onChanged, t }: CapabilityCardProps) {\n const tierInfo = getEloTier(elo)\n const eloPercent = Math.min(((elo - 800) / (2400 - 800)) * 100, 100)\n\n const provider = getProviderFromModelId(selectedModelId)\n const family = MODEL_FAMILIES[provider] ?? MODEL_FAMILIES.anthropic\n\n // When ELO slider changes, auto-select the right model in the family and adjust temperature\n const handleEloChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n const newElo = parseInt(event.target.value, 10)\n setElo(newElo)\n\n const newTier = getEloTier(newElo)\n const modelIndex = Math.min(newTier.familyIndex, family.length - 1)\n const targetPrefix = family[modelIndex].prefix\n\n // Find the actual model in the models array that matches this prefix\n const matchingModel = models.find((model) => model.id.startsWith(targetPrefix))\n if (matchingModel) {\n setSelectedModelId(matchingModel.id)\n }\n\n setTemperature(newTier.temperature)\n onChanged()\n }, [family, models, setSelectedModelId, setTemperature, onChanged])\n\n // When autonomy segment is clicked, jump to that tier's ELO midpoint\n const handleAutonomyClick = useCallback((level: number) => {\n const eloMap: Record<number, number> = { 25: 1000, 50: 1400, 75: 1800, 100: 2200 }\n const newElo = eloMap[level] ?? 1000\n setElo(newElo)\n\n const newTier = getEloTier(newElo)\n const modelIndex = Math.min(newTier.familyIndex, family.length - 1)\n const targetPrefix = family[modelIndex].prefix\n const matchingModel = models.find((model) => model.id.startsWith(targetPrefix))\n if (matchingModel) {\n setSelectedModelId(matchingModel.id)\n }\n\n setTemperature(newTier.temperature)\n onChanged()\n }, [family, models, setSelectedModelId, setTemperature, onChanged])\n\n // Resolve current model info\n const currentFamilyEntry = family.find((entry) => selectedModelId.startsWith(entry.prefix)) ?? family[0]\n const currentModelName = models.find((model) => model.id === selectedModelId)?.name ?? selectedModelId\n\n return (\n <div className=\"mx-4 mt-4 overflow-hidden rounded-xl border border-gray-200/30 bg-white/40 dark:border-white/10 dark:bg-white/5\">\n {/* ELO slider */}\n <div className=\"px-4 pt-3 pb-2\">\n <div className=\"mb-1 flex items-center justify-between\">\n <span className=\"text-[10px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">{t('agentDrawer.capabilityRating')}</span>\n <div className=\"flex items-baseline gap-1\">\n <span className={`text-lg font-bold tabular-nums ${tierInfo.color}`}>{elo}</span>\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">ELO</span>\n </div>\n </div>\n {/* Interactive ELO slider */}\n <div className=\"relative\">\n <div className=\"absolute inset-x-0 top-1/2 h-2 -translate-y-1/2 overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700\">\n <div\n className={`h-full rounded-full bg-gradient-to-r ${tierInfo.barColor} transition-all duration-300`}\n style={{ width: `${eloPercent}%` }}\n />\n {[1200, 1600, 2000].map((boundary) => (\n <div\n key={boundary}\n className=\"absolute top-0 h-full w-px bg-gray-400/40 dark:bg-gray-500/40\"\n style={{ left: `${((boundary - 800) / (2400 - 800)) * 100}%` }}\n />\n ))}\n </div>\n <input\n type=\"range\"\n min=\"800\"\n max=\"2400\"\n step=\"50\"\n value={elo}\n onChange={handleEloChange}\n aria-label={t('agentDrawer.capabilityRating')}\n aria-valuemin={800}\n aria-valuemax={2400}\n aria-valuenow={elo}\n aria-valuetext={`${elo} ELO — ${t(`agentDrawer.tier${tierInfo.tierKey.charAt(0).toUpperCase()}${tierInfo.tierKey.slice(1)}`)}`}\n className=\"relative z-10 h-5 w-full cursor-pointer appearance-none bg-transparent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 [&::-webkit-slider-thumb]:h-4 [&::-webkit-slider-thumb]:w-4 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-white [&::-webkit-slider-thumb]:shadow-lg dark:[&::-webkit-slider-thumb]:border-gray-900\"\n />\n <style>{`input[type=\"range\"]::-webkit-slider-thumb { background: ${\n elo < 1200 ? '#06b6d4' : elo < 1600 ? '#ec4899' : elo < 2000 ? '#f59e0b' : '#10b981'\n }; box-shadow: 0 0 6px ${\n elo < 1200 ? 'rgba(6,182,212,0.5)' : elo < 1600 ? 'rgba(236,72,153,0.5)' : elo < 2000 ? 'rgba(245,158,11,0.5)' : 'rgba(16,185,129,0.5)'\n }; }`}</style>\n </div>\n <div className=\"mt-0.5 flex justify-between text-[8px] text-gray-400 dark:text-gray-500\">\n <span>800</span>\n <span>1200</span>\n <span>1600</span>\n <span>2000</span>\n <span>2400</span>\n </div>\n </div>\n\n {/* Derived stats grid */}\n <div className=\"grid grid-cols-3 gap-px border-t border-gray-200/30 bg-gray-200/30 dark:border-white/10 dark:bg-white/10\">\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.model')}</p>\n <p className=\"truncate text-xs font-semibold text-gray-900 dark:text-white\">{currentModelName}</p>\n </div>\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.maxTokens')}</p>\n <p className=\"text-xs font-semibold text-gray-900 dark:text-white\">{currentFamilyEntry.maxTokens.toLocaleString()}</p>\n </div>\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.context')}</p>\n <p className=\"text-xs font-semibold text-gray-900 dark:text-white\">{currentFamilyEntry.contextWindow}</p>\n </div>\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.temperature')}</p>\n <p className=\"text-xs font-semibold text-gray-900 dark:text-white\">{temperature.toFixed(2)}</p>\n </div>\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.autonomy')}</p>\n <p className={`text-xs font-semibold ${tierInfo.color}`}>{t(`agentDrawer.${tierInfo.autonomyKey}`)}</p>\n </div>\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.costPerTask')}</p>\n <p className=\"text-xs font-semibold text-gray-900 dark:text-white\">{tierInfo.costPerTask}</p>\n </div>\n </div>\n\n {/* Clickable autonomy bar */}\n <div className=\"border-t border-gray-200/30 bg-white/60 px-4 py-2.5 dark:border-white/10 dark:bg-gray-900/60\">\n <div className=\"mb-1 flex items-center justify-between\">\n <span className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.autonomyLevel')}</span>\n <span className={`text-[10px] font-semibold ${tierInfo.color}`}>{t(`agentDrawer.${tierInfo.autonomyKey}`)}</span>\n </div>\n <div className=\"flex gap-1\">\n {[\n { level: 25, labelKey: 'autonomyLow' },\n { level: 50, labelKey: 'autonomyMedium' },\n { level: 75, labelKey: 'autonomyHigh' },\n { level: 100, labelKey: 'autonomyFull' },\n ].map(({ level, labelKey }) => (\n <button\n key={level}\n type=\"button\"\n onClick={() => handleAutonomyClick(level)}\n aria-label={t(`agentDrawer.${labelKey}`)}\n aria-pressed={level <= tierInfo.autonomyPercent}\n className={`h-2 flex-1 rounded-full transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 ${\n level <= tierInfo.autonomyPercent\n ? `bg-gradient-to-r ${tierInfo.barColor} hover:opacity-80`\n : 'bg-gray-200 hover:bg-gray-300 dark:bg-gray-700 dark:hover:bg-gray-600'\n }`}\n />\n ))}\n </div>\n <div className=\"mt-1 flex justify-between text-[7px] text-gray-400 dark:text-gray-500\">\n <span>{t('agentDrawer.autonomyLow')}</span>\n <span>{t('agentDrawer.autonomyMedium')}</span>\n <span>{t('agentDrawer.autonomyHigh')}</span>\n <span>{t('agentDrawer.autonomyFull')}</span>\n </div>\n </div>\n </div>\n )\n}\n\nfunction ConfigTab({ models, t, selectedModelId, setSelectedModelId, selectedFramework, setSelectedFramework, markDirty, connectedProviderTypes }: {\n models: AgentModel[]; t: ReturnType<typeof useTranslations>\n selectedModelId: string; setSelectedModelId: (id: string) => void\n selectedFramework: AgentFramework; setSelectedFramework: (fw: AgentFramework) => void\n markDirty: () => void\n connectedProviderTypes: string[]\n}) {\n const frameworkKeys = Object.keys(FRAMEWORK_META) as AgentFramework[]\n const hasProviderConstraints = connectedProviderTypes.length > 0\n const compatibleModels = getCompatibleModels(models, selectedFramework)\n\n // When framework changes and current model is incompatible, auto-select first compatible\n const handleFrameworkChange = useCallback((newFramework: AgentFramework) => {\n setSelectedFramework(newFramework)\n if (!isModelCompatibleWithFramework(selectedModelId, newFramework)) {\n const compatible = getCompatibleModels(models, newFramework)\n if (compatible.length > 0) {\n setSelectedModelId(compatible[0].id)\n }\n }\n markDirty()\n }, [selectedModelId, models, setSelectedFramework, setSelectedModelId, markDirty])\n\n return (\n <div className=\"space-y-5 p-4\">\n {/* Framework selector — choose first, it filters models */}\n <div>\n <label className=\"mb-2 block text-xs font-medium text-gray-500 dark:text-gray-400\">{t('agentDrawer.framework')}</label>\n <div className=\"flex flex-wrap gap-1.5\">\n {frameworkKeys.map((key) => {\n const meta = FRAMEWORK_META[key]\n const isSelected = key === selectedFramework\n const compatCount = getCompatibleModels(models, key).length\n const isCompatibleWithProviders = !hasProviderConstraints || isFrameworkCompatibleWithProviders(key, connectedProviderTypes)\n return (\n <button\n key={key}\n type=\"button\"\n onClick={() => handleFrameworkChange(key)}\n disabled={!isCompatibleWithProviders}\n className={`inline-flex items-center gap-1.5 rounded-full px-3 py-1.5 text-[10px] font-semibold transition-all ${\n !isCompatibleWithProviders\n ? 'cursor-not-allowed bg-gray-100 text-gray-400 opacity-40 dark:bg-white/5 dark:text-gray-500'\n : isSelected\n ? `${meta.badgeColor} ring-1 ring-current/20`\n : 'bg-gray-100 text-gray-500 hover:bg-gray-200 dark:bg-white/5 dark:text-gray-400 dark:hover:bg-white/10'\n }`}\n title={!isCompatibleWithProviders ? t('agentDrawer.frameworkIncompatible') : undefined}\n >\n <meta.IconComponent className=\"h-3.5 w-3.5\" />\n {meta.label}\n <span className=\"ml-0.5 text-[8px] opacity-60\">{compatCount}</span>\n </button>\n )\n })}\n </div>\n </div>\n\n {/* Model selector grid — filtered by framework */}\n <div>\n <label className=\"mb-2 block text-xs font-medium text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.model')}\n {compatibleModels.length < models.length && (\n <span className=\"ml-1.5 text-[10px] font-normal text-gray-400 dark:text-gray-500\">\n ({compatibleModels.length}/{models.length})\n </span>\n )}\n </label>\n <div className=\"grid grid-cols-2 gap-2\">\n {models.map((model) => {\n const isSelected = model.id === selectedModelId\n const isCompatible = isModelCompatibleWithFramework(model.id, selectedFramework)\n const { IconComponent, color, providerLabel } = getModelIcon(model.id)\n return (\n <button\n key={model.id}\n type=\"button\"\n disabled={!isCompatible}\n onClick={() => { setSelectedModelId(model.id); markDirty() }}\n className={`flex items-center gap-2.5 rounded-xl border px-3 py-2.5 text-left transition-all ${\n !isCompatible\n ? 'cursor-not-allowed border-gray-200/30 opacity-35 dark:border-white/5'\n : isSelected\n ? 'border-indigo-500/50 bg-indigo-50/50 ring-1 ring-indigo-500/30 dark:border-indigo-400/40 dark:bg-indigo-500/10'\n : 'border-gray-200/50 bg-gray-50/50 hover:border-gray-300 dark:border-white/10 dark:bg-white/5 dark:hover:border-white/20'\n }`}\n >\n <IconComponent className={`h-5 w-5 flex-shrink-0 ${isSelected && isCompatible ? color : 'text-gray-400 dark:text-gray-500'}`} />\n <div className=\"min-w-0\">\n <p className={`truncate text-xs font-semibold ${isSelected && isCompatible ? 'text-gray-900 dark:text-white' : 'text-gray-600 dark:text-gray-300'}`}>\n {model.name}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">{providerLabel}</p>\n </div>\n </button>\n )\n })}\n </div>\n </div>\n\n </div>\n )\n}\n\n/* ─── Prompt Tab — temperature + system prompt ─── */\n\nfunction PromptTab({\n agent, temperature, setTemperature, markDirty, t, promptText, setPromptText,\n outputSchema, setOutputSchema,\n}: {\n agent: AgentWithPrompts; temperature: number; setTemperature: (value: number) => void\n markDirty: () => void; t: ReturnType<typeof useTranslations>\n // Lifted so the parent `AgentModal` can emit the systemPrompt on save.\n promptText: string; setPromptText: (value: string) => void\n // Optional structured-output schema (issue #71/#72). Edited via the\n // `OutputSchemaBuilder` directly under the system prompt so the\n // author can write the prompt and the contract side-by-side.\n outputSchema: AgentOutputSchema | undefined\n setOutputSchema: (next: AgentOutputSchema | undefined) => void\n}) {\n // `agent` is still read in the existing implementation for historical\n // completeness — kept in props to avoid churning the other call-sites.\n void agent\n\n const handleTemperatureChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setTemperature(parseFloat(event.target.value))\n markDirty()\n }, [])\n\n const handlePromptChange = useCallback((event: React.ChangeEvent<HTMLTextAreaElement>) => {\n setPromptText(event.target.value)\n markDirty()\n }, [])\n\n const temperaturePercent = temperature * 100\n const isPrecise = temperature <= 0.3\n const isBalanced = temperature > 0.3 && temperature <= 0.7\n const isCreative = temperature > 0.7\n\n return (\n <div className=\"space-y-5 p-4\">\n {/* Temperature slider */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <label className=\"text-xs font-medium text-gray-500 dark:text-gray-400\">{t('agentDrawer.temperature')}</label>\n <span className=\"text-sm font-bold tabular-nums text-gray-900 dark:text-white\">\n {temperature.toFixed(2)}\n </span>\n </div>\n <div className=\"relative\">\n <div className=\"absolute inset-x-0 top-1/2 h-2 -translate-y-1/2 overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700\">\n <div\n className=\"h-full rounded-full transition-all duration-300 ease-out\"\n style={{ width: `${temperaturePercent}%`, background: 'linear-gradient(90deg, #3b82f6, #8b5cf6 50%, #ec4899)' }}\n />\n </div>\n <input\n type=\"range\" min=\"0\" max=\"1\" step=\"0.05\" value={temperature}\n onChange={handleTemperatureChange}\n aria-label={t('agentDrawer.temperature')}\n aria-valuenow={temperature}\n aria-valuetext={`${temperature.toFixed(2)} — ${isPrecise ? t('agentDrawer.precise') : isBalanced ? t('agentDrawer.balanced') : t('agentDrawer.creative')}`}\n className=\"relative z-10 h-5 w-full cursor-pointer appearance-none bg-transparent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 [&::-webkit-slider-thumb]:h-5 [&::-webkit-slider-thumb]:w-5 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-white [&::-webkit-slider-thumb]:shadow-lg dark:[&::-webkit-slider-thumb]:border-gray-900\"\n />\n <style>{`input[type=\"range\"]::-webkit-slider-thumb { background: ${isPrecise ? '#3b82f6' : isBalanced ? '#8b5cf6' : '#ec4899'}; box-shadow: 0 0 8px ${isPrecise ? 'rgba(59,130,246,0.5)' : isBalanced ? 'rgba(139,92,246,0.5)' : 'rgba(236,72,153,0.5)'}; }`}</style>\n </div>\n <div className=\"mt-1 flex items-center justify-between\">\n <span className={`text-[10px] font-medium transition-colors ${isPrecise ? 'text-blue-500' : 'text-gray-400 dark:text-gray-500'}`}>{t('agentDrawer.precise')}</span>\n <span className={`text-[10px] font-medium transition-colors ${isBalanced ? 'text-purple-500' : 'text-gray-400 dark:text-gray-500'}`}>{t('agentDrawer.balanced')}</span>\n <span className={`text-[10px] font-medium transition-colors ${isCreative ? 'text-pink-500' : 'text-gray-400 dark:text-gray-500'}`}>{t('agentDrawer.creative')}</span>\n </div>\n </div>\n\n {/* System prompt */}\n <div>\n <div className=\"mb-1 flex items-center justify-between\">\n <label className=\"text-xs font-medium text-gray-500 dark:text-gray-400\">{t('agentDrawer.systemPrompt')}</label>\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">{promptText.length} chars</span>\n </div>\n <textarea\n value={promptText}\n onChange={handlePromptChange}\n rows={12}\n className=\"w-full resize-y rounded-lg border border-gray-200/50 bg-gray-50/50 px-3 py-2.5 font-mono text-xs leading-relaxed text-gray-700 outline-none transition-colors placeholder:text-gray-400 focus:border-indigo-300/50 focus:ring-1 focus:ring-indigo-300/30 dark:border-white/10 dark:bg-white/5 dark:text-gray-300 dark:placeholder:text-gray-500 dark:focus:border-indigo-500/30 dark:focus:ring-indigo-500/20\"\n placeholder={t('agentDrawer.systemPromptPlaceholder')}\n />\n </div>\n\n {/* Output schema — visual builder for the JSON-Schema subset the\n engine validates against (#71/#72). Empty by default; opens\n to a row-per-field form when the author hits \"+ Add output\n schema\". */}\n <div>\n <label className=\"mb-1 block text-xs font-medium text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.outputSchema', { _: 'Output schema (optional)' } as never)}\n </label>\n <p className=\"mb-2 text-[11px] text-gray-400 dark:text-gray-500\">\n {t('agentDrawer.outputSchemaHint', {\n _: 'Define the structured JSON the model must return. The engine parses + validates and exposes it under `output.parsed`. Invalid output fails the node.',\n } as never)}\n </p>\n <OutputSchemaBuilder\n value={outputSchema}\n onChange={(next) => { setOutputSchema(next); markDirty() }}\n />\n </div>\n </div>\n )\n}\n\nfunction ResultsTab({ agentId, t }: { agentId: string; t: ReturnType<typeof useTranslations> }) {\n const nodeResults = useWorkflowStore((state) => state.nodeResults)\n\n const agentResult = useMemo(() => {\n return nodeResults[agentId] ?? null\n }, [nodeResults, agentId])\n\n if (!agentResult) {\n return (\n <div className=\"flex flex-col items-center justify-center px-4 py-12 text-center\">\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">{t('agentDrawer.noResults')}</p>\n </div>\n )\n }\n\n const outputs = isRecord(agentResult.data) ? agentResult.data : null\n\n return (\n <div className=\"space-y-4 p-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-medium text-gray-500 dark:text-gray-400\">{t('agentDrawer.status')}</span>\n <StatusBadge\n status={agentResult.status}\n size=\"sm\"\n statusConfig={{\n pending: { label: 'pending', tone: 'neutral' },\n running: { label: 'running', tone: 'info' },\n success: { label: 'success', tone: 'success' },\n error: { label: 'error', tone: 'error' },\n }}\n />\n </div>\n {agentResult.durationMs != null && (\n <span className=\"text-xs text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.duration')}: {formatDuration(agentResult.durationMs)}\n </span>\n )}\n </div>\n\n {agentResult.error && (\n <div className=\"rounded-xl border border-red-200 bg-red-50 p-3 dark:border-red-900/30 dark:bg-red-900/10\">\n <p className=\"text-xs font-medium text-red-800 dark:text-red-300\">{agentResult.error}</p>\n </div>\n )}\n\n {outputs && Object.keys(outputs).length > 0 && (\n <div className=\"space-y-3\">\n <h4 className=\"text-xs font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.outputVariables')}\n </h4>\n {Object.entries(outputs).map(([key, value]) => (\n <OutputCard key={key} label={key} value={value} />\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/* ─── CDN logos for model providers ─── */\n\nconst SI = (slug: string, color: string) => `https://cdn.simpleicons.org/${slug}/${color}`\n\nconst PROVIDER_LOGOS: Record<string, string> = {\n anthropic: SI('anthropic', 'D4A27F'),\n amazon: 'https://www.svgrepo.com/show/448266/aws.svg',\n google: SI('googlegemini', '8E75B2'),\n openai: 'https://www.svgrepo.com/show/306500/openai.svg',\n meta: SI('meta', '0668E1'),\n aws_bedrock: 'https://www.svgrepo.com/show/448266/aws.svg',\n openai_api: 'https://www.svgrepo.com/show/306500/openai.svg',\n google_vertex: SI('googlegemini', '8E75B2'),\n azure_openai: SI('microsoftazure', '0078D4'),\n anthropic_api: SI('anthropic', 'D4A27F'),\n}\n\n/* ─── Models Tab — select model provider + model for this agent ─── */\n\nfunction ModelsTab({ modelProviders, selectedProviderId, onSelectProvider, models, selectedModelId, onSelectModel, agentFramework, t }: {\n modelProviders: import('../../components/panels/node-palette').ModelProvider[]\n selectedProviderId: string\n onSelectProvider: (id: string) => void\n models: AgentModel[]\n selectedModelId: string\n onSelectModel: (modelId: string) => void\n agentFramework: string\n t: ReturnType<typeof useTranslations>\n}) {\n if (modelProviders.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center px-4 py-12 text-center\">\n <KeyIcon className=\"mb-2 h-8 w-8 text-gray-400 dark:text-gray-500\" />\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">{t('agentDrawer.noProvidersAvailable')}</p>\n <p className=\"mt-1 text-xs text-gray-400 dark:text-gray-500\">{t('agentDrawer.dragProviderHint')}</p>\n </div>\n )\n }\n\n // Build model list attributed to providers\n // If same model available from multiple providers, show disambiguation\n const modelsByProvider = modelProviders.map((provider) => ({\n provider,\n models: models.filter((m) => {\n // Model is available from this provider if the provider type matches the model's provider prefix\n const modelProvider = m.id.split('.')[0]\n return provider.provider === modelProvider || provider.provider === 'amazon' && modelProvider === 'anthropic' /* Bedrock serves Claude */\n || provider.provider === 'amazon' && modelProvider === 'amazon'\n || provider.provider === 'amazon' && modelProvider === 'meta'\n }),\n }))\n\n return (\n <div className=\"space-y-4 p-4\">\n {/* Provider selector */}\n <div>\n <label className=\"mb-2 block text-xs font-medium text-gray-500 dark:text-gray-400\">{t('agentDrawer.selectProvider')}</label>\n <div className=\"space-y-1.5\">\n {modelProviders.map((provider) => {\n const isSelected = selectedProviderId === provider.id\n const logo = PROVIDER_LOGOS[provider.provider]\n return (\n <button\n key={provider.id}\n type=\"button\"\n onClick={() => onSelectProvider(provider.id)}\n className={`flex w-full items-center gap-3 rounded-xl border px-3 py-2.5 text-left transition-all ${\n isSelected\n ? 'border-indigo-500/30 bg-indigo-50/50 ring-1 ring-indigo-500/20 dark:border-indigo-400/20 dark:bg-indigo-500/5'\n : 'border-gray-200/50 bg-gray-50/30 hover:border-gray-300 dark:border-white/10 dark:bg-white/[0.02] dark:hover:border-white/20'\n }`}\n >\n {logo ? (\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-white/10 p-1\">\n <img src={logo} alt=\"\" className=\"h-5 w-5 object-contain\" loading=\"lazy\" />\n </div>\n ) : (\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-gradient-to-br from-slate-500 to-gray-600\">\n <KeyIcon className=\"h-4 w-4 text-white\" />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <p className={`text-xs font-medium ${isSelected ? 'text-gray-900 dark:text-white' : 'text-gray-600 dark:text-gray-400'}`}>\n {provider.name}\n </p>\n <div className=\"flex items-center gap-1.5 text-[10px] text-gray-400 dark:text-gray-500\">\n <span>{provider.modelCount} models</span>\n {provider.configured && <span className=\"h-1.5 w-1.5 rounded-full bg-green-500\" />}\n </div>\n </div>\n <div className={`flex h-4 w-4 shrink-0 items-center justify-center rounded-full transition-all ${\n isSelected ? 'bg-indigo-500 text-white' : 'border border-gray-300 dark:border-gray-600'\n }`}>\n {isSelected && <CheckIcon className=\"h-2.5 w-2.5\" />}\n </div>\n </button>\n )\n })}\n </div>\n </div>\n\n {/* Models from selected provider — filtered by framework compatibility */}\n {selectedProviderId && (() => {\n const providerModels = modelsByProvider.find((p) => p.provider.id === selectedProviderId)\n if (!providerModels || providerModels.models.length === 0) return (\n <p className=\"text-xs text-gray-400 dark:text-gray-500\">{t('agentDrawer.noModelsForProvider')}</p>\n )\n\n const compatibleModels = providerModels.models.filter((m) =>\n isModelCompatibleWithFramework(m.id, agentFramework as AgentFramework)\n )\n const incompatibleModels = providerModels.models.filter((m) =>\n !isModelCompatibleWithFramework(m.id, agentFramework as AgentFramework)\n )\n\n return (\n <div>\n <label className=\"mb-2 block text-xs font-medium text-gray-500 dark:text-gray-400\">{t('agentDrawer.selectModel')}</label>\n <div className=\"space-y-1\">\n {compatibleModels.map((model) => {\n const isSelected = selectedModelId === model.id\n const { IconComponent, color, providerLabel } = getModelIcon(model.id)\n return (\n <button\n key={model.id}\n type=\"button\"\n onClick={() => onSelectModel(model.id)}\n className={`flex w-full items-center gap-2.5 rounded-lg border px-3 py-2 text-left transition-all ${\n isSelected\n ? 'border-indigo-500/50 bg-indigo-50/50 ring-1 ring-indigo-500/30 dark:border-indigo-400/40 dark:bg-indigo-500/10'\n : 'border-gray-200/50 bg-gray-50/50 hover:border-gray-300 dark:border-white/10 dark:bg-white/5 dark:hover:border-white/20'\n }`}\n >\n <IconComponent className={`h-4 w-4 flex-shrink-0 ${isSelected ? color : 'text-gray-400 dark:text-gray-500'}`} />\n <div className=\"min-w-0 flex-1\">\n <p className={`text-xs font-semibold ${isSelected ? 'text-gray-900 dark:text-white' : 'text-gray-600 dark:text-gray-300'}`}>\n {model.name}\n </p>\n <p className=\"text-[10px] text-gray-400 dark:text-gray-500\">{providerLabel}</p>\n </div>\n {isSelected && <CheckIcon className=\"h-3.5 w-3.5 shrink-0 text-indigo-500\" />}\n </button>\n )\n })}\n {incompatibleModels.length > 0 && (\n <>\n <div className=\"mt-2 mb-1 text-[9px] font-medium text-gray-400 dark:text-gray-500\">\n {t('agentDrawer.incompatibleWithFramework')}\n </div>\n {incompatibleModels.map((model) => (\n <div key={model.id} className=\"flex items-center gap-2.5 rounded-lg border border-gray-200/30 px-3 py-2 opacity-40 dark:border-white/5\">\n <CpuChipIcon className=\"h-4 w-4 text-gray-400\" />\n <p className=\"text-xs text-gray-500\">{model.name}</p>\n </div>\n ))}\n </>\n )}\n </div>\n </div>\n )\n })()}\n </div>\n )\n}\n\n/* ─── Tools Tab — toggle agent tools for this agent ─── */\n\nfunction ToolsTab({ agentTools, enabledToolIds, onToggle, agentFramework, t }: {\n agentTools: AgentTool[]\n enabledToolIds: Set<string>\n onToggle: (toolId: string) => void\n agentFramework: string\n t: ReturnType<typeof useTranslations>\n}) {\n if (agentTools.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center px-4 py-12 text-center\">\n <CommandLineIcon className=\"mb-2 h-8 w-8 text-gray-400 dark:text-gray-500\" />\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">{t('agentDrawer.noToolsAvailable')}</p>\n </div>\n )\n }\n\n // Sort: compatible tools first, then incompatible\n const sortedTools = [...agentTools].sort((a, b) => {\n const aCompat = !a.compatibleFrameworks || a.compatibleFrameworks.length === 0 || a.compatibleFrameworks.includes(agentFramework)\n const bCompat = !b.compatibleFrameworks || b.compatibleFrameworks.length === 0 || b.compatibleFrameworks.includes(agentFramework)\n if (aCompat && !bCompat) return -1\n if (!aCompat && bCompat) return 1\n return 0\n })\n\n return (\n <div className=\"space-y-2 p-4\">\n <p className=\"mb-3 text-xs text-gray-500 dark:text-gray-400\">{t('agentDrawer.toolsDescription')}</p>\n {sortedTools.map((tool) => {\n const isEnabled = enabledToolIds.has(tool.agentToolId)\n const isCompatible = !tool.compatibleFrameworks || tool.compatibleFrameworks.length === 0 || tool.compatibleFrameworks.includes(agentFramework)\n return (\n <button\n key={tool.agentToolId}\n type=\"button\"\n onClick={() => onToggle(tool.agentToolId)}\n className={`flex w-full items-center gap-3 rounded-xl border px-4 py-3 text-left transition-all ${\n !isCompatible\n ? 'border-gray-200/30 opacity-40 dark:border-white/5'\n : isEnabled\n ? 'border-amber-500/30 bg-amber-50/50 dark:border-amber-400/20 dark:bg-amber-500/5'\n : 'border-gray-200/50 bg-gray-50/30 hover:border-gray-300 dark:border-white/10 dark:bg-white/[0.02] dark:hover:border-white/20'\n }`}\n disabled={!isCompatible}\n >\n <div className={`flex h-8 w-8 shrink-0 items-center justify-center rounded-lg ${\n isEnabled ? 'bg-gradient-to-br from-amber-400 to-orange-500' : 'bg-gray-200 dark:bg-gray-700'\n }`}>\n <CommandLineIcon className={`h-4 w-4 ${isEnabled ? 'text-white' : 'text-gray-500 dark:text-gray-400'}`} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1.5\">\n <p className={`text-sm font-medium ${isEnabled ? 'text-gray-900 dark:text-white' : 'text-gray-600 dark:text-gray-400'}`}>\n {tool.name}\n </p>\n {!isCompatible && (\n <span className=\"rounded-full bg-gray-100 px-1.5 py-0.5 text-[8px] font-medium text-gray-500 dark:bg-white/10 dark:text-gray-400\">\n incompatible\n </span>\n )}\n </div>\n {tool.description && (\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">{tool.description}</p>\n )}\n {/* SDK compatibility pills */}\n {tool.compatibleFrameworks && tool.compatibleFrameworks.length > 0 && (\n <div className=\"mt-1 flex flex-wrap gap-0.5\">\n {tool.compatibleFrameworks.map((framework) => {\n const meta = getFrameworkMeta(framework)\n const isCurrentFw = framework === agentFramework\n return (\n <span key={framework} className={`inline-flex items-center gap-0.5 rounded px-1.5 py-0.5 text-[8px] font-medium ${isCurrentFw ? meta.badgeColor : 'bg-gray-100 text-gray-500 dark:bg-white/5 dark:text-gray-400'}`}>\n <meta.IconComponent className=\"h-2.5 w-2.5\" />\n {meta.label}\n </span>\n )\n })}\n </div>\n )}\n </div>\n <div className={`flex h-5 w-5 shrink-0 items-center justify-center rounded-full transition-all ${\n isEnabled\n ? 'bg-amber-500 text-white'\n : 'border border-gray-300 dark:border-gray-600'\n }`}>\n {isEnabled && <CheckIcon className=\"h-3 w-3\" />}\n </div>\n <div\n className=\"shrink-0\"\n onClick={(event) => {\n event.stopPropagation()\n }}\n >\n <ToggleSwitch\n checked={isEnabled}\n onChange={() => onToggle(tool.agentToolId)}\n disabled={!isCompatible}\n size=\"sm\"\n color=\"indigo\"\n label={`${tool.name} enabled`}\n />\n </div>\n </button>\n )\n })}\n </div>\n )\n}\n\n/**\n * AdvancedTab — the backend entity `astrlabe.agents` has a dozen columns\n * the original modal never surfaced. This tab exposes the remainder\n * (displayName, description, maxOutputTokens, topP, topK, tags, status)\n * so admins can edit them without dropping to SQL.\n */\n\n/* Engine tab — como o agente roda. ELO slider é a decisão primária\n * (auto-seleciona modelo na família + ajusta temperature). O modelo\n * derivado aparece como **consequência visível**, não como input.\n * `<details>` \"Avançado\" expõe framework chips + manual model\n * override + tokens/top_p/top_k. Provider credentials viram cards\n * read-only com link \"Gerenciar credenciais →\" (settings global). */\nfunction EngineTab({\n agent, models, t,\n selectedModelId, setSelectedModelId,\n selectedFramework, setSelectedFramework,\n temperature, setTemperature,\n elo, setElo,\n maxOutputTokens, setMaxOutputTokens,\n topP, setTopP,\n topK, setTopK,\n modelProviders,\n selectedProviderId,\n onSelectProvider,\n markDirty,\n}: {\n agent: AgentWithPrompts\n models: AgentModel[]\n t: ReturnType<typeof useTranslations>\n selectedModelId: string; setSelectedModelId: (id: string) => void\n selectedFramework: AgentFramework; setSelectedFramework: (fw: AgentFramework) => void\n temperature: number; setTemperature: (v: number) => void\n elo: number; setElo: (v: number) => void\n maxOutputTokens: number; setMaxOutputTokens: (v: number) => void\n topP: number; setTopP: (v: number) => void\n topK: number; setTopK: (v: number) => void\n modelProviders: import('../../components/panels/node-palette').ModelProvider[]\n selectedProviderId: string\n onSelectProvider: (id: string) => void\n markDirty: () => void\n}) {\n void agent\n const modelObj = models.find((m) => m.id === selectedModelId)\n const modelName = modelObj?.name ?? selectedModelId ?? '—'\n const family = getModelFamily(selectedModelId)\n // All providers that can serve THIS model family. The user picks\n // one explicitly (or we pick the first configured one as default).\n const compatibleProviders = findCompatibleProviders(selectedModelId, modelProviders)\n const configuredCompatible = compatibleProviders.filter((p) => p.configured)\n const effectiveProvider =\n compatibleProviders.find((p) => p.id === selectedProviderId)\n ?? configuredCompatible[0]\n ?? compatibleProviders[0]\n const frameworkMeta = getFrameworkMeta(selectedFramework)\n const inputCard = 'liquid-surface w-full rounded-lg px-3 py-1.5 text-sm text-gray-800 outline-none transition-colors focus:ring-1 focus:ring-indigo-300/40 dark:text-gray-200 dark:focus:ring-indigo-500/20'\n\n return (\n <div className=\"p-5\">\n {/* Unified ELO → Model card. The slider, the derived model,\n and the Override (Avançado) section all live inside ONE\n rounded surface with a vertical accent line on the left\n that ties the three sections together visually. This makes\n the cause→effect→override flow obvious. */}\n <div className=\"overflow-hidden rounded-2xl border border-indigo-500/20 bg-gradient-to-b from-indigo-500/[0.04] via-violet-500/[0.03] to-purple-500/[0.04] dark:border-indigo-400/20 dark:from-indigo-500/[0.10] dark:via-violet-500/[0.06] dark:to-purple-500/[0.08]\">\n\n {/* 1) ELO slider — entrada canônica */}\n <div className=\"px-4 pb-3 pt-4\">\n <AgentCapabilityCard\n elo={elo} setElo={setElo}\n models={models}\n selectedModelId={selectedModelId} setSelectedModelId={setSelectedModelId}\n temperature={temperature} setTemperature={setTemperature}\n onChanged={markDirty}\n t={t}\n />\n </div>\n\n {/* \"derives\" connector — small chevron between ELO and Model */}\n <div className=\"flex items-center gap-2 px-4 text-[9px] font-semibold uppercase tracking-wider text-indigo-500/70 dark:text-indigo-400/70\">\n <div className=\"h-px flex-1 bg-gradient-to-r from-transparent via-indigo-500/30 to-transparent\" />\n <span>↓ {t('agentDrawer.derives', { _: 'deriva' } as never)}</span>\n <div className=\"h-px flex-1 bg-gradient-to-r from-transparent via-indigo-500/30 to-transparent\" />\n </div>\n\n {/* 2) Modelo selecionado — consequência da ELO + provider chip */}\n <div className=\"px-4 py-3\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-start gap-2\">\n <CpuChipIcon className=\"mt-0.5 h-5 w-5 text-indigo-500 dark:text-indigo-400\" />\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-gray-900 dark:text-white\">{modelName}</p>\n {compatibleProviders.length === 0 ? (\n <p className=\"text-[10px] text-amber-600 dark:text-amber-400\">\n {t('agentDrawer.noProviderForFamily', { _: 'Nenhum provedor configurado serve a família ' + family } as never)}\n </p>\n ) : configuredCompatible.length > 1 ? (\n <div className=\"mt-1 flex items-center gap-1.5\">\n <span className=\"text-[10px] text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.servedVia', { _: 'via' } as never)}\n </span>\n <select\n value={effectiveProvider?.id ?? ''}\n onChange={(event) => { onSelectProvider(event.target.value); markDirty() }}\n className=\"liquid-surface rounded-md px-2 py-0.5 text-[10px] font-semibold text-gray-900 outline-none focus:ring-1 focus:ring-indigo-300/40 dark:text-white\"\n >\n {configuredCompatible.map((p) => (\n <option key={p.id} value={p.id}>{p.name}</option>\n ))}\n </select>\n {effectiveProvider && (\n <span className={`inline-flex items-center gap-1 rounded-full px-1.5 py-0.5 text-[9px] font-semibold ${effectiveProvider.configured ? 'bg-emerald-500/10 text-emerald-600 dark:text-emerald-400' : 'bg-amber-500/10 text-amber-600 dark:text-amber-400'}`}>\n <span className={`h-1 w-1 rounded-full ${effectiveProvider.configured ? 'bg-emerald-500' : 'bg-amber-500'}`} />\n {effectiveProvider.configured ? t('agentDrawer.configured', { _: 'connected' } as never) : t('agentDrawer.setup', { _: 'setup' } as never)}\n </span>\n )}\n </div>\n ) : (\n <p className=\"text-[10px] text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.servedVia', { _: 'via' } as never)} {effectiveProvider?.name ?? family}\n {effectiveProvider && (\n <span className={`ml-2 inline-flex items-center gap-1 rounded-full px-1.5 py-0.5 text-[9px] font-semibold ${effectiveProvider.configured ? 'bg-emerald-500/10 text-emerald-600 dark:text-emerald-400' : 'bg-amber-500/10 text-amber-600 dark:text-amber-400'}`}>\n <span className={`h-1 w-1 rounded-full ${effectiveProvider.configured ? 'bg-emerald-500' : 'bg-amber-500'}`} />\n {effectiveProvider.configured ? t('agentDrawer.configured', { _: 'connected' } as never) : t('agentDrawer.setup', { _: 'setup' } as never)}\n </span>\n )}\n </p>\n )}\n </div>\n </div>\n <span className={`inline-flex shrink-0 items-center gap-1.5 rounded-full px-3 py-1 text-[10px] font-semibold ${frameworkMeta.badgeColor}`}>\n <frameworkMeta.IconComponent className=\"h-3.5 w-3.5\" />\n {frameworkMeta.label}\n </span>\n </div>\n </div>\n\n {/* 3) Override (Avançado) — visual subordinado ao mesmo card,\n collapsed por default. Quando aberto, mostra que está\n OVERRIDING a derivação acima. */}\n <details className=\"group border-t border-indigo-500/15 bg-white/30 px-4 py-2.5 dark:border-indigo-400/15 dark:bg-white/[0.02]\">\n <summary className=\"flex cursor-pointer items-center gap-2 text-[10px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n <Cog6ToothIcon className=\"h-3 w-3\" />\n <span>{t('agentDrawer.overrideDerivation', { _: 'Override · ajustes avançados' } as never)}</span>\n <span className=\"ml-auto font-normal text-gray-400 group-open:hidden\">▾</span>\n <span className=\"ml-auto hidden font-normal text-gray-400 group-open:inline\">▴</span>\n </summary>\n <p className=\"mt-1 text-[10px] italic text-gray-400 dark:text-gray-500\">\n {t('agentDrawer.overrideHint', { _: 'Mude framework, modelo manual ou tokens só se a derivação por ELO não atender.' } as never)}\n </p>\n <div className=\"mt-3 space-y-4\">\n {/* Framework + manual model override (reusa ConfigTab) */}\n <ConfigTab\n models={models}\n t={t}\n selectedModelId={selectedModelId} setSelectedModelId={setSelectedModelId}\n selectedFramework={selectedFramework} setSelectedFramework={setSelectedFramework}\n markDirty={markDirty}\n connectedProviderTypes={modelProviders.map((p) => p.provider)}\n />\n\n {/* Generation params */}\n <div>\n <p className=\"mb-2 text-[10px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.generationParams', { _: 'Parâmetros de geração' } as never)}\n </p>\n <div className=\"grid grid-cols-3 gap-2\">\n {(\n [\n { key: 'max', labelKey: 'agentDrawer.maxOutputTokens', label: 'Max output', value: maxOutputTokens, setter: setMaxOutputTokens, step: 1, min: 1, max: 32768 },\n { key: 'topP', labelKey: 'agentDrawer.topP', label: 'Top-p', value: topP, setter: setTopP, step: 0.05, min: 0, max: 1 },\n { key: 'topK', labelKey: 'agentDrawer.topK', label: 'Top-k', value: topK, setter: setTopK, step: 1, min: 0, max: 500 },\n ] as const\n ).map((field) => (\n <div key={field.key} className={`${inputCard} flex flex-col items-center !py-2`}>\n <span className=\"text-[8px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {t(field.labelKey, { _: field.label } as never)}\n </span>\n <input\n type=\"number\"\n step={field.step} min={field.min} max={field.max}\n value={field.value}\n onChange={(event) => { field.setter(Number(event.target.value) || 0); markDirty() }}\n className=\"w-full bg-transparent text-center text-sm font-semibold tabular-nums text-gray-900 outline-none dark:text-white\"\n />\n </div>\n ))}\n </div>\n </div>\n\n {/* Provider credentials — read-only, link pra Settings */}\n {modelProviders.length > 0 && (\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <p className=\"text-[10px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.providerCredentials', { _: 'Credenciais do provedor' } as never)}\n </p>\n <a\n href=\"/settings/integrations\"\n className=\"text-[10px] font-medium text-indigo-600 hover:text-indigo-700 dark:text-indigo-400 dark:hover:text-indigo-300\"\n >\n {t('agentDrawer.manageCredentials', { _: 'Gerenciar →' } as never)}\n </a>\n </div>\n <div className=\"space-y-1\">\n {modelProviders.map((provider) => (\n <div\n key={provider.id}\n className=\"flex items-center gap-2 rounded-lg border border-gray-200/50 bg-white/40 px-3 py-1.5 dark:border-white/10 dark:bg-white/[0.03]\"\n >\n <KeyIcon className=\"h-3 w-3 shrink-0 text-gray-500 dark:text-gray-400\" />\n <span className=\"text-[11px] font-semibold text-gray-900 dark:text-white\">{provider.name}</span>\n <span className={`shrink-0 rounded-full px-1.5 py-0.5 text-[8px] font-semibold uppercase ${provider.configured ? 'bg-emerald-500/10 text-emerald-600 dark:text-emerald-400' : 'bg-amber-500/10 text-amber-600 dark:text-amber-400'}`}>\n {provider.configured ? t('agentDrawer.configured', { _: 'connected' } as never) : t('agentDrawer.setup', { _: 'setup' } as never)}\n </span>\n {provider.apiKeyMasked && (\n <span className=\"ml-auto truncate font-mono text-[9px] text-gray-400 dark:text-gray-500\" title={provider.credentialRef}>\n {provider.apiKeyMasked}\n </span>\n )}\n </div>\n ))}\n </div>\n <p className=\"mt-2 text-[10px] text-gray-400 dark:text-gray-500\">\n {selectedProviderId ? '' : t('agentDrawer.providerHint', { _: 'Credenciais são configuradas no nível da conta. Aqui você só confere o que está conectado.' } as never)}\n </p>\n </div>\n )}\n </div>\n </details>\n </div>\n </div>\n )\n}\n\nfunction AdvancedTab({\n displayName, setDisplayName,\n description, setDescription,\n maxOutputTokens, setMaxOutputTokens,\n topP, setTopP,\n topK, setTopK,\n tags, setTags,\n status, setStatus,\n avatarUrl, setAvatarUrl,\n markDirty,\n t,\n}: {\n displayName: string\n setDisplayName: (v: string) => void\n description: string\n setDescription: (v: string) => void\n maxOutputTokens: number\n setMaxOutputTokens: (v: number) => void\n topP: number\n setTopP: (v: number) => void\n topK: number\n setTopK: (v: number) => void\n tags: string\n setTags: (v: string) => void\n status: string\n setStatus: (v: string) => void\n avatarUrl: string\n setAvatarUrl: (v: string) => void\n markDirty: () => void\n t: ReturnType<typeof useTranslations>\n}) {\n const wrap = 'w-full rounded-lg border border-gray-200/50 bg-gray-50/50 px-3 py-2 text-sm text-gray-800 outline-none transition-colors focus:border-indigo-300/50 focus:ring-1 focus:ring-indigo-300/30 dark:border-white/10 dark:bg-white/5 dark:text-gray-200'\n const labelCls = 'mb-1 block text-xs font-medium text-gray-500 dark:text-gray-400'\n const touch = () => markDirty()\n\n return (\n <div className=\"space-y-4 p-4\">\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <label>\n <span className={labelCls}>{t('agentDrawer.displayName', { _: 'Display name' } as never)}</span>\n <input className={wrap} value={displayName} onChange={(e) => { setDisplayName(e.target.value); touch() }} />\n </label>\n <div>\n <span className={labelCls}>{t('agentDrawer.status', { _: 'Status' } as never)}</span>\n <div className={`${wrap} flex items-center justify-between !py-2`}>\n <span className=\"text-xs font-medium text-gray-600 dark:text-gray-300\">\n {status === 'active'\n ? t('agentDrawer.statusActive', { _: 'Active' } as never)\n : t('agentDrawer.statusInactive', { _: 'Inactive' } as never)}\n </span>\n <ToggleSwitch\n size=\"sm\"\n color=\"green\"\n checked={status === 'active'}\n onChange={(checked) => { setStatus(checked ? 'active' : 'draft'); touch() }}\n label={t('agentDrawer.status', { _: 'Status' } as never)}\n />\n </div>\n </div>\n </div>\n\n <label className=\"block\">\n <span className={labelCls}>{t('agentDrawer.description', { _: 'Description' } as never)}</span>\n <textarea\n className={wrap}\n rows={3}\n value={description}\n onChange={(e) => { setDescription(e.target.value); touch() }}\n placeholder={t('agentDrawer.descriptionPlaceholder', { _: 'What this agent does, which tasks it\\'s good at' } as never)}\n />\n </label>\n\n <label className=\"block\">\n <span className={labelCls}>{t('agentDrawer.avatarUrl', { _: 'Avatar URL' } as never)}</span>\n <input className={wrap} value={avatarUrl} onChange={(e) => { setAvatarUrl(e.target.value); touch() }} placeholder=\"https://…\" />\n </label>\n\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <label>\n <span className={labelCls}>{t('agentDrawer.maxOutputTokens', { _: 'Max output tokens' } as never)}</span>\n <input\n type=\"number\"\n min={1}\n max={32768}\n className={wrap}\n value={maxOutputTokens}\n onChange={(e) => { setMaxOutputTokens(Number(e.target.value) || 0); touch() }}\n />\n </label>\n <label>\n <span className={labelCls}>{t('agentDrawer.topP', { _: 'Top-p' } as never)}</span>\n <input\n type=\"number\" step={0.05} min={0} max={1}\n className={wrap}\n value={topP}\n onChange={(e) => { setTopP(Number(e.target.value) || 0); touch() }}\n />\n </label>\n <label>\n <span className={labelCls}>{t('agentDrawer.topK', { _: 'Top-k' } as never)}</span>\n <input\n type=\"number\" min={0} max={500}\n className={wrap}\n value={topK}\n onChange={(e) => { setTopK(Number(e.target.value) || 0); touch() }}\n />\n </label>\n </div>\n\n <label className=\"block\">\n <span className={labelCls}>{t('agentDrawer.tags', { _: 'Tags (comma-separated)' } as never)}</span>\n <input\n className={wrap}\n value={tags}\n onChange={(e) => { setTags(e.target.value); touch() }}\n placeholder={t('agentDrawer.tagsPlaceholder', { _: 'pricing, research, internal' } as never)}\n />\n </label>\n </div>\n )\n}\n\nexport function AgentModal({ onSaved, onPersist }: AgentModalProps) {\n const t = useTranslations('agents.workflow')\n\n // Read open state + data from modal store\n const activeModal = useModalStore((s) => s.activeModal)\n const agentData = useModalStore((s) => s.agentData)\n const closeModal = useModalStore((s) => s.closeModal)\n\n const open = activeModal === 'agent'\n const agent = agentData?.agent ?? null\n const models = agentData?.models ?? []\n const availableAgentTools = agentData?.agentTools ?? []\n const isCreateMode = agentData?.isCreateMode ?? false\n\n // Local editable state — synced when agent changes\n const [activeTab, setActiveTab] = useState<TabId>('config')\n const [selectedModelId, setSelectedModelId] = useState('')\n const [selectedFramework, setSelectedFramework] = useState<string>('custom')\n const [temperature, setTemperature] = useState(0.7)\n const [elo, setElo] = useState(1000)\n const [saved, setSaved] = useState(true)\n const [enabledToolIds, setEnabledToolIds] = useState<Set<string>>(new Set())\n const [selectedProviderId, setSelectedProviderId] = useState('')\n // System prompt is authoritative on the parent now so handleMarkSaved\n // can emit it via onPersist. Previously it was trapped inside PromptTab.\n const [systemPrompt, setSystemPrompt] = useState('')\n // Optional structured-output schema. `undefined` keeps the agent in\n // \"free text\" mode (no parsing); setting it triggers the engine's\n // JSON Schema validator on every run.\n const [outputSchema, setOutputSchema] = useState<AgentOutputSchema | undefined>(undefined)\n // Advanced tab state — all of these are brand-new surfaces, the\n // entity had them on day one but the modal was silent on them.\n const [displayName, setDisplayName] = useState('')\n const [description, setDescription] = useState('')\n const [avatarUrl, setAvatarUrlState] = useState('')\n const [maxOutputTokens, setMaxOutputTokens] = useState(1024)\n const [topP, setTopP] = useState(0.95)\n const [topK, setTopK] = useState(40)\n const [tagsText, setTagsText] = useState('')\n const [status, setStatus] = useState<string>('active')\n const [persisting, setPersisting] = useState(false)\n const availableModelProviders = agentData?.modelProviders ?? []\n\n const agentId = agent?.agentId ?? agent?.id ?? ''\n useEffect(() => {\n if (!agent) return\n setSelectedModelId(agent.modelId ?? models[0]?.id ?? '')\n setSelectedFramework(String((agent as Record<string, unknown>).framework ?? 'custom'))\n setTemperature(agent.temperature ?? 0.7)\n setElo(Number((agent as Record<string, unknown>).elo ?? 1000))\n setSaved(!isCreateMode)\n setActiveTab('config')\n // Sync enabled tools — read from agent's agentTools array if present\n const agentToolIds = (agent as Record<string, unknown>).agentToolIds as string[] | undefined\n setEnabledToolIds(new Set(agentToolIds ?? availableAgentTools.filter((t) => t.enabled).map((t) => t.agentToolId)))\n setSelectedProviderId((agent as Record<string, unknown>).modelProviderId as string ?? '')\n const agentRecord = agent as Record<string, unknown>\n setSystemPrompt(\n (agentRecord.systemPrompt as string | undefined)\n ?? (agentRecord.instruction as string | undefined)\n ?? '',\n )\n // outputSchema is opt-in; clears to undefined when the agent\n // doesn't have one stored.\n setOutputSchema(\n (agentRecord.outputSchema as AgentOutputSchema | undefined) ?? undefined,\n )\n setDisplayName((agentRecord.displayName as string | undefined) ?? agent.name ?? '')\n setDescription((agentRecord.description as string | undefined) ?? '')\n setAvatarUrlState((agentRecord.avatar as string | undefined) ?? '')\n const agentMaxOut = (agentRecord.maxOutputTokens as number | undefined)\n ?? agent.maxTokens\n ?? 1024\n setMaxOutputTokens(Number(agentMaxOut) || 1024)\n setTopP(Number((agentRecord.topP as number | undefined) ?? 0.95))\n setTopK(Number((agentRecord.topK as number | undefined) ?? 40))\n const existingTags = agentRecord.tags\n setTagsText(\n Array.isArray(existingTags)\n ? (existingTags as unknown[]).filter((v): v is string => typeof v === 'string').join(', ')\n : '',\n )\n setStatus((agentRecord.status as string | undefined) ?? 'active')\n }, [agentId])\n\n const dirty = !saved\n const markDirty = useCallback(() => setSaved(false), [])\n const markSaved = useCallback(() => setSaved(true), [])\n\n const handleClose = useCallback(() => {\n closeModal()\n }, [closeModal])\n\n const handleSelectProvider = useCallback((providerId: string) => {\n setSelectedProviderId(providerId)\n markDirty()\n }, [markDirty])\n\n const handleToggleTool = useCallback((toolId: string) => {\n setEnabledToolIds((previous) => {\n const next = new Set(previous)\n if (next.has(toolId)) next.delete(toolId)\n else next.add(toolId)\n return next\n })\n markDirty()\n }, [markDirty])\n\n const handleMarkSaved = useCallback(async () => {\n if (!agent) return\n const payload: AgentPersistPayload = {\n agentId: agent.agentId,\n name: agent.name,\n displayName: displayName.trim() || undefined,\n description: description.trim() || undefined,\n avatar: avatarUrl.trim() || undefined,\n modelId: selectedModelId || undefined,\n connectionId: selectedProviderId || undefined,\n framework: selectedFramework,\n systemPrompt,\n temperature,\n maxOutputTokens,\n topP,\n topK,\n elo,\n status: status || undefined,\n enabledToolIds: Array.from(enabledToolIds),\n tags: tagsText\n .split(',')\n .map((tag) => tag.trim())\n .filter((tag) => tag.length > 0),\n // Send `outputSchema` only when the user actually configured one\n // — sending `undefined` would shadow any existing stored schema\n // through the spread later, so the parent layer should treat\n // missing key as \"leave alone\".\n ...(outputSchema ? { outputSchema } : {}),\n }\n try {\n setPersisting(true)\n if (onPersist) await onPersist(payload)\n markSaved()\n // Intentionally NOT calling `onSaved?.()` — the wrapper in\n // workflow-canvas.tsx uses that callback to *close* the modal\n // (legacy explicit-Save flow). Autosave persists silently; the\n // modal stays open until the user dismisses it.\n } catch (error) {\n // Leave `saved` as dirty so the banner shows. The parent is\n // responsible for surfacing the error message (toast).\n console.error('[AgentModal] onPersist failed', error)\n } finally {\n setPersisting(false)\n }\n }, [\n agent, displayName, description, avatarUrl, selectedModelId, selectedProviderId,\n selectedFramework, systemPrompt, temperature, maxOutputTokens, topP, topK, elo,\n status, enabledToolIds, tagsText, outputSchema, markSaved, onSaved, onPersist,\n ])\n\n // Autosave — every dirty transition kicks off a debounced persist\n // after 700ms of idle. Replaces the explicit Save button: the\n // sidebar footer only shows the live \"Saving… / Auto-saved\"\n // indicator. The 700ms window is short enough to feel snappy and\n // long enough to coalesce rapid typing.\n useEffect(() => {\n if (!dirty || persisting) return\n const handle = setTimeout(() => { void handleMarkSaved() }, 700)\n return () => clearTimeout(handle)\n }, [dirty, persisting, handleMarkSaved])\n\n if (!agent) return null\n\n // No sidebar nav — the identity card IS the \"tab\". The single\n // main pane stacks Cérebro / Motor / Ferramentas as SectionCards.\n // Resultados was removed (workspace-level concern).\n const sections: GlassModalSection[] = []\n\n // Prefer the user-edited avatar (tracked via the editable Profile\n // form below) over the stored value so the identity badge updates\n // live while typing.\n const effectiveAvatarUrl = avatarUrl || ((agent as Record<string, unknown>).avatar as string | undefined)\n\n // Editable identity card — rendered IN the sidebar header (where\n // the read-only ProfileIdentityCard used to live). Avatar + name\n // editable inline; status toggle pinned top-right; description +\n // tags below as compact inputs. Avatar URL field intentionally\n // removed — user changes the picture by uploading or pasting the\n // URL is overkill for the dev surface; we render whatever\n // `agent.avatar` is and let the underlying field be edited via\n // API/Settings if needed.\n const fieldCard = 'liquid-surface w-full rounded-lg px-2.5 py-1.5 text-xs text-gray-800 outline-none transition-colors focus:ring-1 focus:ring-indigo-300/40 dark:text-gray-200 dark:focus:ring-indigo-500/20'\n const fieldLabel = 'text-[9px] font-semibold uppercase tracking-wider text-slate-500 dark:text-slate-400'\n // Editable identity = HeroBlock in `editor mode`:\n // - round 12×12 avatar (img → iconBackground='none')\n // - inline name input (onTitleChange)\n // - role as subtitle (read-only from agent record)\n // - status pill in `rightContent`\n // - description + tags in `children` (free-form below the hero)\n // Wraps in liquid-surface card to match other sidebar surfaces.\n // Delegates avatar chrome (round shape, crystal sheen, tinted\n // glass) entirely to the canonical <Avatar> primitive. HeroBlock\n // just receives it as `icon` — no need for the legacy\n // iconShape=\"round\" / iconBackground=\"none\" escape hatches.\n const avatarInitial = (displayName || agent.name).charAt(0).toUpperCase()\n const avatarNode = (\n <Avatar\n src={effectiveAvatarUrl || undefined}\n alt={displayName || agent.name}\n initials={effectiveAvatarUrl ? undefined : avatarInitial}\n tone={effectiveAvatarUrl ? undefined : 'indigo'}\n className=\"size-12\"\n />\n )\n const statusPill = (\n <div className=\"flex items-center gap-1.5\">\n <span className={`text-[9px] font-semibold ${status === 'active' ? 'text-emerald-600 dark:text-emerald-400' : 'text-slate-500'}`}>\n {status === 'active'\n ? t('agentDrawer.statusActive', { _: 'Active' } as never)\n : t('agentDrawer.statusInactive', { _: 'Inactive' } as never)}\n </span>\n <ToggleSwitch\n size=\"sm\"\n color=\"green\"\n checked={status === 'active'}\n onChange={(checked) => { setStatus(checked ? 'active' : 'draft'); markDirty() }}\n label={t('agentDrawer.status', { _: 'Status' } as never)}\n />\n </div>\n )\n const identityCard = (\n <div className=\"liquid-surface rounded-2xl p-3 ring-1 ring-slate-200/50 dark:ring-white/10\">\n <HeroBlock\n icon={avatarNode}\n iconBackground=\"none\"\n iconSize=\"lg\"\n headingLevel=\"h2\"\n title={displayName}\n onTitleChange={(next) => { setDisplayName(next); markDirty() }}\n titlePlaceholder={agent.name}\n subtitle={agent.role}\n rightContent={statusPill}\n >\n <div className=\"flex flex-col gap-2\">\n <label className=\"flex flex-col gap-1\">\n <span className={fieldLabel}>{t('agentDrawer.description', { _: 'Description' } as never)}</span>\n <textarea\n rows={2}\n value={description}\n onChange={(event) => { setDescription(event.target.value); markDirty() }}\n placeholder={t('agentDrawer.descriptionPlaceholder', { _: 'What this agent does, which tasks it\\'s good at' } as never)}\n className={`${fieldCard} resize-none`}\n />\n </label>\n <label className=\"flex flex-col gap-1\">\n <span className={fieldLabel}>{t('agentDrawer.tags', { _: 'Tags' } as never)}</span>\n <input\n type=\"text\"\n value={tagsText}\n onChange={(event) => { setTagsText(event.target.value); markDirty() }}\n placeholder={t('agentDrawer.tagsPlaceholder', { _: 'pricing, research, internal' } as never)}\n className={fieldCard}\n />\n </label>\n </div>\n </HeroBlock>\n </div>\n )\n\n // Footer = autosave indicator only. No explicit Save button —\n // every edit debounces a background persist (see useEffect above).\n const autosaveLabel = persisting\n ? t('agentDrawer.saving', { _: 'Saving…' } as never)\n : dirty\n ? t('agentDrawer.pendingAutosave', { _: 'Saving in a moment…' } as never)\n : t('agentDrawer.autoSaved', { _: 'Auto-saved' } as never)\n const autosaveColor = persisting\n ? 'text-indigo-500 dark:text-indigo-400'\n : dirty\n ? 'text-amber-500 dark:text-amber-400'\n : 'text-emerald-500 dark:text-emerald-400'\n const sidebarFooter = (\n <div role=\"status\" aria-live=\"polite\" className=\"flex items-center gap-1.5 px-1 py-2 text-xs\">\n <span className={`relative inline-flex h-1.5 w-1.5 shrink-0 rounded-full ${persisting ? 'bg-indigo-500' : dirty ? 'bg-amber-500' : 'bg-emerald-500'}`}>\n {persisting && (\n <span\n aria-hidden=\"true\"\n className=\"absolute inset-0 motion-safe:animate-ping rounded-full bg-indigo-500/60\"\n />\n )}\n </span>\n <span className={`font-medium ${autosaveColor}`}>{autosaveLabel}</span>\n </div>\n )\n\n return (\n <GlassModal\n open={open}\n onClose={handleClose}\n title={agent.name}\n gradient=\"from-indigo-500 to-purple-600\"\n icon={<CpuChipIcon className=\"h-5 w-5 text-slate-700 dark:text-white\" />}\n label={isCreateMode ? t('agentDrawer.createAgent') : t('agentDrawer.editAgent')}\n sidebar={{\n sections,\n activeSectionId: activeTab,\n onSectionChange: (sectionId) => setActiveTab(sectionId as TabId),\n identityCard,\n footer: sidebarFooter,\n }}\n >\n {/* Single-page config — Motor / Cérebro / Ferramentas stack as\n SectionCards (from @datatechsolutions/ui). Identidade vive\n na sidebar (header + footer). Resultados moved out of the\n agent modal — execution history is workspace-scoped. */}\n <div className=\"space-y-5\">\n {/* MOTOR — runtime: ELO, model derivation, override.\n Collapsible (open by default). Glass icon (matches page\n hero vocabulary). */}\n <SectionCard\n variant=\"glass\"\n padded={false}\n collapsible\n defaultOpen\n header={{\n icon: <Cog6ToothIcon className=\"h-5 w-5 text-slate-700 dark:text-white\" />,\n title: t('agentDrawer.engineTab'),\n subtitle: t('agentDrawer.engineSubtitle', { _: 'Como o agente roda — capacidade, modelo, credenciais' } as never),\n }}\n >\n <EngineTab\n agent={agent}\n models={models}\n t={t}\n selectedModelId={selectedModelId} setSelectedModelId={setSelectedModelId}\n selectedFramework={selectedFramework as AgentFramework} setSelectedFramework={(fw) => setSelectedFramework(fw)}\n temperature={temperature} setTemperature={setTemperature}\n elo={elo} setElo={setElo}\n maxOutputTokens={maxOutputTokens} setMaxOutputTokens={setMaxOutputTokens}\n topP={topP} setTopP={setTopP}\n topK={topK} setTopK={setTopK}\n modelProviders={availableModelProviders}\n selectedProviderId={selectedProviderId}\n onSelectProvider={handleSelectProvider}\n markDirty={markDirty}\n />\n </SectionCard>\n\n {/* CÉREBRO — system prompt + temperature */}\n <SectionCard\n variant=\"glass\"\n padded={false}\n collapsible\n defaultOpen\n header={{\n icon: <SparklesIcon className=\"h-5 w-5 text-slate-700 dark:text-white\" />,\n title: t('agentDrawer.brainTab'),\n subtitle: t('agentDrawer.brainSubtitle', { _: 'Como o agente pensa — prompt + criatividade' } as never),\n }}\n >\n <PromptTab\n agent={agent}\n temperature={temperature}\n setTemperature={setTemperature}\n markDirty={markDirty}\n t={t}\n promptText={systemPrompt}\n setPromptText={setSystemPrompt}\n outputSchema={outputSchema}\n setOutputSchema={setOutputSchema}\n />\n </SectionCard>\n\n {/* FERRAMENTAS — tool toggles */}\n <SectionCard\n variant=\"glass\"\n padded={false}\n collapsible\n defaultOpen\n header={{\n icon: <WrenchScrewdriverIcon className=\"h-5 w-5 text-slate-700 dark:text-white\" />,\n title: `${t('agentDrawer.toolsTab')}${enabledToolIds.size > 0 ? ` (${enabledToolIds.size})` : ''}`,\n subtitle: t('agentDrawer.toolsSubtitle', { _: 'O que o agente pode invocar durante a execução' } as never),\n }}\n >\n <ToolsTab agentTools={availableAgentTools} enabledToolIds={enabledToolIds} onToggle={handleToggleTool} agentFramework={selectedFramework} t={t} />\n </SectionCard>\n </div>\n </GlassModal>\n )\n}\n","/**\n * Workflow Tool Modal Store (Zustand)\n * ===================================\n * State management for the workflow tool modal — tracks the\n * selected workflow tool, editable fields, and dirty state.\n */\n\nimport { create } from 'zustand'\nimport type { WorkflowTool } from '../contracts'\n\ntype SubworkflowStoreState = {\n /** The workflow tool being edited (null = modal closed) */\n tool: WorkflowTool | null\n /** Whether the modal is open */\n open: boolean\n /** Editable fields */\n name: string\n category: string\n description: string\n timeoutMs: number\n retryCount: number\n /** Whether there are unsaved changes */\n dirty: boolean\n}\n\ntype SubworkflowStoreActions = {\n /** Open the modal with a workflow tool (empty toolId = create mode) */\n openModal: (tool: WorkflowTool) => void\n /** Close the modal and reset state */\n closeModal: () => void\n /** Update a field and mark dirty */\n setName: (name: string) => void\n setCategory: (category: string) => void\n setDescription: (description: string) => void\n setTimeoutMs: (timeoutMs: number) => void\n setRetryCount: (retryCount: number) => void\n /** Mark as dirty (e.g. when graph changes) */\n markDirty: () => void\n /** Mark as saved */\n markSaved: () => void\n}\n\nexport type SubworkflowStore = SubworkflowStoreState & SubworkflowStoreActions\n\nexport const useSubworkflowStore = create<SubworkflowStore>((set) => ({\n // State\n tool: null,\n open: false,\n name: '',\n category: 'external',\n description: '',\n timeoutMs: 10000,\n retryCount: 0,\n dirty: false,\n\n // Actions\n openModal: (tool) => set({\n tool,\n open: true,\n name: tool.name ?? '',\n category: tool.category ?? 'external',\n description: String(tool.description ?? ''),\n timeoutMs: Number(tool.timeoutMs ?? 10000),\n retryCount: (tool as Record<string, unknown>).retryCount as number ?? 0,\n dirty: !tool.toolId,\n }),\n\n closeModal: () => set({\n tool: null,\n open: false,\n name: '',\n category: 'external',\n description: '',\n timeoutMs: 10000,\n retryCount: 0,\n dirty: false,\n }),\n\n setName: (name) => set({ name, dirty: true }),\n setCategory: (category) => set({ category, dirty: true }),\n setDescription: (description) => set({ description, dirty: true }),\n setTimeoutMs: (timeoutMs) => set({ timeoutMs, dirty: true }),\n setRetryCount: (retryCount) => set({ retryCount, dirty: true }),\n markDirty: () => set({ dirty: true }),\n markSaved: () => set({ dirty: false }),\n}))\n","import { useState, useMemo, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n ArrowPathRoundedSquareIcon,\n ArrowsPointingOutIcon as MaximizeIcon,\n ClockIcon,\n BoltIcon,\n ArrowsPointingInIcon,\n ArrowsPointingOutIcon,\n ChevronDownIcon,\n ChevronRightIcon,\n} from '@heroicons/react/24/outline'\nimport { GlassModal } from '@ui/components/glass-modal'\nimport { WorkflowCanvas } from '../canvas/workflow-canvas'\nimport { useSubworkflowStore } from '../../store/subworkflow-store'\nimport { useModalStore } from '../../store/modal-store'\nimport { CATEGORY_COLORS, CATEGORY_PILL_COLORS, ICON_MAP } from '../../constants'\nimport type { WorkflowGraph, WorkflowTool } from '../../contracts'\n\ntype SubworkflowModalProps = {\n /** Called when save/create is clicked — receives the merged workflow tool with updated graph */\n onSaved?: (tool: WorkflowTool) => void\n /** Called when maximize is clicked — navigate to full workflow editor */\n onMaximize?: (subworkflowId: string) => void\n}\n\nconst DEFAULT_SUBWORKFLOW_GRAPH: WorkflowGraph = {\n nodes: [\n { id: 'start', type: 'start', position: { x: 80, y: 200 }, data: { entityId: 'start', label: 'Start', config: { type: 'start', inputVariables: [] } } },\n { id: 'end', type: 'end', position: { x: 600, y: 200 }, data: { entityId: 'end', label: 'End', config: { type: 'end', outputVariables: [] } } },\n ],\n edges: [\n { id: 'e-start-end', source: 'start', target: 'end', sourceHandle: null, targetHandle: null },\n ],\n viewport: { x: 0, y: 0, zoom: 0.85 },\n}\n\n/* --- Variable chips --- */\nfunction VariableChip({ name, type }: { name: string; type: string }) {\n return (\n <span className=\"inline-flex items-center gap-1 rounded-lg border border-teal-200/50 bg-teal-50/50 px-2 py-0.5 text-[10px] dark:border-teal-400/20 dark:bg-teal-400/10\">\n <span className=\"font-semibold text-teal-700 dark:text-teal-300\">{name}</span>\n <span className=\"text-teal-500/60 dark:text-teal-400/50\">: {type}</span>\n </span>\n )\n}\n\nfunction OutputChip({ name, type }: { name: string; type: string }) {\n return (\n <span className=\"inline-flex items-center gap-1 rounded-lg border border-violet-200/50 bg-violet-50/50 px-2 py-0.5 text-[10px] dark:border-violet-400/20 dark:bg-violet-400/10\">\n <span className=\"font-semibold text-violet-700 dark:text-violet-300\">{name}</span>\n <span className=\"text-violet-500/60 dark:text-violet-400/50\">: {type}</span>\n </span>\n )\n}\n\n/* --- Collapsible config sidebar --- */\nfunction ConfigSection({ title, icon: Icon, defaultOpen = true, children }: {\n title: string\n icon: React.ComponentType<{ className?: string }>\n defaultOpen?: boolean\n children: React.ReactNode\n}) {\n const [open, setOpen] = useState(defaultOpen)\n return (\n <div className=\"border-b border-white/10\">\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n aria-expanded={open}\n className=\"flex w-full items-center gap-2 px-4 py-2.5 text-left hover:bg-white/5\"\n >\n {open ? <ChevronDownIcon className=\"h-3 w-3 text-gray-400\" /> : <ChevronRightIcon className=\"h-3 w-3 text-gray-400\" />}\n <Icon className=\"h-3 w-3 text-gray-400\" />\n <span className=\"text-[10px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">{title}</span>\n </button>\n {open && <div className=\"px-4 pb-3\">{children}</div>}\n </div>\n )\n}\n\nexport function SubworkflowModal({ onSaved, onMaximize }: SubworkflowModalProps) {\n const t = useTranslations('agents.workflow')\n\n // Read all state from Zustand store\n const tool = useSubworkflowStore((s) => s.tool)\n const open = useSubworkflowStore((s) => s.open)\n const name = useSubworkflowStore((s) => s.name)\n const category = useSubworkflowStore((s) => s.category)\n const description = useSubworkflowStore((s) => s.description)\n const timeoutMs = useSubworkflowStore((s) => s.timeoutMs)\n const retryCount = useSubworkflowStore((s) => s.retryCount)\n const dirty = useSubworkflowStore((s) => s.dirty)\n\n // Actions\n const setName = useSubworkflowStore((s) => s.setName)\n const setCategory = useSubworkflowStore((s) => s.setCategory)\n const setDescription = useSubworkflowStore((s) => s.setDescription)\n const setTimeoutMs = useSubworkflowStore((s) => s.setTimeoutMs)\n const setRetryCount = useSubworkflowStore((s) => s.setRetryCount)\n const markDirty = useSubworkflowStore((s) => s.markDirty)\n const markSaved = useSubworkflowStore((s) => s.markSaved)\n const closeModal = useSubworkflowStore((s) => s.closeModal)\n\n // Check if there's an agent modal behind us (for breadcrumb + z-index stacking)\n const agentBehind = useModalStore((s) => s.activeModal === 'agent' ? s.agentData?.agent?.name : null)\n\n const isCreateMode = !tool?.toolId\n\n const initialGraph = useMemo<WorkflowGraph>(() => {\n const config = tool?.config as Record<string, unknown> | undefined\n if (config?.type === 'workflow' && config.graph) {\n return config.graph as WorkflowGraph\n }\n return DEFAULT_SUBWORKFLOW_GRAPH\n }, [tool])\n\n const latestGraphRef = useMemo(() => ({ current: initialGraph }), [initialGraph])\n\n const handleGraphChange = useCallback((graph: WorkflowGraph) => {\n latestGraphRef.current = graph\n markDirty()\n }, [latestGraphRef, markDirty])\n\n const handleSave = useCallback(() => {\n markSaved()\n if (tool) {\n onSaved?.({\n ...tool,\n name,\n category,\n description,\n timeoutMs,\n config: { type: 'workflow', graph: latestGraphRef.current },\n })\n }\n }, [tool, onSaved, name, category, description, timeoutMs, latestGraphRef, markSaved])\n\n if (!tool) return null\n\n const categoryKey = (category ?? 'external') as keyof typeof CATEGORY_COLORS\n const gradient = tool.color ?? CATEGORY_COLORS[categoryKey] ?? CATEGORY_COLORS.external\n const categoryPill = CATEGORY_PILL_COLORS[categoryKey] ?? CATEGORY_PILL_COLORS.external\n const IconComponent = ICON_MAP[tool.icon ?? ''] ?? ArrowPathRoundedSquareIcon\n\n // Derive input/output variables from Start and End nodes in the graph\n const graph = latestGraphRef.current\n const startNode = graph.nodes.find((n) => n.type === 'start')\n const endNode = graph.nodes.find((n) => n.type === 'end')\n const startConfig = startNode?.data?.config as { inputVariables?: string[] } | undefined\n const endConfig = endNode?.data?.config as { outputVariables?: string[] } | undefined\n const inputVariables = (startConfig?.inputVariables ?? []).map((v) => ({ name: v, type: 'string' }))\n const outputVariables = (endConfig?.outputVariables ?? []).map((v) => ({ name: v, type: 'string' }))\n\n const footer = (\n <div className=\"flex items-center justify-between\">\n <div role=\"status\" aria-live=\"polite\" className=\"text-xs\">\n {dirty ? (\n <span className=\"text-amber-500 dark:text-amber-400\">{t('subworkflowDrawer.unsavedChanges')}</span>\n ) : (\n <span className=\"text-emerald-500 dark:text-emerald-400\">{t('subworkflowDrawer.saved')}</span>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={closeModal}\n className=\"rounded-lg border border-gray-200/50 px-4 py-2 text-xs font-medium text-gray-600 transition-colors hover:bg-gray-100/50 dark:border-white/10 dark:text-gray-300 dark:hover:bg-white/5\"\n >\n {t('subworkflowDrawer.cancel')}\n </button>\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={isCreateMode && !name.trim()}\n className={`rounded-lg px-4 py-2 text-xs font-semibold text-white shadow-sm transition-all ${\n dirty\n ? 'bg-gradient-to-r from-teal-500 to-cyan-500 hover:from-teal-600 hover:to-cyan-600'\n : 'cursor-not-allowed bg-gray-300 dark:bg-gray-700'\n }`}\n >\n {isCreateMode ? t('subworkflowDrawer.create') : t('subworkflowDrawer.save')}\n </button>\n </div>\n </div>\n )\n\n return (\n <GlassModal\n open={open}\n onClose={closeModal}\n title={isCreateMode ? t('subworkflowDrawer.createTitle') : name}\n subtitle={agentBehind ? `${agentBehind} → ${t('subworkflowDrawer.subworkflow')}` : t('subworkflowDrawer.subworkflow')}\n label={isCreateMode ? t('subworkflowDrawer.new') : t('subworkflowDrawer.edit')}\n gradient=\"from-teal-500 to-cyan-600\"\n icon={<ArrowPathRoundedSquareIcon className=\"h-6 w-6 text-white\" />}\n maxWidth=\"6xl\"\n footer={footer}\n zIndex={agentBehind ? 'z-[60]' : 'z-50'}\n >\n <div className=\"flex h-[80vh] min-h-[600px]\">\n {/* --- Left sidebar: config --- */}\n <div className=\"flex w-72 flex-shrink-0 flex-col overflow-y-auto border-r border-white/10\">\n {/* Header / Name */}\n {isCreateMode ? (\n <div className=\"border-b border-white/10 bg-gradient-to-br from-teal-500/15 via-cyan-500/8 to-transparent px-4 py-4 dark:from-teal-500/8 dark:via-cyan-500/4\">\n <label className=\"mb-1 block text-[10px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {t('subworkflowDrawer.name')}\n </label>\n <input\n type=\"text\"\n value={name}\n onChange={(event) => setName(event.target.value)}\n placeholder={t('subworkflowDrawer.namePlaceholder')}\n autoFocus\n className=\"w-full rounded-lg border border-gray-200/50 bg-white/60 px-3 py-2 text-sm font-medium text-gray-900 outline-none placeholder:text-gray-400 focus:border-teal-300/50 focus:ring-1 focus:ring-teal-300/30 dark:border-white/10 dark:bg-white/5 dark:text-white dark:placeholder:text-gray-500\"\n />\n <div className=\"mt-3 flex flex-wrap gap-1\">\n {['external', 'market', 'data', 'communication', 'analytics'].map((cat) => (\n <button\n key={cat}\n type=\"button\"\n onClick={() => setCategory(cat)}\n className={`rounded-full px-2 py-1 text-[9px] font-semibold transition-all ${\n cat === category\n ? `${CATEGORY_PILL_COLORS[cat] ?? CATEGORY_PILL_COLORS.external} ring-1 ring-current/20`\n : 'bg-white/30 text-gray-500 hover:bg-white/50 dark:bg-white/5 dark:text-gray-400'\n }`}\n >\n {cat}\n </button>\n ))}\n </div>\n </div>\n ) : (\n <div className=\"border-b border-white/10 bg-gradient-to-br from-teal-500/15 via-cyan-500/8 to-transparent px-4 py-4 dark:from-teal-500/8 dark:via-cyan-500/4\">\n <div className=\"flex items-center gap-3\">\n <div className={`flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-gradient-to-br ${gradient} shadow-lg`}>\n <IconComponent className=\"h-5 w-5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"truncate text-sm font-bold text-gray-900 dark:text-white\">{name}</h3>\n <div className=\"mt-1 flex flex-wrap gap-1\">\n <span className=\"inline-flex items-center rounded-full bg-teal-100 px-1.5 py-0.5 text-[8px] font-semibold text-teal-700 dark:bg-teal-400/15 dark:text-teal-400\">\n {t('subworkflowDrawer.subworkflow')}\n </span>\n <span className={`inline-flex items-center rounded-full px-1.5 py-0.5 text-[8px] font-medium ${categoryPill}`}>\n {category}\n </span>\n </div>\n </div>\n {onMaximize && tool.toolId && (\n <button\n type=\"button\"\n onClick={() => onMaximize(tool.toolId)}\n title={t('subworkflowDrawer.openFullEditor')}\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg text-gray-400 transition-colors hover:bg-white/10 hover:text-teal-500 dark:hover:text-teal-400\"\n >\n <MaximizeIcon className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Description */}\n <div className=\"border-b border-white/10 px-4 py-3\">\n <textarea\n value={description}\n onChange={(event) => setDescription(event.target.value)}\n rows={2}\n placeholder={t('subworkflowDrawer.descriptionPlaceholder')}\n className=\"w-full resize-none rounded-lg border border-gray-200/50 bg-gray-50/50 px-2.5 py-2 text-[11px] leading-relaxed text-gray-700 outline-none placeholder:text-gray-400 focus:border-teal-300/50 dark:border-white/10 dark:bg-white/5 dark:text-gray-300 dark:placeholder:text-gray-500\"\n />\n </div>\n\n {/* Input variables */}\n <ConfigSection title={t('subworkflowDrawer.inputVariables')} icon={ArrowsPointingInIcon}>\n <div className=\"flex flex-wrap gap-1\">\n {inputVariables.length > 0 ? inputVariables.map((variable) => (\n <VariableChip key={variable.name} name={variable.name} type={variable.type} />\n )) : (\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('subworkflowDrawer.noVariables')}</span>\n )}\n </div>\n </ConfigSection>\n\n {/* Output variables */}\n <ConfigSection title={t('subworkflowDrawer.outputVariables')} icon={ArrowsPointingOutIcon}>\n <div className=\"flex flex-wrap gap-1\">\n {outputVariables.length > 0 ? outputVariables.map((variable) => (\n <OutputChip key={variable.name} name={variable.name} type={variable.type} />\n )) : (\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('subworkflowDrawer.noVariables')}</span>\n )}\n </div>\n </ConfigSection>\n\n {/* Execution settings */}\n <ConfigSection title={t('subworkflowDrawer.executionSettings')} icon={BoltIcon} defaultOpen={false}>\n <div className=\"mb-3\">\n <div className=\"mb-1 flex items-center justify-between\">\n <label className=\"flex items-center gap-1 text-[10px] text-gray-600 dark:text-gray-400\">\n <ClockIcon className=\"h-3 w-3\" />\n {t('subworkflowDrawer.timeout')}\n </label>\n <span className=\"text-[10px] font-bold tabular-nums text-gray-900 dark:text-white\">{(timeoutMs / 1000).toFixed(0)}s</span>\n </div>\n <input\n type=\"range\"\n min=\"1000\"\n max=\"30000\"\n step=\"1000\"\n value={timeoutMs}\n onChange={(event) => setTimeoutMs(parseInt(event.target.value, 10))}\n aria-label={t('subworkflowDrawer.timeout')}\n aria-valuemin={1}\n aria-valuemax={30}\n aria-valuenow={timeoutMs / 1000}\n aria-valuetext={`${(timeoutMs / 1000).toFixed(0)} seconds`}\n className=\"h-3 w-full cursor-pointer appearance-none rounded-full bg-gray-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-teal-500 dark:bg-gray-700 [&::-webkit-slider-thumb]:h-3 [&::-webkit-slider-thumb]:w-3 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-teal-500\"\n />\n </div>\n <div>\n <div className=\"mb-1 flex items-center justify-between\">\n <label className=\"text-[10px] text-gray-600 dark:text-gray-400\">{t('subworkflowDrawer.retries')}</label>\n <span className=\"text-[10px] font-bold tabular-nums text-gray-900 dark:text-white\">{retryCount}</span>\n </div>\n <div className=\"flex gap-1\">\n {[0, 1, 2, 3].map((count) => (\n <button\n key={count}\n type=\"button\"\n onClick={() => setRetryCount(count)}\n className={`flex-1 rounded py-1 text-[10px] font-medium transition-all ${\n count === retryCount\n ? 'bg-teal-500 text-white'\n : 'bg-gray-100 text-gray-500 dark:bg-white/5 dark:text-gray-400'\n }`}\n >\n {count}\n </button>\n ))}\n </div>\n </div>\n </ConfigSection>\n\n {/* Spacer — save is now in the modal footer */}\n <div className=\"mt-auto\" />\n </div>\n\n {/* --- Right: Full interactive workflow canvas --- */}\n <div className=\"flex-1\">\n <WorkflowCanvas\n initialGraph={initialGraph}\n agents={[]}\n models={[]}\n tools={[]}\n rules={[]}\n onGraphChange={handleGraphChange}\n />\n </div>\n </div>\n </GlassModal>\n )\n}\n","/**\n * Pipeline Settings Modal\n * ========================\n * Modal for editing the workflow's identity + lifecycle:\n * - `name` / `description` / `slug` (identity)\n * - `isDraft` (publish state — draft vs published)\n * - `isActive` (archive toggle)\n *\n * The lifecycle block is optional: when the caller opens the modal\n * without passing `isDraft`/`isActive` (e.g. from a create-workflow\n * dialog where the row doesn't exist yet) we hide those fields so the\n * user sees a simple rename form.\n *\n * Opened via `useModalStore.openPipelineSettingsModal(name, description, lifecycle?)`.\n */\n\nimport { useEffect, useState, useMemo } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { Cog6ToothIcon, CheckIcon } from '@heroicons/react/24/outline'\nimport { Button, FormInput, FormTextarea } from '@ui/index'\nimport { GlassModal } from '@ui/components/glass-modal'\nimport { useModalStore } from '../../store/modal-store'\n\nexport type PipelineSettingsPatch = {\n name: string\n description: string\n slug?: string | null\n isDraft?: boolean\n isActive?: boolean\n}\n\ntype PipelineSettingsModalProps = {\n /** Receives only the fields that actually changed — the page wrapper\n * can then PATCH once with exactly the delta. */\n onSave: (changes: PipelineSettingsPatch) => Promise<void>\n}\n\nexport function PipelineSettingsModal({ onSave }: PipelineSettingsModalProps) {\n const t = useTranslations('agents.workflow')\n\n const activeModal = useModalStore((s) => s.activeModal)\n const data = useModalStore((s) => s.pipelineSettingsData)\n const closeModal = useModalStore((s) => s.closeModal)\n\n const open = activeModal === 'pipeline-settings'\n\n const [nameValue, setNameValue] = useState('')\n const [descriptionValue, setDescriptionValue] = useState('')\n const [slugValue, setSlugValue] = useState<string>('')\n const [isDraft, setIsDraft] = useState<boolean>(true)\n const [isActive, setIsActive] = useState<boolean>(true)\n const [isSaving, setIsSaving] = useState(false)\n\n // Track whether the caller supplied lifecycle fields at all. If they\n // didn't, the modal hides the lifecycle row so the form stays simple\n // for callers that only care about name/description (e.g. the \"create\n // a subworkflow\" flow which doesn't have a row to archive yet).\n const lifecycleAvailable = useMemo(() => {\n if (!data) return false\n return data.isDraft !== undefined || data.isActive !== undefined || data.slug !== undefined\n }, [data])\n\n // Sync local state when store data changes\n useEffect(() => {\n if (data) {\n setNameValue(data.name)\n setDescriptionValue(data.description)\n setSlugValue(data.slug ?? '')\n setIsDraft(data.isDraft ?? true)\n setIsActive(data.isActive ?? true)\n }\n }, [data])\n\n const handleSubmit = async (event: React.FormEvent) => {\n event.preventDefault()\n const trimmedName = nameValue.trim()\n if (!trimmedName) return\n\n // Compute the delta so the page wrapper can PATCH minimally.\n const trimmedDescription = descriptionValue.trim()\n const trimmedSlug = slugValue.trim()\n const changes: PipelineSettingsPatch = {\n name: trimmedName,\n description: trimmedDescription,\n }\n if (data) {\n if (trimmedSlug !== (data.slug ?? '')) {\n changes.slug = trimmedSlug.length > 0 ? trimmedSlug : null\n }\n if (data.isDraft !== undefined && isDraft !== data.isDraft) {\n changes.isDraft = isDraft\n }\n if (data.isActive !== undefined && isActive !== data.isActive) {\n changes.isActive = isActive\n }\n }\n\n setIsSaving(true)\n try {\n await onSave(changes)\n closeModal()\n } catch {\n // Parent handles error display — keep modal open so user can retry\n } finally {\n setIsSaving(false)\n }\n }\n\n const footer = (\n <div className=\"flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n onClick={closeModal}\n className=\"rounded-lg border border-gray-200/50 px-4 py-2 text-xs font-medium text-gray-600 transition-colors hover:bg-gray-100/50 dark:border-white/10 dark:text-gray-300 dark:hover:bg-white/5\"\n >\n {t('cancel')}\n </button>\n <Button\n type=\"submit\"\n form=\"pipeline-settings-form\"\n color=\"ios-glass-blue\"\n loading={isSaving}\n loadingText={t('saving')}\n >\n <CheckIcon className=\"h-4 w-4\" />\n {t('saveSettings')}\n </Button>\n </div>\n )\n\n return (\n <GlassModal\n open={open}\n onClose={closeModal}\n title={t('pipelineSettings')}\n subtitle={t('pipelineSettingsSubtitle')}\n label={t('settings')}\n icon={<Cog6ToothIcon className=\"h-5 w-5 text-white\" />}\n gradient=\"from-indigo-500 to-purple-600\"\n maxWidth=\"md\"\n footer={footer}\n onSubmit={handleSubmit}\n >\n <form id=\"pipeline-settings-form\" onSubmit={handleSubmit} className=\"space-y-5\">\n <FormInput\n label={t('pipelineName')}\n value={nameValue}\n onValueChange={setNameValue}\n placeholder={t('pipelineNamePlaceholder')}\n required\n />\n\n <FormTextarea\n label={t('pipelineDescription')}\n value={descriptionValue}\n onValueChange={setDescriptionValue}\n placeholder={t('pipelineDescriptionPlaceholder')}\n rows={4}\n />\n\n {lifecycleAvailable && (\n <>\n <FormInput\n label={t('pipelineSlug', { _: 'Slug' } as never)}\n value={slugValue}\n onValueChange={setSlugValue}\n placeholder=\"product-pricing\"\n hint={t('pipelineSlugHint', {\n _: 'URL-friendly identifier. Leave blank to use the auto-generated one.',\n } as never)}\n />\n\n <fieldset className=\"space-y-2 rounded-xl border border-gray-200/60 bg-gray-50/60 p-3 dark:border-white/10 dark:bg-white/5\">\n <legend className=\"px-1 text-xs font-medium text-gray-600 dark:text-gray-300\">\n {t('pipelineLifecycle', { _: 'Lifecycle' } as never)}\n </legend>\n\n <label className=\"flex items-center justify-between gap-3 text-sm text-gray-700 dark:text-gray-200\">\n <span>\n {t('pipelineIsDraft', { _: 'Draft mode' } as never)}\n <span className=\"ml-2 text-[11px] text-gray-400\">\n {isDraft\n ? t('pipelineIsDraftOn', { _: 'Editable — changes do not affect runs.' } as never)\n : t('pipelineIsDraftOff', { _: 'Published — edits require a new version.' } as never)}\n </span>\n </span>\n <input\n type=\"checkbox\"\n checked={isDraft}\n onChange={(event) => setIsDraft(event.target.checked)}\n className=\"h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-500\"\n />\n </label>\n\n <label className=\"flex items-center justify-between gap-3 text-sm text-gray-700 dark:text-gray-200\">\n <span>\n {t('pipelineIsActive', { _: 'Active' } as never)}\n <span className=\"ml-2 text-[11px] text-gray-400\">\n {isActive\n ? t('pipelineIsActiveOn', { _: 'Visible in listings and runnable.' } as never)\n : t('pipelineIsActiveOff', { _: 'Archived — hidden from the default listing.' } as never)}\n </span>\n </span>\n <input\n type=\"checkbox\"\n checked={isActive}\n onChange={(event) => setIsActive(event.target.checked)}\n className=\"h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-500\"\n />\n </label>\n </fieldset>\n </>\n )}\n </form>\n </GlassModal>\n )\n}\n","/**\n * Run Replay Modal\n * =================\n * Pre-fills with the original run's `inputVariables` and lets the user\n * tweak any value before re-executing. Emits ONLY the keys the user\n * actually changed via `onReplay(overrides)` — the parent then forwards\n * those to `POST /workflows/{wid}/runs/{rid}/replay`. Backend\n * shallow-merges them on top of the original inputs so unchanged keys\n * fall through unchanged.\n *\n * Submitting with no edits is allowed: it sends an empty override map\n * which the backend treats as a verbatim re-run.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { ArrowPathIcon } from '@heroicons/react/24/outline'\nimport { Button, FormInput, FormTextarea } from '@ui/index'\nimport { Badge } from '@ui/components/badge'\nimport { GlassModal } from '@ui/components/glass-modal'\nimport { useTranslations } from '@ui/lib/i18n-context'\n\nexport type ReplayInputVariables = Record<string, unknown>\n\nexport type RunReplayModalProps = {\n open: boolean\n onClose: () => void\n runId: string\n workflowId: string\n /** The original run's `inputVariables` map. Keys become the form\n * rows; types are inferred (string/number/boolean/json) so the\n * inputs render appropriately. */\n originalInputs: ReplayInputVariables\n /** Receives the override map. Empty object → verbatim re-run. */\n onReplay: (overrides: ReplayInputVariables) => Promise<void>\n}\n\ntype Row = {\n key: string\n /** Stringified for the input control. Coerced back to original type\n * on submit unless the original was a JSON object/array. */\n value: string\n /** Type of the original value — controls how we coerce on submit. */\n kind: 'string' | 'number' | 'boolean' | 'json'\n /** Did the user touch this row? Untouched rows are dropped from the\n * override map so the backend keeps the original value. */\n touched: boolean\n /** Raw original (used to detect touch + restore). */\n original: unknown\n}\n\nexport function RunReplayModal({\n open,\n onClose,\n runId,\n workflowId,\n originalInputs,\n onReplay,\n}: RunReplayModalProps) {\n const t = useTranslations('agents.workflow')\n const [rows, setRows] = useState<Row[]>([])\n const [submitting, setSubmitting] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n // Re-seed rows whenever the modal opens against a new run.\n useEffect(() => {\n if (!open) return\n setRows(Object.entries(originalInputs).map(([key, value]) => toRow(key, value)))\n setError(null)\n }, [open, originalInputs])\n\n const overrides = useMemo<ReplayInputVariables>(() => {\n const out: ReplayInputVariables = {}\n for (const row of rows) {\n if (!row.touched) continue\n try {\n out[row.key] = parseRow(row)\n } catch (e) {\n // Surface parse errors at submit time, not here.\n out[`__error__${row.key}`] = (e as Error).message\n }\n }\n return out\n }, [rows])\n\n const hasParseError = Object.keys(overrides).some((k) => k.startsWith('__error__'))\n\n const updateRow = (index: number, patch: Partial<Row>) => {\n setRows((current) => current.map((r, i) => (i === index ? { ...r, ...patch, touched: true } : r)))\n }\n\n const resetRow = (index: number) => {\n setRows((current) => current.map((r, i) => {\n if (i !== index) return r\n return toRow(r.key, r.original)\n }))\n }\n\n const handleSubmit = async () => {\n setError(null)\n if (hasParseError) {\n setError(t('replayParseError', { _: 'One or more values do not match their declared type.' } as never))\n return\n }\n setSubmitting(true)\n try {\n const cleaned: ReplayInputVariables = {}\n for (const row of rows) {\n if (!row.touched) continue\n cleaned[row.key] = parseRow(row)\n }\n await onReplay(cleaned)\n onClose()\n } catch (e) {\n setError((e as Error).message)\n } finally {\n setSubmitting(false)\n }\n }\n\n const footer = (\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-[11px] text-gray-400\">\n run <code>{runId.slice(0, 8)}</code> · wf <code>{workflowId.slice(0, 8)}</code>\n </span>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg border border-gray-200/50 px-4 py-2 text-xs font-medium text-gray-600 transition-colors hover:bg-gray-100/50 dark:border-white/10 dark:text-gray-300 dark:hover:bg-white/5\"\n >\n {t('cancel')}\n </button>\n <Button\n type=\"submit\"\n form=\"run-replay-form\"\n color=\"ios-glass-blue\"\n loading={submitting}\n >\n <ArrowPathIcon className=\"h-4 w-4\" />\n {t('replay', { _: 'Replay' } as never)}\n </Button>\n </div>\n </div>\n )\n\n return (\n <GlassModal\n open={open}\n onClose={onClose}\n title={t('replayTitle', { _: 'Replay run' } as never)}\n subtitle={t('replaySubtitle', { _: 'Tweak any input below and re-execute. Untouched keys keep their original value.' } as never)}\n icon={<ArrowPathIcon className=\"h-5 w-5 text-white\" />}\n gradient=\"from-sky-500 to-indigo-600\"\n maxWidth=\"lg\"\n footer={footer}\n onSubmit={(event) => {\n event.preventDefault()\n void handleSubmit()\n }}\n >\n <form\n id=\"run-replay-form\"\n onSubmit={(event) => { event.preventDefault(); void handleSubmit() }}\n className=\"space-y-3\"\n >\n {rows.length === 0 ? (\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\n {t('replayNoInputs', { _: 'This run had no input variables — replaying will execute the workflow as-is.' } as never)}\n </p>\n ) : rows.map((row, index) => (\n <RowEditor\n key={row.key}\n row={row}\n onChange={(patch) => updateRow(index, patch)}\n onReset={() => resetRow(index)}\n />\n ))}\n\n {error && (\n <p className=\"rounded-lg border border-red-400/40 bg-red-500/10 p-2 text-xs text-red-600 dark:text-red-300\">\n {error}\n </p>\n )}\n </form>\n </GlassModal>\n )\n}\n\n// ── Per-row editor ────────────────────────────────────────────────\n\nfunction RowEditor({\n row,\n onChange,\n onReset,\n}: {\n row: Row\n onChange: (patch: Partial<Row>) => void\n onReset: () => void\n}) {\n const isJson = row.kind === 'json'\n\n return (\n <div className=\"rounded-xl border border-gray-200/60 bg-gray-50/60 p-3 dark:border-white/10 dark:bg-white/5\">\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <span className=\"font-mono text-xs text-gray-700 dark:text-gray-200\">{row.key}</span>\n <div className=\"flex items-center gap-2\">\n <Badge color=\"zinc\" size=\"xs\" className=\"uppercase tracking-wider\">\n {row.kind}\n </Badge>\n {row.touched && (\n <button\n type=\"button\"\n onClick={onReset}\n className=\"text-[11px] text-indigo-600 hover:text-indigo-500 dark:text-indigo-400\"\n >\n reset\n </button>\n )}\n </div>\n </div>\n {row.kind === 'boolean' ? (\n <select\n value={row.value}\n onChange={(event) => onChange({ value: event.target.value })}\n className=\"w-full rounded-lg border border-gray-200/50 bg-white/70 px-3 py-2 text-sm text-gray-900 dark:border-white/10 dark:bg-gray-800/70 dark:text-gray-100\"\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : isJson ? (\n <FormTextarea\n value={row.value}\n onValueChange={(v) => onChange({ value: v })}\n rows={4}\n className=\"font-mono\"\n />\n ) : (\n <FormInput\n type={row.kind === 'number' ? 'number' : 'text'}\n value={row.value}\n onValueChange={(v) => onChange({ value: v })}\n />\n )}\n </div>\n )\n}\n\n// ── Coercion helpers ──────────────────────────────────────────────\n\nfunction toRow(key: string, value: unknown): Row {\n if (value === null || value === undefined) {\n return { key, value: '', kind: 'string', touched: false, original: value }\n }\n if (typeof value === 'boolean') {\n return { key, value: value ? 'true' : 'false', kind: 'boolean', touched: false, original: value }\n }\n if (typeof value === 'number') {\n return { key, value: String(value), kind: 'number', touched: false, original: value }\n }\n if (typeof value === 'string') {\n return { key, value, kind: 'string', touched: false, original: value }\n }\n // Object / array — show as pretty JSON.\n return {\n key,\n value: JSON.stringify(value, null, 2),\n kind: 'json',\n touched: false,\n original: value,\n }\n}\n\nfunction parseRow(row: Row): unknown {\n switch (row.kind) {\n case 'string':\n return row.value\n case 'number': {\n const n = Number(row.value)\n if (!Number.isFinite(n)) {\n throw new Error(`'${row.key}' must be a number, got '${row.value}'`)\n }\n return n\n }\n case 'boolean':\n return row.value === 'true'\n case 'json': {\n if (row.value.trim().length === 0) return null\n try {\n return JSON.parse(row.value)\n } catch (e) {\n throw new Error(`'${row.key}' is not valid JSON: ${(e as Error).message}`)\n }\n }\n }\n}\n","/**\n * Reusable execution timeline + per-node inspector (issue #68).\n *\n * Two-column layout:\n * - Left: vertical step list, one card per node, click-to-select.\n * - Right: details for the selected node (status, timing, model\n * metrics if present, inputs/outputs, error).\n *\n * Built to be dropped into any product that needs to render a\n * workflow run — astrlabe's runs page is the primary consumer; other\n * consuming apps can embed the same component without bespoke layout.\n * All copy is delivered via the `labels` prop so each consuming app\n * can localize without lifting its i18n dependency into this package.\n */\n\nimport { useMemo, useState } from 'react'\nimport {\n ArrowPathIcon,\n CheckCircleIcon,\n ClockIcon,\n ExclamationTriangleIcon,\n MinusCircleIcon,\n XCircleIcon,\n} from '@heroicons/react/24/outline'\nimport { Badge } from '@ui/components/badge'\n\nexport type ExecutionTimelineStatus =\n | 'completed'\n | 'running'\n | 'failed'\n | 'pending'\n | 'skipped'\n\nexport type ExecutionTimelineMetrics = {\n tokensIn?: number\n tokensOut?: number\n costUsd?: number\n provider?: string\n model?: string\n}\n\nexport type ExecutionTimelineEntry = {\n nodeId: string\n nodeType: string\n status: ExecutionTimelineStatus\n startedAt: string | null\n completedAt: string | null\n durationMs: number | null\n inputs?: Record<string, unknown>\n outputs?: Record<string, unknown>\n error?: string | null\n metrics?: ExecutionTimelineMetrics\n}\n\nexport type ExecutionTimelineLabels = {\n status: string\n duration: string\n inputs: string\n outputs: string\n error: string\n started: string\n completed: string\n pending: string\n running: string\n failed: string\n skipped: string\n selectNode: string\n model: string\n tokens: string\n cost: string\n /** Used as the empty-state heading when `entries` is empty. */\n empty?: string\n}\n\nexport type ExecutionTimelinePanelProps = {\n entries: ExecutionTimelineEntry[]\n labels: ExecutionTimelineLabels\n /** When set, drives selection from the parent. Useful when the page\n * syncs the selection with a URL query param. */\n selectedNodeId?: string\n onSelect?: (nodeId: string) => void\n}\n\nconst STATUS_META: Record<ExecutionTimelineStatus, { color: 'emerald' | 'sky' | 'rose' | 'amber' | 'zinc'; icon: typeof CheckCircleIcon }> = {\n completed: { color: 'emerald', icon: CheckCircleIcon },\n running: { color: 'sky', icon: ArrowPathIcon },\n failed: { color: 'rose', icon: XCircleIcon },\n pending: { color: 'amber', icon: ClockIcon },\n skipped: { color: 'zinc', icon: MinusCircleIcon },\n}\n\nexport function ExecutionTimelinePanel({\n entries,\n labels,\n selectedNodeId,\n onSelect,\n}: ExecutionTimelinePanelProps) {\n const [internalSelected, setInternalSelected] = useState<string | null>(null)\n const effectiveSelected = selectedNodeId ?? internalSelected\n\n const selected = useMemo(\n () => entries.find((entry) => entry.nodeId === effectiveSelected) ?? entries[0] ?? null,\n [entries, effectiveSelected],\n )\n\n const handleSelect = (nodeId: string) => {\n if (onSelect) onSelect(nodeId)\n setInternalSelected(nodeId)\n }\n\n if (entries.length === 0) {\n return (\n <div className=\"rounded-xl border border-slate-200 bg-slate-50/60 p-6 text-center text-sm text-slate-500 dark:border-slate-700 dark:bg-slate-900/40 dark:text-slate-400\">\n {labels.empty ?? '—'}\n </div>\n )\n }\n\n return (\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-12\">\n {/* Step list */}\n <div className=\"space-y-3 lg:col-span-5 xl:col-span-4\">\n {entries.map((entry, index) => {\n const meta = STATUS_META[entry.status]\n const Icon = meta.icon\n const isActive = (selected?.nodeId ?? '') === entry.nodeId\n return (\n <button\n key={entry.nodeId}\n type=\"button\"\n onClick={() => handleSelect(entry.nodeId)}\n className={[\n 'w-full text-left rounded-xl border p-4 transition',\n isActive\n ? 'border-indigo-400/60 bg-indigo-50/70 shadow-md dark:border-indigo-400/40 dark:bg-indigo-500/10'\n : 'border-slate-200/60 bg-white/70 hover:border-indigo-300 hover:shadow-sm dark:border-white/10 dark:bg-white/5 dark:hover:border-indigo-400/30',\n ].join(' ')}\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"flex flex-col items-center\">\n <span className=\"flex h-6 w-6 items-center justify-center rounded-full bg-indigo-100 text-xs font-semibold text-indigo-700 dark:bg-indigo-500/20 dark:text-indigo-200\">\n {index + 1}\n </span>\n {index < entries.length - 1 && (\n <span className=\"mt-1 h-8 w-px bg-slate-200 dark:bg-white/10\" />\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"min-w-0\">\n <div className=\"truncate font-medium text-slate-900 dark:text-white\">\n {entry.nodeId}\n </div>\n <div className=\"text-xs text-slate-500 dark:text-slate-400\">\n {entry.nodeType}\n </div>\n </div>\n <Badge color={meta.color}>\n <Icon className=\"mr-1 h-3 w-3\" />\n {labels[entry.status]}\n </Badge>\n </div>\n <div className=\"mt-2 flex items-center gap-3 text-xs text-slate-500 dark:text-slate-400\">\n <span>{formatDuration(entry.durationMs)}</span>\n <span>·</span>\n <span>{formatTimestamp(entry.startedAt)}</span>\n </div>\n </div>\n </div>\n </button>\n )\n })}\n </div>\n\n {/* Inspector */}\n <div className=\"lg:col-span-7 xl:col-span-8\">\n {selected ? (\n <NodeInspector entry={selected} labels={labels} />\n ) : (\n <div className=\"rounded-xl border border-slate-200 bg-slate-50/60 p-6 text-center text-sm text-slate-500 dark:border-slate-700 dark:bg-slate-900/40\">\n {labels.selectNode}\n </div>\n )}\n </div>\n </div>\n )\n}\n\n// ── Inspector ───────────────────────────────────────────────────\n\nfunction NodeInspector({\n entry,\n labels,\n}: {\n entry: ExecutionTimelineEntry\n labels: ExecutionTimelineLabels\n}) {\n const meta = STATUS_META[entry.status]\n return (\n <div className=\"rounded-2xl border border-slate-200 bg-white p-5 shadow-sm dark:border-slate-700 dark:bg-slate-900/40\">\n <div className=\"mb-3 flex items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-base font-semibold text-slate-900 dark:text-white\">\n {entry.nodeId}\n </h3>\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">{entry.nodeType}</p>\n </div>\n <Badge color={meta.color}>{labels[entry.status]}</Badge>\n </div>\n\n <dl className=\"grid grid-cols-2 gap-3 text-xs text-slate-500 dark:text-slate-400\">\n <div>\n <dt className=\"font-semibold\">{labels.started}</dt>\n <dd className=\"mt-0.5 text-slate-700 dark:text-slate-200\">\n {formatTimestamp(entry.startedAt)}\n </dd>\n </div>\n <div>\n <dt className=\"font-semibold\">{labels.completed}</dt>\n <dd className=\"mt-0.5 text-slate-700 dark:text-slate-200\">\n {formatTimestamp(entry.completedAt)}\n </dd>\n </div>\n <div>\n <dt className=\"font-semibold\">{labels.duration}</dt>\n <dd className=\"mt-0.5 text-slate-700 dark:text-slate-200\">\n {formatDuration(entry.durationMs)}\n </dd>\n </div>\n <div>\n <dt className=\"font-semibold\">{labels.status}</dt>\n <dd className=\"mt-0.5 text-slate-700 dark:text-slate-200\">{labels[entry.status]}</dd>\n </div>\n </dl>\n\n {entry.metrics && hasMetrics(entry.metrics) && (\n <div className=\"mt-4 rounded-lg border border-indigo-300/50 bg-indigo-50/60 p-3 text-xs dark:border-indigo-400/30 dark:bg-indigo-500/10\">\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3\">\n {entry.metrics.model && (\n <div>\n <dt className=\"font-semibold text-indigo-700 dark:text-indigo-200\">{labels.model}</dt>\n <dd className=\"mt-0.5 truncate text-indigo-900 dark:text-indigo-100\">\n {entry.metrics.provider ? `${entry.metrics.provider} · ` : ''}\n {entry.metrics.model}\n </dd>\n </div>\n )}\n {(entry.metrics.tokensIn !== undefined || entry.metrics.tokensOut !== undefined) && (\n <div>\n <dt className=\"font-semibold text-indigo-700 dark:text-indigo-200\">{labels.tokens}</dt>\n <dd className=\"mt-0.5 text-indigo-900 dark:text-indigo-100\">\n {entry.metrics.tokensIn ?? 0} in · {entry.metrics.tokensOut ?? 0} out\n </dd>\n </div>\n )}\n {entry.metrics.costUsd !== undefined && (\n <div>\n <dt className=\"font-semibold text-indigo-700 dark:text-indigo-200\">{labels.cost}</dt>\n <dd className=\"mt-0.5 text-indigo-900 dark:text-indigo-100\">\n {formatCost(entry.metrics.costUsd)}\n </dd>\n </div>\n )}\n </div>\n </div>\n )}\n\n {entry.error && (\n <div className=\"mt-4 rounded-lg border border-rose-300/60 bg-rose-50/60 p-3 text-xs dark:border-rose-400/30 dark:bg-rose-500/10\">\n <div className=\"flex items-center gap-2 font-semibold text-rose-700 dark:text-rose-300\">\n <ExclamationTriangleIcon className=\"h-4 w-4\" />\n {labels.error}\n </div>\n <pre className=\"mt-2 whitespace-pre-wrap break-words text-rose-800 dark:text-rose-200\">\n {entry.error}\n </pre>\n </div>\n )}\n\n <div className=\"mt-4 space-y-3\">\n <JsonBlock title={labels.inputs} value={entry.inputs} />\n <JsonBlock title={labels.outputs} value={entry.outputs} />\n </div>\n </div>\n )\n}\n\nfunction JsonBlock({ title, value }: { title: string; value?: Record<string, unknown> }) {\n const hasValue = value && Object.keys(value).length > 0\n return (\n <div className=\"rounded-lg border border-slate-200/60 bg-slate-50/60 p-3 dark:border-white/10 dark:bg-white/5\">\n <div className=\"mb-1 text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {title}\n </div>\n {hasValue ? (\n <pre className=\"max-h-72 overflow-auto whitespace-pre text-xs text-slate-800 dark:text-slate-200\">\n {JSON.stringify(value, null, 2)}\n </pre>\n ) : (\n <div className=\"text-xs italic text-slate-400 dark:text-slate-500\">—</div>\n )}\n </div>\n )\n}\n\nfunction hasMetrics(metrics: ExecutionTimelineMetrics): boolean {\n return Boolean(\n metrics.model\n || metrics.tokensIn !== undefined\n || metrics.tokensOut !== undefined\n || metrics.costUsd !== undefined,\n )\n}\n\nfunction formatDuration(ms: number | null): string {\n if (ms === null) return '—'\n if (ms < 1000) return `${ms}ms`\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`\n const mins = Math.floor(ms / 60_000)\n const secs = Math.floor((ms % 60_000) / 1000)\n return `${mins}m${secs}s`\n}\n\nfunction formatCost(usd: number): string {\n if (usd === 0) return '$0'\n if (usd < 0.01) return `$${usd.toFixed(4)}`\n if (usd < 1) return `$${usd.toFixed(3)}`\n return `$${usd.toFixed(2)}`\n}\n\nfunction formatTimestamp(iso: string | null): string {\n if (!iso) return '—'\n return new Date(iso).toLocaleString(undefined, {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n })\n}\n","/**\n * Rule editing types.\n *\n * Mirrors the shape the Rust `RuleExecutor`\n * (`lambda-rs/crates/astrlabe-handlers/src/engine/executors/rule.rs`) reads\n * from `astrlabe.agent_rules.condition` + `action`. The UI builder below\n * writes exactly this shape, so round-tripping through the backend is a\n * no-op.\n */\n\nexport type SimpleComparisonOperator =\n | 'truthy'\n | 'eq'\n | 'neq'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'contains'\n\nexport type RuleConditionOperator =\n | SimpleComparisonOperator\n | 'regex_match'\n | 'threshold'\n | 'time_window'\n | 'boolean_expression'\n\nexport type TimeWindow = {\n startHour: number\n endHour: number\n startMinute?: number\n endMinute?: number\n /** 0 = Sunday, 6 = Saturday. Omit to match every day. */\n daysOfWeek?: number[]\n}\n\n/**\n * Canonical rule-condition shape. The executor branches on `operator`,\n * so every form tree ultimately serializes to this.\n */\nexport type RuleCondition = {\n operator: RuleConditionOperator\n /** Simple operators + regex_match + threshold + time_window */\n field?: string\n /** Simple operators + threshold */\n value?: string | number | boolean | null\n /** regex_match */\n pattern?: string\n /** threshold — which direction `value` is compared in. */\n comparison?: 'gt' | 'gte' | 'lt' | 'lte'\n /** time_window */\n timezone?: string\n windows?: TimeWindow[]\n /** boolean_expression */\n combinator?: 'and' | 'or'\n operands?: RuleCondition[]\n}\n\nexport type RuleAction = {\n type: string\n params?: Record<string, unknown>\n}\n\n/** `agent_rules.status` free-form string — keep the UI picker aligned\n * with the values the engine / audit trail recognizes today. */\nexport const RULE_STATUS_OPTIONS = ['draft', 'active', 'archived'] as const\nexport type RuleStatus = (typeof RULE_STATUS_OPTIONS)[number]\n\nexport const TIMEZONE_OPTIONS = [\n 'UTC',\n 'America/Sao_Paulo',\n 'America/New_York',\n 'America/Los_Angeles',\n 'Europe/London',\n 'Europe/Lisbon',\n] as const\n","import { FormInput, FormSelect } from '@ui/components/form-input'\nimport { Button } from '@ui/components/button'\nimport type {\n RuleCondition,\n RuleConditionOperator,\n SimpleComparisonOperator,\n TimeWindow,\n} from './types'\nimport { TIMEZONE_OPTIONS } from './types'\n\ntype Props = {\n value: RuleCondition\n onChange: (next: RuleCondition) => void\n /** Recursion depth. Boolean_expression is capped at one level to keep\n * the UI legible — deeper trees remain round-trippable via the raw\n * JSON fallback but the visual builder won't surface sub-boolean\n * operands. */\n depth?: number\n}\n\nconst OPERATOR_OPTIONS: Array<{ value: RuleConditionOperator; label: string }> = [\n { value: 'truthy', label: 'Field is set (truthy)' },\n { value: 'eq', label: 'Equals' },\n { value: 'neq', label: 'Not equal to' },\n { value: 'gt', label: 'Greater than' },\n { value: 'gte', label: 'Greater than or equal' },\n { value: 'lt', label: 'Less than' },\n { value: 'lte', label: 'Less than or equal' },\n { value: 'contains', label: 'Contains (string)' },\n { value: 'threshold', label: 'Threshold' },\n { value: 'regex_match', label: 'Regex match' },\n { value: 'time_window', label: 'Time window' },\n { value: 'boolean_expression', label: 'And/Or group' },\n]\n\nconst SIMPLE_COMPARISON_OPERATORS: Array<SimpleComparisonOperator> = [\n 'truthy', 'eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'contains',\n]\n\nexport function RuleConditionBuilder({ value, onChange, depth = 0 }: Props) {\n const handleOperatorChange = (op: RuleConditionOperator) => {\n // Reset sibling fields that don't apply to the new op so stale\n // values don't leak back into the JSON — e.g. switching from\n // time_window to eq should drop `windows`.\n const base: RuleCondition = { operator: op }\n switch (op) {\n case 'truthy':\n onChange({ ...base, field: value.field ?? '' })\n break\n case 'eq':\n case 'neq':\n case 'gt':\n case 'gte':\n case 'lt':\n case 'lte':\n case 'contains':\n onChange({ ...base, field: value.field ?? '', value: value.value ?? '' })\n break\n case 'threshold':\n onChange({\n ...base,\n field: value.field ?? '',\n comparison: value.comparison ?? 'gte',\n value: typeof value.value === 'number' ? value.value : 0,\n })\n break\n case 'regex_match':\n onChange({ ...base, field: value.field ?? '', pattern: value.pattern ?? '' })\n break\n case 'time_window':\n onChange({\n ...base,\n field: value.field ?? '',\n timezone: value.timezone ?? 'UTC',\n windows: value.windows && value.windows.length > 0\n ? value.windows\n : [{ startHour: 6, endHour: 9 }],\n })\n break\n case 'boolean_expression':\n onChange({\n ...base,\n combinator: value.combinator ?? 'and',\n operands: value.operands && value.operands.length > 0\n ? value.operands\n : [{ operator: 'gt', field: '', value: 0 }, { operator: 'gt', field: '', value: 0 }],\n })\n break\n }\n }\n\n return (\n <div className=\"space-y-3 rounded-xl border border-slate-200 bg-slate-50/60 p-3 dark:border-slate-700 dark:bg-slate-900/40\">\n <FormSelect\n label=\"Operator\"\n value={value.operator}\n options={OPERATOR_OPTIONS}\n onValueChange={(v) => handleOperatorChange(v as RuleConditionOperator)}\n />\n\n {SIMPLE_COMPARISON_OPERATORS.includes(value.operator as SimpleComparisonOperator) && (\n <SimpleEditor value={value} onChange={onChange} />\n )}\n\n {value.operator === 'threshold' && <ThresholdEditor value={value} onChange={onChange} />}\n {value.operator === 'regex_match' && <RegexEditor value={value} onChange={onChange} />}\n {value.operator === 'time_window' && <TimeWindowEditor value={value} onChange={onChange} />}\n {value.operator === 'boolean_expression' && depth < 1 && (\n <BooleanGroupEditor value={value} onChange={onChange} depth={depth + 1} />\n )}\n {value.operator === 'boolean_expression' && depth >= 1 && (\n <p className=\"text-xs italic text-slate-500\">\n Nested boolean groups are supported by the engine but not in this builder — edit the JSON directly for deeper trees.\n </p>\n )}\n </div>\n )\n}\n\n// ── Simple comparison editor ──\n\nfunction SimpleEditor({\n value,\n onChange,\n}: {\n value: RuleCondition\n onChange: (next: RuleCondition) => void\n}) {\n const isTruthy = value.operator === 'truthy'\n return (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <FormInput\n label=\"Field\"\n hint=\"Dotted reference into the variable pool — e.g. `parse-pricing.margin`, `inputs.category`\"\n value={value.field ?? ''}\n onValueChange={(field) => onChange({ ...value, field })}\n placeholder=\"node.path\"\n />\n {!isTruthy && (\n <FormInput\n label=\"Value\"\n hint=\"Literal. Numeric operators coerce via `as f64`.\"\n value={value.value === null || value.value === undefined ? '' : String(value.value)}\n onValueChange={(raw) => onChange({ ...value, value: coerceScalar(raw) })}\n />\n )}\n </div>\n )\n}\n\n// ── Threshold editor ──\n\nfunction ThresholdEditor({\n value,\n onChange,\n}: {\n value: RuleCondition\n onChange: (next: RuleCondition) => void\n}) {\n return (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <FormInput\n label=\"Field\"\n value={value.field ?? ''}\n onValueChange={(field) => onChange({ ...value, field })}\n placeholder=\"parse-pricing.margin\"\n />\n <FormSelect\n label=\"Direction\"\n value={value.comparison ?? 'gte'}\n options={[\n { value: 'gt', label: 'Greater than (>)' },\n { value: 'gte', label: 'At least (≥)' },\n { value: 'lt', label: 'Less than (<)' },\n { value: 'lte', label: 'At most (≤)' },\n ]}\n onValueChange={(comparison) =>\n onChange({ ...value, comparison: comparison as 'gt' | 'gte' | 'lt' | 'lte' })\n }\n />\n <FormInput\n label=\"Threshold\"\n type=\"number\"\n value={value.value === null || value.value === undefined ? '' : String(value.value)}\n onValueChange={(raw) => onChange({ ...value, value: Number(raw) })}\n placeholder=\"0.08\"\n />\n </div>\n )\n}\n\n// ── Regex editor ──\n\nfunction RegexEditor({\n value,\n onChange,\n}: {\n value: RuleCondition\n onChange: (next: RuleCondition) => void\n}) {\n return (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <FormInput\n label=\"Field\"\n value={value.field ?? ''}\n onValueChange={(field) => onChange({ ...value, field })}\n placeholder=\"agent.text\"\n />\n <FormInput\n label=\"Pattern\"\n hint=\"Rust regex syntax — `(?i)` etc. supported.\"\n value={value.pattern ?? ''}\n onValueChange={(pattern) => onChange({ ...value, pattern })}\n placeholder=\"diesel-s10\"\n />\n </div>\n )\n}\n\n// ── Time-window editor ──\n\nfunction TimeWindowEditor({\n value,\n onChange,\n}: {\n value: RuleCondition\n onChange: (next: RuleCondition) => void\n}) {\n const windows = value.windows ?? []\n\n const update = (index: number, patch: Partial<TimeWindow>) => {\n const next = windows.map((win, i) => (i === index ? { ...win, ...patch } : win))\n onChange({ ...value, windows: next })\n }\n const remove = (index: number) => {\n const next = windows.filter((_, i) => i !== index)\n onChange({ ...value, windows: next })\n }\n const add = () => onChange({ ...value, windows: [...windows, { startHour: 8, endHour: 17 }] })\n\n return (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <FormSelect\n label=\"Timezone\"\n value={value.timezone ?? 'UTC'}\n options={TIMEZONE_OPTIONS.map((tz) => ({ value: tz, label: tz }))}\n onValueChange={(timezone) => onChange({ ...value, timezone })}\n />\n <FormInput\n label=\"Timestamp field (optional)\"\n hint=\"Pulls a timestamp from the pool. Leave blank to use the run's wall-clock.\"\n value={value.field ?? ''}\n onValueChange={(field) => onChange({ ...value, field })}\n placeholder=\"clock.ts\"\n />\n </div>\n\n <div className=\"space-y-2\">\n {windows.map((win, index) => (\n <div key={index} className=\"grid grid-cols-[1fr_1fr_auto] items-end gap-2 rounded-lg border border-slate-200 p-2 dark:border-slate-700\">\n <FormInput\n label={`Start (hour)`}\n type=\"number\"\n min={0}\n max={23}\n value={String(win.startHour)}\n onValueChange={(raw) => update(index, { startHour: clampHour(raw) })}\n />\n <FormInput\n label={`End (hour)`}\n type=\"number\"\n min={0}\n max={24}\n value={String(win.endHour)}\n onValueChange={(raw) => update(index, { endHour: clampHour(raw, 24) })}\n />\n <Button type=\"button\" plain onClick={() => remove(index)}>Remove</Button>\n </div>\n ))}\n <Button type=\"button\" outline onClick={add}>+ Add window</Button>\n </div>\n </div>\n )\n}\n\n// ── Boolean expression editor ──\n\nfunction BooleanGroupEditor({\n value,\n onChange,\n depth,\n}: {\n value: RuleCondition\n onChange: (next: RuleCondition) => void\n depth: number\n}) {\n const operands = value.operands ?? []\n\n const update = (index: number, next: RuleCondition) => {\n const arr = operands.map((op, i) => (i === index ? next : op))\n onChange({ ...value, operands: arr })\n }\n const remove = (index: number) => {\n onChange({ ...value, operands: operands.filter((_, i) => i !== index) })\n }\n const add = () => onChange({\n ...value,\n operands: [...operands, { operator: 'gt', field: '', value: 0 }],\n })\n\n return (\n <div className=\"space-y-3\">\n <FormSelect\n label=\"Combinator\"\n value={value.combinator ?? 'and'}\n options={[{ value: 'and', label: 'All of (AND)' }, { value: 'or', label: 'Any of (OR)' }]}\n onValueChange={(combinator) =>\n onChange({ ...value, combinator: combinator as 'and' | 'or' })\n }\n />\n <div className=\"space-y-2\">\n {operands.map((child, index) => (\n <div key={index} className=\"relative rounded-lg border border-dashed border-slate-300 p-2 dark:border-slate-700\">\n <RuleConditionBuilder\n value={child}\n onChange={(next) => update(index, next)}\n depth={depth}\n />\n <div className=\"mt-2 text-right\">\n <Button type=\"button\" plain onClick={() => remove(index)}>Remove operand</Button>\n </div>\n </div>\n ))}\n <Button type=\"button\" outline onClick={add}>+ Add operand</Button>\n </div>\n </div>\n )\n}\n\n// ── Helpers ──\n\nfunction coerceScalar(raw: string): string | number | boolean {\n const trimmed = raw.trim()\n if (trimmed === 'true') return true\n if (trimmed === 'false') return false\n if (trimmed !== '' && !Number.isNaN(Number(trimmed))) return Number(trimmed)\n return raw\n}\n\nfunction clampHour(raw: string, max = 23): number {\n const n = Number(raw)\n if (!Number.isFinite(n)) return 0\n return Math.max(0, Math.min(max, Math.trunc(n)))\n}\n\nexport function defaultRuleCondition(): RuleCondition {\n return { operator: 'truthy', field: '' }\n}\n","import { FormInput, FormSelect } from '@ui/components/form-input'\nimport { Button } from '@ui/components/button'\nimport type { RuleAction } from './types'\n\ntype Props = {\n value: RuleAction\n onChange: (next: RuleAction) => void\n}\n\nconst ACTION_TYPE_OPTIONS: Array<{ value: string; label: string }> = [\n { value: 'adjust_price', label: 'Adjust price (multiplier)' },\n { value: 'enforce_min_margin', label: 'Enforce minimum margin' },\n { value: 'realign_to_competitor', label: 'Realign to competitor' },\n { value: 'request_manager_approval', label: 'Request manager approval' },\n { value: 'round_to', label: 'Round to step' },\n { value: 'alert', label: 'Emit alert' },\n { value: 'custom', label: 'Custom action' },\n]\n\n/**\n * Action builder — emits a single `{ type, params }` object matching the\n * executor contract. The `custom` type drops to a raw key/value editor for\n * actions the UI doesn't have a dedicated template for.\n */\nexport function RuleActionBuilder({ value, onChange }: Props) {\n const type = value.type || 'adjust_price'\n const params = value.params ?? {}\n\n const setParam = (key: string, newValue: unknown) => {\n onChange({ ...value, type, params: { ...params, [key]: newValue } })\n }\n\n return (\n <div className=\"space-y-3 rounded-xl border border-slate-200 bg-slate-50/60 p-3 dark:border-slate-700 dark:bg-slate-900/40\">\n <FormSelect\n label=\"Action type\"\n value={type}\n options={ACTION_TYPE_OPTIONS}\n onValueChange={(t) => onChange({ type: t, params: {} })}\n />\n\n {type === 'adjust_price' && (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <FormInput\n label=\"Multiplier\"\n type=\"number\"\n step={0.01}\n value={numberParam(params.multiplier, 1.0)}\n onValueChange={(raw) => setParam('multiplier', Number(raw))}\n />\n <FormInput\n label=\"Reason code\"\n value={stringParam(params.reason)}\n onValueChange={(raw) => setParam('reason', raw)}\n placeholder=\"peak_demand_window\"\n />\n </div>\n )}\n\n {type === 'enforce_min_margin' && (\n <FormInput\n label=\"Floor (fraction, e.g. 0.08)\"\n type=\"number\"\n step={0.01}\n value={numberParam(params.floor, 0.08)}\n onValueChange={(raw) => setParam('floor', Number(raw))}\n />\n )}\n\n {type === 'realign_to_competitor' && (\n <FormInput\n label=\"Tolerance (fraction)\"\n type=\"number\"\n step={0.01}\n value={numberParam(params.tolerance, 0.03)}\n onValueChange={(raw) => setParam('tolerance', Number(raw))}\n />\n )}\n\n {type === 'request_manager_approval' && (\n <FormInput\n label=\"Approval limit (fraction)\"\n type=\"number\"\n step={0.01}\n value={numberParam(params.limit, 0.05)}\n onValueChange={(raw) => setParam('limit', Number(raw))}\n />\n )}\n\n {type === 'round_to' && (\n <FormInput\n label=\"Step (e.g. 0.009)\"\n type=\"number\"\n step={0.001}\n value={numberParam(params.step, 0.009)}\n onValueChange={(raw) => setParam('step', Number(raw))}\n />\n )}\n\n {type === 'alert' && (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <FormInput\n label=\"Channel\"\n value={stringParam(params.channel)}\n onValueChange={(raw) => setParam('channel', raw)}\n placeholder=\"slack\"\n />\n <FormInput\n label=\"Severity\"\n value={stringParam(params.severity)}\n onValueChange={(raw) => setParam('severity', raw)}\n placeholder=\"warning\"\n />\n </div>\n )}\n\n {type === 'custom' && (\n <CustomParamsEditor params={params} onChange={(p) => onChange({ ...value, type, params: p })} />\n )}\n </div>\n )\n}\n\n// ── Custom params fallback — free-form key/value rows ──\n\nfunction CustomParamsEditor({\n params,\n onChange,\n}: {\n params: Record<string, unknown>\n onChange: (next: Record<string, unknown>) => void\n}) {\n const entries = Object.entries(params)\n\n const update = (index: number, key: string, raw: string) => {\n const next: Record<string, unknown> = {}\n entries.forEach(([k, v], i) => {\n if (i === index) next[key] = coerce(raw)\n else next[k] = v\n })\n onChange(next)\n }\n const remove = (index: number) => {\n const next: Record<string, unknown> = {}\n entries.forEach(([k, v], i) => { if (i !== index) next[k] = v })\n onChange(next)\n }\n const add = () => {\n onChange({ ...params, ['']: '' })\n }\n\n return (\n <div className=\"space-y-2\">\n {entries.map(([key, value], index) => (\n <div key={index} className=\"grid grid-cols-[1fr_1fr_auto] items-end gap-2\">\n <FormInput\n label=\"Key\"\n value={key}\n onValueChange={(raw) => update(index, raw, String(value ?? ''))}\n />\n <FormInput\n label=\"Value\"\n value={String(value ?? '')}\n onValueChange={(raw) => update(index, key, raw)}\n />\n <Button type=\"button\" plain onClick={() => remove(index)}>Remove</Button>\n </div>\n ))}\n <Button type=\"button\" outline onClick={add}>+ Add param</Button>\n </div>\n )\n}\n\nfunction numberParam(value: unknown, fallback: number): string {\n if (typeof value === 'number' && Number.isFinite(value)) return String(value)\n return String(fallback)\n}\n\nfunction stringParam(value: unknown): string {\n if (typeof value === 'string') return value\n if (value === null || value === undefined) return ''\n return String(value)\n}\n\nfunction coerce(raw: string): string | number | boolean {\n const trimmed = raw.trim()\n if (trimmed === 'true') return true\n if (trimmed === 'false') return false\n if (trimmed !== '' && !Number.isNaN(Number(trimmed))) return Number(trimmed)\n return raw\n}\n\nexport function defaultRuleAction(): RuleAction {\n return { type: 'adjust_price', params: { multiplier: 1.0, reason: '' } }\n}\n","import { useState } from 'react'\nimport { FormInput, FormSelect, FormTextarea } from '@ui/components/form-input'\nimport { FormGrid } from '@ui/components/form'\nimport { Button } from '@ui/components/button'\nimport { Badge } from '@ui/components/badge'\nimport { RuleConditionBuilder, defaultRuleCondition } from './condition-builder'\nimport { RuleActionBuilder, defaultRuleAction } from './action-builder'\nimport type { RuleAction, RuleCondition, RuleStatus } from './types'\nimport { RULE_STATUS_OPTIONS } from './types'\n\nexport type RuleFormValue = {\n ruleId?: string\n name: string\n description?: string\n enabled: boolean\n priority: number\n status?: RuleStatus\n validFrom?: string | null\n validUntil?: string | null\n tags?: string[]\n condition: RuleCondition\n action: RuleAction\n}\n\ntype Props = {\n value: RuleFormValue\n onChange: (next: RuleFormValue) => void\n}\n\n/**\n * Full-field rule editor used inside the create/edit modal. Composes the\n * visual condition + action builders and exposes the schedule / tagging /\n * lifecycle fields that the `agent_rules` entity has but the old JSON-\n * textarea form never surfaced.\n */\nexport function RuleForm({ value, onChange }: Props) {\n const [showAdvanced, setShowAdvanced] = useState<boolean>(\n Boolean(\n value.validFrom || value.validUntil || (value.tags && value.tags.length > 0) || value.status,\n ),\n )\n\n const update = <K extends keyof RuleFormValue>(key: K, v: RuleFormValue[K]) =>\n onChange({ ...value, [key]: v })\n\n return (\n <div className=\"space-y-5\">\n <FormGrid>\n <FormInput\n label=\"Name\"\n required\n value={value.name}\n onValueChange={(v) => update('name', v)}\n />\n <FormInput\n label=\"Priority\"\n type=\"number\"\n min={0}\n value={String(value.priority)}\n onValueChange={(v) => update('priority', Number(v) || 0)}\n />\n <FormSelect\n label=\"Enabled\"\n value={value.enabled ? 'true' : 'false'}\n options={[\n { value: 'true', label: 'Enabled' },\n { value: 'false', label: 'Disabled' },\n ]}\n onValueChange={(v) => update('enabled', v === 'true')}\n />\n <FormTextarea\n label=\"Description\"\n rows={2}\n value={value.description ?? ''}\n onValueChange={(v) => update('description', v)}\n />\n </FormGrid>\n\n <section>\n <div className=\"mb-2 flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold text-slate-700 dark:text-slate-200\">Condition</h3>\n <Badge color=\"indigo\">{value.condition.operator}</Badge>\n </div>\n <RuleConditionBuilder\n value={value.condition}\n onChange={(condition) => update('condition', condition)}\n />\n </section>\n\n <section>\n <div className=\"mb-2 flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold text-slate-700 dark:text-slate-200\">Action on match</h3>\n <Badge color=\"fuchsia\">{value.action.type}</Badge>\n </div>\n <RuleActionBuilder\n value={value.action}\n onChange={(action) => update('action', action)}\n />\n </section>\n\n <section>\n <button\n type=\"button\"\n onClick={() => setShowAdvanced((s) => !s)}\n className=\"text-xs font-medium text-indigo-600 hover:text-indigo-500 dark:text-indigo-400\"\n >\n {showAdvanced ? '− Hide schedule & tagging' : '+ Schedule, tagging, lifecycle'}\n </button>\n {showAdvanced && (\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <FormInput\n label=\"Valid from (ISO 8601)\"\n type=\"datetime-local\"\n value={toDatetimeLocal(value.validFrom)}\n onValueChange={(v) => update('validFrom', fromDatetimeLocal(v))}\n />\n <FormInput\n label=\"Valid until (ISO 8601)\"\n type=\"datetime-local\"\n value={toDatetimeLocal(value.validUntil)}\n onValueChange={(v) => update('validUntil', fromDatetimeLocal(v))}\n />\n <FormSelect\n label=\"Status\"\n value={value.status ?? 'active'}\n options={RULE_STATUS_OPTIONS.map((s) => ({ value: s, label: s }))}\n onValueChange={(v) => update('status', v as RuleStatus)}\n />\n <FormInput\n label=\"Tags (comma-separated)\"\n value={(value.tags ?? []).join(', ')}\n onValueChange={(v) => update('tags', parseTags(v))}\n placeholder=\"pricing, peak-hours\"\n />\n </div>\n )}\n </section>\n </div>\n )\n}\n\nexport function defaultRuleForm(): RuleFormValue {\n return {\n name: '',\n description: '',\n enabled: true,\n priority: 0,\n status: 'active',\n validFrom: null,\n validUntil: null,\n tags: [],\n condition: defaultRuleCondition(),\n action: defaultRuleAction(),\n }\n}\n\nfunction parseTags(raw: string): string[] {\n return raw\n .split(',')\n .map((tag) => tag.trim())\n .filter((tag) => tag.length > 0)\n}\n\nfunction toDatetimeLocal(iso: string | null | undefined): string {\n if (!iso) return ''\n try {\n const d = new Date(iso)\n if (Number.isNaN(d.getTime())) return ''\n const pad = (n: number) => String(n).padStart(2, '0')\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`\n } catch {\n return ''\n }\n}\n\nfunction fromDatetimeLocal(raw: string): string | null {\n if (!raw) return null\n const d = new Date(raw)\n if (Number.isNaN(d.getTime())) return null\n return d.toISOString()\n}\n\n// Re-export so consumers only need one import\nexport { RuleConditionBuilder } from './condition-builder'\nexport { RuleActionBuilder } from './action-builder'\nexport type { RuleCondition, RuleAction } from './types'\n","/**\n * Node Palette (Sidebar)\n * ======================\n * Draggable node templates for the workflow canvas.\n * Users drag items from here onto the React Flow canvas.\n *\n * Sections: Agents (indigo), Tools (teal), Rules (violet), Logic (subcategories)\n * Features: Collapsible sections, search/filter\n */\n\nimport { Children, useState, useMemo } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { ToggleSwitch } from '@ui/components/toggle-switch'\nimport {\n CpuChipIcon,\n WrenchScrewdriverIcon,\n CommandLineIcon,\n AdjustmentsHorizontalIcon,\n BoltIcon,\n ChevronDownIcon,\n PlusIcon,\n CircleStackIcon,\n ArrowPathRoundedSquareIcon,\n KeyIcon,\n} from '@heroicons/react/24/outline'\nimport type { WorkflowTool, AgentTool, AgentRule, WorkflowNodeType } from '../../contracts'\nimport type { AgentWithPrompts, WorkflowEntityDefinition } from '../../types'\nimport { LOGIC_ICON_MAP, LOGIC_NODE_GRADIENTS, EXPERIMENTAL_NODE_TYPES } from '../../constants/workflow-constants'\nimport { getEntityGradient, getEntityIcon } from '../../constants/entity-colors'\nimport { createDefaultLogicNodeConfig } from '../../utils/logic-node-defaults'\nimport { getAgentTier } from '../../utils/agent-tier'\nimport { getFrameworkMeta } from '../icons/agent-framework-icons'\n\n/* ─── Datasource logos (served from app public/) ─── */\n\nconst DATASOURCE_LOGOS: Record<string, string> = {\n bigquery: '/logos/datasources/bigquery.svg',\n postgres: '/logos/datasources/postgres.svg',\n snowflake: '/logos/datasources/snowflake.svg',\n mongodb: '/logos/datasources/mongodb.svg',\n redis: '/logos/datasources/redis.svg',\n mysql: '/logos/datasources/mysql.svg',\n clickhouse: '/logos/datasources/clickhouse.svg',\n elasticsearch: '/logos/datasources/elasticsearch.svg',\n duckdb: '/logos/datasources/duckdb.svg',\n sqlite: '/logos/datasources/sqlite.svg',\n mariadb: '/logos/datasources/mariadb.svg',\n oracle: '/logos/datasources/oracle.svg',\n mssql: '/logos/datasources/mssql.svg',\n sqlserver: '/logos/datasources/mssql.svg',\n cassandra: '/logos/datasources/cassandra.svg',\n dynamodb: '/logos/datasources/dynamodb.svg',\n cockroach: '/logos/datasources/cockroachdb.svg',\n supabase: '/logos/datasources/supabase.svg',\n firebase: '/logos/datasources/firebase.svg',\n neo4j: '/logos/datasources/neo4j.svg',\n}\n\nfunction getDatasourceLogo(entityId: string): string | null {\n const lower = entityId.toLowerCase()\n for (const [key, url] of Object.entries(DATASOURCE_LOGOS)) {\n if (lower.includes(key)) return url\n }\n return null\n}\n\nconst PROVIDER_LOGOS: Record<string, string> = {\n anthropic: '/logos/providers/anthropic.svg',\n amazon: '/logos/providers/aws.svg',\n google: '/logos/providers/google-gemini.svg',\n openai: '/logos/providers/openai.svg',\n meta: '/logos/providers/meta.svg',\n}\n\nexport type ModelProvider = {\n id: string\n name: string\n /** The provider's runtime SDK / endpoint family. Different from the\n * model families it CAN serve (see `servedFamilies`). E.g., a\n * Bedrock provider has `provider: 'amazon'` but\n * `servedFamilies: ['anthropic', 'amazon', 'meta', 'openai']`. */\n provider: string\n modelCount: number\n configured: boolean\n /** Which model families this provider can serve at run-time. Used\n * to compute the cartesian (model × provider) available to an\n * agent. Defaults to `[provider]` when omitted (i.e., direct API\n * providers that only serve their own family). */\n servedFamilies?: string[]\n /** Optional masked API key for display (`sk-prod-•••3742`). */\n apiKeyMasked?: string\n /** ARN/SSM path of the secret, displayed read-only. */\n credentialRef?: string\n /** ISO timestamp of last successful auth handshake. */\n lastVerifiedAt?: string\n}\n\ntype NodePaletteProps = {\n agents: AgentWithPrompts[]\n tools: WorkflowTool[]\n agentTools?: AgentTool[]\n rules: AgentRule[]\n entities?: WorkflowEntityDefinition[]\n modelProviders?: ModelProvider[]\n onCreateAgent?: () => void\n onCreateTool?: () => void\n onCreateAgentTool?: () => void\n onCreateRule?: () => void\n onCreateDatasource?: () => void\n onConfigureProvider?: (providerId: string) => void\n}\n\nfunction onDragStart(\n event: React.DragEvent,\n nodeType: WorkflowNodeType,\n entityId: string,\n label: string,\n config?: string\n) {\n event.dataTransfer.setData('nodeType', nodeType)\n event.dataTransfer.setData('entityId', entityId)\n event.dataTransfer.setData('label', label)\n if (config) {\n event.dataTransfer.setData('config', config)\n }\n event.dataTransfer.effectAllowed = 'move'\n}\n\n// ============================================================================\n// Logic Node Items — organized by subcategory\n// ============================================================================\n\ntype LogicNodeItem = {\n nodeType: WorkflowNodeType\n nameKey: string\n descriptionKey: string\n subcategory: 'control_flow' | 'data_processing' | 'ai_ml' | 'annotation' | 'output'\n}\n\nconst LOGIC_NODE_ITEMS: LogicNodeItem[] = [\n // Control Flow\n { nodeType: 'start', nameKey: 'startNode', descriptionKey: 'startNodeDescription', subcategory: 'control_flow' },\n { nodeType: 'end', nameKey: 'endNode', descriptionKey: 'endNodeDescription', subcategory: 'control_flow' },\n { nodeType: 'if_else', nameKey: 'ifElseNode', descriptionKey: 'ifElseNodeDescription', subcategory: 'control_flow' },\n { nodeType: 'iteration', nameKey: 'iterationNode', descriptionKey: 'iterationNodeDescription', subcategory: 'control_flow' },\n { nodeType: 'iteration_start', nameKey: 'iterationStartNode', descriptionKey: 'iterationStartNodeDescription', subcategory: 'control_flow' },\n { nodeType: 'group', nameKey: 'groupNode', descriptionKey: 'groupNodeDescription', subcategory: 'control_flow' },\n\n // Data Processing\n { nodeType: 'code', nameKey: 'codeNode', descriptionKey: 'codeNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'http_request', nameKey: 'httpRequestNode', descriptionKey: 'httpRequestNodeDescription', subcategory: 'data_processing' },\n { nodeType: 's3_write', nameKey: 's3WriteNode', descriptionKey: 's3WriteNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'template_transform', nameKey: 'templateTransformNode', descriptionKey: 'templateTransformNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'variable_assigner', nameKey: 'variableAssignerNode', descriptionKey: 'variableAssignerNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'variable_aggregator', nameKey: 'variableAggregatorNode', descriptionKey: 'variableAggregatorNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'list_operator', nameKey: 'listOperatorNode', descriptionKey: 'listOperatorNodeDescription', subcategory: 'data_processing' },\n // DocumentExtractor echoes its config today — pending a real\n // extractor implementation. Tagged via EXPERIMENTAL_NODE_TYPES.\n { nodeType: 'document_extractor', nameKey: 'documentExtractorNode', descriptionKey: 'documentExtractorNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'datasource', nameKey: 'datasourceNode', descriptionKey: 'datasourceNodeDescription', subcategory: 'data_processing' },\n\n // AI/ML\n // KnowledgeBase is a stub (no vector store wired yet). Tagged via EXPERIMENTAL_NODE_TYPES.\n { nodeType: 'knowledge_base', nameKey: 'knowledgeBaseNode', descriptionKey: 'knowledgeBaseNodeDescription', subcategory: 'ai_ml' },\n { nodeType: 'answer', nameKey: 'answerNode', descriptionKey: 'answerNodeDescription', subcategory: 'ai_ml' },\n { nodeType: 'question_classifier', nameKey: 'questionClassifierNode', descriptionKey: 'questionClassifierNodeDescription', subcategory: 'ai_ml' },\n { nodeType: 'parameter_extractor', nameKey: 'parameterExtractorNode', descriptionKey: 'parameterExtractorNodeDescription', subcategory: 'ai_ml' },\n { nodeType: 'audio_input', nameKey: 'audioInputNode', descriptionKey: 'audioInputNodeDescription', subcategory: 'ai_ml' },\n { nodeType: 'speech_transcriber', nameKey: 'speechTranscriberNode', descriptionKey: 'speechTranscriberNodeDescription', subcategory: 'ai_ml' },\n\n // Annotation\n { nodeType: 'note', nameKey: 'noteNode', descriptionKey: 'noteNodeDescription', subcategory: 'annotation' },\n\n // Output\n { nodeType: 'dashboard_output', nameKey: 'dashboardOutputNode', descriptionKey: 'dashboardOutputNodeDescription', subcategory: 'output' },\n]\n\nconst SUBCATEGORY_LABELS: Record<string, string> = {\n control_flow: 'controlFlowSection',\n data_processing: 'dataProcessingSection',\n ai_ml: 'aiMlSection',\n annotation: 'annotationSection',\n output: 'outputSection',\n}\n\ntype CollapsibleSectionProps = {\n title: string\n icon: React.ReactNode\n colorClass: string\n defaultOpen?: boolean\n count?: number\n onAdd?: () => void\n addLabel?: string\n children: React.ReactNode\n}\n\nfunction SectionHeader({ icon, title, colorClass, count, onAdd, addLabel, isOpen, onToggle }: {\n icon: React.ReactNode\n title: string\n colorClass: string\n count?: number\n onAdd?: () => void\n addLabel?: string\n isOpen: boolean\n onToggle: () => void\n}) {\n return (\n <div className=\"flex items-center justify-between px-4 py-2.5\">\n <button\n type=\"button\"\n onClick={onToggle}\n className=\"flex flex-1 items-center gap-1.5 transition-colors\"\n >\n <span className={`flex items-center gap-1.5 text-[10px] font-semibold uppercase tracking-wider ${colorClass}`}>\n {icon}\n {title}\n {count !== undefined && (\n <span className=\"ml-1 rounded-full bg-gray-100 px-1.5 py-px text-[9px] font-medium text-gray-500 dark:bg-white/10 dark:text-gray-400\">\n {count}\n </span>\n )}\n </span>\n <ChevronDownIcon\n className={`h-3 w-3 text-gray-400 transition-transform duration-200 ${isOpen ? '' : '-rotate-90'}`}\n />\n </button>\n {onAdd ? (\n <button\n type=\"button\"\n onClick={onAdd}\n title={addLabel}\n className={`rounded-md p-1 transition-colors hover:bg-gray-100 dark:hover:bg-white/10 ${colorClass}`}\n >\n <PlusIcon className=\"h-3.5 w-3.5\" />\n </button>\n ) : null}\n </div>\n )\n}\n\nfunction CollapsibleSection({ title, icon, colorClass, defaultOpen = true, count, onAdd, addLabel, children }: CollapsibleSectionProps) {\n const [isOpen, setIsOpen] = useState(defaultOpen)\n const safeChildren = Children.toArray(children)\n\n return (\n <div className=\"border-t border-gray-200/40 dark:border-white/5\">\n <SectionHeader\n icon={icon}\n title={title}\n colorClass={colorClass}\n count={count}\n onAdd={onAdd}\n addLabel={addLabel}\n isOpen={isOpen}\n onToggle={() => setIsOpen((previous) => !previous)}\n />\n {isOpen ? (\n <div className=\"space-y-1.5 px-4 pb-3\">\n {safeChildren}\n </div>\n ) : null}\n </div>\n )\n}\n\nfunction LogicNodeItemCard({ item, translationFunction }: { item: LogicNodeItem; translationFunction: ReturnType<typeof useTranslations> }) {\n const IconComponent = LOGIC_ICON_MAP[item.nodeType]\n const gradient = LOGIC_NODE_GRADIENTS[item.nodeType] ?? 'from-gray-400 to-gray-500'\n const defaultConfig = createDefaultLogicNodeConfig(item.nodeType)\n const configJson = defaultConfig ? JSON.stringify(defaultConfig) : undefined\n\n return (\n <div\n draggable\n onDragStart={(event) =>\n onDragStart(event, item.nodeType, item.nodeType, translationFunction(item.nameKey), configJson)\n }\n className=\"liquid-surface group flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n >\n <div className={`flex h-6 w-6 items-center justify-center rounded-md bg-gradient-to-br ${gradient} shadow-sm`}>\n {IconComponent && <IconComponent className=\"h-3.5 w-3.5 text-white\" />}\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {translationFunction(item.nameKey)}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {translationFunction(item.descriptionKey)}\n </p>\n </div>\n </div>\n )\n}\n\nexport function NodePalette({ agents, tools, agentTools = [], rules, entities = [], modelProviders = [], onCreateAgent, onCreateTool, onCreateAgentTool, onCreateRule, onCreateDatasource, onConfigureProvider }: NodePaletteProps) {\n const t = useTranslations('agents.workflow')\n const [searchQuery, setSearchQuery] = useState('')\n\n const normalizedQuery = searchQuery.toLowerCase().trim()\n\n const filteredAgents = useMemo(\n () => normalizedQuery\n ? agents.filter((agent) =>\n agent.name.toLowerCase().includes(normalizedQuery) ||\n (agent.role ?? '').toLowerCase().includes(normalizedQuery)\n )\n : agents,\n [agents, normalizedQuery]\n )\n\n const filteredTools = useMemo(\n () => normalizedQuery\n ? tools.filter((tool) =>\n tool.name.toLowerCase().includes(normalizedQuery) ||\n (tool.category ?? '').toLowerCase().includes(normalizedQuery)\n )\n : tools,\n [tools, normalizedQuery]\n )\n\n const filteredAgentTools = useMemo(\n () => normalizedQuery\n ? agentTools.filter((agentTool) =>\n agentTool.name.toLowerCase().includes(normalizedQuery) ||\n (agentTool.category ?? '').toLowerCase().includes(normalizedQuery)\n )\n : agentTools,\n [agentTools, normalizedQuery]\n )\n\n const filteredRules = useMemo(\n () => normalizedQuery\n ? rules.filter((rule) =>\n rule.name.toLowerCase().includes(normalizedQuery)\n )\n : rules,\n [rules, normalizedQuery]\n )\n\n const filteredProviders = useMemo(\n () => normalizedQuery\n ? modelProviders.filter((provider) =>\n provider.name.toLowerCase().includes(normalizedQuery) ||\n provider.provider.toLowerCase().includes(normalizedQuery)\n )\n : modelProviders,\n [modelProviders, normalizedQuery]\n )\n\n const entityTypes = useMemo(\n () => entities.map((entity) => ({\n id: entity.id,\n label: entity.label,\n description: entity.description,\n fieldCount: entity.fields.length,\n defaultLimit: entity.defaultLimit,\n fields: entity.fields,\n })),\n [entities]\n )\n\n const filteredEntityTypes = useMemo(\n () => normalizedQuery\n ? entityTypes.filter((entity) =>\n entity.label.toLowerCase().includes(normalizedQuery) ||\n entity.description.toLowerCase().includes(normalizedQuery) ||\n entity.id.toLowerCase().includes(normalizedQuery)\n )\n : entityTypes,\n [entityTypes, normalizedQuery]\n )\n\n const filteredLogicItems = useMemo(() => {\n // Experimental nodes (stub executors like `knowledge_base`, `document_extractor`)\n // are always hidden from the palette — opt-in is per-node via the node's\n // config modal rather than via a global palette toggle. Source of truth:\n // EXPERIMENTAL_NODE_TYPES in workflow-constants.\n const visibleByDefault = LOGIC_NODE_ITEMS.filter((item) => !EXPERIMENTAL_NODE_TYPES.has(item.nodeType))\n if (!normalizedQuery) return visibleByDefault\n return visibleByDefault.filter((item) =>\n t(item.nameKey).toLowerCase().includes(normalizedQuery) ||\n t(item.descriptionKey).toLowerCase().includes(normalizedQuery),\n )\n }, [normalizedQuery, t])\n\n // Group filtered logic items by subcategory\n const groupedLogicItems = useMemo(() => {\n const groups: Record<string, LogicNodeItem[]> = {\n control_flow: [],\n data_processing: [],\n ai_ml: [],\n annotation: [],\n output: [],\n }\n for (const item of filteredLogicItems) {\n groups[item.subcategory].push(item)\n }\n return groups\n }, [filteredLogicItems])\n\n function renderLogicSubcategory(subcategory: string, items: LogicNodeItem[], isFirst: boolean) {\n if (items.length === 0) return null\n return (\n <div key={subcategory} className=\"space-y-1.5\">\n <p className={`${isFirst ? 'mt-1' : 'mt-2'} text-[9px] font-semibold uppercase tracking-wider text-gray-400 dark:text-gray-500`}>\n {t(SUBCATEGORY_LABELS[subcategory])}\n </p>\n {items.map((item) => (\n <LogicNodeItemCard key={item.nodeType} item={item} translationFunction={t} />\n ))}\n </div>\n )\n }\n\n return (\n <div className=\"liquid-surface w-[260px] flex-shrink-0 overflow-y-auto rounded-none border-0 border-r border-gray-200/30 dark:border-white/5\">\n <div className=\"p-4 pb-2\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {t('palette')}\n </h3>\n {/* Search input */}\n <div className=\"mt-2\">\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(event) => setSearchQuery(event.target.value)}\n placeholder={t('searchPalette')}\n className=\"liquid-surface w-full rounded-lg px-2.5 py-1.5 text-[11px] text-gray-900 placeholder-gray-400 outline-none transition-colors focus:ring-1 focus:ring-indigo-300/40 dark:text-white dark:placeholder-gray-500 dark:focus:ring-indigo-500/20\"\n />\n </div>\n </div>\n\n {/* Agents + Agent Tools Section (combined) */}\n <CollapsibleSection\n title={t('agentsSection')}\n icon={<CpuChipIcon className=\"h-3 w-3\" />}\n colorClass=\"text-indigo-600 dark:text-indigo-400\"\n onAdd={onCreateAgent}\n addLabel={t('newAgent')}\n count={filteredAgents.length}\n >\n {filteredAgents.length === 0 && filteredAgentTools.length === 0 && filteredProviders.length === 0 ? (\n <p className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('noAgents')}</p>\n ) : (\n <>\n {filteredAgents.map((agent) => (\n <div\n key={agent.agentId}\n draggable\n onDragStart={(event) =>\n onDragStart(event, 'agent', agent.agentId, agent.name)\n }\n className=\"liquid-surface group flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n >\n <div className=\"relative flex-shrink-0\">\n {agent.avatar ? (\n <img src={agent.avatar as string} alt={agent.name} className=\"h-7 w-7 rounded-full bg-white shadow-sm ring-1 ring-gray-200/50 dark:bg-gray-800 dark:ring-white/10\" />\n ) : (\n <div className=\"flex h-7 w-7 items-center justify-center rounded-full bg-gradient-to-br from-indigo-400 to-purple-500 shadow-sm\">\n <CpuChipIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n )}\n <div className=\"absolute -bottom-0.5 -right-0.5 flex h-3.5 w-3.5 items-center justify-center rounded-full bg-indigo-500 ring-1.5 ring-white dark:ring-gray-900\">\n <CpuChipIcon className=\"h-2 w-2 text-white\" />\n </div>\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1.5\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {agent.name}\n </p>\n {(() => {\n const tier = getAgentTier(Number((agent as Record<string, unknown>).elo ?? 0))\n return (\n <span className={`shrink-0 rounded-full px-1.5 py-px text-[8px] font-bold ${tier.pillColor}`}>\n {t(`agentDrawer.tier${tier.key.charAt(0).toUpperCase()}${tier.key.slice(1)}`)}\n </span>\n )\n })()}\n </div>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {agent.role ?? agent.agentId}\n </p>\n </div>\n </div>\n ))}\n\n {/* Model provider connections — folded into the Agents\n section because agents *consume* providers. Rendered\n as a sub-group with a thin divider + sub-label so they\n read as \"connections this agent group can use\". */}\n {filteredProviders.length > 0 && (\n <div className=\"mt-2 border-t border-gray-200/40 pt-2 dark:border-white/5\">\n <p className=\"mb-1.5 px-1 text-[9px] font-semibold uppercase tracking-wider text-slate-500 dark:text-slate-400\">\n {t('connectionsSection')}\n </p>\n {filteredProviders.map((provider) => {\n const providerLogo = PROVIDER_LOGOS[provider.provider]\n return (\n <div\n key={provider.id}\n draggable\n onDragStart={(event) => {\n const defaultConfig = JSON.stringify({\n type: 'model_provider',\n providerType: provider.provider === 'amazon' ? 'aws_bedrock' : provider.provider === 'google' ? 'google_vertex' : provider.provider === 'meta' ? 'custom' : `${provider.provider}_api`,\n name: provider.name,\n modelFilter: [],\n })\n onDragStart(event, 'model_provider', provider.id, provider.name, defaultConfig)\n }}\n onClick={() => onConfigureProvider?.(provider.id)}\n className=\"liquid-surface group mb-1 flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n role=\"button\"\n tabIndex={0}\n >\n {providerLogo ? (\n <div className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-md bg-white/10 p-1\">\n <img src={providerLogo} alt=\"\" className=\"h-4 w-4 object-contain\" loading=\"lazy\" />\n </div>\n ) : (\n <div className=\"flex h-6 w-6 items-center justify-center rounded-md bg-gradient-to-br from-rose-400 to-pink-500 shadow-sm\">\n <KeyIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {provider.name}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {provider.modelCount} models\n </p>\n </div>\n {provider.configured ? (\n <span className=\"rounded-full bg-green-100 px-1.5 py-0.5 text-[9px] font-medium text-green-600 dark:bg-green-500/10 dark:text-green-400\">\n {t('configured')}\n </span>\n ) : (\n <span className=\"rounded-full bg-amber-100 px-1.5 py-0.5 text-[9px] font-medium text-amber-600 dark:bg-amber-500/10 dark:text-amber-400\">\n {t('setup')}\n </span>\n )}\n </div>\n )\n })}\n </div>\n )}\n </>\n )}\n </CollapsibleSection>\n\n {/* Subworkflows Section (formerly Tools) */}\n <CollapsibleSection\n title={t('subworkflowsSection')}\n icon={<ArrowPathRoundedSquareIcon className=\"h-3 w-3\" />}\n colorClass=\"text-teal-600 dark:text-teal-400\"\n onAdd={onCreateTool}\n addLabel={t('newSubworkflow')}\n >\n {filteredTools.length === 0 ? (\n <p className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('noSubworkflows')}</p>\n ) : filteredTools.map((tool) => (\n <div\n key={tool.toolId}\n draggable\n onDragStart={(event) =>\n onDragStart(event, 'tool', tool.toolId, tool.name)\n }\n className=\"liquid-surface group flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n >\n <div className=\"flex h-6 w-6 items-center justify-center rounded-md bg-gradient-to-br from-teal-400 to-emerald-500 shadow-sm\">\n <ArrowPathRoundedSquareIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {tool.name}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {tool.category}\n </p>\n </div>\n <ToggleSwitch\n checked={Boolean(tool.enabled)}\n onChange={() => {}}\n disabled\n size=\"sm\"\n color=\"blue\"\n label={`${tool.name} enabled`}\n />\n </div>\n ))}\n </CollapsibleSection>\n\n {/* Rules Section */}\n <CollapsibleSection\n title={t('rulesSection')}\n icon={<AdjustmentsHorizontalIcon className=\"h-3 w-3\" />}\n colorClass=\"text-violet-600 dark:text-violet-400\"\n onAdd={onCreateRule}\n addLabel={t('newRule')}\n >\n {filteredRules.length === 0 ? (\n <p className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('noRules')}</p>\n ) : filteredRules.map((rule) => (\n <div\n key={rule.ruleId}\n draggable\n onDragStart={(event) =>\n onDragStart(event, 'rule', rule.ruleId, rule.name)\n }\n className=\"liquid-surface group flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n >\n <div className=\"flex h-6 w-6 items-center justify-center rounded-md bg-gradient-to-br from-violet-400 to-purple-500 shadow-sm\">\n <AdjustmentsHorizontalIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {rule.name}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n P{String(rule.priority ?? '')}\n </p>\n </div>\n <ToggleSwitch\n checked={Boolean(rule.enabled)}\n onChange={() => {}}\n disabled\n size=\"sm\"\n color=\"violet\"\n label={`${rule.name} enabled`}\n />\n </div>\n ))}\n </CollapsibleSection>\n\n {/* Data Sources Section */}\n <CollapsibleSection\n title={t('dataSourcesSection')}\n icon={<CircleStackIcon className=\"h-3 w-3\" />}\n colorClass=\"text-blue-600 dark:text-blue-400\"\n count={filteredEntityTypes.length}\n onAdd={onCreateDatasource}\n addLabel={t('newDataSource')}\n >\n {filteredEntityTypes.length === 0 ? (\n <p className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('noDataSources')}</p>\n ) : filteredEntityTypes.map((entity) => {\n const defaultConfig = JSON.stringify({\n type: 'entity',\n entityMasterId: entity.id,\n selectedFields: entity.fields.map((field) => field.name),\n filterVariables: {},\n outputVariable: `${entity.label.replace(/\\s+/g, '')}Data`,\n limit: entity.defaultLimit,\n })\n const dsLogo = getDatasourceLogo(entity.id)\n const EntityIcon = getEntityIcon(entity.id)\n const entityGradient = getEntityGradient(entity.id)\n\n return (\n <div\n key={entity.id}\n draggable\n onDragStart={(event) =>\n onDragStart(event, 'entity', entity.id, entity.label, defaultConfig)\n }\n className=\"liquid-surface group flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n >\n {dsLogo ? (\n <div className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-md bg-white/10 p-1\">\n <img src={dsLogo} alt=\"\" className=\"h-4 w-4 object-contain\" loading=\"lazy\" />\n </div>\n ) : (\n <div className={`flex h-6 w-6 items-center justify-center rounded-md bg-gradient-to-br ${entityGradient} shadow-sm`}>\n <EntityIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {entity.label}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {entity.fieldCount} {t('entityFieldsLabel')}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"rounded-full bg-slate-100 px-1.5 py-0.5 text-[9px] font-medium text-slate-600 dark:bg-white/10 dark:text-slate-300\">\n Read only\n </span>\n <ToggleSwitch\n checked\n onChange={() => {}}\n disabled\n size=\"sm\"\n color=\"teal\"\n label={`${entity.label} read only`}\n />\n </div>\n </div>\n )\n })}\n </CollapsibleSection>\n\n {/* Logic Section — with subcategories */}\n <CollapsibleSection\n title={t('logicSection')}\n icon={<BoltIcon className=\"h-3 w-3\" />}\n colorClass=\"text-gray-600 dark:text-gray-400\"\n count={filteredLogicItems.length}\n >\n {renderLogicSubcategory('control_flow', groupedLogicItems.control_flow, true)}\n {renderLogicSubcategory('data_processing', groupedLogicItems.data_processing, false)}\n {renderLogicSubcategory('ai_ml', groupedLogicItems.ai_ml, false)}\n {renderLogicSubcategory('output', groupedLogicItems.output, false)}\n {renderLogicSubcategory('annotation', groupedLogicItems.annotation, false)}\n </CollapsibleSection>\n </div>\n )\n}\n","/**\n * Workflow List Bar\n * =================\n *\n * Horizontal tab bar above the workflow canvas showing all workflows.\n * Allows switching active workflow, creating new ones, deleting,\n * and converting a workflow into a reusable subworkflow.\n */\n\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { PlusIcon, TrashIcon, ArrowPathRoundedSquareIcon } from '@heroicons/react/24/outline'\nimport type { Workflow } from '../../contracts'\n\ntype WorkflowListBarProps = {\n workflows: Workflow[]\n activeWorkflowId: string | null\n isLoading: boolean\n onSelect: (workflow: Workflow) => void\n onCreate: () => void\n onDelete: (workflowId: string, workflowName: string) => void\n onConvertToSubworkflow?: (workflow: Workflow) => void\n}\n\nfunction formatRelativeTime(dateString: string | undefined): string {\n if (!dateString) return ''\n const date = new Date(dateString)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffMinutes = Math.floor(diffMs / 60_000)\n const diffHours = Math.floor(diffMs / 3_600_000)\n const diffDays = Math.floor(diffMs / 86_400_000)\n\n if (diffMinutes < 1) return 'just now'\n if (diffMinutes < 60) return `${diffMinutes}m ago`\n if (diffHours < 24) return `${diffHours}h ago`\n return `${diffDays}d ago`\n}\n\nexport function WorkflowListBar({\n workflows,\n activeWorkflowId,\n isLoading,\n onSelect,\n onCreate,\n onDelete,\n onConvertToSubworkflow,\n}: WorkflowListBarProps) {\n const tWorkflow = useTranslations('agents.workflow')\n\n if (isLoading) {\n return (\n <div className=\"flex items-center gap-2 px-1 pb-3\">\n <div className=\"shimmer h-10 w-40 rounded-xl\" />\n <div className=\"shimmer h-10 w-40 rounded-xl\" />\n </div>\n )\n }\n\n return (\n <div className=\"flex items-center gap-2 overflow-x-auto px-1 pb-3 scrollbar-hide\">\n {workflows.map((workflow) => {\n const isActive = workflow.id === activeWorkflowId\n return (\n <div\n key={workflow.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => onSelect(workflow)}\n onKeyDown={(event) => { if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); onSelect(workflow) } }}\n className={`liquid-surface group relative flex shrink-0 cursor-pointer items-center gap-2.5 rounded-xl px-3.5 py-2 text-left transition-all duration-200 ${\n isActive\n ? 'liquid-surface-active'\n : 'hover:shadow-md'\n }`}\n style={isActive ? { '--glass-accent': '99, 102, 241' } as React.CSSProperties : undefined}\n >\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className={`truncate text-sm font-medium ${\n isActive\n ? 'text-indigo-700 dark:text-indigo-300'\n : 'text-gray-700 dark:text-gray-300'\n }`}>\n {workflow.name}\n </span>\n <span className=\"shrink-0 rounded-full bg-gray-100 px-1.5 py-0.5 text-[10px] font-medium text-gray-500 dark:bg-gray-800 dark:text-gray-400\">\n v{workflow.version}\n </span>\n {workflow.isDraft ? (\n <span className=\"shrink-0 rounded-full bg-amber-100 px-1.5 py-0.5 text-[10px] font-semibold text-amber-700 dark:bg-amber-900/30 dark:text-amber-300\">\n {tWorkflow('draftBadge')}\n </span>\n ) : (\n <span className=\"shrink-0 rounded-full bg-green-100 px-1.5 py-0.5 text-[10px] font-semibold text-green-700 dark:bg-green-900/30 dark:text-green-300\">\n {tWorkflow('published')}\n </span>\n )}\n </div>\n <p className=\"mt-0.5 text-[10px] text-gray-400 dark:text-gray-500\">\n {workflow.updatedAt ? formatRelativeTime(typeof workflow.updatedAt === 'string' ? workflow.updatedAt : workflow.updatedAt.toISOString()) : ''}\n </p>\n </div>\n\n {/* Action buttons — visible on hover */}\n <div className=\"flex shrink-0 items-center gap-0.5 opacity-0 transition-opacity group-hover:opacity-100\">\n {/* Convert to subworkflow */}\n {onConvertToSubworkflow && (\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation()\n onConvertToSubworkflow(workflow)\n }}\n className=\"rounded-md p-1 text-gray-400 transition-colors hover:bg-teal-50 hover:text-teal-600 dark:hover:bg-teal-950/30 dark:hover:text-teal-400\"\n aria-label={`${tWorkflow('convertToSubworkflow')} ${workflow.name}`}\n title={tWorkflow('convertToSubworkflow')}\n >\n <ArrowPathRoundedSquareIcon className=\"h-3.5 w-3.5\" />\n </button>\n )}\n\n {/* Delete */}\n {workflows.length > 1 && (\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation()\n onDelete(workflow.id, workflow.name)\n }}\n className=\"rounded-md p-1 text-gray-400 transition-colors hover:bg-red-50 hover:text-red-500 dark:hover:bg-red-950/30 dark:hover:text-red-400\"\n aria-label={`${tWorkflow('deleteWorkflow')} ${workflow.name}`}\n >\n <TrashIcon className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n </div>\n )\n })}\n\n {/* Create new workflow button */}\n <button\n type=\"button\"\n onClick={onCreate}\n className=\"liquid-surface flex shrink-0 items-center gap-1.5 rounded-xl !border-dashed px-3 py-2 text-xs font-medium text-gray-500 transition-all hover:shadow-md hover:text-indigo-600 dark:text-gray-400 dark:hover:text-indigo-400\"\n >\n <PlusIcon className=\"h-3.5 w-3.5\" />\n {tWorkflow('newWorkflow')}\n </button>\n </div>\n )\n}\n","/**\n * Version History Panel\n * =====================\n * Side panel listing published versions of a workflow.\n * Shows version number, publication timestamp, publisher,\n * and node/edge counts. Provides preview (read-only overlay)\n * and restore (revert draft) actions per version.\n */\n\nimport { useState, useEffect, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { ClockIcon, ArrowPathIcon, EyeIcon, XMarkIcon } from '@heroicons/react/24/outline'\nimport { Badge } from '@ui/components/badge'\n\ntype WorkflowVersion = {\n version: number\n publishedAt: string\n publishedBy: string\n nodeCount: number\n edgeCount: number\n}\n\ntype VersionHistoryPanelProps = {\n open: boolean\n onClose: () => void\n workflowId: string\n currentVersion: number\n onPreview: (version: WorkflowVersion) => void\n onRestore: (version: WorkflowVersion) => void\n fetchVersions?: (workflowId: string) => Promise<WorkflowVersion[]>\n}\n\nexport function VersionHistoryPanel({\n open,\n onClose,\n workflowId,\n currentVersion,\n onPreview,\n onRestore,\n fetchVersions,\n}: VersionHistoryPanelProps) {\n const translations = useTranslations('agents.workflow.versionHistory')\n const [versions, setVersions] = useState<WorkflowVersion[]>([])\n const [isLoading, setIsLoading] = useState(false)\n const [loadError, setLoadError] = useState<string | null>(null)\n\n const loadVersions = useCallback(async () => {\n if (!fetchVersions) return\n\n setIsLoading(true)\n setLoadError(null)\n\n try {\n const fetchedVersions = await fetchVersions(workflowId)\n setVersions(fetchedVersions)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to load versions'\n setLoadError(errorMessage)\n } finally {\n setIsLoading(false)\n }\n }, [fetchVersions, workflowId])\n\n useEffect(() => {\n if (open) {\n loadVersions()\n }\n }, [open, loadVersions])\n\n const formatTimestamp = useCallback((timestamp: string) => {\n try {\n const date = new Date(timestamp)\n return new Intl.DateTimeFormat(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n }).format(date)\n } catch {\n return timestamp\n }\n }, [])\n\n if (!open) return null\n\n return (\n <div\n className=\"absolute right-0 top-0 z-40 flex h-full w-80 flex-col border-l border-gray-200 bg-white shadow-xl dark:border-gray-700 dark:bg-gray-900\"\n data-testid=\"version-history-panel\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-gray-200 px-4 py-3 dark:border-gray-700\">\n <div className=\"flex items-center gap-2\">\n <ClockIcon className=\"h-5 w-5 text-gray-500 dark:text-gray-400\" />\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">\n {translations('title')}\n </h3>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg p-1 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-800 dark:hover:text-gray-300\"\n data-testid=\"version-history-close\"\n >\n <XMarkIcon className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* Version List */}\n <div className=\"flex-1 overflow-y-auto\">\n {isLoading && (\n <div className=\"flex items-center justify-center py-12\" data-testid=\"version-history-loading\">\n <div className=\"h-6 w-6 animate-spin motion-reduce:animate-none rounded-full border-2 border-blue-500 border-t-transparent\" />\n </div>\n )}\n\n {loadError && (\n <div className=\"px-4 py-8 text-center\" data-testid=\"version-history-error\">\n <p className=\"text-sm text-red-500 dark:text-red-400\">{loadError}</p>\n <button\n type=\"button\"\n onClick={loadVersions}\n className=\"mt-2 text-xs text-blue-600 hover:underline dark:text-blue-400\"\n >\n {translations('retry')}\n </button>\n </div>\n )}\n\n {!isLoading && !loadError && versions.length === 0 && (\n <div className=\"px-4 py-12 text-center\" data-testid=\"version-history-empty\">\n <ClockIcon className=\"mx-auto h-8 w-8 text-gray-300 dark:text-gray-600\" />\n <p className=\"mt-2 text-sm text-gray-500 dark:text-gray-400\">\n {translations('noVersions')}\n </p>\n </div>\n )}\n\n {!isLoading && !loadError && versions.length > 0 && (\n <div className=\"divide-y divide-gray-100 dark:divide-gray-800\">\n {versions.map((version) => {\n const isCurrentVersion = version.version === currentVersion\n return (\n <div\n key={version.version}\n className={`px-4 py-3 transition-colors ${\n isCurrentVersion\n ? 'bg-blue-50 dark:bg-blue-500/10'\n : 'hover:bg-gray-50 dark:hover:bg-gray-800/50'\n }`}\n data-testid={`version-entry-${version.version}`}\n >\n {/* Version Header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-gray-900 dark:text-white\">\n v{version.version}\n </span>\n {isCurrentVersion && (\n <Badge color=\"blue\" size=\"xs\">{translations('current')}</Badge>\n )}\n </div>\n </div>\n\n {/* Metadata */}\n <div className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">\n <div>{formatTimestamp(version.publishedAt)}</div>\n <div className=\"mt-0.5\">\n {translations('publishedBy')}: {version.publishedBy}\n </div>\n <div className=\"mt-0.5\">\n {version.nodeCount} {translations('nodes')} / {version.edgeCount} {translations('edges')}\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"mt-2 flex gap-2\">\n <button\n type=\"button\"\n onClick={() => onPreview(version)}\n className=\"inline-flex items-center gap-1 rounded-md border border-gray-300 px-2 py-1 text-xs font-medium text-gray-600 transition-colors hover:bg-gray-100 dark:border-gray-600 dark:text-gray-400 dark:hover:bg-gray-700\"\n data-testid={`version-preview-${version.version}`}\n >\n <EyeIcon className=\"h-3 w-3\" />\n {translations('preview')}\n </button>\n {!isCurrentVersion && (\n <button\n type=\"button\"\n onClick={() => onRestore(version)}\n className=\"inline-flex items-center gap-1 rounded-md border border-blue-300 px-2 py-1 text-xs font-medium text-blue-600 transition-colors hover:bg-blue-50 dark:border-blue-600 dark:text-blue-400 dark:hover:bg-blue-500/10\"\n data-testid={`version-restore-${version.version}`}\n >\n <ArrowPathIcon className=\"h-3 w-3\" />\n {translations('restore')}\n </button>\n )}\n </div>\n </div>\n )\n })}\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport type { WorkflowVersion }\n","/**\n * Run Panel\n * =========\n * Bottom panel showing workflow execution progress.\n * Displays each node with a status icon (pending, running,\n * success, error), duration, and error messages.\n * Provides Run/Stop controls tied to the workflow store.\n */\n\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n PlayIcon,\n StopIcon,\n CheckCircleIcon,\n XCircleIcon,\n ClockIcon,\n XMarkIcon,\n ChevronUpIcon,\n} from '@heroicons/react/24/outline'\nimport { useWorkflowStore } from '../../store/workflow-store'\nimport type { StartNodeConfig } from '../../contracts'\n\ntype RunPanelProps = {\n open: boolean\n onClose: () => void\n onRun: () => void\n onStop: () => void\n}\n\nconst STATUS_CONFIG = {\n pending: {\n icon: ClockIcon,\n color: 'text-gray-400 dark:text-gray-500',\n background: 'bg-gray-100 dark:bg-gray-800',\n label: 'pending',\n },\n running: {\n icon: SpinnerIcon,\n color: 'text-blue-500 dark:text-blue-400',\n background: 'bg-blue-50 dark:bg-blue-500/10',\n label: 'running',\n },\n success: {\n icon: CheckCircleIcon,\n color: 'text-green-500 dark:text-green-400',\n background: 'bg-green-50 dark:bg-green-500/10',\n label: 'success',\n },\n error: {\n icon: XCircleIcon,\n color: 'text-red-500 dark:text-red-400',\n background: 'bg-red-50 dark:bg-red-500/10',\n label: 'error',\n },\n} as const\n\nfunction formatDuration(durationMs: number): string {\n if (durationMs < 1000) {\n return `${durationMs}ms`\n }\n const seconds = (durationMs / 1000).toFixed(1)\n return `${seconds}s`\n}\n\nexport function RunPanel({ open, onClose, onRun, onStop }: RunPanelProps) {\n const translations = useTranslations('agents.workflow.runPanel')\n const nodes = useWorkflowStore((state) => state.nodes)\n const isRunning = useWorkflowStore((state) => state.isRunning)\n const nodeResults = useWorkflowStore((state) => state.nodeResults)\n const startNode = nodes.find((node) => node.type === 'start')\n const hasEndNode = nodes.some((node) => node.type === 'end')\n const hasValidStartConfig = Boolean(\n startNode &&\n typeof startNode.data === 'object' &&\n startNode.data !== null &&\n 'config' in startNode.data &&\n startNode.data.config &&\n typeof (startNode.data.config as StartNodeConfig).type === 'string'\n )\n const canRun = hasValidStartConfig && hasEndNode\n\n if (!open) return null\n\n const executionNodes = nodes.filter((node) => node.type !== 'note')\n\n return (\n <div\n className=\"absolute bottom-0 left-0 right-0 z-40 border-t border-gray-200 bg-white shadow-xl dark:border-gray-700 dark:bg-gray-900\"\n data-testid=\"run-panel\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-gray-100 px-4 py-2 dark:border-gray-800\">\n <div className=\"flex items-center gap-2\">\n <PlayIcon className=\"h-4 w-4 text-gray-500 dark:text-gray-400\" />\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">\n {translations('title')}\n </h3>\n {isRunning && (\n <span\n role=\"status\"\n aria-live=\"polite\"\n className=\"flex items-center gap-1 rounded-full bg-blue-100 px-2 py-0.5 text-[11px] font-medium text-blue-800 dark:bg-blue-500/20 dark:text-blue-200\"\n >\n <span\n aria-hidden=\"true\"\n className=\"h-1.5 w-1.5 motion-safe:animate-pulse rounded-full bg-blue-500\"\n />\n {translations('executing')}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {/* Run / Stop Buttons */}\n {isRunning ? (\n <button\n type=\"button\"\n onClick={onStop}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-red-500 px-3 py-1.5 text-xs font-medium text-white transition-colors hover:bg-red-600\"\n data-testid=\"run-panel-stop\"\n >\n <StopIcon className=\"h-3.5 w-3.5\" />\n {translations('stop')}\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={onRun}\n disabled={!canRun}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-green-500 px-3 py-1.5 text-xs font-medium text-white transition-colors hover:bg-green-600 disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:bg-green-500\"\n data-testid=\"run-panel-run\"\n >\n <PlayIcon className=\"h-3.5 w-3.5\" />\n {translations('run')}\n </button>\n )}\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg p-1 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-800 dark:hover:text-gray-300\"\n data-testid=\"run-panel-close\"\n >\n <XMarkIcon className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n\n {/* Node Execution List */}\n <div className=\"max-h-48 overflow-y-auto px-4 py-2\">\n {executionNodes.length === 0 ? (\n <div className=\"py-4 text-center text-sm text-gray-500 dark:text-gray-400\">\n {translations('noNodes')}\n </div>\n ) : (\n <div className=\"space-y-1\">\n {executionNodes.map((node) => {\n const result = nodeResults[node.id]\n const status = result?.status ?? 'pending'\n const statusConfig = STATUS_CONFIG[status]\n const StatusIconComponent = statusConfig.icon\n const nodeLabel =\n typeof node.data === 'object' && node.data !== null && 'label' in node.data\n ? String(node.data.label)\n : node.id\n\n return (\n <div\n key={node.id}\n className={`flex items-center gap-3 rounded-lg px-3 py-2 ${statusConfig.background}`}\n data-testid={`run-node-${node.id}`}\n >\n {/* Status Icon */}\n <StatusIconComponent className={`h-4 w-4 flex-shrink-0 ${statusConfig.color}`} />\n\n {/* Node Info */}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm font-medium text-gray-900 dark:text-white\">\n {nodeLabel}\n </span>\n <span className=\"rounded bg-gray-200 px-1.5 py-0.5 text-[10px] text-gray-500 dark:bg-gray-700 dark:text-gray-400\">\n {node.type}\n </span>\n </div>\n {result?.error && (\n <p className=\"mt-0.5 truncate text-xs text-red-500 dark:text-red-400\">\n {result.error}\n </p>\n )}\n </div>\n\n {/* Duration */}\n {result?.durationMs !== undefined && (\n <span className=\"flex-shrink-0 text-xs text-gray-500 dark:text-gray-400\">\n {formatDuration(result.durationMs)}\n </span>\n )}\n </div>\n )\n })}\n </div>\n )}\n </div>\n </div>\n )\n}\n\n/**\n * Inline spinner icon for running status (animated).\n */\nfunction SpinnerIcon({ className }: { className?: string }) {\n return (\n <svg\n className={`animate-spin motion-reduce:animate-none ${className ?? ''}`}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeOpacity={0.25} />\n <path d=\"M12 2a10 10 0 0 1 10 10\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n","/**\n * Variable Inspector\n * ==================\n * Side panel that analyzes variable flow through the workflow graph.\n * Walks nodes in topological order and infers input/output variables\n * from each node's config type. Shows a collapsible tree view per node.\n */\n\nimport { useMemo, useState, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { VariableIcon, XMarkIcon, ChevronRightIcon, ChevronDownIcon } from '@heroicons/react/24/outline'\nimport { useWorkflowStore } from '../../store/workflow-store'\nimport { LOGIC_ICON_MAP, LOGIC_NODE_GRADIENTS } from '../../constants/workflow-constants'\nimport type { LogicNodeConfig } from '../../contracts'\nimport type { Node } from '@xyflow/react'\n\ntype VariableInspectorProps = {\n open: boolean\n onClose: () => void\n}\n\ntype VariableInfo = {\n name: string\n direction: 'input' | 'output'\n variableType: string\n}\n\ntype NodeVariableEntry = {\n nodeId: string\n nodeLabel: string\n nodeType: string\n variables: VariableInfo[]\n}\n\n/**\n * Performs a topological sort on the node graph using Kahn's algorithm.\n * Returns node IDs in execution order.\n */\nfunction topologicalSort(\n nodes: Node[],\n edges: Array<{ source: string; target: string }>,\n): string[] {\n const adjacencyList = new Map<string, string[]>()\n const inDegree = new Map<string, number>()\n\n for (const node of nodes) {\n adjacencyList.set(node.id, [])\n inDegree.set(node.id, 0)\n }\n\n for (const edge of edges) {\n const neighbors = adjacencyList.get(edge.source)\n if (neighbors) {\n neighbors.push(edge.target)\n }\n inDegree.set(edge.target, (inDegree.get(edge.target) ?? 0) + 1)\n }\n\n const queue: string[] = []\n for (const [nodeId, degree] of inDegree.entries()) {\n if (degree === 0) {\n queue.push(nodeId)\n }\n }\n\n const sorted: string[] = []\n while (queue.length > 0) {\n const currentNodeId = queue.shift()!\n sorted.push(currentNodeId)\n\n const neighbors = adjacencyList.get(currentNodeId) ?? []\n for (const neighborId of neighbors) {\n const updatedDegree = (inDegree.get(neighborId) ?? 1) - 1\n inDegree.set(neighborId, updatedDegree)\n if (updatedDegree === 0) {\n queue.push(neighborId)\n }\n }\n }\n\n // Add any remaining nodes (disconnected) at the end\n for (const node of nodes) {\n if (!sorted.includes(node.id)) {\n sorted.push(node.id)\n }\n }\n\n return sorted\n}\n\n/**\n * Infers input and output variables from a node's config.\n */\nfunction inferVariables(config: LogicNodeConfig | undefined, nodeType: string): VariableInfo[] {\n if (!config) {\n return []\n }\n\n const variables: VariableInfo[] = []\n\n switch (config.type) {\n case 'start':\n for (const variableName of config.inputVariables) {\n if (variableName) {\n variables.push({ name: variableName, direction: 'output', variableType: 'any' })\n }\n }\n break\n\n case 'end':\n for (const variableName of config.outputVariables) {\n if (variableName) {\n variables.push({ name: variableName, direction: 'input', variableType: 'any' })\n }\n }\n break\n\n case 'code':\n // `code` can be the scripted `{language, code}` shape or the\n // engine's JSON-only `{operation, ...}` mini-language. Tag the\n // input with whichever mode the author picked.\n {\n const kind = 'language' in config ? config.language : config.operation\n variables.push({ name: 'code_input', direction: 'input', variableType: kind })\n variables.push({ name: 'code_output', direction: 'output', variableType: 'any' })\n }\n break\n\n case 'http_request':\n variables.push({ name: 'url', direction: 'input', variableType: 'string' })\n variables.push({ name: 'response', direction: 'output', variableType: 'object' })\n if (config.body) {\n variables.push({ name: 'body', direction: 'input', variableType: 'string' })\n }\n break\n\n case 'audio_input':\n variables.push({ name: 'url', direction: 'input', variableType: 'string' })\n variables.push({ name: 'url', direction: 'output', variableType: 'string' })\n variables.push({ name: 'format', direction: 'output', variableType: 'string' })\n variables.push({ name: 'sourceType', direction: 'output', variableType: 'string' })\n break\n\n case 'speech_transcriber':\n variables.push({ name: 'audioUrl', direction: 'input', variableType: 'string' })\n variables.push({ name: 'text', direction: 'output', variableType: 'string' })\n variables.push({ name: 'language', direction: 'output', variableType: 'string' })\n variables.push({ name: 'durationMs', direction: 'output', variableType: 'number' })\n variables.push({ name: 'segments', direction: 'output', variableType: 'array' })\n variables.push({ name: 'model', direction: 'output', variableType: 'string' })\n variables.push({ name: 'provider', direction: 'output', variableType: 'string' })\n break\n\n case 's3_write':\n variables.push({ name: 'key', direction: 'input', variableType: 'string' })\n if (config.sourceUrl) {\n variables.push({ name: 'sourceUrl', direction: 'input', variableType: 'string' })\n }\n if (config.body) {\n variables.push({ name: 'body', direction: 'input', variableType: 'string' })\n }\n variables.push({ name: 'bucket', direction: 'output', variableType: 'string' })\n variables.push({ name: 'key', direction: 'output', variableType: 'string' })\n variables.push({ name: 'size', direction: 'output', variableType: 'number' })\n variables.push({ name: 'etag', direction: 'output', variableType: 'string' })\n variables.push({ name: 'contentType', direction: 'output', variableType: 'string' })\n break\n\n case 'template_transform':\n variables.push({ name: 'template', direction: 'input', variableType: 'string' })\n if (config.outputVariable) {\n variables.push({ name: config.outputVariable, direction: 'output', variableType: 'string' })\n }\n break\n\n case 'if_else':\n for (const condition of config.conditions) {\n if (condition.variable) {\n variables.push({ name: condition.variable, direction: 'input', variableType: 'any' })\n }\n }\n variables.push({ name: 'true_branch', direction: 'output', variableType: 'boolean' })\n variables.push({ name: 'false_branch', direction: 'output', variableType: 'boolean' })\n break\n\n case 'iteration':\n if (config.iteratorVariable) {\n variables.push({ name: config.iteratorVariable, direction: 'input', variableType: 'array' })\n }\n variables.push({ name: 'iteration_item', direction: 'output', variableType: 'any' })\n variables.push({ name: 'iteration_index', direction: 'output', variableType: 'number' })\n break\n\n case 'iteration_start':\n if (config.iteratorVariable) {\n variables.push({ name: config.iteratorVariable, direction: 'input', variableType: 'array' })\n }\n if (config.itemVariable) {\n variables.push({ name: config.itemVariable, direction: 'output', variableType: 'any' })\n }\n if (config.indexVariable) {\n variables.push({ name: config.indexVariable, direction: 'output', variableType: 'number' })\n }\n break\n\n case 'knowledge_base':\n variables.push({ name: 'query', direction: 'input', variableType: 'string' })\n variables.push({ name: 'results', direction: 'output', variableType: 'array' })\n break\n\n case 'answer':\n for (const variableName of config.outputVariables) {\n if (variableName) {\n variables.push({ name: variableName, direction: 'output', variableType: 'any' })\n }\n }\n if (config.outputTemplate) {\n variables.push({ name: 'answer_template', direction: 'input', variableType: 'string' })\n }\n break\n\n case 'question_classifier':\n variables.push({ name: 'question', direction: 'input', variableType: 'string' })\n for (const category of config.categories) {\n if (category.name) {\n variables.push({ name: `category_${category.name}`, direction: 'output', variableType: 'string' })\n }\n }\n break\n\n case 'parameter_extractor':\n variables.push({ name: 'input_text', direction: 'input', variableType: 'string' })\n for (const parameter of config.parameters) {\n if (parameter.name) {\n variables.push({ name: parameter.name, direction: 'output', variableType: parameter.type })\n }\n }\n break\n\n case 'variable_assigner':\n for (const assignment of config.assignments) {\n if (assignment.source) {\n variables.push({ name: assignment.source, direction: 'input', variableType: 'any' })\n }\n if (assignment.target) {\n variables.push({ name: assignment.target, direction: 'output', variableType: 'any' })\n }\n }\n break\n\n case 'variable_aggregator':\n for (const variableName of config.inputVariables) {\n if (variableName) {\n variables.push({ name: variableName, direction: 'input', variableType: 'any' })\n }\n }\n if (config.outputVariable) {\n variables.push({ name: config.outputVariable, direction: 'output', variableType: config.aggregationMode })\n }\n break\n\n case 'document_extractor':\n variables.push({ name: 'document', direction: 'input', variableType: 'file' })\n if (config.outputVariable) {\n variables.push({ name: config.outputVariable, direction: 'output', variableType: config.extractionMode })\n }\n break\n\n case 'list_operator':\n if (config.inputVariable) {\n variables.push({ name: config.inputVariable, direction: 'input', variableType: 'array' })\n }\n if (config.outputVariable) {\n variables.push({ name: config.outputVariable, direction: 'output', variableType: 'array' })\n }\n if (config.condition) {\n variables.push({ name: 'condition', direction: 'input', variableType: 'string' })\n }\n break\n\n case 'note':\n // Notes have no variables\n break\n }\n\n return variables\n}\n\nexport function VariableInspector({ open, onClose }: VariableInspectorProps) {\n const translations = useTranslations('agents.workflow.variableInspector')\n const nodes = useWorkflowStore((state) => state.nodes)\n const edges = useWorkflowStore((state) => state.edges)\n\n const [expandedNodes, setExpandedNodes] = useState<Set<string>>(new Set())\n\n const toggleNodeExpansion = useCallback((nodeId: string) => {\n setExpandedNodes((current) => {\n const updated = new Set(current)\n if (updated.has(nodeId)) {\n updated.delete(nodeId)\n } else {\n updated.add(nodeId)\n }\n return updated\n })\n }, [])\n\n const nodeVariableEntries: NodeVariableEntry[] = useMemo(() => {\n // Filter out note nodes\n const relevantNodes = nodes.filter((node) => node.type !== 'note')\n\n // Get topological order\n const sortedNodeIds = topologicalSort(relevantNodes, edges)\n\n // Build entries\n const entries: NodeVariableEntry[] = []\n\n for (const nodeId of sortedNodeIds) {\n const node = relevantNodes.find((candidateNode) => candidateNode.id === nodeId)\n if (!node) continue\n\n const nodeData = node.data as Record<string, unknown> | undefined\n const config = nodeData?.config as LogicNodeConfig | undefined\n const label = (nodeData?.label as string) ?? node.id\n const nodeType = (node.type as string) ?? 'unknown'\n\n const variables = inferVariables(config, nodeType)\n\n entries.push({\n nodeId: node.id,\n nodeLabel: label,\n nodeType,\n variables,\n })\n }\n\n return entries\n }, [nodes, edges])\n\n if (!open) return null\n\n return (\n <div\n className=\"absolute right-0 top-0 z-40 flex h-full w-80 flex-col border-l border-gray-200 bg-white shadow-xl dark:border-gray-700 dark:bg-gray-900\"\n data-testid=\"variable-inspector\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-gray-200 px-4 py-3 dark:border-gray-700\">\n <div className=\"flex items-center gap-2\">\n <VariableIcon className=\"h-5 w-5 text-gray-500 dark:text-gray-400\" />\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">\n {translations('title')}\n </h3>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg p-1 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-800 dark:hover:text-gray-300\"\n data-testid=\"variable-inspector-close\"\n >\n <XMarkIcon className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* Variable Tree */}\n <div className=\"flex-1 overflow-y-auto\">\n {nodeVariableEntries.length === 0 ? (\n <div className=\"px-4 py-12 text-center\" data-testid=\"variable-inspector-empty\">\n <VariableIcon className=\"mx-auto h-8 w-8 text-gray-300 dark:text-gray-600\" />\n <p className=\"mt-2 text-sm text-gray-500 dark:text-gray-400\">\n {translations('noNodes')}\n </p>\n </div>\n ) : (\n <div className=\"divide-y divide-gray-100 dark:divide-gray-800\">\n {nodeVariableEntries.map((entry) => {\n const isExpanded = expandedNodes.has(entry.nodeId)\n const IconComponent = LOGIC_ICON_MAP[entry.nodeType]\n const gradient = LOGIC_NODE_GRADIENTS[entry.nodeType] ?? 'from-gray-400 to-gray-500'\n const inputVariables = entry.variables.filter((variable) => variable.direction === 'input')\n const outputVariables = entry.variables.filter((variable) => variable.direction === 'output')\n\n return (\n <div key={entry.nodeId} data-testid={`variable-node-${entry.nodeId}`}>\n {/* Node Header (collapsible) */}\n <button\n type=\"button\"\n onClick={() => toggleNodeExpansion(entry.nodeId)}\n className=\"flex w-full items-center gap-2 px-4 py-2.5 text-left transition-colors hover:bg-gray-50 dark:hover:bg-gray-800/50\"\n >\n {isExpanded ? (\n <ChevronDownIcon className=\"h-3.5 w-3.5 flex-shrink-0 text-gray-400\" />\n ) : (\n <ChevronRightIcon className=\"h-3.5 w-3.5 flex-shrink-0 text-gray-400\" />\n )}\n <div className={`flex h-5 w-5 flex-shrink-0 items-center justify-center rounded bg-gradient-to-br ${gradient}`}>\n {IconComponent && <IconComponent className=\"h-3 w-3 text-white\" />}\n </div>\n <span className=\"truncate text-sm font-medium text-gray-900 dark:text-white\">\n {entry.nodeLabel}\n </span>\n <span className=\"ml-auto flex-shrink-0 text-[10px] text-gray-400 dark:text-gray-500\">\n {entry.variables.length} {translations('variables')}\n </span>\n </button>\n\n {/* Expanded Variable List */}\n {isExpanded && (\n <div className=\"bg-gray-50/50 px-4 pb-2 dark:bg-gray-800/30\">\n {entry.variables.length === 0 ? (\n <p className=\"py-2 pl-9 text-xs italic text-gray-400 dark:text-gray-500\">\n {translations('noVariables')}\n </p>\n ) : (\n <>\n {/* Input Variables */}\n {inputVariables.length > 0 && (\n <div className=\"pl-9 pt-1\">\n <div className=\"mb-1 text-[10px] font-medium uppercase tracking-wider text-gray-400 dark:text-gray-500\">\n {translations('inputs')}\n </div>\n {inputVariables.map((variable, index) => (\n <div\n key={`${variable.name}-${index}`}\n className=\"flex items-center gap-2 py-0.5\"\n >\n <span className=\"h-1.5 w-1.5 rounded-full bg-blue-400\" />\n <span className=\"text-xs text-gray-700 dark:text-gray-300\">\n {variable.name}\n </span>\n <span className=\"rounded bg-gray-200 px-1 py-0.5 text-[9px] text-gray-500 dark:bg-gray-700 dark:text-gray-400\">\n {variable.variableType}\n </span>\n </div>\n ))}\n </div>\n )}\n\n {/* Output Variables */}\n {outputVariables.length > 0 && (\n <div className=\"pl-9 pt-1\">\n <div className=\"mb-1 text-[10px] font-medium uppercase tracking-wider text-gray-400 dark:text-gray-500\">\n {translations('outputs')}\n </div>\n {outputVariables.map((variable, index) => (\n <div\n key={`${variable.name}-${index}`}\n className=\"flex items-center gap-2 py-0.5\"\n >\n <span className=\"h-1.5 w-1.5 rounded-full bg-green-400\" />\n <span className=\"text-xs text-gray-700 dark:text-gray-300\">\n {variable.name}\n </span>\n <span className=\"rounded bg-gray-200 px-1 py-0.5 text-[9px] text-gray-500 dark:bg-gray-700 dark:text-gray-400\">\n {variable.variableType}\n </span>\n </div>\n ))}\n </div>\n )}\n </>\n )}\n </div>\n )}\n </div>\n )\n })}\n </div>\n )}\n </div>\n </div>\n )\n}\n","import { useState, useCallback, useMemo } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { PlayIcon } from '@heroicons/react/24/outline'\nimport { Button, GlassModal, Input } from '@ui/index'\nimport { useWorkflowStore } from '../../store/workflow-store'\nimport type { StartNodeConfig } from '../../contracts'\n\ntype VariableValue = string | number | boolean | null\n\nexport type RunInputDialogProps = {\n open: boolean\n onClose: () => void\n onRun: (inputVariables: Record<string, VariableValue>) => void\n}\n\nexport function RunInputDialog({\n open,\n onClose,\n onRun,\n}: RunInputDialogProps) {\n const t = useTranslations('agents.workflow.runInputDialog')\n const nodes = useWorkflowStore((state) => state.nodes)\n const [values, setValues] = useState<Record<string, string>>({})\n\n const inputVariableNames = useMemo(() => {\n const storeStartNode = nodes.find((node) => node.type === 'start')\n if (!storeStartNode || typeof storeStartNode.data !== 'object' || storeStartNode.data === null) return []\n if (!('config' in storeStartNode.data) || !storeStartNode.data.config) return []\n const startConfig = storeStartNode.data.config as StartNodeConfig\n return startConfig.inputVariables ?? []\n }, [nodes])\n\n const handleValueChange = useCallback((variableName: string, variableValue: string) => {\n setValues((previous) => ({ ...previous, [variableName]: variableValue }))\n }, [])\n\n const handleSubmit = useCallback(() => {\n const inputVariables: Record<string, VariableValue> = {}\n for (const variableName of inputVariableNames) {\n inputVariables[variableName] = values[variableName] ?? ''\n }\n onRun(inputVariables)\n onClose()\n setValues({})\n }, [inputVariableNames, values, onRun, onClose])\n\n const handleClose = useCallback(() => {\n onClose()\n setValues({})\n }, [onClose])\n\n if (!open) return null\n\n return (\n <GlassModal\n open={open}\n onClose={handleClose}\n title={t('title')}\n subtitle={t('subtitle')}\n maxWidth=\"md\"\n >\n <div className=\"space-y-3\">\n {inputVariableNames.length === 0 ? (\n <p className=\"text-center text-sm text-gray-500 dark:text-gray-400\">{t('noInputs')}</p>\n ) : (\n inputVariableNames.map((variableName) => (\n <div key={variableName}>\n <label className=\"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300\">{variableName}</label>\n <Input\n value={values[variableName] ?? ''}\n onChange={(event) => handleValueChange(variableName, event.target.value)}\n placeholder={`${t('variableValue')}...`}\n />\n </div>\n ))\n )}\n </div>\n <div className=\"mt-4 flex items-center justify-end gap-2\">\n <Button size=\"sm\" plain onClick={handleClose}>{t('cancel')}</Button>\n <Button size=\"sm\" gradient onClick={handleSubmit}>\n <PlayIcon className=\"h-3.5 w-3.5\" data-slot=\"icon\" />\n {t('run')}\n </Button>\n </div>\n </GlassModal>\n )\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n XMarkIcon,\n ClockIcon,\n CheckCircleIcon,\n ExclamationCircleIcon,\n ArrowPathIcon,\n} from '@heroicons/react/24/outline'\nimport { useWorkflowStore } from '../../store/workflow-store'\nimport type { NodeExecutionResult, WorkflowRun } from '../../contracts'\n\nexport type PreviewPanelProps = {\n open: boolean\n onClose: () => void\n workflowId: string\n loadRuns: (workflowId: string) => Promise<WorkflowRun[]>\n}\n\nconst STATUS_STYLES: Record<string, { icon: typeof CheckCircleIcon; colorClass: string }> = {\n completed: { icon: CheckCircleIcon, colorClass: 'text-green-500' },\n failed: { icon: ExclamationCircleIcon, colorClass: 'text-red-500' },\n running: { icon: ArrowPathIcon, colorClass: 'text-blue-500 animate-spin motion-reduce:animate-none' },\n pending: { icon: ClockIcon, colorClass: 'text-gray-400' },\n success: { icon: CheckCircleIcon, colorClass: 'text-green-500' },\n error: { icon: ExclamationCircleIcon, colorClass: 'text-red-500' },\n skipped: { icon: ClockIcon, colorClass: 'text-gray-400' },\n}\n\nfunction formatDuration(durationMs: number | null): string {\n if (durationMs === null) return '—'\n if (durationMs < 1000) return `${durationMs}ms`\n return `${(durationMs / 1000).toFixed(1)}s`\n}\n\nfunction formatTimestamp(timestamp: string): string {\n const date = new Date(timestamp)\n return date.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit' })\n}\n\nexport function PreviewPanel({ open, onClose, workflowId, loadRuns }: PreviewPanelProps) {\n const t = useTranslations('agents.workflow.previewPanel')\n const [runs, setRuns] = useState<WorkflowRun[]>([])\n const [isLoadingRuns, setIsLoadingRuns] = useState(false)\n const [selectedRun, setSelectedRun] = useState<WorkflowRun | null>(null)\n const [selectedNode, setSelectedNode] = useState<NodeExecutionResult | null>(null)\n\n const isRunning = useWorkflowStore((state) => state.isRunning)\n const nodeResults = useWorkflowStore((state) => state.nodeResults)\n\n const refreshRuns = useCallback(async () => {\n setIsLoadingRuns(true)\n try {\n const workflowRuns = await loadRuns(workflowId)\n setRuns(workflowRuns)\n } finally {\n setIsLoadingRuns(false)\n }\n }, [loadRuns, workflowId])\n\n useEffect(() => {\n if (open) void refreshRuns()\n }, [open, refreshRuns])\n\n useEffect(() => {\n if (!isRunning && open) void refreshRuns()\n }, [isRunning, open, refreshRuns])\n\n if (!open) return null\n\n return (\n <>\n <div className=\"fixed inset-x-0 top-[120px] bottom-0 z-40 bg-black/10 backdrop-blur-[1px]\" onClick={onClose} />\n <div className=\"fixed right-0 top-[120px] bottom-0 z-50 w-96 overflow-hidden border-l border-white/20 bg-white/95 shadow-2xl backdrop-blur-xl dark:border-gray-700/50 dark:bg-gray-800/95\">\n <div className=\"flex items-center justify-between border-b border-gray-200/50 px-4 py-3 dark:border-gray-700/50\">\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">{t('title')}</h3>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg p-1 text-gray-400 hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-700 dark:hover:text-gray-300\"\n >\n <XMarkIcon className=\"h-4 w-4\" />\n </button>\n </div>\n\n <div className=\"flex h-full flex-col overflow-hidden\">\n {isRunning && (\n <div className=\"border-b border-gray-200/50 px-4 py-3 dark:border-gray-700/50\">\n <div className=\"mb-2 flex items-center gap-2\">\n <ArrowPathIcon className=\"h-4 w-4 animate-spin motion-reduce:animate-none text-blue-500\" />\n <span className=\"text-xs font-semibold text-blue-600 dark:text-blue-400\">{t('activeRun')}</span>\n </div>\n <div className=\"max-h-60 space-y-1 overflow-y-auto\">\n {Object.entries(nodeResults).map(([nodeId, result]) => {\n const statusStyle = STATUS_STYLES[result.status] ?? STATUS_STYLES.pending\n const StatusIcon = statusStyle.icon\n return (\n <div key={nodeId} className=\"flex items-center justify-between rounded-lg px-2 py-1.5 text-xs hover:bg-gray-50 dark:hover:bg-gray-700/50\">\n <div className=\"flex items-center gap-2\">\n <StatusIcon className={`h-3.5 w-3.5 ${statusStyle.colorClass}`} />\n <span className=\"truncate text-gray-700 dark:text-gray-300\">{nodeId.slice(0, 8)}</span>\n </div>\n {result.durationMs !== undefined && <span className=\"text-gray-400\">{formatDuration(result.durationMs)}</span>}\n </div>\n )\n })}\n </div>\n </div>\n )}\n\n {selectedNode && (\n <div className=\"border-b border-gray-200/50 px-4 py-3 dark:border-gray-700/50\">\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-xs font-semibold text-gray-900 dark:text-white\">{t('nodeDetail')}</span>\n <button type=\"button\" onClick={() => setSelectedNode(null)} className=\"text-[10px] text-gray-400 hover:text-gray-600 dark:hover:text-gray-300\">\n {t('close')}\n </button>\n </div>\n <div className=\"space-y-2 text-xs\">\n <div className=\"flex justify-between\">\n <span className=\"text-gray-500\">{t('status')}</span>\n <span className={STATUS_STYLES[selectedNode.status]?.colorClass ?? 'text-gray-400'}>\n {t(selectedNode.status as 'completed' | 'failed' | 'running' | 'pending' | 'skipped' | 'success' | 'error')}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-gray-500\">{t('duration')}</span>\n <span className=\"text-gray-700 dark:text-gray-300\">{formatDuration(selectedNode.durationMs)}</span>\n </div>\n {selectedNode.error && (\n <div>\n <span className=\"text-red-500\">{t('error')}</span>\n <pre className=\"mt-1 max-h-20 overflow-auto whitespace-pre-wrap rounded bg-red-50 p-2 text-[10px] text-red-700 dark:bg-red-900/20 dark:text-red-300\">{selectedNode.error}</pre>\n </div>\n )}\n {Object.keys(selectedNode.outputs).length > 0 && (\n <div>\n <span className=\"text-gray-500\">{t('outputs')}</span>\n <pre className=\"mt-1 max-h-32 overflow-auto whitespace-pre-wrap rounded bg-gray-50 p-2 text-[10px] text-gray-700 dark:bg-gray-700/50 dark:text-gray-300\">\n {JSON.stringify(selectedNode.outputs, null, 2)}\n </pre>\n </div>\n )}\n </div>\n </div>\n )}\n\n <div className=\"flex-1 overflow-y-auto px-4 py-3\">\n <h4 className=\"mb-2 text-xs font-semibold text-gray-500 dark:text-gray-400\">{t('runHistory')}</h4>\n\n {isLoadingRuns && (\n <div className=\"space-y-2\">\n {[1, 2, 3].map((index) => (<div key={index} className=\"shimmer h-14 rounded-lg\" />))}\n </div>\n )}\n\n {!isLoadingRuns && runs.length === 0 && (\n <div className=\"py-8 text-center\">\n <ClockIcon className=\"mx-auto mb-2 h-8 w-8 text-gray-300 dark:text-gray-600\" />\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">{t('noRuns')}</p>\n <p className=\"mt-1 text-[10px] text-gray-400 dark:text-gray-500\">{t('noRunsDescription')}</p>\n </div>\n )}\n\n {!isLoadingRuns && runs.length > 0 && (\n <div className=\"space-y-1.5\">\n {runs.map((run) => {\n const statusStyle = STATUS_STYLES[run.status] ?? STATUS_STYLES.pending\n const StatusIcon = statusStyle.icon\n const isSelected = selectedRun?.id === run.id\n return (\n <button\n key={run.id}\n type=\"button\"\n onClick={() => {\n setSelectedRun(isSelected ? null : run)\n setSelectedNode(null)\n }}\n className={`w-full rounded-lg border px-3 py-2.5 text-left transition-colors ${\n isSelected\n ? 'border-blue-200 bg-blue-50/50 dark:border-blue-800 dark:bg-blue-900/20'\n : 'border-gray-100 hover:border-gray-200 hover:bg-gray-50 dark:border-gray-700/50 dark:hover:border-gray-600 dark:hover:bg-gray-700/30'\n }`}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <StatusIcon className={`h-3.5 w-3.5 ${statusStyle.colorClass}`} />\n <span className=\"text-xs font-medium text-gray-900 dark:text-white\">{formatTimestamp(run.createdAt)}</span>\n </div>\n <span className=\"text-[10px] text-gray-400\">{formatDuration(run.totalDurationMs)}</span>\n </div>\n {run.error && <p className=\"mt-1 truncate text-[10px] text-red-500\">{run.error}</p>}\n </button>\n )\n })}\n </div>\n )}\n\n {selectedRun && selectedRun.nodeResults.length > 0 && (\n <div className=\"mt-3 space-y-1\">\n <h5 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-gray-400\">Nodes</h5>\n {selectedRun.nodeResults.map((nodeResult) => {\n const nodeStatusStyle = STATUS_STYLES[nodeResult.status] ?? STATUS_STYLES.pending\n const NodeStatusIcon = nodeStatusStyle.icon\n return (\n <button\n key={nodeResult.nodeId}\n type=\"button\"\n onClick={() => setSelectedNode(nodeResult)}\n className=\"flex w-full items-center justify-between rounded px-2 py-1.5 text-xs hover:bg-gray-50 dark:hover:bg-gray-700/50\"\n >\n <div className=\"flex items-center gap-2\">\n <NodeStatusIcon className={`h-3 w-3 ${nodeStatusStyle.colorClass}`} />\n <span className=\"text-gray-700 dark:text-gray-300\">{nodeResult.nodeType}</span>\n </div>\n <span className=\"text-[10px] text-gray-400\">{formatDuration(nodeResult.durationMs)}</span>\n </button>\n )\n })}\n </div>\n )}\n </div>\n </div>\n </div>\n </>\n )\n}\n","export type SaveStatusBadgeProps = {\n status: 'idle' | 'saving' | 'saved'\n /** Localized status messages so screen readers + low-vision users\n * hear \"saving / saved\" instead of just a bullet. Defaults to PT-BR\n * fallback so the badge never ships a silent symbol. */\n labels?: { saving?: string; saved?: string }\n}\n\n/**\n * Tiny status badge for autosave indicators. Always announces the\n * current state via `aria-live=\"polite\"` so screen-reader users\n * notice the transition without losing focus. The visible glyph is\n * purely decorative (`aria-hidden`) — the visually-hidden label\n * carries the meaning. WCAG 4.1.3 (status messages) + 1.4.1 (color\n * is not the only channel).\n */\nexport function SaveStatusBadge({ status, labels }: SaveStatusBadgeProps) {\n const savingLabel = labels?.saving ?? 'Salvando…'\n const savedLabel = labels?.saved ?? 'Salvo'\n\n if (status === 'saving') {\n return (\n <span role=\"status\" aria-live=\"polite\" className=\"inline-flex items-center\">\n <span\n aria-hidden=\"true\"\n className=\"motion-safe:animate-pulse text-[11px] text-gray-500 dark:text-gray-400\"\n >\n &#8226;\n </span>\n <span className=\"sr-only\">{savingLabel}</span>\n </span>\n )\n }\n\n if (status === 'saved') {\n return (\n <span role=\"status\" aria-live=\"polite\" className=\"inline-flex items-center\">\n <span\n aria-hidden=\"true\"\n className=\"text-[11px] text-emerald-600 dark:text-emerald-400\"\n >\n &#10003;\n </span>\n <span className=\"sr-only\">{savedLabel}</span>\n </span>\n )\n }\n\n return null\n}\n","import { memo, useCallback } from 'react'\nimport { Workspace, type WorkspaceProps } from '../../workflow-canvas'\nimport type { WorkflowGraph } from '../../contracts'\n\nexport type AutoSaveWorkspaceProps = Omit<WorkspaceProps, 'onGraphChange'> & {\n onAutoSaveGraph: (graph: WorkflowGraph) => void\n onGraphSnapshot?: (graph: WorkflowGraph) => void\n}\n\nexport const AutoSaveWorkspace = memo(function AutoSaveWorkspace({\n onAutoSaveGraph,\n onGraphSnapshot,\n ...workspaceProps\n}: AutoSaveWorkspaceProps) {\n const handleGraphChange = useCallback((graph: WorkflowGraph) => {\n onGraphSnapshot?.(graph)\n onAutoSaveGraph(graph)\n }, [onAutoSaveGraph, onGraphSnapshot])\n\n return (\n <Workspace\n {...workspaceProps}\n onGraphChange={handleGraphChange}\n />\n )\n})\n","import type { ComponentProps } from 'react'\nimport { DynamicIslandConfirm as UiDynamicIslandConfirm } from '@ui/index'\n\nexport type DynamicIslandConfirmProps = ComponentProps<typeof UiDynamicIslandConfirm>\n\nexport function DynamicIslandConfirm(props: DynamicIslandConfirmProps) {\n return <UiDynamicIslandConfirm {...props} />\n}\n\n","/**\n * DSL Export Modal\n * ================\n * Modal for exporting a workflow to a JSON file.\n * Shows workflow metadata, a JSON preview, and provides\n * \"Copy to Clipboard\" and \"Download JSON\" actions.\n */\n\nimport { useState, useMemo, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { ArrowDownTrayIcon, ClipboardDocumentIcon, CheckIcon } from '@heroicons/react/24/outline'\nimport { Button, GlassModal } from '@ui/index'\nimport type { WorkflowGraph, Workflow } from '../../contracts'\n\ntype DslExportModalProps = {\n open: boolean\n onClose: () => void\n workflow: Workflow\n graph: WorkflowGraph\n}\n\nconst JSON_PREVIEW_LINE_LIMIT = 50\n\nexport function DslExportModal({ open, onClose, workflow, graph }: DslExportModalProps) {\n const translations = useTranslations('agents.workflow.dsl.export')\n const [isCopied, setIsCopied] = useState(false)\n\n const exportPayload = useMemo(() => ({\n name: workflow.name,\n description: workflow.description,\n version: workflow.version,\n exportedAt: new Date().toISOString(),\n graph: {\n nodes: graph.nodes,\n edges: graph.edges,\n viewport: graph.viewport,\n },\n }), [workflow, graph])\n\n const jsonString = useMemo(() => JSON.stringify(exportPayload, null, 2), [exportPayload])\n\n const previewLines = useMemo(() => {\n const lines = jsonString.split('\\n')\n if (lines.length <= JSON_PREVIEW_LINE_LIMIT) {\n return jsonString\n }\n return lines.slice(0, JSON_PREVIEW_LINE_LIMIT).join('\\n') + '\\n...'\n }, [jsonString])\n\n const handleCopyToClipboard = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(jsonString)\n setIsCopied(true)\n setTimeout(() => setIsCopied(false), 2000)\n } catch {\n // Fallback for older browsers\n const textArea = document.createElement('textarea')\n textArea.value = jsonString\n document.body.appendChild(textArea)\n textArea.select()\n document.execCommand('copy')\n document.body.removeChild(textArea)\n setIsCopied(true)\n setTimeout(() => setIsCopied(false), 2000)\n }\n }, [jsonString])\n\n const handleDownloadJson = useCallback(() => {\n const blob = new Blob([jsonString], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n const downloadLink = document.createElement('a')\n downloadLink.href = url\n downloadLink.download = `${workflow.name}-v${workflow.version}.json`\n document.body.appendChild(downloadLink)\n downloadLink.click()\n document.body.removeChild(downloadLink)\n URL.revokeObjectURL(url)\n }, [jsonString, workflow.name, workflow.version])\n\n if (!open) return null\n\n return (\n <GlassModal\n open={open}\n onClose={onClose}\n title={translations('title')}\n subtitle={translations('description')}\n maxWidth=\"2xl\"\n >\n <div data-testid=\"dsl-export-modal\">\n {/* Metadata */}\n <div className=\"border-b border-gray-200 px-1 py-4 dark:border-gray-700\">\n <div className=\"grid grid-cols-2 gap-4 text-sm\">\n <div>\n <span className=\"text-gray-500 dark:text-gray-400\">{translations('workflowName')}</span>\n <p className=\"font-medium text-gray-900 dark:text-white\">{workflow.name}</p>\n </div>\n <div>\n <span className=\"text-gray-500 dark:text-gray-400\">{translations('version')}</span>\n <p className=\"font-medium text-gray-900 dark:text-white\">v{workflow.version}</p>\n </div>\n <div>\n <span className=\"text-gray-500 dark:text-gray-400\">{translations('nodes')}</span>\n <p className=\"font-medium text-gray-900 dark:text-white\">{graph.nodes.length}</p>\n </div>\n <div>\n <span className=\"text-gray-500 dark:text-gray-400\">{translations('edges')}</span>\n <p className=\"font-medium text-gray-900 dark:text-white\">{graph.edges.length}</p>\n </div>\n </div>\n </div>\n\n {/* JSON Preview */}\n <div className=\"px-1 py-4\">\n <div className=\"mb-2 text-xs font-medium uppercase tracking-wider text-gray-400 dark:text-gray-500\">\n {translations('preview')}\n </div>\n <pre\n className=\"max-h-64 overflow-auto rounded-lg border border-gray-200 bg-gray-50 p-3 text-xs text-gray-700 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-300\"\n data-testid=\"export-json-preview\"\n >\n {previewLines}\n </pre>\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center justify-end gap-3 border-t border-gray-200 px-1 py-4 dark:border-gray-700\">\n <Button\n type=\"button\"\n onClick={handleCopyToClipboard}\n outline\n size=\"sm\"\n data-testid=\"export-copy-button\"\n >\n {isCopied ? (\n <>\n <CheckIcon className=\"h-4 w-4 text-green-500\" />\n <span role=\"status\" aria-live=\"polite\">{translations('copied')}</span>\n </>\n ) : (\n <>\n <ClipboardDocumentIcon className=\"h-4 w-4\" />\n {translations('copyToClipboard')}\n </>\n )}\n </Button>\n <Button\n type=\"button\"\n onClick={handleDownloadJson}\n color=\"ios-glass-blue\"\n size=\"sm\"\n data-testid=\"export-download-button\"\n >\n <ArrowDownTrayIcon className=\"h-4 w-4\" />\n {translations('downloadJson')}\n </Button>\n </div>\n </div>\n </GlassModal>\n )\n}\n","/**\n * DSL Import Modal\n * ================\n * Modal for importing a workflow from a JSON file.\n * Provides drag-and-drop and file picker upload, validates\n * JSON structure (nodes array, edges array, viewport),\n * shows validation errors, and previews node/edge counts.\n */\n\nimport { useState, useCallback, useRef } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { ArrowUpTrayIcon, ExclamationTriangleIcon, CheckCircleIcon } from '@heroicons/react/24/outline'\nimport { Button, GlassModal } from '@ui/index'\nimport type { WorkflowGraph } from '../../contracts'\n\ntype DslImportModalProps = {\n open: boolean\n onClose: () => void\n onImport: (graph: WorkflowGraph) => void\n}\n\ntype ValidationResult = {\n isValid: boolean\n errors: string[]\n graph: WorkflowGraph | null\n nodeCount: number\n edgeCount: number\n}\n\nfunction validateWorkflowJson(jsonString: string): ValidationResult {\n const errors: string[] = []\n\n let parsed: unknown\n try {\n parsed = JSON.parse(jsonString)\n } catch {\n return { isValid: false, errors: ['Invalid JSON format'], graph: null, nodeCount: 0, edgeCount: 0 }\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n return { isValid: false, errors: ['Root must be a JSON object'], graph: null, nodeCount: 0, edgeCount: 0 }\n }\n\n const data = parsed as Record<string, unknown>\n\n // Support both root-level graph and nested graph property\n const graphData = data.graph ? (data.graph as Record<string, unknown>) : data\n\n if (!Array.isArray(graphData.nodes)) {\n errors.push('Missing or invalid \"nodes\" array')\n }\n\n if (!Array.isArray(graphData.edges)) {\n errors.push('Missing or invalid \"edges\" array')\n }\n\n if (!graphData.viewport || typeof graphData.viewport !== 'object') {\n errors.push('Missing or invalid \"viewport\" object')\n }\n\n if (errors.length > 0) {\n return { isValid: false, errors, graph: null, nodeCount: 0, edgeCount: 0 }\n }\n\n const nodes = graphData.nodes as Array<Record<string, unknown>>\n const edges = graphData.edges as Array<Record<string, unknown>>\n\n // Validate node structure\n for (let index = 0; index < nodes.length; index++) {\n const node = nodes[index]\n if (!node.id || typeof node.id !== 'string') {\n errors.push(`Node at index ${index}: missing or invalid \"id\"`)\n }\n if (!node.type || typeof node.type !== 'string') {\n errors.push(`Node at index ${index}: missing or invalid \"type\"`)\n }\n if (!node.position || typeof node.position !== 'object') {\n errors.push(`Node at index ${index}: missing or invalid \"position\"`)\n }\n }\n\n // Validate edge structure\n for (let index = 0; index < edges.length; index++) {\n const edge = edges[index]\n if (!edge.id || typeof edge.id !== 'string') {\n errors.push(`Edge at index ${index}: missing or invalid \"id\"`)\n }\n if (!edge.source || typeof edge.source !== 'string') {\n errors.push(`Edge at index ${index}: missing or invalid \"source\"`)\n }\n if (!edge.target || typeof edge.target !== 'string') {\n errors.push(`Edge at index ${index}: missing or invalid \"target\"`)\n }\n }\n\n if (errors.length > 0) {\n return { isValid: false, errors, graph: null, nodeCount: nodes.length, edgeCount: edges.length }\n }\n\n const viewport = graphData.viewport as Record<string, unknown>\n const graph: WorkflowGraph = {\n nodes: nodes.map((node) => ({\n id: node.id as string,\n type: node.type as WorkflowGraph['nodes'][number]['type'],\n position: node.position as { x: number; y: number },\n data: (node.data ?? { entityId: '', label: '' }) as WorkflowGraph['nodes'][number]['data'],\n })),\n edges: edges.map((edge) => ({\n id: edge.id as string,\n source: edge.source as string,\n target: edge.target as string,\n sourceHandle: (edge.sourceHandle ?? 'default') as string,\n targetHandle: (edge.targetHandle ?? 'default') as string,\n })),\n viewport: {\n x: typeof viewport.x === 'number' ? viewport.x : 0,\n y: typeof viewport.y === 'number' ? viewport.y : 0,\n zoom: typeof viewport.zoom === 'number' ? viewport.zoom : 1,\n },\n }\n\n return { isValid: true, errors: [], graph, nodeCount: nodes.length, edgeCount: edges.length }\n}\n\nexport function DslImportModal({ open, onClose, onImport }: DslImportModalProps) {\n const translations = useTranslations('agents.workflow.dsl.import')\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const [isDragActive, setIsDragActive] = useState(false)\n const [validationResult, setValidationResult] = useState<ValidationResult | null>(null)\n const [fileName, setFileName] = useState<string | null>(null)\n\n const processFile = useCallback((file: File) => {\n setFileName(file.name)\n\n const reader = new FileReader()\n reader.onload = (event) => {\n const content = event.target?.result\n if (typeof content === 'string') {\n const result = validateWorkflowJson(content)\n setValidationResult(result)\n }\n }\n reader.readAsText(file)\n }, [])\n\n const handleDragOver = useCallback((event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault()\n setIsDragActive(true)\n }, [])\n\n const handleDragLeave = useCallback((event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault()\n setIsDragActive(false)\n }, [])\n\n const handleDrop = useCallback(\n (event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault()\n setIsDragActive(false)\n\n const files = event.dataTransfer.files\n if (files.length > 0) {\n processFile(files[0])\n }\n },\n [processFile],\n )\n\n const handleFileChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const files = event.target.files\n if (files && files.length > 0) {\n processFile(files[0])\n }\n },\n [processFile],\n )\n\n const handleClickUpload = useCallback(() => {\n fileInputRef.current?.click()\n }, [])\n\n const handleImport = useCallback(() => {\n if (validationResult?.isValid && validationResult.graph) {\n onImport(validationResult.graph)\n onClose()\n }\n }, [validationResult, onImport, onClose])\n\n const handleReset = useCallback(() => {\n setValidationResult(null)\n setFileName(null)\n if (fileInputRef.current) {\n fileInputRef.current.value = ''\n }\n }, [])\n\n if (!open) return null\n\n return (\n <GlassModal\n open={open}\n onClose={onClose}\n title={translations('title')}\n subtitle={translations('description')}\n maxWidth=\"lg\"\n >\n <div data-testid=\"dsl-import-modal\">\n <div className=\"px-1 py-2\">\n {!validationResult ? (\n <div\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={handleClickUpload}\n className={`cursor-pointer rounded-xl border-2 border-dashed p-8 text-center transition-colors duration-200 ${\n isDragActive\n ? 'border-blue-400 bg-blue-50 dark:border-blue-500 dark:bg-blue-500/10'\n : 'border-gray-300 hover:border-gray-400 dark:border-gray-600 dark:hover:border-gray-500'\n }`}\n data-testid=\"import-dropzone\"\n role=\"button\"\n tabIndex={0}\n aria-label={translations('dropzone')}\n >\n <ArrowUpTrayIcon className=\"mx-auto h-10 w-10 text-gray-400 dark:text-gray-500\" />\n <p className=\"mt-3 text-sm font-medium text-gray-700 dark:text-gray-300\">\n {translations('dropzone')}\n </p>\n <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">\n {translations('dropzoneHint')}\n </p>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".json\"\n onChange={handleFileChange}\n className=\"hidden\"\n data-testid=\"import-file-input\"\n />\n </div>\n ) : (\n <div data-testid=\"import-validation-result\">\n <div className=\"mb-4 flex items-center justify-between\">\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">{fileName}</span>\n <Button type=\"button\" plain size=\"sm\" onClick={handleReset}>\n {translations('chooseAnother')}\n </Button>\n </div>\n\n {validationResult.isValid ? (\n <div className=\"rounded-lg border border-green-200 bg-green-50 p-4 dark:border-green-800 dark:bg-green-900/20\">\n <div className=\"flex items-center gap-2\">\n <CheckCircleIcon className=\"h-5 w-5 text-green-500\" />\n <span className=\"text-sm font-medium text-green-700 dark:text-green-400\">\n {translations('validationSuccess')}\n </span>\n </div>\n <div className=\"mt-2 grid grid-cols-2 gap-2 text-sm\">\n <div className=\"text-green-600 dark:text-green-400\">\n {translations('nodes')}: {validationResult.nodeCount}\n </div>\n <div className=\"text-green-600 dark:text-green-400\">\n {translations('edges')}: {validationResult.edgeCount}\n </div>\n </div>\n </div>\n ) : (\n <div role=\"alert\" className=\"rounded-lg border border-red-200 bg-red-50 p-4 dark:border-red-800 dark:bg-red-900/20\">\n <div className=\"flex items-center gap-2\">\n <ExclamationTriangleIcon className=\"h-5 w-5 text-red-500\" />\n <span className=\"text-sm font-medium text-red-700 dark:text-red-400\">\n {translations('validationFailed')}\n </span>\n </div>\n <ul className=\"mt-2 space-y-1\">\n {validationResult.errors.map((validationError, index) => (\n <li key={index} className=\"text-xs text-red-600 dark:text-red-400\">\n {validationError}\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n )}\n </div>\n\n <div className=\"flex items-center justify-end gap-3 border-t border-gray-200 px-1 py-4 dark:border-gray-700\">\n <Button type=\"button\" onClick={onClose} outline size=\"sm\" data-testid=\"import-cancel-button\">\n {translations('cancel')}\n </Button>\n <Button\n type=\"button\"\n onClick={handleImport}\n disabled={!validationResult?.isValid}\n color=\"ios-glass-blue\"\n size=\"sm\"\n data-testid=\"import-confirm-button\"\n >\n <ArrowUpTrayIcon className=\"h-4 w-4\" />\n {translations('import')}\n </Button>\n </div>\n </div>\n </GlassModal>\n )\n}\n","/**\n * Workflow Store Selectors\n * ========================\n * Derived state hooks for granular subscriptions.\n * Each selector subscribes only to the slice it needs,\n * preventing unnecessary re-renders in consuming components.\n */\n\nimport { useWorkflowStore } from './workflow-store'\n\nexport const useCanUndo = () => useWorkflowStore((state) => state.past.length > 0)\n\nexport const useCanRedo = () => useWorkflowStore((state) => state.future.length > 0)\n\nexport const useHasCopied = () => useWorkflowStore((state) => state.clipboard !== null)\n\nexport const useContextMenu = () => useWorkflowStore((state) => state.contextMenu)\n\nexport const useEditingNodeId = () => useWorkflowStore((state) => state.editingNodeId)\n\nexport const useSelectedNodeCount = () =>\n useWorkflowStore((state) => state.nodes.filter((node) => node.selected).length)\n\nexport const useIsRunning = () => useWorkflowStore((state) => state.isRunning)\n\nexport const useNodeResults = () => useWorkflowStore((state) => state.nodeResults)\n","import { useCallback, useRef } from 'react'\nimport type { Node, Edge } from '@xyflow/react'\n\ntype GraphSnapshot = {\n nodes: Node[]\n edges: Edge[]\n}\n\ntype UseUndoRedoReturn = {\n undo: () => void\n redo: () => void\n canUndo: boolean\n canRedo: boolean\n takeSnapshot: () => void\n}\n\nconst DEFAULT_MAX_HISTORY = 50\n\nexport function useUndoRedo(\n nodes: Node[],\n edges: Edge[],\n setNodes: (nodes: Node[]) => void,\n setEdges: (edges: Edge[]) => void,\n maxHistory: number = DEFAULT_MAX_HISTORY,\n): UseUndoRedoReturn {\n const pastRef = useRef<GraphSnapshot[]>([])\n const futureRef = useRef<GraphSnapshot[]>([])\n\n // Force re-render tracking for canUndo/canRedo\n // We use a counter ref that we read synchronously to derive boolean states\n const pastLengthRef = useRef(0)\n const futureLengthRef = useRef(0)\n\n const takeSnapshot = useCallback(() => {\n const snapshot: GraphSnapshot = {\n nodes: nodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: edges.map((edge) => ({ ...edge })),\n }\n pastRef.current = [...pastRef.current.slice(-(maxHistory - 1)), snapshot]\n pastLengthRef.current = pastRef.current.length\n futureRef.current = []\n futureLengthRef.current = 0\n }, [nodes, edges, maxHistory])\n\n const undo = useCallback(() => {\n const past = pastRef.current\n if (past.length === 0) return\n\n const previous = past[past.length - 1]\n const remaining = past.slice(0, -1)\n\n const currentSnapshot: GraphSnapshot = {\n nodes: nodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: edges.map((edge) => ({ ...edge })),\n }\n\n pastRef.current = remaining\n pastLengthRef.current = remaining.length\n futureRef.current = [...futureRef.current, currentSnapshot]\n futureLengthRef.current = futureRef.current.length\n\n setNodes(previous.nodes)\n setEdges(previous.edges)\n }, [nodes, edges, setNodes, setEdges])\n\n const redo = useCallback(() => {\n const future = futureRef.current\n if (future.length === 0) return\n\n const next = future[future.length - 1]\n const remaining = future.slice(0, -1)\n\n const currentSnapshot: GraphSnapshot = {\n nodes: nodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: edges.map((edge) => ({ ...edge })),\n }\n\n futureRef.current = remaining\n futureLengthRef.current = remaining.length\n pastRef.current = [...pastRef.current, currentSnapshot]\n pastLengthRef.current = pastRef.current.length\n\n setNodes(next.nodes)\n setEdges(next.edges)\n }, [nodes, edges, setNodes, setEdges])\n\n return {\n undo,\n redo,\n canUndo: pastRef.current.length > 0,\n canRedo: futureRef.current.length > 0,\n takeSnapshot,\n }\n}\n","import { useCallback, useRef } from 'react'\nimport type { Node, Edge } from '@xyflow/react'\n\ntype ClipboardContent = {\n nodes: Node[]\n edges: Edge[]\n}\n\ntype UseClipboardReturn = {\n copy: () => void\n paste: () => void\n hasCopied: boolean\n}\n\nconst PASTE_OFFSET = 40\n\nexport function useClipboard(\n nodes: Node[],\n edges: Edge[],\n setNodes: (updater: (nodes: Node[]) => Node[]) => void,\n setEdges: (updater: (edges: Edge[]) => Edge[]) => void,\n takeSnapshot: () => void,\n): UseClipboardReturn {\n const clipboardRef = useRef<ClipboardContent | null>(null)\n\n const copy = useCallback(() => {\n const selectedNodes = nodes.filter((node) => node.selected)\n if (selectedNodes.length === 0) return\n\n const selectedNodeIds = new Set(selectedNodes.map((node) => node.id))\n const internalEdges = edges.filter(\n (edge) => selectedNodeIds.has(edge.source) && selectedNodeIds.has(edge.target),\n )\n\n clipboardRef.current = {\n nodes: selectedNodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: internalEdges.map((edge) => ({ ...edge })),\n }\n }, [nodes, edges])\n\n const paste = useCallback(() => {\n const clipboard = clipboardRef.current\n if (!clipboard || clipboard.nodes.length === 0) return\n\n takeSnapshot()\n\n const idMapping = new Map<string, string>()\n clipboard.nodes.forEach((node) => {\n idMapping.set(node.id, crypto.randomUUID())\n })\n\n const pastedNodes: Node[] = clipboard.nodes.map((node) => ({\n ...node,\n id: idMapping.get(node.id) ?? crypto.randomUUID(),\n position: {\n x: node.position.x + PASTE_OFFSET,\n y: node.position.y + PASTE_OFFSET,\n },\n selected: true,\n data: { ...node.data },\n }))\n\n const pastedEdges: Edge[] = clipboard.edges.map((edge) => ({\n ...edge,\n id: crypto.randomUUID(),\n source: idMapping.get(edge.source) ?? edge.source,\n target: idMapping.get(edge.target) ?? edge.target,\n }))\n\n setNodes((currentNodes) => [\n ...currentNodes.map((node) => ({ ...node, selected: false })),\n ...pastedNodes,\n ])\n\n setEdges((currentEdges) => [...currentEdges, ...pastedEdges])\n\n // Update clipboard positions for consecutive pastes\n clipboardRef.current = {\n nodes: pastedNodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: pastedEdges.map((edge) => ({ ...edge })),\n }\n }, [setNodes, setEdges, takeSnapshot])\n\n return {\n copy,\n paste,\n hasCopied: clipboardRef.current !== null && clipboardRef.current.nodes.length > 0,\n }\n}\n","import { useEffect } from 'react'\n\ntype UseCanvasShortcutsOptions = {\n undo: () => void\n redo: () => void\n copy: () => void\n paste: () => void\n canUndo: boolean\n canRedo: boolean\n selectAll: () => void\n fitView: () => void\n}\n\nconst INPUT_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT'])\n\nfunction isInputFocused(): boolean {\n const activeElement = document.activeElement\n if (!activeElement) return false\n return INPUT_TAGS.has(activeElement.tagName) || (activeElement as HTMLElement).isContentEditable\n}\n\nexport function useCanvasShortcuts({\n undo,\n redo,\n copy,\n paste,\n canUndo,\n canRedo,\n selectAll,\n fitView,\n}: UseCanvasShortcutsOptions): void {\n useEffect(() => {\n function handleKeyDown(event: KeyboardEvent) {\n if (isInputFocused()) return\n\n const isModifierPressed = event.metaKey || event.ctrlKey\n\n if (!isModifierPressed) {\n if (event.key === 'Escape') {\n selectAll() // Will be overridden to deselect — see graph wiring\n return\n }\n return\n }\n\n switch (event.key.toLowerCase()) {\n case 'z': {\n if (event.shiftKey) {\n if (canRedo) {\n event.preventDefault()\n redo()\n }\n } else {\n if (canUndo) {\n event.preventDefault()\n undo()\n }\n }\n break\n }\n case 'y': {\n if (canRedo) {\n event.preventDefault()\n redo()\n }\n break\n }\n case 'c': {\n event.preventDefault()\n copy()\n break\n }\n case 'v': {\n event.preventDefault()\n paste()\n break\n }\n case 'a': {\n event.preventDefault()\n selectAll()\n break\n }\n case 'f': {\n if (event.shiftKey) {\n event.preventDefault()\n fitView()\n }\n break\n }\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n }\n }, [undo, redo, copy, paste, canUndo, canRedo, selectAll, fitView])\n}\n","/**\n * Help Lines Hook\n * ===============\n * Detects alignment between the currently dragged node and\n * all other nodes on the canvas. When edges (left, center, right,\n * top, center-y, bottom) are within a 5px threshold, returns\n * horizontal and/or vertical guide line positions for visual feedback.\n */\n\nimport { useState, useCallback } from 'react'\nimport type { Node } from '@xyflow/react'\n\ntype NodeDragHandler = (event: React.MouseEvent, node: Node, nodes: Node[]) => void\n\ntype HelpLinePosition = {\n horizontal: number | null\n vertical: number | null\n}\n\ntype NodeBounds = {\n left: number\n centerX: number\n right: number\n top: number\n centerY: number\n bottom: number\n}\n\nconst ALIGNMENT_THRESHOLD = 5\nconst DEFAULT_NODE_WIDTH = 200\nconst DEFAULT_NODE_HEIGHT = 60\n\nfunction getNodeBounds(node: Node): NodeBounds {\n const width = (node.measured?.width ?? node.width ?? DEFAULT_NODE_WIDTH) as number\n const height = (node.measured?.height ?? node.height ?? DEFAULT_NODE_HEIGHT) as number\n\n return {\n left: node.position.x,\n centerX: node.position.x + width / 2,\n right: node.position.x + width,\n top: node.position.y,\n centerY: node.position.y + height / 2,\n bottom: node.position.y + height,\n }\n}\n\n/**\n * Finds the closest alignment positions between a dragged node and\n * all other nodes. Returns horizontal and vertical guide line positions\n * when edges are within the alignment threshold.\n */\nfunction findAlignments(\n dragBounds: NodeBounds,\n otherNodes: Node[],\n): HelpLinePosition {\n let closestHorizontal: number | null = null\n let closestVertical: number | null = null\n let minHorizontalDistance = ALIGNMENT_THRESHOLD + 1\n let minVerticalDistance = ALIGNMENT_THRESHOLD + 1\n\n for (const otherNode of otherNodes) {\n const otherBounds = getNodeBounds(otherNode)\n\n // Check vertical alignments (x-axis positions)\n const verticalChecks = [\n { dragValue: dragBounds.left, otherValue: otherBounds.left },\n { dragValue: dragBounds.left, otherValue: otherBounds.centerX },\n { dragValue: dragBounds.left, otherValue: otherBounds.right },\n { dragValue: dragBounds.centerX, otherValue: otherBounds.left },\n { dragValue: dragBounds.centerX, otherValue: otherBounds.centerX },\n { dragValue: dragBounds.centerX, otherValue: otherBounds.right },\n { dragValue: dragBounds.right, otherValue: otherBounds.left },\n { dragValue: dragBounds.right, otherValue: otherBounds.centerX },\n { dragValue: dragBounds.right, otherValue: otherBounds.right },\n ]\n\n for (const check of verticalChecks) {\n const distance = Math.abs(check.dragValue - check.otherValue)\n if (distance <= ALIGNMENT_THRESHOLD && distance < minVerticalDistance) {\n minVerticalDistance = distance\n closestVertical = check.otherValue\n }\n }\n\n // Check horizontal alignments (y-axis positions)\n const horizontalChecks = [\n { dragValue: dragBounds.top, otherValue: otherBounds.top },\n { dragValue: dragBounds.top, otherValue: otherBounds.centerY },\n { dragValue: dragBounds.top, otherValue: otherBounds.bottom },\n { dragValue: dragBounds.centerY, otherValue: otherBounds.top },\n { dragValue: dragBounds.centerY, otherValue: otherBounds.centerY },\n { dragValue: dragBounds.centerY, otherValue: otherBounds.bottom },\n { dragValue: dragBounds.bottom, otherValue: otherBounds.top },\n { dragValue: dragBounds.bottom, otherValue: otherBounds.centerY },\n { dragValue: dragBounds.bottom, otherValue: otherBounds.bottom },\n ]\n\n for (const check of horizontalChecks) {\n const distance = Math.abs(check.dragValue - check.otherValue)\n if (distance <= ALIGNMENT_THRESHOLD && distance < minHorizontalDistance) {\n minHorizontalDistance = distance\n closestHorizontal = check.otherValue\n }\n }\n }\n\n return { horizontal: closestHorizontal, vertical: closestVertical }\n}\n\n/**\n * Basic help lines hook. Returns a drag handler factory that accepts\n * the full node list for alignment detection.\n *\n * Example:\n * const { helpLines, createDragHandler, onNodeDragStop } = useHelpLines()\n * const onNodeDrag = createDragHandler(nodes)\n */\nexport function useHelpLines(): {\n helpLines: HelpLinePosition\n createDragHandler: (allNodes: Node[]) => NodeDragHandler\n onNodeDragStop: NodeDragHandler\n} {\n const [helpLines, setHelpLines] = useState<HelpLinePosition>({\n horizontal: null,\n vertical: null,\n })\n\n const createDragHandler = useCallback(\n (allNodes: Node[]): NodeDragHandler =>\n (_event, draggedNode, draggedNodes) => {\n const draggingNodeIds = new Set(\n draggedNodes.length > 0\n ? draggedNodes.map((node) => node.id)\n : [draggedNode.id],\n )\n\n const dragBounds = getNodeBounds(draggedNode)\n const otherNodes = allNodes.filter((node) => !draggingNodeIds.has(node.id))\n\n setHelpLines(findAlignments(dragBounds, otherNodes))\n },\n [],\n )\n\n const onNodeDragStop: NodeDragHandler = useCallback(() => {\n setHelpLines({ horizontal: null, vertical: null })\n }, [])\n\n return {\n helpLines,\n createDragHandler,\n onNodeDragStop,\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/astrlabe/components/nodes/model-provider-flow-node.tsx","../src/astrlabe/components/nodes/s3-write-flow-node.tsx","../src/astrlabe/components/icons/model-provider-icons.tsx","../src/astrlabe/components/agent-output-schema/output-schema-builder.tsx","../src/astrlabe/components/modals/agent-modal.tsx","../src/astrlabe/store/subworkflow-store.ts","../src/astrlabe/components/modals/subworkflow-modal.tsx","../src/astrlabe/components/modals/pipeline-settings-modal.tsx","../src/astrlabe/components/modals/run-replay-modal.tsx","../src/astrlabe/components/run-timeline/execution-timeline-panel.tsx","../src/astrlabe/components/rules/types.ts","../src/astrlabe/components/rules/condition-builder.tsx","../src/astrlabe/components/rules/action-builder.tsx","../src/astrlabe/components/rules/rule-form.tsx","../src/astrlabe/components/panels/node-palette.tsx","../src/astrlabe/components/panels/workflow-list-bar.tsx","../src/astrlabe/components/panels/version-history-panel.tsx","../src/astrlabe/components/panels/run-panel.tsx","../src/astrlabe/components/panels/variable-inspector.tsx","../src/astrlabe/components/panels/run-input-dialog.tsx","../src/astrlabe/components/panels/preview-panel.tsx","../src/astrlabe/components/panels/save-status-badge.tsx","../src/astrlabe/components/panels/auto-save-workspace.tsx","../src/astrlabe/components/modals/dynamic-island-confirm.tsx","../src/astrlabe/components/modals/dsl-export-modal.tsx","../src/astrlabe/components/modals/dsl-import-modal.tsx","../src/astrlabe/store/selectors.ts","../src/astrlabe/hooks/use-undo-redo.ts","../src/astrlabe/hooks/use-clipboard.ts","../src/astrlabe/hooks/use-canvas-shortcuts.ts","../src/astrlabe/hooks/use-help-lines.ts"],"names":["ModelProviderFlowNode","memo","S3WriteFlowNode","jsxs","Fragment","jsx","Position","KeyIcon","t","useState","useMemo","useCallback","graph","MaximizeIcon","useEffect","CheckIcon","Cog6ToothIcon","ArrowPathIcon","ClockIcon","ExclamationTriangleIcon","PROVIDER_LOGOS","ChevronDownIcon","CpuChipIcon","ArrowPathRoundedSquareIcon","BoltIcon","PlusIcon","formatTimestamp","CheckCircleIcon","XCircleIcon","formatDuration","XMarkIcon","ChevronRightIcon","PlayIcon","AutoSaveWorkspace","DynamicIslandConfirm","useRef"],"mappings":"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","file":"chunk-AXBD6OAF.mjs","sourcesContent":["import { memo } from 'react'\nimport { Position } from '@xyflow/react'\nimport { KeyIcon, ExclamationTriangleIcon } from '@heroicons/react/24/outline'\nimport type { ModelProviderNodeData } from '../../types'\n\nconst SI = (slug: string, color: string) => `https://cdn.simpleicons.org/${slug}/${color}`\n\nconst PROVIDER_LOGOS: Record<string, string> = {\n aws_bedrock: 'https://www.svgrepo.com/show/448266/aws.svg',\n openai_api: 'https://www.svgrepo.com/show/306500/openai.svg',\n google_vertex: SI('googlegemini', '8E75B2'),\n azure_openai: SI('microsoftazure', '0078D4'),\n anthropic_api: SI('anthropic', 'D4A27F'),\n groq: SI('groq', '000000'),\n mistral: SI('mistralai', 'FF7000'),\n huggingface: SI('huggingface', 'FFD21E'),\n ollama: SI('ollama', 'FFFFFF'),\n}\nimport { Badge } from '@ui/components/badge'\nimport { NodeCard } from './node-card'\nimport { NodeCardHeader, NodeCardMeta } from './node-card-primitives'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nconst PROVIDER_TYPE_LABELS: Record<string, string> = {\n aws_bedrock: 'AWS Bedrock',\n openai_api: 'OpenAI API',\n google_vertex: 'Google Vertex AI',\n azure_openai: 'Azure OpenAI',\n anthropic_api: 'Anthropic API',\n groq: 'Groq Cloud',\n mistral: 'Mistral AI',\n huggingface: 'Hugging Face',\n ollama: 'Ollama (Local)',\n custom: 'Custom',\n}\n\nexport const ModelProviderFlowNode = memo(function ModelProviderFlowNode({ id, data, selected }: { id: string; data: ModelProviderNodeData; selected?: boolean }) {\n const config = data.config\n const isCompact = data.displayMode === 'compact'\n\n if (!config) {\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-gray-400 dark:!bg-gray-500\" />\n <WorkflowHandle type=\"target\" position={Position.Top} id=\"top-in\" colorClass=\"!bg-gray-400 dark:!bg-gray-500\" />\n <NodeCard variant=\"error\" nodeType=\"model_provider\" width=\"w-[280px]\">\n <NodeCardHeader\n icon={<ExclamationTriangleIcon className=\"h-6 w-6 text-white\" />}\n title={data.label || 'Model Provider'}\n description=\"Not configured\"\n iconClassName=\"flex h-11 w-11 items-center justify-center rounded-xl bg-gradient-to-br from-amber-400 to-orange-500 shadow-lg\"\n />\n </NodeCard>\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-slate-500\" />\n <WorkflowHandle type=\"source\" position={Position.Bottom} id=\"bottom-out\" colorClass=\"!bg-slate-500\" />\n </>\n )\n }\n\n const providerLabel = PROVIDER_TYPE_LABELS[config.providerType] ?? config.providerType\n const displayName = config.name || providerLabel\n const regionLabel = config.region ? config.region : undefined\n const isConfigured = !!(config.credentialRef || config.apiKeyRef)\n const logo = PROVIDER_LOGOS[config.providerType]\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-gray-400 dark:!bg-gray-500\" />\n <WorkflowHandle type=\"target\" position={Position.Top} id=\"top-in\" colorClass=\"!bg-gray-400 dark:!bg-gray-500\" />\n\n <button\n type=\"button\"\n onClick={() => data.onEdit?.(id)}\n className=\"w-full text-left\"\n >\n <NodeCard compact={isCompact} selected={selected} nodeType=\"model_provider\" width=\"w-[280px]\">\n <NodeCardHeader\n icon={logo ? (\n <img src={logo} alt={providerLabel} className=\"h-6 w-6 object-contain\" loading=\"lazy\" />\n ) : (\n <KeyIcon className=\"h-6 w-6 text-white\" />\n )}\n title={displayName}\n description={providerLabel}\n iconClassName={`flex h-11 w-11 items-center justify-center rounded-xl shadow-lg ${logo ? 'bg-white/10 dark:bg-white/5 p-2' : 'bg-gradient-to-br from-slate-600 to-slate-700 p-1.5'}`}\n />\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <Badge color=\"zinc\" size=\"xs\">{providerLabel}</Badge>\n {regionLabel && <Badge color=\"zinc\" size=\"xs\">{regionLabel}</Badge>}\n <Badge color={isConfigured ? 'green' : 'amber'} size=\"xs\">\n {isConfigured ? 'Configured' : 'Setup needed'}\n </Badge>\n {config.modelFilter && config.modelFilter.length > 0 && (\n <Badge color=\"zinc\" size=\"xs\">{config.modelFilter.length} models</Badge>\n )}\n </div>\n </NodeCardMeta>\n </NodeCard>\n </button>\n\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-slate-500\" />\n <WorkflowHandle type=\"source\" position={Position.Bottom} id=\"bottom-out\" colorClass=\"!bg-slate-500\" />\n </>\n )\n})\n","import { memo } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { Position } from '@xyflow/react'\nimport { CloudArrowUpIcon } from '@heroicons/react/24/outline'\nimport type { S3WriteNodeData } from '../../types'\nimport { NodeCardBadge, NodeCardDeleteAction, NodeCardHeader, NodeCardMeta, NodeIconBubble, NodeInteractiveCard } from './node-card-primitives'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nexport const S3WriteFlowNode = memo(function S3WriteFlowNode({ id, data, selected }: { id: string; data: S3WriteNodeData; selected?: boolean }) {\n const t = useTranslations('agents.workflow')\n const { config, label, onDelete, onEdit } = data\n const isCompact = data.displayMode === 'compact'\n const keyPreview = config.key ? config.key.slice(0, 30) : ''\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-cyan-500\" />\n\n <NodeInteractiveCard\n nodeId={id}\n onEdit={onEdit}\n compact={isCompact}\n selected={selected}\n nodeType=\"s3_write\"\n >\n <NodeCardHeader\n icon={\n <NodeIconBubble tone=\"s3_write\">\n <CloudArrowUpIcon className=\"h-5 w-5 text-white\" />\n </NodeIconBubble>\n }\n title={label}\n description={t('s3WriteNodeDescription')}\n compact={isCompact}\n iconClassName=\"\"\n />\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex items-center gap-2\">\n <NodeCardBadge tone=\"s3_write\">\n {t('s3WriteNode')}\n </NodeCardBadge>\n {config.bucket && (\n <NodeCardBadge tone=\"s3_write\" soft>\n {config.bucket}\n </NodeCardBadge>\n )}\n {keyPreview && (\n <span className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {keyPreview}\n </span>\n )}\n </div>\n <NodeCardDeleteAction nodeId={id} onDelete={onDelete} />\n </NodeCardMeta>\n </NodeInteractiveCard>\n\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-cyan-500\" />\n </>\n )\n})\n","/**\n * Model provider icons for AWS Bedrock models.\n * Anthropic (Claude), Amazon (Nova), Meta (Llama).\n */\n\ntype IconProps = { className?: string }\n\nexport function AnthropicModelIcon({ className }: IconProps) {\n return (\n <svg role=\"img\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className={className} aria-label=\"Anthropic\">\n <path d=\"M17.3041 3.541h-3.6718l6.696 16.918H24Zm-10.6082 0L0 20.459h3.7442l1.3693-3.5527h7.0052l1.3693 3.5528h3.7442L10.5363 3.5409Zm-.3712 10.2232 2.2914-5.9456 2.2914 5.9456Z\" />\n </svg>\n )\n}\n\nexport function AmazonNovaIcon({ className }: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" className={className} aria-label=\"Amazon Nova\">\n {/* Stylized \"A\" arrow — Amazon-inspired */}\n <path d=\"M12 2L3 20h3.5l1.8-4.5h7.4L17.5 20H21L12 2Zm-2.2 11L12 7.5l2.2 5.5H9.8Z\" fill=\"currentColor\" />\n <path d=\"M2 21c3.5 1.5 7.5 2 10 2s6.5-.5 10-2\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" fill=\"none\" opacity=\"0.6\" />\n </svg>\n )\n}\n\nexport function MetaLlamaIcon({ className }: IconProps) {\n return (\n <svg role=\"img\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className={className} aria-label=\"Meta\">\n <path d=\"M6.915 4.03c-1.968 0-3.683 1.28-4.871 3.113C.704 9.208 0 11.883 0 14.449c0 .706.07 1.369.21 1.973a6.624 6.624 0 0 0 .265.86 5.297 5.297 0 0 0 .371.761c.696 1.159 1.818 1.927 3.593 1.927 1.497 0 2.633-.671 3.965-2.444.76-1.012 1.144-1.626 2.663-4.32l.756-1.339.186-.325c.061.1.121.196.183.3l2.152 3.595c.724 1.21 1.665 2.556 2.47 3.314 1.046.987 1.992 1.22 3.06 1.22 1.075 0 1.876-.355 2.455-.843a3.743 3.743 0 0 0 .81-.973c.542-.939.861-2.127.861-3.745 0-2.72-.681-5.357-2.084-7.45-1.282-1.912-2.957-2.93-4.716-2.93-1.047 0-2.088.467-3.053 1.308-.652.57-1.257 1.29-1.82 2.05-.69-.875-1.335-1.547-1.958-2.056-1.182-.966-2.315-1.303-3.454-1.303zm10.16 2.053c1.147 0 2.188.758 2.992 1.999 1.132 1.748 1.647 4.195 1.647 6.4 0 1.548-.368 2.9-1.839 2.9-.58 0-1.027-.23-1.664-1.004-.496-.601-1.343-1.878-2.832-4.358l-.617-1.028a44.908 44.908 0 0 0-1.255-1.98c.07-.109.141-.224.211-.327 1.12-1.667 2.118-2.602 3.358-2.602zm-10.201.553c1.265 0 2.058.791 2.675 1.446.307.327.737.871 1.234 1.579l-1.02 1.566c-.757 1.163-1.882 3.017-2.837 4.338-1.191 1.649-1.81 1.817-2.486 1.817-.524 0-1.038-.237-1.383-.794-.263-.426-.464-1.13-.464-2.046 0-2.221.63-4.535 1.66-6.088.454-.687.964-1.226 1.533-1.533a2.264 2.264 0 0 1 1.088-.285z\" />\n </svg>\n )\n}\n\nexport function OpenAIModelIcon({ className }: IconProps) {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" className={className} aria-label=\"OpenAI\">\n <path d=\"M14.949 6.547a3.94 3.94 0 0 0-.348-3.273 4.11 4.11 0 0 0-4.4-1.934A4.1 4.1 0 0 0 8.423.2 4.15 4.15 0 0 0 6.305.086a4.1 4.1 0 0 0-1.891.948 4.04 4.04 0 0 0-1.158 1.753 4.1 4.1 0 0 0-1.563.679A4 4 0 0 0 .554 4.72a3.99 3.99 0 0 0 .502 4.731 3.94 3.94 0 0 0 .346 3.274 4.11 4.11 0 0 0 4.402 1.933c.382.425.852.764 1.377.995.526.231 1.095.35 1.67.346 1.78.002 3.358-1.132 3.901-2.804a4.1 4.1 0 0 0 1.563-.68 4 4 0 0 0 1.14-1.253 3.99 3.99 0 0 0-.506-4.716m-6.097 8.406a3.05 3.05 0 0 1-1.945-.694l.096-.054 3.23-1.838a.53.53 0 0 0 .265-.455v-4.49l1.366.778q.02.011.025.035v3.722c-.003 1.653-1.361 2.992-3.037 2.996m-6.53-2.75a2.95 2.95 0 0 1-.36-2.01l.095.057L5.29 12.09a.53.53 0 0 0 .527 0l3.949-2.246v1.555a.05.05 0 0 1-.022.041L6.473 13.3c-1.454.826-3.311.335-4.15-1.098m-.85-6.94A3.02 3.02 0 0 1 3.07 3.949v3.785a.51.51 0 0 0 .262.451l3.93 2.237-1.366.779a.05.05 0 0 1-.048 0L2.585 9.342a2.98 2.98 0 0 1-1.113-4.094zm11.216 2.571L8.747 5.576l1.362-.776a.05.05 0 0 1 .048 0l3.265 1.86a3 3 0 0 1 1.173 1.207 2.96 2.96 0 0 1-.27 3.2 3.05 3.05 0 0 1-1.36.997V8.279a.52.52 0 0 0-.276-.445m1.36-2.015-.097-.057-3.226-1.855a.53.53 0 0 0-.53 0L6.249 6.153V4.598a.04.04 0 0 1 .019-.04L9.533 2.7a3.07 3.07 0 0 1 3.257.139c.474.325.843.778 1.066 1.303.223.526.289 1.103.191 1.664zM5.503 8.575 4.139 7.8a.05.05 0 0 1-.026-.037V4.049c0-.57.166-1.127.476-1.607s.752-.864 1.275-1.105a3.08 3.08 0 0 1 3.234.41l-.096.054-3.23 1.838a.53.53 0 0 0-.265.455zm.742-1.577 1.758-1 1.762 1v2l-1.755 1-1.762-1z\" />\n </svg>\n )\n}\n\nexport function GoogleGeminiIcon({ className }: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" className={className} aria-label=\"Google Gemini\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2Z\" fill=\"#4285F4\" opacity=\"0.15\" />\n <path d=\"M12 2.5c5.25 0 9.5 4.25 9.5 9.5s-4.25 9.5-9.5 9.5S2.5 17.25 2.5 12 6.75 2.5 12 2.5Z\" stroke=\"#4285F4\" strokeWidth=\"1\" fill=\"none\" />\n <path d=\"M12 7L8 12l4 5 4-5-4-5Z\" fill=\"#4285F4\" />\n <path d=\"M12 7L8 12l4 5\" fill=\"#34A853\" />\n </svg>\n )\n}\n\n/** Returns the icon component and color for a model ID */\nexport function getModelIcon(modelId: string): {\n IconComponent: (props: IconProps) => React.ReactNode\n color: string\n providerLabel: string\n} {\n if (modelId.startsWith('anthropic.')) {\n return { IconComponent: AnthropicModelIcon, color: 'text-amber-600 dark:text-amber-400', providerLabel: 'Anthropic' }\n }\n if (modelId.startsWith('amazon.')) {\n return { IconComponent: AmazonNovaIcon, color: 'text-orange-500 dark:text-orange-400', providerLabel: 'Amazon' }\n }\n if (modelId.startsWith('meta.')) {\n return { IconComponent: MetaLlamaIcon, color: 'text-blue-500 dark:text-blue-400', providerLabel: 'Meta' }\n }\n if (modelId.startsWith('google.')) {\n return { IconComponent: GoogleGeminiIcon, color: 'text-blue-500 dark:text-blue-400', providerLabel: 'Google' }\n }\n if (modelId.startsWith('openai.')) {\n return { IconComponent: OpenAIModelIcon, color: 'text-emerald-500 dark:text-emerald-400', providerLabel: 'OpenAI' }\n }\n // fallback\n return { IconComponent: AnthropicModelIcon, color: 'text-gray-500 dark:text-gray-400', providerLabel: 'Custom' }\n}\n","/**\n * Visual editor for `AgentNodeConfig.outputSchema`.\n *\n * Maps onto the JSON-Schema-Draft-7 subset the Rust `AgentExecutor`\n * understands (#72). Authors compose a top-level object schema by\n * adding/removing fields; each field has a name, a primitive type, an\n * optional description, and a required toggle. Nested objects /\n * arrays-of-objects are supported one level deep — the recursive\n * `OutputSchemaBuilder` renders itself again for those.\n *\n * Round-trips losslessly with the JSON-Schema shape the engine reads,\n * which means hand-edited graphs stay editable in this builder so long\n * as they stick to the supported subset.\n */\n\nimport { useMemo } from 'react'\nimport { FormInput, FormSelect } from '@ui/components/form-input'\nimport { Button } from '@ui/components/button'\nimport type { AgentOutputSchema } from '../../contracts'\n\nexport type OutputSchemaBuilderProps = {\n /** Stored schema. `undefined` renders the \"no schema yet\" state with\n * a single button to create one. */\n value?: AgentOutputSchema\n onChange: (next: AgentOutputSchema | undefined) => void\n /** Recursion depth — used to cap the nesting UI offers (deeper trees\n * are still expressible by hand-editing JSON, but the visual builder\n * tops out at 2 to keep the page readable). */\n depth?: number\n}\n\nconst PRIMITIVE_TYPES: Array<{ value: 'string' | 'number' | 'integer' | 'boolean'; label: string }> = [\n { value: 'string', label: 'string' },\n { value: 'number', label: 'number' },\n { value: 'integer', label: 'integer' },\n { value: 'boolean', label: 'boolean' },\n]\n\nconst COMPLEX_TYPES: Array<{ value: 'object' | 'array'; label: string }> = [\n { value: 'object', label: 'object (nested)' },\n { value: 'array', label: 'array of objects' },\n]\n\nconst ALL_TYPES = [...PRIMITIVE_TYPES, ...COMPLEX_TYPES]\n\nexport function OutputSchemaBuilder({ value, onChange, depth = 0 }: OutputSchemaBuilderProps) {\n // Always derive `fields` so React hook order stays stable across the\n // empty / non-object / object branches below.\n const fields: FieldRow[] = useMemo(() => {\n if (!value || value.type !== 'object') return []\n return buildFieldRows(value)\n }, [value])\n\n if (!value) {\n return (\n <div className=\"rounded-xl border border-dashed border-slate-300 bg-slate-50/40 p-4 text-center dark:border-slate-700 dark:bg-slate-900/30\">\n <p className=\"mb-3 text-xs text-slate-500 dark:text-slate-400\">\n No schema yet — agent text is exposed as a raw string. Add a schema to enforce structured output.\n </p>\n <Button\n type=\"button\"\n outline\n onClick={() => onChange({ type: 'object', properties: {}, required: [] })}\n >\n + Add output schema\n </Button>\n </div>\n )\n }\n\n // Top-level must be an object — we only support arrays inline as field\n // types. If someone hand-edited the JSON to something else we coerce\n // back on the next save.\n if (value.type !== 'object') {\n return (\n <div className=\"rounded-xl border border-amber-300 bg-amber-50/40 p-3 text-xs text-amber-700 dark:border-amber-700 dark:bg-amber-900/20 dark:text-amber-300\">\n The visual builder only supports `type: object` at the top level. Convert manually or\n <button\n type=\"button\"\n className=\"ml-1 underline\"\n onClick={() => onChange({ type: 'object', properties: {}, required: [] })}\n >\n reset to object\n </button>.\n </div>\n )\n }\n\n const updateFields = (next: FieldRow[]) => {\n onChange(rowsToSchema(next))\n }\n\n const addField = () => {\n updateFields([\n ...fields,\n { name: '', type: 'string', description: '', required: false, child: undefined },\n ])\n }\n\n const removeField = (index: number) => {\n updateFields(fields.filter((_, i) => i !== index))\n }\n\n const patchField = (index: number, patch: Partial<FieldRow>) => {\n updateFields(fields.map((f, i) => (i === index ? { ...f, ...patch } : f)))\n }\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-slate-700 dark:text-slate-200\">\n Top-level fields\n </span>\n <button\n type=\"button\"\n className=\"text-xs text-rose-600 hover:text-rose-500\"\n onClick={() => onChange(undefined)}\n >\n Remove schema\n </button>\n </div>\n\n <div className=\"space-y-2\">\n {fields.map((field, index) => (\n <FieldEditor\n key={index}\n field={field}\n onChange={(patch) => patchField(index, patch)}\n onRemove={() => removeField(index)}\n depth={depth}\n />\n ))}\n <Button type=\"button\" outline onClick={addField}>+ Add field</Button>\n </div>\n </div>\n )\n}\n\n// ── Field row editor ──────────────────────────────────────────────\n\ntype FieldRow = {\n name: string\n type: 'string' | 'number' | 'integer' | 'boolean' | 'object' | 'array'\n description: string\n required: boolean\n /** Sub-schema for `object` (nested object) or `array` (item schema).\n * Empty for primitives. */\n child?: AgentOutputSchema\n}\n\nfunction FieldEditor({\n field,\n onChange,\n onRemove,\n depth,\n}: {\n field: FieldRow\n onChange: (patch: Partial<FieldRow>) => void\n onRemove: () => void\n depth: number\n}) {\n const handleTypeChange = (next: FieldRow['type']) => {\n if (next === 'object') {\n onChange({ type: next, child: { type: 'object', properties: {}, required: [] } })\n } else if (next === 'array') {\n onChange({ type: next, child: { type: 'object', properties: {}, required: [] } })\n } else {\n onChange({ type: next, child: undefined })\n }\n }\n\n const isComplex = field.type === 'object' || field.type === 'array'\n\n return (\n <div className=\"rounded-xl border border-slate-200 bg-slate-50/60 p-3 dark:border-slate-700 dark:bg-slate-900/40\">\n <div className=\"grid grid-cols-[1fr_140px_auto_auto] items-end gap-2\">\n <FormInput\n label=\"Name\"\n value={field.name}\n onValueChange={(name) => onChange({ name })}\n placeholder=\"recommendedPrice\"\n />\n <FormSelect\n label=\"Type\"\n value={field.type}\n options={ALL_TYPES.map((t) => ({ value: t.value, label: t.label }))}\n onValueChange={(t) => handleTypeChange(t as FieldRow['type'])}\n />\n <label className=\"flex items-center gap-2 pb-2 text-xs text-slate-700 dark:text-slate-200\">\n <input\n type=\"checkbox\"\n checked={field.required}\n onChange={(event) => onChange({ required: event.target.checked })}\n className=\"h-4 w-4 rounded border-slate-300\"\n />\n Required\n </label>\n <Button type=\"button\" plain onClick={onRemove}>Remove</Button>\n </div>\n\n <FormInput\n label=\"Description (optional)\"\n value={field.description}\n onValueChange={(description) => onChange({ description })}\n placeholder=\"What the model should put here\"\n />\n\n {isComplex && depth < 1 && (\n <div className=\"mt-3 rounded-lg border border-dashed border-slate-300 p-2 dark:border-slate-700\">\n <p className=\"mb-2 text-[11px] uppercase tracking-wider text-slate-400\">\n {field.type === 'array' ? 'Item shape' : 'Nested fields'}\n </p>\n <OutputSchemaBuilder\n value={field.child}\n onChange={(child) => onChange({ child })}\n depth={depth + 1}\n />\n </div>\n )}\n\n {isComplex && depth >= 1 && (\n <p className=\"mt-2 text-[11px] italic text-slate-500\">\n Deeper nesting is supported by the engine but not by this builder — edit the JSON\n directly if you need a third level.\n </p>\n )}\n </div>\n )\n}\n\n// ── Schema ↔ FieldRow translation ───────────────────────────────\n\nfunction buildFieldRows(schema: AgentOutputSchema): FieldRow[] {\n const properties = schema.properties ?? {}\n const required = new Set(schema.required ?? [])\n return Object.entries(properties).map(([name, subschema]) => {\n const t = subschema.type ?? 'string'\n const isObject = t === 'object'\n const isArray = t === 'array'\n return {\n name,\n type: isObject ? 'object' : isArray ? 'array' : (t as FieldRow['type']),\n description: subschema.description ?? '',\n required: required.has(name),\n child: isObject ? subschema : isArray ? subschema.items : undefined,\n }\n })\n}\n\nfunction rowsToSchema(rows: FieldRow[]): AgentOutputSchema {\n const properties: Record<string, AgentOutputSchema> = {}\n const required: string[] = []\n for (const row of rows) {\n const name = row.name.trim()\n if (!name) continue\n let entry: AgentOutputSchema\n if (row.type === 'object') {\n entry = row.child && row.child.type === 'object'\n ? row.child\n : { type: 'object', properties: {}, required: [] }\n } else if (row.type === 'array') {\n entry = {\n type: 'array',\n items: row.child ?? { type: 'object', properties: {}, required: [] },\n }\n } else {\n entry = { type: row.type as AgentOutputSchema['type'] }\n }\n if (row.description) entry.description = row.description\n properties[name] = entry\n if (row.required) required.push(name)\n }\n const out: AgentOutputSchema = { type: 'object', properties }\n if (required.length > 0) out.required = required\n return out\n}\n\nexport function defaultAgentOutputSchema(): AgentOutputSchema {\n return { type: 'object', properties: {}, required: [] }\n}\n","import { useState, useMemo, useCallback, useEffect } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { ToggleSwitch } from '@ui/components/toggle-switch'\nimport {\n CpuChipIcon, CommandLineIcon, CheckIcon, KeyIcon,\n UserCircleIcon, WrenchScrewdriverIcon, SparklesIcon,\n Cog6ToothIcon, PlayCircleIcon,\n} from '@heroicons/react/24/outline'\nimport { getFrameworkMeta, FRAMEWORK_META, getCompatibleModels, isModelCompatibleWithFramework, isFrameworkCompatibleWithProviders, type AgentFramework } from '../icons/agent-framework-icons'\nimport { getModelIcon } from '../icons/model-provider-icons'\nimport { GlassModal, type GlassModalSection } from '@ui/components/glass-modal'\nimport { SectionCard } from '@ui/components/card'\nimport { HeroBlock } from '@ui/components/hero-block'\nimport { Avatar } from '@ui/components/avatar'\nimport { StatusBadge } from '@ui/components/status-badge'\nimport { useWorkflowStore } from '../../store/workflow-store'\nimport { useModalStore } from '../../store/modal-store'\nimport type { AgentWithPrompts } from '../../types'\nimport type { AgentModel, AgentTool, AgentPersistPayload, AgentOutputSchema } from '../../contracts'\nimport { OutputSchemaBuilder } from '../agent-output-schema/output-schema-builder'\n\ntype AgentModalProps = {\n onSaved?: () => void\n /**\n * Called when the user clicks Save in the sidebar footer. The modal\n * collects its local editable state (profile + framework + prompt +\n * advanced + tools + connection) into a canonical payload so the\n * parent can decide how to persist (POST for create, PATCH for edit).\n * Returning a rejected promise re-opens the unsaved-changes banner.\n */\n onPersist?: (payload: AgentPersistPayload) => Promise<void>\n}\n\n// Single-page config — Cérebro, Motor and Ferramentas stack as\n// SectionCards in one scrollable pane (UX agent recommendation).\n// Resultados was removed from the modal entirely — execution\n// history is a workspace-level concern, not an agent-edit concern.\ntype TabId = 'config'\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`\n return `${(ms / 1000).toFixed(2)}s`\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction OutputCard({ label, value }: { label: string; value: unknown }) {\n const displayValue = typeof value === 'string' ? value : JSON.stringify(value, null, 2)\n const isLong = typeof displayValue === 'string' && displayValue.length > 120\n\n return (\n <div className=\"rounded-xl border border-white/20 bg-white/40 p-3 dark:border-white/10 dark:bg-white/5\">\n <p className=\"mb-1 text-[10px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {label}\n </p>\n {isLong ? (\n <pre className=\"max-h-40 overflow-auto whitespace-pre-wrap text-xs text-gray-800 dark:text-gray-200\">\n {displayValue}\n </pre>\n ) : (\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">{displayValue}</p>\n )}\n </div>\n )\n}\n\n/* Identity tab — quem é o agente. Avatar, nome, role (read-only),\n * descrição, tags, status. Sem ELO/temperature/modelo/framework\n * (esses vivem em Cérebro e Motor). */\nfunction IdentityTab({\n agent, t, onChanged,\n displayName, setDisplayName,\n description, setDescription,\n avatarUrl, setAvatarUrl,\n status, setStatus,\n tags, setTags,\n}: {\n agent: AgentWithPrompts; t: ReturnType<typeof useTranslations>\n onChanged: () => void\n displayName: string; setDisplayName: (v: string) => void\n description: string; setDescription: (v: string) => void\n avatarUrl: string; setAvatarUrl: (v: string) => void\n status: string; setStatus: (v: string) => void\n tags: string; setTags: (v: string) => void\n}) {\n const liveAvatar = avatarUrl || ((agent as Record<string, unknown>).avatar as string | undefined) || ''\n const [avatarEditOpen, setAvatarEditOpen] = useState(false)\n const touch = () => onChanged()\n\n const inputCard = 'liquid-surface w-full rounded-lg px-3 py-1.5 text-sm text-gray-800 outline-none transition-colors focus:ring-1 focus:ring-indigo-300/40 dark:text-gray-200 dark:focus:ring-indigo-500/20'\n\n return (\n <div className=\"relative overflow-hidden px-6 pb-8 pt-12\">\n {/* Status toggle pinned top-right */}\n <div className=\"absolute right-4 top-4 flex items-center gap-2 rounded-full bg-white/60 px-2.5 py-1 ring-1 ring-gray-200/50 dark:bg-gray-800/60 dark:ring-gray-700/50\">\n <span className={`text-[10px] font-semibold ${status === 'active' ? 'text-emerald-600 dark:text-emerald-400' : 'text-gray-500 dark:text-gray-400'}`}>\n {status === 'active'\n ? t('agentDrawer.statusActive', { _: 'Active' } as never)\n : t('agentDrawer.statusInactive', { _: 'Inactive' } as never)}\n </span>\n <ToggleSwitch\n size=\"sm\"\n color=\"green\"\n checked={status === 'active'}\n onChange={(checked) => { setStatus(checked ? 'active' : 'draft'); touch() }}\n label={t('agentDrawer.status', { _: 'Status' } as never)}\n />\n </div>\n\n {/* Avatar */}\n <div className=\"mb-4 flex justify-center\">\n <div className=\"group relative\">\n <div className=\"absolute inset-0 rounded-full bg-gradient-to-br from-purple-500 to-blue-500 opacity-40 blur-lg\" />\n {liveAvatar ? (\n <img\n src={liveAvatar}\n alt={displayName || agent.name}\n loading=\"lazy\"\n className=\"relative h-20 w-20 rounded-full bg-white object-cover shadow-xl ring-4 ring-white dark:bg-gray-800 dark:ring-gray-800\"\n />\n ) : (\n <div className=\"relative flex h-20 w-20 items-center justify-center rounded-full bg-gradient-to-br from-indigo-400 to-purple-500 shadow-xl ring-4 ring-white dark:ring-gray-800\">\n <CpuChipIcon className=\"h-10 w-10 text-white\" />\n </div>\n )}\n {/* Chip badge */}\n <div className=\"absolute -bottom-1 -right-1 flex h-6 w-6 items-center justify-center rounded-full bg-indigo-500 ring-2 ring-white dark:ring-gray-900\">\n <CpuChipIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n {/* Pencil edit affordance (visible on hover) */}\n <button\n type=\"button\"\n onClick={() => setAvatarEditOpen((open) => !open)}\n className=\"absolute -left-1 -top-1 flex h-6 w-6 items-center justify-center rounded-full bg-gray-900/70 text-white opacity-0 ring-2 ring-white transition-opacity hover:bg-gray-900 group-hover:opacity-100 dark:ring-gray-900\"\n aria-label={t('agentDrawer.avatarUrl', { _: 'Avatar URL' } as never)}\n title={t('agentDrawer.avatarUrl', { _: 'Avatar URL' } as never)}\n >\n <svg className=\"h-3 w-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" /></svg>\n </button>\n </div>\n </div>\n\n {avatarEditOpen && (\n <div className=\"mb-3 flex justify-center\">\n <input\n type=\"text\"\n value={avatarUrl}\n onChange={(event) => { setAvatarUrl(event.target.value); touch() }}\n placeholder=\"https://…\"\n className={`${inputCard} max-w-md text-center text-[11px]`}\n autoFocus\n />\n </div>\n )}\n\n {/* Editable name — input styled as the heading */}\n <input\n type=\"text\"\n value={displayName}\n onChange={(event) => { setDisplayName(event.target.value); touch() }}\n placeholder={agent.name}\n className=\"mx-auto mb-2 block w-full max-w-md bg-transparent text-center text-lg font-bold text-gray-900 outline-none transition-colors placeholder:text-gray-400 focus:outline-none focus:ring-1 focus:ring-indigo-300/40 dark:text-white\"\n aria-label={t('agentDrawer.displayName', { _: 'Display name' } as never)}\n />\n\n {/* Role badge — read-only summary from the agent record */}\n {agent.role && (\n <div className=\"mb-3 flex justify-center\">\n <span className=\"inline-flex items-center gap-1.5 rounded-full bg-white/60 px-3 py-1.5 text-xs font-medium text-gray-600 ring-1 ring-gray-200/50 dark:bg-gray-800/60 dark:text-gray-400 dark:ring-gray-700/50\">\n <svg className=\"h-3 w-3\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M6 6V5a3 3 0 013-3h2a3 3 0 013 3v1h2a2 2 0 012 2v3.57A22.952 22.952 0 0110 13a22.95 22.95 0 01-8-1.43V8a2 2 0 012-2h2zm2-1a1 1 0 011-1h2a1 1 0 011 1v1H8V5zm1 5a1 1 0 011-1h.01a1 1 0 110 2H10a1 1 0 01-1-1z\" clipRule=\"evenodd\" />\n <path d=\"M2 13.692V16a2 2 0 002 2h12a2 2 0 002-2v-2.308A24.974 24.974 0 0110 15c-2.796 0-5.487-.46-8-1.308z\" />\n </svg>\n {agent.role}\n </span>\n </div>\n )}\n\n {/* Editable description — text in glass card, expands as user types */}\n <div className=\"mx-auto mb-4 max-w-xl\">\n <textarea\n rows={2}\n value={description}\n onChange={(event) => { setDescription(event.target.value); touch() }}\n placeholder={t('agentDrawer.descriptionPlaceholder', { _: 'What this agent does, which tasks it\\'s good at' } as never)}\n className={`${inputCard} resize-none text-center text-xs`}\n />\n </div>\n\n {/* Tags */}\n <div className={`${inputCard} mt-2 flex items-center gap-2 !py-1.5`}>\n <span className=\"text-[9px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.tags', { _: 'Tags' } as never)}\n </span>\n <input\n type=\"text\"\n value={tags}\n onChange={(event) => { setTags(event.target.value); touch() }}\n placeholder={t('agentDrawer.tagsPlaceholder', { _: 'pricing, research, internal' } as never)}\n className=\"flex-1 bg-transparent text-[11px] text-gray-800 outline-none placeholder:text-gray-400 dark:text-gray-200\"\n />\n </div>\n\n {/* Prompt version + count */}\n <div className=\"relative mt-4 flex items-center justify-center gap-2 text-[10px] text-gray-400 dark:text-gray-500\">\n <span>v{agent.activePromptVersion}</span>\n <span>·</span>\n <span>{agent.promptCount} prompt{agent.promptCount === 1 ? '' : 's'}</span>\n </div>\n </div>\n )\n}\n\n/*\n ELO tier definitions — maps ELO ranges to model families, tokens, autonomy.\n Each provider family has models sorted by capability (low -> high).\n*/\nconst MODEL_FAMILIES: Record<string, Array<{ prefix: string; maxTokens: number; contextWindow: string }>> = {\n anthropic: [\n { prefix: 'anthropic.claude-haiku', maxTokens: 8192, contextWindow: '200K' },\n { prefix: 'anthropic.claude-sonnet', maxTokens: 8192, contextWindow: '1M' },\n { prefix: 'anthropic.claude-opus', maxTokens: 32768, contextWindow: '1M' },\n ],\n amazon: [\n { prefix: 'amazon.nova-lite', maxTokens: 5120, contextWindow: '300K' },\n { prefix: 'amazon.nova-pro', maxTokens: 5120, contextWindow: '300K' },\n ],\n google: [\n { prefix: 'google.gemini-3-flash', maxTokens: 8192, contextWindow: '1M' },\n { prefix: 'google.gemini-3-1-pro', maxTokens: 32768, contextWindow: '1M' },\n ],\n meta: [\n { prefix: 'meta.llama', maxTokens: 8192, contextWindow: '128K' },\n ],\n openai: [\n { prefix: 'openai.gpt-5-mini', maxTokens: 16384, contextWindow: '1M' },\n { prefix: 'openai.gpt-5-v', maxTokens: 32768, contextWindow: '1M' },\n ],\n}\n\nfunction getProviderFromModelId(modelId: string): string {\n if (modelId.startsWith('anthropic.')) return 'anthropic'\n if (modelId.startsWith('amazon.')) return 'amazon'\n if (modelId.startsWith('meta.')) return 'meta'\n if (modelId.startsWith('openai.')) return 'openai'\n if (modelId.startsWith('google.')) return 'google'\n return 'anthropic'\n}\n\n/** Family extractor — kept symmetric with `getProviderFromModelId`\n * but named for what it actually returns (the *model family*, not\n * the serving provider). E.g., `anthropic.claude-haiku-4.5` is the\n * Anthropic family — it may be served by Anthropic Direct OR by\n * Bedrock at runtime depending on which provider the user picks. */\nfunction getModelFamily(modelId: string): string {\n return getProviderFromModelId(modelId)\n}\n\n/** Which configured providers can serve a given model. Empty array\n * means no provider hosts this family — model is unselectable until\n * the user adds the right credential in Settings. */\nfunction findCompatibleProviders(\n modelId: string,\n providers: import('../../components/panels/node-palette').ModelProvider[],\n): import('../../components/panels/node-palette').ModelProvider[] {\n const family = getModelFamily(modelId)\n return providers.filter((p) => {\n const families = p.servedFamilies ?? [p.provider]\n return families.includes(family)\n })\n}\n\nfunction getEloTier(elo: number): {\n tierKey: string; autonomyKey: string\n color: string; barColor: string\n autonomyPercent: number; costPerTask: string\n familyIndex: number; temperature: number\n} {\n if (elo < 1200) return {\n tierKey: 'beginner', autonomyKey: 'autonomyLow',\n color: 'text-cyan-500', barColor: 'from-cyan-400 to-cyan-500',\n autonomyPercent: 25, costPerTask: '$0.005',\n familyIndex: 0, temperature: 0.7,\n }\n if (elo < 1600) return {\n tierKey: 'intermediate', autonomyKey: 'autonomyMedium',\n color: 'text-pink-500', barColor: 'from-pink-400 to-pink-500',\n autonomyPercent: 50, costPerTask: '$0.15',\n familyIndex: 1, temperature: 0.5,\n }\n if (elo < 2000) return {\n tierKey: 'advanced', autonomyKey: 'autonomyHigh',\n color: 'text-amber-500', barColor: 'from-amber-400 to-amber-500',\n autonomyPercent: 75, costPerTask: '$0.50',\n familyIndex: 1, temperature: 0.4,\n }\n return {\n tierKey: 'expert', autonomyKey: 'autonomyFull',\n color: 'text-emerald-500', barColor: 'from-emerald-400 to-emerald-500',\n autonomyPercent: 100, costPerTask: '$1.50',\n familyIndex: 2, temperature: 0.3,\n }\n}\n\ntype CapabilityCardProps = {\n elo: number\n setElo: (value: number) => void\n models: AgentModel[]\n selectedModelId: string\n setSelectedModelId: (id: string) => void\n temperature: number\n setTemperature: (value: number) => void\n onChanged: () => void\n t: (key: string) => string\n}\n\nfunction AgentCapabilityCard({ elo, setElo, models, selectedModelId, setSelectedModelId, temperature, setTemperature, onChanged, t }: CapabilityCardProps) {\n const tierInfo = getEloTier(elo)\n const eloPercent = Math.min(((elo - 800) / (2400 - 800)) * 100, 100)\n\n const provider = getProviderFromModelId(selectedModelId)\n const family = MODEL_FAMILIES[provider] ?? MODEL_FAMILIES.anthropic\n\n // When ELO slider changes, auto-select the right model in the family and adjust temperature\n const handleEloChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n const newElo = parseInt(event.target.value, 10)\n setElo(newElo)\n\n const newTier = getEloTier(newElo)\n const modelIndex = Math.min(newTier.familyIndex, family.length - 1)\n const targetPrefix = family[modelIndex].prefix\n\n // Find the actual model in the models array that matches this prefix\n const matchingModel = models.find((model) => model.id.startsWith(targetPrefix))\n if (matchingModel) {\n setSelectedModelId(matchingModel.id)\n }\n\n setTemperature(newTier.temperature)\n onChanged()\n }, [family, models, setSelectedModelId, setTemperature, onChanged])\n\n // When autonomy segment is clicked, jump to that tier's ELO midpoint\n const handleAutonomyClick = useCallback((level: number) => {\n const eloMap: Record<number, number> = { 25: 1000, 50: 1400, 75: 1800, 100: 2200 }\n const newElo = eloMap[level] ?? 1000\n setElo(newElo)\n\n const newTier = getEloTier(newElo)\n const modelIndex = Math.min(newTier.familyIndex, family.length - 1)\n const targetPrefix = family[modelIndex].prefix\n const matchingModel = models.find((model) => model.id.startsWith(targetPrefix))\n if (matchingModel) {\n setSelectedModelId(matchingModel.id)\n }\n\n setTemperature(newTier.temperature)\n onChanged()\n }, [family, models, setSelectedModelId, setTemperature, onChanged])\n\n // Resolve current model info\n const currentFamilyEntry = family.find((entry) => selectedModelId.startsWith(entry.prefix)) ?? family[0]\n const currentModelName = models.find((model) => model.id === selectedModelId)?.name ?? selectedModelId\n\n return (\n <div className=\"mx-4 mt-4 overflow-hidden rounded-xl border border-gray-200/30 bg-white/40 dark:border-white/10 dark:bg-white/5\">\n {/* ELO slider */}\n <div className=\"px-4 pt-3 pb-2\">\n <div className=\"mb-1 flex items-center justify-between\">\n <span className=\"text-[10px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">{t('agentDrawer.capabilityRating')}</span>\n <div className=\"flex items-baseline gap-1\">\n <span className={`text-lg font-bold tabular-nums ${tierInfo.color}`}>{elo}</span>\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">ELO</span>\n </div>\n </div>\n {/* Interactive ELO slider */}\n <div className=\"relative\">\n <div className=\"absolute inset-x-0 top-1/2 h-2 -translate-y-1/2 overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700\">\n <div\n className={`h-full rounded-full bg-gradient-to-r ${tierInfo.barColor} transition-all duration-300`}\n style={{ width: `${eloPercent}%` }}\n />\n {[1200, 1600, 2000].map((boundary) => (\n <div\n key={boundary}\n className=\"absolute top-0 h-full w-px bg-gray-400/40 dark:bg-gray-500/40\"\n style={{ left: `${((boundary - 800) / (2400 - 800)) * 100}%` }}\n />\n ))}\n </div>\n <input\n type=\"range\"\n min=\"800\"\n max=\"2400\"\n step=\"50\"\n value={elo}\n onChange={handleEloChange}\n aria-label={t('agentDrawer.capabilityRating')}\n aria-valuemin={800}\n aria-valuemax={2400}\n aria-valuenow={elo}\n aria-valuetext={`${elo} ELO — ${t(`agentDrawer.tier${tierInfo.tierKey.charAt(0).toUpperCase()}${tierInfo.tierKey.slice(1)}`)}`}\n className=\"relative z-10 h-5 w-full cursor-pointer appearance-none bg-transparent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 [&::-webkit-slider-thumb]:h-4 [&::-webkit-slider-thumb]:w-4 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-white [&::-webkit-slider-thumb]:shadow-lg dark:[&::-webkit-slider-thumb]:border-gray-900\"\n />\n <style>{`input[type=\"range\"]::-webkit-slider-thumb { background: ${\n elo < 1200 ? '#06b6d4' : elo < 1600 ? '#ec4899' : elo < 2000 ? '#f59e0b' : '#10b981'\n }; box-shadow: 0 0 6px ${\n elo < 1200 ? 'rgba(6,182,212,0.5)' : elo < 1600 ? 'rgba(236,72,153,0.5)' : elo < 2000 ? 'rgba(245,158,11,0.5)' : 'rgba(16,185,129,0.5)'\n }; }`}</style>\n </div>\n <div className=\"mt-0.5 flex justify-between text-[8px] text-gray-400 dark:text-gray-500\">\n <span>800</span>\n <span>1200</span>\n <span>1600</span>\n <span>2000</span>\n <span>2400</span>\n </div>\n </div>\n\n {/* Derived stats grid */}\n <div className=\"grid grid-cols-3 gap-px border-t border-gray-200/30 bg-gray-200/30 dark:border-white/10 dark:bg-white/10\">\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.model')}</p>\n <p className=\"truncate text-xs font-semibold text-gray-900 dark:text-white\">{currentModelName}</p>\n </div>\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.maxTokens')}</p>\n <p className=\"text-xs font-semibold text-gray-900 dark:text-white\">{currentFamilyEntry.maxTokens.toLocaleString()}</p>\n </div>\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.context')}</p>\n <p className=\"text-xs font-semibold text-gray-900 dark:text-white\">{currentFamilyEntry.contextWindow}</p>\n </div>\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.temperature')}</p>\n <p className=\"text-xs font-semibold text-gray-900 dark:text-white\">{temperature.toFixed(2)}</p>\n </div>\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.autonomy')}</p>\n <p className={`text-xs font-semibold ${tierInfo.color}`}>{t(`agentDrawer.${tierInfo.autonomyKey}`)}</p>\n </div>\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.costPerTask')}</p>\n <p className=\"text-xs font-semibold text-gray-900 dark:text-white\">{tierInfo.costPerTask}</p>\n </div>\n </div>\n\n {/* Clickable autonomy bar */}\n <div className=\"border-t border-gray-200/30 bg-white/60 px-4 py-2.5 dark:border-white/10 dark:bg-gray-900/60\">\n <div className=\"mb-1 flex items-center justify-between\">\n <span className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.autonomyLevel')}</span>\n <span className={`text-[10px] font-semibold ${tierInfo.color}`}>{t(`agentDrawer.${tierInfo.autonomyKey}`)}</span>\n </div>\n <div className=\"flex gap-1\">\n {[\n { level: 25, labelKey: 'autonomyLow' },\n { level: 50, labelKey: 'autonomyMedium' },\n { level: 75, labelKey: 'autonomyHigh' },\n { level: 100, labelKey: 'autonomyFull' },\n ].map(({ level, labelKey }) => (\n <button\n key={level}\n type=\"button\"\n onClick={() => handleAutonomyClick(level)}\n aria-label={t(`agentDrawer.${labelKey}`)}\n aria-pressed={level <= tierInfo.autonomyPercent}\n className={`h-2 flex-1 rounded-full transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 ${\n level <= tierInfo.autonomyPercent\n ? `bg-gradient-to-r ${tierInfo.barColor} hover:opacity-80`\n : 'bg-gray-200 hover:bg-gray-300 dark:bg-gray-700 dark:hover:bg-gray-600'\n }`}\n />\n ))}\n </div>\n <div className=\"mt-1 flex justify-between text-[7px] text-gray-400 dark:text-gray-500\">\n <span>{t('agentDrawer.autonomyLow')}</span>\n <span>{t('agentDrawer.autonomyMedium')}</span>\n <span>{t('agentDrawer.autonomyHigh')}</span>\n <span>{t('agentDrawer.autonomyFull')}</span>\n </div>\n </div>\n </div>\n )\n}\n\nfunction ConfigTab({ models, t, selectedModelId, setSelectedModelId, selectedFramework, setSelectedFramework, markDirty, connectedProviderTypes }: {\n models: AgentModel[]; t: ReturnType<typeof useTranslations>\n selectedModelId: string; setSelectedModelId: (id: string) => void\n selectedFramework: AgentFramework; setSelectedFramework: (fw: AgentFramework) => void\n markDirty: () => void\n connectedProviderTypes: string[]\n}) {\n const frameworkKeys = Object.keys(FRAMEWORK_META) as AgentFramework[]\n const hasProviderConstraints = connectedProviderTypes.length > 0\n const compatibleModels = getCompatibleModels(models, selectedFramework)\n\n // When framework changes and current model is incompatible, auto-select first compatible\n const handleFrameworkChange = useCallback((newFramework: AgentFramework) => {\n setSelectedFramework(newFramework)\n if (!isModelCompatibleWithFramework(selectedModelId, newFramework)) {\n const compatible = getCompatibleModels(models, newFramework)\n if (compatible.length > 0) {\n setSelectedModelId(compatible[0].id)\n }\n }\n markDirty()\n }, [selectedModelId, models, setSelectedFramework, setSelectedModelId, markDirty])\n\n return (\n <div className=\"space-y-5 p-4\">\n {/* Framework selector — choose first, it filters models */}\n <div>\n <label className=\"mb-2 block text-xs font-medium text-gray-500 dark:text-gray-400\">{t('agentDrawer.framework')}</label>\n <div className=\"flex flex-wrap gap-1.5\">\n {frameworkKeys.map((key) => {\n const meta = FRAMEWORK_META[key]\n const isSelected = key === selectedFramework\n const compatCount = getCompatibleModels(models, key).length\n const isCompatibleWithProviders = !hasProviderConstraints || isFrameworkCompatibleWithProviders(key, connectedProviderTypes)\n return (\n <button\n key={key}\n type=\"button\"\n onClick={() => handleFrameworkChange(key)}\n disabled={!isCompatibleWithProviders}\n className={`inline-flex items-center gap-1.5 rounded-full px-3 py-1.5 text-[10px] font-semibold transition-all ${\n !isCompatibleWithProviders\n ? 'cursor-not-allowed bg-gray-100 text-gray-400 opacity-40 dark:bg-white/5 dark:text-gray-500'\n : isSelected\n ? `${meta.badgeColor} ring-1 ring-current/20`\n : 'bg-gray-100 text-gray-500 hover:bg-gray-200 dark:bg-white/5 dark:text-gray-400 dark:hover:bg-white/10'\n }`}\n title={!isCompatibleWithProviders ? t('agentDrawer.frameworkIncompatible') : undefined}\n >\n <meta.IconComponent className=\"h-3.5 w-3.5\" />\n {meta.label}\n <span className=\"ml-0.5 text-[8px] opacity-60\">{compatCount}</span>\n </button>\n )\n })}\n </div>\n </div>\n\n {/* Model selector grid — filtered by framework */}\n <div>\n <label className=\"mb-2 block text-xs font-medium text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.model')}\n {compatibleModels.length < models.length && (\n <span className=\"ml-1.5 text-[10px] font-normal text-gray-400 dark:text-gray-500\">\n ({compatibleModels.length}/{models.length})\n </span>\n )}\n </label>\n <div className=\"grid grid-cols-2 gap-2\">\n {models.map((model) => {\n const isSelected = model.id === selectedModelId\n const isCompatible = isModelCompatibleWithFramework(model.id, selectedFramework)\n const { IconComponent, color, providerLabel } = getModelIcon(model.id)\n return (\n <button\n key={model.id}\n type=\"button\"\n disabled={!isCompatible}\n onClick={() => { setSelectedModelId(model.id); markDirty() }}\n className={`flex items-center gap-2.5 rounded-xl border px-3 py-2.5 text-left transition-all ${\n !isCompatible\n ? 'cursor-not-allowed border-gray-200/30 opacity-35 dark:border-white/5'\n : isSelected\n ? 'border-indigo-500/50 bg-indigo-50/50 ring-1 ring-indigo-500/30 dark:border-indigo-400/40 dark:bg-indigo-500/10'\n : 'border-gray-200/50 bg-gray-50/50 hover:border-gray-300 dark:border-white/10 dark:bg-white/5 dark:hover:border-white/20'\n }`}\n >\n <IconComponent className={`h-5 w-5 flex-shrink-0 ${isSelected && isCompatible ? color : 'text-gray-400 dark:text-gray-500'}`} />\n <div className=\"min-w-0\">\n <p className={`truncate text-xs font-semibold ${isSelected && isCompatible ? 'text-gray-900 dark:text-white' : 'text-gray-600 dark:text-gray-300'}`}>\n {model.name}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">{providerLabel}</p>\n </div>\n </button>\n )\n })}\n </div>\n </div>\n\n </div>\n )\n}\n\n/* ─── Prompt Tab — temperature + system prompt ─── */\n\nfunction PromptTab({\n agent, temperature, setTemperature, markDirty, t, promptText, setPromptText,\n outputSchema, setOutputSchema,\n}: {\n agent: AgentWithPrompts; temperature: number; setTemperature: (value: number) => void\n markDirty: () => void; t: ReturnType<typeof useTranslations>\n // Lifted so the parent `AgentModal` can emit the systemPrompt on save.\n promptText: string; setPromptText: (value: string) => void\n // Optional structured-output schema (issue #71/#72). Edited via the\n // `OutputSchemaBuilder` directly under the system prompt so the\n // author can write the prompt and the contract side-by-side.\n outputSchema: AgentOutputSchema | undefined\n setOutputSchema: (next: AgentOutputSchema | undefined) => void\n}) {\n // `agent` is still read in the existing implementation for historical\n // completeness — kept in props to avoid churning the other call-sites.\n void agent\n\n const handleTemperatureChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setTemperature(parseFloat(event.target.value))\n markDirty()\n }, [])\n\n const handlePromptChange = useCallback((event: React.ChangeEvent<HTMLTextAreaElement>) => {\n setPromptText(event.target.value)\n markDirty()\n }, [])\n\n const temperaturePercent = temperature * 100\n const isPrecise = temperature <= 0.3\n const isBalanced = temperature > 0.3 && temperature <= 0.7\n const isCreative = temperature > 0.7\n\n return (\n <div className=\"space-y-5 p-4\">\n {/* Temperature slider */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <label className=\"text-xs font-medium text-gray-500 dark:text-gray-400\">{t('agentDrawer.temperature')}</label>\n <span className=\"text-sm font-bold tabular-nums text-gray-900 dark:text-white\">\n {temperature.toFixed(2)}\n </span>\n </div>\n <div className=\"relative\">\n <div className=\"absolute inset-x-0 top-1/2 h-2 -translate-y-1/2 overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700\">\n <div\n className=\"h-full rounded-full transition-all duration-300 ease-out\"\n style={{ width: `${temperaturePercent}%`, background: 'linear-gradient(90deg, #3b82f6, #8b5cf6 50%, #ec4899)' }}\n />\n </div>\n <input\n type=\"range\" min=\"0\" max=\"1\" step=\"0.05\" value={temperature}\n onChange={handleTemperatureChange}\n aria-label={t('agentDrawer.temperature')}\n aria-valuenow={temperature}\n aria-valuetext={`${temperature.toFixed(2)} — ${isPrecise ? t('agentDrawer.precise') : isBalanced ? t('agentDrawer.balanced') : t('agentDrawer.creative')}`}\n className=\"relative z-10 h-5 w-full cursor-pointer appearance-none bg-transparent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 [&::-webkit-slider-thumb]:h-5 [&::-webkit-slider-thumb]:w-5 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-white [&::-webkit-slider-thumb]:shadow-lg dark:[&::-webkit-slider-thumb]:border-gray-900\"\n />\n <style>{`input[type=\"range\"]::-webkit-slider-thumb { background: ${isPrecise ? '#3b82f6' : isBalanced ? '#8b5cf6' : '#ec4899'}; box-shadow: 0 0 8px ${isPrecise ? 'rgba(59,130,246,0.5)' : isBalanced ? 'rgba(139,92,246,0.5)' : 'rgba(236,72,153,0.5)'}; }`}</style>\n </div>\n <div className=\"mt-1 flex items-center justify-between\">\n <span className={`text-[10px] font-medium transition-colors ${isPrecise ? 'text-blue-500' : 'text-gray-400 dark:text-gray-500'}`}>{t('agentDrawer.precise')}</span>\n <span className={`text-[10px] font-medium transition-colors ${isBalanced ? 'text-purple-500' : 'text-gray-400 dark:text-gray-500'}`}>{t('agentDrawer.balanced')}</span>\n <span className={`text-[10px] font-medium transition-colors ${isCreative ? 'text-pink-500' : 'text-gray-400 dark:text-gray-500'}`}>{t('agentDrawer.creative')}</span>\n </div>\n </div>\n\n {/* System prompt */}\n <div>\n <div className=\"mb-1 flex items-center justify-between\">\n <label className=\"text-xs font-medium text-gray-500 dark:text-gray-400\">{t('agentDrawer.systemPrompt')}</label>\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">{promptText.length} chars</span>\n </div>\n <textarea\n value={promptText}\n onChange={handlePromptChange}\n rows={12}\n className=\"w-full resize-y rounded-lg border border-gray-200/50 bg-gray-50/50 px-3 py-2.5 font-mono text-xs leading-relaxed text-gray-700 outline-none transition-colors placeholder:text-gray-400 focus:border-indigo-300/50 focus:ring-1 focus:ring-indigo-300/30 dark:border-white/10 dark:bg-white/5 dark:text-gray-300 dark:placeholder:text-gray-500 dark:focus:border-indigo-500/30 dark:focus:ring-indigo-500/20\"\n placeholder={t('agentDrawer.systemPromptPlaceholder')}\n />\n </div>\n\n {/* Output schema — visual builder for the JSON-Schema subset the\n engine validates against (#71/#72). Empty by default; opens\n to a row-per-field form when the author hits \"+ Add output\n schema\". */}\n <div>\n <label className=\"mb-1 block text-xs font-medium text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.outputSchema', { _: 'Output schema (optional)' } as never)}\n </label>\n <p className=\"mb-2 text-[11px] text-gray-400 dark:text-gray-500\">\n {t('agentDrawer.outputSchemaHint', {\n _: 'Define the structured JSON the model must return. The engine parses + validates and exposes it under `output.parsed`. Invalid output fails the node.',\n } as never)}\n </p>\n <OutputSchemaBuilder\n value={outputSchema}\n onChange={(next) => { setOutputSchema(next); markDirty() }}\n />\n </div>\n </div>\n )\n}\n\nfunction ResultsTab({ agentId, t }: { agentId: string; t: ReturnType<typeof useTranslations> }) {\n const nodeResults = useWorkflowStore((state) => state.nodeResults)\n\n const agentResult = useMemo(() => {\n return nodeResults[agentId] ?? null\n }, [nodeResults, agentId])\n\n if (!agentResult) {\n return (\n <div className=\"flex flex-col items-center justify-center px-4 py-12 text-center\">\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">{t('agentDrawer.noResults')}</p>\n </div>\n )\n }\n\n const outputs = isRecord(agentResult.data) ? agentResult.data : null\n\n return (\n <div className=\"space-y-4 p-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-medium text-gray-500 dark:text-gray-400\">{t('agentDrawer.status')}</span>\n <StatusBadge\n status={agentResult.status}\n size=\"sm\"\n statusConfig={{\n pending: { label: 'pending', tone: 'neutral' },\n running: { label: 'running', tone: 'info' },\n success: { label: 'success', tone: 'success' },\n error: { label: 'error', tone: 'error' },\n }}\n />\n </div>\n {agentResult.durationMs != null && (\n <span className=\"text-xs text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.duration')}: {formatDuration(agentResult.durationMs)}\n </span>\n )}\n </div>\n\n {agentResult.error && (\n <div className=\"rounded-xl border border-red-200 bg-red-50 p-3 dark:border-red-900/30 dark:bg-red-900/10\">\n <p className=\"text-xs font-medium text-red-800 dark:text-red-300\">{agentResult.error}</p>\n </div>\n )}\n\n {outputs && Object.keys(outputs).length > 0 && (\n <div className=\"space-y-3\">\n <h4 className=\"text-xs font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.outputVariables')}\n </h4>\n {Object.entries(outputs).map(([key, value]) => (\n <OutputCard key={key} label={key} value={value} />\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/* ─── CDN logos for model providers ─── */\n\nconst SI = (slug: string, color: string) => `https://cdn.simpleicons.org/${slug}/${color}`\n\nconst PROVIDER_LOGOS: Record<string, string> = {\n anthropic: SI('anthropic', 'D4A27F'),\n amazon: 'https://www.svgrepo.com/show/448266/aws.svg',\n google: SI('googlegemini', '8E75B2'),\n openai: 'https://www.svgrepo.com/show/306500/openai.svg',\n meta: SI('meta', '0668E1'),\n aws_bedrock: 'https://www.svgrepo.com/show/448266/aws.svg',\n openai_api: 'https://www.svgrepo.com/show/306500/openai.svg',\n google_vertex: SI('googlegemini', '8E75B2'),\n azure_openai: SI('microsoftazure', '0078D4'),\n anthropic_api: SI('anthropic', 'D4A27F'),\n}\n\n/* ─── Models Tab — select model provider + model for this agent ─── */\n\nfunction ModelsTab({ modelProviders, selectedProviderId, onSelectProvider, models, selectedModelId, onSelectModel, agentFramework, t }: {\n modelProviders: import('../../components/panels/node-palette').ModelProvider[]\n selectedProviderId: string\n onSelectProvider: (id: string) => void\n models: AgentModel[]\n selectedModelId: string\n onSelectModel: (modelId: string) => void\n agentFramework: string\n t: ReturnType<typeof useTranslations>\n}) {\n if (modelProviders.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center px-4 py-12 text-center\">\n <KeyIcon className=\"mb-2 h-8 w-8 text-gray-400 dark:text-gray-500\" />\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">{t('agentDrawer.noProvidersAvailable')}</p>\n <p className=\"mt-1 text-xs text-gray-400 dark:text-gray-500\">{t('agentDrawer.dragProviderHint')}</p>\n </div>\n )\n }\n\n // Build model list attributed to providers\n // If same model available from multiple providers, show disambiguation\n const modelsByProvider = modelProviders.map((provider) => ({\n provider,\n models: models.filter((m) => {\n // Model is available from this provider if the provider type matches the model's provider prefix\n const modelProvider = m.id.split('.')[0]\n return provider.provider === modelProvider || provider.provider === 'amazon' && modelProvider === 'anthropic' /* Bedrock serves Claude */\n || provider.provider === 'amazon' && modelProvider === 'amazon'\n || provider.provider === 'amazon' && modelProvider === 'meta'\n }),\n }))\n\n return (\n <div className=\"space-y-4 p-4\">\n {/* Provider selector */}\n <div>\n <label className=\"mb-2 block text-xs font-medium text-gray-500 dark:text-gray-400\">{t('agentDrawer.selectProvider')}</label>\n <div className=\"space-y-1.5\">\n {modelProviders.map((provider) => {\n const isSelected = selectedProviderId === provider.id\n const logo = PROVIDER_LOGOS[provider.provider]\n return (\n <button\n key={provider.id}\n type=\"button\"\n onClick={() => onSelectProvider(provider.id)}\n className={`flex w-full items-center gap-3 rounded-xl border px-3 py-2.5 text-left transition-all ${\n isSelected\n ? 'border-indigo-500/30 bg-indigo-50/50 ring-1 ring-indigo-500/20 dark:border-indigo-400/20 dark:bg-indigo-500/5'\n : 'border-gray-200/50 bg-gray-50/30 hover:border-gray-300 dark:border-white/10 dark:bg-white/[0.02] dark:hover:border-white/20'\n }`}\n >\n {logo ? (\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-white/10 p-1\">\n <img src={logo} alt=\"\" className=\"h-5 w-5 object-contain\" loading=\"lazy\" />\n </div>\n ) : (\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-gradient-to-br from-slate-500 to-gray-600\">\n <KeyIcon className=\"h-4 w-4 text-white\" />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <p className={`text-xs font-medium ${isSelected ? 'text-gray-900 dark:text-white' : 'text-gray-600 dark:text-gray-400'}`}>\n {provider.name}\n </p>\n <div className=\"flex items-center gap-1.5 text-[10px] text-gray-400 dark:text-gray-500\">\n <span>{provider.modelCount} models</span>\n {provider.configured && <span className=\"h-1.5 w-1.5 rounded-full bg-green-500\" />}\n </div>\n </div>\n <div className={`flex h-4 w-4 shrink-0 items-center justify-center rounded-full transition-all ${\n isSelected ? 'bg-indigo-500 text-white' : 'border border-gray-300 dark:border-gray-600'\n }`}>\n {isSelected && <CheckIcon className=\"h-2.5 w-2.5\" />}\n </div>\n </button>\n )\n })}\n </div>\n </div>\n\n {/* Models from selected provider — filtered by framework compatibility */}\n {selectedProviderId && (() => {\n const providerModels = modelsByProvider.find((p) => p.provider.id === selectedProviderId)\n if (!providerModels || providerModels.models.length === 0) return (\n <p className=\"text-xs text-gray-400 dark:text-gray-500\">{t('agentDrawer.noModelsForProvider')}</p>\n )\n\n const compatibleModels = providerModels.models.filter((m) =>\n isModelCompatibleWithFramework(m.id, agentFramework as AgentFramework)\n )\n const incompatibleModels = providerModels.models.filter((m) =>\n !isModelCompatibleWithFramework(m.id, agentFramework as AgentFramework)\n )\n\n return (\n <div>\n <label className=\"mb-2 block text-xs font-medium text-gray-500 dark:text-gray-400\">{t('agentDrawer.selectModel')}</label>\n <div className=\"space-y-1\">\n {compatibleModels.map((model) => {\n const isSelected = selectedModelId === model.id\n const { IconComponent, color, providerLabel } = getModelIcon(model.id)\n return (\n <button\n key={model.id}\n type=\"button\"\n onClick={() => onSelectModel(model.id)}\n className={`flex w-full items-center gap-2.5 rounded-lg border px-3 py-2 text-left transition-all ${\n isSelected\n ? 'border-indigo-500/50 bg-indigo-50/50 ring-1 ring-indigo-500/30 dark:border-indigo-400/40 dark:bg-indigo-500/10'\n : 'border-gray-200/50 bg-gray-50/50 hover:border-gray-300 dark:border-white/10 dark:bg-white/5 dark:hover:border-white/20'\n }`}\n >\n <IconComponent className={`h-4 w-4 flex-shrink-0 ${isSelected ? color : 'text-gray-400 dark:text-gray-500'}`} />\n <div className=\"min-w-0 flex-1\">\n <p className={`text-xs font-semibold ${isSelected ? 'text-gray-900 dark:text-white' : 'text-gray-600 dark:text-gray-300'}`}>\n {model.name}\n </p>\n <p className=\"text-[10px] text-gray-400 dark:text-gray-500\">{providerLabel}</p>\n </div>\n {isSelected && <CheckIcon className=\"h-3.5 w-3.5 shrink-0 text-indigo-500\" />}\n </button>\n )\n })}\n {incompatibleModels.length > 0 && (\n <>\n <div className=\"mt-2 mb-1 text-[9px] font-medium text-gray-400 dark:text-gray-500\">\n {t('agentDrawer.incompatibleWithFramework')}\n </div>\n {incompatibleModels.map((model) => (\n <div key={model.id} className=\"flex items-center gap-2.5 rounded-lg border border-gray-200/30 px-3 py-2 opacity-40 dark:border-white/5\">\n <CpuChipIcon className=\"h-4 w-4 text-gray-400\" />\n <p className=\"text-xs text-gray-500\">{model.name}</p>\n </div>\n ))}\n </>\n )}\n </div>\n </div>\n )\n })()}\n </div>\n )\n}\n\n/* ─── Tools Tab — toggle agent tools for this agent ─── */\n\nfunction ToolsTab({ agentTools, enabledToolIds, onToggle, agentFramework, t }: {\n agentTools: AgentTool[]\n enabledToolIds: Set<string>\n onToggle: (toolId: string) => void\n agentFramework: string\n t: ReturnType<typeof useTranslations>\n}) {\n if (agentTools.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center px-4 py-12 text-center\">\n <CommandLineIcon className=\"mb-2 h-8 w-8 text-gray-400 dark:text-gray-500\" />\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">{t('agentDrawer.noToolsAvailable')}</p>\n </div>\n )\n }\n\n // Sort: compatible tools first, then incompatible\n const sortedTools = [...agentTools].sort((a, b) => {\n const aCompat = !a.compatibleFrameworks || a.compatibleFrameworks.length === 0 || a.compatibleFrameworks.includes(agentFramework)\n const bCompat = !b.compatibleFrameworks || b.compatibleFrameworks.length === 0 || b.compatibleFrameworks.includes(agentFramework)\n if (aCompat && !bCompat) return -1\n if (!aCompat && bCompat) return 1\n return 0\n })\n\n return (\n <div className=\"space-y-2 p-4\">\n <p className=\"mb-3 text-xs text-gray-500 dark:text-gray-400\">{t('agentDrawer.toolsDescription')}</p>\n {sortedTools.map((tool) => {\n const isEnabled = enabledToolIds.has(tool.agentToolId)\n const isCompatible = !tool.compatibleFrameworks || tool.compatibleFrameworks.length === 0 || tool.compatibleFrameworks.includes(agentFramework)\n return (\n <button\n key={tool.agentToolId}\n type=\"button\"\n onClick={() => onToggle(tool.agentToolId)}\n className={`flex w-full items-center gap-3 rounded-xl border px-4 py-3 text-left transition-all ${\n !isCompatible\n ? 'border-gray-200/30 opacity-40 dark:border-white/5'\n : isEnabled\n ? 'border-amber-500/30 bg-amber-50/50 dark:border-amber-400/20 dark:bg-amber-500/5'\n : 'border-gray-200/50 bg-gray-50/30 hover:border-gray-300 dark:border-white/10 dark:bg-white/[0.02] dark:hover:border-white/20'\n }`}\n disabled={!isCompatible}\n >\n <div className={`flex h-8 w-8 shrink-0 items-center justify-center rounded-lg ${\n isEnabled ? 'bg-gradient-to-br from-amber-400 to-orange-500' : 'bg-gray-200 dark:bg-gray-700'\n }`}>\n <CommandLineIcon className={`h-4 w-4 ${isEnabled ? 'text-white' : 'text-gray-500 dark:text-gray-400'}`} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1.5\">\n <p className={`text-sm font-medium ${isEnabled ? 'text-gray-900 dark:text-white' : 'text-gray-600 dark:text-gray-400'}`}>\n {tool.name}\n </p>\n {!isCompatible && (\n <span className=\"rounded-full bg-gray-100 px-1.5 py-0.5 text-[8px] font-medium text-gray-500 dark:bg-white/10 dark:text-gray-400\">\n incompatible\n </span>\n )}\n </div>\n {tool.description && (\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">{tool.description}</p>\n )}\n {/* SDK compatibility pills */}\n {tool.compatibleFrameworks && tool.compatibleFrameworks.length > 0 && (\n <div className=\"mt-1 flex flex-wrap gap-0.5\">\n {tool.compatibleFrameworks.map((framework) => {\n const meta = getFrameworkMeta(framework)\n const isCurrentFw = framework === agentFramework\n return (\n <span key={framework} className={`inline-flex items-center gap-0.5 rounded px-1.5 py-0.5 text-[8px] font-medium ${isCurrentFw ? meta.badgeColor : 'bg-gray-100 text-gray-500 dark:bg-white/5 dark:text-gray-400'}`}>\n <meta.IconComponent className=\"h-2.5 w-2.5\" />\n {meta.label}\n </span>\n )\n })}\n </div>\n )}\n </div>\n <div className={`flex h-5 w-5 shrink-0 items-center justify-center rounded-full transition-all ${\n isEnabled\n ? 'bg-amber-500 text-white'\n : 'border border-gray-300 dark:border-gray-600'\n }`}>\n {isEnabled && <CheckIcon className=\"h-3 w-3\" />}\n </div>\n <div\n className=\"shrink-0\"\n onClick={(event) => {\n event.stopPropagation()\n }}\n >\n <ToggleSwitch\n checked={isEnabled}\n onChange={() => onToggle(tool.agentToolId)}\n disabled={!isCompatible}\n size=\"sm\"\n color=\"indigo\"\n label={`${tool.name} enabled`}\n />\n </div>\n </button>\n )\n })}\n </div>\n )\n}\n\n/**\n * AdvancedTab — the backend entity `astrlabe.agents` has a dozen columns\n * the original modal never surfaced. This tab exposes the remainder\n * (displayName, description, maxOutputTokens, topP, topK, tags, status)\n * so admins can edit them without dropping to SQL.\n */\n\n/* Engine tab — como o agente roda. ELO slider é a decisão primária\n * (auto-seleciona modelo na família + ajusta temperature). O modelo\n * derivado aparece como **consequência visível**, não como input.\n * `<details>` \"Avançado\" expõe framework chips + manual model\n * override + tokens/top_p/top_k. Provider credentials viram cards\n * read-only com link \"Gerenciar credenciais →\" (settings global). */\nfunction EngineTab({\n agent, models, t,\n selectedModelId, setSelectedModelId,\n selectedFramework, setSelectedFramework,\n temperature, setTemperature,\n elo, setElo,\n maxOutputTokens, setMaxOutputTokens,\n topP, setTopP,\n topK, setTopK,\n modelProviders,\n selectedProviderId,\n onSelectProvider,\n markDirty,\n}: {\n agent: AgentWithPrompts\n models: AgentModel[]\n t: ReturnType<typeof useTranslations>\n selectedModelId: string; setSelectedModelId: (id: string) => void\n selectedFramework: AgentFramework; setSelectedFramework: (fw: AgentFramework) => void\n temperature: number; setTemperature: (v: number) => void\n elo: number; setElo: (v: number) => void\n maxOutputTokens: number; setMaxOutputTokens: (v: number) => void\n topP: number; setTopP: (v: number) => void\n topK: number; setTopK: (v: number) => void\n modelProviders: import('../../components/panels/node-palette').ModelProvider[]\n selectedProviderId: string\n onSelectProvider: (id: string) => void\n markDirty: () => void\n}) {\n void agent\n const modelObj = models.find((m) => m.id === selectedModelId)\n const modelName = modelObj?.name ?? selectedModelId ?? '—'\n const family = getModelFamily(selectedModelId)\n // All providers that can serve THIS model family. The user picks\n // one explicitly (or we pick the first configured one as default).\n const compatibleProviders = findCompatibleProviders(selectedModelId, modelProviders)\n const configuredCompatible = compatibleProviders.filter((p) => p.configured)\n const effectiveProvider =\n compatibleProviders.find((p) => p.id === selectedProviderId)\n ?? configuredCompatible[0]\n ?? compatibleProviders[0]\n const frameworkMeta = getFrameworkMeta(selectedFramework)\n const inputCard = 'liquid-surface w-full rounded-lg px-3 py-1.5 text-sm text-gray-800 outline-none transition-colors focus:ring-1 focus:ring-indigo-300/40 dark:text-gray-200 dark:focus:ring-indigo-500/20'\n\n return (\n <div className=\"p-5\">\n {/* Unified ELO → Model card. The slider, the derived model,\n and the Override (Avançado) section all live inside ONE\n rounded surface with a vertical accent line on the left\n that ties the three sections together visually. This makes\n the cause→effect→override flow obvious. */}\n <div className=\"overflow-hidden rounded-2xl border border-indigo-500/20 bg-gradient-to-b from-indigo-500/[0.04] via-violet-500/[0.03] to-purple-500/[0.04] dark:border-indigo-400/20 dark:from-indigo-500/[0.10] dark:via-violet-500/[0.06] dark:to-purple-500/[0.08]\">\n\n {/* 1) ELO slider — entrada canônica */}\n <div className=\"px-4 pb-3 pt-4\">\n <AgentCapabilityCard\n elo={elo} setElo={setElo}\n models={models}\n selectedModelId={selectedModelId} setSelectedModelId={setSelectedModelId}\n temperature={temperature} setTemperature={setTemperature}\n onChanged={markDirty}\n t={t}\n />\n </div>\n\n {/* \"derives\" connector — small chevron between ELO and Model */}\n <div className=\"flex items-center gap-2 px-4 text-[9px] font-semibold uppercase tracking-wider text-indigo-500/70 dark:text-indigo-400/70\">\n <div className=\"h-px flex-1 bg-gradient-to-r from-transparent via-indigo-500/30 to-transparent\" />\n <span>↓ {t('agentDrawer.derives', { _: 'deriva' } as never)}</span>\n <div className=\"h-px flex-1 bg-gradient-to-r from-transparent via-indigo-500/30 to-transparent\" />\n </div>\n\n {/* 2) Modelo selecionado — consequência da ELO + provider chip */}\n <div className=\"px-4 py-3\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-start gap-2\">\n <CpuChipIcon className=\"mt-0.5 h-5 w-5 text-indigo-500 dark:text-indigo-400\" />\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-gray-900 dark:text-white\">{modelName}</p>\n {compatibleProviders.length === 0 ? (\n <p className=\"text-[10px] text-amber-600 dark:text-amber-400\">\n {t('agentDrawer.noProviderForFamily', { _: 'Nenhum provedor configurado serve a família ' + family } as never)}\n </p>\n ) : configuredCompatible.length > 1 ? (\n <div className=\"mt-1 flex items-center gap-1.5\">\n <span className=\"text-[10px] text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.servedVia', { _: 'via' } as never)}\n </span>\n <select\n value={effectiveProvider?.id ?? ''}\n onChange={(event) => { onSelectProvider(event.target.value); markDirty() }}\n className=\"liquid-surface rounded-md px-2 py-0.5 text-[10px] font-semibold text-gray-900 outline-none focus:ring-1 focus:ring-indigo-300/40 dark:text-white\"\n >\n {configuredCompatible.map((p) => (\n <option key={p.id} value={p.id}>{p.name}</option>\n ))}\n </select>\n {effectiveProvider && (\n <span className={`inline-flex items-center gap-1 rounded-full px-1.5 py-0.5 text-[9px] font-semibold ${effectiveProvider.configured ? 'bg-emerald-500/10 text-emerald-600 dark:text-emerald-400' : 'bg-amber-500/10 text-amber-600 dark:text-amber-400'}`}>\n <span className={`h-1 w-1 rounded-full ${effectiveProvider.configured ? 'bg-emerald-500' : 'bg-amber-500'}`} />\n {effectiveProvider.configured ? t('agentDrawer.configured', { _: 'connected' } as never) : t('agentDrawer.setup', { _: 'setup' } as never)}\n </span>\n )}\n </div>\n ) : (\n <p className=\"text-[10px] text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.servedVia', { _: 'via' } as never)} {effectiveProvider?.name ?? family}\n {effectiveProvider && (\n <span className={`ml-2 inline-flex items-center gap-1 rounded-full px-1.5 py-0.5 text-[9px] font-semibold ${effectiveProvider.configured ? 'bg-emerald-500/10 text-emerald-600 dark:text-emerald-400' : 'bg-amber-500/10 text-amber-600 dark:text-amber-400'}`}>\n <span className={`h-1 w-1 rounded-full ${effectiveProvider.configured ? 'bg-emerald-500' : 'bg-amber-500'}`} />\n {effectiveProvider.configured ? t('agentDrawer.configured', { _: 'connected' } as never) : t('agentDrawer.setup', { _: 'setup' } as never)}\n </span>\n )}\n </p>\n )}\n </div>\n </div>\n <span className={`inline-flex shrink-0 items-center gap-1.5 rounded-full px-3 py-1 text-[10px] font-semibold ${frameworkMeta.badgeColor}`}>\n <frameworkMeta.IconComponent className=\"h-3.5 w-3.5\" />\n {frameworkMeta.label}\n </span>\n </div>\n </div>\n\n {/* 3) Override (Avançado) — visual subordinado ao mesmo card,\n collapsed por default. Quando aberto, mostra que está\n OVERRIDING a derivação acima. */}\n <details className=\"group border-t border-indigo-500/15 bg-white/30 px-4 py-2.5 dark:border-indigo-400/15 dark:bg-white/[0.02]\">\n <summary className=\"flex cursor-pointer items-center gap-2 text-[10px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n <Cog6ToothIcon className=\"h-3 w-3\" />\n <span>{t('agentDrawer.overrideDerivation', { _: 'Override · ajustes avançados' } as never)}</span>\n <span className=\"ml-auto font-normal text-gray-400 group-open:hidden\">▾</span>\n <span className=\"ml-auto hidden font-normal text-gray-400 group-open:inline\">▴</span>\n </summary>\n <p className=\"mt-1 text-[10px] italic text-gray-400 dark:text-gray-500\">\n {t('agentDrawer.overrideHint', { _: 'Mude framework, modelo manual ou tokens só se a derivação por ELO não atender.' } as never)}\n </p>\n <div className=\"mt-3 space-y-4\">\n {/* Framework + manual model override (reusa ConfigTab) */}\n <ConfigTab\n models={models}\n t={t}\n selectedModelId={selectedModelId} setSelectedModelId={setSelectedModelId}\n selectedFramework={selectedFramework} setSelectedFramework={setSelectedFramework}\n markDirty={markDirty}\n connectedProviderTypes={modelProviders.map((p) => p.provider)}\n />\n\n {/* Generation params */}\n <div>\n <p className=\"mb-2 text-[10px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.generationParams', { _: 'Parâmetros de geração' } as never)}\n </p>\n <div className=\"grid grid-cols-3 gap-2\">\n {(\n [\n { key: 'max', labelKey: 'agentDrawer.maxOutputTokens', label: 'Max output', value: maxOutputTokens, setter: setMaxOutputTokens, step: 1, min: 1, max: 32768 },\n { key: 'topP', labelKey: 'agentDrawer.topP', label: 'Top-p', value: topP, setter: setTopP, step: 0.05, min: 0, max: 1 },\n { key: 'topK', labelKey: 'agentDrawer.topK', label: 'Top-k', value: topK, setter: setTopK, step: 1, min: 0, max: 500 },\n ] as const\n ).map((field) => (\n <div key={field.key} className={`${inputCard} flex flex-col items-center !py-2`}>\n <span className=\"text-[8px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {t(field.labelKey, { _: field.label } as never)}\n </span>\n <input\n type=\"number\"\n step={field.step} min={field.min} max={field.max}\n value={field.value}\n onChange={(event) => { field.setter(Number(event.target.value) || 0); markDirty() }}\n className=\"w-full bg-transparent text-center text-sm font-semibold tabular-nums text-gray-900 outline-none dark:text-white\"\n />\n </div>\n ))}\n </div>\n </div>\n\n {/* Provider credentials — read-only, link pra Settings */}\n {modelProviders.length > 0 && (\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <p className=\"text-[10px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.providerCredentials', { _: 'Credenciais do provedor' } as never)}\n </p>\n <a\n href=\"/settings/integrations\"\n className=\"text-[10px] font-medium text-indigo-600 hover:text-indigo-700 dark:text-indigo-400 dark:hover:text-indigo-300\"\n >\n {t('agentDrawer.manageCredentials', { _: 'Gerenciar →' } as never)}\n </a>\n </div>\n <div className=\"space-y-1\">\n {modelProviders.map((provider) => (\n <div\n key={provider.id}\n className=\"flex items-center gap-2 rounded-lg border border-gray-200/50 bg-white/40 px-3 py-1.5 dark:border-white/10 dark:bg-white/[0.03]\"\n >\n <KeyIcon className=\"h-3 w-3 shrink-0 text-gray-500 dark:text-gray-400\" />\n <span className=\"text-[11px] font-semibold text-gray-900 dark:text-white\">{provider.name}</span>\n <span className={`shrink-0 rounded-full px-1.5 py-0.5 text-[8px] font-semibold uppercase ${provider.configured ? 'bg-emerald-500/10 text-emerald-600 dark:text-emerald-400' : 'bg-amber-500/10 text-amber-600 dark:text-amber-400'}`}>\n {provider.configured ? t('agentDrawer.configured', { _: 'connected' } as never) : t('agentDrawer.setup', { _: 'setup' } as never)}\n </span>\n {provider.apiKeyMasked && (\n <span className=\"ml-auto truncate font-mono text-[9px] text-gray-400 dark:text-gray-500\" title={provider.credentialRef}>\n {provider.apiKeyMasked}\n </span>\n )}\n </div>\n ))}\n </div>\n <p className=\"mt-2 text-[10px] text-gray-400 dark:text-gray-500\">\n {selectedProviderId ? '' : t('agentDrawer.providerHint', { _: 'Credenciais são configuradas no nível da conta. Aqui você só confere o que está conectado.' } as never)}\n </p>\n </div>\n )}\n </div>\n </details>\n </div>\n </div>\n )\n}\n\nfunction AdvancedTab({\n displayName, setDisplayName,\n description, setDescription,\n maxOutputTokens, setMaxOutputTokens,\n topP, setTopP,\n topK, setTopK,\n tags, setTags,\n status, setStatus,\n avatarUrl, setAvatarUrl,\n markDirty,\n t,\n}: {\n displayName: string\n setDisplayName: (v: string) => void\n description: string\n setDescription: (v: string) => void\n maxOutputTokens: number\n setMaxOutputTokens: (v: number) => void\n topP: number\n setTopP: (v: number) => void\n topK: number\n setTopK: (v: number) => void\n tags: string\n setTags: (v: string) => void\n status: string\n setStatus: (v: string) => void\n avatarUrl: string\n setAvatarUrl: (v: string) => void\n markDirty: () => void\n t: ReturnType<typeof useTranslations>\n}) {\n const wrap = 'w-full rounded-lg border border-gray-200/50 bg-gray-50/50 px-3 py-2 text-sm text-gray-800 outline-none transition-colors focus:border-indigo-300/50 focus:ring-1 focus:ring-indigo-300/30 dark:border-white/10 dark:bg-white/5 dark:text-gray-200'\n const labelCls = 'mb-1 block text-xs font-medium text-gray-500 dark:text-gray-400'\n const touch = () => markDirty()\n\n return (\n <div className=\"space-y-4 p-4\">\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <label>\n <span className={labelCls}>{t('agentDrawer.displayName', { _: 'Display name' } as never)}</span>\n <input className={wrap} value={displayName} onChange={(e) => { setDisplayName(e.target.value); touch() }} />\n </label>\n <div>\n <span className={labelCls}>{t('agentDrawer.status', { _: 'Status' } as never)}</span>\n <div className={`${wrap} flex items-center justify-between !py-2`}>\n <span className=\"text-xs font-medium text-gray-600 dark:text-gray-300\">\n {status === 'active'\n ? t('agentDrawer.statusActive', { _: 'Active' } as never)\n : t('agentDrawer.statusInactive', { _: 'Inactive' } as never)}\n </span>\n <ToggleSwitch\n size=\"sm\"\n color=\"green\"\n checked={status === 'active'}\n onChange={(checked) => { setStatus(checked ? 'active' : 'draft'); touch() }}\n label={t('agentDrawer.status', { _: 'Status' } as never)}\n />\n </div>\n </div>\n </div>\n\n <label className=\"block\">\n <span className={labelCls}>{t('agentDrawer.description', { _: 'Description' } as never)}</span>\n <textarea\n className={wrap}\n rows={3}\n value={description}\n onChange={(e) => { setDescription(e.target.value); touch() }}\n placeholder={t('agentDrawer.descriptionPlaceholder', { _: 'What this agent does, which tasks it\\'s good at' } as never)}\n />\n </label>\n\n <label className=\"block\">\n <span className={labelCls}>{t('agentDrawer.avatarUrl', { _: 'Avatar URL' } as never)}</span>\n <input className={wrap} value={avatarUrl} onChange={(e) => { setAvatarUrl(e.target.value); touch() }} placeholder=\"https://…\" />\n </label>\n\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <label>\n <span className={labelCls}>{t('agentDrawer.maxOutputTokens', { _: 'Max output tokens' } as never)}</span>\n <input\n type=\"number\"\n min={1}\n max={32768}\n className={wrap}\n value={maxOutputTokens}\n onChange={(e) => { setMaxOutputTokens(Number(e.target.value) || 0); touch() }}\n />\n </label>\n <label>\n <span className={labelCls}>{t('agentDrawer.topP', { _: 'Top-p' } as never)}</span>\n <input\n type=\"number\" step={0.05} min={0} max={1}\n className={wrap}\n value={topP}\n onChange={(e) => { setTopP(Number(e.target.value) || 0); touch() }}\n />\n </label>\n <label>\n <span className={labelCls}>{t('agentDrawer.topK', { _: 'Top-k' } as never)}</span>\n <input\n type=\"number\" min={0} max={500}\n className={wrap}\n value={topK}\n onChange={(e) => { setTopK(Number(e.target.value) || 0); touch() }}\n />\n </label>\n </div>\n\n <label className=\"block\">\n <span className={labelCls}>{t('agentDrawer.tags', { _: 'Tags (comma-separated)' } as never)}</span>\n <input\n className={wrap}\n value={tags}\n onChange={(e) => { setTags(e.target.value); touch() }}\n placeholder={t('agentDrawer.tagsPlaceholder', { _: 'pricing, research, internal' } as never)}\n />\n </label>\n </div>\n )\n}\n\nexport function AgentModal({ onSaved, onPersist }: AgentModalProps) {\n const t = useTranslations('agents.workflow')\n\n // Read open state + data from modal store\n const activeModal = useModalStore((s) => s.activeModal)\n const agentData = useModalStore((s) => s.agentData)\n const closeModal = useModalStore((s) => s.closeModal)\n\n const open = activeModal === 'agent'\n const agent = agentData?.agent ?? null\n const models = agentData?.models ?? []\n const availableAgentTools = agentData?.agentTools ?? []\n const isCreateMode = agentData?.isCreateMode ?? false\n\n // Local editable state — synced when agent changes\n const [activeTab, setActiveTab] = useState<TabId>('config')\n const [selectedModelId, setSelectedModelId] = useState('')\n const [selectedFramework, setSelectedFramework] = useState<string>('custom')\n const [temperature, setTemperature] = useState(0.7)\n const [elo, setElo] = useState(1000)\n const [saved, setSaved] = useState(true)\n const [enabledToolIds, setEnabledToolIds] = useState<Set<string>>(new Set())\n const [selectedProviderId, setSelectedProviderId] = useState('')\n // System prompt is authoritative on the parent now so handleMarkSaved\n // can emit it via onPersist. Previously it was trapped inside PromptTab.\n const [systemPrompt, setSystemPrompt] = useState('')\n // Optional structured-output schema. `undefined` keeps the agent in\n // \"free text\" mode (no parsing); setting it triggers the engine's\n // JSON Schema validator on every run.\n const [outputSchema, setOutputSchema] = useState<AgentOutputSchema | undefined>(undefined)\n // Advanced tab state — all of these are brand-new surfaces, the\n // entity had them on day one but the modal was silent on them.\n const [displayName, setDisplayName] = useState('')\n const [description, setDescription] = useState('')\n const [avatarUrl, setAvatarUrlState] = useState('')\n const [maxOutputTokens, setMaxOutputTokens] = useState(1024)\n const [topP, setTopP] = useState(0.95)\n const [topK, setTopK] = useState(40)\n const [tagsText, setTagsText] = useState('')\n const [status, setStatus] = useState<string>('active')\n const [persisting, setPersisting] = useState(false)\n const availableModelProviders = agentData?.modelProviders ?? []\n\n const agentId = agent?.agentId ?? agent?.id ?? ''\n useEffect(() => {\n if (!agent) return\n setSelectedModelId(agent.modelId ?? models[0]?.id ?? '')\n setSelectedFramework(String((agent as Record<string, unknown>).framework ?? 'custom'))\n setTemperature(agent.temperature ?? 0.7)\n setElo(Number((agent as Record<string, unknown>).elo ?? 1000))\n setSaved(!isCreateMode)\n setActiveTab('config')\n // Sync enabled tools — read from agent's agentTools array if present\n const agentToolIds = (agent as Record<string, unknown>).agentToolIds as string[] | undefined\n setEnabledToolIds(new Set(agentToolIds ?? availableAgentTools.filter((t) => t.enabled).map((t) => t.agentToolId)))\n setSelectedProviderId((agent as Record<string, unknown>).modelProviderId as string ?? '')\n const agentRecord = agent as Record<string, unknown>\n setSystemPrompt(\n (agentRecord.systemPrompt as string | undefined)\n ?? (agentRecord.instruction as string | undefined)\n ?? '',\n )\n // outputSchema is opt-in; clears to undefined when the agent\n // doesn't have one stored.\n setOutputSchema(\n (agentRecord.outputSchema as AgentOutputSchema | undefined) ?? undefined,\n )\n setDisplayName((agentRecord.displayName as string | undefined) ?? agent.name ?? '')\n setDescription((agentRecord.description as string | undefined) ?? '')\n setAvatarUrlState((agentRecord.avatar as string | undefined) ?? '')\n const agentMaxOut = (agentRecord.maxOutputTokens as number | undefined)\n ?? agent.maxTokens\n ?? 1024\n setMaxOutputTokens(Number(agentMaxOut) || 1024)\n setTopP(Number((agentRecord.topP as number | undefined) ?? 0.95))\n setTopK(Number((agentRecord.topK as number | undefined) ?? 40))\n const existingTags = agentRecord.tags\n setTagsText(\n Array.isArray(existingTags)\n ? (existingTags as unknown[]).filter((v): v is string => typeof v === 'string').join(', ')\n : '',\n )\n setStatus((agentRecord.status as string | undefined) ?? 'active')\n }, [agentId])\n\n const dirty = !saved\n const markDirty = useCallback(() => setSaved(false), [])\n const markSaved = useCallback(() => setSaved(true), [])\n\n const handleClose = useCallback(() => {\n closeModal()\n }, [closeModal])\n\n const handleSelectProvider = useCallback((providerId: string) => {\n setSelectedProviderId(providerId)\n markDirty()\n }, [markDirty])\n\n const handleToggleTool = useCallback((toolId: string) => {\n setEnabledToolIds((previous) => {\n const next = new Set(previous)\n if (next.has(toolId)) next.delete(toolId)\n else next.add(toolId)\n return next\n })\n markDirty()\n }, [markDirty])\n\n const handleMarkSaved = useCallback(async () => {\n if (!agent) return\n const payload: AgentPersistPayload = {\n agentId: agent.agentId,\n name: agent.name,\n displayName: displayName.trim() || undefined,\n description: description.trim() || undefined,\n avatar: avatarUrl.trim() || undefined,\n modelId: selectedModelId || undefined,\n connectionId: selectedProviderId || undefined,\n framework: selectedFramework,\n systemPrompt,\n temperature,\n maxOutputTokens,\n topP,\n topK,\n elo,\n status: status || undefined,\n enabledToolIds: Array.from(enabledToolIds),\n tags: tagsText\n .split(',')\n .map((tag) => tag.trim())\n .filter((tag) => tag.length > 0),\n // Send `outputSchema` only when the user actually configured one\n // — sending `undefined` would shadow any existing stored schema\n // through the spread later, so the parent layer should treat\n // missing key as \"leave alone\".\n ...(outputSchema ? { outputSchema } : {}),\n }\n try {\n setPersisting(true)\n if (onPersist) await onPersist(payload)\n markSaved()\n // Intentionally NOT calling `onSaved?.()` — the wrapper in\n // workflow-canvas.tsx uses that callback to *close* the modal\n // (legacy explicit-Save flow). Autosave persists silently; the\n // modal stays open until the user dismisses it.\n } catch (error) {\n // Leave `saved` as dirty so the banner shows. The parent is\n // responsible for surfacing the error message (toast).\n console.error('[AgentModal] onPersist failed', error)\n } finally {\n setPersisting(false)\n }\n }, [\n agent, displayName, description, avatarUrl, selectedModelId, selectedProviderId,\n selectedFramework, systemPrompt, temperature, maxOutputTokens, topP, topK, elo,\n status, enabledToolIds, tagsText, outputSchema, markSaved, onSaved, onPersist,\n ])\n\n // Autosave — every dirty transition kicks off a debounced persist\n // after 700ms of idle. Replaces the explicit Save button: the\n // sidebar footer only shows the live \"Saving… / Auto-saved\"\n // indicator. The 700ms window is short enough to feel snappy and\n // long enough to coalesce rapid typing.\n useEffect(() => {\n if (!dirty || persisting) return\n const handle = setTimeout(() => { void handleMarkSaved() }, 700)\n return () => clearTimeout(handle)\n }, [dirty, persisting, handleMarkSaved])\n\n if (!agent) return null\n\n // No sidebar nav — the identity card IS the \"tab\". The single\n // main pane stacks Cérebro / Motor / Ferramentas as SectionCards.\n // Resultados was removed (workspace-level concern).\n const sections: GlassModalSection[] = []\n\n // Prefer the user-edited avatar (tracked via the editable Profile\n // form below) over the stored value so the identity badge updates\n // live while typing.\n const effectiveAvatarUrl = avatarUrl || ((agent as Record<string, unknown>).avatar as string | undefined)\n\n // Editable identity card — rendered IN the sidebar header (where\n // the read-only ProfileIdentityCard used to live). Avatar + name\n // editable inline; status toggle pinned top-right; description +\n // tags below as compact inputs. Avatar URL field intentionally\n // removed — user changes the picture by uploading or pasting the\n // URL is overkill for the dev surface; we render whatever\n // `agent.avatar` is and let the underlying field be edited via\n // API/Settings if needed.\n const fieldCard = 'liquid-surface w-full rounded-lg px-2.5 py-1.5 text-xs text-gray-800 outline-none transition-colors focus:ring-1 focus:ring-indigo-300/40 dark:text-gray-200 dark:focus:ring-indigo-500/20'\n const fieldLabel = 'text-[9px] font-semibold uppercase tracking-wider text-slate-500 dark:text-slate-400'\n // Editable identity = HeroBlock in `editor mode`:\n // - round 12×12 avatar (img → iconBackground='none')\n // - inline name input (onTitleChange)\n // - role as subtitle (read-only from agent record)\n // - status pill in `rightContent`\n // - description + tags in `children` (free-form below the hero)\n // Wraps in liquid-surface card to match other sidebar surfaces.\n // Delegates avatar chrome (round shape, crystal sheen, tinted\n // glass) entirely to the canonical <Avatar> primitive. HeroBlock\n // just receives it as `icon` — no need for the legacy\n // iconShape=\"round\" / iconBackground=\"none\" escape hatches.\n const avatarInitial = (displayName || agent.name).charAt(0).toUpperCase()\n const avatarNode = (\n <Avatar\n src={effectiveAvatarUrl || undefined}\n alt={displayName || agent.name}\n initials={effectiveAvatarUrl ? undefined : avatarInitial}\n tone={effectiveAvatarUrl ? undefined : 'indigo'}\n className=\"size-12\"\n />\n )\n const statusPill = (\n <div className=\"flex items-center gap-1.5\">\n <span className={`text-[9px] font-semibold ${status === 'active' ? 'text-emerald-600 dark:text-emerald-400' : 'text-slate-500'}`}>\n {status === 'active'\n ? t('agentDrawer.statusActive', { _: 'Active' } as never)\n : t('agentDrawer.statusInactive', { _: 'Inactive' } as never)}\n </span>\n <ToggleSwitch\n size=\"sm\"\n color=\"green\"\n checked={status === 'active'}\n onChange={(checked) => { setStatus(checked ? 'active' : 'draft'); markDirty() }}\n label={t('agentDrawer.status', { _: 'Status' } as never)}\n />\n </div>\n )\n const identityCard = (\n <div className=\"liquid-surface rounded-2xl p-3 ring-1 ring-slate-200/50 dark:ring-white/10\">\n <HeroBlock\n icon={avatarNode}\n iconBackground=\"none\"\n iconSize=\"lg\"\n headingLevel=\"h2\"\n title={displayName}\n onTitleChange={(next) => { setDisplayName(next); markDirty() }}\n titlePlaceholder={agent.name}\n subtitle={agent.role}\n rightContent={statusPill}\n >\n <div className=\"flex flex-col gap-2\">\n <label className=\"flex flex-col gap-1\">\n <span className={fieldLabel}>{t('agentDrawer.description', { _: 'Description' } as never)}</span>\n <textarea\n rows={2}\n value={description}\n onChange={(event) => { setDescription(event.target.value); markDirty() }}\n placeholder={t('agentDrawer.descriptionPlaceholder', { _: 'What this agent does, which tasks it\\'s good at' } as never)}\n className={`${fieldCard} resize-none`}\n />\n </label>\n <label className=\"flex flex-col gap-1\">\n <span className={fieldLabel}>{t('agentDrawer.tags', { _: 'Tags' } as never)}</span>\n <input\n type=\"text\"\n value={tagsText}\n onChange={(event) => { setTagsText(event.target.value); markDirty() }}\n placeholder={t('agentDrawer.tagsPlaceholder', { _: 'pricing, research, internal' } as never)}\n className={fieldCard}\n />\n </label>\n </div>\n </HeroBlock>\n </div>\n )\n\n // Footer = autosave indicator only. No explicit Save button —\n // every edit debounces a background persist (see useEffect above).\n const autosaveLabel = persisting\n ? t('agentDrawer.saving', { _: 'Saving…' } as never)\n : dirty\n ? t('agentDrawer.pendingAutosave', { _: 'Saving in a moment…' } as never)\n : t('agentDrawer.autoSaved', { _: 'Auto-saved' } as never)\n const autosaveColor = persisting\n ? 'text-indigo-500 dark:text-indigo-400'\n : dirty\n ? 'text-amber-500 dark:text-amber-400'\n : 'text-emerald-500 dark:text-emerald-400'\n const sidebarFooter = (\n <div role=\"status\" aria-live=\"polite\" className=\"flex items-center gap-1.5 px-1 py-2 text-xs\">\n <span className={`relative inline-flex h-1.5 w-1.5 shrink-0 rounded-full ${persisting ? 'bg-indigo-500' : dirty ? 'bg-amber-500' : 'bg-emerald-500'}`}>\n {persisting && (\n <span\n aria-hidden=\"true\"\n className=\"absolute inset-0 motion-safe:animate-ping rounded-full bg-indigo-500/60\"\n />\n )}\n </span>\n <span className={`font-medium ${autosaveColor}`}>{autosaveLabel}</span>\n </div>\n )\n\n return (\n <GlassModal\n open={open}\n onClose={handleClose}\n title={agent.name}\n gradient=\"from-indigo-500 to-purple-600\"\n icon={<CpuChipIcon className=\"h-5 w-5 text-slate-700 dark:text-white\" />}\n label={isCreateMode ? t('agentDrawer.createAgent') : t('agentDrawer.editAgent')}\n sidebar={{\n sections,\n activeSectionId: activeTab,\n onSectionChange: (sectionId) => setActiveTab(sectionId as TabId),\n identityCard,\n footer: sidebarFooter,\n }}\n >\n {/* Single-page config — Motor / Cérebro / Ferramentas stack as\n SectionCards (from @datatechsolutions/ui). Identidade vive\n na sidebar (header + footer). Resultados moved out of the\n agent modal — execution history is workspace-scoped. */}\n <div className=\"space-y-5\">\n {/* MOTOR — runtime: ELO, model derivation, override.\n Collapsible (open by default). Glass icon (matches page\n hero vocabulary). */}\n <SectionCard\n variant=\"glass\"\n padded={false}\n collapsible\n defaultOpen\n header={{\n icon: <Cog6ToothIcon className=\"h-5 w-5 text-slate-700 dark:text-white\" />,\n title: t('agentDrawer.engineTab'),\n subtitle: t('agentDrawer.engineSubtitle', { _: 'Como o agente roda — capacidade, modelo, credenciais' } as never),\n }}\n >\n <EngineTab\n agent={agent}\n models={models}\n t={t}\n selectedModelId={selectedModelId} setSelectedModelId={setSelectedModelId}\n selectedFramework={selectedFramework as AgentFramework} setSelectedFramework={(fw) => setSelectedFramework(fw)}\n temperature={temperature} setTemperature={setTemperature}\n elo={elo} setElo={setElo}\n maxOutputTokens={maxOutputTokens} setMaxOutputTokens={setMaxOutputTokens}\n topP={topP} setTopP={setTopP}\n topK={topK} setTopK={setTopK}\n modelProviders={availableModelProviders}\n selectedProviderId={selectedProviderId}\n onSelectProvider={handleSelectProvider}\n markDirty={markDirty}\n />\n </SectionCard>\n\n {/* CÉREBRO — system prompt + temperature */}\n <SectionCard\n variant=\"glass\"\n padded={false}\n collapsible\n defaultOpen\n header={{\n icon: <SparklesIcon className=\"h-5 w-5 text-slate-700 dark:text-white\" />,\n title: t('agentDrawer.brainTab'),\n subtitle: t('agentDrawer.brainSubtitle', { _: 'Como o agente pensa — prompt + criatividade' } as never),\n }}\n >\n <PromptTab\n agent={agent}\n temperature={temperature}\n setTemperature={setTemperature}\n markDirty={markDirty}\n t={t}\n promptText={systemPrompt}\n setPromptText={setSystemPrompt}\n outputSchema={outputSchema}\n setOutputSchema={setOutputSchema}\n />\n </SectionCard>\n\n {/* FERRAMENTAS — tool toggles */}\n <SectionCard\n variant=\"glass\"\n padded={false}\n collapsible\n defaultOpen\n header={{\n icon: <WrenchScrewdriverIcon className=\"h-5 w-5 text-slate-700 dark:text-white\" />,\n title: `${t('agentDrawer.toolsTab')}${enabledToolIds.size > 0 ? ` (${enabledToolIds.size})` : ''}`,\n subtitle: t('agentDrawer.toolsSubtitle', { _: 'O que o agente pode invocar durante a execução' } as never),\n }}\n >\n <ToolsTab agentTools={availableAgentTools} enabledToolIds={enabledToolIds} onToggle={handleToggleTool} agentFramework={selectedFramework} t={t} />\n </SectionCard>\n </div>\n </GlassModal>\n )\n}\n","/**\n * Workflow Tool Modal Store (Zustand)\n * ===================================\n * State management for the workflow tool modal — tracks the\n * selected workflow tool, editable fields, and dirty state.\n */\n\nimport { create } from 'zustand'\nimport type { WorkflowTool } from '../contracts'\n\ntype SubworkflowStoreState = {\n /** The workflow tool being edited (null = modal closed) */\n tool: WorkflowTool | null\n /** Whether the modal is open */\n open: boolean\n /** Editable fields */\n name: string\n category: string\n description: string\n timeoutMs: number\n retryCount: number\n /** Whether there are unsaved changes */\n dirty: boolean\n}\n\ntype SubworkflowStoreActions = {\n /** Open the modal with a workflow tool (empty toolId = create mode) */\n openModal: (tool: WorkflowTool) => void\n /** Close the modal and reset state */\n closeModal: () => void\n /** Update a field and mark dirty */\n setName: (name: string) => void\n setCategory: (category: string) => void\n setDescription: (description: string) => void\n setTimeoutMs: (timeoutMs: number) => void\n setRetryCount: (retryCount: number) => void\n /** Mark as dirty (e.g. when graph changes) */\n markDirty: () => void\n /** Mark as saved */\n markSaved: () => void\n}\n\nexport type SubworkflowStore = SubworkflowStoreState & SubworkflowStoreActions\n\nexport const useSubworkflowStore = create<SubworkflowStore>((set) => ({\n // State\n tool: null,\n open: false,\n name: '',\n category: 'external',\n description: '',\n timeoutMs: 10000,\n retryCount: 0,\n dirty: false,\n\n // Actions\n openModal: (tool) => set({\n tool,\n open: true,\n name: tool.name ?? '',\n category: tool.category ?? 'external',\n description: String(tool.description ?? ''),\n timeoutMs: Number(tool.timeoutMs ?? 10000),\n retryCount: (tool as Record<string, unknown>).retryCount as number ?? 0,\n dirty: !tool.toolId,\n }),\n\n closeModal: () => set({\n tool: null,\n open: false,\n name: '',\n category: 'external',\n description: '',\n timeoutMs: 10000,\n retryCount: 0,\n dirty: false,\n }),\n\n setName: (name) => set({ name, dirty: true }),\n setCategory: (category) => set({ category, dirty: true }),\n setDescription: (description) => set({ description, dirty: true }),\n setTimeoutMs: (timeoutMs) => set({ timeoutMs, dirty: true }),\n setRetryCount: (retryCount) => set({ retryCount, dirty: true }),\n markDirty: () => set({ dirty: true }),\n markSaved: () => set({ dirty: false }),\n}))\n","import { useState, useMemo, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n ArrowPathRoundedSquareIcon,\n ArrowsPointingOutIcon as MaximizeIcon,\n ClockIcon,\n BoltIcon,\n ArrowsPointingInIcon,\n ArrowsPointingOutIcon,\n ChevronDownIcon,\n ChevronRightIcon,\n} from '@heroicons/react/24/outline'\nimport { GlassModal } from '@ui/components/glass-modal'\nimport { WorkflowCanvas } from '../canvas/workflow-canvas'\nimport { useSubworkflowStore } from '../../store/subworkflow-store'\nimport { useModalStore } from '../../store/modal-store'\nimport { CATEGORY_COLORS, CATEGORY_PILL_COLORS, ICON_MAP } from '../../constants'\nimport type { WorkflowGraph, WorkflowTool } from '../../contracts'\n\ntype SubworkflowModalProps = {\n /** Called when save/create is clicked — receives the merged workflow tool with updated graph */\n onSaved?: (tool: WorkflowTool) => void\n /** Called when maximize is clicked — navigate to full workflow editor */\n onMaximize?: (subworkflowId: string) => void\n}\n\nconst DEFAULT_SUBWORKFLOW_GRAPH: WorkflowGraph = {\n nodes: [\n { id: 'start', type: 'start', position: { x: 80, y: 200 }, data: { entityId: 'start', label: 'Start', config: { type: 'start', inputVariables: [] } } },\n { id: 'end', type: 'end', position: { x: 600, y: 200 }, data: { entityId: 'end', label: 'End', config: { type: 'end', outputVariables: [] } } },\n ],\n edges: [\n { id: 'e-start-end', source: 'start', target: 'end', sourceHandle: null, targetHandle: null },\n ],\n viewport: { x: 0, y: 0, zoom: 0.85 },\n}\n\n/* --- Variable chips --- */\nfunction VariableChip({ name, type }: { name: string; type: string }) {\n return (\n <span className=\"inline-flex items-center gap-1 rounded-lg border border-teal-200/50 bg-teal-50/50 px-2 py-0.5 text-[10px] dark:border-teal-400/20 dark:bg-teal-400/10\">\n <span className=\"font-semibold text-teal-700 dark:text-teal-300\">{name}</span>\n <span className=\"text-teal-500/60 dark:text-teal-400/50\">: {type}</span>\n </span>\n )\n}\n\nfunction OutputChip({ name, type }: { name: string; type: string }) {\n return (\n <span className=\"inline-flex items-center gap-1 rounded-lg border border-violet-200/50 bg-violet-50/50 px-2 py-0.5 text-[10px] dark:border-violet-400/20 dark:bg-violet-400/10\">\n <span className=\"font-semibold text-violet-700 dark:text-violet-300\">{name}</span>\n <span className=\"text-violet-500/60 dark:text-violet-400/50\">: {type}</span>\n </span>\n )\n}\n\n/* --- Collapsible config sidebar --- */\nfunction ConfigSection({ title, icon: Icon, defaultOpen = true, children }: {\n title: string\n icon: React.ComponentType<{ className?: string }>\n defaultOpen?: boolean\n children: React.ReactNode\n}) {\n const [open, setOpen] = useState(defaultOpen)\n return (\n <div className=\"border-b border-white/10\">\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n aria-expanded={open}\n className=\"flex w-full items-center gap-2 px-4 py-2.5 text-left hover:bg-white/5\"\n >\n {open ? <ChevronDownIcon className=\"h-3 w-3 text-gray-400\" /> : <ChevronRightIcon className=\"h-3 w-3 text-gray-400\" />}\n <Icon className=\"h-3 w-3 text-gray-400\" />\n <span className=\"text-[10px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">{title}</span>\n </button>\n {open && <div className=\"px-4 pb-3\">{children}</div>}\n </div>\n )\n}\n\nexport function SubworkflowModal({ onSaved, onMaximize }: SubworkflowModalProps) {\n const t = useTranslations('agents.workflow')\n\n // Read all state from Zustand store\n const tool = useSubworkflowStore((s) => s.tool)\n const open = useSubworkflowStore((s) => s.open)\n const name = useSubworkflowStore((s) => s.name)\n const category = useSubworkflowStore((s) => s.category)\n const description = useSubworkflowStore((s) => s.description)\n const timeoutMs = useSubworkflowStore((s) => s.timeoutMs)\n const retryCount = useSubworkflowStore((s) => s.retryCount)\n const dirty = useSubworkflowStore((s) => s.dirty)\n\n // Actions\n const setName = useSubworkflowStore((s) => s.setName)\n const setCategory = useSubworkflowStore((s) => s.setCategory)\n const setDescription = useSubworkflowStore((s) => s.setDescription)\n const setTimeoutMs = useSubworkflowStore((s) => s.setTimeoutMs)\n const setRetryCount = useSubworkflowStore((s) => s.setRetryCount)\n const markDirty = useSubworkflowStore((s) => s.markDirty)\n const markSaved = useSubworkflowStore((s) => s.markSaved)\n const closeModal = useSubworkflowStore((s) => s.closeModal)\n\n // Check if there's an agent modal behind us (for breadcrumb + z-index stacking)\n const agentBehind = useModalStore((s) => s.activeModal === 'agent' ? s.agentData?.agent?.name : null)\n\n const isCreateMode = !tool?.toolId\n\n const initialGraph = useMemo<WorkflowGraph>(() => {\n const config = tool?.config as Record<string, unknown> | undefined\n if (config?.type === 'workflow' && config.graph) {\n return config.graph as WorkflowGraph\n }\n return DEFAULT_SUBWORKFLOW_GRAPH\n }, [tool])\n\n const latestGraphRef = useMemo(() => ({ current: initialGraph }), [initialGraph])\n\n const handleGraphChange = useCallback((graph: WorkflowGraph) => {\n latestGraphRef.current = graph\n markDirty()\n }, [latestGraphRef, markDirty])\n\n const handleSave = useCallback(() => {\n markSaved()\n if (tool) {\n onSaved?.({\n ...tool,\n name,\n category,\n description,\n timeoutMs,\n config: { type: 'workflow', graph: latestGraphRef.current },\n })\n }\n }, [tool, onSaved, name, category, description, timeoutMs, latestGraphRef, markSaved])\n\n if (!tool) return null\n\n const categoryKey = (category ?? 'external') as keyof typeof CATEGORY_COLORS\n const gradient = tool.color ?? CATEGORY_COLORS[categoryKey] ?? CATEGORY_COLORS.external\n const categoryPill = CATEGORY_PILL_COLORS[categoryKey] ?? CATEGORY_PILL_COLORS.external\n const IconComponent = ICON_MAP[tool.icon ?? ''] ?? ArrowPathRoundedSquareIcon\n\n // Derive input/output variables from Start and End nodes in the graph\n const graph = latestGraphRef.current\n const startNode = graph.nodes.find((n) => n.type === 'start')\n const endNode = graph.nodes.find((n) => n.type === 'end')\n const startConfig = startNode?.data?.config as { inputVariables?: string[] } | undefined\n const endConfig = endNode?.data?.config as { outputVariables?: string[] } | undefined\n const inputVariables = (startConfig?.inputVariables ?? []).map((v) => ({ name: v, type: 'string' }))\n const outputVariables = (endConfig?.outputVariables ?? []).map((v) => ({ name: v, type: 'string' }))\n\n const footer = (\n <div className=\"flex items-center justify-between\">\n <div role=\"status\" aria-live=\"polite\" className=\"text-xs\">\n {dirty ? (\n <span className=\"text-amber-500 dark:text-amber-400\">{t('subworkflowDrawer.unsavedChanges')}</span>\n ) : (\n <span className=\"text-emerald-500 dark:text-emerald-400\">{t('subworkflowDrawer.saved')}</span>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={closeModal}\n className=\"rounded-lg border border-gray-200/50 px-4 py-2 text-xs font-medium text-gray-600 transition-colors hover:bg-gray-100/50 dark:border-white/10 dark:text-gray-300 dark:hover:bg-white/5\"\n >\n {t('subworkflowDrawer.cancel')}\n </button>\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={isCreateMode && !name.trim()}\n className={`rounded-lg px-4 py-2 text-xs font-semibold text-white shadow-sm transition-all ${\n dirty\n ? 'bg-gradient-to-r from-teal-500 to-cyan-500 hover:from-teal-600 hover:to-cyan-600'\n : 'cursor-not-allowed bg-gray-300 dark:bg-gray-700'\n }`}\n >\n {isCreateMode ? t('subworkflowDrawer.create') : t('subworkflowDrawer.save')}\n </button>\n </div>\n </div>\n )\n\n return (\n <GlassModal\n open={open}\n onClose={closeModal}\n title={isCreateMode ? t('subworkflowDrawer.createTitle') : name}\n subtitle={agentBehind ? `${agentBehind} → ${t('subworkflowDrawer.subworkflow')}` : t('subworkflowDrawer.subworkflow')}\n label={isCreateMode ? t('subworkflowDrawer.new') : t('subworkflowDrawer.edit')}\n gradient=\"from-teal-500 to-cyan-600\"\n icon={<ArrowPathRoundedSquareIcon className=\"h-6 w-6 text-white\" />}\n maxWidth=\"6xl\"\n footer={footer}\n zIndex={agentBehind ? 'z-[60]' : 'z-50'}\n >\n <div className=\"flex h-[80vh] min-h-[600px]\">\n {/* --- Left sidebar: config --- */}\n <div className=\"flex w-72 flex-shrink-0 flex-col overflow-y-auto border-r border-white/10\">\n {/* Header / Name */}\n {isCreateMode ? (\n <div className=\"border-b border-white/10 bg-gradient-to-br from-teal-500/15 via-cyan-500/8 to-transparent px-4 py-4 dark:from-teal-500/8 dark:via-cyan-500/4\">\n <label className=\"mb-1 block text-[10px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {t('subworkflowDrawer.name')}\n </label>\n <input\n type=\"text\"\n value={name}\n onChange={(event) => setName(event.target.value)}\n placeholder={t('subworkflowDrawer.namePlaceholder')}\n autoFocus\n className=\"w-full rounded-lg border border-gray-200/50 bg-white/60 px-3 py-2 text-sm font-medium text-gray-900 outline-none placeholder:text-gray-400 focus:border-teal-300/50 focus:ring-1 focus:ring-teal-300/30 dark:border-white/10 dark:bg-white/5 dark:text-white dark:placeholder:text-gray-500\"\n />\n <div className=\"mt-3 flex flex-wrap gap-1\">\n {['external', 'market', 'data', 'communication', 'analytics'].map((cat) => (\n <button\n key={cat}\n type=\"button\"\n onClick={() => setCategory(cat)}\n className={`rounded-full px-2 py-1 text-[9px] font-semibold transition-all ${\n cat === category\n ? `${CATEGORY_PILL_COLORS[cat] ?? CATEGORY_PILL_COLORS.external} ring-1 ring-current/20`\n : 'bg-white/30 text-gray-500 hover:bg-white/50 dark:bg-white/5 dark:text-gray-400'\n }`}\n >\n {cat}\n </button>\n ))}\n </div>\n </div>\n ) : (\n <div className=\"border-b border-white/10 bg-gradient-to-br from-teal-500/15 via-cyan-500/8 to-transparent px-4 py-4 dark:from-teal-500/8 dark:via-cyan-500/4\">\n <div className=\"flex items-center gap-3\">\n <div className={`flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-gradient-to-br ${gradient} shadow-lg`}>\n <IconComponent className=\"h-5 w-5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"truncate text-sm font-bold text-gray-900 dark:text-white\">{name}</h3>\n <div className=\"mt-1 flex flex-wrap gap-1\">\n <span className=\"inline-flex items-center rounded-full bg-teal-100 px-1.5 py-0.5 text-[8px] font-semibold text-teal-700 dark:bg-teal-400/15 dark:text-teal-400\">\n {t('subworkflowDrawer.subworkflow')}\n </span>\n <span className={`inline-flex items-center rounded-full px-1.5 py-0.5 text-[8px] font-medium ${categoryPill}`}>\n {category}\n </span>\n </div>\n </div>\n {onMaximize && tool.toolId && (\n <button\n type=\"button\"\n onClick={() => onMaximize(tool.toolId)}\n title={t('subworkflowDrawer.openFullEditor')}\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg text-gray-400 transition-colors hover:bg-white/10 hover:text-teal-500 dark:hover:text-teal-400\"\n >\n <MaximizeIcon className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Description */}\n <div className=\"border-b border-white/10 px-4 py-3\">\n <textarea\n value={description}\n onChange={(event) => setDescription(event.target.value)}\n rows={2}\n placeholder={t('subworkflowDrawer.descriptionPlaceholder')}\n className=\"w-full resize-none rounded-lg border border-gray-200/50 bg-gray-50/50 px-2.5 py-2 text-[11px] leading-relaxed text-gray-700 outline-none placeholder:text-gray-400 focus:border-teal-300/50 dark:border-white/10 dark:bg-white/5 dark:text-gray-300 dark:placeholder:text-gray-500\"\n />\n </div>\n\n {/* Input variables */}\n <ConfigSection title={t('subworkflowDrawer.inputVariables')} icon={ArrowsPointingInIcon}>\n <div className=\"flex flex-wrap gap-1\">\n {inputVariables.length > 0 ? inputVariables.map((variable) => (\n <VariableChip key={variable.name} name={variable.name} type={variable.type} />\n )) : (\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('subworkflowDrawer.noVariables')}</span>\n )}\n </div>\n </ConfigSection>\n\n {/* Output variables */}\n <ConfigSection title={t('subworkflowDrawer.outputVariables')} icon={ArrowsPointingOutIcon}>\n <div className=\"flex flex-wrap gap-1\">\n {outputVariables.length > 0 ? outputVariables.map((variable) => (\n <OutputChip key={variable.name} name={variable.name} type={variable.type} />\n )) : (\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('subworkflowDrawer.noVariables')}</span>\n )}\n </div>\n </ConfigSection>\n\n {/* Execution settings */}\n <ConfigSection title={t('subworkflowDrawer.executionSettings')} icon={BoltIcon} defaultOpen={false}>\n <div className=\"mb-3\">\n <div className=\"mb-1 flex items-center justify-between\">\n <label className=\"flex items-center gap-1 text-[10px] text-gray-600 dark:text-gray-400\">\n <ClockIcon className=\"h-3 w-3\" />\n {t('subworkflowDrawer.timeout')}\n </label>\n <span className=\"text-[10px] font-bold tabular-nums text-gray-900 dark:text-white\">{(timeoutMs / 1000).toFixed(0)}s</span>\n </div>\n <input\n type=\"range\"\n min=\"1000\"\n max=\"30000\"\n step=\"1000\"\n value={timeoutMs}\n onChange={(event) => setTimeoutMs(parseInt(event.target.value, 10))}\n aria-label={t('subworkflowDrawer.timeout')}\n aria-valuemin={1}\n aria-valuemax={30}\n aria-valuenow={timeoutMs / 1000}\n aria-valuetext={`${(timeoutMs / 1000).toFixed(0)} seconds`}\n className=\"h-3 w-full cursor-pointer appearance-none rounded-full bg-gray-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-teal-500 dark:bg-gray-700 [&::-webkit-slider-thumb]:h-3 [&::-webkit-slider-thumb]:w-3 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-teal-500\"\n />\n </div>\n <div>\n <div className=\"mb-1 flex items-center justify-between\">\n <label className=\"text-[10px] text-gray-600 dark:text-gray-400\">{t('subworkflowDrawer.retries')}</label>\n <span className=\"text-[10px] font-bold tabular-nums text-gray-900 dark:text-white\">{retryCount}</span>\n </div>\n <div className=\"flex gap-1\">\n {[0, 1, 2, 3].map((count) => (\n <button\n key={count}\n type=\"button\"\n onClick={() => setRetryCount(count)}\n className={`flex-1 rounded py-1 text-[10px] font-medium transition-all ${\n count === retryCount\n ? 'bg-teal-500 text-white'\n : 'bg-gray-100 text-gray-500 dark:bg-white/5 dark:text-gray-400'\n }`}\n >\n {count}\n </button>\n ))}\n </div>\n </div>\n </ConfigSection>\n\n {/* Spacer — save is now in the modal footer */}\n <div className=\"mt-auto\" />\n </div>\n\n {/* --- Right: Full interactive workflow canvas --- */}\n <div className=\"flex-1\">\n <WorkflowCanvas\n initialGraph={initialGraph}\n agents={[]}\n models={[]}\n tools={[]}\n rules={[]}\n onGraphChange={handleGraphChange}\n />\n </div>\n </div>\n </GlassModal>\n )\n}\n","/**\n * Pipeline Settings Modal\n * ========================\n * Modal for editing the workflow's identity + lifecycle:\n * - `name` / `description` / `slug` (identity)\n * - `isDraft` (publish state — draft vs published)\n * - `isActive` (archive toggle)\n *\n * The lifecycle block is optional: when the caller opens the modal\n * without passing `isDraft`/`isActive` (e.g. from a create-workflow\n * dialog where the row doesn't exist yet) we hide those fields so the\n * user sees a simple rename form.\n *\n * Opened via `useModalStore.openPipelineSettingsModal(name, description, lifecycle?)`.\n */\n\nimport { useEffect, useState, useMemo } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { Cog6ToothIcon, CheckIcon } from '@heroicons/react/24/outline'\nimport { Button, FormInput, FormTextarea } from '@ui/index'\nimport { GlassModal } from '@ui/components/glass-modal'\nimport { useModalStore } from '../../store/modal-store'\n\nexport type PipelineSettingsPatch = {\n name: string\n description: string\n slug?: string | null\n isDraft?: boolean\n isActive?: boolean\n}\n\ntype PipelineSettingsModalProps = {\n /** Receives only the fields that actually changed — the page wrapper\n * can then PATCH once with exactly the delta. */\n onSave: (changes: PipelineSettingsPatch) => Promise<void>\n}\n\nexport function PipelineSettingsModal({ onSave }: PipelineSettingsModalProps) {\n const t = useTranslations('agents.workflow')\n\n const activeModal = useModalStore((s) => s.activeModal)\n const data = useModalStore((s) => s.pipelineSettingsData)\n const closeModal = useModalStore((s) => s.closeModal)\n\n const open = activeModal === 'pipeline-settings'\n\n const [nameValue, setNameValue] = useState('')\n const [descriptionValue, setDescriptionValue] = useState('')\n const [slugValue, setSlugValue] = useState<string>('')\n const [isDraft, setIsDraft] = useState<boolean>(true)\n const [isActive, setIsActive] = useState<boolean>(true)\n const [isSaving, setIsSaving] = useState(false)\n\n // Track whether the caller supplied lifecycle fields at all. If they\n // didn't, the modal hides the lifecycle row so the form stays simple\n // for callers that only care about name/description (e.g. the \"create\n // a subworkflow\" flow which doesn't have a row to archive yet).\n const lifecycleAvailable = useMemo(() => {\n if (!data) return false\n return data.isDraft !== undefined || data.isActive !== undefined || data.slug !== undefined\n }, [data])\n\n // Sync local state when store data changes\n useEffect(() => {\n if (data) {\n setNameValue(data.name)\n setDescriptionValue(data.description)\n setSlugValue(data.slug ?? '')\n setIsDraft(data.isDraft ?? true)\n setIsActive(data.isActive ?? true)\n }\n }, [data])\n\n const handleSubmit = async (event: React.FormEvent) => {\n event.preventDefault()\n const trimmedName = nameValue.trim()\n if (!trimmedName) return\n\n // Compute the delta so the page wrapper can PATCH minimally.\n const trimmedDescription = descriptionValue.trim()\n const trimmedSlug = slugValue.trim()\n const changes: PipelineSettingsPatch = {\n name: trimmedName,\n description: trimmedDescription,\n }\n if (data) {\n if (trimmedSlug !== (data.slug ?? '')) {\n changes.slug = trimmedSlug.length > 0 ? trimmedSlug : null\n }\n if (data.isDraft !== undefined && isDraft !== data.isDraft) {\n changes.isDraft = isDraft\n }\n if (data.isActive !== undefined && isActive !== data.isActive) {\n changes.isActive = isActive\n }\n }\n\n setIsSaving(true)\n try {\n await onSave(changes)\n closeModal()\n } catch {\n // Parent handles error display — keep modal open so user can retry\n } finally {\n setIsSaving(false)\n }\n }\n\n const footer = (\n <div className=\"flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n onClick={closeModal}\n className=\"rounded-lg border border-gray-200/50 px-4 py-2 text-xs font-medium text-gray-600 transition-colors hover:bg-gray-100/50 dark:border-white/10 dark:text-gray-300 dark:hover:bg-white/5\"\n >\n {t('cancel')}\n </button>\n <Button\n type=\"submit\"\n form=\"pipeline-settings-form\"\n color=\"ios-glass-blue\"\n loading={isSaving}\n loadingText={t('saving')}\n >\n <CheckIcon className=\"h-4 w-4\" />\n {t('saveSettings')}\n </Button>\n </div>\n )\n\n return (\n <GlassModal\n open={open}\n onClose={closeModal}\n title={t('pipelineSettings')}\n subtitle={t('pipelineSettingsSubtitle')}\n label={t('settings')}\n icon={<Cog6ToothIcon className=\"h-5 w-5 text-white\" />}\n gradient=\"from-indigo-500 to-purple-600\"\n maxWidth=\"md\"\n footer={footer}\n onSubmit={handleSubmit}\n >\n <form id=\"pipeline-settings-form\" onSubmit={handleSubmit} className=\"space-y-5\">\n <FormInput\n label={t('pipelineName')}\n value={nameValue}\n onValueChange={setNameValue}\n placeholder={t('pipelineNamePlaceholder')}\n required\n />\n\n <FormTextarea\n label={t('pipelineDescription')}\n value={descriptionValue}\n onValueChange={setDescriptionValue}\n placeholder={t('pipelineDescriptionPlaceholder')}\n rows={4}\n />\n\n {lifecycleAvailable && (\n <>\n <FormInput\n label={t('pipelineSlug', { _: 'Slug' } as never)}\n value={slugValue}\n onValueChange={setSlugValue}\n placeholder=\"product-pricing\"\n hint={t('pipelineSlugHint', {\n _: 'URL-friendly identifier. Leave blank to use the auto-generated one.',\n } as never)}\n />\n\n <fieldset className=\"space-y-2 rounded-xl border border-gray-200/60 bg-gray-50/60 p-3 dark:border-white/10 dark:bg-white/5\">\n <legend className=\"px-1 text-xs font-medium text-gray-600 dark:text-gray-300\">\n {t('pipelineLifecycle', { _: 'Lifecycle' } as never)}\n </legend>\n\n <label className=\"flex items-center justify-between gap-3 text-sm text-gray-700 dark:text-gray-200\">\n <span>\n {t('pipelineIsDraft', { _: 'Draft mode' } as never)}\n <span className=\"ml-2 text-[11px] text-gray-400\">\n {isDraft\n ? t('pipelineIsDraftOn', { _: 'Editable — changes do not affect runs.' } as never)\n : t('pipelineIsDraftOff', { _: 'Published — edits require a new version.' } as never)}\n </span>\n </span>\n <input\n type=\"checkbox\"\n checked={isDraft}\n onChange={(event) => setIsDraft(event.target.checked)}\n className=\"h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-500\"\n />\n </label>\n\n <label className=\"flex items-center justify-between gap-3 text-sm text-gray-700 dark:text-gray-200\">\n <span>\n {t('pipelineIsActive', { _: 'Active' } as never)}\n <span className=\"ml-2 text-[11px] text-gray-400\">\n {isActive\n ? t('pipelineIsActiveOn', { _: 'Visible in listings and runnable.' } as never)\n : t('pipelineIsActiveOff', { _: 'Archived — hidden from the default listing.' } as never)}\n </span>\n </span>\n <input\n type=\"checkbox\"\n checked={isActive}\n onChange={(event) => setIsActive(event.target.checked)}\n className=\"h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-500\"\n />\n </label>\n </fieldset>\n </>\n )}\n </form>\n </GlassModal>\n )\n}\n","/**\n * Run Replay Modal\n * =================\n * Pre-fills with the original run's `inputVariables` and lets the user\n * tweak any value before re-executing. Emits ONLY the keys the user\n * actually changed via `onReplay(overrides)` — the parent then forwards\n * those to `POST /workflows/{wid}/runs/{rid}/replay`. Backend\n * shallow-merges them on top of the original inputs so unchanged keys\n * fall through unchanged.\n *\n * Submitting with no edits is allowed: it sends an empty override map\n * which the backend treats as a verbatim re-run.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { ArrowPathIcon } from '@heroicons/react/24/outline'\nimport { Button, FormInput, FormTextarea } from '@ui/index'\nimport { Badge } from '@ui/components/badge'\nimport { GlassModal } from '@ui/components/glass-modal'\nimport { useTranslations } from '@ui/lib/i18n-context'\n\nexport type ReplayInputVariables = Record<string, unknown>\n\nexport type RunReplayModalProps = {\n open: boolean\n onClose: () => void\n runId: string\n workflowId: string\n /** The original run's `inputVariables` map. Keys become the form\n * rows; types are inferred (string/number/boolean/json) so the\n * inputs render appropriately. */\n originalInputs: ReplayInputVariables\n /** Receives the override map. Empty object → verbatim re-run. */\n onReplay: (overrides: ReplayInputVariables) => Promise<void>\n}\n\ntype Row = {\n key: string\n /** Stringified for the input control. Coerced back to original type\n * on submit unless the original was a JSON object/array. */\n value: string\n /** Type of the original value — controls how we coerce on submit. */\n kind: 'string' | 'number' | 'boolean' | 'json'\n /** Did the user touch this row? Untouched rows are dropped from the\n * override map so the backend keeps the original value. */\n touched: boolean\n /** Raw original (used to detect touch + restore). */\n original: unknown\n}\n\nexport function RunReplayModal({\n open,\n onClose,\n runId,\n workflowId,\n originalInputs,\n onReplay,\n}: RunReplayModalProps) {\n const t = useTranslations('agents.workflow')\n const [rows, setRows] = useState<Row[]>([])\n const [submitting, setSubmitting] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n // Re-seed rows whenever the modal opens against a new run.\n useEffect(() => {\n if (!open) return\n setRows(Object.entries(originalInputs).map(([key, value]) => toRow(key, value)))\n setError(null)\n }, [open, originalInputs])\n\n const overrides = useMemo<ReplayInputVariables>(() => {\n const out: ReplayInputVariables = {}\n for (const row of rows) {\n if (!row.touched) continue\n try {\n out[row.key] = parseRow(row)\n } catch (e) {\n // Surface parse errors at submit time, not here.\n out[`__error__${row.key}`] = (e as Error).message\n }\n }\n return out\n }, [rows])\n\n const hasParseError = Object.keys(overrides).some((k) => k.startsWith('__error__'))\n\n const updateRow = (index: number, patch: Partial<Row>) => {\n setRows((current) => current.map((r, i) => (i === index ? { ...r, ...patch, touched: true } : r)))\n }\n\n const resetRow = (index: number) => {\n setRows((current) => current.map((r, i) => {\n if (i !== index) return r\n return toRow(r.key, r.original)\n }))\n }\n\n const handleSubmit = async () => {\n setError(null)\n if (hasParseError) {\n setError(t('replayParseError', { _: 'One or more values do not match their declared type.' } as never))\n return\n }\n setSubmitting(true)\n try {\n const cleaned: ReplayInputVariables = {}\n for (const row of rows) {\n if (!row.touched) continue\n cleaned[row.key] = parseRow(row)\n }\n await onReplay(cleaned)\n onClose()\n } catch (e) {\n setError((e as Error).message)\n } finally {\n setSubmitting(false)\n }\n }\n\n const footer = (\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-[11px] text-gray-400\">\n run <code>{runId.slice(0, 8)}</code> · wf <code>{workflowId.slice(0, 8)}</code>\n </span>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg border border-gray-200/50 px-4 py-2 text-xs font-medium text-gray-600 transition-colors hover:bg-gray-100/50 dark:border-white/10 dark:text-gray-300 dark:hover:bg-white/5\"\n >\n {t('cancel')}\n </button>\n <Button\n type=\"submit\"\n form=\"run-replay-form\"\n color=\"ios-glass-blue\"\n loading={submitting}\n >\n <ArrowPathIcon className=\"h-4 w-4\" />\n {t('replay', { _: 'Replay' } as never)}\n </Button>\n </div>\n </div>\n )\n\n return (\n <GlassModal\n open={open}\n onClose={onClose}\n title={t('replayTitle', { _: 'Replay run' } as never)}\n subtitle={t('replaySubtitle', { _: 'Tweak any input below and re-execute. Untouched keys keep their original value.' } as never)}\n icon={<ArrowPathIcon className=\"h-5 w-5 text-white\" />}\n gradient=\"from-sky-500 to-indigo-600\"\n maxWidth=\"lg\"\n footer={footer}\n onSubmit={(event) => {\n event.preventDefault()\n void handleSubmit()\n }}\n >\n <form\n id=\"run-replay-form\"\n onSubmit={(event) => { event.preventDefault(); void handleSubmit() }}\n className=\"space-y-3\"\n >\n {rows.length === 0 ? (\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\n {t('replayNoInputs', { _: 'This run had no input variables — replaying will execute the workflow as-is.' } as never)}\n </p>\n ) : rows.map((row, index) => (\n <RowEditor\n key={row.key}\n row={row}\n onChange={(patch) => updateRow(index, patch)}\n onReset={() => resetRow(index)}\n />\n ))}\n\n {error && (\n <p className=\"rounded-lg border border-red-400/40 bg-red-500/10 p-2 text-xs text-red-600 dark:text-red-300\">\n {error}\n </p>\n )}\n </form>\n </GlassModal>\n )\n}\n\n// ── Per-row editor ────────────────────────────────────────────────\n\nfunction RowEditor({\n row,\n onChange,\n onReset,\n}: {\n row: Row\n onChange: (patch: Partial<Row>) => void\n onReset: () => void\n}) {\n const isJson = row.kind === 'json'\n\n return (\n <div className=\"rounded-xl border border-gray-200/60 bg-gray-50/60 p-3 dark:border-white/10 dark:bg-white/5\">\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <span className=\"font-mono text-xs text-gray-700 dark:text-gray-200\">{row.key}</span>\n <div className=\"flex items-center gap-2\">\n <Badge color=\"zinc\" size=\"xs\" className=\"uppercase tracking-wider\">\n {row.kind}\n </Badge>\n {row.touched && (\n <button\n type=\"button\"\n onClick={onReset}\n className=\"text-[11px] text-indigo-600 hover:text-indigo-500 dark:text-indigo-400\"\n >\n reset\n </button>\n )}\n </div>\n </div>\n {row.kind === 'boolean' ? (\n <select\n value={row.value}\n onChange={(event) => onChange({ value: event.target.value })}\n className=\"w-full rounded-lg border border-gray-200/50 bg-white/70 px-3 py-2 text-sm text-gray-900 dark:border-white/10 dark:bg-gray-800/70 dark:text-gray-100\"\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : isJson ? (\n <FormTextarea\n value={row.value}\n onValueChange={(v) => onChange({ value: v })}\n rows={4}\n className=\"font-mono\"\n />\n ) : (\n <FormInput\n type={row.kind === 'number' ? 'number' : 'text'}\n value={row.value}\n onValueChange={(v) => onChange({ value: v })}\n />\n )}\n </div>\n )\n}\n\n// ── Coercion helpers ──────────────────────────────────────────────\n\nfunction toRow(key: string, value: unknown): Row {\n if (value === null || value === undefined) {\n return { key, value: '', kind: 'string', touched: false, original: value }\n }\n if (typeof value === 'boolean') {\n return { key, value: value ? 'true' : 'false', kind: 'boolean', touched: false, original: value }\n }\n if (typeof value === 'number') {\n return { key, value: String(value), kind: 'number', touched: false, original: value }\n }\n if (typeof value === 'string') {\n return { key, value, kind: 'string', touched: false, original: value }\n }\n // Object / array — show as pretty JSON.\n return {\n key,\n value: JSON.stringify(value, null, 2),\n kind: 'json',\n touched: false,\n original: value,\n }\n}\n\nfunction parseRow(row: Row): unknown {\n switch (row.kind) {\n case 'string':\n return row.value\n case 'number': {\n const n = Number(row.value)\n if (!Number.isFinite(n)) {\n throw new Error(`'${row.key}' must be a number, got '${row.value}'`)\n }\n return n\n }\n case 'boolean':\n return row.value === 'true'\n case 'json': {\n if (row.value.trim().length === 0) return null\n try {\n return JSON.parse(row.value)\n } catch (e) {\n throw new Error(`'${row.key}' is not valid JSON: ${(e as Error).message}`)\n }\n }\n }\n}\n","/**\n * Reusable execution timeline + per-node inspector (issue #68).\n *\n * Two-column layout:\n * - Left: vertical step list, one card per node, click-to-select.\n * - Right: details for the selected node (status, timing, model\n * metrics if present, inputs/outputs, error).\n *\n * Built to be dropped into any product that needs to render a\n * workflow run — astrlabe's runs page is the primary consumer; other\n * consuming apps can embed the same component without bespoke layout.\n * All copy is delivered via the `labels` prop so each consuming app\n * can localize without lifting its i18n dependency into this package.\n */\n\nimport { useMemo, useState } from 'react'\nimport {\n ArrowPathIcon,\n CheckCircleIcon,\n ClockIcon,\n ExclamationTriangleIcon,\n MinusCircleIcon,\n XCircleIcon,\n} from '@heroicons/react/24/outline'\nimport { Badge } from '@ui/components/badge'\n\nexport type ExecutionTimelineStatus =\n | 'completed'\n | 'running'\n | 'failed'\n | 'pending'\n | 'skipped'\n\nexport type ExecutionTimelineMetrics = {\n tokensIn?: number\n tokensOut?: number\n costUsd?: number\n provider?: string\n model?: string\n}\n\nexport type ExecutionTimelineEntry = {\n nodeId: string\n nodeType: string\n status: ExecutionTimelineStatus\n startedAt: string | null\n completedAt: string | null\n durationMs: number | null\n inputs?: Record<string, unknown>\n outputs?: Record<string, unknown>\n error?: string | null\n metrics?: ExecutionTimelineMetrics\n}\n\nexport type ExecutionTimelineLabels = {\n status: string\n duration: string\n inputs: string\n outputs: string\n error: string\n started: string\n completed: string\n pending: string\n running: string\n failed: string\n skipped: string\n selectNode: string\n model: string\n tokens: string\n cost: string\n /** Used as the empty-state heading when `entries` is empty. */\n empty?: string\n}\n\nexport type ExecutionTimelinePanelProps = {\n entries: ExecutionTimelineEntry[]\n labels: ExecutionTimelineLabels\n /** When set, drives selection from the parent. Useful when the page\n * syncs the selection with a URL query param. */\n selectedNodeId?: string\n onSelect?: (nodeId: string) => void\n}\n\nconst STATUS_META: Record<ExecutionTimelineStatus, { color: 'emerald' | 'sky' | 'rose' | 'amber' | 'zinc'; icon: typeof CheckCircleIcon }> = {\n completed: { color: 'emerald', icon: CheckCircleIcon },\n running: { color: 'sky', icon: ArrowPathIcon },\n failed: { color: 'rose', icon: XCircleIcon },\n pending: { color: 'amber', icon: ClockIcon },\n skipped: { color: 'zinc', icon: MinusCircleIcon },\n}\n\nexport function ExecutionTimelinePanel({\n entries,\n labels,\n selectedNodeId,\n onSelect,\n}: ExecutionTimelinePanelProps) {\n const [internalSelected, setInternalSelected] = useState<string | null>(null)\n const effectiveSelected = selectedNodeId ?? internalSelected\n\n const selected = useMemo(\n () => entries.find((entry) => entry.nodeId === effectiveSelected) ?? entries[0] ?? null,\n [entries, effectiveSelected],\n )\n\n const handleSelect = (nodeId: string) => {\n if (onSelect) onSelect(nodeId)\n setInternalSelected(nodeId)\n }\n\n if (entries.length === 0) {\n return (\n <div className=\"rounded-xl border border-slate-200 bg-slate-50/60 p-6 text-center text-sm text-slate-500 dark:border-slate-700 dark:bg-slate-900/40 dark:text-slate-400\">\n {labels.empty ?? '—'}\n </div>\n )\n }\n\n return (\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-12\">\n {/* Step list */}\n <div className=\"space-y-3 lg:col-span-5 xl:col-span-4\">\n {entries.map((entry, index) => {\n const meta = STATUS_META[entry.status]\n const Icon = meta.icon\n const isActive = (selected?.nodeId ?? '') === entry.nodeId\n return (\n <button\n key={entry.nodeId}\n type=\"button\"\n onClick={() => handleSelect(entry.nodeId)}\n className={[\n 'w-full text-left rounded-xl border p-4 transition',\n isActive\n ? 'border-indigo-400/60 bg-indigo-50/70 shadow-md dark:border-indigo-400/40 dark:bg-indigo-500/10'\n : 'border-slate-200/60 bg-white/70 hover:border-indigo-300 hover:shadow-sm dark:border-white/10 dark:bg-white/5 dark:hover:border-indigo-400/30',\n ].join(' ')}\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"flex flex-col items-center\">\n <span className=\"flex h-6 w-6 items-center justify-center rounded-full bg-indigo-100 text-xs font-semibold text-indigo-700 dark:bg-indigo-500/20 dark:text-indigo-200\">\n {index + 1}\n </span>\n {index < entries.length - 1 && (\n <span className=\"mt-1 h-8 w-px bg-slate-200 dark:bg-white/10\" />\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"min-w-0\">\n <div className=\"truncate font-medium text-slate-900 dark:text-white\">\n {entry.nodeId}\n </div>\n <div className=\"text-xs text-slate-500 dark:text-slate-400\">\n {entry.nodeType}\n </div>\n </div>\n <Badge color={meta.color}>\n <Icon className=\"mr-1 h-3 w-3\" />\n {labels[entry.status]}\n </Badge>\n </div>\n <div className=\"mt-2 flex items-center gap-3 text-xs text-slate-500 dark:text-slate-400\">\n <span>{formatDuration(entry.durationMs)}</span>\n <span>·</span>\n <span>{formatTimestamp(entry.startedAt)}</span>\n </div>\n </div>\n </div>\n </button>\n )\n })}\n </div>\n\n {/* Inspector */}\n <div className=\"lg:col-span-7 xl:col-span-8\">\n {selected ? (\n <NodeInspector entry={selected} labels={labels} />\n ) : (\n <div className=\"rounded-xl border border-slate-200 bg-slate-50/60 p-6 text-center text-sm text-slate-500 dark:border-slate-700 dark:bg-slate-900/40\">\n {labels.selectNode}\n </div>\n )}\n </div>\n </div>\n )\n}\n\n// ── Inspector ───────────────────────────────────────────────────\n\nfunction NodeInspector({\n entry,\n labels,\n}: {\n entry: ExecutionTimelineEntry\n labels: ExecutionTimelineLabels\n}) {\n const meta = STATUS_META[entry.status]\n return (\n <div className=\"rounded-2xl border border-slate-200 bg-white p-5 shadow-sm dark:border-slate-700 dark:bg-slate-900/40\">\n <div className=\"mb-3 flex items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-base font-semibold text-slate-900 dark:text-white\">\n {entry.nodeId}\n </h3>\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">{entry.nodeType}</p>\n </div>\n <Badge color={meta.color}>{labels[entry.status]}</Badge>\n </div>\n\n <dl className=\"grid grid-cols-2 gap-3 text-xs text-slate-500 dark:text-slate-400\">\n <div>\n <dt className=\"font-semibold\">{labels.started}</dt>\n <dd className=\"mt-0.5 text-slate-700 dark:text-slate-200\">\n {formatTimestamp(entry.startedAt)}\n </dd>\n </div>\n <div>\n <dt className=\"font-semibold\">{labels.completed}</dt>\n <dd className=\"mt-0.5 text-slate-700 dark:text-slate-200\">\n {formatTimestamp(entry.completedAt)}\n </dd>\n </div>\n <div>\n <dt className=\"font-semibold\">{labels.duration}</dt>\n <dd className=\"mt-0.5 text-slate-700 dark:text-slate-200\">\n {formatDuration(entry.durationMs)}\n </dd>\n </div>\n <div>\n <dt className=\"font-semibold\">{labels.status}</dt>\n <dd className=\"mt-0.5 text-slate-700 dark:text-slate-200\">{labels[entry.status]}</dd>\n </div>\n </dl>\n\n {entry.metrics && hasMetrics(entry.metrics) && (\n <div className=\"mt-4 rounded-lg border border-indigo-300/50 bg-indigo-50/60 p-3 text-xs dark:border-indigo-400/30 dark:bg-indigo-500/10\">\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3\">\n {entry.metrics.model && (\n <div>\n <dt className=\"font-semibold text-indigo-700 dark:text-indigo-200\">{labels.model}</dt>\n <dd className=\"mt-0.5 truncate text-indigo-900 dark:text-indigo-100\">\n {entry.metrics.provider ? `${entry.metrics.provider} · ` : ''}\n {entry.metrics.model}\n </dd>\n </div>\n )}\n {(entry.metrics.tokensIn !== undefined || entry.metrics.tokensOut !== undefined) && (\n <div>\n <dt className=\"font-semibold text-indigo-700 dark:text-indigo-200\">{labels.tokens}</dt>\n <dd className=\"mt-0.5 text-indigo-900 dark:text-indigo-100\">\n {entry.metrics.tokensIn ?? 0} in · {entry.metrics.tokensOut ?? 0} out\n </dd>\n </div>\n )}\n {entry.metrics.costUsd !== undefined && (\n <div>\n <dt className=\"font-semibold text-indigo-700 dark:text-indigo-200\">{labels.cost}</dt>\n <dd className=\"mt-0.5 text-indigo-900 dark:text-indigo-100\">\n {formatCost(entry.metrics.costUsd)}\n </dd>\n </div>\n )}\n </div>\n </div>\n )}\n\n {entry.error && (\n <div className=\"mt-4 rounded-lg border border-rose-300/60 bg-rose-50/60 p-3 text-xs dark:border-rose-400/30 dark:bg-rose-500/10\">\n <div className=\"flex items-center gap-2 font-semibold text-rose-700 dark:text-rose-300\">\n <ExclamationTriangleIcon className=\"h-4 w-4\" />\n {labels.error}\n </div>\n <pre className=\"mt-2 whitespace-pre-wrap break-words text-rose-800 dark:text-rose-200\">\n {entry.error}\n </pre>\n </div>\n )}\n\n <div className=\"mt-4 space-y-3\">\n <JsonBlock title={labels.inputs} value={entry.inputs} />\n <JsonBlock title={labels.outputs} value={entry.outputs} />\n </div>\n </div>\n )\n}\n\nfunction JsonBlock({ title, value }: { title: string; value?: Record<string, unknown> }) {\n const hasValue = value && Object.keys(value).length > 0\n return (\n <div className=\"rounded-lg border border-slate-200/60 bg-slate-50/60 p-3 dark:border-white/10 dark:bg-white/5\">\n <div className=\"mb-1 text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {title}\n </div>\n {hasValue ? (\n <pre className=\"max-h-72 overflow-auto whitespace-pre text-xs text-slate-800 dark:text-slate-200\">\n {JSON.stringify(value, null, 2)}\n </pre>\n ) : (\n <div className=\"text-xs italic text-slate-400 dark:text-slate-500\">—</div>\n )}\n </div>\n )\n}\n\nfunction hasMetrics(metrics: ExecutionTimelineMetrics): boolean {\n return Boolean(\n metrics.model\n || metrics.tokensIn !== undefined\n || metrics.tokensOut !== undefined\n || metrics.costUsd !== undefined,\n )\n}\n\nfunction formatDuration(ms: number | null): string {\n if (ms === null) return '—'\n if (ms < 1000) return `${ms}ms`\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`\n const mins = Math.floor(ms / 60_000)\n const secs = Math.floor((ms % 60_000) / 1000)\n return `${mins}m${secs}s`\n}\n\nfunction formatCost(usd: number): string {\n if (usd === 0) return '$0'\n if (usd < 0.01) return `$${usd.toFixed(4)}`\n if (usd < 1) return `$${usd.toFixed(3)}`\n return `$${usd.toFixed(2)}`\n}\n\nfunction formatTimestamp(iso: string | null): string {\n if (!iso) return '—'\n return new Date(iso).toLocaleString(undefined, {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n })\n}\n","/**\n * Rule editing types.\n *\n * Mirrors the shape the Rust `RuleExecutor`\n * (`lambda-rs/crates/astrlabe-handlers/src/engine/executors/rule.rs`) reads\n * from `astrlabe.agent_rules.condition` + `action`. The UI builder below\n * writes exactly this shape, so round-tripping through the backend is a\n * no-op.\n */\n\nexport type SimpleComparisonOperator =\n | 'truthy'\n | 'eq'\n | 'neq'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'contains'\n\nexport type RuleConditionOperator =\n | SimpleComparisonOperator\n | 'regex_match'\n | 'threshold'\n | 'time_window'\n | 'boolean_expression'\n\nexport type TimeWindow = {\n startHour: number\n endHour: number\n startMinute?: number\n endMinute?: number\n /** 0 = Sunday, 6 = Saturday. Omit to match every day. */\n daysOfWeek?: number[]\n}\n\n/**\n * Canonical rule-condition shape. The executor branches on `operator`,\n * so every form tree ultimately serializes to this.\n */\nexport type RuleCondition = {\n operator: RuleConditionOperator\n /** Simple operators + regex_match + threshold + time_window */\n field?: string\n /** Simple operators + threshold */\n value?: string | number | boolean | null\n /** regex_match */\n pattern?: string\n /** threshold — which direction `value` is compared in. */\n comparison?: 'gt' | 'gte' | 'lt' | 'lte'\n /** time_window */\n timezone?: string\n windows?: TimeWindow[]\n /** boolean_expression */\n combinator?: 'and' | 'or'\n operands?: RuleCondition[]\n}\n\nexport type RuleAction = {\n type: string\n params?: Record<string, unknown>\n}\n\n/** `agent_rules.status` free-form string — keep the UI picker aligned\n * with the values the engine / audit trail recognizes today. */\nexport const RULE_STATUS_OPTIONS = ['draft', 'active', 'archived'] as const\nexport type RuleStatus = (typeof RULE_STATUS_OPTIONS)[number]\n\nexport const TIMEZONE_OPTIONS = [\n 'UTC',\n 'America/Sao_Paulo',\n 'America/New_York',\n 'America/Los_Angeles',\n 'Europe/London',\n 'Europe/Lisbon',\n] as const\n","import { FormInput, FormSelect } from '@ui/components/form-input'\nimport { Button } from '@ui/components/button'\nimport type {\n RuleCondition,\n RuleConditionOperator,\n SimpleComparisonOperator,\n TimeWindow,\n} from './types'\nimport { TIMEZONE_OPTIONS } from './types'\n\ntype Props = {\n value: RuleCondition\n onChange: (next: RuleCondition) => void\n /** Recursion depth. Boolean_expression is capped at one level to keep\n * the UI legible — deeper trees remain round-trippable via the raw\n * JSON fallback but the visual builder won't surface sub-boolean\n * operands. */\n depth?: number\n}\n\nconst OPERATOR_OPTIONS: Array<{ value: RuleConditionOperator; label: string }> = [\n { value: 'truthy', label: 'Field is set (truthy)' },\n { value: 'eq', label: 'Equals' },\n { value: 'neq', label: 'Not equal to' },\n { value: 'gt', label: 'Greater than' },\n { value: 'gte', label: 'Greater than or equal' },\n { value: 'lt', label: 'Less than' },\n { value: 'lte', label: 'Less than or equal' },\n { value: 'contains', label: 'Contains (string)' },\n { value: 'threshold', label: 'Threshold' },\n { value: 'regex_match', label: 'Regex match' },\n { value: 'time_window', label: 'Time window' },\n { value: 'boolean_expression', label: 'And/Or group' },\n]\n\nconst SIMPLE_COMPARISON_OPERATORS: Array<SimpleComparisonOperator> = [\n 'truthy', 'eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'contains',\n]\n\nexport function RuleConditionBuilder({ value, onChange, depth = 0 }: Props) {\n const handleOperatorChange = (op: RuleConditionOperator) => {\n // Reset sibling fields that don't apply to the new op so stale\n // values don't leak back into the JSON — e.g. switching from\n // time_window to eq should drop `windows`.\n const base: RuleCondition = { operator: op }\n switch (op) {\n case 'truthy':\n onChange({ ...base, field: value.field ?? '' })\n break\n case 'eq':\n case 'neq':\n case 'gt':\n case 'gte':\n case 'lt':\n case 'lte':\n case 'contains':\n onChange({ ...base, field: value.field ?? '', value: value.value ?? '' })\n break\n case 'threshold':\n onChange({\n ...base,\n field: value.field ?? '',\n comparison: value.comparison ?? 'gte',\n value: typeof value.value === 'number' ? value.value : 0,\n })\n break\n case 'regex_match':\n onChange({ ...base, field: value.field ?? '', pattern: value.pattern ?? '' })\n break\n case 'time_window':\n onChange({\n ...base,\n field: value.field ?? '',\n timezone: value.timezone ?? 'UTC',\n windows: value.windows && value.windows.length > 0\n ? value.windows\n : [{ startHour: 6, endHour: 9 }],\n })\n break\n case 'boolean_expression':\n onChange({\n ...base,\n combinator: value.combinator ?? 'and',\n operands: value.operands && value.operands.length > 0\n ? value.operands\n : [{ operator: 'gt', field: '', value: 0 }, { operator: 'gt', field: '', value: 0 }],\n })\n break\n }\n }\n\n return (\n <div className=\"space-y-3 rounded-xl border border-slate-200 bg-slate-50/60 p-3 dark:border-slate-700 dark:bg-slate-900/40\">\n <FormSelect\n label=\"Operator\"\n value={value.operator}\n options={OPERATOR_OPTIONS}\n onValueChange={(v) => handleOperatorChange(v as RuleConditionOperator)}\n />\n\n {SIMPLE_COMPARISON_OPERATORS.includes(value.operator as SimpleComparisonOperator) && (\n <SimpleEditor value={value} onChange={onChange} />\n )}\n\n {value.operator === 'threshold' && <ThresholdEditor value={value} onChange={onChange} />}\n {value.operator === 'regex_match' && <RegexEditor value={value} onChange={onChange} />}\n {value.operator === 'time_window' && <TimeWindowEditor value={value} onChange={onChange} />}\n {value.operator === 'boolean_expression' && depth < 1 && (\n <BooleanGroupEditor value={value} onChange={onChange} depth={depth + 1} />\n )}\n {value.operator === 'boolean_expression' && depth >= 1 && (\n <p className=\"text-xs italic text-slate-500\">\n Nested boolean groups are supported by the engine but not in this builder — edit the JSON directly for deeper trees.\n </p>\n )}\n </div>\n )\n}\n\n// ── Simple comparison editor ──\n\nfunction SimpleEditor({\n value,\n onChange,\n}: {\n value: RuleCondition\n onChange: (next: RuleCondition) => void\n}) {\n const isTruthy = value.operator === 'truthy'\n return (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <FormInput\n label=\"Field\"\n hint=\"Dotted reference into the variable pool — e.g. `parse-pricing.margin`, `inputs.category`\"\n value={value.field ?? ''}\n onValueChange={(field) => onChange({ ...value, field })}\n placeholder=\"node.path\"\n />\n {!isTruthy && (\n <FormInput\n label=\"Value\"\n hint=\"Literal. Numeric operators coerce via `as f64`.\"\n value={value.value === null || value.value === undefined ? '' : String(value.value)}\n onValueChange={(raw) => onChange({ ...value, value: coerceScalar(raw) })}\n />\n )}\n </div>\n )\n}\n\n// ── Threshold editor ──\n\nfunction ThresholdEditor({\n value,\n onChange,\n}: {\n value: RuleCondition\n onChange: (next: RuleCondition) => void\n}) {\n return (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <FormInput\n label=\"Field\"\n value={value.field ?? ''}\n onValueChange={(field) => onChange({ ...value, field })}\n placeholder=\"parse-pricing.margin\"\n />\n <FormSelect\n label=\"Direction\"\n value={value.comparison ?? 'gte'}\n options={[\n { value: 'gt', label: 'Greater than (>)' },\n { value: 'gte', label: 'At least (≥)' },\n { value: 'lt', label: 'Less than (<)' },\n { value: 'lte', label: 'At most (≤)' },\n ]}\n onValueChange={(comparison) =>\n onChange({ ...value, comparison: comparison as 'gt' | 'gte' | 'lt' | 'lte' })\n }\n />\n <FormInput\n label=\"Threshold\"\n type=\"number\"\n value={value.value === null || value.value === undefined ? '' : String(value.value)}\n onValueChange={(raw) => onChange({ ...value, value: Number(raw) })}\n placeholder=\"0.08\"\n />\n </div>\n )\n}\n\n// ── Regex editor ──\n\nfunction RegexEditor({\n value,\n onChange,\n}: {\n value: RuleCondition\n onChange: (next: RuleCondition) => void\n}) {\n return (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <FormInput\n label=\"Field\"\n value={value.field ?? ''}\n onValueChange={(field) => onChange({ ...value, field })}\n placeholder=\"agent.text\"\n />\n <FormInput\n label=\"Pattern\"\n hint=\"Rust regex syntax — `(?i)` etc. supported.\"\n value={value.pattern ?? ''}\n onValueChange={(pattern) => onChange({ ...value, pattern })}\n placeholder=\"diesel-s10\"\n />\n </div>\n )\n}\n\n// ── Time-window editor ──\n\nfunction TimeWindowEditor({\n value,\n onChange,\n}: {\n value: RuleCondition\n onChange: (next: RuleCondition) => void\n}) {\n const windows = value.windows ?? []\n\n const update = (index: number, patch: Partial<TimeWindow>) => {\n const next = windows.map((win, i) => (i === index ? { ...win, ...patch } : win))\n onChange({ ...value, windows: next })\n }\n const remove = (index: number) => {\n const next = windows.filter((_, i) => i !== index)\n onChange({ ...value, windows: next })\n }\n const add = () => onChange({ ...value, windows: [...windows, { startHour: 8, endHour: 17 }] })\n\n return (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <FormSelect\n label=\"Timezone\"\n value={value.timezone ?? 'UTC'}\n options={TIMEZONE_OPTIONS.map((tz) => ({ value: tz, label: tz }))}\n onValueChange={(timezone) => onChange({ ...value, timezone })}\n />\n <FormInput\n label=\"Timestamp field (optional)\"\n hint=\"Pulls a timestamp from the pool. Leave blank to use the run's wall-clock.\"\n value={value.field ?? ''}\n onValueChange={(field) => onChange({ ...value, field })}\n placeholder=\"clock.ts\"\n />\n </div>\n\n <div className=\"space-y-2\">\n {windows.map((win, index) => (\n <div key={index} className=\"grid grid-cols-[1fr_1fr_auto] items-end gap-2 rounded-lg border border-slate-200 p-2 dark:border-slate-700\">\n <FormInput\n label={`Start (hour)`}\n type=\"number\"\n min={0}\n max={23}\n value={String(win.startHour)}\n onValueChange={(raw) => update(index, { startHour: clampHour(raw) })}\n />\n <FormInput\n label={`End (hour)`}\n type=\"number\"\n min={0}\n max={24}\n value={String(win.endHour)}\n onValueChange={(raw) => update(index, { endHour: clampHour(raw, 24) })}\n />\n <Button type=\"button\" plain onClick={() => remove(index)}>Remove</Button>\n </div>\n ))}\n <Button type=\"button\" outline onClick={add}>+ Add window</Button>\n </div>\n </div>\n )\n}\n\n// ── Boolean expression editor ──\n\nfunction BooleanGroupEditor({\n value,\n onChange,\n depth,\n}: {\n value: RuleCondition\n onChange: (next: RuleCondition) => void\n depth: number\n}) {\n const operands = value.operands ?? []\n\n const update = (index: number, next: RuleCondition) => {\n const arr = operands.map((op, i) => (i === index ? next : op))\n onChange({ ...value, operands: arr })\n }\n const remove = (index: number) => {\n onChange({ ...value, operands: operands.filter((_, i) => i !== index) })\n }\n const add = () => onChange({\n ...value,\n operands: [...operands, { operator: 'gt', field: '', value: 0 }],\n })\n\n return (\n <div className=\"space-y-3\">\n <FormSelect\n label=\"Combinator\"\n value={value.combinator ?? 'and'}\n options={[{ value: 'and', label: 'All of (AND)' }, { value: 'or', label: 'Any of (OR)' }]}\n onValueChange={(combinator) =>\n onChange({ ...value, combinator: combinator as 'and' | 'or' })\n }\n />\n <div className=\"space-y-2\">\n {operands.map((child, index) => (\n <div key={index} className=\"relative rounded-lg border border-dashed border-slate-300 p-2 dark:border-slate-700\">\n <RuleConditionBuilder\n value={child}\n onChange={(next) => update(index, next)}\n depth={depth}\n />\n <div className=\"mt-2 text-right\">\n <Button type=\"button\" plain onClick={() => remove(index)}>Remove operand</Button>\n </div>\n </div>\n ))}\n <Button type=\"button\" outline onClick={add}>+ Add operand</Button>\n </div>\n </div>\n )\n}\n\n// ── Helpers ──\n\nfunction coerceScalar(raw: string): string | number | boolean {\n const trimmed = raw.trim()\n if (trimmed === 'true') return true\n if (trimmed === 'false') return false\n if (trimmed !== '' && !Number.isNaN(Number(trimmed))) return Number(trimmed)\n return raw\n}\n\nfunction clampHour(raw: string, max = 23): number {\n const n = Number(raw)\n if (!Number.isFinite(n)) return 0\n return Math.max(0, Math.min(max, Math.trunc(n)))\n}\n\nexport function defaultRuleCondition(): RuleCondition {\n return { operator: 'truthy', field: '' }\n}\n","import { FormInput, FormSelect } from '@ui/components/form-input'\nimport { Button } from '@ui/components/button'\nimport type { RuleAction } from './types'\n\ntype Props = {\n value: RuleAction\n onChange: (next: RuleAction) => void\n}\n\nconst ACTION_TYPE_OPTIONS: Array<{ value: string; label: string }> = [\n { value: 'adjust_price', label: 'Adjust price (multiplier)' },\n { value: 'enforce_min_margin', label: 'Enforce minimum margin' },\n { value: 'realign_to_competitor', label: 'Realign to competitor' },\n { value: 'request_manager_approval', label: 'Request manager approval' },\n { value: 'round_to', label: 'Round to step' },\n { value: 'alert', label: 'Emit alert' },\n { value: 'custom', label: 'Custom action' },\n]\n\n/**\n * Action builder — emits a single `{ type, params }` object matching the\n * executor contract. The `custom` type drops to a raw key/value editor for\n * actions the UI doesn't have a dedicated template for.\n */\nexport function RuleActionBuilder({ value, onChange }: Props) {\n const type = value.type || 'adjust_price'\n const params = value.params ?? {}\n\n const setParam = (key: string, newValue: unknown) => {\n onChange({ ...value, type, params: { ...params, [key]: newValue } })\n }\n\n return (\n <div className=\"space-y-3 rounded-xl border border-slate-200 bg-slate-50/60 p-3 dark:border-slate-700 dark:bg-slate-900/40\">\n <FormSelect\n label=\"Action type\"\n value={type}\n options={ACTION_TYPE_OPTIONS}\n onValueChange={(t) => onChange({ type: t, params: {} })}\n />\n\n {type === 'adjust_price' && (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <FormInput\n label=\"Multiplier\"\n type=\"number\"\n step={0.01}\n value={numberParam(params.multiplier, 1.0)}\n onValueChange={(raw) => setParam('multiplier', Number(raw))}\n />\n <FormInput\n label=\"Reason code\"\n value={stringParam(params.reason)}\n onValueChange={(raw) => setParam('reason', raw)}\n placeholder=\"peak_demand_window\"\n />\n </div>\n )}\n\n {type === 'enforce_min_margin' && (\n <FormInput\n label=\"Floor (fraction, e.g. 0.08)\"\n type=\"number\"\n step={0.01}\n value={numberParam(params.floor, 0.08)}\n onValueChange={(raw) => setParam('floor', Number(raw))}\n />\n )}\n\n {type === 'realign_to_competitor' && (\n <FormInput\n label=\"Tolerance (fraction)\"\n type=\"number\"\n step={0.01}\n value={numberParam(params.tolerance, 0.03)}\n onValueChange={(raw) => setParam('tolerance', Number(raw))}\n />\n )}\n\n {type === 'request_manager_approval' && (\n <FormInput\n label=\"Approval limit (fraction)\"\n type=\"number\"\n step={0.01}\n value={numberParam(params.limit, 0.05)}\n onValueChange={(raw) => setParam('limit', Number(raw))}\n />\n )}\n\n {type === 'round_to' && (\n <FormInput\n label=\"Step (e.g. 0.009)\"\n type=\"number\"\n step={0.001}\n value={numberParam(params.step, 0.009)}\n onValueChange={(raw) => setParam('step', Number(raw))}\n />\n )}\n\n {type === 'alert' && (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <FormInput\n label=\"Channel\"\n value={stringParam(params.channel)}\n onValueChange={(raw) => setParam('channel', raw)}\n placeholder=\"slack\"\n />\n <FormInput\n label=\"Severity\"\n value={stringParam(params.severity)}\n onValueChange={(raw) => setParam('severity', raw)}\n placeholder=\"warning\"\n />\n </div>\n )}\n\n {type === 'custom' && (\n <CustomParamsEditor params={params} onChange={(p) => onChange({ ...value, type, params: p })} />\n )}\n </div>\n )\n}\n\n// ── Custom params fallback — free-form key/value rows ──\n\nfunction CustomParamsEditor({\n params,\n onChange,\n}: {\n params: Record<string, unknown>\n onChange: (next: Record<string, unknown>) => void\n}) {\n const entries = Object.entries(params)\n\n const update = (index: number, key: string, raw: string) => {\n const next: Record<string, unknown> = {}\n entries.forEach(([k, v], i) => {\n if (i === index) next[key] = coerce(raw)\n else next[k] = v\n })\n onChange(next)\n }\n const remove = (index: number) => {\n const next: Record<string, unknown> = {}\n entries.forEach(([k, v], i) => { if (i !== index) next[k] = v })\n onChange(next)\n }\n const add = () => {\n onChange({ ...params, ['']: '' })\n }\n\n return (\n <div className=\"space-y-2\">\n {entries.map(([key, value], index) => (\n <div key={index} className=\"grid grid-cols-[1fr_1fr_auto] items-end gap-2\">\n <FormInput\n label=\"Key\"\n value={key}\n onValueChange={(raw) => update(index, raw, String(value ?? ''))}\n />\n <FormInput\n label=\"Value\"\n value={String(value ?? '')}\n onValueChange={(raw) => update(index, key, raw)}\n />\n <Button type=\"button\" plain onClick={() => remove(index)}>Remove</Button>\n </div>\n ))}\n <Button type=\"button\" outline onClick={add}>+ Add param</Button>\n </div>\n )\n}\n\nfunction numberParam(value: unknown, fallback: number): string {\n if (typeof value === 'number' && Number.isFinite(value)) return String(value)\n return String(fallback)\n}\n\nfunction stringParam(value: unknown): string {\n if (typeof value === 'string') return value\n if (value === null || value === undefined) return ''\n return String(value)\n}\n\nfunction coerce(raw: string): string | number | boolean {\n const trimmed = raw.trim()\n if (trimmed === 'true') return true\n if (trimmed === 'false') return false\n if (trimmed !== '' && !Number.isNaN(Number(trimmed))) return Number(trimmed)\n return raw\n}\n\nexport function defaultRuleAction(): RuleAction {\n return { type: 'adjust_price', params: { multiplier: 1.0, reason: '' } }\n}\n","import { useState } from 'react'\nimport { FormInput, FormSelect, FormTextarea } from '@ui/components/form-input'\nimport { FormGrid } from '@ui/components/form'\nimport { Button } from '@ui/components/button'\nimport { Badge } from '@ui/components/badge'\nimport { RuleConditionBuilder, defaultRuleCondition } from './condition-builder'\nimport { RuleActionBuilder, defaultRuleAction } from './action-builder'\nimport type { RuleAction, RuleCondition, RuleStatus } from './types'\nimport { RULE_STATUS_OPTIONS } from './types'\n\nexport type RuleFormValue = {\n ruleId?: string\n name: string\n description?: string\n enabled: boolean\n priority: number\n status?: RuleStatus\n validFrom?: string | null\n validUntil?: string | null\n tags?: string[]\n condition: RuleCondition\n action: RuleAction\n}\n\ntype Props = {\n value: RuleFormValue\n onChange: (next: RuleFormValue) => void\n}\n\n/**\n * Full-field rule editor used inside the create/edit modal. Composes the\n * visual condition + action builders and exposes the schedule / tagging /\n * lifecycle fields that the `agent_rules` entity has but the old JSON-\n * textarea form never surfaced.\n */\nexport function RuleForm({ value, onChange }: Props) {\n const [showAdvanced, setShowAdvanced] = useState<boolean>(\n Boolean(\n value.validFrom || value.validUntil || (value.tags && value.tags.length > 0) || value.status,\n ),\n )\n\n const update = <K extends keyof RuleFormValue>(key: K, v: RuleFormValue[K]) =>\n onChange({ ...value, [key]: v })\n\n return (\n <div className=\"space-y-5\">\n <FormGrid>\n <FormInput\n label=\"Name\"\n required\n value={value.name}\n onValueChange={(v) => update('name', v)}\n />\n <FormInput\n label=\"Priority\"\n type=\"number\"\n min={0}\n value={String(value.priority)}\n onValueChange={(v) => update('priority', Number(v) || 0)}\n />\n <FormSelect\n label=\"Enabled\"\n value={value.enabled ? 'true' : 'false'}\n options={[\n { value: 'true', label: 'Enabled' },\n { value: 'false', label: 'Disabled' },\n ]}\n onValueChange={(v) => update('enabled', v === 'true')}\n />\n <FormTextarea\n label=\"Description\"\n rows={2}\n value={value.description ?? ''}\n onValueChange={(v) => update('description', v)}\n />\n </FormGrid>\n\n <section>\n <div className=\"mb-2 flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold text-slate-700 dark:text-slate-200\">Condition</h3>\n <Badge color=\"indigo\">{value.condition.operator}</Badge>\n </div>\n <RuleConditionBuilder\n value={value.condition}\n onChange={(condition) => update('condition', condition)}\n />\n </section>\n\n <section>\n <div className=\"mb-2 flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold text-slate-700 dark:text-slate-200\">Action on match</h3>\n <Badge color=\"fuchsia\">{value.action.type}</Badge>\n </div>\n <RuleActionBuilder\n value={value.action}\n onChange={(action) => update('action', action)}\n />\n </section>\n\n <section>\n <button\n type=\"button\"\n onClick={() => setShowAdvanced((s) => !s)}\n className=\"text-xs font-medium text-indigo-600 hover:text-indigo-500 dark:text-indigo-400\"\n >\n {showAdvanced ? '− Hide schedule & tagging' : '+ Schedule, tagging, lifecycle'}\n </button>\n {showAdvanced && (\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <FormInput\n label=\"Valid from (ISO 8601)\"\n type=\"datetime-local\"\n value={toDatetimeLocal(value.validFrom)}\n onValueChange={(v) => update('validFrom', fromDatetimeLocal(v))}\n />\n <FormInput\n label=\"Valid until (ISO 8601)\"\n type=\"datetime-local\"\n value={toDatetimeLocal(value.validUntil)}\n onValueChange={(v) => update('validUntil', fromDatetimeLocal(v))}\n />\n <FormSelect\n label=\"Status\"\n value={value.status ?? 'active'}\n options={RULE_STATUS_OPTIONS.map((s) => ({ value: s, label: s }))}\n onValueChange={(v) => update('status', v as RuleStatus)}\n />\n <FormInput\n label=\"Tags (comma-separated)\"\n value={(value.tags ?? []).join(', ')}\n onValueChange={(v) => update('tags', parseTags(v))}\n placeholder=\"pricing, peak-hours\"\n />\n </div>\n )}\n </section>\n </div>\n )\n}\n\nexport function defaultRuleForm(): RuleFormValue {\n return {\n name: '',\n description: '',\n enabled: true,\n priority: 0,\n status: 'active',\n validFrom: null,\n validUntil: null,\n tags: [],\n condition: defaultRuleCondition(),\n action: defaultRuleAction(),\n }\n}\n\nfunction parseTags(raw: string): string[] {\n return raw\n .split(',')\n .map((tag) => tag.trim())\n .filter((tag) => tag.length > 0)\n}\n\nfunction toDatetimeLocal(iso: string | null | undefined): string {\n if (!iso) return ''\n try {\n const d = new Date(iso)\n if (Number.isNaN(d.getTime())) return ''\n const pad = (n: number) => String(n).padStart(2, '0')\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`\n } catch {\n return ''\n }\n}\n\nfunction fromDatetimeLocal(raw: string): string | null {\n if (!raw) return null\n const d = new Date(raw)\n if (Number.isNaN(d.getTime())) return null\n return d.toISOString()\n}\n\n// Re-export so consumers only need one import\nexport { RuleConditionBuilder } from './condition-builder'\nexport { RuleActionBuilder } from './action-builder'\nexport type { RuleCondition, RuleAction } from './types'\n","/**\n * Node Palette (Sidebar)\n * ======================\n * Draggable node templates for the workflow canvas.\n * Users drag items from here onto the React Flow canvas.\n *\n * Sections: Agents (indigo), Tools (teal), Rules (violet), Logic (subcategories)\n * Features: Collapsible sections, search/filter\n */\n\nimport { Children, useState, useMemo } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { ToggleSwitch } from '@ui/components/toggle-switch'\nimport {\n CpuChipIcon,\n WrenchScrewdriverIcon,\n CommandLineIcon,\n AdjustmentsHorizontalIcon,\n BoltIcon,\n ChevronDownIcon,\n PlusIcon,\n CircleStackIcon,\n ArrowPathRoundedSquareIcon,\n KeyIcon,\n} from '@heroicons/react/24/outline'\nimport type { WorkflowTool, AgentTool, AgentRule, WorkflowNodeType } from '../../contracts'\nimport type { AgentWithPrompts, WorkflowEntityDefinition } from '../../types'\nimport { LOGIC_ICON_MAP, LOGIC_NODE_GRADIENTS, EXPERIMENTAL_NODE_TYPES } from '../../constants/workflow-constants'\nimport { getEntityGradient, getEntityIcon } from '../../constants/entity-colors'\nimport { createDefaultLogicNodeConfig } from '../../utils/logic-node-defaults'\nimport { getAgentTier } from '../../utils/agent-tier'\nimport { getFrameworkMeta } from '../icons/agent-framework-icons'\n\n/* ─── Datasource logos (served from app public/) ─── */\n\nconst DATASOURCE_LOGOS: Record<string, string> = {\n bigquery: '/logos/datasources/bigquery.svg',\n postgres: '/logos/datasources/postgres.svg',\n snowflake: '/logos/datasources/snowflake.svg',\n mongodb: '/logos/datasources/mongodb.svg',\n redis: '/logos/datasources/redis.svg',\n mysql: '/logos/datasources/mysql.svg',\n clickhouse: '/logos/datasources/clickhouse.svg',\n elasticsearch: '/logos/datasources/elasticsearch.svg',\n duckdb: '/logos/datasources/duckdb.svg',\n sqlite: '/logos/datasources/sqlite.svg',\n mariadb: '/logos/datasources/mariadb.svg',\n oracle: '/logos/datasources/oracle.svg',\n mssql: '/logos/datasources/mssql.svg',\n sqlserver: '/logos/datasources/mssql.svg',\n cassandra: '/logos/datasources/cassandra.svg',\n dynamodb: '/logos/datasources/dynamodb.svg',\n cockroach: '/logos/datasources/cockroachdb.svg',\n supabase: '/logos/datasources/supabase.svg',\n firebase: '/logos/datasources/firebase.svg',\n neo4j: '/logos/datasources/neo4j.svg',\n}\n\nfunction getDatasourceLogo(entityId: string): string | null {\n const lower = entityId.toLowerCase()\n for (const [key, url] of Object.entries(DATASOURCE_LOGOS)) {\n if (lower.includes(key)) return url\n }\n return null\n}\n\nconst PROVIDER_LOGOS: Record<string, string> = {\n anthropic: '/logos/providers/anthropic.svg',\n amazon: '/logos/providers/aws.svg',\n google: '/logos/providers/google-gemini.svg',\n openai: '/logos/providers/openai.svg',\n meta: '/logos/providers/meta.svg',\n}\n\nexport type ModelProvider = {\n id: string\n name: string\n /** The provider's runtime SDK / endpoint family. Different from the\n * model families it CAN serve (see `servedFamilies`). E.g., a\n * Bedrock provider has `provider: 'amazon'` but\n * `servedFamilies: ['anthropic', 'amazon', 'meta', 'openai']`. */\n provider: string\n modelCount: number\n configured: boolean\n /** Which model families this provider can serve at run-time. Used\n * to compute the cartesian (model × provider) available to an\n * agent. Defaults to `[provider]` when omitted (i.e., direct API\n * providers that only serve their own family). */\n servedFamilies?: string[]\n /** Optional masked API key for display (`sk-prod-•••3742`). */\n apiKeyMasked?: string\n /** ARN/SSM path of the secret, displayed read-only. */\n credentialRef?: string\n /** ISO timestamp of last successful auth handshake. */\n lastVerifiedAt?: string\n}\n\ntype NodePaletteProps = {\n agents: AgentWithPrompts[]\n tools: WorkflowTool[]\n agentTools?: AgentTool[]\n rules: AgentRule[]\n entities?: WorkflowEntityDefinition[]\n modelProviders?: ModelProvider[]\n onCreateAgent?: () => void\n onCreateTool?: () => void\n onCreateAgentTool?: () => void\n onCreateRule?: () => void\n onCreateDatasource?: () => void\n onConfigureProvider?: (providerId: string) => void\n}\n\nfunction onDragStart(\n event: React.DragEvent,\n nodeType: WorkflowNodeType,\n entityId: string,\n label: string,\n config?: string\n) {\n event.dataTransfer.setData('nodeType', nodeType)\n event.dataTransfer.setData('entityId', entityId)\n event.dataTransfer.setData('label', label)\n if (config) {\n event.dataTransfer.setData('config', config)\n }\n event.dataTransfer.effectAllowed = 'move'\n}\n\n// ============================================================================\n// Logic Node Items — organized by subcategory\n// ============================================================================\n\ntype LogicNodeItem = {\n nodeType: WorkflowNodeType\n nameKey: string\n descriptionKey: string\n subcategory: 'control_flow' | 'data_processing' | 'ai_ml' | 'annotation' | 'output'\n}\n\nconst LOGIC_NODE_ITEMS: LogicNodeItem[] = [\n // Control Flow\n { nodeType: 'start', nameKey: 'startNode', descriptionKey: 'startNodeDescription', subcategory: 'control_flow' },\n { nodeType: 'end', nameKey: 'endNode', descriptionKey: 'endNodeDescription', subcategory: 'control_flow' },\n { nodeType: 'if_else', nameKey: 'ifElseNode', descriptionKey: 'ifElseNodeDescription', subcategory: 'control_flow' },\n { nodeType: 'iteration', nameKey: 'iterationNode', descriptionKey: 'iterationNodeDescription', subcategory: 'control_flow' },\n { nodeType: 'iteration_start', nameKey: 'iterationStartNode', descriptionKey: 'iterationStartNodeDescription', subcategory: 'control_flow' },\n { nodeType: 'group', nameKey: 'groupNode', descriptionKey: 'groupNodeDescription', subcategory: 'control_flow' },\n\n // Data Processing\n { nodeType: 'code', nameKey: 'codeNode', descriptionKey: 'codeNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'http_request', nameKey: 'httpRequestNode', descriptionKey: 'httpRequestNodeDescription', subcategory: 'data_processing' },\n { nodeType: 's3_write', nameKey: 's3WriteNode', descriptionKey: 's3WriteNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'template_transform', nameKey: 'templateTransformNode', descriptionKey: 'templateTransformNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'variable_assigner', nameKey: 'variableAssignerNode', descriptionKey: 'variableAssignerNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'variable_aggregator', nameKey: 'variableAggregatorNode', descriptionKey: 'variableAggregatorNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'list_operator', nameKey: 'listOperatorNode', descriptionKey: 'listOperatorNodeDescription', subcategory: 'data_processing' },\n // DocumentExtractor echoes its config today — pending a real\n // extractor implementation. Tagged via EXPERIMENTAL_NODE_TYPES.\n { nodeType: 'document_extractor', nameKey: 'documentExtractorNode', descriptionKey: 'documentExtractorNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'datasource', nameKey: 'datasourceNode', descriptionKey: 'datasourceNodeDescription', subcategory: 'data_processing' },\n\n // AI/ML\n // KnowledgeBase is a stub (no vector store wired yet). Tagged via EXPERIMENTAL_NODE_TYPES.\n { nodeType: 'knowledge_base', nameKey: 'knowledgeBaseNode', descriptionKey: 'knowledgeBaseNodeDescription', subcategory: 'ai_ml' },\n { nodeType: 'answer', nameKey: 'answerNode', descriptionKey: 'answerNodeDescription', subcategory: 'ai_ml' },\n { nodeType: 'question_classifier', nameKey: 'questionClassifierNode', descriptionKey: 'questionClassifierNodeDescription', subcategory: 'ai_ml' },\n { nodeType: 'parameter_extractor', nameKey: 'parameterExtractorNode', descriptionKey: 'parameterExtractorNodeDescription', subcategory: 'ai_ml' },\n { nodeType: 'audio_input', nameKey: 'audioInputNode', descriptionKey: 'audioInputNodeDescription', subcategory: 'ai_ml' },\n { nodeType: 'speech_transcriber', nameKey: 'speechTranscriberNode', descriptionKey: 'speechTranscriberNodeDescription', subcategory: 'ai_ml' },\n\n // Annotation\n { nodeType: 'note', nameKey: 'noteNode', descriptionKey: 'noteNodeDescription', subcategory: 'annotation' },\n\n // Output\n { nodeType: 'dashboard_output', nameKey: 'dashboardOutputNode', descriptionKey: 'dashboardOutputNodeDescription', subcategory: 'output' },\n]\n\nconst SUBCATEGORY_LABELS: Record<string, string> = {\n control_flow: 'controlFlowSection',\n data_processing: 'dataProcessingSection',\n ai_ml: 'aiMlSection',\n annotation: 'annotationSection',\n output: 'outputSection',\n}\n\ntype CollapsibleSectionProps = {\n title: string\n icon: React.ReactNode\n colorClass: string\n defaultOpen?: boolean\n count?: number\n onAdd?: () => void\n addLabel?: string\n children: React.ReactNode\n}\n\nfunction SectionHeader({ icon, title, colorClass, count, onAdd, addLabel, isOpen, onToggle }: {\n icon: React.ReactNode\n title: string\n colorClass: string\n count?: number\n onAdd?: () => void\n addLabel?: string\n isOpen: boolean\n onToggle: () => void\n}) {\n return (\n <div className=\"flex items-center justify-between px-4 py-2.5\">\n <button\n type=\"button\"\n onClick={onToggle}\n className=\"flex flex-1 items-center gap-1.5 transition-colors\"\n >\n <span className={`flex items-center gap-1.5 text-[10px] font-semibold uppercase tracking-wider ${colorClass}`}>\n {icon}\n {title}\n {count !== undefined && (\n <span className=\"ml-1 rounded-full bg-gray-100 px-1.5 py-px text-[9px] font-medium text-gray-500 dark:bg-white/10 dark:text-gray-400\">\n {count}\n </span>\n )}\n </span>\n <ChevronDownIcon\n className={`h-3 w-3 text-gray-400 transition-transform duration-200 ${isOpen ? '' : '-rotate-90'}`}\n />\n </button>\n {onAdd ? (\n <button\n type=\"button\"\n onClick={onAdd}\n title={addLabel}\n className={`rounded-md p-1 transition-colors hover:bg-gray-100 dark:hover:bg-white/10 ${colorClass}`}\n >\n <PlusIcon className=\"h-3.5 w-3.5\" />\n </button>\n ) : null}\n </div>\n )\n}\n\nfunction CollapsibleSection({ title, icon, colorClass, defaultOpen = true, count, onAdd, addLabel, children }: CollapsibleSectionProps) {\n const [isOpen, setIsOpen] = useState(defaultOpen)\n const safeChildren = Children.toArray(children)\n\n return (\n <div className=\"border-t border-gray-200/40 dark:border-white/5\">\n <SectionHeader\n icon={icon}\n title={title}\n colorClass={colorClass}\n count={count}\n onAdd={onAdd}\n addLabel={addLabel}\n isOpen={isOpen}\n onToggle={() => setIsOpen((previous) => !previous)}\n />\n {isOpen ? (\n <div className=\"space-y-1.5 px-4 pb-3\">\n {safeChildren}\n </div>\n ) : null}\n </div>\n )\n}\n\nfunction LogicNodeItemCard({ item, translationFunction }: { item: LogicNodeItem; translationFunction: ReturnType<typeof useTranslations> }) {\n const IconComponent = LOGIC_ICON_MAP[item.nodeType]\n const gradient = LOGIC_NODE_GRADIENTS[item.nodeType] ?? 'from-gray-400 to-gray-500'\n const defaultConfig = createDefaultLogicNodeConfig(item.nodeType)\n const configJson = defaultConfig ? JSON.stringify(defaultConfig) : undefined\n\n return (\n <div\n draggable\n onDragStart={(event) =>\n onDragStart(event, item.nodeType, item.nodeType, translationFunction(item.nameKey), configJson)\n }\n className=\"liquid-surface group flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n >\n <div className={`flex h-6 w-6 items-center justify-center rounded-md bg-gradient-to-br ${gradient} shadow-sm`}>\n {IconComponent && <IconComponent className=\"h-3.5 w-3.5 text-white\" />}\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {translationFunction(item.nameKey)}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {translationFunction(item.descriptionKey)}\n </p>\n </div>\n </div>\n )\n}\n\nexport function NodePalette({ agents, tools, agentTools = [], rules, entities = [], modelProviders = [], onCreateAgent, onCreateTool, onCreateAgentTool, onCreateRule, onCreateDatasource, onConfigureProvider }: NodePaletteProps) {\n const t = useTranslations('agents.workflow')\n const [searchQuery, setSearchQuery] = useState('')\n\n const normalizedQuery = searchQuery.toLowerCase().trim()\n\n const filteredAgents = useMemo(\n () => normalizedQuery\n ? agents.filter((agent) =>\n agent.name.toLowerCase().includes(normalizedQuery) ||\n (agent.role ?? '').toLowerCase().includes(normalizedQuery)\n )\n : agents,\n [agents, normalizedQuery]\n )\n\n const filteredTools = useMemo(\n () => normalizedQuery\n ? tools.filter((tool) =>\n tool.name.toLowerCase().includes(normalizedQuery) ||\n (tool.category ?? '').toLowerCase().includes(normalizedQuery)\n )\n : tools,\n [tools, normalizedQuery]\n )\n\n const filteredAgentTools = useMemo(\n () => normalizedQuery\n ? agentTools.filter((agentTool) =>\n agentTool.name.toLowerCase().includes(normalizedQuery) ||\n (agentTool.category ?? '').toLowerCase().includes(normalizedQuery)\n )\n : agentTools,\n [agentTools, normalizedQuery]\n )\n\n const filteredRules = useMemo(\n () => normalizedQuery\n ? rules.filter((rule) =>\n rule.name.toLowerCase().includes(normalizedQuery)\n )\n : rules,\n [rules, normalizedQuery]\n )\n\n const filteredProviders = useMemo(\n () => normalizedQuery\n ? modelProviders.filter((provider) =>\n provider.name.toLowerCase().includes(normalizedQuery) ||\n provider.provider.toLowerCase().includes(normalizedQuery)\n )\n : modelProviders,\n [modelProviders, normalizedQuery]\n )\n\n const entityTypes = useMemo(\n () => entities.map((entity) => ({\n id: entity.id,\n label: entity.label,\n description: entity.description,\n fieldCount: entity.fields.length,\n defaultLimit: entity.defaultLimit,\n fields: entity.fields,\n })),\n [entities]\n )\n\n const filteredEntityTypes = useMemo(\n () => normalizedQuery\n ? entityTypes.filter((entity) =>\n entity.label.toLowerCase().includes(normalizedQuery) ||\n entity.description.toLowerCase().includes(normalizedQuery) ||\n entity.id.toLowerCase().includes(normalizedQuery)\n )\n : entityTypes,\n [entityTypes, normalizedQuery]\n )\n\n const filteredLogicItems = useMemo(() => {\n // Experimental nodes (stub executors like `knowledge_base`, `document_extractor`)\n // are always hidden from the palette — opt-in is per-node via the node's\n // config modal rather than via a global palette toggle. Source of truth:\n // EXPERIMENTAL_NODE_TYPES in workflow-constants.\n const visibleByDefault = LOGIC_NODE_ITEMS.filter((item) => !EXPERIMENTAL_NODE_TYPES.has(item.nodeType))\n if (!normalizedQuery) return visibleByDefault\n return visibleByDefault.filter((item) =>\n t(item.nameKey).toLowerCase().includes(normalizedQuery) ||\n t(item.descriptionKey).toLowerCase().includes(normalizedQuery),\n )\n }, [normalizedQuery, t])\n\n // Group filtered logic items by subcategory\n const groupedLogicItems = useMemo(() => {\n const groups: Record<string, LogicNodeItem[]> = {\n control_flow: [],\n data_processing: [],\n ai_ml: [],\n annotation: [],\n output: [],\n }\n for (const item of filteredLogicItems) {\n groups[item.subcategory].push(item)\n }\n return groups\n }, [filteredLogicItems])\n\n function renderLogicSubcategory(subcategory: string, items: LogicNodeItem[], isFirst: boolean) {\n if (items.length === 0) return null\n return (\n <div key={subcategory} className=\"space-y-1.5\">\n <p className={`${isFirst ? 'mt-1' : 'mt-2'} text-[9px] font-semibold uppercase tracking-wider text-gray-400 dark:text-gray-500`}>\n {t(SUBCATEGORY_LABELS[subcategory])}\n </p>\n {items.map((item) => (\n <LogicNodeItemCard key={item.nodeType} item={item} translationFunction={t} />\n ))}\n </div>\n )\n }\n\n return (\n <div className=\"liquid-surface w-[260px] flex-shrink-0 overflow-y-auto rounded-none border-0 border-r border-gray-200/30 dark:border-white/5\">\n <div className=\"p-4 pb-2\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {t('palette')}\n </h3>\n {/* Search input */}\n <div className=\"mt-2\">\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(event) => setSearchQuery(event.target.value)}\n placeholder={t('searchPalette')}\n className=\"liquid-surface w-full rounded-lg px-2.5 py-1.5 text-[11px] text-gray-900 placeholder-gray-400 outline-none transition-colors focus:ring-1 focus:ring-indigo-300/40 dark:text-white dark:placeholder-gray-500 dark:focus:ring-indigo-500/20\"\n />\n </div>\n </div>\n\n {/* Agents + Agent Tools Section (combined) */}\n <CollapsibleSection\n title={t('agentsSection')}\n icon={<CpuChipIcon className=\"h-3 w-3\" />}\n colorClass=\"text-indigo-600 dark:text-indigo-400\"\n onAdd={onCreateAgent}\n addLabel={t('newAgent')}\n count={filteredAgents.length}\n >\n {filteredAgents.length === 0 && filteredAgentTools.length === 0 && filteredProviders.length === 0 ? (\n <p className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('noAgents')}</p>\n ) : (\n <>\n {filteredAgents.map((agent) => (\n <div\n key={agent.agentId}\n draggable\n onDragStart={(event) =>\n onDragStart(event, 'agent', agent.agentId, agent.name)\n }\n className=\"liquid-surface group flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n >\n <div className=\"relative flex-shrink-0\">\n {agent.avatar ? (\n <img src={agent.avatar as string} alt={agent.name} className=\"h-7 w-7 rounded-full bg-white shadow-sm ring-1 ring-gray-200/50 dark:bg-gray-800 dark:ring-white/10\" />\n ) : (\n <div className=\"flex h-7 w-7 items-center justify-center rounded-full bg-gradient-to-br from-indigo-400 to-purple-500 shadow-sm\">\n <CpuChipIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n )}\n <div className=\"absolute -bottom-0.5 -right-0.5 flex h-3.5 w-3.5 items-center justify-center rounded-full bg-indigo-500 ring-1.5 ring-white dark:ring-gray-900\">\n <CpuChipIcon className=\"h-2 w-2 text-white\" />\n </div>\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1.5\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {agent.name}\n </p>\n {(() => {\n const tier = getAgentTier(Number((agent as Record<string, unknown>).elo ?? 0))\n return (\n <span className={`shrink-0 rounded-full px-1.5 py-px text-[8px] font-bold ${tier.pillColor}`}>\n {t(`agentDrawer.tier${tier.key.charAt(0).toUpperCase()}${tier.key.slice(1)}`)}\n </span>\n )\n })()}\n </div>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {agent.role ?? agent.agentId}\n </p>\n </div>\n </div>\n ))}\n\n {/* Model provider connections — folded into the Agents\n section because agents *consume* providers. Rendered\n as a sub-group with a thin divider + sub-label so they\n read as \"connections this agent group can use\". */}\n {filteredProviders.length > 0 && (\n <div className=\"mt-2 border-t border-gray-200/40 pt-2 dark:border-white/5\">\n <p className=\"mb-1.5 px-1 text-[9px] font-semibold uppercase tracking-wider text-slate-500 dark:text-slate-400\">\n {t('connectionsSection')}\n </p>\n {filteredProviders.map((provider) => {\n const providerLogo = PROVIDER_LOGOS[provider.provider]\n return (\n <div\n key={provider.id}\n draggable\n onDragStart={(event) => {\n const defaultConfig = JSON.stringify({\n type: 'model_provider',\n providerType: provider.provider === 'amazon' ? 'aws_bedrock' : provider.provider === 'google' ? 'google_vertex' : provider.provider === 'meta' ? 'custom' : `${provider.provider}_api`,\n name: provider.name,\n modelFilter: [],\n })\n onDragStart(event, 'model_provider', provider.id, provider.name, defaultConfig)\n }}\n onClick={() => onConfigureProvider?.(provider.id)}\n className=\"liquid-surface group mb-1 flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n role=\"button\"\n tabIndex={0}\n >\n {providerLogo ? (\n <div className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-md bg-white/10 p-1\">\n <img src={providerLogo} alt=\"\" className=\"h-4 w-4 object-contain\" loading=\"lazy\" />\n </div>\n ) : (\n <div className=\"flex h-6 w-6 items-center justify-center rounded-md bg-gradient-to-br from-rose-400 to-pink-500 shadow-sm\">\n <KeyIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {provider.name}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {provider.modelCount} models\n </p>\n </div>\n {provider.configured ? (\n <span className=\"rounded-full bg-green-100 px-1.5 py-0.5 text-[9px] font-medium text-green-600 dark:bg-green-500/10 dark:text-green-400\">\n {t('configured')}\n </span>\n ) : (\n <span className=\"rounded-full bg-amber-100 px-1.5 py-0.5 text-[9px] font-medium text-amber-600 dark:bg-amber-500/10 dark:text-amber-400\">\n {t('setup')}\n </span>\n )}\n </div>\n )\n })}\n </div>\n )}\n </>\n )}\n </CollapsibleSection>\n\n {/* Subworkflows Section (formerly Tools) */}\n <CollapsibleSection\n title={t('subworkflowsSection')}\n icon={<ArrowPathRoundedSquareIcon className=\"h-3 w-3\" />}\n colorClass=\"text-teal-600 dark:text-teal-400\"\n onAdd={onCreateTool}\n addLabel={t('newSubworkflow')}\n >\n {filteredTools.length === 0 ? (\n <p className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('noSubworkflows')}</p>\n ) : filteredTools.map((tool) => (\n <div\n key={tool.toolId}\n draggable\n onDragStart={(event) =>\n onDragStart(event, 'tool', tool.toolId, tool.name)\n }\n className=\"liquid-surface group flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n >\n <div className=\"flex h-6 w-6 items-center justify-center rounded-md bg-gradient-to-br from-teal-400 to-emerald-500 shadow-sm\">\n <ArrowPathRoundedSquareIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {tool.name}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {tool.category}\n </p>\n </div>\n <ToggleSwitch\n checked={Boolean(tool.enabled)}\n onChange={() => {}}\n disabled\n size=\"sm\"\n color=\"blue\"\n label={`${tool.name} enabled`}\n />\n </div>\n ))}\n </CollapsibleSection>\n\n {/* Rules Section */}\n <CollapsibleSection\n title={t('rulesSection')}\n icon={<AdjustmentsHorizontalIcon className=\"h-3 w-3\" />}\n colorClass=\"text-violet-600 dark:text-violet-400\"\n onAdd={onCreateRule}\n addLabel={t('newRule')}\n >\n {filteredRules.length === 0 ? (\n <p className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('noRules')}</p>\n ) : filteredRules.map((rule) => (\n <div\n key={rule.ruleId}\n draggable\n onDragStart={(event) =>\n onDragStart(event, 'rule', rule.ruleId, rule.name)\n }\n className=\"liquid-surface group flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n >\n <div className=\"flex h-6 w-6 items-center justify-center rounded-md bg-gradient-to-br from-violet-400 to-purple-500 shadow-sm\">\n <AdjustmentsHorizontalIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {rule.name}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n P{String(rule.priority ?? '')}\n </p>\n </div>\n <ToggleSwitch\n checked={Boolean(rule.enabled)}\n onChange={() => {}}\n disabled\n size=\"sm\"\n color=\"violet\"\n label={`${rule.name} enabled`}\n />\n </div>\n ))}\n </CollapsibleSection>\n\n {/* Data Sources Section */}\n <CollapsibleSection\n title={t('dataSourcesSection')}\n icon={<CircleStackIcon className=\"h-3 w-3\" />}\n colorClass=\"text-blue-600 dark:text-blue-400\"\n count={filteredEntityTypes.length}\n onAdd={onCreateDatasource}\n addLabel={t('newDataSource')}\n >\n {filteredEntityTypes.length === 0 ? (\n <p className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('noDataSources')}</p>\n ) : filteredEntityTypes.map((entity) => {\n const defaultConfig = JSON.stringify({\n type: 'entity',\n entityMasterId: entity.id,\n selectedFields: entity.fields.map((field) => field.name),\n filterVariables: {},\n outputVariable: `${entity.label.replace(/\\s+/g, '')}Data`,\n limit: entity.defaultLimit,\n })\n const dsLogo = getDatasourceLogo(entity.id)\n const EntityIcon = getEntityIcon(entity.id)\n const entityGradient = getEntityGradient(entity.id)\n\n return (\n <div\n key={entity.id}\n draggable\n onDragStart={(event) =>\n onDragStart(event, 'entity', entity.id, entity.label, defaultConfig)\n }\n className=\"liquid-surface group flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n >\n {dsLogo ? (\n <div className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-md bg-white/10 p-1\">\n <img src={dsLogo} alt=\"\" className=\"h-4 w-4 object-contain\" loading=\"lazy\" />\n </div>\n ) : (\n <div className={`flex h-6 w-6 items-center justify-center rounded-md bg-gradient-to-br ${entityGradient} shadow-sm`}>\n <EntityIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {entity.label}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {entity.fieldCount} {t('entityFieldsLabel')}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"rounded-full bg-slate-100 px-1.5 py-0.5 text-[9px] font-medium text-slate-600 dark:bg-white/10 dark:text-slate-300\">\n Read only\n </span>\n <ToggleSwitch\n checked\n onChange={() => {}}\n disabled\n size=\"sm\"\n color=\"teal\"\n label={`${entity.label} read only`}\n />\n </div>\n </div>\n )\n })}\n </CollapsibleSection>\n\n {/* Logic Section — with subcategories */}\n <CollapsibleSection\n title={t('logicSection')}\n icon={<BoltIcon className=\"h-3 w-3\" />}\n colorClass=\"text-gray-600 dark:text-gray-400\"\n count={filteredLogicItems.length}\n >\n {renderLogicSubcategory('control_flow', groupedLogicItems.control_flow, true)}\n {renderLogicSubcategory('data_processing', groupedLogicItems.data_processing, false)}\n {renderLogicSubcategory('ai_ml', groupedLogicItems.ai_ml, false)}\n {renderLogicSubcategory('output', groupedLogicItems.output, false)}\n {renderLogicSubcategory('annotation', groupedLogicItems.annotation, false)}\n </CollapsibleSection>\n </div>\n )\n}\n","/**\n * Workflow List Bar\n * =================\n *\n * Horizontal tab bar above the workflow canvas showing all workflows.\n * Allows switching active workflow, creating new ones, deleting,\n * and converting a workflow into a reusable subworkflow.\n */\n\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { PlusIcon, TrashIcon, ArrowPathRoundedSquareIcon } from '@heroicons/react/24/outline'\nimport type { Workflow } from '../../contracts'\n\ntype WorkflowListBarProps = {\n workflows: Workflow[]\n activeWorkflowId: string | null\n isLoading: boolean\n onSelect: (workflow: Workflow) => void\n onCreate: () => void\n onDelete: (workflowId: string, workflowName: string) => void\n onConvertToSubworkflow?: (workflow: Workflow) => void\n}\n\nfunction formatRelativeTime(dateString: string | undefined): string {\n if (!dateString) return ''\n const date = new Date(dateString)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffMinutes = Math.floor(diffMs / 60_000)\n const diffHours = Math.floor(diffMs / 3_600_000)\n const diffDays = Math.floor(diffMs / 86_400_000)\n\n if (diffMinutes < 1) return 'just now'\n if (diffMinutes < 60) return `${diffMinutes}m ago`\n if (diffHours < 24) return `${diffHours}h ago`\n return `${diffDays}d ago`\n}\n\nexport function WorkflowListBar({\n workflows,\n activeWorkflowId,\n isLoading,\n onSelect,\n onCreate,\n onDelete,\n onConvertToSubworkflow,\n}: WorkflowListBarProps) {\n const tWorkflow = useTranslations('agents.workflow')\n\n if (isLoading) {\n return (\n <div className=\"flex items-center gap-2 px-1 pb-3\">\n <div className=\"shimmer h-10 w-40 rounded-xl\" />\n <div className=\"shimmer h-10 w-40 rounded-xl\" />\n </div>\n )\n }\n\n return (\n <div className=\"flex items-center gap-2 overflow-x-auto px-1 pb-3 scrollbar-hide\">\n {workflows.map((workflow) => {\n const isActive = workflow.id === activeWorkflowId\n return (\n <div\n key={workflow.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => onSelect(workflow)}\n onKeyDown={(event) => { if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); onSelect(workflow) } }}\n className={`liquid-surface group relative flex shrink-0 cursor-pointer items-center gap-2.5 rounded-xl px-3.5 py-2 text-left transition-all duration-200 ${\n isActive\n ? 'liquid-surface-active'\n : 'hover:shadow-md'\n }`}\n style={isActive ? { '--glass-accent': '99, 102, 241' } as React.CSSProperties : undefined}\n >\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className={`truncate text-sm font-medium ${\n isActive\n ? 'text-indigo-700 dark:text-indigo-300'\n : 'text-gray-700 dark:text-gray-300'\n }`}>\n {workflow.name}\n </span>\n <span className=\"shrink-0 rounded-full bg-gray-100 px-1.5 py-0.5 text-[10px] font-medium text-gray-500 dark:bg-gray-800 dark:text-gray-400\">\n v{workflow.version}\n </span>\n {workflow.isDraft ? (\n <span className=\"shrink-0 rounded-full bg-amber-100 px-1.5 py-0.5 text-[10px] font-semibold text-amber-700 dark:bg-amber-900/30 dark:text-amber-300\">\n {tWorkflow('draftBadge')}\n </span>\n ) : (\n <span className=\"shrink-0 rounded-full bg-green-100 px-1.5 py-0.5 text-[10px] font-semibold text-green-700 dark:bg-green-900/30 dark:text-green-300\">\n {tWorkflow('published')}\n </span>\n )}\n </div>\n <p className=\"mt-0.5 text-[10px] text-gray-400 dark:text-gray-500\">\n {workflow.updatedAt ? formatRelativeTime(typeof workflow.updatedAt === 'string' ? workflow.updatedAt : workflow.updatedAt.toISOString()) : ''}\n </p>\n </div>\n\n {/* Action buttons — visible on hover */}\n <div className=\"flex shrink-0 items-center gap-0.5 opacity-0 transition-opacity group-hover:opacity-100\">\n {/* Convert to subworkflow */}\n {onConvertToSubworkflow && (\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation()\n onConvertToSubworkflow(workflow)\n }}\n className=\"rounded-md p-1 text-gray-400 transition-colors hover:bg-teal-50 hover:text-teal-600 dark:hover:bg-teal-950/30 dark:hover:text-teal-400\"\n aria-label={`${tWorkflow('convertToSubworkflow')} ${workflow.name}`}\n title={tWorkflow('convertToSubworkflow')}\n >\n <ArrowPathRoundedSquareIcon className=\"h-3.5 w-3.5\" />\n </button>\n )}\n\n {/* Delete */}\n {workflows.length > 1 && (\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation()\n onDelete(workflow.id, workflow.name)\n }}\n className=\"rounded-md p-1 text-gray-400 transition-colors hover:bg-red-50 hover:text-red-500 dark:hover:bg-red-950/30 dark:hover:text-red-400\"\n aria-label={`${tWorkflow('deleteWorkflow')} ${workflow.name}`}\n >\n <TrashIcon className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n </div>\n )\n })}\n\n {/* Create new workflow button */}\n <button\n type=\"button\"\n onClick={onCreate}\n className=\"liquid-surface flex shrink-0 items-center gap-1.5 rounded-xl !border-dashed px-3 py-2 text-xs font-medium text-gray-500 transition-all hover:shadow-md hover:text-indigo-600 dark:text-gray-400 dark:hover:text-indigo-400\"\n >\n <PlusIcon className=\"h-3.5 w-3.5\" />\n {tWorkflow('newWorkflow')}\n </button>\n </div>\n )\n}\n","/**\n * Version History Panel\n * =====================\n * Side panel listing published versions of a workflow.\n * Shows version number, publication timestamp, publisher,\n * and node/edge counts. Provides preview (read-only overlay)\n * and restore (revert draft) actions per version.\n */\n\nimport { useState, useEffect, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { ClockIcon, ArrowPathIcon, EyeIcon, XMarkIcon } from '@heroicons/react/24/outline'\nimport { Badge } from '@ui/components/badge'\n\ntype WorkflowVersion = {\n version: number\n publishedAt: string\n publishedBy: string\n nodeCount: number\n edgeCount: number\n}\n\ntype VersionHistoryPanelProps = {\n open: boolean\n onClose: () => void\n workflowId: string\n currentVersion: number\n onPreview: (version: WorkflowVersion) => void\n onRestore: (version: WorkflowVersion) => void\n fetchVersions?: (workflowId: string) => Promise<WorkflowVersion[]>\n}\n\nexport function VersionHistoryPanel({\n open,\n onClose,\n workflowId,\n currentVersion,\n onPreview,\n onRestore,\n fetchVersions,\n}: VersionHistoryPanelProps) {\n const translations = useTranslations('agents.workflow.versionHistory')\n const [versions, setVersions] = useState<WorkflowVersion[]>([])\n const [isLoading, setIsLoading] = useState(false)\n const [loadError, setLoadError] = useState<string | null>(null)\n\n const loadVersions = useCallback(async () => {\n if (!fetchVersions) return\n\n setIsLoading(true)\n setLoadError(null)\n\n try {\n const fetchedVersions = await fetchVersions(workflowId)\n setVersions(fetchedVersions)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to load versions'\n setLoadError(errorMessage)\n } finally {\n setIsLoading(false)\n }\n }, [fetchVersions, workflowId])\n\n useEffect(() => {\n if (open) {\n loadVersions()\n }\n }, [open, loadVersions])\n\n const formatTimestamp = useCallback((timestamp: string) => {\n try {\n const date = new Date(timestamp)\n return new Intl.DateTimeFormat(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n }).format(date)\n } catch {\n return timestamp\n }\n }, [])\n\n if (!open) return null\n\n return (\n <div\n className=\"absolute right-0 top-0 z-40 flex h-full w-80 flex-col border-l border-gray-200 bg-white shadow-xl dark:border-gray-700 dark:bg-gray-900\"\n data-testid=\"version-history-panel\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-gray-200 px-4 py-3 dark:border-gray-700\">\n <div className=\"flex items-center gap-2\">\n <ClockIcon className=\"h-5 w-5 text-gray-500 dark:text-gray-400\" />\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">\n {translations('title')}\n </h3>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg p-1 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-800 dark:hover:text-gray-300\"\n data-testid=\"version-history-close\"\n >\n <XMarkIcon className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* Version List */}\n <div className=\"flex-1 overflow-y-auto\">\n {isLoading && (\n <div className=\"flex items-center justify-center py-12\" data-testid=\"version-history-loading\">\n <div className=\"h-6 w-6 animate-spin motion-reduce:animate-none rounded-full border-2 border-blue-500 border-t-transparent\" />\n </div>\n )}\n\n {loadError && (\n <div className=\"px-4 py-8 text-center\" data-testid=\"version-history-error\">\n <p className=\"text-sm text-red-500 dark:text-red-400\">{loadError}</p>\n <button\n type=\"button\"\n onClick={loadVersions}\n className=\"mt-2 text-xs text-blue-600 hover:underline dark:text-blue-400\"\n >\n {translations('retry')}\n </button>\n </div>\n )}\n\n {!isLoading && !loadError && versions.length === 0 && (\n <div className=\"px-4 py-12 text-center\" data-testid=\"version-history-empty\">\n <ClockIcon className=\"mx-auto h-8 w-8 text-gray-300 dark:text-gray-600\" />\n <p className=\"mt-2 text-sm text-gray-500 dark:text-gray-400\">\n {translations('noVersions')}\n </p>\n </div>\n )}\n\n {!isLoading && !loadError && versions.length > 0 && (\n <div className=\"divide-y divide-gray-100 dark:divide-gray-800\">\n {versions.map((version) => {\n const isCurrentVersion = version.version === currentVersion\n return (\n <div\n key={version.version}\n className={`px-4 py-3 transition-colors ${\n isCurrentVersion\n ? 'bg-blue-50 dark:bg-blue-500/10'\n : 'hover:bg-gray-50 dark:hover:bg-gray-800/50'\n }`}\n data-testid={`version-entry-${version.version}`}\n >\n {/* Version Header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-gray-900 dark:text-white\">\n v{version.version}\n </span>\n {isCurrentVersion && (\n <Badge color=\"blue\" size=\"xs\">{translations('current')}</Badge>\n )}\n </div>\n </div>\n\n {/* Metadata */}\n <div className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">\n <div>{formatTimestamp(version.publishedAt)}</div>\n <div className=\"mt-0.5\">\n {translations('publishedBy')}: {version.publishedBy}\n </div>\n <div className=\"mt-0.5\">\n {version.nodeCount} {translations('nodes')} / {version.edgeCount} {translations('edges')}\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"mt-2 flex gap-2\">\n <button\n type=\"button\"\n onClick={() => onPreview(version)}\n className=\"inline-flex items-center gap-1 rounded-md border border-gray-300 px-2 py-1 text-xs font-medium text-gray-600 transition-colors hover:bg-gray-100 dark:border-gray-600 dark:text-gray-400 dark:hover:bg-gray-700\"\n data-testid={`version-preview-${version.version}`}\n >\n <EyeIcon className=\"h-3 w-3\" />\n {translations('preview')}\n </button>\n {!isCurrentVersion && (\n <button\n type=\"button\"\n onClick={() => onRestore(version)}\n className=\"inline-flex items-center gap-1 rounded-md border border-blue-300 px-2 py-1 text-xs font-medium text-blue-600 transition-colors hover:bg-blue-50 dark:border-blue-600 dark:text-blue-400 dark:hover:bg-blue-500/10\"\n data-testid={`version-restore-${version.version}`}\n >\n <ArrowPathIcon className=\"h-3 w-3\" />\n {translations('restore')}\n </button>\n )}\n </div>\n </div>\n )\n })}\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport type { WorkflowVersion }\n","/**\n * Run Panel\n * =========\n * Bottom panel showing workflow execution progress.\n * Displays each node with a status icon (pending, running,\n * success, error), duration, and error messages.\n * Provides Run/Stop controls tied to the workflow store.\n */\n\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n PlayIcon,\n StopIcon,\n CheckCircleIcon,\n XCircleIcon,\n ClockIcon,\n XMarkIcon,\n ChevronUpIcon,\n} from '@heroicons/react/24/outline'\nimport { useWorkflowStore } from '../../store/workflow-store'\nimport type { StartNodeConfig } from '../../contracts'\n\ntype RunPanelProps = {\n open: boolean\n onClose: () => void\n onRun: () => void\n onStop: () => void\n}\n\nconst STATUS_CONFIG = {\n pending: {\n icon: ClockIcon,\n color: 'text-gray-400 dark:text-gray-500',\n background: 'bg-gray-100 dark:bg-gray-800',\n label: 'pending',\n },\n running: {\n icon: SpinnerIcon,\n color: 'text-blue-500 dark:text-blue-400',\n background: 'bg-blue-50 dark:bg-blue-500/10',\n label: 'running',\n },\n success: {\n icon: CheckCircleIcon,\n color: 'text-green-500 dark:text-green-400',\n background: 'bg-green-50 dark:bg-green-500/10',\n label: 'success',\n },\n error: {\n icon: XCircleIcon,\n color: 'text-red-500 dark:text-red-400',\n background: 'bg-red-50 dark:bg-red-500/10',\n label: 'error',\n },\n} as const\n\nfunction formatDuration(durationMs: number): string {\n if (durationMs < 1000) {\n return `${durationMs}ms`\n }\n const seconds = (durationMs / 1000).toFixed(1)\n return `${seconds}s`\n}\n\nexport function RunPanel({ open, onClose, onRun, onStop }: RunPanelProps) {\n const translations = useTranslations('agents.workflow.runPanel')\n const nodes = useWorkflowStore((state) => state.nodes)\n const isRunning = useWorkflowStore((state) => state.isRunning)\n const nodeResults = useWorkflowStore((state) => state.nodeResults)\n const startNode = nodes.find((node) => node.type === 'start')\n const hasEndNode = nodes.some((node) => node.type === 'end')\n const hasValidStartConfig = Boolean(\n startNode &&\n typeof startNode.data === 'object' &&\n startNode.data !== null &&\n 'config' in startNode.data &&\n startNode.data.config &&\n typeof (startNode.data.config as StartNodeConfig).type === 'string'\n )\n const canRun = hasValidStartConfig && hasEndNode\n\n if (!open) return null\n\n const executionNodes = nodes.filter((node) => node.type !== 'note')\n\n return (\n <div\n className=\"absolute bottom-0 left-0 right-0 z-40 border-t border-gray-200 bg-white shadow-xl dark:border-gray-700 dark:bg-gray-900\"\n data-testid=\"run-panel\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-gray-100 px-4 py-2 dark:border-gray-800\">\n <div className=\"flex items-center gap-2\">\n <PlayIcon className=\"h-4 w-4 text-gray-500 dark:text-gray-400\" />\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">\n {translations('title')}\n </h3>\n {isRunning && (\n <span\n role=\"status\"\n aria-live=\"polite\"\n className=\"flex items-center gap-1 rounded-full bg-blue-100 px-2 py-0.5 text-[11px] font-medium text-blue-800 dark:bg-blue-500/20 dark:text-blue-200\"\n >\n <span\n aria-hidden=\"true\"\n className=\"h-1.5 w-1.5 motion-safe:animate-pulse rounded-full bg-blue-500\"\n />\n {translations('executing')}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {/* Run / Stop Buttons */}\n {isRunning ? (\n <button\n type=\"button\"\n onClick={onStop}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-red-500 px-3 py-1.5 text-xs font-medium text-white transition-colors hover:bg-red-600\"\n data-testid=\"run-panel-stop\"\n >\n <StopIcon className=\"h-3.5 w-3.5\" />\n {translations('stop')}\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={onRun}\n disabled={!canRun}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-green-500 px-3 py-1.5 text-xs font-medium text-white transition-colors hover:bg-green-600 disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:bg-green-500\"\n data-testid=\"run-panel-run\"\n >\n <PlayIcon className=\"h-3.5 w-3.5\" />\n {translations('run')}\n </button>\n )}\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg p-1 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-800 dark:hover:text-gray-300\"\n data-testid=\"run-panel-close\"\n >\n <XMarkIcon className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n\n {/* Node Execution List */}\n <div className=\"max-h-48 overflow-y-auto px-4 py-2\">\n {executionNodes.length === 0 ? (\n <div className=\"py-4 text-center text-sm text-gray-500 dark:text-gray-400\">\n {translations('noNodes')}\n </div>\n ) : (\n <div className=\"space-y-1\">\n {executionNodes.map((node) => {\n const result = nodeResults[node.id]\n const status = result?.status ?? 'pending'\n const statusConfig = STATUS_CONFIG[status]\n const StatusIconComponent = statusConfig.icon\n const nodeLabel =\n typeof node.data === 'object' && node.data !== null && 'label' in node.data\n ? String(node.data.label)\n : node.id\n\n return (\n <div\n key={node.id}\n className={`flex items-center gap-3 rounded-lg px-3 py-2 ${statusConfig.background}`}\n data-testid={`run-node-${node.id}`}\n >\n {/* Status Icon */}\n <StatusIconComponent className={`h-4 w-4 flex-shrink-0 ${statusConfig.color}`} />\n\n {/* Node Info */}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm font-medium text-gray-900 dark:text-white\">\n {nodeLabel}\n </span>\n <span className=\"rounded bg-gray-200 px-1.5 py-0.5 text-[10px] text-gray-500 dark:bg-gray-700 dark:text-gray-400\">\n {node.type}\n </span>\n </div>\n {result?.error && (\n <p className=\"mt-0.5 truncate text-xs text-red-500 dark:text-red-400\">\n {result.error}\n </p>\n )}\n </div>\n\n {/* Duration */}\n {result?.durationMs !== undefined && (\n <span className=\"flex-shrink-0 text-xs text-gray-500 dark:text-gray-400\">\n {formatDuration(result.durationMs)}\n </span>\n )}\n </div>\n )\n })}\n </div>\n )}\n </div>\n </div>\n )\n}\n\n/**\n * Inline spinner icon for running status (animated).\n */\nfunction SpinnerIcon({ className }: { className?: string }) {\n return (\n <svg\n className={`animate-spin motion-reduce:animate-none ${className ?? ''}`}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeOpacity={0.25} />\n <path d=\"M12 2a10 10 0 0 1 10 10\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n","/**\n * Variable Inspector\n * ==================\n * Side panel that analyzes variable flow through the workflow graph.\n * Walks nodes in topological order and infers input/output variables\n * from each node's config type. Shows a collapsible tree view per node.\n */\n\nimport { useMemo, useState, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { VariableIcon, XMarkIcon, ChevronRightIcon, ChevronDownIcon } from '@heroicons/react/24/outline'\nimport { useWorkflowStore } from '../../store/workflow-store'\nimport { LOGIC_ICON_MAP, LOGIC_NODE_GRADIENTS } from '../../constants/workflow-constants'\nimport type { LogicNodeConfig } from '../../contracts'\nimport type { Node } from '@xyflow/react'\n\ntype VariableInspectorProps = {\n open: boolean\n onClose: () => void\n}\n\ntype VariableInfo = {\n name: string\n direction: 'input' | 'output'\n variableType: string\n}\n\ntype NodeVariableEntry = {\n nodeId: string\n nodeLabel: string\n nodeType: string\n variables: VariableInfo[]\n}\n\n/**\n * Performs a topological sort on the node graph using Kahn's algorithm.\n * Returns node IDs in execution order.\n */\nfunction topologicalSort(\n nodes: Node[],\n edges: Array<{ source: string; target: string }>,\n): string[] {\n const adjacencyList = new Map<string, string[]>()\n const inDegree = new Map<string, number>()\n\n for (const node of nodes) {\n adjacencyList.set(node.id, [])\n inDegree.set(node.id, 0)\n }\n\n for (const edge of edges) {\n const neighbors = adjacencyList.get(edge.source)\n if (neighbors) {\n neighbors.push(edge.target)\n }\n inDegree.set(edge.target, (inDegree.get(edge.target) ?? 0) + 1)\n }\n\n const queue: string[] = []\n for (const [nodeId, degree] of inDegree.entries()) {\n if (degree === 0) {\n queue.push(nodeId)\n }\n }\n\n const sorted: string[] = []\n while (queue.length > 0) {\n const currentNodeId = queue.shift()!\n sorted.push(currentNodeId)\n\n const neighbors = adjacencyList.get(currentNodeId) ?? []\n for (const neighborId of neighbors) {\n const updatedDegree = (inDegree.get(neighborId) ?? 1) - 1\n inDegree.set(neighborId, updatedDegree)\n if (updatedDegree === 0) {\n queue.push(neighborId)\n }\n }\n }\n\n // Add any remaining nodes (disconnected) at the end\n for (const node of nodes) {\n if (!sorted.includes(node.id)) {\n sorted.push(node.id)\n }\n }\n\n return sorted\n}\n\n/**\n * Infers input and output variables from a node's config.\n */\nfunction inferVariables(config: LogicNodeConfig | undefined, nodeType: string): VariableInfo[] {\n if (!config) {\n return []\n }\n\n const variables: VariableInfo[] = []\n\n switch (config.type) {\n case 'start':\n for (const variableName of config.inputVariables) {\n if (variableName) {\n variables.push({ name: variableName, direction: 'output', variableType: 'any' })\n }\n }\n break\n\n case 'end':\n for (const variableName of config.outputVariables) {\n if (variableName) {\n variables.push({ name: variableName, direction: 'input', variableType: 'any' })\n }\n }\n break\n\n case 'code':\n // `code` can be the scripted `{language, code}` shape or the\n // engine's JSON-only `{operation, ...}` mini-language. Tag the\n // input with whichever mode the author picked.\n {\n const kind = 'language' in config ? config.language : config.operation\n variables.push({ name: 'code_input', direction: 'input', variableType: kind })\n variables.push({ name: 'code_output', direction: 'output', variableType: 'any' })\n }\n break\n\n case 'http_request':\n variables.push({ name: 'url', direction: 'input', variableType: 'string' })\n variables.push({ name: 'response', direction: 'output', variableType: 'object' })\n if (config.body) {\n variables.push({ name: 'body', direction: 'input', variableType: 'string' })\n }\n break\n\n case 'audio_input':\n variables.push({ name: 'url', direction: 'input', variableType: 'string' })\n variables.push({ name: 'url', direction: 'output', variableType: 'string' })\n variables.push({ name: 'format', direction: 'output', variableType: 'string' })\n variables.push({ name: 'sourceType', direction: 'output', variableType: 'string' })\n break\n\n case 'speech_transcriber':\n variables.push({ name: 'audioUrl', direction: 'input', variableType: 'string' })\n variables.push({ name: 'text', direction: 'output', variableType: 'string' })\n variables.push({ name: 'language', direction: 'output', variableType: 'string' })\n variables.push({ name: 'durationMs', direction: 'output', variableType: 'number' })\n variables.push({ name: 'segments', direction: 'output', variableType: 'array' })\n variables.push({ name: 'model', direction: 'output', variableType: 'string' })\n variables.push({ name: 'provider', direction: 'output', variableType: 'string' })\n break\n\n case 's3_write':\n variables.push({ name: 'key', direction: 'input', variableType: 'string' })\n if (config.sourceUrl) {\n variables.push({ name: 'sourceUrl', direction: 'input', variableType: 'string' })\n }\n if (config.body) {\n variables.push({ name: 'body', direction: 'input', variableType: 'string' })\n }\n variables.push({ name: 'bucket', direction: 'output', variableType: 'string' })\n variables.push({ name: 'key', direction: 'output', variableType: 'string' })\n variables.push({ name: 'size', direction: 'output', variableType: 'number' })\n variables.push({ name: 'etag', direction: 'output', variableType: 'string' })\n variables.push({ name: 'contentType', direction: 'output', variableType: 'string' })\n break\n\n case 'template_transform':\n variables.push({ name: 'template', direction: 'input', variableType: 'string' })\n if (config.outputVariable) {\n variables.push({ name: config.outputVariable, direction: 'output', variableType: 'string' })\n }\n break\n\n case 'if_else':\n for (const condition of config.conditions) {\n if (condition.variable) {\n variables.push({ name: condition.variable, direction: 'input', variableType: 'any' })\n }\n }\n variables.push({ name: 'true_branch', direction: 'output', variableType: 'boolean' })\n variables.push({ name: 'false_branch', direction: 'output', variableType: 'boolean' })\n break\n\n case 'iteration':\n if (config.iteratorVariable) {\n variables.push({ name: config.iteratorVariable, direction: 'input', variableType: 'array' })\n }\n variables.push({ name: 'iteration_item', direction: 'output', variableType: 'any' })\n variables.push({ name: 'iteration_index', direction: 'output', variableType: 'number' })\n break\n\n case 'iteration_start':\n if (config.iteratorVariable) {\n variables.push({ name: config.iteratorVariable, direction: 'input', variableType: 'array' })\n }\n if (config.itemVariable) {\n variables.push({ name: config.itemVariable, direction: 'output', variableType: 'any' })\n }\n if (config.indexVariable) {\n variables.push({ name: config.indexVariable, direction: 'output', variableType: 'number' })\n }\n break\n\n case 'knowledge_base':\n variables.push({ name: 'query', direction: 'input', variableType: 'string' })\n variables.push({ name: 'results', direction: 'output', variableType: 'array' })\n break\n\n case 'answer':\n for (const variableName of config.outputVariables) {\n if (variableName) {\n variables.push({ name: variableName, direction: 'output', variableType: 'any' })\n }\n }\n if (config.outputTemplate) {\n variables.push({ name: 'answer_template', direction: 'input', variableType: 'string' })\n }\n break\n\n case 'question_classifier':\n variables.push({ name: 'question', direction: 'input', variableType: 'string' })\n for (const category of config.categories) {\n if (category.name) {\n variables.push({ name: `category_${category.name}`, direction: 'output', variableType: 'string' })\n }\n }\n break\n\n case 'parameter_extractor':\n variables.push({ name: 'input_text', direction: 'input', variableType: 'string' })\n for (const parameter of config.parameters) {\n if (parameter.name) {\n variables.push({ name: parameter.name, direction: 'output', variableType: parameter.type })\n }\n }\n break\n\n case 'variable_assigner':\n for (const assignment of config.assignments) {\n if (assignment.source) {\n variables.push({ name: assignment.source, direction: 'input', variableType: 'any' })\n }\n if (assignment.target) {\n variables.push({ name: assignment.target, direction: 'output', variableType: 'any' })\n }\n }\n break\n\n case 'variable_aggregator':\n for (const variableName of config.inputVariables) {\n if (variableName) {\n variables.push({ name: variableName, direction: 'input', variableType: 'any' })\n }\n }\n if (config.outputVariable) {\n variables.push({ name: config.outputVariable, direction: 'output', variableType: config.aggregationMode })\n }\n break\n\n case 'document_extractor':\n variables.push({ name: 'document', direction: 'input', variableType: 'file' })\n if (config.outputVariable) {\n variables.push({ name: config.outputVariable, direction: 'output', variableType: config.extractionMode })\n }\n break\n\n case 'list_operator':\n if (config.inputVariable) {\n variables.push({ name: config.inputVariable, direction: 'input', variableType: 'array' })\n }\n if (config.outputVariable) {\n variables.push({ name: config.outputVariable, direction: 'output', variableType: 'array' })\n }\n if (config.condition) {\n variables.push({ name: 'condition', direction: 'input', variableType: 'string' })\n }\n break\n\n case 'note':\n // Notes have no variables\n break\n }\n\n return variables\n}\n\nexport function VariableInspector({ open, onClose }: VariableInspectorProps) {\n const translations = useTranslations('agents.workflow.variableInspector')\n const nodes = useWorkflowStore((state) => state.nodes)\n const edges = useWorkflowStore((state) => state.edges)\n\n const [expandedNodes, setExpandedNodes] = useState<Set<string>>(new Set())\n\n const toggleNodeExpansion = useCallback((nodeId: string) => {\n setExpandedNodes((current) => {\n const updated = new Set(current)\n if (updated.has(nodeId)) {\n updated.delete(nodeId)\n } else {\n updated.add(nodeId)\n }\n return updated\n })\n }, [])\n\n const nodeVariableEntries: NodeVariableEntry[] = useMemo(() => {\n // Filter out note nodes\n const relevantNodes = nodes.filter((node) => node.type !== 'note')\n\n // Get topological order\n const sortedNodeIds = topologicalSort(relevantNodes, edges)\n\n // Build entries\n const entries: NodeVariableEntry[] = []\n\n for (const nodeId of sortedNodeIds) {\n const node = relevantNodes.find((candidateNode) => candidateNode.id === nodeId)\n if (!node) continue\n\n const nodeData = node.data as Record<string, unknown> | undefined\n const config = nodeData?.config as LogicNodeConfig | undefined\n const label = (nodeData?.label as string) ?? node.id\n const nodeType = (node.type as string) ?? 'unknown'\n\n const variables = inferVariables(config, nodeType)\n\n entries.push({\n nodeId: node.id,\n nodeLabel: label,\n nodeType,\n variables,\n })\n }\n\n return entries\n }, [nodes, edges])\n\n if (!open) return null\n\n return (\n <div\n className=\"absolute right-0 top-0 z-40 flex h-full w-80 flex-col border-l border-gray-200 bg-white shadow-xl dark:border-gray-700 dark:bg-gray-900\"\n data-testid=\"variable-inspector\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-gray-200 px-4 py-3 dark:border-gray-700\">\n <div className=\"flex items-center gap-2\">\n <VariableIcon className=\"h-5 w-5 text-gray-500 dark:text-gray-400\" />\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">\n {translations('title')}\n </h3>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg p-1 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-800 dark:hover:text-gray-300\"\n data-testid=\"variable-inspector-close\"\n >\n <XMarkIcon className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* Variable Tree */}\n <div className=\"flex-1 overflow-y-auto\">\n {nodeVariableEntries.length === 0 ? (\n <div className=\"px-4 py-12 text-center\" data-testid=\"variable-inspector-empty\">\n <VariableIcon className=\"mx-auto h-8 w-8 text-gray-300 dark:text-gray-600\" />\n <p className=\"mt-2 text-sm text-gray-500 dark:text-gray-400\">\n {translations('noNodes')}\n </p>\n </div>\n ) : (\n <div className=\"divide-y divide-gray-100 dark:divide-gray-800\">\n {nodeVariableEntries.map((entry) => {\n const isExpanded = expandedNodes.has(entry.nodeId)\n const IconComponent = LOGIC_ICON_MAP[entry.nodeType]\n const gradient = LOGIC_NODE_GRADIENTS[entry.nodeType] ?? 'from-gray-400 to-gray-500'\n const inputVariables = entry.variables.filter((variable) => variable.direction === 'input')\n const outputVariables = entry.variables.filter((variable) => variable.direction === 'output')\n\n return (\n <div key={entry.nodeId} data-testid={`variable-node-${entry.nodeId}`}>\n {/* Node Header (collapsible) */}\n <button\n type=\"button\"\n onClick={() => toggleNodeExpansion(entry.nodeId)}\n className=\"flex w-full items-center gap-2 px-4 py-2.5 text-left transition-colors hover:bg-gray-50 dark:hover:bg-gray-800/50\"\n >\n {isExpanded ? (\n <ChevronDownIcon className=\"h-3.5 w-3.5 flex-shrink-0 text-gray-400\" />\n ) : (\n <ChevronRightIcon className=\"h-3.5 w-3.5 flex-shrink-0 text-gray-400\" />\n )}\n <div className={`flex h-5 w-5 flex-shrink-0 items-center justify-center rounded bg-gradient-to-br ${gradient}`}>\n {IconComponent && <IconComponent className=\"h-3 w-3 text-white\" />}\n </div>\n <span className=\"truncate text-sm font-medium text-gray-900 dark:text-white\">\n {entry.nodeLabel}\n </span>\n <span className=\"ml-auto flex-shrink-0 text-[10px] text-gray-400 dark:text-gray-500\">\n {entry.variables.length} {translations('variables')}\n </span>\n </button>\n\n {/* Expanded Variable List */}\n {isExpanded && (\n <div className=\"bg-gray-50/50 px-4 pb-2 dark:bg-gray-800/30\">\n {entry.variables.length === 0 ? (\n <p className=\"py-2 pl-9 text-xs italic text-gray-400 dark:text-gray-500\">\n {translations('noVariables')}\n </p>\n ) : (\n <>\n {/* Input Variables */}\n {inputVariables.length > 0 && (\n <div className=\"pl-9 pt-1\">\n <div className=\"mb-1 text-[10px] font-medium uppercase tracking-wider text-gray-400 dark:text-gray-500\">\n {translations('inputs')}\n </div>\n {inputVariables.map((variable, index) => (\n <div\n key={`${variable.name}-${index}`}\n className=\"flex items-center gap-2 py-0.5\"\n >\n <span className=\"h-1.5 w-1.5 rounded-full bg-blue-400\" />\n <span className=\"text-xs text-gray-700 dark:text-gray-300\">\n {variable.name}\n </span>\n <span className=\"rounded bg-gray-200 px-1 py-0.5 text-[9px] text-gray-500 dark:bg-gray-700 dark:text-gray-400\">\n {variable.variableType}\n </span>\n </div>\n ))}\n </div>\n )}\n\n {/* Output Variables */}\n {outputVariables.length > 0 && (\n <div className=\"pl-9 pt-1\">\n <div className=\"mb-1 text-[10px] font-medium uppercase tracking-wider text-gray-400 dark:text-gray-500\">\n {translations('outputs')}\n </div>\n {outputVariables.map((variable, index) => (\n <div\n key={`${variable.name}-${index}`}\n className=\"flex items-center gap-2 py-0.5\"\n >\n <span className=\"h-1.5 w-1.5 rounded-full bg-green-400\" />\n <span className=\"text-xs text-gray-700 dark:text-gray-300\">\n {variable.name}\n </span>\n <span className=\"rounded bg-gray-200 px-1 py-0.5 text-[9px] text-gray-500 dark:bg-gray-700 dark:text-gray-400\">\n {variable.variableType}\n </span>\n </div>\n ))}\n </div>\n )}\n </>\n )}\n </div>\n )}\n </div>\n )\n })}\n </div>\n )}\n </div>\n </div>\n )\n}\n","import { useState, useCallback, useMemo } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { PlayIcon } from '@heroicons/react/24/outline'\nimport { Button, GlassModal, Input } from '@ui/index'\nimport { useWorkflowStore } from '../../store/workflow-store'\nimport type { StartNodeConfig } from '../../contracts'\n\ntype VariableValue = string | number | boolean | null\n\nexport type RunInputDialogProps = {\n open: boolean\n onClose: () => void\n onRun: (inputVariables: Record<string, VariableValue>) => void\n}\n\nexport function RunInputDialog({\n open,\n onClose,\n onRun,\n}: RunInputDialogProps) {\n const t = useTranslations('agents.workflow.runInputDialog')\n const nodes = useWorkflowStore((state) => state.nodes)\n const [values, setValues] = useState<Record<string, string>>({})\n\n const inputVariableNames = useMemo(() => {\n const storeStartNode = nodes.find((node) => node.type === 'start')\n if (!storeStartNode || typeof storeStartNode.data !== 'object' || storeStartNode.data === null) return []\n if (!('config' in storeStartNode.data) || !storeStartNode.data.config) return []\n const startConfig = storeStartNode.data.config as StartNodeConfig\n return startConfig.inputVariables ?? []\n }, [nodes])\n\n const handleValueChange = useCallback((variableName: string, variableValue: string) => {\n setValues((previous) => ({ ...previous, [variableName]: variableValue }))\n }, [])\n\n const handleSubmit = useCallback(() => {\n const inputVariables: Record<string, VariableValue> = {}\n for (const variableName of inputVariableNames) {\n inputVariables[variableName] = values[variableName] ?? ''\n }\n onRun(inputVariables)\n onClose()\n setValues({})\n }, [inputVariableNames, values, onRun, onClose])\n\n const handleClose = useCallback(() => {\n onClose()\n setValues({})\n }, [onClose])\n\n if (!open) return null\n\n return (\n <GlassModal\n open={open}\n onClose={handleClose}\n title={t('title')}\n subtitle={t('subtitle')}\n maxWidth=\"md\"\n >\n <div className=\"space-y-3\">\n {inputVariableNames.length === 0 ? (\n <p className=\"text-center text-sm text-gray-500 dark:text-gray-400\">{t('noInputs')}</p>\n ) : (\n inputVariableNames.map((variableName) => (\n <div key={variableName}>\n <label className=\"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300\">{variableName}</label>\n <Input\n value={values[variableName] ?? ''}\n onChange={(event) => handleValueChange(variableName, event.target.value)}\n placeholder={`${t('variableValue')}...`}\n />\n </div>\n ))\n )}\n </div>\n <div className=\"mt-4 flex items-center justify-end gap-2\">\n <Button size=\"sm\" plain onClick={handleClose}>{t('cancel')}</Button>\n <Button size=\"sm\" gradient onClick={handleSubmit}>\n <PlayIcon className=\"h-3.5 w-3.5\" data-slot=\"icon\" />\n {t('run')}\n </Button>\n </div>\n </GlassModal>\n )\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n XMarkIcon,\n ClockIcon,\n CheckCircleIcon,\n ExclamationCircleIcon,\n ArrowPathIcon,\n} from '@heroicons/react/24/outline'\nimport { useWorkflowStore } from '../../store/workflow-store'\nimport type { NodeExecutionResult, WorkflowRun } from '../../contracts'\n\nexport type PreviewPanelProps = {\n open: boolean\n onClose: () => void\n workflowId: string\n loadRuns: (workflowId: string) => Promise<WorkflowRun[]>\n}\n\nconst STATUS_STYLES: Record<string, { icon: typeof CheckCircleIcon; colorClass: string }> = {\n completed: { icon: CheckCircleIcon, colorClass: 'text-green-500' },\n failed: { icon: ExclamationCircleIcon, colorClass: 'text-red-500' },\n running: { icon: ArrowPathIcon, colorClass: 'text-blue-500 animate-spin motion-reduce:animate-none' },\n pending: { icon: ClockIcon, colorClass: 'text-gray-400' },\n success: { icon: CheckCircleIcon, colorClass: 'text-green-500' },\n error: { icon: ExclamationCircleIcon, colorClass: 'text-red-500' },\n skipped: { icon: ClockIcon, colorClass: 'text-gray-400' },\n}\n\nfunction formatDuration(durationMs: number | null): string {\n if (durationMs === null) return '—'\n if (durationMs < 1000) return `${durationMs}ms`\n return `${(durationMs / 1000).toFixed(1)}s`\n}\n\nfunction formatTimestamp(timestamp: string): string {\n const date = new Date(timestamp)\n return date.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit' })\n}\n\nexport function PreviewPanel({ open, onClose, workflowId, loadRuns }: PreviewPanelProps) {\n const t = useTranslations('agents.workflow.previewPanel')\n const [runs, setRuns] = useState<WorkflowRun[]>([])\n const [isLoadingRuns, setIsLoadingRuns] = useState(false)\n const [selectedRun, setSelectedRun] = useState<WorkflowRun | null>(null)\n const [selectedNode, setSelectedNode] = useState<NodeExecutionResult | null>(null)\n\n const isRunning = useWorkflowStore((state) => state.isRunning)\n const nodeResults = useWorkflowStore((state) => state.nodeResults)\n\n const refreshRuns = useCallback(async () => {\n setIsLoadingRuns(true)\n try {\n const workflowRuns = await loadRuns(workflowId)\n setRuns(workflowRuns)\n } finally {\n setIsLoadingRuns(false)\n }\n }, [loadRuns, workflowId])\n\n useEffect(() => {\n if (open) void refreshRuns()\n }, [open, refreshRuns])\n\n useEffect(() => {\n if (!isRunning && open) void refreshRuns()\n }, [isRunning, open, refreshRuns])\n\n if (!open) return null\n\n return (\n <>\n <div className=\"fixed inset-x-0 top-[120px] bottom-0 z-40 bg-black/10 backdrop-blur-[1px]\" onClick={onClose} />\n <div className=\"fixed right-0 top-[120px] bottom-0 z-50 w-96 overflow-hidden border-l border-white/20 bg-white/95 shadow-2xl backdrop-blur-xl dark:border-gray-700/50 dark:bg-gray-800/95\">\n <div className=\"flex items-center justify-between border-b border-gray-200/50 px-4 py-3 dark:border-gray-700/50\">\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">{t('title')}</h3>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg p-1 text-gray-400 hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-700 dark:hover:text-gray-300\"\n >\n <XMarkIcon className=\"h-4 w-4\" />\n </button>\n </div>\n\n <div className=\"flex h-full flex-col overflow-hidden\">\n {isRunning && (\n <div className=\"border-b border-gray-200/50 px-4 py-3 dark:border-gray-700/50\">\n <div className=\"mb-2 flex items-center gap-2\">\n <ArrowPathIcon className=\"h-4 w-4 animate-spin motion-reduce:animate-none text-blue-500\" />\n <span className=\"text-xs font-semibold text-blue-600 dark:text-blue-400\">{t('activeRun')}</span>\n </div>\n <div className=\"max-h-60 space-y-1 overflow-y-auto\">\n {Object.entries(nodeResults).map(([nodeId, result]) => {\n const statusStyle = STATUS_STYLES[result.status] ?? STATUS_STYLES.pending\n const StatusIcon = statusStyle.icon\n return (\n <div key={nodeId} className=\"flex items-center justify-between rounded-lg px-2 py-1.5 text-xs hover:bg-gray-50 dark:hover:bg-gray-700/50\">\n <div className=\"flex items-center gap-2\">\n <StatusIcon className={`h-3.5 w-3.5 ${statusStyle.colorClass}`} />\n <span className=\"truncate text-gray-700 dark:text-gray-300\">{nodeId.slice(0, 8)}</span>\n </div>\n {result.durationMs !== undefined && <span className=\"text-gray-400\">{formatDuration(result.durationMs)}</span>}\n </div>\n )\n })}\n </div>\n </div>\n )}\n\n {selectedNode && (\n <div className=\"border-b border-gray-200/50 px-4 py-3 dark:border-gray-700/50\">\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-xs font-semibold text-gray-900 dark:text-white\">{t('nodeDetail')}</span>\n <button type=\"button\" onClick={() => setSelectedNode(null)} className=\"text-[10px] text-gray-400 hover:text-gray-600 dark:hover:text-gray-300\">\n {t('close')}\n </button>\n </div>\n <div className=\"space-y-2 text-xs\">\n <div className=\"flex justify-between\">\n <span className=\"text-gray-500\">{t('status')}</span>\n <span className={STATUS_STYLES[selectedNode.status]?.colorClass ?? 'text-gray-400'}>\n {t(selectedNode.status as 'completed' | 'failed' | 'running' | 'pending' | 'skipped' | 'success' | 'error')}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-gray-500\">{t('duration')}</span>\n <span className=\"text-gray-700 dark:text-gray-300\">{formatDuration(selectedNode.durationMs)}</span>\n </div>\n {selectedNode.error && (\n <div>\n <span className=\"text-red-500\">{t('error')}</span>\n <pre className=\"mt-1 max-h-20 overflow-auto whitespace-pre-wrap rounded bg-red-50 p-2 text-[10px] text-red-700 dark:bg-red-900/20 dark:text-red-300\">{selectedNode.error}</pre>\n </div>\n )}\n {Object.keys(selectedNode.outputs).length > 0 && (\n <div>\n <span className=\"text-gray-500\">{t('outputs')}</span>\n <pre className=\"mt-1 max-h-32 overflow-auto whitespace-pre-wrap rounded bg-gray-50 p-2 text-[10px] text-gray-700 dark:bg-gray-700/50 dark:text-gray-300\">\n {JSON.stringify(selectedNode.outputs, null, 2)}\n </pre>\n </div>\n )}\n </div>\n </div>\n )}\n\n <div className=\"flex-1 overflow-y-auto px-4 py-3\">\n <h4 className=\"mb-2 text-xs font-semibold text-gray-500 dark:text-gray-400\">{t('runHistory')}</h4>\n\n {isLoadingRuns && (\n <div className=\"space-y-2\">\n {[1, 2, 3].map((index) => (<div key={index} className=\"shimmer h-14 rounded-lg\" />))}\n </div>\n )}\n\n {!isLoadingRuns && runs.length === 0 && (\n <div className=\"py-8 text-center\">\n <ClockIcon className=\"mx-auto mb-2 h-8 w-8 text-gray-300 dark:text-gray-600\" />\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">{t('noRuns')}</p>\n <p className=\"mt-1 text-[10px] text-gray-400 dark:text-gray-500\">{t('noRunsDescription')}</p>\n </div>\n )}\n\n {!isLoadingRuns && runs.length > 0 && (\n <div className=\"space-y-1.5\">\n {runs.map((run) => {\n const statusStyle = STATUS_STYLES[run.status] ?? STATUS_STYLES.pending\n const StatusIcon = statusStyle.icon\n const isSelected = selectedRun?.id === run.id\n return (\n <button\n key={run.id}\n type=\"button\"\n onClick={() => {\n setSelectedRun(isSelected ? null : run)\n setSelectedNode(null)\n }}\n className={`w-full rounded-lg border px-3 py-2.5 text-left transition-colors ${\n isSelected\n ? 'border-blue-200 bg-blue-50/50 dark:border-blue-800 dark:bg-blue-900/20'\n : 'border-gray-100 hover:border-gray-200 hover:bg-gray-50 dark:border-gray-700/50 dark:hover:border-gray-600 dark:hover:bg-gray-700/30'\n }`}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <StatusIcon className={`h-3.5 w-3.5 ${statusStyle.colorClass}`} />\n <span className=\"text-xs font-medium text-gray-900 dark:text-white\">{formatTimestamp(run.createdAt)}</span>\n </div>\n <span className=\"text-[10px] text-gray-400\">{formatDuration(run.totalDurationMs)}</span>\n </div>\n {run.error && <p className=\"mt-1 truncate text-[10px] text-red-500\">{run.error}</p>}\n </button>\n )\n })}\n </div>\n )}\n\n {selectedRun && selectedRun.nodeResults.length > 0 && (\n <div className=\"mt-3 space-y-1\">\n <h5 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-gray-400\">Nodes</h5>\n {selectedRun.nodeResults.map((nodeResult) => {\n const nodeStatusStyle = STATUS_STYLES[nodeResult.status] ?? STATUS_STYLES.pending\n const NodeStatusIcon = nodeStatusStyle.icon\n return (\n <button\n key={nodeResult.nodeId}\n type=\"button\"\n onClick={() => setSelectedNode(nodeResult)}\n className=\"flex w-full items-center justify-between rounded px-2 py-1.5 text-xs hover:bg-gray-50 dark:hover:bg-gray-700/50\"\n >\n <div className=\"flex items-center gap-2\">\n <NodeStatusIcon className={`h-3 w-3 ${nodeStatusStyle.colorClass}`} />\n <span className=\"text-gray-700 dark:text-gray-300\">{nodeResult.nodeType}</span>\n </div>\n <span className=\"text-[10px] text-gray-400\">{formatDuration(nodeResult.durationMs)}</span>\n </button>\n )\n })}\n </div>\n )}\n </div>\n </div>\n </div>\n </>\n )\n}\n","export type SaveStatusBadgeProps = {\n status: 'idle' | 'saving' | 'saved'\n /** Localized status messages so screen readers + low-vision users\n * hear \"saving / saved\" instead of just a bullet. Defaults to PT-BR\n * fallback so the badge never ships a silent symbol. */\n labels?: { saving?: string; saved?: string }\n}\n\n/**\n * Tiny status badge for autosave indicators. Always announces the\n * current state via `aria-live=\"polite\"` so screen-reader users\n * notice the transition without losing focus. The visible glyph is\n * purely decorative (`aria-hidden`) — the visually-hidden label\n * carries the meaning. WCAG 4.1.3 (status messages) + 1.4.1 (color\n * is not the only channel).\n */\nexport function SaveStatusBadge({ status, labels }: SaveStatusBadgeProps) {\n const savingLabel = labels?.saving ?? 'Salvando…'\n const savedLabel = labels?.saved ?? 'Salvo'\n\n if (status === 'saving') {\n return (\n <span role=\"status\" aria-live=\"polite\" className=\"inline-flex items-center\">\n <span\n aria-hidden=\"true\"\n className=\"motion-safe:animate-pulse text-[11px] text-gray-500 dark:text-gray-400\"\n >\n &#8226;\n </span>\n <span className=\"sr-only\">{savingLabel}</span>\n </span>\n )\n }\n\n if (status === 'saved') {\n return (\n <span role=\"status\" aria-live=\"polite\" className=\"inline-flex items-center\">\n <span\n aria-hidden=\"true\"\n className=\"text-[11px] text-emerald-600 dark:text-emerald-400\"\n >\n &#10003;\n </span>\n <span className=\"sr-only\">{savedLabel}</span>\n </span>\n )\n }\n\n return null\n}\n","import { memo, useCallback } from 'react'\nimport { Workspace, type WorkspaceProps } from '../../workflow-canvas'\nimport type { WorkflowGraph } from '../../contracts'\n\nexport type AutoSaveWorkspaceProps = Omit<WorkspaceProps, 'onGraphChange'> & {\n onAutoSaveGraph: (graph: WorkflowGraph) => void\n onGraphSnapshot?: (graph: WorkflowGraph) => void\n}\n\nexport const AutoSaveWorkspace = memo(function AutoSaveWorkspace({\n onAutoSaveGraph,\n onGraphSnapshot,\n ...workspaceProps\n}: AutoSaveWorkspaceProps) {\n const handleGraphChange = useCallback((graph: WorkflowGraph) => {\n onGraphSnapshot?.(graph)\n onAutoSaveGraph(graph)\n }, [onAutoSaveGraph, onGraphSnapshot])\n\n return (\n <Workspace\n {...workspaceProps}\n onGraphChange={handleGraphChange}\n />\n )\n})\n","import type { ComponentProps } from 'react'\nimport { DynamicIslandConfirm as UiDynamicIslandConfirm } from '@ui/index'\n\nexport type DynamicIslandConfirmProps = ComponentProps<typeof UiDynamicIslandConfirm>\n\nexport function DynamicIslandConfirm(props: DynamicIslandConfirmProps) {\n return <UiDynamicIslandConfirm {...props} />\n}\n\n","/**\n * DSL Export Modal\n * ================\n * Modal for exporting a workflow to a JSON file.\n * Shows workflow metadata, a JSON preview, and provides\n * \"Copy to Clipboard\" and \"Download JSON\" actions.\n */\n\nimport { useState, useMemo, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { ArrowDownTrayIcon, ClipboardDocumentIcon, CheckIcon } from '@heroicons/react/24/outline'\nimport { Button, GlassModal } from '@ui/index'\nimport type { WorkflowGraph, Workflow } from '../../contracts'\n\ntype DslExportModalProps = {\n open: boolean\n onClose: () => void\n workflow: Workflow\n graph: WorkflowGraph\n}\n\nconst JSON_PREVIEW_LINE_LIMIT = 50\n\nexport function DslExportModal({ open, onClose, workflow, graph }: DslExportModalProps) {\n const translations = useTranslations('agents.workflow.dsl.export')\n const [isCopied, setIsCopied] = useState(false)\n\n const exportPayload = useMemo(() => ({\n name: workflow.name,\n description: workflow.description,\n version: workflow.version,\n exportedAt: new Date().toISOString(),\n graph: {\n nodes: graph.nodes,\n edges: graph.edges,\n viewport: graph.viewport,\n },\n }), [workflow, graph])\n\n const jsonString = useMemo(() => JSON.stringify(exportPayload, null, 2), [exportPayload])\n\n const previewLines = useMemo(() => {\n const lines = jsonString.split('\\n')\n if (lines.length <= JSON_PREVIEW_LINE_LIMIT) {\n return jsonString\n }\n return lines.slice(0, JSON_PREVIEW_LINE_LIMIT).join('\\n') + '\\n...'\n }, [jsonString])\n\n const handleCopyToClipboard = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(jsonString)\n setIsCopied(true)\n setTimeout(() => setIsCopied(false), 2000)\n } catch {\n // Fallback for older browsers\n const textArea = document.createElement('textarea')\n textArea.value = jsonString\n document.body.appendChild(textArea)\n textArea.select()\n document.execCommand('copy')\n document.body.removeChild(textArea)\n setIsCopied(true)\n setTimeout(() => setIsCopied(false), 2000)\n }\n }, [jsonString])\n\n const handleDownloadJson = useCallback(() => {\n const blob = new Blob([jsonString], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n const downloadLink = document.createElement('a')\n downloadLink.href = url\n downloadLink.download = `${workflow.name}-v${workflow.version}.json`\n document.body.appendChild(downloadLink)\n downloadLink.click()\n document.body.removeChild(downloadLink)\n URL.revokeObjectURL(url)\n }, [jsonString, workflow.name, workflow.version])\n\n if (!open) return null\n\n return (\n <GlassModal\n open={open}\n onClose={onClose}\n title={translations('title')}\n subtitle={translations('description')}\n maxWidth=\"2xl\"\n >\n <div data-testid=\"dsl-export-modal\">\n {/* Metadata */}\n <div className=\"border-b border-gray-200 px-1 py-4 dark:border-gray-700\">\n <div className=\"grid grid-cols-2 gap-4 text-sm\">\n <div>\n <span className=\"text-gray-500 dark:text-gray-400\">{translations('workflowName')}</span>\n <p className=\"font-medium text-gray-900 dark:text-white\">{workflow.name}</p>\n </div>\n <div>\n <span className=\"text-gray-500 dark:text-gray-400\">{translations('version')}</span>\n <p className=\"font-medium text-gray-900 dark:text-white\">v{workflow.version}</p>\n </div>\n <div>\n <span className=\"text-gray-500 dark:text-gray-400\">{translations('nodes')}</span>\n <p className=\"font-medium text-gray-900 dark:text-white\">{graph.nodes.length}</p>\n </div>\n <div>\n <span className=\"text-gray-500 dark:text-gray-400\">{translations('edges')}</span>\n <p className=\"font-medium text-gray-900 dark:text-white\">{graph.edges.length}</p>\n </div>\n </div>\n </div>\n\n {/* JSON Preview */}\n <div className=\"px-1 py-4\">\n <div className=\"mb-2 text-xs font-medium uppercase tracking-wider text-gray-400 dark:text-gray-500\">\n {translations('preview')}\n </div>\n <pre\n className=\"max-h-64 overflow-auto rounded-lg border border-gray-200 bg-gray-50 p-3 text-xs text-gray-700 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-300\"\n data-testid=\"export-json-preview\"\n >\n {previewLines}\n </pre>\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center justify-end gap-3 border-t border-gray-200 px-1 py-4 dark:border-gray-700\">\n <Button\n type=\"button\"\n onClick={handleCopyToClipboard}\n outline\n size=\"sm\"\n data-testid=\"export-copy-button\"\n >\n {isCopied ? (\n <>\n <CheckIcon className=\"h-4 w-4 text-green-500\" />\n <span role=\"status\" aria-live=\"polite\">{translations('copied')}</span>\n </>\n ) : (\n <>\n <ClipboardDocumentIcon className=\"h-4 w-4\" />\n {translations('copyToClipboard')}\n </>\n )}\n </Button>\n <Button\n type=\"button\"\n onClick={handleDownloadJson}\n color=\"ios-glass-blue\"\n size=\"sm\"\n data-testid=\"export-download-button\"\n >\n <ArrowDownTrayIcon className=\"h-4 w-4\" />\n {translations('downloadJson')}\n </Button>\n </div>\n </div>\n </GlassModal>\n )\n}\n","/**\n * DSL Import Modal\n * ================\n * Modal for importing a workflow from a JSON file.\n * Provides drag-and-drop and file picker upload, validates\n * JSON structure (nodes array, edges array, viewport),\n * shows validation errors, and previews node/edge counts.\n */\n\nimport { useState, useCallback, useRef } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { ArrowUpTrayIcon, ExclamationTriangleIcon, CheckCircleIcon } from '@heroicons/react/24/outline'\nimport { Button, GlassModal } from '@ui/index'\nimport type { WorkflowGraph } from '../../contracts'\n\ntype DslImportModalProps = {\n open: boolean\n onClose: () => void\n onImport: (graph: WorkflowGraph) => void\n}\n\ntype ValidationResult = {\n isValid: boolean\n errors: string[]\n graph: WorkflowGraph | null\n nodeCount: number\n edgeCount: number\n}\n\nfunction validateWorkflowJson(jsonString: string): ValidationResult {\n const errors: string[] = []\n\n let parsed: unknown\n try {\n parsed = JSON.parse(jsonString)\n } catch {\n return { isValid: false, errors: ['Invalid JSON format'], graph: null, nodeCount: 0, edgeCount: 0 }\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n return { isValid: false, errors: ['Root must be a JSON object'], graph: null, nodeCount: 0, edgeCount: 0 }\n }\n\n const data = parsed as Record<string, unknown>\n\n // Support both root-level graph and nested graph property\n const graphData = data.graph ? (data.graph as Record<string, unknown>) : data\n\n if (!Array.isArray(graphData.nodes)) {\n errors.push('Missing or invalid \"nodes\" array')\n }\n\n if (!Array.isArray(graphData.edges)) {\n errors.push('Missing or invalid \"edges\" array')\n }\n\n if (!graphData.viewport || typeof graphData.viewport !== 'object') {\n errors.push('Missing or invalid \"viewport\" object')\n }\n\n if (errors.length > 0) {\n return { isValid: false, errors, graph: null, nodeCount: 0, edgeCount: 0 }\n }\n\n const nodes = graphData.nodes as Array<Record<string, unknown>>\n const edges = graphData.edges as Array<Record<string, unknown>>\n\n // Validate node structure\n for (let index = 0; index < nodes.length; index++) {\n const node = nodes[index]\n if (!node.id || typeof node.id !== 'string') {\n errors.push(`Node at index ${index}: missing or invalid \"id\"`)\n }\n if (!node.type || typeof node.type !== 'string') {\n errors.push(`Node at index ${index}: missing or invalid \"type\"`)\n }\n if (!node.position || typeof node.position !== 'object') {\n errors.push(`Node at index ${index}: missing or invalid \"position\"`)\n }\n }\n\n // Validate edge structure\n for (let index = 0; index < edges.length; index++) {\n const edge = edges[index]\n if (!edge.id || typeof edge.id !== 'string') {\n errors.push(`Edge at index ${index}: missing or invalid \"id\"`)\n }\n if (!edge.source || typeof edge.source !== 'string') {\n errors.push(`Edge at index ${index}: missing or invalid \"source\"`)\n }\n if (!edge.target || typeof edge.target !== 'string') {\n errors.push(`Edge at index ${index}: missing or invalid \"target\"`)\n }\n }\n\n if (errors.length > 0) {\n return { isValid: false, errors, graph: null, nodeCount: nodes.length, edgeCount: edges.length }\n }\n\n const viewport = graphData.viewport as Record<string, unknown>\n const graph: WorkflowGraph = {\n nodes: nodes.map((node) => ({\n id: node.id as string,\n type: node.type as WorkflowGraph['nodes'][number]['type'],\n position: node.position as { x: number; y: number },\n data: (node.data ?? { entityId: '', label: '' }) as WorkflowGraph['nodes'][number]['data'],\n })),\n edges: edges.map((edge) => ({\n id: edge.id as string,\n source: edge.source as string,\n target: edge.target as string,\n sourceHandle: (edge.sourceHandle ?? 'default') as string,\n targetHandle: (edge.targetHandle ?? 'default') as string,\n })),\n viewport: {\n x: typeof viewport.x === 'number' ? viewport.x : 0,\n y: typeof viewport.y === 'number' ? viewport.y : 0,\n zoom: typeof viewport.zoom === 'number' ? viewport.zoom : 1,\n },\n }\n\n return { isValid: true, errors: [], graph, nodeCount: nodes.length, edgeCount: edges.length }\n}\n\nexport function DslImportModal({ open, onClose, onImport }: DslImportModalProps) {\n const translations = useTranslations('agents.workflow.dsl.import')\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const [isDragActive, setIsDragActive] = useState(false)\n const [validationResult, setValidationResult] = useState<ValidationResult | null>(null)\n const [fileName, setFileName] = useState<string | null>(null)\n\n const processFile = useCallback((file: File) => {\n setFileName(file.name)\n\n const reader = new FileReader()\n reader.onload = (event) => {\n const content = event.target?.result\n if (typeof content === 'string') {\n const result = validateWorkflowJson(content)\n setValidationResult(result)\n }\n }\n reader.readAsText(file)\n }, [])\n\n const handleDragOver = useCallback((event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault()\n setIsDragActive(true)\n }, [])\n\n const handleDragLeave = useCallback((event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault()\n setIsDragActive(false)\n }, [])\n\n const handleDrop = useCallback(\n (event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault()\n setIsDragActive(false)\n\n const files = event.dataTransfer.files\n if (files.length > 0) {\n processFile(files[0])\n }\n },\n [processFile],\n )\n\n const handleFileChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const files = event.target.files\n if (files && files.length > 0) {\n processFile(files[0])\n }\n },\n [processFile],\n )\n\n const handleClickUpload = useCallback(() => {\n fileInputRef.current?.click()\n }, [])\n\n const handleImport = useCallback(() => {\n if (validationResult?.isValid && validationResult.graph) {\n onImport(validationResult.graph)\n onClose()\n }\n }, [validationResult, onImport, onClose])\n\n const handleReset = useCallback(() => {\n setValidationResult(null)\n setFileName(null)\n if (fileInputRef.current) {\n fileInputRef.current.value = ''\n }\n }, [])\n\n if (!open) return null\n\n return (\n <GlassModal\n open={open}\n onClose={onClose}\n title={translations('title')}\n subtitle={translations('description')}\n maxWidth=\"lg\"\n >\n <div data-testid=\"dsl-import-modal\">\n <div className=\"px-1 py-2\">\n {!validationResult ? (\n <div\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={handleClickUpload}\n className={`cursor-pointer rounded-xl border-2 border-dashed p-8 text-center transition-colors duration-200 ${\n isDragActive\n ? 'border-blue-400 bg-blue-50 dark:border-blue-500 dark:bg-blue-500/10'\n : 'border-gray-300 hover:border-gray-400 dark:border-gray-600 dark:hover:border-gray-500'\n }`}\n data-testid=\"import-dropzone\"\n role=\"button\"\n tabIndex={0}\n aria-label={translations('dropzone')}\n >\n <ArrowUpTrayIcon className=\"mx-auto h-10 w-10 text-gray-400 dark:text-gray-500\" />\n <p className=\"mt-3 text-sm font-medium text-gray-700 dark:text-gray-300\">\n {translations('dropzone')}\n </p>\n <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">\n {translations('dropzoneHint')}\n </p>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".json\"\n onChange={handleFileChange}\n className=\"hidden\"\n data-testid=\"import-file-input\"\n />\n </div>\n ) : (\n <div data-testid=\"import-validation-result\">\n <div className=\"mb-4 flex items-center justify-between\">\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">{fileName}</span>\n <Button type=\"button\" plain size=\"sm\" onClick={handleReset}>\n {translations('chooseAnother')}\n </Button>\n </div>\n\n {validationResult.isValid ? (\n <div className=\"rounded-lg border border-green-200 bg-green-50 p-4 dark:border-green-800 dark:bg-green-900/20\">\n <div className=\"flex items-center gap-2\">\n <CheckCircleIcon className=\"h-5 w-5 text-green-500\" />\n <span className=\"text-sm font-medium text-green-700 dark:text-green-400\">\n {translations('validationSuccess')}\n </span>\n </div>\n <div className=\"mt-2 grid grid-cols-2 gap-2 text-sm\">\n <div className=\"text-green-600 dark:text-green-400\">\n {translations('nodes')}: {validationResult.nodeCount}\n </div>\n <div className=\"text-green-600 dark:text-green-400\">\n {translations('edges')}: {validationResult.edgeCount}\n </div>\n </div>\n </div>\n ) : (\n <div role=\"alert\" className=\"rounded-lg border border-red-200 bg-red-50 p-4 dark:border-red-800 dark:bg-red-900/20\">\n <div className=\"flex items-center gap-2\">\n <ExclamationTriangleIcon className=\"h-5 w-5 text-red-500\" />\n <span className=\"text-sm font-medium text-red-700 dark:text-red-400\">\n {translations('validationFailed')}\n </span>\n </div>\n <ul className=\"mt-2 space-y-1\">\n {validationResult.errors.map((validationError, index) => (\n <li key={index} className=\"text-xs text-red-600 dark:text-red-400\">\n {validationError}\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n )}\n </div>\n\n <div className=\"flex items-center justify-end gap-3 border-t border-gray-200 px-1 py-4 dark:border-gray-700\">\n <Button type=\"button\" onClick={onClose} outline size=\"sm\" data-testid=\"import-cancel-button\">\n {translations('cancel')}\n </Button>\n <Button\n type=\"button\"\n onClick={handleImport}\n disabled={!validationResult?.isValid}\n color=\"ios-glass-blue\"\n size=\"sm\"\n data-testid=\"import-confirm-button\"\n >\n <ArrowUpTrayIcon className=\"h-4 w-4\" />\n {translations('import')}\n </Button>\n </div>\n </div>\n </GlassModal>\n )\n}\n","/**\n * Workflow Store Selectors\n * ========================\n * Derived state hooks for granular subscriptions.\n * Each selector subscribes only to the slice it needs,\n * preventing unnecessary re-renders in consuming components.\n */\n\nimport { useWorkflowStore } from './workflow-store'\n\nexport const useCanUndo = () => useWorkflowStore((state) => state.past.length > 0)\n\nexport const useCanRedo = () => useWorkflowStore((state) => state.future.length > 0)\n\nexport const useHasCopied = () => useWorkflowStore((state) => state.clipboard !== null)\n\nexport const useContextMenu = () => useWorkflowStore((state) => state.contextMenu)\n\nexport const useEditingNodeId = () => useWorkflowStore((state) => state.editingNodeId)\n\nexport const useSelectedNodeCount = () =>\n useWorkflowStore((state) => state.nodes.filter((node) => node.selected).length)\n\nexport const useIsRunning = () => useWorkflowStore((state) => state.isRunning)\n\nexport const useNodeResults = () => useWorkflowStore((state) => state.nodeResults)\n","import { useCallback, useRef } from 'react'\nimport type { Node, Edge } from '@xyflow/react'\n\ntype GraphSnapshot = {\n nodes: Node[]\n edges: Edge[]\n}\n\ntype UseUndoRedoReturn = {\n undo: () => void\n redo: () => void\n canUndo: boolean\n canRedo: boolean\n takeSnapshot: () => void\n}\n\nconst DEFAULT_MAX_HISTORY = 50\n\nexport function useUndoRedo(\n nodes: Node[],\n edges: Edge[],\n setNodes: (nodes: Node[]) => void,\n setEdges: (edges: Edge[]) => void,\n maxHistory: number = DEFAULT_MAX_HISTORY,\n): UseUndoRedoReturn {\n const pastRef = useRef<GraphSnapshot[]>([])\n const futureRef = useRef<GraphSnapshot[]>([])\n\n // Force re-render tracking for canUndo/canRedo\n // We use a counter ref that we read synchronously to derive boolean states\n const pastLengthRef = useRef(0)\n const futureLengthRef = useRef(0)\n\n const takeSnapshot = useCallback(() => {\n const snapshot: GraphSnapshot = {\n nodes: nodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: edges.map((edge) => ({ ...edge })),\n }\n pastRef.current = [...pastRef.current.slice(-(maxHistory - 1)), snapshot]\n pastLengthRef.current = pastRef.current.length\n futureRef.current = []\n futureLengthRef.current = 0\n }, [nodes, edges, maxHistory])\n\n const undo = useCallback(() => {\n const past = pastRef.current\n if (past.length === 0) return\n\n const previous = past[past.length - 1]\n const remaining = past.slice(0, -1)\n\n const currentSnapshot: GraphSnapshot = {\n nodes: nodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: edges.map((edge) => ({ ...edge })),\n }\n\n pastRef.current = remaining\n pastLengthRef.current = remaining.length\n futureRef.current = [...futureRef.current, currentSnapshot]\n futureLengthRef.current = futureRef.current.length\n\n setNodes(previous.nodes)\n setEdges(previous.edges)\n }, [nodes, edges, setNodes, setEdges])\n\n const redo = useCallback(() => {\n const future = futureRef.current\n if (future.length === 0) return\n\n const next = future[future.length - 1]\n const remaining = future.slice(0, -1)\n\n const currentSnapshot: GraphSnapshot = {\n nodes: nodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: edges.map((edge) => ({ ...edge })),\n }\n\n futureRef.current = remaining\n futureLengthRef.current = remaining.length\n pastRef.current = [...pastRef.current, currentSnapshot]\n pastLengthRef.current = pastRef.current.length\n\n setNodes(next.nodes)\n setEdges(next.edges)\n }, [nodes, edges, setNodes, setEdges])\n\n return {\n undo,\n redo,\n canUndo: pastRef.current.length > 0,\n canRedo: futureRef.current.length > 0,\n takeSnapshot,\n }\n}\n","import { useCallback, useRef } from 'react'\nimport type { Node, Edge } from '@xyflow/react'\n\ntype ClipboardContent = {\n nodes: Node[]\n edges: Edge[]\n}\n\ntype UseClipboardReturn = {\n copy: () => void\n paste: () => void\n hasCopied: boolean\n}\n\nconst PASTE_OFFSET = 40\n\nexport function useClipboard(\n nodes: Node[],\n edges: Edge[],\n setNodes: (updater: (nodes: Node[]) => Node[]) => void,\n setEdges: (updater: (edges: Edge[]) => Edge[]) => void,\n takeSnapshot: () => void,\n): UseClipboardReturn {\n const clipboardRef = useRef<ClipboardContent | null>(null)\n\n const copy = useCallback(() => {\n const selectedNodes = nodes.filter((node) => node.selected)\n if (selectedNodes.length === 0) return\n\n const selectedNodeIds = new Set(selectedNodes.map((node) => node.id))\n const internalEdges = edges.filter(\n (edge) => selectedNodeIds.has(edge.source) && selectedNodeIds.has(edge.target),\n )\n\n clipboardRef.current = {\n nodes: selectedNodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: internalEdges.map((edge) => ({ ...edge })),\n }\n }, [nodes, edges])\n\n const paste = useCallback(() => {\n const clipboard = clipboardRef.current\n if (!clipboard || clipboard.nodes.length === 0) return\n\n takeSnapshot()\n\n const idMapping = new Map<string, string>()\n clipboard.nodes.forEach((node) => {\n idMapping.set(node.id, crypto.randomUUID())\n })\n\n const pastedNodes: Node[] = clipboard.nodes.map((node) => ({\n ...node,\n id: idMapping.get(node.id) ?? crypto.randomUUID(),\n position: {\n x: node.position.x + PASTE_OFFSET,\n y: node.position.y + PASTE_OFFSET,\n },\n selected: true,\n data: { ...node.data },\n }))\n\n const pastedEdges: Edge[] = clipboard.edges.map((edge) => ({\n ...edge,\n id: crypto.randomUUID(),\n source: idMapping.get(edge.source) ?? edge.source,\n target: idMapping.get(edge.target) ?? edge.target,\n }))\n\n setNodes((currentNodes) => [\n ...currentNodes.map((node) => ({ ...node, selected: false })),\n ...pastedNodes,\n ])\n\n setEdges((currentEdges) => [...currentEdges, ...pastedEdges])\n\n // Update clipboard positions for consecutive pastes\n clipboardRef.current = {\n nodes: pastedNodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: pastedEdges.map((edge) => ({ ...edge })),\n }\n }, [setNodes, setEdges, takeSnapshot])\n\n return {\n copy,\n paste,\n hasCopied: clipboardRef.current !== null && clipboardRef.current.nodes.length > 0,\n }\n}\n","import { useEffect } from 'react'\n\ntype UseCanvasShortcutsOptions = {\n undo: () => void\n redo: () => void\n copy: () => void\n paste: () => void\n canUndo: boolean\n canRedo: boolean\n selectAll: () => void\n fitView: () => void\n}\n\nconst INPUT_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT'])\n\nfunction isInputFocused(): boolean {\n const activeElement = document.activeElement\n if (!activeElement) return false\n return INPUT_TAGS.has(activeElement.tagName) || (activeElement as HTMLElement).isContentEditable\n}\n\nexport function useCanvasShortcuts({\n undo,\n redo,\n copy,\n paste,\n canUndo,\n canRedo,\n selectAll,\n fitView,\n}: UseCanvasShortcutsOptions): void {\n useEffect(() => {\n function handleKeyDown(event: KeyboardEvent) {\n if (isInputFocused()) return\n\n const isModifierPressed = event.metaKey || event.ctrlKey\n\n if (!isModifierPressed) {\n if (event.key === 'Escape') {\n selectAll() // Will be overridden to deselect — see graph wiring\n return\n }\n return\n }\n\n switch (event.key.toLowerCase()) {\n case 'z': {\n if (event.shiftKey) {\n if (canRedo) {\n event.preventDefault()\n redo()\n }\n } else {\n if (canUndo) {\n event.preventDefault()\n undo()\n }\n }\n break\n }\n case 'y': {\n if (canRedo) {\n event.preventDefault()\n redo()\n }\n break\n }\n case 'c': {\n event.preventDefault()\n copy()\n break\n }\n case 'v': {\n event.preventDefault()\n paste()\n break\n }\n case 'a': {\n event.preventDefault()\n selectAll()\n break\n }\n case 'f': {\n if (event.shiftKey) {\n event.preventDefault()\n fitView()\n }\n break\n }\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n }\n }, [undo, redo, copy, paste, canUndo, canRedo, selectAll, fitView])\n}\n","/**\n * Help Lines Hook\n * ===============\n * Detects alignment between the currently dragged node and\n * all other nodes on the canvas. When edges (left, center, right,\n * top, center-y, bottom) are within a 5px threshold, returns\n * horizontal and/or vertical guide line positions for visual feedback.\n */\n\nimport { useState, useCallback } from 'react'\nimport type { Node } from '@xyflow/react'\n\ntype NodeDragHandler = (event: React.MouseEvent, node: Node, nodes: Node[]) => void\n\ntype HelpLinePosition = {\n horizontal: number | null\n vertical: number | null\n}\n\ntype NodeBounds = {\n left: number\n centerX: number\n right: number\n top: number\n centerY: number\n bottom: number\n}\n\nconst ALIGNMENT_THRESHOLD = 5\nconst DEFAULT_NODE_WIDTH = 200\nconst DEFAULT_NODE_HEIGHT = 60\n\nfunction getNodeBounds(node: Node): NodeBounds {\n const width = (node.measured?.width ?? node.width ?? DEFAULT_NODE_WIDTH) as number\n const height = (node.measured?.height ?? node.height ?? DEFAULT_NODE_HEIGHT) as number\n\n return {\n left: node.position.x,\n centerX: node.position.x + width / 2,\n right: node.position.x + width,\n top: node.position.y,\n centerY: node.position.y + height / 2,\n bottom: node.position.y + height,\n }\n}\n\n/**\n * Finds the closest alignment positions between a dragged node and\n * all other nodes. Returns horizontal and vertical guide line positions\n * when edges are within the alignment threshold.\n */\nfunction findAlignments(\n dragBounds: NodeBounds,\n otherNodes: Node[],\n): HelpLinePosition {\n let closestHorizontal: number | null = null\n let closestVertical: number | null = null\n let minHorizontalDistance = ALIGNMENT_THRESHOLD + 1\n let minVerticalDistance = ALIGNMENT_THRESHOLD + 1\n\n for (const otherNode of otherNodes) {\n const otherBounds = getNodeBounds(otherNode)\n\n // Check vertical alignments (x-axis positions)\n const verticalChecks = [\n { dragValue: dragBounds.left, otherValue: otherBounds.left },\n { dragValue: dragBounds.left, otherValue: otherBounds.centerX },\n { dragValue: dragBounds.left, otherValue: otherBounds.right },\n { dragValue: dragBounds.centerX, otherValue: otherBounds.left },\n { dragValue: dragBounds.centerX, otherValue: otherBounds.centerX },\n { dragValue: dragBounds.centerX, otherValue: otherBounds.right },\n { dragValue: dragBounds.right, otherValue: otherBounds.left },\n { dragValue: dragBounds.right, otherValue: otherBounds.centerX },\n { dragValue: dragBounds.right, otherValue: otherBounds.right },\n ]\n\n for (const check of verticalChecks) {\n const distance = Math.abs(check.dragValue - check.otherValue)\n if (distance <= ALIGNMENT_THRESHOLD && distance < minVerticalDistance) {\n minVerticalDistance = distance\n closestVertical = check.otherValue\n }\n }\n\n // Check horizontal alignments (y-axis positions)\n const horizontalChecks = [\n { dragValue: dragBounds.top, otherValue: otherBounds.top },\n { dragValue: dragBounds.top, otherValue: otherBounds.centerY },\n { dragValue: dragBounds.top, otherValue: otherBounds.bottom },\n { dragValue: dragBounds.centerY, otherValue: otherBounds.top },\n { dragValue: dragBounds.centerY, otherValue: otherBounds.centerY },\n { dragValue: dragBounds.centerY, otherValue: otherBounds.bottom },\n { dragValue: dragBounds.bottom, otherValue: otherBounds.top },\n { dragValue: dragBounds.bottom, otherValue: otherBounds.centerY },\n { dragValue: dragBounds.bottom, otherValue: otherBounds.bottom },\n ]\n\n for (const check of horizontalChecks) {\n const distance = Math.abs(check.dragValue - check.otherValue)\n if (distance <= ALIGNMENT_THRESHOLD && distance < minHorizontalDistance) {\n minHorizontalDistance = distance\n closestHorizontal = check.otherValue\n }\n }\n }\n\n return { horizontal: closestHorizontal, vertical: closestVertical }\n}\n\n/**\n * Basic help lines hook. Returns a drag handler factory that accepts\n * the full node list for alignment detection.\n *\n * Example:\n * const { helpLines, createDragHandler, onNodeDragStop } = useHelpLines()\n * const onNodeDrag = createDragHandler(nodes)\n */\nexport function useHelpLines(): {\n helpLines: HelpLinePosition\n createDragHandler: (allNodes: Node[]) => NodeDragHandler\n onNodeDragStop: NodeDragHandler\n} {\n const [helpLines, setHelpLines] = useState<HelpLinePosition>({\n horizontal: null,\n vertical: null,\n })\n\n const createDragHandler = useCallback(\n (allNodes: Node[]): NodeDragHandler =>\n (_event, draggedNode, draggedNodes) => {\n const draggingNodeIds = new Set(\n draggedNodes.length > 0\n ? draggedNodes.map((node) => node.id)\n : [draggedNode.id],\n )\n\n const dragBounds = getNodeBounds(draggedNode)\n const otherNodes = allNodes.filter((node) => !draggingNodeIds.has(node.id))\n\n setHelpLines(findAlignments(dragBounds, otherNodes))\n },\n [],\n )\n\n const onNodeDragStop: NodeDragHandler = useCallback(() => {\n setHelpLines({ horizontal: null, vertical: null })\n }, [])\n\n return {\n helpLines,\n createDragHandler,\n onNodeDragStop,\n }\n}\n"]}