@agentforge4j/workflow-builder-react 0.2.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api/WorkflowBuilder.tsx","../src/canvas/WorkflowCanvas.tsx","../src/copy/workflow-terminology.ts","../src/canvas/edges/FlowEdge.tsx","../src/canvas/empty/EmptyState.tsx","../src/model/nodeKinds.ts","../src/canvas/nodes/NodeChrome.tsx","../src/canvas/nodes/DecisionNode.tsx","../src/canvas/nodes/LoopNode.tsx","../src/canvas/nodes/StepNode.tsx","../src/guided/GuidedStepper.tsx","../src/model/mapper.ts","../src/hooks/useCanvasState.ts","../src/hooks/useBuilderMode.ts","../src/validation/validateWorkflow.ts","../src/hooks/useWorkflowDraft.ts","../src/inspector/StepConfigPanel.tsx","../src/palette/StepPalette.tsx","../src/state/useBuilderState.ts","../src/api/types.ts","../src/state/reducer.ts","../src/validation-ui/ValidationPanel.tsx","../src/validation-ui/ValidationPill.tsx","../src/io/core.ts","../src/io/browser/download.ts","../src/io/browser/upload.ts"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\r\n\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { WorkflowCanvas } from '../canvas/WorkflowCanvas';\r\nimport { ACTION_LABELS, GUIDED_STAGE_LABELS } from '../copy/workflow-terminology';\r\nimport { GuidedStepper } from '../guided/GuidedStepper';\r\nimport { createInitialCanvasModel, useCanvasState } from '../hooks/useCanvasState';\r\nimport { useBuilderMode } from '../hooks/useBuilderMode';\r\nimport type { DraftValidationIssue } from '../hooks/useWorkflowDraft';\r\nimport { useWorkflowDraft } from '../hooks/useWorkflowDraft';\r\nimport { StepConfigPanel } from '../inspector/StepConfigPanel';\r\nimport type { CanvasModel, CanvasNode } from '../model/canvasModel';\r\nimport {\r\n canvasToWorkflow,\r\n defaultNodeData,\r\n newStepId,\r\n workflowToCanvas,\r\n} from '../model/mapper';\r\nimport type { NodeKind } from '../model/nodeKinds';\r\nimport { StepPalette } from '../palette/StepPalette';\r\nimport { useBuilderState } from '../state/useBuilderState';\r\nimport { ValidationPill } from '../validation-ui/ValidationPill';\r\nimport type { EditorValidation } from '../validation/validateWorkflow';\r\nimport { validateWorkflow as defaultValidateWorkflow } from '../validation/validateWorkflow';\r\nimport { exportWorkflowBundle } from '../io/browser/download';\r\nimport { importWorkflowFromFilePicker } from '../io/browser/upload';\r\nimport type { WorkflowBuilderProps } from './types';\r\nimport { emptyWorkflow } from './types';\r\nimport '../styles/tokens.css';\r\nimport './workflow-builder.css';\r\n\r\ntype ActionKey = 'import' | 'export' | 'save' | 'run' | 'publish';\r\n\r\ntype PendingState = Partial<Record<ActionKey, boolean>>;\r\ntype ErrorState = Partial<Record<ActionKey, string | null>>;\r\n\r\nfunction flattenClientIssues(model: CanvasModel, validation: EditorValidation): DraftValidationIssue[] {\r\n const safe = (value: string | undefined) => value ?? '';\r\n return [\r\n ...Object.entries(validation.workflow).map(([field, message]) => ({\r\n code: `workflow.${field}`,\r\n message: safe(message),\r\n stepId: undefined,\r\n })),\r\n ...Object.entries(validation.steps).flatMap(([idx, errs]) =>\r\n Object.entries(errs).map(([field, message]) => ({\r\n code: `step.${field}`,\r\n message: safe(message),\r\n stepId: model.nodes[Number(idx)]?.backendStepId,\r\n })),\r\n ),\r\n ...Object.entries(validation.artifacts).flatMap(([artifactId, errs]) =>\r\n Object.entries(errs).map(([field, message]) => ({\r\n code: `artifact.${artifactId}.${field}`,\r\n message: safe(message),\r\n stepId: undefined,\r\n })),\r\n ),\r\n ...validation.global.map((message) => ({ code: 'global', message: safe(message), stepId: undefined })),\r\n ];\r\n}\r\n\r\nfunction hasApprovalTransition(node: CanvasNode): boolean {\r\n const data = node.data as Partial<{ transition: string }>;\r\n return data.transition === 'HUMAN_APPROVAL';\r\n}\r\n\r\nfunction hasConfiguredInput(node: CanvasNode): boolean {\r\n if (node.kind !== 'ASK_USER') {\r\n return false;\r\n }\r\n return Boolean(node.data.name?.trim() || node.data.question?.trim());\r\n}\r\n\r\nfunction nextLibraryStepPosition(\r\n model: CanvasModel,\r\n selectedId: string | null,\r\n): { position: { x: number; y: number }; afterNodeId: string | null } {\r\n const GAP_X = 280;\r\n const GAP_Y = 140;\r\n const byId = new Map(model.nodes.map((node) => [node.id, node] as const));\r\n const outgoing = new Map<string, string[]>();\r\n const incomingCount = new Map<string, number>();\r\n\r\n for (const node of model.nodes) {\r\n outgoing.set(node.id, []);\r\n incomingCount.set(node.id, 0);\r\n }\r\n for (const edge of model.edges) {\r\n outgoing.set(edge.source, [...(outgoing.get(edge.source) ?? []), edge.target]);\r\n incomingCount.set(edge.target, (incomingCount.get(edge.target) ?? 0) + 1);\r\n }\r\n\r\n const selectedNode = selectedId ? (byId.get(selectedId) ?? null) : null;\r\n if (selectedNode) {\r\n return {\r\n position: { x: selectedNode.position.x + GAP_X, y: selectedNode.position.y },\r\n afterNodeId: selectedNode.id,\r\n };\r\n }\r\n\r\n const start = model.startNodeId && byId.has(model.startNodeId) ? model.startNodeId : (model.nodes[0]?.id ?? null);\r\n if (!start) {\r\n return { position: { x: 80, y: 120 }, afterNodeId: null };\r\n }\r\n\r\n let cursor = start;\r\n const visited = new Set<string>([cursor]);\r\n while (true) {\r\n const next = (outgoing.get(cursor) ?? []).find((target) => (incomingCount.get(target) ?? 0) <= 1);\r\n if (!next || visited.has(next)) {\r\n break;\r\n }\r\n visited.add(next);\r\n cursor = next;\r\n }\r\n\r\n const anchor = byId.get(cursor);\r\n if (!anchor) {\r\n return { position: { x: 80, y: 120 }, afterNodeId: null };\r\n }\r\n return {\r\n position: {\r\n x: anchor.position.x + GAP_X,\r\n y: anchor.position.y + (anchor.kind === 'DECISION' ? GAP_Y : 0),\r\n },\r\n afterNodeId: anchor.id,\r\n };\r\n}\r\n\r\nexport function WorkflowBuilder({\r\n capabilities,\r\n adapters,\r\n actions,\r\n theme,\r\n initialWorkflow,\r\n agentCatalog = [],\r\n}: WorkflowBuilderProps) {\r\n const seed = initialWorkflow ?? emptyWorkflow();\r\n const { state, dispatch, dirty } = useBuilderState(seed);\r\n const [pending, setPending] = useState<PendingState>({});\r\n const [errors, setErrors] = useState<ErrorState>({});\r\n const skipDraftSync = useRef(false);\r\n\r\n const initialCanvas = useMemo(\r\n () => (seed.steps.length > 0 ? workflowToCanvas(seed) : createInitialCanvasModel()),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps -- canvas seed is mount-only\r\n [],\r\n );\r\n\r\n const {\r\n model,\r\n setModel,\r\n setModelFromLoad,\r\n selectedId,\r\n setSelectedId,\r\n markClean,\r\n updateNodeData,\r\n appendNode,\r\n } = useCanvasState(initialCanvas);\r\n\r\n const { mode, setMode } = useBuilderMode(model, !initialWorkflow?.id);\r\n const { buildFromCanvas } = useWorkflowDraft();\r\n\r\n const resolvedAdapters = useMemo(\r\n () => ({\r\n validateWorkflow: adapters?.validateWorkflow ?? defaultValidateWorkflow,\r\n importBundle: adapters?.importBundle ?? importWorkflowFromFilePicker,\r\n exportBundle: adapters?.exportBundle ?? exportWorkflowBundle,\r\n }),\r\n [adapters],\r\n );\r\n\r\n useEffect(() => {\r\n if (skipDraftSync.current) {\r\n skipDraftSync.current = false;\r\n return;\r\n }\r\n const draft = canvasToWorkflow(model);\r\n dispatch({ type: 'SET_DRAFT', draft });\r\n }, [model, dispatch]);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n void Promise.resolve(resolvedAdapters.validateWorkflow(state.draft)).then((result) => {\r\n if (!cancelled) {\r\n dispatch({ type: 'SET_VALIDATION', validation: result });\r\n }\r\n });\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, [state.draft, resolvedAdapters, dispatch]);\r\n\r\n const clientValidation = useMemo(() => buildFromCanvas(model).validation, [buildFromCanvas, model]);\r\n const clientIssues = useMemo(() => flattenClientIssues(model, clientValidation), [clientValidation, model]);\r\n\r\n const issueCountByBackendStepId = useMemo(() => {\r\n const counts: Record<string, number> = {};\r\n for (const issue of clientIssues) {\r\n if (!issue.stepId) {\r\n continue;\r\n }\r\n counts[issue.stepId] = (counts[issue.stepId] ?? 0) + 1;\r\n }\r\n return counts;\r\n }, [clientIssues]);\r\n\r\n const runAction = useCallback(async (key: ActionKey, fn: () => Promise<void>) => {\r\n setPending((prev) => ({ ...prev, [key]: true }));\r\n setErrors((prev) => ({ ...prev, [key]: null }));\r\n try {\r\n await fn();\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Action failed';\r\n setErrors((prev) => ({ ...prev, [key]: message }));\r\n } finally {\r\n setPending((prev) => ({ ...prev, [key]: false }));\r\n }\r\n }, []);\r\n\r\n const handleImport = () =>\r\n runAction('import', async () => {\r\n const imported = await resolvedAdapters.importBundle();\r\n skipDraftSync.current = true;\r\n setModelFromLoad(workflowToCanvas(imported));\r\n dispatch({ type: 'SET_DRAFT', draft: imported });\r\n dispatch({ type: 'SET_BASELINE', baseline: imported });\r\n dispatch({\r\n type: 'SET_IMPORT_META',\r\n importMeta: { source: 'file', importedAt: new Date().toISOString() },\r\n });\r\n });\r\n\r\n const handleExport = () =>\r\n runAction('export', async () => {\r\n await resolvedAdapters.exportBundle(state.draft, 'json');\r\n });\r\n\r\n const handleSave = () =>\r\n runAction('save', async () => {\r\n if (!actions?.save) {\r\n throw new Error('Save action is not configured');\r\n }\r\n await actions.save(state.draft);\r\n dispatch({ type: 'SET_BASELINE', baseline: state.draft });\r\n markClean();\r\n });\r\n\r\n const handleRun = () =>\r\n runAction('run', async () => {\r\n if (!actions?.run) {\r\n throw new Error('Run action is not configured');\r\n }\r\n await actions.run(state.draft);\r\n });\r\n\r\n const handlePublish = () =>\r\n runAction('publish', async () => {\r\n if (!actions?.publish) {\r\n throw new Error('Publish action is not configured');\r\n }\r\n await actions.publish(state.draft);\r\n });\r\n\r\n const onAddStepFromLibrary = useCallback(\r\n (kind: NodeKind, options?: { patch?: Record<string, unknown> }) => {\r\n const { position, afterNodeId } = nextLibraryStepPosition(model, selectedId);\r\n const prefix: Record<NodeKind, string> = {\r\n ASK_USER: 'ask-user',\r\n AI_STEP: 'ai-step',\r\n AI_DEBATE: 'ai-debate',\r\n DECISION: 'decision',\r\n REPEAT: 'repeat',\r\n SAVE_RESULT: 'save-result',\r\n REUSE_WORKFLOW: 'reuse-wf',\r\n LOAD_RESOURCE: 'load-res',\r\n STOP: 'stop',\r\n RETRY: 'retry',\r\n };\r\n const backendStepId = newStepId(prefix[kind]);\r\n const id = `c-${backendStepId}`;\r\n const node = {\r\n id,\r\n backendStepId,\r\n kind,\r\n position,\r\n data: { ...defaultNodeData(kind), ...options?.patch },\r\n } as CanvasNode;\r\n setModel((m) => {\r\n const edge =\r\n afterNodeId && !m.edges.some((e) => e.source === afterNodeId && e.target === id)\r\n ? [\r\n {\r\n id: `e-${afterNodeId}-${id}-auto`,\r\n source: afterNodeId,\r\n target: id,\r\n sourceHandle: null,\r\n label: null,\r\n },\r\n ]\r\n : [];\r\n return {\r\n ...m,\r\n nodes: [...m.nodes, node],\r\n edges: [...m.edges, ...edge],\r\n startNodeId: m.startNodeId ?? id,\r\n };\r\n });\r\n setSelectedId(id);\r\n },\r\n [model, selectedId, setModel, setSelectedId],\r\n );\r\n\r\n const focusIssue = useCallback(\r\n (stepId?: string) => {\r\n if (!stepId) {\r\n return;\r\n }\r\n const node = model.nodes.find((n) => n.backendStepId === stepId);\r\n if (node) {\r\n setSelectedId(node.id);\r\n }\r\n },\r\n [model.nodes, setSelectedId],\r\n );\r\n\r\n const askUserNode = model.nodes.find((n) => n.kind === 'ASK_USER');\r\n const guidedStages = useMemo(\r\n () => [\r\n {\r\n label: GUIDED_STAGE_LABELS.addInput,\r\n complete: model.nodes.some((node) => node.kind === 'ASK_USER' && hasConfiguredInput(node)),\r\n actionLabel: GUIDED_STAGE_LABELS.configureInput,\r\n },\r\n {\r\n label: GUIDED_STAGE_LABELS.addAiStep,\r\n complete: model.nodes.some((node) => node.kind === 'AI_STEP' || node.kind === 'AI_DEBATE'),\r\n actionLabel: GUIDED_STAGE_LABELS.addAiStep,\r\n },\r\n {\r\n label: GUIDED_STAGE_LABELS.addApproval,\r\n complete: model.nodes.some((node) => hasApprovalTransition(node)),\r\n actionLabel: GUIDED_STAGE_LABELS.requireApproval,\r\n },\r\n {\r\n label: GUIDED_STAGE_LABELS.generateResult,\r\n complete: model.nodes.some((node) => node.kind === 'SAVE_RESULT' || node.kind === 'STOP'),\r\n actionLabel: GUIDED_STAGE_LABELS.addSaveStep,\r\n },\r\n ],\r\n [model.nodes],\r\n );\r\n\r\n const activeGuidedIndex = guidedStages.findIndex((stage) => !stage.complete);\r\n\r\n const onGuidedStageAction = useCallback(\r\n (index: number) => {\r\n switch (index) {\r\n case 0:\r\n if (askUserNode) {\r\n setSelectedId(askUserNode.id);\r\n }\r\n break;\r\n case 1:\r\n onAddStepFromLibrary('AI_STEP');\r\n break;\r\n case 2: {\r\n const aiNode = model.nodes.find((n) => n.kind === 'AI_STEP');\r\n if (aiNode) {\r\n updateNodeData(aiNode.id, { transition: 'HUMAN_APPROVAL' } as Partial<CanvasNode['data']>);\r\n setSelectedId(aiNode.id);\r\n } else {\r\n onAddStepFromLibrary('AI_STEP', { patch: { transition: 'HUMAN_APPROVAL' } });\r\n }\r\n break;\r\n }\r\n case 3:\r\n onAddStepFromLibrary('SAVE_RESULT');\r\n break;\r\n default:\r\n break;\r\n }\r\n },\r\n [askUserNode, model.nodes, onAddStepFromLibrary, setSelectedId, updateNodeData],\r\n );\r\n\r\n const rootStyle = theme?.variables\r\n ? ({ style: theme.variables as React.CSSProperties } as const)\r\n : undefined;\r\n\r\n const rootClass = ['workflow-builder', theme?.className].filter(Boolean).join(' ');\r\n const activeError = Object.values(errors).find((value) => value) ?? null;\r\n const subtitle = [\r\n dirty ? ACTION_LABELS.unsavedChanges : ACTION_LABELS.upToDate,\r\n state.validation.valid ? null : ACTION_LABELS.validationIssues,\r\n ]\r\n .filter(Boolean)\r\n .join(' · ');\r\n\r\n return (\r\n <div className={rootClass} data-testid=\"workflow-builder\" {...rootStyle}>\r\n <header className=\"workflow-builder__header\">\r\n <input\r\n className=\"workflow-builder__name-input\"\r\n value={model.workflowName}\r\n placeholder={ACTION_LABELS.workflowNamePlaceholder}\r\n aria-label={ACTION_LABELS.workflowNameLabel}\r\n onChange={(e) => setModel((m) => ({ ...m, workflowName: e.target.value }))}\r\n />\r\n <input\r\n className=\"workflow-builder__id-input\"\r\n value={model.workflowId}\r\n placeholder={ACTION_LABELS.workflowIdPlaceholder}\r\n aria-label={ACTION_LABELS.workflowIdLabel}\r\n onChange={(e) => setModel((m) => ({ ...m, workflowId: e.target.value }))}\r\n />\r\n <div className=\"workflow-builder__mode-toggle\" role=\"group\" aria-label=\"Builder mode\">\r\n <button\r\n type=\"button\"\r\n className={['wf-button', mode === 'guided' ? 'wf-button--primary' : 'wf-button--ghost'].join(' ')}\r\n onClick={() => setMode('guided')}\r\n >\r\n {ACTION_LABELS.guidedMode}\r\n </button>\r\n <button\r\n type=\"button\"\r\n className={['wf-button', mode === 'advanced' ? 'wf-button--primary' : 'wf-button--ghost'].join(' ')}\r\n onClick={() => setMode('advanced')}\r\n >\r\n {ACTION_LABELS.advancedMode}\r\n </button>\r\n </div>\r\n <ValidationPill model={model} clientIssues={clientIssues} onFix={focusIssue} />\r\n {capabilities.export ? (\r\n <button\r\n type=\"button\"\r\n className=\"wf-button wf-button--ghost\"\r\n disabled={pending.export}\r\n data-testid=\"workflow-builder-export\"\r\n onClick={() => void handleExport()}\r\n >\r\n {pending.export ? ACTION_LABELS.exporting : ACTION_LABELS.export}\r\n </button>\r\n ) : null}\r\n {capabilities.save ? (\r\n <button\r\n type=\"button\"\r\n className=\"wf-button wf-button--primary\"\r\n disabled={pending.save}\r\n data-testid=\"workflow-builder-save\"\r\n onClick={() => void handleSave()}\r\n >\r\n {pending.save ? ACTION_LABELS.saving : ACTION_LABELS.save}\r\n </button>\r\n ) : null}\r\n {capabilities.run ? (\r\n <button\r\n type=\"button\"\r\n className=\"wf-button wf-button--secondary\"\r\n disabled={pending.run}\r\n data-testid=\"workflow-builder-run\"\r\n onClick={() => void handleRun()}\r\n >\r\n {pending.run ? ACTION_LABELS.running : ACTION_LABELS.run}\r\n </button>\r\n ) : null}\r\n {capabilities.publish ? (\r\n <button\r\n type=\"button\"\r\n className=\"wf-button wf-button--primary\"\r\n disabled={pending.publish}\r\n data-testid=\"workflow-builder-publish\"\r\n onClick={() => void handlePublish()}\r\n >\r\n {pending.publish ? ACTION_LABELS.publishing : ACTION_LABELS.publish}\r\n </button>\r\n ) : null}\r\n {capabilities.aiAssist ? (\r\n <button\r\n type=\"button\"\r\n className=\"wf-button wf-button--secondary\"\r\n data-testid=\"workflow-builder-ai\"\r\n aria-label={ACTION_LABELS.aiAssist}\r\n >\r\n {ACTION_LABELS.aiAssist}\r\n </button>\r\n ) : null}\r\n <p className=\"workflow-builder__subtitle\">{subtitle}</p>\r\n </header>\r\n\r\n {model.unsupported ? (\r\n <div className=\"workflow-builder__banner workflow-builder__banner--warning\" role=\"status\">\r\n <p className=\"workflow-builder__banner-title\">{ACTION_LABELS.unsupportedBannerTitle}</p>\r\n {model.unsupportedReasons?.length ? (\r\n <ul className=\"workflow-builder__banner-list\">\r\n {model.unsupportedReasons.map((reason, index) => (\r\n <li key={index}>{reason}</li>\r\n ))}\r\n </ul>\r\n ) : null}\r\n </div>\r\n ) : null}\r\n\r\n <div className=\"workflow-builder__workspace\">\r\n {mode === 'guided' ? (\r\n <div className=\"workflow-builder__guided\">\r\n <GuidedStepper\r\n stages={guidedStages}\r\n activeIndex={activeGuidedIndex === -1 ? guidedStages.length - 1 : activeGuidedIndex}\r\n onStageAction={onGuidedStageAction}\r\n />\r\n </div>\r\n ) : null}\r\n\r\n <StepPalette\r\n mode={mode}\r\n onAddStep={(kind) => onAddStepFromLibrary(kind)}\r\n defaultCollapsed={mode !== 'advanced'}\r\n />\r\n\r\n <div className=\"workflow-builder__canvas\" data-testid=\"workflow-builder-canvas\">\r\n <WorkflowCanvas\r\n model={model}\r\n onModelChange={setModel}\r\n onSelectNode={setSelectedId}\r\n selectedId={selectedId}\r\n onAppend={appendNode}\r\n issueCountByBackendStepId={issueCountByBackendStepId}\r\n />\r\n </div>\r\n\r\n <StepConfigPanel\r\n model={model}\r\n selectedId={selectedId}\r\n mode={mode}\r\n onClose={() => setSelectedId(null)}\r\n onUpdateNodeData={updateNodeData}\r\n agentCatalog={agentCatalog}\r\n />\r\n </div>\r\n\r\n <div className=\"workflow-builder__actions\">\r\n {capabilities.import ? (\r\n <button\r\n type=\"button\"\r\n className=\"workflow-builder__button\"\r\n data-testid=\"workflow-builder-import\"\r\n disabled={pending.import}\r\n onClick={() => void handleImport()}\r\n >\r\n {pending.import ? ACTION_LABELS.importing : ACTION_LABELS.import}\r\n </button>\r\n ) : null}\r\n </div>\r\n\r\n {activeError ? (\r\n <p className=\"workflow-builder__status workflow-builder__status--error\" role=\"alert\">\r\n {activeError}\r\n </p>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n","// SPDX-License-Identifier: Apache-2.0\n\nimport '@xyflow/react/dist/style.css';\n\nimport { FlowEdge } from './edges/FlowEdge';\nimport { EmptyState } from './empty/EmptyState';\nimport { DecisionNode } from './nodes/DecisionNode';\nimport { LoopNode } from './nodes/LoopNode';\nimport { StepNode } from './nodes/StepNode';\nimport type { CanvasModel, CanvasNode } from '../model/canvasModel';\nimport type { NodeKind } from '../model/nodeKinds';\nimport { NODE_KIND_META } from '../model/nodeKinds';\nimport type { StepTransition } from '../api/types';\nimport { ACTION_LABELS, BUILDER_COPY } from '../copy/workflow-terminology';\nimport {\n Background,\n BackgroundVariant,\n Controls,\n type Connection,\n type Edge,\n type EdgeChange,\n MarkerType,\n type Node as FlowNode,\n MiniMap,\n NodeToolbar,\n type Node,\n type NodeChange,\n Position,\n ReactFlow,\n ReactFlowProvider,\n applyEdgeChanges,\n applyNodeChanges,\n useNodesInitialized,\n useReactFlow,\n} from '@xyflow/react';\nimport { useCallback, useEffect, useMemo } from 'react';\n\nconst SNAP = 16;\n\nfunction nodeTransition(node: CanvasNode): StepTransition | null {\n const data = node.data as { transition?: StepTransition };\n return data.transition ?? null;\n}\n\nfunction nodeNeedsApproval(node: CanvasNode): boolean {\n return nodeTransition(node) === 'HUMAN_APPROVAL';\n}\n\nfunction isStarterCanvas(model: CanvasModel): boolean {\n if (model.nodes.length !== 1 || model.edges.length > 0) {\n return false;\n }\n const only = model.nodes[0];\n return only?.kind === 'ASK_USER';\n}\n\nfunction toFlowNodes(\n model: CanvasModel,\n selectedId: string | null,\n issueCountByBackendStepId: Record<string, number>,\n): Node[] {\n return model.nodes.map((n) => {\n const loopBodyLabels =\n n.kind === 'REPEAT'\n ? model.nodes\n .filter((c) => c.parentNode === n.id)\n .map((c) => (c.data.name?.trim() ? c.data.name.trim() : NODE_KIND_META[c.kind].label))\n : undefined;\n const issueCount = n.backendStepId ? (issueCountByBackendStepId[n.backendStepId] ?? 0) : 0;\n return {\n id: n.id,\n type: n.kind === 'DECISION' ? 'decision' : n.kind === 'REPEAT' ? 'loop' : 'step',\n position: n.position,\n parentId: n.parentNode,\n extent: n.parentNode ? ('parent' as const) : undefined,\n data: {\n canvasNode: n,\n selected: selectedId === n.id,\n loopBodyLabels,\n issueCount,\n needsApproval: nodeNeedsApproval(n),\n },\n draggable: true,\n };\n });\n}\n\nfunction toFlowEdges(model: CanvasModel): Edge[] {\n const byId = new Map(model.nodes.map((n) => [n.id, n] as const));\n return model.edges.map((e) => {\n const source = byId.get(e.source);\n return {\n id: e.id,\n source: e.source,\n target: e.target,\n sourceHandle: e.sourceHandle ?? undefined,\n type: 'flow',\n data: { transition: source ? nodeTransition(source) : null },\n markerEnd: {\n type: MarkerType.ArrowClosed,\n width: 16,\n height: 16,\n color: 'var(--builder-color-edge)',\n },\n };\n });\n}\n\nconst nodeTypes = { step: StepNode, decision: DecisionNode, loop: LoopNode };\nconst edgeTypes = { flow: FlowEdge };\n\ntype InnerProps = {\n model: CanvasModel;\n onModelChange: (next: CanvasModel) => void;\n onSelectNode: (id: string | null) => void;\n selectedId: string | null;\n onAppend: (kind: NodeKind, position: { x: number; y: number }) => void;\n issueCountByBackendStepId: Record<string, number>;\n};\n\nfunction WorkflowCanvasInner({\n model,\n onModelChange,\n onSelectNode,\n selectedId,\n onAppend,\n issueCountByBackendStepId,\n}: InnerProps) {\n const { screenToFlowPosition, setCenter } = useReactFlow();\n const nodesInitialized = useNodesInitialized();\n const showStarterHint = isStarterCanvas(model);\n\n const flowNodes = useMemo(\n () => toFlowNodes(model, selectedId, issueCountByBackendStepId),\n [issueCountByBackendStepId, model, selectedId],\n );\n const flowEdges = useMemo(() => toFlowEdges(model), [model]);\n\n useEffect(() => {\n if (!selectedId || !nodesInitialized) {\n return;\n }\n const node = flowNodes.find((entry) => entry.id === selectedId);\n if (!node) {\n return;\n }\n const x = node.position.x + 120;\n const y = node.position.y + 60;\n void setCenter(x, y, { zoom: 1.05, duration: 250 });\n }, [flowNodes, nodesInitialized, selectedId, setCenter]);\n\n const onNodesChange = useCallback(\n (changes: NodeChange[]) => {\n const nextFlow = applyNodeChanges(changes, flowNodes);\n const ids = new Set(nextFlow.map((flowNode: Node) => flowNode.id));\n const nextNodes = model.nodes\n .filter((n) => ids.has(n.id))\n .map((n) => {\n const fn = nextFlow.find((flowNode: Node) => flowNode.id === n.id)!;\n return {\n ...n,\n position: fn.position,\n parentNode: fn.parentId,\n };\n });\n onModelChange({ ...model, nodes: nextNodes });\n },\n [flowNodes, model, onModelChange],\n );\n\n const onEdgesChange = useCallback(\n (changes: EdgeChange[]) => {\n const nextFlow = applyEdgeChanges(changes, flowEdges);\n onModelChange({\n ...model,\n edges: nextFlow.map((e: Edge) => ({\n id: e.id,\n source: e.source,\n target: e.target,\n sourceHandle: e.sourceHandle ?? null,\n label: null,\n })),\n });\n },\n [flowEdges, model, onModelChange],\n );\n\n const onNodesDelete = useCallback(\n (deletedNodes: FlowNode[]) => {\n if (deletedNodes.length === 0) {\n return;\n }\n const deletedIds = new Set(deletedNodes.map((node) => node.id));\n onModelChange({\n ...model,\n nodes: model.nodes.filter((node) => !deletedIds.has(node.id)),\n edges: model.edges.filter((edge) => !deletedIds.has(edge.source) && !deletedIds.has(edge.target)),\n });\n if (selectedId && deletedIds.has(selectedId)) {\n onSelectNode(null);\n }\n },\n [model, onModelChange, onSelectNode, selectedId],\n );\n\n const onEdgesDelete = useCallback(\n (deletedEdges: Edge[]) => {\n if (deletedEdges.length === 0) {\n return;\n }\n const deletedIds = new Set(deletedEdges.map((edge) => edge.id));\n onModelChange({\n ...model,\n edges: model.edges.filter((edge) => !deletedIds.has(edge.id)),\n });\n },\n [model, onModelChange],\n );\n\n const deleteSelectedNode = useCallback(() => {\n if (!selectedId) {\n return;\n }\n onModelChange({\n ...model,\n nodes: model.nodes.filter((node) => node.id !== selectedId),\n edges: model.edges.filter((edge) => edge.source !== selectedId && edge.target !== selectedId),\n });\n onSelectNode(null);\n }, [model, onModelChange, onSelectNode, selectedId]);\n\n const onConnect = useCallback(\n (conn: Connection) => {\n if (!conn.source || !conn.target) {\n return;\n }\n const id = `e-${conn.source}-${conn.target}-${conn.sourceHandle ?? 'src'}`;\n if (\n model.edges.some(\n (e) => e.source === conn.source && e.target === conn.target && (e.sourceHandle ?? '') === (conn.sourceHandle ?? ''),\n )\n ) {\n return;\n }\n onModelChange({\n ...model,\n edges: [\n ...model.edges,\n {\n id,\n source: conn.source,\n target: conn.target,\n sourceHandle: conn.sourceHandle ?? null,\n label: null,\n },\n ],\n });\n },\n [model, onModelChange],\n );\n\n const onDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'copy';\n }, []);\n\n const onDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n const kind = e.dataTransfer.getData('application/agentforge-node-kind') as NodeKind;\n if (!kind) {\n return;\n }\n const pos = screenToFlowPosition({ x: e.clientX, y: e.clientY });\n onAppend(kind, pos);\n },\n [onAppend, screenToFlowPosition],\n );\n\n const startNode = model.nodes.find((n) => n.id === model.startNodeId) ?? model.nodes[0];\n\n return (\n <div className=\"wf-canvas\" onDragOver={onDragOver} onDrop={onDrop}>\n <ReactFlow\n className=\"wf-canvas__flow\"\n nodes={flowNodes}\n edges={flowEdges}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onNodesDelete={onNodesDelete}\n onEdgesDelete={onEdgesDelete}\n onConnect={onConnect}\n onNodeClick={(_event, flowNode: Node) => onSelectNode(flowNode.id)}\n onPaneClick={() => onSelectNode(null)}\n snapToGrid\n snapGrid={[SNAP, SNAP]}\n fitView\n panOnDrag\n zoomOnPinch\n panOnScroll={false}\n zoomOnDoubleClick\n proOptions={{ hideAttribution: true }}\n >\n {selectedId ? (\n <NodeToolbar nodeId={selectedId} isVisible position={Position.Top} align=\"end\" offset={10}>\n <button\n type=\"button\"\n className=\"wf-button wf-button--icon wf-button--secondary\"\n aria-label={ACTION_LABELS.deleteNode}\n title={ACTION_LABELS.deleteNode}\n onClick={deleteSelectedNode}\n >\n ×\n </button>\n </NodeToolbar>\n ) : null}\n <Background variant={BackgroundVariant.Dots} gap={SNAP} size={1} color=\"var(--builder-color-canvas-dot)\" />\n <Controls className=\"wf-canvas__controls\" />\n <MiniMap pannable zoomable className=\"wf-canvas__minimap\" />\n </ReactFlow>\n {showStarterHint && startNode ? (\n <div className=\"wf-canvas__starter-overlay\">\n <div className=\"wf-canvas__starter-card\">\n <EmptyState\n icon={<span className=\"wf-canvas__starter-icon\" aria-hidden>◎</span>}\n title={BUILDER_COPY.startHere}\n description={NODE_KIND_META.ASK_USER.description}\n primaryAction={{\n label: ACTION_LABELS.selectStartStep,\n onClick: () => onSelectNode(startNode.id),\n }}\n secondaryAction={{\n label: BUILDER_COPY.useTemplate,\n onClick: () => {},\n }}\n />\n <p className=\"wf-canvas__starter-hint\">\n <button type=\"button\" className=\"wf-link-button\" onClick={() => {}}>\n {BUILDER_COPY.templateHint}\n </button>\n </p>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nexport type WorkflowCanvasProps = {\n model: CanvasModel;\n onModelChange: (next: CanvasModel) => void;\n onSelectNode: (id: string | null) => void;\n selectedId: string | null;\n onAppend: (kind: NodeKind, position: { x: number; y: number }) => void;\n issueCountByBackendStepId?: Record<string, number>;\n};\n\nexport function WorkflowCanvas({ issueCountByBackendStepId = {}, ...props }: WorkflowCanvasProps) {\n return (\n <ReactFlowProvider>\n <WorkflowCanvasInner {...props} issueCountByBackendStepId={issueCountByBackendStepId} />\n </ReactFlowProvider>\n );\n}\n","// SPDX-License-Identifier: Apache-2.0\n\nimport type { NodeKind } from '../model/nodeKinds';\n\nexport const NODE_LABELS: Record<NodeKind, string> = {\n ASK_USER: 'Ask a Question',\n AI_STEP: 'AI Step',\n AI_DEBATE: 'AI with Tools',\n DECISION: 'Decision',\n REPEAT: 'Loop / Repeat',\n REUSE_WORKFLOW: 'Reuse Existing Workflow',\n LOAD_RESOURCE: 'Load External Resource',\n STOP: 'Stop with Error',\n RETRY: 'Retry Previous Step',\n SAVE_RESULT: 'Save Result',\n};\n\nexport const NODE_DESCRIPTIONS: Record<NodeKind, string> = {\n ASK_USER: 'Collect input from the person running the workflow.',\n AI_STEP: 'Run an AI prompt and capture its output.',\n AI_DEBATE: 'Run an AI step that can call tools and external resources.',\n DECISION: 'Choose a path based on a condition.',\n REPEAT: 'Repeat a section of the workflow.',\n REUSE_WORKFLOW: 'Run another workflow as a step.',\n LOAD_RESOURCE: 'Reference an external resource (data, API, document).',\n STOP: 'Stop the workflow with an error message.',\n RETRY: 'Retry an earlier step.',\n SAVE_RESULT: \"Save the workflow's result.\",\n};\n\nexport const ACTION_LABELS = {\n validate: 'Check Workflow',\n validating: 'Checking...',\n clientValidation: 'Workflow Problems',\n serverValidation: 'Server Problems',\n reuseWorkflow: 'Reuse Existing Workflow',\n saveDraft: 'Save draft',\n save: 'Save',\n saving: 'Saving…',\n run: 'Run',\n running: 'Running…',\n publish: 'Publish',\n publishing: 'Publishing…',\n import: 'Import',\n importing: 'Importing…',\n export: 'Export',\n exporting: 'Exporting…',\n install: 'Install',\n downloadBundle: 'Download bundle',\n looksGood: 'Looks good',\n thingsToFix: (count: number) => (count === 1 ? '1 thing to fix' : `${count} things to fix`),\n unsavedChanges: 'Unsaved changes',\n upToDate: 'Up to date',\n validationIssues: 'Validation issues',\n builderTitle: 'Workflow Builder',\n aiAssist: 'Build with AI',\n guidedMode: 'Guided',\n advancedMode: 'Advanced',\n deleteNode: 'Delete node',\n selectStartStep: 'Select start step',\n fixIssue: 'Fix',\n workflowLooksGood: 'Workflow looks good',\n configureStepClose: 'Configure this step and close when done.',\n nameField: 'Name',\n typeField: 'Type',\n descriptionField: 'Description',\n questionField: 'Question',\n agentField: 'Agent',\n agentPlaceholder: 'Agent id',\n instructionsField: 'Instructions',\n approvalField: 'Approval',\n approvalAutomatic: 'Automatic',\n approvalReview: 'Requires human review',\n approvalRequired: 'Requires human approval',\n approvalHelp:\n \"When set to 'Requires human approval', the workflow pauses here for a person to review before continuing.\",\n basicsSection: 'Basics',\n inputsOutputsSection: 'Inputs / Outputs',\n behaviorSection: 'Behavior',\n advancedSection: 'Advanced',\n addField: 'Add field',\n resultNameField: 'Result name',\n resourcePathField: 'Resource path',\n resultContextKeyField: 'Result name (context key)',\n reasonField: 'Reason',\n targetStepField: 'Target step',\n fallbackTargetField: 'Fallback target',\n maxRetriesField: 'Max retries',\n maxAttemptsField: 'Max attempts',\n primaryAgentField: 'Primary agent',\n challengerAgentField: 'Challenger agent',\n maxRoundsField: 'Max rounds',\n resolutionInstructionsField: 'Resolution instructions',\n contextKeyField: 'Context key',\n contextKeyHint: 'Use the key of a value the previous step stored in context.',\n caseLabelPlaceholder: 'Case label',\n caseValuePlaceholder: 'Case value',\n connectsToField: 'Connects to',\n addCase: 'Add case',\n defaultBranchTargetField: 'Default branch target',\n loopModeField: 'Mode',\n maxIterationsField: 'Max iterations',\n listContextKeyField: 'List context key',\n evaluatorAgentField: 'Evaluator agent',\n maxIterationsActionField: 'When max iterations reached',\n loopBodyReadOnly:\n 'This step is inside a loop body. Nested editing is not ready yet, so its fields are read-only.',\n advancedStepsGuided: 'Advanced steps (for power users)',\n advancedSteps: 'Advanced steps',\n addStep: 'Add step',\n chooseStepDescription: 'Choose a step to add to your workflow.',\n selectPlaceholder: 'Select…',\n unsupportedBannerTitle:\n 'Some advanced workflow parts are shown read-only because editing support is not ready yet.',\n builderTipsTitle: 'Builder tips',\n builderTipSelect: 'Select a step to configure it in the side panel.',\n builderTipConnect: 'Drag from a connection port to link steps — arrows show execution order.',\n builderTipLibrary: 'Open the step library on the left to add more steps.',\n dismissTips: 'Dismiss builder tips',\n otherwiseBranch: 'Otherwise',\n loopBodyTitle: 'Loop body',\n loopBodyEmpty: 'Connect steps inside this loop.',\n workflowIdLabel: 'Workflow id',\n workflowNameLabel: 'Workflow name',\n workflowNamePlaceholder: 'Workflow name',\n workflowIdPlaceholder: 'workflow-id',\n modePickerTitle: 'How would you like to build?',\n modePickerGuidedHint: 'A simple checklist places each step on the canvas for you.',\n modePickerAdvancedHint: 'Full step library and every setting from the start.',\n validationDetailsDescription: 'Review problems and jump to the step that needs a fix.',\n formFieldsHint: 'Form fields are listed below; each needs a label and key.',\n fixedCountMode: 'Fixed count',\n forEachMode: 'For each item',\n agentSignalMode: 'Until AI says done',\n evaluatorMode: 'Evaluator says done',\n awaitUserAction: 'Ask user',\n failAction: 'Stop with error',\n okShort: 'OK',\n checkmarkOk: '✓ OK',\n};\n\nexport const BUILDER_COPY = {\n startHere: 'Start here — this step collects input from whoever runs the workflow.',\n useTemplate: 'Use a template',\n templateHint: 'Browse starter templates on the home page.',\n modePickerTitle: ACTION_LABELS.modePickerTitle,\n modePickerGuided: ACTION_LABELS.guidedMode,\n modePickerGuidedHint: ACTION_LABELS.modePickerGuidedHint,\n modePickerAdvanced: ACTION_LABELS.advancedMode,\n modePickerAdvancedHint: ACTION_LABELS.modePickerAdvancedHint,\n paletteTitle: 'Steps',\n expandPalette: 'Expand step library',\n collapsePalette: 'Collapse step library',\n validationDetails: 'Validation details',\n stepLibrary: 'Step library',\n};\n\nexport const EDGE_LABELS = {\n approvalGate: 'Approval',\n reviewGate: 'Review',\n};\n\nexport const NODE_STATUS_LABELS = {\n valid: 'Ready',\n hasIssues: 'Needs attention',\n needsApproval: 'Approval required',\n};\n\nexport const ISSUE_REWRITES: Record<string, string> = {\n 'workflow id is required': 'Add a workflow ID before validating.',\n 'workflow name is required': 'Give your workflow a name.',\n 'at least one step is required': 'Add at least one step to the workflow.',\n 'step name is required': 'Name this step so it is easier to understand.',\n 'must be >= 1': 'Use a value of 1 or more.',\n};\n\nexport const GUIDED_STAGE_LABELS = {\n addInput: 'Add input',\n configureInput: 'Configure input',\n addAiStep: 'Add AI step',\n addApproval: 'Add approval',\n requireApproval: 'Require approval',\n generateResult: 'Generate result',\n addSaveStep: 'Add save step',\n};\n","// SPDX-License-Identifier: Apache-2.0\n\nimport { EDGE_LABELS } from '../../copy/workflow-terminology';\nimport type { StepTransition } from '../../api/types';\nimport { BaseEdge, EdgeLabelRenderer, getBezierPath, type EdgeProps } from '@xyflow/react';\n\ntype FlowEdgeData = {\n transition?: StepTransition | null;\n};\n\nfunction edgeStroke(transition: StepTransition | null | undefined): string {\n if (transition === 'HUMAN_APPROVAL') {\n return 'var(--builder-color-edge-approval)';\n }\n if (transition === 'HUMAN_REVIEW') {\n return 'var(--builder-color-edge-review)';\n }\n return 'var(--builder-color-edge)';\n}\n\nfunction edgeDash(transition: StepTransition | null | undefined): string | undefined {\n if (transition === 'HUMAN_REVIEW') {\n return '6 4';\n }\n return undefined;\n}\n\nexport function FlowEdge({\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n selected,\n markerEnd,\n data,\n}: EdgeProps) {\n const transition = (data as FlowEdgeData | undefined)?.transition ?? null;\n const [path, labelX, labelY] = getBezierPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n });\n const stroke = edgeStroke(transition);\n const label =\n transition === 'HUMAN_APPROVAL'\n ? EDGE_LABELS.approvalGate\n : transition === 'HUMAN_REVIEW'\n ? EDGE_LABELS.reviewGate\n : null;\n\n return (\n <>\n <BaseEdge\n id={id}\n path={path}\n style={{\n strokeWidth: selected ? 2.75 : 2,\n stroke,\n strokeDasharray: edgeDash(transition),\n }}\n markerEnd={markerEnd}\n />\n {label ? (\n <EdgeLabelRenderer>\n <div\n className=\"wf-edge-label nodrag nopan\"\n style={{\n transform: `translate(-50%, -50%) translate(${labelX}px,${labelY}px)`,\n }}\n >\n {label}\n </div>\n </EdgeLabelRenderer>\n ) : null}\n </>\n );\n}\n","// SPDX-License-Identifier: Apache-2.0\n\nimport type { ReactNode } from 'react';\n\ntype EmptyStateProps = {\n icon?: ReactNode;\n title: string;\n description?: ReactNode;\n action?: ReactNode;\n primaryAction?: {\n label: string;\n onClick: () => void;\n };\n secondaryAction?: {\n label: string;\n onClick: () => void;\n };\n className?: string;\n};\n\nexport function EmptyState({\n icon,\n title,\n description,\n action,\n primaryAction,\n secondaryAction,\n className,\n}: EmptyStateProps) {\n const resolvedAction =\n action ??\n (primaryAction || secondaryAction ? (\n <div className=\"wf-empty-state__actions\">\n {primaryAction ? (\n <button type=\"button\" className=\"wf-button wf-button--primary\" onClick={primaryAction.onClick}>\n {primaryAction.label}\n </button>\n ) : null}\n {secondaryAction ? (\n <button type=\"button\" className=\"wf-button wf-button--secondary\" onClick={secondaryAction.onClick}>\n {secondaryAction.label}\n </button>\n ) : null}\n </div>\n ) : null);\n\n return (\n <div className={['wf-empty-state', className].filter(Boolean).join(' ')}>\n {icon ?? null}\n <p className=\"wf-empty-state__title\">{title}</p>\n {description ? <p className=\"wf-empty-state__description\">{description}</p> : null}\n {resolvedAction}\n </div>\n );\n}\n","// SPDX-License-Identifier: Apache-2.0\n\nimport { NODE_DESCRIPTIONS, NODE_LABELS } from '../copy/workflow-terminology';\n\nexport type NodeKind =\n | 'ASK_USER'\n | 'AI_STEP'\n | 'AI_DEBATE'\n | 'DECISION'\n | 'REPEAT'\n | 'REUSE_WORKFLOW'\n | 'LOAD_RESOURCE'\n | 'STOP'\n | 'RETRY'\n | 'SAVE_RESULT';\n\nexport type NodeKindMeta = {\n label: string;\n description: string;\n iconGlyph: string;\n advanced?: boolean;\n};\n\nexport const NODE_KIND_META: Record<NodeKind, NodeKindMeta> = {\n ASK_USER: {\n label: NODE_LABELS.ASK_USER,\n description: NODE_DESCRIPTIONS.ASK_USER,\n iconGlyph: '?',\n },\n AI_STEP: {\n label: NODE_LABELS.AI_STEP,\n description: NODE_DESCRIPTIONS.AI_STEP,\n iconGlyph: 'AI',\n },\n AI_DEBATE: {\n label: NODE_LABELS.AI_DEBATE,\n description: NODE_DESCRIPTIONS.AI_DEBATE,\n iconGlyph: 'DB',\n advanced: true,\n },\n DECISION: {\n label: NODE_LABELS.DECISION,\n description: NODE_DESCRIPTIONS.DECISION,\n iconGlyph: 'IF',\n },\n REPEAT: {\n label: NODE_LABELS.REPEAT,\n description: NODE_DESCRIPTIONS.REPEAT,\n iconGlyph: '↻',\n },\n REUSE_WORKFLOW: {\n label: NODE_LABELS.REUSE_WORKFLOW,\n description: NODE_DESCRIPTIONS.REUSE_WORKFLOW,\n iconGlyph: 'WF',\n },\n LOAD_RESOURCE: {\n label: NODE_LABELS.LOAD_RESOURCE,\n description: NODE_DESCRIPTIONS.LOAD_RESOURCE,\n iconGlyph: 'LD',\n advanced: true,\n },\n STOP: {\n label: NODE_LABELS.STOP,\n description: NODE_DESCRIPTIONS.STOP,\n iconGlyph: '!',\n advanced: true,\n },\n RETRY: {\n label: NODE_LABELS.RETRY,\n description: NODE_DESCRIPTIONS.RETRY,\n iconGlyph: 'RT',\n advanced: true,\n },\n SAVE_RESULT: {\n label: NODE_LABELS.SAVE_RESULT,\n description: NODE_DESCRIPTIONS.SAVE_RESULT,\n iconGlyph: 'SV',\n },\n};\n\nexport const LIBRARY_COMMON_KINDS: NodeKind[] = [\n 'ASK_USER',\n 'AI_STEP',\n 'DECISION',\n 'REPEAT',\n 'SAVE_RESULT',\n 'REUSE_WORKFLOW',\n];\n\nexport const LIBRARY_ADVANCED_KINDS: NodeKind[] = ['AI_DEBATE', 'LOAD_RESOURCE', 'STOP', 'RETRY'];\n","// SPDX-License-Identifier: Apache-2.0\n\nimport { NODE_STATUS_LABELS } from '../../copy/workflow-terminology';\nimport type { NodeKind } from '../../model/nodeKinds';\nimport { NODE_KIND_META } from '../../model/nodeKinds';\nimport type { ReactNode } from 'react';\n\nexport type NodeVisualVariant = 'step' | 'decision' | 'loop';\n\nexport type NodeChromeProps = {\n kind: NodeKind;\n variant?: NodeVisualVariant;\n title: string;\n subtitle: string;\n selected?: boolean;\n issueCount?: number;\n needsApproval?: boolean;\n children?: ReactNode;\n className?: string;\n};\n\nfunction StatusBadge({ issueCount, needsApproval }: { issueCount: number; needsApproval: boolean }) {\n if (issueCount > 0) {\n return (\n <span className=\"wf-node-badge wf-node-badge--error\">\n <span className=\"wf-node-badge__glyph\" aria-hidden>\n !\n </span>\n {NODE_STATUS_LABELS.hasIssues}\n </span>\n );\n }\n if (needsApproval) {\n return (\n <span className=\"wf-node-badge wf-node-badge--warning\">\n <span className=\"wf-node-badge__glyph\" aria-hidden>\n A\n </span>\n {NODE_STATUS_LABELS.needsApproval}\n </span>\n );\n }\n return (\n <span className=\"wf-node-badge wf-node-badge--success\">\n <span className=\"wf-node-badge__glyph\" aria-hidden>\n ✓\n </span>\n {NODE_STATUS_LABELS.valid}\n </span>\n );\n}\n\nexport function NodeChrome({\n kind,\n variant = 'step',\n title,\n subtitle,\n selected,\n issueCount = 0,\n needsApproval = false,\n children,\n className,\n}: NodeChromeProps) {\n const meta = NODE_KIND_META[kind];\n\n return (\n <div\n className={[\n 'wf-node',\n `wf-node--${variant}`,\n selected ? 'wf-node--selected' : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <div className=\"wf-node__header\">\n <span className=\"wf-node__icon\" aria-hidden>\n {meta.iconGlyph}\n </span>\n <div className=\"wf-node__titles\">\n <p className=\"wf-node__kind\">{meta.label}</p>\n <p className=\"wf-node__title\">{title}</p>\n </div>\n </div>\n <div className=\"wf-node__body\">\n <p className=\"wf-node__subtitle\">{subtitle}</p>\n <StatusBadge issueCount={issueCount} needsApproval={needsApproval && issueCount === 0} />\n </div>\n {children}\n </div>\n );\n}\n","// SPDX-License-Identifier: Apache-2.0\n\nimport { ACTION_LABELS } from '../../copy/workflow-terminology';\nimport { NodeChrome } from './NodeChrome';\nimport type { CanvasNode } from '../../model/canvasModel';\nimport { NODE_KIND_META } from '../../model/nodeKinds';\nimport { Handle, Position } from '@xyflow/react';\n\nexport type DecisionNodeProps = {\n data: {\n canvasNode: CanvasNode;\n selected?: boolean;\n issueCount?: number;\n };\n};\n\nexport function DecisionNode({ data }: DecisionNodeProps) {\n const { canvasNode: node, selected, issueCount = 0 } = data;\n if (node.kind !== 'DECISION') {\n return null;\n }\n const d = node.data;\n const meta = NODE_KIND_META.DECISION;\n const title = d.name?.trim() || meta.label;\n const handleClass = ['wf-handle', 'wf-handle--decision', selected ? 'wf-handle--selected' : ''].filter(Boolean).join(' ');\n\n return (\n <div className=\"wf-flow-node\">\n <Handle type=\"target\" position={Position.Top} className={handleClass} />\n <NodeChrome\n kind=\"DECISION\"\n variant=\"decision\"\n title={title}\n subtitle={d.contextKey?.trim() || meta.description}\n selected={selected}\n issueCount={issueCount}\n >\n <div className=\"wf-node__branches\">\n {d.cases.map((c) => (\n <div key={c.value} className=\"wf-node__branch\">\n <span className=\"wf-node__branch-label\">{c.label || c.value}</span>\n <Handle type=\"source\" position={Position.Right} id={c.value} className={handleClass} />\n </div>\n ))}\n <div className=\"wf-node__branch\">\n <span className=\"wf-node__branch-label\">{ACTION_LABELS.otherwiseBranch}</span>\n <Handle type=\"source\" position={Position.Right} id=\"default\" className={handleClass} />\n </div>\n </div>\n </NodeChrome>\n </div>\n );\n}\n","// SPDX-License-Identifier: Apache-2.0\n\nimport { ACTION_LABELS } from '../../copy/workflow-terminology';\nimport { NodeChrome } from './NodeChrome';\nimport type { CanvasNode } from '../../model/canvasModel';\nimport { NODE_KIND_META } from '../../model/nodeKinds';\nimport { Handle, Position } from '@xyflow/react';\n\nexport type LoopNodeProps = {\n data: {\n canvasNode: CanvasNode;\n selected?: boolean;\n issueCount?: number;\n loopBodyLabels?: string[];\n };\n};\n\nexport function LoopNode({ data }: LoopNodeProps) {\n const { canvasNode: node, selected, issueCount = 0, loopBodyLabels } = data;\n if (node.kind !== 'REPEAT') {\n return null;\n }\n const d = node.data;\n const meta = NODE_KIND_META.REPEAT;\n const title = d.name?.trim() || meta.label;\n const handleClass = ['wf-handle', 'wf-handle--loop', selected ? 'wf-handle--selected' : ''].filter(Boolean).join(' ');\n\n return (\n <div className=\"wf-flow-node\">\n <Handle type=\"target\" position={Position.Top} className={handleClass} />\n <NodeChrome\n kind=\"REPEAT\"\n variant=\"loop\"\n title={title}\n subtitle={`${d.strategy} · up to ${d.maxIterations} iteration${d.maxIterations === 1 ? '' : 's'}`}\n selected={selected}\n issueCount={issueCount}\n className=\"wf-node--loop-wide\"\n >\n <div className=\"wf-node__loop-body\">\n <p className=\"wf-node__loop-body-title\">{ACTION_LABELS.loopBodyTitle}</p>\n {loopBodyLabels && loopBodyLabels.length > 0 ? (\n <ul className=\"wf-node__loop-body-list\">\n {loopBodyLabels.map((label, i) => (\n <li key={`${label}-${i}`} className=\"wf-node__loop-body-item\">\n <span className=\"wf-node__loop-body-bullet\" aria-hidden />\n <span>{label}</span>\n </li>\n ))}\n </ul>\n ) : (\n <p className=\"wf-node__loop-body-empty\">{ACTION_LABELS.loopBodyEmpty}</p>\n )}\n </div>\n </NodeChrome>\n <Handle type=\"source\" position={Position.Bottom} className={handleClass} />\n </div>\n );\n}\n","// SPDX-License-Identifier: Apache-2.0\n\nimport { NodeChrome } from './NodeChrome';\nimport type { CanvasNode } from '../../model/canvasModel';\nimport { NODE_KIND_META } from '../../model/nodeKinds';\nimport { Handle, Position } from '@xyflow/react';\n\nexport type StepNodeProps = {\n data: {\n canvasNode: CanvasNode;\n selected?: boolean;\n issueCount?: number;\n needsApproval?: boolean;\n };\n};\n\nfunction subtitle(node: CanvasNode): string {\n switch (node.kind) {\n case 'ASK_USER': {\n const q = node.data.question?.trim() ?? '';\n return q.length > 48 ? `${q.slice(0, 48)}…` : q || NODE_KIND_META.ASK_USER.description;\n }\n case 'AI_STEP':\n return node.data.agentRef?.trim() || NODE_KIND_META.AI_STEP.description;\n case 'AI_DEBATE':\n return node.data.primaryAgentRef?.trim() || NODE_KIND_META.AI_DEBATE.description;\n case 'DECISION':\n return node.data.contextKey?.trim() || NODE_KIND_META.DECISION.description;\n case 'REPEAT':\n return `${node.data.strategy} · max ${node.data.maxIterations}`;\n case 'REUSE_WORKFLOW':\n return node.data.workflowRef?.trim() || NODE_KIND_META.REUSE_WORKFLOW.description;\n case 'LOAD_RESOURCE':\n return node.data.resourcePath?.trim() || NODE_KIND_META.LOAD_RESOURCE.description;\n case 'STOP':\n return node.data.reason?.trim() || NODE_KIND_META.STOP.description;\n case 'RETRY':\n return NODE_KIND_META.RETRY.description;\n case 'SAVE_RESULT':\n return node.data.resultName?.trim() || NODE_KIND_META.SAVE_RESULT.description;\n default:\n return '';\n }\n}\n\nexport function StepNode({ data }: StepNodeProps) {\n const { canvasNode: node, selected, issueCount = 0, needsApproval = false } = data;\n const meta = NODE_KIND_META[node.kind];\n const title = node.data.name?.trim() || meta.label;\n\n return (\n <div className=\"wf-flow-node\">\n <Handle type=\"target\" position={Position.Top} className={['wf-handle', selected ? 'wf-handle--selected' : ''].filter(Boolean).join(' ')} />\n <NodeChrome\n kind={node.kind}\n variant=\"step\"\n title={title}\n subtitle={subtitle(node)}\n selected={selected}\n issueCount={issueCount}\n needsApproval={needsApproval}\n />\n <Handle type=\"source\" position={Position.Bottom} className={['wf-handle', selected ? 'wf-handle--selected' : ''].filter(Boolean).join(' ')} />\n </div>\n );\n}\n","// SPDX-License-Identifier: Apache-2.0\n\nexport type GuidedStage = {\n label: string;\n complete: boolean;\n actionLabel?: string;\n};\n\ntype GuidedStepperProps = {\n stages: GuidedStage[];\n activeIndex: number;\n onStageAction?: (index: number) => void;\n};\n\nexport function GuidedStepper({ stages, activeIndex, onStageAction }: GuidedStepperProps) {\n return (\n <section className=\"wf-guided-stepper wf-panel\">\n <ol className=\"wf-guided-stepper__list\">\n {stages.map((stage, index) => {\n const isActive = index === activeIndex && !stage.complete;\n return (\n <li key={stage.label} className=\"wf-guided-stepper__item\">\n <span\n className={[\n 'wf-guided-stepper__marker',\n stage.complete ? 'wf-guided-stepper__marker--done' : '',\n isActive ? 'wf-guided-stepper__marker--active' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n aria-hidden\n >\n {stage.complete ? '✓' : '○'}\n </span>\n <div className=\"wf-guided-stepper__label\">\n <span\n className={[\n 'wf-guided-stepper__text',\n stage.complete ? 'wf-guided-stepper__text--done' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {index + 1}. {stage.label}\n </span>\n </div>\n {isActive && stage.actionLabel && onStageAction ? (\n <button\n type=\"button\"\n className=\"wf-button wf-button--secondary wf-guided-stepper__action\"\n onClick={() => onStageAction(index)}\n >\n {stage.actionLabel}\n </button>\n ) : null}\n </li>\n );\n })}\n </ol>\n </section>\n );\n}\n","// SPDX-License-Identifier: Apache-2.0\n\nimport type {\n AiDebateNodeData,\n AiStepNodeData,\n AskUserNodeData,\n CanvasEdge,\n CanvasModel,\n CanvasNode,\n DecisionNodeData,\n LoadResourceNodeData,\n NodeData,\n RepeatNodeData,\n RetryNodeData,\n ReuseWorkflowNodeData,\n SaveResultNodeData,\n StopNodeData,\n} from './canvasModel';\nimport type { NodeKind } from './nodeKinds';\nimport type {\n BlueprintJsonObject,\n BranchConfig,\n EditableArtifact,\n EditableArtifactItem,\n EditableStep,\n RetryPreviousConfig,\n StepTransition,\n TopLevelScheduleEntry,\n WorkflowDefinition,\n} from '../api/types';\nimport { NODE_LABELS } from '../copy/workflow-terminology';\nimport { customAlphabet } from 'nanoid';\n\nconst nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz0123456789', 10);\n\nfunction findStep(workflow: WorkflowDefinition, stepId: string): EditableStep | undefined {\n const t = stepId.trim();\n return workflow.steps.find((s) => s.stepId.trim() === t);\n}\n\nfunction retryPolicyNone(): Record<string, unknown> {\n return {\n allowRetry: false,\n allowRetryFromPrevious: false,\n allowAgentSwap: false,\n allowPromptOverride: false,\n maxAttempts: 0,\n };\n}\n\nfunction retryPolicySimple(maxAttempts: number): Record<string, unknown> {\n return {\n allowRetry: true,\n allowRetryFromPrevious: false,\n allowAgentSwap: false,\n allowPromptOverride: false,\n maxAttempts,\n };\n}\n\nexport function exportStepJson(workflow: WorkflowDefinition, step: EditableStep): Record<string, unknown> {\n return serializeStepExecutable(workflow, step);\n}\n\nfunction serializeStepExecutable(workflow: WorkflowDefinition, step: EditableStep): Record<string, unknown> {\n const cm = step.contextMapping ?? { inputKeys: [], outputKeys: [] };\n const body: Record<string, unknown> = {\n kind: 'STEP',\n stepId: step.stepId,\n name: step.name,\n behaviour: serializeBehaviour(workflow, step),\n contextMapping: {\n inputKeys: cm.inputKeys,\n outputKeys: cm.outputKeys,\n },\n };\n if (step.stepPrompt?.trim()) {\n body.stepPrompt = step.stepId;\n }\n return body;\n}\n\nfunction serializeBehaviour(workflow: WorkflowDefinition, step: EditableStep): Record<string, unknown> {\n switch (step.behaviourType) {\n case 'INPUT': {\n const config = step.config as { artifactId: string; transition: string };\n return {\n type: 'INPUT',\n artifactId: config.artifactId,\n transition: config.transition,\n };\n }\n case 'AGENT': {\n const config = step.config as { agentRef: string; transition: string; maxRetries?: number };\n const max = config.maxRetries ?? 0;\n return {\n type: 'AGENT',\n agentRef: config.agentRef,\n transition: config.transition,\n retryPolicy: max > 0 ? retryPolicySimple(max) : retryPolicyNone(),\n };\n }\n case 'SPAR': {\n const config = step.config as {\n agentRef: string;\n challengerAgentId: string;\n maxRounds: number;\n resolutionPrompt: string;\n transition: string;\n };\n return {\n type: 'SPAR',\n agentRef: config.agentRef,\n transition: config.transition,\n retryPolicy: retryPolicyNone(),\n sparConfig: {\n challengerAgentId: config.challengerAgentId,\n maxRounds: config.maxRounds,\n resolutionPrompt: config.resolutionPrompt,\n },\n };\n }\n case 'BRANCH': {\n const config = step.config as BranchConfig;\n const branches: Record<string, unknown> = {};\n for (const [value, targetId] of Object.entries(config.branches)) {\n const target = findStep(workflow, targetId);\n if (!target) {\n throw new Error(`Branch target missing: ${targetId}`);\n }\n branches[value] = serializeStepExecutable(workflow, target);\n }\n const def = findStep(workflow, config.defaultBranch);\n if (!def) {\n throw new Error(`Default branch target missing: ${config.defaultBranch}`);\n }\n return {\n type: 'BRANCH',\n contextKey: config.contextKey,\n branches,\n defaultBranch: serializeStepExecutable(workflow, def),\n };\n }\n case 'WORKFLOW_BEHAVIOUR': {\n const config = step.config as { workflowRef: string; transition: string };\n return {\n type: 'WORKFLOW',\n workflowRef: config.workflowRef,\n transition: config.transition,\n };\n }\n case 'RESOURCE': {\n const config = step.config as { resourcePath: string; contextKey: string; transition: string };\n return {\n type: 'RESOURCE',\n resourcePath: config.resourcePath,\n contextKey: config.contextKey,\n transition: config.transition,\n };\n }\n case 'FAIL': {\n const config = step.config as { reason: string };\n return { type: 'FAIL', reason: config.reason };\n }\n case 'RETRY_PREVIOUS': {\n const config = step.config as RetryPreviousConfig;\n const fallbackStep = config.fallback.trim() ? findStep(workflow, config.fallback) : undefined;\n const fallback =\n fallbackStep != null\n ? serializeStepExecutable(workflow, fallbackStep)\n : serializeStepExecutable(workflow, {\n stepId: `${step.stepId}-fallback-missing`,\n name: 'Missing fallback',\n behaviourType: 'FAIL',\n config: { reason: 'Retry fallback step was not configured.' },\n });\n return {\n type: 'RETRY_PREVIOUS',\n retryStepId: config.retryStepId,\n retryMode: config.retryMode,\n maxAttempts: config.maxAttempts,\n fallback,\n };\n }\n }\n}\n\nexport type BundleWorkflowDefinition = WorkflowDefinition;\n\nexport function newStepId(prefix: string): string {\n return `${prefix}-${nanoid()}`;\n}\n\nexport function defaultNodeData(kind: NodeKind): NodeData {\n switch (kind) {\n case 'ASK_USER':\n return {\n name: '',\n question: '',\n artifactItems: [\n { id: newStepId('item'), type: 'TEXT', label: 'Response', key: 'value', required: true },\n ],\n };\n case 'AI_STEP':\n return {\n name: '',\n agentRef: '',\n instructions: '',\n transition: 'AUTO',\n maxRetries: 0,\n };\n case 'AI_DEBATE':\n return {\n name: '',\n primaryAgentRef: '',\n challengerAgentRef: '',\n maxRounds: 2,\n resolutionPrompt: '',\n transition: 'AUTO',\n };\n case 'DECISION':\n return {\n name: '',\n contextKey: '',\n cases: [{ label: 'Yes', value: 'yes', targetNodeId: '' }],\n defaultTargetNodeId: '',\n };\n case 'REPEAT':\n return {\n name: '',\n strategy: 'FIXED_COUNT',\n maxIterations: 3,\n maxIterationsAction: 'AWAIT_USER',\n bodyNodeIds: [],\n };\n case 'SAVE_RESULT':\n return { name: '', resultName: '' };\n case 'REUSE_WORKFLOW':\n return { name: '', workflowRef: '', transition: 'AUTO' };\n case 'LOAD_RESOURCE':\n return { name: '', resourcePath: '/schema/', resultName: '', transition: 'AUTO' };\n case 'STOP':\n return { name: '', reason: '' };\n case 'RETRY':\n return {\n name: '',\n targetNodeId: '',\n maxAttempts: 3,\n fallbackTargetNodeId: '',\n retryMode: 'SINGLE_STEP',\n };\n }\n}\n\nfunction nodeById(model: CanvasModel): Map<string, CanvasNode> {\n return new Map(model.nodes.map((n) => [n.id, n]));\n}\n\nfunction outgoing(edges: CanvasEdge[], source: string, sourceHandle?: string | null): CanvasEdge[] {\n return edges.filter((e) => e.source === source && (sourceHandle == null ? true : e.sourceHandle === sourceHandle));\n}\n\n/** Nodes inside a repeat body (by parentNode chain). */\nfunction loopBodyNodeIds(model: CanvasModel): Set<string> {\n const ids = new Set<string>();\n for (const n of model.nodes) {\n if (n.parentNode) {\n const parent = model.nodes.find((p) => p.id === n.parentNode);\n if (parent?.kind === 'REPEAT') {\n ids.add(n.id);\n }\n }\n }\n return ids;\n}\n\nfunction collectBranchNestedIds(model: CanvasModel): Set<string> {\n const nested = new Set<string>();\n for (const n of model.nodes) {\n if (n.kind !== 'DECISION') {\n continue;\n }\n const d = n.data as DecisionNodeData;\n const mergeId = d.defaultTargetNodeId?.trim();\n if (!mergeId) {\n continue;\n }\n const visit = (start: string) => {\n const q = [start];\n const seen = new Set<string>();\n while (q.length) {\n const cur = q.pop()!;\n if (cur === mergeId || seen.has(cur)) {\n continue;\n }\n seen.add(cur);\n nested.add(cur);\n for (const e of outgoing(model.edges, cur)) {\n q.push(e.target);\n }\n }\n };\n for (const c of d.cases) {\n if (c.targetNodeId.trim()) {\n visit(c.targetNodeId.trim());\n }\n }\n }\n return nested;\n}\n\nfunction topoMainNodeOrder(model: CanvasModel, skip: Set<string>): string[] {\n const start = model.startNodeId;\n if (!start || skip.has(start)) {\n return [];\n }\n const nodes = model.nodes.filter((n) => !skip.has(n.id) && !n.parentNode);\n const ids = new Set(nodes.map((n) => n.id));\n const indeg = new Map<string, number>();\n for (const id of ids) {\n indeg.set(id, 0);\n }\n const adj = new Map<string, string[]>();\n for (const id of ids) {\n adj.set(id, []);\n }\n for (const e of model.edges) {\n if (!ids.has(e.source) || !ids.has(e.target)) {\n continue;\n }\n indeg.set(e.target, (indeg.get(e.target) ?? 0) + 1);\n adj.get(e.source)!.push(e.target);\n }\n const q: string[] = [];\n for (const [id, d] of indeg) {\n if (d === 0) {\n q.push(id);\n }\n }\n if (!q.includes(start)) {\n q.unshift(start);\n }\n const out: string[] = [];\n const seen = new Set<string>();\n while (q.length) {\n const cur = q.shift()!;\n if (seen.has(cur)) {\n continue;\n }\n seen.add(cur);\n out.push(cur);\n for (const nxt of adj.get(cur) ?? []) {\n const next = (indeg.get(nxt) ?? 0) - 1;\n indeg.set(nxt, next);\n if (next === 0) {\n q.push(nxt);\n }\n }\n }\n for (const id of ids) {\n if (!seen.has(id)) {\n out.push(id);\n }\n }\n return out;\n}\n\nfunction artifactFromAskUser(node: CanvasNode, artifactId: string): EditableArtifact {\n const d = node.data as AskUserNodeData;\n const items: EditableArtifactItem[] = (d.artifactItems ?? []).map((it) => ({\n id: it.key?.trim() || it.id,\n type: it.type,\n label: it.label,\n required: it.required,\n options: it.options,\n }));\n return { id: artifactId, items };\n}\n\nfunction canvasNodeToStep(\n node: CanvasNode,\n ctx: { artifactIdForAsk?: string; stepId: string },\n): EditableStep {\n const base = (name: string): EditableStep => ({\n stepId: ctx.stepId,\n name: name || 'Step',\n behaviourType: 'INPUT',\n config: { artifactId: '', transition: 'AUTO' },\n stepPrompt: '',\n contextMapping: { inputKeys: [], outputKeys: [] },\n });\n\n switch (node.kind) {\n case 'ASK_USER': {\n const d = node.data as AskUserNodeData;\n const artifactId = ctx.artifactIdForAsk ?? node.id;\n return {\n stepId: ctx.stepId,\n name: d.name || NODE_LABELS.ASK_USER,\n behaviourType: 'INPUT',\n config: { artifactId, transition: 'AUTO' },\n stepPrompt: '',\n contextMapping: { inputKeys: [], outputKeys: [] },\n };\n }\n case 'AI_STEP': {\n const d = node.data as AiStepNodeData;\n return {\n stepId: ctx.stepId,\n name: d.name || NODE_LABELS.AI_STEP,\n behaviourType: 'AGENT',\n config: {\n agentRef: d.agentRef,\n transition: d.transition,\n maxRetries: d.maxRetries,\n },\n stepPrompt: d.instructions,\n contextMapping: { inputKeys: [], outputKeys: [] },\n };\n }\n case 'AI_DEBATE': {\n const d = node.data as AiDebateNodeData;\n return {\n stepId: ctx.stepId,\n name: d.name || NODE_LABELS.AI_DEBATE,\n behaviourType: 'SPAR',\n config: {\n agentRef: d.primaryAgentRef,\n challengerAgentId: d.challengerAgentRef,\n maxRounds: d.maxRounds,\n resolutionPrompt: d.resolutionPrompt,\n transition: d.transition,\n },\n stepPrompt: '',\n contextMapping: { inputKeys: [], outputKeys: [] },\n };\n }\n case 'DECISION': {\n const d = node.data as DecisionNodeData;\n const branches: Record<string, string> = {};\n for (const c of d.cases) {\n if (c.value.trim() && c.targetNodeId.trim()) {\n branches[c.value.trim()] = c.targetNodeId.trim();\n }\n }\n return {\n stepId: ctx.stepId,\n name: d.name || 'Decision',\n behaviourType: 'BRANCH',\n config: {\n contextKey: d.contextKey,\n branches,\n defaultBranch: d.defaultTargetNodeId.trim(),\n },\n stepPrompt: '',\n contextMapping: { inputKeys: [], outputKeys: [] },\n };\n }\n case 'REUSE_WORKFLOW': {\n const d = node.data as ReuseWorkflowNodeData;\n return {\n stepId: ctx.stepId,\n name: d.name || NODE_LABELS.REUSE_WORKFLOW,\n behaviourType: 'WORKFLOW_BEHAVIOUR',\n config: { workflowRef: d.workflowRef, transition: d.transition },\n stepPrompt: '',\n contextMapping: { inputKeys: [], outputKeys: [] },\n };\n }\n case 'LOAD_RESOURCE': {\n const d = node.data as LoadResourceNodeData;\n return {\n stepId: ctx.stepId,\n name: d.name || NODE_LABELS.LOAD_RESOURCE,\n behaviourType: 'RESOURCE',\n config: {\n resourcePath: d.resourcePath,\n contextKey: d.resultName,\n transition: d.transition,\n },\n stepPrompt: '',\n contextMapping: { inputKeys: [], outputKeys: [] },\n };\n }\n case 'STOP': {\n const d = node.data as StopNodeData;\n return {\n stepId: ctx.stepId,\n name: d.name || NODE_LABELS.STOP,\n behaviourType: 'FAIL',\n config: { reason: d.reason },\n stepPrompt: '',\n contextMapping: { inputKeys: [], outputKeys: [] },\n };\n }\n case 'RETRY': {\n const d = node.data as RetryNodeData;\n return {\n stepId: ctx.stepId,\n name: d.name || NODE_LABELS.RETRY,\n behaviourType: 'RETRY_PREVIOUS',\n config: {\n retryStepId: d.targetNodeId,\n retryMode: d.retryMode,\n maxAttempts: d.maxAttempts,\n fallback: d.fallbackTargetNodeId,\n },\n stepPrompt: '',\n contextMapping: { inputKeys: [], outputKeys: [] },\n };\n }\n case 'SAVE_RESULT':\n case 'REPEAT':\n return base(node.data.name as string);\n default:\n return base('Step');\n }\n}\n\n/** Map canvas node id → backend step id (stable for session). */\nfunction buildCanvasToStepIdMap(model: CanvasModel): Map<string, string> {\n const map = new Map<string, string>();\n const prefixFor: Record<NodeKind, string> = {\n ASK_USER: 'ask-user',\n AI_STEP: 'ai-step',\n AI_DEBATE: 'ai-debate',\n DECISION: 'decision',\n REPEAT: 'repeat',\n SAVE_RESULT: 'save-result',\n REUSE_WORKFLOW: 'reuse-wf',\n LOAD_RESOURCE: 'load-res',\n STOP: 'stop',\n RETRY: 'retry',\n };\n for (const n of model.nodes) {\n map.set(n.id, n.backendStepId ?? newStepId(prefixFor[n.kind] ?? 'step'));\n }\n return map;\n}\n\nfunction buildBlueprintJsonForRepeat(\n model: CanvasModel,\n repeatNode: CanvasNode,\n canvasToStepId: Map<string, string>,\n artifacts: Record<string, EditableArtifact>,\n): BlueprintJsonObject {\n const d = repeatNode.data as RepeatNodeData;\n const byId = nodeById(model);\n const ordered = (d.bodyNodeIds?.length ? d.bodyNodeIds : model.nodes.filter((n) => n.parentNode === repeatNode.id).map((n) => n.id))\n .map((id) => byId.get(id))\n .filter((n): n is CanvasNode => Boolean(n));\n const innerEditable: EditableStep[] = [];\n for (const inner of ordered) {\n const sid = canvasToStepId.get(inner.id) ?? newStepId('inner');\n let artifactIdForAsk: string | undefined;\n if (inner.kind === 'ASK_USER') {\n artifactIdForAsk = `artifact-${sid}`;\n artifacts[artifactIdForAsk] = artifactFromAskUser(inner, artifactIdForAsk);\n }\n innerEditable.push(canvasNodeToStep(inner, { stepId: sid, artifactIdForAsk }));\n }\n const wfInner: WorkflowDefinition = {\n id: 'inline',\n name: '',\n description: '',\n steps: innerEditable,\n artifacts,\n };\n const innerSteps = innerEditable.map((s) => exportStepJson(wfInner, s));\n const loopConfig: Record<string, unknown> = {\n terminationStrategy: d.strategy,\n maxIterations: d.maxIterations,\n maxIterationsAction: d.maxIterationsAction,\n };\n if (d.strategy === 'FOR_EACH' && d.forEachKey?.trim()) {\n loopConfig.forEachContextKey = d.forEachKey.trim();\n }\n if (d.strategy === 'EVALUATOR' && d.evaluatorAgentId?.trim()) {\n loopConfig.evaluatorAgentId = d.evaluatorAgentId.trim();\n }\n const blueprintId = canvasToStepId.get(repeatNode.id) ?? newStepId('repeat');\n return {\n kind: 'BLUEPRINT',\n blueprintId,\n name: d.name || 'Repeat',\n behaviour: {\n loopConfig,\n transition: 'AUTO',\n },\n steps: innerSteps,\n };\n}\n\nexport function canvasToWorkflow(model: CanvasModel): BundleWorkflowDefinition {\n const canvasToStepId = buildCanvasToStepIdMap(model);\n const loopBodies = loopBodyNodeIds(model);\n const branchNested = collectBranchNestedIds(model);\n const skipForMainTopo = new Set([...loopBodies, ...branchNested]);\n const mainOrder = topoMainNodeOrder(model, skipForMainTopo);\n\n const artifacts: Record<string, EditableArtifact> = { ...model.artifacts };\n const steps: EditableStep[] = [];\n const blueprintBodies: Record<string, BlueprintJsonObject> = { ...model.blueprints };\n const topLevelSchedule: TopLevelScheduleEntry[] = [];\n\n const pushStepForNode = (node: CanvasNode) => {\n const sid = canvasToStepId.get(node.id)!;\n let artifactIdForAsk: string | undefined;\n if (node.kind === 'ASK_USER') {\n artifactIdForAsk = `artifact-${sid}`;\n artifacts[artifactIdForAsk] = artifactFromAskUser(node, artifactIdForAsk);\n }\n const st = canvasNodeToStep(node, { stepId: sid, artifactIdForAsk });\n if (node.kind === 'SAVE_RESULT') {\n const prev = steps[steps.length - 1];\n const d = node.data as SaveResultNodeData;\n if (prev && d.resultName.trim()) {\n prev.contextMapping = {\n inputKeys: prev.contextMapping?.inputKeys ?? [],\n outputKeys: [d.resultName.trim()],\n };\n }\n return;\n }\n steps.push(st);\n };\n\n for (const nid of mainOrder) {\n const node = model.nodes.find((n) => n.id === nid);\n if (!node) {\n continue;\n }\n if (node.kind === 'REPEAT') {\n const bpId = canvasToStepId.get(node.id)!;\n blueprintBodies[bpId] = buildBlueprintJsonForRepeat(model, node, canvasToStepId, artifacts);\n topLevelSchedule.push({ kind: 'BLUEPRINT_REF', blueprintId: bpId });\n continue;\n }\n if (node.kind === 'SAVE_RESULT') {\n pushStepForNode(node);\n continue;\n }\n const idx = steps.length;\n pushStepForNode(node);\n topLevelSchedule.push({ kind: 'STEP', stepIndex: idx });\n }\n\n for (const nid of branchNested) {\n const node = model.nodes.find((n) => n.id === nid);\n if (!node || node.kind === 'SAVE_RESULT') {\n continue;\n }\n pushStepForNode(node);\n }\n\n for (const st of steps) {\n if (st.behaviourType === 'BRANCH') {\n const c = st.config as BranchConfig;\n const mapBranches: Record<string, string> = {};\n for (const [k, targetCanvas] of Object.entries(c.branches)) {\n const tid = canvasToStepId.get(targetCanvas);\n mapBranches[k] = tid ?? targetCanvas;\n }\n const defTid = canvasToStepId.get(c.defaultBranch.trim()) ?? c.defaultBranch.trim();\n st.config = { ...c, branches: mapBranches, defaultBranch: defTid };\n }\n if (st.behaviourType === 'RETRY_PREVIOUS') {\n const c = st.config as RetryPreviousConfig;\n const fb = canvasToStepId.get(c.fallback.trim()) ?? c.fallback.trim();\n const rt = canvasToStepId.get(c.retryStepId.trim()) ?? c.retryStepId.trim();\n st.config = { ...c, retryStepId: rt, fallback: fb };\n }\n }\n\n return {\n id: model.workflowId.trim(),\n name: model.workflowName.trim(),\n description: model.description.trim(),\n steps,\n artifacts,\n blueprintBodies,\n topLevelSchedule,\n };\n}\n\nexport function workflowToCanvas(workflow: WorkflowDefinition): CanvasModel {\n const nodes: CanvasNode[] = [];\n const edges: CanvasEdge[] = [];\n let y = 0;\n const gap = 120;\n const stepToNode = new Map<string, string>();\n workflow.steps.forEach((s, i) => {\n stepToNode.set(s.stepId, `n-${i}`);\n });\n\n for (let i = 0; i < workflow.steps.length; i++) {\n const st = workflow.steps[i];\n const cid = `n-${i}`;\n let kind: NodeKind = 'AI_STEP';\n let data: NodeData = defaultNodeData('AI_STEP');\n if (st.behaviourType === 'INPUT') {\n kind = 'ASK_USER';\n const cfg = st.config as { artifactId: string };\n const art = workflow.artifacts[cfg.artifactId];\n data = {\n name: st.name,\n question: '',\n artifactItems:\n art?.items.map((it) => ({\n id: it.id,\n type: it.type,\n label: it.label,\n key: it.id,\n required: it.required,\n options: it.options,\n })) ?? [],\n } as NodeData;\n } else if (st.behaviourType === 'AGENT') {\n const cfg = st.config as { agentRef: string; transition: string; maxRetries?: number };\n data = {\n name: st.name,\n agentRef: cfg.agentRef,\n instructions: st.stepPrompt ?? '',\n transition: cfg.transition as StepTransition,\n maxRetries: cfg.maxRetries ?? 0,\n };\n } else if (st.behaviourType === 'BRANCH') {\n kind = 'DECISION';\n const cfg = st.config as BranchConfig;\n data = {\n name: st.name,\n contextKey: cfg.contextKey,\n cases: Object.entries(cfg.branches).map(([value, targetNodeId]) => ({\n label: value,\n value,\n targetNodeId: stepToNode.get(targetNodeId) ?? '',\n })),\n defaultTargetNodeId: stepToNode.get(cfg.defaultBranch) ?? '',\n };\n } else if (st.behaviourType === 'WORKFLOW_BEHAVIOUR') {\n kind = 'REUSE_WORKFLOW';\n const cfg = st.config as { workflowRef: string; transition: string };\n data = { name: st.name, workflowRef: cfg.workflowRef, transition: cfg.transition as 'AUTO' };\n } else if (st.behaviourType === 'RESOURCE') {\n kind = 'LOAD_RESOURCE';\n const cfg = st.config as { resourcePath: string; contextKey: string; transition: string };\n data = {\n name: st.name,\n resourcePath: cfg.resourcePath,\n resultName: cfg.contextKey,\n transition: cfg.transition as 'AUTO',\n };\n } else if (st.behaviourType === 'FAIL') {\n kind = 'STOP';\n const cfg = st.config as { reason: string };\n data = { name: st.name, reason: cfg.reason };\n } else if (st.behaviourType === 'RETRY_PREVIOUS') {\n kind = 'RETRY';\n const cfg = st.config as RetryPreviousConfig;\n data = {\n name: st.name,\n targetNodeId: stepToNode.get(cfg.retryStepId) ?? cfg.retryStepId,\n maxAttempts: cfg.maxAttempts,\n fallbackTargetNodeId: stepToNode.get(cfg.fallback) ?? cfg.fallback,\n retryMode: cfg.retryMode,\n };\n } else if (st.behaviourType === 'SPAR') {\n kind = 'AI_DEBATE';\n const cfg = st.config as {\n agentRef: string;\n challengerAgentId: string;\n maxRounds: number;\n resolutionPrompt: string;\n transition: string;\n };\n data = {\n name: st.name,\n primaryAgentRef: cfg.agentRef,\n challengerAgentRef: cfg.challengerAgentId,\n maxRounds: cfg.maxRounds,\n resolutionPrompt: cfg.resolutionPrompt,\n transition: cfg.transition as 'AUTO',\n };\n }\n nodes.push({ id: cid, backendStepId: st.stepId, kind, position: { x: 200, y }, data } as CanvasNode);\n y += gap;\n if (i > 0) {\n edges.push({\n id: `e-${i - 1}-${i}`,\n source: `n-${i - 1}`,\n target: cid,\n });\n }\n }\n\n const blueprintKeys = workflow.blueprintBodies ? Object.keys(workflow.blueprintBodies) : [];\n const unsupported = blueprintKeys.length > 0;\n const unsupportedReasons = unsupported\n ? [\n `${blueprintKeys.length} blueprint definition(s) are kept for export. The loop body is read-only here until nested editing is supported.`,\n ]\n : undefined;\n\n return {\n workflowId: workflow.id,\n workflowName: workflow.name,\n description: workflow.description,\n startNodeId: nodes[0]?.id ?? null,\n nodes,\n edges,\n artifacts: workflow.artifacts,\n blueprints: {},\n unsupported,\n unsupportedReasons,\n };\n}\n\n/** Host API workflow detail shape for optional import adapters. */\nexport type WorkflowDetailDto = {\n id: string;\n name: string;\n description?: string;\n steps?: Array<{\n kind: string;\n step?: {\n stepId: string;\n name: string;\n stepPrompt?: string;\n inputKeys?: string[];\n outputKeys?: string[];\n behaviour: Record<string, unknown> & { type: string };\n };\n blueprintRef?: { blueprintId: string };\n nestedWorkflow?: unknown;\n }>;\n artifacts?: Record<string, { items?: EditableArtifactItem[] }>;\n blueprints?: Record<string, unknown>;\n};\n\nfunction detailStr(value: unknown, fallback = ''): string {\n return typeof value === 'string' ? value : fallback;\n}\n\nfunction detailRecord(value: unknown): Record<string, string> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n return {};\n }\n const out: Record<string, string> = {};\n for (const [key, entry] of Object.entries(value as Record<string, unknown>)) {\n if (typeof entry === 'string') {\n out[key] = entry;\n }\n }\n return out;\n}\n\nexport function workflowDetailToCanvas(detail: WorkflowDetailDto): CanvasModel {\n const unsupportedReasons: string[] = [];\n for (const ex of detail.steps ?? []) {\n if (ex.kind !== 'STEP' || !ex.step) {\n if (ex.blueprintRef?.blueprintId) {\n unsupportedReasons.push(\n `Blueprint reference \"${ex.blueprintRef.blueprintId}\" in the main flow is read-only here until editing support is ready.`,\n );\n } else if (ex.kind === 'WORKFLOW' && ex.nestedWorkflow) {\n unsupportedReasons.push('A nested workflow in the main flow is read-only here until editing support is ready.');\n } else {\n unsupportedReasons.push(\n `Executable of kind \"${ex.kind}\" in the main flow is read-only here until editing support is ready.`,\n );\n }\n }\n }\n const blueprintCount = Object.keys(detail.blueprints ?? {}).length;\n if (blueprintCount > 0) {\n unsupportedReasons.push(\n `${blueprintCount} blueprint definition(s) on this workflow are preserved for export; the canvas shows top-level steps only.`,\n );\n }\n const unsupported = unsupportedReasons.length > 0;\n const wf = {\n id: detail.id,\n name: detail.name,\n description: detail.description ?? '',\n steps: [] as EditableStep[],\n artifacts: {} as Record<string, EditableArtifact>,\n };\n for (const ex of detail.steps ?? []) {\n if (ex.kind !== 'STEP' || !ex.step) {\n continue;\n }\n const s = ex.step;\n const b = s.behaviour;\n const type = b.type;\n const base: EditableStep = {\n stepId: s.stepId,\n name: s.name,\n behaviourType: 'INPUT',\n config: { artifactId: '', transition: 'AUTO' },\n stepPrompt: s.stepPrompt ?? '',\n contextMapping: {\n inputKeys: s.inputKeys ?? [],\n outputKeys: s.outputKeys ?? [],\n },\n };\n if (type === 'INPUT') {\n base.behaviourType = 'INPUT';\n base.config = {\n artifactId: detailStr(b.artifactId),\n transition: detailStr(b.transition, 'AUTO') as 'AUTO',\n };\n } else if (type === 'AGENT') {\n base.behaviourType = 'AGENT';\n base.config = {\n agentRef: detailStr(b.agentRef),\n transition: detailStr(b.transition, 'AUTO') as 'AUTO',\n maxRetries: (b.retryPolicy as { maxAttempts?: number } | null)?.maxAttempts ?? 0,\n };\n } else if (type === 'WORKFLOW') {\n base.behaviourType = 'WORKFLOW_BEHAVIOUR';\n base.config = {\n workflowRef: detailStr(b.workflowRef),\n transition: detailStr(b.transition, 'AUTO') as 'AUTO',\n };\n } else if (type === 'BRANCH') {\n base.behaviourType = 'BRANCH';\n base.config = {\n contextKey: detailStr(b.contextKey),\n branches: detailRecord(b.branchTargets),\n defaultBranch: detailStr(b.defaultBranchTargetId),\n };\n } else if (type === 'RESOURCE') {\n base.behaviourType = 'RESOURCE';\n base.config = {\n resourcePath: detailStr(b.resourcePath, '/schema/'),\n contextKey: detailStr(b.contextKey),\n transition: detailStr(b.transition, 'AUTO') as 'AUTO',\n };\n } else if (type === 'FAIL') {\n base.behaviourType = 'FAIL';\n base.config = { reason: detailStr((b as { reason?: unknown }).reason) };\n } else if (type === 'RETRY_PREVIOUS') {\n base.behaviourType = 'RETRY_PREVIOUS';\n base.config = {\n retryStepId: detailStr((b as { retryStepId?: unknown }).retryStepId),\n retryMode: 'SINGLE_STEP',\n maxAttempts: (b as { maxAttempts?: number }).maxAttempts ?? 1,\n fallback: detailStr((b as { fallback?: unknown }).fallback),\n };\n } else if (type === 'SPAR') {\n base.behaviourType = 'SPAR';\n const sc = (b.sparConfig as { challengerAgentId?: string; maxRounds?: number; resolutionPrompt?: string }) ?? {};\n base.config = {\n agentRef: detailStr(b.agentRef),\n challengerAgentId: sc.challengerAgentId ?? '',\n maxRounds: sc.maxRounds ?? 1,\n resolutionPrompt: sc.resolutionPrompt ?? '',\n transition: detailStr(b.transition, 'AUTO') as 'AUTO',\n };\n }\n wf.steps.push(base);\n }\n for (const [k, v] of Object.entries(detail.artifacts ?? {})) {\n const a = v as { items?: EditableArtifactItem[] };\n wf.artifacts[k] = { id: k, items: Array.isArray(a.items) ? a.items : [] };\n }\n const model = workflowToCanvas(wf as WorkflowDefinition);\n return {\n ...model,\n unsupported,\n unsupportedReasons: unsupported ? unsupportedReasons : undefined,\n };\n}\n","// SPDX-License-Identifier: Apache-2.0\n\nimport type { CanvasModel, CanvasNode, NodeData } from '../model/canvasModel';\nimport { defaultNodeData, newStepId } from '../model/mapper';\nimport type { NodeKind } from '../model/nodeKinds';\nimport { useCallback, useState } from 'react';\n\nexport function createInitialCanvasModel(): CanvasModel {\n const backendStepId = newStepId('ask-user');\n const id = `c-${backendStepId}`;\n return {\n workflowId: '',\n workflowName: '',\n description: '',\n startNodeId: id,\n nodes: [\n {\n id,\n backendStepId,\n kind: 'ASK_USER',\n position: { x: 80, y: 120 },\n data: defaultNodeData('ASK_USER'),\n } as CanvasNode,\n ],\n edges: [],\n artifacts: {},\n blueprints: {},\n };\n}\n\nexport function useCanvasState(initialModel: CanvasModel) {\n const [model, setModel] = useState<CanvasModel>(initialModel);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [isDirty, setIsDirty] = useState(false);\n\n const markDirty = useCallback(() => {\n setIsDirty(true);\n }, []);\n\n const markClean = useCallback(() => {\n setIsDirty(false);\n }, []);\n\n const setModelFromLoad = useCallback((next: CanvasModel | ((prev: CanvasModel) => CanvasModel)) => {\n setModel((current) => (typeof next === 'function' ? (next as (prev: CanvasModel) => CanvasModel)(current) : next));\n setIsDirty(false);\n }, []);\n\n const setModelDirty = useCallback((next: CanvasModel | ((prev: CanvasModel) => CanvasModel)) => {\n setModel((current) => (typeof next === 'function' ? (next as (prev: CanvasModel) => CanvasModel)(current) : next));\n setIsDirty(true);\n }, []);\n\n const updateNodeData = useCallback(\n (id: string, partial: Partial<NodeData>) => {\n setModelDirty((m) => ({\n ...m,\n nodes: m.nodes.map((n) => {\n if (n.id !== id) {\n return n;\n }\n return { ...n, data: { ...n.data, ...partial } } as CanvasNode;\n }),\n }));\n },\n [setModelDirty],\n );\n\n const appendNode = useCallback(\n (kind: NodeKind, position: { x: number; y: number }) => {\n const prefix: Record<NodeKind, string> = {\n ASK_USER: 'ask-user',\n AI_STEP: 'ai-step',\n AI_DEBATE: 'ai-debate',\n DECISION: 'decision',\n REPEAT: 'repeat',\n SAVE_RESULT: 'save-result',\n REUSE_WORKFLOW: 'reuse-wf',\n LOAD_RESOURCE: 'load-res',\n STOP: 'stop',\n RETRY: 'retry',\n };\n const backendStepId = newStepId(prefix[kind]);\n const id = `c-${backendStepId}`;\n const node = {\n id,\n backendStepId,\n kind,\n position,\n data: defaultNodeData(kind),\n } as CanvasNode;\n setModelDirty((m) => ({\n ...m,\n nodes: [...m.nodes, node],\n startNodeId: m.startNodeId ?? id,\n }));\n setSelectedId(id);\n },\n [setModelDirty],\n );\n\n return {\n model,\n setModel: setModelDirty,\n setModelFromLoad,\n selectedId,\n setSelectedId,\n isDirty,\n markDirty,\n markClean,\n updateNodeData,\n appendNode,\n };\n}\n","// SPDX-License-Identifier: Apache-2.0\n\nimport type { CanvasModel } from '../model/canvasModel';\nimport { useCallback, useState } from 'react';\n\nexport type BuilderMode = 'guided' | 'advanced';\n\nconst BUILDER_MODE_KEY = 'agentforge_builder_mode';\n\nfunction isUntouchedStarter(model: CanvasModel): boolean {\n if (model.nodes.length !== 1) {\n return false;\n }\n const starter = model.nodes[0];\n if (starter.kind !== 'ASK_USER') {\n return false;\n }\n return (\n !model.workflowId.trim() &&\n !model.workflowName.trim() &&\n !model.description.trim() &&\n !starter.data.name.trim() &&\n !starter.data.question.trim()\n );\n}\n\nexport function readStoredBuilderMode(): BuilderMode | null {\n if (typeof window === 'undefined') {\n return null;\n }\n const value = window.localStorage.getItem(BUILDER_MODE_KEY);\n if (value === 'guided' || value === 'advanced') {\n return value;\n }\n return null;\n}\n\nexport function isUntouchedStarterCanvas(model: CanvasModel): boolean {\n return isUntouchedStarter(model);\n}\n\nexport function useBuilderMode(model: CanvasModel, isNewRoute: boolean) {\n const [mode, setMode] = useState<BuilderMode>(() => {\n const stored = readStoredBuilderMode();\n if (stored) {\n return stored;\n }\n if (isNewRoute && isUntouchedStarter(model)) {\n return 'guided';\n }\n return 'advanced';\n });\n\n const setAndPersistMode = useCallback((nextMode: BuilderMode) => {\n setMode(nextMode);\n if (typeof window !== 'undefined') {\n window.localStorage.setItem(BUILDER_MODE_KEY, nextMode);\n }\n }, []);\n\n return { mode, setMode: setAndPersistMode };\n}\n","// SPDX-License-Identifier: Apache-2.0\r\n\r\nimport type {\r\n BranchConfig,\r\n EditableArtifactItem,\r\n RetryPreviousConfig,\r\n ValidationIssue,\r\n ValidationResult,\r\n WorkflowDefinition,\r\n} from '../api/types';\r\n\r\nconst ID_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\r\n\r\ntype EditorValidation = {\r\n workflow: Partial<Record<'id' | 'name' | 'description', string>>;\r\n steps: Record<number, Partial<Record<string, string>>>;\r\n artifacts: Record<string, Partial<Record<string, string>>>;\r\n global: string[];\r\n};\r\n\r\nfunction hasOptions(item: EditableArtifactItem): boolean {\r\n if (item.type !== 'SINGLE_CHOICE' && item.type !== 'MULTI_CHOICE') {\r\n return true;\r\n }\r\n return Boolean(item.options?.some((o) => o.trim().length > 0));\r\n}\r\n\r\nfunction collectNestedOnlyStepIds(workflow: WorkflowDefinition): Set<string> {\r\n const nested = new Set<string>();\r\n for (const step of workflow.steps) {\r\n if (step.behaviourType === 'BRANCH') {\r\n const c = step.config as BranchConfig;\r\n Object.values(c.branches).forEach((id) => {\r\n if (id.trim()) {\r\n nested.add(id.trim());\r\n }\r\n });\r\n if (c.defaultBranch.trim()) {\r\n nested.add(c.defaultBranch.trim());\r\n }\r\n }\r\n if (step.behaviourType === 'RETRY_PREVIOUS') {\r\n const c = step.config as RetryPreviousConfig;\r\n if (c.fallback.trim()) {\r\n nested.add(c.fallback.trim());\r\n }\r\n }\r\n }\r\n return nested;\r\n}\r\n\r\nfunction validateEditableWorkflow(workflow: WorkflowDefinition): EditorValidation {\r\n const errors: EditorValidation = {\r\n workflow: {},\r\n steps: {},\r\n artifacts: {},\r\n global: [],\r\n };\r\n\r\n if (!workflow.id.trim()) {\r\n errors.workflow.id = 'Workflow id is required.';\r\n } else if (!ID_PATTERN.test(workflow.id.trim())) {\r\n errors.workflow.id = 'Workflow id must use lowercase letters, numbers, and dashes.';\r\n }\r\n if (!workflow.name.trim()) {\r\n errors.workflow.name = 'Workflow name is required.';\r\n }\r\n if (workflow.steps.length === 0) {\r\n errors.global.push('At least one step is required.');\r\n }\r\n\r\n if (workflow.topLevelSchedule && workflow.topLevelSchedule.length > 0) {\r\n const nestedOnly = collectNestedOnlyStepIds(workflow);\r\n workflow.topLevelSchedule.forEach((entry, scheduleIndex) => {\r\n if (entry.kind === 'STEP') {\r\n if (!Number.isInteger(entry.stepIndex) || entry.stepIndex < 0 || entry.stepIndex >= workflow.steps.length) {\r\n errors.global.push(`Top-level schedule entry ${scheduleIndex}: invalid step index ${entry.stepIndex}.`);\r\n } else {\r\n const st = workflow.steps[entry.stepIndex];\r\n if (st && nestedOnly.has(st.stepId.trim())) {\r\n errors.global.push(\r\n `Top-level schedule entry ${scheduleIndex}: step \"${st.stepId}\" is nested-only and cannot appear in the main schedule.`,\r\n );\r\n }\r\n }\r\n } else if (entry.kind === 'BLUEPRINT_REF') {\r\n if (!entry.blueprintId?.trim()) {\r\n errors.global.push(`Top-level schedule entry ${scheduleIndex}: blueprint id is required.`);\r\n }\r\n }\r\n });\r\n }\r\n\r\n const seenStepIds = new Set<string>();\r\n workflow.steps.forEach((step, index) => {\r\n const stepErrors: Partial<Record<string, string>> = {};\r\n if (!step.stepId.trim()) {\r\n stepErrors.stepId = 'Step id is required.';\r\n } else if (!ID_PATTERN.test(step.stepId.trim())) {\r\n stepErrors.stepId = 'Step id must use lowercase letters, numbers, and dashes.';\r\n } else if (seenStepIds.has(step.stepId.trim())) {\r\n stepErrors.stepId = 'Step id must be unique.';\r\n } else {\r\n seenStepIds.add(step.stepId.trim());\r\n }\r\n\r\n if (!step.name.trim()) {\r\n stepErrors.name = 'Step name is required.';\r\n }\r\n\r\n if (step.behaviourType === 'INPUT') {\r\n const config = step.config as { artifactId: string };\r\n if (!config.artifactId.trim()) {\r\n stepErrors.artifactId = 'Artifact id is required for INPUT steps.';\r\n } else if (!workflow.artifacts[config.artifactId]) {\r\n stepErrors.artifactId = `Artifact \"${config.artifactId}\" does not exist.`;\r\n }\r\n }\r\n\r\n if (step.behaviourType === 'AGENT') {\r\n const config = step.config as { agentRef: string };\r\n if (!config.agentRef.trim()) {\r\n stepErrors.agentRef = 'agentRef is required.';\r\n }\r\n }\r\n\r\n if (step.behaviourType === 'SPAR') {\r\n const config = step.config as {\r\n agentRef: string;\r\n challengerAgentId: string;\r\n maxRounds: number;\r\n resolutionPrompt: string;\r\n };\r\n if (!config.agentRef.trim()) {\r\n stepErrors.agentRef = 'agentRef is required.';\r\n }\r\n if (!config.challengerAgentId.trim()) {\r\n stepErrors.challengerAgentId = 'challengerAgentId is required.';\r\n }\r\n if (!config.resolutionPrompt.trim()) {\r\n stepErrors.resolutionPrompt = 'resolutionPrompt is required.';\r\n }\r\n if (!Number.isFinite(config.maxRounds) || config.maxRounds < 1) {\r\n stepErrors.maxRounds = 'maxRounds must be >= 1.';\r\n }\r\n }\r\n\r\n if (step.behaviourType === 'RESOURCE') {\r\n const config = step.config as { resourcePath: string; contextKey: string };\r\n if (!config.resourcePath.startsWith('/schema/')) {\r\n stepErrors.resourcePath = 'resourcePath must start with /schema/.';\r\n }\r\n if (!config.contextKey.trim()) {\r\n stepErrors.contextKey = 'contextKey is required.';\r\n }\r\n }\r\n\r\n if (step.behaviourType === 'WORKFLOW_BEHAVIOUR') {\r\n const config = step.config as { workflowRef: string };\r\n if (!config.workflowRef.trim()) {\r\n stepErrors.workflowRef = 'workflowRef is required.';\r\n }\r\n }\r\n\r\n if (step.behaviourType === 'FAIL') {\r\n const config = step.config as { reason: string };\r\n if (!config.reason.trim()) {\r\n stepErrors.reason = 'reason is required.';\r\n }\r\n }\r\n\r\n if (step.behaviourType === 'BRANCH') {\r\n const config = step.config as BranchConfig;\r\n if (!config.contextKey.trim()) {\r\n stepErrors.contextKey = 'Branch context key is required.';\r\n }\r\n const resolveId = (id: string) => workflow.steps.some((s) => s.stepId.trim() === id.trim());\r\n for (const [key, targetId] of Object.entries(config.branches)) {\r\n if (!targetId.trim()) {\r\n stepErrors[`branch-${key}`] = 'Branch target step id is required.';\r\n } else if (!resolveId(targetId)) {\r\n stepErrors[`branch-${key}`] = `No step with id \"${targetId}\".`;\r\n }\r\n }\r\n if (!config.defaultBranch.trim()) {\r\n stepErrors.defaultBranch = 'Default branch target step id is required.';\r\n } else if (!resolveId(config.defaultBranch)) {\r\n stepErrors.defaultBranch = `No step with id \"${config.defaultBranch}\".`;\r\n }\r\n }\r\n\r\n if (step.behaviourType === 'RETRY_PREVIOUS') {\r\n const config = step.config as RetryPreviousConfig;\r\n if (!config.retryStepId.trim()) {\r\n stepErrors.retryStepId = 'retryStepId is required.';\r\n }\r\n if (!Number.isFinite(config.maxAttempts) || config.maxAttempts < 1) {\r\n stepErrors.maxAttempts = 'maxAttempts must be >= 1.';\r\n }\r\n if (config.fallback.trim() && !workflow.steps.some((s) => s.stepId.trim() === config.fallback.trim())) {\r\n stepErrors.fallback = `No step with id \"${config.fallback}\".`;\r\n }\r\n }\r\n\r\n if (Object.keys(stepErrors).length > 0) {\r\n errors.steps[index] = stepErrors;\r\n }\r\n });\r\n\r\n for (const [artifactId, artifact] of Object.entries(workflow.artifacts)) {\r\n const artifactErrors: Partial<Record<string, string>> = {};\r\n if (!artifactId.trim()) {\r\n artifactErrors.id = 'Artifact id is required.';\r\n }\r\n if (artifact.items.length === 0) {\r\n artifactErrors.items = 'Artifact must contain at least one item.';\r\n }\r\n artifact.items.forEach((item, index) => {\r\n if (!item.id.trim()) {\r\n artifactErrors[`item-${index}-id`] = 'Item id is required.';\r\n }\r\n if (!item.label.trim()) {\r\n artifactErrors[`item-${index}-label`] = 'Item label is required.';\r\n }\r\n if (!hasOptions(item)) {\r\n artifactErrors[`item-${index}-options`] = 'Choice items must include at least one option.';\r\n }\r\n });\r\n if (Object.keys(artifactErrors).length > 0) {\r\n errors.artifacts[artifactId] = artifactErrors;\r\n }\r\n }\r\n\r\n return errors;\r\n}\r\n\r\nfunction toValidationResult(errors: EditorValidation): ValidationResult {\r\n const issues: ValidationIssue[] = [];\r\n\r\n for (const [field, message] of Object.entries(errors.workflow)) {\r\n if (message) {\r\n issues.push({ path: `workflow.${field}`, message, severity: 'error' });\r\n }\r\n }\r\n\r\n for (const [index, stepErrors] of Object.entries(errors.steps)) {\r\n for (const [field, message] of Object.entries(stepErrors)) {\r\n if (message) {\r\n issues.push({ path: `steps[${index}].${field}`, message, severity: 'error' });\r\n }\r\n }\r\n }\r\n\r\n for (const [artifactId, artifactErrors] of Object.entries(errors.artifacts)) {\r\n for (const [field, message] of Object.entries(artifactErrors)) {\r\n if (message) {\r\n issues.push({ path: `artifacts.${artifactId}.${field}`, message, severity: 'error' });\r\n }\r\n }\r\n }\r\n\r\n for (const message of errors.global) {\r\n issues.push({ path: 'global', message, severity: 'error' });\r\n }\r\n\r\n return { valid: issues.length === 0, issues };\r\n}\r\n\r\nexport function validateWorkflow(draft: WorkflowDefinition): ValidationResult {\r\n return toValidationResult(validateEditableWorkflow(draft));\r\n}\r\n\r\n/** Raw editor validation shape for UI grouping (client-side only). */\r\nexport function validateWorkflowEditor(draft: WorkflowDefinition): EditorValidation {\r\n return validateEditableWorkflow(draft);\r\n}\r\n\r\nexport type { EditorValidation };\r\n","// SPDX-License-Identifier: Apache-2.0\n\nimport { canvasToWorkflow } from '../model/mapper';\nimport type { CanvasModel } from '../model/canvasModel';\nimport type { EditorValidation } from '../validation/validateWorkflow';\nimport { validateWorkflowEditor } from '../validation/validateWorkflow';\nimport { useCallback, useState } from 'react';\n\nexport type DraftValidationIssue = {\n code: string;\n message: string;\n /** Matched backend step id when parseable from the error text. */\n stepId?: string;\n};\n\nfunction parseStepIdFromMessage(message: string): string | undefined {\n const m = message.match(/stepId[=:'\\s]+([a-z0-9-]+)/i) ?? message.match(/step\\s+['\"]?([a-z0-9-]+)['\"]?/i);\n return m?.[1];\n}\n\nfunction validationToIssues(model: CanvasModel, validation: EditorValidation): DraftValidationIssue[] {\n const issues: DraftValidationIssue[] = [];\n\n for (const message of Object.values(validation.workflow)) {\n if (message) {\n issues.push({ code: 'workflow', message, stepId: parseStepIdFromMessage(message) });\n }\n }\n\n for (const [idx, stepErrors] of Object.entries(validation.steps)) {\n for (const message of Object.values(stepErrors)) {\n if (message) {\n issues.push({\n code: 'field',\n message: `Step ${idx}: ${message}`,\n stepId: model.nodes[Number(idx)]?.backendStepId,\n });\n }\n }\n }\n\n for (const message of validation.global) {\n issues.push({ code: 'global', message, stepId: undefined });\n }\n\n return issues;\n}\n\nexport function useWorkflowDraft() {\n const [issues, setIssues] = useState<DraftValidationIssue[]>([]);\n\n const buildFromCanvas = useCallback((model: CanvasModel) => {\n const workflow = canvasToWorkflow(model);\n const validation = validateWorkflowEditor(workflow);\n return { workflow, validation };\n }, []);\n\n const validateOnly = useCallback(\n (model: CanvasModel) => {\n const { workflow, validation } = buildFromCanvas(model);\n const nextIssues = validationToIssues(model, validation);\n setIssues(nextIssues);\n return { workflow, validation, valid: nextIssues.length === 0 };\n },\n [buildFromCanvas],\n );\n\n return {\n issues,\n setIssues,\n buildFromCanvas,\n validateOnly,\n };\n}\n","// SPDX-License-Identifier: Apache-2.0\n\nimport { ACTION_LABELS } from '../copy/workflow-terminology';\nimport type { AgentRef, StepTransition } from '../api/types';\nimport type { BuilderMode } from '../hooks/useBuilderMode';\nimport type {\n CanvasModel,\n CanvasNode,\n LoopTerminationStrategy,\n MaxIterationsActionUi,\n NodeData,\n} from '../model/canvasModel';\nimport { NODE_KIND_META } from '../model/nodeKinds';\nimport type { ReactNode } from 'react';\nimport { useMemo } from 'react';\n\nexport type StepConfigPanelProps = {\n model: CanvasModel;\n selectedId: string | null;\n mode: BuilderMode;\n onClose: () => void;\n onUpdateNodeData: (id: string, partial: Partial<NodeData>) => void;\n agentCatalog?: AgentRef[];\n};\n\nfunction TransitionField({\n value,\n onChange,\n}: {\n value: StepTransition;\n onChange: (value: StepTransition) => void;\n}) {\n return (\n <label className=\"wf-field\">\n <span className=\"wf-field__label\" title={ACTION_LABELS.approvalHelp}>\n {ACTION_LABELS.approvalField}\n </span>\n <select className=\"wf-input wf-select\" value={value} onChange={(e) => onChange(e.target.value as StepTransition)}>\n <option value=\"AUTO\">{ACTION_LABELS.approvalAutomatic}</option>\n <option value=\"HUMAN_REVIEW\">{ACTION_LABELS.approvalReview}</option>\n <option value=\"HUMAN_APPROVAL\">{ACTION_LABELS.approvalRequired}</option>\n </select>\n </label>\n );\n}\n\nfunction Section({ title, children }: { title: string; children: ReactNode }) {\n return (\n <section className=\"wf-inspector__section\">\n <h3 className=\"wf-inspector__section-title\">{title}</h3>\n {children}\n </section>\n );\n}\n\nexport function StepConfigPanel({\n model,\n selectedId,\n mode,\n onClose,\n onUpdateNodeData,\n agentCatalog,\n}: StepConfigPanelProps) {\n const node = useMemo(() => model.nodes.find((n) => n.id === selectedId) ?? null, [model.nodes, selectedId]);\n const hasAgentCatalog = Boolean(agentCatalog && agentCatalog.length > 0);\n\n const otherNodes = useMemo(\n () =>\n model.nodes\n .filter((n) => n.id !== node?.id)\n .map((n) => ({ id: n.id, label: n.data.name || NODE_KIND_META[n.kind].label })),\n [model.nodes, node],\n );\n\n if (!node || !selectedId) {\n return null;\n }\n\n const title = NODE_KIND_META[node.kind].label;\n const insideLoopBody =\n Boolean(node.parentNode) && model.nodes.some((p) => p.id === node.parentNode && p.kind === 'REPEAT');\n const behaviorOpen = mode === 'advanced';\n const advancedOpen = mode === 'advanced';\n\n return (\n <aside className=\"wf-panel wf-inspector\" role=\"dialog\" aria-label={title}>\n <header className=\"wf-panel__header wf-inspector__header\">\n <h2 className=\"wf-panel__title\">{title}</h2>\n <button\n type=\"button\"\n className=\"wf-button wf-button--ghost wf-button--icon\"\n aria-label={ACTION_LABELS.configureStepClose}\n onClick={onClose}\n >\n ×\n </button>\n </header>\n <div className=\"wf-panel__body wf-inspector__body\">\n {insideLoopBody ? (\n <p className=\"wf-inspector__banner\">{ACTION_LABELS.loopBodyReadOnly}</p>\n ) : null}\n <fieldset disabled={insideLoopBody} className=\"wf-inspector__fieldset\">\n <Section title={ACTION_LABELS.basicsSection}>\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.nameField}</span>\n <input\n className=\"wf-input\"\n value={node.data.name}\n onChange={(e) => onUpdateNodeData(node.id, { name: e.target.value } as Partial<NodeData>)}\n />\n </label>\n <div className=\"wf-inspector__grid\">\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.typeField}</span>\n <input className=\"wf-input\" value={title} disabled />\n </label>\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.descriptionField}</span>\n <input className=\"wf-input\" value={NODE_KIND_META[node.kind].description} disabled />\n </label>\n </div>\n </Section>\n\n <Section title={ACTION_LABELS.inputsOutputsSection}>\n {node.kind === 'ASK_USER' ? (\n <>\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.questionField}</span>\n <textarea\n className=\"wf-input wf-textarea\"\n value={node.data.question}\n onChange={(e) => onUpdateNodeData(node.id, { question: e.target.value } as Partial<NodeData>)}\n />\n </label>\n <p className=\"wf-field__hint\">{ACTION_LABELS.formFieldsHint}</p>\n {node.data.artifactItems.map((item, idx) => (\n <div key={item.id} className=\"wf-inspector__card\">\n <select\n className=\"wf-input wf-select\"\n value={item.type}\n onChange={(e) => {\n const next = [...node.data.artifactItems];\n next[idx] = { ...item, type: e.target.value as (typeof item)['type'] };\n onUpdateNodeData(node.id, { artifactItems: next } as Partial<NodeData>);\n }}\n >\n {(['TEXT', 'TEXT_AREA', 'SINGLE_CHOICE', 'MULTI_CHOICE', 'BOOLEAN', 'NUMBER', 'DATE'] as const).map(\n (t) => (\n <option key={t} value={t}>\n {t}\n </option>\n ),\n )}\n </select>\n <input\n className=\"wf-input\"\n placeholder=\"Label\"\n value={item.label}\n onChange={(e) => {\n const next = [...node.data.artifactItems];\n next[idx] = { ...item, label: e.target.value };\n onUpdateNodeData(node.id, { artifactItems: next } as Partial<NodeData>);\n }}\n />\n <input\n className=\"wf-input\"\n placeholder=\"Key\"\n value={item.key}\n onChange={(e) => {\n const next = [...node.data.artifactItems];\n next[idx] = { ...item, key: e.target.value };\n onUpdateNodeData(node.id, { artifactItems: next } as Partial<NodeData>);\n }}\n />\n </div>\n ))}\n <button\n type=\"button\"\n className=\"wf-button wf-button--secondary\"\n onClick={() =>\n onUpdateNodeData(node.id, {\n artifactItems: [\n ...node.data.artifactItems,\n {\n id: `item-${node.data.artifactItems.length}`,\n type: 'TEXT',\n label: '',\n key: '',\n required: false,\n },\n ],\n } as Partial<NodeData>)\n }\n >\n {ACTION_LABELS.addField}\n </button>\n </>\n ) : null}\n {node.kind === 'SAVE_RESULT' ? (\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.resultNameField}</span>\n <input\n className=\"wf-input\"\n value={node.data.resultName}\n onChange={(e) => onUpdateNodeData(node.id, { resultName: e.target.value } as Partial<NodeData>)}\n />\n </label>\n ) : null}\n {node.kind === 'LOAD_RESOURCE' ? (\n <>\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.resourcePathField}</span>\n <input\n className=\"wf-input\"\n value={node.data.resourcePath}\n onChange={(e) => onUpdateNodeData(node.id, { resourcePath: e.target.value } as Partial<NodeData>)}\n />\n </label>\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.resultContextKeyField}</span>\n <input\n className=\"wf-input\"\n value={node.data.resultName}\n onChange={(e) => onUpdateNodeData(node.id, { resultName: e.target.value } as Partial<NodeData>)}\n />\n </label>\n </>\n ) : null}\n </Section>\n\n <details className=\"wf-inspector__details\" open={behaviorOpen}>\n <summary className=\"wf-inspector__details-summary\">{ACTION_LABELS.behaviorSection}</summary>\n <div className=\"wf-inspector__details-body\">\n {node.kind === 'AI_STEP' ? (\n <>\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.agentField}</span>\n {hasAgentCatalog ? (\n <select\n className=\"wf-input wf-select\"\n value={node.data.agentRef}\n onChange={(e) => onUpdateNodeData(node.id, { agentRef: e.target.value } as Partial<NodeData>)}\n >\n <option value=\"\">{ACTION_LABELS.selectPlaceholder}</option>\n {agentCatalog!.map((a) => (\n <option key={a.id} value={a.id}>\n {a.name}\n </option>\n ))}\n </select>\n ) : (\n <input\n className=\"wf-input\"\n value={node.data.agentRef}\n placeholder={ACTION_LABELS.agentPlaceholder}\n onChange={(e) => onUpdateNodeData(node.id, { agentRef: e.target.value } as Partial<NodeData>)}\n />\n )}\n </label>\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.instructionsField}</span>\n <textarea\n className=\"wf-input wf-textarea wf-textarea--tall\"\n value={node.data.instructions}\n onChange={(e) => onUpdateNodeData(node.id, { instructions: e.target.value } as Partial<NodeData>)}\n />\n </label>\n <TransitionField\n value={node.data.transition}\n onChange={(value) => onUpdateNodeData(node.id, { transition: value } as Partial<NodeData>)}\n />\n </>\n ) : null}\n {node.kind === 'AI_DEBATE' ? (\n <DebateForm node={node} agentCatalog={agentCatalog} onUpdate={onUpdateNodeData} />\n ) : null}\n {node.kind === 'DECISION' ? (\n <DecisionForm node={node} otherNodes={otherNodes} onUpdate={onUpdateNodeData} />\n ) : null}\n {node.kind === 'REPEAT' ? <RepeatForm node={node} onUpdate={onUpdateNodeData} /> : null}\n {node.kind === 'REUSE_WORKFLOW' ? (\n <>\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.reuseWorkflow}</span>\n <input\n className=\"wf-input\"\n value={node.data.workflowRef}\n placeholder={ACTION_LABELS.workflowIdPlaceholder}\n onChange={(e) => onUpdateNodeData(node.id, { workflowRef: e.target.value } as Partial<NodeData>)}\n />\n </label>\n <TransitionField\n value={node.data.transition}\n onChange={(value) => onUpdateNodeData(node.id, { transition: value } as Partial<NodeData>)}\n />\n </>\n ) : null}\n {node.kind === 'STOP' ? (\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.reasonField}</span>\n <textarea\n className=\"wf-input wf-textarea\"\n value={node.data.reason}\n onChange={(e) => onUpdateNodeData(node.id, { reason: e.target.value } as Partial<NodeData>)}\n />\n </label>\n ) : null}\n {node.kind === 'RETRY' ? (\n <>\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.targetStepField}</span>\n <select\n className=\"wf-input wf-select\"\n value={node.data.targetNodeId}\n onChange={(e) => onUpdateNodeData(node.id, { targetNodeId: e.target.value } as Partial<NodeData>)}\n >\n <option value=\"\">{ACTION_LABELS.selectPlaceholder}</option>\n {otherNodes.map((o) => (\n <option key={o.id} value={o.id}>\n {o.label}\n </option>\n ))}\n </select>\n </label>\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.fallbackTargetField}</span>\n <select\n className=\"wf-input wf-select\"\n value={node.data.fallbackTargetNodeId}\n onChange={(e) =>\n onUpdateNodeData(node.id, { fallbackTargetNodeId: e.target.value } as Partial<NodeData>)\n }\n >\n <option value=\"\">{ACTION_LABELS.selectPlaceholder}</option>\n {otherNodes.map((o) => (\n <option key={o.id} value={o.id}>\n {o.label}\n </option>\n ))}\n </select>\n </label>\n </>\n ) : null}\n </div>\n </details>\n\n <details className=\"wf-inspector__details\" open={advancedOpen}>\n <summary className=\"wf-inspector__details-summary\">{ACTION_LABELS.advancedSection}</summary>\n <div className=\"wf-inspector__details-body\">\n {node.kind === 'AI_STEP' ? (\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.maxRetriesField}</span>\n <input\n className=\"wf-input\"\n type=\"number\"\n min={0}\n value={node.data.maxRetries}\n onChange={(e) =>\n onUpdateNodeData(node.id, { maxRetries: Number(e.target.value || 0) } as Partial<NodeData>)\n }\n />\n </label>\n ) : null}\n {node.kind === 'RETRY' ? (\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.maxAttemptsField}</span>\n <input\n className=\"wf-input\"\n type=\"number\"\n min={1}\n value={node.data.maxAttempts}\n onChange={(e) =>\n onUpdateNodeData(node.id, { maxAttempts: Number(e.target.value || 1) } as Partial<NodeData>)\n }\n />\n </label>\n ) : null}\n </div>\n </details>\n </fieldset>\n </div>\n </aside>\n );\n}\n\nfunction DebateForm({\n node,\n agentCatalog,\n onUpdate,\n}: {\n node: CanvasNode;\n agentCatalog?: AgentRef[];\n onUpdate: (id: string, partial: Partial<NodeData>) => void;\n}) {\n if (node.kind !== 'AI_DEBATE') {\n return null;\n }\n const d = node.data;\n const hasCatalog = Boolean(agentCatalog && agentCatalog.length > 0);\n\n const agentControl = (field: 'primaryAgentRef' | 'challengerAgentRef') =>\n hasCatalog ? (\n <select\n className=\"wf-input wf-select\"\n value={d[field]}\n onChange={(e) => onUpdate(node.id, { [field]: e.target.value } as Partial<NodeData>)}\n >\n <option value=\"\">{ACTION_LABELS.selectPlaceholder}</option>\n {agentCatalog!.map((a) => (\n <option key={a.id} value={a.id}>\n {a.name}\n </option>\n ))}\n </select>\n ) : (\n <input\n className=\"wf-input\"\n value={d[field]}\n placeholder={ACTION_LABELS.agentPlaceholder}\n onChange={(e) => onUpdate(node.id, { [field]: e.target.value } as Partial<NodeData>)}\n />\n );\n\n return (\n <>\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.primaryAgentField}</span>\n {agentControl('primaryAgentRef')}\n </label>\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.challengerAgentField}</span>\n {agentControl('challengerAgentRef')}\n </label>\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.maxRoundsField}</span>\n <input\n className=\"wf-input\"\n type=\"number\"\n min={1}\n value={d.maxRounds}\n onChange={(e) => onUpdate(node.id, { maxRounds: Number(e.target.value || 1) } as Partial<NodeData>)}\n />\n </label>\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.resolutionInstructionsField}</span>\n <textarea\n className=\"wf-input wf-textarea\"\n value={d.resolutionPrompt}\n onChange={(e) => onUpdate(node.id, { resolutionPrompt: e.target.value } as Partial<NodeData>)}\n />\n </label>\n </>\n );\n}\n\nfunction DecisionForm({\n node,\n otherNodes,\n onUpdate,\n}: {\n node: CanvasNode;\n otherNodes: { id: string; label: string }[];\n onUpdate: (id: string, partial: Partial<NodeData>) => void;\n}) {\n if (node.kind !== 'DECISION') {\n return null;\n }\n const d = node.data;\n return (\n <>\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.contextKeyField}</span>\n <input\n className=\"wf-input\"\n value={d.contextKey}\n onChange={(e) => onUpdate(node.id, { contextKey: e.target.value } as Partial<NodeData>)}\n />\n <span className=\"wf-field__hint\">{ACTION_LABELS.contextKeyHint}</span>\n </label>\n {d.cases.map((c, idx) => (\n <div key={`${c.value}-${idx}`} className=\"wf-inspector__card\">\n <input\n className=\"wf-input\"\n placeholder={ACTION_LABELS.caseLabelPlaceholder}\n value={c.label}\n onChange={(e) => {\n const next = [...d.cases];\n next[idx] = { ...c, label: e.target.value };\n onUpdate(node.id, { cases: next } as Partial<NodeData>);\n }}\n />\n <input\n className=\"wf-input\"\n placeholder={ACTION_LABELS.caseValuePlaceholder}\n value={c.value}\n onChange={(e) => {\n const next = [...d.cases];\n next[idx] = { ...c, value: e.target.value };\n onUpdate(node.id, { cases: next } as Partial<NodeData>);\n }}\n />\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.connectsToField}</span>\n <select\n className=\"wf-input wf-select\"\n value={c.targetNodeId}\n onChange={(e) => {\n const next = [...d.cases];\n next[idx] = { ...c, targetNodeId: e.target.value };\n onUpdate(node.id, { cases: next } as Partial<NodeData>);\n }}\n >\n <option value=\"\">{ACTION_LABELS.selectPlaceholder}</option>\n {otherNodes.map((o) => (\n <option key={o.id} value={o.id}>\n {o.label}\n </option>\n ))}\n </select>\n </label>\n </div>\n ))}\n <button\n type=\"button\"\n className=\"wf-button wf-button--secondary\"\n onClick={() =>\n onUpdate(node.id, {\n cases: [...d.cases, { label: 'New case', value: `case-${d.cases.length + 1}`, targetNodeId: '' }],\n } as Partial<NodeData>)\n }\n >\n {ACTION_LABELS.addCase}\n </button>\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.defaultBranchTargetField}</span>\n <select\n className=\"wf-input wf-select\"\n value={d.defaultTargetNodeId}\n onChange={(e) => onUpdate(node.id, { defaultTargetNodeId: e.target.value } as Partial<NodeData>)}\n >\n <option value=\"\">{ACTION_LABELS.selectPlaceholder}</option>\n {otherNodes.map((o) => (\n <option key={o.id} value={o.id}>\n {o.label}\n </option>\n ))}\n </select>\n </label>\n </>\n );\n}\n\nfunction RepeatForm({ node, onUpdate }: { node: CanvasNode; onUpdate: (id: string, partial: Partial<NodeData>) => void }) {\n if (node.kind !== 'REPEAT') {\n return null;\n }\n const d = node.data;\n return (\n <>\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.loopModeField}</span>\n <select\n className=\"wf-input wf-select\"\n value={d.strategy}\n onChange={(e) =>\n onUpdate(node.id, { strategy: e.target.value as LoopTerminationStrategy } as Partial<NodeData>)\n }\n >\n <option value=\"FIXED_COUNT\">{ACTION_LABELS.fixedCountMode}</option>\n <option value=\"FOR_EACH\">{ACTION_LABELS.forEachMode}</option>\n <option value=\"AGENT_SIGNAL\">{ACTION_LABELS.agentSignalMode}</option>\n <option value=\"EVALUATOR\">{ACTION_LABELS.evaluatorMode}</option>\n </select>\n </label>\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.maxIterationsField}</span>\n <input\n className=\"wf-input\"\n type=\"number\"\n min={1}\n value={d.maxIterations}\n onChange={(e) => onUpdate(node.id, { maxIterations: Number(e.target.value || 1) } as Partial<NodeData>)}\n />\n </label>\n {d.strategy === 'FOR_EACH' ? (\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.listContextKeyField}</span>\n <input\n className=\"wf-input\"\n value={d.forEachKey ?? ''}\n onChange={(e) => onUpdate(node.id, { forEachKey: e.target.value } as Partial<NodeData>)}\n />\n </label>\n ) : null}\n {d.strategy === 'EVALUATOR' ? (\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.evaluatorAgentField}</span>\n <input\n className=\"wf-input\"\n value={d.evaluatorAgentId ?? ''}\n onChange={(e) => onUpdate(node.id, { evaluatorAgentId: e.target.value } as Partial<NodeData>)}\n />\n </label>\n ) : null}\n <label className=\"wf-field\">\n <span className=\"wf-field__label\">{ACTION_LABELS.maxIterationsActionField}</span>\n <select\n className=\"wf-input wf-select\"\n value={d.maxIterationsAction}\n onChange={(e) =>\n onUpdate(node.id, { maxIterationsAction: e.target.value as MaxIterationsActionUi } as Partial<NodeData>)\n }\n >\n <option value=\"AWAIT_USER\">{ACTION_LABELS.awaitUserAction}</option>\n <option value=\"FAIL\">{ACTION_LABELS.failAction}</option>\n </select>\n </label>\n </>\n );\n}\n","// SPDX-License-Identifier: Apache-2.0\n\nimport { ACTION_LABELS, BUILDER_COPY } from '../copy/workflow-terminology';\nimport type { BuilderMode } from '../hooks/useBuilderMode';\nimport { LIBRARY_ADVANCED_KINDS, LIBRARY_COMMON_KINDS, NODE_KIND_META, type NodeKind } from '../model/nodeKinds';\nimport { useEffect, useState } from 'react';\n\ntype StepPaletteProps = {\n mode: BuilderMode;\n onAddStep: (kind: NodeKind) => void;\n defaultCollapsed?: boolean;\n};\n\nexport function StepPalette({ mode, onAddStep, defaultCollapsed = true }: StepPaletteProps) {\n const [expanded, setExpanded] = useState(!defaultCollapsed);\n const [advancedOpen, setAdvancedOpen] = useState(mode === 'advanced');\n const [isMobile, setIsMobile] = useState(false);\n const [mobileOpen, setMobileOpen] = useState(false);\n\n useEffect(() => {\n setAdvancedOpen(mode === 'advanced');\n }, [mode]);\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return;\n }\n const media = window.matchMedia('(max-width: 767px)');\n const update = () => setIsMobile(media.matches);\n update();\n media.addEventListener('change', update);\n return () => media.removeEventListener('change', update);\n }, []);\n\n const renderKind = (kind: NodeKind, compact?: boolean) => {\n const meta = NODE_KIND_META[kind];\n return (\n <button\n key={kind}\n type=\"button\"\n draggable\n title={meta.description}\n onDragStart={(e) => {\n e.dataTransfer.setData('application/agentforge-node-kind', kind);\n e.dataTransfer.effectAllowed = 'copy';\n }}\n onClick={() => {\n onAddStep(kind);\n if (isMobile) {\n setMobileOpen(false);\n }\n }}\n className={['wf-palette__item', compact ? 'wf-palette__item--compact' : ''].filter(Boolean).join(' ')}\n aria-label={meta.label}\n >\n <span className=\"wf-palette__item-icon\" aria-hidden>\n {meta.iconGlyph}\n </span>\n {!compact ? (\n <span className=\"wf-palette__item-text\">\n <span className=\"wf-palette__item-label\">{meta.label}</span>\n <span className=\"wf-palette__item-description\">{meta.description}</span>\n </span>\n ) : null}\n </button>\n );\n };\n\n const panelContent = (\n <>\n <div className=\"wf-palette__header\">\n <span className=\"wf-palette__title\">{BUILDER_COPY.stepLibrary}</span>\n {!isMobile ? (\n <button\n type=\"button\"\n className=\"wf-button wf-button--icon wf-button--ghost\"\n aria-label={expanded ? BUILDER_COPY.collapsePalette : BUILDER_COPY.expandPalette}\n onClick={() => setExpanded((v) => !v)}\n >\n {expanded ? '‹' : '›'}\n </button>\n ) : null}\n </div>\n <div className=\"wf-palette__body\">\n <p className=\"wf-palette__section-label\">Common</p>\n <div className=\"wf-palette__list\">{LIBRARY_COMMON_KINDS.map((kind) => renderKind(kind, !expanded && !isMobile))}</div>\n {expanded || isMobile ? (\n <>\n <button\n type=\"button\"\n className=\"wf-palette__advanced-toggle\"\n onClick={() => setAdvancedOpen((o) => !o)}\n >\n <span aria-hidden>{advancedOpen ? '▾' : '▸'}</span>\n {mode === 'guided' ? ACTION_LABELS.advancedStepsGuided : ACTION_LABELS.advancedSteps}\n </button>\n {advancedOpen ? (\n <div className=\"wf-palette__list\">{LIBRARY_ADVANCED_KINDS.map((kind) => renderKind(kind, false))}</div>\n ) : null}\n </>\n ) : null}\n </div>\n </>\n );\n\n if (isMobile) {\n return (\n <div className=\"wf-palette wf-palette--mobile\">\n <button\n type=\"button\"\n className=\"wf-button wf-button--primary wf-palette__mobile-trigger\"\n aria-label={ACTION_LABELS.addStep}\n aria-expanded={mobileOpen}\n onClick={() => setMobileOpen((o) => !o)}\n >\n + {ACTION_LABELS.addStep}\n </button>\n {mobileOpen ? (\n <div className=\"wf-palette__mobile-sheet\" role=\"dialog\" aria-label={BUILDER_COPY.stepLibrary}>\n <p className=\"wf-palette__mobile-description\">{ACTION_LABELS.chooseStepDescription}</p>\n <div className=\"wf-palette__mobile-content\">{panelContent}</div>\n </div>\n ) : null}\n </div>\n );\n }\n\n return (\n <aside\n className={['wf-palette', expanded ? 'wf-palette--expanded' : 'wf-palette--collapsed'].join(' ')}\n onMouseEnter={() => {\n if (!expanded) {\n setExpanded(true);\n }\n }}\n onMouseLeave={() => {\n if (defaultCollapsed) {\n setExpanded(false);\n }\n }}\n >\n {!expanded ? (\n <div className=\"wf-palette__collapsed-header\">\n <button\n type=\"button\"\n className=\"wf-button wf-button--icon wf-button--ghost\"\n aria-label={BUILDER_COPY.expandPalette}\n onClick={() => setExpanded(true)}\n >\n ☰\n </button>\n </div>\n ) : null}\n <div className={['wf-palette__panel', !expanded ? 'wf-palette__panel--hidden' : ''].filter(Boolean).join(' ')}>\n {panelContent}\n </div>\n {!expanded ? (\n <div className=\"wf-palette__collapsed-list\">{LIBRARY_COMMON_KINDS.map((kind) => renderKind(kind, true))}</div>\n ) : null}\n </aside>\n );\n}\n","import { useMemo, useReducer, type Dispatch } from 'react';\r\nimport type { WorkflowDefinition } from '../api/types';\r\nimport {\r\n builderReducer,\r\n createInitialState,\r\n isDirty,\r\n type BuilderAction,\r\n type BuilderState,\r\n} from './reducer';\r\n\r\nexport interface UseBuilderStateResult {\r\n state: BuilderState;\r\n dispatch: Dispatch<BuilderAction>;\r\n dirty: boolean;\r\n}\r\n\r\nexport function useBuilderState(\r\n initialWorkflow?: WorkflowDefinition,\r\n): UseBuilderStateResult {\r\n const [state, dispatch] = useReducer(\r\n builderReducer,\r\n initialWorkflow,\r\n (workflow) => createInitialState(workflow),\r\n );\r\n\r\n const dirty = useMemo(() => isDirty(state), [state]);\r\n\r\n return { state, dispatch, dirty };\r\n}\r\n","// SPDX-License-Identifier: Apache-2.0\r\n\r\nexport type BehaviourType =\r\n | 'INPUT'\r\n | 'AGENT'\r\n | 'SPAR'\r\n | 'BRANCH'\r\n | 'WORKFLOW_BEHAVIOUR'\r\n | 'RESOURCE'\r\n | 'FAIL'\r\n | 'RETRY_PREVIOUS';\r\n\r\nexport type StepTransition = 'AUTO' | 'HUMAN_REVIEW' | 'HUMAN_APPROVAL';\r\nexport type RetryMode = 'SINGLE_STEP' | 'FROM_STEP';\r\nexport type ArtifactItemType =\r\n | 'TEXT'\r\n | 'TEXT_AREA'\r\n | 'SINGLE_CHOICE'\r\n | 'MULTI_CHOICE'\r\n | 'BOOLEAN'\r\n | 'NUMBER'\r\n | 'DATE';\r\n\r\nexport type ContextMapping = {\r\n inputKeys: string[];\r\n outputKeys: string[];\r\n};\r\n\r\nexport type InputConfig = { artifactId: string; transition: StepTransition };\r\nexport type AgentConfig = { agentRef: string; transition: StepTransition; maxRetries?: number };\r\nexport type SparConfig = {\r\n agentRef: string;\r\n challengerAgentId: string;\r\n maxRounds: number;\r\n resolutionPrompt: string;\r\n transition: StepTransition;\r\n};\r\nexport type BranchConfig = {\r\n contextKey: string;\r\n branches: Record<string, string>;\r\n defaultBranch: string;\r\n};\r\nexport type WorkflowBehaviourConfig = { workflowRef: string; transition: StepTransition };\r\nexport type ResourceConfig = { resourcePath: string; contextKey: string; transition: StepTransition };\r\nexport type FailConfig = { reason: string };\r\nexport type RetryPreviousConfig = {\r\n retryStepId: string;\r\n retryMode: RetryMode;\r\n maxAttempts: number;\r\n fallback: string;\r\n};\r\n\r\nexport type StepConfig =\r\n | InputConfig\r\n | AgentConfig\r\n | SparConfig\r\n | BranchConfig\r\n | WorkflowBehaviourConfig\r\n | ResourceConfig\r\n | FailConfig\r\n | RetryPreviousConfig;\r\n\r\nexport type EditableArtifactItem = {\r\n id: string;\r\n type: ArtifactItemType;\r\n label: string;\r\n required: boolean;\r\n options?: string[];\r\n};\r\n\r\nexport type EditableArtifact = {\r\n id: string;\r\n items: EditableArtifactItem[];\r\n};\r\n\r\nexport type EditableStep = {\r\n stepId: string;\r\n name: string;\r\n behaviourType: BehaviourType;\r\n config: StepConfig;\r\n stepPrompt?: string;\r\n contextMapping?: ContextMapping;\r\n};\r\n\r\nexport type BlueprintJsonObject = Record<string, unknown>;\r\n\r\nexport type TopLevelScheduleEntry =\r\n | { kind: 'STEP'; stepIndex: number }\r\n | { kind: 'BLUEPRINT_REF'; blueprintId: string };\r\n\r\n/** Canonical workflow document shape used by the builder draft and host adapters. */\r\nexport interface WorkflowDefinition {\r\n id: string;\r\n name: string;\r\n description: string;\r\n steps: EditableStep[];\r\n artifacts: Record<string, EditableArtifact>;\r\n blueprintBodies?: Record<string, BlueprintJsonObject>;\r\n topLevelSchedule?: TopLevelScheduleEntry[];\r\n}\r\n\r\nexport type ExportFormat = 'json';\r\n\r\nexport interface ValidationIssue {\r\n path: string;\r\n message: string;\r\n severity: 'error' | 'warning';\r\n}\r\n\r\nexport interface ValidationResult {\r\n valid: boolean;\r\n issues: ValidationIssue[];\r\n}\r\n\r\nexport interface AgentRef {\r\n id: string;\r\n name: string;\r\n}\r\n\r\nexport interface BuilderCapabilities {\r\n import: boolean;\r\n export: boolean;\r\n save: boolean;\r\n run: boolean;\r\n publish: boolean;\r\n aiAssist: boolean;\r\n}\r\n\r\nexport interface BuilderTheme {\r\n /** Optional root class; layout uses semantic CSS variables only. */\r\n className?: string;\r\n /** Optional CSS custom properties applied on the builder root element. */\r\n variables?: Record<string, string>;\r\n}\r\n\r\nexport interface BuilderAdapters {\r\n validateWorkflow?: (draft: WorkflowDefinition) => ValidationResult | Promise<ValidationResult>;\r\n importBundle?: () => Promise<WorkflowDefinition>;\r\n exportBundle?: (draft: WorkflowDefinition, format: ExportFormat) => Promise<void>;\r\n}\r\n\r\nexport interface BuilderActions {\r\n save?: (draft: WorkflowDefinition) => Promise<void>;\r\n run?: (draft: WorkflowDefinition) => Promise<void>;\r\n publish?: (draft: WorkflowDefinition) => Promise<void>;\r\n}\r\n\r\nexport interface WorkflowBuilderProps {\r\n capabilities: BuilderCapabilities;\r\n adapters?: BuilderAdapters;\r\n actions?: BuilderActions;\r\n theme?: BuilderTheme;\r\n initialWorkflow?: WorkflowDefinition;\r\n /** Host-supplied agent catalog for inspector pickers (text fallback when omitted). */\r\n agentCatalog?: AgentRef[];\r\n}\r\n\r\nexport function emptyWorkflow(): WorkflowDefinition {\r\n return {\r\n id: '',\r\n name: '',\r\n description: '',\r\n steps: [],\r\n artifacts: {},\r\n };\r\n}\r\n","// SPDX-License-Identifier: Apache-2.0\r\n\r\nimport type { ValidationResult, WorkflowDefinition } from '../api/types';\r\nimport { emptyWorkflow } from '../api/types';\r\n\r\nexport interface BuilderSelection {\r\n nodeId: string | null;\r\n edgeId: string | null;\r\n}\r\n\r\nexport interface ImportMeta {\r\n source: string | null;\r\n importedAt: string | null;\r\n}\r\n\r\nexport interface BuilderState {\r\n draft: WorkflowDefinition;\r\n baseline: WorkflowDefinition;\r\n selection: BuilderSelection;\r\n validation: ValidationResult;\r\n importMeta: ImportMeta;\r\n}\r\n\r\nexport type BuilderAction =\r\n | { type: 'SET_DRAFT'; draft: WorkflowDefinition }\r\n | { type: 'SET_BASELINE'; baseline: WorkflowDefinition }\r\n | { type: 'SELECT_NODE'; nodeId: string | null }\r\n | { type: 'SELECT_EDGE'; edgeId: string | null }\r\n | { type: 'SET_VALIDATION'; validation: ValidationResult }\r\n | { type: 'SET_IMPORT_META'; importMeta: ImportMeta };\r\n\r\nexport { emptyWorkflow };\r\n\r\nexport const initialValidation: ValidationResult = { valid: true, issues: [] };\r\n\r\nexport const initialImportMeta: ImportMeta = { source: null, importedAt: null };\r\n\r\nexport function createInitialState(workflow: WorkflowDefinition = emptyWorkflow()): BuilderState {\r\n return {\r\n draft: workflow,\r\n baseline: workflow,\r\n selection: { nodeId: null, edgeId: null },\r\n validation: initialValidation,\r\n importMeta: initialImportMeta,\r\n };\r\n}\r\n\r\nexport function isDirty(state: BuilderState): boolean {\r\n return JSON.stringify(state.draft) !== JSON.stringify(state.baseline);\r\n}\r\n\r\nexport function builderReducer(state: BuilderState, action: BuilderAction): BuilderState {\r\n switch (action.type) {\r\n case 'SET_DRAFT':\r\n return { ...state, draft: action.draft };\r\n case 'SET_BASELINE':\r\n return { ...state, baseline: action.baseline };\r\n case 'SELECT_NODE':\r\n return {\r\n ...state,\r\n selection: { ...state.selection, nodeId: action.nodeId, edgeId: null },\r\n };\r\n case 'SELECT_EDGE':\r\n return {\r\n ...state,\r\n selection: { ...state.selection, edgeId: action.edgeId, nodeId: null },\r\n };\r\n case 'SET_VALIDATION':\r\n return { ...state, validation: action.validation };\r\n case 'SET_IMPORT_META':\r\n return { ...state, importMeta: action.importMeta };\r\n default:\r\n return state;\r\n }\r\n}\r\n","// SPDX-License-Identifier: Apache-2.0\n\nimport { ACTION_LABELS, ISSUE_REWRITES } from '../copy/workflow-terminology';\nimport type { DraftValidationIssue } from '../hooks/useWorkflowDraft';\nimport type { CanvasModel } from '../model/canvasModel';\nimport { NODE_KIND_META } from '../model/nodeKinds';\n\ntype ValidationPanelProps = {\n model: CanvasModel;\n clientIssues: DraftValidationIssue[];\n serverIssues?: DraftValidationIssue[];\n onFix: (stepId?: string) => void;\n};\n\ntype IssueGroup = {\n key: string;\n title: string;\n issues: DraftValidationIssue[];\n};\n\nfunction rewriteIssue(message: string): string {\n const normalized = message.trim().toLowerCase();\n const matched = Object.entries(ISSUE_REWRITES).find(([key]) => normalized.includes(key));\n return matched?.[1] ?? message;\n}\n\nfunction severityGlyph(issue: DraftValidationIssue): string {\n if (issue.code.toLowerCase().includes('warning')) {\n return '⚠';\n }\n return '!';\n}\n\nfunction groupIssues(model: CanvasModel, issues: DraftValidationIssue[]): IssueGroup[] {\n const grouped = new Map<string, IssueGroup>();\n for (const issue of issues) {\n const stepId = issue.stepId?.trim();\n if (!stepId) {\n const fallback = grouped.get('workflow') ?? { key: 'workflow', title: 'Workflow', issues: [] };\n fallback.issues.push(issue);\n grouped.set('workflow', fallback);\n continue;\n }\n const node = model.nodes.find((entry) => entry.backendStepId === stepId);\n const defaultTitle = node ? `${NODE_KIND_META[node.kind].label} · ${node.data.name?.trim() || 'Untitled step'}` : stepId;\n const entry = grouped.get(stepId) ?? { key: stepId, title: defaultTitle, issues: [] };\n entry.issues.push(issue);\n grouped.set(stepId, entry);\n }\n return [...grouped.values()];\n}\n\nfunction Section({\n title,\n groups,\n onFix,\n}: {\n title: string;\n groups: IssueGroup[];\n onFix: (stepId?: string) => void;\n}) {\n if (groups.length === 0) {\n return null;\n }\n return (\n <div className=\"wf-validation-panel__section\">\n <h4 className=\"wf-validation-panel__section-title\">{title}</h4>\n {groups.map((group) => (\n <details key={group.key} className=\"wf-validation-panel__group\" open>\n <summary className=\"wf-validation-panel__group-summary\">{group.title}</summary>\n <ul className=\"wf-validation-panel__issue-list\">\n {group.issues.map((issue, index) => (\n <li key={`${group.key}-${issue.code}-${index}`} className=\"wf-validation-panel__issue\">\n <div className=\"wf-validation-panel__issue-content\">\n <span className=\"wf-validation-panel__issue-glyph\" aria-hidden>\n {severityGlyph(issue)}\n </span>\n <span className=\"wf-validation-panel__issue-message\">{rewriteIssue(issue.message)}</span>\n </div>\n <button\n type=\"button\"\n className=\"wf-button wf-button--secondary wf-validation-panel__fix-button\"\n disabled={!issue.stepId}\n onClick={() => {\n if (!issue.stepId) {\n console.info('Validation issue has no stepId; cannot focus specific step.', issue);\n }\n onFix(issue.stepId);\n }}\n >\n {ACTION_LABELS.fixIssue}\n </button>\n </li>\n ))}\n </ul>\n </details>\n ))}\n </div>\n );\n}\n\nexport function ValidationPanel({ model, clientIssues, serverIssues = [], onFix }: ValidationPanelProps) {\n const clientGroups = groupIssues(model, clientIssues);\n const serverGroups = groupIssues(model, serverIssues);\n const totalIssues = clientIssues.length + serverIssues.length;\n\n return (\n <details className=\"wf-validation-panel\" open={totalIssues > 0}>\n <summary className=\"wf-validation-panel__summary\">\n <span className=\"wf-validation-panel__summary-mobile\">\n {totalIssues === 0 ? ACTION_LABELS.workflowLooksGood : ACTION_LABELS.thingsToFix(totalIssues)}\n </span>\n <span className=\"wf-validation-panel__summary-desktop\">{ACTION_LABELS.clientValidation}</span>\n <span className=\"wf-validation-panel__chevron\" aria-hidden>\n ▾\n </span>\n </summary>\n <div className=\"wf-validation-panel__body\">\n {totalIssues === 0 ? (\n <p className=\"wf-validation-panel__ok\">{ACTION_LABELS.checkmarkOk}</p>\n ) : (\n <>\n <p className=\"wf-validation-panel__count\">{ACTION_LABELS.thingsToFix(totalIssues)}</p>\n <Section title={ACTION_LABELS.clientValidation} groups={clientGroups} onFix={onFix} />\n <Section title={ACTION_LABELS.serverValidation} groups={serverGroups} onFix={onFix} />\n </>\n )}\n </div>\n </details>\n );\n}\n","// SPDX-License-Identifier: Apache-2.0\n\nimport { ValidationPanel } from './ValidationPanel';\nimport { ACTION_LABELS } from '../copy/workflow-terminology';\nimport type { DraftValidationIssue } from '../hooks/useWorkflowDraft';\nimport type { CanvasModel } from '../model/canvasModel';\nimport { useState } from 'react';\n\ntype ValidationPillProps = {\n model: CanvasModel;\n clientIssues: DraftValidationIssue[];\n serverIssues?: DraftValidationIssue[];\n onFix: (stepId?: string) => void;\n className?: string;\n};\n\nexport function ValidationPill({\n model,\n clientIssues,\n serverIssues = [],\n onFix,\n className,\n}: ValidationPillProps) {\n const [open, setOpen] = useState(false);\n const totalIssues = clientIssues.length + serverIssues.length;\n const looksGood = totalIssues === 0;\n\n return (\n <>\n <button\n type=\"button\"\n className={['wf-button wf-button--secondary wf-validation-pill', className].filter(Boolean).join(' ')}\n onClick={() => setOpen(true)}\n aria-label={looksGood ? ACTION_LABELS.looksGood : ACTION_LABELS.thingsToFix(totalIssues)}\n >\n <span className=\"wf-validation-pill__glyph\" aria-hidden>\n {looksGood ? '✓' : '!'}\n </span>\n <span className=\"wf-validation-pill__label-desktop\">\n {looksGood ? `✓ ${ACTION_LABELS.looksGood}` : ACTION_LABELS.thingsToFix(totalIssues)}\n </span>\n <span className=\"wf-validation-pill__label-mobile\">{looksGood ? ACTION_LABELS.okShort : String(totalIssues)}</span>\n </button>\n {open ? (\n <div className=\"wf-validation-pill__overlay\" role=\"presentation\" onClick={() => setOpen(false)}>\n <div\n className=\"wf-panel wf-validation-pill__drawer\"\n role=\"dialog\"\n aria-label={ACTION_LABELS.clientValidation}\n onClick={(e) => e.stopPropagation()}\n >\n <header className=\"wf-panel__header\">\n <h2 className=\"wf-panel__title\">{ACTION_LABELS.clientValidation}</h2>\n <p className=\"wf-panel__description\">{ACTION_LABELS.validationDetailsDescription}</p>\n <button\n type=\"button\"\n className=\"wf-button wf-button--icon wf-button--ghost wf-panel__close\"\n aria-label=\"Close\"\n onClick={() => setOpen(false)}\n >\n ×\n </button>\n </header>\n <div className=\"wf-panel__body\">\n <ValidationPanel\n model={model}\n clientIssues={clientIssues}\n serverIssues={serverIssues}\n onFix={(stepId) => {\n onFix(stepId);\n setOpen(false);\n }}\n />\n </div>\n </div>\n </div>\n ) : null}\n </>\n );\n}\n","import type { WorkflowDefinition } from '../api/types';\r\n\r\nconst STRIP_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\r\n\r\nexport class WorkflowParseError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = 'WorkflowParseError';\r\n }\r\n}\r\n\r\n/** Rejects prototype-pollution payloads; `constructor` / `prototype` are stripped instead. */\r\nfunction assertNoProtoKey(value: unknown, path = 'root'): void {\r\n if (value === null || typeof value !== 'object') {\r\n return;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n value.forEach((item, index) => assertNoProtoKey(item, `${path}[${index}]`));\r\n return;\r\n }\r\n\r\n for (const key of Object.keys(value as Record<string, unknown>)) {\r\n if (key === '__proto__') {\r\n throw new WorkflowParseError(`Forbidden key \"__proto__\" at ${path}`);\r\n }\r\n assertNoProtoKey((value as Record<string, unknown>)[key], `${path}.${key}`);\r\n }\r\n}\r\n\r\nfunction stripDangerousKeys(value: unknown): unknown {\r\n if (value === null || typeof value !== 'object') {\r\n return value;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value.map(stripDangerousKeys);\r\n }\r\n\r\n const result: Record<string, unknown> = {};\r\n for (const [key, child] of Object.entries(value as Record<string, unknown>)) {\r\n if (STRIP_KEYS.has(key)) {\r\n continue;\r\n }\r\n result[key] = stripDangerousKeys(child);\r\n }\r\n return result;\r\n}\r\n\r\nexport function serializeWorkflowJson(workflow: WorkflowDefinition): string {\r\n return JSON.stringify(workflow, null, 2);\r\n}\r\n\r\nexport function parseWorkflowJson(text: string): WorkflowDefinition {\r\n let parsed: unknown;\r\n try {\r\n parsed = JSON.parse(text);\r\n } catch {\r\n throw new WorkflowParseError('Invalid JSON');\r\n }\r\n\r\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {\r\n throw new WorkflowParseError('Workflow JSON must be an object');\r\n }\r\n\r\n assertNoProtoKey(parsed);\r\n return stripDangerousKeys(parsed) as WorkflowDefinition;\r\n}\r\n","// SPDX-License-Identifier: Apache-2.0\r\n\r\nimport type { ExportFormat, WorkflowDefinition } from '../../api/types';\r\nimport { serializeWorkflowJson } from '../core';\r\n\r\nexport function downloadWorkflowJson(draft: WorkflowDefinition, filename = 'workflow.json'): void {\r\n const blob = new Blob([serializeWorkflowJson(draft)], {\r\n type: 'application/json',\r\n });\r\n const url = URL.createObjectURL(blob);\r\n const anchor = document.createElement('a');\r\n anchor.href = url;\r\n anchor.download = filename;\r\n anchor.click();\r\n URL.revokeObjectURL(url);\r\n}\r\n\r\nexport async function exportWorkflowBundle(\r\n draft: WorkflowDefinition,\r\n format: ExportFormat,\r\n): Promise<void> {\r\n if (format !== 'json') {\r\n throw new Error(`Unsupported export format: ${format}`);\r\n }\r\n const name =\r\n typeof draft.name === 'string' && draft.name.length > 0 ? `${draft.name}.json` : 'workflow.json';\r\n downloadWorkflowJson(draft, name);\r\n}\r\n","// SPDX-License-Identifier: Apache-2.0\n\nimport type { WorkflowDefinition } from '../../api/types';\nimport { parseWorkflowJson } from '../core';\n\nexport function readWorkflowJsonFile(file: File): Promise<WorkflowDefinition> {\n return file.text().then(parseWorkflowJson);\n}\n\nexport async function importWorkflowFromFilePicker(): Promise<WorkflowDefinition> {\n return new Promise((resolve, reject) => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = 'application/json,.json';\n input.onchange = () => {\n const file = input.files?.[0];\n if (!file) {\n reject(new Error('No file selected'));\n return;\n }\n readWorkflowJsonFile(file).then(resolve).catch(reject);\n };\n input.click();\n });\n}\n"],"mappings":"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","names":["useCallback","useEffect","useMemo","useState","jsx","jsxs","jsx","jsxs","subtitle","jsx","jsxs","Handle","Position","jsx","jsxs","Handle","Position","jsx","jsxs","Position","jsx","jsxs","jsx","jsxs","useCallback","isDirty","useCallback","useState","useState","useCallback","useCallback","useState","useMemo","Fragment","jsx","jsxs","useEffect","useState","Fragment","jsx","jsxs","useMemo","useMemo","Fragment","jsx","jsxs","entry","Section","useState","Fragment","jsx","jsxs","jsx","jsxs","outgoing","useState","useMemo","useEffect","useCallback","subtitle"]}