@isaacwasserman/remora 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -0
- package/README.md +99 -0
- package/dist/compiler/index.d.ts +8 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/passes/apply-best-practices.d.ts +19 -0
- package/dist/compiler/passes/apply-best-practices.d.ts.map +1 -0
- package/dist/compiler/passes/build-graph.d.ts +7 -0
- package/dist/compiler/passes/build-graph.d.ts.map +1 -0
- package/dist/compiler/passes/generate-constrained-tool-schemas.d.ts +4 -0
- package/dist/compiler/passes/generate-constrained-tool-schemas.d.ts.map +1 -0
- package/dist/compiler/passes/validate-control-flow.d.ts +4 -0
- package/dist/compiler/passes/validate-control-flow.d.ts.map +1 -0
- package/dist/compiler/passes/validate-foreach-target.d.ts +6 -0
- package/dist/compiler/passes/validate-foreach-target.d.ts.map +1 -0
- package/dist/compiler/passes/validate-jmespath.d.ts +4 -0
- package/dist/compiler/passes/validate-jmespath.d.ts.map +1 -0
- package/dist/compiler/passes/validate-references.d.ts +4 -0
- package/dist/compiler/passes/validate-references.d.ts.map +1 -0
- package/dist/compiler/passes/validate-tools.d.ts +4 -0
- package/dist/compiler/passes/validate-tools.d.ts.map +1 -0
- package/dist/compiler/types.d.ts +49 -0
- package/dist/compiler/types.d.ts.map +1 -0
- package/dist/compiler/utils/graph.d.ts +35 -0
- package/dist/compiler/utils/graph.d.ts.map +1 -0
- package/dist/compiler/utils/jmespath-helpers.d.ts +34 -0
- package/dist/compiler/utils/jmespath-helpers.d.ts.map +1 -0
- package/dist/executor/errors.d.ts +32 -0
- package/dist/executor/errors.d.ts.map +1 -0
- package/dist/executor/index.d.ts +20 -0
- package/dist/executor/index.d.ts.map +1 -0
- package/dist/generator/index.d.ts +24 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/prompt.d.ts +6 -0
- package/dist/generator/prompt.d.ts.map +1 -0
- package/dist/lib.d.ts +11 -0
- package/dist/lib.d.ts.map +1 -0
- package/dist/lib.js +1973 -0
- package/dist/lib.js.map +25 -0
- package/dist/types.d.ts +234 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/viewer/edges/workflow-edge.d.ts +3 -0
- package/dist/viewer/edges/workflow-edge.d.ts.map +1 -0
- package/dist/viewer/graph-layout.d.ts +13 -0
- package/dist/viewer/graph-layout.d.ts.map +1 -0
- package/dist/viewer/index.d.ts +5 -0
- package/dist/viewer/index.d.ts.map +1 -0
- package/dist/viewer/index.js +1554 -0
- package/dist/viewer/index.js.map +23 -0
- package/dist/viewer/nodes/base-node.d.ts +17 -0
- package/dist/viewer/nodes/base-node.d.ts.map +1 -0
- package/dist/viewer/nodes/end-node.d.ts +3 -0
- package/dist/viewer/nodes/end-node.d.ts.map +1 -0
- package/dist/viewer/nodes/extract-data-node.d.ts +3 -0
- package/dist/viewer/nodes/extract-data-node.d.ts.map +1 -0
- package/dist/viewer/nodes/for-each-node.d.ts +3 -0
- package/dist/viewer/nodes/for-each-node.d.ts.map +1 -0
- package/dist/viewer/nodes/group-header-node.d.ts +3 -0
- package/dist/viewer/nodes/group-header-node.d.ts.map +1 -0
- package/dist/viewer/nodes/llm-prompt-node.d.ts +3 -0
- package/dist/viewer/nodes/llm-prompt-node.d.ts.map +1 -0
- package/dist/viewer/nodes/start-node.d.ts +3 -0
- package/dist/viewer/nodes/start-node.d.ts.map +1 -0
- package/dist/viewer/nodes/start-step-node.d.ts +3 -0
- package/dist/viewer/nodes/start-step-node.d.ts.map +1 -0
- package/dist/viewer/nodes/switch-case-node.d.ts +3 -0
- package/dist/viewer/nodes/switch-case-node.d.ts.map +1 -0
- package/dist/viewer/nodes/tool-call-node.d.ts +3 -0
- package/dist/viewer/nodes/tool-call-node.d.ts.map +1 -0
- package/dist/viewer/panels/step-detail-panel.d.ts +10 -0
- package/dist/viewer/panels/step-detail-panel.d.ts.map +1 -0
- package/dist/viewer/workflow-viewer.d.ts +9 -0
- package/dist/viewer/workflow-viewer.d.ts.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/viewer/graph-layout.ts", "../src/viewer/workflow-viewer.tsx", "../src/viewer/edges/workflow-edge.tsx", "../src/viewer/nodes/end-node.tsx", "../src/viewer/nodes/base-node.tsx", "../src/viewer/nodes/extract-data-node.tsx", "../src/viewer/nodes/for-each-node.tsx", "../src/viewer/nodes/group-header-node.tsx", "../src/viewer/nodes/llm-prompt-node.tsx", "../src/viewer/nodes/start-node.tsx", "../src/viewer/nodes/start-step-node.tsx", "../src/viewer/nodes/switch-case-node.tsx", "../src/viewer/nodes/tool-call-node.tsx", "../src/viewer/panels/step-detail-panel.tsx"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import dagre from \"@dagrejs/dagre\";\nimport type { Edge, Node } from \"@xyflow/react\";\nimport type { Diagnostic } from \"../compiler/types\";\nimport type { WorkflowDefinition, WorkflowStep } from \"../types\";\n\nexport interface StepNodeData {\n\tstep: WorkflowStep;\n\tdiagnostics: Diagnostic[];\n\thasSourceEdge?: boolean;\n}\n\nconst NODE_WIDTH = 300;\nconst NODE_HEIGHT = 180;\nconst END_NODE_SIZE = 60;\nconst START_NODE_SIZE = 60;\nconst GROUP_HEADER_WIDTH = 280;\nconst GROUP_HEADER_HEIGHT = 80;\nconst GROUP_PADDING = 30;\nconst GROUP_HEADER = 40;\n\nconst START_NODE_ID = \"__start__\";\n\nfunction getOrThrow<K, V>(map: Map<K, V>, key: K): V {\n\tconst val = map.get(key);\n\tif (val === undefined) throw new Error(`Missing map key: ${String(key)}`);\n\treturn val;\n}\n\nfunction stepNodeType(step: WorkflowStep): string {\n\tswitch (step.type) {\n\t\tcase \"tool-call\":\n\t\t\treturn \"toolCall\";\n\t\tcase \"llm-prompt\":\n\t\t\treturn \"llmPrompt\";\n\t\tcase \"extract-data\":\n\t\t\treturn \"extractData\";\n\t\tcase \"switch-case\":\n\t\t\treturn \"switchCase\";\n\t\tcase \"for-each\":\n\t\t\treturn \"forEach\";\n\t\tcase \"start\":\n\t\t\treturn \"startStep\";\n\t\tcase \"end\":\n\t\t\treturn \"end\";\n\t}\n}\n\nfunction renderExpression(\n\texpr:\n\t\t| { type: \"literal\"; value: unknown }\n\t\t| { type: \"jmespath\"; expression: string },\n): string {\n\tif (expr.type === \"literal\") return JSON.stringify(expr.value);\n\treturn expr.expression;\n}\n\nfunction nodeSize(step: WorkflowStep): { w: number; h: number } {\n\treturn step.type === \"end\"\n\t\t? { w: END_NODE_SIZE, h: END_NODE_SIZE }\n\t\t: { w: NODE_WIDTH, h: NODE_HEIGHT };\n}\n\nfunction collectChildSteps(\n\tstep: WorkflowStep,\n\tstepMap: Map<string, WorkflowStep>,\n): Set<string> {\n\tconst children = new Set<string>();\n\tconst continuation = step.nextStepId;\n\n\tconst seeds: string[] = [];\n\tif (step.type === \"for-each\") {\n\t\tseeds.push(step.params.loopBodyStepId);\n\t} else if (step.type === \"switch-case\") {\n\t\tfor (const c of step.params.cases) {\n\t\t\tseeds.push(c.branchBodyStepId);\n\t\t}\n\t} else {\n\t\treturn children;\n\t}\n\n\tconst queue = [...seeds];\n\twhile (queue.length > 0) {\n\t\tconst id = queue.shift();\n\t\tif (id === undefined) continue;\n\t\tif (children.has(id) || id === continuation) continue;\n\t\tconst s = stepMap.get(id);\n\t\tif (!s) continue;\n\t\tchildren.add(id);\n\t\tif (s.nextStepId) queue.push(s.nextStepId);\n\t\tif (s.type === \"switch-case\") {\n\t\t\tfor (const c of s.params.cases) queue.push(c.branchBodyStepId);\n\t\t}\n\t\tif (s.type === \"for-each\") {\n\t\t\tqueue.push(s.params.loopBodyStepId);\n\t\t}\n\t}\n\treturn children;\n}\n\nfunction buildParentMap(\n\tworkflow: WorkflowDefinition,\n\tstepMap: Map<string, WorkflowStep>,\n): Map<string, string> {\n\tconst parentMap = new Map<string, string>();\n\tconst allGroupChildren = new Map<string, Set<string>>();\n\n\tfor (const step of workflow.steps) {\n\t\tif (step.type === \"for-each\" || step.type === \"switch-case\") {\n\t\t\tallGroupChildren.set(step.id, collectChildSteps(step, stepMap));\n\t\t}\n\t}\n\n\tfor (const [groupId, children] of allGroupChildren) {\n\t\tfor (const childId of children) {\n\t\t\tconst currentParent = parentMap.get(childId);\n\t\t\tif (!currentParent) {\n\t\t\t\tparentMap.set(childId, groupId);\n\t\t\t} else {\n\t\t\t\tconst currentParentChildren = allGroupChildren.get(currentParent);\n\t\t\t\tif (currentParentChildren?.has(groupId)) {\n\t\t\t\t\tparentMap.set(childId, groupId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn parentMap;\n}\n\nfunction getDirectChildren(\n\tgroupId: string,\n\tparentMap: Map<string, string>,\n): Set<string> {\n\tconst direct = new Set<string>();\n\tfor (const [childId, pid] of parentMap) {\n\t\tif (pid === groupId) direct.add(childId);\n\t}\n\treturn direct;\n}\n\nfunction groupProcessingOrder(\n\tgroupIds: Set<string>,\n\tparentMap: Map<string, string>,\n): string[] {\n\tconst order: string[] = [];\n\tconst visited = new Set<string>();\n\n\tfunction visit(id: string) {\n\t\tif (visited.has(id)) return;\n\t\tvisited.add(id);\n\t\tfor (const [childId, pid] of parentMap) {\n\t\t\tif (pid === id && groupIds.has(childId)) {\n\t\t\t\tvisit(childId);\n\t\t\t}\n\t\t}\n\t\torder.push(id);\n\t}\n\n\tfor (const id of groupIds) {\n\t\tvisit(id);\n\t}\n\treturn order;\n}\n\nfunction groupHeaderId(groupId: string): string {\n\treturn `__header__${groupId}`;\n}\n\nfunction getNodeDimensions(\n\tnodeId: string,\n\tgroupIds: Set<string>,\n\tcomputedSizes: Map<string, { w: number; h: number }>,\n\tstepMap: Map<string, WorkflowStep>,\n): { w: number; h: number } {\n\tif (groupIds.has(nodeId)) {\n\t\treturn getOrThrow(computedSizes, nodeId);\n\t}\n\treturn nodeSize(getOrThrow(stepMap, nodeId));\n}\n\nexport function buildLayout(\n\tworkflow: WorkflowDefinition,\n\tdiagnostics: Diagnostic[] = [],\n): { nodes: Node[]; edges: Edge[] } {\n\t// --- Step 1: Build maps ---\n\tconst diagnosticsByStep = new Map<string, Diagnostic[]>();\n\tfor (const d of diagnostics) {\n\t\tif (d.location.stepId) {\n\t\t\tconst existing = diagnosticsByStep.get(d.location.stepId) ?? [];\n\t\t\texisting.push(d);\n\t\t\tdiagnosticsByStep.set(d.location.stepId, existing);\n\t\t}\n\t}\n\n\tconst stepMap = new Map<string, WorkflowStep>();\n\tfor (const step of workflow.steps) {\n\t\tstepMap.set(step.id, step);\n\t}\n\n\tconst parentMap = buildParentMap(workflow, stepMap);\n\n\t// --- Step 2: Identify groups ---\n\tconst groupIds = new Set<string>();\n\tfor (const step of workflow.steps) {\n\t\tif (step.type === \"for-each\" || step.type === \"switch-case\") {\n\t\t\tconst hasChildren = [...parentMap.values()].some(\n\t\t\t\t(pid) => pid === step.id,\n\t\t\t);\n\t\t\tif (hasChildren) groupIds.add(step.id);\n\t\t}\n\t}\n\n\t// --- Step 3: Compute group sizes bottom-up ---\n\tconst processOrder = groupProcessingOrder(groupIds, parentMap);\n\tconst computedSizes = new Map<string, { w: number; h: number }>();\n\tconst groupChildPositions = new Map<\n\t\tstring,\n\t\tMap<string, { x: number; y: number }>\n\t>();\n\n\tfor (const groupId of processOrder) {\n\t\tconst groupStep = getOrThrow(stepMap, groupId);\n\t\tconst directChildren = getDirectChildren(groupId, parentMap);\n\t\tif (directChildren.size === 0) {\n\t\t\tgroupIds.delete(groupId);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst subG = new dagre.graphlib.Graph();\n\t\tsubG.setGraph({ rankdir: \"TB\", ranksep: 60, nodesep: 40 });\n\t\tsubG.setDefaultEdgeLabel(() => ({}));\n\n\t\t// Add a synthetic header node for this group\n\t\tconst headerId = groupHeaderId(groupId);\n\t\tsubG.setNode(headerId, {\n\t\t\twidth: GROUP_HEADER_WIDTH,\n\t\t\theight: GROUP_HEADER_HEIGHT,\n\t\t});\n\n\t\t// Add child nodes\n\t\tfor (const childId of directChildren) {\n\t\t\tconst { w, h } = getNodeDimensions(\n\t\t\t\tchildId,\n\t\t\t\tgroupIds,\n\t\t\t\tcomputedSizes,\n\t\t\t\tstepMap,\n\t\t\t);\n\t\t\tsubG.setNode(childId, { width: w, height: h });\n\t\t}\n\n\t\t// Edges from header to entry points\n\t\tif (groupStep.type === \"switch-case\") {\n\t\t\tfor (const c of groupStep.params.cases) {\n\t\t\t\tif (directChildren.has(c.branchBodyStepId)) {\n\t\t\t\t\tsubG.setEdge(headerId, c.branchBodyStepId);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (groupStep.type === \"for-each\") {\n\t\t\tif (directChildren.has(groupStep.params.loopBodyStepId)) {\n\t\t\t\tsubG.setEdge(headerId, groupStep.params.loopBodyStepId);\n\t\t\t}\n\t\t}\n\n\t\t// Edges between direct children\n\t\tfor (const childId of directChildren) {\n\t\t\tconst step = getOrThrow(stepMap, childId);\n\t\t\tif (step.nextStepId && directChildren.has(step.nextStepId)) {\n\t\t\t\tsubG.setEdge(childId, step.nextStepId);\n\t\t\t}\n\t\t\tif (step.type === \"switch-case\") {\n\t\t\t\tfor (const c of step.params.cases) {\n\t\t\t\t\tif (directChildren.has(c.branchBodyStepId)) {\n\t\t\t\t\t\tsubG.setEdge(childId, c.branchBodyStepId);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (step.type === \"for-each\") {\n\t\t\t\tif (directChildren.has(step.params.loopBodyStepId)) {\n\t\t\t\t\tsubG.setEdge(childId, step.params.loopBodyStepId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tdagre.layout(subG);\n\n\t\tlet minX = Number.POSITIVE_INFINITY;\n\t\tlet minY = Number.POSITIVE_INFINITY;\n\t\tlet maxX = Number.NEGATIVE_INFINITY;\n\t\tlet maxY = Number.NEGATIVE_INFINITY;\n\n\t\tconst allSubNodes = new Set(directChildren);\n\t\tallSubNodes.add(headerId);\n\n\t\tconst rawPositions = new Map<string, { x: number; y: number }>();\n\t\tfor (const nodeId of allSubNodes) {\n\t\t\tconst pos = subG.node(nodeId);\n\t\t\tlet w: number;\n\t\t\tlet h: number;\n\t\t\tif (nodeId === headerId) {\n\t\t\t\tw = GROUP_HEADER_WIDTH;\n\t\t\t\th = GROUP_HEADER_HEIGHT;\n\t\t\t} else {\n\t\t\t\tconst dims = getNodeDimensions(\n\t\t\t\t\tnodeId,\n\t\t\t\t\tgroupIds,\n\t\t\t\t\tcomputedSizes,\n\t\t\t\t\tstepMap,\n\t\t\t\t);\n\t\t\t\tw = dims.w;\n\t\t\t\th = dims.h;\n\t\t\t}\n\t\t\tconst x = pos.x - w / 2;\n\t\t\tconst y = pos.y - h / 2;\n\t\t\trawPositions.set(nodeId, { x, y });\n\t\t\tminX = Math.min(minX, x);\n\t\t\tminY = Math.min(minY, y);\n\t\t\tmaxX = Math.max(maxX, x + w);\n\t\t\tmaxY = Math.max(maxY, y + h);\n\t\t}\n\n\t\tconst positions = new Map<string, { x: number; y: number }>();\n\t\tfor (const [nodeId, pos] of rawPositions) {\n\t\t\tpositions.set(nodeId, {\n\t\t\t\tx: pos.x - minX + GROUP_PADDING,\n\t\t\t\ty: pos.y - minY + GROUP_HEADER,\n\t\t\t});\n\t\t}\n\t\tgroupChildPositions.set(groupId, positions);\n\n\t\tconst contentWidth = maxX - minX;\n\t\tconst contentHeight = maxY - minY;\n\t\tcomputedSizes.set(groupId, {\n\t\t\tw: contentWidth + GROUP_PADDING * 2,\n\t\t\th: contentHeight + GROUP_HEADER + GROUP_PADDING,\n\t\t});\n\t}\n\n\t// --- Step 4: Top-level dagre layout ---\n\tconst topG = new dagre.graphlib.Graph();\n\ttopG.setGraph({ rankdir: \"TB\", ranksep: 80, nodesep: 60 });\n\ttopG.setDefaultEdgeLabel(() => ({}));\n\n\t// Start node\n\ttopG.setNode(START_NODE_ID, {\n\t\twidth: START_NODE_SIZE,\n\t\theight: START_NODE_SIZE,\n\t});\n\n\tconst topLevelStepIds: string[] = [];\n\tfor (const step of workflow.steps) {\n\t\tif (!parentMap.has(step.id)) {\n\t\t\ttopLevelStepIds.push(step.id);\n\t\t\tconst { w, h } = getNodeDimensions(\n\t\t\t\tstep.id,\n\t\t\t\tgroupIds,\n\t\t\t\tcomputedSizes,\n\t\t\t\tstepMap,\n\t\t\t);\n\t\t\ttopG.setNode(step.id, { width: w, height: h });\n\t\t}\n\t}\n\n\t// Start → initial step\n\ttopG.setEdge(START_NODE_ID, workflow.initialStepId);\n\n\tconst topLevelSet = new Set(topLevelStepIds);\n\tfor (const stepId of topLevelStepIds) {\n\t\tconst step = getOrThrow(stepMap, stepId);\n\t\tif (step.nextStepId && topLevelSet.has(step.nextStepId)) {\n\t\t\ttopG.setEdge(stepId, step.nextStepId);\n\t\t}\n\t\tif (step.type === \"switch-case\") {\n\t\t\tfor (const c of step.params.cases) {\n\t\t\t\tif (topLevelSet.has(c.branchBodyStepId)) {\n\t\t\t\t\ttopG.setEdge(stepId, c.branchBodyStepId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (step.type === \"for-each\") {\n\t\t\tif (topLevelSet.has(step.params.loopBodyStepId)) {\n\t\t\t\ttopG.setEdge(stepId, step.params.loopBodyStepId);\n\t\t\t}\n\t\t}\n\t}\n\n\tdagre.layout(topG);\n\n\tconst topLevelPositions = new Map<string, { x: number; y: number }>();\n\n\tconst startPos = topG.node(START_NODE_ID);\n\ttopLevelPositions.set(START_NODE_ID, {\n\t\tx: startPos.x - START_NODE_SIZE / 2,\n\t\ty: startPos.y - START_NODE_SIZE / 2,\n\t});\n\n\tfor (const stepId of topLevelStepIds) {\n\t\tconst pos = topG.node(stepId);\n\t\tconst { w, h } = getNodeDimensions(\n\t\t\tstepId,\n\t\t\tgroupIds,\n\t\t\tcomputedSizes,\n\t\t\tstepMap,\n\t\t);\n\t\ttopLevelPositions.set(stepId, {\n\t\t\tx: pos.x - w / 2,\n\t\t\ty: pos.y - h / 2,\n\t\t});\n\t}\n\n\t// --- Step 5: Build React Flow nodes ---\n\tconst nodes: Node[] = [];\n\n\t// Start node\n\tconst startNodePos = getOrThrow(topLevelPositions, START_NODE_ID);\n\tnodes.push({\n\t\tid: START_NODE_ID,\n\t\ttype: \"start\",\n\t\tposition: startNodePos,\n\t\tdata: {},\n\t\tselectable: false,\n\t});\n\n\tfunction addNodesForContext(\n\t\tnodeIds: Iterable<string>,\n\t\tgetPosition: (id: string) => { x: number; y: number },\n\t\tparentId?: string,\n\t) {\n\t\tconst groups: string[] = [];\n\t\tconst headers: string[] = [];\n\t\tconst nonGroups: string[] = [];\n\t\tfor (const id of nodeIds) {\n\t\t\tif (groupIds.has(id)) groups.push(id);\n\t\t\telse if (id.startsWith(\"__header__\")) headers.push(id);\n\t\t\telse nonGroups.push(id);\n\t\t}\n\n\t\tfor (const id of groups) {\n\t\t\tconst step = getOrThrow(stepMap, id);\n\t\t\tconst pos = getPosition(id);\n\t\t\tconst size = getOrThrow(computedSizes, id);\n\n\t\t\tnodes.push({\n\t\t\t\tid,\n\t\t\t\ttype: stepNodeType(step),\n\t\t\t\tposition: pos,\n\t\t\t\tdata: {\n\t\t\t\t\tstep,\n\t\t\t\t\tdiagnostics: diagnosticsByStep.get(id) ?? [],\n\t\t\t\t\tisGroup: true,\n\t\t\t\t\tgroupWidth: size.w,\n\t\t\t\t\tgroupHeight: size.h,\n\t\t\t\t\thasSourceEdge: !!step.nextStepId,\n\t\t\t\t},\n\t\t\t\tstyle: { width: size.w, height: size.h },\n\t\t\t\t...(parentId ? { parentId, extent: \"parent\" as const } : {}),\n\t\t\t});\n\n\t\t\tconst childPositions = getOrThrow(groupChildPositions, id);\n\t\t\taddNodesForContext(\n\t\t\t\tchildPositions.keys(),\n\t\t\t\t(childId) => getOrThrow(childPositions, childId),\n\t\t\t\tid,\n\t\t\t);\n\t\t}\n\n\t\tfor (const id of headers) {\n\t\t\tconst pos = getPosition(id);\n\t\t\tconst gid = id.replace(\"__header__\", \"\");\n\t\t\tconst step = getOrThrow(stepMap, gid);\n\n\t\t\tif (step.type === \"switch-case\") {\n\t\t\t\tnodes.push({\n\t\t\t\t\tid,\n\t\t\t\t\ttype: \"groupHeader\",\n\t\t\t\t\tposition: pos,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tvariant: \"switch\",\n\t\t\t\t\t\tdescription: step.description,\n\t\t\t\t\t\texpression: renderExpression(step.params.switchOn),\n\t\t\t\t\t},\n\t\t\t\t\t...(parentId ? { parentId, extent: \"parent\" as const } : {}),\n\t\t\t\t});\n\t\t\t} else if (step.type === \"for-each\") {\n\t\t\t\tnodes.push({\n\t\t\t\t\tid,\n\t\t\t\t\ttype: \"groupHeader\",\n\t\t\t\t\tposition: pos,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tvariant: \"loop\",\n\t\t\t\t\t\tdescription: step.description,\n\t\t\t\t\t\ttarget: renderExpression(step.params.target),\n\t\t\t\t\t\titemName: step.params.itemName,\n\t\t\t\t\t},\n\t\t\t\t\t...(parentId ? { parentId, extent: \"parent\" as const } : {}),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfor (const id of nonGroups) {\n\t\t\tconst step = getOrThrow(stepMap, id);\n\t\t\tconst pos = getPosition(id);\n\n\t\t\tnodes.push({\n\t\t\t\tid,\n\t\t\t\ttype: stepNodeType(step),\n\t\t\t\tposition: pos,\n\t\t\t\tdata: {\n\t\t\t\t\tstep,\n\t\t\t\t\tdiagnostics: diagnosticsByStep.get(id) ?? [],\n\t\t\t\t\thasSourceEdge: !!step.nextStepId,\n\t\t\t\t},\n\t\t\t\t...(parentId ? { parentId, extent: \"parent\" as const } : {}),\n\t\t\t});\n\t\t}\n\t}\n\n\taddNodesForContext(topLevelStepIds, (id) =>\n\t\tgetOrThrow(topLevelPositions, id),\n\t);\n\n\t// --- Step 6: Build edges ---\n\tconst edges: Edge[] = [];\n\n\t// Start → initial step\n\tedges.push({\n\t\tid: `${START_NODE_ID}->${workflow.initialStepId}`,\n\t\tsource: START_NODE_ID,\n\t\ttarget: workflow.initialStepId,\n\t\ttype: \"workflow\",\n\t\tdata: { edgeKind: \"sequential\" },\n\t});\n\n\tfor (const step of workflow.steps) {\n\t\tif (step.type === \"switch-case\") {\n\t\t\tif (groupIds.has(step.id)) {\n\t\t\t\tconst headerId = groupHeaderId(step.id);\n\t\t\t\tfor (const c of step.params.cases) {\n\t\t\t\t\tconst label =\n\t\t\t\t\t\tc.value.type === \"default\" ? \"default\" : renderExpression(c.value);\n\t\t\t\t\tedges.push({\n\t\t\t\t\t\tid: `${headerId}->${c.branchBodyStepId}`,\n\t\t\t\t\t\tsource: headerId,\n\t\t\t\t\t\ttarget: c.branchBodyStepId,\n\t\t\t\t\t\tlabel,\n\t\t\t\t\t\ttype: \"workflow\",\n\t\t\t\t\t\tdata: { edgeKind: \"branch\" },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (step.nextStepId) {\n\t\t\t\tedges.push({\n\t\t\t\t\tid: `${step.id}->${step.nextStepId}`,\n\t\t\t\t\tsource: step.id,\n\t\t\t\t\ttarget: step.nextStepId,\n\t\t\t\t\ttype: \"workflow\",\n\t\t\t\t\tdata: { edgeKind: \"sequential\" },\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (step.type === \"for-each\") {\n\t\t\tif (groupIds.has(step.id)) {\n\t\t\t\tconst headerId = groupHeaderId(step.id);\n\t\t\t\tedges.push({\n\t\t\t\t\tid: `${headerId}->${step.params.loopBodyStepId}`,\n\t\t\t\t\tsource: headerId,\n\t\t\t\t\ttarget: step.params.loopBodyStepId,\n\t\t\t\t\ttype: \"workflow\",\n\t\t\t\t\tdata: { edgeKind: \"sequential\" },\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (step.nextStepId) {\n\t\t\t\tedges.push({\n\t\t\t\t\tid: `${step.id}->${step.nextStepId}`,\n\t\t\t\t\tsource: step.id,\n\t\t\t\t\ttarget: step.nextStepId,\n\t\t\t\t\ttype: \"workflow\",\n\t\t\t\t\tdata: { edgeKind: \"sequential\" },\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (step.nextStepId) {\n\t\t\tedges.push({\n\t\t\t\tid: `${step.id}->${step.nextStepId}`,\n\t\t\t\tsource: step.id,\n\t\t\t\ttarget: step.nextStepId,\n\t\t\t\ttype: \"workflow\",\n\t\t\t\tdata: { edgeKind: \"sequential\" },\n\t\t\t});\n\t\t}\n\t}\n\n\treturn { nodes, edges };\n}\n",
|
|
6
|
+
"import {\n\tBackground,\n\tControls,\n\ttype EdgeTypes,\n\tMiniMap,\n\ttype NodeTypes,\n\tReactFlow,\n\tuseEdgesState,\n\tuseNodesState,\n} from \"@xyflow/react\";\nimport type React from \"react\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { Diagnostic } from \"../compiler/types\";\nimport type { WorkflowDefinition, WorkflowStep } from \"../types\";\nimport { WorkflowEdge } from \"./edges/workflow-edge\";\nimport { buildLayout, type StepNodeData } from \"./graph-layout\";\nimport { EndNode } from \"./nodes/end-node\";\nimport { ExtractDataNode } from \"./nodes/extract-data-node\";\nimport { ForEachNode } from \"./nodes/for-each-node\";\nimport { GroupHeaderNode } from \"./nodes/group-header-node\";\nimport { LlmPromptNode } from \"./nodes/llm-prompt-node\";\nimport { StartNode } from \"./nodes/start-node\";\nimport { StartStepNode } from \"./nodes/start-step-node\";\nimport { SwitchCaseNode } from \"./nodes/switch-case-node\";\nimport { ToolCallNode } from \"./nodes/tool-call-node\";\nimport { StepDetailPanel } from \"./panels/step-detail-panel\";\n\nconst nodeTypes: NodeTypes = {\n\ttoolCall: ToolCallNode,\n\tllmPrompt: LlmPromptNode,\n\textractData: ExtractDataNode,\n\tswitchCase: SwitchCaseNode,\n\tgroupHeader: GroupHeaderNode,\n\tforEach: ForEachNode,\n\tend: EndNode,\n\tstart: StartNode,\n\tstartStep: StartStepNode,\n};\n\nconst edgeTypes: EdgeTypes = {\n\tworkflow: WorkflowEdge,\n};\n\nconst EMPTY_DIAGNOSTICS: Diagnostic[] = [];\n\nexport interface WorkflowViewerProps {\n\tworkflow: WorkflowDefinition;\n\tdiagnostics?: Diagnostic[];\n\tonStepSelect?: (stepId: string | null) => void;\n}\n\nexport function WorkflowViewer({\n\tworkflow,\n\tdiagnostics = EMPTY_DIAGNOSTICS,\n\tonStepSelect,\n}: WorkflowViewerProps) {\n\tconst layout = useMemo(\n\t\t() => buildLayout(workflow, diagnostics),\n\t\t[workflow, diagnostics],\n\t);\n\n\tconst [nodes, setNodes, onNodesChange] = useNodesState(layout.nodes);\n\tconst [edges, setEdges, onEdgesChange] = useEdgesState(layout.edges);\n\tconst [selectedStep, setSelectedStep] = useState<WorkflowStep | null>(null);\n\tconst [selectedDiagnostics, setSelectedDiagnostics] =\n\t\tuseState<Diagnostic[]>(EMPTY_DIAGNOSTICS);\n\n\tuseEffect(() => {\n\t\tsetNodes(layout.nodes);\n\t\tsetEdges(layout.edges);\n\t\tsetSelectedStep(null);\n\t}, [layout, setNodes, setEdges]);\n\n\tconst onNodeClick = useCallback(\n\t\t(_: React.MouseEvent, node: { id: string; data: unknown }) => {\n\t\t\tconst data = node.data as StepNodeData;\n\t\t\tif (!data.step) return;\n\t\t\tsetSelectedStep(data.step);\n\t\t\tsetSelectedDiagnostics(data.diagnostics);\n\t\t\tonStepSelect?.(data.step.id);\n\t\t},\n\t\t[onStepSelect],\n\t);\n\n\tconst onPaneClick = useCallback(() => {\n\t\tsetSelectedStep(null);\n\t\tsetSelectedDiagnostics([]);\n\t\tonStepSelect?.(null);\n\t}, [onStepSelect]);\n\n\treturn (\n\t\t<div className=\"flex h-full w-full\">\n\t\t\t<div className=\"flex-1 relative\">\n\t\t\t\t<ReactFlow\n\t\t\t\t\tnodes={nodes}\n\t\t\t\t\tedges={edges}\n\t\t\t\t\tonNodesChange={onNodesChange}\n\t\t\t\t\tonEdgesChange={onEdgesChange}\n\t\t\t\t\tonNodeClick={onNodeClick}\n\t\t\t\t\tonPaneClick={onPaneClick}\n\t\t\t\t\tnodeTypes={nodeTypes}\n\t\t\t\t\tedgeTypes={edgeTypes}\n\t\t\t\t\tfitView\n\t\t\t\t\tfitViewOptions={{ padding: 0.2 }}\n\t\t\t\t\tnodesDraggable={false}\n\t\t\t\t\tdefaultEdgeOptions={{\n\t\t\t\t\t\ttype: \"workflow\",\n\t\t\t\t\t}}\n\t\t\t\t\tproOptions={{ hideAttribution: true }}\n\t\t\t\t>\n\t\t\t\t\t<Background color=\"#e5e7eb\" gap={16} />\n\t\t\t\t\t<Controls showInteractive={false} />\n\t\t\t\t\t<MiniMap\n\t\t\t\t\t\tnodeStrokeWidth={2}\n\t\t\t\t\t\tpannable\n\t\t\t\t\t\tzoomable\n\t\t\t\t\t\tstyle={{ border: \"1px solid #e5e7eb\" }}\n\t\t\t\t\t\tnodeColor={\"rgba(0, 0, 0, 0.1)\"}\n\t\t\t\t\t/>\n\t\t\t\t</ReactFlow>\n\t\t\t</div>\n\t\t\t{selectedStep && (\n\t\t\t\t<StepDetailPanel\n\t\t\t\t\tstep={selectedStep}\n\t\t\t\t\tdiagnostics={selectedDiagnostics}\n\t\t\t\t\tonClose={() => {\n\t\t\t\t\t\tsetSelectedStep(null);\n\t\t\t\t\t\tsetSelectedDiagnostics([]);\n\t\t\t\t\t\tonStepSelect?.(null);\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",
|
|
7
|
+
"import {\n\tBaseEdge,\n\tEdgeLabelRenderer,\n\ttype EdgeProps,\n\tgetBezierPath,\n} from \"@xyflow/react\";\n\nexport function WorkflowEdge({\n\tid,\n\tsourceX,\n\tsourceY,\n\ttargetX,\n\ttargetY,\n\tsourcePosition,\n\ttargetPosition,\n\tlabel,\n\tdata,\n\tmarkerEnd,\n\tstyle,\n}: EdgeProps) {\n\tconst edgeKind = (data?.edgeKind as string) ?? \"sequential\";\n\tconst isContinuation = edgeKind === \"continuation\";\n\n\tconst [edgePath, labelX, labelY] = getBezierPath({\n\t\tsourceX,\n\t\tsourceY,\n\t\tsourcePosition,\n\t\ttargetX,\n\t\ttargetY,\n\t\ttargetPosition,\n\t});\n\n\treturn (\n\t\t<>\n\t\t\t<BaseEdge\n\t\t\t\tid={id}\n\t\t\t\tpath={edgePath}\n\t\t\t\tmarkerEnd={markerEnd}\n\t\t\t\tstyle={{\n\t\t\t\t\t...style,\n\t\t\t\t\tstrokeDasharray: isContinuation ? \"6 3\" : undefined,\n\t\t\t\t\tstroke: isContinuation ? \"#9ca3af\" : \"#6b7280\",\n\t\t\t\t\tstrokeWidth: 1.5,\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t{label && (\n\t\t\t\t<EdgeLabelRenderer>\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\ttransform: `translate(-50%, -50%) translate(${labelX}px,${labelY}px)`,\n\t\t\t\t\t\t\tpointerEvents: \"all\",\n\t\t\t\t\t\t\tzIndex: 10,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName=\"bg-white px-1.5 py-0.5 rounded text-[10px] text-gray-700 font-medium border border-gray-200 shadow whitespace-nowrap\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{label}\n\t\t\t\t\t</div>\n\t\t\t\t</EdgeLabelRenderer>\n\t\t\t)}\n\t\t</>\n\t);\n}\n",
|
|
8
|
+
"import type { NodeProps } from \"@xyflow/react\";\nimport { Handle, Position } from \"@xyflow/react\";\nimport type { StepNodeData } from \"../graph-layout\";\n\nexport function EndNode({ data, selected }: NodeProps) {\n\tconst { diagnostics } = data as unknown as StepNodeData;\n\tconst hasErrors = diagnostics.some((d) => d.severity === \"error\");\n\n\tlet ringClass = \"\";\n\tif (hasErrors) ringClass = \"ring-2 ring-red-500\";\n\telse if (selected) ringClass = \"ring-2 ring-blue-400\";\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`bg-gray-100 rounded-full w-[60px] h-[60px] flex items-center justify-center shadow-sm border border-gray-300 ${ringClass}`}\n\t\t>\n\t\t\t<Handle\n\t\t\t\ttype=\"target\"\n\t\t\t\tposition={Position.Top}\n\t\t\t\tclassName=\"!bg-gray-400 !w-2 !h-2\"\n\t\t\t/>\n\t\t\t<span className=\"text-xs font-medium text-gray-500\">End</span>\n\t\t</div>\n\t);\n}\n",
|
|
9
|
+
"import { Handle, Position } from \"@xyflow/react\";\nimport type { ReactNode } from \"react\";\nimport type { Diagnostic } from \"../../compiler/types\";\n\ninterface BaseNodeProps {\n\tid: string;\n\tname: string;\n\ttypeLabel: string;\n\ttypeLabelColor: string;\n\taccent: string;\n\tdescription: string;\n\tdiagnostics: Diagnostic[];\n\tchildren?: ReactNode;\n\tselected?: boolean;\n\thasSourceEdge?: boolean;\n}\n\nexport function BaseNode({\n\tid,\n\tname,\n\ttypeLabel,\n\ttypeLabelColor,\n\taccent,\n\tdescription,\n\tdiagnostics,\n\tchildren,\n\tselected,\n\thasSourceEdge = true,\n}: BaseNodeProps) {\n\tconst hasErrors = diagnostics.some((d) => d.severity === \"error\");\n\tconst hasWarnings =\n\t\t!hasErrors && diagnostics.some((d) => d.severity === \"warning\");\n\n\tlet ringClass = \"\";\n\tif (hasErrors) ringClass = \"ring-2 ring-red-500\";\n\telse if (hasWarnings) ringClass = \"ring-2 ring-amber-400\";\n\telse if (selected) ringClass = \"ring-2 ring-blue-400\";\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`bg-white rounded-lg shadow-md border-l-4 w-[300px] ${ringClass}`}\n\t\t\tstyle={{ borderLeftColor: accent }}\n\t\t>\n\t\t\t<Handle\n\t\t\t\ttype=\"target\"\n\t\t\t\tposition={Position.Top}\n\t\t\t\tclassName=\"!bg-gray-400 !w-2 !h-2\"\n\t\t\t/>\n\t\t\t<div className=\"px-3 py-2.5\">\n\t\t\t\t<div className=\"flex items-center justify-between gap-2\">\n\t\t\t\t\t<div className=\"flex items-center gap-2 min-w-0\">\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={`text-[10px] font-semibold uppercase tracking-wide shrink-0 ${typeLabelColor}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{typeLabel}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<div className=\"font-medium text-sm text-gray-900 truncate\">\n\t\t\t\t\t\t\t{name}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t{(hasErrors || hasWarnings) && (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={`text-xs px-1.5 py-0.5 rounded-full font-medium shrink-0 ${\n\t\t\t\t\t\t\t\thasErrors\n\t\t\t\t\t\t\t\t\t? \"bg-red-100 text-red-700\"\n\t\t\t\t\t\t\t\t\t: \"bg-amber-100 text-amber-700\"\n\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{diagnostics.length}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"text-[11px] text-gray-400 font-mono\">{id}</div>\n\t\t\t\t<div className=\"text-[11px] text-gray-500 mt-1\">{description}</div>\n\t\t\t\t{children && (\n\t\t\t\t\t<div className=\"mt-2 border-t border-gray-100 pt-2\">{children}</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t{hasSourceEdge && (\n\t\t\t\t<Handle\n\t\t\t\t\ttype=\"source\"\n\t\t\t\t\tposition={Position.Bottom}\n\t\t\t\t\tclassName=\"!bg-gray-400 !w-2 !h-2\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",
|
|
10
|
+
"import type { NodeProps } from \"@xyflow/react\";\nimport type { StepNodeData } from \"../graph-layout\";\nimport { BaseNode } from \"./base-node\";\n\nfunction renderExpr(\n\texpr:\n\t\t| { type: \"literal\"; value: unknown }\n\t\t| { type: \"jmespath\"; expression: string },\n): string {\n\tif (expr.type === \"literal\") return JSON.stringify(expr.value);\n\treturn expr.expression;\n}\n\nexport function ExtractDataNode({ data, selected }: NodeProps) {\n\tconst { step, diagnostics, hasSourceEdge } = data as unknown as StepNodeData;\n\tif (step.type !== \"extract-data\") return null;\n\n\tconst outputFormat = step.params.outputFormat as\n\t\t| { properties?: Record<string, unknown> }\n\t\t| undefined;\n\tconst outputKeys = outputFormat?.properties\n\t\t? Object.keys(outputFormat.properties)\n\t\t: [];\n\n\treturn (\n\t\t<BaseNode\n\t\t\tid={step.id}\n\t\t\tname={step.name}\n\t\t\ttypeLabel=\"Extract\"\n\t\t\ttypeLabelColor=\"text-purple-500\"\n\t\t\taccent=\"#a855f7\"\n\t\t\tdescription={step.description}\n\t\t\tdiagnostics={diagnostics}\n\t\t\tselected={selected}\n\t\t\thasSourceEdge={hasSourceEdge}\n\t\t>\n\t\t\t<div className=\"flex gap-1.5 text-[11px]\">\n\t\t\t\t<span className=\"text-gray-400 shrink-0\">source:</span>\n\t\t\t\t<span className=\"font-mono text-gray-600 truncate\">\n\t\t\t\t\t{renderExpr(step.params.sourceData)}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t{outputKeys.length > 0 && (\n\t\t\t\t<div className=\"mt-1 flex gap-1.5 text-[11px]\">\n\t\t\t\t\t<span className=\"text-gray-400 shrink-0\">output:</span>\n\t\t\t\t\t<span className=\"font-mono text-gray-500\">\n\t\t\t\t\t\t{outputKeys.join(\", \")}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</BaseNode>\n\t);\n}\n",
|
|
11
|
+
"import type { NodeProps } from \"@xyflow/react\";\nimport { Handle, Position } from \"@xyflow/react\";\nimport type { StepNodeData } from \"../graph-layout\";\nimport { BaseNode } from \"./base-node\";\n\nfunction renderExpr(\n\texpr:\n\t\t| { type: \"literal\"; value: unknown }\n\t\t| { type: \"jmespath\"; expression: string },\n): string {\n\tif (expr.type === \"literal\") return JSON.stringify(expr.value);\n\treturn expr.expression;\n}\n\nexport function ForEachNode({ data, selected }: NodeProps) {\n\tconst { step, diagnostics, isGroup, groupWidth, groupHeight, hasSourceEdge } =\n\t\tdata as unknown as StepNodeData & {\n\t\t\tisGroup?: boolean;\n\t\t\tgroupWidth?: number;\n\t\t\tgroupHeight?: number;\n\t\t};\n\tif (step.type !== \"for-each\") return null;\n\n\tif (isGroup) {\n\t\tconst hasErrors = diagnostics.some((d) => d.severity === \"error\");\n\t\tconst hasWarnings =\n\t\t\t!hasErrors && diagnostics.some((d) => d.severity === \"warning\");\n\n\t\tlet ringClass = \"\";\n\t\tif (hasErrors) ringClass = \"ring-2 ring-red-500\";\n\t\telse if (hasWarnings) ringClass = \"ring-2 ring-amber-400\";\n\t\telse if (selected) ringClass = \"ring-2 ring-emerald-400\";\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={`rounded-xl border-2 border-dashed border-emerald-300 bg-emerald-50/30 ${ringClass}`}\n\t\t\t\tstyle={{ width: groupWidth, height: groupHeight }}\n\t\t\t>\n\t\t\t\t<Handle\n\t\t\t\t\ttype=\"target\"\n\t\t\t\t\tposition={Position.Top}\n\t\t\t\t\tclassName=\"!bg-emerald-500 !w-2.5 !h-2.5\"\n\t\t\t\t/>\n\t\t\t\t<div className=\"px-3 py-2 flex items-center gap-2\">\n\t\t\t\t\t<span className=\"text-[10px] font-semibold uppercase tracking-wide text-emerald-500\">\n\t\t\t\t\t\tLoop\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"text-sm font-medium text-gray-800 truncate\">\n\t\t\t\t\t\t{step.name}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t{hasSourceEdge && (\n\t\t\t\t\t<Handle\n\t\t\t\t\t\ttype=\"source\"\n\t\t\t\t\t\tposition={Position.Bottom}\n\t\t\t\t\t\tclassName=\"!bg-emerald-500 !w-2.5 !h-2.5\"\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// Non-group fallback (for-each with no resolvable children)\n\treturn (\n\t\t<BaseNode\n\t\t\tid={step.id}\n\t\t\tname={step.name}\n\t\t\ttypeLabel=\"ForEach\"\n\t\t\ttypeLabelColor=\"text-emerald-500\"\n\t\t\taccent=\"#10b981\"\n\t\t\tdescription={step.description}\n\t\t\tdiagnostics={diagnostics}\n\t\t\tselected={selected}\n\t\t\thasSourceEdge={hasSourceEdge}\n\t\t>\n\t\t\t<div className=\"flex gap-1.5 text-[11px]\">\n\t\t\t\t<span className=\"text-gray-400 shrink-0\">target:</span>\n\t\t\t\t<span className=\"font-mono text-gray-600 truncate\">\n\t\t\t\t\t{renderExpr(step.params.target)}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<div className=\"mt-0.5 flex gap-1.5 text-[11px]\">\n\t\t\t\t<span className=\"text-gray-400 shrink-0\">as:</span>\n\t\t\t\t<span className=\"font-mono text-gray-600\">{step.params.itemName}</span>\n\t\t\t</div>\n\t\t</BaseNode>\n\t);\n}\n",
|
|
12
|
+
"import type { NodeProps } from \"@xyflow/react\";\nimport { Handle, Position } from \"@xyflow/react\";\n\ninterface GroupHeaderData {\n\tvariant: \"switch\" | \"loop\";\n\tdescription: string;\n\t// switch\n\texpression?: string;\n\t// loop\n\ttarget?: string;\n\titemName?: string;\n}\n\nconst styles = {\n\tswitch: {\n\t\tbg: \"bg-amber-50\",\n\t\tborder: \"border-amber-300\",\n\t\tlabel: \"text-amber-600\",\n\t\tmono: \"text-amber-800\",\n\t\tdesc: \"text-amber-700/70\",\n\t\thandle: \"!bg-amber-500\",\n\t\tring: \"ring-amber-400\",\n\t},\n\tloop: {\n\t\tbg: \"bg-emerald-50\",\n\t\tborder: \"border-emerald-300\",\n\t\tlabel: \"text-emerald-600\",\n\t\tmono: \"text-emerald-800\",\n\t\tdesc: \"text-emerald-700/70\",\n\t\thandle: \"!bg-emerald-500\",\n\t\tring: \"ring-emerald-400\",\n\t},\n};\n\nexport function GroupHeaderNode({ data, selected }: NodeProps) {\n\tconst { variant, description, expression, target, itemName } =\n\t\tdata as unknown as GroupHeaderData;\n\tconst s = styles[variant];\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`${s.bg} border-2 ${s.border} rounded-lg w-[280px] shadow-sm ${\n\t\t\t\tselected ? `ring-2 ${s.ring}` : \"\"\n\t\t\t}`}\n\t\t>\n\t\t\t<div className=\"px-3 py-2\">\n\t\t\t\t{variant === \"switch\" && (\n\t\t\t\t\t<div className=\"flex items-baseline gap-1.5\">\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={`text-[10px] font-bold uppercase tracking-wide ${s.label} shrink-0`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tswitch\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className={`text-[11px] ${s.label}`}>on</span>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={`text-xs font-mono font-medium ${s.mono} truncate`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{expression}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t{variant === \"loop\" && (\n\t\t\t\t\t<div className=\"flex items-baseline gap-1.5 flex-wrap\">\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={`text-[10px] font-bold uppercase tracking-wide ${s.label} shrink-0`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tforeach\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className={`text-xs font-mono font-medium ${s.mono}`}>\n\t\t\t\t\t\t\t{itemName}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className={`text-[11px] ${s.label}`}>in</span>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={`text-xs font-mono font-medium ${s.mono} truncate`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{target}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t{description && (\n\t\t\t\t\t<div className={`text-[11px] ${s.desc} mt-0.5 line-clamp-1`}>\n\t\t\t\t\t\t{description}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<Handle\n\t\t\t\ttype=\"source\"\n\t\t\t\tposition={Position.Bottom}\n\t\t\t\tclassName={`${s.handle} !w-2 !h-2`}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n",
|
|
13
|
+
"import type { NodeProps } from \"@xyflow/react\";\nimport type { StepNodeData } from \"../graph-layout\";\nimport { BaseNode } from \"./base-node\";\n\nexport function LlmPromptNode({ data, selected }: NodeProps) {\n\tconst { step, diagnostics, hasSourceEdge } = data as unknown as StepNodeData;\n\tif (step.type !== \"llm-prompt\") return null;\n\n\tconst outputFormat = step.params.outputFormat as\n\t\t| { properties?: Record<string, unknown> }\n\t\t| undefined;\n\tconst outputKeys = outputFormat?.properties\n\t\t? Object.keys(outputFormat.properties)\n\t\t: [];\n\n\treturn (\n\t\t<BaseNode\n\t\t\tid={step.id}\n\t\t\tname={step.name}\n\t\t\ttypeLabel=\"LLM\"\n\t\t\ttypeLabelColor=\"text-violet-500\"\n\t\t\taccent=\"#8b5cf6\"\n\t\t\tdescription={step.description}\n\t\t\tdiagnostics={diagnostics}\n\t\t\tselected={selected}\n\t\t\thasSourceEdge={hasSourceEdge}\n\t\t>\n\t\t\t<div className=\"text-[11px] text-gray-500 italic line-clamp-3 bg-gray-50 rounded p-1.5 font-mono\">\n\t\t\t\t{step.params.prompt}\n\t\t\t</div>\n\t\t\t{outputKeys.length > 0 && (\n\t\t\t\t<div className=\"mt-1.5 text-[11px] text-gray-400\">\n\t\t\t\t\t<span className=\"text-gray-400\">output: </span>\n\t\t\t\t\t<span className=\"font-mono text-gray-500\">\n\t\t\t\t\t\t{outputKeys.join(\", \")}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</BaseNode>\n\t);\n}\n",
|
|
14
|
+
"import type { NodeProps } from \"@xyflow/react\";\nimport { Handle, Position } from \"@xyflow/react\";\n\nexport function StartNode({ selected }: NodeProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={`bg-gray-100 rounded-full w-[60px] h-[60px] flex items-center justify-center shadow-sm border border-gray-300 ${\n\t\t\t\tselected ? \"ring-2 ring-blue-400\" : \"\"\n\t\t\t}`}\n\t\t>\n\t\t\t<span className=\"text-xs font-medium text-gray-500\">Start</span>\n\t\t\t<Handle\n\t\t\t\ttype=\"source\"\n\t\t\t\tposition={Position.Bottom}\n\t\t\t\tclassName=\"!bg-gray-400 !w-2 !h-2\"\n\t\t\t/>\n\t\t</div>\n\t);\n}\n",
|
|
15
|
+
"import type { NodeProps } from \"@xyflow/react\";\nimport type { StepNodeData } from \"../graph-layout\";\nimport { BaseNode } from \"./base-node\";\n\nexport function StartStepNode({ data, selected }: NodeProps) {\n\tconst { step, diagnostics, hasSourceEdge } = data as unknown as StepNodeData;\n\tif (step.type !== \"start\") return null;\n\n\tconst schemaStr = JSON.stringify(step.params.inputSchema, null, 2);\n\n\treturn (\n\t\t<BaseNode\n\t\t\tid={step.id}\n\t\t\tname={step.name}\n\t\t\ttypeLabel=\"Start\"\n\t\t\ttypeLabelColor=\"text-green-500\"\n\t\t\taccent=\"#22c55e\"\n\t\t\tdescription={step.description}\n\t\t\tdiagnostics={diagnostics}\n\t\t\tselected={selected}\n\t\t\thasSourceEdge={hasSourceEdge}\n\t\t>\n\t\t\t<div className=\"text-xs text-gray-600\">\n\t\t\t\t<span className=\"text-gray-400\">Input Schema:</span>\n\t\t\t</div>\n\t\t\t<pre className=\"text-[11px] font-mono text-gray-600 truncate max-h-[60px] overflow-hidden\">\n\t\t\t\t{schemaStr === \"{}\" ? \"(no inputs)\" : schemaStr}\n\t\t\t</pre>\n\t\t</BaseNode>\n\t);\n}\n",
|
|
16
|
+
"import type { NodeProps } from \"@xyflow/react\";\nimport { Handle, Position } from \"@xyflow/react\";\nimport type { StepNodeData } from \"../graph-layout\";\nimport { BaseNode } from \"./base-node\";\n\nfunction renderExpr(\n\texpr:\n\t\t| { type: \"literal\"; value: unknown }\n\t\t| { type: \"jmespath\"; expression: string },\n): string {\n\tif (expr.type === \"literal\") return JSON.stringify(expr.value);\n\treturn expr.expression;\n}\n\nexport function SwitchCaseNode({ data, selected }: NodeProps) {\n\tconst { step, diagnostics, isGroup, groupWidth, groupHeight, hasSourceEdge } =\n\t\tdata as unknown as StepNodeData & {\n\t\t\tisGroup?: boolean;\n\t\t\tgroupWidth?: number;\n\t\t\tgroupHeight?: number;\n\t\t};\n\tif (step.type !== \"switch-case\") return null;\n\n\tif (isGroup) {\n\t\tconst hasErrors = diagnostics.some((d) => d.severity === \"error\");\n\t\tconst hasWarnings =\n\t\t\t!hasErrors && diagnostics.some((d) => d.severity === \"warning\");\n\n\t\tlet ringClass = \"\";\n\t\tif (hasErrors) ringClass = \"ring-2 ring-red-500\";\n\t\telse if (hasWarnings) ringClass = \"ring-2 ring-amber-400\";\n\t\telse if (selected) ringClass = \"ring-2 ring-amber-400\";\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={`rounded-xl border-2 border-dashed border-amber-300 bg-amber-50/30 ${ringClass}`}\n\t\t\t\tstyle={{ width: groupWidth, height: groupHeight }}\n\t\t\t>\n\t\t\t\t<Handle\n\t\t\t\t\ttype=\"target\"\n\t\t\t\t\tposition={Position.Top}\n\t\t\t\t\tclassName=\"!bg-amber-500 !w-2.5 !h-2.5\"\n\t\t\t\t/>\n\t\t\t\t<div className=\"px-3 py-2 flex items-center gap-2\">\n\t\t\t\t\t<span className=\"text-[10px] font-semibold uppercase tracking-wide text-amber-500\">\n\t\t\t\t\t\tBranch\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"text-sm font-medium text-gray-800 truncate\">\n\t\t\t\t\t\t{step.name}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t{hasSourceEdge && (\n\t\t\t\t\t<Handle\n\t\t\t\t\t\ttype=\"source\"\n\t\t\t\t\t\tposition={Position.Bottom}\n\t\t\t\t\t\tclassName=\"!bg-amber-500 !w-2.5 !h-2.5\"\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// Non-group fallback\n\treturn (\n\t\t<BaseNode\n\t\t\tid={step.id}\n\t\t\tname={step.name}\n\t\t\ttypeLabel=\"Switch\"\n\t\t\ttypeLabelColor=\"text-amber-500\"\n\t\t\taccent=\"#f59e0b\"\n\t\t\tdescription={step.description}\n\t\t\tdiagnostics={diagnostics}\n\t\t\tselected={selected}\n\t\t\thasSourceEdge={hasSourceEdge}\n\t\t>\n\t\t\t<div className=\"flex gap-1.5 text-[11px]\">\n\t\t\t\t<span className=\"text-gray-400 shrink-0\">on:</span>\n\t\t\t\t<span className=\"font-mono text-gray-600 truncate\">\n\t\t\t\t\t{renderExpr(step.params.switchOn)}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<div className=\"mt-1.5 space-y-0.5\">\n\t\t\t\t{step.params.cases.map((c) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={c.branchBodyStepId}\n\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 text-[11px]\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className=\"font-mono text-gray-500\">\n\t\t\t\t\t\t\t{c.value.type === \"default\" ? \"default\" : renderExpr(c.value)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className=\"text-gray-300\">→</span>\n\t\t\t\t\t\t<span className=\"font-mono text-gray-600\">\n\t\t\t\t\t\t\t{c.branchBodyStepId}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</BaseNode>\n\t);\n}\n",
|
|
17
|
+
"import type { NodeProps } from \"@xyflow/react\";\nimport type { StepNodeData } from \"../graph-layout\";\nimport { BaseNode } from \"./base-node\";\n\nfunction renderExpr(\n\texpr:\n\t\t| { type: \"literal\"; value: unknown }\n\t\t| { type: \"jmespath\"; expression: string },\n): string {\n\tif (expr.type === \"literal\") return JSON.stringify(expr.value);\n\treturn expr.expression;\n}\n\nexport function ToolCallNode({ data, selected }: NodeProps) {\n\tconst { step, diagnostics, hasSourceEdge } = data as unknown as StepNodeData;\n\tif (step.type !== \"tool-call\") return null;\n\n\tconst entries = Object.entries(step.params.toolInput);\n\n\treturn (\n\t\t<BaseNode\n\t\t\tid={step.id}\n\t\t\tname={step.name}\n\t\t\ttypeLabel=\"Tool\"\n\t\t\ttypeLabelColor=\"text-blue-500\"\n\t\t\taccent=\"#3b82f6\"\n\t\t\tdescription={step.description}\n\t\t\tdiagnostics={diagnostics}\n\t\t\tselected={selected}\n\t\t\thasSourceEdge={hasSourceEdge}\n\t\t>\n\t\t\t<div className=\"text-xs font-mono text-gray-700 font-medium\">\n\t\t\t\t{step.params.toolName}\n\t\t\t</div>\n\t\t\t{entries.length > 0 && (\n\t\t\t\t<div className=\"mt-1.5 space-y-0.5\">\n\t\t\t\t\t{entries.map(([key, val]) => (\n\t\t\t\t\t\t<div key={key} className=\"flex gap-1.5 text-[11px]\">\n\t\t\t\t\t\t\t<span className=\"text-gray-400 shrink-0\">{key}:</span>\n\t\t\t\t\t\t\t<span className=\"font-mono text-gray-600 truncate\">\n\t\t\t\t\t\t\t\t{renderExpr(val)}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</BaseNode>\n\t);\n}\n",
|
|
18
|
+
"import type React from \"react\";\nimport type { Diagnostic } from \"../../compiler/types\";\nimport type { WorkflowStep } from \"../../types\";\n\ninterface StepDetailPanelProps {\n\tstep: WorkflowStep;\n\tdiagnostics: Diagnostic[];\n\tonClose: () => void;\n}\n\nfunction renderExpression(\n\texpr:\n\t\t| { type: \"literal\"; value: unknown }\n\t\t| { type: \"jmespath\"; expression: string },\n): string {\n\tif (expr.type === \"literal\") return JSON.stringify(expr.value);\n\treturn expr.expression;\n}\n\nfunction TypeBadge({ type }: { type: string }) {\n\tconst colors: Record<string, string> = {\n\t\t\"tool-call\": \"bg-blue-100 text-blue-700\",\n\t\t\"llm-prompt\": \"bg-violet-100 text-violet-700\",\n\t\t\"extract-data\": \"bg-purple-100 text-purple-700\",\n\t\t\"switch-case\": \"bg-amber-100 text-amber-700\",\n\t\t\"for-each\": \"bg-emerald-100 text-emerald-700\",\n\t\tstart: \"bg-green-100 text-green-700\",\n\t\tend: \"bg-gray-100 text-gray-600\",\n\t};\n\treturn (\n\t\t<span\n\t\t\tclassName={`text-[11px] font-medium px-2 py-0.5 rounded-full ${colors[type] ?? \"bg-gray-100 text-gray-600\"}`}\n\t\t>\n\t\t\t{type}\n\t\t</span>\n\t);\n}\n\nfunction StepParams({ step }: { step: WorkflowStep }) {\n\tswitch (step.type) {\n\t\tcase \"tool-call\":\n\t\t\treturn (\n\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<Label>Tool</Label>\n\t\t\t\t\t\t<Code>{step.params.toolName}</Code>\n\t\t\t\t\t</div>\n\t\t\t\t\t{Object.keys(step.params.toolInput).length > 0 && (\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<Label>Inputs</Label>\n\t\t\t\t\t\t\t<div className=\"space-y-1\">\n\t\t\t\t\t\t\t\t{Object.entries(step.params.toolInput).map(([key, val]) => (\n\t\t\t\t\t\t\t\t\t<div key={key} className=\"flex gap-2 text-xs\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"font-mono text-gray-500\">{key}:</span>\n\t\t\t\t\t\t\t\t\t\t<span className=\"font-mono text-gray-700\">\n\t\t\t\t\t\t\t\t\t\t\t{renderExpression(val)}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t);\n\n\t\tcase \"llm-prompt\":\n\t\t\treturn (\n\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<Label>Prompt</Label>\n\t\t\t\t\t\t<pre className=\"text-xs text-gray-700 bg-gray-50 rounded p-2 whitespace-pre-wrap font-mono\">\n\t\t\t\t\t\t\t{step.params.prompt}\n\t\t\t\t\t\t</pre>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<Label>Output Format</Label>\n\t\t\t\t\t\t<Code>{JSON.stringify(step.params.outputFormat, null, 2)}</Code>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t);\n\n\t\tcase \"extract-data\":\n\t\t\treturn (\n\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<Label>Source</Label>\n\t\t\t\t\t\t<Code>{renderExpression(step.params.sourceData)}</Code>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<Label>Output Format</Label>\n\t\t\t\t\t\t<Code>{JSON.stringify(step.params.outputFormat, null, 2)}</Code>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t);\n\n\t\tcase \"switch-case\":\n\t\t\treturn (\n\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<Label>Switch On</Label>\n\t\t\t\t\t\t<Code>{renderExpression(step.params.switchOn)}</Code>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<Label>Cases</Label>\n\t\t\t\t\t\t<div className=\"space-y-1\">\n\t\t\t\t\t\t\t{step.params.cases.map((c) => (\n\t\t\t\t\t\t\t\t<div key={c.branchBodyStepId} className=\"text-xs flex gap-2\">\n\t\t\t\t\t\t\t\t\t<span className=\"font-mono text-gray-500\">\n\t\t\t\t\t\t\t\t\t\t{c.value.type === \"default\"\n\t\t\t\t\t\t\t\t\t\t\t? \"default\"\n\t\t\t\t\t\t\t\t\t\t\t: renderExpression(c.value)}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<span className=\"text-gray-400\">→</span>\n\t\t\t\t\t\t\t\t\t<span className=\"font-mono text-gray-700\">\n\t\t\t\t\t\t\t\t\t\t{c.branchBodyStepId}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t);\n\n\t\tcase \"for-each\":\n\t\t\treturn (\n\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<Label>Target</Label>\n\t\t\t\t\t\t<Code>{renderExpression(step.params.target)}</Code>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<Label>Item Variable</Label>\n\t\t\t\t\t\t<Code>{step.params.itemName}</Code>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<Label>Loop Body</Label>\n\t\t\t\t\t\t<Code>{step.params.loopBodyStepId}</Code>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t);\n\n\t\tcase \"start\":\n\t\t\treturn (\n\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<Label>Input Schema</Label>\n\t\t\t\t\t\t<Code>{JSON.stringify(step.params.inputSchema, null, 2)}</Code>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t);\n\n\t\tcase \"end\":\n\t\t\treturn null;\n\t}\n}\n\nfunction Label({ children }: { children: React.ReactNode }) {\n\treturn (\n\t\t<div className=\"text-[11px] font-medium text-gray-400 uppercase tracking-wide mb-0.5\">\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nfunction Code({ children }: { children: React.ReactNode }) {\n\treturn (\n\t\t<pre className=\"text-xs text-gray-700 bg-gray-50 rounded p-2 whitespace-pre-wrap font-mono overflow-auto max-h-[200px]\">\n\t\t\t{children}\n\t\t</pre>\n\t);\n}\n\nexport function StepDetailPanel({\n\tstep,\n\tdiagnostics,\n\tonClose,\n}: StepDetailPanelProps) {\n\treturn (\n\t\t<div className=\"w-[340px] bg-white border-l border-gray-200 h-full overflow-y-auto shadow-lg\">\n\t\t\t<div className=\"sticky top-0 bg-white border-b border-gray-200 px-4 py-3 flex items-center justify-between\">\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<TypeBadge type={step.type} />\n\t\t\t\t\t<span className=\"font-medium text-sm text-gray-900 truncate\">\n\t\t\t\t\t\t{step.name}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\tclassName=\"text-gray-400 hover:text-gray-600 text-lg leading-none\"\n\t\t\t\t>\n\t\t\t\t\t×\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div className=\"px-4 py-3 space-y-4\">\n\t\t\t\t<div>\n\t\t\t\t\t<Label>Step ID</Label>\n\t\t\t\t\t<div className=\"text-xs font-mono text-gray-600\">{step.id}</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div>\n\t\t\t\t\t<Label>Description</Label>\n\t\t\t\t\t<div className=\"text-xs text-gray-600\">{step.description}</div>\n\t\t\t\t</div>\n\n\t\t\t\t{step.nextStepId && (\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<Label>Next Step</Label>\n\t\t\t\t\t\t<div className=\"text-xs font-mono text-gray-600\">\n\t\t\t\t\t\t\t{step.nextStepId}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<div className=\"border-t border-gray-100 pt-3\">\n\t\t\t\t\t<Label>Parameters</Label>\n\t\t\t\t\t<div className=\"mt-1\">\n\t\t\t\t\t\t<StepParams step={step} />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t{diagnostics.length > 0 && (\n\t\t\t\t\t<div className=\"border-t border-gray-100 pt-3\">\n\t\t\t\t\t\t<Label>Diagnostics</Label>\n\t\t\t\t\t\t<div className=\"space-y-2 mt-1\">\n\t\t\t\t\t\t\t{diagnostics.map((d) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={`${d.code}-${d.message}`}\n\t\t\t\t\t\t\t\t\tclassName={`text-xs p-2 rounded ${\n\t\t\t\t\t\t\t\t\t\td.severity === \"error\"\n\t\t\t\t\t\t\t\t\t\t\t? \"bg-red-50 text-red-700 border border-red-200\"\n\t\t\t\t\t\t\t\t\t\t\t: \"bg-amber-50 text-amber-700 border border-amber-200\"\n\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div className=\"font-medium font-mono\">{d.code}</div>\n\t\t\t\t\t\t\t\t\t<div className=\"mt-0.5\">{d.message}</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n"
|
|
19
|
+
],
|
|
20
|
+
"mappings": "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",
|
|
21
|
+
"debugId": "B74E025EA0D7FD5564756E2164756E21",
|
|
22
|
+
"names": []
|
|
23
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { Diagnostic } from "../../compiler/types";
|
|
3
|
+
interface BaseNodeProps {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
typeLabel: string;
|
|
7
|
+
typeLabelColor: string;
|
|
8
|
+
accent: string;
|
|
9
|
+
description: string;
|
|
10
|
+
diagnostics: Diagnostic[];
|
|
11
|
+
children?: ReactNode;
|
|
12
|
+
selected?: boolean;
|
|
13
|
+
hasSourceEdge?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function BaseNode({ id, name, typeLabel, typeLabelColor, accent, description, diagnostics, children, selected, hasSourceEdge, }: BaseNodeProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=base-node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-node.d.ts","sourceRoot":"","sources":["../../../src/viewer/nodes/base-node.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,UAAU,aAAa;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,QAAQ,CAAC,EACxB,EAAE,EACF,IAAI,EACJ,SAAS,EACT,cAAc,EACd,MAAM,EACN,WAAW,EACX,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,aAAoB,GACpB,EAAE,aAAa,2CA2Df"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"end-node.d.ts","sourceRoot":"","sources":["../../../src/viewer/nodes/end-node.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAI/C,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,SAAS,2CAoBpD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-data-node.d.ts","sourceRoot":"","sources":["../../../src/viewer/nodes/extract-data-node.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAa/C,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,SAAS,kDAuC5D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"for-each-node.d.ts","sourceRoot":"","sources":["../../../src/viewer/nodes/for-each-node.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAc/C,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,SAAS,kDAyExD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-header-node.d.ts","sourceRoot":"","sources":["../../../src/viewer/nodes/group-header-node.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAkC/C,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,SAAS,2CA0D5D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-prompt-node.d.ts","sourceRoot":"","sources":["../../../src/viewer/nodes/llm-prompt-node.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAI/C,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,SAAS,kDAoC1D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-node.d.ts","sourceRoot":"","sources":["../../../src/viewer/nodes/start-node.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG/C,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,SAAS,2CAehD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-step-node.d.ts","sourceRoot":"","sources":["../../../src/viewer/nodes/start-step-node.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAI/C,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,SAAS,kDA0B1D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switch-case-node.d.ts","sourceRoot":"","sources":["../../../src/viewer/nodes/switch-case-node.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAc/C,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,SAAS,kDAqF3D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-call-node.d.ts","sourceRoot":"","sources":["../../../src/viewer/nodes/tool-call-node.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAa/C,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,SAAS,kDAmCzD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Diagnostic } from "../../compiler/types";
|
|
2
|
+
import type { WorkflowStep } from "../../types";
|
|
3
|
+
interface StepDetailPanelProps {
|
|
4
|
+
step: WorkflowStep;
|
|
5
|
+
diagnostics: Diagnostic[];
|
|
6
|
+
onClose: () => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function StepDetailPanel({ step, diagnostics, onClose, }: StepDetailPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=step-detail-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-detail-panel.d.ts","sourceRoot":"","sources":["../../../src/viewer/panels/step-detail-panel.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,UAAU,oBAAoB;IAC7B,IAAI,EAAE,YAAY,CAAC;IACnB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;CACpB;AAoKD,wBAAgB,eAAe,CAAC,EAC/B,IAAI,EACJ,WAAW,EACX,OAAO,GACP,EAAE,oBAAoB,2CAqEtB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Diagnostic } from "../compiler/types";
|
|
2
|
+
import type { WorkflowDefinition } from "../types";
|
|
3
|
+
export interface WorkflowViewerProps {
|
|
4
|
+
workflow: WorkflowDefinition;
|
|
5
|
+
diagnostics?: Diagnostic[];
|
|
6
|
+
onStepSelect?: (stepId: string | null) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function WorkflowViewer({ workflow, diagnostics, onStepSelect, }: WorkflowViewerProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=workflow-viewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-viewer.d.ts","sourceRoot":"","sources":["../../src/viewer/workflow-viewer.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,kBAAkB,EAAgB,MAAM,UAAU,CAAC;AAgCjE,MAAM,WAAW,mBAAmB;IACnC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC/C;AAED,wBAAgB,cAAc,CAAC,EAC9B,QAAQ,EACR,WAA+B,EAC/B,YAAY,GACZ,EAAE,mBAAmB,2CA+ErB"}
|
package/package.json
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@isaacwasserman/remora",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A workflow DSL for agents — compile, execute, and visualize agent workflows",
|
|
5
|
+
"publishConfig": { "access": "public" },
|
|
6
|
+
"license": "GPL-3.0",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/lib.js",
|
|
11
|
+
"types": "./dist/lib.d.ts"
|
|
12
|
+
},
|
|
13
|
+
"./viewer": {
|
|
14
|
+
"import": "./dist/viewer/index.js",
|
|
15
|
+
"types": "./dist/viewer/index.d.ts"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"README.md",
|
|
21
|
+
"LICENSE"
|
|
22
|
+
],
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "bun scripts/build.ts",
|
|
25
|
+
"prepublishOnly": "bun run build",
|
|
26
|
+
"test": "bun test",
|
|
27
|
+
"test:e2e": "bun test src/e2e.ts",
|
|
28
|
+
"lint": "biome check .",
|
|
29
|
+
"lint:fix": "biome check --fix --unsafe .",
|
|
30
|
+
"viewer": "bun src/viewer/demo/server.ts",
|
|
31
|
+
"typecheck": "tsgo --noEmit"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"arktype": "^2.1.29",
|
|
35
|
+
"@dagrejs/dagre": "^2.0.4",
|
|
36
|
+
"@jmespath-community/jmespath": "^1.3.0"
|
|
37
|
+
},
|
|
38
|
+
"peerDependencies": {
|
|
39
|
+
"ai": "^6.0.0",
|
|
40
|
+
"@ai-sdk/provider-utils": "^4.0.0",
|
|
41
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
42
|
+
"react-dom": "^18.0.0 || ^19.0.0",
|
|
43
|
+
"@xyflow/react": "^12.0.0"
|
|
44
|
+
},
|
|
45
|
+
"peerDependenciesMeta": {
|
|
46
|
+
"ai": {
|
|
47
|
+
"optional": true
|
|
48
|
+
},
|
|
49
|
+
"@ai-sdk/provider-utils": {
|
|
50
|
+
"optional": true
|
|
51
|
+
},
|
|
52
|
+
"react": {
|
|
53
|
+
"optional": true
|
|
54
|
+
},
|
|
55
|
+
"react-dom": {
|
|
56
|
+
"optional": true
|
|
57
|
+
},
|
|
58
|
+
"@xyflow/react": {
|
|
59
|
+
"optional": true
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@ai-sdk/anthropic": "^3.0.50",
|
|
64
|
+
"@ai-sdk/openai": "^3.0.37",
|
|
65
|
+
"@biomejs/biome": "2.4.4",
|
|
66
|
+
"@types/bun": "latest",
|
|
67
|
+
"@types/react": "^19.2.14",
|
|
68
|
+
"@types/react-dom": "^19.2.3",
|
|
69
|
+
"@typescript/native-preview": "^7.0.0-dev.20260301.1",
|
|
70
|
+
"@xyflow/react": "^12.10.1",
|
|
71
|
+
"ai": "^6.0.105",
|
|
72
|
+
"bun-plugin-tailwind": "^0.1.2",
|
|
73
|
+
"react": "^19.2.4",
|
|
74
|
+
"react-dom": "^19.2.4",
|
|
75
|
+
"tailwindcss": "^4.2.1",
|
|
76
|
+
"typescript": "^5.8.0"
|
|
77
|
+
}
|
|
78
|
+
}
|