@mndrk/agx 2.0.33 → 2.0.34
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/cloud-runtime/standalone/.next/BUILD_ID +1 -1
- package/cloud-runtime/standalone/.next/app-path-routes-manifest.json +17 -0
- package/cloud-runtime/standalone/.next/build-manifest.json +6 -6
- package/cloud-runtime/standalone/.next/prerender-manifest.json +27 -3
- package/cloud-runtime/standalone/.next/routes-manifest.json +110 -0
- package/cloud-runtime/standalone/.next/server/app/_global-error/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/_global-error.html +2 -2
- package/cloud-runtime/standalone/.next/server/app/_global-error.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/_not-found/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/_not-found.html +2 -2
- package/cloud-runtime/standalone/.next/server/app/_not-found.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/agents/[id]/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/agents/[id]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/agents/[id]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/agents/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/agents/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/agents.html +2 -2
- package/cloud-runtime/standalone/.next/server/app/agents.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/agents.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/agents.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/agents.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/agents.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/agents.segments/agents/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/agents.segments/agents.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/agent-specs/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/agent-specs/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/agents/[id]/profile/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/agents/[id]/profile/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/agents/export/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/agents/export/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/automations/create/route.js +2 -2
- package/cloud-runtime/standalone/.next/server/app/api/automations/create/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/chat/route.js +5 -5
- package/cloud-runtime/standalone/.next/server/app/api/chat/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/file-search/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/filesystem/pick-folder/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/.next/server/app/api/filesystem/pick-folder/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/.next/server/app/api/filesystem/pick-folder/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/.next/server/app/api/filesystem/pick-folder/route.js +7 -0
- package/cloud-runtime/standalone/.next/server/app/api/filesystem/pick-folder/route.js.map +5 -0
- package/cloud-runtime/standalone/.next/server/app/api/filesystem/pick-folder/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/.next/server/app/api/filesystem/pick-folder/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/.next/server/app/api/health/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/health/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/learnings/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/learnings/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/orchestrator/tasks/[taskId]/start/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/orchestrator/tasks/[taskId]/start/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/orchestrator/tasks/[taskId]/status/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/orchestrator/tasks/[taskId]/status/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/participants/route.js +3 -3
- package/cloud-runtime/standalone/.next/server/app/api/participants/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/agents/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/agents/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/memory/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/memory/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/migrate-v1/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/migrate-v1/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/migrate-v2/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/migrate-v2/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/skills/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/skills/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/threads/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/threads/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/variables/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/variables/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/projects/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/cancel/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/cancel/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/cancel/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/cancel/route.js +10 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/cancel/route.js.map +5 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/cancel/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/cancel/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/route.js +10 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/route.js.map +5 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/runs/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/runs/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/runs/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/runs/route.js +10 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/runs/route.js.map +5 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/runs/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/runs/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/agents/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/agents/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/agents/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/agents/route.js +9 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/agents/route.js.map +5 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/agents/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/agents/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/poll/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/poll/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/poll/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/poll/route.js +12 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/poll/route.js.map +5 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/poll/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/poll/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/route.js +10 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/route.js.map +5 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/.next/server/app/api/queue/complete/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/queue/complete/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/queue/route.js +2 -2
- package/cloud-runtime/standalone/.next/server/app/api/queue/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/schedules/debug/route.js +3 -3
- package/cloud-runtime/standalone/.next/server/app/api/schedules/debug/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/schedules/poll/route.js +4 -4
- package/cloud-runtime/standalone/.next/server/app/api/schedules/poll/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/skills/assign/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/assign/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/assign/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/assign/route.js +8 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/assign/route.js.map +5 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/assign/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/assign/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/available/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/available/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/available/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/available/route.js +8 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/available/route.js.map +5 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/available/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/available/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/detail/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/detail/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/detail/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/detail/route.js +8 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/detail/route.js.map +5 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/detail/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/detail/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/history/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/history/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/history/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/history/route.js +8 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/history/route.js.map +5 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/history/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/history/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/learn/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/learn/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/learn/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/learn/route.js +8 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/learn/route.js.map +5 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/learn/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/learn/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/route.js +8 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/route.js.map +5 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/unlearn/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/unlearn/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/unlearn/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/unlearn/route.js +8 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/unlearn/route.js.map +5 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/unlearn/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/.next/server/app/api/skills/unlearn/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/.next/server/app/api/summarize/route.js +3 -3
- package/cloud-runtime/standalone/.next/server/app/api/summarize/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/comments/[commentId]/route.js +2 -2
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/comments/[commentId]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/comments/route.js +2 -2
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/comments/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/costs/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/costs/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/dependencies/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/dependencies/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/events/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/events/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/history/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/history/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/metrics/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/metrics/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/replan/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/replan/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/restart/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/restart/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/resume/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/resume/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/rollback/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/rollback/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/schedule/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/schedule/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/start/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/start/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/history/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/history/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/logs/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/logs/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/complete/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/complete/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/fail/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/fail/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/resume/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/resume/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/start/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/start/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/stop/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/stop/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/verify/route.js +2 -2
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/verify/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/route.js +2 -2
- package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/assign-orphans/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/assign-orphans/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/extract/route.js +3 -3
- package/cloud-runtime/standalone/.next/server/app/api/tasks/extract/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/tasks/route.js +2 -2
- package/cloud-runtime/standalone/.next/server/app/api/tasks/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/thread-repos/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/.next/server/app/api/thread-repos/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/.next/server/app/api/thread-repos/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/.next/server/app/api/thread-repos/route.js +7 -0
- package/cloud-runtime/standalone/.next/server/app/api/thread-repos/route.js.map +5 -0
- package/cloud-runtime/standalone/.next/server/app/api/thread-repos/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/.next/server/app/api/thread-repos/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/.next/server/app/api/threads/knowledge/route.js +2 -2
- package/cloud-runtime/standalone/.next/server/app/api/threads/knowledge/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/threads/route.js +2 -2
- package/cloud-runtime/standalone/.next/server/app/api/threads/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/user-settings/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/user-settings/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/automations/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/automations/page/react-loadable-manifest.json +8 -1
- package/cloud-runtime/standalone/.next/server/app/automations/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/automations/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/automations.html +2 -2
- package/cloud-runtime/standalone/.next/server/app/automations.rsc +4 -4
- package/cloud-runtime/standalone/.next/server/app/automations.segments/_full.segment.rsc +4 -4
- package/cloud-runtime/standalone/.next/server/app/automations.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/automations.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/automations.segments/_tree.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/automations.segments/automations/__PAGE__.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/automations.segments/automations.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/board/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/board/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/board/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/board.html +2 -2
- package/cloud-runtime/standalone/.next/server/app/board.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/board.segments/_full.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/board.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/board.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/board.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/board.segments/board/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/board.segments/board.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/execution-graph/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/execution-graph/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/execution-graph/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/execution-graph.html +2 -2
- package/cloud-runtime/standalone/.next/server/app/execution-graph.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/execution-graph/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/execution-graph.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/index.html +2 -2
- package/cloud-runtime/standalone/.next/server/app/index.rsc +5 -5
- package/cloud-runtime/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
- package/cloud-runtime/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
- package/cloud-runtime/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/index.segments/_tree.segment.rsc +4 -4
- package/cloud-runtime/standalone/.next/server/app/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/automations/page/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/automations/page/build-manifest.json +18 -0
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/automations/page/next-font-manifest.json +11 -0
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/automations/page/react-loadable-manifest.json +8 -0
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/automations/page/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/automations/page.js +16 -0
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/automations/page.js.map +5 -0
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/automations/page.js.nft.json +1 -0
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/automations/page_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/graph/[taskId]/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/graph/[taskId]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/graph/[taskId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/knowledge/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/knowledge/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/knowledge/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/thread/[threadId]/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/thread/[threadId]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/thread/[threadId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects/orphans/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/projects/orphans/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects/orphans/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects/orphans.html +2 -2
- package/cloud-runtime/standalone/.next/server/app/projects/orphans.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/projects/orphans/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/projects/orphans.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/projects.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/projects/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects.html +2 -2
- package/cloud-runtime/standalone/.next/server/app/projects.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/projects.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/projects.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/projects.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/projects.segments/projects/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/projects.segments/projects.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/settings/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/settings/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/settings.html +2 -2
- package/cloud-runtime/standalone/.next/server/app/settings.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/settings.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/settings.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/skills/page/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/.next/server/app/skills/page/build-manifest.json +18 -0
- package/cloud-runtime/standalone/.next/server/app/skills/page/next-font-manifest.json +11 -0
- package/cloud-runtime/standalone/.next/server/app/skills/page/react-loadable-manifest.json +1 -0
- package/cloud-runtime/standalone/.next/server/app/skills/page/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/.next/server/app/skills/page.js +15 -0
- package/cloud-runtime/standalone/.next/server/app/skills/page.js.map +5 -0
- package/cloud-runtime/standalone/.next/server/app/skills/page.js.nft.json +1 -0
- package/cloud-runtime/standalone/.next/server/app/skills/page_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/.next/server/app/skills.html +21 -0
- package/cloud-runtime/standalone/.next/server/app/skills.meta +15 -0
- package/cloud-runtime/standalone/.next/server/app/skills.rsc +23 -0
- package/cloud-runtime/standalone/.next/server/app/skills.segments/_full.segment.rsc +23 -0
- package/cloud-runtime/standalone/.next/server/app/skills.segments/_head.segment.rsc +5 -0
- package/cloud-runtime/standalone/.next/server/app/skills.segments/_index.segment.rsc +9 -0
- package/cloud-runtime/standalone/.next/server/app/skills.segments/_tree.segment.rsc +5 -0
- package/cloud-runtime/standalone/.next/server/app/skills.segments/skills/__PAGE__.segment.rsc +9 -0
- package/cloud-runtime/standalone/.next/server/app/skills.segments/skills.segment.rsc +4 -0
- package/cloud-runtime/standalone/.next/server/app/status/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/status/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/status/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/status.html +2 -2
- package/cloud-runtime/standalone/.next/server/app/status.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/status.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/status.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/status.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/status.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/status.segments/status/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/status.segments/status.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/thread/[id]/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/thread/[id]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/thread/[id]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/welcome/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/welcome/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/welcome/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/welcome.html +2 -2
- package/cloud-runtime/standalone/.next/server/app/welcome.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/welcome.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/welcome.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/welcome.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/welcome.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/welcome.segments/welcome/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/welcome.segments/welcome.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app-paths-manifest.json +17 -0
- package/cloud-runtime/standalone/.next/server/chunks/[externals]__cf9f18a6._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__875279cb._.js → [root-of-the-server]__005b3c82._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__4837d72a._.js → [root-of-the-server]__056d94e4._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__068b4f08._.js +15 -0
- package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__b3ed0a00._.js → [root-of-the-server]__0bb52353._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__0f580808._.js +13 -0
- package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__6c26221d._.js → [root-of-the-server]__1a8e0957._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__6acb940d._.js → [root-of-the-server]__23ad03bf._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__7ffcc20c._.js → [root-of-the-server]__2948f712._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__18423486._.js → [root-of-the-server]__32ef6623._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__1c18c0d1._.js → [root-of-the-server]__34cb1b98._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__4d865017._.js +48 -0
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__5031f8d4._.js +30 -0
- package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__5a348fba._.js → [root-of-the-server]__596d0e81._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__64712846._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__707c32af._.js +15 -0
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__7370bb86._.js +8 -0
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__749af50f._.js +8 -0
- package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__ffffceac._.js → [root-of-the-server]__75cedecf._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__19520d85._.js → [root-of-the-server]__7ee9b7b6._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__4d8c6e3d._.js → [root-of-the-server]__8ac0286e._.js} +3 -3
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__927cfc20._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__96ae701e._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__b63cb741._.js → [root-of-the-server]__981d92dd._.js} +3 -3
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__98b352f7._.js +13 -0
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__a44db634._.js +8 -0
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__a55c16a5._.js +158 -0
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__ab2bf82d._.js +13 -0
- package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__32b13ba9._.js → [root-of-the-server]__b4931ee1._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__e122cae2._.js → [root-of-the-server]__b500f1bf._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__c480c9c2._.js → [root-of-the-server]__b707e701._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__bf5803eb._.js +13 -0
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__ccd4846e._.js +13 -0
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__d4126e05._.js +15 -0
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__d908c9ea._.js +8 -0
- package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__b9b3fde6._.js → [root-of-the-server]__dcdeee3d._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__e3a4fd97._.js +13 -0
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__e4a87984._.js +15 -0
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__ee6511a0._.js +44 -0
- package/cloud-runtime/standalone/.next/server/chunks/_d225c04f._.js +1 -1
- package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_filesystem_pick-folder_route_actions_162664ff.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_prompt-jobs_[id]_cancel_route_actions_fbd5be89.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_prompt-jobs_[id]_route_actions_774a2e21.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_prompt-jobs_[id]_runs_route_actions_6e59ee83.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_prompt-jobs_agents_route_actions_399e1f19.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_prompt-jobs_poll_route_actions_23fbbfa1.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_prompt-jobs_route_actions_acf03860.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_skills_assign_route_actions_15267be8.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_skills_available_route_actions_24023111.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_skills_detail_route_actions_1148baef.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_skills_history_route_actions_5e5c4757.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_skills_learn_route_actions_d3a37d25.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_skills_route_actions_780e175f.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_skills_unlearn_route_actions_3dfee433.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_thread-repos_route_actions_e95d24ee.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/{lib_7cad5c77._.js → lib_a5adca60._.js} +25 -25
- package/cloud-runtime/standalone/.next/server/chunks/lib_db_ts_e06c6085._.js +1 -1
- package/cloud-runtime/standalone/.next/server/chunks/lib_ea45fe73._.js +1 -1
- package/cloud-runtime/standalone/.next/server/chunks/lib_history-store_ts_2e721df2._.js +28 -23
- package/cloud-runtime/standalone/.next/server/chunks/lib_history-store_ts_74d1c060._.js +28 -23
- package/cloud-runtime/standalone/.next/server/chunks/lib_sqlite-query-adapter_ts_3ea4d849._.js +38 -11
- package/cloud-runtime/standalone/.next/server/chunks/lib_sqlite-query-adapter_ts_b0b1a9b2._.js +43 -16
- package/cloud-runtime/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_371d0bff.js +19 -19
- package/cloud-runtime/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_def8bfbe.js +10 -0
- package/cloud-runtime/standalone/.next/server/chunks/src_graph_executor_ts_55c06268._.js +4 -3
- package/cloud-runtime/standalone/.next/server/chunks/src_graph_executor_ts_a8bc8d58._.js +4 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__096c39a3._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__226f8a19._.js +1 -1
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__47caef59._.js +1 -1
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__67d5f883._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__8b4e7816._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__8fe8b9dd._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__a37fb1c3._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__a456581d._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__d74022f1._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__fcbe03e6._.js → [root-of-the-server]__e0c64529._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__ea035cd9._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__ffbc2e98._.js +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_05c8a494._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_0c5c111f._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_0ffd2660._.js +1 -1
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_23656a95._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_23f5fddc._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_24feb541._.js +4 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_27a789b3._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{_508cd32f._.js → _314f4c49._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_36b413cc._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_43472af3._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_46e00a9b._.js +95 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_478f4991._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_4bfdfb14._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_52fe115d._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_547b6462._.js +4 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_547f19ec._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_85ca101b._.js +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_93914ecd._.js +1 -1
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_9e07dcac._.js +95 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_a1b966f7._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_a68d8f62._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_a80e12c8._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_b1e1ef71._.js +95 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_e1349560._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_next-internal_server_app_projects_[slug]_automations_page_actions_9371bc66.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_next-internal_server_app_skills_page_actions_4ac82b1e.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/app_agents_[id]_page_tsx_9c49d8c8._.js +1 -1
- package/cloud-runtime/standalone/.next/server/chunks/ssr/app_agents_page_tsx_f5f08ed8._.js +1 -1
- package/cloud-runtime/standalone/.next/server/chunks/ssr/app_execution-graph_page_tsx_f854185a._.js +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/components_chat-ui_bfeda794._.js +4 -5
- package/cloud-runtime/standalone/.next/server/chunks/ssr/components_thread_WorkspaceSidebar_tsx_e660301b._.js +1 -1
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{node_modules_lucide-react_dist_esm_e70f9321._.js → node_modules_lucide-react_dist_esm_b82e03da._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/node_modules_next_dist_61a87db9._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{node_modules_next_920e7746._.js → node_modules_next_f2865b38._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/functions-config-manifest.json +14 -0
- package/cloud-runtime/standalone/.next/server/middleware-build-manifest.js +4 -4
- package/cloud-runtime/standalone/.next/server/middleware-manifest.json +5 -5
- package/cloud-runtime/standalone/.next/server/next-font-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/next-font-manifest.json +8 -0
- package/cloud-runtime/standalone/.next/server/pages/404.html +2 -2
- package/cloud-runtime/standalone/.next/server/pages/500.html +2 -2
- package/cloud-runtime/standalone/.next/server/server-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/server-reference-manifest.json +1 -1
- package/cloud-runtime/standalone/.next/static/chunks/01428247f94115a6.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/06cf0ed16bf8aa70.js +28 -0
- package/cloud-runtime/standalone/.next/static/chunks/19dd745b663fdffa.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/1a3298f21d1040e9.js +4 -0
- package/cloud-runtime/standalone/.next/static/chunks/1c8583feefee0765.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/1e3dede69b464364.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/238a28856e739dc9.js +2 -0
- package/cloud-runtime/standalone/.next/static/chunks/24772e179852c73e.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/2d1d138d8ea3234c.css +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/2e011469003993e9.js +28 -0
- package/cloud-runtime/standalone/.next/static/chunks/31a4164e40ca71e5.js +6 -0
- package/cloud-runtime/standalone/.next/static/chunks/3c202e89da05d9b9.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/3c72becf6dff5597.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/44dafb5e85578e12.js +16 -0
- package/cloud-runtime/standalone/.next/static/chunks/47f22a56011af8d3.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/48e332ac3e9ed56c.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/5b567b289ca2273e.css +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/5d52c79d9812d06e.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/617db51b7444f818.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/673bb6094cea9ded.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/787436fad75f5bc6.js +5 -0
- package/cloud-runtime/standalone/.next/static/chunks/8304e8487aa74059.css +2 -0
- package/cloud-runtime/standalone/.next/static/chunks/8a4684388ca0f6de.js +7 -0
- package/cloud-runtime/standalone/.next/static/chunks/9f236cc9572783b9.js +93 -0
- package/cloud-runtime/standalone/.next/static/chunks/a9aaec85125f69b1.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/b4c29a62f9255268.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/bf2bb1662353aff5.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/c1fb885eed94aa8c.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/c653186036e56204.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/cb5581d868e78205.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/cbdeb17a36b99000.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/d5cc62984dc4205c.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/d73f1cc3ebc9993b.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/{8d15ced2dc70090a.js → da2b00558cf32f37.js} +1 -1
- package/cloud-runtime/standalone/.next/static/chunks/{turbopack-97e846241a3a64af.js → turbopack-22475f0dd0c18f92.js} +1 -1
- package/cloud-runtime/standalone/app/agents/[id]/page.tsx +4 -1
- package/cloud-runtime/standalone/app/agents/page.tsx +22 -2
- package/cloud-runtime/standalone/app/api/agent-specs/route.ts +4 -0
- package/cloud-runtime/standalone/app/api/agents/export/route.ts +4 -0
- package/cloud-runtime/standalone/app/api/chat/route.ts +8 -2
- package/cloud-runtime/standalone/app/api/filesystem/pick-folder/route.ts +56 -0
- package/cloud-runtime/standalone/app/api/participants/route.ts +50 -1
- package/cloud-runtime/standalone/app/api/prompt-jobs/[id]/cancel/route.ts +44 -0
- package/cloud-runtime/standalone/app/api/prompt-jobs/[id]/route.ts +94 -0
- package/cloud-runtime/standalone/app/api/prompt-jobs/[id]/runs/route.ts +30 -0
- package/cloud-runtime/standalone/app/api/prompt-jobs/agents/route.ts +25 -0
- package/cloud-runtime/standalone/app/api/prompt-jobs/poll/route.ts +232 -0
- package/cloud-runtime/standalone/app/api/prompt-jobs/route.ts +125 -0
- package/cloud-runtime/standalone/app/api/skills/assign/route.ts +30 -0
- package/cloud-runtime/standalone/app/api/skills/available/route.ts +20 -0
- package/cloud-runtime/standalone/app/api/skills/detail/route.ts +23 -0
- package/cloud-runtime/standalone/app/api/skills/history/route.ts +18 -0
- package/cloud-runtime/standalone/app/api/skills/learn/route.ts +31 -0
- package/cloud-runtime/standalone/app/api/skills/route.ts +19 -0
- package/cloud-runtime/standalone/app/api/skills/unlearn/route.ts +30 -0
- package/cloud-runtime/standalone/app/api/thread-repos/route.ts +30 -0
- package/cloud-runtime/standalone/app/automations/page.tsx +15 -3
- package/cloud-runtime/standalone/app/execution-graph/page.tsx +2 -2
- package/cloud-runtime/standalone/app/globals.css +2 -0
- package/cloud-runtime/standalone/app/layout.tsx +1 -1
- package/cloud-runtime/standalone/app/projects/[slug]/automations/page.tsx +17 -0
- package/cloud-runtime/standalone/app/projects/[slug]/layout.tsx +3 -2
- package/cloud-runtime/standalone/app/projects/[slug]/page.tsx +401 -86
- package/cloud-runtime/standalone/app/projects/orphans/page.tsx +1 -0
- package/cloud-runtime/standalone/app/projects/page.tsx +3 -3
- package/cloud-runtime/standalone/app/skills/page.tsx +399 -0
- package/cloud-runtime/standalone/components/FloatingPanel.tsx +200 -0
- package/cloud-runtime/standalone/components/Layout.tsx +7 -1
- package/cloud-runtime/standalone/components/NowRunningPanel.tsx +86 -76
- package/cloud-runtime/standalone/components/ProjectModal.tsx +29 -12
- package/cloud-runtime/standalone/components/PromptJobBoard.tsx +1434 -0
- package/cloud-runtime/standalone/components/chat-ui/ChatContainer.tsx +86 -17
- package/cloud-runtime/standalone/components/chat-ui/Composer.tsx +215 -19
- package/cloud-runtime/standalone/components/chat-ui/ParticipantBar.tsx +233 -213
- package/cloud-runtime/standalone/components/thread/WorkspaceSidebar.tsx +99 -41
- package/cloud-runtime/standalone/db/sqlite/001_agx_board_schema.sql +28 -0
- package/cloud-runtime/standalone/db/sqlite/002_prompt_scheduler_schema.sql +45 -0
- package/cloud-runtime/standalone/db/sqlite/003_prompt_scheduler_v2.sql +13 -0
- package/cloud-runtime/standalone/hooks/useAttachments.ts +2 -1
- package/cloud-runtime/standalone/hooks/useGroupChat.ts +4 -1
- package/cloud-runtime/standalone/hooks/usePromptJobs.ts +111 -0
- package/cloud-runtime/standalone/lib/agent-participants.ts +7 -0
- package/cloud-runtime/standalone/lib/agent-skill-bindings.ts +118 -0
- package/cloud-runtime/standalone/lib/chat/paste-attachments.ts +152 -0
- package/cloud-runtime/standalone/lib/db.ts +5 -0
- package/cloud-runtime/standalone/lib/history-store.ts +38 -0
- package/cloud-runtime/standalone/lib/skills-library.ts +450 -0
- package/cloud-runtime/standalone/lib/sqlite-query-adapter.ts +32 -0
- package/cloud-runtime/standalone/lib/stream-multiplexer.ts +59 -11
- package/cloud-runtime/standalone/lib/types.ts +10 -0
- package/cloud-runtime/standalone/migrations/sqlite_schema.sql +28 -0
- package/cloud-runtime/standalone/src/graph/llm-review.ts +19 -2
- package/cloud-runtime/standalone/src/prompt-scheduler/cron.ts +46 -0
- package/cloud-runtime/standalone/src/prompt-scheduler/engine.ts +87 -0
- package/cloud-runtime/standalone/src/prompt-scheduler/get-store.ts +36 -0
- package/cloud-runtime/standalone/src/prompt-scheduler/runner.ts +144 -0
- package/cloud-runtime/standalone/src/prompt-scheduler/store.ts +327 -0
- package/cloud-runtime/standalone/src/prompt-scheduler/types.ts +82 -0
- package/cloud-runtime/standalone/state/floatingPanels.ts +47 -0
- package/cloud-runtime/standalone/styles/composer-pills.css +156 -2
- package/cloud-runtime/standalone/styles/workspaceSidebar.css +5 -3
- package/cloud-runtime/standalone/test/adapters/sqlite.ts +1 -0
- package/cloud-runtime/standalone/update_officeapp.js +36 -0
- package/cloud-runtime/standalone/update_store.js +47 -0
- package/cloud-runtime/standalone/worker/index.js +292 -45
- package/package.json +1 -1
- package/cloud-runtime/standalone/.next/server/chunks/[externals]__1f4b15dd._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__4c8624cc._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__666f8712._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__a189593a._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__d6e1ee6e._.js +0 -32
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__f1b7932f._.js +0 -36
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__f701b208._.js +0 -146
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__04d1aa70._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__2d80540b._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__8973b16a._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__a416df95._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__c108f06c._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_0061ebd8._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_064370bc._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_41f60c52._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_54af99c5._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_6b14826d._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_84879a01._.js +0 -95
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_9eeb2fa0._.js +0 -95
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_a0cc0fe7._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_a1d30b20._.js +0 -95
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_c87c359c._.js +0 -95
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_ccb409c5._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_cd5e154b._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_dd31b6e0._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_f0ce6183._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/app_automations_page_tsx_3d732184._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_bf855424._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/node_modules_next_dist_852965c2._.js +0 -3
- package/cloud-runtime/standalone/.next/static/chunks/010aff7b601302de.js +0 -16
- package/cloud-runtime/standalone/.next/static/chunks/012e3e9699415997.js +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/031d99fbe758545a.js +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/09f9eeea393db0fd.js +0 -4
- package/cloud-runtime/standalone/.next/static/chunks/0c467f54bc78a380.js +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/10b0642440302e99.css +0 -2
- package/cloud-runtime/standalone/.next/static/chunks/116985039c24f1f8.js +0 -93
- package/cloud-runtime/standalone/.next/static/chunks/2ee8d24314eec47c.js +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/3e4e8857f875c964.js +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/43f6157bc3db9c52.js +0 -6
- package/cloud-runtime/standalone/.next/static/chunks/486bf7ff282b91a6.js +0 -5
- package/cloud-runtime/standalone/.next/static/chunks/56a01238098d495d.js +0 -93
- package/cloud-runtime/standalone/.next/static/chunks/601996727991149e.js +0 -93
- package/cloud-runtime/standalone/.next/static/chunks/651c7c97d3bd77e0.js +0 -28
- package/cloud-runtime/standalone/.next/static/chunks/7d4c1d97169c8522.js +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/851b1d97179bd39b.css +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/9048e44ed538b21a.js +0 -2
- package/cloud-runtime/standalone/.next/static/chunks/90b581e9631d8cea.js +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/99174504a201d23e.js +0 -28
- package/cloud-runtime/standalone/.next/static/chunks/a8e8ef440c4daa5a.css +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/b22947e6df238fd5.js +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/b2dcd19ebe3af3f6.js +0 -93
- package/cloud-runtime/standalone/.next/static/chunks/bc06988336ffd261.js +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/c93b9643c81c134e.js +0 -8
- package/cloud-runtime/standalone/.next/static/chunks/d5d6be8239e57c56.js +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/ebaf4e8f04bae7b6.js +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/f4909e7ae8229b1c.js +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/fd221a50082e5128.js +0 -1
- package/cloud-runtime/standalone/agx-board.json +0 -264
- package/cloud-runtime/standalone/agx-cli.json +0 -2195
- package/cloud-runtime/standalone/fix-primary.js +0 -30
- package/cloud-runtime/standalone/fix-theme.js +0 -78
- package/cloud-runtime/standalone/test-file +0 -0
- package/cloud-runtime/standalone/testfile +0 -0
- package/cloud-runtime/standalone/transcri +0 -0
- /package/cloud-runtime/standalone/.next/static/{68nLQxEpwR_feFvB8T4tR → G0Hrt7JKBM1EtMPT0lUIr}/_buildManifest.js +0 -0
- /package/cloud-runtime/standalone/.next/static/{68nLQxEpwR_feFvB8T4tR → G0Hrt7JKBM1EtMPT0lUIr}/_clientMiddlewareManifest.json +0 -0
- /package/cloud-runtime/standalone/.next/static/{68nLQxEpwR_feFvB8T4tR → G0Hrt7JKBM1EtMPT0lUIr}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,1434 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import React, { useState, useEffect, useCallback } from "react";
|
|
4
|
+
import dynamic from "next/dynamic";
|
|
5
|
+
import {
|
|
6
|
+
Play,
|
|
7
|
+
Pause,
|
|
8
|
+
Trash2,
|
|
9
|
+
Plus,
|
|
10
|
+
X,
|
|
11
|
+
Clock,
|
|
12
|
+
Terminal,
|
|
13
|
+
RefreshCw,
|
|
14
|
+
ChevronDown,
|
|
15
|
+
Settings2,
|
|
16
|
+
Zap,
|
|
17
|
+
Calendar,
|
|
18
|
+
CalendarDays,
|
|
19
|
+
Repeat,
|
|
20
|
+
Pencil,
|
|
21
|
+
ArrowLeft,
|
|
22
|
+
Copy,
|
|
23
|
+
ExternalLink,
|
|
24
|
+
} from "lucide-react";
|
|
25
|
+
import { usePromptJobs } from "@/hooks/usePromptJobs";
|
|
26
|
+
import type { PromptJob, PromptRun } from "@/src/prompt-scheduler/types";
|
|
27
|
+
|
|
28
|
+
const RichTextEditor = dynamic(() => import("@/components/RichTextEditor"), {
|
|
29
|
+
ssr: false,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
33
|
+
|
|
34
|
+
function formatNextRun(epochMs: number | null, state: string): string {
|
|
35
|
+
if (state === "paused") return "Paused";
|
|
36
|
+
if (state === "stopped") return "Stopped";
|
|
37
|
+
if (epochMs === null) return "Pending...";
|
|
38
|
+
const diff = epochMs - Date.now();
|
|
39
|
+
if (diff < 0) return "overdue";
|
|
40
|
+
if (diff < 60_000) return `in ${Math.round(diff / 1000)}s`;
|
|
41
|
+
if (diff < 3_600_000) return `in ${Math.round(diff / 60_000)}m`;
|
|
42
|
+
if (diff < 86_400_000) return `in ${Math.round(diff / 3_600_000)}h`;
|
|
43
|
+
return `in ${Math.round(diff / 86_400_000)}d`;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function formatDate(iso: string | null): string {
|
|
47
|
+
if (!iso) return "—";
|
|
48
|
+
const d = new Date(iso);
|
|
49
|
+
return (
|
|
50
|
+
d.toLocaleDateString("en-US", { month: "short", day: "numeric" }) +
|
|
51
|
+
", " +
|
|
52
|
+
d.toLocaleTimeString("en-US", { hour: "numeric", minute: "2-digit" })
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function StateBadge({ state }: { state: PromptJob["state"] }) {
|
|
57
|
+
const styles: Record<string, string> = {
|
|
58
|
+
active: "text-green-400 bg-green-400/10 border-green-400/20",
|
|
59
|
+
paused: "text-amber-400 bg-amber-400/10 border-amber-400/20",
|
|
60
|
+
stopped:
|
|
61
|
+
"text-[var(--muted-foreground)] bg-[var(--muted)] border-[var(--card-border)]",
|
|
62
|
+
};
|
|
63
|
+
return (
|
|
64
|
+
<span
|
|
65
|
+
className={`text-[10px] font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md border ${styles[state] ?? styles.stopped}`}
|
|
66
|
+
>
|
|
67
|
+
{state}
|
|
68
|
+
</span>
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const statusDotColor: Record<string, string> = {
|
|
73
|
+
active: "bg-emerald-400",
|
|
74
|
+
paused: "bg-amber-400",
|
|
75
|
+
stopped: "bg-zinc-500",
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
const runStatusDot: Record<string, string> = {
|
|
79
|
+
success: "bg-emerald-400",
|
|
80
|
+
failed: "bg-red-400",
|
|
81
|
+
cancelled: "bg-zinc-500",
|
|
82
|
+
running: "bg-sky-400",
|
|
83
|
+
queued: "bg-amber-400",
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
// ── Create/Edit Modal ────────────────────────────────────────────────────────
|
|
87
|
+
|
|
88
|
+
interface AgentOption {
|
|
89
|
+
id: string;
|
|
90
|
+
name: string;
|
|
91
|
+
provider: string;
|
|
92
|
+
model: string | null;
|
|
93
|
+
color: string;
|
|
94
|
+
title: string | null;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
interface CreateJobData {
|
|
98
|
+
name: string;
|
|
99
|
+
prompt: string;
|
|
100
|
+
agentId: string;
|
|
101
|
+
provider: string;
|
|
102
|
+
model: string;
|
|
103
|
+
cliArgs: string;
|
|
104
|
+
catchUpPolicy: string;
|
|
105
|
+
cadence: string;
|
|
106
|
+
triggerType: string;
|
|
107
|
+
condition: string;
|
|
108
|
+
checkEveryMs: number;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const DAYS_OF_WEEK = [
|
|
112
|
+
{ label: "Sun", short: "S", value: 0 },
|
|
113
|
+
{ label: "Mon", short: "M", value: 1 },
|
|
114
|
+
{ label: "Tue", short: "T", value: 2 },
|
|
115
|
+
{ label: "Wed", short: "W", value: 3 },
|
|
116
|
+
{ label: "Thu", short: "T", value: 4 },
|
|
117
|
+
{ label: "Fri", short: "F", value: 5 },
|
|
118
|
+
{ label: "Sat", short: "S", value: 6 },
|
|
119
|
+
];
|
|
120
|
+
|
|
121
|
+
function getOrdinal(n: number) {
|
|
122
|
+
const s = ["th", "st", "nd", "rd"];
|
|
123
|
+
const v = n % 100;
|
|
124
|
+
return s[(v - 20) % 10] || s[v] || s[0];
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function buildCron(
|
|
128
|
+
freq: string,
|
|
129
|
+
hour: string,
|
|
130
|
+
minute: string,
|
|
131
|
+
days: number[],
|
|
132
|
+
monthDay: number,
|
|
133
|
+
): string {
|
|
134
|
+
switch (freq) {
|
|
135
|
+
case "hourly":
|
|
136
|
+
return `${minute} * * * *`;
|
|
137
|
+
case "daily":
|
|
138
|
+
return `${minute} ${hour} * * *`;
|
|
139
|
+
case "weekly":
|
|
140
|
+
return `${minute} ${hour} * * ${days.sort().join(",")}`;
|
|
141
|
+
case "monthly":
|
|
142
|
+
return `${minute} ${hour} ${monthDay} * *`;
|
|
143
|
+
default:
|
|
144
|
+
return `${minute} ${hour} * * *`;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function buildHumanReadable(
|
|
149
|
+
freq: string,
|
|
150
|
+
hour: string,
|
|
151
|
+
minute: string,
|
|
152
|
+
days: number[],
|
|
153
|
+
monthDay: number,
|
|
154
|
+
): string {
|
|
155
|
+
const hh = parseInt(hour);
|
|
156
|
+
const suffix = hh >= 12 ? "PM" : "AM";
|
|
157
|
+
const displayHour = hh % 12 || 12;
|
|
158
|
+
const time = `${displayHour}:${minute} ${suffix}`;
|
|
159
|
+
|
|
160
|
+
switch (freq) {
|
|
161
|
+
case "hourly":
|
|
162
|
+
return `Every hour at :${minute}`;
|
|
163
|
+
case "daily":
|
|
164
|
+
return `Every day at ${time}`;
|
|
165
|
+
case "weekly": {
|
|
166
|
+
const labels = days
|
|
167
|
+
.sort()
|
|
168
|
+
.map((d) => DAYS_OF_WEEK.find((day) => day.value === d)!.label);
|
|
169
|
+
return `${time} on ${labels.join(", ")}`;
|
|
170
|
+
}
|
|
171
|
+
case "monthly":
|
|
172
|
+
return `${monthDay}${getOrdinal(monthDay)} of every month at ${time}`;
|
|
173
|
+
default:
|
|
174
|
+
return `Every day at ${time}`;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function ScheduleBuilder({
|
|
179
|
+
value,
|
|
180
|
+
onChange,
|
|
181
|
+
}: {
|
|
182
|
+
value: string;
|
|
183
|
+
onChange: (cron: string, label: string) => void;
|
|
184
|
+
}) {
|
|
185
|
+
const [freq, setFreq] = useState("daily");
|
|
186
|
+
const [hour, setHour] = useState("09");
|
|
187
|
+
const [minute, setMinute] = useState("00");
|
|
188
|
+
const [selectedDays, setSelectedDays] = useState([1, 2, 3, 4, 5]);
|
|
189
|
+
const [monthDay, setMonthDay] = useState(1);
|
|
190
|
+
|
|
191
|
+
useEffect(() => {
|
|
192
|
+
const cron = buildCron(freq, hour, minute, selectedDays, monthDay);
|
|
193
|
+
const label = buildHumanReadable(
|
|
194
|
+
freq,
|
|
195
|
+
hour,
|
|
196
|
+
minute,
|
|
197
|
+
selectedDays,
|
|
198
|
+
monthDay,
|
|
199
|
+
);
|
|
200
|
+
onChange(cron, label);
|
|
201
|
+
}, [freq, hour, minute, selectedDays, monthDay]);
|
|
202
|
+
|
|
203
|
+
const toggleDay = (d: number) =>
|
|
204
|
+
setSelectedDays((prev) =>
|
|
205
|
+
prev.includes(d) ? prev.filter((x) => x !== d) : [...prev, d],
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
const freqPill = (
|
|
209
|
+
id: string,
|
|
210
|
+
label: string,
|
|
211
|
+
Icon: React.ComponentType<{ size?: number }>,
|
|
212
|
+
) => (
|
|
213
|
+
<button
|
|
214
|
+
key={id}
|
|
215
|
+
type="button"
|
|
216
|
+
onClick={() => setFreq(id)}
|
|
217
|
+
className={`flex flex-col items-center justify-center p-2.5 rounded-xl border transition-all text-[11px] font-medium ${
|
|
218
|
+
freq === id
|
|
219
|
+
? "border-[var(--foreground)] bg-[var(--foreground)]/5 text-[var(--foreground)]"
|
|
220
|
+
: "border-[var(--card-border)] bg-[var(--muted)] text-[var(--muted-foreground)] hover:border-[var(--muted-foreground)]"
|
|
221
|
+
}`}
|
|
222
|
+
>
|
|
223
|
+
<Icon size={16} />
|
|
224
|
+
<span className="mt-1">{label}</span>
|
|
225
|
+
</button>
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
const selectClass =
|
|
229
|
+
"bg-[var(--muted)] border border-[var(--card-border)] rounded-lg px-2 py-1.5 text-sm font-medium text-[var(--foreground)] focus:outline-none focus:border-[var(--foreground)] transition-colors";
|
|
230
|
+
|
|
231
|
+
return (
|
|
232
|
+
<div className="space-y-4">
|
|
233
|
+
{/* Frequency pills */}
|
|
234
|
+
<div className="grid grid-cols-4 gap-2">
|
|
235
|
+
{freqPill("hourly", "Hourly", Repeat)}
|
|
236
|
+
{freqPill("daily", "Daily", Clock)}
|
|
237
|
+
{freqPill("weekly", "Weekly", CalendarDays)}
|
|
238
|
+
{freqPill("monthly", "Monthly", Calendar)}
|
|
239
|
+
</div>
|
|
240
|
+
|
|
241
|
+
{/* Time picker (not for hourly) */}
|
|
242
|
+
{freq !== "hourly" ? (
|
|
243
|
+
<div>
|
|
244
|
+
<div className="text-[10px] font-semibold text-[var(--muted-foreground)] uppercase tracking-widest mb-1.5">
|
|
245
|
+
Time
|
|
246
|
+
</div>
|
|
247
|
+
<div className="flex items-center gap-1.5">
|
|
248
|
+
<select
|
|
249
|
+
value={hour}
|
|
250
|
+
onChange={(e) => setHour(e.target.value)}
|
|
251
|
+
className={selectClass}
|
|
252
|
+
>
|
|
253
|
+
{Array.from({ length: 24 }).map((_, i) => {
|
|
254
|
+
const val = i.toString().padStart(2, "0");
|
|
255
|
+
return (
|
|
256
|
+
<option key={val} value={val}>
|
|
257
|
+
{val}
|
|
258
|
+
</option>
|
|
259
|
+
);
|
|
260
|
+
})}
|
|
261
|
+
</select>
|
|
262
|
+
<span className="text-sm font-bold text-[var(--muted-foreground)]">
|
|
263
|
+
:
|
|
264
|
+
</span>
|
|
265
|
+
<select
|
|
266
|
+
value={minute}
|
|
267
|
+
onChange={(e) => setMinute(e.target.value)}
|
|
268
|
+
className={selectClass}
|
|
269
|
+
>
|
|
270
|
+
{[
|
|
271
|
+
"00",
|
|
272
|
+
"05",
|
|
273
|
+
"10",
|
|
274
|
+
"15",
|
|
275
|
+
"20",
|
|
276
|
+
"25",
|
|
277
|
+
"30",
|
|
278
|
+
"35",
|
|
279
|
+
"40",
|
|
280
|
+
"45",
|
|
281
|
+
"50",
|
|
282
|
+
"55",
|
|
283
|
+
].map((val) => (
|
|
284
|
+
<option key={val} value={val}>
|
|
285
|
+
{val}
|
|
286
|
+
</option>
|
|
287
|
+
))}
|
|
288
|
+
</select>
|
|
289
|
+
<span className="ml-1.5 text-[10px] text-[var(--muted-foreground)]">
|
|
290
|
+
{parseInt(hour) >= 12 ? "PM" : "AM"}
|
|
291
|
+
</span>
|
|
292
|
+
</div>
|
|
293
|
+
</div>
|
|
294
|
+
) : (
|
|
295
|
+
<div>
|
|
296
|
+
<div className="text-[10px] font-semibold text-[var(--muted-foreground)] uppercase tracking-widest mb-1.5">
|
|
297
|
+
At minute
|
|
298
|
+
</div>
|
|
299
|
+
<select
|
|
300
|
+
value={minute}
|
|
301
|
+
onChange={(e) => setMinute(e.target.value)}
|
|
302
|
+
className={selectClass}
|
|
303
|
+
>
|
|
304
|
+
{[
|
|
305
|
+
"00",
|
|
306
|
+
"05",
|
|
307
|
+
"10",
|
|
308
|
+
"15",
|
|
309
|
+
"20",
|
|
310
|
+
"25",
|
|
311
|
+
"30",
|
|
312
|
+
"35",
|
|
313
|
+
"40",
|
|
314
|
+
"45",
|
|
315
|
+
"50",
|
|
316
|
+
"55",
|
|
317
|
+
].map((val) => (
|
|
318
|
+
<option key={val} value={val}>
|
|
319
|
+
:{val}
|
|
320
|
+
</option>
|
|
321
|
+
))}
|
|
322
|
+
</select>
|
|
323
|
+
</div>
|
|
324
|
+
)}
|
|
325
|
+
|
|
326
|
+
{/* Weekly: day selector */}
|
|
327
|
+
{freq === "weekly" && (
|
|
328
|
+
<div>
|
|
329
|
+
<div className="text-[10px] font-semibold text-[var(--muted-foreground)] uppercase tracking-widest mb-1.5">
|
|
330
|
+
Repeat on
|
|
331
|
+
</div>
|
|
332
|
+
<div className="flex gap-1.5">
|
|
333
|
+
{DAYS_OF_WEEK.map((day) => (
|
|
334
|
+
<button
|
|
335
|
+
key={day.value}
|
|
336
|
+
type="button"
|
|
337
|
+
onClick={() => toggleDay(day.value)}
|
|
338
|
+
className={`size-8 rounded-full flex items-center justify-center text-[10px] font-bold transition-all ${
|
|
339
|
+
selectedDays.includes(day.value)
|
|
340
|
+
? "bg-[var(--foreground)] text-[var(--background)]"
|
|
341
|
+
: "bg-[var(--muted)] text-[var(--muted-foreground)] hover:bg-[var(--card-border)]"
|
|
342
|
+
}`}
|
|
343
|
+
>
|
|
344
|
+
{day.label[0]}
|
|
345
|
+
</button>
|
|
346
|
+
))}
|
|
347
|
+
</div>
|
|
348
|
+
</div>
|
|
349
|
+
)}
|
|
350
|
+
|
|
351
|
+
{/* Monthly: date grid */}
|
|
352
|
+
{freq === "monthly" && (
|
|
353
|
+
<div>
|
|
354
|
+
<div className="text-[10px] font-semibold text-[var(--muted-foreground)] uppercase tracking-widest mb-1.5">
|
|
355
|
+
On day
|
|
356
|
+
</div>
|
|
357
|
+
<div className="grid grid-cols-7 gap-1">
|
|
358
|
+
{Array.from({ length: 31 }).map((_, i) => {
|
|
359
|
+
const d = i + 1;
|
|
360
|
+
return (
|
|
361
|
+
<button
|
|
362
|
+
key={d}
|
|
363
|
+
type="button"
|
|
364
|
+
onClick={() => setMonthDay(d)}
|
|
365
|
+
className={`size-7 rounded-lg flex items-center justify-center text-[10px] font-medium transition-all ${
|
|
366
|
+
monthDay === d
|
|
367
|
+
? "bg-[var(--foreground)] text-[var(--background)]"
|
|
368
|
+
: "bg-[var(--muted)] text-[var(--muted-foreground)] hover:bg-[var(--card-border)]"
|
|
369
|
+
}`}
|
|
370
|
+
>
|
|
371
|
+
{d}
|
|
372
|
+
</button>
|
|
373
|
+
);
|
|
374
|
+
})}
|
|
375
|
+
</div>
|
|
376
|
+
</div>
|
|
377
|
+
)}
|
|
378
|
+
|
|
379
|
+
{/* Summary */}
|
|
380
|
+
<div className="px-3 py-2 rounded-lg bg-[var(--muted)] border border-[var(--card-border)]">
|
|
381
|
+
<div className="text-[10px] text-[var(--muted-foreground)] mb-0.5">
|
|
382
|
+
Schedule
|
|
383
|
+
</div>
|
|
384
|
+
<div className="text-xs font-medium text-[var(--foreground)]">
|
|
385
|
+
{buildHumanReadable(freq, hour, minute, selectedDays, monthDay)}
|
|
386
|
+
</div>
|
|
387
|
+
<div className="text-[10px] font-mono text-[var(--muted-foreground)] mt-0.5">
|
|
388
|
+
{buildCron(freq, hour, minute, selectedDays, monthDay)}
|
|
389
|
+
</div>
|
|
390
|
+
</div>
|
|
391
|
+
</div>
|
|
392
|
+
);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
const CHECK_PRESETS = [
|
|
396
|
+
{ label: "1 min", ms: 60000 },
|
|
397
|
+
{ label: "5 min", ms: 300000 },
|
|
398
|
+
{ label: "15 min", ms: 900000 },
|
|
399
|
+
{ label: "30 min", ms: 1800000 },
|
|
400
|
+
{ label: "1 hour", ms: 3600000 },
|
|
401
|
+
] as const;
|
|
402
|
+
|
|
403
|
+
function Label({ children }: { children: React.ReactNode }) {
|
|
404
|
+
return (
|
|
405
|
+
<label className="block text-[10px] font-semibold text-[var(--muted-foreground)] uppercase tracking-widest mb-2">
|
|
406
|
+
{children}
|
|
407
|
+
</label>
|
|
408
|
+
);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
function agentAvatar(id: string, color: string, size = 24) {
|
|
412
|
+
const bg = color ? color.replace("#", "") : "e2e8f0";
|
|
413
|
+
return `https://api.dicebear.com/9.x/bottts-neutral/svg?seed=${encodeURIComponent(id)}&size=${size}&backgroundColor=${bg}`;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
function AgentDropdown({
|
|
417
|
+
agents,
|
|
418
|
+
value,
|
|
419
|
+
onChange,
|
|
420
|
+
}: {
|
|
421
|
+
agents: AgentOption[];
|
|
422
|
+
value: string;
|
|
423
|
+
onChange: (id: string) => void;
|
|
424
|
+
}) {
|
|
425
|
+
const [open, setOpen] = useState(false);
|
|
426
|
+
const selected = agents.find((a) => a.id === value);
|
|
427
|
+
|
|
428
|
+
return (
|
|
429
|
+
<div className="relative">
|
|
430
|
+
<Label>Agent</Label>
|
|
431
|
+
<button
|
|
432
|
+
type="button"
|
|
433
|
+
onClick={() => setOpen(!open)}
|
|
434
|
+
className="w-full flex items-center gap-2.5 px-3 py-2.5 rounded-lg border border-[var(--card-border)] bg-[var(--muted)] text-left transition-colors hover:border-[var(--muted-foreground)]"
|
|
435
|
+
>
|
|
436
|
+
{selected ? (
|
|
437
|
+
<>
|
|
438
|
+
<img
|
|
439
|
+
src={agentAvatar(selected.id, selected.color)}
|
|
440
|
+
alt=""
|
|
441
|
+
className="size-6 rounded-full shrink-0"
|
|
442
|
+
/>
|
|
443
|
+
<div className="min-w-0 flex-1">
|
|
444
|
+
<div className="text-xs font-medium text-[var(--foreground)] truncate">
|
|
445
|
+
{selected.name}
|
|
446
|
+
</div>
|
|
447
|
+
<div className="text-[10px] text-[var(--muted-foreground)]">
|
|
448
|
+
{selected.provider}
|
|
449
|
+
{selected.model ? ` / ${selected.model}` : ""}
|
|
450
|
+
</div>
|
|
451
|
+
</div>
|
|
452
|
+
</>
|
|
453
|
+
) : (
|
|
454
|
+
<span className="text-xs text-[var(--muted-foreground)]">
|
|
455
|
+
Select an agent...
|
|
456
|
+
</span>
|
|
457
|
+
)}
|
|
458
|
+
<ChevronDown
|
|
459
|
+
size={14}
|
|
460
|
+
className={`ml-auto text-[var(--muted-foreground)] transition-transform ${open ? "rotate-180" : ""}`}
|
|
461
|
+
/>
|
|
462
|
+
</button>
|
|
463
|
+
|
|
464
|
+
{open && (
|
|
465
|
+
<div className="absolute z-20 mt-1 w-full rounded-lg border border-[var(--card-border)] bg-[var(--card-bg)] shadow-lg max-h-[280px] overflow-y-auto">
|
|
466
|
+
{agents.map((a) => (
|
|
467
|
+
<button
|
|
468
|
+
key={a.id}
|
|
469
|
+
type="button"
|
|
470
|
+
onClick={() => {
|
|
471
|
+
onChange(a.id);
|
|
472
|
+
setOpen(false);
|
|
473
|
+
}}
|
|
474
|
+
className={`w-full flex items-center gap-2.5 px-3 py-2.5 text-left transition-colors hover:bg-[var(--muted)] ${value === a.id ? "bg-[var(--muted)]" : ""}`}
|
|
475
|
+
>
|
|
476
|
+
<img
|
|
477
|
+
src={agentAvatar(a.id, a.color)}
|
|
478
|
+
alt=""
|
|
479
|
+
className="size-6 rounded-full shrink-0"
|
|
480
|
+
/>
|
|
481
|
+
<div className="min-w-0 flex-1">
|
|
482
|
+
<div className="text-xs font-medium text-[var(--foreground)] truncate">
|
|
483
|
+
{a.name}
|
|
484
|
+
</div>
|
|
485
|
+
<div className="text-[10px] text-[var(--muted-foreground)]">
|
|
486
|
+
{a.provider}
|
|
487
|
+
{a.model ? ` / ${a.model}` : ""}
|
|
488
|
+
</div>
|
|
489
|
+
</div>
|
|
490
|
+
{value === a.id && (
|
|
491
|
+
<span className="text-xs text-[var(--foreground)]">
|
|
492
|
+
✓
|
|
493
|
+
</span>
|
|
494
|
+
)}
|
|
495
|
+
</button>
|
|
496
|
+
))}
|
|
497
|
+
</div>
|
|
498
|
+
)}
|
|
499
|
+
</div>
|
|
500
|
+
);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
function CreateJobModal({
|
|
504
|
+
onClose,
|
|
505
|
+
onSubmit,
|
|
506
|
+
editingJob,
|
|
507
|
+
}: {
|
|
508
|
+
onClose: () => void;
|
|
509
|
+
onSubmit: (data: CreateJobData) => Promise<void>;
|
|
510
|
+
editingJob?: PromptJob | null;
|
|
511
|
+
}) {
|
|
512
|
+
const [agents, setAgents] = useState<AgentOption[]>([]);
|
|
513
|
+
const [name, setName] = useState(editingJob?.name ?? "");
|
|
514
|
+
const [prompt, setPrompt] = useState(editingJob?.prompt ?? "");
|
|
515
|
+
const [agentId, setAgentId] = useState(editingJob?.agentId ?? "");
|
|
516
|
+
const [provider, setProvider] = useState(editingJob?.provider ?? "claude");
|
|
517
|
+
const [model, setModel] = useState(editingJob?.model ?? "");
|
|
518
|
+
|
|
519
|
+
useEffect(() => {
|
|
520
|
+
fetch("/api/prompt-jobs/agents")
|
|
521
|
+
.then((r) => r.json())
|
|
522
|
+
.then((d) => setAgents(d.agents ?? []))
|
|
523
|
+
.catch(() => {});
|
|
524
|
+
}, []);
|
|
525
|
+
const [cliArgs, setCliArgs] = useState(editingJob?.cliArgs ?? "");
|
|
526
|
+
const [cadence, setCadence] = useState(editingJob?.cadence ?? "");
|
|
527
|
+
const [cadenceLabel, setCadenceLabel] = useState(editingJob?.cadence ?? "");
|
|
528
|
+
const [triggerType, setTriggerType] = useState<"scheduled" | "condition">(
|
|
529
|
+
(editingJob?.triggerType as any) ?? "scheduled",
|
|
530
|
+
);
|
|
531
|
+
const [condition, setCondition] = useState(editingJob?.condition ?? "");
|
|
532
|
+
const [checkEveryMs, setCheckEveryMs] = useState(
|
|
533
|
+
editingJob?.checkEveryMs ?? 300000,
|
|
534
|
+
);
|
|
535
|
+
const [catchUpPolicy, setCatchUpPolicy] = useState<'fire_once' | 'replay_all' | 'skip'>(editingJob?.catchUpPolicy ?? 'fire_once');
|
|
536
|
+
const [showAdvanced, setShowAdvanced] = useState(!!editingJob?.cliArgs || (editingJob?.catchUpPolicy != null && editingJob.catchUpPolicy !== 'fire_once'));
|
|
537
|
+
const [submitting, setSubmitting] = useState(false);
|
|
538
|
+
|
|
539
|
+
const handleSubmit = async (e: React.FormEvent) => {
|
|
540
|
+
e.preventDefault();
|
|
541
|
+
if (!name.trim() || !prompt.trim()) return;
|
|
542
|
+
if (triggerType === "scheduled" && !cadence.trim()) return;
|
|
543
|
+
if (triggerType === "condition" && !condition.trim()) return;
|
|
544
|
+
setSubmitting(true);
|
|
545
|
+
await onSubmit({
|
|
546
|
+
name: name.trim(),
|
|
547
|
+
prompt: prompt.trim(),
|
|
548
|
+
agentId,
|
|
549
|
+
provider,
|
|
550
|
+
model: model.trim(),
|
|
551
|
+
cliArgs: cliArgs.trim(),
|
|
552
|
+
catchUpPolicy,
|
|
553
|
+
cadence: triggerType === "scheduled" ? cadence.trim() : "",
|
|
554
|
+
triggerType,
|
|
555
|
+
condition: condition.trim(),
|
|
556
|
+
checkEveryMs,
|
|
557
|
+
});
|
|
558
|
+
setSubmitting(false);
|
|
559
|
+
onClose();
|
|
560
|
+
};
|
|
561
|
+
|
|
562
|
+
const inputClass =
|
|
563
|
+
"w-full bg-[var(--muted)] border border-[var(--card-border)] rounded-lg px-3 py-2 text-sm text-[var(--foreground)] placeholder:text-[var(--muted-foreground)] focus:outline-none focus:border-[var(--foreground)] transition-colors";
|
|
564
|
+
const pillClass = (active: boolean) =>
|
|
565
|
+
`px-3 py-1.5 rounded-lg text-xs font-medium border transition-all cursor-pointer ${
|
|
566
|
+
active
|
|
567
|
+
? "bg-[var(--foreground)] text-[var(--background)] border-[var(--foreground)]"
|
|
568
|
+
: "bg-[var(--muted)] text-[var(--muted-foreground)] border-[var(--card-border)] hover:border-[var(--muted-foreground)] hover:text-[var(--foreground)]"
|
|
569
|
+
}`;
|
|
570
|
+
|
|
571
|
+
return (
|
|
572
|
+
<div className="h-full flex flex-col text-[var(--foreground)]">
|
|
573
|
+
<div className="h-14 shrink-0 border-b border-[var(--card-border)] flex items-center justify-between px-6">
|
|
574
|
+
<div className="flex items-center gap-3">
|
|
575
|
+
<button
|
|
576
|
+
onClick={onClose}
|
|
577
|
+
className="p-1.5 rounded-md text-[var(--muted-foreground)] hover:text-[var(--foreground)] hover:bg-[var(--muted)] transition-colors"
|
|
578
|
+
>
|
|
579
|
+
<X size={18} />
|
|
580
|
+
</button>
|
|
581
|
+
<h2 className="text-sm font-semibold">
|
|
582
|
+
{editingJob ? "Edit Prompt Job" : "New Prompt Job"}
|
|
583
|
+
</h2>
|
|
584
|
+
</div>
|
|
585
|
+
<button
|
|
586
|
+
onClick={handleSubmit as any}
|
|
587
|
+
disabled={submitting || !name.trim() || !prompt.trim()}
|
|
588
|
+
className="px-5 py-2 rounded-lg text-sm font-medium bg-[var(--foreground)] text-[var(--background)] hover:opacity-90 disabled:opacity-40 transition-opacity"
|
|
589
|
+
>
|
|
590
|
+
{submitting
|
|
591
|
+
? "Saving..."
|
|
592
|
+
: editingJob
|
|
593
|
+
? "Save Changes"
|
|
594
|
+
: "Create Job"}
|
|
595
|
+
</button>
|
|
596
|
+
</div>
|
|
597
|
+
|
|
598
|
+
<div className="flex flex-1 min-h-0 overflow-hidden">
|
|
599
|
+
<div className="flex-1 border-r border-[var(--card-border)] flex flex-col min-w-0">
|
|
600
|
+
<div className="px-8 pt-8 pb-4">
|
|
601
|
+
<input
|
|
602
|
+
type="text"
|
|
603
|
+
value={name}
|
|
604
|
+
onChange={(e) => setName(e.target.value)}
|
|
605
|
+
placeholder="Untitled job"
|
|
606
|
+
className="w-full text-2xl font-bold bg-transparent border-none outline-none placeholder:text-[var(--muted-foreground)]/40 text-[var(--foreground)]"
|
|
607
|
+
autoFocus
|
|
608
|
+
/>
|
|
609
|
+
</div>
|
|
610
|
+
<div className="flex-1 px-8 pb-8 overflow-y-auto">
|
|
611
|
+
<Label>Instructions</Label>
|
|
612
|
+
<div className="bg-[var(--card-bg)] border border-[var(--card-border)] rounded-xl overflow-hidden min-h-[300px]">
|
|
613
|
+
<RichTextEditor
|
|
614
|
+
content={prompt}
|
|
615
|
+
onChange={(md) => setPrompt(md)}
|
|
616
|
+
placeholder="Describe what this prompt should do..."
|
|
617
|
+
/>
|
|
618
|
+
</div>
|
|
619
|
+
</div>
|
|
620
|
+
</div>
|
|
621
|
+
|
|
622
|
+
<div className="w-[380px] shrink-0 overflow-y-auto p-6 space-y-6">
|
|
623
|
+
{/* Agent picker dropdown */}
|
|
624
|
+
<AgentDropdown
|
|
625
|
+
agents={agents}
|
|
626
|
+
value={agentId}
|
|
627
|
+
onChange={(id) => {
|
|
628
|
+
setAgentId(id);
|
|
629
|
+
const a = agents.find((a) => a.id === id);
|
|
630
|
+
if (a) {
|
|
631
|
+
setProvider(a.provider);
|
|
632
|
+
setModel(a.model ?? "");
|
|
633
|
+
} else {
|
|
634
|
+
setProvider("claude");
|
|
635
|
+
setModel("");
|
|
636
|
+
}
|
|
637
|
+
}}
|
|
638
|
+
/>
|
|
639
|
+
|
|
640
|
+
<div>
|
|
641
|
+
<Label>Trigger</Label>
|
|
642
|
+
<div className="flex rounded-lg border border-[var(--card-border)] overflow-hidden">
|
|
643
|
+
<button
|
|
644
|
+
type="button"
|
|
645
|
+
onClick={() => setTriggerType("scheduled")}
|
|
646
|
+
className={`flex-1 py-2.5 text-xs font-medium flex items-center justify-center gap-1.5 transition-colors ${triggerType === "scheduled" ? "bg-[var(--foreground)] text-[var(--background)]" : "bg-[var(--muted)] text-[var(--muted-foreground)] hover:text-[var(--foreground)]"}`}
|
|
647
|
+
>
|
|
648
|
+
<Calendar size={13} /> Schedule
|
|
649
|
+
</button>
|
|
650
|
+
<button
|
|
651
|
+
type="button"
|
|
652
|
+
onClick={() => setTriggerType("condition")}
|
|
653
|
+
className={`flex-1 py-2.5 text-xs font-medium flex items-center justify-center gap-1.5 transition-colors ${triggerType === "condition" ? "bg-[var(--foreground)] text-[var(--background)]" : "bg-[var(--muted)] text-[var(--muted-foreground)] hover:text-[var(--foreground)]"}`}
|
|
654
|
+
>
|
|
655
|
+
<Zap size={13} /> Condition
|
|
656
|
+
</button>
|
|
657
|
+
</div>
|
|
658
|
+
</div>
|
|
659
|
+
|
|
660
|
+
{triggerType === "scheduled" ? (
|
|
661
|
+
<ScheduleBuilder
|
|
662
|
+
value={cadence}
|
|
663
|
+
onChange={(cron, label) => {
|
|
664
|
+
setCadence(cron);
|
|
665
|
+
setCadenceLabel(label);
|
|
666
|
+
}}
|
|
667
|
+
/>
|
|
668
|
+
) : (
|
|
669
|
+
<>
|
|
670
|
+
<div>
|
|
671
|
+
<Label>Condition</Label>
|
|
672
|
+
<textarea
|
|
673
|
+
value={condition}
|
|
674
|
+
onChange={(e) => setCondition(e.target.value)}
|
|
675
|
+
placeholder="there are unread emails in my inbox"
|
|
676
|
+
rows={3}
|
|
677
|
+
className={`${inputClass} resize-none`}
|
|
678
|
+
/>
|
|
679
|
+
<p className="text-[10px] text-[var(--muted-foreground)] mt-1.5">
|
|
680
|
+
The LLM evaluates this as a gate. If true, the prompt runs.
|
|
681
|
+
</p>
|
|
682
|
+
</div>
|
|
683
|
+
<div>
|
|
684
|
+
<Label>Check frequency</Label>
|
|
685
|
+
<div className="flex flex-wrap gap-1.5">
|
|
686
|
+
{CHECK_PRESETS.map((preset) => (
|
|
687
|
+
<button
|
|
688
|
+
key={preset.ms}
|
|
689
|
+
type="button"
|
|
690
|
+
onClick={() => setCheckEveryMs(preset.ms)}
|
|
691
|
+
className={pillClass(checkEveryMs === preset.ms)}
|
|
692
|
+
>
|
|
693
|
+
{preset.label}
|
|
694
|
+
</button>
|
|
695
|
+
))}
|
|
696
|
+
</div>
|
|
697
|
+
</div>
|
|
698
|
+
</>
|
|
699
|
+
)}
|
|
700
|
+
|
|
701
|
+
<div>
|
|
702
|
+
<button
|
|
703
|
+
type="button"
|
|
704
|
+
onClick={() => setShowAdvanced(!showAdvanced)}
|
|
705
|
+
className="flex items-center gap-1.5 text-[11px] text-[var(--muted-foreground)] hover:text-[var(--foreground)] transition-colors"
|
|
706
|
+
>
|
|
707
|
+
<Settings2 size={12} /> {showAdvanced ? "Hide" : "Show"} advanced
|
|
708
|
+
<ChevronDown
|
|
709
|
+
size={12}
|
|
710
|
+
className={`transition-transform ${showAdvanced ? "rotate-180" : ""}`}
|
|
711
|
+
/>
|
|
712
|
+
</button>
|
|
713
|
+
{showAdvanced && (
|
|
714
|
+
<div className="mt-3 space-y-3 pt-3 border-t border-[var(--card-border)]">
|
|
715
|
+
<div>
|
|
716
|
+
<Label>CLI Arguments</Label>
|
|
717
|
+
<input
|
|
718
|
+
type="text"
|
|
719
|
+
value={cliArgs}
|
|
720
|
+
onChange={(e) => setCliArgs(e.target.value)}
|
|
721
|
+
placeholder="--dangerously-skip-permissions"
|
|
722
|
+
className={inputClass}
|
|
723
|
+
/>
|
|
724
|
+
<p className="text-[10px] text-[var(--muted-foreground)] mt-1">
|
|
725
|
+
Extra flags passed to the CLI command.
|
|
726
|
+
</p>
|
|
727
|
+
</div>
|
|
728
|
+
<div>
|
|
729
|
+
<Label>When missed</Label>
|
|
730
|
+
<div className="space-y-1.5">
|
|
731
|
+
{([
|
|
732
|
+
{ id: 'fire_once', label: 'Run once on recovery', desc: 'Execute a single run regardless of how many were missed' },
|
|
733
|
+
{ id: 'replay_all', label: 'Run all missed', desc: 'Queue one run per missed occurrence (use with caution)' },
|
|
734
|
+
{ id: 'skip', label: 'Skip and wait for next', desc: 'Discard missed runs, wait for the next scheduled time' },
|
|
735
|
+
] as const).map((opt) => (
|
|
736
|
+
<button key={opt.id} type="button" onClick={() => setCatchUpPolicy(opt.id)}
|
|
737
|
+
className={`w-full text-left px-3 py-2 rounded-lg border transition-all ${
|
|
738
|
+
catchUpPolicy === opt.id
|
|
739
|
+
? 'border-[var(--foreground)] bg-[var(--foreground)]/5'
|
|
740
|
+
: 'border-[var(--card-border)] bg-[var(--muted)] hover:border-[var(--muted-foreground)]'
|
|
741
|
+
}`}>
|
|
742
|
+
<div className="text-xs font-medium text-[var(--foreground)]">{opt.label}</div>
|
|
743
|
+
<div className="text-[10px] text-[var(--muted-foreground)]">{opt.desc}</div>
|
|
744
|
+
</button>
|
|
745
|
+
))}
|
|
746
|
+
</div>
|
|
747
|
+
</div>
|
|
748
|
+
</div>
|
|
749
|
+
)}
|
|
750
|
+
</div>
|
|
751
|
+
</div>
|
|
752
|
+
</div>
|
|
753
|
+
</div>
|
|
754
|
+
);
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
// ── Detail View (3-panel) ────────────────────────────────────────────────────
|
|
758
|
+
|
|
759
|
+
function JobDetailView({
|
|
760
|
+
job,
|
|
761
|
+
agentMap,
|
|
762
|
+
onBack,
|
|
763
|
+
onEdit,
|
|
764
|
+
onToggle,
|
|
765
|
+
onDelete,
|
|
766
|
+
onRunNow,
|
|
767
|
+
onCancelRun,
|
|
768
|
+
onUpdateAgent,
|
|
769
|
+
fetchRuns,
|
|
770
|
+
}: {
|
|
771
|
+
job: PromptJob;
|
|
772
|
+
agentMap: Record<string, AgentOption>;
|
|
773
|
+
onBack: () => void;
|
|
774
|
+
onEdit: () => void;
|
|
775
|
+
onToggle: () => void;
|
|
776
|
+
onDelete: () => void;
|
|
777
|
+
onRunNow: () => void;
|
|
778
|
+
onCancelRun: () => void;
|
|
779
|
+
onUpdateAgent: (agentId: string) => void;
|
|
780
|
+
fetchRuns: (jobId: string) => Promise<PromptRun[]>;
|
|
781
|
+
}) {
|
|
782
|
+
const [runs, setRuns] = useState<PromptRun[]>([]);
|
|
783
|
+
const [selectedRunId, setSelectedRunId] = useState<string | null>(null);
|
|
784
|
+
const agents = Object.values(agentMap);
|
|
785
|
+
const agentName =
|
|
786
|
+
job.agentId && agentMap[job.agentId] ? agentMap[job.agentId].name : null;
|
|
787
|
+
|
|
788
|
+
const loadRuns = useCallback(async () => {
|
|
789
|
+
const data = await fetchRuns(job.id);
|
|
790
|
+
setRuns(data);
|
|
791
|
+
if (data.length > 0 && !selectedRunId) setSelectedRunId(data[0].id);
|
|
792
|
+
}, [job.id, fetchRuns, selectedRunId]);
|
|
793
|
+
|
|
794
|
+
useEffect(() => {
|
|
795
|
+
loadRuns();
|
|
796
|
+
}, [loadRuns]);
|
|
797
|
+
// Auto-refresh runs
|
|
798
|
+
useEffect(() => {
|
|
799
|
+
const iv = setInterval(loadRuns, 5000);
|
|
800
|
+
return () => clearInterval(iv);
|
|
801
|
+
}, [loadRuns]);
|
|
802
|
+
|
|
803
|
+
const selectedRun = runs.find((r) => r.id === selectedRunId) ?? null;
|
|
804
|
+
const isRunning = job.lastOutcome === "running";
|
|
805
|
+
|
|
806
|
+
return (
|
|
807
|
+
<div className="h-full flex flex-col text-[var(--foreground)]">
|
|
808
|
+
{/* Top bar */}
|
|
809
|
+
<div className="shrink-0 flex items-center gap-3 border-b border-[var(--card-border)] px-4 py-3.5 pt-4">
|
|
810
|
+
<button
|
|
811
|
+
onClick={onBack}
|
|
812
|
+
className="inline-flex items-center gap-1.5 rounded-md border border-[var(--card-border)] px-2.5 py-1 text-[11px] text-[var(--muted-foreground)] transition-colors hover:bg-[var(--muted)] hover:text-[var(--foreground)]"
|
|
813
|
+
>
|
|
814
|
+
<ArrowLeft size={12} /> Back
|
|
815
|
+
</button>
|
|
816
|
+
<h2 className="text-[13px] font-semibold truncate">{job.name}</h2>
|
|
817
|
+
<span
|
|
818
|
+
className={`inline-block size-2 shrink-0 rounded-full ${statusDotColor[job.state] ?? "bg-zinc-500"}`}
|
|
819
|
+
/>
|
|
820
|
+
</div>
|
|
821
|
+
|
|
822
|
+
{/* 3-panel content */}
|
|
823
|
+
<div className="flex min-h-0 flex-1">
|
|
824
|
+
{/* LEFT: Job details */}
|
|
825
|
+
<div className="flex w-[260px] shrink-0 flex-col border-r border-[var(--card-border)] overflow-y-auto">
|
|
826
|
+
<div className="p-4 space-y-4">
|
|
827
|
+
{/* Actions */}
|
|
828
|
+
<div className="flex items-center gap-2">
|
|
829
|
+
<button
|
|
830
|
+
onClick={onRunNow}
|
|
831
|
+
disabled={isRunning}
|
|
832
|
+
className="inline-flex items-center gap-1.5 rounded-md border border-[var(--card-border)] px-2.5 py-1 text-[10px] font-bold uppercase tracking-[0.05em] text-[var(--muted-foreground)] transition-colors hover:text-[var(--foreground)] hover:border-[var(--foreground)] disabled:opacity-50"
|
|
833
|
+
>
|
|
834
|
+
<Play size={11} /> Run now
|
|
835
|
+
</button>
|
|
836
|
+
<button
|
|
837
|
+
onClick={onToggle}
|
|
838
|
+
type="button"
|
|
839
|
+
role="switch"
|
|
840
|
+
aria-checked={job.state === "active"}
|
|
841
|
+
title={job.state === "active" ? "Pause" : "Resume"}
|
|
842
|
+
className={`relative inline-flex h-[16px] w-[28px] shrink-0 cursor-pointer rounded-full border transition-colors ${
|
|
843
|
+
job.state === "active"
|
|
844
|
+
? "border-emerald-400/30 bg-emerald-500/40"
|
|
845
|
+
: "border-[var(--card-border)] bg-[var(--muted)]"
|
|
846
|
+
}`}
|
|
847
|
+
>
|
|
848
|
+
<span
|
|
849
|
+
className={`pointer-events-none absolute top-[2px] size-[10px] rounded-full bg-white/90 shadow-sm transition-transform ${
|
|
850
|
+
job.state === "active"
|
|
851
|
+
? "translate-x-[14px]"
|
|
852
|
+
: "translate-x-[2px]"
|
|
853
|
+
}`}
|
|
854
|
+
/>
|
|
855
|
+
</button>
|
|
856
|
+
{isRunning && (
|
|
857
|
+
<button
|
|
858
|
+
onClick={onCancelRun}
|
|
859
|
+
className="inline-flex items-center gap-1.5 rounded-md border border-[var(--card-border)] px-2.5 py-1 text-[10px] font-bold uppercase tracking-[0.05em] text-[var(--muted-foreground)] hover:text-red-400 hover:border-red-400/30 transition-colors"
|
|
860
|
+
>
|
|
861
|
+
Cancel
|
|
862
|
+
</button>
|
|
863
|
+
)}
|
|
864
|
+
<div className="ml-auto flex items-center gap-1">
|
|
865
|
+
<button
|
|
866
|
+
onClick={onEdit}
|
|
867
|
+
title="Edit"
|
|
868
|
+
className="p-1.5 rounded-md border border-[var(--card-border)] text-[var(--muted-foreground)] hover:text-[var(--foreground)] hover:border-[var(--foreground)] transition-colors"
|
|
869
|
+
>
|
|
870
|
+
<Pencil size={12} />
|
|
871
|
+
</button>
|
|
872
|
+
<button
|
|
873
|
+
onClick={onDelete}
|
|
874
|
+
title="Delete"
|
|
875
|
+
className="p-1.5 rounded-md border border-[var(--card-border)] text-[var(--muted-foreground)] hover:text-red-400 hover:border-red-400/30 transition-colors"
|
|
876
|
+
>
|
|
877
|
+
<Trash2 size={12} />
|
|
878
|
+
</button>
|
|
879
|
+
</div>
|
|
880
|
+
</div>
|
|
881
|
+
|
|
882
|
+
<div>
|
|
883
|
+
<div className="text-[10px] font-bold uppercase tracking-[0.12em] text-[var(--muted-foreground)] mb-1.5">
|
|
884
|
+
Status
|
|
885
|
+
</div>
|
|
886
|
+
<div
|
|
887
|
+
className={`text-[12px] font-semibold ${job.state === "active" ? "text-emerald-400" : job.state === "paused" ? "text-amber-400" : "text-[var(--muted-foreground)]"}`}
|
|
888
|
+
>
|
|
889
|
+
{job.state.charAt(0).toUpperCase() + job.state.slice(1)}
|
|
890
|
+
</div>
|
|
891
|
+
</div>
|
|
892
|
+
<AgentDropdown
|
|
893
|
+
agents={agents}
|
|
894
|
+
value={job.agentId}
|
|
895
|
+
onChange={onUpdateAgent}
|
|
896
|
+
/>
|
|
897
|
+
<div>
|
|
898
|
+
<div className="text-[10px] font-bold uppercase tracking-[0.12em] text-[var(--muted-foreground)] mb-1.5">
|
|
899
|
+
Trigger
|
|
900
|
+
</div>
|
|
901
|
+
<div className="text-[12px] text-[var(--foreground)]">
|
|
902
|
+
{job.triggerType === "condition"
|
|
903
|
+
? `Condition (every ${Math.round(job.checkEveryMs / 60000)}m)`
|
|
904
|
+
: job.cadence || job.cronExpr}
|
|
905
|
+
</div>
|
|
906
|
+
</div>
|
|
907
|
+
{job.condition && (
|
|
908
|
+
<div>
|
|
909
|
+
<div className="text-[10px] font-bold uppercase tracking-[0.12em] text-[var(--muted-foreground)] mb-1.5">
|
|
910
|
+
Condition
|
|
911
|
+
</div>
|
|
912
|
+
<div className="text-[12px] text-[var(--foreground)]">
|
|
913
|
+
{job.condition}
|
|
914
|
+
</div>
|
|
915
|
+
</div>
|
|
916
|
+
)}
|
|
917
|
+
<div>
|
|
918
|
+
<div className="text-[10px] font-bold uppercase tracking-[0.12em] text-[var(--muted-foreground)] mb-1.5">
|
|
919
|
+
Instructions
|
|
920
|
+
</div>
|
|
921
|
+
<div className="text-[11px] leading-[1.5] text-[var(--muted-foreground)] whitespace-pre-wrap break-words">
|
|
922
|
+
{job.prompt.length > 200
|
|
923
|
+
? job.prompt.slice(0, 200) + "..."
|
|
924
|
+
: job.prompt}
|
|
925
|
+
</div>
|
|
926
|
+
</div>
|
|
927
|
+
|
|
928
|
+
<div className="space-y-1.5">
|
|
929
|
+
{[
|
|
930
|
+
...(job.overlapPolicy !== "skip"
|
|
931
|
+
? [{ l: "Overlap", v: job.overlapPolicy }]
|
|
932
|
+
: []),
|
|
933
|
+
...(job.cliArgs ? [{ l: "CLI args", v: job.cliArgs }] : []),
|
|
934
|
+
{ l: "Next run", v: formatNextRun(job.nextRunAt, job.state) },
|
|
935
|
+
{
|
|
936
|
+
l: "Last run",
|
|
937
|
+
v: job.lastRunAt
|
|
938
|
+
? formatDate(new Date(job.lastRunAt).toISOString()) +
|
|
939
|
+
` (${job.lastOutcome ?? "—"})`
|
|
940
|
+
: "Never",
|
|
941
|
+
},
|
|
942
|
+
].map((item) => (
|
|
943
|
+
<div
|
|
944
|
+
key={item.l}
|
|
945
|
+
className="flex items-center justify-between rounded-md border border-[var(--card-border)] bg-[var(--muted)]/50 px-2.5 py-1.5 text-[11px]"
|
|
946
|
+
>
|
|
947
|
+
<span className="text-[var(--muted-foreground)]">
|
|
948
|
+
{item.l}
|
|
949
|
+
</span>
|
|
950
|
+
<span className="font-medium text-[var(--foreground)]">
|
|
951
|
+
{item.v}
|
|
952
|
+
</span>
|
|
953
|
+
</div>
|
|
954
|
+
))}
|
|
955
|
+
</div>
|
|
956
|
+
</div>
|
|
957
|
+
</div>
|
|
958
|
+
|
|
959
|
+
{/* MIDDLE: Run history */}
|
|
960
|
+
<div className="flex w-[240px] shrink-0 flex-col border-r border-[var(--card-border)] overflow-hidden">
|
|
961
|
+
<div className="border-b border-[var(--card-border)] px-3 py-2">
|
|
962
|
+
<div className="text-[10px] font-bold uppercase tracking-[0.12em] text-[var(--muted-foreground)]">
|
|
963
|
+
Run History{" "}
|
|
964
|
+
<span className="text-[var(--muted-foreground)]/50">
|
|
965
|
+
{runs.length}
|
|
966
|
+
</span>
|
|
967
|
+
</div>
|
|
968
|
+
</div>
|
|
969
|
+
<div className="min-h-0 flex-1 overflow-y-auto">
|
|
970
|
+
{runs.length === 0 ? (
|
|
971
|
+
<div className="p-4 text-center text-[11px] text-[var(--muted-foreground)]">
|
|
972
|
+
No runs yet
|
|
973
|
+
</div>
|
|
974
|
+
) : (
|
|
975
|
+
<div className="flex flex-col">
|
|
976
|
+
{runs.map((run) => {
|
|
977
|
+
const isSelected = selectedRunId === run.id;
|
|
978
|
+
return (
|
|
979
|
+
<button
|
|
980
|
+
key={run.id}
|
|
981
|
+
type="button"
|
|
982
|
+
onClick={() => setSelectedRunId(run.id)}
|
|
983
|
+
className={`flex items-start gap-2.5 px-3 py-2.5 text-left transition-colors border-l-2 ${
|
|
984
|
+
isSelected
|
|
985
|
+
? "bg-[var(--foreground)]/5 border-l-[var(--foreground)]"
|
|
986
|
+
: "border-l-transparent hover:bg-[var(--muted)]/30"
|
|
987
|
+
}`}
|
|
988
|
+
>
|
|
989
|
+
<span
|
|
990
|
+
className={`mt-1 inline-block size-2 shrink-0 rounded-full ${runStatusDot[run.status] ?? "bg-zinc-500"}`}
|
|
991
|
+
/>
|
|
992
|
+
<div className="min-w-0 flex-1">
|
|
993
|
+
<div className="text-[11px] font-medium text-[var(--foreground)] truncate">
|
|
994
|
+
{run.status === "running"
|
|
995
|
+
? "Running..."
|
|
996
|
+
: run.status.charAt(0).toUpperCase() +
|
|
997
|
+
run.status.slice(1)}
|
|
998
|
+
{run.durationMs != null &&
|
|
999
|
+
` · ${(run.durationMs / 1000).toFixed(1)}s`}
|
|
1000
|
+
</div>
|
|
1001
|
+
<div className="mt-0.5 flex items-center gap-2 text-[10px] text-[var(--muted-foreground)]">
|
|
1002
|
+
<span>
|
|
1003
|
+
{formatDate(run.startedAt ?? run.createdAt)}
|
|
1004
|
+
</span>
|
|
1005
|
+
</div>
|
|
1006
|
+
</div>
|
|
1007
|
+
</button>
|
|
1008
|
+
);
|
|
1009
|
+
})}
|
|
1010
|
+
</div>
|
|
1011
|
+
)}
|
|
1012
|
+
</div>
|
|
1013
|
+
</div>
|
|
1014
|
+
|
|
1015
|
+
{/* RIGHT: Selected run output */}
|
|
1016
|
+
<div className="flex min-w-0 flex-1 flex-col overflow-hidden">
|
|
1017
|
+
{selectedRun ? (
|
|
1018
|
+
<>
|
|
1019
|
+
<div className="flex items-center justify-between border-b border-[var(--card-border)] px-4 py-2">
|
|
1020
|
+
<div className="min-w-0">
|
|
1021
|
+
<div className="text-[12px] font-semibold text-[var(--foreground)] truncate">
|
|
1022
|
+
Run {selectedRun.id.slice(0, 8)}
|
|
1023
|
+
</div>
|
|
1024
|
+
<div className="text-[10px] text-[var(--muted-foreground)]">
|
|
1025
|
+
{selectedRun.status}{" "}
|
|
1026
|
+
{selectedRun.durationMs != null &&
|
|
1027
|
+
`· ${(selectedRun.durationMs / 1000).toFixed(1)}s`}
|
|
1028
|
+
</div>
|
|
1029
|
+
</div>
|
|
1030
|
+
</div>
|
|
1031
|
+
<div className="min-h-0 flex-1 overflow-y-auto px-4 py-3">
|
|
1032
|
+
{selectedRun.output ? (
|
|
1033
|
+
<div className="space-y-3">
|
|
1034
|
+
<div className="flex gap-2.5">
|
|
1035
|
+
<div className="shrink-0 mt-0.5">
|
|
1036
|
+
{job.agentId && agentMap[job.agentId] ? (
|
|
1037
|
+
<img
|
|
1038
|
+
src={agentAvatar(
|
|
1039
|
+
job.agentId,
|
|
1040
|
+
agentMap[job.agentId].color,
|
|
1041
|
+
28,
|
|
1042
|
+
)}
|
|
1043
|
+
alt=""
|
|
1044
|
+
className="size-7 rounded-full"
|
|
1045
|
+
/>
|
|
1046
|
+
) : (
|
|
1047
|
+
<div className="flex size-7 items-center justify-center rounded-full bg-[var(--muted)] text-[10px] text-[var(--muted-foreground)]">
|
|
1048
|
+
<Terminal size={12} />
|
|
1049
|
+
</div>
|
|
1050
|
+
)}
|
|
1051
|
+
</div>
|
|
1052
|
+
<div className="min-w-0 flex-1">
|
|
1053
|
+
<div className="mb-1">
|
|
1054
|
+
<span className="text-[11px] font-semibold text-[var(--foreground)]">
|
|
1055
|
+
{agentName ?? job.provider}
|
|
1056
|
+
</span>
|
|
1057
|
+
</div>
|
|
1058
|
+
<div className="rounded-lg px-3 py-2 text-[12px] leading-[1.55] bg-[var(--muted)] text-[var(--foreground)]">
|
|
1059
|
+
<div className="whitespace-pre-wrap break-words">
|
|
1060
|
+
{selectedRun.output}
|
|
1061
|
+
</div>
|
|
1062
|
+
</div>
|
|
1063
|
+
</div>
|
|
1064
|
+
</div>
|
|
1065
|
+
{selectedRun.error && (
|
|
1066
|
+
<div className="flex gap-2.5">
|
|
1067
|
+
<div className="shrink-0 mt-0.5">
|
|
1068
|
+
<div className="flex size-7 items-center justify-center rounded-full bg-red-500/10 text-[10px] text-red-400">
|
|
1069
|
+
!
|
|
1070
|
+
</div>
|
|
1071
|
+
</div>
|
|
1072
|
+
<div className="min-w-0 flex-1">
|
|
1073
|
+
<div className="rounded-lg px-3 py-2 text-[12px] leading-[1.55] bg-red-500/10 text-red-400">
|
|
1074
|
+
<div className="whitespace-pre-wrap break-words">
|
|
1075
|
+
{selectedRun.error}
|
|
1076
|
+
</div>
|
|
1077
|
+
</div>
|
|
1078
|
+
</div>
|
|
1079
|
+
</div>
|
|
1080
|
+
)}
|
|
1081
|
+
</div>
|
|
1082
|
+
) : (
|
|
1083
|
+
<div className="text-center py-12 text-[var(--muted-foreground)] text-sm">
|
|
1084
|
+
{selectedRun.status === "queued"
|
|
1085
|
+
? "Waiting to start..."
|
|
1086
|
+
: selectedRun.status === "running"
|
|
1087
|
+
? "Running..."
|
|
1088
|
+
: "No output captured"}
|
|
1089
|
+
</div>
|
|
1090
|
+
)}
|
|
1091
|
+
</div>
|
|
1092
|
+
</>
|
|
1093
|
+
) : (
|
|
1094
|
+
<div className="flex-1 flex items-center justify-center text-[var(--muted-foreground)] text-sm">
|
|
1095
|
+
{runs.length === 0
|
|
1096
|
+
? 'No runs yet. Click "Run now" to trigger one.'
|
|
1097
|
+
: "Select a run to view its output"}
|
|
1098
|
+
</div>
|
|
1099
|
+
)}
|
|
1100
|
+
</div>
|
|
1101
|
+
</div>
|
|
1102
|
+
</div>
|
|
1103
|
+
);
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
// ── Main Board ───────────────────────────────────────────────────────────────
|
|
1107
|
+
|
|
1108
|
+
export default function PromptJobBoard({ projectId }: { projectId?: string } = {}) {
|
|
1109
|
+
const {
|
|
1110
|
+
jobs, loading, refresh,
|
|
1111
|
+
createJob,
|
|
1112
|
+
updateJob,
|
|
1113
|
+
deleteJob,
|
|
1114
|
+
toggleJob,
|
|
1115
|
+
runNow,
|
|
1116
|
+
cancelRun,
|
|
1117
|
+
fetchRuns,
|
|
1118
|
+
} = usePromptJobs(projectId);
|
|
1119
|
+
|
|
1120
|
+
const [filter, setFilter] = useState("all");
|
|
1121
|
+
const [selectedId, setSelectedId] = useState<string | null>(null);
|
|
1122
|
+
const [showCreate, setShowCreate] = useState(false);
|
|
1123
|
+
const [editingJob, setEditingJob] = useState<PromptJob | null>(null);
|
|
1124
|
+
const [busy, setBusy] = useState<Record<string, boolean>>({});
|
|
1125
|
+
const [toast, setToast] = useState<string | null>(null);
|
|
1126
|
+
const [agentMap, setAgentMap] = useState<Record<string, AgentOption>>({});
|
|
1127
|
+
|
|
1128
|
+
useEffect(() => {
|
|
1129
|
+
fetch("/api/prompt-jobs/agents")
|
|
1130
|
+
.then((r) => r.json())
|
|
1131
|
+
.then((d) => {
|
|
1132
|
+
const map: Record<string, AgentOption> = {};
|
|
1133
|
+
for (const a of d.agents ?? []) map[a.id] = a;
|
|
1134
|
+
setAgentMap(map);
|
|
1135
|
+
})
|
|
1136
|
+
.catch(() => {});
|
|
1137
|
+
}, []);
|
|
1138
|
+
|
|
1139
|
+
const showToast = (message: string) => {
|
|
1140
|
+
setToast(message);
|
|
1141
|
+
setTimeout(() => setToast(null), 2500);
|
|
1142
|
+
};
|
|
1143
|
+
|
|
1144
|
+
const filteredJobs = jobs.filter(
|
|
1145
|
+
(j) => filter === "all" || j.state === filter,
|
|
1146
|
+
);
|
|
1147
|
+
const selected = jobs.find((j) => j.id === selectedId) ?? null;
|
|
1148
|
+
|
|
1149
|
+
const counts: Record<string, number> = {
|
|
1150
|
+
all: jobs.length,
|
|
1151
|
+
active: jobs.filter((j) => j.state === "active").length,
|
|
1152
|
+
paused: jobs.filter((j) => j.state === "paused").length,
|
|
1153
|
+
stopped: jobs.filter((j) => j.state === "stopped").length,
|
|
1154
|
+
};
|
|
1155
|
+
|
|
1156
|
+
const handleToggle = async (job: PromptJob) => {
|
|
1157
|
+
const ok = await toggleJob(job);
|
|
1158
|
+
if (ok)
|
|
1159
|
+
showToast(`${job.name} ${job.state === "active" ? "paused" : "resumed"}`);
|
|
1160
|
+
};
|
|
1161
|
+
|
|
1162
|
+
const handleRunNow = async (id: string, e?: React.MouseEvent) => {
|
|
1163
|
+
e?.stopPropagation();
|
|
1164
|
+
if (busy[id]) return;
|
|
1165
|
+
setBusy((prev) => ({ ...prev, [id]: true }));
|
|
1166
|
+
const ok = await runNow(id);
|
|
1167
|
+
setBusy((prev) => {
|
|
1168
|
+
const next = { ...prev };
|
|
1169
|
+
delete next[id];
|
|
1170
|
+
return next;
|
|
1171
|
+
});
|
|
1172
|
+
if (ok) showToast("Run triggered");
|
|
1173
|
+
};
|
|
1174
|
+
|
|
1175
|
+
const handleDelete = async (id: string) => {
|
|
1176
|
+
const ok = await deleteJob(id);
|
|
1177
|
+
if (ok) {
|
|
1178
|
+
if (selectedId === id) setSelectedId(null);
|
|
1179
|
+
showToast("Job deleted");
|
|
1180
|
+
}
|
|
1181
|
+
};
|
|
1182
|
+
|
|
1183
|
+
const handleCancelRun = async (id: string) => {
|
|
1184
|
+
const ok = await cancelRun(id);
|
|
1185
|
+
if (ok) showToast("Run cancelled");
|
|
1186
|
+
};
|
|
1187
|
+
|
|
1188
|
+
const handleCreateOrUpdate = async (data: CreateJobData) => {
|
|
1189
|
+
if (editingJob) {
|
|
1190
|
+
const ok = await updateJob(editingJob.id, data as any);
|
|
1191
|
+
if (ok) showToast(`Job "${data.name}" updated`);
|
|
1192
|
+
} else {
|
|
1193
|
+
const ok = await createJob({ ...data, projectId: projectId ?? '' });
|
|
1194
|
+
if (ok) showToast(`Job "${data.name}" created`);
|
|
1195
|
+
}
|
|
1196
|
+
};
|
|
1197
|
+
|
|
1198
|
+
// Toast overlay (shared across all views)
|
|
1199
|
+
const toastEl = toast && (
|
|
1200
|
+
<div className="fixed bottom-8 left-1/2 -translate-x-1/2 z-50 animate-in fade-in slide-in-from-bottom-2 duration-200">
|
|
1201
|
+
<div className="bg-[var(--card-bg)] border border-[var(--card-border)] px-4 py-2.5 rounded-xl shadow-lg flex items-center gap-2.5 text-sm font-medium">
|
|
1202
|
+
{toast}
|
|
1203
|
+
</div>
|
|
1204
|
+
</div>
|
|
1205
|
+
);
|
|
1206
|
+
|
|
1207
|
+
// ── Create/Edit view ──
|
|
1208
|
+
if (showCreate) {
|
|
1209
|
+
return (
|
|
1210
|
+
<>
|
|
1211
|
+
{toastEl}
|
|
1212
|
+
<CreateJobModal
|
|
1213
|
+
onClose={() => {
|
|
1214
|
+
setShowCreate(false);
|
|
1215
|
+
setEditingJob(null);
|
|
1216
|
+
}}
|
|
1217
|
+
onSubmit={handleCreateOrUpdate}
|
|
1218
|
+
editingJob={editingJob}
|
|
1219
|
+
/>
|
|
1220
|
+
</>
|
|
1221
|
+
);
|
|
1222
|
+
}
|
|
1223
|
+
|
|
1224
|
+
// ── Detail view (3-panel) ──
|
|
1225
|
+
if (selected) {
|
|
1226
|
+
return (
|
|
1227
|
+
<>
|
|
1228
|
+
{toastEl}
|
|
1229
|
+
<JobDetailView
|
|
1230
|
+
job={selected}
|
|
1231
|
+
agentMap={agentMap}
|
|
1232
|
+
onBack={() => setSelectedId(null)}
|
|
1233
|
+
onEdit={() => {
|
|
1234
|
+
setEditingJob(selected);
|
|
1235
|
+
setShowCreate(true);
|
|
1236
|
+
}}
|
|
1237
|
+
onToggle={() => handleToggle(selected)}
|
|
1238
|
+
onDelete={() => handleDelete(selected.id)}
|
|
1239
|
+
onRunNow={() => handleRunNow(selected.id)}
|
|
1240
|
+
onCancelRun={() => handleCancelRun(selected.id)}
|
|
1241
|
+
onUpdateAgent={async (agentId) => {
|
|
1242
|
+
const agent = agentMap[agentId];
|
|
1243
|
+
await updateJob(selected.id, {
|
|
1244
|
+
agentId,
|
|
1245
|
+
provider: agent?.provider ?? "claude",
|
|
1246
|
+
model: agent?.model ?? "",
|
|
1247
|
+
} as any);
|
|
1248
|
+
}}
|
|
1249
|
+
fetchRuns={fetchRuns}
|
|
1250
|
+
/>
|
|
1251
|
+
</>
|
|
1252
|
+
);
|
|
1253
|
+
}
|
|
1254
|
+
|
|
1255
|
+
// ── List view ──
|
|
1256
|
+
return (
|
|
1257
|
+
<div className="h-full flex flex-col text-[var(--foreground)]">
|
|
1258
|
+
{toastEl}
|
|
1259
|
+
|
|
1260
|
+
<div className="px-6 md:px-10 pt-6 pb-0">
|
|
1261
|
+
<div className="flex flex-col sm:flex-row justify-between items-start sm:items-end gap-4 mb-6">
|
|
1262
|
+
<div>
|
|
1263
|
+
<h1 className="text-2xl font-bold tracking-tight mb-1">
|
|
1264
|
+
Prompt Scheduler
|
|
1265
|
+
</h1>
|
|
1266
|
+
<p className="text-sm text-[var(--muted-foreground)]">
|
|
1267
|
+
{counts.active} active job{counts.active !== 1 ? "s" : ""}{" "}
|
|
1268
|
+
· {jobs.length} total
|
|
1269
|
+
</p>
|
|
1270
|
+
</div>
|
|
1271
|
+
<div className="flex items-center gap-2">
|
|
1272
|
+
<button
|
|
1273
|
+
onClick={() => refresh()}
|
|
1274
|
+
className="p-2 rounded-lg border border-[var(--card-border)] text-[var(--muted-foreground)] hover:text-[var(--foreground)] hover:border-[var(--foreground)] transition-colors"
|
|
1275
|
+
>
|
|
1276
|
+
<RefreshCw size={16} />
|
|
1277
|
+
</button>
|
|
1278
|
+
<button
|
|
1279
|
+
onClick={() => {
|
|
1280
|
+
setEditingJob(null);
|
|
1281
|
+
setShowCreate(true);
|
|
1282
|
+
}}
|
|
1283
|
+
className="bg-[var(--foreground)] text-[var(--background)] px-4 py-2 rounded-lg text-sm font-medium flex items-center gap-2 hover:opacity-90 transition-opacity"
|
|
1284
|
+
>
|
|
1285
|
+
<Plus size={16} /> New Job
|
|
1286
|
+
</button>
|
|
1287
|
+
</div>
|
|
1288
|
+
</div>
|
|
1289
|
+
|
|
1290
|
+
<div className="flex gap-4 border-b border-[var(--card-border)] pb-3">
|
|
1291
|
+
{(["all", "active", "paused", "stopped"] as const).map((f) => (
|
|
1292
|
+
<button
|
|
1293
|
+
key={f}
|
|
1294
|
+
onClick={() => setFilter(f)}
|
|
1295
|
+
className={`text-xs font-medium pb-1 transition-colors border-b-2 capitalize ${
|
|
1296
|
+
filter === f
|
|
1297
|
+
? "border-[var(--foreground)] text-[var(--foreground)]"
|
|
1298
|
+
: "border-transparent text-[var(--muted-foreground)] hover:text-[var(--foreground)]"
|
|
1299
|
+
}`}
|
|
1300
|
+
>
|
|
1301
|
+
{f}
|
|
1302
|
+
<span className="ml-1.5 text-[10px] text-[var(--muted-foreground)] font-mono">
|
|
1303
|
+
{counts[f]}
|
|
1304
|
+
</span>
|
|
1305
|
+
</button>
|
|
1306
|
+
))}
|
|
1307
|
+
</div>
|
|
1308
|
+
</div>
|
|
1309
|
+
|
|
1310
|
+
<div className="flex-1 min-h-0 px-6 md:px-10 py-6 overflow-y-auto">
|
|
1311
|
+
{loading && jobs.length === 0 ? (
|
|
1312
|
+
<div className="text-center py-12 text-[var(--muted-foreground)] text-sm">
|
|
1313
|
+
Loading jobs...
|
|
1314
|
+
</div>
|
|
1315
|
+
) : (
|
|
1316
|
+
<div className="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-3">
|
|
1317
|
+
{filteredJobs.map((job) => {
|
|
1318
|
+
const isBusy = busy[job.id];
|
|
1319
|
+
return (
|
|
1320
|
+
<div
|
|
1321
|
+
key={job.id}
|
|
1322
|
+
onClick={() => setSelectedId(job.id)}
|
|
1323
|
+
className="p-5 rounded-xl border border-[var(--card-border)] bg-[var(--card-bg)] hover:border-[var(--muted-foreground)] transition-all cursor-pointer"
|
|
1324
|
+
>
|
|
1325
|
+
<div className="flex justify-between items-start gap-3 mb-3">
|
|
1326
|
+
<div className="min-w-0">
|
|
1327
|
+
<h3 className="text-sm font-semibold truncate mb-1">
|
|
1328
|
+
{job.name}
|
|
1329
|
+
</h3>
|
|
1330
|
+
<StateBadge state={job.state} />
|
|
1331
|
+
</div>
|
|
1332
|
+
<div
|
|
1333
|
+
className="flex items-center gap-1.5 shrink-0"
|
|
1334
|
+
onClick={(e) => e.stopPropagation()}
|
|
1335
|
+
>
|
|
1336
|
+
<button
|
|
1337
|
+
onClick={(e) => { e.stopPropagation(); handleToggle(job); }}
|
|
1338
|
+
type="button"
|
|
1339
|
+
role="switch"
|
|
1340
|
+
aria-checked={job.state === 'active'}
|
|
1341
|
+
title={job.state === 'active' ? 'Pause' : 'Resume'}
|
|
1342
|
+
className={`relative inline-flex h-[14px] w-[24px] shrink-0 cursor-pointer rounded-full border transition-colors ${
|
|
1343
|
+
job.state === 'active' ? 'border-emerald-400/30 bg-emerald-500/40' : 'border-[var(--card-border)] bg-[var(--muted)]'
|
|
1344
|
+
}`}
|
|
1345
|
+
>
|
|
1346
|
+
<span className={`pointer-events-none absolute top-[1.5px] size-[9px] rounded-full bg-white/90 shadow-sm transition-transform ${
|
|
1347
|
+
job.state === 'active' ? 'translate-x-[11px]' : 'translate-x-[1.5px]'
|
|
1348
|
+
}`} />
|
|
1349
|
+
</button>
|
|
1350
|
+
<button
|
|
1351
|
+
onClick={(e) => handleRunNow(job.id, e)}
|
|
1352
|
+
disabled={isBusy}
|
|
1353
|
+
title="Run now"
|
|
1354
|
+
className={`p-1.5 rounded-md border text-[var(--muted-foreground)] transition-colors ${isBusy ? "border-[var(--card-border)] opacity-50 cursor-wait" : "border-[var(--card-border)] hover:text-[var(--foreground)] hover:border-[var(--muted-foreground)]"}`}
|
|
1355
|
+
>
|
|
1356
|
+
<Play
|
|
1357
|
+
size={12}
|
|
1358
|
+
className={isBusy ? "animate-pulse" : "fill-current"}
|
|
1359
|
+
/>
|
|
1360
|
+
</button>
|
|
1361
|
+
<button
|
|
1362
|
+
onClick={(e) => {
|
|
1363
|
+
e.stopPropagation();
|
|
1364
|
+
handleDelete(job.id);
|
|
1365
|
+
}}
|
|
1366
|
+
title="Delete"
|
|
1367
|
+
className="p-1.5 rounded-md border border-[var(--card-border)] text-[var(--muted-foreground)] hover:text-red-500 hover:border-red-500/30 transition-colors"
|
|
1368
|
+
>
|
|
1369
|
+
<Trash2 size={12} />
|
|
1370
|
+
</button>
|
|
1371
|
+
</div>
|
|
1372
|
+
</div>
|
|
1373
|
+
|
|
1374
|
+
<p className="text-[12px] text-[var(--muted-foreground)] leading-relaxed line-clamp-2 mb-3">
|
|
1375
|
+
{job.prompt}
|
|
1376
|
+
</p>
|
|
1377
|
+
|
|
1378
|
+
<div className="pt-3 border-t border-[var(--card-border)]/50 flex items-center gap-4 text-[11px] text-[var(--muted-foreground)]">
|
|
1379
|
+
<span className="flex items-center gap-1">
|
|
1380
|
+
{job.agentId && agentMap[job.agentId] ? (
|
|
1381
|
+
<>
|
|
1382
|
+
<img
|
|
1383
|
+
src={agentAvatar(
|
|
1384
|
+
job.agentId,
|
|
1385
|
+
agentMap[job.agentId].color,
|
|
1386
|
+
16,
|
|
1387
|
+
)}
|
|
1388
|
+
alt=""
|
|
1389
|
+
className="size-4 rounded-full"
|
|
1390
|
+
/>
|
|
1391
|
+
{agentMap[job.agentId].name}
|
|
1392
|
+
</>
|
|
1393
|
+
) : (
|
|
1394
|
+
<>
|
|
1395
|
+
<Terminal size={11} />
|
|
1396
|
+
{job.provider}
|
|
1397
|
+
</>
|
|
1398
|
+
)}
|
|
1399
|
+
</span>
|
|
1400
|
+
{job.triggerType === "condition" && (
|
|
1401
|
+
<span className="text-[10px] px-1.5 py-0.5 rounded bg-purple-500/10 text-purple-400 border border-purple-400/20">
|
|
1402
|
+
condition
|
|
1403
|
+
</span>
|
|
1404
|
+
)}
|
|
1405
|
+
<span className="flex items-center gap-1">
|
|
1406
|
+
<Clock size={11} />
|
|
1407
|
+
{formatNextRun(job.nextRunAt, job.state)}
|
|
1408
|
+
</span>
|
|
1409
|
+
<span
|
|
1410
|
+
className="ml-auto font-mono truncate max-w-[120px]"
|
|
1411
|
+
title={job.cadence || job.cronExpr}
|
|
1412
|
+
>
|
|
1413
|
+
{job.triggerType === "condition"
|
|
1414
|
+
? `every ${Math.round(job.checkEveryMs / 60000)}m`
|
|
1415
|
+
: job.cadence || job.cronExpr}
|
|
1416
|
+
</span>
|
|
1417
|
+
</div>
|
|
1418
|
+
</div>
|
|
1419
|
+
);
|
|
1420
|
+
})}
|
|
1421
|
+
|
|
1422
|
+
{filteredJobs.length === 0 && (
|
|
1423
|
+
<div className="md:col-span-2 xl:col-span-3 text-center py-12 text-[var(--muted-foreground)] text-sm border border-dashed border-[var(--card-border)] rounded-xl">
|
|
1424
|
+
{jobs.length === 0
|
|
1425
|
+
? "No prompt jobs yet. Create one to get started."
|
|
1426
|
+
: "No jobs match the selected filter."}
|
|
1427
|
+
</div>
|
|
1428
|
+
)}
|
|
1429
|
+
</div>
|
|
1430
|
+
)}
|
|
1431
|
+
</div>
|
|
1432
|
+
</div>
|
|
1433
|
+
);
|
|
1434
|
+
}
|