@mndrk/agx 2.4.1 → 2.4.3
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]/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.nft.json +1 -1
- 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.nft.json +1 -1
- 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.nft.json +1 -1
- 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.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.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.nft.json +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.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/runs/scripted/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/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.nft.json +1 -1
- 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.nft.json +1 -1
- 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/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]__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]__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]__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 +4 -4
- 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_80b34b78._.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_d256aa32._.js +28 -25
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_orchestrator_chat-processor_ts_46384f36._.js +17 -17
- 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_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/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/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/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/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/cecf3e8c47c785f5.js +5 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/d5607ac80145f3b7.js +1 -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/.next/static/chunks/f6d31036588ddfe4.css +1 -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/components/TrackerBoard.tsx +609 -85
- 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/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 +6 -1
- 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/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/state/trackerBoardFilters.ts +4 -0
- package/cloud-runtime/standalone/apps/local/worker/index.js +5 -2
- package/package.json +1 -1
- 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/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/{ycVU7ABTMiX10ainku7bE → 4MnUE2NHztybGBWFbcBo5}/_buildManifest.js +0 -0
- /package/cloud-runtime/standalone/apps/local/.next/static/{ycVU7ABTMiX10ainku7bE → 4MnUE2NHztybGBWFbcBo5}/_clientMiddlewareManifest.json +0 -0
- /package/cloud-runtime/standalone/apps/local/.next/static/{ycVU7ABTMiX10ainku7bE → 4MnUE2NHztybGBWFbcBo5}/_ssgManifest.js +0 -0
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import React, { useState } from "react";
|
|
4
|
+
import { Plus, Trash2 } from "lucide-react";
|
|
5
|
+
import type { LabelDefinition } from "@/hooks/useTrackerLabels";
|
|
6
|
+
|
|
7
|
+
interface LabelSettingsProps {
|
|
8
|
+
definitions: LabelDefinition[];
|
|
9
|
+
onCreate: (name: string, color?: string) => Promise<void>;
|
|
10
|
+
onDelete: (id: string) => Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const PRESET_COLORS = [
|
|
14
|
+
"#ef4444", "#f97316", "#eab308", "#22c55e",
|
|
15
|
+
"#06b6d4", "#3b82f6", "#8b5cf6", "#ec4899",
|
|
16
|
+
];
|
|
17
|
+
|
|
18
|
+
export function LabelSettings({ definitions, onCreate, onDelete }: LabelSettingsProps) {
|
|
19
|
+
const [name, setName] = useState("");
|
|
20
|
+
const [color, setColor] = useState<string>(PRESET_COLORS[0]);
|
|
21
|
+
const [creating, setCreating] = useState(false);
|
|
22
|
+
|
|
23
|
+
const handleCreate = async () => {
|
|
24
|
+
if (!name.trim() || creating) return;
|
|
25
|
+
setCreating(true);
|
|
26
|
+
await onCreate(name.trim(), color);
|
|
27
|
+
setName("");
|
|
28
|
+
setCreating(false);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
return (
|
|
32
|
+
<div className="space-y-4">
|
|
33
|
+
<h3 className="text-sm font-semibold text-[var(--foreground)]">Local Labels</h3>
|
|
34
|
+
<p className="text-xs text-[var(--muted-foreground)]">
|
|
35
|
+
Define labels for local task tracking. These are stored locally and not synced to your tracker.
|
|
36
|
+
</p>
|
|
37
|
+
|
|
38
|
+
{definitions.length > 0 && (
|
|
39
|
+
<div className="space-y-1">
|
|
40
|
+
{definitions.map((def) => (
|
|
41
|
+
<div
|
|
42
|
+
key={def.id}
|
|
43
|
+
className="flex items-center gap-3 rounded-lg px-3 py-2 hover:bg-[var(--card-bg)]"
|
|
44
|
+
>
|
|
45
|
+
{def.color && (
|
|
46
|
+
<span
|
|
47
|
+
className="h-3 w-3 shrink-0 rounded-full"
|
|
48
|
+
style={{ backgroundColor: def.color }}
|
|
49
|
+
/>
|
|
50
|
+
)}
|
|
51
|
+
<span className="min-w-0 flex-1 text-sm text-[var(--foreground)]">{def.name}</span>
|
|
52
|
+
<button
|
|
53
|
+
type="button"
|
|
54
|
+
className="shrink-0 rounded p-1 text-[var(--muted-foreground)] transition-colors hover:bg-red-500/10 hover:text-red-400"
|
|
55
|
+
onClick={() => void onDelete(def.id)}
|
|
56
|
+
title="Delete label"
|
|
57
|
+
>
|
|
58
|
+
<Trash2 size={14} />
|
|
59
|
+
</button>
|
|
60
|
+
</div>
|
|
61
|
+
))}
|
|
62
|
+
</div>
|
|
63
|
+
)}
|
|
64
|
+
|
|
65
|
+
<div className="flex items-center gap-2 rounded-lg border border-[var(--card-border)] p-2">
|
|
66
|
+
<div className="flex gap-1">
|
|
67
|
+
{PRESET_COLORS.map((c) => (
|
|
68
|
+
<button
|
|
69
|
+
key={c}
|
|
70
|
+
type="button"
|
|
71
|
+
className={`h-5 w-5 rounded-full transition-all ${
|
|
72
|
+
color === c ? "ring-2 ring-[var(--foreground)] ring-offset-1 ring-offset-[var(--background)]" : ""
|
|
73
|
+
}`}
|
|
74
|
+
style={{ backgroundColor: c }}
|
|
75
|
+
onClick={() => setColor(c)}
|
|
76
|
+
/>
|
|
77
|
+
))}
|
|
78
|
+
</div>
|
|
79
|
+
<input
|
|
80
|
+
type="text"
|
|
81
|
+
className="min-w-0 flex-1 bg-transparent px-2 py-1 text-sm outline-none placeholder:text-[var(--muted-foreground)]"
|
|
82
|
+
placeholder="Label name"
|
|
83
|
+
value={name}
|
|
84
|
+
onChange={(e) => setName(e.target.value)}
|
|
85
|
+
onKeyDown={(e) => {
|
|
86
|
+
if (e.key === "Enter") {
|
|
87
|
+
e.preventDefault();
|
|
88
|
+
void handleCreate();
|
|
89
|
+
}
|
|
90
|
+
}}
|
|
91
|
+
/>
|
|
92
|
+
<button
|
|
93
|
+
type="button"
|
|
94
|
+
className="flex items-center gap-1 rounded-md bg-[var(--primary)] px-2.5 py-1 text-xs font-medium text-[var(--primary-foreground)] transition-opacity hover:opacity-90 disabled:opacity-50"
|
|
95
|
+
onClick={() => void handleCreate()}
|
|
96
|
+
disabled={!name.trim() || creating}
|
|
97
|
+
>
|
|
98
|
+
<Plus size={12} />
|
|
99
|
+
Add
|
|
100
|
+
</button>
|
|
101
|
+
</div>
|
|
102
|
+
</div>
|
|
103
|
+
);
|
|
104
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import React, { useState, useMemo } from "react";
|
|
4
|
+
import { Play } from "lucide-react";
|
|
5
|
+
import type { Participant } from "@/lib/types";
|
|
6
|
+
import { agentAvatarUrl } from "@/lib/tracker-board-utils";
|
|
7
|
+
|
|
8
|
+
interface PromptPopoverProps {
|
|
9
|
+
count: number;
|
|
10
|
+
participants: Participant[];
|
|
11
|
+
onSend: (prompt: string, agentId: string) => void;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function PromptPopover({ count, participants, onSend }: PromptPopoverProps) {
|
|
15
|
+
const [prompt, setPrompt] = useState("");
|
|
16
|
+
const [agentId, setAgentId] = useState(participants[0]?.id ?? "");
|
|
17
|
+
const selectedAgent = useMemo(
|
|
18
|
+
() => participants.find((p) => p.id === agentId) ?? participants[0],
|
|
19
|
+
[participants, agentId]
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
return (
|
|
23
|
+
<div className="flex w-80 flex-col gap-3 p-1">
|
|
24
|
+
<textarea
|
|
25
|
+
className="min-h-[80px] w-full resize-none rounded-lg border border-[var(--card-border)] bg-[var(--background)] px-3 py-2 text-xs text-[var(--foreground)] outline-none placeholder:text-[var(--muted-foreground)] focus:border-[var(--muted-foreground)]"
|
|
26
|
+
placeholder="Enter prompt to send to all selected tickets..."
|
|
27
|
+
value={prompt}
|
|
28
|
+
onChange={(e) => setPrompt(e.target.value)}
|
|
29
|
+
autoFocus
|
|
30
|
+
/>
|
|
31
|
+
{participants.length > 1 && (
|
|
32
|
+
<div className="flex items-center gap-2">
|
|
33
|
+
<span className="text-[10px] font-medium uppercase tracking-wider text-[var(--muted-foreground)]">
|
|
34
|
+
Agent
|
|
35
|
+
</span>
|
|
36
|
+
<select
|
|
37
|
+
className="flex-1 appearance-none rounded-md border border-[var(--card-border)] bg-[var(--background)] px-2 py-1 text-xs outline-none"
|
|
38
|
+
value={agentId}
|
|
39
|
+
onChange={(e) => setAgentId(e.target.value)}
|
|
40
|
+
>
|
|
41
|
+
{participants.map((p) => (
|
|
42
|
+
<option key={p.id} value={p.id}>
|
|
43
|
+
{p.name}
|
|
44
|
+
</option>
|
|
45
|
+
))}
|
|
46
|
+
</select>
|
|
47
|
+
</div>
|
|
48
|
+
)}
|
|
49
|
+
<button
|
|
50
|
+
type="button"
|
|
51
|
+
className="inline-flex items-center justify-center gap-1.5 rounded-lg bg-blue-500 px-3 py-2 text-xs font-medium text-white transition-colors hover:bg-blue-600 disabled:opacity-50"
|
|
52
|
+
disabled={!prompt.trim()}
|
|
53
|
+
onClick={() => {
|
|
54
|
+
if (prompt.trim()) {
|
|
55
|
+
onSend(prompt.trim(), agentId);
|
|
56
|
+
}
|
|
57
|
+
}}
|
|
58
|
+
>
|
|
59
|
+
<Play size={12} />
|
|
60
|
+
Send to {count} ticket{count !== 1 ? "s" : ""}
|
|
61
|
+
</button>
|
|
62
|
+
</div>
|
|
63
|
+
);
|
|
64
|
+
}
|
|
@@ -1,38 +1,291 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import React from "react";
|
|
4
|
-
import {
|
|
3
|
+
import React, { useState, useRef, useEffect, useCallback } from "react";
|
|
4
|
+
import {
|
|
5
|
+
FileText,
|
|
6
|
+
FolderPlus,
|
|
7
|
+
Hash,
|
|
8
|
+
MessageSquare,
|
|
9
|
+
RefreshCw,
|
|
10
|
+
Tag,
|
|
11
|
+
X,
|
|
12
|
+
} from "lucide-react";
|
|
13
|
+
import { FibonacciPicker } from "./FibonacciPicker";
|
|
14
|
+
import { LabelPicker } from "./LabelPicker";
|
|
15
|
+
import { PromptPopover } from "./PromptPopover";
|
|
16
|
+
import type { FilterOption } from "./TrackerBoardFilters";
|
|
17
|
+
import type { Participant } from "@/lib/types";
|
|
18
|
+
|
|
19
|
+
interface LabelEntry {
|
|
20
|
+
name: string;
|
|
21
|
+
color: string | null;
|
|
22
|
+
defined: boolean;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
interface ItemMetadata {
|
|
26
|
+
labels: string[];
|
|
27
|
+
estimate: number | null;
|
|
28
|
+
}
|
|
5
29
|
|
|
6
30
|
interface SelectionBarProps {
|
|
7
31
|
count: number;
|
|
8
32
|
onGroup: () => void;
|
|
9
33
|
onClear: () => void;
|
|
34
|
+
onBulkRecap: () => void;
|
|
35
|
+
onBulkPrompt: (prompt: string, agentId: string) => void;
|
|
36
|
+
onBulkEstimate: (estimate: number | null) => void;
|
|
37
|
+
onBulkAddLabel: (label: string) => void;
|
|
38
|
+
onBulkRemoveLabel: (label: string) => void;
|
|
39
|
+
onBulkStatus: (status: string) => void;
|
|
40
|
+
statusOptions: FilterOption[];
|
|
41
|
+
participants: Participant[];
|
|
42
|
+
labels: LabelEntry[];
|
|
43
|
+
onCreateLabel: (name: string) => void;
|
|
44
|
+
selectedMetadata: Map<string, ItemMetadata>;
|
|
45
|
+
statusUpdating?: boolean;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
type ActivePopover = "estimate" | "label" | "status" | "prompt" | null;
|
|
49
|
+
|
|
50
|
+
function Popover({
|
|
51
|
+
open,
|
|
52
|
+
onClose,
|
|
53
|
+
anchorRef,
|
|
54
|
+
children,
|
|
55
|
+
}: {
|
|
56
|
+
open: boolean;
|
|
57
|
+
onClose: () => void;
|
|
58
|
+
anchorRef: React.RefObject<HTMLButtonElement | null>;
|
|
59
|
+
children: React.ReactNode;
|
|
60
|
+
}) {
|
|
61
|
+
const panelRef = useRef<HTMLDivElement | null>(null);
|
|
62
|
+
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
if (!open) return;
|
|
65
|
+
const handlePointerDown = (e: PointerEvent) => {
|
|
66
|
+
if (panelRef.current?.contains(e.target as Node)) return;
|
|
67
|
+
if (anchorRef.current?.contains(e.target as Node)) return;
|
|
68
|
+
onClose();
|
|
69
|
+
};
|
|
70
|
+
const handleKeyDown = (e: KeyboardEvent) => {
|
|
71
|
+
if (e.key === "Escape") onClose();
|
|
72
|
+
};
|
|
73
|
+
document.addEventListener("pointerdown", handlePointerDown);
|
|
74
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
75
|
+
return () => {
|
|
76
|
+
document.removeEventListener("pointerdown", handlePointerDown);
|
|
77
|
+
document.removeEventListener("keydown", handleKeyDown);
|
|
78
|
+
};
|
|
79
|
+
}, [open, onClose, anchorRef]);
|
|
80
|
+
|
|
81
|
+
if (!open) return null;
|
|
82
|
+
|
|
83
|
+
return (
|
|
84
|
+
<div
|
|
85
|
+
ref={panelRef}
|
|
86
|
+
className="absolute bottom-full left-1/2 z-50 mb-2 -translate-x-1/2 rounded-xl border border-[var(--card-border)] bg-[var(--card-bg)] p-2 shadow-lg backdrop-blur-sm"
|
|
87
|
+
>
|
|
88
|
+
{children}
|
|
89
|
+
</div>
|
|
90
|
+
);
|
|
10
91
|
}
|
|
11
92
|
|
|
12
|
-
export function SelectionBar({
|
|
93
|
+
export function SelectionBar({
|
|
94
|
+
count,
|
|
95
|
+
onGroup,
|
|
96
|
+
onClear,
|
|
97
|
+
onBulkRecap,
|
|
98
|
+
onBulkPrompt,
|
|
99
|
+
onBulkEstimate,
|
|
100
|
+
onBulkAddLabel,
|
|
101
|
+
onBulkRemoveLabel,
|
|
102
|
+
onBulkStatus,
|
|
103
|
+
statusOptions,
|
|
104
|
+
participants,
|
|
105
|
+
labels,
|
|
106
|
+
onCreateLabel,
|
|
107
|
+
selectedMetadata,
|
|
108
|
+
statusUpdating,
|
|
109
|
+
}: SelectionBarProps) {
|
|
110
|
+
const [activePopover, setActivePopover] = useState<ActivePopover>(null);
|
|
111
|
+
const estimateRef = useRef<HTMLButtonElement | null>(null);
|
|
112
|
+
const labelRef = useRef<HTMLButtonElement | null>(null);
|
|
113
|
+
const statusRef = useRef<HTMLButtonElement | null>(null);
|
|
114
|
+
const promptRef = useRef<HTMLButtonElement | null>(null);
|
|
115
|
+
|
|
116
|
+
const togglePopover = useCallback((popover: ActivePopover) => {
|
|
117
|
+
setActivePopover((current) => (current === popover ? null : popover));
|
|
118
|
+
}, []);
|
|
119
|
+
|
|
120
|
+
const labelCounts = React.useMemo(() => {
|
|
121
|
+
const counts = new Map<string, number>();
|
|
122
|
+
for (const meta of selectedMetadata.values()) {
|
|
123
|
+
for (const label of meta.labels) {
|
|
124
|
+
counts.set(label, (counts.get(label) ?? 0) + 1);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return counts;
|
|
128
|
+
}, [selectedMetadata]);
|
|
129
|
+
|
|
130
|
+
const allSelectedLabels = React.useMemo(() => {
|
|
131
|
+
const all = new Set<string>();
|
|
132
|
+
for (const meta of selectedMetadata.values()) {
|
|
133
|
+
for (const label of meta.labels) all.add(label);
|
|
134
|
+
}
|
|
135
|
+
return Array.from(all);
|
|
136
|
+
}, [selectedMetadata]);
|
|
137
|
+
|
|
13
138
|
if (count < 2) return null;
|
|
14
139
|
|
|
140
|
+
const actionButtonClass =
|
|
141
|
+
"flex items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-[11px] font-medium text-[var(--muted-foreground)] transition-colors hover:bg-[var(--background)] hover:text-[var(--foreground)]";
|
|
142
|
+
|
|
15
143
|
return (
|
|
16
|
-
<div className="absolute bottom-4 left-1/2 z-30 -translate-x-1/2
|
|
17
|
-
<
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
className="
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
<
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
144
|
+
<div className="absolute bottom-4 left-1/2 z-30 -translate-x-1/2">
|
|
145
|
+
<div className="flex items-center gap-1 rounded-xl border border-[var(--card-border)] bg-[var(--card-bg)] px-3 py-1.5 shadow-2xl">
|
|
146
|
+
<span className="mr-1 text-xs font-medium text-[var(--foreground)]">
|
|
147
|
+
{count} selected
|
|
148
|
+
</span>
|
|
149
|
+
|
|
150
|
+
<div className="mx-1 h-4 w-px bg-[var(--card-border)]" />
|
|
151
|
+
|
|
152
|
+
{/* Recap */}
|
|
153
|
+
<button type="button" className={actionButtonClass} onClick={onBulkRecap} title="Recap all selected">
|
|
154
|
+
<FileText size={12} />
|
|
155
|
+
Recap
|
|
156
|
+
</button>
|
|
157
|
+
|
|
158
|
+
{/* Prompt */}
|
|
159
|
+
<div className="relative">
|
|
160
|
+
<button
|
|
161
|
+
ref={promptRef}
|
|
162
|
+
type="button"
|
|
163
|
+
className={`${actionButtonClass} ${activePopover === "prompt" ? "bg-[var(--background)] text-[var(--foreground)]" : ""}`}
|
|
164
|
+
onClick={() => togglePopover("prompt")}
|
|
165
|
+
title="Send prompt to all selected"
|
|
166
|
+
>
|
|
167
|
+
<MessageSquare size={12} />
|
|
168
|
+
Prompt
|
|
169
|
+
</button>
|
|
170
|
+
<Popover open={activePopover === "prompt"} onClose={() => setActivePopover(null)} anchorRef={promptRef}>
|
|
171
|
+
<PromptPopover
|
|
172
|
+
count={count}
|
|
173
|
+
participants={participants}
|
|
174
|
+
onSend={(prompt, agentId) => {
|
|
175
|
+
onBulkPrompt(prompt, agentId);
|
|
176
|
+
setActivePopover(null);
|
|
177
|
+
}}
|
|
178
|
+
/>
|
|
179
|
+
</Popover>
|
|
180
|
+
</div>
|
|
181
|
+
|
|
182
|
+
{/* Estimate */}
|
|
183
|
+
<div className="relative">
|
|
184
|
+
<button
|
|
185
|
+
ref={estimateRef}
|
|
186
|
+
type="button"
|
|
187
|
+
className={`${actionButtonClass} ${activePopover === "estimate" ? "bg-[var(--background)] text-[var(--foreground)]" : ""}`}
|
|
188
|
+
onClick={() => togglePopover("estimate")}
|
|
189
|
+
title="Set estimate for all selected"
|
|
190
|
+
>
|
|
191
|
+
<Hash size={12} />
|
|
192
|
+
Estimate
|
|
193
|
+
</button>
|
|
194
|
+
<Popover open={activePopover === "estimate"} onClose={() => setActivePopover(null)} anchorRef={estimateRef}>
|
|
195
|
+
<FibonacciPicker
|
|
196
|
+
onSelect={(value) => {
|
|
197
|
+
onBulkEstimate(value);
|
|
198
|
+
setActivePopover(null);
|
|
199
|
+
}}
|
|
200
|
+
/>
|
|
201
|
+
</Popover>
|
|
202
|
+
</div>
|
|
203
|
+
|
|
204
|
+
{/* Label */}
|
|
205
|
+
<div className="relative">
|
|
206
|
+
<button
|
|
207
|
+
ref={labelRef}
|
|
208
|
+
type="button"
|
|
209
|
+
className={`${actionButtonClass} ${activePopover === "label" ? "bg-[var(--background)] text-[var(--foreground)]" : ""}`}
|
|
210
|
+
onClick={() => togglePopover("label")}
|
|
211
|
+
title="Label all selected"
|
|
212
|
+
>
|
|
213
|
+
<Tag size={12} />
|
|
214
|
+
Label
|
|
215
|
+
</button>
|
|
216
|
+
<Popover open={activePopover === "label"} onClose={() => setActivePopover(null)} anchorRef={labelRef}>
|
|
217
|
+
<LabelPicker
|
|
218
|
+
labels={labels}
|
|
219
|
+
selectedLabels={allSelectedLabels}
|
|
220
|
+
labelCounts={labelCounts}
|
|
221
|
+
totalSelected={count}
|
|
222
|
+
onToggle={(label) => {
|
|
223
|
+
const c = labelCounts.get(label) ?? 0;
|
|
224
|
+
if (c === count) {
|
|
225
|
+
onBulkRemoveLabel(label);
|
|
226
|
+
} else {
|
|
227
|
+
onBulkAddLabel(label);
|
|
228
|
+
}
|
|
229
|
+
}}
|
|
230
|
+
onAdd={onCreateLabel}
|
|
231
|
+
/>
|
|
232
|
+
</Popover>
|
|
233
|
+
</div>
|
|
234
|
+
|
|
235
|
+
{/* Status */}
|
|
236
|
+
<div className="relative">
|
|
237
|
+
<button
|
|
238
|
+
ref={statusRef}
|
|
239
|
+
type="button"
|
|
240
|
+
className={`${actionButtonClass} ${activePopover === "status" ? "bg-[var(--background)] text-[var(--foreground)]" : ""}`}
|
|
241
|
+
onClick={() => togglePopover("status")}
|
|
242
|
+
title="Update status for all selected"
|
|
243
|
+
disabled={statusUpdating}
|
|
244
|
+
>
|
|
245
|
+
{statusUpdating ? (
|
|
246
|
+
<RefreshCw size={12} className="animate-spin" />
|
|
247
|
+
) : (
|
|
248
|
+
<RefreshCw size={12} />
|
|
249
|
+
)}
|
|
250
|
+
Status
|
|
251
|
+
</button>
|
|
252
|
+
<Popover open={activePopover === "status"} onClose={() => setActivePopover(null)} anchorRef={statusRef}>
|
|
253
|
+
<div className="flex max-h-48 w-44 flex-col overflow-y-auto">
|
|
254
|
+
{statusOptions.map((opt) => (
|
|
255
|
+
<button
|
|
256
|
+
key={opt.value}
|
|
257
|
+
type="button"
|
|
258
|
+
className="w-full rounded-lg px-3 py-1.5 text-left text-xs text-[var(--muted-foreground)] transition-colors hover:bg-[var(--background)] hover:text-[var(--foreground)]"
|
|
259
|
+
onClick={() => {
|
|
260
|
+
onBulkStatus(opt.value);
|
|
261
|
+
setActivePopover(null);
|
|
262
|
+
}}
|
|
263
|
+
>
|
|
264
|
+
{opt.label}
|
|
265
|
+
</button>
|
|
266
|
+
))}
|
|
267
|
+
</div>
|
|
268
|
+
</Popover>
|
|
269
|
+
</div>
|
|
270
|
+
|
|
271
|
+
{/* Group */}
|
|
272
|
+
<button type="button" className={actionButtonClass} onClick={onGroup} title="Group selected">
|
|
273
|
+
<FolderPlus size={12} />
|
|
274
|
+
Group
|
|
275
|
+
</button>
|
|
276
|
+
|
|
277
|
+
<div className="mx-1 h-4 w-px bg-[var(--card-border)]" />
|
|
278
|
+
|
|
279
|
+
{/* Clear */}
|
|
280
|
+
<button
|
|
281
|
+
type="button"
|
|
282
|
+
className="flex h-6 w-6 items-center justify-center rounded text-[var(--muted-foreground)] transition-colors hover:text-[var(--foreground)]"
|
|
283
|
+
onClick={onClear}
|
|
284
|
+
aria-label="Clear selection"
|
|
285
|
+
>
|
|
286
|
+
<X size={14} />
|
|
287
|
+
</button>
|
|
288
|
+
</div>
|
|
36
289
|
</div>
|
|
37
290
|
);
|
|
38
291
|
}
|