@mndrk/agx 2.0.55 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/cloud-runtime/standalone/apps/local/.next/BUILD_ID +1 -1
- package/cloud-runtime/standalone/apps/local/.next/app-path-routes-manifest.json +3 -0
- package/cloud-runtime/standalone/apps/local/.next/build-manifest.json +3 -3
- package/cloud-runtime/standalone/apps/local/.next/prerender-manifest.json +3 -3
- package/cloud-runtime/standalone/apps/local/.next/required-server-files.json +5 -0
- package/cloud-runtime/standalone/apps/local/.next/routes-manifest.json +23 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error/page.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.html +1 -1
- 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.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found/page.js.nft.json +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 +1 -1
- 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 +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 +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 +4 -3
- 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 +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/automations/create/route.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/automations/create/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/automations/route.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/automations/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/chat/route.js +2 -2
- 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/daemon/route.js +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/daemon/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/filesystem/analyze/route.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/filesystem/analyze/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/graphs/[graphId]/nodes/[nodeId]/route.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/graphs/[graphId]/nodes/[nodeId]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/issues/[id]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/issues/context/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/issues/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/options/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/runs/scripted/route.js +5 -4
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/runs/scripted/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/status/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/worker/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/worker/route/build-manifest.json +9 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/worker/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/worker/route.js +13 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/worker/route.js.map +5 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/worker/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/worker/route_client-reference-manifest.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/participants/route.js +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 +4 -4
- 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]/linear-issues/route.js +4 -4
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/linear-issues/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/notes/[noteId]/route.js +2 -2
- 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 +2 -2
- 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]/route.js +3 -3
- 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 +19 -8
- 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 +3 -3
- 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/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/worker/route/build-manifest.json +9 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/worker/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/worker/route.js +28 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/worker/route.js.map +5 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/worker/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/worker/route_client-reference-manifest.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/route.js +9 -5
- 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 +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/route.js +4 -4
- 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/[id]/cancel/route.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/prompt-jobs/[id]/cancel/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/prompt-jobs/[id]/route.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/prompt-jobs/[id]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/prompt-jobs/[id]/runs/route.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/prompt-jobs/[id]/runs/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/prompt-jobs/poll/route.js +16 -15
- 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/prompt-jobs/route.js +5 -5
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/prompt-jobs/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 +2 -2
- 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 +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 +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/schedules/route.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/schedules/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]/graph/events/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/graph/history/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/graph/metrics/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/graph/pause/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/graph/replan/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/graph/restart/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/graph/resume/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/graph/rollback/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/graph/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/graph/schedule/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/graph/stop/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/logs/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/nodes/[nodeId]/comments/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/nodes/[nodeId]/complete/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/nodes/[nodeId]/fail/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/nodes/[nodeId]/resume/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/nodes/[nodeId]/start/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/nodes/[nodeId]/stop/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/extract/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/route.js +9 -8
- 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/terminal/sessions/[id]/route.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/terminal/sessions/[id]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/threads/knowledge/route.js +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 +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/automations/page/react-loadable-manifest.json +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/automations/page.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/automations/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/automations/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/automations.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/automations.rsc +15 -15
- package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/_full.segment.rsc +15 -15
- package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/_tree.segment.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/automations/__PAGE__.segment.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/automations.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/board/page.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/board/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/board/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/board.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/board.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/_full.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/board/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/board.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph/page.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/execution-graph/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/execution-graph.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/folders/page.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/folders/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/folders/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/folders.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/folders.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/folders/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/folders.segment.rsc +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 +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_full.segment.rsc +2 -2
- 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/page.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/page.js.nft.json +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/react-loadable-manifest.json +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/automations/page.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 +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/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page/build-manifest.json +18 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page/next-font-manifest.json +11 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page/react-loadable-manifest.json +1 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page.js +14 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page.js.map +5 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page.js.nft.json +1 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page_client-reference-manifest.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/graph/[taskId]/page.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]/knowledge/page.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/knowledge/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/knowledge/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/linear/page/react-loadable-manifest.json +8 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/linear/page.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/linear/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/linear/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/[objectiveId]/page.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 +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 +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]/settings/page.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/settings/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/settings/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/agents/[agentId]/page.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 +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 +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 +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 +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 +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 +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 +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/orphans/page.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/projects/orphans/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/projects/orphans.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/projects.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/page.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/settings/page.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/settings/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/settings.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/settings.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/_full.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup/page.js +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/skills/page.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/skills/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/skills.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/skills.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/_full.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/skills/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/skills.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/status/page.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/status/page.js.nft.json +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 +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_full.segment.rsc +3 -3
- 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 +2 -2
- 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/thread/[id]/page.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/thread/[id]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/thread/[id]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/0jps_app_api_projects_[id]_objectives_[objectiveId]_worker_route_actions_0v8q3zz.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[externals]__0_au5u1._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[externals]__13x93ar._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/{[root-of-the-server]__0_10qfd._.js → [root-of-the-server]__0.6yz1u._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__01lsgl~._.js +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/{[root-of-the-server]__0205scg._.js → [root-of-the-server]__03.9arn._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/{[root-of-the-server]__01ol22y._.js → [root-of-the-server]__03h0gqp._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/{[root-of-the-server]__094z9yf._.js → [root-of-the-server]__08jo91s._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__09j9jpf._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/{[root-of-the-server]__0-nye63._.js → [root-of-the-server]__09jghbu._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0_7hiof._.js +43 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/{[root-of-the-server]__0.jam.l._.js → [root-of-the-server]__0a0cq38._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0asvfdo._.js +54 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0c86535._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0cj1krd._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/{[root-of-the-server]__0aa-88e._.js → [root-of-the-server]__0dy3h2i._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/{[root-of-the-server]__0touqng._.js → [root-of-the-server]__0e8-2k_._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0enhv5p._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0f9byr.._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0g7hc1-._.js +18 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0g7p6pw._.js +55 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/{[root-of-the-server]__019q25b._.js → [root-of-the-server]__0gj~dap._.js} +7 -7
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/{[root-of-the-server]__0e6cj2y._.js → [root-of-the-server]__0hc45jw._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/{[root-of-the-server]__0avz575._.js → [root-of-the-server]__0hkcw03._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0hmw36u._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0l53ok5._.js +54 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0n.momw._.js +8 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0tjo9we._.js +7 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/{[root-of-the-server]__0-~t2br._.js → [root-of-the-server]__0v7jjvl._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0x6w64i._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/{[root-of-the-server]__11nke7t._.js → [root-of-the-server]__0y3qxv1._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/{[root-of-the-server]__10z8f9h._.js → [root-of-the-server]__0ygidxe._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0z82z0-._.js +49 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0zsv-tb._.js +8 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0~nnfjr._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0~x4jbk._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__10d.dhd._.js +229 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__12qy318._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/_039.xxy._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/_06oeti1._.js +49 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/_0dyy7h.._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/_0gi7c9x._.js +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/_0gr.psg._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/_0sd8z0i._.js +21 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/_0y42h_~._.js +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/_0~ah49q._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_01kqgle._.js +11 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_06qet8g._.js +36 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_0_0m2ly._.js +397 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_0_a~bj0._.js +25 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_0a15wtk._.js +397 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_0bjdpen._.js +29 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_0fr1qq6._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_0g.q2r6._.js +41 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_0h7wd0e._.js +29 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_0i7fs.i._.js +397 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_0ipg-p6._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_0npxy21._.js +11 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_0uhfa93._.js +21 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_12wpldq._.js +25 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local__next-internal_server_app_api_linear_worker_route_actions_116303i.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_01hd2_5._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_01pvj2g._.js +34 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_0ik933l._.js +55 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_0o1v.j4._.js +79 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_0pxj122._.js +55 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_src_automations_index_ts_0_8ch28._.js +10 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_src_graph_082u-ls._.js +41 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_src_prompt-scheduler_0.xgxyl._.js +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_src_prompt-scheduler_0yu3--n._.js +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_src_prompt-scheduler_0ze8hzc._.js +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_src_prompt-scheduler_get-store_ts_0p0aod1._.js +5 -5
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_src_prompt-scheduler_linear-worker_ts_0ycjwem._.js +5 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0gips_c.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0u_5kfo.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/02dz_local__next-internal_server_app_projects_[slug]_folders_page_actions_03fg4j9.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/0rhn_lucide-react_dist_esm_0tvwux2._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/0rhn_lucide-react_dist_esm_icons_0e2_v_.._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/0rhn_lucide-react_dist_esm_icons_0hvpc.y._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/0rhn_lucide-react_dist_esm_icons_0w3hl3p._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__006vr7.._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__08d5c~o._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__0_n~ybp._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__0d18x53._.js +18 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__0fl7_-o._.js +18 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__0h~rb5r._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__0j9m72.._.js +18 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{[root-of-the-server]__02.r909._.js → [root-of-the-server]__0n5g8ml._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__0w.zmt6._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__0z7nw_r._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__10h_7t0._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_00trrg8._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{_0s~0ump._.js → _064h43p._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0742x_.._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0ejzn1e._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0fwy5tm._.js +7 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0sjchy6._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0ufdu.z._.js +7 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0wk3skw._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0yeuuy1._.js +25 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_03z24q2._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0_ac-.f._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0a-8i4p._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0h3mfm7._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{apps_local_075cq2j._.js → apps_local_0k4~c1x._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{_0n80y4_._.js → apps_local_0nvzo3y._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0t6p.qm._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0v~bvwg._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_11k_-8~._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_agents_[id]_page_tsx_06n47n~._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_execution-graph_page_tsx_0tn2sx9._.js +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_folders_page_tsx_0ju618z._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_graph_[taskId]_page_tsx_0bctfd-._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_layout_tsx_0aaa3~t._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_linear_page_tsx_0a~n5y8._.js +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_page_tsx_0kcaeqi._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_teams_new_page_tsx_0yqd0a5._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_teams_page_tsx_06czvz-._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_terminal_page_tsx_01n9qk.._.js +12 -12
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_orphans_page_tsx_0sdv.11._.js +4 -4
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_setup_page_tsx_0ql2qmr._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_PromptJobBoard_tsx_06zob36._.js +8 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_TaskCard_tsx_0e35_z5._.js +6 -6
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_chat-ui_ChatContainer_tsx_0c9fjtl._.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_projects_ProjectObjectivesWorkspace_tsx_0k4tfip._.js +6 -6
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_thread_WorkspaceSidebar_tsx_0unv2xp._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0mk0s0o.js +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/functions-config-manifest.json +2 -0
- package/cloud-runtime/standalone/apps/local/.next/server/middleware-build-manifest.js +3 -3
- 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 +1 -1
- 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/0-_ukhpeg429c.js +16 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0-olq~7zw3wjy.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0142ce0jj3j7r.js → 0-vo_x2cxmjm3.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/003q-y3exxalk.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/00po4v2x~0x_z.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/013gtut17~fne.js +23 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/014z_yruiincl.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/041-dhls9zkl1.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/04yoml2rqnuot.js +16 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/07646a0h94826.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0_mrpyqcoyb_5.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0rm7v.1y6qcni.js → 0aewbg0i704w7.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0px65ynyk3t1d.js → 0bchtyu6m.2yv.js} +7 -7
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0dnw31436wd~..js +5 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0e307b-0c2jbx.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0edewt9l~cs~k.css +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0f7i3ae1ynhf3.css +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0fonouj2i9qnb.js +5 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0gj98094p~zn4.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0jrkacz_dyem6.js +37 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0l3v45kd.9is_.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0lgb.0~i1xvv-.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0lkal3uvr6_~2.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0mig99af4~uos.js +28 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0pdrpsy-zdxp0.js +5 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0p~l5ap6qqx2o.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0r0c9y6.8.m5p.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0stvi5btlxl4m.js +20 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0h_bwlg~kk8lz.js → 0tt1oh112yv-l.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0uve8xrt~0a2e.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0w94x-v00osq0.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0wh6p5~ft5rma.js +5 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0x_pewz9npq~q.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0xwny92a.ad_i.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0zw85-xl9ysjs.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/119v0-idpg-cv.js +16 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/11l2tww5f0hsk.js +20 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/14v~9vx3tdv85.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0826uh6nmsi5l.js → 1503vb7lb6.g1.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/16d~es6h6k~rj.js +6 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/177-q0wwdi0qe.js +1 -0
- package/cloud-runtime/standalone/apps/local/agx-server.js +4055 -0
- package/cloud-runtime/standalone/apps/local/app/agents/[id]/page.tsx +40 -5
- package/cloud-runtime/standalone/apps/local/app/api/agents/[id]/profile/route.ts +10 -0
- package/cloud-runtime/standalone/apps/local/app/api/automations/route.ts +10 -2
- package/cloud-runtime/standalone/apps/local/app/api/linear/worker/route.ts +151 -0
- package/cloud-runtime/standalone/apps/local/app/api/projects/[id]/objectives/[objectiveId]/route.ts +0 -8
- package/cloud-runtime/standalone/apps/local/app/api/projects/[id]/objectives/[objectiveId]/scheduled-tasks/route.ts +22 -27
- package/cloud-runtime/standalone/apps/local/app/api/projects/[id]/objectives/[objectiveId]/worker/route.ts +89 -0
- package/cloud-runtime/standalone/apps/local/app/api/projects/[id]/route.ts +13 -0
- package/cloud-runtime/standalone/apps/local/app/api/projects/[id]/search/route.ts +4 -4
- package/cloud-runtime/standalone/apps/local/app/api/projects/[id]/teams/route.ts +5 -3
- package/cloud-runtime/standalone/apps/local/app/api/prompt-jobs/route.ts +15 -5
- package/cloud-runtime/standalone/apps/local/app/globals.css +67 -5
- package/cloud-runtime/standalone/apps/local/app/projects/[slug]/folders/page.tsx +25 -0
- package/cloud-runtime/standalone/apps/local/app/projects/[slug]/layout.tsx +19 -5
- package/cloud-runtime/standalone/apps/local/app/projects/[slug]/objectives/[objectiveId]/page.tsx +7 -2
- package/cloud-runtime/standalone/apps/local/app/projects/[slug]/teams/new/page.tsx +236 -10
- package/cloud-runtime/standalone/apps/local/app/setup/page.tsx +9 -1
- package/cloud-runtime/standalone/apps/local/bundled-server.ts +45 -0
- package/cloud-runtime/standalone/apps/local/components/ActionToolbar.tsx +5 -2
- package/cloud-runtime/standalone/apps/local/components/AutomationsBoard.tsx +35 -3
- package/cloud-runtime/standalone/apps/local/components/ContextMenu.tsx +2 -2
- package/cloud-runtime/standalone/apps/local/components/FloatingPanel.tsx +70 -20
- package/cloud-runtime/standalone/apps/local/components/IconButton.tsx +10 -2
- package/cloud-runtime/standalone/apps/local/components/KanbanBoard.tsx +84 -3
- package/cloud-runtime/standalone/apps/local/components/LinearBoard.tsx +434 -36
- package/cloud-runtime/standalone/apps/local/components/LogTimeline.tsx +4 -1
- package/cloud-runtime/standalone/apps/local/components/NowRunningPanel.tsx +3 -1
- package/cloud-runtime/standalone/apps/local/components/PromptJobBoard.tsx +119 -6
- package/cloud-runtime/standalone/apps/local/components/SearchCombo.tsx +3 -3
- package/cloud-runtime/standalone/apps/local/components/SortableTaskCard.tsx +21 -3
- package/cloud-runtime/standalone/apps/local/components/StatusCircle.tsx +3 -3
- package/cloud-runtime/standalone/apps/local/components/TaskCard.tsx +51 -1
- package/cloud-runtime/standalone/apps/local/components/chat-ui/ChatContainer.tsx +15 -2
- package/cloud-runtime/standalone/apps/local/components/chat-ui/Composer.tsx +3 -3
- package/cloud-runtime/standalone/apps/local/components/chat-ui/ParticipantBar.tsx +76 -9
- package/cloud-runtime/standalone/apps/local/components/graph/ExecutionGraphPanel.tsx +4 -1
- package/cloud-runtime/standalone/apps/local/components/graph/GraphFirstView.tsx +6 -2
- package/cloud-runtime/standalone/apps/local/components/graph/NodeDetailPanel.tsx +45 -25
- package/cloud-runtime/standalone/apps/local/components/graph/NodeInspector.tsx +9 -6
- package/cloud-runtime/standalone/apps/local/components/linear/LinearSettingsModal.tsx +105 -0
- package/cloud-runtime/standalone/apps/local/components/linear/LinearWorkerConfig.tsx +367 -0
- package/cloud-runtime/standalone/apps/local/components/projects/FoldersSummaryCard.tsx +16 -16
- package/cloud-runtime/standalone/apps/local/components/projects/FoldersView.tsx +856 -0
- package/cloud-runtime/standalone/apps/local/components/projects/ObjectiveActivityTimeline.tsx +40 -32
- package/cloud-runtime/standalone/apps/local/components/projects/ObjectiveHealthTrend.tsx +215 -0
- package/cloud-runtime/standalone/apps/local/components/projects/ObjectiveScheduledTasksPanel.tsx +338 -91
- package/cloud-runtime/standalone/apps/local/components/projects/ProjectHome.tsx +12 -6
- package/cloud-runtime/standalone/apps/local/components/projects/ProjectObjectivesWorkspace.tsx +489 -467
- package/cloud-runtime/standalone/apps/local/components/projects/ProjectSearchBar.tsx +4 -2
- package/cloud-runtime/standalone/apps/local/components/projects/RecentlyCompletedCard.tsx +213 -0
- package/cloud-runtime/standalone/apps/local/components/projects/ScheduledTasksSummaryCard.tsx +19 -19
- package/cloud-runtime/standalone/apps/local/components/projects/TeamsSummaryCard.tsx +10 -10
- package/cloud-runtime/standalone/apps/local/components/projects/TeamsView.tsx +171 -56
- package/cloud-runtime/standalone/apps/local/components/projects/WorkingNowCard.tsx +12 -12
- package/cloud-runtime/standalone/apps/local/components/projects/home/ObjectiveCard.tsx +13 -10
- package/cloud-runtime/standalone/apps/local/components/projects/home/ObjectivesSection.tsx +7 -7
- package/cloud-runtime/standalone/apps/local/components/projects/home/ToolPathCard.tsx +2 -2
- package/cloud-runtime/standalone/apps/local/components/projects/home/ToolPathsSection.tsx +9 -9
- package/cloud-runtime/standalone/apps/local/components/scheduling/ScheduleConditionPicker.tsx +4 -4
- package/cloud-runtime/standalone/apps/local/components/setup/McpSetupStep.tsx +242 -0
- package/cloud-runtime/standalone/apps/local/components/setup/ProjectStep.tsx +2 -2
- package/cloud-runtime/standalone/apps/local/components/setup/ProviderStep.tsx +1 -1
- package/cloud-runtime/standalone/apps/local/components/setup/TeamsStep.tsx +288 -15
- package/cloud-runtime/standalone/apps/local/components/terminal/ProjectTerminal.tsx +233 -89
- package/cloud-runtime/standalone/apps/local/components/terminal/TerminalSessionList.tsx +3 -1
- package/cloud-runtime/standalone/apps/local/components/thread/WorkspaceSidebar.tsx +72 -21
- package/cloud-runtime/standalone/apps/local/hooks/useInputCapabilities.ts +74 -0
- package/cloud-runtime/standalone/apps/local/hooks/useSetupFlow.ts +16 -2
- package/cloud-runtime/standalone/apps/local/lib/app-config.ts +35 -0
- package/cloud-runtime/standalone/apps/local/lib/objective-health-history.ts +198 -0
- package/cloud-runtime/standalone/apps/local/lib/project-objective-context.ts +10 -0
- package/cloud-runtime/standalone/apps/local/lib/project-objectives.ts +0 -9
- package/cloud-runtime/standalone/apps/local/lib/pty-manager.ts +5 -1
- package/cloud-runtime/standalone/apps/local/lib/terminal-server.ts +182 -0
- package/cloud-runtime/standalone/apps/local/next.config.ts +2 -1
- package/cloud-runtime/standalone/apps/local/package.json +2 -2
- package/cloud-runtime/standalone/apps/local/playwright.config.ts +8 -0
- package/cloud-runtime/standalone/apps/local/server.js +1 -1
- package/cloud-runtime/standalone/apps/local/server.ts +14 -158
- package/cloud-runtime/standalone/apps/local/skills-lock.json +20 -0
- package/cloud-runtime/standalone/apps/local/src/automations/adapters.ts +5 -0
- package/cloud-runtime/standalone/apps/local/src/automations/types.ts +5 -0
- package/cloud-runtime/standalone/apps/local/src/automations/validation.ts +12 -5
- package/cloud-runtime/standalone/apps/local/src/graph/types.ts +2 -0
- package/cloud-runtime/standalone/apps/local/src/objectives/parser.ts +0 -2
- package/cloud-runtime/standalone/apps/local/src/objectives/serializer.ts +0 -2
- package/cloud-runtime/standalone/apps/local/src/prompt-scheduler/cron.ts +11 -0
- package/cloud-runtime/standalone/apps/local/src/prompt-scheduler/linear-worker-constants.ts +38 -0
- package/cloud-runtime/standalone/apps/local/src/prompt-scheduler/linear-worker-job.ts +47 -0
- package/cloud-runtime/standalone/apps/local/src/prompt-scheduler/linear-worker.ts +482 -0
- package/cloud-runtime/standalone/apps/local/src/prompt-scheduler/objective-worker-job.ts +47 -0
- package/cloud-runtime/standalone/apps/local/src/prompt-scheduler/objective-worker.ts +511 -0
- package/cloud-runtime/standalone/apps/local/src/prompt-scheduler/processor.ts +239 -368
- package/cloud-runtime/standalone/apps/local/src/prompt-scheduler/store.ts +19 -4
- package/cloud-runtime/standalone/apps/local/src/prompt-scheduler/types.ts +32 -8
- package/cloud-runtime/standalone/apps/local/state/terminalTabs.ts +182 -106
- package/cloud-runtime/standalone/apps/local/state/windowState.ts +11 -0
- package/cloud-runtime/standalone/apps/local/styles/workspaceSidebar.css +65 -0
- package/cloud-runtime/standalone/apps/local/worker/index.js +9 -14
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/darwin-arm64/pty.node +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/darwin-x64/pty.node +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/darwin-x64/spawn-helper +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-arm64/conpty.pdb +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-arm64/pty.node +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-arm64/pty.pdb +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-arm64/winpty-agent.exe +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-arm64/winpty-agent.pdb +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-arm64/winpty.dll +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-arm64/winpty.pdb +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-x64/conpty.node +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-x64/conpty.pdb +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-x64/pty.node +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-x64/pty.pdb +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-x64/winpty-agent.exe +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-x64/winpty-agent.pdb +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-x64/winpty.dll +0 -0
- package/cloud-runtime/standalone/node_modules/node-pty/prebuilds/win32-x64/winpty.pdb +0 -0
- package/lib/cli/daemon.js +13 -2
- package/lib/cli/onboarding.js +5 -6
- package/lib/cli/runCli.js +1 -1
- package/lib/cloud/client.js +1 -1
- package/lib/commands/chat.js +37 -11
- package/lib/commands/daemonBoard.js +19 -13
- package/lib/config/cloudConfig.js +1 -1
- package/lib/orchestrator/httpClient.js +1 -1
- package/lib/prompts/templates.js +8 -9
- package/package.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0-0479y._.js +0 -54
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__088h0r2._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__08oj_ky._.js +0 -49
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__08y2lkj._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__09joc_o._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0gtv0rq._.js +0 -8
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0gvjvx7._.js +0 -237
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0ksbs9p._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0o315az._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0pz~m67._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0q93mk3._.js +0 -7
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0t2jk2r._.js +0 -18
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0vhcrdv._.js +0 -229
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__11s20j6._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__12xhcor._.js +0 -54
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/_01rag2f._.js +0 -49
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/_03y4xss._.js +0 -21
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/_0cm4i3i._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/_0ijzgnb._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_03q7_.q._.js +0 -21
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_0m3e2d~._.js +0 -30
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_0r-oiga._.js +0 -30
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_00cwfvi._.js +0 -34
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_0hx7xyz._.js +0 -34
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_0rqcat4._.js +0 -55
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_0sc_lek._.js +0 -79
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_135ddsu._.js +0 -55
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_src_graph_store_ts_0h.2qy9._.js +0 -43
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_src_prompt-scheduler_processor_ts_0i1av_r._.js +0 -474
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0xxf2a0.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/0rhn_lucide-react_dist_esm_0xd_mxu._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__044xm0q._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__066ay_e._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__09smg3p._.js +0 -18
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__0bf346q._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__0hd2vo4._.js +0 -18
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__0iix1sf._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__0r54zr9._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__0s8z2_c._.js +0 -18
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__0wq3ukc._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_03-mlx0._.js +0 -7
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_03rf_sb._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_09b42z9._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0ag3.tl._.js +0 -7
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0dh_hx0._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0h8cbsi._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0i1ffhz._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0ndrb_0._.js +0 -8
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0nlki7b._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0ut3k~7._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0vibfch._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0yffwm4._.js +0 -8
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0_q01av._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0eh.4j7._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0qaowqy._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0s0iy2_._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0zr-_na._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_10qsqky._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0.a4-dh~x9sa3.js +0 -6
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0.bv3h68wo33z.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/016.x9zt9~rsh.js +0 -16
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/027-6dwgpb0cy.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/031720jijg_th.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/03m1xs0rztynh.js +0 -16
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/051-7k0nnm-vm.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/07o~9mm~xds_b.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/08zgoptetnxjj.css +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/09-_2lcshmjl5.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/09_yj-9nfh48m.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/09c7ssmgohk7l.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0awbe2r3qazge.css +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0dro-bz6f72z0.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0gbunx8z.~i4x.js +0 -5
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0ge81r~ap.u7n.js +0 -28
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0ghg5160qeazw.js +0 -5
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0gl_8hdxl5qnd.js +0 -37
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0g~v8p6_pc46-.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0jb4f8425s.-2.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0kukkarp4un0o.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0m.2b-cekea8b.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0o0hwfzwwty4b.js +0 -6
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0ov5lu0tz2o2e.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0pt8_y9asrg~7.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0wyg4lymaq0hg.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0xl~1ux2f~rcu.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0y7-eze-w7~b4.js +0 -5
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0y8e--tok1214.js +0 -5
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0yy~0bgsz~o6-.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0~apd0q5_i88z.js +0 -16
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/100xrwo-45nrg.js +0 -20
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/14h3qxwuo~1q9.js +0 -20
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/17oesq5eds3xi.js +0 -1
- /package/cloud-runtime/standalone/apps/local/.next/static/{z8XjY2Aj-ox_Dro192i4I → RnYHmEXBwXJjVrVVx2CuP}/_buildManifest.js +0 -0
- /package/cloud-runtime/standalone/apps/local/.next/static/{z8XjY2Aj-ox_Dro192i4I → RnYHmEXBwXJjVrVVx2CuP}/_clientMiddlewareManifest.js +0 -0
- /package/cloud-runtime/standalone/apps/local/.next/static/{z8XjY2Aj-ox_Dro192i4I → RnYHmEXBwXJjVrVVx2CuP}/_ssgManifest.js +0 -0
package/cloud-runtime/standalone/apps/local/components/projects/ProjectObjectivesWorkspace.tsx
CHANGED
|
@@ -13,9 +13,11 @@ import {
|
|
|
13
13
|
FileText,
|
|
14
14
|
Pencil,
|
|
15
15
|
Plus,
|
|
16
|
+
Search,
|
|
16
17
|
Trash2,
|
|
17
18
|
User,
|
|
18
19
|
Users,
|
|
20
|
+
Sparkles,
|
|
19
21
|
X,
|
|
20
22
|
} from "lucide-react";
|
|
21
23
|
import { useProjects } from "@/hooks/useProjects";
|
|
@@ -26,20 +28,18 @@ import { Markdown } from "@/components/chat-ui/Markdown";
|
|
|
26
28
|
import { agentAvatarUrl } from "@/components/chat-ui/ParticipantBar";
|
|
27
29
|
import RichTextEditor from "@/components/RichTextEditor";
|
|
28
30
|
import SearchCombo, { type ComboOption } from "@/components/SearchCombo";
|
|
29
|
-
import { ScheduleConditionPicker } from "@/components/scheduling/ScheduleConditionPicker";
|
|
30
31
|
import { ObjectiveScheduledTasksPanel } from "@/components/projects/ObjectiveScheduledTasksPanel";
|
|
31
32
|
import { ObjectiveActivityTimeline } from "@/components/projects/ObjectiveActivityTimeline";
|
|
33
|
+
import { ObjectiveHealthTrend } from "@/components/projects/ObjectiveHealthTrend";
|
|
32
34
|
import { LinearIcon } from "@/components/linear/LinearIcon";
|
|
33
35
|
import { usePromptJobs } from "@/hooks/usePromptJobs";
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
36
|
-
DEFAULT_OBJECTIVE_LINEAR_WORKER_NAME,
|
|
37
|
-
type PromptJobExecutionMode,
|
|
38
|
-
} from "@/src/prompt-scheduler/types";
|
|
36
|
+
import { useInputCapabilities } from "@/hooks/useInputCapabilities";
|
|
39
37
|
import { threadService } from "@/services/threadService";
|
|
40
38
|
import {
|
|
41
39
|
loadObjectiveChatPanelWidth,
|
|
40
|
+
loadObjectiveListPanelWidth,
|
|
42
41
|
persistObjectiveChatPanelWidth,
|
|
42
|
+
persistObjectiveListPanelWidth,
|
|
43
43
|
} from "@/state/windowState";
|
|
44
44
|
import type { GroupMessage, Participant } from "@/lib/types";
|
|
45
45
|
import {
|
|
@@ -65,6 +65,7 @@ interface ProjectObjectivesWorkspaceProps {
|
|
|
65
65
|
|
|
66
66
|
interface ProjectObjectiveDetailProps extends ProjectObjectivesWorkspaceProps {
|
|
67
67
|
objectiveId: string;
|
|
68
|
+
onObjectiveDeleted?: () => void;
|
|
68
69
|
}
|
|
69
70
|
|
|
70
71
|
interface ObjectiveEditorDraft {
|
|
@@ -72,8 +73,6 @@ interface ObjectiveEditorDraft {
|
|
|
72
73
|
title: string;
|
|
73
74
|
teamId: string;
|
|
74
75
|
summary: string;
|
|
75
|
-
cadence: string;
|
|
76
|
-
condition: string;
|
|
77
76
|
}
|
|
78
77
|
|
|
79
78
|
interface ObjectiveTeamDraft {
|
|
@@ -109,23 +108,23 @@ const HEALTH_META: Record<
|
|
|
109
108
|
> = {
|
|
110
109
|
on_track: {
|
|
111
110
|
label: "On track",
|
|
112
|
-
chipClass: "border-
|
|
113
|
-
toneClass: "text-
|
|
111
|
+
chipClass: "border-[var(--status-completed-border)] bg-[var(--status-completed-bg)] text-[var(--status-completed-text)]",
|
|
112
|
+
toneClass: "text-[var(--status-completed-text)]",
|
|
114
113
|
},
|
|
115
114
|
at_risk: {
|
|
116
115
|
label: "At risk",
|
|
117
|
-
chipClass: "border-
|
|
118
|
-
toneClass: "text-
|
|
116
|
+
chipClass: "border-[var(--status-blocked-border)] bg-[var(--status-blocked-bg)] text-[var(--status-blocked-text)]",
|
|
117
|
+
toneClass: "text-[var(--status-blocked-text)]",
|
|
119
118
|
},
|
|
120
119
|
off_track: {
|
|
121
120
|
label: "Off track",
|
|
122
|
-
chipClass: "border-
|
|
123
|
-
toneClass: "text-
|
|
121
|
+
chipClass: "border-[var(--status-failed-border)] bg-[var(--status-failed-bg)] text-[var(--status-failed-text)]",
|
|
122
|
+
toneClass: "text-[var(--status-failed-text)]",
|
|
124
123
|
},
|
|
125
124
|
done: {
|
|
126
125
|
label: "Done",
|
|
127
|
-
chipClass: "border-
|
|
128
|
-
toneClass: "text-
|
|
126
|
+
chipClass: "border-[var(--status-in-progress-border)] bg-[var(--status-in-progress-bg)] text-[var(--status-in-progress-text)]",
|
|
127
|
+
toneClass: "text-[var(--status-in-progress-text)]",
|
|
129
128
|
},
|
|
130
129
|
};
|
|
131
130
|
|
|
@@ -138,33 +137,11 @@ function ObjectiveChatResizeHandle({
|
|
|
138
137
|
}: {
|
|
139
138
|
onResize: (delta: number) => void;
|
|
140
139
|
}) {
|
|
141
|
-
const
|
|
142
|
-
const lastX = useRef(0);
|
|
143
|
-
|
|
144
|
-
useEffect(() => {
|
|
145
|
-
if (!dragging.current) return;
|
|
146
|
-
|
|
147
|
-
const onMouseMove = (event: MouseEvent) => {
|
|
148
|
-
const delta = lastX.current - event.clientX;
|
|
149
|
-
lastX.current = event.clientX;
|
|
150
|
-
onResize(delta);
|
|
151
|
-
};
|
|
152
|
-
|
|
153
|
-
const onMouseUp = () => {
|
|
154
|
-
dragging.current = false;
|
|
155
|
-
document.body.style.cursor = "";
|
|
156
|
-
document.body.style.userSelect = "";
|
|
157
|
-
window.removeEventListener("mousemove", onMouseMove);
|
|
158
|
-
window.removeEventListener("mouseup", onMouseUp);
|
|
159
|
-
};
|
|
140
|
+
const { isTouchLayout } = useInputCapabilities();
|
|
160
141
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
window.removeEventListener("mousemove", onMouseMove);
|
|
165
|
-
window.removeEventListener("mouseup", onMouseUp);
|
|
166
|
-
};
|
|
167
|
-
});
|
|
142
|
+
if (isTouchLayout) {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
168
145
|
|
|
169
146
|
return (
|
|
170
147
|
<div
|
|
@@ -174,10 +151,22 @@ function ObjectiveChatResizeHandle({
|
|
|
174
151
|
className="group relative z-10 hidden w-0 shrink-0 cursor-col-resize xl:block"
|
|
175
152
|
onMouseDown={(event) => {
|
|
176
153
|
event.preventDefault();
|
|
177
|
-
|
|
178
|
-
lastX.current = event.clientX;
|
|
154
|
+
let lastX = event.clientX;
|
|
179
155
|
document.body.style.cursor = "col-resize";
|
|
180
156
|
document.body.style.userSelect = "none";
|
|
157
|
+
const onMouseMove = (ev: MouseEvent) => {
|
|
158
|
+
const delta = lastX - ev.clientX;
|
|
159
|
+
lastX = ev.clientX;
|
|
160
|
+
onResize(delta);
|
|
161
|
+
};
|
|
162
|
+
const onMouseUp = () => {
|
|
163
|
+
document.body.style.cursor = "";
|
|
164
|
+
document.body.style.userSelect = "";
|
|
165
|
+
window.removeEventListener("mousemove", onMouseMove);
|
|
166
|
+
window.removeEventListener("mouseup", onMouseUp);
|
|
167
|
+
};
|
|
168
|
+
window.addEventListener("mousemove", onMouseMove);
|
|
169
|
+
window.addEventListener("mouseup", onMouseUp);
|
|
181
170
|
}}
|
|
182
171
|
>
|
|
183
172
|
<div className="absolute inset-y-0 -left-0.5 w-1 transition-colors group-hover:bg-[var(--primary)]/40" />
|
|
@@ -199,8 +188,6 @@ function buildEmptyObjectiveDraft(): ObjectiveEditorDraft {
|
|
|
199
188
|
title: "",
|
|
200
189
|
teamId: "",
|
|
201
190
|
summary: "",
|
|
202
|
-
cadence: "",
|
|
203
|
-
condition: "",
|
|
204
191
|
};
|
|
205
192
|
}
|
|
206
193
|
|
|
@@ -210,8 +197,6 @@ function buildObjectiveDraft(objective: ProjectObjective): ObjectiveEditorDraft
|
|
|
210
197
|
title: objective.title,
|
|
211
198
|
teamId: objective.teamId,
|
|
212
199
|
summary: objective.summary,
|
|
213
|
-
cadence: objective.cadence,
|
|
214
|
-
condition: objective.condition,
|
|
215
200
|
};
|
|
216
201
|
}
|
|
217
202
|
|
|
@@ -258,12 +243,6 @@ function getTeamName(teams: ProjectTeamSummary[], teamId: string): string | null
|
|
|
258
243
|
return teams.find((team) => team.id === teamId)?.name ?? null;
|
|
259
244
|
}
|
|
260
245
|
|
|
261
|
-
function formatObjectiveCadence(cadence: string): string {
|
|
262
|
-
const trimmed = cadence.trim();
|
|
263
|
-
if (!trimmed) return "Not set yet";
|
|
264
|
-
return cronToHuman(trimmed) ?? trimmed;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
246
|
function prependObjectiveLabelToPrompt(
|
|
268
247
|
objective: Pick<ProjectObjective, "key">,
|
|
269
248
|
prompt: string
|
|
@@ -391,27 +370,24 @@ function buildObjectiveChatPrefix(
|
|
|
391
370
|
`Objective label: ${objective.key}`,
|
|
392
371
|
teamName ? `Owning team: ${teamName}` : "",
|
|
393
372
|
notesPreview ? `Current notes:\n${notesPreview}` : "Current notes: none yet.",
|
|
394
|
-
objective.
|
|
395
|
-
? `Wake schedule: ${formatObjectiveCadence(objective.cadence)}`
|
|
396
|
-
: "Wake schedule: not set yet.",
|
|
397
|
-
objective.condition ? `Wake condition: ${objective.condition}` : "",
|
|
373
|
+
"Wake schedule: managed by the built-in objective worker job.",
|
|
398
374
|
|
|
399
|
-
`## Objective file (source of truth)\n\nThis objective is stored as a frontmatter markdown file at:\n\`${objectiveFilePath}\`\n\nFile format:\n- YAML frontmatter between \`---\` delimiters contains all metadata (title, teamId, key, status, progress,
|
|
375
|
+
`## Objective file (source of truth)\n\nThis objective is stored as a frontmatter markdown file at:\n\`${objectiveFilePath}\`\n\nFile format:\n- YAML frontmatter between \`---\` delimiters contains all metadata (title, teamId, key, status, progress, scheduledTaskIds, threadId, chatSessionVersion, createdAt, updatedAt).\n- \`## Activities\` section contains the activity timeline; each activity is a \`### Title\` block with metadata lines (\`- **id:**\`, \`- **source:**\`, \`- **created:**\`, \`- **body:**\`) and optional \`#### Replies\` sub-section.\n\nNotes are stored as separate files in \`${notesDir}\`. Each note is a markdown file with YAML frontmatter (id, title, objectiveId, createdAt, updatedAt) and a markdown body.\n\nWhen updating the objective, you can edit this file directly. Rules:\n- NEVER remove or break the \`---\` frontmatter delimiters.\n- NEVER change the \`id\` or \`createdAt\` fields.\n- Always update \`updatedAt\` to the current ISO timestamp when making changes.\n- After any edit, call \`GET ${validateRoute}\` to verify the file is still valid.\n- If validation fails, fix the errors immediately before doing anything else.`,
|
|
400
376
|
|
|
401
377
|
"Scheduled tasks live in the shared scheduled-task list and are filtered by this objective label.",
|
|
402
|
-
"Your job is to help the team develop the strategy needed to reach the goal, including the right combination of objective notes,
|
|
378
|
+
"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 Linear tickets.",
|
|
403
379
|
"Use the current session history to build on prior reasoning. Only reset and start from scratch when the user explicitly starts a new session.",
|
|
404
380
|
"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.",
|
|
405
381
|
"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.",
|
|
406
382
|
"Local objective APIs:",
|
|
407
|
-
`- PATCH ${objectiveRoute} with JSON fields such as {"title","
|
|
383
|
+
`- PATCH ${objectiveRoute} with JSON fields such as {"title","teamId","key"} to update the objective itself.`,
|
|
408
384
|
`- GET ${notesRoute} to list all notes for this objective. Returns {"notes":[...],"total","page","limit","hasMore"}.`,
|
|
409
385
|
`- POST ${notesRoute} with {"title","body"} to create a new note.`,
|
|
410
386
|
`- GET ${notesRoute}/{noteId} to read a single note.`,
|
|
411
387
|
`- PATCH ${notesRoute}/{noteId} with {"title","body"} to update a note.`,
|
|
412
388
|
`- DELETE ${notesRoute}/{noteId} to delete a note.`,
|
|
413
389
|
`- GET ${scheduledTasksRoute} to inspect the scheduled tasks already tracked for this objective.`,
|
|
414
|
-
`- POST ${scheduledTasksRoute} with {"name","prompt","cadence","
|
|
390
|
+
`- POST ${scheduledTasksRoute} with {"name","prompt","cadence","agentId"} to create a scheduled task for this objective.`,
|
|
415
391
|
`- GET ${linearIssuesRoute} to inspect Linear tickets carrying the objective label "${objective.key}".`,
|
|
416
392
|
`- POST ${linearIssuesRoute} with {"title","description","teamId","assigneeId","cycleId","stateId","priority"} to create a Linear ticket labeled "${objective.key}".`,
|
|
417
393
|
`- GET ${validateRoute} to validate the objective file on disk. Returns {"valid":true} or {"valid":false,"errors":[...]}.`,
|
|
@@ -636,24 +612,27 @@ function ObjectiveChatPanel({
|
|
|
636
612
|
|
|
637
613
|
async function loadParticipants() {
|
|
638
614
|
try {
|
|
639
|
-
const
|
|
615
|
+
const agentsUrl = objective.teamId
|
|
616
|
+
? `/api/projects/${projectId}/teams/${objective.teamId}/agents`
|
|
617
|
+
: `/api/projects/${projectId}/agents`;
|
|
618
|
+
const [participantsResponse, agentsResponse] = await Promise.all([
|
|
640
619
|
fetch("/api/participants"),
|
|
641
|
-
fetch(
|
|
620
|
+
fetch(agentsUrl),
|
|
642
621
|
]);
|
|
643
622
|
const rawParticipants = participantsResponse.ok
|
|
644
623
|
? await participantsResponse.json()
|
|
645
624
|
: [];
|
|
646
625
|
const allParticipants = Array.isArray(rawParticipants) ? (rawParticipants as Participant[]) : [];
|
|
647
|
-
const
|
|
648
|
-
? await
|
|
626
|
+
const rawAgents = agentsResponse.ok
|
|
627
|
+
? await agentsResponse.json()
|
|
649
628
|
: { agents: [] };
|
|
650
|
-
const
|
|
651
|
-
|
|
652
|
-
? (
|
|
629
|
+
const agentsPayload =
|
|
630
|
+
rawAgents && typeof rawAgents === "object"
|
|
631
|
+
? (rawAgents as { agents?: ProjectAgentSummary[] })
|
|
653
632
|
: { agents: [] };
|
|
654
633
|
if (cancelled) return;
|
|
655
634
|
|
|
656
|
-
const orderedAgentIds = (
|
|
635
|
+
const orderedAgentIds = (agentsPayload.agents ?? [])
|
|
657
636
|
.slice()
|
|
658
637
|
.sort((left, right) => left.routing_order - right.routing_order)
|
|
659
638
|
.map((agent) => agent.agent_id);
|
|
@@ -680,7 +659,7 @@ function ObjectiveChatPanel({
|
|
|
680
659
|
return () => {
|
|
681
660
|
cancelled = true;
|
|
682
661
|
};
|
|
683
|
-
}, [projectId]);
|
|
662
|
+
}, [projectId, objective.teamId]);
|
|
684
663
|
|
|
685
664
|
useEffect(() => {
|
|
686
665
|
if (!objective.threadId) {
|
|
@@ -1053,7 +1032,7 @@ function ObjectiveChatPanel({
|
|
|
1053
1032
|
<>
|
|
1054
1033
|
<ObjectiveChatResizeHandle onResize={handleChatPanelResize} />
|
|
1055
1034
|
<aside
|
|
1056
|
-
className="relative flex h-full min-h-[420px] w-full flex-col overflow-hidden border-t border-[var(--border)] bg-[
|
|
1035
|
+
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"
|
|
1057
1036
|
style={
|
|
1058
1037
|
{
|
|
1059
1038
|
"--objective-chat-panel-width": `${chatPanelWidth}px`,
|
|
@@ -1068,7 +1047,7 @@ function ObjectiveChatPanel({
|
|
|
1068
1047
|
type="button"
|
|
1069
1048
|
onClick={() => setChatView("list")}
|
|
1070
1049
|
aria-label="Back to sessions"
|
|
1071
|
-
className="inline-flex min-w-0 items-center gap-2 text-left text-sm font-medium text-[var(--foreground)] transition-colors hover:text-
|
|
1050
|
+
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)]"
|
|
1072
1051
|
>
|
|
1073
1052
|
<ArrowLeft className="h-3.5 w-3.5" />
|
|
1074
1053
|
<span className="truncate">
|
|
@@ -1118,7 +1097,7 @@ function ObjectiveChatPanel({
|
|
|
1118
1097
|
setSelectedSessionId(session.rootMessageId);
|
|
1119
1098
|
setChatView("detail");
|
|
1120
1099
|
}}
|
|
1121
|
-
className="flex w-full items-start justify-between gap-3 px-4 py-3 text-left transition-colors hover:bg-
|
|
1100
|
+
className="flex w-full items-start justify-between gap-3 px-4 py-3 text-left transition-colors hover:bg-[var(--overlay-panel-soft)]"
|
|
1122
1101
|
>
|
|
1123
1102
|
<div className="min-w-0 flex-1">
|
|
1124
1103
|
<p className="truncate text-sm font-medium text-[var(--foreground)]">
|
|
@@ -1131,7 +1110,7 @@ function ObjectiveChatPanel({
|
|
|
1131
1110
|
</div>
|
|
1132
1111
|
<div className="flex shrink-0 items-center gap-2">
|
|
1133
1112
|
{sessionState ? (
|
|
1134
|
-
<span className="rounded-full border border-
|
|
1113
|
+
<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)]">
|
|
1135
1114
|
{sessionState === "queued" ? "Queued" : "Working"}
|
|
1136
1115
|
</span>
|
|
1137
1116
|
) : null}
|
|
@@ -1160,7 +1139,7 @@ function ObjectiveChatPanel({
|
|
|
1160
1139
|
return (
|
|
1161
1140
|
<div key={message.id} className="flex gap-3">
|
|
1162
1141
|
{message.role === "user" ? (
|
|
1163
|
-
<div className="flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-[
|
|
1142
|
+
<div className="flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-[var(--overlay-panel-soft)] text-[var(--muted-foreground)]">
|
|
1164
1143
|
<User className="h-4 w-4" />
|
|
1165
1144
|
</div>
|
|
1166
1145
|
) : (
|
|
@@ -1184,7 +1163,7 @@ function ObjectiveChatPanel({
|
|
|
1184
1163
|
})}
|
|
1185
1164
|
</span>
|
|
1186
1165
|
</div>
|
|
1187
|
-
<div className="mt-2 rounded-2xl border border-[var(--border)] bg-[
|
|
1166
|
+
<div className="mt-2 rounded-2xl border border-[var(--border)] bg-[var(--overlay-panel-muted)] px-4 py-3 text-sm text-[var(--foreground)]">
|
|
1188
1167
|
<Markdown content={message.content} isUser={message.role === "user"} />
|
|
1189
1168
|
</div>
|
|
1190
1169
|
</div>
|
|
@@ -1208,7 +1187,7 @@ function ObjectiveChatPanel({
|
|
|
1208
1187
|
)}
|
|
1209
1188
|
</div>
|
|
1210
1189
|
|
|
1211
|
-
<div className="absolute bottom-0 left-0 right-0 p-3 pb-[calc(0.75rem+env(safe-area-inset-bottom))]
|
|
1190
|
+
<div className="absolute bottom-0 left-0 right-0 bg-[var(--overlay-panel)] p-3 pb-[calc(0.75rem+env(safe-area-inset-bottom))]">
|
|
1212
1191
|
<Composer
|
|
1213
1192
|
onSend={handleSend}
|
|
1214
1193
|
onStop={interruptObjectiveChat}
|
|
@@ -1265,7 +1244,7 @@ function ObjectiveNotesEditor({
|
|
|
1265
1244
|
if (!editable && !hasContent) return null;
|
|
1266
1245
|
|
|
1267
1246
|
return (
|
|
1268
|
-
<div className="overflow-hidden border-l-2 border-
|
|
1247
|
+
<div className="overflow-hidden border-l-2 border-[var(--border)]/60 pl-4 transition-all focus-within:border-indigo-500/60">
|
|
1269
1248
|
{editable || hasContent ? (
|
|
1270
1249
|
<RichTextEditor
|
|
1271
1250
|
content={content}
|
|
@@ -1278,43 +1257,96 @@ function ObjectiveNotesEditor({
|
|
|
1278
1257
|
);
|
|
1279
1258
|
}
|
|
1280
1259
|
|
|
1260
|
+
const OBJECTIVE_LIST_MIN_WIDTH = 240;
|
|
1261
|
+
const OBJECTIVE_LIST_MAX_WIDTH = 480;
|
|
1262
|
+
|
|
1263
|
+
function ObjectiveListResizeHandle({
|
|
1264
|
+
onResize,
|
|
1265
|
+
}: {
|
|
1266
|
+
onResize: (delta: number) => void;
|
|
1267
|
+
}) {
|
|
1268
|
+
const { isTouchLayout } = useInputCapabilities();
|
|
1269
|
+
|
|
1270
|
+
if (isTouchLayout) {
|
|
1271
|
+
return null;
|
|
1272
|
+
}
|
|
1273
|
+
|
|
1274
|
+
return (
|
|
1275
|
+
<div
|
|
1276
|
+
role="separator"
|
|
1277
|
+
aria-orientation="vertical"
|
|
1278
|
+
aria-label="Resize objective list panel"
|
|
1279
|
+
className="group relative z-10 w-0 shrink-0 cursor-col-resize"
|
|
1280
|
+
onMouseDown={(event) => {
|
|
1281
|
+
event.preventDefault();
|
|
1282
|
+
let lastX = event.clientX;
|
|
1283
|
+
document.body.style.cursor = "col-resize";
|
|
1284
|
+
document.body.style.userSelect = "none";
|
|
1285
|
+
const onMouseMove = (ev: MouseEvent) => {
|
|
1286
|
+
const delta = ev.clientX - lastX;
|
|
1287
|
+
lastX = ev.clientX;
|
|
1288
|
+
onResize(delta);
|
|
1289
|
+
};
|
|
1290
|
+
const onMouseUp = () => {
|
|
1291
|
+
document.body.style.cursor = "";
|
|
1292
|
+
document.body.style.userSelect = "";
|
|
1293
|
+
window.removeEventListener("mousemove", onMouseMove);
|
|
1294
|
+
window.removeEventListener("mouseup", onMouseUp);
|
|
1295
|
+
};
|
|
1296
|
+
window.addEventListener("mousemove", onMouseMove);
|
|
1297
|
+
window.addEventListener("mouseup", onMouseUp);
|
|
1298
|
+
}}
|
|
1299
|
+
>
|
|
1300
|
+
<div className="absolute inset-y-0 -left-0.5 w-1 transition-colors group-hover:bg-[var(--primary)]/40" />
|
|
1301
|
+
</div>
|
|
1302
|
+
);
|
|
1303
|
+
}
|
|
1304
|
+
|
|
1281
1305
|
function ObjectiveListCard({
|
|
1282
|
-
projectSlug,
|
|
1283
1306
|
objective,
|
|
1284
1307
|
activityCount,
|
|
1285
1308
|
lastActivityAt,
|
|
1286
1309
|
activeAgentIds,
|
|
1287
1310
|
participants,
|
|
1311
|
+
isSelected,
|
|
1312
|
+
onSelect,
|
|
1288
1313
|
}: {
|
|
1289
|
-
projectSlug: string;
|
|
1290
1314
|
objective: ProjectObjective;
|
|
1291
1315
|
activityCount: number;
|
|
1292
1316
|
lastActivityAt: string | null;
|
|
1293
1317
|
activeAgentIds?: string[];
|
|
1294
1318
|
participants?: Participant[];
|
|
1319
|
+
isSelected?: boolean;
|
|
1320
|
+
onSelect?: () => void;
|
|
1295
1321
|
}) {
|
|
1296
1322
|
const activityMeta = buildActivityMeta(activityCount, lastActivityAt);
|
|
1297
1323
|
|
|
1298
1324
|
return (
|
|
1299
1325
|
<article className="px-2">
|
|
1300
|
-
<
|
|
1301
|
-
|
|
1326
|
+
<button
|
|
1327
|
+
type="button"
|
|
1328
|
+
onClick={onSelect}
|
|
1302
1329
|
aria-label={`Open details for ${objective.title}`}
|
|
1303
|
-
className=
|
|
1330
|
+
className={`group flex w-full items-center gap-3 rounded-xl px-2 py-2 text-left transition-colors ${
|
|
1331
|
+
isSelected
|
|
1332
|
+
? "bg-[var(--primary)]/10 border border-[var(--primary)]/20"
|
|
1333
|
+
: "border border-transparent hover:bg-[var(--secondary)]"
|
|
1334
|
+
}`}
|
|
1304
1335
|
>
|
|
1305
|
-
<div className="min-w-0 flex-1
|
|
1306
|
-
<div className="flex min-w-0 items-center gap-
|
|
1307
|
-
<span
|
|
1308
|
-
{objective.
|
|
1336
|
+
<div className="min-w-0 flex-1 py-0.5">
|
|
1337
|
+
<div className="flex min-w-0 items-center gap-2">
|
|
1338
|
+
<span
|
|
1339
|
+
className={`rounded-full border px-1.5 py-0 text-[9px] font-semibold uppercase tracking-[0.12em] ${HEALTH_META[objective.status].chipClass}`}
|
|
1340
|
+
>
|
|
1341
|
+
{HEALTH_META[objective.status].label}
|
|
1309
1342
|
</span>
|
|
1310
1343
|
</div>
|
|
1311
|
-
<
|
|
1344
|
+
<p className="mt-1 truncate text-sm font-medium text-[var(--foreground)]">
|
|
1345
|
+
{objective.title}
|
|
1346
|
+
</p>
|
|
1347
|
+
<p className="mt-0.5 text-[11px] text-[var(--muted-foreground)]">
|
|
1312
1348
|
{activityMeta}
|
|
1313
|
-
</
|
|
1314
|
-
</div>
|
|
1315
|
-
|
|
1316
|
-
<div className="hidden shrink-0 text-right text-xs text-[var(--muted-foreground)] sm:block">
|
|
1317
|
-
<div>{activityMeta}</div>
|
|
1349
|
+
</p>
|
|
1318
1350
|
</div>
|
|
1319
1351
|
|
|
1320
1352
|
{activeAgentIds && activeAgentIds.length > 0 && (
|
|
@@ -1330,19 +1362,15 @@ function ObjectiveListCard({
|
|
|
1330
1362
|
})}
|
|
1331
1363
|
</span>
|
|
1332
1364
|
)}
|
|
1333
|
-
|
|
1334
|
-
<span className="inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-full text-[var(--muted-foreground)] transition-colors group-hover:bg-white/5 group-hover:text-[var(--foreground)] group-focus-visible:bg-white/5 group-focus-visible:text-[var(--foreground)]">
|
|
1335
|
-
<ArrowRight className="h-4 w-4" />
|
|
1336
|
-
</span>
|
|
1337
|
-
</Link>
|
|
1365
|
+
</button>
|
|
1338
1366
|
</article>
|
|
1339
1367
|
);
|
|
1340
1368
|
}
|
|
1341
1369
|
|
|
1342
1370
|
export function ProjectObjectivesOverview({
|
|
1343
1371
|
projectSlug,
|
|
1344
|
-
|
|
1345
|
-
|
|
1372
|
+
initialObjectiveId,
|
|
1373
|
+
}: ProjectObjectivesWorkspaceProps & { initialObjectiveId?: string }) {
|
|
1346
1374
|
const { isLoading, project, workspace, teams, persistWorkspace } =
|
|
1347
1375
|
useProjectObjectivesWorkspace(projectSlug);
|
|
1348
1376
|
const objectives = workspace.objectives;
|
|
@@ -1350,12 +1378,36 @@ export function ProjectObjectivesOverview({
|
|
|
1350
1378
|
() => getAvailableTeams(teams, workspace),
|
|
1351
1379
|
[teams, workspace]
|
|
1352
1380
|
);
|
|
1381
|
+
const [selectedObjectiveId, setSelectedObjectiveId] = useState<string | null>(
|
|
1382
|
+
initialObjectiveId ?? null
|
|
1383
|
+
);
|
|
1384
|
+
const [listPanelWidth, setListPanelWidth] = useState(() => {
|
|
1385
|
+
return loadObjectiveListPanelWidth() || 320;
|
|
1386
|
+
});
|
|
1353
1387
|
const [objectiveEditor, setObjectiveEditor] = useState<ObjectiveEditorDraft | null>(null);
|
|
1354
1388
|
const [isSaving, setIsSaving] = useState(false);
|
|
1355
1389
|
const [saveError, setSaveError] = useState<string | null>(null);
|
|
1356
1390
|
const [activeAgentsByObjective, setActiveAgentsByObjective] = useState<Map<string, string[]>>(new Map());
|
|
1357
1391
|
const [participants, setParticipants] = useState<Participant[]>([]);
|
|
1358
1392
|
|
|
1393
|
+
// Auto-select first objective when none is selected
|
|
1394
|
+
useEffect(() => {
|
|
1395
|
+
if (!selectedObjectiveId && objectives.length > 0) {
|
|
1396
|
+
setSelectedObjectiveId(objectives[0].id);
|
|
1397
|
+
}
|
|
1398
|
+
}, [selectedObjectiveId, objectives]);
|
|
1399
|
+
|
|
1400
|
+
// Clear selection if the selected objective was deleted
|
|
1401
|
+
useEffect(() => {
|
|
1402
|
+
if (
|
|
1403
|
+
selectedObjectiveId &&
|
|
1404
|
+
objectives.length > 0 &&
|
|
1405
|
+
!objectives.some((o) => o.id === selectedObjectiveId)
|
|
1406
|
+
) {
|
|
1407
|
+
setSelectedObjectiveId(objectives[0]?.id ?? null);
|
|
1408
|
+
}
|
|
1409
|
+
}, [selectedObjectiveId, objectives]);
|
|
1410
|
+
|
|
1359
1411
|
useEffect(() => {
|
|
1360
1412
|
let cancelled = false;
|
|
1361
1413
|
async function load() {
|
|
@@ -1423,8 +1475,6 @@ export function ProjectObjectivesOverview({
|
|
|
1423
1475
|
teamId,
|
|
1424
1476
|
key: generateProjectObjectiveKey(title, workspace.objectives),
|
|
1425
1477
|
summary: objectiveEditor.summary,
|
|
1426
|
-
cadence: objectiveEditor.cadence,
|
|
1427
|
-
condition: objectiveEditor.condition,
|
|
1428
1478
|
now,
|
|
1429
1479
|
});
|
|
1430
1480
|
|
|
@@ -1433,8 +1483,19 @@ export function ProjectObjectivesOverview({
|
|
|
1433
1483
|
|
|
1434
1484
|
try {
|
|
1435
1485
|
await persistWorkspace(upsertProjectObjective(workspace, nextObjective));
|
|
1486
|
+
|
|
1487
|
+
// After the persist succeeds, ensure the built-in worker job exists
|
|
1488
|
+
try {
|
|
1489
|
+
await fetch(
|
|
1490
|
+
`/api/projects/${project?.id}/objectives/${nextObjective.id}/worker`,
|
|
1491
|
+
{ method: 'POST', headers: { 'Content-Type': 'application/json' } },
|
|
1492
|
+
);
|
|
1493
|
+
} catch {
|
|
1494
|
+
// Worker job creation is best-effort — will be lazily created on first run
|
|
1495
|
+
}
|
|
1496
|
+
|
|
1436
1497
|
setObjectiveEditor(null);
|
|
1437
|
-
|
|
1498
|
+
setSelectedObjectiveId(nextObjective.id);
|
|
1438
1499
|
} catch (error) {
|
|
1439
1500
|
setSaveError(
|
|
1440
1501
|
error instanceof Error ? error.message : "Failed to save objective updates."
|
|
@@ -1444,6 +1505,17 @@ export function ProjectObjectivesOverview({
|
|
|
1444
1505
|
}
|
|
1445
1506
|
};
|
|
1446
1507
|
|
|
1508
|
+
const handleListPanelResize = useCallback((delta: number) => {
|
|
1509
|
+
setListPanelWidth((currentWidth) => {
|
|
1510
|
+
const nextWidth = Math.max(
|
|
1511
|
+
OBJECTIVE_LIST_MIN_WIDTH,
|
|
1512
|
+
Math.min(OBJECTIVE_LIST_MAX_WIDTH, currentWidth + delta)
|
|
1513
|
+
);
|
|
1514
|
+
persistObjectiveListPanelWidth(nextWidth);
|
|
1515
|
+
return nextWidth;
|
|
1516
|
+
});
|
|
1517
|
+
}, []);
|
|
1518
|
+
|
|
1447
1519
|
if (isLoading && !project) {
|
|
1448
1520
|
return <LoadingState label="Loading objectives..." />;
|
|
1449
1521
|
}
|
|
@@ -1453,57 +1525,88 @@ export function ProjectObjectivesOverview({
|
|
|
1453
1525
|
}
|
|
1454
1526
|
|
|
1455
1527
|
return (
|
|
1456
|
-
<div className="flex h-full min-h-0
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1528
|
+
<div className="flex h-full min-h-0 overflow-hidden bg-[var(--background)] text-[var(--foreground)]">
|
|
1529
|
+
{/* Left panel: objective list */}
|
|
1530
|
+
<div
|
|
1531
|
+
className="flex flex-shrink-0 flex-col border-r border-[var(--border)] bg-[var(--background)]"
|
|
1532
|
+
style={{ width: listPanelWidth }}
|
|
1533
|
+
>
|
|
1534
|
+
<div className="flex items-center justify-between border-b border-[var(--border)] px-4 py-3">
|
|
1535
|
+
<div className="min-w-0">
|
|
1536
|
+
<p className="text-xs font-semibold uppercase tracking-[0.12em] text-[var(--muted-foreground)]">
|
|
1537
|
+
Objectives
|
|
1538
|
+
</p>
|
|
1539
|
+
<p className="mt-0.5 text-[11px] text-[var(--muted-foreground)]">
|
|
1540
|
+
{objectives.length === 0 ? "None yet" : `${objectives.length} total`}
|
|
1464
1541
|
</p>
|
|
1465
1542
|
</div>
|
|
1466
|
-
|
|
1467
1543
|
<button
|
|
1468
1544
|
type="button"
|
|
1469
1545
|
onClick={() => setObjectiveEditor(buildEmptyObjectiveDraft())}
|
|
1470
|
-
className="inline-flex
|
|
1546
|
+
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)]"
|
|
1547
|
+
aria-label="New objective"
|
|
1471
1548
|
>
|
|
1472
1549
|
<Plus className="h-4 w-4" />
|
|
1473
|
-
New objective
|
|
1474
1550
|
</button>
|
|
1475
1551
|
</div>
|
|
1552
|
+
|
|
1476
1553
|
<ErrorBanner message={saveError} />
|
|
1554
|
+
|
|
1555
|
+
<div className="flex-1 overflow-y-auto py-1">
|
|
1556
|
+
{objectives.length === 0 ? (
|
|
1557
|
+
<div className="px-4 py-8 text-center">
|
|
1558
|
+
<p className="text-sm text-[var(--muted-foreground)]">
|
|
1559
|
+
No objectives yet.
|
|
1560
|
+
</p>
|
|
1561
|
+
<button
|
|
1562
|
+
type="button"
|
|
1563
|
+
onClick={() => setObjectiveEditor(buildEmptyObjectiveDraft())}
|
|
1564
|
+
className="mt-2 text-sm text-[var(--primary)] hover:underline"
|
|
1565
|
+
>
|
|
1566
|
+
Create one
|
|
1567
|
+
</button>
|
|
1568
|
+
</div>
|
|
1569
|
+
) : (
|
|
1570
|
+
<div className="space-y-0.5">
|
|
1571
|
+
{objectives.map((objective) => {
|
|
1572
|
+
const objectiveActivities = buildObjectiveTimelineActivities({
|
|
1573
|
+
objective,
|
|
1574
|
+
workspace,
|
|
1575
|
+
});
|
|
1576
|
+
|
|
1577
|
+
return (
|
|
1578
|
+
<ObjectiveListCard
|
|
1579
|
+
key={objective.id}
|
|
1580
|
+
objective={objective}
|
|
1581
|
+
activityCount={objectiveActivities.length}
|
|
1582
|
+
lastActivityAt={objectiveActivities[0]?.createdAt ?? null}
|
|
1583
|
+
activeAgentIds={activeAgentsByObjective.get(objective.id)}
|
|
1584
|
+
participants={participants}
|
|
1585
|
+
isSelected={selectedObjectiveId === objective.id}
|
|
1586
|
+
onSelect={() => setSelectedObjectiveId(objective.id)}
|
|
1587
|
+
/>
|
|
1588
|
+
);
|
|
1589
|
+
})}
|
|
1590
|
+
</div>
|
|
1591
|
+
)}
|
|
1592
|
+
</div>
|
|
1477
1593
|
</div>
|
|
1478
1594
|
|
|
1479
|
-
<
|
|
1480
|
-
{objectives.length === 0 ? (
|
|
1481
|
-
<div className="mx-auto max-w-3xl rounded-[32px] border border-dashed border-[var(--border)] bg-[var(--card-bg)] p-8 text-center">
|
|
1482
|
-
<p className="text-lg font-semibold text-[var(--foreground)]">No objectives yet</p>
|
|
1483
|
-
<p className="mt-2 text-sm text-[var(--muted-foreground)]">
|
|
1484
|
-
Keep the root view simple: objective list first, detail after click-through.
|
|
1485
|
-
</p>
|
|
1486
|
-
</div>
|
|
1487
|
-
) : (
|
|
1488
|
-
<div className="mx-auto max-w-4xl divide-y divide-[var(--border)] overflow-hidden rounded-[24px] border border-[var(--border)] bg-[rgba(8,12,18,0.58)]">
|
|
1489
|
-
{objectives.map((objective) => {
|
|
1490
|
-
const objectiveActivities = buildObjectiveTimelineActivities({
|
|
1491
|
-
objective,
|
|
1492
|
-
workspace,
|
|
1493
|
-
});
|
|
1595
|
+
<ObjectiveListResizeHandle onResize={handleListPanelResize} />
|
|
1494
1596
|
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1597
|
+
{/* Right panel: objective detail */}
|
|
1598
|
+
<div className="flex-1 min-w-0 min-h-0 overflow-hidden">
|
|
1599
|
+
{selectedObjectiveId ? (
|
|
1600
|
+
<ProjectObjectiveDetail
|
|
1601
|
+
projectSlug={projectSlug}
|
|
1602
|
+
objectiveId={selectedObjectiveId}
|
|
1603
|
+
onObjectiveDeleted={() => setSelectedObjectiveId(null)}
|
|
1604
|
+
/>
|
|
1605
|
+
) : (
|
|
1606
|
+
<div className="flex h-full items-center justify-center text-sm text-[var(--muted-foreground)]">
|
|
1607
|
+
{objectives.length === 0
|
|
1608
|
+
? "Create an objective to get started."
|
|
1609
|
+
: "Select an objective from the list."}
|
|
1507
1610
|
</div>
|
|
1508
1611
|
)}
|
|
1509
1612
|
</div>
|
|
@@ -1526,6 +1629,7 @@ export function ProjectObjectivesOverview({
|
|
|
1526
1629
|
export function ProjectObjectiveDetail({
|
|
1527
1630
|
projectSlug,
|
|
1528
1631
|
objectiveId,
|
|
1632
|
+
onObjectiveDeleted,
|
|
1529
1633
|
}: ProjectObjectiveDetailProps) {
|
|
1530
1634
|
const router = useRouter();
|
|
1531
1635
|
const { isLoading, project, workspace, teams, persistWorkspace, refetchProject } =
|
|
@@ -1541,7 +1645,6 @@ export function ProjectObjectiveDetail({
|
|
|
1541
1645
|
const teamName = objective ? getTeamName(teams, objective.teamId) : null;
|
|
1542
1646
|
const [objectiveEditor, setObjectiveEditor] = useState<ObjectiveEditorDraft | null>(null);
|
|
1543
1647
|
const [teamEditor, setTeamEditor] = useState<ObjectiveTeamDraft | null>(null);
|
|
1544
|
-
const [wakeEditor, setWakeEditor] = useState<ObjectiveEditorDraft | null>(null);
|
|
1545
1648
|
|
|
1546
1649
|
const [activeTab, setActiveTab] = useState<ObjectiveDetailTab>("activity");
|
|
1547
1650
|
const [activityTotal, setActivityTotal] = useState(0);
|
|
@@ -1553,10 +1656,11 @@ export function ProjectObjectiveDetail({
|
|
|
1553
1656
|
const [noteDrafts, setNoteDrafts] = useState<Record<string, string>>({});
|
|
1554
1657
|
const [noteTitleDrafts, setNoteTitleDrafts] = useState<Record<string, string>>({});
|
|
1555
1658
|
const [savingNoteIds, setSavingNoteIds] = useState<Set<string>>(new Set());
|
|
1556
|
-
const [newNoteTitle, setNewNoteTitle] = useState("");
|
|
1557
1659
|
const [isCreatingNote, setIsCreatingNote] = useState(false);
|
|
1660
|
+
const [noteSearch, setNoteSearch] = useState("");
|
|
1558
1661
|
const [linearIssues, setLinearIssues] = useState<ObjectiveLinearIssueSummary[]>([]);
|
|
1559
1662
|
const [linearConnected, setLinearConnected] = useState(true);
|
|
1663
|
+
const [workingOnObjective, setWorkingOnObjective] = useState(false);
|
|
1560
1664
|
|
|
1561
1665
|
const { jobs: scheduledJobs } = usePromptJobs(project?.id ?? null, {
|
|
1562
1666
|
requireProjectId: true,
|
|
@@ -1702,7 +1806,6 @@ export function ProjectObjectiveDetail({
|
|
|
1702
1806
|
|
|
1703
1807
|
const handleCreateNote = async () => {
|
|
1704
1808
|
if (!project?.id || !objective?.id) return;
|
|
1705
|
-
const title = newNoteTitle.trim() || "Untitled";
|
|
1706
1809
|
setIsCreatingNote(true);
|
|
1707
1810
|
try {
|
|
1708
1811
|
const res = await fetch(
|
|
@@ -1710,14 +1813,13 @@ export function ProjectObjectiveDetail({
|
|
|
1710
1813
|
{
|
|
1711
1814
|
method: "POST",
|
|
1712
1815
|
headers: { "Content-Type": "application/json" },
|
|
1713
|
-
body: JSON.stringify({ title, body: "" }),
|
|
1816
|
+
body: JSON.stringify({ title: "Untitled", body: "" }),
|
|
1714
1817
|
},
|
|
1715
1818
|
);
|
|
1716
1819
|
if (res.ok) {
|
|
1717
1820
|
const data = await res.json();
|
|
1718
1821
|
setNotes((prev) => [data.note, ...prev]);
|
|
1719
1822
|
setEditingNoteId(data.note.id);
|
|
1720
|
-
setNewNoteTitle("");
|
|
1721
1823
|
}
|
|
1722
1824
|
} catch {
|
|
1723
1825
|
setSaveError("Failed to create note.");
|
|
@@ -1766,19 +1868,6 @@ export function ProjectObjectiveDetail({
|
|
|
1766
1868
|
setTeamEditor(null);
|
|
1767
1869
|
};
|
|
1768
1870
|
|
|
1769
|
-
const handleWakeSave = async () => {
|
|
1770
|
-
if (!wakeEditor || !objective) return;
|
|
1771
|
-
|
|
1772
|
-
const nextObjective = {
|
|
1773
|
-
...objective,
|
|
1774
|
-
cadence: wakeEditor.cadence.trim(),
|
|
1775
|
-
condition: wakeEditor.condition.trim(),
|
|
1776
|
-
updatedAt: new Date().toISOString(),
|
|
1777
|
-
};
|
|
1778
|
-
|
|
1779
|
-
await runPersist(upsertProjectObjective(workspace, nextObjective));
|
|
1780
|
-
setWakeEditor(null);
|
|
1781
|
-
};
|
|
1782
1871
|
|
|
1783
1872
|
const handleObjectiveDelete = async () => {
|
|
1784
1873
|
if (!objective) return;
|
|
@@ -1787,7 +1876,11 @@ export function ProjectObjectiveDetail({
|
|
|
1787
1876
|
if (!confirmed) return;
|
|
1788
1877
|
|
|
1789
1878
|
await runPersist(removeProjectObjective(workspace, objective.id));
|
|
1790
|
-
|
|
1879
|
+
if (onObjectiveDeleted) {
|
|
1880
|
+
onObjectiveDeleted();
|
|
1881
|
+
} else {
|
|
1882
|
+
router.push(`/projects/${projectSlug}`);
|
|
1883
|
+
}
|
|
1791
1884
|
};
|
|
1792
1885
|
|
|
1793
1886
|
const handleObjectiveThreadLinked = useCallback(
|
|
@@ -1815,7 +1908,6 @@ export function ProjectObjectiveDetail({
|
|
|
1815
1908
|
catchUpPolicy: string;
|
|
1816
1909
|
cadence: string;
|
|
1817
1910
|
condition: string;
|
|
1818
|
-
executionMode?: PromptJobExecutionMode;
|
|
1819
1911
|
}) => {
|
|
1820
1912
|
if (!project?.id || !objective?.id) {
|
|
1821
1913
|
setSaveError("Objective not found.");
|
|
@@ -1832,10 +1924,7 @@ export function ProjectObjectiveDetail({
|
|
|
1832
1924
|
headers: { "Content-Type": "application/json" },
|
|
1833
1925
|
body: JSON.stringify({
|
|
1834
1926
|
...data,
|
|
1835
|
-
prompt:
|
|
1836
|
-
data.executionMode === "objective_linear_ticket"
|
|
1837
|
-
? data.prompt
|
|
1838
|
-
: prependObjectiveLabelToPrompt(objective, data.prompt),
|
|
1927
|
+
prompt: prependObjectiveLabelToPrompt(objective, data.prompt),
|
|
1839
1928
|
}),
|
|
1840
1929
|
}
|
|
1841
1930
|
);
|
|
@@ -1857,37 +1946,35 @@ export function ProjectObjectiveDetail({
|
|
|
1857
1946
|
[objective, project?.id, refetchProject]
|
|
1858
1947
|
);
|
|
1859
1948
|
|
|
1860
|
-
const
|
|
1949
|
+
const handleWorkOnObjective = useCallback(async () => {
|
|
1861
1950
|
if (!project?.id || !objective?.id) {
|
|
1862
1951
|
setSaveError("Objective not found.");
|
|
1863
1952
|
return false;
|
|
1864
1953
|
}
|
|
1865
1954
|
|
|
1955
|
+
if (!objective.teamId) {
|
|
1956
|
+
setSaveError("Assign a team to this objective before creating a worker.");
|
|
1957
|
+
return false;
|
|
1958
|
+
}
|
|
1959
|
+
|
|
1866
1960
|
setSaveError(null);
|
|
1867
1961
|
|
|
1868
1962
|
try {
|
|
1869
1963
|
const response = await fetch(
|
|
1870
|
-
`/api/projects/${project.id}/objectives/${objective.id}/
|
|
1871
|
-
{
|
|
1872
|
-
method: "POST",
|
|
1873
|
-
headers: { "Content-Type": "application/json" },
|
|
1874
|
-
body: JSON.stringify({
|
|
1875
|
-
name: DEFAULT_OBJECTIVE_LINEAR_WORKER_NAME,
|
|
1876
|
-
executionMode: "objective_linear_ticket",
|
|
1877
|
-
}),
|
|
1878
|
-
}
|
|
1964
|
+
`/api/projects/${project.id}/objectives/${objective.id}/worker`,
|
|
1965
|
+
{ method: "PUT" },
|
|
1879
1966
|
);
|
|
1880
1967
|
const payload = (await response.json().catch(() => ({}))) as { error?: string };
|
|
1881
1968
|
|
|
1882
1969
|
if (!response.ok) {
|
|
1883
|
-
throw new Error(payload.error || "Failed to
|
|
1970
|
+
throw new Error(payload.error || "Failed to trigger objective worker.");
|
|
1884
1971
|
}
|
|
1885
1972
|
|
|
1886
1973
|
await refetchProject();
|
|
1887
1974
|
return true;
|
|
1888
1975
|
} catch (error) {
|
|
1889
1976
|
setSaveError(
|
|
1890
|
-
error instanceof Error ? error.message : "Failed to
|
|
1977
|
+
error instanceof Error ? error.message : "Failed to trigger objective worker."
|
|
1891
1978
|
);
|
|
1892
1979
|
return false;
|
|
1893
1980
|
}
|
|
@@ -1950,15 +2037,15 @@ export function ProjectObjectiveDetail({
|
|
|
1950
2037
|
|
|
1951
2038
|
if (!objective) {
|
|
1952
2039
|
return (
|
|
1953
|
-
<div className="flex h-full items-center justify-center px-4 bg-[
|
|
1954
|
-
<div className="rounded-xl border border-
|
|
1955
|
-
<p className="text-lg font-semibold text-
|
|
1956
|
-
<p className="mt-2 text-sm text-
|
|
2040
|
+
<div className="flex h-full items-center justify-center px-4 bg-[var(--background)]">
|
|
2041
|
+
<div className="rounded-xl border border-[var(--border)] bg-[var(--card-bg)] p-8 text-center">
|
|
2042
|
+
<p className="text-lg font-semibold text-[var(--foreground)]">Objective not found</p>
|
|
2043
|
+
<p className="mt-2 text-sm text-[var(--muted-foreground)]">
|
|
1957
2044
|
It may have been deleted or the link is stale.
|
|
1958
2045
|
</p>
|
|
1959
2046
|
<Link
|
|
1960
2047
|
href={`/projects/${projectSlug}`}
|
|
1961
|
-
className="mt-4 inline-flex items-center gap-2 rounded-md border border-
|
|
2048
|
+
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)]"
|
|
1962
2049
|
>
|
|
1963
2050
|
Back to objectives
|
|
1964
2051
|
</Link>
|
|
@@ -1968,7 +2055,7 @@ export function ProjectObjectiveDetail({
|
|
|
1968
2055
|
}
|
|
1969
2056
|
|
|
1970
2057
|
return (
|
|
1971
|
-
<div className="flex h-full min-h-0 flex-col bg-[
|
|
2058
|
+
<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)]">
|
|
1972
2059
|
<div className="flex-1 min-h-0 overflow-hidden">
|
|
1973
2060
|
<div className="flex h-full min-h-0 flex-col xl:flex-row">
|
|
1974
2061
|
<div className="min-h-0 flex-1 overflow-y-auto">
|
|
@@ -1976,7 +2063,7 @@ export function ProjectObjectiveDetail({
|
|
|
1976
2063
|
<ErrorBanner message={saveError} />
|
|
1977
2064
|
|
|
1978
2065
|
<div className="flex items-center gap-3 mb-4">
|
|
1979
|
-
<span className="px-2.5 py-0.5
|
|
2066
|
+
<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)]">
|
|
1980
2067
|
{objective.key}
|
|
1981
2068
|
</span>
|
|
1982
2069
|
<span
|
|
@@ -1997,14 +2084,14 @@ export function ProjectObjectiveDetail({
|
|
|
1997
2084
|
if (e.key === "Enter") void handleObjectiveSave();
|
|
1998
2085
|
if (e.key === "Escape") setObjectiveEditor(null);
|
|
1999
2086
|
}}
|
|
2000
|
-
className="flex-1
|
|
2087
|
+
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"
|
|
2001
2088
|
placeholder="Objective statement"
|
|
2002
2089
|
/>
|
|
2003
2090
|
<button
|
|
2004
2091
|
type="button"
|
|
2005
2092
|
onClick={() => void handleObjectiveSave()}
|
|
2006
2093
|
disabled={isSaving}
|
|
2007
|
-
className="p-1.5
|
|
2094
|
+
className="rounded-md p-1.5 text-[var(--primary)] transition-colors hover:bg-[var(--status-in-progress-bg)]"
|
|
2008
2095
|
aria-label="Save objective"
|
|
2009
2096
|
>
|
|
2010
2097
|
<Check size={18} />
|
|
@@ -2012,22 +2099,24 @@ export function ProjectObjectiveDetail({
|
|
|
2012
2099
|
<button
|
|
2013
2100
|
type="button"
|
|
2014
2101
|
onClick={() => setObjectiveEditor(null)}
|
|
2015
|
-
className="p-1.5
|
|
2102
|
+
className="rounded-md p-1.5 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--muted)]"
|
|
2016
2103
|
aria-label="Cancel editing"
|
|
2017
2104
|
>
|
|
2018
2105
|
<X size={18} />
|
|
2019
2106
|
</button>
|
|
2020
2107
|
</div>
|
|
2021
2108
|
) : (
|
|
2022
|
-
<
|
|
2023
|
-
|
|
2109
|
+
<button
|
|
2110
|
+
type="button"
|
|
2111
|
+
aria-label={`Edit objective ${objective.title}`}
|
|
2112
|
+
className="flex items-center gap-3 group cursor-pointer text-left"
|
|
2024
2113
|
onClick={() => setObjectiveEditor(buildObjectiveDraft(objective))}
|
|
2025
2114
|
>
|
|
2026
|
-
<h1 className="text-[28px] leading-tight font-semibold text-
|
|
2115
|
+
<h1 className="text-[28px] leading-tight font-semibold text-[var(--foreground)]">
|
|
2027
2116
|
{objective.title}
|
|
2028
2117
|
</h1>
|
|
2029
|
-
<Pencil size={16} className="text-
|
|
2030
|
-
</
|
|
2118
|
+
<Pencil size={16} className="shrink-0 text-[var(--muted-foreground)] opacity-0 transition-opacity group-hover:opacity-100" />
|
|
2119
|
+
</button>
|
|
2031
2120
|
)}
|
|
2032
2121
|
</div>
|
|
2033
2122
|
|
|
@@ -2035,10 +2124,10 @@ export function ProjectObjectiveDetail({
|
|
|
2035
2124
|
<div className="flex flex-wrap items-center gap-x-6 gap-y-3 mb-10">
|
|
2036
2125
|
{/* Team Property */}
|
|
2037
2126
|
<div className="flex items-center gap-2">
|
|
2038
|
-
<span className="text-xs font-semibold
|
|
2127
|
+
<span className="flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wider text-[var(--muted-foreground)]">
|
|
2039
2128
|
<Users size={12} /> Team
|
|
2040
2129
|
</span>
|
|
2041
|
-
<span className="text-
|
|
2130
|
+
<span className="text-[var(--app-shell-soft-text)]">·</span>
|
|
2042
2131
|
{teamEditor ? (
|
|
2043
2132
|
<div className="min-w-[180px]">
|
|
2044
2133
|
<SearchCombo
|
|
@@ -2069,42 +2158,53 @@ export function ProjectObjectiveDetail({
|
|
|
2069
2158
|
) : (
|
|
2070
2159
|
<button
|
|
2071
2160
|
type="button"
|
|
2161
|
+
aria-label={`Edit team for ${objective.title}`}
|
|
2072
2162
|
onClick={() => setTeamEditor({ teamId: objective.teamId })}
|
|
2073
|
-
className="flex items-center gap-2
|
|
2163
|
+
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)]"
|
|
2074
2164
|
>
|
|
2075
2165
|
<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">
|
|
2076
2166
|
{(teamName ?? "?").charAt(0).toUpperCase()}
|
|
2077
2167
|
</div>
|
|
2078
|
-
<span className="text-sm text-
|
|
2168
|
+
<span className="text-sm text-[var(--foreground)] transition-colors group-hover:text-[var(--primary)]">
|
|
2079
2169
|
{teamName ?? "Not assigned"}
|
|
2080
2170
|
</span>
|
|
2081
2171
|
</button>
|
|
2082
2172
|
)}
|
|
2083
2173
|
</div>
|
|
2084
2174
|
|
|
2085
|
-
{
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
2175
|
+
{project.id && objective.id ? (
|
|
2176
|
+
<ObjectiveHealthTrend
|
|
2177
|
+
projectId={project.id}
|
|
2178
|
+
objectiveId={objective.id}
|
|
2179
|
+
objectiveKey={objective.key}
|
|
2180
|
+
metadata={project.metadata}
|
|
2181
|
+
currentProgress={objective.progress}
|
|
2182
|
+
currentStatus={objective.status}
|
|
2183
|
+
objectiveUpdatedAt={objective.updatedAt}
|
|
2184
|
+
/>
|
|
2185
|
+
) : null}
|
|
2186
|
+
|
|
2187
|
+
</div>
|
|
2188
|
+
|
|
2189
|
+
{/* Work on objective */}
|
|
2190
|
+
<div className="mb-6">
|
|
2191
|
+
<button
|
|
2192
|
+
type="button"
|
|
2193
|
+
onClick={async () => {
|
|
2194
|
+
setWorkingOnObjective(true);
|
|
2195
|
+
await handleWorkOnObjective();
|
|
2196
|
+
setWorkingOnObjective(false);
|
|
2197
|
+
}}
|
|
2198
|
+
disabled={workingOnObjective}
|
|
2199
|
+
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"
|
|
2200
|
+
>
|
|
2201
|
+
<Sparkles className="h-4 w-4" />
|
|
2202
|
+
{workingOnObjective ? "Working..." : "Work on objective"}
|
|
2203
|
+
</button>
|
|
2104
2204
|
</div>
|
|
2105
2205
|
|
|
2106
2206
|
{/* Tabs */}
|
|
2107
|
-
<div className="border-b border-
|
|
2207
|
+
<div className="mb-8 border-b border-[var(--border)]">
|
|
2108
2208
|
<nav className="flex gap-1 -mb-px" aria-label="Objective sections">
|
|
2109
2209
|
{([
|
|
2110
2210
|
{ id: "activity" as const, label: "Activity", icon: Clock },
|
|
@@ -2118,29 +2218,35 @@ export function ProjectObjectiveDetail({
|
|
|
2118
2218
|
onClick={() => setActiveTab(tab.id)}
|
|
2119
2219
|
className={`flex items-center gap-2 px-3 py-2.5 text-sm font-medium border-b-2 transition-colors ${
|
|
2120
2220
|
activeTab === tab.id
|
|
2121
|
-
? "border-
|
|
2122
|
-
: "border-transparent text-
|
|
2221
|
+
? "border-[var(--primary)] text-[var(--foreground)]"
|
|
2222
|
+
: "border-transparent text-[var(--muted-foreground)] hover:border-[var(--border)] hover:text-[var(--foreground)]"
|
|
2123
2223
|
}`}
|
|
2124
2224
|
>
|
|
2125
2225
|
<tab.icon size={14} />
|
|
2126
2226
|
{tab.label}
|
|
2127
2227
|
{tab.id === "activity" && activityTotal > 0 && (
|
|
2128
|
-
<span className="
|
|
2228
|
+
<span className="rounded-full bg-[var(--tone-neutral-bg)] px-1.5 py-0.5 font-mono text-[10px] text-[var(--tone-neutral)]">
|
|
2129
2229
|
{activityTotal}
|
|
2130
2230
|
</span>
|
|
2131
2231
|
)}
|
|
2132
2232
|
{tab.id === "notes" && notes.length > 0 && (
|
|
2133
|
-
<span className="
|
|
2233
|
+
<span className="rounded-full bg-[var(--tone-neutral-bg)] px-1.5 py-0.5 font-mono text-[10px] text-[var(--tone-neutral)]">
|
|
2134
2234
|
{notes.length}
|
|
2135
2235
|
</span>
|
|
2136
2236
|
)}
|
|
2137
|
-
{tab.id === "linear" &&
|
|
2138
|
-
|
|
2139
|
-
|
|
2140
|
-
|
|
2141
|
-
|
|
2237
|
+
{tab.id === "linear" && (() => {
|
|
2238
|
+
const DONE = ["done", "canceled", "cancelled", "completed", "duplicate"];
|
|
2239
|
+
const active = linearIssues.filter(
|
|
2240
|
+
(i, idx, arr) => arr.findIndex((x) => x.id === i.id) === idx && !DONE.includes(i.status.toLowerCase())
|
|
2241
|
+
);
|
|
2242
|
+
return active.length > 0 ? (
|
|
2243
|
+
<span className="rounded-full bg-[var(--tone-neutral-bg)] px-1.5 py-0.5 font-mono text-[10px] text-[var(--tone-neutral)]">
|
|
2244
|
+
{active.length}
|
|
2245
|
+
</span>
|
|
2246
|
+
) : null;
|
|
2247
|
+
})()}
|
|
2142
2248
|
{tab.id === "scheduled-tasks" && scheduledTaskCount > 0 && (
|
|
2143
|
-
<span className="
|
|
2249
|
+
<span className="rounded-full bg-[var(--tone-neutral-bg)] px-1.5 py-0.5 font-mono text-[10px] text-[var(--tone-neutral)]">
|
|
2144
2250
|
{scheduledTaskCount}
|
|
2145
2251
|
</span>
|
|
2146
2252
|
)}
|
|
@@ -2154,146 +2260,149 @@ export function ProjectObjectiveDetail({
|
|
|
2154
2260
|
{/* Notes Tab */}
|
|
2155
2261
|
{activeTab === "notes" && (
|
|
2156
2262
|
<section className="space-y-4">
|
|
2157
|
-
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
|
|
2167
|
-
|
|
2168
|
-
|
|
2169
|
-
onKeyDown={(e) => {
|
|
2170
|
-
if (e.key === "Enter") handleCreateNote();
|
|
2171
|
-
}}
|
|
2172
|
-
placeholder="New note title..."
|
|
2173
|
-
className="flex-1 bg-zinc-900 border border-zinc-800 rounded-md px-3 py-1.5 text-sm text-zinc-200 placeholder:text-zinc-600 focus:outline-none focus:border-zinc-600"
|
|
2174
|
-
/>
|
|
2263
|
+
{/* Search + Create */}
|
|
2264
|
+
<div className="flex gap-2 items-center">
|
|
2265
|
+
<div className="relative flex-1">
|
|
2266
|
+
<Search size={14} className="absolute left-3 top-1/2 -translate-y-1/2 text-[var(--muted-foreground)]" />
|
|
2267
|
+
<input
|
|
2268
|
+
type="text"
|
|
2269
|
+
value={noteSearch}
|
|
2270
|
+
onChange={(e) => setNoteSearch(e.target.value)}
|
|
2271
|
+
placeholder="Search notes..."
|
|
2272
|
+
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"
|
|
2273
|
+
/>
|
|
2274
|
+
</div>
|
|
2175
2275
|
<button
|
|
2176
2276
|
type="button"
|
|
2177
2277
|
onClick={handleCreateNote}
|
|
2178
2278
|
disabled={isCreatingNote}
|
|
2179
|
-
className="flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium text-
|
|
2279
|
+
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"
|
|
2180
2280
|
>
|
|
2181
2281
|
<Plus size={14} />
|
|
2182
|
-
|
|
2282
|
+
New note
|
|
2183
2283
|
</button>
|
|
2184
2284
|
</div>
|
|
2185
2285
|
|
|
2186
|
-
{/*
|
|
2286
|
+
{/* Masonry Grid */}
|
|
2187
2287
|
{isNotesLoading ? (
|
|
2188
|
-
<p className="text-sm text-
|
|
2288
|
+
<p className="py-4 text-sm text-[var(--muted-foreground)]">Loading notes...</p>
|
|
2189
2289
|
) : notes.length === 0 ? (
|
|
2190
|
-
<p className="text-sm text-
|
|
2290
|
+
<p className="text-sm text-[var(--muted-foreground)] py-4">
|
|
2191
2291
|
No notes yet. Add one above.
|
|
2192
2292
|
</p>
|
|
2193
|
-
) : (
|
|
2194
|
-
|
|
2195
|
-
|
|
2196
|
-
|
|
2197
|
-
|
|
2198
|
-
|
|
2199
|
-
|
|
2200
|
-
|
|
2201
|
-
|
|
2202
|
-
|
|
2293
|
+
) : (() => {
|
|
2294
|
+
const q = noteSearch.toLowerCase();
|
|
2295
|
+
const filtered = q
|
|
2296
|
+
? notes.filter(
|
|
2297
|
+
(n) =>
|
|
2298
|
+
n.title.toLowerCase().includes(q) ||
|
|
2299
|
+
n.body.toLowerCase().includes(q),
|
|
2300
|
+
)
|
|
2301
|
+
: notes;
|
|
2302
|
+
return filtered.length === 0 ? (
|
|
2303
|
+
<p className="text-sm text-[var(--muted-foreground)] py-4">
|
|
2304
|
+
No notes match your search.
|
|
2305
|
+
</p>
|
|
2306
|
+
) : (
|
|
2307
|
+
<div className="columns-1 gap-3 sm:columns-2 lg:columns-3" style={{ columnFill: "balance" as const }}>
|
|
2308
|
+
{filtered.map((note) => (
|
|
2309
|
+
<button
|
|
2203
2310
|
key={note.id}
|
|
2204
|
-
|
|
2311
|
+
type="button"
|
|
2312
|
+
onClick={() => setEditingNoteId(note.id)}
|
|
2313
|
+
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"
|
|
2205
2314
|
>
|
|
2206
|
-
|
|
2207
|
-
|
|
2208
|
-
|
|
2209
|
-
|
|
2210
|
-
<FileText size={14} className="text-zinc-500 shrink-0" />
|
|
2211
|
-
<input
|
|
2212
|
-
type="text"
|
|
2213
|
-
value={draftTitle}
|
|
2214
|
-
onChange={(e) =>
|
|
2215
|
-
setNoteTitleDrafts((prev) => ({
|
|
2216
|
-
...prev,
|
|
2217
|
-
[note.id]: e.target.value,
|
|
2218
|
-
}))
|
|
2219
|
-
}
|
|
2220
|
-
className="flex-1 bg-transparent border-b border-zinc-700 text-sm font-medium text-zinc-200 focus:outline-none focus:border-zinc-400 py-0.5"
|
|
2221
|
-
/>
|
|
2222
|
-
</div>
|
|
2223
|
-
) : (
|
|
2224
|
-
<button
|
|
2225
|
-
type="button"
|
|
2226
|
-
onClick={() =>
|
|
2227
|
-
setEditingNoteId(note.id)
|
|
2228
|
-
}
|
|
2229
|
-
className="flex items-center gap-2 text-sm font-medium text-zinc-200 hover:text-zinc-50 transition-colors"
|
|
2230
|
-
>
|
|
2231
|
-
<FileText size={14} className="text-zinc-500" />
|
|
2232
|
-
{note.title}
|
|
2233
|
-
</button>
|
|
2234
|
-
)}
|
|
2235
|
-
<div className="flex items-center gap-2">
|
|
2236
|
-
<span className="text-[11px] text-zinc-600">
|
|
2237
|
-
{isSavingNote
|
|
2238
|
-
? "Saving..."
|
|
2239
|
-
: new Date(note.updatedAt).toLocaleDateString()}
|
|
2240
|
-
</span>
|
|
2241
|
-
<button
|
|
2242
|
-
type="button"
|
|
2243
|
-
onClick={() =>
|
|
2244
|
-
setEditingNoteId(isEditing ? null : note.id)
|
|
2245
|
-
}
|
|
2246
|
-
className="p-1 text-zinc-500 hover:text-zinc-300 transition-colors"
|
|
2247
|
-
>
|
|
2248
|
-
<Pencil size={12} />
|
|
2249
|
-
</button>
|
|
2250
|
-
<button
|
|
2251
|
-
type="button"
|
|
2252
|
-
onClick={() => handleDeleteNote(note.id)}
|
|
2253
|
-
className="p-1 text-zinc-500 hover:text-red-400 transition-colors"
|
|
2254
|
-
>
|
|
2255
|
-
<Trash2 size={12} />
|
|
2256
|
-
</button>
|
|
2257
|
-
</div>
|
|
2315
|
+
<div className="px-3 pt-3 pb-1">
|
|
2316
|
+
<h4 className="text-sm font-medium text-[var(--foreground)] leading-snug">
|
|
2317
|
+
{note.title}
|
|
2318
|
+
</h4>
|
|
2258
2319
|
</div>
|
|
2259
|
-
|
|
2260
|
-
|
|
2261
|
-
|
|
2262
|
-
<div className="px-4 py-3">
|
|
2263
|
-
<ObjectiveNotesEditor
|
|
2264
|
-
content={draftBody}
|
|
2265
|
-
editable
|
|
2266
|
-
onChange={(value) =>
|
|
2267
|
-
setNoteDrafts((prev) => ({
|
|
2268
|
-
...prev,
|
|
2269
|
-
[note.id]: value,
|
|
2270
|
-
}))
|
|
2271
|
-
}
|
|
2272
|
-
placeholder="Write your note..."
|
|
2273
|
-
/>
|
|
2320
|
+
{note.body.trim() && (
|
|
2321
|
+
<div className="px-3 pb-2 text-xs text-[var(--muted-foreground)] line-clamp-4">
|
|
2322
|
+
<Markdown content={note.body} />
|
|
2274
2323
|
</div>
|
|
2275
|
-
)
|
|
2276
|
-
|
|
2277
|
-
|
|
2278
|
-
|
|
2324
|
+
)}
|
|
2325
|
+
<div className="flex items-center justify-between px-3 pb-2">
|
|
2326
|
+
<span className="text-[10px] text-[var(--muted-foreground)]">
|
|
2327
|
+
{new Date(note.updatedAt).toLocaleDateString()}
|
|
2328
|
+
</span>
|
|
2329
|
+
</div>
|
|
2330
|
+
</button>
|
|
2331
|
+
))}
|
|
2332
|
+
</div>
|
|
2333
|
+
);
|
|
2334
|
+
})()}
|
|
2335
|
+
|
|
2336
|
+
{/* Note Edit Modal */}
|
|
2337
|
+
{editingNoteId && (() => {
|
|
2338
|
+
const note = notes.find((n) => n.id === editingNoteId);
|
|
2339
|
+
if (!note) return null;
|
|
2340
|
+
const draftBody = noteDrafts[note.id] ?? note.body;
|
|
2341
|
+
const draftTitle = noteTitleDrafts[note.id] ?? note.title;
|
|
2342
|
+
const isSavingNote = savingNoteIds.has(note.id);
|
|
2343
|
+
return (
|
|
2344
|
+
<div
|
|
2345
|
+
className="fixed inset-0 z-50 flex items-start justify-center bg-black/50 pt-[5vh]"
|
|
2346
|
+
onClick={(e) => {
|
|
2347
|
+
if (e.target === e.currentTarget) setEditingNoteId(null);
|
|
2348
|
+
}}
|
|
2349
|
+
>
|
|
2350
|
+
<div className="mx-6 w-full max-w-7xl rounded-xl border border-[var(--border)] bg-[var(--background)] shadow-xl">
|
|
2351
|
+
{/* Modal Header */}
|
|
2352
|
+
<div className="flex items-center justify-between border-b border-[var(--border)] px-5 py-3">
|
|
2353
|
+
<input
|
|
2354
|
+
type="text"
|
|
2355
|
+
autoFocus
|
|
2356
|
+
value={draftTitle}
|
|
2357
|
+
onFocus={(e) => {
|
|
2358
|
+
if (draftTitle === "Untitled") e.target.select();
|
|
2359
|
+
}}
|
|
2360
|
+
onChange={(e) =>
|
|
2361
|
+
setNoteTitleDrafts((prev) => ({
|
|
2362
|
+
...prev,
|
|
2363
|
+
[note.id]: e.target.value,
|
|
2364
|
+
}))
|
|
2365
|
+
}
|
|
2366
|
+
className="flex-1 bg-transparent text-base font-semibold text-[var(--foreground)] focus:outline-none"
|
|
2367
|
+
/>
|
|
2368
|
+
<div className="flex items-center gap-2 ml-3">
|
|
2369
|
+
<span className="text-[11px] text-[var(--muted-foreground)]">
|
|
2370
|
+
{isSavingNote ? "Saving..." : new Date(note.updatedAt).toLocaleDateString()}
|
|
2371
|
+
</span>
|
|
2372
|
+
<button
|
|
2373
|
+
type="button"
|
|
2374
|
+
onClick={() => handleDeleteNote(note.id)}
|
|
2375
|
+
className="p-1 text-[var(--muted-foreground)] transition-colors hover:text-[var(--destructive)]"
|
|
2279
2376
|
>
|
|
2280
|
-
<
|
|
2281
|
-
|
|
2282
|
-
|
|
2283
|
-
|
|
2284
|
-
|
|
2285
|
-
|
|
2286
|
-
className="px-4 py-3 text-sm text-zinc-600 italic cursor-pointer hover:bg-zinc-900/30 transition-colors"
|
|
2287
|
-
onClick={() => setEditingNoteId(note.id)}
|
|
2377
|
+
<Trash2 size={14} />
|
|
2378
|
+
</button>
|
|
2379
|
+
<button
|
|
2380
|
+
type="button"
|
|
2381
|
+
onClick={() => setEditingNoteId(null)}
|
|
2382
|
+
className="p-1 text-[var(--muted-foreground)] transition-colors hover:text-[var(--foreground)]"
|
|
2288
2383
|
>
|
|
2289
|
-
|
|
2290
|
-
</
|
|
2291
|
-
|
|
2384
|
+
<X size={14} />
|
|
2385
|
+
</button>
|
|
2386
|
+
</div>
|
|
2292
2387
|
</div>
|
|
2293
|
-
|
|
2294
|
-
|
|
2295
|
-
|
|
2296
|
-
|
|
2388
|
+
{/* Modal Body */}
|
|
2389
|
+
<div className="max-h-[75vh] overflow-y-auto px-5 py-4">
|
|
2390
|
+
<ObjectiveNotesEditor
|
|
2391
|
+
content={draftBody}
|
|
2392
|
+
editable
|
|
2393
|
+
onChange={(value) =>
|
|
2394
|
+
setNoteDrafts((prev) => ({
|
|
2395
|
+
...prev,
|
|
2396
|
+
[note.id]: value,
|
|
2397
|
+
}))
|
|
2398
|
+
}
|
|
2399
|
+
placeholder="Write your note..."
|
|
2400
|
+
/>
|
|
2401
|
+
</div>
|
|
2402
|
+
</div>
|
|
2403
|
+
</div>
|
|
2404
|
+
);
|
|
2405
|
+
})()}
|
|
2297
2406
|
</section>
|
|
2298
2407
|
)}
|
|
2299
2408
|
|
|
@@ -2321,12 +2430,14 @@ export function ProjectObjectiveDetail({
|
|
|
2321
2430
|
|
|
2322
2431
|
return (
|
|
2323
2432
|
<section>
|
|
2324
|
-
<
|
|
2325
|
-
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2433
|
+
<div className="flex flex-wrap items-start justify-between gap-3 mb-4">
|
|
2434
|
+
<p className="text-sm text-[var(--muted-foreground)]">
|
|
2435
|
+
Tickets tracked by the objective label{" "}
|
|
2436
|
+
<code className="rounded bg-[var(--tone-neutral-bg)] px-1.5 py-0.5 font-mono text-[11px] text-[var(--foreground)]">
|
|
2437
|
+
{objective.key}
|
|
2438
|
+
</code>.
|
|
2439
|
+
</p>
|
|
2440
|
+
</div>
|
|
2330
2441
|
{!linearConnected ? (
|
|
2331
2442
|
<EmptyState label="Connect Linear to create and track tickets for this objective." />
|
|
2332
2443
|
) : dedupedIssues.length === 0 ? (
|
|
@@ -2338,33 +2449,25 @@ export function ProjectObjectiveDetail({
|
|
|
2338
2449
|
{activeIssues.map((issue) => (
|
|
2339
2450
|
<div
|
|
2340
2451
|
key={issue.id}
|
|
2341
|
-
className="
|
|
2452
|
+
className="rounded-xl border border-[var(--border)] bg-[var(--overlay-panel-muted)] p-4"
|
|
2342
2453
|
>
|
|
2343
2454
|
<div className="flex items-start justify-between gap-3">
|
|
2344
2455
|
<div className="min-w-0">
|
|
2345
|
-
<p className="text-xs font-semibold uppercase tracking-[0.18em] text-
|
|
2456
|
+
<p className="text-xs font-semibold uppercase tracking-[0.18em] text-[var(--muted-foreground)]">
|
|
2346
2457
|
{issue.identifier}
|
|
2347
2458
|
</p>
|
|
2348
|
-
|
|
2349
|
-
|
|
2350
|
-
|
|
2351
|
-
|
|
2352
|
-
|
|
2353
|
-
|
|
2354
|
-
>
|
|
2355
|
-
{issue.title}
|
|
2356
|
-
</a>
|
|
2357
|
-
) : (
|
|
2358
|
-
<p className="mt-1 text-sm font-medium text-zinc-200">
|
|
2359
|
-
{issue.title}
|
|
2360
|
-
</p>
|
|
2361
|
-
)}
|
|
2459
|
+
<a
|
|
2460
|
+
href={`/projects/${projectSlug}/linear?issue=${issue.id}`}
|
|
2461
|
+
className="mt-1 block text-sm font-medium text-[var(--foreground)] transition-colors hover:text-[var(--primary)]"
|
|
2462
|
+
>
|
|
2463
|
+
{issue.title}
|
|
2464
|
+
</a>
|
|
2362
2465
|
</div>
|
|
2363
|
-
<span className="rounded-full border border-
|
|
2466
|
+
<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)]">
|
|
2364
2467
|
{issue.status}
|
|
2365
2468
|
</span>
|
|
2366
2469
|
</div>
|
|
2367
|
-
<div className="mt-3 flex flex-wrap items-center gap-2 text-[11px] text-
|
|
2470
|
+
<div className="mt-3 flex flex-wrap items-center gap-2 text-[11px] text-[var(--muted-foreground)]">
|
|
2368
2471
|
<span>Updated {formatDateTime(issue.updatedAt)}</span>
|
|
2369
2472
|
<span>{issue.assignee ? `Assigned to ${issue.assignee}` : "Unassigned"}</span>
|
|
2370
2473
|
</div>
|
|
@@ -2375,21 +2478,19 @@ export function ProjectObjectiveDetail({
|
|
|
2375
2478
|
|
|
2376
2479
|
{doneIssues.length > 0 && (
|
|
2377
2480
|
<div className={activeIssues.length > 0 ? "mt-6" : ""}>
|
|
2378
|
-
<p className="text-[11px] font-medium uppercase tracking-[0.18em] text-
|
|
2481
|
+
<p className="text-[11px] font-medium uppercase tracking-[0.18em] text-[var(--muted-foreground)] mb-2">
|
|
2379
2482
|
Completed
|
|
2380
2483
|
</p>
|
|
2381
2484
|
<div className="space-y-0.5">
|
|
2382
2485
|
{doneIssues.map((issue) => (
|
|
2383
2486
|
<a
|
|
2384
2487
|
key={issue.id}
|
|
2385
|
-
href={issue.
|
|
2386
|
-
|
|
2387
|
-
rel="noreferrer"
|
|
2388
|
-
className="flex items-center gap-3 py-1.5 px-2 rounded-md text-zinc-500 hover:text-zinc-400 hover:bg-zinc-800/40 transition-colors group"
|
|
2488
|
+
href={`/projects/${projectSlug}/linear?issue=${issue.id}`}
|
|
2489
|
+
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)]"
|
|
2389
2490
|
>
|
|
2390
2491
|
<span className="text-[11px] font-mono shrink-0">{issue.identifier}</span>
|
|
2391
2492
|
<span className="text-[12px] truncate">{issue.title}</span>
|
|
2392
|
-
<span className="ml-auto text-[10px]
|
|
2493
|
+
<span className="ml-auto shrink-0 text-[10px] text-[var(--app-shell-soft-text)] group-hover:text-[var(--muted-foreground)]">{issue.status}</span>
|
|
2393
2494
|
</a>
|
|
2394
2495
|
))}
|
|
2395
2496
|
</div>
|
|
@@ -2410,11 +2511,8 @@ export function ProjectObjectiveDetail({
|
|
|
2410
2511
|
objectiveKey={objective.key}
|
|
2411
2512
|
createDefaults={{
|
|
2412
2513
|
name: `Work on ${objective.title}`,
|
|
2413
|
-
cadence: objective.cadence,
|
|
2414
|
-
condition: objective.condition,
|
|
2415
2514
|
}}
|
|
2416
2515
|
onCreateTask={handleScheduledTaskCreate}
|
|
2417
|
-
onCreateObjectiveLinearWorker={handleObjectiveLinearWorkerCreate}
|
|
2418
2516
|
/>
|
|
2419
2517
|
</section>
|
|
2420
2518
|
)}
|
|
@@ -2422,12 +2520,12 @@ export function ProjectObjectiveDetail({
|
|
|
2422
2520
|
{/* Danger Zone */}
|
|
2423
2521
|
<section className="pt-10">
|
|
2424
2522
|
<div className="mb-4">
|
|
2425
|
-
<h2 className="text-sm font-semibold text-
|
|
2523
|
+
<h2 className="text-sm font-semibold text-[var(--destructive)]">Danger Zone</h2>
|
|
2426
2524
|
</div>
|
|
2427
|
-
<div className="
|
|
2525
|
+
<div className="flex items-center justify-between rounded-xl border border-[var(--destructive-border)] bg-[var(--destructive-bg)] p-5">
|
|
2428
2526
|
<div>
|
|
2429
|
-
<h3 className="text-sm font-medium text-
|
|
2430
|
-
<p className="text-sm text-
|
|
2527
|
+
<h3 className="text-sm font-medium text-[var(--foreground)]">Delete Objective</h3>
|
|
2528
|
+
<p className="mt-1 text-sm text-[var(--muted-foreground)]">
|
|
2431
2529
|
Once you delete an objective, there is no going back.
|
|
2432
2530
|
</p>
|
|
2433
2531
|
</div>
|
|
@@ -2435,7 +2533,7 @@ export function ProjectObjectiveDetail({
|
|
|
2435
2533
|
type="button"
|
|
2436
2534
|
onClick={() => void handleObjectiveDelete()}
|
|
2437
2535
|
aria-label={`Delete objective ${objective.title}`}
|
|
2438
|
-
className="flex items-center gap-2
|
|
2536
|
+
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"
|
|
2439
2537
|
>
|
|
2440
2538
|
<Trash2 size={14} /> Delete
|
|
2441
2539
|
</button>
|
|
@@ -2456,15 +2554,6 @@ export function ProjectObjectiveDetail({
|
|
|
2456
2554
|
</div>
|
|
2457
2555
|
</div>
|
|
2458
2556
|
|
|
2459
|
-
{wakeEditor ? (
|
|
2460
|
-
<ObjectiveWakeModal
|
|
2461
|
-
draft={wakeEditor}
|
|
2462
|
-
isSaving={isSaving}
|
|
2463
|
-
onChange={setWakeEditor}
|
|
2464
|
-
onClose={() => setWakeEditor(null)}
|
|
2465
|
-
onSave={() => void handleWakeSave()}
|
|
2466
|
-
/>
|
|
2467
|
-
) : null}
|
|
2468
2557
|
</div>
|
|
2469
2558
|
);
|
|
2470
2559
|
}
|
|
@@ -2475,8 +2564,8 @@ export function ProjectObjectivesWorkspace(props: ProjectObjectivesWorkspaceProp
|
|
|
2475
2564
|
|
|
2476
2565
|
function EmptyState({ label }: { label: string }) {
|
|
2477
2566
|
return (
|
|
2478
|
-
<div className="
|
|
2479
|
-
<p className="text-sm text-
|
|
2567
|
+
<div className="flex items-center rounded-xl border border-dashed border-[var(--border)] bg-[var(--overlay-panel-muted)] p-6">
|
|
2568
|
+
<p className="text-sm text-[var(--muted-foreground)]">{label}</p>
|
|
2480
2569
|
</div>
|
|
2481
2570
|
);
|
|
2482
2571
|
}
|
|
@@ -2504,7 +2593,7 @@ function ObjectiveEditorModal({
|
|
|
2504
2593
|
role="dialog"
|
|
2505
2594
|
aria-modal="true"
|
|
2506
2595
|
aria-label={mode === "edit" ? "Edit objective" : "New objective"}
|
|
2507
|
-
className="w-full max-w-3xl overflow-hidden rounded-[32px] border border-[var(--border)] bg-[
|
|
2596
|
+
className="w-full max-w-3xl overflow-hidden rounded-[32px] border border-[var(--border)] bg-[var(--overlay-panel-strong)] shadow-2xl"
|
|
2508
2597
|
>
|
|
2509
2598
|
<div className="border-b border-[var(--border)] px-5 py-4">
|
|
2510
2599
|
<h3 className="text-lg font-semibold text-[var(--foreground)]">
|
|
@@ -2523,7 +2612,7 @@ function ObjectiveEditorModal({
|
|
|
2523
2612
|
<input
|
|
2524
2613
|
value={draft.title}
|
|
2525
2614
|
onChange={(event) => onChange({ ...draft, title: event.target.value })}
|
|
2526
|
-
className="w-full rounded-2xl border border-[var(--border)] bg-[
|
|
2615
|
+
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)]"
|
|
2527
2616
|
placeholder="Get 50 qualified visitors daily"
|
|
2528
2617
|
/>
|
|
2529
2618
|
</div>
|
|
@@ -2534,7 +2623,7 @@ function ObjectiveEditorModal({
|
|
|
2534
2623
|
<select
|
|
2535
2624
|
value={draft.teamId}
|
|
2536
2625
|
onChange={(event) => onChange({ ...draft, teamId: event.target.value })}
|
|
2537
|
-
className="w-full rounded-2xl border border-[var(--border)] bg-[
|
|
2626
|
+
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)]"
|
|
2538
2627
|
>
|
|
2539
2628
|
<option value="">Select a team</option>
|
|
2540
2629
|
{teams.map((team) => (
|
|
@@ -2562,7 +2651,7 @@ function ObjectiveEditorModal({
|
|
|
2562
2651
|
type="button"
|
|
2563
2652
|
onClick={onSave}
|
|
2564
2653
|
disabled={isSaving}
|
|
2565
|
-
className="rounded-xl border border-
|
|
2654
|
+
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"
|
|
2566
2655
|
>
|
|
2567
2656
|
{isSaving ? "Saving..." : mode === "edit" ? "Save objective" : "Create objective"}
|
|
2568
2657
|
</button>
|
|
@@ -2572,73 +2661,6 @@ function ObjectiveEditorModal({
|
|
|
2572
2661
|
);
|
|
2573
2662
|
}
|
|
2574
2663
|
|
|
2575
|
-
function ObjectiveWakeModal({
|
|
2576
|
-
draft,
|
|
2577
|
-
isSaving,
|
|
2578
|
-
onChange,
|
|
2579
|
-
onClose,
|
|
2580
|
-
onSave,
|
|
2581
|
-
}: {
|
|
2582
|
-
draft: ObjectiveEditorDraft;
|
|
2583
|
-
isSaving: boolean;
|
|
2584
|
-
onChange: (draft: ObjectiveEditorDraft) => void;
|
|
2585
|
-
onClose: () => void;
|
|
2586
|
-
onSave: () => void;
|
|
2587
|
-
}) {
|
|
2588
|
-
return (
|
|
2589
|
-
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/45 p-4">
|
|
2590
|
-
<div
|
|
2591
|
-
role="dialog"
|
|
2592
|
-
aria-modal="true"
|
|
2593
|
-
aria-label="Edit wake schedule"
|
|
2594
|
-
className="w-full max-w-2xl overflow-hidden rounded-[32px] border border-[var(--border)] bg-[rgba(6,10,16,0.96)] shadow-2xl"
|
|
2595
|
-
>
|
|
2596
|
-
<div className="border-b border-[var(--border)] px-5 py-4">
|
|
2597
|
-
<h3 className="text-lg font-semibold text-[var(--foreground)]">Edit wake schedule</h3>
|
|
2598
|
-
<p className="mt-1 text-sm text-[var(--muted-foreground)]">
|
|
2599
|
-
Control when agents should wake up and whether they should gate execution on a condition.
|
|
2600
|
-
</p>
|
|
2601
|
-
</div>
|
|
2602
|
-
|
|
2603
|
-
<div className="px-5 py-5">
|
|
2604
|
-
<ScheduleConditionPicker
|
|
2605
|
-
value={{ cadence: draft.cadence, condition: draft.condition }}
|
|
2606
|
-
onChange={(nextValue) =>
|
|
2607
|
-
onChange({
|
|
2608
|
-
...draft,
|
|
2609
|
-
cadence: nextValue.cadence,
|
|
2610
|
-
condition: nextValue.condition,
|
|
2611
|
-
})
|
|
2612
|
-
}
|
|
2613
|
-
allowEmptySchedule
|
|
2614
|
-
scheduleLabel="Schedule"
|
|
2615
|
-
conditionLabel="Condition"
|
|
2616
|
-
conditionHelpText="Use a condition when agents should only work on this objective in specific circumstances."
|
|
2617
|
-
/>
|
|
2618
|
-
</div>
|
|
2619
|
-
|
|
2620
|
-
<div className="flex items-center justify-end gap-2 border-t border-[var(--border)] px-5 py-4">
|
|
2621
|
-
<button
|
|
2622
|
-
type="button"
|
|
2623
|
-
onClick={onClose}
|
|
2624
|
-
className="rounded-xl border border-[var(--border)] px-3 py-2 text-sm text-[var(--muted-foreground)] transition-colors hover:text-[var(--foreground)]"
|
|
2625
|
-
>
|
|
2626
|
-
Cancel
|
|
2627
|
-
</button>
|
|
2628
|
-
<button
|
|
2629
|
-
type="button"
|
|
2630
|
-
onClick={onSave}
|
|
2631
|
-
disabled={isSaving}
|
|
2632
|
-
className="rounded-xl border border-sky-500/30 bg-sky-500/10 px-3 py-2 text-sm font-medium text-sky-100 transition-colors hover:bg-sky-500/20 disabled:cursor-not-allowed disabled:opacity-50"
|
|
2633
|
-
>
|
|
2634
|
-
{isSaving ? "Saving..." : "Save schedule"}
|
|
2635
|
-
</button>
|
|
2636
|
-
</div>
|
|
2637
|
-
</div>
|
|
2638
|
-
</div>
|
|
2639
|
-
);
|
|
2640
|
-
}
|
|
2641
|
-
|
|
2642
2664
|
function FieldLabel({ label }: { label: string }) {
|
|
2643
2665
|
return (
|
|
2644
2666
|
<label className="mb-2 block text-[11px] font-semibold uppercase tracking-[0.18em] text-[var(--muted-foreground)]">
|