@mndrk/agx 2.4.6 → 2.4.8
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/apps/local/.next/BUILD_ID +1 -1
- package/cloud-runtime/standalone/apps/local/.next/app-path-routes-manifest.json +4 -0
- package/cloud-runtime/standalone/apps/local/.next/build-manifest.json +2 -2
- package/cloud-runtime/standalone/apps/local/.next/prerender-manifest.json +3 -3
- package/cloud-runtime/standalone/apps/local/.next/routes-manifest.json +33 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents/[id]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents/[id]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/agents/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/agents.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/agent-specs/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/agents/[id]/profile/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/agents/export/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/chat/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/file-search/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/participants/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/activities/route.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/activities/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/notes/[noteId]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/notes/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/program/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/program/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/program/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/program/route.js +13 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/program/route.js.map +5 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/program/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/program/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/scheduled-tasks/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/validate/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/worker/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/search/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/teams/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/export/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/export/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/export/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/export/route.js +11 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/export/route.js.map +5 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/export/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/export/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/import/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/import/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/import/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/import/route.js +11 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/import/route.js.map +5 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/import/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/import/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/prompt-jobs/poll/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/providers/check/[id]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/providers/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/queue/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/schedules/debug/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/schedules/poll/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/assign/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/available/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/detail/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/history/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/learn/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/unlearn/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/status/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/summarize/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/comments/[commentId]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/comments/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/nodes/[nodeId]/verify/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/threads/knowledge/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/threads/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/items/[id]/recap/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/runs/scripted/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/status/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/update-check/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/_full.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/integrations/github/select-repos/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/integrations/github/select-repos.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/integrations/github.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/integrations.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/automations/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/automations/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/env-vars/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/env-vars/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/graph/[taskId]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/graph/[taskId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/notifications/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/notifications/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/[objectiveId]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/[objectiveId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/prs/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/prs/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/agents/[agentId]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/agents/[agentId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/adopt/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/adopt/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/new/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/new/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/replace/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/replace/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/terminal/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/terminal/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/[threadId]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/[threadId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/page/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/page/build-manifest.json +18 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/page/next-font-manifest.json +11 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/page/react-loadable-manifest.json +1 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/page/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/page.js +16 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/page.js.map +5 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/page.js.nft.json +1 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/page_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/[tracker]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/[tracker]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/connect/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/connect/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/projects/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/projects.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/setup.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/status/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_full.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/status/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/status.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app-paths-manifest.json +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/30bdd_server_app_api_projects_[id]_workspace_export_route_actions_e161f108.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/30bdd_server_app_api_projects_[id]_workspace_import_route_actions_10d2bce2.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/7255d_app_api_projects_[id]_objectives_[objectiveId]_program_route_actions_e6cdbc76.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__1563ebff._.js +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__3fdd57cb._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__45af4365._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__683b7ad7._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__736d5859._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__96b5ea56._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__ba72d342._.js +5 -5
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__c3188470._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__eb69343e._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_1d99e7a5._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_29a06140._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_4d88e4dc._.js +91 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_4dec65a2._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_50e3a6e3._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_56a2544c._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_5843a1a1._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_a15e73a6._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_bd72806a._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_c101ba9e._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_c530bd77._.js +11 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_d69937f2._.js +91 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_e2867b32._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_e32b0cab._.js +91 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_5ab8f104._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_db_ts_77c23d6c._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/0da96_local__next-internal_server_app_projects_[slug]_thread_page_actions_3ceeb59b.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__1e0fd816._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__42499ecf._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__5f31e40b._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__636799fb._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{[root-of-the-server]__4bf7d5b9._.js → [root-of-the-server]__74436f61._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__9434d6d7._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__bd339da0._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__d08d7899._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__e02a457c._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__e3a1fef0._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__f802e7d1._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__ff96bb77._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_6a2ba8f0._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_7cb6b08a._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_a0f42923._.js +7 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_a93c1059._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{apps_local_components_PromptJobBoard_tsx_281b2873._.js → apps_local_04cb9fd5._.js} +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_15502af8._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_16eaf7ae._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_3c11c068._.js +8 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_89b49aad._.js +7 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_988d29c0._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_ae1a134f._.js +7 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_agents_page_tsx_2a02508d._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_folders_page_tsx_72fb68e5._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_layout_tsx_3bb31889._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_page_tsx_76330306._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_b8e580cc._.js +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_TrackerBoard_tsx_98970bab._.js +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{apps_local_app_projects_[slug]_thread_[threadId]_page_tsx_2a1d1d5e._.js → apps_local_components_chat-ui_ChatContainer_tsx_47371955._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_projects_ProjectObjectivesWorkspace_tsx_751ab3d3._.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_eb223411._.js +18 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_eec36ab6._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{apps_local_7d1abfbf._.js → apps_local_f1c9872a._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_fed01721._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/functions-config-manifest.json +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/middleware-manifest.json +5 -5
- package/cloud-runtime/standalone/apps/local/.next/server/next-font-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/next-font-manifest.json +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/pages/404.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/pages/500.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/server-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/server-reference-manifest.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/08e75b35d6c52269.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0d22a723b9b96e65.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{cb19d71dd7ffb935.js → 1585dd5f9ec4866a.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/1bc8cc9cbb99c1ed.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/2586c0baa16e9a0d.js +16 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/2aa24a251622fd06.js +5 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/39513207112d6828.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/3fce625820bc2bd4.js +16 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{8d8fe711583a59f0.js → 41ae15220fc19bf7.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/67b36c70b72e0e10.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/7bfbfcd072f8d61e.js +20 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/7cf26dd04166f32f.js +6 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{74e3a3e93be78db8.js → 8b87c2521c519a1f.js} +9 -9
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/90dd4ab03ab145d1.js +16 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/93749b45e2700808.js +16 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{48feca51cf97c8a7.js → 9bb8f1406365af81.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/b4aa71020acae46f.js +16 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/c352706a0ad7e35d.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/c5436b2b7e8f0ca9.js +16 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{1600dd6ff8607d8f.js → c9a2c4b55bb76f4f.js} +6 -6
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{1fbcd40dccee738f.js → cf33cb29946990e3.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/d6a9cc66254693b8.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{9e703dd5d95e9557.js → e3bdd1e0f385114e.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/ed606d6f94457578.css +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{6ffcd12eabd7c65e.js → f71d73895d228547.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/f750d2f1882d31a8.js +5 -0
- package/cloud-runtime/standalone/apps/local/app/api/automations/route.ts +2 -10
- package/cloud-runtime/standalone/apps/local/app/api/projects/[id]/objectives/[objectiveId]/program/route.ts +77 -0
- package/cloud-runtime/standalone/apps/local/app/api/projects/[id]/workspace/export/route.ts +35 -0
- package/cloud-runtime/standalone/apps/local/app/api/projects/[id]/workspace/import/route.ts +91 -0
- package/cloud-runtime/standalone/apps/local/app/api/prompt-jobs/route.ts +1 -8
- package/cloud-runtime/standalone/apps/local/app/projects/[slug]/layout.tsx +1 -1
- package/cloud-runtime/standalone/apps/local/app/projects/[slug]/thread/page.tsx +14 -0
- package/cloud-runtime/standalone/apps/local/components/AutomationsBoard.tsx +15 -15
- package/cloud-runtime/standalone/apps/local/components/PromptJobBoard.tsx +7 -12
- package/cloud-runtime/standalone/apps/local/components/TrackerBoard.tsx +39 -1
- package/cloud-runtime/standalone/apps/local/components/projects/FoldersSummaryCard.tsx +51 -196
- package/cloud-runtime/standalone/apps/local/components/projects/FoldersView.tsx +662 -784
- package/cloud-runtime/standalone/apps/local/components/projects/ObjectiveScheduledTasksPanel.tsx +7 -10
- package/cloud-runtime/standalone/apps/local/components/projects/ProjectHome.tsx +4 -4
- package/cloud-runtime/standalone/apps/local/components/projects/ProjectObjectivesWorkspace.tsx +118 -0
- package/cloud-runtime/standalone/apps/local/components/projects/ProjectSettings.tsx +81 -7
- package/cloud-runtime/standalone/apps/local/components/thread/WorkspaceSidebar.tsx +13 -3
- package/cloud-runtime/standalone/apps/local/components/tracking/TrackerSetup.tsx +22 -14
- package/cloud-runtime/standalone/apps/local/hooks/useProjectWorkspace.ts +117 -0
- package/cloud-runtime/standalone/apps/local/lib/db/projects.ts +14 -10
- package/cloud-runtime/standalone/apps/local/lib/project-workspace.ts +80 -0
- package/cloud-runtime/standalone/apps/local/lib/task-context.ts +39 -4
- package/cloud-runtime/standalone/apps/local/lib/tracker/adapters/github/adapter.tsx +40 -4
- package/cloud-runtime/standalone/apps/local/lib/workspace-yaml.ts +164 -0
- package/cloud-runtime/standalone/apps/local/src/objectives/program/index.ts +7 -0
- package/cloud-runtime/standalone/apps/local/src/objectives/program/repository.ts +60 -0
- package/cloud-runtime/standalone/apps/local/src/prompt-scheduler/objective-worker.ts +12 -0
- package/cloud-runtime/standalone/apps/local/src/scheduling/status.ts +42 -0
- package/cloud-runtime/standalone/apps/local/worker/index.js +14 -9
- package/lib/commands/workspace.js +145 -7
- package/package.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_09d85861._.js +0 -91
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_25136564._.js +0 -11
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_2caf4398._.js +0 -91
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_31ca7a35._.js +0 -91
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/9fb8c_lucide-react_dist_esm_icons_8c8ee1bc._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__23838f87._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__3b4708d5._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__49cbf624._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__49cdd178._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__55ed4ff9._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__7a31a76d._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__a61463b8._.js +0 -7
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__bb42490f._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__ee9351f9._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0ecd68e8._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_347d036d._.js +0 -7
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_5c140c38._.js +0 -7
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_f99c22fd._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_30d021de._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_3b90cb76._.js +0 -18
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_9f36c765._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_8cc1a335._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/1d8b2726979134e5.js +0 -16
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/692103d55fcd0328.js +0 -5
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/6952b44e247d594a.js +0 -16
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/6bfdc40a24e65ca2.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/7ff071e8a33d2fd8.js +0 -16
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/87e4fb11329a358d.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/92467c495ad08a85.js +0 -5
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/941f7f3626ec442c.js +0 -16
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/94a66d2d19268d25.js +0 -5
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/add53c2fe147af75.css +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/b35865f64b56d6f4.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/d662272e49df1950.js +0 -20
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/e0d68c6af17c8c87.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/f154e2ed7753f8ee.js +0 -16
- /package/cloud-runtime/standalone/apps/local/.next/static/{fipnHmd6JPn9sTuFdYS0y → O3Yu8lY-DN5fauB8GipIL}/_buildManifest.js +0 -0
- /package/cloud-runtime/standalone/apps/local/.next/static/{fipnHmd6JPn9sTuFdYS0y → O3Yu8lY-DN5fauB8GipIL}/_clientMiddlewareManifest.json +0 -0
- /package/cloud-runtime/standalone/apps/local/.next/static/{fipnHmd6JPn9sTuFdYS0y → O3Yu8lY-DN5fauB8GipIL}/_ssgManifest.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,640481,e=>{"use strict";let r=(0,e.i(363732).default)("pencil",[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]);e.s(["Pencil",()=>r],640481)},794731,e=>{"use strict";let r=(0,e.i(363732).default)("trash-2",[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]]);e.s(["Trash2",()=>r],794731)},80673,e=>{"use strict";let r=(0,e.i(363732).default)("download",[["path",{d:"M12 15V3",key:"m9g1x1"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["path",{d:"m7 10 5 5 5-5",key:"brsn70"}]]);e.s(["Download",()=>r],80673)},257587,e=>{"use strict";let r=(0,e.i(363732).default)("settings",[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",key:"1i5ecw"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);e.s(["Settings",()=>r],257587)},693646,e=>{"use strict";let r=(0,e.i(363732).default)("save",[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]]);e.s(["Save",()=>r],693646)},459073,e=>{"use strict";let r=(0,e.i(363732).default)("folder-plus",[["path",{d:"M12 10v6",key:"1bos4e"}],["path",{d:"M9 13h6",key:"1uhe8q"}],["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}]]);e.s(["FolderPlus",()=>r],459073)},666946,e=>{"use strict";let r=(0,e.i(363732).default)("upload",[["path",{d:"M12 3v12",key:"1x0j5s"}],["path",{d:"m17 8-5-5-5 5",key:"7q97r8"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}]]);e.s(["Upload",()=>r],666946)},116e3,11354,370326,e=>{"use strict";var r=e.i(935851);let a=["repositories","docs","config","scripts"],t=[{id:"repositories",label:"Repositories",icon:"GitBranch"},{id:"docs",label:"Docs",icon:"FileText"},{id:"config",label:"Config",icon:"Settings"},{id:"scripts",label:"Scripts",icon:"Terminal"}],s=t.map(e=>({...e})),o=new Map(t.map(e=>[e.id,e]));function l(e){let r=o.get(e);return r?{...r}:null}function n(e){let r=e.trim(),a=r?l(r):null;return a?a.label:r?r.replace(/[_-]+/g," ").replace(/\s+/g," ").replace(/\b\w/g,e=>e.toUpperCase()):"Custom"}function d(e){return[...e].sort((e,r)=>e.sort_order!==r.sort_order?e.sort_order-r.sort_order:e.name.localeCompare(r.name))}function i(e){return Object.values(e).reduce((e,r)=>e+r.length,0)}function c(e,r=[]){return[...s.map(r=>{let a=d(e[r.id]??[]);return{id:r.id,label:r.label,entries:a,isPreset:!0,isEmpty:0===a.length}}),...[...new Set([...Object.keys(e),...r])].map(e=>e.trim()).filter(e=>e.length>0).filter(e=>!a.includes(e)).sort((e,r)=>n(e).localeCompare(n(r))).map(r=>{let a=d(e[r]??[]);return{id:r,label:n(r),entries:a,isPreset:!1,isEmpty:0===a.length}})]}async function u(e,r){let a=await e.json().catch(()=>({}));return"string"==typeof a.error?a.error:r}function p(e){let[a,t]=(0,r.useState)({}),[s,o]=(0,r.useState)(!1),[l,n]=(0,r.useState)(null),d=(0,r.useCallback)(async()=>{if(!e){t({}),o(!1),n(null);return}o(!0);try{let r=await fetch(`/api/projects/${e}/workspace`);if(!r.ok)throw Error(await u(r,"Failed to fetch workspace map"));let a=await r.json();t(a.workspace??{}),n(null)}catch(e){n(e instanceof Error?e:Error("Unknown error"))}finally{o(!1)}},[e]);(0,r.useEffect)(()=>{d()},[d]);let c=(0,r.useCallback)(async r=>{let a=await fetch(`/api/projects/${e}/workspace`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});if(!a.ok)throw Error(await u(a,"Failed to create workspace entry"));let t=await a.json();return await d(),t.entry},[d,e]),p=(0,r.useCallback)(async(r,a)=>{let t=await fetch(`/api/projects/${e}/workspace/${r}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});if(!t.ok)throw Error(await u(t,"Failed to update workspace entry"));let s=await t.json();return await d(),s.entry},[d,e]),m=(0,r.useCallback)(async r=>{let a=await fetch(`/api/projects/${e}/workspace/${r}`,{method:"DELETE"});if(!a.ok)throw Error(await u(a,"Failed to delete workspace entry"));await d()},[d,e]);return{workspace:a,entryCount:i(a),isLoading:s,error:l,refetch:d,createEntry:c,updateEntry:p,deleteEntry:m}}e.s(["DEFAULT_WORKSPACE_CATEGORIES",0,s,"WORKSPACE_CATEGORY_IDS",0,a,"getWorkspaceCategory",()=>l],11354),e.s(["buildWorkspaceCategoryGroups",()=>c,"countWorkspaceEntries",()=>i],370326),e.s(["useProjectWorkspace",()=>p],116e3)},982057,e=>{"use strict";var r=e.i(762281),a=e.i(935851),t=e.i(80673),s=e.i(575479),o=e.i(55236),l=e.i(196630),n=e.i(459073),d=e.i(906724),i=e.i(640481),c=e.i(929870),u=e.i(693646),p=e.i(257587),m=e.i(99296),x=e.i(794731),b=e.i(666946),g=e.i(797167),h=e.i(116e3),v=e.i(370326),f=e.i(11354);function y(e,r){switch(e){case"repositories":return"Repository";case"docs":return"Doc";case"config":return"Config";case"scripts":return"Script";default:return r}}function k(e,r){return{category:e,name:r?.name??"",path:r?.path??"",purpose:r?.purpose??"",error:null,isSaving:!1}}function j(e){switch(e){case"repositories":return l.FolderGit2;case"docs":return s.FileText;case"config":return p.Settings;case"scripts":return m.TerminalSquare;default:return o.Folder}}function w({projectId:e}){let{workspace:s,entryCount:o,isLoading:p,error:m,refetch:w,createEntry:N,updateEntry:C,deleteEntry:S}=(0,h.useProjectWorkspace)(e),[E,P]=(0,a.useState)([]),[T,A]=(0,a.useState)(null),[M,F]=(0,a.useState)(k("repositories")),[L,$]=(0,a.useState)(null),[O,W]=(0,a.useState)(null),[D,R]=(0,a.useState)(!1),[U,_]=(0,a.useState)(""),[G,H]=(0,a.useState)(null),I=(0,a.useRef)(null),Y=(0,v.buildWorkspaceCategoryGroups)(s,E),B=0===o&&0===E.length&&!T,V=(0,a.useCallback)((e,r="neutral")=>{H({tone:r,message:e}),window.setTimeout(()=>H(null),3500)},[]),q=(0,a.useCallback)(async()=>{let e=await fetch("/api/filesystem/pick-folder",{method:"POST"}),r=await e.json().catch(()=>({}));if(!e.ok)throw Error("string"==typeof r.error?r.error:"Failed to open folder picker");return"string"==typeof r.path?r.path:null},[]),z=(0,a.useCallback)(()=>{A(null),F(k("repositories"))},[]),K=(0,a.useCallback)(e=>{A(e),F(k(e)),$(null),W(null)},[]),J=(0,a.useCallback)(e=>{$(e.id),W(k(e.category,e)),A(null),F(k(e.category))},[]),X=(0,a.useCallback)(()=>{$(null),W(null)},[]),Z=(0,a.useCallback)(async()=>{let e=M.name.trim();if(!e)return void F(e=>({...e,error:"Name is required"}));F(e=>({...e,isSaving:!0,error:null}));try{await N({category:M.category,name:e,path:M.path.trim()||null,purpose:M.purpose.trim()||null}),z(),V(`Added ${e} to ${Y.find(e=>e.id===M.category)?.label??"workspace map"}`,"success")}catch(e){F(r=>({...r,isSaving:!1,error:e instanceof Error?e.message:"Failed to add workspace entry"}))}},[M,z,N,Y,V]),Q=(0,a.useCallback)(async()=>{if(!L||!O)return;let e=O.name.trim();if(!e)return void W(e=>e?{...e,error:"Name is required"}:e);W(e=>e?{...e,isSaving:!0,error:null}:e);try{await C(L,{name:e,path:O.path.trim()||null,purpose:O.purpose.trim()||null}),X(),V("Workspace entry updated","success")}catch(e){W(r=>({...r??k(""),isSaving:!1,error:e instanceof Error?e.message:"Failed to update workspace entry"}))}},[X,O,L,V,C]),ee=(0,a.useCallback)(async e=>{if(window.confirm(`Delete ${e.name} from ${e.category}?`))try{await S(e.id),L===e.id&&X(),V(`Deleted ${e.name}`,"success")}catch(e){V(e instanceof Error?e.message:"Failed to delete workspace entry","error")}},[X,S,L,V]),er=(0,a.useCallback)(async()=>{try{let e=await q();e&&F(r=>({...r,path:e,error:null}))}catch(e){F(r=>({...r,error:e instanceof Error?e.message:"Failed to pick folder"}))}},[q]),ea=(0,a.useCallback)(async()=>{if(O)try{let e=await q();e&&W(r=>r?{...r,path:e,error:null}:r)}catch(e){W(r=>r?{...r,error:e instanceof Error?e.message:"Failed to pick folder"}:r)}},[O,q]),et=(0,a.useCallback)(async e=>{try{let r=await q();if(!r)return;await C(e.id,{path:r}),V(`Updated path for ${e.name}`,"success")}catch(e){V(e instanceof Error?e.message:"Failed to update path","error")}},[q,V,C]),es=(0,a.useCallback)(()=>{let e=U.trim();if(!e)return;let r=Y.find(r=>r.id.toLowerCase()===e.toLowerCase()||r.label.toLowerCase()===e.toLowerCase());if(r){_(""),R(!1),K(r.id);return}P(r=>[...r,e]),_(""),R(!1),K(e)},[U,Y,K]),eo=(0,a.useCallback)(e=>{P(r=>r.filter(r=>r!==e)),T===e&&z()},[T,z]),el=(0,a.useCallback)(()=>{window.open(`/api/projects/${e}/workspace/export`,"_blank")},[e]),en=(0,a.useCallback)(async r=>{let a=r.target.files?.[0];if(a)try{let r=await a.text(),t=await fetch(`/api/projects/${e}/workspace/import`,{method:"POST",headers:{"Content-Type":"application/x-yaml"},body:r});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error("string"==typeof e.error?e.error:"Failed to import workspace YAML")}await w(),V("Imported workspace YAML","success")}catch(e){V(e instanceof Error?e.message:"Failed to import workspace YAML","error")}finally{I.current&&(I.current.value="")}},[e,w,V]);return(0,r.jsx)("div",{className:"h-full overflow-y-auto",children:(0,r.jsxs)("div",{className:"mx-auto flex max-w-5xl flex-col gap-6 px-6 py-8",children:[(0,r.jsxs)("section",{className:"rounded-3xl border border-[var(--card-border)] bg-[var(--card-bg)] p-6 shadow-sm",children:[(0,r.jsxs)("div",{className:"flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between",children:[(0,r.jsxs)("div",{className:"max-w-2xl",children:[(0,r.jsxs)("div",{className:"mb-3 flex items-center gap-2 text-[11px] font-semibold uppercase tracking-[0.2em] text-[var(--muted-foreground)]",children:[(0,r.jsx)(l.FolderGit2,{className:"h-3.5 w-3.5"}),"Project Setup"]}),(0,r.jsx)("h1",{className:"text-2xl font-semibold text-[var(--foreground)]",children:"Workspace Map"}),(0,r.jsx)("p",{className:"mt-2 text-sm leading-6 text-[var(--muted-foreground)]",children:"Map your project's folders so agents know where things live. Group repositories, docs, config, and scripts into a workspace that people and automation can navigate without guesswork."})]}),(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,r.jsxs)("button",{type:"button",onClick:()=>R(e=>!e),className:"inline-flex items-center gap-2 rounded-xl border border-[var(--border)] bg-[var(--background)] px-3 py-2 text-sm text-[var(--foreground)] transition-colors hover:bg-[var(--secondary)]",children:[(0,r.jsx)(n.FolderPlus,{className:"h-4 w-4"}),"Add Category"]}),(0,r.jsxs)("button",{type:"button",onClick:el,className:"inline-flex items-center gap-2 rounded-xl border border-[var(--border)] bg-[var(--background)] px-3 py-2 text-sm text-[var(--foreground)] transition-colors hover:bg-[var(--secondary)]",children:[(0,r.jsx)(t.Download,{className:"h-4 w-4"}),"Export YAML"]}),(0,r.jsxs)("label",{className:"inline-flex cursor-pointer items-center gap-2 rounded-xl border border-[var(--border)] bg-[var(--background)] px-3 py-2 text-sm text-[var(--foreground)] transition-colors hover:bg-[var(--secondary)]",children:[(0,r.jsx)(b.Upload,{className:"h-4 w-4"}),"Import YAML",(0,r.jsx)("input",{ref:I,type:"file",accept:".yaml,.yml",onChange:en,className:"hidden"})]})]})]}),D&&(0,r.jsxs)("div",{className:"mt-4 flex flex-col gap-2 rounded-2xl border border-[var(--border)] bg-[var(--secondary)]/30 p-4 md:flex-row md:items-center",children:[(0,r.jsx)("input",{value:U,onChange:e=>_(e.target.value),placeholder:"Custom category name",className:"flex-1 rounded-xl border border-[var(--border)] bg-[var(--background)] px-3 py-2 text-sm text-[var(--foreground)]"}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("button",{type:"button",onClick:es,disabled:!U.trim(),className:"rounded-xl bg-[var(--foreground)] px-4 py-2 text-sm font-medium text-[var(--background)] disabled:opacity-40",children:"Create Category"}),(0,r.jsx)("button",{type:"button",onClick:()=>{R(!1),_("")},className:"rounded-xl px-3 py-2 text-sm text-[var(--muted-foreground)] transition-colors hover:text-[var(--foreground)]",children:"Cancel"})]})]}),G&&(0,r.jsx)("p",{className:`mt-4 text-sm ${"error"===G.tone?"text-[var(--destructive)]":"success"===G.tone?"text-emerald-500":"text-[var(--muted-foreground)]"}`,children:G.message})]}),p&&(0,r.jsx)("section",{className:"rounded-3xl border border-[var(--card-border)] bg-[var(--card-bg)] p-8",children:(0,r.jsxs)("div",{className:"flex items-center gap-3 text-sm text-[var(--muted-foreground)]",children:[(0,r.jsx)(d.Loader2,{className:"h-4 w-4 animate-spin"}),"Loading workspace map..."]})}),!p&&m&&(0,r.jsx)("section",{className:"rounded-3xl border border-[var(--card-border)] bg-[var(--card-bg)] p-8",children:(0,r.jsxs)("div",{className:"space-y-3",children:[(0,r.jsx)("p",{className:"text-sm text-[var(--destructive)]",children:m.message||"Failed to load workspace map"}),(0,r.jsx)("button",{type:"button",onClick:()=>void w(),className:"rounded-xl border border-[var(--border)] bg-[var(--background)] px-3 py-2 text-sm text-[var(--foreground)] transition-colors hover:bg-[var(--secondary)]",children:"Try Again"})]})}),!p&&!m&&B&&(0,r.jsx)("section",{className:"rounded-3xl border border-dashed border-[var(--border)] bg-[var(--card-bg)] p-10 text-center",children:(0,r.jsxs)("div",{className:"mx-auto max-w-2xl",children:[(0,r.jsx)("h2",{className:"text-xl font-semibold text-[var(--foreground)]",children:"Tell your agents where things live."}),(0,r.jsx)("p",{className:"mt-3 text-sm leading-6 text-[var(--muted-foreground)]",children:"Add folders to your workspace so agents can find and work in the right places. Start with a repository, docs, or config, or import a shared workspace definition."}),(0,r.jsxs)("div",{className:"mt-6 flex flex-wrap items-center justify-center gap-3",children:[f.DEFAULT_WORKSPACE_CATEGORIES.slice(0,3).map(e=>{let a=j(e.id);return(0,r.jsxs)("button",{type:"button",onClick:()=>K(e.id),className:"inline-flex items-center gap-2 rounded-xl border border-[var(--border)] bg-[var(--background)] px-4 py-2 text-sm text-[var(--foreground)] transition-colors hover:bg-[var(--secondary)]",children:[(0,r.jsx)(a,{className:"h-4 w-4"}),"Add ",y(e.id,e.label)]},e.id)}),(0,r.jsxs)("label",{className:"inline-flex cursor-pointer items-center gap-2 rounded-xl border border-[var(--border)] bg-[var(--background)] px-4 py-2 text-sm text-[var(--foreground)] transition-colors hover:bg-[var(--secondary)]",children:[(0,r.jsx)(b.Upload,{className:"h-4 w-4"}),"Import YAML",(0,r.jsx)("input",{type:"file",accept:".yaml,.yml",onChange:en,className:"hidden"})]})]})]})}),!p&&!m&&!B&&(0,r.jsx)("div",{className:"space-y-4",children:Y.map(e=>{let a=j(e.id);return(0,r.jsxs)("section",{className:"rounded-3xl border border-[var(--card-border)] bg-[var(--card-bg)] p-6",children:[(0,r.jsxs)("div",{className:"flex flex-col gap-4 border-b border-[var(--border)] pb-4 md:flex-row md:items-start md:justify-between",children:[(0,r.jsxs)("div",{className:"flex items-start gap-3",children:[(0,r.jsx)("div",{className:"rounded-2xl border border-[var(--border)] bg-[var(--secondary)]/40 p-3",children:(0,r.jsx)(a,{className:"h-5 w-5 text-[var(--muted-foreground)]"})}),(0,r.jsxs)("div",{children:[(0,r.jsx)("h2",{className:"text-lg font-semibold text-[var(--foreground)]",children:e.label}),(0,r.jsx)("p",{className:"text-sm text-[var(--muted-foreground)]",children:e.entries.length>0?`${e.entries.length} location${1===e.entries.length?"":"s"} mapped`:e.isPreset?`No ${e.label.toLowerCase()} mapped yet`:"Custom category ready for entries"})]})]}),(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[!e.isPreset&&e.isEmpty&&(0,r.jsxs)("button",{type:"button",onClick:()=>eo(e.id),className:"inline-flex items-center gap-2 rounded-xl border border-[var(--border)] bg-[var(--background)] px-3 py-2 text-sm text-[var(--muted-foreground)] transition-colors hover:text-[var(--destructive)]",children:[(0,r.jsx)(x.Trash2,{className:"h-4 w-4"}),"Remove Empty Category"]}),(0,r.jsxs)("button",{type:"button",onClick:()=>K(e.id),className:"inline-flex items-center gap-2 rounded-xl border border-[var(--border)] bg-[var(--background)] px-3 py-2 text-sm text-[var(--foreground)] transition-colors hover:bg-[var(--secondary)]",children:[(0,r.jsx)(c.Plus,{className:"h-4 w-4"}),"Add to ",e.label]})]})]}),(0,r.jsxs)("div",{className:"mt-4 space-y-3",children:[0===e.entries.length&&T!==e.id&&(0,r.jsx)("p",{className:"rounded-2xl border border-dashed border-[var(--border)] px-4 py-5 text-sm text-[var(--muted-foreground)]",children:e.isPreset?`Start this section by adding a ${y(e.id,e.label).toLowerCase()} and selecting a folder on disk.`:"This custom category is empty until you add its first folder."}),e.entries.map(e=>{let a=L===e.id&&O;return(0,r.jsxs)("div",{className:"rounded-2xl border border-[var(--border)] bg-[var(--secondary)]/20 p-4",children:[!a&&(0,r.jsxs)("div",{className:"flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between",children:[(0,r.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,r.jsx)("div",{className:"flex items-center gap-2",children:(0,r.jsx)("p",{className:"text-base font-medium text-[var(--foreground)]",children:e.name})}),(0,r.jsx)("p",{className:"mt-2 break-all font-mono text-xs text-[var(--muted-foreground)]",children:e.path||"No path selected yet"}),(0,r.jsx)("p",{className:"mt-3 text-sm leading-6 text-[var(--muted-foreground)]",children:e.purpose||"No purpose documented yet."})]}),(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,r.jsx)("button",{type:"button",onClick:()=>void et(e),className:"rounded-xl border border-[var(--border)] bg-[var(--background)] px-3 py-2 text-sm text-[var(--foreground)] transition-colors hover:bg-[var(--secondary)]",children:"Browse"}),(0,r.jsxs)("button",{type:"button",onClick:()=>J(e),className:"inline-flex items-center gap-2 rounded-xl border border-[var(--border)] bg-[var(--background)] px-3 py-2 text-sm text-[var(--foreground)] transition-colors hover:bg-[var(--secondary)]",children:[(0,r.jsx)(i.Pencil,{className:"h-4 w-4"}),"Edit"]}),(0,r.jsxs)("button",{type:"button",onClick:()=>void ee(e),className:"inline-flex items-center gap-2 rounded-xl border border-[var(--border)] bg-[var(--background)] px-3 py-2 text-sm text-[var(--muted-foreground)] transition-colors hover:text-[var(--destructive)]",children:[(0,r.jsx)(x.Trash2,{className:"h-4 w-4"}),"Delete"]})]})]}),a&&O&&(0,r.jsxs)("div",{className:"space-y-3",children:[(0,r.jsxs)("div",{className:"grid gap-3 md:grid-cols-2",children:[(0,r.jsxs)("label",{className:"block",children:[(0,r.jsx)("span",{className:"mb-1 block text-[11px] font-semibold uppercase tracking-[0.18em] text-[var(--muted-foreground)]",children:"Name"}),(0,r.jsx)("input",{value:O.name,onChange:e=>W(r=>r?{...r,name:e.target.value,error:null}:r),className:"w-full rounded-xl border border-[var(--border)] bg-[var(--background)] px-3 py-2 text-sm text-[var(--foreground)]"})]}),(0,r.jsxs)("label",{className:"block",children:[(0,r.jsx)("span",{className:"mb-1 block text-[11px] font-semibold uppercase tracking-[0.18em] text-[var(--muted-foreground)]",children:"Path"}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("input",{value:O.path,onChange:e=>W(r=>r?{...r,path:e.target.value,error:null}:r),className:"w-full rounded-xl border border-[var(--border)] bg-[var(--background)] px-3 py-2 text-sm text-[var(--foreground)]",placeholder:"/Users/you/Projects/repo"}),(0,r.jsx)("button",{type:"button",onClick:()=>void ea(),className:"rounded-xl border border-[var(--border)] bg-[var(--background)] px-3 py-2 text-sm text-[var(--foreground)] transition-colors hover:bg-[var(--secondary)]",children:"Browse"})]})]})]}),(0,r.jsxs)("label",{className:"block",children:[(0,r.jsx)("span",{className:"mb-1 block text-[11px] font-semibold uppercase tracking-[0.18em] text-[var(--muted-foreground)]",children:"Purpose"}),(0,r.jsx)("textarea",{value:O.purpose,onChange:e=>W(r=>r?{...r,purpose:e.target.value,error:null}:r),className:"min-h-24 w-full rounded-xl border border-[var(--border)] bg-[var(--background)] px-3 py-3 text-sm text-[var(--foreground)]",placeholder:"What should agents or teammates expect in this folder?"})]}),O.error&&(0,r.jsx)("p",{className:"text-sm text-[var(--destructive)]",children:O.error}),(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,r.jsxs)("button",{type:"button",onClick:()=>void Q(),disabled:O.isSaving,className:"inline-flex items-center gap-2 rounded-xl bg-[var(--foreground)] px-4 py-2 text-sm font-medium text-[var(--background)] disabled:opacity-40",children:[O.isSaving?(0,r.jsx)(d.Loader2,{className:"h-4 w-4 animate-spin"}):(0,r.jsx)(u.Save,{className:"h-4 w-4"}),"Save Changes"]}),(0,r.jsxs)("button",{type:"button",onClick:X,className:"inline-flex items-center gap-2 rounded-xl px-3 py-2 text-sm text-[var(--muted-foreground)] transition-colors hover:text-[var(--foreground)]",children:[(0,r.jsx)(g.X,{className:"h-4 w-4"}),"Cancel"]})]})]})]},e.id)}),T===e.id&&(0,r.jsxs)("div",{className:"rounded-2xl border border-[var(--border)] bg-[var(--background)] p-4",children:[(0,r.jsxs)("div",{className:"mb-3 flex items-center gap-2",children:[(0,r.jsx)(c.Plus,{className:"h-4 w-4 text-[var(--muted-foreground)]"}),(0,r.jsxs)("p",{className:"text-sm font-medium text-[var(--foreground)]",children:["Add to ",e.label]})]}),(0,r.jsxs)("div",{className:"grid gap-3 md:grid-cols-2",children:[(0,r.jsxs)("label",{className:"block",children:[(0,r.jsx)("span",{className:"mb-1 block text-[11px] font-semibold uppercase tracking-[0.18em] text-[var(--muted-foreground)]",children:"Name"}),(0,r.jsx)("input",{value:M.name,onChange:e=>F(r=>({...r,name:e.target.value,error:null})),className:"w-full rounded-xl border border-[var(--border)] bg-[var(--card-bg)] px-3 py-2 text-sm text-[var(--foreground)]",placeholder:"backend, handbook, deploy"})]}),(0,r.jsxs)("label",{className:"block",children:[(0,r.jsx)("span",{className:"mb-1 block text-[11px] font-semibold uppercase tracking-[0.18em] text-[var(--muted-foreground)]",children:"Path"}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("input",{value:M.path,onChange:e=>F(r=>({...r,path:e.target.value,error:null})),className:"w-full rounded-xl border border-[var(--border)] bg-[var(--card-bg)] px-3 py-2 text-sm text-[var(--foreground)]",placeholder:"/Users/you/Projects/repo"}),(0,r.jsx)("button",{type:"button",onClick:()=>void er(),className:"rounded-xl border border-[var(--border)] bg-[var(--card-bg)] px-3 py-2 text-sm text-[var(--foreground)] transition-colors hover:bg-[var(--secondary)]",children:"Browse"})]})]})]}),(0,r.jsxs)("label",{className:"mt-3 block",children:[(0,r.jsx)("span",{className:"mb-1 block text-[11px] font-semibold uppercase tracking-[0.18em] text-[var(--muted-foreground)]",children:"Purpose"}),(0,r.jsx)("textarea",{value:M.purpose,onChange:e=>F(r=>({...r,purpose:e.target.value,error:null})),className:"min-h-24 w-full rounded-xl border border-[var(--border)] bg-[var(--card-bg)] px-3 py-3 text-sm text-[var(--foreground)]",placeholder:"Describe what lives here and why it matters."})]}),M.error&&(0,r.jsx)("p",{className:"mt-3 text-sm text-[var(--destructive)]",children:M.error}),(0,r.jsxs)("div",{className:"mt-4 flex flex-wrap items-center gap-2",children:[(0,r.jsxs)("button",{type:"button",onClick:()=>void Z(),disabled:M.isSaving,className:"inline-flex items-center gap-2 rounded-xl bg-[var(--foreground)] px-4 py-2 text-sm font-medium text-[var(--background)] disabled:opacity-40",children:[M.isSaving?(0,r.jsx)(d.Loader2,{className:"h-4 w-4 animate-spin"}):(0,r.jsx)(u.Save,{className:"h-4 w-4"}),"Save Entry"]}),(0,r.jsxs)("button",{type:"button",onClick:z,className:"inline-flex items-center gap-2 rounded-xl px-3 py-2 text-sm text-[var(--muted-foreground)] transition-colors hover:text-[var(--foreground)]",children:[(0,r.jsx)(g.X,{className:"h-4 w-4"}),"Cancel"]})]})]})]})]},e.id)})})]})})}var N=e.i(524123);function C({params:e}){let{slug:t}=(0,a.use)(e),{projects:s}=(0,N.useProjectsWithAgents)(),o=s.find(e=>e.slug===t);return o?(0,r.jsx)(w,{projectId:o.id}):(0,r.jsx)("div",{className:"flex items-center justify-center h-full text-sm text-zinc-500",children:"Loading..."})}e.s(["default",()=>C],982057)}]);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,568656,e=>{"use strict";var t=e.i(762281),r=e.i(307241),a=e.i(506420),s=e.i(935851),o=e.i(958164),n=e.i(429056),i=e.i(417442),l=e.i(363732);let d=(0,l.default)("calendar-clock",[["path",{d:"M16 14v2.2l1.6 1",key:"fo4ql5"}],["path",{d:"M16 2v4",key:"4m81vk"}],["path",{d:"M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5",key:"1osxxc"}],["path",{d:"M3 10h5",key:"r794hk"}],["path",{d:"M8 2v4",key:"1cmpym"}],["circle",{cx:"16",cy:"16",r:"6",key:"qoo3c4"}]]);var c=e.i(529471),u=e.i(580873),m=e.i(575479),p=e.i(640481),x=e.i(929870),h=e.i(8707),b=e.i(794731),f=e.i(169610),v=e.i(572665),g=e.i(519132),j=e.i(797167),y=e.i(524123),k=e.i(945028),w=e.i(490011),N=e.i(984242),S=e.i(208343),C=e.i(133232),$=e.i(884564),I=e.i(423709),A=e.i(40527),T=e.i(378764);let E=(0,l.default)("pause",[["rect",{x:"14",y:"3",width:"5",height:"18",rx:"1",key:"kaeet6"}],["rect",{x:"5",y:"3",width:"5",height:"18",rx:"1",key:"1wsw3u"}]]);var O=e.i(245900),M=e.i(558201),P=e.i(437307),R=e.i(715908),L=e.i(790185),D=e.i(553069),F=e.i(827430),_=e.i(352687);function z(e){return(0,L.isScheduledRunOverdue)({state:e.state,nextScheduledAt:e.nextRunAt,lastCompletedAt:e.lastRunAt})}function U({projectId:e,objectiveId:r,objectiveKey:a,createDefaults:o,onCreateTask:n}){let{jobs:i,loading:l,refresh:d,deleteJob:m,toggleJob:h,updateJob:f,fetchRuns:v,runNow:g}=(0,R.usePromptJobs)(e,{requireProjectId:!0,includeObjectiveJobs:!0,objectiveId:r}),[j,y]=(0,s.useState)(!1),[k,w]=(0,s.useState)(null),[N,S]=(0,s.useState)(null),[C,$]=(0,s.useState)(null),[I,A]=(0,s.useState)(null),[T,L]=(0,s.useState)([]),[U,J]=(0,s.useState)({});(0,s.useEffect)(()=>{fetch("/api/prompt-jobs/agents").then(e=>e.json()).then(e=>{let t={};for(let r of e.agents??[])t[r.id]=r;J(t)}).catch(e=>console.warn("[ObjectiveScheduledTasksPanel] fetch agents failed:",e))},[]);let q=(0,s.useMemo)(()=>i.filter(e=>e.objectiveId===r).sort((e,t)=>!e.name.toLowerCase().includes("objective worker")-!t.name.toLowerCase().includes("objective worker")),[i,r]),V=(0,s.useMemo)(()=>q.find(e=>e.id===C)??null,[C,q]),W=(0,s.useCallback)(async()=>{if(0===q.length)return void L([]);let e=[];await Promise.all(q.map(async t=>{for(let r of(await v(t.id)))e.push({...r,jobName:t.name})})),e.sort((e,t)=>new Date(t.startedAt??t.createdAt).getTime()-new Date(e.startedAt??e.createdAt).getTime()),L(e.slice(0,10))},[q,v]);(0,s.useEffect)(()=>{W()},[W]);let H=async e=>{w(e.id),S(null);let t=await m(e.id);(w(null),t.ok)?await d():S(t.error??`Failed to hide "${e.name}".`)},B=async e=>{S(null);let t=await n(e);return t&&await d(),t},K=(0,s.useCallback)(async(e,t)=>{let r=await f(e,t);return r&&await d(),r},[d,f]);return(0,t.jsxs)(t.Fragment,{children:[j?(0,t.jsx)("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50 px-4 py-6",children:(0,t.jsx)("div",{className:"w-full max-w-5xl h-[85vh] overflow-hidden rounded-[28px] border border-[var(--border)] bg-[var(--card-bg)] shadow-2xl",children:(0,t.jsx)(F.CreateJobModal,{onClose:()=>y(!1),onSubmit:async e=>{await B(e)},createDefaults:o,contextLabel:a})})}):null,V?(0,t.jsx)("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50 px-4 py-6",children:(0,t.jsx)("div",{className:"w-full max-w-5xl h-[85vh] overflow-hidden rounded-[28px] border border-[var(--border)] bg-[var(--card-bg)] shadow-2xl",children:(0,t.jsx)(F.CreateJobModal,{onClose:()=>$(null),onSubmit:async e=>{await K(V.id,e)},editingJob:V,contextLabel:a})})}):null,(0,t.jsxs)("div",{className:"px-1",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-sm font-semibold text-[var(--foreground)]",children:"Scheduled Jobs"}),(0,t.jsxs)("p",{className:"mt-1 text-sm text-[var(--muted-foreground)]",children:["Shared scheduled-task list filtered to objective label"," ",(0,t.jsx)("span",{className:"font-mono text-[var(--foreground)]",children:a}),"."]})]}),(0,t.jsx)("div",{className:"flex flex-wrap items-center gap-2",children:(0,t.jsxs)("button",{type:"button",onClick:()=>y(!0),className:"inline-flex items-center gap-2 rounded-xl border border-[var(--border)] px-3 py-2 text-sm text-[var(--foreground)] transition-colors hover:border-[var(--card-hover-border)]",children:[(0,t.jsx)(x.Plus,{className:"h-4 w-4"}),"New task"]})})]}),N?(0,t.jsx)("p",{className:"mt-4 text-sm text-[var(--destructive)]",children:N}):null,(0,t.jsx)("div",{className:"mt-5 space-y-3",children:l&&0===q.length?(0,t.jsx)("div",{className:"rounded-2xl border border-dashed border-[var(--border)] px-4 py-8 text-sm text-[var(--muted-foreground)]",children:"Loading scheduled tasks..."}):0===q.length?(0,t.jsx)("div",{className:"rounded-2xl border border-dashed border-[var(--border)] px-4 py-8 text-sm text-[var(--muted-foreground)]",children:"No scheduled tasks for this objective yet."}):q.map(e=>{var r,a;let s;return(0,t.jsx)("div",{onClick:()=>$(e.id),onKeyDown:t=>{("Enter"===t.key||" "===t.key)&&(t.preventDefault(),$(e.id))},role:"button",tabIndex:0,className:`block w-full rounded-2xl border px-4 py-4 text-left transition-colors focus:outline-none focus:ring-2 focus:ring-[var(--card-hover-border)] ${z(e)?"border-amber-500/40 bg-amber-500/5 hover:border-amber-500/60":"border-[var(--border)] bg-[var(--overlay-panel-muted)] hover:border-[var(--card-hover-border)]"}`,children:(0,t.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2.5",children:[(0,t.jsx)("span",{className:`inline-block size-2 shrink-0 rounded-full ${"active"===e.state?"bg-emerald-400":"paused"===e.state?"bg-amber-400":"bg-[var(--tone-neutral)]"}`}),(0,t.jsx)("p",{className:"truncate text-sm font-semibold text-[var(--foreground)]",children:e.name}),(0,t.jsx)("span",{className:`rounded-full border px-2 py-0.5 text-[10px] font-semibold uppercase tracking-[0.16em] ${"active"===(r=e.state)?"border-[var(--status-completed-border)] bg-[var(--status-completed-bg)] text-[var(--status-completed)]":"paused"===r?"border-[var(--status-blocked-border)] bg-[var(--status-blocked-bg)] text-[var(--status-blocked)]":"border-[var(--tone-neutral-border)] bg-[var(--tone-neutral-bg)] text-[var(--tone-neutral)]"}`,children:"active"===(a=e.state)?"Active":"paused"===a?"Paused":"Stopped"}),z(e)&&(0,t.jsxs)("span",{className:"shrink-0 text-[10px] font-semibold uppercase tracking-[0.16em] text-amber-400 bg-amber-500/10 px-2 py-0.5 rounded-full border border-amber-500/20 inline-flex items-center gap-1",children:[(0,t.jsx)(u.Clock,{className:"h-3 w-3"}),"overdue"]})]}),(0,t.jsxs)("div",{className:"mt-2 flex flex-wrap items-center gap-3 text-xs text-[var(--muted-foreground)]",children:[(0,t.jsxs)("span",{className:`inline-flex items-center gap-1.5 ${z(e)?"text-amber-400 font-medium":""}`,children:[(0,t.jsx)(u.Clock,{className:"h-3.5 w-3.5"}),"Next run ",function(e,t){if("paused"===t)return"Paused";if("stopped"===t)return"Stopped";if(null===e)return"Pending";let r=e-Date.now();return r<0?"Overdue":r<6e4?`in ${Math.round(r/1e3)}s`:r<36e5?`in ${Math.round(r/6e4)}m`:r<864e5?`in ${Math.round(r/36e5)}h`:`in ${Math.round(r/864e5)}d`}(e.nextRunAt,e.state)]}),(0,t.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:[(0,t.jsx)(u.Clock,{className:"h-3.5 w-3.5"}),(s=e.cadence||e.cronExpr)?(0,D.cronToHuman)(e.cronExpr||s)??s:"No frequency"]}),e.condition?(0,t.jsx)("span",{className:"rounded-md border border-blue-400/20 bg-blue-500/10 px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wider text-blue-400",children:"gated"}):null]}),(0,t.jsxs)("div",{className:"mt-3 flex items-center gap-2 min-w-0 text-xs text-[var(--muted-foreground)]",children:[e.agentId&&U[e.agentId]?(0,t.jsx)("img",{src:(0,F.agentAvatar)(e.agentId,U[e.agentId].color,20),alt:"",className:"size-5 rounded-full shrink-0"}):(0,t.jsx)(M.Terminal,{className:"h-3.5 w-3.5 shrink-0"}),(0,t.jsx)("span",{className:"truncate font-medium text-[var(--foreground)]",children:e.agentId&&U[e.agentId]?U[e.agentId].name:e.provider}),e.model?(0,t.jsx)("span",{className:"truncate font-mono text-[11px]",children:e.model}):null]}),e.condition?(0,t.jsxs)("p",{className:"mt-2 text-xs text-[var(--muted-foreground)]",children:["Condition: ",e.condition]}):null]}),(0,t.jsxs)("div",{className:"flex items-center gap-1.5 shrink-0",children:[(0,t.jsx)("button",{type:"button",title:"Run now",onClick:async t=>{t.stopPropagation(),w(e.id),await g(e.id),w(null),await d(),await W()},disabled:k===e.id,className:"rounded-lg border border-[var(--border)] p-2 text-[var(--muted-foreground)] transition-colors hover:border-emerald-400/40 hover:text-emerald-300 disabled:cursor-not-allowed disabled:opacity-50",children:(0,t.jsx)(O.Play,{className:"h-3.5 w-3.5 fill-current"})}),(0,t.jsx)("button",{type:"button",title:"Edit",onClick:t=>{t.stopPropagation(),$(e.id)},className:"rounded-lg border border-[var(--border)] p-2 text-[var(--muted-foreground)] transition-colors hover:border-sky-400/40 hover:text-sky-300",children:(0,t.jsx)(p.Pencil,{className:"h-3.5 w-3.5"})}),(0,t.jsx)("button",{type:"button",title:"active"===e.state?"Pause":"Resume",onClick:async t=>{t.stopPropagation(),w(e.id),await h(e),w(null)},disabled:k===e.id,className:`rounded-lg border p-2 transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${"active"===e.state?"border-[var(--border)] text-[var(--muted-foreground)] hover:border-amber-400/40 hover:text-amber-300":"border-emerald-500/30 text-emerald-400 hover:border-emerald-400/50 hover:text-emerald-300"}`,children:"active"===e.state?(0,t.jsx)(E,{className:"h-3.5 w-3.5"}):(0,t.jsx)(O.Play,{className:"h-3.5 w-3.5 fill-current"})}),(0,t.jsx)("button",{type:"button",title:"Delete",onClick:t=>{t.stopPropagation(),A(e)},disabled:k===e.id,className:"rounded-lg border border-[var(--border)] p-2 text-[var(--muted-foreground)] transition-colors hover:border-[var(--status-failed-border)] hover:text-[var(--destructive)] disabled:cursor-not-allowed disabled:opacity-50",children:(0,t.jsx)(b.Trash2,{className:"h-3.5 w-3.5"})})]})]})},e.id)})}),T.length>0&&(0,t.jsxs)("div",{className:"mt-8",children:[(0,t.jsx)("p",{className:"text-[11px] font-medium uppercase tracking-[0.18em] text-[var(--muted-foreground)] mb-3",children:"Recent executions"}),(0,t.jsx)("div",{className:"space-y-0.5",children:T.map(e=>{let r=e.startedAt??e.createdAt,a="success"===e.status,s="failed"===e.status,o="running"===e.status;return(0,t.jsxs)("div",{className:"py-2 px-2 rounded-md text-xs",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)("span",{className:`flex size-5 shrink-0 items-center justify-center rounded-full border ${a?"border-emerald-500/40 text-emerald-400":s?"border-[var(--status-failed-border)] text-[var(--destructive)]":o?"border-sky-500/40 text-sky-400":"border-[var(--border)] text-[var(--muted-foreground)]"}`,children:a?(0,t.jsx)(c.Check,{className:"h-3 w-3"}):s?(0,t.jsx)(P.XCircle,{className:"h-3 w-3"}):(0,t.jsx)("span",{className:`block size-1.5 rounded-full ${o?"bg-sky-400 animate-pulse":"bg-current"}`})}),(0,t.jsx)("span",{className:"truncate text-[var(--muted-foreground)]",children:e.jobName}),(0,t.jsx)("span",{className:"ml-auto shrink-0 text-[11px] text-[var(--muted-foreground)]",children:new Date(r).toLocaleString(void 0,{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"})}),null!=e.durationMs&&(0,t.jsx)("span",{className:"shrink-0 font-mono text-[11px] text-[var(--muted-foreground)]",children:e.durationMs<1e3?`${e.durationMs}ms`:`${Math.round(e.durationMs/1e3)}s`})]}),s&&e.error&&(0,t.jsxs)("p",{className:"mt-1 ml-8 text-[11px] leading-snug text-[var(--destructive)] opacity-80 line-clamp-2",children:[e.error,null!=e.exitCode&&` (exit ${e.exitCode})`]}),s&&e.logs&&(0,t.jsxs)("details",{className:"mt-1 ml-8 group",children:[(0,t.jsx)("summary",{className:"cursor-pointer text-[10px] text-[var(--muted-foreground)] hover:text-[var(--foreground)] select-none",children:"Show tail logs"}),(0,t.jsx)("pre",{className:"mt-1 max-h-40 overflow-auto rounded bg-[var(--muted)] px-2 py-1.5 text-[10px] leading-[1.4] text-[var(--foreground)] whitespace-pre-wrap break-words",children:e.logs})]})]},e.id)})})]})]}),(0,t.jsx)(_.default,{isOpen:!!I,title:"Delete scheduled task?",message:"This permanently removes the task and all its run history. This cannot be undone.",preview:I?.name,confirmLabel:"Delete",variant:"danger",onConfirm:()=>{I&&H(I),A(null)},onCancel:()=>A(null)})]})}var J=e.i(498027),q=e.i(367859);let V=(0,l.default)("funnel",[["path",{d:"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z",key:"sc7q7i"}]]),W={"metric-check":{label:"Metric",className:"bg-blue-500/15 text-blue-400 border-blue-500/30"},"status-update":{label:"Status",className:"bg-emerald-500/15 text-emerald-400 border-emerald-500/30"},milestone:{label:"Milestone",className:"bg-amber-500/15 text-amber-400 border-amber-500/30"},note:{label:"Note",className:"bg-[var(--tone-neutral-bg)] text-[var(--tone-neutral)] border-[var(--tone-neutral-border)]"}},H=["metric-check","status-update","milestone","note"];function B({activity:e}){let[r,a]=(0,s.useState)(!1),o=W[e.type]??W.note,n=e.body.length>200;return(0,t.jsxs)("div",{className:"relative pl-6 pb-6 last:pb-0",children:[(0,t.jsx)("div",{className:"absolute left-0 top-1.5 h-3 w-3 rounded-full border-2 border-[var(--timeline-node-border)] bg-[var(--timeline-node-bg)]"}),(0,t.jsx)("div",{className:"absolute bottom-0 left-[5px] top-4 w-px bg-[var(--timeline-track)] last:hidden"}),(0,t.jsxs)("div",{className:"mb-1.5 flex items-center gap-2",children:[(0,t.jsx)("span",{className:`rounded-full border px-2 py-0.5 text-[10px] font-semibold uppercase tracking-[0.14em] ${o.className}`,children:o.label}),(0,t.jsx)("span",{className:"text-[11px] text-[var(--muted-foreground)]",children:function(e){let t=Date.now(),r=Date.parse(e);if(Number.isNaN(r))return e;let a=Math.floor((t-r)/6e4);if(a<1)return"just now";if(a<60)return`${a}m ago`;let s=Math.floor(a/60);if(s<24)return`${s}h ago`;let o=Math.floor(s/24);return o<30?`${o}d ago`:new Date(r).toLocaleDateString("en-US",{month:"short",day:"numeric",year:o>365?"numeric":void 0})}(e.createdAt)}),"manual"!==e.source&&(0,t.jsx)("span",{className:"max-w-[180px] truncate font-mono text-[11px] text-[var(--app-shell-soft-text)]",children:e.source})]}),r?(0,t.jsx)("div",{className:"prose prose-sm max-w-none text-sm text-[var(--foreground)] prose-neutral dark:prose-invert",children:(0,t.jsx)(S.Markdown,{content:e.body})}):(0,t.jsx)("div",{className:`text-sm leading-relaxed text-[var(--muted-foreground)] ${n?"max-h-24 overflow-hidden [mask-image:linear-gradient(to_bottom,black_72%,transparent)]":""}`,children:(0,t.jsx)(S.Markdown,{content:e.body})}),n&&(0,t.jsxs)("button",{type:"button",onClick:()=>a(!r),className:"mt-1.5 flex items-center gap-1 text-xs text-[var(--muted-foreground)] transition-colors hover:text-[var(--foreground)]",children:[r?(0,t.jsx)(J.ChevronDown,{size:12}):(0,t.jsx)(q.ChevronRight,{size:12}),r?"Show less":"Show more"]})]})}function K({projectId:e,objectiveId:r,onCreated:a,onCancel:o}){let[n,i]=(0,s.useState)("note"),[l,d]=(0,s.useState)(""),[c,u]=(0,s.useState)(!1),m=(0,s.useRef)(null);(0,s.useEffect)(()=>{m.current?.focus()},[]);let p=async()=>{let t=l.trim();if(t&&!c){u(!0);try{let s=await fetch(`/api/projects/${e}/objectives/${r}/activities`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({type:n,body:t})});if(!s.ok)throw Error("Failed to create activity");let o=await s.json();a(o)}catch(e){console.error("Failed to create activity:",e)}finally{u(!1)}}};return(0,t.jsxs)("div",{className:"mb-4 rounded-lg border border-[var(--border)] bg-[var(--overlay-panel-muted)] p-3",children:[(0,t.jsx)("div",{className:"mb-3 flex flex-wrap gap-1.5",children:H.map(e=>{let r=W[e],a=n===e;return(0,t.jsx)("button",{type:"button",onClick:()=>i(e),className:`rounded-full border px-2.5 py-0.5 text-[10px] font-semibold uppercase tracking-[0.14em] transition-colors ${a?"border-[var(--foreground)] bg-[var(--foreground)] text-[var(--background)]":`${r.className} hover:opacity-80`}`,children:r.label},e)})}),(0,t.jsx)("textarea",{ref:m,value:l,onChange:e=>d(e.target.value),placeholder:"What did you do?",rows:3,className:"w-full resize-none rounded-md border border-[var(--border)] bg-[var(--input)] px-3 py-2 text-sm text-[var(--foreground)] placeholder:text-[var(--app-shell-soft-text)] focus:border-[var(--card-hover-border)] focus:outline-none"}),(0,t.jsxs)("div",{className:"mt-2 flex items-center justify-end gap-2",children:[(0,t.jsx)("button",{type:"button",onClick:o,className:"px-3 py-1.5 text-xs text-[var(--muted-foreground)] transition-colors hover:text-[var(--foreground)]",children:"Cancel"}),(0,t.jsx)("button",{type:"button",onClick:p,disabled:!l.trim()||c,className:"px-3 py-1.5 text-xs font-medium rounded-md bg-sky-600 text-white hover:bg-sky-500 transition-colors disabled:opacity-40 disabled:cursor-not-allowed",children:c?"Saving...":"Log activity"})]})]})}function G({projectId:e,objectiveId:r,onTotalChange:a}){let[o,n]=(0,s.useState)([]),[i,l]=(0,s.useState)(0),[d,c]=(0,s.useState)(!1),[u,m]=(0,s.useState)(1),[p,h]=(0,s.useState)(!0),[b,f]=(0,s.useState)("all"),[v,g]=(0,s.useState)(!1),[y,k]=(0,s.useState)(!1),w=(0,s.useCallback)(async(t,s,o)=>{h(!0);try{let i=new URLSearchParams({page:String(t),limit:"25"});"all"!==s&&i.set("type",s);let d=await fetch(`/api/projects/${e}/objectives/${r}/activities?${i}`);if(!d.ok)throw Error("Failed to load activities");let u=await d.json(),m=Array.isArray(u.activities)?u.activities:[],p="number"==typeof u.total?u.total:m.length,x=!!u.hasMore;n(e=>o?[...e,...m]:m),l(p),a?.(p),c(x)}catch(e){console.error("Failed to fetch activities:",e)}finally{h(!1)}},[e,r]);return(0,s.useEffect)(()=>{m(1),w(1,b,!1)},[w,b]),(0,t.jsxs)("section",{children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between",children:[(0,t.jsx)("p",{className:"text-sm text-[var(--muted-foreground)]",children:"Time-ordered log of outputs from scheduled tasks and manual entries."}),(0,t.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,t.jsxs)("button",{type:"button",onClick:()=>k(!y),className:`flex items-center gap-1 px-2.5 py-1 rounded-md text-xs font-medium transition-colors ${y?"text-sky-400 bg-sky-500/10":"text-[var(--muted-foreground)] hover:bg-[var(--muted)] hover:text-[var(--foreground)]"}`,children:[y?(0,t.jsx)(j.X,{size:12}):(0,t.jsx)(x.Plus,{size:12}),"Log activity"]}),(0,t.jsx)("button",{type:"button",onClick:()=>g(!v),className:`p-1.5 rounded-md transition-colors ${v||"all"!==b?"text-sky-400 bg-sky-500/10":"text-[var(--muted-foreground)] hover:bg-[var(--muted)] hover:text-[var(--foreground)]"}`,"aria-label":"Filter activities",children:(0,t.jsx)(V,{size:14})})]})]}),v&&(0,t.jsxs)("div",{className:"flex flex-wrap gap-1.5 mb-4",children:[(0,t.jsx)("button",{type:"button",onClick:()=>f("all"),className:`rounded-full border px-2.5 py-0.5 text-[10px] font-semibold uppercase tracking-[0.14em] transition-colors ${"all"===b?"border-[var(--foreground)] bg-[var(--foreground)] text-[var(--background)]":"border-[var(--tone-neutral-border)] bg-[var(--tone-neutral-bg)] text-[var(--tone-neutral)] hover:border-[var(--card-hover-border)]"}`,children:"All"}),H.map(e=>{let r=W[e],a=b===e;return(0,t.jsx)("button",{type:"button",onClick:()=>f(e),className:`rounded-full border px-2.5 py-0.5 text-[10px] font-semibold uppercase tracking-[0.14em] transition-colors ${a?"border-[var(--foreground)] bg-[var(--foreground)] text-[var(--background)]":`${r.className} hover:opacity-80`}`,children:r.label},e)})]}),y&&(0,t.jsx)(K,{projectId:e,objectiveId:r,onCreated:e=>{n(t=>[e,...t]),l(e=>{let t=e+1;return a?.(t),t}),k(!1)},onCancel:()=>k(!1)}),p&&0===o.length?(0,t.jsx)("div",{className:"py-6 text-center text-sm text-[var(--muted-foreground)]",children:"Loading activities..."}):0===o.length?(0,t.jsxs)("div",{className:"rounded-xl border border-dashed border-[var(--border)] bg-[var(--overlay-panel-muted)] p-6 text-center",children:[(0,t.jsx)("p",{className:"text-sm text-[var(--muted-foreground)]",children:"No activities yet."}),(0,t.jsx)("p",{className:"mt-1 text-xs text-[var(--app-shell-soft-text)]",children:"Activities are created by scheduled tasks and agent actions."})]}):(0,t.jsxs)("div",{children:[o.map(e=>(0,t.jsx)(B,{activity:e},e.id)),d&&(0,t.jsx)("div",{className:"pt-2 pl-6",children:(0,t.jsx)("button",{type:"button",onClick:()=>{let e=u+1;m(e),w(e,b,!0)},disabled:p,className:"text-xs text-sky-400 hover:text-sky-300 transition-colors disabled:opacity-50",children:p?"Loading...":"Load more"})})]})]})}let Y=/(?:^|\n)Objective health:\s*(\d{1,3})%\s*(On track|At risk|Off track|Done)\b/im,X={"on track":"on_track","at risk":"at_risk","off track":"off_track",done:"done"};function Q(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}function Z(e){return"number"==typeof e&&Number.isFinite(e)?Math.max(0,Math.min(100,Math.round(e))):0}function ee(e){if("string"!=typeof e)return null;let t=e.trim().toLowerCase();return"on_track"===t||"at_risk"===t||"off_track"===t||"done"===t?t:X[t]??null}function et(e){if("string"!=typeof e)return null;let t=Date.parse(e);return Number.isNaN(t)?null:new Date(t).toISOString()}function er(e){return"string"==typeof e&&e.trim()?e.trim():void 0}function ea(...e){let t=e.flatMap(e=>e??[]),r=[];for(let e of[...t].sort((e,t)=>Date.parse(e.recordedAt)-Date.parse(t.recordedAt))){let t=r[r.length-1]??null;t&&t.progress===e.progress&&t.status===e.status&&(!t.source||!e.source||t.source===e.source)&&5e3>=Math.abs(Date.parse(e.recordedAt)-Date.parse(t.recordedAt))||r.push(e)}return r}let es={on_track:{label:"On track",stroke:"var(--status-completed)"},at_risk:{label:"At risk",stroke:"var(--status-blocked)"},off_track:{label:"Off track",stroke:"var(--status-failed)"},done:{label:"Done",stroke:"var(--status-in-progress)"}};function eo(e){let{projectId:r,objectiveId:a,objectiveKey:o,metadata:n,currentProgress:i,currentStatus:l,objectiveUpdatedAt:d}=e,c=(0,s.useMemo)(()=>(function(e,t){if(!Q(e)||!t.trim())return[];let r=e.project_objective_health_history;if(!Q(r))return[];let a=r[t.trim()];return Array.isArray(a)?ea(a.map(e=>(function(e){if(!Q(e))return null;let t=ee(e.status),r=et(e.recordedAt);return t&&r?{progress:Z(e.progress),status:t,recordedAt:r,source:er(e.source),note:er(e.note),objectiveId:er(e.objectiveId)??null,objectiveKey:er(e.objectiveKey)??null}:null})(e)).filter(e=>!!e)):[]})(n,a),[n,a]),[u,m]=(0,s.useState)(c),p=(0,s.useMemo)(()=>({progress:i,status:l,recordedAt:d,objectiveId:a,objectiveKey:o}),[i,l,a,o,d]);(0,s.useEffect)(()=>{m(c)},[c]),(0,s.useEffect)(()=>{let e=!1;return async function(){try{let t=await fetch(`/api/projects/${r}/objectives/${a}/activities?type=status-update&limit=100`);if(!t.ok)throw Error("Failed to load objective activity history");let s=await t.json(),n=Array.isArray(s.activities)?s.activities:[],i=ea(c,ea(n.map(e=>(function(e){if("status-update"!==e.type)return null;let t=e.body.match(Y);if(!t)return null;let r=Z(Number(t[1])),a=ee(t[2]),s=et(e.createdAt);return a&&s?{progress:r,status:a,recordedAt:s,source:er(e.source),objectiveKey:er(e.objectiveLabel)??null}:null})(e)).filter(e=>!!e&&(!o||e.objectiveKey===o))));e||m(i)}catch{e||m(c)}}(),()=>{e=!0}},[c,a,o,r]);let[x,h]=(0,s.useState)(!1);(0,s.useEffect)(()=>{let e=requestAnimationFrame(()=>h(!0));return()=>cancelAnimationFrame(e)},[]);let b=ea(u,[p]),f=b[b.length-1],v=es[f.status];return 0===u.length||1===b.length||b.length,(0,t.jsxs)("div",{"data-testid":"objective-health-trend",className:"ml-auto inline-flex items-center gap-3 rounded-xl border border-[var(--border)] bg-[var(--overlay-panel-muted)] px-3 py-2",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-[10px] font-semibold uppercase tracking-[0.16em] text-[var(--muted-foreground)]",children:"Objective health"}),(0,t.jsxs)("div",{className:"mt-0.5 text-[20px] font-semibold leading-none text-[var(--foreground)]",children:[f.progress,"%"]}),(0,t.jsx)("div",{className:"mt-0.5 text-[10px] font-medium",style:{color:v.stroke},children:v.label})]}),(0,t.jsx)("div",{className:"h-[40px] w-[14px] overflow-hidden rounded-sm",style:{background:"var(--muted)"},role:"progressbar","aria-valuenow":f.progress,"aria-valuemin":0,"aria-valuemax":100,"aria-label":"Objective health",title:`${f.progress}%`,children:(0,t.jsx)("div",{className:"flex h-full flex-col justify-end",children:(0,t.jsx)("div",{className:"relative w-full overflow-hidden rounded-sm transition-[height] duration-700 ease-out",style:{height:x?`${f.progress}%`:"0%",backgroundColor:v.stroke},children:(0,t.jsx)("div",{className:"absolute inset-0 animate-pulse",style:{background:"linear-gradient(0deg, transparent 0%, rgba(255,255,255,0.15) 50%, transparent 100%)"}})})})})]})}var en=e.i(681619),ei=e.i(638703),el=e.i(276013),ed=e.i(44054),ec=e.i(434405),eu=e.i(169433),em=e.i(982141),ep=e.i(902572);let ex={on_track:{label:"On track",chipClass:"border-[var(--status-completed-border)] bg-[var(--status-completed-bg)] text-[var(--status-completed-text)]",toneClass:"text-[var(--status-completed-text)]"},at_risk:{label:"At risk",chipClass:"border-[var(--status-blocked-border)] bg-[var(--status-blocked-bg)] text-[var(--status-blocked-text)]",toneClass:"text-[var(--status-blocked-text)]"},off_track:{label:"Off track",chipClass:"border-[var(--status-failed-border)] bg-[var(--status-failed-bg)] text-[var(--status-failed-text)]",toneClass:"text-[var(--status-failed-text)]"},done:{label:"Done",chipClass:"border-[var(--status-in-progress-border)] bg-[var(--status-in-progress-bg)] text-[var(--status-in-progress-text)]",toneClass:"text-[var(--status-in-progress-text)]"}};function eh({onResize:e}){let{isTouchLayout:r}=(0,ed.useInputCapabilities)();return r?null:(0,t.jsx)(el.ResizeHandle,{onResize:e,className:"hidden xl:block",ariaLabel:"Resize objective chat panel"})}function eb(e){return new Date(e).toLocaleString([],{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"})}function ef(){return{title:"",teamId:"",summary:""}}function ev(e){let{projects:t,isLoading:r,refetch:a,updateProject:o}=(0,y.useProjects)(),[n,i]=(0,s.useState)([]),l=(0,s.useMemo)(()=>t.find(t=>t.slug===e)??null,[e,t]),d=(0,s.useMemo)(()=>(0,ep.readProjectObjectivesWorkspace)(l?.metadata),[l?.metadata]),c=(0,s.useCallback)(async e=>{if(!l)throw Error("Project not found.");await o(l.id,{metadata:(0,ep.writeProjectObjectivesWorkspace)(l.metadata??{},e)})},[l,o]);return(0,s.useEffect)(()=>{let e=!0;return async function(){if(!l?.id)return i([]);try{let t=await fetch(`/api/projects/${l.id}/teams`);if(!t.ok)throw Error("Failed to fetch teams");let r=await t.json();if(!e)return;i((r.teams??[]).map(e=>({id:"string"==typeof e.id?e.id:"",name:"string"==typeof e.name?e.name:"Untitled team"})).filter(e=>e.id))}catch{if(!e)return;i([])}}(),()=>{e=!1}},[l?.id]),{isLoading:r,project:l,workspace:d,teams:n,persistWorkspace:c,refetchProject:a}}function eg(e){return"user"===e.role&&!e.rootMessageId}function ej({projectId:e,projectSlug:r,objective:o,teamName:l,trackerConnections:d,availableTrackers:c,defaultTrackerType:u,onThreadLinked:m,onObjectiveUpdated:p}){let[x,h]=(0,s.useState)(()=>(0,eu.loadObjectiveChatPanelWidth)()||800),[b,v]=(0,s.useState)(o.threadId??(o.id?`objective-chat:${o.id}`:null)),g=(0,a.useSearchParams)(),j=g?.get("session")??null,y=g?.get("message")??null,[A,T]=(0,s.useState)(j?"detail":"list"),[E,O]=(0,s.useState)(j),[M,P]=(0,s.useState)(y),[R,L]=(0,s.useState)(!1),[D,F]=(0,s.useState)(o.chatSessionVersion),[_,z]=(0,s.useState)([]),[U,J]=(0,s.useState)(null),q=(0,s.useRef)(!1),V=(0,s.useRef)(!1),W=(0,s.useRef)(null),H=(0,s.useRef)(null),[B,K]=(0,s.useState)(!1),G=window.location?.origin?window.location.origin:null,{messages:Y,setMessages:X,sendMessage:Q,loadHistory:Z,setChatRuns:ee,stop:et,chatRuns:er}=(0,k.useGroupChat)(b),{processes:ea,streaming:es,chatRuns:eo,poll:en}=(0,w.useProcessPolling)(b?{workspaceId:b}:null,{messages:Y,setMessages:X});(0,s.useEffect)(()=>{o.threadId&&o.threadId!==b&&v(o.threadId)},[o.threadId,b]),(0,s.useEffect)(()=>{let e=W.current;if(!e)return;let t=()=>{K(e.scrollHeight-e.scrollTop-e.clientHeight>200)};return t(),e.addEventListener("scroll",t,{passive:!0}),()=>e.removeEventListener("scroll",t)},[A,E]);let el=(0,s.useCallback)(()=>{H.current?.scrollIntoView({behavior:"smooth"})},[]);(0,s.useEffect)(()=>{T("list"),O(null),L(!1),V.current=!1},[o.id]),(0,s.useEffect)(()=>{F(o.chatSessionVersion),o.chatSessionVersion>=ep.CURRENT_OBJECTIVE_CHAT_SESSION_VERSION&&(V.current=!0)},[o.chatSessionVersion]);let ed=(0,s.useCallback)(async t=>{let r=t.trim();if(r&&!(await fetch(`/api/projects/${e}/threads`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({threadId:r})})).ok)throw Error("Failed to link objective chat to the project.")},[e]);(0,s.useEffect)(()=>{let e=!1;return b?(L(!1),(async()=>{await Z(b),e||L(!0)})(),()=>{e=!0}):void L(!0)},[Z,b]),(0,s.useEffect)(()=>{let t=!1;return async function(){try{let r=o.teamId?`/api/projects/${e}/teams/${o.teamId}/agents`:`/api/projects/${e}/agents`,[a,s]=await Promise.all([fetch("/api/participants"),fetch(r)]),n=a.ok?await a.json():[],i=Array.isArray(n)?n:[],l=s.ok?await s.json():{agents:[]};if(t)return;let d=((l&&"object"==typeof l?l:{agents:[]}).agents??[]).slice().sort((e,t)=>e.routing_order-t.routing_order).map(e=>e.agent_id);if(0===d.length)return void z(i);let c=new Map(i.map(e=>[e.id,e]));z(d.map(e=>c.get(e)).filter(e=>!!e))}catch(e){if(t)return;console.error("Failed to load objective chat participants",e),z([])}}(),()=>{t=!0}},[e,o.teamId]),(0,s.useEffect)(()=>{o.threadId&&ed(o.threadId).catch(e=>{console.warn("Failed to re-link objective chat thread to project",e)})},[ed,o.threadId]),(0,s.useEffect)(()=>{if(!o.threadId||!b||!R||D>=ep.CURRENT_OBJECTIVE_CHAT_SESSION_VERSION||V.current)return;V.current=!0;let t=function(e){let t=e.filter(eg).sort((e,t)=>e.timestamp-t.timestamp);if(t.length<=1)return null;let r=t[0]?.id;if(!r)return null;let a=t.slice(1).map(e=>e.id),s=new Set(a);return{messages:[...e].map(e=>{let t=s.has(e.id)&&eg(e),a="string"==typeof e.rootMessageId&&s.has(e.rootMessageId);return t||a?{...e,rootMessageId:r,parentMessageId:r,depth:1}:e}).sort((e,t)=>e.timestamp-t.timestamp),primaryRootMessageId:r,mergedRootMessageIds:a}}(Y),r=!1;return(async()=>{J(null);try{if(t){if(!(await fetch("/api/history",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({threadId:b,messages:t.messages})})).ok)throw Error("Failed to migrate the objective chat history.");if(r)return;X(t.messages),O(e=>e&&t.mergedRootMessageIds.includes(e)?t.primaryRootMessageId:e)}if(!(await fetch(`/api/projects/${e}/objectives/${o.id}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({chatSessionVersion:ep.CURRENT_OBJECTIVE_CHAT_SESSION_VERSION})})).ok)throw Error("Failed to update the objective chat session version.");if(r)return;F(ep.CURRENT_OBJECTIVE_CHAT_SESSION_VERSION),p().catch(e=>{console.warn("Failed to refresh objective after objective chat migration",e)})}catch(e){if(r)return;console.warn("Failed to migrate legacy objective chat sessions",e),J(e instanceof Error?e.message:"Failed to migrate the objective chat history.")}})(),()=>{r=!0}},[D,R,Y,o.id,o.threadId,p,e,X,b]);let ex=(0,s.useCallback)(async()=>{if(o.threadId)return o.threadId;let t=b??(o.id?`objective-chat:${o.id}`:null);if(!t)return null;J(null);try{let a=await ec.threadService.createThread({id:t,title:o.title,metadata:{scope:"objective",objectiveId:o.id,projectId:e,projectSlug:r}});return v(a.id),await ed(a.id),await m(a.id),a.id}catch(e){return J(e instanceof Error?e.message:"Failed to create the objective chat."),null}},[ed,o.id,o.threadId,o.title,m,e,r,b]),ef=(0,s.useMemo)(()=>new Map(_.map(e=>[e.id,e])),[_]);(0,s.useEffect)(()=>{ee(e=>{let t=Date.now(),r=new Map(e.filter(e=>"string"==typeof e.chatRunId&&e.chatRunId.length>0).map(e=>[e.chatRunId,e]));for(let e of eo)e?.chatRunId&&r.set(e.chatRunId,e);return Array.from(r.values()).filter(e=>!!(!e.optimistic||eo.some(t=>t.chatRunId===e.chatRunId))||t-(e.enqueuedAt??0)<=5e3).sort((e,t)=>String(e.chatRunId||"").localeCompare(String(t.chatRunId||"")))})},[eo,ee]);let ev=(0,s.useMemo)(()=>{let e=Date.now(),t=new Map(eo.map(e=>[e.chatRunId,e]));for(let r of er)!(!r.optimistic||t.has(r.chatRunId))&&(e-(r.enqueuedAt??0)>5e3||t.set(r.chatRunId,r));return Array.from(t.values()).filter(e=>"queued"===e.status||"running"===e.status||"awaiting_user"===e.status||"blocked"===e.status)},[er,eo]),ej=(0,s.useMemo)(()=>Y.filter(eg).sort((e,t)=>t.timestamp-e.timestamp).map(e=>{let t,r=Y.filter(t=>t.rootMessageId===e.id).sort((e,t)=>e.timestamp-t.timestamp),a=[e,...r],s=a[a.length-1]??e;return{rootMessageId:e.id,title:(t=e.content.replace(/\s+/g," ").trim())?t.length>56?`${t.slice(0,56).trim()}...`:t:"Untitled session",updatedAt:s.timestamp,messageCount:a.length,messages:a}}),[Y]),ey=(0,s.useMemo)(()=>E?ej.find(e=>e.rootMessageId===E)??null:null,[E,ej]),ew="detail"===A&&!!E,eN=new Set(["queued","running","awaiting_user","blocked"]),eS=ev.length>0||ea.some(e=>"spawning"===e.state||"running"===e.state),eC=(0,s.useMemo)(()=>{let e=new Map;for(let t of ev){if(!t.rootMessageId||!eN.has(t.status))continue;let r="queued"===t.status?"queued":"working";"working"!==e.get(t.rootMessageId)&&e.set(t.rootMessageId,r)}for(let t of ea)t.threadId&&("spawning"===t.state||"running"===t.state)&&e.set(t.threadId,"working");return e},[ev,ea]),e$=(0,s.useMemo)(()=>ea.some(e=>"spawning"===e.state||"running"===e.state)||ev.some(e=>eN.has(e.status)&&"queued"!==e.status)?"working":ev.some(e=>"queued"===e.status)?"queued":"ready",[ev,eN,ea]);(0,s.useEffect)(()=>{q.current&&!eS&&p().catch(e=>{console.warn("Failed to refresh objective after objective chat activity",e)}),q.current=eS},[eS,p]),(0,s.useEffect)(()=>{E&&(0,em.persistLastSessionForEntity)(o.id,E)},[o.id,E]),(0,s.useEffect)(()=>{j&&(O(j),T("detail"))},[j]),(0,s.useEffect)(()=>{y&&P(y)},[y]),(0,s.useEffect)(()=>{if(!M)return;let e=requestAnimationFrame(()=>{let e=document.querySelector(`[data-objective-message-id="${CSS.escape(M)}"]`);e&&e.scrollIntoView({behavior:"smooth",block:"center"})});return()=>cancelAnimationFrame(e)},[M,R,E]),(0,s.useEffect)(()=>{if(E||0===ej.length)return;let e=(0,em.loadLastSessionForEntity)(o.id);e&&ej.some(t=>t.rootMessageId===e)&&O(e)},[o.id,E,ej,O]);let eI=(0,s.useCallback)(async e=>{await fetch(`/api/chat-runs/${encodeURIComponent(e)}/signal`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({signal:"cancel",reason:"Interrupted by a new objective chat message"})}).catch(e=>{console.warn("Failed to cancel objective chat run",e)})},[]),eA=(0,s.useCallback)(async()=>{let e=Array.from(new Set(ev.map(e=>e.chatRunId).filter(e=>!!e)));await Promise.all(e.map(e=>eI(e))),await et(),await en()},[ev,eI,en,et]),eT=(0,s.useCallback)(async(t,a,s,n,i,m,p)=>{var x;let h,b,f,v,g,j,y,k,w;eS&&await eA(),J(null);let N=await ex();if(!N)return;let S=_.map(e=>e.id),C=ew?E:null,$=[(x={available:c,configured:d.filter(e=>e.connected).map(e=>({type:e.type,displayName:e.displayName})),defaultType:u},h=`/api/projects/${e}/objectives/${o.id}`,b=G?`${G}${h}`:h,f=`${b}/scheduled-tasks`,v=`${b}/notes`,g=G?`${G}/api/trackers`:"/api/trackers",j=`~/.agx/projects/${r}/objectives/${o.key}.md`,y=`~/.agx/projects/${r}/objectives/${o.key}/notes/`,k=`${b}/validate`,w=o.notes?.length?o.notes.map(e=>`- **${e.title}**: ${e.body.slice(0,120)}${e.body.length>120?"...":""}`).join("\n"):null,["You are working inside a strategy session for this project objective.",`Project slug: ${r}`,`Objective: ${o.title}`,`Objective label: ${o.key}`,l?`Owning team: ${l}`:"",w?`Current notes:
|
|
2
|
+
${w}`:"Current notes: none yet.","Wake schedule: managed by the built-in objective worker job.",`## Objective file (source of truth)
|
|
3
|
+
|
|
4
|
+
This objective is stored as a frontmatter markdown file at:
|
|
5
|
+
\`${j}\`
|
|
6
|
+
|
|
7
|
+
File format:
|
|
8
|
+
- YAML frontmatter between \`---\` delimiters contains all metadata (title, teamId, key, status, progress, scheduledTaskIds, threadId, chatSessionVersion, createdAt, updatedAt).
|
|
9
|
+
- \`## Activities\` section contains the activity timeline; each activity is a \`### Title\` block with metadata lines (\`- **id:**\`, \`- **source:**\`, \`- **created:**\`, \`- **body:**\`) and optional \`#### Replies\` sub-section.
|
|
10
|
+
|
|
11
|
+
Notes are stored as separate files in \`${y}\`. Each note is a markdown file with YAML frontmatter (id, title, objectiveId, createdAt, updatedAt) and a markdown body.
|
|
12
|
+
|
|
13
|
+
When updating the objective, you can edit this file directly. Rules:
|
|
14
|
+
- NEVER remove or break the \`---\` frontmatter delimiters.
|
|
15
|
+
- NEVER change the \`id\` or \`createdAt\` fields.
|
|
16
|
+
- Always update \`updatedAt\` to the current ISO timestamp when making changes.
|
|
17
|
+
- After any edit, call \`GET ${k}\` to verify the file is still valid.
|
|
18
|
+
- If validation fails, fix the errors immediately before doing anything else.`,"Scheduled tasks live in the shared scheduled-task list and are filtered by this objective label.","Your job is to help the team develop the strategy needed to reach the goal, including the right combination of objective notes, scheduled tasks, and tracker tickets.","Use the current session history to build on prior reasoning. Only reset and start from scratch when the user explicitly starts a new session.","Use this thread to pressure-test strategy, suggest better tactics, rewrite the objective when asked, propose the right operational cadence, and take concrete follow-up actions when the user wants them applied.","When suggesting edits, prefer editing the frontmatter file directly or using the notes API. When the user asks you to make a change, edit the file, validate, then confirm.","Local objective APIs:",`- PATCH ${b} with JSON fields such as {"title","teamId","key"} to update the objective itself.`,`- GET ${v} to list all notes for this objective. Returns {"notes":[...],"total","page","limit","hasMore"}.`,`- POST ${v} with {"title","body"} to create a new note.`,`- GET ${v}/{noteId} to read a single note.`,`- PATCH ${v}/{noteId} with {"title","body"} to update a note.`,`- DELETE ${v}/{noteId} to delete a note.`,`- GET ${f} to inspect the scheduled tasks already tracked for this objective.`,`- POST ${f} with {"name","prompt","cadence","agentId"} to create a scheduled task for this objective.`,`- GET ${k} to validate the objective file on disk. Returns {"valid":true} or {"valid":false,"errors":[...]}.`,"Tracker integrations:",`- Available tracker types: ${x.available.length>0?x.available.map(e=>`${e.displayName} (${e.type})`).join(", "):"none registered"}.`,`- Configured for this project: ${x.configured.length>0?x.configured.map(e=>{let t=x.defaultType===e.type;return`${e.displayName} (${e.type})${t?" — default":""}`}).join(", "):"none — ask the user to connect a tracker in project settings if they want ticket workflows"}.`,x.defaultType?`- Default tracker for ticket workflows: ${x.defaultType}. Prefer this tracker when creating or referencing tickets for this objective unless the user asks otherwise.`:x.configured.length>1?"- No default tracker has been selected; ask the user which connected tracker to use before creating tickets.":"",...x.configured.map(t=>`- GET ${g}/${t.type}/items?projectId=${e} to list ${t.displayName} items. Filter client-side by label "${o.key}" to find tickets tied to this objective.`)].filter(Boolean).join("\n\n")),m].filter(Boolean).join("\n\n"),I=await Q(t,a,N,C,s,n,i?[i]:S,r,$,p);!C&&I&&(O(I),T("detail"))},[G,ex,eS,eA,ew,o,_,e,r,E,Q,l]),eE=(0,s.useMemo)(()=>ew?ey?.messages??[]:[],[ew,ey]),eO=(0,s.useMemo)(()=>ew&&E?Object.entries(es).filter(([,e])=>e.rootMessageId===E):[],[ew,E,es]),eM=(0,s.useCallback)(e=>{h(t=>{let r=Math.max(320,Math.min(1200,t-e));return(0,eu.persistObjectiveChatPanelWidth)(r),r})},[]);return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(eh,{onResize:eM}),(0,t.jsxs)("aside",{className:"relative flex h-full min-h-[420px] w-full flex-col overflow-hidden border-t border-[var(--border)] bg-[var(--overlay-panel)] xl:min-h-0 xl:w-[var(--objective-chat-panel-width)] xl:shrink-0 xl:self-stretch xl:border-l xl:border-t-0",style:{"--objective-chat-panel-width":`${x}px`},children:[(0,t.jsx)(ek,{message:U}),ew?(0,t.jsx)("div",{className:"border-b border-[var(--border)] px-4 py-4",children:(0,t.jsxs)("button",{type:"button",onClick:()=>T("list"),"aria-label":"Back to sessions",className:"inline-flex min-w-0 items-center gap-2 text-left text-sm font-medium text-[var(--foreground)] transition-colors hover:text-[var(--primary)]",children:[(0,t.jsx)(n.ArrowLeft,{className:"h-3.5 w-3.5"}),(0,t.jsx)("span",{className:"truncate",children:ey?.title??"Loading session..."})]})}):(0,t.jsx)("div",{className:"border-b border-[var(--border)] px-4 py-4",children:(0,t.jsxs)("div",{className:"space-y-1",children:[(0,t.jsx)("p",{className:"text-xs font-semibold uppercase tracking-[0.18em] text-[var(--muted-foreground)]",children:"Strategy Sessions"}),(0,t.jsx)("p",{className:"text-xs text-[var(--muted-foreground)]",children:"Start a new strategy conversation below, or open an earlier session to keep building on it."})]})}),(0,t.jsx)("div",{ref:W,className:`min-h-0 flex-1 overflow-y-auto pb-[calc(15rem+env(safe-area-inset-bottom))] ${ew?"px-4 py-4":"px-0 py-0"}`,children:ew?0===eE.length?(0,t.jsxs)("div",{className:"flex h-full flex-col items-center justify-center gap-2 px-4 text-center text-[var(--muted-foreground)]",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-[var(--foreground)]",children:"Loading strategy session"}),(0,t.jsx)("p",{className:"max-w-sm text-xs",children:"The conversation will appear here once the session history is ready."})]}):(0,t.jsxs)("div",{className:"space-y-5",children:[eE.map(e=>{let r=e.participantId?ef.get(e.participantId):null,a=M===e.id;return(0,t.jsxs)("div",{"data-objective-message-id":e.id,className:`flex gap-3 rounded-2xl transition-colors ${a?"bg-[var(--status-in-progress-bg)] p-2 -m-2":""}`,children:["user"===e.role?(0,t.jsx)("div",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-[var(--overlay-panel-soft)] text-[var(--muted-foreground)]",children:(0,t.jsx)(f.User,{className:"h-4 w-4"})}):(0,t.jsx)("img",{src:(0,$.agentAvatarUrl)(e.participantId??"assistant",32,r?.color),alt:r?.name??"Agent",className:"h-8 w-8 shrink-0 rounded-full border border-[var(--border)] object-cover"}),(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("span",{className:"text-sm font-medium text-[var(--foreground)]",children:"user"===e.role?"You":r?.name??"Agent"}),(0,t.jsx)("span",{className:"text-[11px] text-[var(--muted-foreground)]",children:new Date(e.timestamp).toLocaleString([],{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"})})]}),(0,t.jsx)("div",{className:"mt-2 rounded-2xl border border-[var(--border)] bg-[var(--overlay-panel-muted)] px-4 py-3 text-[15px] leading-relaxed text-[var(--foreground)]",children:"user"===e.role?(0,t.jsx)(S.Markdown,{content:(0,I.stripMarkers)(e.content),isUser:!0}):(0,t.jsx)(C.StreamingSegments,{content:(0,I.stripMarkers)(e.content)})})]})]},e.id)}),eO.map(([e])=>{let r=ef.get(e);return(0,t.jsxs)("div",{className:"flex items-center gap-3 text-sm text-[var(--muted-foreground)]",children:[(0,t.jsx)("img",{src:(0,$.agentAvatarUrl)(e,32,r?.color),alt:r?.name??"Agent",className:"h-8 w-8 shrink-0 rounded-full border border-[var(--border)] object-cover"}),(0,t.jsxs)("span",{children:[r?.name??"Agent"," is thinking..."]})]},`stream-${e}`)}),(0,t.jsx)("div",{ref:H})]}):0===ej.length?(0,t.jsxs)("div",{className:"flex h-full flex-col items-center justify-center gap-2 px-4 text-center text-[var(--muted-foreground)]",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-[var(--foreground)]",children:"No strategy sessions yet"}),(0,t.jsx)("p",{className:"max-w-sm text-xs",children:"Use the composer below to start the first conversation about how this objective should be reached."})]}):(0,t.jsx)("div",{className:"divide-y divide-[var(--border)]",children:ej.map(e=>{var r;let a=eC.get(e.rootMessageId)??null;return(0,t.jsxs)("button",{type:"button",onClick:()=>{O(e.rootMessageId),T("detail")},className:"flex w-full items-start justify-between gap-3 px-4 py-3 text-left transition-colors hover:bg-[var(--overlay-panel-soft)]",children:[(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsx)("p",{className:"truncate text-sm font-medium text-[var(--foreground)]",children:e.title}),(0,t.jsxs)("p",{className:"mt-1 text-[11px] text-[var(--muted-foreground)]",children:[1===(r=e.messageCount)?"1 message":`${r} messages`," · Last"," ",eb(e.updatedAt)]})]}),(0,t.jsxs)("div",{className:"flex shrink-0 items-center gap-2",children:[a?(0,t.jsx)("span",{className:"rounded-full border border-[var(--status-in-progress-border)] bg-[var(--status-in-progress-bg)] px-2 py-1 text-[10px] font-semibold uppercase tracking-[0.18em] text-[var(--status-in-progress-text)]",children:"queued"===a?"Queued":"Working"}):null,(0,t.jsx)(i.ArrowRight,{className:"mt-0.5 h-4 w-4 text-[var(--muted-foreground)]"})]})]},e.rootMessageId)})})}),(0,t.jsx)(ei.JumpToLatestButton,{visible:ew&&B&&eE.length>10,onClick:el,direction:"bottom",offsetClassName:"bottom-[calc(15rem+env(safe-area-inset-bottom))]"}),(0,t.jsx)("div",{className:"absolute bottom-0 left-0 right-0 bg-[var(--overlay-panel)] p-3 pb-[calc(0.75rem+env(safe-area-inset-bottom))]",children:(0,t.jsx)(N.Composer,{onSend:eT,onStop:eA,participants:_,commands:[],projectId:e,projectSlug:r,loading:"ready"!==e$,activityStatus:e$,sendInterruptsBusy:!0,placeholder:ew?`Continue strategy for "${o.title}"...`:`Start a new strategy session for "${o.title}"...`,initialPinnedParticipantId:_[0]?.id})})]})]})}function ey({label:e}){return(0,t.jsx)("div",{className:"flex h-full items-center justify-center text-sm text-[var(--muted-foreground)]",children:e})}function ek({message:e}){return e?(0,t.jsxs)("div",{className:"mt-3 flex items-center gap-2 rounded-2xl border border-rose-500/20 bg-rose-500/10 px-3 py-2 text-sm text-rose-100",children:[(0,t.jsx)(o.AlertTriangle,{className:"h-4 w-4"}),(0,t.jsx)("span",{children:e})]}):null}function ew({content:e,editable:r=!1,onChange:a,placeholder:s}){let o=e.trim().length>0;return r||o?(0,t.jsx)("div",{className:"overflow-hidden border-l-2 border-[var(--border)]/60 pl-4 transition-all focus-within:border-indigo-500/60",children:r||o?(0,t.jsx)(A.default,{content:e,editable:r,onChange:a,placeholder:s}):null}):null}function eN({onResize:e}){let{isTouchLayout:r}=(0,ed.useInputCapabilities)();return r?null:(0,t.jsx)(el.ResizeHandle,{onResize:e,ariaLabel:"Resize objective list panel"})}function eS({objective:e,activityCount:r,lastActivityAt:a,activeAgentIds:s,participants:o,isSelected:n,onSelect:i}){let l,d=(l=1===r?"1 activity":`${r} activities`,a?`${l} \xb7 Last ${eb(a)}`:`${l} \xb7 No activity yet`);return(0,t.jsx)("article",{className:"px-2",children:(0,t.jsxs)("button",{type:"button",onClick:i,"aria-label":`Open details for ${e.title}`,className:`group flex w-full items-center gap-3 rounded-xl px-2 py-2 text-left transition-colors ${n?"bg-[var(--primary)]/10 border border-[var(--primary)]/20":"border border-transparent hover:bg-[var(--secondary)]"}`,children:[(0,t.jsxs)("div",{className:"min-w-0 flex-1 py-0.5",children:[(0,t.jsx)("div",{className:"flex min-w-0 items-center gap-2",children:(0,t.jsx)("span",{className:`rounded-full border px-1.5 py-0 text-[9px] font-semibold uppercase tracking-[0.12em] ${ex[e.status].chipClass}`,children:ex[e.status].label})}),(0,t.jsx)("p",{className:"mt-1 truncate text-sm font-medium text-[var(--foreground)]",children:e.title}),(0,t.jsx)("p",{className:"mt-0.5 text-[11px] text-[var(--muted-foreground)]",children:d})]}),s&&s.length>0&&(0,t.jsx)("span",{className:"inline-flex items-center -space-x-1 shrink-0",children:s.slice(0,3).map(e=>{let r=o?.find(t=>t.id===e);return(0,t.jsxs)("span",{className:"relative inline-block",title:r?.name??e,children:[(0,t.jsx)("img",{src:(0,$.agentAvatarUrl)(e,16,r?.color??void 0),alt:r?.name??e,className:"h-3 w-3 rounded-full ring-[1.5px] ring-[var(--background)]"}),(0,t.jsx)("span",{className:"absolute -bottom-px -right-px h-1.5 w-1.5 rounded-full bg-green-500 ring-[1px] ring-[var(--background)]"})]},e)})})]})})}function eC({projectSlug:e,initialObjectiveId:r}){let{isLoading:a,project:o,workspace:n,teams:i,persistWorkspace:l}=ev(e),d=n.objectives,[c,u]=(0,s.useState)(r??null),[m,p]=(0,s.useState)(()=>(0,eu.loadObjectiveListPanelWidth)()||320),[h,b]=(0,s.useState)(null),[f,v]=(0,s.useState)(!1),[g,j]=(0,s.useState)(null),[y,k]=(0,s.useState)(new Map),[w,N]=(0,s.useState)([]);(0,s.useEffect)(()=>{!c&&d.length>0&&u(d[0].id)},[c,d]),(0,s.useEffect)(()=>{c&&d.length>0&&!d.some(e=>e.id===c)&&u(d[0]?.id??null)},[c,d]),(0,s.useEffect)(()=>{let e=!1;return async function(){try{let t=await fetch("/api/participants");t.ok&&!e&&N(await t.json())}catch{}}(),()=>{e=!0}},[]),(0,s.useEffect)(()=>{let e=new Map;for(let t of d)t.threadId&&e.set(t.threadId,t.id);if(0===e.size)return;let t=!1;async function r(){try{let r=Array.from(e.keys()).join(","),a=await fetch(`/api/chat-runs/active-agents?threadIds=${encodeURIComponent(r)}`);if(!a.ok||t)return;let s=await a.json(),o=new Map;for(let[t,r]of Object.entries(s.activeAgents??{})){let a=e.get(t);a&&Array.isArray(r)&&r.length>0&&o.set(a,r)}t||k(o)}catch{}}r();let a=setInterval(()=>void r(),5e3);return()=>{t=!0,clearInterval(a)}},[d]);let S=async()=>{if(!h)return;let e=h.title.trim();if(!e)return void j("Objective statement is required.");let t=h.teamId.trim();if(!t)return void j("Team is required.");let r=new Date().toISOString(),a=(0,ep.createProjectObjective)({title:e,teamId:t,key:(0,ep.generateProjectObjectiveKey)(e,n.objectives),summary:h.summary,now:r});v(!0),j(null);try{await l((0,ep.upsertProjectObjective)(n,a));try{await fetch(`/api/projects/${o?.id}/objectives/${a.id}/worker`,{method:"POST",headers:{"Content-Type":"application/json"}})}catch{}b(null),u(a.id)}catch(e){j(e instanceof Error?e.message:"Failed to save objective updates.")}finally{v(!1)}},C=(0,s.useCallback)(e=>{p(t=>{let r=Math.max(240,Math.min(480,t+e));return(0,eu.persistObjectiveListPanelWidth)(r),r})},[]);return a&&!o?(0,t.jsx)(ey,{label:"Loading objectives..."}):o?(0,t.jsxs)("div",{className:"flex h-full min-h-0 overflow-hidden bg-[var(--background)] text-[var(--foreground)]",children:[(0,t.jsxs)("div",{className:"flex flex-shrink-0 flex-col border-r border-[var(--border)] bg-[var(--background)]",style:{width:m},children:[(0,t.jsxs)("div",{className:"flex items-center justify-between border-b border-[var(--border)] px-4 py-3",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsx)("p",{className:"text-xs font-semibold uppercase tracking-[0.12em] text-[var(--muted-foreground)]",children:"Objectives"}),(0,t.jsx)("p",{className:"mt-0.5 text-[11px] text-[var(--muted-foreground)]",children:0===d.length?"None yet":`${d.length} total`})]}),(0,t.jsx)("button",{type:"button",onClick:()=>b(ef()),className:"inline-flex h-7 w-7 items-center justify-center rounded-lg text-[var(--muted-foreground)] transition-colors hover:bg-[var(--secondary)] hover:text-[var(--foreground)]","aria-label":"New objective",children:(0,t.jsx)(x.Plus,{className:"h-4 w-4"})})]}),(0,t.jsx)(ek,{message:g}),(0,t.jsx)("div",{className:"flex-1 overflow-y-auto py-1",children:0===d.length?(0,t.jsxs)("div",{className:"px-4 py-8 text-center",children:[(0,t.jsx)("p",{className:"text-sm text-[var(--muted-foreground)]",children:"No objectives yet."}),(0,t.jsx)("button",{type:"button",onClick:()=>b(ef()),className:"mt-2 text-sm text-[var(--primary)] hover:underline",children:"Create one"})]}):(0,t.jsx)("div",{className:"space-y-0.5",children:d.map(e=>{let r=(0,ep.buildObjectiveTimelineActivities)({objective:e,workspace:n});return(0,t.jsx)(eS,{objective:e,activityCount:r.length,lastActivityAt:r[0]?.createdAt??null,activeAgentIds:y.get(e.id),participants:w,isSelected:c===e.id,onSelect:()=>u(e.id)},e.id)})})})]}),(0,t.jsx)(eN,{onResize:C}),(0,t.jsx)("div",{className:"flex-1 min-w-0 min-h-0 overflow-hidden",children:c?(0,t.jsx)(e$,{projectSlug:e,objectiveId:c,onObjectiveDeleted:()=>u(null)}):(0,t.jsx)("div",{className:"flex h-full items-center justify-center text-sm text-[var(--muted-foreground)]",children:0===d.length?"Create an objective to get started.":"Select an objective from the list."})}),h?(0,t.jsx)(eA,{mode:"create",draft:h,teams:i,isSaving:f,onChange:b,onClose:()=>b(null),onSave:()=>void S()}):null]}):(0,t.jsx)(ey,{label:"Project not found."})}function e$({projectSlug:e,objectiveId:o,onObjectiveDeleted:n}){var i;let l,f,y,k,w,N,C,$,I,A=(0,a.useRouter)(),{isLoading:E,project:O,workspace:M,teams:P,persistWorkspace:L,refetchProject:D}=ev(e),F=(0,s.useMemo)(()=>M.objectives.find(e=>e.id===o)??null,[o,M.objectives]),_=F?(i=F.teamId,P.find(e=>e.id===i)?.name??null):null,[z,J]=(0,s.useState)(null),[q,V]=(0,s.useState)(null),[W,H]=(0,s.useState)("activity"),[B,K]=(0,s.useState)(0),[Y,X]=(0,s.useState)(!1),[Q,Z]=(0,s.useState)(null),[ee,et]=(0,s.useState)([]),[er,ea]=(0,s.useState)(!1),[es,el]=(0,s.useState)(null),[ed,ec]=(0,s.useState)({}),[eu,em]=(0,s.useState)({}),[eh,ef]=(0,s.useState)(new Set),[eg,eN]=(0,s.useState)(!1),[eS,eC]=(0,s.useState)(""),[e$,eA]=(0,s.useState)([]),[eT,eE]=(0,s.useState)([]),[eO,eM]=(0,s.useState)([]),[eP,eR]=(0,s.useState)(null),[eL,eD]=(0,s.useState)(!1),[eF,e_]=(0,s.useState)(null),[ez,eU]=(0,s.useState)(null),[eJ,eq]=(0,s.useState)(null),[eV,eW]=(0,s.useState)(!1),eH=(0,s.useRef)(null),[eB,eK]=(0,s.useState)(!1);(0,s.useEffect)(()=>{let e=eH.current;if(!e)return;let t=()=>eK(e.scrollTop>400);return e.addEventListener("scroll",t,{passive:!0}),()=>e.removeEventListener("scroll",t)},[o]);let eG=(0,s.useCallback)(()=>{eH.current?.scrollTo({top:0,behavior:"smooth"})},[]),{jobs:eY}=(0,R.usePromptJobs)(O?.id??null,{requireProjectId:!0,includeObjectiveJobs:!0,objectiveId:o}),eX=(0,s.useMemo)(()=>eY.filter(e=>e.objectiveId===o).length,[eY,o]),eQ=async e=>{X(!0),Z(null);try{await L(e)}catch(e){throw Z(e instanceof Error?e.message:"Failed to save objective updates."),e}finally{X(!1)}},eZ=async()=>{if(!z||!F)return;let e=z.title.trim();if(!e)return void Z("Objective statement is required.");let t={...F,title:e,updatedAt:new Date().toISOString()};await eQ((0,ep.upsertProjectObjective)(M,t)),J(null)},e0=(0,s.useCallback)(async()=>{if(O?.id&&F?.id){ea(!0);try{let e=await fetch(`/api/projects/${O.id}/objectives/${F.id}/notes?limit=100`);if(e.ok){let t=await e.json();et(t.notes??[])}}catch{}finally{ea(!1)}}},[O?.id,F?.id]);(0,s.useEffect)(()=>{e0()},[e0]);let e1=(0,s.useCallback)(async()=>{if(O?.id&&F?.id)try{let e=await fetch(`/api/projects/${O.id}/objectives/${F.id}/program`);if(e.ok){let t=await e.json();e_(t.program?.content??null),eU(t.program?.path??null)}}catch{}},[O?.id,F?.id]);(0,s.useEffect)(()=>{e1()},[e1]);let e5=(0,s.useCallback)(async()=>{if(O?.id&&F?.id&&null!==eJ){eW(!0);try{let e=await fetch(`/api/projects/${O.id}/objectives/${F.id}/program`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:eJ})});if(e.ok){let t=await e.json();e_(t.program?.content??null),eU(t.program?.path??null),eq(null)}}finally{eW(!1)}}},[O?.id,F?.id,eJ]);(0,s.useEffect)(()=>{"notes"===W&&e0()},[W,e0]),(0,s.useEffect)(()=>{if(!O?.id||!F?.id)return;let e=new Set;for(let[t,r]of Object.entries(ed)){let a=ee.find(e=>e.id===t);a&&a.body!==r&&e.add(t)}for(let[t,r]of Object.entries(eu)){let a=ee.find(e=>e.id===t);a&&a.title!==r&&e.add(t)}if(0===e.size)return;let t=[];for(let r of e){let e={},a=ed[r],s=eu[r],o=ee.find(e=>e.id===r);if(!o||(void 0!==a&&a!==o.body&&(e.body=a),void 0!==s&&s!==o.title&&s.trim()&&(e.title=s.trim()),0===Object.keys(e).length))continue;let n=window.setTimeout(async()=>{ef(e=>new Set(e).add(r));try{let t=await fetch(`/api/projects/${O.id}/objectives/${F.id}/notes/${r}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(t.ok){let e=await t.json();et(t=>t.map(t=>t.id===r?e.note:t))}}catch{Z("Failed to save note.")}finally{ef(e=>{let t=new Set(e);return t.delete(r),t})}},700);t.push(n)}return()=>{for(let e of t)window.clearTimeout(e)}},[ed,eu,ee,O?.id,F?.id]);let e2=async()=>{if(O?.id&&F?.id){eN(!0);try{let e=await fetch(`/api/projects/${O.id}/objectives/${F.id}/notes`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:"Untitled",body:""})});if(e.ok){let t=await e.json();et(e=>[t.note,...e]),el(t.note.id)}}catch{Z("Failed to create note.")}finally{eN(!1)}}},e4=async e=>{if(O?.id&&F?.id)try{let t=await fetch(`/api/projects/${O.id}/objectives/${F.id}/notes/${e}`,{method:"DELETE"});(t.ok||204===t.status)&&(et(t=>t.filter(t=>t.id!==e)),es===e&&el(null))}catch{Z("Failed to delete note.")}},e3=async()=>{!F||window.confirm(`Delete "${F.title}"?`)&&(await eQ((0,ep.removeProjectObjective)(M,F.id)),n?n():A.push(`/projects/${e}`))},e8=(0,s.useCallback)(async e=>{F&&F.threadId!==e&&await eQ((0,ep.upsertProjectObjective)(M,{...F,threadId:e,updatedAt:new Date().toISOString()}))},[F,eQ,M]),e6=(0,s.useCallback)(async e=>{if(!O?.id||!F?.id)return Z("Objective not found."),!1;Z(null);try{let t=await fetch(`/api/projects/${O.id}/objectives/${F.id}/scheduled-tasks`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...e,prompt:function(e,t){let r=t.trim();if(!r)return r;let a=`Objective label: ${e.key}`;return r.toLowerCase().includes(a.toLowerCase())?r:[a,`Write your output as an activity file at ~/.agx/projects/<project>/objectives/${e.key}/activities/<timestamp>-<slug>.md
|
|
19
|
+
The file must have YAML frontmatter with: id (unique), source (your task ID), objectiveLabel: "${e.key}", createdAt (ISO), type (one of: metric-check, status-update, milestone, note).
|
|
20
|
+
The markdown body below the frontmatter contains your output.`,r].join("\n\n")}(F,e.prompt)})}),r=await t.json().catch(()=>({}));if(!t.ok)throw Error(r.error||"Failed to create scheduled task.");return await D(),!0}catch(e){return Z(e instanceof Error?e.message:"Failed to create scheduled task."),!1}},[F,O?.id,D]),e7=(0,s.useCallback)(async()=>{if(!O?.id||!F?.id)return Z("Objective not found."),!1;if(!F.teamId)return Z("Assign a team to this objective before creating a worker."),!1;Z(null);try{let e=await fetch(`/api/projects/${O.id}/objectives/${F.id}/worker`,{method:"PUT"}),t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error||"Failed to trigger objective worker.");return await D(),!0}catch(e){return Z(e instanceof Error?e.message:"Failed to trigger objective worker."),!1}},[F,O?.id,D]);return((0,s.useEffect)(()=>{if(!O?.id||!F?.id||!F?.key){eA([]),eE([]),eM([]);return}let e=O.id,t=F.key,r=!1;return async function(){try{let a=await fetch(`/api/trackers/connections?projectId=${encodeURIComponent(e)}`);if(!a.ok){r||(eA([]),eE([]),eM([]));return}let s=await a.json();if(r)return;let o=Array.isArray(s.available)?s.available:[],n=(s.connections??[]).map(e=>({type:e.type,displayName:o.find(t=>t.type===e.type)?.displayName??e.type,connected:!1!==e.connected})),i="string"==typeof s.defaultTracker&&s.defaultTracker?s.defaultTracker:null;eM(o),eE(n),eR(i);let l=n.filter(e=>e.connected),d=i&&l.some(e=>e.type===i)?l.filter(e=>e.type===i):l;if(0===d.length)return void eA([]);let c=t.trim().toLowerCase(),u=await Promise.all(d.map(async t=>{try{let r=await fetch(`/api/trackers/${encodeURIComponent(t.type)}/items?projectId=${encodeURIComponent(e)}&limit=500`);if(!r.ok)return[];let a=await r.json();return(Array.isArray(a.items)?a.items:[]).filter(e=>(e.labels??[]).some(e=>e.trim().toLowerCase()===c)).map(e=>({id:e.id,trackerType:e.trackerType??t.type,identifier:e.identifier,title:e.title,url:e.url??null,status:e.status,assignee:e.assignee?.name??null,updatedAt:e.updatedAt,labels:e.labels}))}catch{return[]}}));if(r)return;eA(u.flat())}catch(e){if(r)return;console.warn("Failed to load objective tracker resources",e),eA([]),eE([]),eM([])}}(),()=>{r=!0}},[F?.id,F?.key,O?.id]),E&&!O)?(0,t.jsx)(ey,{label:"Loading objective..."}):O?F?(0,t.jsx)("div",{className:"flex h-full min-h-0 flex-col bg-[radial-gradient(circle_at_top_left,rgba(59,130,246,0.1),transparent_28%),var(--background)] text-[var(--foreground)]",children:(0,t.jsx)("div",{className:"flex-1 min-h-0 overflow-hidden",children:(0,t.jsxs)("div",{className:"flex h-full min-h-0 flex-col xl:flex-row",children:[(0,t.jsxs)("div",{className:"relative min-h-0 flex-1 flex flex-col",children:[(0,t.jsx)("div",{ref:eH,className:"min-h-0 flex-1 overflow-y-auto",children:(0,t.jsxs)("div",{className:"max-w-5xl mx-auto pt-16 px-8 pb-20",children:[(0,t.jsx)(ek,{message:Q}),(0,t.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,t.jsx)("span",{className:"rounded-full border border-[var(--tone-neutral-border)] bg-[var(--tone-neutral-bg)] px-2.5 py-0.5 text-[10px] font-mono uppercase tracking-wider text-[var(--tone-neutral)]",children:F.key}),(0,t.jsx)("span",{className:`rounded-full border px-2.5 py-0.5 text-[10px] font-semibold uppercase tracking-[0.18em] ${ex[F.status].chipClass}`,children:ex[F.status].label})]}),(0,t.jsx)("div",{className:"mb-6",children:z?(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("input",{autoFocus:!0,value:z.title,onChange:e=>J({...z,title:e.target.value}),onKeyDown:e=>{"Enter"===e.key&&eZ(),"Escape"===e.key&&J(null)},className:"flex-1 border-b-2 border-[var(--primary)] bg-transparent px-0 py-1 text-[28px] font-semibold leading-tight text-[var(--foreground)] outline-none",placeholder:"Objective statement"}),(0,t.jsx)("button",{type:"button",onClick:()=>void eZ(),disabled:Y,className:"rounded-md p-1.5 text-[var(--primary)] transition-colors hover:bg-[var(--status-in-progress-bg)]","aria-label":"Save objective",children:(0,t.jsx)(c.Check,{size:18})}),(0,t.jsx)("button",{type:"button",onClick:()=>J(null),className:"rounded-md p-1.5 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--muted)]","aria-label":"Cancel editing",children:(0,t.jsx)(j.X,{size:18})})]}):(0,t.jsxs)("button",{type:"button","aria-label":`Edit objective ${F.title}`,className:"flex items-center gap-3 group cursor-pointer text-left",onClick:()=>J({id:F.id,title:F.title,teamId:F.teamId,summary:F.summary}),children:[(0,t.jsx)("h1",{className:"text-[28px] leading-tight font-semibold text-[var(--foreground)]",children:F.title}),(0,t.jsx)(p.Pencil,{size:16,className:"shrink-0 text-[var(--muted-foreground)] opacity-0 transition-opacity group-hover:opacity-100"})]})}),(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-x-6 gap-y-3 mb-10",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsxs)("span",{className:"flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wider text-[var(--muted-foreground)]",children:[(0,t.jsx)(v.Users,{size:12})," Team"]}),(0,t.jsx)("span",{className:"text-[var(--app-shell-soft-text)]",children:"·"}),q?(0,t.jsx)("div",{className:"min-w-[180px]",children:(0,t.jsx)(T.default,{options:P.map(e=>({id:e.id,label:e.name})),value:q.teamId,onChange:e=>{V({teamId:e});let t=e.trim();t&&F&&(eQ((0,ep.upsertProjectObjective)(M,{...F,teamId:t,updatedAt:new Date().toISOString()})),V(null))},placeholder:"Select a team…"})}):(0,t.jsxs)("button",{type:"button","aria-label":`Edit team for ${F.title}`,onClick:()=>V({teamId:F.teamId}),className:"group -mx-1.5 -my-0.5 flex items-center gap-2 rounded px-1.5 py-0.5 transition-colors hover:bg-[var(--muted)]",children:[(0,t.jsx)("div",{className:"w-5 h-5 rounded-full bg-blue-500/20 text-blue-400 flex items-center justify-center text-[10px] font-bold border border-blue-500/30",children:(_??"?").charAt(0).toUpperCase()}),(0,t.jsx)("span",{className:"text-sm text-[var(--foreground)] transition-colors group-hover:text-[var(--primary)]",children:_??"Not assigned"})]})]}),O.id&&F.id?(0,t.jsx)(eo,{projectId:O.id,objectiveId:F.id,objectiveKey:F.key,metadata:O.metadata,currentProgress:F.progress,currentStatus:F.status,objectiveUpdatedAt:F.updatedAt}):null]}),(0,t.jsxs)("div",{className:"mb-6 rounded-xl border border-[var(--border)] bg-[var(--card-bg)]",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between border-b border-[var(--border)] px-4 py-2.5",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(m.FileText,{size:14,className:"text-[var(--muted-foreground)]"}),(0,t.jsx)("span",{className:"text-xs font-semibold uppercase tracking-wider text-[var(--muted-foreground)]",children:"Program"}),ez?(0,t.jsx)("span",{className:"font-mono text-[10px] text-[var(--muted-foreground)] opacity-70",children:ez.replace(/^.*\/\.agx\//,"~/.agx/")}):null]}),null===eJ?(0,t.jsx)("button",{type:"button",onClick:()=>eq(eF??""),className:"rounded-md p-1 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--muted)] hover:text-[var(--foreground)]","aria-label":"Edit program",children:(0,t.jsx)(p.Pencil,{size:14})}):(0,t.jsxs)("div",{className:"flex items-center gap-1",children:[(0,t.jsx)("button",{type:"button",onClick:()=>void e5(),disabled:eV,className:"rounded-md p-1 text-[var(--primary)] transition-colors hover:bg-[var(--status-in-progress-bg)] disabled:opacity-50","aria-label":"Save program",children:(0,t.jsx)(c.Check,{size:14})}),(0,t.jsx)("button",{type:"button",onClick:()=>eq(null),className:"rounded-md p-1 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--muted)]","aria-label":"Cancel editing",children:(0,t.jsx)(j.X,{size:14})})]})]}),(0,t.jsx)("div",{className:"px-4 py-3",children:null!==eJ?(0,t.jsx)("textarea",{autoFocus:!0,value:eJ,onChange:e=>eq(e.target.value),rows:8,placeholder:"Goal: why this exists\n\nDefinition of better: the metric or signal that says we're done\n\nBlast radius: paths/systems in scope, what's off-limits\n\nNotes: things we've learned",className:"w-full resize-y rounded-md border border-[var(--border)] bg-[var(--background)] px-3 py-2 font-mono text-xs text-[var(--foreground)] outline-none focus:border-[var(--primary)]"}):eF&&eF.trim().length>0?(0,t.jsx)("div",{className:"prose prose-sm max-w-none text-sm text-[var(--foreground)]",children:(0,t.jsx)(S.Markdown,{content:eF})}):(0,t.jsxs)("p",{className:"text-sm text-[var(--muted-foreground)]",children:["No program yet. Define what ",(0,t.jsx)("em",{children:"better"})," looks like for this objective — the metric, the scope, any constraints. Agents read this before every run, and will ask for it in chat if it's missing."]})})]}),(0,t.jsx)("div",{className:"mb-6",children:(0,t.jsxs)("button",{type:"button",onClick:async()=>{eD(!0),await e7(),eD(!1)},disabled:eL,className:"inline-flex items-center gap-2 rounded-xl border border-[var(--status-completed-border)] bg-[var(--status-completed-bg)] px-3 py-2 text-sm text-[var(--status-completed-text)] transition-opacity hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50",children:[(0,t.jsx)(g.Sparkles,{className:"h-4 w-4"}),eL?"Working...":"Work on objective"]})}),(0,t.jsx)("div",{className:"mb-8 border-b border-[var(--border)]",children:(0,t.jsx)("nav",{className:"flex gap-1 -mb-px","aria-label":"Objective sections",children:[{id:"activity",label:"Activity",icon:u.Clock},{id:"notes",label:"Notes",icon:m.FileText},{id:"tasks",label:"Tasks",icon:e=>{let r=eT.filter(e=>e.connected),a=(eP&&r.some(e=>e.type===eP)?eP:r[0]?.type)??"tracker";return(0,t.jsx)(en.TrackerIcon,{trackerType:a,className:"h-3.5 w-3.5"})}},{id:"scheduled-tasks",label:"Scheduled Jobs",icon:d}].map(e=>{let r,a;return(0,t.jsxs)("button",{type:"button",onClick:()=>H(e.id),className:`flex items-center gap-2 px-3 py-2.5 text-sm font-medium border-b-2 transition-colors ${W===e.id?"border-[var(--primary)] text-[var(--foreground)]":"border-transparent text-[var(--muted-foreground)] hover:border-[var(--border)] hover:text-[var(--foreground)]"}`,children:[(0,t.jsx)(e.icon,{size:14}),e.label,"activity"===e.id&&B>0&&(0,t.jsx)("span",{className:"rounded-full bg-[var(--tone-neutral-bg)] px-1.5 py-0.5 font-mono text-[10px] text-[var(--tone-neutral)]",children:B}),"notes"===e.id&&ee.length>0&&(0,t.jsx)("span",{className:"rounded-full bg-[var(--tone-neutral-bg)] px-1.5 py-0.5 font-mono text-[10px] text-[var(--tone-neutral)]",children:ee.length}),"tasks"===e.id&&(r=["done","canceled","cancelled","completed","duplicate"],(a=e$.filter((e,t,a)=>a.findIndex(t=>t.id===e.id)===t&&!r.includes(e.status.toLowerCase()))).length>0?(0,t.jsx)("span",{className:"rounded-full bg-[var(--tone-neutral-bg)] px-1.5 py-0.5 font-mono text-[10px] text-[var(--tone-neutral)]",children:a.length}):null),"scheduled-tasks"===e.id&&eX>0&&(0,t.jsx)("span",{className:"rounded-full bg-[var(--tone-neutral-bg)] px-1.5 py-0.5 font-mono text-[10px] text-[var(--tone-neutral)]",children:eX})]},e.id)})})}),(0,t.jsxs)("div",{className:"space-y-10",children:["notes"===W&&(0,t.jsxs)("section",{className:"space-y-4",children:[(0,t.jsxs)("div",{className:"flex gap-2 items-center",children:[(0,t.jsxs)("div",{className:"relative flex-1",children:[(0,t.jsx)(h.Search,{size:14,className:"absolute left-3 top-1/2 -translate-y-1/2 text-[var(--muted-foreground)]"}),(0,t.jsx)("input",{type:"text",value:eS,onChange:e=>eC(e.target.value),placeholder:"Search notes...",className:"w-full rounded-md border border-[var(--border)] bg-[var(--input)] py-1.5 pl-8 pr-3 text-sm text-[var(--foreground)] placeholder:text-[var(--app-shell-soft-text)] focus:border-[var(--primary)] focus:outline-none"})]}),(0,t.jsxs)("button",{type:"button",onClick:e2,disabled:eg,className:"flex items-center gap-1.5 rounded-md border border-[var(--status-in-progress-border)] bg-[var(--status-in-progress-bg)] px-3 py-1.5 text-sm font-medium text-[var(--status-in-progress-text)] transition-opacity hover:opacity-90 disabled:opacity-50",children:[(0,t.jsx)(x.Plus,{size:14}),"New note"]})]}),er?(0,t.jsx)("p",{className:"py-4 text-sm text-[var(--muted-foreground)]",children:"Loading notes..."}):0===ee.length?(0,t.jsx)("p",{className:"text-sm text-[var(--muted-foreground)] py-4",children:"No notes yet. Add one above."}):0===(f=(l=eS.toLowerCase())?ee.filter(e=>e.title.toLowerCase().includes(l)||e.body.toLowerCase().includes(l)):ee).length?(0,t.jsx)("p",{className:"text-sm text-[var(--muted-foreground)] py-4",children:"No notes match your search."}):(0,t.jsx)("div",{className:"columns-1 gap-3 sm:columns-2 lg:columns-3",style:{columnFill:"balance"},children:f.map(e=>(0,t.jsxs)("button",{type:"button",onClick:()=>el(e.id),className:"mb-3 block w-full break-inside-avoid overflow-hidden rounded-lg border border-[var(--border)] bg-[var(--overlay-panel-muted)] text-left transition-shadow hover:shadow-md",children:[(0,t.jsx)("div",{className:"px-3 pt-3 pb-1",children:(0,t.jsx)("h4",{className:"text-sm font-medium text-[var(--foreground)] leading-snug",children:e.title})}),e.body.trim()&&(0,t.jsx)("div",{className:"px-3 pb-2 text-xs text-[var(--muted-foreground)] line-clamp-4",children:(0,t.jsx)(S.Markdown,{content:e.body})}),(0,t.jsx)("div",{className:"flex items-center justify-between px-3 pb-2",children:(0,t.jsx)("span",{className:"text-[10px] text-[var(--muted-foreground)]",children:new Date(e.updatedAt).toLocaleDateString()})})]},e.id))}),es&&(()=>{let e=ee.find(e=>e.id===es);if(!e)return null;let r=ed[e.id]??e.body,a=eu[e.id]??e.title,s=eh.has(e.id);return(0,t.jsx)("div",{className:"fixed inset-0 z-50 flex items-start justify-center bg-black/50 pt-[5vh]",onClick:e=>{e.target===e.currentTarget&&el(null)},children:(0,t.jsxs)("div",{className:"mx-6 w-full max-w-7xl rounded-xl border border-[var(--border)] bg-[var(--background)] shadow-xl",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between border-b border-[var(--border)] px-5 py-3",children:[(0,t.jsx)("input",{type:"text",autoFocus:!0,value:a,onFocus:e=>{"Untitled"===a&&e.target.select()},onChange:t=>em(r=>({...r,[e.id]:t.target.value})),className:"flex-1 bg-transparent text-base font-semibold text-[var(--foreground)] focus:outline-none"}),(0,t.jsxs)("div",{className:"flex items-center gap-2 ml-3",children:[(0,t.jsx)("span",{className:"text-[11px] text-[var(--muted-foreground)]",children:s?"Saving...":new Date(e.updatedAt).toLocaleDateString()}),(0,t.jsx)("button",{type:"button",onClick:()=>e4(e.id),className:"p-1 text-[var(--muted-foreground)] transition-colors hover:text-[var(--destructive)]",children:(0,t.jsx)(b.Trash2,{size:14})}),(0,t.jsx)("button",{type:"button",onClick:()=>el(null),className:"p-1 text-[var(--muted-foreground)] transition-colors hover:text-[var(--foreground)]",children:(0,t.jsx)(j.X,{size:14})})]})]}),(0,t.jsx)("div",{className:"max-h-[75vh] overflow-y-auto px-5 py-4",children:(0,t.jsx)(ew,{content:r,editable:!0,onChange:t=>ec(r=>({...r,[e.id]:t})),placeholder:"Write your note..."})})]})})})()]}),"activity"===W&&O.id&&F.id&&(0,t.jsx)(G,{projectId:O.id,objectiveId:F.id,onTotalChange:K}),"tasks"===W&&(y=e$.filter((e,t,r)=>r.findIndex(t=>t.id===e.id)===t),k=["done","canceled","cancelled","completed","duplicate"],w=y.filter(e=>!k.includes(e.status.toLowerCase())),N=y.filter(e=>k.includes(e.status.toLowerCase())).slice(-5),C=eT.filter(e=>e.connected),I=0===($=eP&&C.some(e=>e.type===eP)?C.filter(e=>e.type===eP):C).length?null:$.map(e=>e.displayName).join(", "),(0,t.jsxs)("section",{children:[(0,t.jsx)("div",{className:"flex flex-wrap items-start justify-between gap-3 mb-4",children:(0,t.jsxs)("p",{className:"text-sm text-[var(--muted-foreground)]",children:["Tickets tracked by the objective label"," ",(0,t.jsx)("code",{className:"rounded bg-[var(--tone-neutral-bg)] px-1.5 py-0.5 font-mono text-[11px] text-[var(--foreground)]",children:F.key}),I?(0,t.jsxs)(t.Fragment,{children:[" across ",I,"."]}):"."]})}),0===$.length?(0,t.jsx)(eI,{label:0===eO.length?"No tracker integrations registered.":`Connect a tracker (${eO.map(e=>e.displayName).join(", ")}) to create and track tickets for this objective.`}):0===y.length?(0,t.jsx)(eI,{label:`No tracker tickets with label ${F.key} yet.`}):(0,t.jsxs)(t.Fragment,{children:[w.length>0&&(0,t.jsx)("div",{className:"space-y-3",children:w.map(r=>(0,t.jsxs)("div",{className:"rounded-xl border border-[var(--border)] bg-[var(--overlay-panel-muted)] p-4",children:[(0,t.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsxs)("div",{className:"flex items-center gap-1.5 text-xs font-semibold uppercase tracking-[0.18em] text-[var(--muted-foreground)]",children:[(0,t.jsx)(en.TrackerIcon,{trackerType:r.trackerType,className:"h-3 w-3"}),(0,t.jsx)("span",{children:r.identifier})]}),(0,t.jsx)("a",{href:r.url??`/projects/${e}/tracking/${r.trackerType}?issue=${r.id}`,target:r.url?"_blank":void 0,rel:r.url?"noreferrer":void 0,className:"mt-1 block text-sm font-medium text-[var(--foreground)] transition-colors hover:text-[var(--primary)]",children:r.title})]}),(0,t.jsx)("span",{className:"rounded-full border border-[var(--tone-neutral-border)] px-2 py-1 text-[10px] font-semibold uppercase tracking-[0.18em] text-[var(--tone-neutral)]",children:r.status})]}),(0,t.jsxs)("div",{className:"mt-3 flex flex-wrap items-center gap-2 text-[11px] text-[var(--muted-foreground)]",children:[(0,t.jsxs)("span",{children:["Updated ",eb(r.updatedAt)]}),(0,t.jsx)("span",{children:r.assignee?`Assigned to ${r.assignee}`:"Unassigned"})]})]},r.id))}),N.length>0&&(0,t.jsxs)("div",{className:w.length>0?"mt-6":"",children:[(0,t.jsx)("p",{className:"text-[11px] font-medium uppercase tracking-[0.18em] text-[var(--muted-foreground)] mb-2",children:"Completed"}),(0,t.jsx)("div",{className:"space-y-0.5",children:N.map(r=>(0,t.jsxs)("a",{href:r.url??`/projects/${e}/tracking/${r.trackerType}?issue=${r.id}`,target:r.url?"_blank":void 0,rel:r.url?"noreferrer":void 0,className:"group flex items-center gap-3 rounded-md px-2 py-1.5 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--muted)] hover:text-[var(--foreground)]",children:[(0,t.jsx)(en.TrackerIcon,{trackerType:r.trackerType,className:"h-3 w-3 shrink-0"}),(0,t.jsx)("span",{className:"text-[11px] font-mono shrink-0",children:r.identifier}),(0,t.jsx)("span",{className:"text-[12px] truncate",children:r.title}),(0,t.jsx)("span",{className:"ml-auto shrink-0 text-[10px] text-[var(--app-shell-soft-text)] group-hover:text-[var(--muted-foreground)]",children:r.status})]},r.id))})]})]})]})),"scheduled-tasks"===W&&(0,t.jsx)("section",{children:(0,t.jsx)(U,{projectId:O.id,objectiveId:F.id,objectiveKey:F.key,createDefaults:{name:`Work on ${F.title}`},onCreateTask:e6})}),(0,t.jsxs)("section",{className:"pt-10",children:[(0,t.jsx)("div",{className:"mb-4",children:(0,t.jsx)("h2",{className:"text-sm font-semibold text-[var(--destructive)]",children:"Danger Zone"})}),(0,t.jsxs)("div",{className:"flex items-center justify-between rounded-xl border border-[var(--destructive-border)] bg-[var(--destructive-bg)] p-5",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"text-sm font-medium text-[var(--foreground)]",children:"Delete Objective"}),(0,t.jsx)("p",{className:"mt-1 text-sm text-[var(--muted-foreground)]",children:"Once you delete an objective, there is no going back."})]}),(0,t.jsxs)("button",{type:"button",onClick:()=>void e3(),"aria-label":`Delete objective ${F.title}`,className:"flex items-center gap-2 whitespace-nowrap rounded-md border border-[var(--destructive-border)] bg-[var(--destructive-bg)] px-3 py-1.5 text-sm font-medium text-[var(--destructive)] transition-opacity hover:opacity-90",children:[(0,t.jsx)(b.Trash2,{size:14})," Delete"]})]})]})]})]})}),(0,t.jsx)(ei.JumpToLatestButton,{visible:eB,direction:"top",onClick:eG})]}),(0,t.jsx)(ej,{projectId:O.id,projectSlug:e,objective:F,teamName:_,trackerConnections:eT,availableTrackers:eO,defaultTrackerType:eP,onThreadLinked:e8,onObjectiveUpdated:D})]})})}):(0,t.jsx)("div",{className:"flex h-full items-center justify-center px-4 bg-[var(--background)]",children:(0,t.jsxs)("div",{className:"rounded-xl border border-[var(--border)] bg-[var(--card-bg)] p-8 text-center",children:[(0,t.jsx)("p",{className:"text-lg font-semibold text-[var(--foreground)]",children:"Objective not found"}),(0,t.jsx)("p",{className:"mt-2 text-sm text-[var(--muted-foreground)]",children:"It may have been deleted or the link is stale."}),(0,t.jsx)(r.default,{href:`/projects/${e}`,className:"mt-4 inline-flex items-center gap-2 rounded-md border border-[var(--border)] bg-[var(--card-bg)] px-3 py-1.5 text-sm text-[var(--foreground)] transition-colors hover:bg-[var(--secondary)]",children:"Back to objectives"})]})}):(0,t.jsx)(ey,{label:"Project not found."})}function eI({label:e}){return(0,t.jsx)("div",{className:"flex items-center rounded-xl border border-dashed border-[var(--border)] bg-[var(--overlay-panel-muted)] p-6",children:(0,t.jsx)("p",{className:"text-sm text-[var(--muted-foreground)]",children:e})})}function eA({mode:e,draft:r,teams:a=[],isSaving:s,onChange:o,onClose:n,onSave:i}){return(0,t.jsx)("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/45 p-4",children:(0,t.jsxs)("div",{role:"dialog","aria-modal":"true","aria-label":"edit"===e?"Edit objective":"New objective",className:"w-full max-w-3xl overflow-hidden rounded-[32px] border border-[var(--border)] bg-[var(--overlay-panel-strong)] shadow-2xl",children:[(0,t.jsxs)("div",{className:"border-b border-[var(--border)] px-5 py-4",children:[(0,t.jsx)("h3",{className:"text-lg font-semibold text-[var(--foreground)]",children:"edit"===e?"Edit objective":"New objective"}),(0,t.jsx)("p",{className:"mt-1 text-sm text-[var(--muted-foreground)]",children:"edit"===e?"Update the tracking details for this objective.":"Keep the statement measurable and use notes only for context that matters."})]}),(0,t.jsxs)("div",{className:"space-y-4 px-5 py-5",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)(eT,{label:"Objective statement"}),(0,t.jsx)("input",{value:r.title,onChange:e=>o({...r,title:e.target.value}),className:"w-full rounded-2xl border border-[var(--border)] bg-[var(--input)] px-4 py-3 text-sm text-[var(--foreground)] outline-none transition-colors focus:border-[var(--primary)]",placeholder:"Get 50 qualified visitors daily"})]}),"create"===e?(0,t.jsxs)("div",{children:[(0,t.jsx)(eT,{label:"Team"}),(0,t.jsxs)("select",{value:r.teamId,onChange:e=>o({...r,teamId:e.target.value}),className:"w-full rounded-2xl border border-[var(--border)] bg-[var(--input)] px-3 py-3 text-sm text-[var(--foreground)] outline-none transition-colors focus:border-[var(--primary)]",children:[(0,t.jsx)("option",{value:"",children:"Select a team"}),a.map(e=>(0,t.jsx)("option",{value:e.id,children:e.name},e.id))]}),(0,t.jsx)("p",{className:"mt-2 text-xs text-[var(--muted-foreground)]",children:"Teams can only own one objective at a time."})]}):null]}),(0,t.jsxs)("div",{className:"flex items-center justify-end gap-2 border-t border-[var(--border)] px-5 py-4",children:[(0,t.jsx)("button",{type:"button",onClick:n,className:"rounded-xl border border-[var(--border)] px-3 py-2 text-sm text-[var(--muted-foreground)] transition-colors hover:text-[var(--foreground)]",children:"Cancel"}),(0,t.jsx)("button",{type:"button",onClick:i,disabled:s,className:"rounded-xl border border-[var(--status-in-progress-border)] bg-[var(--status-in-progress-bg)] px-3 py-2 text-sm font-medium text-[var(--status-in-progress-text)] transition-opacity hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50",children:s?"Saving...":"edit"===e?"Save objective":"Create objective"})]})]})})}function eT({label:e}){return(0,t.jsx)("label",{className:"mb-2 block text-[11px] font-semibold uppercase tracking-[0.18em] text-[var(--muted-foreground)]",children:e})}e.s(["ProjectObjectivesOverview",()=>eC],568656)}]);
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,248004,e=>{"use strict";let t=(0,e.i(363732).default)("settings-2",[["path",{d:"M14 17H5",key:"gfn3mx"}],["path",{d:"M19 7h-9",key:"6i9tg"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]]);e.s(["Settings2",()=>t],248004)},790185,e=>{"use strict";function t({state:e,nextScheduledAt:t,lastCompletedAt:r,inProgress:s=!1,now:a=Date.now()}){return"active"===e&&!s&&null!=t&&!(t>=a)&&(null==r||!(r>=t))}e.s(["isScheduledRunOverdue",()=>t])},827430,e=>{"use strict";var t=e.i(762281),r=e.i(935851),s=e.i(810605),a=e.i(353899),n=e.i(245900),d=e.i(794731),l=e.i(929870),o=e.i(797167),i=e.i(580873),c=e.i(558201),u=e.i(203096),x=e.i(498027),m=e.i(248004),p=e.i(640481),f=e.i(169610),h=e.i(519132),g=e.i(8707),v=e.i(66386),b=e.i(715908),j=e.i(945028),N=e.i(490011),w=e.i(208343),y=e.i(352687),k=e.i(423709),C=e.i(990933),S=e.i(553069),I=e.i(790185),R=e.i(667480);let $=[{value:"prompt",label:"Prompt",description:"Run a prompt on a schedule"},{value:"linear_worker",label:"Linear Worker",description:"Observe Linear workspace and decide what to work on"}],z=(0,a.default)(()=>e.A(501223).then(e=>e.Composer),{loadableGenerated:{modules:[844118]},ssr:!1}),P=(0,a.default)(()=>e.A(469612),{loadableGenerated:{modules:[668610]},ssr:!1});function M(e){return(0,I.isScheduledRunOverdue)({state:e.state,nextScheduledAt:e.nextRunAt,lastCompletedAt:e.lastRunAt})}function A(e,t){if("paused"===t)return"Paused";if("stopped"===t)return"Stopped";if(null===e)return"Pending...";let r=e-Date.now();return r<0?"Overdue":r<6e4?`in ${Math.round(r/1e3)}s`:r<36e5?`in ${Math.round(r/6e4)}m`:r<864e5?`in ${Math.round(r/36e5)}h`:`in ${Math.round(r/864e5)}d`}function T(e){if(!e)return"—";let t=new Date(e);return t.toLocaleDateString("en-US",{month:"short",day:"numeric"})+", "+t.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit"})}function E({children:e}){return(0,t.jsx)("div",{className:"text-[10px] font-bold uppercase tracking-[0.12em] text-[var(--muted-foreground)]",children:e})}function _({children:e}){return(0,t.jsx)("label",{className:"block text-[10px] font-semibold text-[var(--muted-foreground)] uppercase tracking-widest mb-2",children:e})}function D(e,t,r=24){let s=t?t.replace("#",""):"e2e8f0";return`https://api.dicebear.com/9.x/bottts-neutral/svg?seed=${encodeURIComponent(e)}&size=${r}&backgroundColor=${s}`}function U({agents:e,value:s,onChange:a}){let[n,d]=(0,r.useState)(!1),[l,o]=(0,r.useState)(""),i=e.find(e=>e.id===s);(0,r.useEffect)(()=>{n||o("")},[n]);let c=l.trim().toLowerCase(),u=c?e.filter(e=>e.name.toLowerCase().includes(c)||e.provider.toLowerCase().includes(c)||(e.model??"").toLowerCase().includes(c)):e;return(0,t.jsxs)("div",{className:"relative",children:[(0,t.jsx)(_,{children:"Agent"}),(0,t.jsxs)("button",{type:"button",onClick:()=>d(!n),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)]",children:[i?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("img",{src:D(i.id,i.color),alt:"",className:"size-6 rounded-full shrink-0"}),(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsx)("div",{className:"text-xs font-medium text-[var(--foreground)] truncate",children:i.name}),(0,t.jsxs)("div",{className:"text-[10px] text-[var(--muted-foreground)]",children:[i.provider,i.model?` / ${i.model}`:""]})]})]}):(0,t.jsx)("span",{className:"text-xs text-[var(--muted-foreground)]",children:"Select an agent..."}),(0,t.jsx)(x.ChevronDown,{size:14,className:`ml-auto text-[var(--muted-foreground)] transition-transform ${n?"rotate-180":""}`})]}),n&&(0,t.jsxs)("div",{className:"absolute z-20 mt-1 w-full rounded-lg border border-[var(--card-border)] bg-[var(--card-bg)] shadow-lg flex flex-col max-h-[320px]",children:[(0,t.jsx)("div",{className:"sticky top-0 shrink-0 border-b border-[var(--card-border)] bg-[var(--card-bg)] px-2 py-2",children:(0,t.jsxs)("div",{className:"relative",children:[(0,t.jsx)(g.Search,{size:12,className:"absolute left-2.5 top-1/2 -translate-y-1/2 text-[var(--muted-foreground)]"}),(0,t.jsx)("input",{type:"text",value:l,onChange:e=>o(e.target.value),autoFocus:!0,placeholder:"Search agents...",className:"w-full rounded-md border border-[var(--card-border)] bg-[var(--muted)] pl-7 pr-2 py-1.5 text-xs text-[var(--foreground)] placeholder:text-[var(--muted-foreground)] focus:outline-none focus:border-[var(--foreground)]"})]})}),(0,t.jsx)("div",{className:"min-h-0 flex-1 overflow-y-auto",children:0===u.length?(0,t.jsxs)("div",{className:"px-3 py-4 text-center text-[11px] text-[var(--muted-foreground)]",children:['No agents match "',l,'"']}):u.map(e=>(0,t.jsxs)("button",{type:"button",onClick:()=>{a(e.id),d(!1)},className:`w-full flex items-center gap-2.5 px-3 py-2.5 text-left transition-colors hover:bg-[var(--muted)] ${s===e.id?"bg-[var(--muted)]":""}`,children:[(0,t.jsx)("img",{src:D(e.id,e.color),alt:"",className:"size-6 rounded-full shrink-0"}),(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsx)("div",{className:"text-xs font-medium text-[var(--foreground)] truncate",children:e.name}),(0,t.jsxs)("div",{className:"text-[10px] text-[var(--muted-foreground)]",children:[e.provider,e.model?` / ${e.model}`:""]})]}),s===e.id&&(0,t.jsx)("span",{className:"text-xs text-[var(--foreground)]",children:"✓"})]},e.id))})]})]})}function L({onClose:e,onSubmit:s,editingJob:a,createDefaults:n,contextLabel:d}){let[l,i]=(0,r.useState)([]),[c,u]=(0,r.useState)(a?.executionMode??n?.executionMode??"prompt"),[p,f]=(0,r.useState)(a?.name??n?.name??""),[h,g]=(0,r.useState)(a?.prompt??n?.prompt??""),[v,b]=(0,r.useState)(a?.agentId??n?.agentId??""),[j,N]=(0,r.useState)(a?.provider??n?.provider??"claude"),[w,y]=(0,r.useState)(a?.model??n?.model??"");(0,r.useEffect)(()=>{fetch("/api/prompt-jobs/agents").then(e=>e.json()).then(e=>i(e.agents??[])).catch(e=>console.warn("[PromptJobBoard] fetch agents failed:",e))},[]);let[k,C]=(0,r.useState)(a?.cliArgs??n?.cliArgs??""),[S,I]=(0,r.useState)(a?.cronExpr||a?.cadence||n?.cadence||""),[$,z]=(0,r.useState)(a?.condition??n?.condition??""),[M,A]=(0,r.useState)(!!(a?.cronExpr||a?.cadence||n?.cadence)),[T,E]=(0,r.useState)(a?.catchUpPolicy??n?.catchUpPolicy??"fire_once"),[D,L]=(0,r.useState)(!!a?.cliArgs||!!n?.cliArgs||a?.catchUpPolicy!=null&&"fire_once"!==a.catchUpPolicy||n?.catchUpPolicy!=null&&"fire_once"!==n.catchUpPolicy),[F,O]=(0,r.useState)(!1),q=async t=>{t.preventDefault(),p.trim()&&h.trim()&&S.trim()&&M&&(O(!0),await s({name:p.trim(),prompt:h.trim(),agentId:v,provider:j,model:w.trim(),cliArgs:k.trim(),catchUpPolicy:T,cadence:S.trim(),condition:$.trim(),executionMode:c}),O(!1),e())};return(0,t.jsxs)("div",{className:"h-full flex flex-col text-[var(--foreground)]",children:[(0,t.jsxs)("div",{className:"h-14 shrink-0 border-b border-[var(--card-border)] flex items-center justify-between px-6",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)("button",{onClick:e,className:"p-1.5 rounded-md text-[var(--muted-foreground)] hover:text-[var(--foreground)] hover:bg-[var(--muted)] transition-colors",children:(0,t.jsx)(o.X,{size:18})}),(0,t.jsx)("h2",{className:"text-sm font-semibold",children:a?"Edit Scheduled Task":"New Scheduled Task"}),d?(0,t.jsx)("span",{className:"rounded-full border border-sky-500/25 bg-sky-500/10 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-[0.16em] text-sky-100",children:d}):null]}),(0,t.jsx)("button",{onClick:q,disabled:F||!p.trim()||!h.trim()||!S.trim()||!M,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",children:F?"Saving...":a?"Save Changes":"Create Task"})]}),(0,t.jsxs)("div",{className:"flex flex-1 min-h-0 overflow-hidden",children:[(0,t.jsxs)("div",{className:"flex-1 border-r border-[var(--card-border)] flex flex-col min-w-0",children:[(0,t.jsx)("div",{className:"px-8 pt-8 pb-4",children:(0,t.jsx)("input",{type:"text",value:p,onChange:e=>f(e.target.value),placeholder:"Untitled job",className:"w-full text-2xl font-bold bg-transparent border-none outline-none placeholder:text-[var(--muted-foreground)]/40 text-[var(--foreground)]",autoFocus:!0})}),(0,t.jsxs)("div",{className:"flex-1 px-8 pb-8 overflow-y-auto",children:[(0,t.jsx)(_,{children:"Instructions"}),(0,t.jsx)("div",{className:"bg-[var(--card-bg)] border border-[var(--card-border)] rounded-xl overflow-hidden min-h-[300px]",children:(0,t.jsx)(P,{content:h,onChange:e=>g(e),placeholder:"Describe what this prompt should do..."})})]})]}),(0,t.jsxs)("div",{className:"w-[380px] shrink-0 overflow-y-auto p-6 space-y-6",children:[(0,t.jsx)(U,{agents:l,value:v,onChange:e=>{b(e);let t=l.find(t=>t.id===e);t?(N(t.provider),y(t.model??"")):(N("claude"),y(""))}}),(0,t.jsx)(R.ScheduleConditionPicker,{value:{cadence:S,condition:$},onChange:(e,t)=>{I(e.cadence),z(e.condition),A(t.isScheduleValid)},scheduleLabel:"Schedule",conditionLabel:"Condition",conditionHelpText:"Scheduled runs and Run now will check this condition before executing."}),(0,t.jsxs)("div",{children:[(0,t.jsxs)("button",{type:"button",onClick:()=>L(!D),className:"flex items-center gap-1.5 text-[11px] text-[var(--muted-foreground)] hover:text-[var(--foreground)] transition-colors",children:[(0,t.jsx)(m.Settings2,{size:12})," ",D?"Hide":"Show"," advanced",(0,t.jsx)(x.ChevronDown,{size:12,className:`transition-transform ${D?"rotate-180":""}`})]}),D&&(0,t.jsxs)("div",{className:"mt-3 space-y-3 pt-3 border-t border-[var(--card-border)]",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)(_,{children:"CLI Arguments"}),(0,t.jsx)("input",{type:"text",value:k,onChange:e=>C(e.target.value),placeholder:"--dangerously-skip-permissions",className:"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"}),(0,t.jsx)("p",{className:"text-[10px] text-[var(--muted-foreground)] mt-1",children:"Extra flags passed to the CLI command."})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)(_,{children:"When missed"}),(0,t.jsx)("div",{className:"space-y-1.5",children:[{id:"fire_once",label:"Run once on recovery",desc:"Execute a single run regardless of how many were missed"},{id:"replay_all",label:"Run all missed",desc:"Queue one run per missed occurrence (use with caution)"},{id:"skip",label:"Skip and wait for next",desc:"Discard missed runs, wait for the next scheduled time"}].map(e=>(0,t.jsxs)("button",{type:"button",onClick:()=>E(e.id),className:`w-full text-left px-3 py-2 rounded-lg border transition-all ${T===e.id?"border-[var(--foreground)] bg-[var(--foreground)]/5":"border-[var(--card-border)] bg-[var(--muted)] hover:border-[var(--muted-foreground)]"}`,children:[(0,t.jsx)("div",{className:"text-xs font-medium text-[var(--foreground)]",children:e.label}),(0,t.jsx)("div",{className:"text-[10px] text-[var(--muted-foreground)]",children:e.desc})]},e.id))})]})]})]})]})]})]})}function F(e){let t=Math.floor(e/1e3);if(t<60)return`${t}s`;let r=Math.floor(t/60);if(r<60)return`${r}m ${t%60}s`;let s=Math.floor(r/60);return`${s}h ${r%60}m`}function O(e){return e?new Date(e).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"}):"—"}function q({run:e,job:s,agentMap:a,onCancelRun:n,onRerun:d}){let l=`prompt-run:${e.id}`,m=s.agentId&&a[s.agentId]?a[s.agentId].name:null,p=s.agentId?a[s.agentId]:null,g="running"===e.status||"queued"===e.status,v=function(e,t){let[s,a]=(0,r.useState)(null);return(0,r.useEffect)(()=>{if(!e||!t)return void a(null);let r=new Date(e).getTime(),s=()=>a(Math.max(0,Date.now()-r));s();let n=setInterval(s,1e3);return()=>clearInterval(n)},[e,t]),s}(e.startedAt,"running"===e.status),[b,y]=(0,r.useState)(!1),[S,I]=(0,r.useState)(new Set);(0,r.useEffect)(()=>{s.projectId&&fetch(`/api/projects/${encodeURIComponent(s.projectId)}/agents`).then(e=>e.json()).then(e=>{I(new Set((e.agents??[]).map(e=>e.agent_id)))}).catch(e=>console.warn("[PromptJobBoard] fetch project agents failed:",e))},[s.projectId]);let R=(0,r.useMemo)(()=>Object.values(a).filter(e=>S.has(e.id)).map(e=>({id:e.id,name:e.name,title:e.title??void 0,provider:e.provider??"claude",model:e.model,color:e.color})),[a,S]),$=(0,r.useMemo)(()=>`run-root:${e.id}`,[e.id]),{messages:P,setMessages:M,sendMessage:A,loadHistory:T,chatRuns:E,stop:_}=(0,j.useGroupChat)(l),{processes:U,streaming:L,chatRuns:q}=(0,N.useProcessPolling)({workspaceId:l,threadId:$},{messages:P,setMessages:M}),J=(0,r.useMemo)(()=>{let e=[...E];for(let t of q)e.some(e=>e.chatRunId===t.chatRunId)||e.push(t);return e},[E,q]),B=J.some(e=>"queued"===e.status||"running"===e.status)||U.some(e=>"spawning"===e.state||"running"===e.state),H=B?J.some(e=>"queued"===e.status)?"queued":"working":"ready",W=(0,r.useRef)(!1);(0,r.useEffect)(()=>{T().then(()=>{if(!W.current){W.current=!0;let t=e.output?`[Automation run output]
|
|
2
|
+
|
|
3
|
+
${e.output}${e.error?`
|
|
4
|
+
|
|
5
|
+
[Error]
|
|
6
|
+
${e.error}`:""}`:"[Automation run — no output]";fetch("/api/history",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({threadId:l,messages:[{id:$,role:"assistant",participantId:s.agentId||null,content:t,timestamp:new Date(e.startedAt??e.createdAt).getTime(),rootMessageId:null,parentMessageId:null,depth:0}]})}).catch(e=>console.warn("[PromptJobBoard] save root message failed:",e))}})},[T,l,$,e,s.agentId]);let G=(0,r.useRef)(null),V=(0,r.useRef)(null),K=(0,r.useRef)(P.length);(0,r.useEffect)(()=>{P.length>K.current&&V.current?.scrollIntoView({behavior:"smooth"}),K.current=P.length},[P.length]);let Q=(0,r.useCallback)((e,t,r,s,a,n,d)=>{let l=(0,C.orderParticipantIds)(Array.from(S),a);A(e,t,void 0,$,r,void 0,l.length>0?l:void 0,void 0,n,d)},[A,S,$]);return(0,t.jsxs)("div",{className:"flex min-w-0 flex-1 flex-col overflow-hidden",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between border-b border-[var(--card-border)] px-4 py-2",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsxs)("div",{className:"text-[12px] font-semibold text-[var(--foreground)] truncate flex items-center gap-2",children:["Run ",e.id.slice(0,8),(0,t.jsxs)("span",{className:`inline-flex items-center gap-1 rounded px-1.5 py-0.5 text-[9px] font-bold uppercase tracking-wider ${"running"===e.status?"bg-emerald-500/15 text-emerald-400":"queued"===e.status?"bg-amber-500/15 text-amber-400":"success"===e.status?"bg-emerald-500/10 text-emerald-400/70":"failed"===e.status?"bg-red-500/15 text-red-400":(e.status,"bg-[var(--muted)] text-[var(--muted-foreground)]")}`,children:["running"===e.status&&(0,t.jsx)("span",{className:"size-1.5 rounded-full bg-emerald-400 animate-pulse"}),e.status]})]}),(0,t.jsxs)("div",{className:"text-[10px] text-[var(--muted-foreground)]",children:["running"===e.status&&null!=v?`Running \xb7 ${F(v)}`:null!=e.durationMs?F(e.durationMs):"queued"===e.status?"Queued":null,null!=e.exitCode&&` \xb7 exit ${e.exitCode}`]})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:["failed"===e.status&&d&&(0,t.jsxs)("button",{onClick:d,className:"flex items-center gap-1 rounded px-2 py-1 text-[11px] font-medium text-[var(--foreground)] bg-[var(--muted)] hover:bg-[var(--muted)]/80 transition-colors",children:[(0,t.jsx)(u.RefreshCw,{size:12}),"Rerun"]}),g&&n&&(0,t.jsxs)("button",{onClick:()=>{y(!0),n()},disabled:b,className:"inline-flex items-center gap-1 rounded-md border border-red-400/30 px-2 py-1 text-[10px] font-bold uppercase tracking-[0.05em] text-red-400 transition-colors hover:bg-red-500/10 disabled:opacity-50",children:[(0,t.jsx)(o.X,{size:10}),b?"Cancelling…":"Cancel"]})]})]}),(e.startedAt||e.hostPid||e.hostCommand)&&(0,t.jsxs)("div",{className:"border-b border-[var(--card-border)] px-4 py-2 grid grid-cols-[auto_1fr] gap-x-4 gap-y-1 text-[10px]",children:[e.startedAt&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:"text-[var(--muted-foreground)]",children:"Started"}),(0,t.jsx)("span",{className:"text-[var(--foreground)]",children:O(e.startedAt)})]}),e.finishedAt&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:"text-[var(--muted-foreground)]",children:"Finished"}),(0,t.jsx)("span",{className:"text-[var(--foreground)]",children:O(e.finishedAt)})]}),e.hostCommand&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:"text-[var(--muted-foreground)]",children:"Command"}),(0,t.jsx)("span",{className:"font-mono text-[var(--foreground)] truncate",children:e.hostCommand})]}),e.hostPid&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:"text-[var(--muted-foreground)]",children:"PID"}),(0,t.jsx)("span",{className:"font-mono text-[var(--foreground)]",children:e.hostPid})]})]}),(0,t.jsx)("div",{ref:G,className:"min-h-0 flex-1 overflow-y-auto px-4 py-3",children:(0,t.jsxs)("div",{className:"space-y-4 max-w-none",children:[e.output&&(0,t.jsxs)("div",{className:"flex gap-2.5",children:[(0,t.jsx)("div",{className:"shrink-0 mt-0.5",children:p?(0,t.jsx)("img",{src:D(s.agentId,p.color,28),alt:"",className:"size-7 rounded-full"}):(0,t.jsx)("div",{className:"flex size-7 items-center justify-center rounded-full bg-[var(--muted)] text-[10px] text-[var(--muted-foreground)]",children:(0,t.jsx)(c.Terminal,{size:12})})}),(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsxs)("div",{className:"mb-1 flex items-center gap-2",children:[(0,t.jsx)("span",{className:"text-[11px] font-semibold text-[var(--foreground)]",children:m??s.provider}),(0,t.jsx)("span",{className:"text-[9px] px-1.5 py-0.5 rounded bg-[var(--muted)] text-[var(--muted-foreground)] font-medium uppercase tracking-wider",children:"Run output"})]}),(0,t.jsx)("div",{className:"rounded-lg px-3 py-2 text-[12px] leading-[1.55] bg-[var(--muted)] text-[var(--foreground)]",children:(0,t.jsx)(w.Markdown,{content:e.output})})]})]}),e.error&&(0,t.jsxs)("div",{className:"flex gap-2.5",children:[(0,t.jsx)("div",{className:"shrink-0 mt-0.5",children:(0,t.jsx)("div",{className:"flex size-7 items-center justify-center rounded-full bg-red-500/10 text-[10px] text-red-400",children:"!"})}),(0,t.jsx)("div",{className:"min-w-0 flex-1",children:(0,t.jsx)("div",{className:"rounded-lg px-3 py-2 text-[12px] leading-[1.55] bg-red-500/10 text-red-400",children:(0,t.jsx)("div",{className:"whitespace-pre-wrap break-words",children:e.error})})})]}),e.logs&&(0,t.jsxs)("details",{className:"group",children:[(0,t.jsxs)("summary",{className:"flex cursor-pointer items-center gap-1 text-[11px] text-[var(--muted-foreground)] hover:text-[var(--foreground)] transition-colors select-none",children:[(0,t.jsx)(x.ChevronDown,{size:12,className:"transition-transform group-open:rotate-180"}),"Tail logs"]}),(0,t.jsx)("pre",{className:"mt-2 max-h-64 overflow-auto rounded-lg bg-[var(--muted)] px-3 py-2 text-[11px] leading-[1.5] text-[var(--foreground)] whitespace-pre-wrap break-words",children:e.logs})]}),!e.output&&!e.error&&(0,t.jsx)("div",{className:"text-center py-12 text-[var(--muted-foreground)] text-sm",children:"queued"===e.status?(0,t.jsxs)("div",{className:"flex flex-col items-center gap-2",children:[(0,t.jsx)(i.Clock,{size:20,className:"text-amber-400/60"}),(0,t.jsx)("span",{children:"Waiting to start…"})]}):"running"===e.status?(0,t.jsxs)("div",{className:"flex flex-col items-center gap-2",children:[(0,t.jsx)(u.RefreshCw,{size:20,className:"text-emerald-400/60 animate-spin"}),(0,t.jsx)("span",{children:null!=v?`Running \xb7 ${F(v)}`:"Running…"}),(0,t.jsx)("span",{className:"text-[11px] text-[var(--muted-foreground)]/60",children:"Waiting for output…"})]}):"No output captured"}),P.filter(e=>e.id!==$).map(e=>{let r="user"===e.role,n=e.participantId?a[e.participantId]:null,d=n?.name??m??s.provider;return(0,t.jsxs)("div",{className:"flex gap-2.5",children:[(0,t.jsx)("div",{className:"shrink-0 mt-0.5",children:r?(0,t.jsx)("div",{className:"flex size-7 items-center justify-center rounded-full bg-[var(--muted)] text-[var(--muted-foreground)]",children:(0,t.jsx)(f.User,{size:12})}):n?(0,t.jsx)("img",{src:D(n.id,n.color,28),alt:"",className:"size-7 rounded-full"}):p?(0,t.jsx)("img",{src:D(s.agentId,p.color,28),alt:"",className:"size-7 rounded-full"}):(0,t.jsx)("div",{className:"flex size-7 items-center justify-center rounded-full bg-[var(--muted)] text-[10px] text-[var(--muted-foreground)]",children:(0,t.jsx)(c.Terminal,{size:12})})}),(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsx)("div",{className:"mb-1",children:(0,t.jsx)("span",{className:"text-[11px] font-semibold text-[var(--foreground)]",children:r?"You":d})}),(0,t.jsx)("div",{className:`rounded-lg px-3 py-2 text-[12px] leading-[1.55] ${r?"bg-blue-500/10 text-[var(--foreground)]":"bg-[var(--muted)] text-[var(--foreground)]"}`,children:(0,t.jsx)(w.Markdown,{content:(0,k.stripMarkers)(e.content),isUser:r})})]})]},e.id)}),Object.entries(L).filter(([,e])=>e.rootMessageId===$).map(([e])=>{let r=a[e]??p;return(0,t.jsxs)("div",{className:"flex gap-2.5 animate-in fade-in duration-300",children:[(0,t.jsx)("div",{className:"shrink-0 mt-0.5",children:r?(0,t.jsx)("img",{src:D(r.id,r.color,28),alt:"",className:"size-7 rounded-full"}):(0,t.jsx)("div",{className:"flex size-7 items-center justify-center rounded-full bg-[var(--muted)] text-[10px] text-[var(--muted-foreground)]",children:(0,t.jsx)(h.Sparkles,{size:12})})}),(0,t.jsx)("div",{className:"min-w-0 flex-1",children:(0,t.jsxs)("div",{className:"flex items-center gap-2 py-1",children:[(0,t.jsx)("span",{className:"text-[11px] text-[var(--muted-foreground)]",children:r?.name??"Thinking"}),(0,t.jsxs)("span",{className:"inline-flex items-center gap-[3px]",children:[(0,t.jsx)("span",{className:"w-1 h-1 rounded-full bg-[var(--muted-foreground)]/50 animate-[pulse-dot_1.4s_ease-in-out_infinite]"}),(0,t.jsx)("span",{className:"w-1 h-1 rounded-full bg-[var(--muted-foreground)]/50 animate-[pulse-dot_1.4s_ease-in-out_0.2s_infinite]"}),(0,t.jsx)("span",{className:"w-1 h-1 rounded-full bg-[var(--muted-foreground)]/50 animate-[pulse-dot_1.4s_ease-in-out_0.4s_infinite]"})]})]})})]},`streaming-${e}`)}),(0,t.jsx)("div",{ref:V})]})}),(0,t.jsx)("div",{className:"px-3 py-2",children:(0,t.jsx)(z,{onSend:Q,onStop:_,loading:B,activityStatus:H,participants:R,projectId:s.projectId||void 0,commands:[],placeholder:"Follow up on this run...",initialPinnedParticipantId:s.agentId||void 0})})]})}function J({job:e,agentMap:a,onEdit:l,onToggle:o,onDelete:u,onRunNow:x,onCancelRun:m,fetchRuns:f}){let h,[g,b]=(0,r.useState)([]),[j,N]=(0,r.useState)(!1),{getSelection:w,pushSelection:y,replaceSelection:k}=(0,v.useUrlSelection)(),C=w("run"),I=e.agentId&&a[e.agentId]?a[e.agentId].name:null,R=(0,r.useCallback)(async()=>{N(!1),b(await f(e.id)),N(!0)},[f,e.id]);(0,r.useEffect)(()=>{R()},[R]),(0,r.useEffect)(()=>{let e=setInterval(R,s.UI_POLL_PROMPT_RUNS_MS);return()=>clearInterval(e)},[R]),(0,r.useEffect)(()=>{C&&j&&(g.some(e=>e.id===C)||k({run:null}))},[k,g,j,C]);let z=g.find(e=>e.id===C)??null,P=g.some(e=>"queued"===e.status||"running"===e.status),_=e.cronExpr&&(0,S.cronToHuman)(e.cronExpr)||e.cadence||e.cronExpr,U=(h=e.prompt.split("\n").map(e=>e.trim()).find(Boolean))?h.replace(/^execute\s+/i,""):"No target",L=e.agentId?a[e.agentId]:null;return(0,t.jsx)("div",{className:"h-full flex flex-col text-[var(--foreground)]",children:(0,t.jsxs)("div",{className:"flex min-h-0 flex-1",children:[(0,t.jsxs)("div",{className:"flex w-[420px] shrink-0 flex-col border-r border-[var(--card-border)] overflow-hidden",children:[(0,t.jsx)("div",{className:"border-b border-[var(--card-border)] px-6 py-5",children:(0,t.jsxs)("div",{className:"flex items-start gap-4",children:[(0,t.jsx)("div",{className:"min-w-0 flex-1",children:(0,t.jsx)("h2",{className:"truncate text-[18px] font-semibold text-[var(--foreground)]",children:e.name})}),(0,t.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,t.jsx)("button",{onClick:o,type:"button",role:"switch","aria-checked":"active"===e.state,title:"active"===e.state?"Pause":"Resume",className:`relative inline-flex h-[18px] w-[32px] shrink-0 cursor-pointer rounded-full border transition-colors ${"active"===e.state?"border-emerald-400/30 bg-emerald-500/40":"border-[var(--card-border)] bg-[var(--muted)]"}`,children:(0,t.jsx)("span",{className:`pointer-events-none absolute top-[2px] size-[12px] rounded-full bg-white/90 shadow-sm transition-transform ${"active"===e.state?"translate-x-[16px]":"translate-x-[2px]"}`})}),(0,t.jsx)("button",{onClick:x,disabled:P,title:"Run now",className:"rounded-md border border-[var(--card-border)] p-1.5 text-[var(--muted-foreground)] transition-colors hover:border-[var(--foreground)] hover:text-[var(--foreground)] disabled:opacity-50",children:(0,t.jsx)(n.Play,{size:12,className:"fill-current"})}),(0,t.jsx)("button",{onClick:l,title:"Edit",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",children:(0,t.jsx)(p.Pencil,{size:12})}),(0,t.jsx)("button",{onClick:u,disabled:P,title:P?"Cancel the live run before deleting this task":"Delete",className:"p-1.5 rounded-md border border-[var(--card-border)] text-[var(--muted-foreground)] transition-colors hover:text-red-400 hover:border-red-400/30 disabled:cursor-not-allowed disabled:opacity-40 disabled:hover:border-[var(--card-border)] disabled:hover:text-[var(--muted-foreground)]",children:(0,t.jsx)(d.Trash2,{size:12})})]})]})}),(0,t.jsx)("div",{className:"min-h-0 flex-1 overflow-y-auto",children:(0,t.jsxs)("div",{className:"space-y-0",children:[(0,t.jsx)("div",{className:"px-6 py-5",children:(0,t.jsx)("div",{className:"rounded-2xl border border-[var(--card-border)] bg-[var(--card-bg)] px-5 py-4",children:(0,t.jsxs)("div",{className:"grid grid-cols-[96px,minmax(0,1fr)] items-center gap-x-4 gap-y-4",children:[e.executionMode&&"prompt"!==e.executionMode&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("div",{className:"text-[11px] uppercase tracking-[0.12em] text-[var(--muted-foreground)]",children:"Type"}),(0,t.jsx)("div",{className:"min-w-0",children:(0,t.jsx)("span",{className:"rounded-md border border-violet-400/20 bg-violet-500/10 px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wider text-violet-400",children:$.find(t=>t.value===e.executionMode)?.label??e.executionMode})})]}),(0,t.jsx)("div",{className:"text-[11px] uppercase tracking-[0.12em] text-[var(--muted-foreground)]",children:"Agent"}),(0,t.jsx)("div",{className:"min-w-0 flex items-center justify-between gap-3",children:(0,t.jsxs)("div",{className:"min-w-0 flex items-center gap-2.5",children:[L?(0,t.jsx)("img",{src:D(L.id,L.color,20),alt:"",className:"size-5 rounded-full shrink-0"}):(0,t.jsx)(c.Terminal,{size:14,className:"shrink-0 text-[var(--muted-foreground)]"}),(0,t.jsxs)("div",{className:"truncate text-[13px] font-medium text-[var(--foreground)]",children:[I??e.provider,e.model?` (${e.provider} / ${e.model})`:""]})]})}),(0,t.jsx)("div",{className:"text-[11px] uppercase tracking-[0.12em] text-[var(--muted-foreground)]",children:"Schedule"}),(0,t.jsx)("div",{className:"truncate text-[13px] font-medium text-[var(--foreground)]",children:_||"—"}),(0,t.jsx)("div",{className:"text-[11px] uppercase tracking-[0.12em] text-[var(--muted-foreground)]",children:"Target"}),(0,t.jsx)("div",{className:"truncate font-mono text-[13px] text-[var(--foreground)]",title:U,children:U})]})})}),(0,t.jsxs)("div",{className:"border-t border-[var(--card-border)]",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between px-6 py-4",children:[(0,t.jsx)(E,{children:"Recent Runs"}),(0,t.jsxs)("span",{className:"text-sm text-[var(--muted-foreground)]",children:[g.length," total"]})]}),(0,t.jsx)("div",{children:0===g.length?(0,t.jsx)("div",{className:"px-6 py-10 text-center text-[11px] text-[var(--muted-foreground)]",children:"No runs yet"}):g.map(e=>{let r=C===e.id,s="success"===e.status;return(0,t.jsxs)("button",{type:"button",onClick:()=>y({run:e.id}),className:`flex w-full items-center gap-4 border-t border-[var(--card-border)]/50 px-6 py-5 text-left transition-colors ${r?"border-l-2 border-l-emerald-400 bg-emerald-500/5":"hover:bg-[var(--muted)]/20"}`,children:[(0,t.jsx)("span",{className:`flex size-6 shrink-0 items-center justify-center rounded-full border text-[11px] ${s?"border-emerald-400 text-emerald-400":"failed"===e.status?"border-red-400 text-red-400":"running"===e.status?"border-sky-400 text-sky-400":"border-[var(--card-border)] text-[var(--muted-foreground)]"}`,children:s?"✓":"failed"===e.status?"!":"•"}),(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsx)("div",{className:"text-[13px] font-medium text-[var(--foreground)]",children:T(e.startedAt??e.createdAt)}),(0,t.jsx)("div",{className:"mt-1 text-[12px] text-[var(--muted-foreground)]",children:null!=e.durationMs?`${(e.durationMs/1e3).toFixed(1)}s`:"running"===e.status?"Running...":e.status.charAt(0).toUpperCase()+e.status.slice(1)})]}),r?(0,t.jsx)("span",{className:"rounded-md bg-[var(--muted)] px-2.5 py-1 text-[10px] font-semibold uppercase tracking-wider text-[var(--muted-foreground)]",children:"Viewing"}):null]},e.id)})})]}),(0,t.jsxs)("div",{className:"border-t border-[var(--card-border)] px-6 py-4",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[P?(0,t.jsx)("button",{onClick:m,className:"inline-flex items-center gap-1.5 rounded-md border border-red-400/30 px-2.5 py-1 text-[10px] font-bold uppercase tracking-[0.05em] text-red-400 transition-colors hover:bg-red-500/10",children:"Cancel run"}):null,P?(0,t.jsx)("span",{className:"text-[11px] text-amber-300",children:"Delete is blocked while a run is queued or running. Cancel the live run first."}):null,e.condition?(0,t.jsx)("span",{className:"rounded-md border border-blue-400/20 bg-blue-500/10 px-2 py-1 text-[10px] font-semibold uppercase tracking-wider text-blue-400",children:"gated"}):null,M(e)&&(0,t.jsxs)("span",{className:"rounded-md border border-amber-500/20 bg-amber-500/10 px-2 py-1 text-[10px] font-semibold uppercase tracking-wider text-amber-400 inline-flex items-center gap-1",children:[(0,t.jsx)(i.Clock,{size:10}),"overdue"]}),(0,t.jsxs)("span",{className:`text-[11px] ${M(e)?"text-amber-400 font-medium":"text-[var(--muted-foreground)]"}`,children:["Next run ",A(e.nextRunAt,e.state)]}),(0,t.jsxs)("span",{className:"text-[11px] text-[var(--muted-foreground)]",children:["Last ",e.lastRunAt?T(new Date(e.lastRunAt).toISOString()):"Never"]}),(e.cliArgs||"skip"!==e.overlapPolicy)&&(0,t.jsx)("span",{className:"text-[11px] text-[var(--muted-foreground)]",children:e.cliArgs?"Custom CLI args":`Overlap ${e.overlapPolicy}`})]}),e.condition?(0,t.jsx)("div",{className:"mt-3 text-[11px] leading-[1.5] text-[var(--muted-foreground)]",children:e.condition}):null]})]})})]}),z?(0,t.jsx)(q,{run:z,job:e,agentMap:a,onCancelRun:m,onRerun:x},z.id):(0,t.jsx)("div",{className:"flex min-w-0 flex-1 items-center justify-center text-[var(--muted-foreground)] text-sm",children:0===g.length?'No runs yet. Click "Run now" to trigger one.':"Select a run to view its output"})]})})}function B({projectId:e,requireProjectId:s=!1,includeObjectiveJobs:a=!1,visibleJobIds:n,contextLabel:d,createDefaults:o,onCreateJob:x}={}){let{jobs:m,loading:p,refresh:f,createJob:h,updateJob:g,deleteJob:j,toggleJob:N,runNow:w,cancelRun:k,fetchRuns:C}=(0,b.usePromptJobs)(e,{requireProjectId:s,includeObjectiveJobs:a}),[I,R]=(0,r.useState)("all"),[$,z]=(0,r.useState)(null),[P,T]=(0,r.useState)(!1),[E,_]=(0,r.useState)(null),[U,F]=(0,r.useState)(null),[O,q]=(0,r.useState)({}),[H,W]=(0,r.useState)(null),[G,V]=(0,r.useState)({}),{getSelection:K,pushSelection:Q,replaceSelection:X}=(0,v.useUrlSelection)(),Y=K("job"),Z=K("run"),ee=(0,r.useMemo)(()=>n?new Set(n):null,[n]);(0,r.useEffect)(()=>{fetch("/api/prompt-jobs/agents").then(e=>e.json()).then(e=>{let t={};for(let r of e.agents??[])t[r.id]=r;V(t)}).catch(e=>console.warn("[PromptJobBoard] fetch agent map failed:",e))},[]);let et=e=>{W(e),setTimeout(()=>W(null),2500)},er=(0,r.useMemo)(()=>(ee?m.filter(e=>ee.has(e.id)):m).filter(e=>"linear_worker"!==e.executionMode),[m,ee]),es=er.filter(e=>"all"===I||e.state===I),ea=Y?er.find(e=>e.id===Y)??null:null,en=ea??($?.id===Y&&(!ee||ee.has($.id))?$:null);er.length,er.filter(e=>"active"===e.state).length,er.filter(e=>"paused"===e.state).length,er.filter(e=>"stopped"===e.state).length;let ed=async e=>{await N(e)&&et(`${e.name} ${"active"===e.state?"paused":"resumed"}`)},el=async(e,t)=>{if(t?.stopPropagation(),O[e])return;q(t=>({...t,[e]:!0}));let r=await w(e);q(t=>{let r={...t};return delete r[e],r}),r&&et("Run triggered")},eo=async e=>{let t=await j(e);if(t.ok){Y===e&&Q({job:null,run:null}),et("Job deleted");return}et(t.error??"Failed to delete scheduled task")},ei=async e=>{await k(e)&&et("Run cancelled")},ec=async t=>{if(E)await g(E.id,t)&&et(`Task "${t.name}" updated`);else{let r=x?await x(t):await h({...t,projectId:e??""});r&&(await f(),Q({job:r,run:null}),et(`Task "${t.name}" created`))}};(0,r.useEffect)(()=>{if(!Y){z(null),Z&&X({run:null});return}if(ee&&!ee.has(Y)){z(null),X({job:null,run:null});return}if(ea)return void z(e=>e?.id===Y?ea:null);let e=!1;return(async()=>{try{let t=await fetch(`/api/prompt-jobs/${encodeURIComponent(Y)}`);if(e)return;if(404===t.status)return void X({job:null,run:null});if(!t.ok)throw Error(`Failed to fetch selected scheduled task: ${t.status}`);let r=await t.json().catch(()=>({}));if(!r.job?.id||!a&&r.job.objectiveId)return void X({job:null,run:null});z(r.job)}catch(t){e||console.error("Failed to hydrate selected prompt job",t)}})(),()=>{e=!0}},[a,X,ea,Y,Z,ee]);let eu=H&&(0,t.jsx)("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",children:(0,t.jsx)("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",children:H})});return P?(0,t.jsxs)(t.Fragment,{children:[eu,(0,t.jsx)(L,{onClose:()=>{T(!1),_(null)},onSubmit:ec,editingJob:E,createDefaults:o,contextLabel:d})]}):(0,t.jsxs)("div",{className:"flex h-full min-h-0 flex-col text-[var(--foreground)] lg:flex-row",children:[eu,(0,t.jsxs)("div",{className:"flex w-full shrink-0 flex-col border-b border-[var(--card-border)] lg:w-[390px] lg:border-b-0 lg:border-r",children:[(0,t.jsx)("div",{className:"px-6 pb-0 pt-6",children:(0,t.jsx)("div",{className:"border-b border-[var(--card-border)]",children:(0,t.jsxs)("div",{className:"flex items-end justify-between gap-4",children:[(0,t.jsxs)("div",{className:"flex items-center gap-4",children:[(0,t.jsx)("div",{className:"flex items-end gap-10",children:["all","active","paused"].map(e=>{let r=I===e;return(0,t.jsxs)("button",{onClick:()=>R(e),className:`relative pb-4 text-[18px] font-semibold capitalize transition-colors ${r?"text-[var(--foreground)]":"text-[var(--muted-foreground)] hover:text-[var(--foreground)]"}`,children:[e,r?(0,t.jsx)("span",{className:"absolute bottom-[6px] left-0 h-[4px] w-8 rounded-full bg-[var(--foreground)]"}):null]},e)})}),d?(0,t.jsx)("span",{className:"mb-3 rounded-full border border-sky-500/25 bg-sky-500/10 px-2 py-1 text-[10px] font-semibold uppercase tracking-[0.16em] text-sky-100",children:d}):null]}),(0,t.jsxs)("div",{className:"flex items-center gap-5 pb-4 text-[var(--muted-foreground)]",children:[(0,t.jsx)("button",{onClick:()=>f(),className:"transition-colors hover:text-[var(--foreground)]",title:"Refresh",children:(0,t.jsx)(u.RefreshCw,{size:18})}),(0,t.jsx)("button",{onClick:()=>{_(null),T(!0)},className:"transition-colors hover:text-[var(--foreground)]",title:"New Job",children:(0,t.jsx)(l.Plus,{size:20})})]})]})})}),(0,t.jsx)("div",{className:"min-h-0 flex-1 overflow-y-auto pb-5",children:p&&0===er.length?(0,t.jsx)("div",{className:"py-12 text-center text-sm text-[var(--muted-foreground)]",children:"Loading scheduled tasks..."}):(0,t.jsxs)("div",{className:"overflow-hidden",children:[es.map(e=>{let r=Y===e.id,s=e.cronExpr&&(0,S.cronToHuman)(e.cronExpr)||e.cadence||e.cronExpr;return(0,t.jsx)("div",{onClick:()=>Q({job:e.id,run:null}),className:`cursor-pointer border-b border-[var(--card-border)]/50 px-6 py-4 transition-colors ${r?"bg-[var(--card-bg)]":"hover:bg-[var(--muted)]/10"}`,children:(0,t.jsxs)("div",{className:"flex items-start gap-4",children:[(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsx)("div",{className:"truncate text-[15px] font-medium text-[var(--foreground)]",children:e.name}),(0,t.jsxs)("div",{className:"mt-2 flex flex-wrap items-center gap-x-4 gap-y-1 text-[12px] text-[var(--muted-foreground)]",children:[(0,t.jsx)("span",{className:"min-w-0 flex items-center gap-1.5 truncate",children:e.agentId&&G[e.agentId]?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("img",{src:D(e.agentId,G[e.agentId].color,16),alt:"",className:"size-4 rounded-full"}),G[e.agentId].name]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(c.Terminal,{size:11}),e.provider]})}),(0,t.jsxs)("span",{className:`flex items-center gap-1 ${M(e)?"text-amber-400 font-medium":""}`,children:[(0,t.jsx)(i.Clock,{size:11}),A(e.nextRunAt,e.state)]}),(0,t.jsx)("span",{className:"truncate font-mono text-[11px]",title:s,children:s}),"linear_worker"===e.executionMode?(0,t.jsx)("span",{className:"rounded-md border border-violet-400/20 bg-violet-500/10 px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wider text-violet-400",children:"linear"}):null,e.condition?(0,t.jsx)("span",{className:"rounded-md border border-blue-400/20 bg-blue-500/10 px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wider text-blue-400",children:"gated"}):null]})]}),(0,t.jsx)("button",{onClick:t=>{t.stopPropagation(),ed(e)},type:"button",role:"switch","aria-checked":"active"===e.state,title:"active"===e.state?"Pause":"Resume",className:`relative inline-flex h-[18px] w-[32px] shrink-0 cursor-pointer rounded-full border transition-colors ${"active"===e.state?"border-emerald-400/30 bg-emerald-500/40":"border-[var(--card-border)] bg-[var(--muted)]"}`,children:(0,t.jsx)("span",{className:`pointer-events-none absolute top-[2px] size-[12px] rounded-full bg-white/90 shadow-sm transition-transform ${"active"===e.state?"translate-x-[16px]":"translate-x-[2px]"}`})})]})},e.id)}),0===es.length&&(0,t.jsx)("div",{className:"rounded-xl border border-dashed border-[var(--card-border)] py-12 text-center text-sm text-[var(--muted-foreground)]",children:0===er.length?"No scheduled tasks yet. Create one to get started.":"No scheduled tasks match the selected filter."})]})})]}),(0,t.jsx)("div",{className:"min-h-0 min-w-0 flex-1",children:en?(0,t.jsx)(J,{job:en,agentMap:G,onEdit:()=>{_(en),T(!0)},onToggle:()=>ed(en),onDelete:()=>F(en),onRunNow:()=>el(en.id),onCancelRun:()=>ei(en.id),fetchRuns:C},en.id):(0,t.jsx)("div",{className:"flex h-full items-center justify-center border-t border-[var(--card-border)] lg:border-l-0 lg:border-t-0",children:(0,t.jsxs)("div",{className:"rounded-2xl border border-dashed border-[var(--card-border)] bg-[var(--card-bg)]/60 px-8 py-10 text-center",children:[(0,t.jsx)("div",{className:"text-sm font-medium text-[var(--foreground)]",children:"Select a scheduled task"}),(0,t.jsx)("p",{className:"mt-2 text-sm text-[var(--muted-foreground)]",children:"The selected job will open here with its runs and chat output."})]})})}),(0,t.jsx)(y.default,{isOpen:!!U,title:"Delete scheduled task?",message:"This permanently removes the task and all of its run history. Delete is only allowed when no run is queued or running.",preview:U?.name,confirmLabel:"Delete",variant:"danger",onConfirm:()=>{U&&eo(U.id),F(null)},onCancel:()=>F(null)})]})}e.s(["CreateJobModal",()=>L,"agentAvatar",()=>D,"default",()=>B])}]);
|