@jiggai/kitchen 0.3.10 → 0.3.12
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/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/app/_global-error.html +2 -2
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js +1 -1
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +4 -4
- package/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/agents/[agentId]/page.js +1 -1
- package/.next/server/app/agents/[agentId]/page.js.nft.json +1 -1
- package/.next/server/app/agents/[agentId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/add/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/file/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/files/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/skills/install/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/update/route.js.nft.json +1 -1
- package/.next/server/app/api/cron/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/cron/jobs/route.js.nft.json +1 -1
- package/.next/server/app/api/cron/recipe-installed/route.js.nft.json +1 -1
- package/.next/server/app/api/cron/worker/route.js.nft.json +1 -1
- package/.next/server/app/api/goals/[id]/promote/route.js.nft.json +1 -1
- package/.next/server/app/api/goals/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/goals/route.js.nft.json +1 -1
- package/.next/server/app/api/ids/check/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/custom-team/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/local-agent-catalog/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/team-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/scaffold/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/cron-installation/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/tickets/assign/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/tickets/assignees/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/tickets/comment/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/tickets/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/tickets/move/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/tickets/move-to-goals/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/file/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/files/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/memory/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/meta/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/orchestrator/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/remove-team/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/skills/install/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/workflow-runs/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/workflow-templates/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/workflows/route.js.nft.json +1 -1
- package/.next/server/app/api/tickets/assign/route.js.nft.json +1 -1
- package/.next/server/app/api/tickets/assignees/route.js.nft.json +1 -1
- package/.next/server/app/api/tickets/move/route.js.nft.json +1 -1
- package/.next/server/app/channels/page.js +1 -1
- package/.next/server/app/channels/page.js.nft.json +1 -1
- package/.next/server/app/channels/page_client-reference-manifest.js +1 -1
- package/.next/server/app/channels.html +2 -2
- package/.next/server/app/channels.rsc +5 -5
- package/.next/server/app/channels.segments/_full.segment.rsc +5 -5
- package/.next/server/app/channels.segments/_head.segment.rsc +1 -1
- package/.next/server/app/channels.segments/_index.segment.rsc +3 -3
- package/.next/server/app/channels.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/channels.segments/channels/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/channels.segments/channels.segment.rsc +1 -1
- package/.next/server/app/cron-jobs/page.js +1 -1
- package/.next/server/app/cron-jobs/page.js.nft.json +1 -1
- package/.next/server/app/cron-jobs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/goals/[id]/page.js +1 -1
- package/.next/server/app/goals/[id]/page.js.nft.json +1 -1
- package/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/goals/new/page.js +1 -1
- package/.next/server/app/goals/new/page.js.nft.json +1 -1
- package/.next/server/app/goals/new/page_client-reference-manifest.js +1 -1
- package/.next/server/app/goals/new.html +2 -2
- package/.next/server/app/goals/new.rsc +5 -5
- package/.next/server/app/goals/new.segments/_full.segment.rsc +5 -5
- package/.next/server/app/goals/new.segments/_head.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/_index.segment.rsc +3 -3
- package/.next/server/app/goals/new.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/goals/new.segments/goals/new/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/goals/new.segments/goals/new.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/goals.segment.rsc +1 -1
- package/.next/server/app/goals/page.js +1 -1
- package/.next/server/app/goals/page.js.nft.json +1 -1
- package/.next/server/app/goals/page_client-reference-manifest.js +1 -1
- package/.next/server/app/goals.html +1 -1
- package/.next/server/app/goals.rsc +5 -5
- package/.next/server/app/goals.segments/_full.segment.rsc +5 -5
- package/.next/server/app/goals.segments/_head.segment.rsc +1 -1
- package/.next/server/app/goals.segments/_index.segment.rsc +3 -3
- package/.next/server/app/goals.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/goals.segments/goals/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/goals.segments/goals.segment.rsc +1 -1
- package/.next/server/app/page.js +3 -3
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/recipes/[id]/page.js +4 -4
- package/.next/server/app/recipes/[id]/page.js.nft.json +1 -1
- package/.next/server/app/recipes/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/recipes/page.js +3 -3
- package/.next/server/app/recipes/page.js.nft.json +1 -1
- package/.next/server/app/recipes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/runs/page.js +4 -4
- package/.next/server/app/runs/page.js.nft.json +1 -1
- package/.next/server/app/runs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/page.js +1 -1
- package/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +5 -5
- package/.next/server/app/settings.segments/_full.segment.rsc +5 -5
- package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +3 -3
- package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/server/app/teams/[teamId]/page.js +4 -4
- package/.next/server/app/teams/[teamId]/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/runs/[workflowId]/[runId]/page.js +3 -3
- package/.next/server/app/teams/[teamId]/runs/[workflowId]/[runId]/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/runs/[workflowId]/[runId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/runs/page.js +1 -1
- package/.next/server/app/teams/[teamId]/runs/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/runs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/tickets/[ticket]/page.js +1 -1
- package/.next/server/app/teams/[teamId]/tickets/[ticket]/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/tickets/[ticket]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/tickets/page.js +2 -2
- package/.next/server/app/teams/[teamId]/tickets/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/tickets/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page.js +4 -4
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/workflows/page.js +3 -3
- package/.next/server/app/teams/[teamId]/workflows/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/workflows/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tickets/[ticket]/page.js +1 -1
- package/.next/server/app/tickets/[ticket]/page.js.nft.json +1 -1
- package/.next/server/app/tickets/[ticket]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tickets/page.js +2 -2
- package/.next/server/app/tickets/page.js.nft.json +1 -1
- package/.next/server/app/tickets/page_client-reference-manifest.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__01863a8b._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__01863a8b._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__04f289da._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__04f289da._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__05f5e243._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__05f5e243._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0c4fc3d3._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0c4fc3d3._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__1311d7a3._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1311d7a3._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__1c6c2e43._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1c6c2e43._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__3cfdf0b3._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__3cfdf0b3._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__3fdbc43e._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__3fdbc43e._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__453333f5._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__453333f5._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__47eb3111._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__47eb3111._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__502825d0._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__502825d0._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__50fe6ff8._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__50fe6ff8._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__51198e25._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__51198e25._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__542a081b._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__542a081b._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__5ceff0f3._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__5ceff0f3._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__5ea38a67._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__5ea38a67._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__698cf062._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__698cf062._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__69be1758._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__69be1758._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__69c45937._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__69c45937._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__6f4e90a0._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__6f4e90a0._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__7459129e._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__7459129e._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__7a331e51._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__7a331e51._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__7bf889c1._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__7bf889c1._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__864a08dd._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__864a08dd._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__89605574._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__89605574._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__8e27e9f7._.js +3 -3
- package/.next/server/chunks/[root-of-the-server]__8e27e9f7._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__95ddb81a._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__95ddb81a._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__99b12bcb._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__99b12bcb._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__9d0ea07b._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__9d0ea07b._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__a49c534d._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__a49c534d._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__a74a32d5._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__a74a32d5._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__b002764e._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__b002764e._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__b64936a3._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__b64936a3._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__bbdb6dcb._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__bbdb6dcb._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__bccfb2c0._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__bccfb2c0._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__d924e5ac._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__d924e5ac._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__e063a986._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__e063a986._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__e40409a2._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__e40409a2._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__e478ef0d._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__e478ef0d._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__fef7183d._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__fef7183d._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__ff69832c._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__ff69832c._.js.map +1 -1
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_1fe98a49.js +1 -1
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_1fe98a49.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__02e6ccaa._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__02e6ccaa._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0df430db._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__76f9757d._.js.map → [root-of-the-server]__0df430db._.js.map} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__162d7d9d._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__162d7d9d._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__17b046ea._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__17b046ea._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__255506f2._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__255506f2._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__3b880807._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__3b880807._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__471bc2e7._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__471bc2e7._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__49281b4c._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__49281b4c._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__4981f370._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__4981f370._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__4c66998a._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__4c66998a._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__8756d76d._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__8756d76d._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__8a588fad._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__8a588fad._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__9a7d79aa._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__9a7d79aa._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__ad4e8478._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__ad4e8478._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__c777e326._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__c777e326._.js.map +1 -0
- package/.next/server/chunks/ssr/_018dfe6b._.js +1 -1
- package/.next/server/chunks/ssr/_018dfe6b._.js.map +1 -1
- package/.next/server/chunks/ssr/{node_modules_next_10fb6ad9._.js → _7f9e89d2._.js} +2 -2
- package/.next/server/chunks/ssr/_7f9e89d2._.js.map +1 -0
- package/.next/server/chunks/ssr/b1a17_app_teams_[teamId]_workflows_[workflowId]_workflows-editor-client_tsx_5e714aa2._.js +1 -1
- package/.next/server/chunks/ssr/b1a17_app_teams_[teamId]_workflows_[workflowId]_workflows-editor-client_tsx_5e714aa2._.js.map +1 -1
- package/.next/server/chunks/ssr/src_59477309._.js +1 -1
- package/.next/server/chunks/ssr/src_59477309._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_HomeClient_tsx_f9f7568d._.js +1 -1
- package/.next/server/chunks/ssr/src_app_HomeClient_tsx_f9f7568d._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_teams_[teamId]_workflows_workflows-client_tsx_12742cc9._.js +3 -0
- package/.next/server/chunks/ssr/src_app_teams_[teamId]_workflows_workflows-client_tsx_12742cc9._.js.map +1 -0
- package/.next/server/chunks/ssr/src_lib_errors_ts_f440efeb._.js +3 -0
- package/.next/server/chunks/ssr/src_lib_errors_ts_f440efeb._.js.map +1 -0
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +2 -2
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/3e0d3a43014c0ad2.css +3 -0
- package/.next/static/chunks/43d0024279c6160e.js +1 -0
- package/.next/static/chunks/{ecdc9465f0e4d954.js → 4d4876ec71727e38.js} +1 -1
- package/.next/static/chunks/4f5e02a609758a0b.js +1 -0
- package/.next/static/chunks/5e3b1d0f61a651bf.js +1 -0
- package/.next/static/chunks/be12a66bd736fad8.js +1 -0
- package/.next/static/chunks/f179280598d329b2.js +1 -0
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/public/images/clawkitchen/home.png +0 -0
- package/public/images/clawkitchen/recipes.png +0 -0
- package/public/images/clawkitchen/runs.png +0 -0
- package/public/images/clawkitchen/team.png +0 -0
- package/public/images/clawkitchen/tickets.png +0 -0
- package/public/images/clawkitchen/workflows.png +0 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1d65fddf._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__1d65fddf._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__28f5d174._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__28f5d174._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__450d6006._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__450d6006._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__6bd48d33._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__6bd48d33._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__76f9757d._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__78972f52._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__78972f52._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__9ffebe91._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__9ffebe91._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__a26db919._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__a26db919._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__afaa71fe._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__afaa71fe._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__b577b475._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__b577b475._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__e94ab521._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__e94ab521._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__fb6781d4._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__fb6781d4._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_10fb6ad9._.js.map +0 -1
- package/.next/server/chunks/ssr/src_e54f24fb._.js +0 -3
- package/.next/server/chunks/ssr/src_e54f24fb._.js.map +0 -1
- package/.next/static/chunks/42b3230688d0834c.js +0 -1
- package/.next/static/chunks/7495459fdf300bf9.js +0 -1
- package/.next/static/chunks/821af975ccc1f8d5.js +0 -1
- package/.next/static/chunks/be874907adf946fd.js +0 -1
- package/.next/static/chunks/e397a21bf5f13650.js +0 -1
- package/.next/static/chunks/f5d0d403c0fecb7f.css +0 -3
- /package/.next/static/{0PWp2TzSmiSf_Pf9YHES- → hUvZJdetkFjI4DzH44gs9}/_buildManifest.js +0 -0
- /package/.next/static/{0PWp2TzSmiSf_Pf9YHES- → hUvZJdetkFjI4DzH44gs9}/_clientMiddlewareManifest.json +0 -0
- /package/.next/static/{0PWp2TzSmiSf_Pf9YHES- → hUvZJdetkFjI4DzH44gs9}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app/teams/%5BteamId%5D/workflows/%5BworkflowId%5D/workflows-editor-client.tsx","../../../../src/lib/workflows/validate.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport Link from \"next/link\";\nimport { ConfirmationModal } from \"@/components/ConfirmationModal\";\nimport type { WorkflowFileV1 } from \"@/lib/workflows/types\";\nimport { validateWorkflowFileV1 } from \"@/lib/workflows/validate\";\n\ntype LoadState =\n | { kind: \"loading\" }\n | { kind: \"error\"; error: string }\n | { kind: \"ready\"; jsonText: string };\n\nfunction draftKey(teamId: string, workflowId: string) {\n return `ck-wf-draft:${teamId}:${workflowId}`;\n}\n\nexport default function WorkflowsEditorClient({\n teamId,\n workflowId,\n draft,\n}: {\n teamId: string;\n workflowId: string;\n draft: boolean;\n}) {\n const [view, setView] = useState<\"canvas\" | \"json\">(\"canvas\");\n const [saving, setSaving] = useState(false);\n const [status, setStatus] = useState<LoadState>({ kind: \"loading\" });\n const [actionError, setActionError] = useState<string>(\"\");\n const importInputRef = useRef<HTMLInputElement | null>(null);\n\n const [toolsCollapsed, setToolsCollapsed] = useState(false);\n\n // Canvas zoom\n const [zoom, setZoom] = useState(1);\n const ZOOM_MIN = 0.5;\n const ZOOM_MAX = 2.5;\n const ZOOM_STEP = 0.1;\n\n // Canvas: selection, drag, node/edge creation.\n const canvasRef = useRef<HTMLDivElement | null>(null);\n const [selectedNodeId, setSelectedNodeId] = useState<string>(\"\");\n const [dragging, setDragging] = useState<null | { nodeId: string; dx: number; dy: number }>(null);\n\n const [activeTool, setActiveTool] = useState<\n | { kind: \"select\" }\n | { kind: \"add-node\"; nodeType: WorkflowFileV1[\"nodes\"][number][\"type\"] }\n | { kind: \"connect\" }\n >({ kind: \"select\" });\n const [connectFromNodeId, setConnectFromNodeId] = useState<string>(\"\");\n\n const [agents, setAgents] = useState<Array<{ id: string; identityName?: string }>>([]);\n const [agentsError, setAgentsError] = useState<string>(\"\");\n\n const [approvalBindings, setApprovalBindings] = useState<Array<{ id: string; label: string; channel: string; target: string }>>([]);\n const [approvalBindingsError, setApprovalBindingsError] = useState<string>(\"\");\n\n const approvalBindingsNeedsKitchenUpdate = useMemo(() => {\n return /Tool not available:\\s*gateway/i.test(String(approvalBindingsError || \"\"));\n }, [approvalBindingsError]);\n\n // Inspector state (parity with modal)\n const [workflowRuns, setWorkflowRuns] = useState<string[]>([]);\n const [workflowRunsLoading, setWorkflowRunsLoading] = useState(false);\n const [workflowRunsError, setWorkflowRunsError] = useState(\"\");\n const [selectedWorkflowRunId, setSelectedWorkflowRunId] = useState<string>(\"\");\n\n // Run preflight: ensure nodes are assigned + required worker cron exists.\n const [cronLoading, setCronLoading] = useState(false);\n const [cronError, setCronError] = useState<string>(\"\");\n const [agentHasCron, setAgentHasCron] = useState<Record<string, boolean>>({});\n\n const [installCronOpen, setInstallCronOpen] = useState(false);\n const [installCronBusy, setInstallCronBusy] = useState(false);\n const [installCronError, setInstallCronError] = useState<string>(\"\");\n\n const [newNodeId, setNewNodeId] = useState(\"\");\n const [newNodeName, setNewNodeName] = useState(\"\");\n const [newNodeType, setNewNodeType] = useState<WorkflowFileV1[\"nodes\"][number][\"type\"]>(\"llm\");\n\n const [newEdgeFrom, setNewEdgeFrom] = useState(\"\");\n const [newEdgeTo, setNewEdgeTo] = useState(\"\");\n const [newEdgeLabel, setNewEdgeLabel] = useState(\"\");\n\n useEffect(() => {\n (async () => {\n try {\n if (draft) {\n const stored = sessionStorage.getItem(draftKey(teamId, workflowId));\n if (stored) {\n setStatus({ kind: \"ready\", jsonText: stored });\n return;\n }\n\n // New draft: initialize a clean workflow instead of trying to fetch an existing file.\n const initial: WorkflowFileV1 = {\n schema: \"clawkitchen.workflow.v1\",\n id: workflowId,\n name: \"New workflow\",\n timezone: \"UTC\",\n nodes: [\n { id: \"start\", type: \"start\", name: \"start\", x: 80, y: 80, config: {} },\n { id: \"end\", type: \"end\", name: \"end\", x: 520, y: 80, config: {} },\n ],\n edges: [{ id: \"e1\", from: \"start\", to: \"end\" }],\n };\n const text = JSON.stringify(initial, null, 2) + \"\\n\";\n setStatus({ kind: \"ready\", jsonText: text });\n try {\n sessionStorage.setItem(draftKey(teamId, workflowId), text);\n } catch {\n // ignore\n }\n return;\n }\n\n const res = await fetch(\n `/api/teams/workflows?teamId=${encodeURIComponent(teamId)}&id=${encodeURIComponent(workflowId)}`,\n { cache: \"no-store\" }\n );\n const json = (await res.json()) as { ok?: boolean; error?: string; workflow?: unknown };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to load workflow\");\n setStatus({ kind: \"ready\", jsonText: JSON.stringify(json.workflow, null, 2) + \"\\n\" });\n } catch (e: unknown) {\n setStatus({ kind: \"error\", error: e instanceof Error ? e.message : String(e) });\n }\n })();\n }, [teamId, workflowId, draft]);\n\n useEffect(() => {\n (async () => {\n setAgentsError(\"\");\n try {\n const res = await fetch(\"/api/agents\", { cache: \"no-store\" });\n const json = (await res.json()) as { agents?: Array<{ id?: unknown; identityName?: unknown }>; error?: string; message?: string };\n if (!res.ok) throw new Error(json.error || json.message || \"Failed to load agents\");\n const list = Array.isArray(json.agents) ? json.agents : [];\n const filtered = list\n .map((a) => ({ id: String(a.id ?? \"\").trim(), identityName: typeof a.identityName === \"string\" ? a.identityName : undefined }))\n .filter((a) => a.id && a.id.startsWith(`${teamId}-`));\n setAgents(filtered);\n } catch (e: unknown) {\n setAgentsError(e instanceof Error ? e.message : String(e));\n setAgents([]);\n }\n })();\n }, [teamId]);\n\n function isRecord(v: unknown): v is Record<string, unknown> {\n return Boolean(v) && typeof v === \"object\" && !Array.isArray(v);\n }\n\n function bindingLabelAndTarget(b: unknown): { id: string; label: string; channel: string; target: string } | null {\n // Expected OpenClaw binding shape:\n // { agentId, match: { channel: \"telegram\", accountId?: string, peer?: { kind: \"dm\"|\"group\", id: string } } }\n if (!isRecord(b)) return null;\n const match = isRecord(b.match) ? b.match : null;\n if (!match) return null;\n\n const channel = String(match.channel ?? \"\").trim();\n if (!channel) return null;\n\n const accountId = String(match.accountId ?? \"\").trim();\n if (accountId) {\n const id = `${channel}:account:${accountId}`;\n return { id, label: `${channel} · account:${accountId}`, channel, target: accountId };\n }\n\n const peer = isRecord(match.peer) ? match.peer : null;\n const kind = peer ? String(peer.kind ?? \"\").trim() : \"\";\n const peerId = peer ? String(peer.id ?? \"\").trim() : \"\";\n if (kind && peerId) {\n const id = `${channel}:${kind}:${peerId}`;\n return { id, label: `${channel} · ${kind}:${peerId}`, channel, target: peerId };\n }\n\n return null;\n }\n\n useEffect(() => {\n (async () => {\n setApprovalBindingsError(\"\");\n try {\n const res = await fetch(\"/api/channels/bindings\", { cache: \"no-store\" });\n const json = (await res.json()) as { ok?: boolean; bindings?: unknown[]; error?: string };\n if (!res.ok || json.ok === false) throw new Error(json.error || \"Failed to load bindings\");\n\n const list = Array.isArray(json.bindings) ? json.bindings : [];\n const mapped = list.map(bindingLabelAndTarget).filter(Boolean) as Array<{ id: string; label: string; channel: string; target: string }>;\n setApprovalBindings(mapped);\n } catch (e: unknown) {\n setApprovalBindingsError(e instanceof Error ? e.message : String(e));\n setApprovalBindings([]);\n }\n })();\n }, []);\n\n const refreshCronMap = useCallback(async (): Promise<Record<string, boolean>> => {\n // Preflight helper: determine whether each agent has any cron job installed/enabled.\n // (Used to warn/block enqueue when the assigned worker has no cron heartbeat.)\n setCronError(\"\");\n setCronLoading(true);\n try {\n const res = await fetch(\"/api/cron/jobs\", { cache: \"no-store\" });\n const json = (await res.json()) as { ok?: boolean; error?: string; jobs?: unknown[] };\n if (!res.ok || json.ok === false) throw new Error(json.error || \"Failed to load cron jobs\");\n const jobs = Array.isArray(json.jobs) ? json.jobs : [];\n\n const map: Record<string, boolean> = {};\n for (const j of jobs) {\n // openclaw cron list returns `agentId` on the job when scoped to an agent.\n // We also enrich jobs with `scope`, but that may be team-scoped for worker-cron grouping.\n const job = j as { enabled?: unknown; agentId?: unknown; scope?: { kind?: unknown; id?: unknown } };\n if (!job || !Boolean(job.enabled)) continue;\n\n const agentId = String(job.agentId ?? \"\").trim();\n if (agentId) {\n map[agentId] = true;\n continue;\n }\n\n // Back-compat: if we don't have agentId, fall back to enriched scope.\n if (job.scope && String(job.scope.kind) === \"agent\") {\n const id = String(job.scope.id ?? \"\").trim();\n if (id) map[id] = true;\n }\n }\n setAgentHasCron(map);\n return map;\n } catch (e: unknown) {\n setCronError(e instanceof Error ? e.message : String(e));\n setAgentHasCron({});\n return {};\n } finally {\n setCronLoading(false);\n }\n }, []);\n\n useEffect(() => {\n void refreshCronMap();\n }, [refreshCronMap]);\n\n const parsed = useMemo(() => {\n if (status.kind !== \"ready\") return { wf: null as WorkflowFileV1 | null, err: \"\" };\n try {\n const wf = JSON.parse(status.jsonText) as WorkflowFileV1;\n return { wf, err: \"\" };\n } catch (e: unknown) {\n return { wf: null, err: e instanceof Error ? e.message : String(e) };\n }\n }, [status]);\n\n const validation = useMemo(() => {\n if (!parsed.wf) return { errors: [], warnings: [] as string[] };\n return validateWorkflowFileV1(parsed.wf);\n }, [parsed.wf]);\n\n const runPreflight = useMemo(() => {\n const wf = parsed.wf;\n if (!wf) {\n return {\n missingAgentOnNodeIds: [] as string[],\n requiredAgentIds: [] as string[],\n agentIdsMissingCron: [] as string[],\n ok: true,\n };\n }\n\n const nodesToExecute = (wf.nodes ?? []).filter(\n (n) => n.type !== \"start\" && n.type !== \"end\" && n.type !== \"human_approval\"\n );\n\n const missingAgentOnNodeIds = nodesToExecute\n .filter((n) => {\n const cfg = n.config && typeof n.config === \"object\" && !Array.isArray(n.config) ? (n.config as Record<string, unknown>) : {};\n const agentId = String(cfg.agentId ?? \"\").trim();\n return !agentId;\n })\n .map((n) => n.id);\n\n const requiredAgentIds = Array.from(\n new Set(\n nodesToExecute\n .map((n) => {\n const cfg = n.config && typeof n.config === \"object\" && !Array.isArray(n.config) ? (n.config as Record<string, unknown>) : {};\n return String(cfg.agentId ?? \"\").trim();\n })\n .filter(Boolean)\n )\n );\n\n const agentIdsMissingCron = requiredAgentIds.filter((id) => !agentHasCron[id]);\n\n const ok = missingAgentOnNodeIds.length === 0 && agentIdsMissingCron.length === 0;\n return { missingAgentOnNodeIds, requiredAgentIds, agentIdsMissingCron, ok };\n }, [parsed.wf, agentHasCron]);\n\n function setWorkflow(next: WorkflowFileV1) {\n const text = JSON.stringify(next, null, 2) + \"\\n\";\n setStatus({ kind: \"ready\", jsonText: text });\n if (draft) {\n try {\n sessionStorage.setItem(draftKey(teamId, workflowId), text);\n } catch {\n // ignore\n }\n }\n }\n\n async function onSave() {\n if (status.kind !== \"ready\") return;\n if (!parsed.wf) return;\n if (parsed.err) return;\n if (validation.errors.length) return;\n\n setSaving(true);\n setActionError(\"\");\n try {\n const res = await fetch(\"/api/teams/workflows\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, workflow: parsed.wf }),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to save workflow\");\n\n // Clear draft cache once persisted.\n try {\n sessionStorage.removeItem(draftKey(teamId, workflowId));\n } catch {\n // ignore\n }\n } catch (e: unknown) {\n setActionError(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n\n function onExport() {\n if (!parsed.wf) return;\n if (parsed.err) return;\n if (validation.errors.length) return;\n\n const filename = `${parsed.wf.id || workflowId}.workflow.json`;\n const blob = new Blob([JSON.stringify(parsed.wf, null, 2) + \"\\n\"], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n }\n\n if (status.kind === \"loading\") return <div className=\"ck-glass w-full p-6\">Loading…</div>;\n if (status.kind === \"error\") return <div className=\"ck-glass w-full p-6\">{status.error}</div>;\n\n // (section collapse uses native <details> to keep this file simple)\n\n return (\n <div className=\"flex h-full min-h-0 w-full flex-1 flex-col\">\n <div className=\"flex flex-wrap items-center justify-between gap-3 px-3 py-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <a\n href={`/teams/${encodeURIComponent(teamId)}?tab=workflows`}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Back\n </a>\n <div className=\"min-w-0\">\n <div className=\"truncate text-base font-medium text-[color:var(--ck-text-primary)]\">\n {workflowId}.workflow.json\n </div>\n <div className=\"mt-0.5 text-sm text-[color:var(--ck-text-tertiary)]\">Team: {teamId}</div>\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"flex overflow-hidden rounded-[var(--ck-radius-sm)] border border-white/10\">\n <button\n type=\"button\"\n onClick={() => setView(\"canvas\")}\n className={\n view === \"canvas\"\n ? \"bg-white/10 px-3 py-2 text-xs font-medium text-[color:var(--ck-text-primary)]\"\n : \"bg-transparent px-3 py-2 text-xs font-medium text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n >\n Canvas\n </button>\n <button\n type=\"button\"\n onClick={() => setView(\"json\")}\n className={\n view === \"json\"\n ? \"bg-white/10 px-3 py-2 text-xs font-medium text-[color:var(--ck-text-primary)]\"\n : \"bg-transparent px-3 py-2 text-xs font-medium text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n >\n JSON\n </button>\n </div>\n\n <input\n ref={importInputRef}\n type=\"file\"\n accept=\"application/json,.json\"\n className=\"hidden\"\n onChange={async (e) => {\n const file = e.target.files?.[0];\n // Reset the input so re-importing the same file still triggers onChange.\n e.target.value = \"\";\n if (!file) return;\n\n setActionError(\"\");\n try {\n const text = await file.text();\n const next = JSON.parse(text) as WorkflowFileV1;\n setStatus({ kind: \"ready\", jsonText: JSON.stringify(next, null, 2) + \"\\n\" });\n if (draft) {\n try {\n sessionStorage.setItem(draftKey(teamId, workflowId), JSON.stringify(next, null, 2) + \"\\n\");\n } catch {\n // ignore\n }\n }\n } catch (err: unknown) {\n setActionError(err instanceof Error ? err.message : String(err));\n }\n }}\n />\n\n <button\n type=\"button\"\n disabled={saving}\n onClick={() => importInputRef.current?.click()}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-white/10 disabled:opacity-50\"\n >\n Import\n </button>\n\n <button\n type=\"button\"\n disabled={!parsed.wf || Boolean(parsed.err) || validation.errors.length > 0}\n onClick={onExport}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-white/10 disabled:opacity-50\"\n >\n Export\n </button>\n\n <button\n type=\"button\"\n disabled={saving || !parsed.wf || Boolean(parsed.err) || validation.errors.length > 0}\n onClick={onSave}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save\"}\n </button>\n\n {/* Back button lives in the left header. */}\n </div>\n </div>\n\n {parsed.err ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-yellow-400/30 bg-yellow-500/10 p-3 text-sm text-yellow-100\">\n JSON parse error: {parsed.err}\n </div>\n ) : null}\n {!parsed.err && validation.errors.length ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n <div className=\"font-medium\">Workflow validation errors</div>\n <ul className=\"mt-2 list-disc space-y-1 pl-5\">\n {validation.errors.map((e) => (\n <li key={e}>{e}</li>\n ))}\n </ul>\n </div>\n ) : null}\n\n {!parsed.err && !validation.errors.length && validation.warnings.length ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-yellow-400/30 bg-yellow-500/10 p-3 text-sm text-yellow-100\">\n <div className=\"font-medium\">Workflow validation warnings</div>\n <ul className=\"mt-2 list-disc space-y-1 pl-5\">\n {validation.warnings.map((w) => (\n <li key={w}>{w}</li>\n ))}\n </ul>\n </div>\n ) : null}\n\n {actionError ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {actionError}\n </div>\n ) : null}\n\n <div className=\"flex min-h-0 flex-1 gap-0\">\n {view === \"json\" ? (\n <textarea\n value={status.jsonText}\n onChange={(e) => {\n const t = e.target.value;\n setStatus({ kind: \"ready\", jsonText: t });\n if (draft) {\n try {\n sessionStorage.setItem(draftKey(teamId, workflowId), t);\n } catch {\n // ignore\n }\n }\n }}\n className=\"h-full min-h-0 w-full flex-1 resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]\"\n />\n ) : (\n <div\n ref={canvasRef}\n className=\"relative h-full min-h-0 w-full flex-1 overflow-auto bg-black/20\"\n onWheel={(e) => {\n // Ctrl/Cmd + wheel to zoom (avoid hijacking normal scroll)\n if (!e.ctrlKey && !e.metaKey) return;\n e.preventDefault();\n const dir = e.deltaY > 0 ? -1 : 1;\n setZoom((z) => {\n const next = Math.max(ZOOM_MIN, Math.min(ZOOM_MAX, Math.round((z + dir * ZOOM_STEP) * 10) / 10));\n return next;\n });\n }}\n onClick={(e) => {\n if (activeTool.kind !== \"add-node\") return;\n const wf = parsed.wf;\n if (!wf) return;\n const el = canvasRef.current;\n if (!el) return;\n\n // Only create when clicking on the canvas background (not a node).\n const target = e.target as HTMLElement | null;\n if (target && target.closest(\"[data-wf-node='1']\")) return;\n\n const rect = el.getBoundingClientRect();\n const clickX = (e.clientX - rect.left + el.scrollLeft) / zoom;\n const clickY = (e.clientY - rect.top + el.scrollTop) / zoom;\n\n const base = activeTool.nodeType.replace(/[^a-z0-9_\\-]/gi, \"_\");\n const used = new Set(wf.nodes.map((n) => n.id));\n let i = 1;\n let id = `${base}_${i}`;\n while (used.has(id)) {\n i++;\n id = `${base}_${i}`;\n }\n\n const x = Math.max(0, clickX - 90);\n const y = Math.max(0, clickY - 24);\n\n const nextNode: WorkflowFileV1[\"nodes\"][number] = {\n id,\n type: activeTool.nodeType,\n name: id,\n x,\n y,\n config: {},\n };\n\n setWorkflow({ ...wf, nodes: [...wf.nodes, nextNode] });\n setSelectedNodeId(id);\n setActiveTool({ kind: \"select\" });\n }}\n >\n <div className=\"relative\" style={{ width: 2200 * zoom, height: 1200 * zoom }}>\n {/* Tool palette / agent palette (not scaled) */}\n <div\n className={\n toolsCollapsed\n ? \"absolute left-3 top-3 z-20 w-[44px] overflow-hidden rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/40 p-2 backdrop-blur\"\n : \"absolute left-3 top-3 z-20 w-[260px] rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/40 p-2 backdrop-blur\"\n }\n >\n <div className=\"flex items-center justify-between gap-2\">\n <div className={toolsCollapsed ? \"hidden\" : \"text-[10px] font-medium uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\"}>Tools</div>\n <div className=\"flex items-center gap-2\">\n <div className={toolsCollapsed ? \"hidden\" : \"flex items-center gap-1\"}>\n <button\n type=\"button\"\n onClick={() => setZoom((z) => Math.max(ZOOM_MIN, Math.round((z - ZOOM_STEP) * 10) / 10))}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[10px] text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n title=\"Zoom out (Ctrl/Cmd+wheel)\"\n >\n -\n </button>\n <div className=\"min-w-[42px] text-center text-[10px] text-[color:var(--ck-text-tertiary)]\">{Math.round(zoom * 100)}%</div>\n <button\n type=\"button\"\n onClick={() => setZoom((z) => Math.min(ZOOM_MAX, Math.round((z + ZOOM_STEP) * 10) / 10))}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[10px] text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n title=\"Zoom in (Ctrl/Cmd+wheel)\"\n >\n +\n </button>\n </div>\n\n <button\n type=\"button\"\n onClick={() => setToolsCollapsed((v) => !v)}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[10px] text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n title={toolsCollapsed ? \"Expand\" : \"Collapse\"}\n >\n {toolsCollapsed ? \">\" : \"<\"}\n </button>\n </div>\n </div>\n {toolsCollapsed ? (\n <div className=\"mt-2 flex flex-col items-center gap-2\">\n {(\n [\n {\n key: \"select\",\n label: \"Select\",\n active: activeTool.kind === \"select\",\n onClick: () => {\n setActiveTool({ kind: \"select\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 4l7 16 2-7 7-2L5 4Z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"connect\",\n label: \"Connect\",\n active: activeTool.kind === \"connect\",\n onClick: () => {\n // Toggle connect tool.\n setActiveTool((t) => (t.kind === \"connect\" ? { kind: \"select\" } : { kind: \"connect\" }));\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M10 13a5 5 0 0 1 0-7l1.2-1.2a5 5 0 0 1 7 7L17 12\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n <path d=\"M14 11a5 5 0 0 1 0 7L12.8 19.2a5 5 0 1 1-7-7L7 12\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n ),\n },\n {\n key: \"llm\",\n label: \"LLM\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"llm\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"llm\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M12 2l1.5 6.5L20 10l-6.5 1.5L12 18l-1.5-6.5L4 10l6.5-1.5L12 2Z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"tool\",\n label: \"Tool\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"tool\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"tool\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M14.5 7.5l2 2-8.5 8.5H6v-2l8.5-8.5Z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinejoin=\"round\" />\n <path d=\"M12 6a4 4 0 0 0-5 5l3-3 2 2 3-3A4 4 0 0 0 12 6Z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"condition\",\n label: \"If\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"condition\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"condition\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M7 4v7a3 3 0 0 0 3 3h7\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n <path d=\"M17 10l3 3-3 3\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"delay\",\n label: \"Delay\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"delay\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"delay\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M12 7v5l3 2\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M21 12a9 9 0 1 1-9-9\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n ),\n },\n {\n key: \"approval\",\n label: \"Approval\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"human_approval\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"human_approval\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M20 6 9 17l-5-5\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"end\",\n label: \"End\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"end\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"end\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M7 7h10v10H7V7Z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n ] as const\n ).map((b) => (\n <button\n key={b.key}\n type=\"button\"\n onClick={b.onClick}\n className={\n b.active\n ? \"flex h-8 w-8 items-center justify-center rounded-[var(--ck-radius-sm)] bg-white/10 text-[color:var(--ck-text-primary)]\"\n : \"flex h-8 w-8 items-center justify-center rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n }\n title={b.label}\n aria-label={b.label}\n >\n {b.icon}\n </button>\n ))}\n </div>\n ) : (\n <div className=\"mt-2 grid grid-cols-2 gap-2\">\n <button\n type=\"button\"\n onClick={() => {\n setActiveTool({ kind: \"select\" });\n setConnectFromNodeId(\"\");\n }}\n className={\n activeTool.kind === \"select\"\n ? \"rounded-[var(--ck-radius-sm)] bg-white/10 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n : \"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n }\n >\n Select\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setActiveTool({ kind: \"connect\" });\n setConnectFromNodeId(\"\");\n }}\n className={\n activeTool.kind === \"connect\"\n ? \"rounded-[var(--ck-radius-sm)] bg-white/10 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n : \"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n }\n title=\"Click a node, then click another node to create an edge\"\n >\n Connect\n </button>\n\n {([\n { t: \"llm\", label: \"LLM\" },\n { t: \"tool\", label: \"Tool\" },\n { t: \"condition\", label: \"If\" },\n { t: \"delay\", label: \"Delay\" },\n { t: \"human_approval\", label: \"Approve\" },\n { t: \"end\", label: \"End\" },\n ] as Array<{ t: WorkflowFileV1[\"nodes\"][number][\"type\"]; label: string }>).map((x) => (\n <button\n key={x.t}\n type=\"button\"\n onClick={() => {\n setActiveTool({ kind: \"add-node\", nodeType: x.t });\n setConnectFromNodeId(\"\");\n }}\n className={\n activeTool.kind === \"add-node\" && activeTool.nodeType === x.t\n ? \"rounded-[var(--ck-radius-sm)] bg-white/10 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n : \"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n }\n title=\"Select tool, then click on the canvas to place\"\n >\n + {x.label}\n </button>\n ))}\n </div>\n )}\n\n {!toolsCollapsed && activeTool.kind === \"connect\" && connectFromNodeId ? (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-secondary)]\">Connecting from: <span className=\"font-mono\">{connectFromNodeId}</span></div>\n ) : null}\n {!toolsCollapsed && activeTool.kind === \"add-node\" ? (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-secondary)]\">Click on the canvas to place a <span className=\"font-mono\">{activeTool.nodeType}</span> node.</div>\n ) : null}\n\n <div className=\"mt-3 border-t border-white/10 pt-3\">\n <div className={toolsCollapsed ? \"hidden\" : \"flex items-center justify-between gap-2\"}>\n <div className=\"text-[10px] font-medium uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">Agents</div>\n <div className=\"text-[10px] text-[color:var(--ck-text-tertiary)]\">drag → node</div>\n </div>\n\n {toolsCollapsed ? (\n <button\n type=\"button\"\n onClick={() => setToolsCollapsed(false)}\n className=\"mt-2 flex h-8 w-8 items-center justify-center rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n title=\"Expand to see agents\"\n aria-label=\"Expand to see agents\"\n >\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M16 11a4 4 0 1 0-8 0\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n <path d=\"M4 20a8 8 0 0 1 16 0\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n </button>\n ) : (\n <>\n {agentsError ? <div className=\"mt-1 text-[11px] text-red-200\">{agentsError}</div> : null}\n <div className=\"mt-2 max-h-[140px] space-y-1 overflow-auto\">\n {agents.length ? (\n agents.map((a) => (\n <div\n key={a.id}\n draggable\n onDragStart={(e) => {\n e.dataTransfer.setData(\"text/plain\", a.id);\n e.dataTransfer.effectAllowed = \"copy\";\n }}\n className=\"cursor-grab rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n title={a.id}\n >\n {a.identityName ? a.identityName : a.id.replace(`${teamId}-`, \"\")}\n </div>\n ))\n ) : (\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">No team agents found.</div>\n )}\n </div>\n </>\n )}\n </div>\n </div>\n\n <div className=\"relative h-[1200px] w-[2200px]\" style={{ transform: `scale(${zoom})`, transformOrigin: \"0 0\" }}>\n <svg\n className=\"pointer-events-none absolute inset-0 -z-10\"\n width={2200}\n height={1200}\n style={{ overflow: \"visible\" }}\n >\n {(parsed.wf?.edges ?? []).map((e) => {\n const wf = parsed.wf;\n if (!wf) return null;\n const a = wf.nodes.find((n) => n.id === e.from);\n const b = wf.nodes.find((n) => n.id === e.to);\n if (!a || !b) return null;\n const ax = (typeof a.x === \"number\" ? a.x : 80) + 90;\n const ay = (typeof a.y === \"number\" ? a.y : 80) + 24;\n const bx = (typeof b.x === \"number\" ? b.x : 80) + 90;\n const by = (typeof b.y === \"number\" ? b.y : 80) + 24;\n return (\n <line\n key={e.id}\n x1={ax}\n y1={ay}\n x2={bx}\n y2={by}\n stroke=\"rgba(255,255,255,0.35)\"\n strokeWidth={3}\n />\n );\n })}\n </svg>\n\n {(parsed.wf?.nodes ?? []).map((n, idx) => {\n const x = typeof n.x === \"number\" ? n.x : 80 + idx * 220;\n const y = typeof n.y === \"number\" ? n.y : 80;\n const selected = selectedNodeId === n.id;\n return (\n <div\n key={n.id}\n role=\"button\"\n tabIndex={0}\n data-wf-node=\"1\"\n draggable={activeTool.kind === \"select\" || activeTool.kind === \"connect\"}\n onDragStart={(e) => {\n // allow agent pills to be dropped; do not start a browser drag ghost for nodes.\n if (activeTool.kind !== \"select\") return;\n e.dataTransfer.setData(\"text/plain\", \"\");\n }}\n onDragOver={(e) => {\n // Allow dropping agents.\n if (e.dataTransfer.types.includes(\"text/plain\")) e.preventDefault();\n }}\n onDrop={(e) => {\n const wf = parsed.wf;\n if (!wf) return;\n e.preventDefault();\n e.stopPropagation();\n const agentId = String(e.dataTransfer.getData(\"text/plain\") || \"\").trim();\n if (!agentId) return;\n\n const nextNodes = wf.nodes.map((node) => {\n if (node.id !== n.id) return node;\n const cfg = node.config && typeof node.config === \"object\" && !Array.isArray(node.config) ? node.config : {};\n return { ...node, config: { ...cfg, agentId } };\n });\n setWorkflow({ ...wf, nodes: nextNodes });\n setSelectedNodeId(n.id);\n }}\n onClick={(e) => {\n e.stopPropagation();\n const wf = parsed.wf;\n if (activeTool.kind === \"connect\") {\n if (!wf) return;\n if (!connectFromNodeId) {\n setConnectFromNodeId(n.id);\n setSelectedNodeId(n.id);\n return;\n }\n const from = connectFromNodeId;\n const to = n.id;\n setConnectFromNodeId(\"\");\n if (!from || !to || from === to) return;\n const exists = (wf.edges ?? []).some((e) => e.from === from && e.to === to);\n if (exists) return;\n const id = `e${Date.now()}`;\n const nextEdge: WorkflowFileV1[\"edges\"][number] = { id, from, to };\n setWorkflow({ ...wf, edges: [...(wf.edges ?? []), nextEdge] });\n // After creating an edge, return to Select tool.\n setActiveTool({ kind: \"select\" });\n return;\n }\n\n setSelectedNodeId(n.id);\n }}\n onPointerDown={(e) => {\n // Allow dragging nodes even in connect mode (connect is click-to-connect, not drag-to-connect).\n if (activeTool.kind === \"add-node\") return;\n if (e.button !== 0) return;\n const el = canvasRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n setSelectedNodeId(n.id);\n try {\n e.currentTarget.setPointerCapture(e.pointerId);\n } catch {\n // ignore\n }\n e.preventDefault();\n\n const pointerX = (e.clientX - rect.left + el.scrollLeft) / zoom;\n const pointerY = (e.clientY - rect.top + el.scrollTop) / zoom;\n setDragging({ nodeId: n.id, dx: pointerX - x, dy: pointerY - y });\n }}\n onPointerUp={(e) => {\n try {\n e.currentTarget.releasePointerCapture(e.pointerId);\n } catch {\n // ignore\n }\n setDragging(null);\n }}\n onPointerMove={(e) => {\n if (!dragging) return;\n if (dragging.nodeId !== n.id) return;\n const wf = parsed.wf;\n if (!wf) return;\n const el = canvasRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const pointerX = (e.clientX - rect.left + el.scrollLeft) / zoom;\n const pointerY = (e.clientY - rect.top + el.scrollTop) / zoom;\n const nextX = pointerX - dragging.dx;\n const nextY = pointerY - dragging.dy;\n const nextNodes = wf.nodes.map((node) => (node.id === n.id ? { ...node, x: nextX, y: nextY } : node));\n const next: WorkflowFileV1 = { ...wf, nodes: nextNodes };\n setStatus({ kind: \"ready\", jsonText: JSON.stringify(next, null, 2) + \"\\n\" });\n }}\n className={\n selected\n ? \"absolute z-10 cursor-grab rounded-[var(--ck-radius-sm)] border border-white/25 bg-white/10 px-3 py-2 text-xs text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)]\"\n : \"absolute z-10 cursor-grab rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-xs text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n }\n style={{ left: x, top: y, width: 180 }}\n >\n <div className=\"font-medium text-[color:var(--ck-text-primary)]\">{n.name || n.id}</div>\n <div className=\"mt-0.5 text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">{n.type}</div>\n {(() => {\n const cfg = n.config && typeof n.config === \"object\" && !Array.isArray(n.config) ? (n.config as Record<string, unknown>) : null;\n const agentId = cfg ? String(cfg.agentId ?? \"\").trim() : \"\";\n if (!agentId) return null;\n const short = agentId.replace(`${teamId}-`, \"\");\n return <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-secondary)]\">Agent: {short}</div>;\n })()}\n </div>\n );\n })}\n\n {/* Inline in-canvas node inspector (requirement #6) */}\n {(() => {\n const wf = parsed.wf;\n if (!wf) return null;\n if (!selectedNodeId) return null;\n const node = wf.nodes.find((n) => n.id === selectedNodeId);\n if (!node) return null;\n\n const x = typeof node.x === \"number\" ? node.x : 80;\n const y = typeof node.y === \"number\" ? node.y : 80;\n const cfg = node.config && typeof node.config === \"object\" && !Array.isArray(node.config) ? (node.config as Record<string, unknown>) : {};\n const agentId = String(cfg.agentId ?? \"\").trim();\n\n return (\n <div\n className=\"absolute z-10 w-[320px] rounded-[var(--ck-radius-sm)] border border-white/15 bg-black/60 p-3 shadow-[var(--ck-shadow-1)] backdrop-blur\"\n style={{ left: x + 200, top: y }}\n >\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-primary)]\">{node.name || node.id}</div>\n <button\n type=\"button\"\n onClick={() => setSelectedNodeId(\"\")}\n className=\"text-[10px] text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n Close\n </button>\n </div>\n\n <div className=\"mt-2 space-y-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">name</div>\n <input\n value={String(node.name ?? \"\")}\n onChange={(e) => {\n const nextName = e.target.value;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, name: nextName } : n)) });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"Optional\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">type</div>\n <select\n value={node.type}\n onChange={(e) => {\n const nextType = e.target.value as WorkflowFileV1[\"nodes\"][number][\"type\"];\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, type: nextType } : n)) });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"start\">start</option>\n <option value=\"end\">end</option>\n <option value=\"llm\">llm</option>\n <option value=\"tool\">tool</option>\n <option value=\"condition\">condition</option>\n <option value=\"delay\">delay</option>\n <option value=\"human_approval\">human_approval</option>\n </select>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">agentId</div>\n <input\n value={agentId}\n onChange={(e) => {\n const nextAgentId = String(e.target.value || \"\").trim();\n const nextCfg = { ...cfg, ...(nextAgentId ? { agentId: nextAgentId } : {}) };\n if (!nextAgentId) delete (nextCfg as Record<string, unknown>).agentId;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"(drag an agent onto the node or type)\"\n />\n </label>\n\n {node.type === \"human_approval\" ? (\n <div className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">approval config</div>\n\n <div className=\"mt-2 space-y-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">provider</div>\n <input\n value={String((cfg as Record<string, unknown>).provider ?? \"\")}\n onChange={(e) => {\n const v = String(e.target.value || \"\").trim();\n const nextCfg = { ...cfg, ...(v ? { provider: v } : {}) };\n if (!v) delete (nextCfg as Record<string, unknown>).provider;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"telegram\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">target</div>\n <input\n value={String((cfg as Record<string, unknown>).target ?? \"\")}\n onChange={(e) => {\n const v = String(e.target.value || \"\").trim();\n const nextCfg = { ...cfg, ...(v ? { target: v } : {}) };\n if (!v) delete (nextCfg as Record<string, unknown>).target;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"(e.g. Telegram chat id)\"\n />\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">Overrides workflow-level default when set.</div>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">messageTemplate (optional)</div>\n <textarea\n value={String((cfg as Record<string, unknown>).messageTemplate ?? \"\")}\n onChange={(e) => {\n const v = String(e.target.value || \"\");\n const nextCfg = { ...cfg, ...(v.trim() ? { messageTemplate: v } : {}) };\n if (!v.trim()) delete (nextCfg as Record<string, unknown>).messageTemplate;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 h-[70px] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2 font-mono text-[10px] text-[color:var(--ck-text-primary)]\"\n placeholder=\"Approval needed for {{workflowName}} (run {{runId}})\"\n spellCheck={false}\n />\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">\n Vars: {\"{{workflowName}}\"}, {\"{{workflowId}}\"}, {\"{{runId}}\"}, {\"{{nodeId}}\"}\n </div>\n </label>\n </div>\n </div>\n ) : null}\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">config (json)</div>\n <textarea\n value={JSON.stringify(cfg, null, 2)}\n onChange={(e) => {\n try {\n const nextCfg = JSON.parse(e.target.value) as Record<string, unknown>;\n if (!nextCfg || typeof nextCfg !== \"object\" || Array.isArray(nextCfg)) return;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n } catch {\n // ignore invalid JSON while typing\n }\n }}\n className=\"mt-1 h-[140px] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/30 p-2 font-mono text-[10px] text-[color:var(--ck-text-primary)]\"\n spellCheck={false}\n />\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">(Edits apply when JSON is valid.)</div>\n </label>\n </div>\n </div>\n );\n })()}\n </div>\n </div>\n </div>\n )}\n\n <div className=\"w-[380px] shrink-0 overflow-auto p-3 text-sm\">\n <div className=\"space-y-3\">\n {parsed.wf ? (\n (() => {\n const wf = parsed.wf;\n const tz = String(wf.timezone ?? \"\").trim() || \"UTC\";\n const triggers = wf.triggers ?? [];\n\n const meta = wf.meta && typeof wf.meta === \"object\" && !Array.isArray(wf.meta) ? (wf.meta as Record<string, unknown>) : {};\n const approvalBindingId = String(meta.approvalBindingId ?? \"\").trim();\n const approvalProvider = String(meta.approvalProvider ?? \"telegram\").trim() || \"telegram\";\n const approvalTarget = String(meta.approvalTarget ?? \"\").trim();\n\n // Cron schedule suggestions.\n // Note: dev-team automation defaults should avoid the 02:00-07:00 America/New_York blackout window.\n // We keep presets in \"safe\" hours by default.\n const presets = [\n { label: \"(no preset)\", expr: \"\" },\n { label: \"Weekdays 09:00 local\", expr: \"0 9 * * 1-5\" },\n { label: \"Mon/Wed/Fri 09:00 local\", expr: \"0 9 * * 1,3,5\" },\n { label: \"Daily 08:00 local\", expr: \"0 8 * * *\" },\n { label: \"Daily 12:00 local\", expr: \"0 12 * * *\" },\n { label: \"Mon 09:30 local\", expr: \"30 9 * * 1\" },\n ];\n\n return (\n <div className=\"space-y-3\">\n <details open className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Workflow</summary>\n <div className=\"px-3 pb-3\">\n <label className=\"block\">\n <div className=\"text-[11px] font-medium text-[color:var(--ck-text-tertiary)]\">Timezone</div>\n <input\n value={tz}\n onChange={(e) => {\n const nextTz = String(e.target.value || \"\").trim() || \"UTC\";\n setWorkflow({ ...wf, timezone: nextTz });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"America/New_York\"\n />\n </label>\n </div>\n </details>\n\n <details open className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Approval Channel</summary>\n <div className=\"px-3 pb-3 space-y-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">binding (recommended)</div>\n <select\n value={approvalBindingId}\n onChange={(e) => {\n const nextId = String(e.target.value || \"\").trim();\n const selected = approvalBindings.find((b) => b.id === nextId);\n\n // Store a stable-ish reference id in the workflow so it's portable.\n // We also keep provider/target in sync for backward compatibility.\n if (selected) {\n setWorkflow({\n ...wf,\n meta: {\n ...meta,\n approvalBindingId: selected.id,\n approvalProvider: selected.channel,\n approvalTarget: selected.target,\n },\n });\n } else {\n setWorkflow({ ...wf, meta: { ...meta, approvalBindingId: \"\" } });\n }\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">(manual)</option>\n {approvalBindings.map((b) => (\n <option key={b.id} value={b.id}>\n {b.label}\n </option>\n ))}\n </select>\n {approvalBindingsNeedsKitchenUpdate ? (\n <div className=\"mt-1 text-[10px] text-yellow-200\">\n Kitchen looks out of date. Run <code className=\"font-mono\">openclaw plugins update</code> then\n <code className=\"ml-1 font-mono\">openclaw gateway restart</code>.\n </div>\n ) : null}\n {approvalBindingsError ? (\n <div className=\"mt-1 text-[10px] text-red-200\">Failed to load bindings: {approvalBindingsError}</div>\n ) : null}\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">\n Uses your existing OpenClaw bindings (recommended). Manual provider/target is an advanced override.\n </div>\n </label>\n\n <details className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/10\">\n <summary className=\"cursor-pointer list-none px-2 py-1 text-[11px] font-medium text-[color:var(--ck-text-secondary)]\">Advanced: manual override</summary>\n <div className=\"px-2 pb-2 pt-1 space-y-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">provider</div>\n <input\n value={approvalProvider}\n onChange={(e) => {\n const nextProvider = String(e.target.value || \"\").trim() || \"telegram\";\n setWorkflow({ ...wf, meta: { ...meta, approvalBindingId: \"\", approvalProvider: nextProvider } });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"telegram\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">target</div>\n <input\n value={approvalTarget}\n onChange={(e) => {\n const nextTarget = String(e.target.value || \"\").trim();\n setWorkflow({ ...wf, meta: { ...meta, approvalBindingId: \"\", approvalTarget: nextTarget } });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"(e.g. Telegram chat id)\"\n />\n </label>\n </div>\n </details>\n </div>\n </details>\n\n <details open className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Triggers</summary>\n <div className=\"px-3 pb-3\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">triggers</div>\n <button\n type=\"button\"\n onClick={() => {\n const id = `t${Date.now()}`;\n setWorkflow({\n ...wf,\n triggers: [\n ...triggers,\n { kind: \"cron\", id, name: \"New trigger\", enabled: true, expr: \"0 9 * * 1-5\", tz },\n ],\n });\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[10px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n + Add\n </button>\n </div>\n\n <div className=\"mt-2 space-y-2\">\n {triggers.length ? (\n triggers.map((t, i) => {\n const kind = (t as { kind?: unknown }).kind;\n const isCron = kind === \"cron\";\n const id = String((t as { id?: unknown }).id ?? \"\");\n const name = String((t as { name?: unknown }).name ?? \"\");\n const enabled = Boolean((t as { enabled?: unknown }).enabled);\n const expr = String((t as { expr?: unknown }).expr ?? \"\");\n const trigTz = String((t as { tz?: unknown }).tz ?? tz);\n const cronFields = expr.trim().split(/\\s+/).filter(Boolean);\n const cronLooksValid = !expr.trim() || cronFields.length === 5;\n\n return (\n <div key={`${id}-${i}`} className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-xs text-[color:var(--ck-text-primary)]\">{name || id || `trigger-${i + 1}`}</div>\n <button\n type=\"button\"\n onClick={() => setWorkflow({ ...wf, triggers: triggers.filter((_, idx) => idx !== i) })}\n className=\"text-[10px] text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n Remove\n </button>\n </div>\n\n {!isCron ? (\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">Unsupported trigger kind: {String(kind)}</div>\n ) : null}\n\n <div className=\"mt-2 grid grid-cols-1 gap-2\">\n <label className=\"flex items-center gap-2 text-xs text-[color:var(--ck-text-secondary)]\">\n <input\n type=\"checkbox\"\n checked={enabled}\n onChange={(e) => {\n const nextEnabled = e.target.checked;\n setWorkflow({\n ...wf,\n triggers: triggers.map((x, idx) => (idx === i && x.kind === \"cron\" ? { ...x, enabled: nextEnabled } : x)),\n });\n }}\n />\n Enabled\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">name</div>\n <input\n value={name}\n onChange={(e) => {\n const nextName = e.target.value;\n setWorkflow({\n ...wf,\n triggers: triggers.map((x, idx) => (idx === i && x.kind === \"cron\" ? { ...x, name: nextName } : x)),\n });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"Content cadence\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">schedule (cron)</div>\n <input\n value={expr}\n onChange={(e) => {\n const nextExpr = e.target.value;\n setWorkflow({\n ...wf,\n triggers: triggers.map((x, idx) => (idx === i && x.kind === \"cron\" ? { ...x, expr: nextExpr } : x)),\n });\n }}\n className={\n cronLooksValid\n ? \"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 font-mono text-[11px] text-[color:var(--ck-text-primary)]\"\n : \"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-red-400/50 bg-black/25 px-2 py-1 font-mono text-[11px] text-[color:var(--ck-text-primary)]\"\n }\n placeholder=\"0 9 * * 1,3,5\"\n />\n {!cronLooksValid ? (\n <div className=\"mt-1 text-[10px] text-red-200\">\n Cron should be 5 fields (min hour dom month dow). You entered {cronFields.length}.\n </div>\n ) : null}\n <div className=\"mt-1 grid grid-cols-1 gap-1\">\n <select\n value={presets.some((p) => p.expr === expr) ? expr : \"\"}\n onChange={(e) => {\n const nextExpr = e.target.value;\n setWorkflow({\n ...wf,\n triggers: triggers.map((x, idx) => (idx === i && x.kind === \"cron\" ? { ...x, expr: nextExpr } : x)),\n });\n }}\n className=\"w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-[11px] text-[color:var(--ck-text-secondary)]\"\n >\n {presets.map((p) => (\n <option key={p.label} value={p.expr}>\n {p.label}\n </option>\n ))}\n </select>\n <div className=\"text-[10px] text-[color:var(--ck-text-tertiary)]\">Presets set the cron; edit freely for advanced schedules.</div>\n </div>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">timezone override</div>\n <input\n value={trigTz}\n onChange={(e) => {\n const nextTz = String(e.target.value || \"\").trim() || tz;\n setWorkflow({\n ...wf,\n triggers: triggers.map((x, idx) => (idx === i && x.kind === \"cron\" ? { ...x, tz: nextTz } : x)),\n });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder={tz}\n />\n </label>\n </div>\n </div>\n );\n })\n ) : (\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">No triggers yet.</div>\n )}\n </div>\n </div>\n </details>\n\n <details open className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Runs</summary>\n <div className=\"px-3 pb-3\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-3\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Runs (history)</div>\n <Link\n href={`/teams/${encodeURIComponent(teamId)}/runs`}\n className=\"text-[10px] font-medium text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-secondary)] hover:underline\"\n >\n View all →\n </Link>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n disabled={saving}\n onClick={async () => {\n const wfId = String(wf.id ?? \"\").trim();\n if (!wfId) return;\n setWorkflowRunsError(\"\");\n setWorkflowRunsLoading(true);\n try {\n const res = await fetch(\"/api/teams/workflow-runs\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n // Enqueue a canonical file-first run via the CLI (Kitchen should not author run artifacts).\n body: JSON.stringify({ teamId, workflowId: wfId, mode: \"enqueue\" }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to enqueue run\");\n\n const listRes = await fetch(\n `/api/teams/workflow-runs?teamId=${encodeURIComponent(teamId)}&workflowId=${encodeURIComponent(wfId)}`,\n { cache: \"no-store\" }\n );\n const listJson = await listRes.json();\n if (!listRes.ok || !listJson.ok) throw new Error(listJson.error || \"Failed to refresh runs\");\n const files = Array.isArray(listJson.files) ? listJson.files : [];\n const list = files.map((f: unknown) => String(f ?? \"\").trim()).filter((f: string) => Boolean(f));\n setWorkflowRuns(list);\n } catch (e: unknown) {\n setWorkflowRunsError(e instanceof Error ? e.message : String(e));\n } finally {\n setWorkflowRunsLoading(false);\n }\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[10px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n + Queue run\n </button>\n <button\n type=\"button\"\n disabled={saving || cronLoading || !runPreflight.ok}\n onClick={async () => {\n const wfId = String(wf.id ?? \"\").trim();\n if (!wfId) return;\n\n // Preflight: all nodes must be assigned.\n if (runPreflight.missingAgentOnNodeIds.length) {\n setWorkflowRunsError(\"All nodes must be assigned to an agent.\");\n return;\n }\n\n // Cron reconciliation: keep the system clean by disabling orphaned worker crons,\n // and install/enable missing worker crons before enqueue.\n if (runPreflight.agentIdsMissingCron.length) {\n setInstallCronBusy(true);\n setInstallCronError(\"\");\n try {\n const reconcileRes = await fetch(\"/api/cron/worker\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ action: \"reconcile\", teamId }),\n });\n const reconcileJson = (await reconcileRes.json()) as { ok?: boolean; error?: string };\n if (!reconcileRes.ok || reconcileJson.ok === false) {\n throw new Error(reconcileJson.error || \"Failed to reconcile worker crons\");\n }\n const map = await refreshCronMap();\n const stillMissing = runPreflight.requiredAgentIds.filter((id) => !map[id]);\n if (stillMissing.length) {\n setWorkflowRunsError(`Cron not set up for: ${stillMissing.join(\", \")}`);\n return;\n }\n } catch (e: unknown) {\n setWorkflowRunsError(e instanceof Error ? e.message : String(e));\n return;\n } finally {\n setInstallCronBusy(false);\n }\n }\n\n setWorkflowRunsError(\"\");\n setWorkflowRunsLoading(true);\n try {\n const res = await fetch(\"/api/teams/workflow-runs\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, workflowId: wfId, mode: \"run_now\" }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to create run\");\n\n const listRes = await fetch(\n `/api/teams/workflow-runs?teamId=${encodeURIComponent(teamId)}&workflowId=${encodeURIComponent(wfId)}`,\n { cache: \"no-store\" }\n );\n const listJson = await listRes.json();\n if (!listRes.ok || !listJson.ok) throw new Error(listJson.error || \"Failed to refresh runs\");\n const files = Array.isArray(listJson.files) ? listJson.files : [];\n const list = files.map((f: unknown) => String(f ?? \"\").trim()).filter((f: string) => Boolean(f));\n setWorkflowRuns(list);\n } catch (e: unknown) {\n setWorkflowRunsError(e instanceof Error ? e.message : String(e));\n } finally {\n setWorkflowRunsLoading(false);\n }\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-emerald-400/30 bg-emerald-500/10 px-2 py-1 text-[10px] font-medium text-emerald-50 hover:bg-emerald-500/15 disabled:opacity-50\"\n title=\"Enqueue a run for the workflow runner (Kitchen does not execute nodes)\"\n >\n + Run now\n </button>\n {cronError ? (\n <div className=\"ml-2 text-[10px] text-amber-100/90\" title={cronError}>\n Cron check unavailable\n </div>\n ) : null}\n </div>\n </div>\n\n {runPreflight.missingAgentOnNodeIds.length ? (\n <div className=\"mt-2 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-2 text-xs text-red-100\">\n All nodes must be assigned to an agent. Missing agentId on: {runPreflight.missingAgentOnNodeIds.join(\", \")}\n </div>\n ) : runPreflight.agentIdsMissingCron.length ? (\n <div className=\"mt-2 rounded-[var(--ck-radius-sm)] border border-amber-400/30 bg-amber-500/10 p-2 text-xs text-amber-50\">\n <div>Cron not set up for: {runPreflight.agentIdsMissingCron.join(\", \")}</div>\n <div className=\"mt-2 flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => {\n setInstallCronError(\"\");\n setInstallCronOpen(true);\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-amber-300/30 bg-amber-500/10 px-2 py-1 text-[10px] font-medium text-amber-50 hover:bg-amber-500/15\"\n >\n Install worker cron(s)\n </button>\n <button\n type=\"button\"\n onClick={() => void refreshCronMap()}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[10px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Re-check\n </button>\n </div>\n </div>\n ) : null}\n\n <ConfirmationModal\n open={installCronOpen}\n title=\"Install worker cron jobs?\"\n busy={installCronBusy}\n error={installCronError || undefined}\n confirmLabel=\"Install\"\n onClose={() => {\n if (installCronBusy) return;\n setInstallCronOpen(false);\n }}\n onConfirm={async () => {\n setInstallCronBusy(true);\n setInstallCronError(\"\");\n try {\n const res = await fetch(\"/api/cron/worker\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ action: \"reconcile\", teamId }),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || json.ok === false) throw new Error(json.error || \"Failed to install worker crons\");\n\n await refreshCronMap();\n setInstallCronOpen(false);\n } catch (e: unknown) {\n setInstallCronError(e instanceof Error ? e.message : String(e));\n } finally {\n setInstallCronBusy(false);\n }\n }}\n >\n <div className=\"text-sm text-[color:var(--ck-text-secondary)]\">\n Kitchen will install (or enable) worker cron jobs for the following agents so this workflow can drain:\n <div className=\"mt-2 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2 font-mono text-[11px] text-[color:var(--ck-text-primary)]\">\n {runPreflight.agentIdsMissingCron.join(\", \")}\n </div>\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Cron cadence: 1 minute. The worker runs: <span className=\"font-mono\">openclaw recipes workflows worker-tick</span>.\n </div>\n </div>\n </ConfirmationModal>\n\n {workflowRunsError ? (\n <div className=\"mt-2 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-2 text-xs text-red-100\">\n {workflowRunsError}\n </div>\n ) : null}\n\n <div className=\"mt-2 space-y-1\">\n {workflowRunsLoading ? (\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">Loading runs…</div>\n ) : workflowRuns.length ? (\n workflowRuns.slice(0, 8).map((f) => {\n const wfId = String(wf.id ?? \"\").trim();\n const runId = String(f).replace(/\\.run\\.json$/i, \"\");\n const selected = selectedWorkflowRunId === runId;\n const href = wfId\n ? `/teams/${encodeURIComponent(teamId)}/runs/${encodeURIComponent(wfId)}/${encodeURIComponent(runId)}`\n : \"#\";\n\n return (\n <Link\n key={f}\n href={href}\n onClick={() => setSelectedWorkflowRunId(runId)}\n className={\n selected\n ? \"block w-full rounded-[var(--ck-radius-sm)] bg-white/10 px-2 py-1 text-left text-[11px] font-mono text-[color:var(--ck-text-primary)]\"\n : \"block w-full rounded-[var(--ck-radius-sm)] px-2 py-1 text-left text-[11px] font-mono text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n title=\"Open run detail\"\n >\n {runId}\n </Link>\n );\n })\n ) : (\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">No runs yet.</div>\n )}\n </div>\n\n <details open className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/10\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Nodes</summary>\n <div className=\"px-3 pb-3\">\n\n <div className=\"mt-2 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2\">\n <div className=\"grid grid-cols-1 gap-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">id</div>\n <input\n value={newNodeId}\n onChange={(e) => setNewNodeId(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"e.g. draft_assets\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">name (optional)</div>\n <input\n value={newNodeName}\n onChange={(e) => setNewNodeName(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"Human-friendly label\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">type</div>\n <select\n value={newNodeType}\n onChange={(e) => setNewNodeType(e.target.value as WorkflowFileV1[\"nodes\"][number][\"type\"])}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"start\">start</option>\n <option value=\"end\">end</option>\n <option value=\"llm\">llm</option>\n <option value=\"tool\">tool</option>\n <option value=\"condition\">condition</option>\n <option value=\"delay\">delay</option>\n <option value=\"human_approval\">human_approval</option>\n </select>\n </label>\n\n <button\n type=\"button\"\n onClick={() => {\n const rawId = String(newNodeId || \"\").trim();\n const id = rawId.replace(/[^a-z0-9_\\-]/gi, \"_\");\n if (!id) return;\n if (wf.nodes.some((n) => n.id === id)) return;\n\n const maxX = wf.nodes.reduce((acc, n) => (typeof n.x === \"number\" ? Math.max(acc, n.x) : acc), 80);\n const nextNode = {\n id,\n type: newNodeType,\n name: String(newNodeName || \"\").trim() || id,\n x: maxX + 220,\n y: 80,\n } as WorkflowFileV1[\"nodes\"][number];\n\n setWorkflow({ ...wf, nodes: [...wf.nodes, nextNode] });\n setSelectedNodeId(id);\n setNewNodeId(\"\");\n setNewNodeName(\"\");\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[11px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n + Add node\n </button>\n </div>\n </div>\n\n <div className=\"mt-2 space-y-1\">\n {wf.nodes.map((n) => {\n const selected = selectedNodeId === n.id;\n return (\n <button\n key={n.id}\n type=\"button\"\n onClick={() => setSelectedNodeId(n.id)}\n className={\n selected\n ? \"w-full rounded-[var(--ck-radius-sm)] bg-white/10 px-2 py-1 text-left text-[11px] text-[color:var(--ck-text-primary)]\"\n : \"w-full rounded-[var(--ck-radius-sm)] px-2 py-1 text-left text-[11px] text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n >\n <span className=\"font-mono\">{n.id}</span>\n <span className=\"ml-2 text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">{n.type}</span>\n </button>\n );\n })}\n </div>\n </div>\n </details>\n\n <details open className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/10\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Edges</summary>\n <div className=\"px-3 pb-3\">\n\n <div className=\"mt-2 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2\">\n <div className=\"grid grid-cols-1 gap-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">from</div>\n <select\n value={newEdgeFrom}\n onChange={(e) => setNewEdgeFrom(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">(select)</option>\n {wf.nodes.map((n) => (\n <option key={n.id} value={n.id}>\n {n.id}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">to</div>\n <select\n value={newEdgeTo}\n onChange={(e) => setNewEdgeTo(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">(select)</option>\n {wf.nodes.map((n) => (\n <option key={n.id} value={n.id}>\n {n.id}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">label (optional)</div>\n <input\n value={newEdgeLabel}\n onChange={(e) => setNewEdgeLabel(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"e.g. approve\"\n />\n </label>\n\n <button\n type=\"button\"\n onClick={() => {\n const from = String(newEdgeFrom || \"\").trim();\n const to = String(newEdgeTo || \"\").trim();\n if (!from || !to) return;\n if (from === to) return;\n const id = `e${Date.now()}`;\n const nextEdge: WorkflowFileV1[\"edges\"][number] = {\n id,\n from,\n to,\n ...(String(newEdgeLabel || \"\").trim() ? { label: String(newEdgeLabel).trim() } : {}),\n };\n setWorkflow({ ...wf, edges: [...(wf.edges ?? []), nextEdge] });\n setNewEdgeLabel(\"\");\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[11px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n + Add edge\n </button>\n </div>\n </div>\n\n <div className=\"mt-2 space-y-2\">\n {(wf.edges ?? []).length ? (\n (wf.edges ?? []).map((e) => (\n <div key={e.id} className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-[11px] text-[color:var(--ck-text-secondary)]\">\n <span className=\"font-mono\">{e.from}</span> → <span className=\"font-mono\">{e.to}</span>\n {e.label ? <span className=\"ml-2 text-[10px] text-[color:var(--ck-text-tertiary)]\">({e.label})</span> : null}\n </div>\n <button\n type=\"button\"\n onClick={() => setWorkflow({ ...wf, edges: (wf.edges ?? []).filter((x) => x.id !== e.id) })}\n className=\"text-[10px] text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n Remove\n </button>\n </div>\n </div>\n ))\n ) : (\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">No edges yet.</div>\n )}\n </div>\n </div>\n </details>\n\n <details open className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/10\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Node inspector</summary>\n <div className=\"px-3 pb-3\">\n <div className=\"flex items-center justify-between gap-2\">\n {selectedNodeId ? (\n <button\n type=\"button\"\n onClick={() => {\n const nodeId = selectedNodeId;\n const nextNodes = wf.nodes.filter((n) => n.id !== nodeId);\n const nextEdges = (wf.edges ?? []).filter((e) => e.from !== nodeId && e.to !== nodeId);\n setWorkflow({ ...wf, nodes: nextNodes, edges: nextEdges });\n setSelectedNodeId(\"\");\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[10px] font-medium text-red-100 hover:bg-white/10\"\n >\n Delete node\n </button>\n ) : null}\n </div>\n\n {selectedNodeId ? (\n (() => {\n const node = wf.nodes.find((n) => n.id === selectedNodeId);\n if (!node) return <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">No node selected.</div>;\n\n return (\n <div className=\"mt-3 space-y-3\">\n <div>\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">id</div>\n <div className=\"mt-1 rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\">\n {node.id}\n </div>\n </div>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">name</div>\n <input\n value={String(node.name ?? \"\")}\n onChange={(e) => {\n const nextName = e.target.value;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, name: nextName } : n)) });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"Optional\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">type</div>\n <select\n value={node.type}\n onChange={(e) => {\n const nextType = e.target.value as WorkflowFileV1[\"nodes\"][number][\"type\"];\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, type: nextType } : n)) });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"start\">start</option>\n <option value=\"end\">end</option>\n <option value=\"llm\">llm</option>\n <option value=\"tool\">tool</option>\n <option value=\"condition\">condition</option>\n <option value=\"delay\">delay</option>\n <option value=\"human_approval\">human_approval</option>\n </select>\n </label>\n\n <div className=\"grid grid-cols-2 gap-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">x</div>\n <input\n type=\"number\"\n value={typeof node.x === \"number\" ? node.x : 0}\n onChange={(e) => {\n const nextX = Number(e.target.value);\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, x: nextX } : n)) });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n />\n </label>\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">y</div>\n <input\n type=\"number\"\n value={typeof node.y === \"number\" ? node.y : 0}\n onChange={(e) => {\n const nextY = Number(e.target.value);\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, y: nextY } : n)) });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n />\n </label>\n </div>\n\n <div>\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">config</div>\n <pre className=\"mt-1 max-h-[200px] overflow-auto rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2 text-[10px] text-[color:var(--ck-text-secondary)]\">\n {JSON.stringify(node.config ?? {}, null, 2)}\n </pre>\n </div>\n </div>\n );\n })()\n ) : (\n <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">Select a node.</div>\n )}\n </div>\n </details>\n </div>\n </details>\n </div>\n );\n })()\n ) : null}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import type { WorkflowEdgeV1, WorkflowFileV1, WorkflowNodeV1, WorkflowTriggerCronV1 } from \"@/lib/workflows/types\";\n\nexport type WorkflowValidationResult = {\n errors: string[];\n warnings: string[];\n};\n\nfunction isFiveFieldCron(expr: string) {\n const parts = String(expr || \"\")\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n return parts.length === 5;\n}\n\nfunction uniqCount(values: string[]) {\n const set = new Set<string>();\n for (const v of values) set.add(v);\n return set.size;\n}\n\nexport function validateWorkflowFileV1(wf: WorkflowFileV1): WorkflowValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (wf.schema !== \"clawkitchen.workflow.v1\") errors.push(`schema must be clawkitchen.workflow.v1 (got ${String(wf.schema)})`);\n if (!String(wf.id || \"\").trim()) errors.push(\"id is required\");\n if (!String(wf.name || \"\").trim()) errors.push(\"name is required\");\n\n const nodes: WorkflowNodeV1[] = Array.isArray(wf.nodes) ? wf.nodes : [];\n const edges: WorkflowEdgeV1[] = Array.isArray(wf.edges) ? wf.edges : [];\n const triggers: WorkflowTriggerCronV1[] = Array.isArray(wf.triggers) ? wf.triggers : [];\n\n const nodeIds = nodes.map((n) => String(n?.id ?? \"\").trim()).filter(Boolean);\n if (nodeIds.length !== nodes.length) errors.push(\"all nodes must have a non-empty id\");\n if (uniqCount(nodeIds) !== nodeIds.length) errors.push(\"node ids must be unique\");\n\n const edgeIds = edges.map((e) => String(e?.id ?? \"\").trim()).filter(Boolean);\n if (edgeIds.length !== edges.length) errors.push(\"all edges must have a non-empty id\");\n if (uniqCount(edgeIds) !== edgeIds.length) errors.push(\"edge ids must be unique\");\n\n const nodeIdSet = new Set(nodeIds);\n for (const e of edges) {\n const from = String(e?.from ?? \"\").trim();\n const to = String(e?.to ?? \"\").trim();\n if (!from || !to) {\n errors.push(`edge ${String(e?.id ?? \"(missing id)\")} must have from/to`);\n continue;\n }\n if (!nodeIdSet.has(from)) errors.push(`edge ${String(e.id)} references missing from node: ${from}`);\n if (!nodeIdSet.has(to)) errors.push(`edge ${String(e.id)} references missing to node: ${to}`);\n }\n\n const starts = nodes.filter((n) => n.type === \"start\");\n const ends = nodes.filter((n) => n.type === \"end\");\n if (!starts.length) warnings.push(\"no start node found\");\n if (starts.length > 1) warnings.push(\"multiple start nodes found (MVP supports this, but execution semantics may be ambiguous)\");\n if (!ends.length) warnings.push(\"no end node found\");\n\n for (const t of triggers) {\n if (t.kind === \"cron\") {\n if (!String(t.id || \"\").trim()) errors.push(\"cron trigger missing id\");\n if (!String(t.expr || \"\").trim()) errors.push(`cron trigger ${String(t.id || \"(missing id)\")} missing expr`);\n else if (!isFiveFieldCron(t.expr)) warnings.push(`cron trigger ${String(t.id)} expr is not 5-field: ${String(t.expr)}`);\n const tz = t.tz ? String(t.tz).trim() : \"\";\n // NOTE: We commonly use \"UTC\" as a default, and it is widely accepted even though it isn't in the\n // classic Region/City IANA format. Treat it as valid to avoid noisy validation warnings.\n if (tz && tz !== \"UTC\" && !tz.includes(\"/\")) {\n warnings.push(`cron trigger ${String(t.id)} tz doesn't look like an IANA timezone: ${String(t.tz)}`);\n }\n }\n }\n\n // Human approval node sanity checks (MVP)\n const meta = wf.meta && typeof wf.meta === \"object\" && !Array.isArray(wf.meta) ? (wf.meta as Record<string, unknown>) : {};\n const defaultTarget = String(meta.approvalTarget ?? \"\").trim();\n for (const n of nodes) {\n if (n.type !== \"human_approval\") continue;\n const cfg = n.config && typeof n.config === \"object\" && !Array.isArray(n.config) ? (n.config as Record<string, unknown>) : {};\n const target = String(cfg.target ?? cfg.chatId ?? \"\").trim();\n const provider = String(cfg.provider ?? cfg.channel ?? \"\").trim();\n\n if (!target && !defaultTarget) {\n warnings.push(`human_approval node ${String(n.id)} has no target (set node.config.target or workflow.meta.approvalTarget)`);\n }\n if (target && !provider && !String(meta.approvalProvider ?? \"\").trim()) {\n warnings.push(`human_approval node ${String(n.id)} has a target but no provider (set node.config.provider or workflow.meta.approvalProvider)`);\n }\n }\n\n return { errors, warnings };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/teams/%5BteamId%5D/workflows/%5BworkflowId%5D/workflows-editor-client.tsx","../../../../src/lib/workflows/validate.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport Link from \"next/link\";\nimport { ConfirmationModal } from \"@/components/ConfirmationModal\";\nimport type { WorkflowFileV1 } from \"@/lib/workflows/types\";\nimport { validateWorkflowFileV1 } from \"@/lib/workflows/validate\";\n\ntype LoadState =\n | { kind: \"loading\" }\n | { kind: \"error\"; error: string }\n | { kind: \"ready\"; jsonText: string };\n\nfunction draftKey(teamId: string, workflowId: string) {\n return `ck-wf-draft:${teamId}:${workflowId}`;\n}\n\nexport default function WorkflowsEditorClient({\n teamId,\n workflowId,\n draft,\n llmTaskEnabled,\n}: {\n teamId: string;\n workflowId: string;\n draft: boolean;\n llmTaskEnabled?: boolean;\n}) {\n const [view, setView] = useState<\"canvas\" | \"json\">(\"canvas\");\n const [saving, setSaving] = useState(false);\n const [status, setStatus] = useState<LoadState>({ kind: \"loading\" });\n const [actionError, setActionError] = useState<string>(\"\");\n const importInputRef = useRef<HTMLInputElement | null>(null);\n\n const [toolsCollapsed, setToolsCollapsed] = useState(false);\n\n // Canvas zoom\n const [zoom, setZoom] = useState(1);\n const ZOOM_MIN = 0.5;\n const ZOOM_MAX = 2.5;\n const ZOOM_STEP = 0.1;\n\n // Canvas: selection, drag, node/edge creation.\n const canvasRef = useRef<HTMLDivElement | null>(null);\n const [selectedNodeId, setSelectedNodeId] = useState<string>(\"\");\n const [dragging, setDragging] = useState<null | { nodeId: string; dx: number; dy: number }>(null);\n\n const [activeTool, setActiveTool] = useState<\n | { kind: \"select\" }\n | { kind: \"add-node\"; nodeType: WorkflowFileV1[\"nodes\"][number][\"type\"] }\n | { kind: \"connect\" }\n >({ kind: \"select\" });\n const [connectFromNodeId, setConnectFromNodeId] = useState<string>(\"\");\n\n const [agents, setAgents] = useState<Array<{ id: string; identityName?: string }>>([]);\n const [agentsError, setAgentsError] = useState<string>(\"\");\n\n const [approvalBindings, setApprovalBindings] = useState<Array<{ id: string; label: string; channel: string; target: string }>>([]);\n const [approvalBindingsError, setApprovalBindingsError] = useState<string>(\"\");\n\n const approvalBindingsNeedsKitchenUpdate = useMemo(() => {\n return /Tool not available:\\s*gateway/i.test(String(approvalBindingsError || \"\"));\n }, [approvalBindingsError]);\n\n // Inspector state (parity with modal)\n const [workflowRuns, setWorkflowRuns] = useState<string[]>([]);\n const [workflowRunsLoading, setWorkflowRunsLoading] = useState(false);\n const [workflowRunsError, setWorkflowRunsError] = useState(\"\");\n const [selectedWorkflowRunId, setSelectedWorkflowRunId] = useState<string>(\"\");\n\n // Run preflight: ensure nodes are assigned + required worker cron exists.\n const [cronLoading, setCronLoading] = useState(false);\n const [cronError, setCronError] = useState<string>(\"\");\n const [agentHasCron, setAgentHasCron] = useState<Record<string, boolean>>({});\n\n const [installCronOpen, setInstallCronOpen] = useState(false);\n const [installCronBusy, setInstallCronBusy] = useState(false);\n const [installCronError, setInstallCronError] = useState<string>(\"\");\n\n const [newNodeId, setNewNodeId] = useState(\"\");\n const [newNodeName, setNewNodeName] = useState(\"\");\n const [newNodeType, setNewNodeType] = useState<WorkflowFileV1[\"nodes\"][number][\"type\"]>(\"llm\");\n\n const [newEdgeFrom, setNewEdgeFrom] = useState(\"\");\n const [newEdgeTo, setNewEdgeTo] = useState(\"\");\n const [newEdgeLabel, setNewEdgeLabel] = useState(\"\");\n\n useEffect(() => {\n (async () => {\n try {\n if (draft) {\n const stored = sessionStorage.getItem(draftKey(teamId, workflowId));\n if (stored) {\n setStatus({ kind: \"ready\", jsonText: stored });\n return;\n }\n\n // New draft: initialize a clean workflow instead of trying to fetch an existing file.\n const initial: WorkflowFileV1 = {\n schema: \"clawkitchen.workflow.v1\",\n id: workflowId,\n name: \"New workflow\",\n timezone: \"UTC\",\n nodes: [\n { id: \"start\", type: \"start\", name: \"start\", x: 80, y: 80, config: {} },\n { id: \"end\", type: \"end\", name: \"end\", x: 520, y: 80, config: {} },\n ],\n edges: [{ id: \"e1\", from: \"start\", to: \"end\" }],\n };\n const text = JSON.stringify(initial, null, 2) + \"\\n\";\n setStatus({ kind: \"ready\", jsonText: text });\n try {\n sessionStorage.setItem(draftKey(teamId, workflowId), text);\n } catch {\n // ignore\n }\n return;\n }\n\n const res = await fetch(\n `/api/teams/workflows?teamId=${encodeURIComponent(teamId)}&id=${encodeURIComponent(workflowId)}`,\n { cache: \"no-store\" }\n );\n const json = (await res.json()) as { ok?: boolean; error?: string; workflow?: unknown };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to load workflow\");\n setStatus({ kind: \"ready\", jsonText: JSON.stringify(json.workflow, null, 2) + \"\\n\" });\n } catch (e: unknown) {\n setStatus({ kind: \"error\", error: e instanceof Error ? e.message : String(e) });\n }\n })();\n }, [teamId, workflowId, draft]);\n\n useEffect(() => {\n (async () => {\n setAgentsError(\"\");\n try {\n const res = await fetch(\"/api/agents\", { cache: \"no-store\" });\n const json = (await res.json()) as { agents?: Array<{ id?: unknown; identityName?: unknown }>; error?: string; message?: string };\n if (!res.ok) throw new Error(json.error || json.message || \"Failed to load agents\");\n const list = Array.isArray(json.agents) ? json.agents : [];\n const filtered = list\n .map((a) => ({ id: String(a.id ?? \"\").trim(), identityName: typeof a.identityName === \"string\" ? a.identityName : undefined }))\n .filter((a) => a.id && a.id.startsWith(`${teamId}-`));\n setAgents(filtered);\n } catch (e: unknown) {\n setAgentsError(e instanceof Error ? e.message : String(e));\n setAgents([]);\n }\n })();\n }, [teamId]);\n\n function isRecord(v: unknown): v is Record<string, unknown> {\n return Boolean(v) && typeof v === \"object\" && !Array.isArray(v);\n }\n\n function bindingLabelAndTarget(b: unknown): { id: string; label: string; channel: string; target: string } | null {\n // Expected OpenClaw binding shape:\n // { agentId, match: { channel: \"telegram\", accountId?: string, peer?: { kind: \"dm\"|\"group\", id: string } } }\n if (!isRecord(b)) return null;\n const match = isRecord(b.match) ? b.match : null;\n if (!match) return null;\n\n const channel = String(match.channel ?? \"\").trim();\n if (!channel) return null;\n\n const bindingAgentId = String(b.agentId ?? \"\").trim();\n const accountId = String(match.accountId ?? \"\").trim();\n const peer = isRecord(match.peer) ? match.peer : null;\n const kind = peer ? String(peer.kind ?? \"\").trim() : \"\";\n const peerId = peer ? String(peer.id ?? \"\").trim() : \"\";\n const target = peerId || accountId;\n\n if (!target) return null;\n\n // approvalBindingId must be the actual config binding id (agentId) when available.\n // Older Kitchen builds synthesized ids like telegram:dm:<peer> or telegram:account:<id>,\n // which can be ambiguous and break approval resolution when multiple bindings share a peer.\n const id = bindingAgentId || (accountId ? `${channel}:account:${accountId}` : `${channel}:${kind}:${peerId}`);\n\n const parts = [channel];\n if (bindingAgentId) parts.push(bindingAgentId);\n if (accountId) parts.push(`account:${accountId}`);\n if (kind && peerId) parts.push(`${kind}:${peerId}`);\n\n return { id, label: parts.join(\" · \"), channel, target };\n }\n\n useEffect(() => {\n (async () => {\n setApprovalBindingsError(\"\");\n try {\n const res = await fetch(\"/api/channels/bindings\", { cache: \"no-store\" });\n const json = (await res.json()) as { ok?: boolean; bindings?: unknown[]; error?: string };\n if (!res.ok || json.ok === false) throw new Error(json.error || \"Failed to load bindings\");\n\n const list = Array.isArray(json.bindings) ? json.bindings : [];\n const mapped = list.map(bindingLabelAndTarget).filter(Boolean) as Array<{ id: string; label: string; channel: string; target: string }>;\n setApprovalBindings(mapped);\n } catch (e: unknown) {\n setApprovalBindingsError(e instanceof Error ? e.message : String(e));\n setApprovalBindings([]);\n }\n })();\n }, []);\n\n const refreshCronMap = useCallback(async (): Promise<Record<string, boolean>> => {\n // Preflight helper: determine whether each agent has any cron job installed/enabled.\n // (Used to warn/block enqueue when the assigned worker has no cron heartbeat.)\n setCronError(\"\");\n setCronLoading(true);\n try {\n const res = await fetch(\"/api/cron/jobs\", { cache: \"no-store\" });\n const json = (await res.json()) as { ok?: boolean; error?: string; jobs?: unknown[] };\n if (!res.ok || json.ok === false) throw new Error(json.error || \"Failed to load cron jobs\");\n const jobs = Array.isArray(json.jobs) ? json.jobs : [];\n\n const map: Record<string, boolean> = {};\n for (const j of jobs) {\n // openclaw cron list returns `agentId` on the job when scoped to an agent.\n // We also enrich jobs with `scope`, but that may be team-scoped for worker-cron grouping.\n const job = j as { enabled?: unknown; agentId?: unknown; scope?: { kind?: unknown; id?: unknown } };\n if (!job || !Boolean(job.enabled)) continue;\n\n const agentId = String(job.agentId ?? \"\").trim();\n if (agentId) {\n map[agentId] = true;\n continue;\n }\n\n // Back-compat: if we don't have agentId, fall back to enriched scope.\n if (job.scope && String(job.scope.kind) === \"agent\") {\n const id = String(job.scope.id ?? \"\").trim();\n if (id) map[id] = true;\n }\n }\n setAgentHasCron(map);\n return map;\n } catch (e: unknown) {\n setCronError(e instanceof Error ? e.message : String(e));\n setAgentHasCron({});\n return {};\n } finally {\n setCronLoading(false);\n }\n }, []);\n\n useEffect(() => {\n void refreshCronMap();\n }, [refreshCronMap]);\n\n const parsed = useMemo(() => {\n if (status.kind !== \"ready\") return { wf: null as WorkflowFileV1 | null, err: \"\" };\n try {\n const wf = JSON.parse(status.jsonText) as WorkflowFileV1;\n return { wf, err: \"\" };\n } catch (e: unknown) {\n return { wf: null, err: e instanceof Error ? e.message : String(e) };\n }\n }, [status]);\n\n const validation = useMemo(() => {\n if (!parsed.wf) return { errors: [], warnings: [] as string[] };\n return validateWorkflowFileV1(parsed.wf);\n }, [parsed.wf]);\n\n const runPreflight = useMemo(() => {\n const wf = parsed.wf;\n if (!wf) {\n return {\n missingAgentOnNodeIds: [] as string[],\n requiredAgentIds: [] as string[],\n agentIdsMissingCron: [] as string[],\n ok: true,\n };\n }\n\n const nodesToExecute = (wf.nodes ?? []).filter(\n (n) => n.type !== \"start\" && n.type !== \"end\" && n.type !== \"human_approval\"\n );\n\n const missingAgentOnNodeIds = nodesToExecute\n .filter((n) => {\n const cfg = n.config && typeof n.config === \"object\" && !Array.isArray(n.config) ? (n.config as Record<string, unknown>) : {};\n const agentId = String(cfg.agentId ?? \"\").trim();\n return !agentId;\n })\n .map((n) => n.id);\n\n const requiredAgentIds = Array.from(\n new Set(\n nodesToExecute\n .map((n) => {\n const cfg = n.config && typeof n.config === \"object\" && !Array.isArray(n.config) ? (n.config as Record<string, unknown>) : {};\n return String(cfg.agentId ?? \"\").trim();\n })\n .filter(Boolean)\n )\n );\n\n const agentIdsMissingCron = requiredAgentIds.filter((id) => !agentHasCron[id]);\n\n const ok = missingAgentOnNodeIds.length === 0 && agentIdsMissingCron.length === 0;\n return { missingAgentOnNodeIds, requiredAgentIds, agentIdsMissingCron, ok };\n }, [parsed.wf, agentHasCron]);\n\n function setWorkflow(next: WorkflowFileV1) {\n const text = JSON.stringify(next, null, 2) + \"\\n\";\n setStatus({ kind: \"ready\", jsonText: text });\n if (draft) {\n try {\n sessionStorage.setItem(draftKey(teamId, workflowId), text);\n } catch {\n // ignore\n }\n }\n }\n\n async function onSave() {\n if (status.kind !== \"ready\") return;\n if (!parsed.wf) return;\n if (parsed.err) return;\n if (validation.errors.length) return;\n\n setSaving(true);\n setActionError(\"\");\n try {\n const res = await fetch(\"/api/teams/workflows\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, workflow: parsed.wf }),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to save workflow\");\n\n // Clear draft cache once persisted.\n try {\n sessionStorage.removeItem(draftKey(teamId, workflowId));\n } catch {\n // ignore\n }\n } catch (e: unknown) {\n setActionError(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n\n function onExport() {\n if (!parsed.wf) return;\n if (parsed.err) return;\n if (validation.errors.length) return;\n\n const filename = `${parsed.wf.id || workflowId}.workflow.json`;\n const blob = new Blob([JSON.stringify(parsed.wf, null, 2) + \"\\n\"], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n }\n\n if (status.kind === \"loading\") return <div className=\"ck-glass w-full p-6\">Loading…</div>;\n if (status.kind === \"error\") return <div className=\"ck-glass w-full p-6\">{status.error}</div>;\n\n // (section collapse uses native <details> to keep this file simple)\n const llmHelp = llmTaskEnabled === false ? (\n <div className=\"mx-3 mb-3 rounded-[var(--ck-radius-sm)] border border-amber-500/30 bg-amber-500/10 p-3 text-sm\">\n <div className=\"font-medium text-amber-200\">LLM support is not enabled</div>\n <div className=\"mt-1 text-[color:var(--ck-text-secondary)]\">\n Workflow LLM nodes require the optional built-in <code className=\"px-1\">llm-task</code> plugin.\n </div>\n <div className=\"mt-2 text-[color:var(--ck-text-secondary)]\">\n Enable it with: <code className=\"px-1\">openclaw plugins enable llm-task</code> then run{' '}\n <code className=\"px-1\">openclaw gateway restart</code>.\n </div>\n </div>\n ) : null;\n\n\n return (\n <div className=\"flex h-full min-h-0 w-full flex-1 flex-col\">\n <div className=\"flex flex-wrap items-center justify-between gap-3 px-3 py-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <a\n href={`/teams/${encodeURIComponent(teamId)}?tab=workflows`}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Back\n </a>\n <div className=\"min-w-0\">\n <div className=\"truncate text-base font-medium text-[color:var(--ck-text-primary)]\">\n {workflowId}.workflow.json\n </div>\n <div className=\"mt-0.5 text-sm text-[color:var(--ck-text-tertiary)]\">Team: {teamId}</div>\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"flex overflow-hidden rounded-[var(--ck-radius-sm)] border border-white/10\">\n <button\n type=\"button\"\n onClick={() => setView(\"canvas\")}\n className={\n view === \"canvas\"\n ? \"bg-white/10 px-3 py-2 text-xs font-medium text-[color:var(--ck-text-primary)]\"\n : \"bg-transparent px-3 py-2 text-xs font-medium text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n >\n Canvas\n </button>\n <button\n type=\"button\"\n onClick={() => setView(\"json\")}\n className={\n view === \"json\"\n ? \"bg-white/10 px-3 py-2 text-xs font-medium text-[color:var(--ck-text-primary)]\"\n : \"bg-transparent px-3 py-2 text-xs font-medium text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n >\n JSON\n </button>\n </div>\n\n <input\n ref={importInputRef}\n type=\"file\"\n accept=\"application/json,.json\"\n className=\"hidden\"\n onChange={async (e) => {\n const file = e.target.files?.[0];\n // Reset the input so re-importing the same file still triggers onChange.\n e.target.value = \"\";\n if (!file) return;\n\n setActionError(\"\");\n try {\n const text = await file.text();\n const next = JSON.parse(text) as WorkflowFileV1;\n setStatus({ kind: \"ready\", jsonText: JSON.stringify(next, null, 2) + \"\\n\" });\n if (draft) {\n try {\n sessionStorage.setItem(draftKey(teamId, workflowId), JSON.stringify(next, null, 2) + \"\\n\");\n } catch {\n // ignore\n }\n }\n } catch (err: unknown) {\n setActionError(err instanceof Error ? err.message : String(err));\n }\n }}\n />\n\n <button\n type=\"button\"\n disabled={saving}\n onClick={() => importInputRef.current?.click()}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-white/10 disabled:opacity-50\"\n >\n Import\n </button>\n\n <button\n type=\"button\"\n disabled={!parsed.wf || Boolean(parsed.err) || validation.errors.length > 0}\n onClick={onExport}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-white/10 disabled:opacity-50\"\n >\n Export\n </button>\n\n <button\n type=\"button\"\n disabled={saving || !parsed.wf || Boolean(parsed.err) || validation.errors.length > 0}\n onClick={onSave}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save\"}\n </button>\n\n {/* Back button lives in the left header. */}\n </div>\n </div>\n\n {llmHelp}\n\n {parsed.err ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-yellow-400/30 bg-yellow-500/10 p-3 text-sm text-yellow-100\">\n JSON parse error: {parsed.err}\n </div>\n ) : null}\n {!parsed.err && validation.errors.length ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n <div className=\"font-medium\">Workflow validation errors</div>\n <ul className=\"mt-2 list-disc space-y-1 pl-5\">\n {validation.errors.map((e) => (\n <li key={e}>{e}</li>\n ))}\n </ul>\n </div>\n ) : null}\n\n {!parsed.err && !validation.errors.length && validation.warnings.length ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-yellow-400/30 bg-yellow-500/10 p-3 text-sm text-yellow-100\">\n <div className=\"font-medium\">Workflow validation warnings</div>\n <ul className=\"mt-2 list-disc space-y-1 pl-5\">\n {validation.warnings.map((w) => (\n <li key={w}>{w}</li>\n ))}\n </ul>\n </div>\n ) : null}\n\n {actionError ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {actionError}\n </div>\n ) : null}\n\n <div className=\"flex min-h-0 flex-1 gap-0\">\n {view === \"json\" ? (\n <textarea\n value={status.jsonText}\n onChange={(e) => {\n const t = e.target.value;\n setStatus({ kind: \"ready\", jsonText: t });\n if (draft) {\n try {\n sessionStorage.setItem(draftKey(teamId, workflowId), t);\n } catch {\n // ignore\n }\n }\n }}\n className=\"h-full min-h-0 w-full flex-1 resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]\"\n />\n ) : (\n <div\n ref={canvasRef}\n className=\"relative h-full min-h-0 w-full flex-1 overflow-auto bg-black/20\"\n onWheel={(e) => {\n // Ctrl/Cmd + wheel to zoom (avoid hijacking normal scroll)\n if (!e.ctrlKey && !e.metaKey) return;\n e.preventDefault();\n const dir = e.deltaY > 0 ? -1 : 1;\n setZoom((z) => {\n const next = Math.max(ZOOM_MIN, Math.min(ZOOM_MAX, Math.round((z + dir * ZOOM_STEP) * 10) / 10));\n return next;\n });\n }}\n onClick={(e) => {\n if (activeTool.kind !== \"add-node\") return;\n const wf = parsed.wf;\n if (!wf) return;\n const el = canvasRef.current;\n if (!el) return;\n\n // Only create when clicking on the canvas background (not a node).\n const target = e.target as HTMLElement | null;\n if (target && target.closest(\"[data-wf-node='1']\")) return;\n\n const rect = el.getBoundingClientRect();\n const clickX = (e.clientX - rect.left + el.scrollLeft) / zoom;\n const clickY = (e.clientY - rect.top + el.scrollTop) / zoom;\n\n const base = activeTool.nodeType.replace(/[^a-z0-9_\\-]/gi, \"_\");\n const used = new Set(wf.nodes.map((n) => n.id));\n let i = 1;\n let id = `${base}_${i}`;\n while (used.has(id)) {\n i++;\n id = `${base}_${i}`;\n }\n\n const x = Math.max(0, clickX - 90);\n const y = Math.max(0, clickY - 24);\n\n const nextNode: WorkflowFileV1[\"nodes\"][number] = {\n id,\n type: activeTool.nodeType,\n name: id,\n x,\n y,\n config: {},\n };\n\n setWorkflow({ ...wf, nodes: [...wf.nodes, nextNode] });\n setSelectedNodeId(id);\n setActiveTool({ kind: \"select\" });\n }}\n >\n <div className=\"relative\" style={{ width: 2200 * zoom, height: 1200 * zoom }}>\n {/* Tool palette / agent palette (not scaled) */}\n <div\n className={\n toolsCollapsed\n ? \"absolute left-3 top-3 z-20 w-[44px] overflow-hidden rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/40 p-2 backdrop-blur\"\n : \"absolute left-3 top-3 z-20 w-[260px] rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/40 p-2 backdrop-blur\"\n }\n >\n <div className=\"flex items-center justify-between gap-2\">\n <div className={toolsCollapsed ? \"hidden\" : \"text-[10px] font-medium uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\"}>Tools</div>\n <div className=\"flex items-center gap-2\">\n <div className={toolsCollapsed ? \"hidden\" : \"flex items-center gap-1\"}>\n <button\n type=\"button\"\n onClick={() => setZoom((z) => Math.max(ZOOM_MIN, Math.round((z - ZOOM_STEP) * 10) / 10))}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[10px] text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n title=\"Zoom out (Ctrl/Cmd+wheel)\"\n >\n -\n </button>\n <div className=\"min-w-[42px] text-center text-[10px] text-[color:var(--ck-text-tertiary)]\">{Math.round(zoom * 100)}%</div>\n <button\n type=\"button\"\n onClick={() => setZoom((z) => Math.min(ZOOM_MAX, Math.round((z + ZOOM_STEP) * 10) / 10))}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[10px] text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n title=\"Zoom in (Ctrl/Cmd+wheel)\"\n >\n +\n </button>\n </div>\n\n <button\n type=\"button\"\n onClick={() => setToolsCollapsed((v) => !v)}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[10px] text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n title={toolsCollapsed ? \"Expand\" : \"Collapse\"}\n >\n {toolsCollapsed ? \">\" : \"<\"}\n </button>\n </div>\n </div>\n {toolsCollapsed ? (\n <div className=\"mt-2 flex flex-col items-center gap-2\">\n {(\n [\n {\n key: \"select\",\n label: \"Select\",\n active: activeTool.kind === \"select\",\n onClick: () => {\n setActiveTool({ kind: \"select\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 4l7 16 2-7 7-2L5 4Z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"connect\",\n label: \"Connect\",\n active: activeTool.kind === \"connect\",\n onClick: () => {\n // Toggle connect tool.\n setActiveTool((t) => (t.kind === \"connect\" ? { kind: \"select\" } : { kind: \"connect\" }));\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M10 13a5 5 0 0 1 0-7l1.2-1.2a5 5 0 0 1 7 7L17 12\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n <path d=\"M14 11a5 5 0 0 1 0 7L12.8 19.2a5 5 0 1 1-7-7L7 12\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n ),\n },\n {\n key: \"llm\",\n label: \"LLM\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"llm\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"llm\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M12 2l1.5 6.5L20 10l-6.5 1.5L12 18l-1.5-6.5L4 10l6.5-1.5L12 2Z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"tool\",\n label: \"Tool\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"tool\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"tool\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M14.5 7.5l2 2-8.5 8.5H6v-2l8.5-8.5Z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinejoin=\"round\" />\n <path d=\"M12 6a4 4 0 0 0-5 5l3-3 2 2 3-3A4 4 0 0 0 12 6Z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"condition\",\n label: \"If\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"condition\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"condition\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M7 4v7a3 3 0 0 0 3 3h7\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n <path d=\"M17 10l3 3-3 3\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"delay\",\n label: \"Delay\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"delay\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"delay\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M12 7v5l3 2\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M21 12a9 9 0 1 1-9-9\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n ),\n },\n {\n key: \"approval\",\n label: \"Approval\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"human_approval\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"human_approval\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M20 6 9 17l-5-5\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n {\n key: \"end\",\n label: \"End\",\n active: activeTool.kind === \"add-node\" && activeTool.nodeType === \"end\",\n onClick: () => {\n setActiveTool({ kind: \"add-node\", nodeType: \"end\" });\n setConnectFromNodeId(\"\");\n },\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M7 7h10v10H7V7Z\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinejoin=\"round\" />\n </svg>\n ),\n },\n ] as const\n ).map((b) => (\n <button\n key={b.key}\n type=\"button\"\n onClick={b.onClick}\n className={\n b.active\n ? \"flex h-8 w-8 items-center justify-center rounded-[var(--ck-radius-sm)] bg-white/10 text-[color:var(--ck-text-primary)]\"\n : \"flex h-8 w-8 items-center justify-center rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n }\n title={b.label}\n aria-label={b.label}\n >\n {b.icon}\n </button>\n ))}\n </div>\n ) : (\n <div className=\"mt-2 grid grid-cols-2 gap-2\">\n <button\n type=\"button\"\n onClick={() => {\n setActiveTool({ kind: \"select\" });\n setConnectFromNodeId(\"\");\n }}\n className={\n activeTool.kind === \"select\"\n ? \"rounded-[var(--ck-radius-sm)] bg-white/10 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n : \"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n }\n >\n Select\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setActiveTool({ kind: \"connect\" });\n setConnectFromNodeId(\"\");\n }}\n className={\n activeTool.kind === \"connect\"\n ? \"rounded-[var(--ck-radius-sm)] bg-white/10 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n : \"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n }\n title=\"Click a node, then click another node to create an edge\"\n >\n Connect\n </button>\n\n {([\n { t: \"llm\", label: \"LLM\" },\n { t: \"tool\", label: \"Tool\" },\n { t: \"condition\", label: \"If\" },\n { t: \"delay\", label: \"Delay\" },\n { t: \"human_approval\", label: \"Approve\" },\n { t: \"end\", label: \"End\" },\n ] as Array<{ t: WorkflowFileV1[\"nodes\"][number][\"type\"]; label: string }>).map((x) => (\n <button\n key={x.t}\n type=\"button\"\n onClick={() => {\n setActiveTool({ kind: \"add-node\", nodeType: x.t });\n setConnectFromNodeId(\"\");\n }}\n className={\n activeTool.kind === \"add-node\" && activeTool.nodeType === x.t\n ? \"rounded-[var(--ck-radius-sm)] bg-white/10 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n : \"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n }\n title=\"Select tool, then click on the canvas to place\"\n >\n + {x.label}\n </button>\n ))}\n </div>\n )}\n\n {!toolsCollapsed && activeTool.kind === \"connect\" && connectFromNodeId ? (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-secondary)]\">Connecting from: <span className=\"font-mono\">{connectFromNodeId}</span></div>\n ) : null}\n {!toolsCollapsed && activeTool.kind === \"add-node\" ? (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-secondary)]\">Click on the canvas to place a <span className=\"font-mono\">{activeTool.nodeType}</span> node.</div>\n ) : null}\n\n <div className=\"mt-3 border-t border-white/10 pt-3\">\n <div className={toolsCollapsed ? \"hidden\" : \"flex items-center justify-between gap-2\"}>\n <div className=\"text-[10px] font-medium uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">Agents</div>\n <div className=\"text-[10px] text-[color:var(--ck-text-tertiary)]\">drag → node</div>\n </div>\n\n {toolsCollapsed ? (\n <button\n type=\"button\"\n onClick={() => setToolsCollapsed(false)}\n className=\"mt-2 flex h-8 w-8 items-center justify-center rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n title=\"Expand to see agents\"\n aria-label=\"Expand to see agents\"\n >\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M16 11a4 4 0 1 0-8 0\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n <path d=\"M4 20a8 8 0 0 1 16 0\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n </button>\n ) : (\n <>\n {agentsError ? <div className=\"mt-1 text-[11px] text-red-200\">{agentsError}</div> : null}\n <div className=\"mt-2 max-h-[140px] space-y-1 overflow-auto\">\n {agents.length ? (\n agents.map((a) => (\n <div\n key={a.id}\n draggable\n onDragStart={(e) => {\n e.dataTransfer.setData(\"text/plain\", a.id);\n e.dataTransfer.effectAllowed = \"copy\";\n }}\n className=\"cursor-grab rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n title={a.id}\n >\n {a.identityName ? a.identityName : a.id.replace(`${teamId}-`, \"\")}\n </div>\n ))\n ) : (\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">No team agents found.</div>\n )}\n </div>\n </>\n )}\n </div>\n </div>\n\n <div className=\"relative h-[1200px] w-[2200px]\" style={{ transform: `scale(${zoom})`, transformOrigin: \"0 0\" }}>\n <svg\n className=\"pointer-events-none absolute inset-0 -z-10\"\n width={2200}\n height={1200}\n style={{ overflow: \"visible\" }}\n >\n {(parsed.wf?.edges ?? []).map((e) => {\n const wf = parsed.wf;\n if (!wf) return null;\n const a = wf.nodes.find((n) => n.id === e.from);\n const b = wf.nodes.find((n) => n.id === e.to);\n if (!a || !b) return null;\n const ax = (typeof a.x === \"number\" ? a.x : 80) + 90;\n const ay = (typeof a.y === \"number\" ? a.y : 80) + 24;\n const bx = (typeof b.x === \"number\" ? b.x : 80) + 90;\n const by = (typeof b.y === \"number\" ? b.y : 80) + 24;\n return (\n <line\n key={e.id}\n x1={ax}\n y1={ay}\n x2={bx}\n y2={by}\n stroke=\"rgba(255,255,255,0.35)\"\n strokeWidth={3}\n />\n );\n })}\n </svg>\n\n {(parsed.wf?.nodes ?? []).map((n, idx) => {\n const x = typeof n.x === \"number\" ? n.x : 80 + idx * 220;\n const y = typeof n.y === \"number\" ? n.y : 80;\n const selected = selectedNodeId === n.id;\n return (\n <div\n key={n.id}\n role=\"button\"\n tabIndex={0}\n data-wf-node=\"1\"\n draggable={activeTool.kind === \"select\" || activeTool.kind === \"connect\"}\n onDragStart={(e) => {\n // allow agent pills to be dropped; do not start a browser drag ghost for nodes.\n if (activeTool.kind !== \"select\") return;\n e.dataTransfer.setData(\"text/plain\", \"\");\n }}\n onDragOver={(e) => {\n // Allow dropping agents.\n if (e.dataTransfer.types.includes(\"text/plain\")) e.preventDefault();\n }}\n onDrop={(e) => {\n const wf = parsed.wf;\n if (!wf) return;\n e.preventDefault();\n e.stopPropagation();\n const agentId = String(e.dataTransfer.getData(\"text/plain\") || \"\").trim();\n if (!agentId) return;\n\n const nextNodes = wf.nodes.map((node) => {\n if (node.id !== n.id) return node;\n const cfg = node.config && typeof node.config === \"object\" && !Array.isArray(node.config) ? node.config : {};\n return { ...node, config: { ...cfg, agentId } };\n });\n setWorkflow({ ...wf, nodes: nextNodes });\n setSelectedNodeId(n.id);\n }}\n onClick={(e) => {\n e.stopPropagation();\n const wf = parsed.wf;\n if (activeTool.kind === \"connect\") {\n if (!wf) return;\n if (!connectFromNodeId) {\n setConnectFromNodeId(n.id);\n setSelectedNodeId(n.id);\n return;\n }\n const from = connectFromNodeId;\n const to = n.id;\n setConnectFromNodeId(\"\");\n if (!from || !to || from === to) return;\n const exists = (wf.edges ?? []).some((e) => e.from === from && e.to === to);\n if (exists) return;\n const id = `e${Date.now()}`;\n const nextEdge: WorkflowFileV1[\"edges\"][number] = { id, from, to };\n setWorkflow({ ...wf, edges: [...(wf.edges ?? []), nextEdge] });\n // After creating an edge, return to Select tool.\n setActiveTool({ kind: \"select\" });\n return;\n }\n\n setSelectedNodeId(n.id);\n }}\n onPointerDown={(e) => {\n // Allow dragging nodes even in connect mode (connect is click-to-connect, not drag-to-connect).\n if (activeTool.kind === \"add-node\") return;\n if (e.button !== 0) return;\n const el = canvasRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n setSelectedNodeId(n.id);\n try {\n e.currentTarget.setPointerCapture(e.pointerId);\n } catch {\n // ignore\n }\n e.preventDefault();\n\n const pointerX = (e.clientX - rect.left + el.scrollLeft) / zoom;\n const pointerY = (e.clientY - rect.top + el.scrollTop) / zoom;\n setDragging({ nodeId: n.id, dx: pointerX - x, dy: pointerY - y });\n }}\n onPointerUp={(e) => {\n try {\n e.currentTarget.releasePointerCapture(e.pointerId);\n } catch {\n // ignore\n }\n setDragging(null);\n }}\n onPointerMove={(e) => {\n if (!dragging) return;\n if (dragging.nodeId !== n.id) return;\n const wf = parsed.wf;\n if (!wf) return;\n const el = canvasRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const pointerX = (e.clientX - rect.left + el.scrollLeft) / zoom;\n const pointerY = (e.clientY - rect.top + el.scrollTop) / zoom;\n const nextX = pointerX - dragging.dx;\n const nextY = pointerY - dragging.dy;\n const nextNodes = wf.nodes.map((node) => (node.id === n.id ? { ...node, x: nextX, y: nextY } : node));\n const next: WorkflowFileV1 = { ...wf, nodes: nextNodes };\n setStatus({ kind: \"ready\", jsonText: JSON.stringify(next, null, 2) + \"\\n\" });\n }}\n className={\n selected\n ? \"absolute z-10 cursor-grab rounded-[var(--ck-radius-sm)] border border-white/25 bg-white/10 px-3 py-2 text-xs text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)]\"\n : \"absolute z-10 cursor-grab rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-xs text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n }\n style={{ left: x, top: y, width: 180 }}\n >\n <div className=\"font-medium text-[color:var(--ck-text-primary)]\">{n.name || n.id}</div>\n <div className=\"mt-0.5 text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">{n.type}</div>\n {(() => {\n const cfg = n.config && typeof n.config === \"object\" && !Array.isArray(n.config) ? (n.config as Record<string, unknown>) : null;\n const agentId = cfg ? String(cfg.agentId ?? \"\").trim() : \"\";\n if (!agentId) return null;\n const short = agentId.replace(`${teamId}-`, \"\");\n return <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-secondary)]\">Agent: {short}</div>;\n })()}\n </div>\n );\n })}\n\n {/* Inline in-canvas node inspector (requirement #6) */}\n {(() => {\n const wf = parsed.wf;\n if (!wf) return null;\n if (!selectedNodeId) return null;\n const node = wf.nodes.find((n) => n.id === selectedNodeId);\n if (!node) return null;\n\n const x = typeof node.x === \"number\" ? node.x : 80;\n const y = typeof node.y === \"number\" ? node.y : 80;\n const cfg = node.config && typeof node.config === \"object\" && !Array.isArray(node.config) ? (node.config as Record<string, unknown>) : {};\n const agentId = String(cfg.agentId ?? \"\").trim();\n\n return (\n <div\n className=\"absolute z-10 w-[320px] rounded-[var(--ck-radius-sm)] border border-white/15 bg-black/60 p-3 shadow-[var(--ck-shadow-1)] backdrop-blur\"\n style={{ left: x + 200, top: y }}\n >\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-primary)]\">{node.name || node.id}</div>\n <button\n type=\"button\"\n onClick={() => setSelectedNodeId(\"\")}\n className=\"text-[10px] text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n Close\n </button>\n </div>\n\n <div className=\"mt-2 space-y-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">name</div>\n <input\n value={String(node.name ?? \"\")}\n onChange={(e) => {\n const nextName = e.target.value;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, name: nextName } : n)) });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"Optional\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">type</div>\n <select\n value={node.type}\n onChange={(e) => {\n const nextType = e.target.value as WorkflowFileV1[\"nodes\"][number][\"type\"];\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, type: nextType } : n)) });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"start\">start</option>\n <option value=\"end\">end</option>\n <option value=\"llm\">llm</option>\n <option value=\"tool\">tool</option>\n <option value=\"condition\">condition</option>\n <option value=\"delay\">delay</option>\n <option value=\"human_approval\">human_approval</option>\n </select>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">agentId</div>\n <input\n value={agentId}\n onChange={(e) => {\n const nextAgentId = String(e.target.value || \"\").trim();\n const nextCfg = { ...cfg, ...(nextAgentId ? { agentId: nextAgentId } : {}) };\n if (!nextAgentId) delete (nextCfg as Record<string, unknown>).agentId;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/30 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"(drag an agent onto the node or type)\"\n />\n </label>\n\n {node.type === \"human_approval\" ? (\n <div className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">approval config</div>\n\n <div className=\"mt-2 space-y-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">provider</div>\n <input\n value={String((cfg as Record<string, unknown>).provider ?? \"\")}\n onChange={(e) => {\n const v = String(e.target.value || \"\").trim();\n const nextCfg = { ...cfg, ...(v ? { provider: v } : {}) };\n if (!v) delete (nextCfg as Record<string, unknown>).provider;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"telegram\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">target</div>\n <input\n value={String((cfg as Record<string, unknown>).target ?? \"\")}\n onChange={(e) => {\n const v = String(e.target.value || \"\").trim();\n const nextCfg = { ...cfg, ...(v ? { target: v } : {}) };\n if (!v) delete (nextCfg as Record<string, unknown>).target;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"(e.g. Telegram chat id)\"\n />\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">Overrides workflow-level default when set.</div>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">messageTemplate (optional)</div>\n <textarea\n value={String((cfg as Record<string, unknown>).messageTemplate ?? \"\")}\n onChange={(e) => {\n const v = String(e.target.value || \"\");\n const nextCfg = { ...cfg, ...(v.trim() ? { messageTemplate: v } : {}) };\n if (!v.trim()) delete (nextCfg as Record<string, unknown>).messageTemplate;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n }}\n className=\"mt-1 h-[70px] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2 font-mono text-[10px] text-[color:var(--ck-text-primary)]\"\n placeholder=\"Approval needed for {{workflowName}} (run {{runId}})\"\n spellCheck={false}\n />\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">\n Vars: {\"{{workflowName}}\"}, {\"{{workflowId}}\"}, {\"{{runId}}\"}, {\"{{nodeId}}\"}\n </div>\n </label>\n </div>\n </div>\n ) : null}\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">config (json)</div>\n <textarea\n value={JSON.stringify(cfg, null, 2)}\n onChange={(e) => {\n try {\n const nextCfg = JSON.parse(e.target.value) as Record<string, unknown>;\n if (!nextCfg || typeof nextCfg !== \"object\" || Array.isArray(nextCfg)) return;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, config: nextCfg } : n)) });\n } catch {\n // ignore invalid JSON while typing\n }\n }}\n className=\"mt-1 h-[140px] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/30 p-2 font-mono text-[10px] text-[color:var(--ck-text-primary)]\"\n spellCheck={false}\n />\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">(Edits apply when JSON is valid.)</div>\n </label>\n </div>\n </div>\n );\n })()}\n </div>\n </div>\n </div>\n )}\n\n <div className=\"w-[380px] shrink-0 overflow-auto p-3 text-sm\">\n <div className=\"space-y-3\">\n {parsed.wf ? (\n (() => {\n const wf = parsed.wf;\n const tz = String(wf.timezone ?? \"\").trim() || \"UTC\";\n const triggers = wf.triggers ?? [];\n\n const meta = wf.meta && typeof wf.meta === \"object\" && !Array.isArray(wf.meta) ? (wf.meta as Record<string, unknown>) : {};\n const approvalBindingId = String(meta.approvalBindingId ?? \"\").trim();\n const approvalProvider = String(meta.approvalProvider ?? \"telegram\").trim() || \"telegram\";\n const approvalTarget = String(meta.approvalTarget ?? \"\").trim();\n\n // Cron schedule suggestions.\n // Note: dev-team automation defaults should avoid the 02:00-07:00 America/New_York blackout window.\n // We keep presets in \"safe\" hours by default.\n const presets = [\n { label: \"(no preset)\", expr: \"\" },\n { label: \"Weekdays 09:00 local\", expr: \"0 9 * * 1-5\" },\n { label: \"Mon/Wed/Fri 09:00 local\", expr: \"0 9 * * 1,3,5\" },\n { label: \"Daily 08:00 local\", expr: \"0 8 * * *\" },\n { label: \"Daily 12:00 local\", expr: \"0 12 * * *\" },\n { label: \"Mon 09:30 local\", expr: \"30 9 * * 1\" },\n ];\n\n return (\n <div className=\"space-y-3\">\n <details open className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Workflow</summary>\n <div className=\"px-3 pb-3\">\n <label className=\"block\">\n <div className=\"text-[11px] font-medium text-[color:var(--ck-text-tertiary)]\">Timezone</div>\n <input\n value={tz}\n onChange={(e) => {\n const nextTz = String(e.target.value || \"\").trim() || \"UTC\";\n setWorkflow({ ...wf, timezone: nextTz });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"America/New_York\"\n />\n </label>\n </div>\n </details>\n\n <details open className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Approval Channel</summary>\n <div className=\"px-3 pb-3 space-y-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">binding (recommended)</div>\n <select\n value={approvalBindingId}\n onChange={(e) => {\n const nextId = String(e.target.value || \"\").trim();\n const selected = approvalBindings.find((b) => b.id === nextId);\n\n // Store a stable-ish reference id in the workflow so it's portable.\n // We also keep provider/target in sync for backward compatibility.\n if (selected) {\n setWorkflow({\n ...wf,\n meta: {\n ...meta,\n approvalBindingId: selected.id,\n approvalProvider: selected.channel,\n approvalTarget: selected.target,\n },\n nodes: wf.nodes.map((n) =>\n n.type === \"human_approval\"\n ? {\n ...n,\n config: {\n ...((n.config && typeof n.config === \"object\" && !Array.isArray(n.config)\n ? n.config\n : {}) as Record<string, unknown>),\n approvalBindingId: selected.id,\n provider: selected.channel,\n target: selected.target,\n },\n }\n : n\n ),\n });\n } else {\n setWorkflow({\n ...wf,\n meta: { ...meta, approvalBindingId: \"\" },\n nodes: wf.nodes.map((n) =>\n n.type === \"human_approval\"\n ? {\n ...n,\n config: {\n ...((n.config && typeof n.config === \"object\" && !Array.isArray(n.config)\n ? n.config\n : {}) as Record<string, unknown>),\n approvalBindingId: \"\",\n },\n }\n : n\n ),\n });\n }\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">(manual)</option>\n {approvalBindings.map((b) => (\n <option key={b.id} value={b.id}>\n {b.label}\n </option>\n ))}\n </select>\n {approvalBindingsNeedsKitchenUpdate ? (\n <div className=\"mt-1 text-[10px] text-yellow-200\">\n Kitchen looks out of date. Run <code className=\"font-mono\">openclaw plugins update</code> then\n <code className=\"ml-1 font-mono\">openclaw gateway restart</code>.\n </div>\n ) : null}\n {approvalBindingsError ? (\n <div className=\"mt-1 text-[10px] text-red-200\">Failed to load bindings: {approvalBindingsError}</div>\n ) : null}\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">\n Uses your existing OpenClaw bindings (recommended). Manual provider/target is an advanced override.\n </div>\n </label>\n\n <details className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/10\">\n <summary className=\"cursor-pointer list-none px-2 py-1 text-[11px] font-medium text-[color:var(--ck-text-secondary)]\">Advanced: manual override</summary>\n <div className=\"px-2 pb-2 pt-1 space-y-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">provider</div>\n <input\n value={approvalProvider}\n onChange={(e) => {\n const nextProvider = String(e.target.value || \"\").trim() || \"telegram\";\n setWorkflow({\n ...wf,\n meta: { ...meta, approvalBindingId: \"\", approvalProvider: nextProvider },\n nodes: wf.nodes.map((n) =>\n n.type === \"human_approval\"\n ? {\n ...n,\n config: {\n ...((n.config && typeof n.config === \"object\" && !Array.isArray(n.config)\n ? n.config\n : {}) as Record<string, unknown>),\n approvalBindingId: \"\",\n provider: nextProvider,\n },\n }\n : n\n ),\n });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"telegram\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">target</div>\n <input\n value={approvalTarget}\n onChange={(e) => {\n const nextTarget = String(e.target.value || \"\").trim();\n setWorkflow({\n ...wf,\n meta: { ...meta, approvalBindingId: \"\", approvalTarget: nextTarget },\n nodes: wf.nodes.map((n) =>\n n.type === \"human_approval\"\n ? {\n ...n,\n config: {\n ...((n.config && typeof n.config === \"object\" && !Array.isArray(n.config)\n ? n.config\n : {}) as Record<string, unknown>),\n approvalBindingId: \"\",\n target: nextTarget,\n },\n }\n : n\n ),\n });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"(e.g. Telegram chat id)\"\n />\n </label>\n </div>\n </details>\n </div>\n </details>\n\n <details open className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Triggers</summary>\n <div className=\"px-3 pb-3\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">triggers</div>\n <button\n type=\"button\"\n onClick={() => {\n const id = `t${Date.now()}`;\n setWorkflow({\n ...wf,\n triggers: [\n ...triggers,\n { kind: \"cron\", id, name: \"New trigger\", enabled: true, expr: \"0 9 * * 1-5\", tz },\n ],\n });\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[10px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n + Add\n </button>\n </div>\n\n <div className=\"mt-2 space-y-2\">\n {triggers.length ? (\n triggers.map((t, i) => {\n const kind = (t as { kind?: unknown }).kind;\n const isCron = kind === \"cron\";\n const id = String((t as { id?: unknown }).id ?? \"\");\n const name = String((t as { name?: unknown }).name ?? \"\");\n const enabled = Boolean((t as { enabled?: unknown }).enabled);\n const expr = String((t as { expr?: unknown }).expr ?? \"\");\n const trigTz = String((t as { tz?: unknown }).tz ?? tz);\n const cronFields = expr.trim().split(/\\s+/).filter(Boolean);\n const cronLooksValid = !expr.trim() || cronFields.length === 5;\n\n return (\n <div key={`${id}-${i}`} className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-xs text-[color:var(--ck-text-primary)]\">{name || id || `trigger-${i + 1}`}</div>\n <button\n type=\"button\"\n onClick={() => setWorkflow({ ...wf, triggers: triggers.filter((_, idx) => idx !== i) })}\n className=\"text-[10px] text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n Remove\n </button>\n </div>\n\n {!isCron ? (\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">Unsupported trigger kind: {String(kind)}</div>\n ) : null}\n\n <div className=\"mt-2 grid grid-cols-1 gap-2\">\n <label className=\"flex items-center gap-2 text-xs text-[color:var(--ck-text-secondary)]\">\n <input\n type=\"checkbox\"\n checked={enabled}\n onChange={(e) => {\n const nextEnabled = e.target.checked;\n setWorkflow({\n ...wf,\n triggers: triggers.map((x, idx) => (idx === i && x.kind === \"cron\" ? { ...x, enabled: nextEnabled } : x)),\n });\n }}\n />\n Enabled\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">name</div>\n <input\n value={name}\n onChange={(e) => {\n const nextName = e.target.value;\n setWorkflow({\n ...wf,\n triggers: triggers.map((x, idx) => (idx === i && x.kind === \"cron\" ? { ...x, name: nextName } : x)),\n });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"Content cadence\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">schedule (cron)</div>\n <input\n value={expr}\n onChange={(e) => {\n const nextExpr = e.target.value;\n setWorkflow({\n ...wf,\n triggers: triggers.map((x, idx) => (idx === i && x.kind === \"cron\" ? { ...x, expr: nextExpr } : x)),\n });\n }}\n className={\n cronLooksValid\n ? \"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 font-mono text-[11px] text-[color:var(--ck-text-primary)]\"\n : \"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-red-400/50 bg-black/25 px-2 py-1 font-mono text-[11px] text-[color:var(--ck-text-primary)]\"\n }\n placeholder=\"0 9 * * 1,3,5\"\n />\n {!cronLooksValid ? (\n <div className=\"mt-1 text-[10px] text-red-200\">\n Cron should be 5 fields (min hour dom month dow). You entered {cronFields.length}.\n </div>\n ) : null}\n <div className=\"mt-1 grid grid-cols-1 gap-1\">\n <select\n value={presets.some((p) => p.expr === expr) ? expr : \"\"}\n onChange={(e) => {\n const nextExpr = e.target.value;\n setWorkflow({\n ...wf,\n triggers: triggers.map((x, idx) => (idx === i && x.kind === \"cron\" ? { ...x, expr: nextExpr } : x)),\n });\n }}\n className=\"w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-[11px] text-[color:var(--ck-text-secondary)]\"\n >\n {presets.map((p) => (\n <option key={p.label} value={p.expr}>\n {p.label}\n </option>\n ))}\n </select>\n <div className=\"text-[10px] text-[color:var(--ck-text-tertiary)]\">Presets set the cron; edit freely for advanced schedules.</div>\n </div>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">timezone override</div>\n <input\n value={trigTz}\n onChange={(e) => {\n const nextTz = String(e.target.value || \"\").trim() || tz;\n setWorkflow({\n ...wf,\n triggers: triggers.map((x, idx) => (idx === i && x.kind === \"cron\" ? { ...x, tz: nextTz } : x)),\n });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder={tz}\n />\n </label>\n </div>\n </div>\n );\n })\n ) : (\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">No triggers yet.</div>\n )}\n </div>\n </div>\n </details>\n\n <details open className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Runs</summary>\n <div className=\"px-3 pb-3\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-3\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Runs (history)</div>\n <Link\n href={`/teams/${encodeURIComponent(teamId)}/runs`}\n className=\"text-[10px] font-medium text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-secondary)] hover:underline\"\n >\n View all →\n </Link>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n disabled={saving}\n onClick={async () => {\n const wfId = String(wf.id ?? \"\").trim();\n if (!wfId) return;\n setWorkflowRunsError(\"\");\n setWorkflowRunsLoading(true);\n try {\n const res = await fetch(\"/api/teams/workflow-runs\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n // Enqueue a canonical file-first run via the CLI (Kitchen should not author run artifacts).\n body: JSON.stringify({ teamId, workflowId: wfId, mode: \"enqueue\" }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to enqueue run\");\n\n const listRes = await fetch(\n `/api/teams/workflow-runs?teamId=${encodeURIComponent(teamId)}&workflowId=${encodeURIComponent(wfId)}`,\n { cache: \"no-store\" }\n );\n const listJson = await listRes.json();\n if (!listRes.ok || !listJson.ok) throw new Error(listJson.error || \"Failed to refresh runs\");\n const files = Array.isArray(listJson.files) ? listJson.files : [];\n const list = files.map((f: unknown) => String(f ?? \"\").trim()).filter((f: string) => Boolean(f));\n setWorkflowRuns(list);\n } catch (e: unknown) {\n setWorkflowRunsError(e instanceof Error ? e.message : String(e));\n } finally {\n setWorkflowRunsLoading(false);\n }\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[10px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n + Queue run\n </button>\n <button\n type=\"button\"\n disabled={saving || cronLoading || !runPreflight.ok}\n onClick={async () => {\n const wfId = String(wf.id ?? \"\").trim();\n if (!wfId) return;\n\n // Preflight: all nodes must be assigned.\n if (runPreflight.missingAgentOnNodeIds.length) {\n setWorkflowRunsError(\"All nodes must be assigned to an agent.\");\n return;\n }\n\n // Cron reconciliation: keep the system clean by disabling orphaned worker crons,\n // and install/enable missing worker crons before enqueue.\n if (runPreflight.agentIdsMissingCron.length) {\n setInstallCronBusy(true);\n setInstallCronError(\"\");\n try {\n const reconcileRes = await fetch(\"/api/cron/worker\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ action: \"reconcile\", teamId }),\n });\n const reconcileJson = (await reconcileRes.json()) as { ok?: boolean; error?: string };\n if (!reconcileRes.ok || reconcileJson.ok === false) {\n throw new Error(reconcileJson.error || \"Failed to reconcile worker crons\");\n }\n const map = await refreshCronMap();\n const stillMissing = runPreflight.requiredAgentIds.filter((id) => !map[id]);\n if (stillMissing.length) {\n setWorkflowRunsError(`Cron not set up for: ${stillMissing.join(\", \")}`);\n return;\n }\n } catch (e: unknown) {\n setWorkflowRunsError(e instanceof Error ? e.message : String(e));\n return;\n } finally {\n setInstallCronBusy(false);\n }\n }\n\n setWorkflowRunsError(\"\");\n setWorkflowRunsLoading(true);\n try {\n const res = await fetch(\"/api/teams/workflow-runs\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, workflowId: wfId, mode: \"run_now\" }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to create run\");\n\n const listRes = await fetch(\n `/api/teams/workflow-runs?teamId=${encodeURIComponent(teamId)}&workflowId=${encodeURIComponent(wfId)}`,\n { cache: \"no-store\" }\n );\n const listJson = await listRes.json();\n if (!listRes.ok || !listJson.ok) throw new Error(listJson.error || \"Failed to refresh runs\");\n const files = Array.isArray(listJson.files) ? listJson.files : [];\n const list = files.map((f: unknown) => String(f ?? \"\").trim()).filter((f: string) => Boolean(f));\n setWorkflowRuns(list);\n } catch (e: unknown) {\n setWorkflowRunsError(e instanceof Error ? e.message : String(e));\n } finally {\n setWorkflowRunsLoading(false);\n }\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-emerald-400/30 bg-emerald-500/10 px-2 py-1 text-[10px] font-medium text-emerald-50 hover:bg-emerald-500/15 disabled:opacity-50\"\n title=\"Enqueue a run for the workflow runner (Kitchen does not execute nodes)\"\n >\n + Run now\n </button>\n {cronError ? (\n <div className=\"ml-2 text-[10px] text-amber-100/90\" title={cronError}>\n Cron check unavailable\n </div>\n ) : null}\n </div>\n </div>\n\n {runPreflight.missingAgentOnNodeIds.length ? (\n <div className=\"mt-2 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-2 text-xs text-red-100\">\n All nodes must be assigned to an agent. Missing agentId on: {runPreflight.missingAgentOnNodeIds.join(\", \")}\n </div>\n ) : runPreflight.agentIdsMissingCron.length ? (\n <div className=\"mt-2 rounded-[var(--ck-radius-sm)] border border-amber-400/30 bg-amber-500/10 p-2 text-xs text-amber-50\">\n <div>Cron not set up for: {runPreflight.agentIdsMissingCron.join(\", \")}</div>\n <div className=\"mt-2 flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => {\n setInstallCronError(\"\");\n setInstallCronOpen(true);\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-amber-300/30 bg-amber-500/10 px-2 py-1 text-[10px] font-medium text-amber-50 hover:bg-amber-500/15\"\n >\n Install worker cron(s)\n </button>\n <button\n type=\"button\"\n onClick={() => void refreshCronMap()}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[10px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Re-check\n </button>\n </div>\n </div>\n ) : null}\n\n <ConfirmationModal\n open={installCronOpen}\n title=\"Install worker cron jobs?\"\n busy={installCronBusy}\n error={installCronError || undefined}\n confirmLabel=\"Install\"\n onClose={() => {\n if (installCronBusy) return;\n setInstallCronOpen(false);\n }}\n onConfirm={async () => {\n setInstallCronBusy(true);\n setInstallCronError(\"\");\n try {\n const res = await fetch(\"/api/cron/worker\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ action: \"reconcile\", teamId }),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || json.ok === false) throw new Error(json.error || \"Failed to install worker crons\");\n\n await refreshCronMap();\n setInstallCronOpen(false);\n } catch (e: unknown) {\n setInstallCronError(e instanceof Error ? e.message : String(e));\n } finally {\n setInstallCronBusy(false);\n }\n }}\n >\n <div className=\"text-sm text-[color:var(--ck-text-secondary)]\">\n Kitchen will install (or enable) worker cron jobs for the following agents so this workflow can drain:\n <div className=\"mt-2 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2 font-mono text-[11px] text-[color:var(--ck-text-primary)]\">\n {runPreflight.agentIdsMissingCron.join(\", \")}\n </div>\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Cron cadence: 1 minute. The worker runs: <span className=\"font-mono\">openclaw recipes workflows worker-tick</span>.\n </div>\n </div>\n </ConfirmationModal>\n\n {workflowRunsError ? (\n <div className=\"mt-2 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-2 text-xs text-red-100\">\n {workflowRunsError}\n </div>\n ) : null}\n\n <div className=\"mt-2 space-y-1\">\n {workflowRunsLoading ? (\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">Loading runs…</div>\n ) : workflowRuns.length ? (\n workflowRuns.slice(0, 8).map((f) => {\n const wfId = String(wf.id ?? \"\").trim();\n const runId = String(f).replace(/\\.run\\.json$/i, \"\");\n const selected = selectedWorkflowRunId === runId;\n const href = wfId\n ? `/teams/${encodeURIComponent(teamId)}/runs/${encodeURIComponent(wfId)}/${encodeURIComponent(runId)}`\n : \"#\";\n\n return (\n <Link\n key={f}\n href={href}\n onClick={() => setSelectedWorkflowRunId(runId)}\n className={\n selected\n ? \"block w-full rounded-[var(--ck-radius-sm)] bg-white/10 px-2 py-1 text-left text-[11px] font-mono text-[color:var(--ck-text-primary)]\"\n : \"block w-full rounded-[var(--ck-radius-sm)] px-2 py-1 text-left text-[11px] font-mono text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n title=\"Open run detail\"\n >\n {runId}\n </Link>\n );\n })\n ) : (\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">No runs yet.</div>\n )}\n </div>\n\n <details open className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/10\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Nodes</summary>\n <div className=\"px-3 pb-3\">\n\n <div className=\"mt-2 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2\">\n <div className=\"grid grid-cols-1 gap-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">id</div>\n <input\n value={newNodeId}\n onChange={(e) => setNewNodeId(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"e.g. draft_assets\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">name (optional)</div>\n <input\n value={newNodeName}\n onChange={(e) => setNewNodeName(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"Human-friendly label\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">type</div>\n <select\n value={newNodeType}\n onChange={(e) => setNewNodeType(e.target.value as WorkflowFileV1[\"nodes\"][number][\"type\"])}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"start\">start</option>\n <option value=\"end\">end</option>\n <option value=\"llm\">llm</option>\n <option value=\"tool\">tool</option>\n <option value=\"condition\">condition</option>\n <option value=\"delay\">delay</option>\n <option value=\"human_approval\">human_approval</option>\n </select>\n </label>\n\n <button\n type=\"button\"\n onClick={() => {\n const rawId = String(newNodeId || \"\").trim();\n const id = rawId.replace(/[^a-z0-9_\\-]/gi, \"_\");\n if (!id) return;\n if (wf.nodes.some((n) => n.id === id)) return;\n\n const maxX = wf.nodes.reduce((acc, n) => (typeof n.x === \"number\" ? Math.max(acc, n.x) : acc), 80);\n const nextNode = {\n id,\n type: newNodeType,\n name: String(newNodeName || \"\").trim() || id,\n x: maxX + 220,\n y: 80,\n } as WorkflowFileV1[\"nodes\"][number];\n\n setWorkflow({ ...wf, nodes: [...wf.nodes, nextNode] });\n setSelectedNodeId(id);\n setNewNodeId(\"\");\n setNewNodeName(\"\");\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[11px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n + Add node\n </button>\n </div>\n </div>\n\n <div className=\"mt-2 space-y-1\">\n {wf.nodes.map((n) => {\n const selected = selectedNodeId === n.id;\n return (\n <button\n key={n.id}\n type=\"button\"\n onClick={() => setSelectedNodeId(n.id)}\n className={\n selected\n ? \"w-full rounded-[var(--ck-radius-sm)] bg-white/10 px-2 py-1 text-left text-[11px] text-[color:var(--ck-text-primary)]\"\n : \"w-full rounded-[var(--ck-radius-sm)] px-2 py-1 text-left text-[11px] text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n >\n <span className=\"font-mono\">{n.id}</span>\n <span className=\"ml-2 text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">{n.type}</span>\n </button>\n );\n })}\n </div>\n </div>\n </details>\n\n <details open className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/10\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Edges</summary>\n <div className=\"px-3 pb-3\">\n\n <div className=\"mt-2 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2\">\n <div className=\"grid grid-cols-1 gap-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">from</div>\n <select\n value={newEdgeFrom}\n onChange={(e) => setNewEdgeFrom(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">(select)</option>\n {wf.nodes.map((n) => (\n <option key={n.id} value={n.id}>\n {n.id}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">to</div>\n <select\n value={newEdgeTo}\n onChange={(e) => setNewEdgeTo(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">(select)</option>\n {wf.nodes.map((n) => (\n <option key={n.id} value={n.id}>\n {n.id}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">label (optional)</div>\n <input\n value={newEdgeLabel}\n onChange={(e) => setNewEdgeLabel(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"e.g. approve\"\n />\n </label>\n\n <button\n type=\"button\"\n onClick={() => {\n const from = String(newEdgeFrom || \"\").trim();\n const to = String(newEdgeTo || \"\").trim();\n if (!from || !to) return;\n if (from === to) return;\n const id = `e${Date.now()}`;\n const nextEdge: WorkflowFileV1[\"edges\"][number] = {\n id,\n from,\n to,\n ...(String(newEdgeLabel || \"\").trim() ? { label: String(newEdgeLabel).trim() } : {}),\n };\n setWorkflow({ ...wf, edges: [...(wf.edges ?? []), nextEdge] });\n setNewEdgeLabel(\"\");\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[11px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n + Add edge\n </button>\n </div>\n </div>\n\n <div className=\"mt-2 space-y-2\">\n {(wf.edges ?? []).length ? (\n (wf.edges ?? []).map((e) => (\n <div key={e.id} className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-[11px] text-[color:var(--ck-text-secondary)]\">\n <span className=\"font-mono\">{e.from}</span> → <span className=\"font-mono\">{e.to}</span>\n {e.label ? <span className=\"ml-2 text-[10px] text-[color:var(--ck-text-tertiary)]\">({e.label})</span> : null}\n </div>\n <button\n type=\"button\"\n onClick={() => setWorkflow({ ...wf, edges: (wf.edges ?? []).filter((x) => x.id !== e.id) })}\n className=\"text-[10px] text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n Remove\n </button>\n </div>\n </div>\n ))\n ) : (\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">No edges yet.</div>\n )}\n </div>\n </div>\n </details>\n\n <details open className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/10\">\n <summary className=\"cursor-pointer list-none px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">Node inspector</summary>\n <div className=\"px-3 pb-3\">\n <div className=\"flex items-center justify-between gap-2\">\n {selectedNodeId ? (\n <button\n type=\"button\"\n onClick={() => {\n const nodeId = selectedNodeId;\n const nextNodes = wf.nodes.filter((n) => n.id !== nodeId);\n const nextEdges = (wf.edges ?? []).filter((e) => e.from !== nodeId && e.to !== nodeId);\n setWorkflow({ ...wf, nodes: nextNodes, edges: nextEdges });\n setSelectedNodeId(\"\");\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[10px] font-medium text-red-100 hover:bg-white/10\"\n >\n Delete node\n </button>\n ) : null}\n </div>\n\n {selectedNodeId ? (\n (() => {\n const node = wf.nodes.find((n) => n.id === selectedNodeId);\n if (!node) return <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">No node selected.</div>;\n\n return (\n <div className=\"mt-3 space-y-3\">\n <div>\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">id</div>\n <div className=\"mt-1 rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\">\n {node.id}\n </div>\n </div>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">name</div>\n <input\n value={String(node.name ?? \"\")}\n onChange={(e) => {\n const nextName = e.target.value;\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, name: nextName } : n)) });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"Optional\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">type</div>\n <select\n value={node.type}\n onChange={(e) => {\n const nextType = e.target.value as WorkflowFileV1[\"nodes\"][number][\"type\"];\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, type: nextType } : n)) });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"start\">start</option>\n <option value=\"end\">end</option>\n <option value=\"llm\">llm</option>\n <option value=\"tool\">tool</option>\n <option value=\"condition\">condition</option>\n <option value=\"delay\">delay</option>\n <option value=\"human_approval\">human_approval</option>\n </select>\n </label>\n\n <div className=\"grid grid-cols-2 gap-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">x</div>\n <input\n type=\"number\"\n value={typeof node.x === \"number\" ? node.x : 0}\n onChange={(e) => {\n const nextX = Number(e.target.value);\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, x: nextX } : n)) });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n />\n </label>\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">y</div>\n <input\n type=\"number\"\n value={typeof node.y === \"number\" ? node.y : 0}\n onChange={(e) => {\n const nextY = Number(e.target.value);\n setWorkflow({ ...wf, nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, y: nextY } : n)) });\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n />\n </label>\n </div>\n\n <div>\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">config</div>\n <pre className=\"mt-1 max-h-[200px] overflow-auto rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2 text-[10px] text-[color:var(--ck-text-secondary)]\">\n {JSON.stringify(node.config ?? {}, null, 2)}\n </pre>\n </div>\n </div>\n );\n })()\n ) : (\n <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">Select a node.</div>\n )}\n </div>\n </details>\n </div>\n </details>\n </div>\n );\n })()\n ) : null}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import type { WorkflowEdgeV1, WorkflowFileV1, WorkflowNodeV1, WorkflowTriggerCronV1 } from \"@/lib/workflows/types\";\n\nexport type WorkflowValidationResult = {\n errors: string[];\n warnings: string[];\n};\n\nfunction isFiveFieldCron(expr: string) {\n const parts = String(expr || \"\")\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n return parts.length === 5;\n}\n\nfunction uniqCount(values: string[]) {\n const set = new Set<string>();\n for (const v of values) set.add(v);\n return set.size;\n}\n\nexport function validateWorkflowFileV1(wf: WorkflowFileV1): WorkflowValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (wf.schema !== \"clawkitchen.workflow.v1\") errors.push(`schema must be clawkitchen.workflow.v1 (got ${String(wf.schema)})`);\n if (!String(wf.id || \"\").trim()) errors.push(\"id is required\");\n if (!String(wf.name || \"\").trim()) errors.push(\"name is required\");\n\n const nodes: WorkflowNodeV1[] = Array.isArray(wf.nodes) ? wf.nodes : [];\n const edges: WorkflowEdgeV1[] = Array.isArray(wf.edges) ? wf.edges : [];\n const triggers: WorkflowTriggerCronV1[] = Array.isArray(wf.triggers) ? wf.triggers : [];\n\n const nodeIds = nodes.map((n) => String(n?.id ?? \"\").trim()).filter(Boolean);\n if (nodeIds.length !== nodes.length) errors.push(\"all nodes must have a non-empty id\");\n if (uniqCount(nodeIds) !== nodeIds.length) errors.push(\"node ids must be unique\");\n\n const edgeIds = edges.map((e) => String(e?.id ?? \"\").trim()).filter(Boolean);\n if (edgeIds.length !== edges.length) errors.push(\"all edges must have a non-empty id\");\n if (uniqCount(edgeIds) !== edgeIds.length) errors.push(\"edge ids must be unique\");\n\n const nodeIdSet = new Set(nodeIds);\n for (const e of edges) {\n const from = String(e?.from ?? \"\").trim();\n const to = String(e?.to ?? \"\").trim();\n if (!from || !to) {\n errors.push(`edge ${String(e?.id ?? \"(missing id)\")} must have from/to`);\n continue;\n }\n if (!nodeIdSet.has(from)) errors.push(`edge ${String(e.id)} references missing from node: ${from}`);\n if (!nodeIdSet.has(to)) errors.push(`edge ${String(e.id)} references missing to node: ${to}`);\n }\n\n const starts = nodes.filter((n) => n.type === \"start\");\n const ends = nodes.filter((n) => n.type === \"end\");\n if (!starts.length) warnings.push(\"no start node found\");\n if (starts.length > 1) warnings.push(\"multiple start nodes found (MVP supports this, but execution semantics may be ambiguous)\");\n if (!ends.length) warnings.push(\"no end node found\");\n\n for (const t of triggers) {\n if (t.kind === \"cron\") {\n if (!String(t.id || \"\").trim()) errors.push(\"cron trigger missing id\");\n if (!String(t.expr || \"\").trim()) errors.push(`cron trigger ${String(t.id || \"(missing id)\")} missing expr`);\n else if (!isFiveFieldCron(t.expr)) warnings.push(`cron trigger ${String(t.id)} expr is not 5-field: ${String(t.expr)}`);\n const tz = t.tz ? String(t.tz).trim() : \"\";\n // NOTE: We commonly use \"UTC\" as a default, and it is widely accepted even though it isn't in the\n // classic Region/City IANA format. Treat it as valid to avoid noisy validation warnings.\n if (tz && tz !== \"UTC\" && !tz.includes(\"/\")) {\n warnings.push(`cron trigger ${String(t.id)} tz doesn't look like an IANA timezone: ${String(t.tz)}`);\n }\n }\n }\n\n // Human approval node sanity checks (MVP)\n const meta = wf.meta && typeof wf.meta === \"object\" && !Array.isArray(wf.meta) ? (wf.meta as Record<string, unknown>) : {};\n const defaultTarget = String(meta.approvalTarget ?? \"\").trim();\n for (const n of nodes) {\n if (n.type !== \"human_approval\") continue;\n const cfg = n.config && typeof n.config === \"object\" && !Array.isArray(n.config) ? (n.config as Record<string, unknown>) : {};\n const target = String(cfg.target ?? cfg.chatId ?? \"\").trim();\n const provider = String(cfg.provider ?? cfg.channel ?? \"\").trim();\n\n if (!target && !defaultTarget) {\n warnings.push(`human_approval node ${String(n.id)} has no target (set node.config.target or workflow.meta.approvalTarget)`);\n }\n if (target && !provider && !String(meta.approvalProvider ?? \"\").trim()) {\n warnings.push(`human_approval node ${String(n.id)} has a target but no provider (set node.config.provider or workflow.meta.approvalProvider)`);\n }\n }\n\n return { errors, warnings };\n}\n"],"names":[],"mappings":"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"}
|