@mndrk/agx 2.4.2 → 2.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cloud-runtime/standalone/apps/local/.next/BUILD_ID +1 -1
- package/cloud-runtime/standalone/apps/local/.next/app-path-routes-manifest.json +5 -0
- package/cloud-runtime/standalone/apps/local/.next/build-manifest.json +2 -2
- package/cloud-runtime/standalone/apps/local/.next/prerender-manifest.json +3 -3
- package/cloud-runtime/standalone/apps/local/.next/routes-manifest.json +41 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents/[id]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents/[id]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/agents/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/agents.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/agent-specs/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/agents/[id]/profile/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/agents/export/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/chat/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/file-search/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/participants/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/scheduled-tasks/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/worker/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/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/prompt-jobs/poll/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/providers/check/[id]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/providers/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/queue/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/schedules/debug/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/schedules/poll/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/assign/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/available/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/detail/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/history/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/learn/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/unlearn/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/status/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/summarize/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/comments/[commentId]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/comments/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/nodes/[nodeId]/comments/route.js +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]/verify/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/threads/knowledge/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/threads/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/auth/route.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/auth/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/callback/route.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/callback/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/groups/route.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/groups/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/items/[id]/activity/route.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/items/[id]/activity/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/items/[id]/recap/route.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/items/[id]/recap/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/items/[id]/route.js +4 -4
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/items/[id]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/items/route.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/items/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/[id]/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/[id]/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/[id]/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/[id]/route.js +7 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/[id]/route.js.map +5 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/[id]/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/[id]/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/route.js +7 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/route.js.map +5 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/mcp-setup/route.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/mcp-setup/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/bulk/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/bulk/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/bulk/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/bulk/route.js +7 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/bulk/route.js.map +5 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/bulk/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/bulk/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/route.js +7 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/route.js.map +5 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/options/route.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/options/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/runs/[id]/route.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/runs/[id]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/runs/route.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/runs/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/runs/scripted/route.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/runs/scripted/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/stats/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/stats/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/stats/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/stats/route.js +7 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/stats/route.js.map +5 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/stats/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/stats/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/status/route.js +4 -4
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/status/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/token/route.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/token/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/token-receive/route.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/token-receive/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/worker/route.js +6 -6
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/worker/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/connections/route.js +7 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/connections/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/update-check/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.rsc +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_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.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/automations/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/env-vars/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/env-vars/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/graph/[taskId]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/graph/[taskId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/[objectiveId]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/[objectiveId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/agents/[agentId]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/agents/[agentId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/adopt/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/adopt/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/new/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/new/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/replace/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/replace/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/terminal/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/terminal/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/[threadId]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/[threadId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/[tracker]/page/react-loadable-manifest.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/[tracker]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/[tracker]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/connect/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/connect/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/page/react-loadable-manifest.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/page_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 +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_full.segment.rsc +2 -2
- 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 +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/projects.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup/page_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 +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_full.segment.rsc +2 -2
- 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 +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/setup.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/status/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_full.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/status/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/status.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app-paths-manifest.json +5 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/083c9_next-internal_server_app_api_trackers_[tracker]_metadata_route_actions_c83fcc1a.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/30bdd_server_app_api_trackers_[tracker]_labels_[id]_route_actions_2646388d.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/30bdd_server_app_api_trackers_[tracker]_metadata_bulk_route_actions_f43e6831.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0e04eca4._.js +40 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0fbbaf2d._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__10a90219._.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__1d970ad0._.js +40 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/{[root-of-the-server]__2ab23e45._.js → [root-of-the-server]__2eb13697._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__3a038592._.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__3b27260f._.js +23 -8
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__498d8b2d._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__580ddcca._.js +40 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__5da8d281._.js +129 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__68b692c4._.js +9 -9
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__76030d44._.js +40 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__7db7c421._.js +20 -5
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__7fcbb0c2._.js +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__ba72d342._.js +5 -5
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__d8cc43c7._.js +22 -7
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__f598d976._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__f7a936d9._.js +21 -6
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_1a4cb196._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_5e5f36c4._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_8f9f647d._.js +28 -13
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_9f0fd451._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_d256aa32._.js +28 -25
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_e1f4d9ad._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_f8b3abae._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_orchestrator_chat-processor_ts_46384f36._.js +12 -12
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_tracker_tracker-run-store_ts_5aa9592e._.js +22 -7
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ebff2__next-internal_server_app_api_trackers_[tracker]_labels_route_actions_8ba41152.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ebff2__next-internal_server_app_api_trackers_[tracker]_stats_route_actions_7da4ccde.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{[root-of-the-server]__799f4d13._.js → [root-of-the-server]__2af44092._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__452cb0f0._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__489568b4._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__4ec098a0._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__53bd50df._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__7774a40c._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__b8484b0e._.js +7 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{[root-of-the-server]__51edc9b6._.js → [root-of-the-server]__bd05ee09._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_8c4beba9._.js +7 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_5eebb5cb._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{apps_local_35d90b5d._.js → apps_local_bbb7b83b._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_TrackerBoard_tsx_98970bab._.js +6 -6
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_chat-ui_f0554cb4._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_projects_ProjectObjectivesWorkspace_tsx_751ab3d3._.js +7 -7
- package/cloud-runtime/standalone/apps/local/.next/server/functions-config-manifest.json +5 -0
- package/cloud-runtime/standalone/apps/local/.next/server/middleware-manifest.json +5 -5
- package/cloud-runtime/standalone/apps/local/.next/server/pages/404.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/pages/500.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/server-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/server-reference-manifest.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0243e7d015db440d.js +5 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/42a62b80b32a97f7.js +9 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/5d047fc7267a8f53.js +16 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/7148feb61274d431.css +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/716e1716d526ded9.js +46 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{77cea126364aab3c.js → 7353a3a1fcd5825c.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/8b91e7692a899f00.js +20 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/9acdd370e9daca0d.js +16 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{6c777fe66e042eec.js → 9df45611d6c84e02.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{6c278ae4535b6d5c.js → 9e2208153f276f8c.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/a084c6475513e6fe.js +16 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/aa6db7c91c1ccd5f.js +16 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/d5607ac80145f3b7.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/d590384ce3045a12.js +5 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{d5b14e14665024a9.js → d5c307b52fd87861.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/f4acf76cb6c82c73.js +16 -0
- package/cloud-runtime/standalone/apps/local/app/api/trackers/[tracker]/labels/[id]/route.ts +23 -0
- package/cloud-runtime/standalone/apps/local/app/api/trackers/[tracker]/labels/route.ts +41 -0
- package/cloud-runtime/standalone/apps/local/app/api/trackers/[tracker]/metadata/bulk/route.ts +68 -0
- package/cloud-runtime/standalone/apps/local/app/api/trackers/[tracker]/metadata/route.ts +31 -0
- package/cloud-runtime/standalone/apps/local/app/api/trackers/[tracker]/options/route.ts +1 -0
- package/cloud-runtime/standalone/apps/local/app/api/trackers/[tracker]/stats/route.ts +20 -0
- package/cloud-runtime/standalone/apps/local/app/api/trackers/connections/route.ts +46 -2
- package/cloud-runtime/standalone/apps/local/app/projects/[slug]/tracking/connect/page.tsx +41 -11
- package/cloud-runtime/standalone/apps/local/components/TrackerBoard.tsx +609 -85
- package/cloud-runtime/standalone/apps/local/components/projects/ProjectObjectivesWorkspace.tsx +204 -49
- package/cloud-runtime/standalone/apps/local/components/tracker/FibonacciPicker.tsx +41 -0
- package/cloud-runtime/standalone/apps/local/components/tracker/FolderRow.tsx +1 -1
- package/cloud-runtime/standalone/apps/local/components/tracker/LabelPicker.tsx +118 -0
- package/cloud-runtime/standalone/apps/local/components/tracker/LabelSettings.tsx +104 -0
- package/cloud-runtime/standalone/apps/local/components/tracker/PromptPopover.tsx +64 -0
- package/cloud-runtime/standalone/apps/local/components/tracker/SelectionBar.tsx +276 -23
- package/cloud-runtime/standalone/apps/local/components/tracker/StatusGroupRow.tsx +50 -0
- package/cloud-runtime/standalone/apps/local/components/tracker/TicketPanel.tsx +14 -2
- package/cloud-runtime/standalone/apps/local/components/tracker/TicketRow.tsx +147 -7
- package/cloud-runtime/standalone/apps/local/components/tracker/TrackerSettingsModal.tsx +14 -2
- package/cloud-runtime/standalone/apps/local/components/ui/ResizeHandle.tsx +15 -22
- package/cloud-runtime/standalone/apps/local/hooks/useTrackerConnections.ts +29 -1
- package/cloud-runtime/standalone/apps/local/hooks/useTrackerIssueStats.ts +52 -0
- package/cloud-runtime/standalone/apps/local/hooks/useTrackerItemMetadata.ts +67 -0
- package/cloud-runtime/standalone/apps/local/hooks/useTrackerItemsMetadata.ts +51 -0
- package/cloud-runtime/standalone/apps/local/hooks/useTrackerLabels.ts +74 -0
- package/cloud-runtime/standalone/apps/local/hooks/useTrackerRuns.ts +5 -0
- package/cloud-runtime/standalone/apps/local/lib/agent-process-registry.ts +8 -2
- package/cloud-runtime/standalone/apps/local/lib/tracker/adapters/jira/adapter.tsx +1 -0
- package/cloud-runtime/standalone/apps/local/lib/tracker/adapters/jira/issues.ts +1 -0
- package/cloud-runtime/standalone/apps/local/lib/tracker/adapters/linear/adapter.tsx +1 -0
- package/cloud-runtime/standalone/apps/local/lib/tracker/adapters/linear/client.ts +5 -0
- package/cloud-runtime/standalone/apps/local/lib/tracker/adapters/linear/issues.ts +1 -0
- package/cloud-runtime/standalone/apps/local/lib/tracker/connections.ts +46 -15
- package/cloud-runtime/standalone/apps/local/lib/tracker/tracker-adapter.ts +2 -0
- package/cloud-runtime/standalone/apps/local/lib/tracker/tracker-item-metadata-store.ts +262 -0
- package/cloud-runtime/standalone/apps/local/lib/tracker/tracker-item-store.ts +10 -3
- package/cloud-runtime/standalone/apps/local/lib/tracker/tracker-run-store.ts +42 -0
- package/cloud-runtime/standalone/apps/local/src/prompt-scheduler/objective-worker.ts +7 -0
- package/cloud-runtime/standalone/apps/local/src/prompt-scheduler/task-worker.ts +7 -0
- package/cloud-runtime/standalone/apps/local/state/trackerBoardFilters.ts +4 -0
- package/cloud-runtime/standalone/apps/local/worker/index.js +6 -2
- package/package.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__847236fb._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_80b34b78._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__30bf097e._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__46ae9d33._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__50fd8680._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__8059a285._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__886953ec._.js +0 -7
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__97160565._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0876dfd6ce07abaf.js +0 -9
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/1ec83777a9abd420.js +0 -16
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/286758b0fd546c68.js +0 -16
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/a72ed5cb3feb0d51.js +0 -5
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/b02c180ad1d968eb.js +0 -16
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/b048a4812b51f97a.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/c63d97c917d96f47.js +0 -46
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/d3bf70e2fbdc0ae5.js +0 -5
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/dd5a56eea2d4c067.js +0 -16
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/dd7d7c382389b8b9.js +0 -16
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/e72724fd8225ec39.js +0 -20
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/ec92e3bd6c2db6e6.css +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/ffcc32453866d0c2.js +0 -1
- /package/cloud-runtime/standalone/apps/local/.next/static/{QEldoF1LdgJqO0PgpmUmx → 3-6VaSnGGXdV-2eV44RDK}/_buildManifest.js +0 -0
- /package/cloud-runtime/standalone/apps/local/.next/static/{QEldoF1LdgJqO0PgpmUmx → 3-6VaSnGGXdV-2eV44RDK}/_clientMiddlewareManifest.json +0 -0
- /package/cloud-runtime/standalone/apps/local/.next/static/{QEldoF1LdgJqO0PgpmUmx → 3-6VaSnGGXdV-2eV44RDK}/_ssgManifest.js +0 -0
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
3
|
import React, { useState, useCallback, useEffect, useRef } from "react";
|
|
4
|
-
import { Check, ExternalLink, Link2, Pin, StickyNote } from "lucide-react";
|
|
4
|
+
import { Check, ExternalLink, Link2, MessageSquare, Pin, Play, StickyNote, Tag } from "lucide-react";
|
|
5
5
|
import { NoteSticker } from "@/components/tracker/NoteSticker";
|
|
6
|
+
import { LabelPicker } from "@/components/tracker/LabelPicker";
|
|
6
7
|
import { useDraggable, useDroppable } from "@dnd-kit/core";
|
|
7
8
|
import type { TrackerItem } from "@/lib/tracker/types";
|
|
8
9
|
import type { Participant } from "@/lib/types";
|
|
@@ -21,6 +22,14 @@ export function TicketRow({
|
|
|
21
22
|
draggable = false,
|
|
22
23
|
treeConnector,
|
|
23
24
|
projectSlug,
|
|
25
|
+
stats,
|
|
26
|
+
hideStatus,
|
|
27
|
+
estimate,
|
|
28
|
+
localLabels,
|
|
29
|
+
labelDefinitions,
|
|
30
|
+
allLabels,
|
|
31
|
+
onToggleLabel,
|
|
32
|
+
onAddLabel,
|
|
24
33
|
}: {
|
|
25
34
|
item: TrackerItem;
|
|
26
35
|
selected: boolean;
|
|
@@ -33,6 +42,14 @@ export function TicketRow({
|
|
|
33
42
|
draggable?: boolean;
|
|
34
43
|
treeConnector?: "mid" | "last";
|
|
35
44
|
projectSlug?: string;
|
|
45
|
+
stats?: { sessions: number; messages: number };
|
|
46
|
+
hideStatus?: boolean;
|
|
47
|
+
estimate?: number | null;
|
|
48
|
+
localLabels?: string[];
|
|
49
|
+
labelDefinitions?: Array<{ name: string; color: string | null }>;
|
|
50
|
+
allLabels?: Array<{ name: string; color: string | null; defined: boolean }>;
|
|
51
|
+
onToggleLabel?: (label: string) => void;
|
|
52
|
+
onAddLabel?: (label: string) => void;
|
|
36
53
|
}) {
|
|
37
54
|
const [copied, setCopied] = useState(false);
|
|
38
55
|
const copyResetTimeoutRef = useRef<number | null>(null);
|
|
@@ -41,6 +58,30 @@ export function TicketRow({
|
|
|
41
58
|
const [noteContent, setNoteContent] = useState("");
|
|
42
59
|
const [noteLoaded, setNoteLoaded] = useState(false);
|
|
43
60
|
const [hasNote, setHasNote] = useState(false);
|
|
61
|
+
const labelButtonRef = useRef<HTMLButtonElement>(null);
|
|
62
|
+
const labelPopoverRef = useRef<HTMLDivElement>(null);
|
|
63
|
+
const [labelOpen, setLabelOpen] = useState(false);
|
|
64
|
+
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
if (!labelOpen) return;
|
|
67
|
+
const handlePointerDown = (e: PointerEvent) => {
|
|
68
|
+
if (
|
|
69
|
+
labelPopoverRef.current && !labelPopoverRef.current.contains(e.target as Node) &&
|
|
70
|
+
labelButtonRef.current && !labelButtonRef.current.contains(e.target as Node)
|
|
71
|
+
) {
|
|
72
|
+
setLabelOpen(false);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
const handleKey = (e: KeyboardEvent) => {
|
|
76
|
+
if (e.key === "Escape") setLabelOpen(false);
|
|
77
|
+
};
|
|
78
|
+
document.addEventListener("pointerdown", handlePointerDown);
|
|
79
|
+
document.addEventListener("keydown", handleKey);
|
|
80
|
+
return () => {
|
|
81
|
+
document.removeEventListener("pointerdown", handlePointerDown);
|
|
82
|
+
document.removeEventListener("keydown", handleKey);
|
|
83
|
+
};
|
|
84
|
+
}, [labelOpen]);
|
|
44
85
|
|
|
45
86
|
const loadNote = useCallback(async () => {
|
|
46
87
|
if (!projectSlug || noteLoaded) return;
|
|
@@ -165,7 +206,6 @@ export function TicketRow({
|
|
|
165
206
|
onClick={(e) => {
|
|
166
207
|
e.stopPropagation();
|
|
167
208
|
e.preventDefault();
|
|
168
|
-
// Synthesize a meta-click to toggle multi-select
|
|
169
209
|
const synth = new MouseEvent("click", { metaKey: true, ctrlKey: true }) as unknown as React.MouseEvent;
|
|
170
210
|
onSelect(synth);
|
|
171
211
|
}}
|
|
@@ -179,15 +219,80 @@ export function TicketRow({
|
|
|
179
219
|
{treeConnector === "last" ? "└──" : "├──"}
|
|
180
220
|
</span>
|
|
181
221
|
)}
|
|
182
|
-
<span className={`shrink-0 whitespace-nowrap font-mono text-xs text-[var(--muted-foreground)] ${treeConnector ? "" : "w-
|
|
222
|
+
<span className={`shrink-0 whitespace-nowrap font-mono text-xs text-[var(--muted-foreground)] ${treeConnector ? "" : "w-15"}`}>
|
|
183
223
|
{item.identifier}
|
|
184
224
|
</span>
|
|
185
225
|
<span className={`min-w-0 flex-1 truncate text-xs ${selected ? "font-medium text-[var(--foreground)]" : "text-[var(--muted-foreground)]"}`}>
|
|
186
226
|
{item.title}
|
|
187
227
|
</span>
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
228
|
+
{estimate != null && (
|
|
229
|
+
<span className="shrink-0 rounded-full bg-[var(--card-bg)] px-1.5 py-0.5 text-[10px] font-semibold text-[var(--muted-foreground)]">
|
|
230
|
+
{estimate}
|
|
231
|
+
</span>
|
|
232
|
+
)}
|
|
233
|
+
{localLabels && localLabels.length > 0 && (
|
|
234
|
+
<span className="flex shrink-0 items-center gap-1">
|
|
235
|
+
{localLabels.slice(0, 3).map((label) => {
|
|
236
|
+
const def = labelDefinitions?.find((d) => d.name === label);
|
|
237
|
+
return (
|
|
238
|
+
<span
|
|
239
|
+
key={label}
|
|
240
|
+
className="flex items-center gap-1 rounded-full border border-[var(--card-border)] px-1.5 py-0.5 text-[10px] text-[var(--muted-foreground)]"
|
|
241
|
+
>
|
|
242
|
+
{def?.color && (
|
|
243
|
+
<span
|
|
244
|
+
className="h-1.5 w-1.5 rounded-full"
|
|
245
|
+
style={{ backgroundColor: def.color }}
|
|
246
|
+
/>
|
|
247
|
+
)}
|
|
248
|
+
<span className="max-w-[60px] truncate">{label}</span>
|
|
249
|
+
</span>
|
|
250
|
+
);
|
|
251
|
+
})}
|
|
252
|
+
{localLabels.length > 3 && (
|
|
253
|
+
<span className="text-[10px] text-[var(--muted-foreground)]">
|
|
254
|
+
+{localLabels.length - 3}
|
|
255
|
+
</span>
|
|
256
|
+
)}
|
|
257
|
+
</span>
|
|
258
|
+
)}
|
|
259
|
+
{!hideStatus && (
|
|
260
|
+
<span className="inline-flex shrink-0 items-center gap-2">
|
|
261
|
+
<span className="text-xs text-[var(--muted-foreground)]">
|
|
262
|
+
{shortStatus}
|
|
263
|
+
</span>
|
|
264
|
+
{stats && stats.sessions > 0 && (
|
|
265
|
+
<span
|
|
266
|
+
className="inline-flex items-center gap-1.5 text-[10px] tabular-nums text-[var(--muted-foreground)]/50"
|
|
267
|
+
title={`${stats.sessions} session${stats.sessions !== 1 ? "s" : ""}, ${stats.messages} message${stats.messages !== 1 ? "s" : ""}`}
|
|
268
|
+
>
|
|
269
|
+
<span className="inline-flex items-center gap-0.5">
|
|
270
|
+
<Play size={8} className="fill-current" />
|
|
271
|
+
{stats.sessions}
|
|
272
|
+
</span>
|
|
273
|
+
<span className="inline-flex items-center gap-0.5">
|
|
274
|
+
<MessageSquare size={8} />
|
|
275
|
+
{stats.messages}
|
|
276
|
+
</span>
|
|
277
|
+
</span>
|
|
278
|
+
)}
|
|
279
|
+
</span>
|
|
280
|
+
)}
|
|
281
|
+
{hideStatus && stats && stats.sessions > 0 && (
|
|
282
|
+
<span
|
|
283
|
+
className="inline-flex shrink-0 items-center gap-1.5 text-[10px] tabular-nums text-[var(--muted-foreground)]/50"
|
|
284
|
+
title={`${stats.sessions} session${stats.sessions !== 1 ? "s" : ""}, ${stats.messages} message${stats.messages !== 1 ? "s" : ""}`}
|
|
285
|
+
>
|
|
286
|
+
<span className="inline-flex items-center gap-0.5">
|
|
287
|
+
<Play size={8} className="fill-current" />
|
|
288
|
+
{stats.sessions}
|
|
289
|
+
</span>
|
|
290
|
+
<span className="inline-flex items-center gap-0.5">
|
|
291
|
+
<MessageSquare size={8} />
|
|
292
|
+
{stats.messages}
|
|
293
|
+
</span>
|
|
294
|
+
</span>
|
|
295
|
+
)}
|
|
191
296
|
{activeAgents && activeAgents.length > 0 && (
|
|
192
297
|
<span className="inline-flex items-center -space-x-1 shrink-0">
|
|
193
298
|
{activeAgents.slice(0, 3).map((agent) => {
|
|
@@ -202,6 +307,41 @@ export function TicketRow({
|
|
|
202
307
|
</span>
|
|
203
308
|
)}
|
|
204
309
|
<div className="flex shrink-0 items-center gap-1">
|
|
310
|
+
{onToggleLabel && allLabels && (
|
|
311
|
+
<div className="relative">
|
|
312
|
+
<button
|
|
313
|
+
ref={labelButtonRef}
|
|
314
|
+
type="button"
|
|
315
|
+
className={`flex h-6 w-6 shrink-0 items-center justify-center rounded transition-all hover:bg-zinc-700 ${
|
|
316
|
+
localLabels && localLabels.length > 0
|
|
317
|
+
? "text-blue-400 opacity-100"
|
|
318
|
+
: `text-[var(--muted-foreground)] ${selected ? "opacity-100" : "opacity-0 group-hover:opacity-100"}`
|
|
319
|
+
}`}
|
|
320
|
+
onClick={(e) => {
|
|
321
|
+
e.stopPropagation();
|
|
322
|
+
setLabelOpen((prev) => !prev);
|
|
323
|
+
}}
|
|
324
|
+
title={localLabels && localLabels.length > 0 ? "Edit labels" : "Add labels"}
|
|
325
|
+
aria-label={localLabels && localLabels.length > 0 ? "Edit labels" : "Add labels"}
|
|
326
|
+
>
|
|
327
|
+
<Tag size={10} className={localLabels && localLabels.length > 0 ? "fill-current" : ""} />
|
|
328
|
+
</button>
|
|
329
|
+
{labelOpen && (
|
|
330
|
+
<div
|
|
331
|
+
ref={labelPopoverRef}
|
|
332
|
+
className="absolute right-0 top-full z-30 mt-1 rounded-lg border border-[var(--card-border)] bg-[var(--card-bg)] p-2 shadow-xl"
|
|
333
|
+
onClick={(e) => e.stopPropagation()}
|
|
334
|
+
>
|
|
335
|
+
<LabelPicker
|
|
336
|
+
labels={allLabels}
|
|
337
|
+
selectedLabels={localLabels ?? []}
|
|
338
|
+
onToggle={onToggleLabel}
|
|
339
|
+
onAdd={onAddLabel ?? (() => {})}
|
|
340
|
+
/>
|
|
341
|
+
</div>
|
|
342
|
+
)}
|
|
343
|
+
</div>
|
|
344
|
+
)}
|
|
205
345
|
{projectSlug && (
|
|
206
346
|
<>
|
|
207
347
|
<button
|
|
@@ -210,7 +350,7 @@ export function TicketRow({
|
|
|
210
350
|
className={`flex h-6 w-6 shrink-0 items-center justify-center rounded transition-all hover:bg-zinc-700 ${
|
|
211
351
|
hasNote
|
|
212
352
|
? "text-amber-400 opacity-100"
|
|
213
|
-
:
|
|
353
|
+
: `text-[var(--muted-foreground)] ${selected ? "opacity-100" : "opacity-0 group-hover:opacity-100"}`
|
|
214
354
|
}`}
|
|
215
355
|
onClick={handleNoteClick}
|
|
216
356
|
title={hasNote ? "Edit note" : "Add note"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
3
|
import { useState, type ComponentProps } from "react";
|
|
4
|
-
import { Bot, Link2, ScrollText, X } from "lucide-react";
|
|
4
|
+
import { Bot, Link2, ScrollText, Tag, X } from "lucide-react";
|
|
5
5
|
import LinearSetup from "@/components/tracking/TrackerSetup";
|
|
6
6
|
import TrackerWorkerConfig from "@/components/tracker/TrackerWorkerConfig";
|
|
7
7
|
import TrackerWorkerRunLog from "@/components/tracker/TrackerWorkerRunLog";
|
|
8
|
+
import { LabelSettings } from "./LabelSettings";
|
|
9
|
+
import { useTrackerLabels } from "@/hooks/useTrackerLabels";
|
|
8
10
|
|
|
9
11
|
type TrackerSetupProps = ComponentProps<typeof LinearSetup>;
|
|
10
12
|
|
|
@@ -22,7 +24,7 @@ interface TrackerSettingsModalProps {
|
|
|
22
24
|
projectId?: string;
|
|
23
25
|
}
|
|
24
26
|
|
|
25
|
-
type SettingsTab = "connection" | "worker" | "run-log";
|
|
27
|
+
type SettingsTab = "connection" | "worker" | "run-log" | "labels";
|
|
26
28
|
|
|
27
29
|
export default function TrackerSettingsModal({
|
|
28
30
|
trackerType,
|
|
@@ -39,6 +41,8 @@ export default function TrackerSettingsModal({
|
|
|
39
41
|
}: TrackerSettingsModalProps) {
|
|
40
42
|
const [tab, setTab] = useState<SettingsTab>(connected ? "worker" : "connection");
|
|
41
43
|
const [workerJobId, setWorkerJobId] = useState<string | null>(null);
|
|
44
|
+
const { definitions: labelDefinitions, createDefinition, deleteDefinition } =
|
|
45
|
+
useTrackerLabels(trackerType, projectId);
|
|
42
46
|
|
|
43
47
|
const workerLabel = trackerType === "jira" ? "Jira Worker" : "Linear Worker";
|
|
44
48
|
|
|
@@ -46,6 +50,7 @@ export default function TrackerSettingsModal({
|
|
|
46
50
|
{ id: "connection", label: "Connection", icon: <Link2 size={14} /> },
|
|
47
51
|
{ id: "worker", label: workerLabel, icon: <Bot size={14} />, disabled: !connected },
|
|
48
52
|
{ id: "run-log", label: "Run Log", icon: <ScrollText size={14} />, disabled: !connected },
|
|
53
|
+
{ id: "labels" as const, label: "Labels", icon: <Tag size={14} />, disabled: !connected },
|
|
49
54
|
];
|
|
50
55
|
|
|
51
56
|
return (
|
|
@@ -108,6 +113,13 @@ export default function TrackerSettingsModal({
|
|
|
108
113
|
{tab === "run-log" && connected && (
|
|
109
114
|
<TrackerWorkerRunLog jobId={workerJobId} />
|
|
110
115
|
)}
|
|
116
|
+
{tab === "labels" && connected && (
|
|
117
|
+
<LabelSettings
|
|
118
|
+
definitions={labelDefinitions}
|
|
119
|
+
onCreate={createDefinition}
|
|
120
|
+
onDelete={deleteDefinition}
|
|
121
|
+
/>
|
|
122
|
+
)}
|
|
111
123
|
</div>
|
|
112
124
|
</div>
|
|
113
125
|
</div>
|
|
@@ -1,26 +1,29 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import React, {
|
|
3
|
+
import React, { useCallback, useRef } from "react";
|
|
4
4
|
|
|
5
5
|
export function ResizeHandle({
|
|
6
6
|
onResize,
|
|
7
7
|
}: {
|
|
8
8
|
onResize: (delta: number) => void;
|
|
9
9
|
}) {
|
|
10
|
-
const dragging = useRef(false);
|
|
11
10
|
const lastX = useRef(0);
|
|
11
|
+
const onResizeRef = useRef(onResize);
|
|
12
|
+
onResizeRef.current = onResize;
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
const handleMouseDown = useCallback((e: React.MouseEvent) => {
|
|
15
|
+
e.preventDefault();
|
|
16
|
+
lastX.current = e.clientX;
|
|
17
|
+
document.body.style.cursor = "col-resize";
|
|
18
|
+
document.body.style.userSelect = "none";
|
|
15
19
|
|
|
16
|
-
const onMouseMove = (
|
|
17
|
-
const delta =
|
|
18
|
-
lastX.current =
|
|
19
|
-
|
|
20
|
+
const onMouseMove = (ev: MouseEvent) => {
|
|
21
|
+
const delta = ev.clientX - lastX.current;
|
|
22
|
+
lastX.current = ev.clientX;
|
|
23
|
+
onResizeRef.current(delta);
|
|
20
24
|
};
|
|
21
25
|
|
|
22
26
|
const onMouseUp = () => {
|
|
23
|
-
dragging.current = false;
|
|
24
27
|
document.body.style.cursor = "";
|
|
25
28
|
document.body.style.userSelect = "";
|
|
26
29
|
window.removeEventListener("mousemove", onMouseMove);
|
|
@@ -29,24 +32,14 @@ export function ResizeHandle({
|
|
|
29
32
|
|
|
30
33
|
window.addEventListener("mousemove", onMouseMove);
|
|
31
34
|
window.addEventListener("mouseup", onMouseUp);
|
|
32
|
-
|
|
33
|
-
window.removeEventListener("mousemove", onMouseMove);
|
|
34
|
-
window.removeEventListener("mouseup", onMouseUp);
|
|
35
|
-
};
|
|
36
|
-
});
|
|
35
|
+
}, []);
|
|
37
36
|
|
|
38
37
|
return (
|
|
39
38
|
<div
|
|
40
39
|
className="group relative z-10 w-0 shrink-0 cursor-col-resize"
|
|
41
|
-
onMouseDown={
|
|
42
|
-
e.preventDefault();
|
|
43
|
-
dragging.current = true;
|
|
44
|
-
lastX.current = e.clientX;
|
|
45
|
-
document.body.style.cursor = "col-resize";
|
|
46
|
-
document.body.style.userSelect = "none";
|
|
47
|
-
}}
|
|
40
|
+
onMouseDown={handleMouseDown}
|
|
48
41
|
>
|
|
49
|
-
<div className="absolute inset-y-0 -left-
|
|
42
|
+
<div className="absolute inset-y-0 -left-1 w-2 transition-colors group-hover:bg-[var(--primary)]/40" />
|
|
50
43
|
</div>
|
|
51
44
|
);
|
|
52
45
|
}
|
|
@@ -13,10 +13,12 @@ interface TrackerConnectionInfo {
|
|
|
13
13
|
|
|
14
14
|
interface UseTrackerConnectionsReturn {
|
|
15
15
|
connections: TrackerConnectionInfo[];
|
|
16
|
+
defaultTracker: string | null;
|
|
16
17
|
loading: boolean;
|
|
17
18
|
refresh: () => Promise<void>;
|
|
18
19
|
addConnection: (type: string, metadata?: Record<string, string>) => Promise<{ ok: boolean; error?: string }>;
|
|
19
20
|
removeConnection: (type: string) => Promise<{ ok: boolean; error?: string }>;
|
|
21
|
+
setDefaultTracker: (type: string | null) => Promise<{ ok: boolean; error?: string }>;
|
|
20
22
|
}
|
|
21
23
|
|
|
22
24
|
/**
|
|
@@ -26,11 +28,13 @@ interface UseTrackerConnectionsReturn {
|
|
|
26
28
|
*/
|
|
27
29
|
export function useTrackerConnections(projectId: string | null): UseTrackerConnectionsReturn {
|
|
28
30
|
const [connections, setConnections] = useState<TrackerConnectionInfo[]>([]);
|
|
31
|
+
const [defaultTracker, setDefaultTrackerState] = useState<string | null>(null);
|
|
29
32
|
const [loading, setLoading] = useState(true);
|
|
30
33
|
|
|
31
34
|
const refresh = useCallback(async () => {
|
|
32
35
|
if (!projectId) {
|
|
33
36
|
setConnections([]);
|
|
37
|
+
setDefaultTrackerState(null);
|
|
34
38
|
setLoading(false);
|
|
35
39
|
return;
|
|
36
40
|
}
|
|
@@ -38,8 +42,10 @@ export function useTrackerConnections(projectId: string | null): UseTrackerConne
|
|
|
38
42
|
const res = await fetch(`/api/trackers/connections?projectId=${encodeURIComponent(projectId)}`);
|
|
39
43
|
const data = await res.json();
|
|
40
44
|
setConnections(Array.isArray(data.connections) ? data.connections : []);
|
|
45
|
+
setDefaultTrackerState(typeof data.defaultTracker === "string" ? data.defaultTracker : null);
|
|
41
46
|
} catch {
|
|
42
47
|
setConnections([]);
|
|
48
|
+
setDefaultTrackerState(null);
|
|
43
49
|
} finally {
|
|
44
50
|
setLoading(false);
|
|
45
51
|
}
|
|
@@ -95,5 +101,27 @@ export function useTrackerConnections(projectId: string | null): UseTrackerConne
|
|
|
95
101
|
[projectId, refresh]
|
|
96
102
|
);
|
|
97
103
|
|
|
98
|
-
|
|
104
|
+
const setDefaultTracker = useCallback(
|
|
105
|
+
async (type: string | null) => {
|
|
106
|
+
if (!projectId) return { ok: false, error: "Missing projectId" };
|
|
107
|
+
try {
|
|
108
|
+
const res = await fetch("/api/trackers/connections", {
|
|
109
|
+
method: "PATCH",
|
|
110
|
+
headers: { "Content-Type": "application/json" },
|
|
111
|
+
body: JSON.stringify({ projectId, defaultTracker: type }),
|
|
112
|
+
});
|
|
113
|
+
if (!res.ok) {
|
|
114
|
+
const data = await res.json().catch(() => ({}));
|
|
115
|
+
return { ok: false, error: data.error || "Failed to set default tracker" };
|
|
116
|
+
}
|
|
117
|
+
await refresh();
|
|
118
|
+
return { ok: true };
|
|
119
|
+
} catch {
|
|
120
|
+
return { ok: false, error: "Failed to set default tracker" };
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
[projectId, refresh]
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
return { connections, defaultTracker, loading, refresh, addConnection, removeConnection, setDefaultTracker };
|
|
99
127
|
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
|
|
5
|
+
export interface IssueStatsEntry {
|
|
6
|
+
sessions: number;
|
|
7
|
+
messages: number;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function useTrackerIssueStats(
|
|
11
|
+
trackerType: string,
|
|
12
|
+
projectId?: string,
|
|
13
|
+
): {
|
|
14
|
+
issueStats: Map<string, IssueStatsEntry>;
|
|
15
|
+
} {
|
|
16
|
+
const [issueStats, setIssueStats] = useState<Map<string, IssueStatsEntry>>(new Map());
|
|
17
|
+
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
let cancelled = false;
|
|
20
|
+
|
|
21
|
+
async function fetchStats() {
|
|
22
|
+
try {
|
|
23
|
+
const params = new URLSearchParams();
|
|
24
|
+
if (projectId) params.set("projectId", projectId);
|
|
25
|
+
const res = await fetch(
|
|
26
|
+
`/api/trackers/${trackerType}/stats?${params}`,
|
|
27
|
+
);
|
|
28
|
+
if (!res.ok || cancelled) return;
|
|
29
|
+
const data = await res.json();
|
|
30
|
+
const map = new Map<string, IssueStatsEntry>();
|
|
31
|
+
for (const entry of data.stats ?? []) {
|
|
32
|
+
map.set(entry.issueId, {
|
|
33
|
+
sessions: entry.sessions,
|
|
34
|
+
messages: entry.messages,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
if (!cancelled) setIssueStats(map);
|
|
38
|
+
} catch {
|
|
39
|
+
// ignore
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
void fetchStats();
|
|
44
|
+
const interval = setInterval(() => void fetchStats(), 10000);
|
|
45
|
+
return () => {
|
|
46
|
+
cancelled = true;
|
|
47
|
+
clearInterval(interval);
|
|
48
|
+
};
|
|
49
|
+
}, [trackerType, projectId]);
|
|
50
|
+
|
|
51
|
+
return { issueStats };
|
|
52
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useState, useEffect, useCallback } from "react";
|
|
4
|
+
|
|
5
|
+
interface ItemMetadata {
|
|
6
|
+
labels: string[];
|
|
7
|
+
estimate: number | null;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function useTrackerItemMetadata(
|
|
11
|
+
trackerType: string,
|
|
12
|
+
projectId: string | undefined,
|
|
13
|
+
issueId: string | null
|
|
14
|
+
) {
|
|
15
|
+
const [metadata, setMetadata] = useState<ItemMetadata>({ labels: [], estimate: null });
|
|
16
|
+
const [loading, setLoading] = useState(false);
|
|
17
|
+
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
if (!projectId || !issueId) {
|
|
20
|
+
setMetadata({ labels: [], estimate: null });
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
let cancelled = false;
|
|
24
|
+
setLoading(true);
|
|
25
|
+
fetch(
|
|
26
|
+
`/api/trackers/${encodeURIComponent(trackerType)}/metadata?projectId=${encodeURIComponent(projectId)}&issueId=${encodeURIComponent(issueId)}`
|
|
27
|
+
)
|
|
28
|
+
.then((res) => res.json())
|
|
29
|
+
.then((data) => {
|
|
30
|
+
if (!cancelled) {
|
|
31
|
+
setMetadata({
|
|
32
|
+
labels: Array.isArray(data.labels) ? data.labels : [],
|
|
33
|
+
estimate: typeof data.estimate === "number" ? data.estimate : null,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
})
|
|
37
|
+
.catch(() => {})
|
|
38
|
+
.finally(() => {
|
|
39
|
+
if (!cancelled) setLoading(false);
|
|
40
|
+
});
|
|
41
|
+
return () => { cancelled = true; };
|
|
42
|
+
}, [trackerType, projectId, issueId]);
|
|
43
|
+
|
|
44
|
+
const update = useCallback(
|
|
45
|
+
async (patch: { labels?: string[]; estimate?: number | null }) => {
|
|
46
|
+
if (!projectId || !issueId) return;
|
|
47
|
+
try {
|
|
48
|
+
const res = await fetch(
|
|
49
|
+
`/api/trackers/${encodeURIComponent(trackerType)}/metadata?projectId=${encodeURIComponent(projectId)}&issueId=${encodeURIComponent(issueId)}`,
|
|
50
|
+
{
|
|
51
|
+
method: "PATCH",
|
|
52
|
+
headers: { "Content-Type": "application/json" },
|
|
53
|
+
body: JSON.stringify(patch),
|
|
54
|
+
}
|
|
55
|
+
);
|
|
56
|
+
const data = await res.json();
|
|
57
|
+
setMetadata({
|
|
58
|
+
labels: Array.isArray(data.labels) ? data.labels : metadata.labels,
|
|
59
|
+
estimate: typeof data.estimate === "number" ? data.estimate : null,
|
|
60
|
+
});
|
|
61
|
+
} catch {}
|
|
62
|
+
},
|
|
63
|
+
[trackerType, projectId, issueId, metadata.labels]
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
return { metadata, loading, update };
|
|
67
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useState, useEffect, useCallback, useRef } from "react";
|
|
4
|
+
|
|
5
|
+
interface ItemMetadata {
|
|
6
|
+
labels: string[];
|
|
7
|
+
estimate: number | null;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function useTrackerItemsMetadata(
|
|
11
|
+
trackerType: string,
|
|
12
|
+
projectId: string | undefined,
|
|
13
|
+
issueIds: string[]
|
|
14
|
+
) {
|
|
15
|
+
const [metadataMap, setMetadataMap] = useState<Map<string, ItemMetadata>>(new Map());
|
|
16
|
+
const [loading, setLoading] = useState(false);
|
|
17
|
+
const prevIdsRef = useRef<string>("");
|
|
18
|
+
|
|
19
|
+
const fetchAll = useCallback(async () => {
|
|
20
|
+
if (!projectId || issueIds.length === 0) {
|
|
21
|
+
setMetadataMap(new Map());
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
setLoading(true);
|
|
25
|
+
try {
|
|
26
|
+
const res = await fetch(
|
|
27
|
+
`/api/trackers/${encodeURIComponent(trackerType)}/metadata/bulk?projectId=${encodeURIComponent(projectId)}&issueIds=${issueIds.map(encodeURIComponent).join(",")}`
|
|
28
|
+
);
|
|
29
|
+
const data = await res.json();
|
|
30
|
+
const map = new Map<string, ItemMetadata>();
|
|
31
|
+
for (const [id, meta] of Object.entries(data)) {
|
|
32
|
+
const m = meta as { labels?: string[]; estimate?: number | null };
|
|
33
|
+
map.set(id, {
|
|
34
|
+
labels: Array.isArray(m.labels) ? m.labels : [],
|
|
35
|
+
estimate: typeof m.estimate === "number" ? m.estimate : null,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
setMetadataMap(map);
|
|
39
|
+
} catch {}
|
|
40
|
+
setLoading(false);
|
|
41
|
+
}, [trackerType, projectId, issueIds]);
|
|
42
|
+
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
const idsKey = issueIds.join(",");
|
|
45
|
+
if (idsKey === prevIdsRef.current) return;
|
|
46
|
+
prevIdsRef.current = idsKey;
|
|
47
|
+
void fetchAll();
|
|
48
|
+
}, [fetchAll, issueIds]);
|
|
49
|
+
|
|
50
|
+
return { metadataMap, loading, refresh: fetchAll };
|
|
51
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useState, useEffect, useCallback } from "react";
|
|
4
|
+
|
|
5
|
+
export interface LabelEntry {
|
|
6
|
+
name: string;
|
|
7
|
+
color: string | null;
|
|
8
|
+
defined: boolean;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface LabelDefinition {
|
|
12
|
+
id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
color: string | null;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function useTrackerLabels(trackerType: string, projectId: string | undefined) {
|
|
18
|
+
const [labels, setLabels] = useState<LabelEntry[]>([]);
|
|
19
|
+
const [definitions, setDefinitions] = useState<LabelDefinition[]>([]);
|
|
20
|
+
const [loading, setLoading] = useState(false);
|
|
21
|
+
|
|
22
|
+
const fetchLabels = useCallback(async () => {
|
|
23
|
+
if (!projectId) return;
|
|
24
|
+
setLoading(true);
|
|
25
|
+
try {
|
|
26
|
+
const res = await fetch(
|
|
27
|
+
`/api/trackers/${encodeURIComponent(trackerType)}/labels?projectId=${encodeURIComponent(projectId)}`
|
|
28
|
+
);
|
|
29
|
+
const data = await res.json();
|
|
30
|
+
setLabels(Array.isArray(data.labels) ? data.labels : []);
|
|
31
|
+
setDefinitions(Array.isArray(data.definitions) ? data.definitions : []);
|
|
32
|
+
} catch {}
|
|
33
|
+
setLoading(false);
|
|
34
|
+
}, [trackerType, projectId]);
|
|
35
|
+
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
void fetchLabels();
|
|
38
|
+
}, [fetchLabels]);
|
|
39
|
+
|
|
40
|
+
const createDefinition = useCallback(
|
|
41
|
+
async (name: string, color?: string) => {
|
|
42
|
+
if (!projectId) return;
|
|
43
|
+
try {
|
|
44
|
+
const res = await fetch(`/api/trackers/${encodeURIComponent(trackerType)}/labels`, {
|
|
45
|
+
method: "POST",
|
|
46
|
+
headers: { "Content-Type": "application/json" },
|
|
47
|
+
body: JSON.stringify({ projectId, name, color }),
|
|
48
|
+
});
|
|
49
|
+
if (res.ok) {
|
|
50
|
+
await fetchLabels();
|
|
51
|
+
}
|
|
52
|
+
} catch {}
|
|
53
|
+
},
|
|
54
|
+
[trackerType, projectId, fetchLabels]
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
const deleteDefinition = useCallback(
|
|
58
|
+
async (id: string) => {
|
|
59
|
+
if (!projectId) return;
|
|
60
|
+
try {
|
|
61
|
+
const res = await fetch(
|
|
62
|
+
`/api/trackers/${encodeURIComponent(trackerType)}/labels/${encodeURIComponent(id)}?projectId=${encodeURIComponent(projectId)}`,
|
|
63
|
+
{ method: "DELETE" }
|
|
64
|
+
);
|
|
65
|
+
if (res.ok) {
|
|
66
|
+
await fetchLabels();
|
|
67
|
+
}
|
|
68
|
+
} catch {}
|
|
69
|
+
},
|
|
70
|
+
[trackerType, projectId, fetchLabels]
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
return { labels, definitions, loading, refresh: fetchLabels, createDefinition, deleteDefinition };
|
|
74
|
+
}
|
|
@@ -35,6 +35,7 @@ export function useTrackerRuns(
|
|
|
35
35
|
) {
|
|
36
36
|
const [runs, setRuns] = useState<TrackerRunRecord[]>([]);
|
|
37
37
|
const [loading, setLoading] = useState(false);
|
|
38
|
+
const [loadedForIssueId, setLoadedForIssueId] = useState<string | null>(null);
|
|
38
39
|
const issueIdRef = useRef(issueId ?? null);
|
|
39
40
|
issueIdRef.current = issueId ?? null;
|
|
40
41
|
|
|
@@ -44,6 +45,7 @@ export function useTrackerRuns(
|
|
|
44
45
|
const activeIssueId = issueIdRef.current?.trim();
|
|
45
46
|
if (!activeIssueId) {
|
|
46
47
|
setRuns([]);
|
|
48
|
+
setLoadedForIssueId(null);
|
|
47
49
|
return [];
|
|
48
50
|
}
|
|
49
51
|
|
|
@@ -58,6 +60,7 @@ export function useTrackerRuns(
|
|
|
58
60
|
const data = await response.json();
|
|
59
61
|
const nextRuns = Array.isArray(data.runs) ? (data.runs as TrackerRunRecord[]) : [];
|
|
60
62
|
setRuns(nextRuns);
|
|
63
|
+
setLoadedForIssueId(activeIssueId);
|
|
61
64
|
return nextRuns;
|
|
62
65
|
} finally {
|
|
63
66
|
setLoading(false);
|
|
@@ -66,6 +69,7 @@ export function useTrackerRuns(
|
|
|
66
69
|
|
|
67
70
|
useEffect(() => {
|
|
68
71
|
setRuns([]);
|
|
72
|
+
setLoadedForIssueId(null);
|
|
69
73
|
void refresh();
|
|
70
74
|
}, [refresh, issueId]);
|
|
71
75
|
|
|
@@ -115,6 +119,7 @@ export function useTrackerRuns(
|
|
|
115
119
|
return {
|
|
116
120
|
runs,
|
|
117
121
|
loading,
|
|
122
|
+
loadedForIssueId,
|
|
118
123
|
refresh,
|
|
119
124
|
createRun,
|
|
120
125
|
updateRun,
|