@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
package/cloud-runtime/standalone/apps/local/components/projects/ProjectObjectivesWorkspace.tsx
CHANGED
|
@@ -92,8 +92,9 @@ interface ProjectAgentSummary {
|
|
|
92
92
|
routing_order: number;
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
-
interface
|
|
95
|
+
interface ObjectiveTrackerItemSummary {
|
|
96
96
|
id: string;
|
|
97
|
+
trackerType: string;
|
|
97
98
|
identifier: string;
|
|
98
99
|
title: string;
|
|
99
100
|
url: string | null;
|
|
@@ -103,6 +104,12 @@ interface ObjectiveLinearIssueSummary {
|
|
|
103
104
|
labels?: string[];
|
|
104
105
|
}
|
|
105
106
|
|
|
107
|
+
interface TrackerConnectionInfo {
|
|
108
|
+
type: string;
|
|
109
|
+
displayName: string;
|
|
110
|
+
connected: boolean;
|
|
111
|
+
}
|
|
112
|
+
|
|
106
113
|
const HEALTH_META: Record<
|
|
107
114
|
ProjectObjectiveHealth,
|
|
108
115
|
{ label: string; chipClass: string; toneClass: string }
|
|
@@ -326,13 +333,18 @@ function buildObjectiveChatPrefix(
|
|
|
326
333
|
teamName: string | null,
|
|
327
334
|
projectId: string,
|
|
328
335
|
projectSlug: string,
|
|
329
|
-
appOrigin: string | null
|
|
336
|
+
appOrigin: string | null,
|
|
337
|
+
trackerInfo: {
|
|
338
|
+
available: { type: string; displayName: string }[];
|
|
339
|
+
configured: { type: string; displayName: string }[];
|
|
340
|
+
defaultType: string | null;
|
|
341
|
+
}
|
|
330
342
|
): string {
|
|
331
343
|
const basePath = `/api/projects/${projectId}/objectives/${objective.id}`;
|
|
332
344
|
const objectiveRoute = appOrigin ? `${appOrigin}${basePath}` : basePath;
|
|
333
345
|
const scheduledTasksRoute = `${objectiveRoute}/scheduled-tasks`;
|
|
334
|
-
const linearIssuesRoute = `${objectiveRoute}/linear-issues`;
|
|
335
346
|
const notesRoute = `${objectiveRoute}/notes`;
|
|
347
|
+
const trackersBase = appOrigin ? `${appOrigin}/api/trackers` : `/api/trackers`;
|
|
336
348
|
|
|
337
349
|
const objectiveFilePath = `~/.agx/projects/${projectSlug}/objectives/${objective.key}.md`;
|
|
338
350
|
const notesDir = `~/.agx/projects/${projectSlug}/objectives/${objective.key}/notes/`;
|
|
@@ -354,7 +366,7 @@ function buildObjectiveChatPrefix(
|
|
|
354
366
|
`## 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.`,
|
|
355
367
|
|
|
356
368
|
"Scheduled tasks live in the shared scheduled-task list and are filtered by this objective label.",
|
|
357
|
-
"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
|
|
369
|
+
"Your job is to help the team develop the strategy needed to reach the goal, including the right combination of objective notes, scheduled tasks, and tracker tickets.",
|
|
358
370
|
"Use the current session history to build on prior reasoning. Only reset and start from scratch when the user explicitly starts a new session.",
|
|
359
371
|
"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.",
|
|
360
372
|
"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.",
|
|
@@ -367,9 +379,32 @@ function buildObjectiveChatPrefix(
|
|
|
367
379
|
`- DELETE ${notesRoute}/{noteId} to delete a note.`,
|
|
368
380
|
`- GET ${scheduledTasksRoute} to inspect the scheduled tasks already tracked for this objective.`,
|
|
369
381
|
`- POST ${scheduledTasksRoute} with {"name","prompt","cadence","agentId"} to create a scheduled task for this objective.`,
|
|
370
|
-
`- GET ${linearIssuesRoute} to inspect Linear tickets carrying the objective label "${objective.key}".`,
|
|
371
|
-
`- POST ${linearIssuesRoute} with {"title","description","teamId","assigneeId","cycleId","stateId","priority"} to create a Linear ticket labeled "${objective.key}".`,
|
|
372
382
|
`- GET ${validateRoute} to validate the objective file on disk. Returns {"valid":true} or {"valid":false,"errors":[...]}.`,
|
|
383
|
+
"Tracker integrations:",
|
|
384
|
+
`- Available tracker types: ${
|
|
385
|
+
trackerInfo.available.length > 0
|
|
386
|
+
? trackerInfo.available.map((t) => `${t.displayName} (${t.type})`).join(", ")
|
|
387
|
+
: "none registered"
|
|
388
|
+
}.`,
|
|
389
|
+
`- Configured for this project: ${
|
|
390
|
+
trackerInfo.configured.length > 0
|
|
391
|
+
? trackerInfo.configured
|
|
392
|
+
.map((t) => {
|
|
393
|
+
const isDefault = trackerInfo.defaultType === t.type;
|
|
394
|
+
return `${t.displayName} (${t.type})${isDefault ? " — default" : ""}`;
|
|
395
|
+
})
|
|
396
|
+
.join(", ")
|
|
397
|
+
: "none — ask the user to connect a tracker in project settings if they want ticket workflows"
|
|
398
|
+
}.`,
|
|
399
|
+
trackerInfo.defaultType
|
|
400
|
+
? `- Default tracker for ticket workflows: ${trackerInfo.defaultType}. Prefer this tracker when creating or referencing tickets for this objective unless the user asks otherwise.`
|
|
401
|
+
: trackerInfo.configured.length > 1
|
|
402
|
+
? "- No default tracker has been selected; ask the user which connected tracker to use before creating tickets."
|
|
403
|
+
: "",
|
|
404
|
+
...trackerInfo.configured.map(
|
|
405
|
+
(t) =>
|
|
406
|
+
`- GET ${trackersBase}/${t.type}/items?projectId=${projectId} to list ${t.displayName} items. Filter client-side by label "${objective.key}" to find tickets tied to this objective.`
|
|
407
|
+
),
|
|
373
408
|
]
|
|
374
409
|
.filter(Boolean)
|
|
375
410
|
.join("\n\n");
|
|
@@ -385,7 +420,7 @@ interface ObjectiveChatSession {
|
|
|
385
420
|
|
|
386
421
|
type ObjectiveChatView = "list" | "detail";
|
|
387
422
|
|
|
388
|
-
type ObjectiveDetailTab = "activity" | "notes" | "
|
|
423
|
+
type ObjectiveDetailTab = "activity" | "notes" | "tasks" | "scheduled-tasks";
|
|
389
424
|
|
|
390
425
|
function summarizeSessionTitle(content: string): string {
|
|
391
426
|
const normalized = content.replace(/\s+/g, " ").trim();
|
|
@@ -478,6 +513,9 @@ function ObjectiveChatPanel({
|
|
|
478
513
|
projectSlug,
|
|
479
514
|
objective,
|
|
480
515
|
teamName,
|
|
516
|
+
trackerConnections,
|
|
517
|
+
availableTrackers,
|
|
518
|
+
defaultTrackerType,
|
|
481
519
|
onThreadLinked,
|
|
482
520
|
onObjectiveUpdated,
|
|
483
521
|
}: {
|
|
@@ -485,6 +523,9 @@ function ObjectiveChatPanel({
|
|
|
485
523
|
projectSlug: string;
|
|
486
524
|
objective: ProjectObjective;
|
|
487
525
|
teamName: string | null;
|
|
526
|
+
trackerConnections: TrackerConnectionInfo[];
|
|
527
|
+
availableTrackers: { type: string; displayName: string }[];
|
|
528
|
+
defaultTrackerType: string | null;
|
|
488
529
|
onThreadLinked: (threadId: string) => Promise<void>;
|
|
489
530
|
onObjectiveUpdated: () => Promise<void>;
|
|
490
531
|
}) {
|
|
@@ -959,7 +1000,11 @@ function ObjectiveChatPanel({
|
|
|
959
1000
|
const projectParticipantIds = participants.map((participant) => participant.id);
|
|
960
1001
|
const rootMessageId = isDetailView ? selectedSessionId : null;
|
|
961
1002
|
const combinedPrefix = [
|
|
962
|
-
buildObjectiveChatPrefix(objective, teamName, projectId, projectSlug, appOrigin
|
|
1003
|
+
buildObjectiveChatPrefix(objective, teamName, projectId, projectSlug, appOrigin, {
|
|
1004
|
+
available: availableTrackers,
|
|
1005
|
+
configured: trackerConnections.filter((c) => c.connected).map((c) => ({ type: c.type, displayName: c.displayName })),
|
|
1006
|
+
defaultType: defaultTrackerType,
|
|
1007
|
+
}),
|
|
963
1008
|
promptPrefix,
|
|
964
1009
|
]
|
|
965
1010
|
.filter(Boolean)
|
|
@@ -1639,8 +1684,10 @@ export function ProjectObjectiveDetail({
|
|
|
1639
1684
|
const [savingNoteIds, setSavingNoteIds] = useState<Set<string>>(new Set());
|
|
1640
1685
|
const [isCreatingNote, setIsCreatingNote] = useState(false);
|
|
1641
1686
|
const [noteSearch, setNoteSearch] = useState("");
|
|
1642
|
-
const [
|
|
1643
|
-
const [
|
|
1687
|
+
const [trackerItems, setTrackerItems] = useState<ObjectiveTrackerItemSummary[]>([]);
|
|
1688
|
+
const [trackerConnections, setTrackerConnections] = useState<TrackerConnectionInfo[]>([]);
|
|
1689
|
+
const [availableTrackers, setAvailableTrackers] = useState<{ type: string; displayName: string }[]>([]);
|
|
1690
|
+
const [defaultTrackerType, setDefaultTrackerType] = useState<string | null>(null);
|
|
1644
1691
|
const [workingOnObjective, setWorkingOnObjective] = useState(false);
|
|
1645
1692
|
|
|
1646
1693
|
const { jobs: scheduledJobs } = usePromptJobs(project?.id ?? null, {
|
|
@@ -1956,46 +2003,119 @@ export function ProjectObjectiveDetail({
|
|
|
1956
2003
|
}, [objective, project?.id, refetchProject]);
|
|
1957
2004
|
|
|
1958
2005
|
useEffect(() => {
|
|
1959
|
-
if (!project?.id || !objective?.id) {
|
|
1960
|
-
|
|
1961
|
-
|
|
2006
|
+
if (!project?.id || !objective?.id || !objective?.key) {
|
|
2007
|
+
setTrackerItems([]);
|
|
2008
|
+
setTrackerConnections([]);
|
|
2009
|
+
setAvailableTrackers([]);
|
|
1962
2010
|
return;
|
|
1963
2011
|
}
|
|
1964
2012
|
|
|
1965
2013
|
const projectId = project.id;
|
|
1966
|
-
const
|
|
2014
|
+
const objectiveKey = objective.key;
|
|
1967
2015
|
let cancelled = false;
|
|
1968
2016
|
|
|
1969
|
-
async function
|
|
2017
|
+
async function loadTrackerResources() {
|
|
1970
2018
|
try {
|
|
1971
|
-
const
|
|
1972
|
-
`/api/
|
|
2019
|
+
const connRes = await fetch(
|
|
2020
|
+
`/api/trackers/connections?projectId=${encodeURIComponent(projectId)}`
|
|
1973
2021
|
);
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
|
|
1979
|
-
|
|
1980
|
-
|
|
1981
|
-
|
|
1982
|
-
|
|
1983
|
-
|
|
2022
|
+
if (!connRes.ok) {
|
|
2023
|
+
if (!cancelled) {
|
|
2024
|
+
setTrackerItems([]);
|
|
2025
|
+
setTrackerConnections([]);
|
|
2026
|
+
setAvailableTrackers([]);
|
|
2027
|
+
}
|
|
2028
|
+
return;
|
|
2029
|
+
}
|
|
2030
|
+
const connPayload = (await connRes.json()) as {
|
|
2031
|
+
connections?: { type: string; connected?: boolean }[];
|
|
2032
|
+
available?: { type: string; displayName: string }[];
|
|
2033
|
+
defaultTracker?: string | null;
|
|
2034
|
+
};
|
|
1984
2035
|
if (cancelled) return;
|
|
1985
2036
|
|
|
1986
|
-
|
|
1987
|
-
|
|
2037
|
+
const available = Array.isArray(connPayload.available) ? connPayload.available : [];
|
|
2038
|
+
const connections: TrackerConnectionInfo[] = (connPayload.connections ?? []).map((c) => ({
|
|
2039
|
+
type: c.type,
|
|
2040
|
+
displayName: available.find((a) => a.type === c.type)?.displayName ?? c.type,
|
|
2041
|
+
connected: c.connected !== false,
|
|
2042
|
+
}));
|
|
2043
|
+
const nextDefault =
|
|
2044
|
+
typeof connPayload.defaultTracker === "string" && connPayload.defaultTracker
|
|
2045
|
+
? connPayload.defaultTracker
|
|
2046
|
+
: null;
|
|
2047
|
+
|
|
2048
|
+
setAvailableTrackers(available);
|
|
2049
|
+
setTrackerConnections(connections);
|
|
2050
|
+
setDefaultTrackerType(nextDefault);
|
|
2051
|
+
|
|
2052
|
+
const connectedOnly = connections.filter((c) => c.connected);
|
|
2053
|
+
const activeConns =
|
|
2054
|
+
nextDefault && connectedOnly.some((c) => c.type === nextDefault)
|
|
2055
|
+
? connectedOnly.filter((c) => c.type === nextDefault)
|
|
2056
|
+
: connectedOnly;
|
|
2057
|
+
if (activeConns.length === 0) {
|
|
2058
|
+
setTrackerItems([]);
|
|
2059
|
+
return;
|
|
2060
|
+
}
|
|
2061
|
+
|
|
2062
|
+
const normalizedKey = objectiveKey.trim().toLowerCase();
|
|
2063
|
+
const results = await Promise.all(
|
|
2064
|
+
activeConns.map(async (conn) => {
|
|
2065
|
+
try {
|
|
2066
|
+
const itemsRes = await fetch(
|
|
2067
|
+
`/api/trackers/${encodeURIComponent(conn.type)}/items?projectId=${encodeURIComponent(projectId)}&limit=500`
|
|
2068
|
+
);
|
|
2069
|
+
if (!itemsRes.ok) return [];
|
|
2070
|
+
const payload = (await itemsRes.json()) as {
|
|
2071
|
+
items?: {
|
|
2072
|
+
id: string;
|
|
2073
|
+
trackerType?: string;
|
|
2074
|
+
identifier: string;
|
|
2075
|
+
title: string;
|
|
2076
|
+
url?: string | null;
|
|
2077
|
+
status: string;
|
|
2078
|
+
assignee?: { name?: string } | null;
|
|
2079
|
+
updatedAt: string;
|
|
2080
|
+
labels?: string[];
|
|
2081
|
+
}[];
|
|
2082
|
+
};
|
|
2083
|
+
const items = Array.isArray(payload.items) ? payload.items : [];
|
|
2084
|
+
return items
|
|
2085
|
+
.filter((item) =>
|
|
2086
|
+
(item.labels ?? []).some(
|
|
2087
|
+
(label) => label.trim().toLowerCase() === normalizedKey
|
|
2088
|
+
)
|
|
2089
|
+
)
|
|
2090
|
+
.map<ObjectiveTrackerItemSummary>((item) => ({
|
|
2091
|
+
id: item.id,
|
|
2092
|
+
trackerType: item.trackerType ?? conn.type,
|
|
2093
|
+
identifier: item.identifier,
|
|
2094
|
+
title: item.title,
|
|
2095
|
+
url: item.url ?? null,
|
|
2096
|
+
status: item.status,
|
|
2097
|
+
assignee: item.assignee?.name ?? null,
|
|
2098
|
+
updatedAt: item.updatedAt,
|
|
2099
|
+
labels: item.labels,
|
|
2100
|
+
}));
|
|
2101
|
+
} catch {
|
|
2102
|
+
return [];
|
|
2103
|
+
}
|
|
2104
|
+
})
|
|
1988
2105
|
);
|
|
1989
|
-
|
|
2106
|
+
|
|
2107
|
+
if (cancelled) return;
|
|
2108
|
+
setTrackerItems(results.flat());
|
|
1990
2109
|
} catch (error) {
|
|
1991
2110
|
if (cancelled) return;
|
|
1992
|
-
console.warn("Failed to load objective resources", error);
|
|
1993
|
-
|
|
1994
|
-
|
|
2111
|
+
console.warn("Failed to load objective tracker resources", error);
|
|
2112
|
+
setTrackerItems([]);
|
|
2113
|
+
setTrackerConnections([]);
|
|
2114
|
+
setAvailableTrackers([]);
|
|
1995
2115
|
}
|
|
1996
2116
|
}
|
|
1997
2117
|
|
|
1998
|
-
void
|
|
2118
|
+
void loadTrackerResources();
|
|
1999
2119
|
|
|
2000
2120
|
return () => {
|
|
2001
2121
|
cancelled = true;
|
|
@@ -2179,7 +2299,14 @@ export function ProjectObjectiveDetail({
|
|
|
2179
2299
|
{([
|
|
2180
2300
|
{ id: "activity" as const, label: "Activity", icon: Clock },
|
|
2181
2301
|
{ id: "notes" as const, label: "Notes", icon: FileText },
|
|
2182
|
-
{ id: "
|
|
2302
|
+
{ id: "tasks" as const, label: "Tasks", icon: (props: { size?: number; className?: string }) => {
|
|
2303
|
+
const connected = trackerConnections.filter((c) => c.connected);
|
|
2304
|
+
const iconType =
|
|
2305
|
+
(defaultTrackerType && connected.some((c) => c.type === defaultTrackerType)
|
|
2306
|
+
? defaultTrackerType
|
|
2307
|
+
: connected[0]?.type) ?? "tracker";
|
|
2308
|
+
return <TrackerIcon trackerType={iconType} className="h-3.5 w-3.5" />;
|
|
2309
|
+
} },
|
|
2183
2310
|
{ id: "scheduled-tasks" as const, label: "Scheduled Jobs", icon: CalendarClock },
|
|
2184
2311
|
]).map((tab) => (
|
|
2185
2312
|
<button
|
|
@@ -2204,9 +2331,9 @@ export function ProjectObjectiveDetail({
|
|
|
2204
2331
|
{notes.length}
|
|
2205
2332
|
</span>
|
|
2206
2333
|
)}
|
|
2207
|
-
{tab.id === "
|
|
2334
|
+
{tab.id === "tasks" && (() => {
|
|
2208
2335
|
const DONE = ["done", "canceled", "cancelled", "completed", "duplicate"];
|
|
2209
|
-
const active =
|
|
2336
|
+
const active = trackerItems.filter(
|
|
2210
2337
|
(i, idx, arr) => arr.findIndex((x) => x.id === i.id) === idx && !DONE.includes(i.status.toLowerCase())
|
|
2211
2338
|
);
|
|
2212
2339
|
return active.length > 0 ? (
|
|
@@ -2385,9 +2512,9 @@ export function ProjectObjectiveDetail({
|
|
|
2385
2512
|
/>
|
|
2386
2513
|
)}
|
|
2387
2514
|
|
|
2388
|
-
{/*
|
|
2389
|
-
{activeTab === "
|
|
2390
|
-
const dedupedIssues =
|
|
2515
|
+
{/* Tracker Tickets Tab */}
|
|
2516
|
+
{activeTab === "tasks" && (() => {
|
|
2517
|
+
const dedupedIssues = trackerItems.filter(
|
|
2391
2518
|
(issue, idx, arr) => arr.findIndex((i) => i.id === issue.id) === idx
|
|
2392
2519
|
);
|
|
2393
2520
|
const DONE_STATUSES = ["done", "canceled", "cancelled", "completed", "duplicate"];
|
|
@@ -2398,6 +2525,16 @@ export function ProjectObjectiveDetail({
|
|
|
2398
2525
|
.filter((i) => DONE_STATUSES.includes(i.status.toLowerCase()))
|
|
2399
2526
|
.slice(-5);
|
|
2400
2527
|
|
|
2528
|
+
const connectedTrackers = trackerConnections.filter((c) => c.connected);
|
|
2529
|
+
const activeTrackers =
|
|
2530
|
+
defaultTrackerType && connectedTrackers.some((c) => c.type === defaultTrackerType)
|
|
2531
|
+
? connectedTrackers.filter((c) => c.type === defaultTrackerType)
|
|
2532
|
+
: connectedTrackers;
|
|
2533
|
+
const connectedLabel =
|
|
2534
|
+
activeTrackers.length === 0
|
|
2535
|
+
? null
|
|
2536
|
+
: activeTrackers.map((c) => c.displayName).join(", ");
|
|
2537
|
+
|
|
2401
2538
|
return (
|
|
2402
2539
|
<section>
|
|
2403
2540
|
<div className="flex flex-wrap items-start justify-between gap-3 mb-4">
|
|
@@ -2405,13 +2542,22 @@ export function ProjectObjectiveDetail({
|
|
|
2405
2542
|
Tickets tracked by the objective label{" "}
|
|
2406
2543
|
<code className="rounded bg-[var(--tone-neutral-bg)] px-1.5 py-0.5 font-mono text-[11px] text-[var(--foreground)]">
|
|
2407
2544
|
{objective.key}
|
|
2408
|
-
</code
|
|
2545
|
+
</code>
|
|
2546
|
+
{connectedLabel ? <> across {connectedLabel}.</> : "."}
|
|
2409
2547
|
</p>
|
|
2410
2548
|
</div>
|
|
2411
|
-
{
|
|
2412
|
-
<EmptyState
|
|
2549
|
+
{activeTrackers.length === 0 ? (
|
|
2550
|
+
<EmptyState
|
|
2551
|
+
label={
|
|
2552
|
+
availableTrackers.length === 0
|
|
2553
|
+
? "No tracker integrations registered."
|
|
2554
|
+
: `Connect a tracker (${availableTrackers
|
|
2555
|
+
.map((t) => t.displayName)
|
|
2556
|
+
.join(", ")}) to create and track tickets for this objective.`
|
|
2557
|
+
}
|
|
2558
|
+
/>
|
|
2413
2559
|
) : dedupedIssues.length === 0 ? (
|
|
2414
|
-
<EmptyState label={`No
|
|
2560
|
+
<EmptyState label={`No tracker tickets with label ${objective.key} yet.`} />
|
|
2415
2561
|
) : (
|
|
2416
2562
|
<>
|
|
2417
2563
|
{activeIssues.length > 0 && (
|
|
@@ -2423,11 +2569,14 @@ export function ProjectObjectiveDetail({
|
|
|
2423
2569
|
>
|
|
2424
2570
|
<div className="flex items-start justify-between gap-3">
|
|
2425
2571
|
<div className="min-w-0">
|
|
2426
|
-
<
|
|
2427
|
-
{issue.
|
|
2428
|
-
|
|
2572
|
+
<div className="flex items-center gap-1.5 text-xs font-semibold uppercase tracking-[0.18em] text-[var(--muted-foreground)]">
|
|
2573
|
+
<TrackerIcon trackerType={issue.trackerType} className="h-3 w-3" />
|
|
2574
|
+
<span>{issue.identifier}</span>
|
|
2575
|
+
</div>
|
|
2429
2576
|
<a
|
|
2430
|
-
href={`/projects/${projectSlug}
|
|
2577
|
+
href={issue.url ?? `/projects/${projectSlug}/${issue.trackerType}?issue=${issue.id}`}
|
|
2578
|
+
target={issue.url ? "_blank" : undefined}
|
|
2579
|
+
rel={issue.url ? "noreferrer" : undefined}
|
|
2431
2580
|
className="mt-1 block text-sm font-medium text-[var(--foreground)] transition-colors hover:text-[var(--primary)]"
|
|
2432
2581
|
>
|
|
2433
2582
|
{issue.title}
|
|
@@ -2455,9 +2604,12 @@ export function ProjectObjectiveDetail({
|
|
|
2455
2604
|
{doneIssues.map((issue) => (
|
|
2456
2605
|
<a
|
|
2457
2606
|
key={issue.id}
|
|
2458
|
-
href={`/projects/${projectSlug}
|
|
2607
|
+
href={issue.url ?? `/projects/${projectSlug}/${issue.trackerType}?issue=${issue.id}`}
|
|
2608
|
+
target={issue.url ? "_blank" : undefined}
|
|
2609
|
+
rel={issue.url ? "noreferrer" : undefined}
|
|
2459
2610
|
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)]"
|
|
2460
2611
|
>
|
|
2612
|
+
<TrackerIcon trackerType={issue.trackerType} className="h-3 w-3 shrink-0" />
|
|
2461
2613
|
<span className="text-[11px] font-mono shrink-0">{issue.identifier}</span>
|
|
2462
2614
|
<span className="text-[12px] truncate">{issue.title}</span>
|
|
2463
2615
|
<span className="ml-auto shrink-0 text-[10px] text-[var(--app-shell-soft-text)] group-hover:text-[var(--muted-foreground)]">{issue.status}</span>
|
|
@@ -2518,6 +2670,9 @@ export function ProjectObjectiveDetail({
|
|
|
2518
2670
|
projectSlug={projectSlug}
|
|
2519
2671
|
objective={objective}
|
|
2520
2672
|
teamName={teamName}
|
|
2673
|
+
trackerConnections={trackerConnections}
|
|
2674
|
+
availableTrackers={availableTrackers}
|
|
2675
|
+
defaultTrackerType={defaultTrackerType}
|
|
2521
2676
|
onThreadLinked={handleObjectiveThreadLinked}
|
|
2522
2677
|
onObjectiveUpdated={refetchProject}
|
|
2523
2678
|
/>
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import React from "react";
|
|
4
|
+
import { X } from "lucide-react";
|
|
5
|
+
|
|
6
|
+
const FIBONACCI = [1, 2, 3, 5, 8, 13, 21] as const;
|
|
7
|
+
|
|
8
|
+
interface FibonacciPickerProps {
|
|
9
|
+
value?: number | null;
|
|
10
|
+
onSelect: (value: number | null) => void;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function FibonacciPicker({ value, onSelect }: FibonacciPickerProps) {
|
|
14
|
+
return (
|
|
15
|
+
<div className="flex items-center gap-1">
|
|
16
|
+
{FIBONACCI.map((n) => (
|
|
17
|
+
<button
|
|
18
|
+
key={n}
|
|
19
|
+
type="button"
|
|
20
|
+
className={`flex h-7 w-7 items-center justify-center rounded-md text-xs font-medium transition-colors ${
|
|
21
|
+
value === n
|
|
22
|
+
? "bg-[var(--primary)] text-[var(--primary-foreground)]"
|
|
23
|
+
: "bg-[var(--background)] text-[var(--muted-foreground)] hover:bg-[var(--card-bg)] hover:text-[var(--foreground)]"
|
|
24
|
+
}`}
|
|
25
|
+
onClick={() => onSelect(n)}
|
|
26
|
+
>
|
|
27
|
+
{n}
|
|
28
|
+
</button>
|
|
29
|
+
))}
|
|
30
|
+
<button
|
|
31
|
+
type="button"
|
|
32
|
+
className="flex h-7 items-center gap-1 rounded-md px-2 text-xs text-[var(--muted-foreground)] transition-colors hover:bg-[var(--card-bg)] hover:text-[var(--foreground)]"
|
|
33
|
+
onClick={() => onSelect(null)}
|
|
34
|
+
title="Clear estimate"
|
|
35
|
+
>
|
|
36
|
+
<X size={10} />
|
|
37
|
+
Clear
|
|
38
|
+
</button>
|
|
39
|
+
</div>
|
|
40
|
+
);
|
|
41
|
+
}
|
|
@@ -123,7 +123,7 @@ export function FolderRow({
|
|
|
123
123
|
className={`flex h-5 w-5 shrink-0 items-center justify-center rounded transition-all hover:bg-zinc-700 ${
|
|
124
124
|
hasNote
|
|
125
125
|
? "text-amber-400 opacity-100"
|
|
126
|
-
:
|
|
126
|
+
: `text-[var(--muted-foreground)] ${selected ? "opacity-100" : "opacity-0 group-hover:opacity-100"}`
|
|
127
127
|
}`}
|
|
128
128
|
onClick={handleNoteClick}
|
|
129
129
|
title={hasNote ? "Edit group note" : "Add group note"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import React, { useState, useCallback, useMemo } from "react";
|
|
4
|
+
import { Check, Minus, Plus } from "lucide-react";
|
|
5
|
+
|
|
6
|
+
interface LabelEntry {
|
|
7
|
+
name: string;
|
|
8
|
+
color: string | null;
|
|
9
|
+
defined: boolean;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
interface LabelPickerProps {
|
|
13
|
+
labels: LabelEntry[];
|
|
14
|
+
selectedLabels: string[];
|
|
15
|
+
labelCounts?: Map<string, number>;
|
|
16
|
+
totalSelected?: number;
|
|
17
|
+
onToggle: (label: string) => void;
|
|
18
|
+
onAdd: (label: string) => void;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function LabelPicker({
|
|
22
|
+
labels,
|
|
23
|
+
selectedLabels,
|
|
24
|
+
labelCounts,
|
|
25
|
+
totalSelected,
|
|
26
|
+
onToggle,
|
|
27
|
+
onAdd,
|
|
28
|
+
}: LabelPickerProps) {
|
|
29
|
+
const [input, setInput] = useState("");
|
|
30
|
+
const selectedSet = useMemo(() => new Set(selectedLabels), [selectedLabels]);
|
|
31
|
+
const isBulk = totalSelected != null && totalSelected > 0;
|
|
32
|
+
|
|
33
|
+
const filteredLabels = useMemo(() => {
|
|
34
|
+
const q = input.trim().toLowerCase();
|
|
35
|
+
if (!q) return labels;
|
|
36
|
+
return labels.filter((l) => l.name.toLowerCase().includes(q));
|
|
37
|
+
}, [labels, input]);
|
|
38
|
+
|
|
39
|
+
const handleAdd = useCallback(() => {
|
|
40
|
+
const trimmed = input.trim();
|
|
41
|
+
if (!trimmed) return;
|
|
42
|
+
if (!labels.some((l) => l.name.toLowerCase() === trimmed.toLowerCase())) {
|
|
43
|
+
onAdd(trimmed);
|
|
44
|
+
}
|
|
45
|
+
onToggle(trimmed);
|
|
46
|
+
setInput("");
|
|
47
|
+
}, [input, labels, onAdd, onToggle]);
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<div className="flex w-56 flex-col gap-1">
|
|
51
|
+
<div className="max-h-48 overflow-y-auto">
|
|
52
|
+
{filteredLabels.map((label) => {
|
|
53
|
+
const isSelected = selectedSet.has(label.name);
|
|
54
|
+
const count = labelCounts?.get(label.name) ?? 0;
|
|
55
|
+
const isMixed = isBulk && count > 0 && count < (totalSelected ?? 0);
|
|
56
|
+
|
|
57
|
+
return (
|
|
58
|
+
<button
|
|
59
|
+
key={label.name}
|
|
60
|
+
type="button"
|
|
61
|
+
className={`flex w-full items-center gap-2 rounded-lg px-3 py-1.5 text-left text-xs transition-colors ${
|
|
62
|
+
isSelected
|
|
63
|
+
? "bg-[var(--background)] font-medium text-[var(--foreground)]"
|
|
64
|
+
: "text-[var(--muted-foreground)] hover:bg-[var(--background)] hover:text-[var(--foreground)]"
|
|
65
|
+
}`}
|
|
66
|
+
onClick={() => onToggle(label.name)}
|
|
67
|
+
>
|
|
68
|
+
<span
|
|
69
|
+
className={`flex h-4 w-4 shrink-0 items-center justify-center rounded border ${
|
|
70
|
+
isSelected || isMixed
|
|
71
|
+
? "border-blue-500 bg-blue-500 text-white"
|
|
72
|
+
: "border-[var(--card-border)]"
|
|
73
|
+
}`}
|
|
74
|
+
>
|
|
75
|
+
{isMixed ? <Minus size={10} /> : isSelected ? <Check size={10} /> : null}
|
|
76
|
+
</span>
|
|
77
|
+
{label.color && (
|
|
78
|
+
<span
|
|
79
|
+
className="h-2.5 w-2.5 shrink-0 rounded-full"
|
|
80
|
+
style={{ backgroundColor: label.color }}
|
|
81
|
+
/>
|
|
82
|
+
)}
|
|
83
|
+
<span className="min-w-0 flex-1 truncate">{label.name}</span>
|
|
84
|
+
</button>
|
|
85
|
+
);
|
|
86
|
+
})}
|
|
87
|
+
{filteredLabels.length === 0 && input.trim() && (
|
|
88
|
+
<div className="px-3 py-2 text-xs text-[var(--muted-foreground)]">
|
|
89
|
+
No matching labels
|
|
90
|
+
</div>
|
|
91
|
+
)}
|
|
92
|
+
</div>
|
|
93
|
+
<div className="flex items-center gap-1 border-t border-[var(--card-border)] pt-1">
|
|
94
|
+
<input
|
|
95
|
+
type="text"
|
|
96
|
+
className="min-w-0 flex-1 bg-transparent px-2 py-1 text-xs outline-none placeholder:text-[var(--muted-foreground)]"
|
|
97
|
+
placeholder="Add label..."
|
|
98
|
+
value={input}
|
|
99
|
+
onChange={(e) => setInput(e.target.value)}
|
|
100
|
+
onKeyDown={(e) => {
|
|
101
|
+
if (e.key === "Enter") {
|
|
102
|
+
e.preventDefault();
|
|
103
|
+
handleAdd();
|
|
104
|
+
}
|
|
105
|
+
}}
|
|
106
|
+
/>
|
|
107
|
+
<button
|
|
108
|
+
type="button"
|
|
109
|
+
className="flex h-6 w-6 items-center justify-center rounded text-[var(--muted-foreground)] transition-colors hover:bg-[var(--card-bg)] hover:text-[var(--foreground)] disabled:opacity-40"
|
|
110
|
+
onClick={handleAdd}
|
|
111
|
+
disabled={!input.trim()}
|
|
112
|
+
>
|
|
113
|
+
<Plus size={12} />
|
|
114
|
+
</button>
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
);
|
|
118
|
+
}
|